You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							99 lines
						
					
					
						
							3.4 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							99 lines
						
					
					
						
							3.4 KiB
						
					
					
				| #include <src/exceptions/NotImplementedException.h> | |
| #include <src/utility/macros.h> | |
| #include "DFTElements.h" | |
|  | |
| namespace storm { | |
|     namespace storage { | |
| 
 | |
|         template<typename ValueType> | |
|         bool DFTElement<ValueType>::checkDontCareAnymore(storm::storage::DFTState<ValueType>& state, DFTStateSpaceGenerationQueues<ValueType>& queues) const { | |
|             if(!state.dontCare(mId) && !hasOutgoingDependencies()) | |
|             { | |
|                 for(DFTGatePointer const& parent : mParents) { | |
|                     if(state.isOperational(parent->id())) { | |
|                         return false; | |
|                     } | |
|                 } | |
|                 state.setDontCare(mId); | |
|                 return true; | |
| 
 | |
|             } | |
|             return false; | |
|         } | |
| 
 | |
|         template<typename ValueType> | |
|         void DFTElement<ValueType>::extendSpareModule(std::set<size_t>& elementsInModule) const { | |
|             for(auto const& parent : mParents) { | |
|                 if(elementsInModule.count(parent->id()) == 0 && !parent->isSpareGate()) { | |
|                     elementsInModule.insert(parent->id()); | |
|                     parent->extendSpareModule(elementsInModule); | |
|                 } | |
|             } | |
|         } | |
| 
 | |
|         template<typename ValueType> | |
|         std::vector<size_t> DFTElement<ValueType>::independentUnit() const { | |
|             std::vector<size_t> res; | |
|             res.push_back(this->id()); | |
|             // Extend for pdeps. | |
|             return res; | |
|         } | |
| 
 | |
|         template<typename ValueType> | |
|         void DFTElement<ValueType>::extendUnit(std::set<size_t>& unit) const { | |
|             unit.insert(mId); | |
|         } | |
| 
 | |
|         template<typename ValueType> | |
|         std::vector<size_t> DFTElement<ValueType>::independentSubDft() const { | |
|             std::cout << "INDEPENDENT SUBTREE CALL " << this->id() << std::endl; | |
|             std::vector<size_t> res; | |
|             res.push_back(this->id()); | |
|             return res; | |
|         } | |
| 
 | |
|         template<typename ValueType> | |
|         void DFTElement<ValueType>::extendSubDft(std::set<size_t>& elemsInSubtree, std::vector<size_t> const& parentsOfSubRoot) const { | |
|             if(elemsInSubtree.count(this->id()) > 0) return; | |
|             if(std::find(parentsOfSubRoot.begin(), parentsOfSubRoot.end(), mId) != parentsOfSubRoot.end()) { | |
|                 // This is a parent of the suspected root, thus it is not a subdft. | |
|                 elemsInSubtree.clear(); | |
|                 return; | |
|             } | |
|             elemsInSubtree.insert(mId); | |
|             for(auto const& parent : mParents) { | |
|                  | |
|                 parent->extendSubDft(elemsInSubtree, parentsOfSubRoot); | |
|                 if(elemsInSubtree.empty()) { | |
|                     return; | |
|                 } | |
|             } | |
|             for(auto const& dep : mOutgoingDependencies) { | |
|                 dep->extendSubDft(elemsInSubtree, parentsOfSubRoot); | |
|                 if(elemsInSubtree.empty()) { | |
|                     return; | |
|                 } | |
| 
 | |
|             } | |
|         } | |
| 
 | |
| 
 | |
|         template<typename ValueType> | |
|         bool DFTBE<ValueType>::checkDontCareAnymore(storm::storage::DFTState<ValueType>& state, DFTStateSpaceGenerationQueues<ValueType>& queues) const { | |
|             if(DFTElement<ValueType>::checkDontCareAnymore(state, queues)) { | |
|                 state.beNoLongerFailable(this->mId); | |
|                 return true; | |
|             } | |
|             return false; | |
|         } | |
| 
 | |
| 
 | |
|         // Explicitly instantiate the class. | |
|         template class DFTBE<double>; | |
| 
 | |
| #ifdef STORM_HAVE_CARL | |
|         template class DFTBE<RationalFunction>; | |
| #endif | |
|          | |
|     } | |
| }
 |