#include "src/builder/DftExplorationHeuristic.h" #include "src/adapters/CarlAdapter.h" #include "src/utility/macros.h" #include "src/utility/constants.h" #include "src/exceptions/NotImplementedException.h" #include namespace storm { namespace builder { template DFTExplorationHeuristic::DFTExplorationHeuristic(size_t id) : id(id), expand(false), depth(std::numeric_limits::max()), rate(storm::utility::zero()), exitRate(storm::utility::zero()) { // Intentionally left empty } template void DFTExplorationHeuristic::updateHeuristicValues(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 DFTExplorationHeuristicNone::DFTExplorationHeuristicNone(size_t id) : DFTExplorationHeuristic(id) { // Intentionally left empty } template bool DFTExplorationHeuristicNone::isSkip(double approximationThreshold) const { return false; } template bool DFTExplorationHeuristicNone::operator<(DFTExplorationHeuristicNone const& other) const { // Just use memory address for comparing // TODO Matthias: better idea? return this > &other; } template DFTExplorationHeuristicDepth::DFTExplorationHeuristicDepth(size_t id) : DFTExplorationHeuristic(id) { // Intentionally left empty } template bool DFTExplorationHeuristicDepth::isSkip(double approximationThreshold) const { return !this->expand && this->depth > approximationThreshold; } template bool DFTExplorationHeuristicDepth::operator<(DFTExplorationHeuristicDepth const& other) const { return this->depth > other.depth; } template DFTExplorationHeuristicRateRatio::DFTExplorationHeuristicRateRatio(size_t id) : DFTExplorationHeuristic(id) { // Intentionally left empty } template bool DFTExplorationHeuristicRateRatio::isSkip(double approximationThreshold) const { return !this->expand && this->getRateRatio() < approximationThreshold; } template bool DFTExplorationHeuristicRateRatio::operator<(DFTExplorationHeuristicRateRatio const& other) const { return this->getRateRatio() < other.getRateRatio(); } template<> double DFTExplorationHeuristicRateRatio::getRateRatio() const { return rate/exitRate; } template<> double DFTExplorationHeuristicRateRatio::getRateRatio() const { STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Heuristic rate ration does not work."); } // Instantiate templates. template class DFTExplorationHeuristic; template class DFTExplorationHeuristicNone; template class DFTExplorationHeuristicDepth; template class DFTExplorationHeuristicRateRatio; #ifdef STORM_HAVE_CARL template class DFTExplorationHeuristic; template class DFTExplorationHeuristicNone; template class DFTExplorationHeuristicDepth; template class DFTExplorationHeuristicRateRatio; #endif } }