#include "src/solver/TerminationCondition.h" #include "src/utility/vector.h" #include "src/adapters/CarlAdapter.h" #include "src/utility/macros.h" namespace storm { namespace solver { template bool NoTerminationCondition::terminateNow(std::vector const& currentValues) const { return false; } template TerminateIfFilteredSumExceedsThreshold::TerminateIfFilteredSumExceedsThreshold(storm::storage::BitVector const& filter, ValueType const& threshold, bool strict) : threshold(threshold), filter(filter), strict(strict) { // Intentionally left empty. } template bool TerminateIfFilteredSumExceedsThreshold::terminateNow(std::vector const& currentValues) const { STORM_LOG_ASSERT(currentValues.size() == filter.size(), "Vectors sizes mismatch."); ValueType currentThreshold = storm::utility::vector::sum_if(currentValues, filter); return strict ? currentThreshold > this->threshold : currentThreshold >= this->threshold; } template TerminateIfFilteredExtremumExceedsThreshold::TerminateIfFilteredExtremumExceedsThreshold(storm::storage::BitVector const& filter, bool strict, ValueType const& threshold, bool useMinimum) : TerminateIfFilteredSumExceedsThreshold(filter, threshold, strict), useMinimum(useMinimum) { // Intentionally left empty. } template bool TerminateIfFilteredExtremumExceedsThreshold::terminateNow(std::vector const& currentValues) const { STORM_LOG_ASSERT(currentValues.size() == this->filter.size(), "Vectors sizes mismatch."); ValueType currentValue = useMinimum ? storm::utility::vector::min_if(currentValues, this->filter) : storm::utility::vector::max_if(currentValues, this->filter); return this->strict ? currentValue > this->threshold : currentValue >= this->threshold; } template class TerminateIfFilteredSumExceedsThreshold; template class TerminateIfFilteredExtremumExceedsThreshold; #ifdef STORM_HAVE_CARL template class TerminateIfFilteredSumExceedsThreshold; template class TerminateIfFilteredExtremumExceedsThreshold; #endif } }