#include "storm/solver/SolveGoal.h" #include #include "storm/adapters/RationalNumberAdapter.h" #include "storm/adapters/RationalFunctionAdapter.h" #include "storm/modelchecker/CheckTask.h" #include "storm/utility/solver.h" #include "storm/solver/LinearEquationSolver.h" #include "storm/solver/MinMaxLinearEquationSolver.h" namespace storm { namespace storage { template class SparseMatrix; } namespace solver { template SolveGoal::SolveGoal() { // Intentionally left empty. } template SolveGoal::SolveGoal(bool minimize) : optimizationDirection(minimize ? OptimizationDirection::Minimize : OptimizationDirection::Maximize) { // Intentionally left empty. } template SolveGoal::SolveGoal(OptimizationDirection optimizationDirection) : optimizationDirection(optimizationDirection) { // Intentionally left empty. } template SolveGoal::SolveGoal(OptimizationDirection optimizationDirection, storm::logic::ComparisonType boundComparisonType, ValueType const& boundThreshold, storm::storage::BitVector const& relevantValues) : optimizationDirection(optimizationDirection), comparisonType(boundComparisonType), threshold(boundThreshold), relevantValueVector(relevantValues) { // Intentionally left empty. } template bool SolveGoal::hasDirection() const { return static_cast(optimizationDirection); } template void SolveGoal::oneMinus() { if (optimizationDirection) { if (optimizationDirection == storm::solver::OptimizationDirection::Minimize) { optimizationDirection = storm::solver::OptimizationDirection::Maximize; } else { optimizationDirection = storm::solver::OptimizationDirection::Minimize; } } if (threshold) { this->threshold = storm::utility::one() - this->threshold.get(); } if (comparisonType) { switch (comparisonType.get()) { case storm::logic::ComparisonType::Less: comparisonType = storm::logic::ComparisonType::GreaterEqual; break; case storm::logic::ComparisonType::LessEqual: comparisonType = storm::logic::ComparisonType::Greater; break; case storm::logic::ComparisonType::Greater: comparisonType = storm::logic::ComparisonType::LessEqual; break; case storm::logic::ComparisonType::GreaterEqual: comparisonType = storm::logic::ComparisonType::Less; break; } } } template bool SolveGoal::minimize() const { return optimizationDirection == OptimizationDirection::Minimize; } template OptimizationDirection SolveGoal::direction() const { return optimizationDirection.get(); } template bool SolveGoal::isBounded() const { return comparisonType && threshold && relevantValueVector; } template bool SolveGoal::boundIsALowerBound() const { return (comparisonType.get() == storm::logic::ComparisonType::Greater || comparisonType.get() == storm::logic::ComparisonType::GreaterEqual); } template bool SolveGoal::boundIsStrict() const { return (comparisonType.get() == storm::logic::ComparisonType::Greater || comparisonType.get() == storm::logic::ComparisonType::Less); } template ValueType const& SolveGoal::thresholdValue() const { return threshold.get(); } template bool SolveGoal::hasRelevantValues() const { return static_cast(relevantValueVector); } template storm::storage::BitVector const& SolveGoal::relevantValues() const { return relevantValueVector.get(); } template storm::storage::BitVector& SolveGoal::relevantValues() { return relevantValueVector.get(); } template void SolveGoal::restrictRelevantValues(storm::storage::BitVector const& filter) { if (relevantValueVector) { relevantValueVector = relevantValueVector.get() % filter; } } template void SolveGoal::setRelevantValues(storm::storage::BitVector&& values) { relevantValueVector = std::move(values); } template class SolveGoal; #ifdef STORM_HAVE_CARL template class SolveGoal; template class SolveGoal; #endif } }