| 
					
					
						
							
						
					
					
				 | 
				@ -15,6 +15,13 @@ namespace storm { | 
			
		
		
	
		
			
				 | 
				 | 
				            // Intentionally left empty
 | 
				 | 
				 | 
				            // Intentionally left empty
 | 
			
		
		
	
		
			
				 | 
				 | 
				        } | 
				 | 
				 | 
				        } | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				        template<typename ValueType> | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				        void DFTExplorationHeuristic<ValueType>::setHeuristicValues(size_t depth, ValueType rate, ValueType exitRate) { | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            this->depth = std::min(this->depth, depth); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            this->rate = std::max(this->rate, rate); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            this->exitRate = std::max(this->exitRate, exitRate); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				        } | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				        template<typename ValueType> | 
				 | 
				 | 
				        template<typename ValueType> | 
			
		
		
	
		
			
				 | 
				 | 
				        bool DFTExplorationHeuristic<ValueType>::isSkip(double approximationThreshold, ApproximationHeuristic heuristic) const { | 
				 | 
				 | 
				        bool DFTExplorationHeuristic<ValueType>::isSkip(double approximationThreshold, ApproximationHeuristic heuristic) const { | 
			
		
		
	
		
			
				 | 
				 | 
				            if (!skip) { | 
				 | 
				 | 
				            if (!skip) { | 
			
		
		
	
	
		
			
				| 
					
					
					
						
							
						
					
				 | 
				@ -26,8 +33,9 @@ namespace storm { | 
			
		
		
	
		
			
				 | 
				 | 
				                case ApproximationHeuristic::DEPTH: | 
				 | 
				 | 
				                case ApproximationHeuristic::DEPTH: | 
			
		
		
	
		
			
				 | 
				 | 
				                    return depth > approximationThreshold; | 
				 | 
				 | 
				                    return depth > approximationThreshold; | 
			
		
		
	
		
			
				 | 
				 | 
				                case ApproximationHeuristic::RATERATIO: | 
				 | 
				 | 
				                case ApproximationHeuristic::RATERATIO: | 
			
		
		
	
		
			
				 | 
				 | 
				                    // TODO Matthias: implement
 | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                    STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Heuristic rate ration does not work."); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                    return getRateRatio() < approximationThreshold; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                default: | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                    STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Heuristic not known."); | 
			
		
		
	
		
			
				 | 
				 | 
				            } | 
				 | 
				 | 
				            } | 
			
		
		
	
		
			
				 | 
				 | 
				        } | 
				 | 
				 | 
				        } | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
	
		
			
				| 
					
					
					
						
							
						
					
				 | 
				@ -36,52 +44,41 @@ namespace storm { | 
			
		
		
	
		
			
				 | 
				 | 
				            skip = false; | 
				 | 
				 | 
				            skip = false; | 
			
		
		
	
		
			
				 | 
				 | 
				        } | 
				 | 
				 | 
				        } | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				        template<typename ValueType> | 
				 | 
				 | 
				        template<typename ValueType> | 
			
		
		
	
		
			
				 | 
				 | 
				        size_t DFTExplorationHeuristic<ValueType>::getDepth() const { | 
				 | 
				 | 
				        size_t DFTExplorationHeuristic<ValueType>::getDepth() const { | 
			
		
		
	
		
			
				 | 
				 | 
				            return depth; | 
				 | 
				 | 
				            return depth; | 
			
		
		
	
		
			
				 | 
				 | 
				        } | 
				 | 
				 | 
				        } | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				        template<typename ValueType> | 
				 | 
				 | 
				        template<typename ValueType> | 
			
		
		
	
		
			
				 | 
				 | 
				        void DFTExplorationHeuristic<ValueType>::setHeuristicValues(size_t depth, ValueType rate, ValueType exitRate) { | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				            this->depth = depth; | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				            this->rate = rate; | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				            this->exitRate = exitRate; | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				        } | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				        template<typename ValueType> | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				        double DFTExplorationHeuristic<ValueType>::getPriority() const { | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Approximation works only for double."); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				        bool DFTExplorationHeuristic<ValueType>::compare(DFTExplorationHeuristic<ValueType> other, ApproximationHeuristic heuristic) { | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            switch (heuristic) { | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                case ApproximationHeuristic::NONE: | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                    // Just use memory address for comparing
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                    // TODO Matthias: better idea?
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                    return this > &other; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                case ApproximationHeuristic::DEPTH: | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                    return this->depth > other.depth; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                case ApproximationHeuristic::RATERATIO: | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                    return this->getRateRatio() < other.getRateRatio(); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                default: | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                    STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Heuristic not known."); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            } | 
			
		
		
	
		
			
				 | 
				 | 
				        } | 
				 | 
				 | 
				        } | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				        template<> | 
				 | 
				 | 
				        template<> | 
			
		
		
	
		
			
				 | 
				 | 
				        double DFTExplorationHeuristic<double>::getPriority() const { | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				            // TODO Matthias: change according to heuristic
 | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				            //return rate/exitRate;
 | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				            return depth; | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				        double DFTExplorationHeuristic<double>::getRateRatio() const { | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            return rate/exitRate; | 
			
		
		
	
		
			
				 | 
				 | 
				        } | 
				 | 
				 | 
				        } | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				        template<> | 
				 | 
				 | 
				        template<> | 
			
		
		
	
		
			
				 | 
				 | 
				        double DFTExplorationHeuristic<storm::RationalFunction>::getPriority() const { | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Approximation works only for double."); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				            /*std::cout << (rate / exitRate) << " < " << threshold << ": " << (number < threshold) << std::endl;
 | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				             std::map<storm::Variable, storm::RationalNumber> mapping; | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				             storm::RationalFunction eval(number.evaluate(mapping)); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				             std::cout << "Evaluated: " << eval << std::endl; | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				             return eval < threshold;*/ | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				        } | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				        template<typename ValueType> | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				        bool compareDepth(std::shared_ptr<storm::storage::DFTState<ValueType>> stateA, std::shared_ptr<storm::storage::DFTState<ValueType>> stateB) { | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				            return stateA->getPriority() > stateB->getPriority(); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				        double DFTExplorationHeuristic<storm::RationalFunction>::getRateRatio() const { | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Heuristic rate ration does not work."); | 
			
		
		
	
		
			
				 | 
				 | 
				        } | 
				 | 
				 | 
				        } | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				        template class DFTExplorationHeuristic<double>; | 
				 | 
				 | 
				        template class DFTExplorationHeuristic<double>; | 
			
		
		
	
		
			
				 | 
				 | 
				        template bool compareDepth(std::shared_ptr<storm::storage::DFTState<double>>, std::shared_ptr<storm::storage::DFTState<double>>); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				#ifdef STORM_HAVE_CARL
 | 
				 | 
				 | 
				#ifdef STORM_HAVE_CARL
 | 
			
		
		
	
		
			
				 | 
				 | 
				        template class DFTExplorationHeuristic<storm::RationalFunction>; | 
				 | 
				 | 
				        template class DFTExplorationHeuristic<storm::RationalFunction>; | 
			
		
		
	
		
			
				 | 
				 | 
				        template bool compareDepth(std::shared_ptr<storm::storage::DFTState<storm::RationalFunction>>, std::shared_ptr<storm::storage::DFTState<storm::RationalFunction>>); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				#endif
 | 
				 | 
				 | 
				#endif
 | 
			
		
		
	
		
			
				 | 
				 | 
				    } | 
				 | 
				 | 
				    } | 
			
		
		
	
		
			
				 | 
				 | 
				} | 
				 | 
				 | 
				} |