1#include "storm-config.h"
23 return std::make_unique<storm::modelchecker::ExplicitQualitativeCheckResult<double>>(model->getInitialStates());
27 return std::make_unique<storm::modelchecker::ExplicitQualitativeCheckResult<double>>(model->getInitialStates());
32 return std::make_unique<storm::modelchecker::ExplicitQualitativeCheckResult<storm::RationalNumber>>(model->getInitialStates());
36 std::unique_ptr<storm::modelchecker::CheckResult>& result) {
38 result->filter(*filter);
39 return result->asQuantitativeCheckResult<storm::RationalNumber>().getMin();
44 return std::make_unique<storm::modelchecker::ExplicitQualitativeCheckResult<storm::RationalNumber>>(model->getInitialStates());
48 std::unique_ptr<storm::modelchecker::CheckResult>& result) {
50 result->filter(*filter);
51 return result->asQuantitativeCheckResult<
double>().getMin();
55 std::unique_ptr<storm::modelchecker::CheckResult>& result) {
57 result->filter(*filter);
58 return result->asQuantitativeCheckResult<
double>().getMin();
62 std::unique_ptr<storm::modelchecker::CheckResult>& result) {
64 result->filter(*filter);
65 return result->asQuantitativeCheckResult<storm::RationalNumber>().getMin();
69 auto const& explicitResult = result->asExplicitQuantitativeCheckResult<
double>();
70 ASSERT_TRUE(explicitResult.hasLowerBounds() || explicitResult.hasUpperBounds()) <<
"No bound on the solution was reported.";
71 if (explicitResult.hasLowerBounds()) {
72 EXPECT_LE(explicitResult.getLowerBoundVector().front(), expected + 0.0001) <<
"The lower bound exceeds the expected value.";
74 if (explicitResult.hasUpperBounds()) {
75 EXPECT_LE(expected, explicitResult.getUpperBoundVector().front() + 0.0001) <<
"The upper bound falls below the expected value.";
79void expectSolutionBoundsSound(std::unique_ptr<storm::modelchecker::CheckResult>
const& result, storm::RationalNumber
const& expected) {
80 auto const& explicitResult = result->asExplicitQuantitativeCheckResult<storm::RationalNumber>();
81 ASSERT_TRUE(explicitResult.hasLowerBounds() || explicitResult.hasUpperBounds()) <<
"No bound on the solution was reported.";
82 if (explicitResult.hasLowerBounds()) {
83 EXPECT_LE(explicitResult.getLowerBoundVector().front(), expected) <<
"The lower bound exceeds the expected value.";
85 if (explicitResult.hasUpperBounds()) {
86 EXPECT_LE(expected, explicitResult.getUpperBoundVector().front()) <<
"The upper bound falls below the expected value.";
90void expectThrow(std::string
const& path, std::string
const& formulaString) {
105void checkModel(std::string
const& path, std::string
const& formulaString,
double maxmin,
double maxmax,
double minmax,
double minmin,
bool produceScheduler) {
115 taskMax.setUncertaintyResolutionMode(storm::UncertaintyResolutionMode::Robust);
116 taskMax.setProduceSchedulers(produceScheduler);
119 auto resultMax = checker.
check(env, taskMax);
122 taskMax.setUncertaintyResolutionMode(storm::UncertaintyResolutionMode::Cooperative);
123 auto resultMaxNonRobust = checker.check(env, taskMax);
128 taskMin.setUncertaintyResolutionMode(storm::UncertaintyResolutionMode::Robust);
129 taskMin.setProduceSchedulers(produceScheduler);
131 auto resultMin = checker.check(env, taskMin);
134 taskMin.setUncertaintyResolutionMode(storm::UncertaintyResolutionMode::Cooperative);
135 auto resultMinNonRobust = checker.check(env, taskMin);
141 std::string constantsString) {
143 program = program.
preprocess(constantsString);
155 taskMinMin.setUncertaintyResolutionMode(storm::UncertaintyResolutionMode::Minimize);
158 auto resultMinMin = checker.
check(env, taskMinMin);
162 taskMinMax.setUncertaintyResolutionMode(storm::UncertaintyResolutionMode::Maximize);
164 auto resultMinMax = checker.check(env, taskMinMax);
168 taskMaxMin.setUncertaintyResolutionMode(storm::UncertaintyResolutionMode::Minimize);
170 auto resultMaxMin = checker.check(env, taskMaxMin);
174 taskMaxMin.setUncertaintyResolutionMode(storm::UncertaintyResolutionMode::Maximize);
176 auto resultMaxMax = checker.check(env, taskMaxMax);
180void checkModelRational(std::string
const& path, std::string
const& formulaString, storm::RationalNumber maxmin, storm::RationalNumber maxmax,
181 storm::RationalNumber minmax, storm::RationalNumber minmin,
bool produceScheduler) {
192 taskMax.setProduceSchedulers(produceScheduler);
195 taskMax.setUncertaintyResolutionMode(storm::UncertaintyResolutionMode::Robust);
196 auto resultMax = checker.
check(env, taskMax);
199 taskMax.setUncertaintyResolutionMode(storm::UncertaintyResolutionMode::Cooperative);
200 auto resultMaxNonRobust = checker.check(env, taskMax);
205 taskMin.setProduceSchedulers(produceScheduler);
207 taskMin.setUncertaintyResolutionMode(storm::UncertaintyResolutionMode::Robust);
208 auto resultMin = checker.check(env, taskMin);
211 taskMin.setUncertaintyResolutionMode(storm::UncertaintyResolutionMode::Cooperative);
212 auto resultMinNonRobust = checker.check(env, taskMin);
216TEST(RobustMdpModelCheckerTest, RobotMinMaxTest) {
218 GTEST_SKIP() <<
"Z3 not available.";
222 "Pmin=? [ F \"goal2\"];Pmin=? [ F \"goal2\"];Pmax=? [ F \"goal2\"];Pmax=? [ F \"goal2\"]", 0.4, 0.6, 1.0, 1.0,
229 std::vector<std::shared_ptr<storm::logic::Formula const>> formulas =
235 ASSERT_TRUE(formulas[0]->isProbabilityOperatorFormula());
237 ASSERT_TRUE(formulas[0]->asProbabilityOperatorFormula().getOptimalityType() == storm::solver::OptimizationDirection::Maximize);
243 auto exresult = checker.
check(env, task);
251 auto iresultMin = checker.
check(env, task);
253 EXPECT_LE(minValue, certainValue);
254 task.setUncertaintyResolutionMode(storm::UncertaintyResolutionMode::Cooperative);
255 auto iresultMax = checker.check(env, task);
257 EXPECT_LE(certainValue, maxValue);
263 std::vector<std::shared_ptr<storm::logic::Formula const>> formulas =
268 ASSERT_TRUE(formulas[0]->isProbabilityOperatorFormula());
269 ASSERT_TRUE(formulas[0]->asProbabilityOperatorFormula().getOptimalityType() == storm::solver::OptimizationDirection::Maximize);
274 auto exresult = checker.
check(env, taskCertain);
284 taskMin.setUncertaintyResolutionMode(storm::UncertaintyResolutionMode::Minimize);
285 auto iresultMin = ichecker.check(envIntervals, taskMin);
287 EXPECT_LE(minValue, certainValue);
290 taskMax.setUncertaintyResolutionMode(storm::UncertaintyResolutionMode::Maximize);
291 auto iresultMax = ichecker.check(envIntervals, taskMax);
293 EXPECT_LE(certainValue, maxValue);
298TEST(RobustMDPModelCheckingTest, Tiny01maxmin) {
299 checkModel(STORM_TEST_RESOURCES_DIR
"/imdp/tiny-01.drn",
"Pmax=? [ F \"target\"];Pmin=? [ F \"target\"]", 0.4, 0.5, 0.5, 0.4,
false);
302TEST(RobustMDPModelCheckingTest, Tiny03maxmin) {
303 checkModel(STORM_TEST_RESOURCES_DIR
"/imdp/tiny-03.drn",
"Pmax=? [ F \"target\"];Pmin=? [ F \"target\"]", 0.4, 0.6, 0.5, 0.3,
true);
306TEST(RobustMDPModelCheckingTest, BoundedTiny03maxmin) {
307 checkModel(STORM_TEST_RESOURCES_DIR
"/imdp/tiny-03.drn",
"Pmax=? [ F<=1 \"target\"];Pmin=? [ F<=1 \"target\"]", 0.4, 0.6, 0.5, 0.3,
true);
308 checkModel(STORM_TEST_RESOURCES_DIR
"/imdp/tiny-03.drn",
"Pmax=? [ F[1,1] \"target\"];Pmin=? [ F[1,1] \"target\"]", 0.4, 0.6, 0.5, 0.3,
true);
311TEST(RobustMDPModelCheckingTest, BoundedMaxmin) {
312 checkModel(STORM_TEST_RESOURCES_DIR
"/imdp/tiny-bounded.drn",
"Pmax=? [ F<=4 \"target\"];Pmin=? [ F<=4 \"target\"]", 0.6528, 0.81, 0.81, 0.6528,
true);
313 checkModel(STORM_TEST_RESOURCES_DIR
"/imdp/tiny-bounded.drn",
"Pmax=? [ F[0,4] \"target\"];Pmin=? [ F[0,4] \"target\"]", 0.6528, 0.81, 0.81, 0.6528,
true);
314 checkModel(STORM_TEST_RESOURCES_DIR
"/imdp/tiny-bounded.drn",
"Pmax=? [ F[4,4] \"target\"];Pmin=? [ F[4,4] \"target\"]", 0.1952, 0.324, 0.324, 0.1952,
316 checkModel(STORM_TEST_RESOURCES_DIR
"/imdp/tiny-bounded.drn",
"Pmax=? [ F[4,5] \"target\"];Pmin=? [ F[4,5] \"target\"]", 0.3236, 0.50292, 0.50292, 0.3236,
318 checkModel(STORM_TEST_RESOURCES_DIR
"/imdp/tiny-bounded.drn",
"Pmax=? [ F[4,6] \"target\"];Pmin=? [ F[4,6] \"target\"]", 0.37928, 0.57888, 0.57888, 0.37928,
320 checkModel(STORM_TEST_RESOURCES_DIR
"/imdp/tiny-bounded.drn",
"Pmax=? [ F[2,2] \"target\"];Pmin=? [ F[2,2] \"target\"]", 0.32, 0.45, 0.45, 0.32,
true);
321 checkModel(STORM_TEST_RESOURCES_DIR
"/imdp/tiny-bounded.drn",
"Pmax=? [ F<=2 \"target\"];Pmin=? [ F<=2 \"target\"]", 0.32, 0.45, 0.45, 0.32,
true);
324TEST(RobustMDPModelCheckingTest, Tiny04maxmin) {
325 checkModel(STORM_TEST_RESOURCES_DIR
"/imdp/tiny-04.drn",
"Pmax=? [ F \"target\"];Pmin=? [ F \"target\"]", 1, 1, 0.42857, 0.42,
false);
328TEST(RobustMDPModelCheckingTest, Tiny05maxmin) {
329 checkModel(STORM_TEST_RESOURCES_DIR
"/imdp/tiny-05.drn",
"Pmax=? [ F \"target\"];Pmin=? [ F \"target\"]", 0.3, 0.4, 0.4, 0.3,
false);
332TEST(RobustMDPModelCheckingTest, Tiny04MinRewards) {
336 checkModel(STORM_TEST_RESOURCES_DIR
"/imdp/tiny-04.drn",
"Rmin=? [ F \"target\" ];Rmin=? [ F \"target\" ]", 7, 7, 7, 7,
false);
339TEST(RobustMDPModelCheckingTest, RewardsTargetTransitionInterval) {
343 checkModel(STORM_TEST_RESOURCES_DIR
"/imdp/tiny-09.drn",
"Rmax=? [ F \"target\" ];Rmin=? [ F \"target\" ]", 1.25, 2, 2, 1.25,
false);
346TEST(RobustMDPModelCheckingTest, RewardsTargetStateBeforeMaybeStates) {
349 checkModel(STORM_TEST_RESOURCES_DIR
"/imdp/tiny-11.drn",
"Rmax=? [ F \"target\" ];Rmin=? [ F \"target\" ]", 1.25, 2, 2, 1.25,
false);
352TEST(RobustMDPModelCheckingTest, ReachabilityTimes) {
355 checkModel(STORM_TEST_RESOURCES_DIR
"/imdp/tiny-10.drn",
"Tmax=? [ F \"target\" ];Tmin=? [ F \"target\" ]", 1.5, 2, 1.5, 1.25,
false);
358TEST(RobustMDPModelCheckingTest, ReachabilityTimesSingleAction) {
359 checkModel(STORM_TEST_RESOURCES_DIR
"/imdp/tiny-09.drn",
"Tmax=? [ F \"target\" ];Tmin=? [ F \"target\" ]", 1.25, 2, 2, 1.25,
false);
360 checkModel(STORM_TEST_RESOURCES_DIR
"/imdp/tiny-11.drn",
"Tmax=? [ F \"target\" ];Tmin=? [ F \"target\" ]", 1.25, 2, 2, 1.25,
false);
363TEST(RobustMDPModelCheckingTest, GraphPreservationRequired) {
365 std::shared_ptr<storm::models::sparse::Model<storm::Interval>> modelPtr =
368 EXPECT_FALSE(mdp->getTransitionMatrix().isProbabilisticGraphPreserving());
372 for (std::string
const formulaString : {
"Pmax=? [ F \"target\" ]",
"Rmin=? [ F \"target\" ]",
"Tmin=? [ F \"target\" ]"}) {
373 std::vector<std::shared_ptr<storm::logic::Formula const>> formulas =
376 task.setUncertaintyResolutionMode(storm::UncertaintyResolutionMode::Cooperative);
381TEST(RobustMDPModelCheckingTest, GraphPreservationAfterTightening) {
383 std::shared_ptr<storm::models::sparse::Model<storm::Interval>> modelPtr =
385 EXPECT_FALSE(modelPtr->getTransitionMatrix().hasOnlyPositiveEntries());
386 EXPECT_TRUE(modelPtr->getTransitionMatrix().isProbabilisticGraphPreserving());
387 checkModel(STORM_TEST_RESOURCES_DIR
"/imdp/tiny-13.drn",
"Tmax=? [ F \"target\" ];Tmin=? [ F \"target\" ]", 2, 2, 2, 2,
false);
390TEST(RobustMDPModelCheckingTest, MinRewardsUniqueSolution) {
394 checkModel(STORM_TEST_RESOURCES_DIR
"/imdp/tiny-08.drn",
"Rmin=? [ F \"target\" ];Rmin=? [ F \"target\" ]", 4, 3.25, 4, 3.25,
false);
397TEST(RobustMDPModelCheckingTest, MinRewardsNonUniqueSolution) {
400 expectThrow(STORM_TEST_RESOURCES_DIR
"/imdp/tiny-07.drn",
"Rmin=? [ F \"target\" ]");
403TEST(RobustMDPModelCheckingTest, CumulativeRewards) {
405 checkModel(STORM_TEST_RESOURCES_DIR
"/imdp/tiny-06.drn",
"Rmax=? [ C<=0 ];Rmin=? [ C<=0 ]", 0, 0, 0, 0,
false);
406 checkModel(STORM_TEST_RESOURCES_DIR
"/imdp/tiny-06.drn",
"Rmax=? [ C<=1 ];Rmin=? [ C<=1 ]", 7, 7, 1, 1,
false);
407 checkModel(STORM_TEST_RESOURCES_DIR
"/imdp/tiny-06.drn",
"Rmax=? [ C<=2 ];Rmin=? [ C<=2 ]", 9, 9.5, 9, 7.5,
false);
408 checkModel(STORM_TEST_RESOURCES_DIR
"/imdp/tiny-06.drn",
"Rmax=? [ C<=3 ];Rmin=? [ C<=3 ]", 11, 11.5, 11, 9.5,
false);
411TEST(RobustMDPModelCheckingTest, CumulativeRewardsNoUncertaintyResolutionMode) {
412 std::shared_ptr<storm::models::sparse::Model<storm::Interval>> modelPtr =
414 std::vector<std::shared_ptr<storm::logic::Formula const>> formulas =
424TEST(RobustMDPModelCheckingTest, CrowdsQuotientIMDP) {
426 checkModel(STORM_TEST_RESOURCES_DIR
"/imdp/crowds-quotient-3-5.drn",
"Pmax=? [ F \"observe0Greater1\"]; Pmin=? [ F \"observe0Greater1\"]", 0.1383409,
427 0.1383409, 0.1383409, 0.1383409,
false);
432TEST(RobustRationalMDPModelCheckingTest, CumulativeRewards) {
433 checkModelRational(STORM_TEST_RESOURCES_DIR
"/imdp/tiny-06.drn",
"Rmax=? [ C<=2 ];Rmin=? [ C<=2 ]", storm::RationalNumber(9), storm::RationalNumber(
"19/2"),
434 storm::RationalNumber(9), storm::RationalNumber(
"15/2"),
false);
435 checkModelRational(STORM_TEST_RESOURCES_DIR
"/imdp/tiny-06.drn",
"Rmax=? [ C<=3 ];Rmin=? [ C<=3 ]", storm::RationalNumber(11),
436 storm::RationalNumber(
"23/2"), storm::RationalNumber(11), storm::RationalNumber(
"19/2"),
false);
439TEST(RobustRationalMDPModelCheckingTest, Tiny01maxmin) {
440 checkModelRational(STORM_TEST_RESOURCES_DIR
"/imdp/tiny-01.drn",
"Pmax=? [ F \"target\"];Pmin=? [ F \"target\"]", storm::RationalNumber(
"2/5"),
441 storm::RationalNumber(
"1/2"), storm::RationalNumber(
"1/2"), storm::RationalNumber(
"2/5"),
false);
444TEST(RobustRationalMDPModelCheckingTest, Tiny03maxmin) {
445 checkModelRational(STORM_TEST_RESOURCES_DIR
"/imdp/tiny-03.drn",
"Pmax=? [ F \"target\"];Pmin=? [ F \"target\"]", storm::RationalNumber(
"2/5"),
446 storm::RationalNumber(
"3/5"), storm::RationalNumber(
"1/2"), storm::RationalNumber(
"3/10"),
true);
449TEST(RobustRationalMDPModelCheckingTest, BoundedTiny03maxmin) {
450 checkModelRational(STORM_TEST_RESOURCES_DIR
"/imdp/tiny-03.drn",
"Pmax=? [ F<=1 \"target\"];Pmin=? [ F<=1 \"target\"]", storm::RationalNumber(
"2/5"),
451 storm::RationalNumber(
"3/5"), storm::RationalNumber(
"1/2"), storm::RationalNumber(
"3/10"),
true);
452 checkModelRational(STORM_TEST_RESOURCES_DIR
"/imdp/tiny-03.drn",
"Pmax=? [ F[1,1] \"target\"];Pmin=? [ F[1,1] \"target\"]", storm::RationalNumber(
"2/5"),
453 storm::RationalNumber(
"3/5"), storm::RationalNumber(
"1/2"), storm::RationalNumber(
"3/10"),
true);
456TEST(RobustRationalMDPModelCheckingTest, BoundedMaxmin) {
457 checkModelRational(STORM_TEST_RESOURCES_DIR
"/imdp/tiny-bounded.drn",
"Pmax=? [ F<=4 \"target\"];Pmin=? [ F<=4 \"target\"]",
458 storm::RationalNumber(
"408/625"), storm::RationalNumber(
"81/100"), storm::RationalNumber(
"81/100"), storm::RationalNumber(
"408/625"),
460 checkModelRational(STORM_TEST_RESOURCES_DIR
"/imdp/tiny-bounded.drn",
"Pmax=? [ F[0,4] \"target\"];Pmin=? [ F[0,4] \"target\"]",
461 storm::RationalNumber(
"408/625"), storm::RationalNumber(
"81/100"), storm::RationalNumber(
"81/100"), storm::RationalNumber(
"408/625"),
463 checkModelRational(STORM_TEST_RESOURCES_DIR
"/imdp/tiny-bounded.drn",
"Pmax=? [ F[4,4] \"target\"];Pmin=? [ F[4,4] \"target\"]",
464 storm::RationalNumber(
"122/625"), storm::RationalNumber(
"81/250"), storm::RationalNumber(
"81/250"), storm::RationalNumber(
"122/625"),
466 checkModelRational(STORM_TEST_RESOURCES_DIR
"/imdp/tiny-bounded.drn",
"Pmax=? [ F[4,5] \"target\"];Pmin=? [ F[4,5] \"target\"]",
467 storm::RationalNumber(
"809/2500"), storm::RationalNumber(
"12573/25000"), storm::RationalNumber(
"12573/25000"),
468 storm::RationalNumber(
"809/2500"),
true);
469 checkModelRational(STORM_TEST_RESOURCES_DIR
"/imdp/tiny-bounded.drn",
"Pmax=? [ F[4,6] \"target\"];Pmin=? [ F[4,6] \"target\"]",
470 storm::RationalNumber(
"4741/12500"), storm::RationalNumber(
"1809/3125"), storm::RationalNumber(
"1809/3125"),
471 storm::RationalNumber(
"4741/12500"),
true);
472 checkModelRational(STORM_TEST_RESOURCES_DIR
"/imdp/tiny-bounded.drn",
"Pmax=? [ F[2,2] \"target\"];Pmin=? [ F[2,2] \"target\"]",
473 storm::RationalNumber(
"8/25"), storm::RationalNumber(
"9/20"), storm::RationalNumber(
"9/20"), storm::RationalNumber(
"8/25"),
true);
474 checkModelRational(STORM_TEST_RESOURCES_DIR
"/imdp/tiny-bounded.drn",
"Pmax=? [ F<=2 \"target\"];Pmin=? [ F<=2 \"target\"]", storm::RationalNumber(
"8/25"),
475 storm::RationalNumber(
"9/20"), storm::RationalNumber(
"9/20"), storm::RationalNumber(
"8/25"),
true);
478TEST(RobustRationalMDPModelCheckingTest, Tiny04maxmin) {
480 checkModelRational(STORM_TEST_RESOURCES_DIR
"/imdp/tiny-04.drn",
"Pmax=? [ F \"target\"];Pmin=? [ F \"target\"]", storm::RationalNumber(1),
481 storm::RationalNumber(1), storm::RationalNumber(
"42857140807299/100000000000000"), storm::RationalNumber(
"21/50"),
false);
484TEST(RobustRationalMDPModelCheckingTest, Tiny05maxmin) {
485 checkModelRational(STORM_TEST_RESOURCES_DIR
"/imdp/tiny-05.drn",
"Pmax=? [ F \"target\"];Pmin=? [ F \"target\"]", storm::RationalNumber(
"3/10"),
486 storm::RationalNumber(
"2/5"), storm::RationalNumber(
"2/5"), storm::RationalNumber(
"3/10"),
false);
489TEST(RobustMDPModelCheckingTest, AddUncertaintyCoin22max) {
491 GTEST_SKIP() <<
"Z3 not available.";
493 makeUncertainAndCheck(STORM_TEST_RESOURCES_DIR
"/mdp/coin2-2.nm",
"Pmax=? [F \"all_coins_equal_1\"]", 0.1);
494 makeUncertainAndCheck(STORM_TEST_RESOURCES_DIR
"/mdp/coin2-2.nm",
"Pmax=? [F \"all_coins_equal_1\"]", 0.2);
497TEST(RobustRationalMDPModelCheckingTest, AddUncertaintyCoin22max) {
499 GTEST_SKIP() <<
"Z3 not available.";
501 makeUncertainAndCheckRational(STORM_TEST_RESOURCES_DIR
"/mdp/coin2-2.nm",
"Pmax=? [F \"all_coins_equal_1\"]", storm::RationalNumber(
"1/10"));
void expectSolutionBoundsSound(std::unique_ptr< storm::modelchecker::CheckResult > const &result, double expected)
TEST(RobustMdpModelCheckerTest, RobotMinMaxTest)
std::unique_ptr< storm::modelchecker::QualitativeCheckResult > getInitialStateFilter(std::shared_ptr< storm::models::sparse::Model< storm::Interval > > const &model)
storm::ExtendedRationalNumber getQuantitativeResultAtInitialState(std::shared_ptr< storm::models::sparse::Model< storm::RationalNumber > > const &model, std::unique_ptr< storm::modelchecker::CheckResult > &result)
void checkPrismModelForQuantitativeResult(std::string const &path, std::string const &formulaString, double minmin, double minmax, double maxmin, double maxmax, std::string constantsString)
void expectThrow(std::string const &path, std::string const &formulaString)
void checkModel(std::string const &path, std::string const &formulaString, double maxmin, double maxmax, double minmax, double minmin, bool produceScheduler)
void checkModelRational(std::string const &path, std::string const &formulaString, storm::RationalNumber maxmin, storm::RationalNumber maxmax, storm::RationalNumber minmax, storm::RationalNumber minmin, bool produceScheduler)
void makeUncertainAndCheckRational(std::string const &path, std::string const &formulaString, storm::RationalNumber amountOfUncertainty)
void makeUncertainAndCheck(std::string const &path, std::string const &formulaString, double amountOfUncertainty)
SolverEnvironment & solver()
void setMethod(storm::solver::MinMaxMethod value, bool isSetFromDefault=false)
MinMaxSolverEnvironment & minMax()
void setForceSoundness(bool value)
This class represents the base class of all exception classes.
virtual std::unique_ptr< CheckResult > check(Environment const &env, CheckTask< storm::logic::Formula, SolutionType > const &checkTask)
Checks the provided formula.
This class represents a (discrete-time) Markov decision process.
Base class for all sparse models.
Program preprocess(std::map< storm::expressions::Variable, storm::expressions::Expression > const &constantDefinitions) const
Preprocesses the program by defining the given constant definitions, substituting constants and formu...
std::vector< storm::jani::Property > parsePropertiesForPrismProgram(std::string const &inputString, storm::prism::Program const &program, boost::optional< std::set< std::string > > const &propertyFilter)
storm::prism::Program parseProgram(std::string const &filename, bool prismCompatibility, bool simplify)
std::shared_ptr< storm::models::sparse::Model< ValueType > > buildSparseModel(storm::storage::SymbolicModelDescription const &model, storm::builder::BuilderOptions const &options, typename storm::builder::ExplicitModelBuilder< ValueType >::Options const &explorationOptions=typename storm::builder::ExplicitModelBuilder< ValueType >::Options())
std::vector< std::shared_ptr< storm::logic::Formula const > > extractFormulasFromProperties(std::vector< storm::jani::Property > const &properties)
std::vector< storm::jani::Property > parseProperties(storm::parser::FormulaParser &formulaParser, std::string const &inputString, boost::optional< std::set< std::string > > const &propertyFilter)
template STORM_PARSERS_API std::shared_ptr< storm::models::sparse::Model< storm::RationalInterval > > parseDirectEncodingModel< storm::RationalInterval >(std::filesystem::path const &file, DirectEncodingParserOptions const &options)
template STORM_PARSERS_API std::shared_ptr< storm::models::sparse::Model< storm::Interval > > parseDirectEncodingModel< storm::Interval >(std::filesystem::path const &file, DirectEncodingParserOptions const &options)
storm::utility::ExtendedValueType< RationalNumber > ExtendedRationalNumber
The rational number type extended with the two infinities.
#define STORM_SILENT_EXPECT_THROW(statement, expected_exception)