8 changed files with 134 additions and 59 deletions
			
			
		- 
					5src/storm-dft/builder/DFTBuilder.cpp
- 
					2src/storm-dft/parser/DFTGalileoParser.cpp
- 
					2src/storm-dft/parser/DFTJsonParser.cpp
- 
					3src/storm-dft/storage/dft/DFTElements.h
- 
					5src/storm-dft/storage/dft/DftJsonExporter.cpp
- 
					61src/storm-dft/storage/dft/elements/DFTMutex.h
- 
					56src/storm-dft/storage/dft/elements/DFTRestriction.h
- 
					59src/storm-dft/storage/dft/elements/DFTSeq.h
| @ -0,0 +1,61 @@ | |||||
|  | #pragma once | ||||
|  | 
 | ||||
|  | #include "DFTRestriction.h" | ||||
|  | 
 | ||||
|  | namespace storm { | ||||
|  |     namespace storage { | ||||
|  | 
 | ||||
|  |         /*! | ||||
|  |          * Mutex restriction (MUTEX). | ||||
|  |          * Only one of the children can fail. | ||||
|  |          * A child which has failed prevents the failure of all other children. | ||||
|  |          */ | ||||
|  |         template<typename ValueType> | ||||
|  |         class DFTMutex : public DFTRestriction<ValueType> { | ||||
|  | 
 | ||||
|  |         public: | ||||
|  |             /*! | ||||
|  |              * Constructor. | ||||
|  |              * @param id Id. | ||||
|  |              * @param name Name. | ||||
|  |              * @param children Children. | ||||
|  |              */ | ||||
|  |             DFTMutex(size_t id, std::string const& name, std::vector<std::shared_ptr<DFTElement<ValueType>>> const& children = {}) : DFTRestriction<ValueType>(id, name, children) { | ||||
|  |                 // Intentionally left empty. | ||||
|  |             } | ||||
|  | 
 | ||||
|  |             DFTElementType type() const override { | ||||
|  |                 return DFTElementType::MUTEX; | ||||
|  |             } | ||||
|  | 
 | ||||
|  |             bool isSeqEnforcer() const override { | ||||
|  |                 return true; | ||||
|  |             } | ||||
|  | 
 | ||||
|  |             void checkFails(storm::storage::DFTState<ValueType>& state, DFTStateSpaceGenerationQueues<ValueType>& queues) const override { | ||||
|  |                 STORM_LOG_ASSERT(queues.failurePropagationDone(), "Failure propagation not finished."); | ||||
|  |                 bool childFailed = false; | ||||
|  |                 for (auto const& child : this->children()) { | ||||
|  |                     if (state.hasFailed(child->id())) { | ||||
|  |                         if (childFailed) { | ||||
|  |                             // Two children have failed | ||||
|  |                             this->fail(state, queues); | ||||
|  |                             return; | ||||
|  |                         } else { | ||||
|  |                             childFailed = true; | ||||
|  |                         } | ||||
|  |                     } | ||||
|  |                 } | ||||
|  |             } | ||||
|  | 
 | ||||
|  |             void checkFailsafe(storm::storage::DFTState<ValueType>& state, DFTStateSpaceGenerationQueues<ValueType>& queues) const override { | ||||
|  |             } | ||||
|  | 
 | ||||
|  |             bool checkDontCareAnymore(storm::storage::DFTState<ValueType>& state, DFTStateSpaceGenerationQueues<ValueType>& queues) const override { | ||||
|  |                 // Actually, it doesnt matter what we return here.. | ||||
|  |                 return false; | ||||
|  |             } | ||||
|  |         }; | ||||
|  | 
 | ||||
|  |     } | ||||
|  | } | ||||
| @ -0,0 +1,59 @@ | |||||
|  | #pragma once | ||||
|  | 
 | ||||
|  | #include "DFTRestriction.h" | ||||
|  | 
 | ||||
|  | namespace storm { | ||||
|  |     namespace storage { | ||||
|  | 
 | ||||
|  |         /*! | ||||
|  |          * Sequence enforcer (SEQ). | ||||
|  |          * All children can only fail in order from first to last child. | ||||
|  |          * A child which has not failed yet prevents the failure of all children to the right of it. | ||||
|  |          */ | ||||
|  |         template<typename ValueType> | ||||
|  |         class DFTSeq : public DFTRestriction<ValueType> { | ||||
|  | 
 | ||||
|  |         public: | ||||
|  |             /*! | ||||
|  |              * Constructor. | ||||
|  |              * @param id Id. | ||||
|  |              * @param name Name. | ||||
|  |              * @param children Children. | ||||
|  |              */ | ||||
|  |             DFTSeq(size_t id, std::string const& name, std::vector<std::shared_ptr<DFTElement<ValueType>>> const& children = {}) : DFTRestriction<ValueType>(id, name, children) { | ||||
|  |                 // Intentionally left empty. | ||||
|  |             } | ||||
|  | 
 | ||||
|  |             DFTElementType type() const override { | ||||
|  |                 return DFTElementType::SEQ; | ||||
|  |             } | ||||
|  | 
 | ||||
|  |             bool isSeqEnforcer() const override { | ||||
|  |                 return true; | ||||
|  |             } | ||||
|  | 
 | ||||
|  |             void checkFails(storm::storage::DFTState<ValueType>& state, DFTStateSpaceGenerationQueues<ValueType>& queues) const override { | ||||
|  |                 STORM_LOG_ASSERT(queues.failurePropagationDone(), "Failure propagation not finished."); | ||||
|  |                 bool childOperationalBefore = false; | ||||
|  |                 for (auto const& child : this->children()) { | ||||
|  |                     if (!state.hasFailed(child->id())) { | ||||
|  |                         childOperationalBefore = true; | ||||
|  |                     } else if (childOperationalBefore && state.hasFailed(child->id())) { | ||||
|  |                         // Child has failed before left sibling. | ||||
|  |                         this->fail(state, queues); | ||||
|  |                         return; | ||||
|  |                     } | ||||
|  |                 } | ||||
|  |             } | ||||
|  | 
 | ||||
|  |             void checkFailsafe(storm::storage::DFTState<ValueType>& state, DFTStateSpaceGenerationQueues<ValueType>& queues) const override { | ||||
|  |             } | ||||
|  | 
 | ||||
|  |             bool checkDontCareAnymore(storm::storage::DFTState<ValueType>& state, DFTStateSpaceGenerationQueues<ValueType>& queues) const override { | ||||
|  |                 // Actually, it doesnt matter what we return here.. | ||||
|  |                 return false; | ||||
|  |             } | ||||
|  |         }; | ||||
|  | 
 | ||||
|  |     } | ||||
|  | } | ||||
						Write
						Preview
					
					
					Loading…
					
					Cancel
						Save
					
		Reference in new issue