|
|
@ -15,6 +15,13 @@ namespace storm { |
|
|
|
// 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> |
|
|
|
bool DFTExplorationHeuristic<ValueType>::isSkip(double approximationThreshold, ApproximationHeuristic heuristic) const { |
|
|
|
if (!skip) { |
|
|
@ -26,8 +33,9 @@ namespace storm { |
|
|
|
case ApproximationHeuristic::DEPTH: |
|
|
|
return depth > approximationThreshold; |
|
|
|
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; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
template<typename ValueType> |
|
|
|
size_t DFTExplorationHeuristic<ValueType>::getDepth() const { |
|
|
|
return depth; |
|
|
|
} |
|
|
|
|
|
|
|
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<> |
|
|
|
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<> |
|
|
|
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 bool compareDepth(std::shared_ptr<storm::storage::DFTState<double>>, std::shared_ptr<storm::storage::DFTState<double>>); |
|
|
|
|
|
|
|
#ifdef STORM_HAVE_CARL
|
|
|
|
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
|
|
|
|
} |
|
|
|
} |