| 
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -7,7 +7,6 @@ namespace storm { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        template<typename ValueType> | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        DFTState<ValueType>::DFTState(DFT<ValueType> const& dft, DFTStateGenerationInfo const& stateGenerationInfo, size_t id) : mStatus(dft.stateVectorSize()), mId(id), mDft(dft), mStateGenerationInfo(stateGenerationInfo)  { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            mInactiveSpares = dft.getSpareIndices(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					             | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            // Initialize uses
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            for(size_t id  : mDft.getSpareIndices()) { | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -18,12 +17,7 @@ namespace storm { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					             | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            // Initialize activation
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            this->activate(mDft.getTopLevelIndex()); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            for(auto const& id : mDft.module(mDft.getTopLevelIndex())) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                if(mDft.getElement(id)->isSpareGate()) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    propagateActivation(uses(id)); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            propagateActivation(mDft.getTopLevelIndex()); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            std::vector<size_t> alwaysActiveBEs = dft.nonColdBEs(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            mIsCurrentlyFailableBE.insert(mIsCurrentlyFailableBE.end(), alwaysActiveBEs.begin(), alwaysActiveBEs.end()); | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -182,29 +176,25 @@ namespace storm { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        template<typename ValueType> | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        void DFTState<ValueType>::activate(size_t repr) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            for(size_t elem : mDft.module(repr)) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                if(mDft.getElement(elem)->isColdBasicElement() && isOperational(elem)) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    mIsCurrentlyFailableBE.push_back(elem); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                else if(mDft.getElement(elem)->isSpareGate()) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    assert(std::find(mInactiveSpares.begin(), mInactiveSpares.end(), elem) != mInactiveSpares.end()); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    mInactiveSpares.erase(std::find(mInactiveSpares.begin(), mInactiveSpares.end(), elem)); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            size_t activationIndex = mStateGenerationInfo.getSpareActivationIndex(repr); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            assert(!mStatus[activationIndex]); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            mStatus.set(activationIndex); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            propagateActivation(repr); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        template<typename ValueType> | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        bool DFTState<ValueType>::isActiveSpare(size_t id) const { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            assert(mDft.getElement(id)->isSpareGate()); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            return (std::find(mInactiveSpares.begin(), mInactiveSpares.end(), id) == mInactiveSpares.end()); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        bool DFTState<ValueType>::isActive(size_t id) const { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            assert(mDft.isRepresentative(id)); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            return mStatus[mStateGenerationInfo.getSpareActivationIndex(id)]; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					             | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        template<typename ValueType> | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        void DFTState<ValueType>::propagateActivation(size_t representativeId) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            activate(representativeId); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            for(size_t id : mDft.module(representativeId)) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                if(mDft.getElement(id)->isSpareGate()) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    propagateActivation(uses(id)); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            for(size_t elem : mDft.module(representativeId)) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                if(mDft.getElement(elem)->isColdBasicElement() && isOperational(elem)) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    mIsCurrentlyFailableBE.push_back(elem); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                } else if (mDft.getElement(elem)->isSpareGate() && !isActive(uses(elem))) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    activate(uses(elem)); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        } | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -243,8 +233,8 @@ namespace storm { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                size_t childId = (*it)->id(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                if(!hasFailed(childId) && !isUsed(childId)) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    setUses(spareId, childId); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    if(isActiveSpare(spareId)) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                        propagateActivation(childId); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    if(isActive(currentlyUses)) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                        activate(childId); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    return true; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                } | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
				
				 | 
				
					
  |