| 
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -6,7 +6,7 @@ namespace storm { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    namespace storage { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        template<typename ValueType> | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        DFTState<ValueType>::DFTState(DFT<ValueType> const& dft, DFTStateGenerationInfo const& stateGenerationInfo, size_t id) : mStatus(dft.stateBitVectorSize()), mId(id), mPseudoState(false), mDft(dft), mStateGenerationInfo(stateGenerationInfo) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        DFTState<ValueType>::DFTState(DFT<ValueType> const& dft, DFTStateGenerationInfo const& stateGenerationInfo, size_t id) : mStatus(dft.stateBitVectorSize()), mId(id), failableElements(dft.nrElements()), mPseudoState(false), mDft(dft), mStateGenerationInfo(stateGenerationInfo) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            // TODO Matthias: use construct()
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					             | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            // Initialize uses
 | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -20,12 +20,14 @@ namespace storm { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            // Initialize activation
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            propagateActivation(mDft.getTopLevelIndex()); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            std::vector<size_t> alwaysActiveBEs = mDft.nonColdBEs(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            mCurrentlyFailableBE.insert(mCurrentlyFailableBE.end(), alwaysActiveBEs.begin(), alwaysActiveBEs.end()); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            // Initialize currently failable BEs
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            for (size_t id : mDft.nonColdBEs()) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                failableElements.addBE(id); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        template<typename ValueType> | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        DFTState<ValueType>::DFTState(storm::storage::BitVector const& status, DFT<ValueType> const& dft, DFTStateGenerationInfo const& stateGenerationInfo, size_t id) : mStatus(status), mId(id), mPseudoState(true), mDft(dft), mStateGenerationInfo(stateGenerationInfo) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        DFTState<ValueType>::DFTState(storm::storage::BitVector const& status, DFT<ValueType> const& dft, DFTStateGenerationInfo const& stateGenerationInfo, size_t id) : mStatus(status), mId(id), failableElements(dft.nrElements()), mPseudoState(true), mDft(dft), mStateGenerationInfo(stateGenerationInfo) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            // Intentionally left empty
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					         | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -33,8 +35,7 @@ namespace storm { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        void DFTState<ValueType>::construct() { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            STORM_LOG_TRACE("Construct concrete state from pseudo state " << mDft.getStateString(mStatus, mStateGenerationInfo, mId)); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            // Clear information from pseudo state
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            mCurrentlyFailableBE.clear(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            mFailableDependencies.clear(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            failableElements.clear(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            mUsedRepresentants.clear(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            STORM_LOG_ASSERT(mPseudoState, "Only pseudo states can be constructed."); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            for(size_t index = 0; index < mDft.nrElements(); ++index) { | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -42,7 +43,7 @@ namespace storm { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                if (mDft.isBasicElement(index) && isOperational(index)) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    std::shared_ptr<const DFTBE<ValueType>> be = mDft.getBasicElement(index); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    if (be->canFail() && (!be->isColdBasicElement() || !mDft.hasRepresentant(index) || isActive(mDft.getRepresentant(index)))) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                        mCurrentlyFailableBE.push_back(index); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                        failableElements.addBE(index); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                        STORM_LOG_TRACE("Currently failable: " << be->toString()); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                } else if (mDft.getElement(index)->isSpareGate()) { | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -59,7 +60,7 @@ namespace storm { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                STORM_LOG_ASSERT(dependencyId == dependency->id(), "Ids do not match."); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                assert(dependency->dependentEvents().size() == 1); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                if (hasFailed(dependency->triggerEvent()->id()) && getElementState(dependency->dependentEvents()[0]->id()) == DFTElementState::Operational) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    mFailableDependencies.push_back(dependencyId); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    failableElements.addDependency(dependencyId); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    STORM_LOG_TRACE("New dependency failure: " << dependency->toString()); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            } | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -185,10 +186,7 @@ namespace storm { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        template<typename ValueType> | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        void DFTState<ValueType>::beNoLongerFailable(size_t id) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            auto it = std::find(mCurrentlyFailableBE.begin(), mCurrentlyFailableBE.end(), id); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            if (it != mCurrentlyFailableBE.end()) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                mCurrentlyFailableBE.erase(it); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            failableElements.removeBE(id); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        template<typename ValueType> | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -202,13 +200,11 @@ namespace storm { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                assert(dependency->dependentEvents().size() == 1); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                if (getElementState(dependency->dependentEvents()[0]->id()) == DFTElementState::Operational) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    STORM_LOG_ASSERT(!isFailsafe(dependency->dependentEvents()[0]->id()), "Dependent event is failsafe."); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    if (std::find(mFailableDependencies.begin(), mFailableDependencies.end(), dependency->id()) == mFailableDependencies.end()) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                        mFailableDependencies.push_back(dependency->id()); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    failableElements.addDependency(dependency->id()); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    STORM_LOG_TRACE("New dependency failure: " << dependency->toString()); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            return nrFailableDependencies() > 0; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            return failableElements.hasDependencies(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					         | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        template<typename ValueType> | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -237,43 +233,35 @@ namespace storm { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        template<typename ValueType> | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        ValueType DFTState<ValueType>::getFailableBERate(size_t index) const { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            STORM_LOG_ASSERT(index < nrFailableBEs(), "Index invalid."); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            return getBERate(mCurrentlyFailableBE[index]); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        template<typename ValueType> | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        std::pair<std::shared_ptr<DFTBE<ValueType> const>, bool> DFTState<ValueType>::letNextBEFail(size_t index) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        std::pair<std::shared_ptr<DFTBE<ValueType> const>, bool> DFTState<ValueType>::letNextBEFail(size_t id) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            STORM_LOG_TRACE("currently failable: " << getCurrentlyFailableString()); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            if (nrFailableDependencies() > 0) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            if (failableElements.hasDependencies()) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                // Consider failure due to dependency
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                STORM_LOG_ASSERT(index < nrFailableDependencies(), "Index invalid."); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                std::shared_ptr<DFTDependency<ValueType> const> dependency = mDft.getDependency(mFailableDependencies[index]); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                assert(dependency->dependentEvents().size() == 1); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                std::shared_ptr<DFTDependency<ValueType> const> dependency = mDft.getDependency(id); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                STORM_LOG_ASSERT(dependency->dependentEvents().size() == 1, "More than one dependent event"); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                std::pair<std::shared_ptr<DFTBE<ValueType> const>,bool> res(mDft.getBasicElement(dependency->dependentEvents()[0]->id()), true); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                STORM_LOG_ASSERT(!hasFailed(res.first->id()), "Element " << res.first->toString() << " has already failed."); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                mFailableDependencies.erase(mFailableDependencies.begin() + index); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                failableElements.removeDependency(id); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                setFailed(res.first->id()); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                setDependencySuccessful(dependency->id()); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                beNoLongerFailable(res.first->id()); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                return res; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            } else { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                // Consider "normal" failure
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                STORM_LOG_ASSERT(index < nrFailableBEs(), "Index invalid."); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                std::pair<std::shared_ptr<DFTBE<ValueType> const>,bool> res(mDft.getBasicElement(mCurrentlyFailableBE[index]), false); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                std::pair<std::shared_ptr<DFTBE<ValueType> const>,bool> res(mDft.getBasicElement(id), false); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                STORM_LOG_ASSERT(!hasFailed(res.first->id()), "Element " << res.first->toString() << " has already failed."); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                STORM_LOG_ASSERT(res.first->canFail(), "Element " << *(res.first) << " cannot fail."); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                mCurrentlyFailableBE.erase(mCurrentlyFailableBE.begin() + index); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                failableElements.removeBE(id); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                setFailed(res.first->id()); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                return res; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        template<typename ValueType> | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        void DFTState<ValueType>::letDependencyBeUnsuccessful(size_t index) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            STORM_LOG_ASSERT(nrFailableDependencies() > 0 && index < nrFailableDependencies(), "Index invalid."); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            std::shared_ptr<DFTDependency<ValueType> const> dependency = mDft.getDependency(getDependencyId(index)); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            mFailableDependencies.erase(mFailableDependencies.begin() + index); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        void DFTState<ValueType>::letDependencyBeUnsuccessful(size_t id) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            STORM_LOG_ASSERT(failableElements.hasDependencies(), "Index invalid."); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            std::shared_ptr<DFTDependency<ValueType> const> dependency = mDft.getDependency(id); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            failableElements.removeDependency(id); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            setDependencyUnsuccessful(dependency->id()); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -299,7 +287,7 @@ namespace storm { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    std::shared_ptr<const DFTBE<ValueType>> be = mDft.getBasicElement(elem); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    if (be->isColdBasicElement() && be->canFail()) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                        // Add to failable BEs
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                        mCurrentlyFailableBE.push_back(elem); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                        failableElements.addBE(elem); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                } else if (mDft.getElement(elem)->isSpareGate() && !isActive(uses(elem))) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    propagateActivation(uses(elem)); | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
				
				 | 
				
					
  |