Storm 1.13.0.1
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
RobustDtmcPrctlModelCheckerTest.cpp
Go to the documentation of this file.
1#include "storm-config.h"
4#include "test/storm_gtest.h"
5
10#include "storm/api/builder.h"
19
20std::unique_ptr<storm::modelchecker::QualitativeCheckResult> getInitialStateFilter(
21 std::shared_ptr<storm::models::sparse::Model<storm::Interval>> const& model) {
22 return std::make_unique<storm::modelchecker::ExplicitQualitativeCheckResult<double>>(model->getInitialStates());
23}
24
25std::unique_ptr<storm::modelchecker::QualitativeCheckResult> getInitialStateFilter(std::shared_ptr<storm::models::sparse::Model<double>> const& model) {
26 return std::make_unique<storm::modelchecker::ExplicitQualitativeCheckResult<double>>(model->getInitialStates());
27}
28
30 std::unique_ptr<storm::modelchecker::CheckResult>& result) {
31 auto filter = getInitialStateFilter(model);
32 result->filter(*filter);
33 return result->asQuantitativeCheckResult<double>().getMin();
34}
35
37 std::unique_ptr<storm::modelchecker::CheckResult>& result) {
38 auto filter = getInitialStateFilter(model);
39 result->filter(*filter);
40 return result->asQuantitativeCheckResult<double>().getMin();
41}
42
43void expectThrow(std::string const& path, std::string const& formulaString,
44 std::optional<storm::UncertaintyResolutionMode> uncertaintyResolutionMode = std::nullopt) {
45 std::shared_ptr<storm::models::sparse::Model<storm::Interval>> modelPtr = storm::parser::parseDirectEncodingModel<storm::Interval>(path);
46 std::vector<std::shared_ptr<storm::logic::Formula const>> formulas = storm::api::extractFormulasFromProperties(storm::api::parseProperties(formulaString));
47
49 env.solver().minMax().setMethod(storm::solver::MinMaxMethod::ValueIteration);
50
51 std::shared_ptr<storm::models::sparse::Dtmc<storm::Interval>> dtmc = modelPtr->as<storm::models::sparse::Dtmc<storm::Interval>>();
52 ASSERT_EQ(storm::models::ModelType::Dtmc, modelPtr->getType());
54 if (uncertaintyResolutionMode.has_value()) {
55 task.setUncertaintyResolutionMode(uncertaintyResolutionMode.value());
56 }
57
60}
61
62void expectThrowPrism(std::string const& path, std::string const& formulaString) {
64 program = storm::utility::prism::preprocess(program, "");
65
66 std::vector<std::shared_ptr<storm::logic::Formula const>> formulas = storm::api::extractFormulasFromProperties(storm::api::parseProperties(formulaString));
67 std::shared_ptr<storm::models::sparse::Model<storm::Interval>> modelPtr = storm::api::buildSparseModel<storm::Interval>(program, formulas);
68
70 env.solver().minMax().setMethod(storm::solver::MinMaxMethod::ValueIteration);
71
72 std::shared_ptr<storm::models::sparse::Dtmc<storm::Interval>> dtmc = modelPtr->as<storm::models::sparse::Dtmc<storm::Interval>>();
73 ASSERT_EQ(storm::models::ModelType::Dtmc, modelPtr->getType());
75
77 STORM_SILENT_EXPECT_THROW(checker.check(env, task), storm::exceptions::InvalidArgumentException);
78}
79
80void checkExplicitModelForQuantitativeResult(std::string const& path, std::string const& formulaString, double min, double max) {
81 std::shared_ptr<storm::models::sparse::Model<storm::Interval>> modelPtr = storm::parser::parseDirectEncodingModel<storm::Interval>(path);
82 std::vector<std::shared_ptr<storm::logic::Formula const>> formulas = storm::api::extractFormulasFromProperties(storm::api::parseProperties(formulaString));
84 env.solver().minMax().setMethod(storm::solver::MinMaxMethod::ValueIteration);
85
86 std::shared_ptr<storm::models::sparse::Dtmc<storm::Interval>> dtmc = modelPtr->as<storm::models::sparse::Dtmc<storm::Interval>>();
87 ASSERT_EQ(storm::models::ModelType::Dtmc, modelPtr->getType());
89 taskMax.setUncertaintyResolutionMode(storm::UncertaintyResolutionMode::Maximize);
90
92 auto resultMax = checker.check(env, taskMax);
93 EXPECT_NEAR(max, getQuantitativeResultAtInitialState(dtmc, resultMax), 0.0001);
94
96 taskMin.setUncertaintyResolutionMode(storm::UncertaintyResolutionMode::Minimize);
97
98 auto resultMin = checker.check(env, taskMin);
99 EXPECT_NEAR(min, getQuantitativeResultAtInitialState(dtmc, resultMin), 0.0001);
100}
101
102void checkPrismModelForQuantitativeResult(std::string const& path, std::string const& formulaString, double min, double max) {
104 program = storm::utility::prism::preprocess(program, "");
105
106 std::vector<std::shared_ptr<storm::logic::Formula const>> formulas = storm::api::extractFormulasFromProperties(storm::api::parseProperties(formulaString));
107 std::shared_ptr<storm::models::sparse::Model<storm::Interval>> modelPtr = storm::api::buildSparseModel<storm::Interval>(program, formulas);
108
110 env.solver().minMax().setMethod(storm::solver::MinMaxMethod::ValueIteration);
111
112 std::shared_ptr<storm::models::sparse::Dtmc<storm::Interval>> dtmc = modelPtr->as<storm::models::sparse::Dtmc<storm::Interval>>();
113 ASSERT_EQ(storm::models::ModelType::Dtmc, modelPtr->getType());
115 taskMax.setUncertaintyResolutionMode(storm::UncertaintyResolutionMode::Maximize);
116
118 auto resultMax = checker.check(env, taskMax);
119 EXPECT_NEAR(max, getQuantitativeResultAtInitialState(dtmc, resultMax), 0.0001);
120
122 taskMin.setUncertaintyResolutionMode(storm::UncertaintyResolutionMode::Minimize);
123
124 auto resultMin = checker.check(env, taskMin);
125 EXPECT_NEAR(min, getQuantitativeResultAtInitialState(dtmc, resultMin), 0.0001);
126}
127
128void checkModelForQualitativeResult(std::string const& path, std::string const& formulaString, std::vector<storm::storage::BitVector> expectedResultVector) {
129 std::shared_ptr<storm::models::sparse::Model<storm::Interval>> modelPtr = storm::parser::parseDirectEncodingModel<storm::Interval>(path);
130 std::vector<std::shared_ptr<storm::logic::Formula const>> formulas = storm::api::extractFormulasFromProperties(storm::api::parseProperties(formulaString));
132 env.solver().minMax().setMethod(storm::solver::MinMaxMethod::ValueIteration);
133
134 std::shared_ptr<storm::models::sparse::Dtmc<storm::Interval>> dtmc = modelPtr->as<storm::models::sparse::Dtmc<storm::Interval>>();
135 ASSERT_EQ(storm::models::ModelType::Dtmc, modelPtr->getType());
137
139 auto result = checker.check(env, task1);
140
141 ASSERT_TRUE(result->isExplicitQualitativeCheckResult());
142
143 for (size_t i = 0; i < expectedResultVector[0].size(); i++) {
144 EXPECT_EQ(expectedResultVector[0].get(i), result->template asExplicitQualitativeCheckResult<double>()[i]);
145 }
146
148
149 result = checker.check(env, task2);
150
151 ASSERT_TRUE(result->isExplicitQualitativeCheckResult());
152
153 for (size_t i = 0; i < expectedResultVector[1].size(); i++) {
154 EXPECT_EQ(expectedResultVector[1].get(i), result->template asExplicitQualitativeCheckResult<double>()[i]);
155 }
156}
157
158std::unique_ptr<storm::modelchecker::QualitativeCheckResult> getInitialStateFilter(
159 std::shared_ptr<storm::models::sparse::Model<storm::RationalNumber>> const& model) {
160 return std::make_unique<storm::modelchecker::ExplicitQualitativeCheckResult<storm::RationalNumber>>(model->getInitialStates());
161}
162
164 std::unique_ptr<storm::modelchecker::CheckResult>& result) {
165 auto filter = getInitialStateFilter(model);
166 result->filter(*filter);
167 return result->asQuantitativeCheckResult<storm::RationalNumber>().getMin();
168}
169
170std::unique_ptr<storm::modelchecker::QualitativeCheckResult> getInitialStateFilter(
171 std::shared_ptr<storm::models::sparse::Model<storm::RationalInterval>> const& model) {
172 return std::make_unique<storm::modelchecker::ExplicitQualitativeCheckResult<storm::RationalNumber>>(model->getInitialStates());
173}
174
176 std::unique_ptr<storm::modelchecker::CheckResult>& result) {
177 auto filter = getInitialStateFilter(model);
178 result->filter(*filter);
179 return result->asQuantitativeCheckResult<storm::RationalNumber>().getMin();
180}
181
182void expectThrowRational(std::string const& path, std::string const& formulaString,
183 std::optional<storm::UncertaintyResolutionMode> uncertaintyResolutionMode = std::nullopt) {
184 std::shared_ptr<storm::models::sparse::Model<storm::RationalInterval>> modelPtr = storm::parser::parseDirectEncodingModel<storm::RationalInterval>(path);
185
186 std::vector<std::shared_ptr<storm::logic::Formula const>> formulas = storm::api::extractFormulasFromProperties(storm::api::parseProperties(formulaString));
187
189 env.solver().minMax().setMethod(storm::solver::MinMaxMethod::ValueIteration);
190
191 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalInterval>> dtmc = modelPtr->as<storm::models::sparse::Dtmc<storm::RationalInterval>>();
192 ASSERT_EQ(storm::models::ModelType::Dtmc, modelPtr->getType());
194 if (uncertaintyResolutionMode.has_value()) {
195 task.setUncertaintyResolutionMode(uncertaintyResolutionMode.value());
196 }
197
200}
201
202void checkExplicitModelForQuantitativeResultRational(std::string const& path, std::string const& formulaString, storm::RationalNumber min,
203 storm::RationalNumber max) {
204 std::shared_ptr<storm::models::sparse::Model<storm::RationalInterval>> modelPtr = storm::parser::parseDirectEncodingModel<storm::RationalInterval>(path);
205 std::vector<std::shared_ptr<storm::logic::Formula const>> formulas = storm::api::extractFormulasFromProperties(storm::api::parseProperties(formulaString));
207 env.solver().minMax().setMethod(storm::solver::MinMaxMethod::ValueIteration);
208
209 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalInterval>> dtmc = modelPtr->as<storm::models::sparse::Dtmc<storm::RationalInterval>>();
210 ASSERT_EQ(storm::models::ModelType::Dtmc, modelPtr->getType());
212 taskMax.setUncertaintyResolutionMode(storm::UncertaintyResolutionMode::Maximize);
213
215 auto resultMax = checker.check(env, taskMax);
216 EXPECT_EQ(max, getQuantitativeResultAtInitialState(dtmc, resultMax));
217
219 taskMin.setUncertaintyResolutionMode(storm::UncertaintyResolutionMode::Minimize);
220
221 auto resultMin = checker.check(env, taskMin);
222 EXPECT_EQ(min, getQuantitativeResultAtInitialState(dtmc, resultMin));
223}
224
225void checkPrismModelForQuantitativeResultRational(std::string const& path, std::string const& formulaString, storm::RationalNumber min,
226 storm::RationalNumber max) {
228 program = storm::utility::prism::preprocess(program, "");
229
230 std::vector<std::shared_ptr<storm::logic::Formula const>> formulas = storm::api::extractFormulasFromProperties(storm::api::parseProperties(formulaString));
231 std::shared_ptr<storm::models::sparse::Model<storm::RationalInterval>> modelPtr = storm::api::buildSparseModel<storm::RationalInterval>(program, formulas);
232
234 env.solver().minMax().setMethod(storm::solver::MinMaxMethod::ValueIteration);
235
236 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalInterval>> dtmc = modelPtr->as<storm::models::sparse::Dtmc<storm::RationalInterval>>();
237 ASSERT_EQ(storm::models::ModelType::Dtmc, modelPtr->getType());
239 taskMax.setUncertaintyResolutionMode(storm::UncertaintyResolutionMode::Maximize);
240
242 auto resultMax = checker.check(env, taskMax);
243 EXPECT_EQ(max, getQuantitativeResultAtInitialState(dtmc, resultMax));
244
246 taskMin.setUncertaintyResolutionMode(storm::UncertaintyResolutionMode::Minimize);
247
248 auto resultMin = checker.check(env, taskMin);
249 EXPECT_EQ(min, getQuantitativeResultAtInitialState(dtmc, resultMin));
250}
251
252void makeUncertainAndCheckRational(std::string const& path, std::string const& formulaString, storm::RationalNumber amountOfUncertainty) {
254 program = storm::utility::prism::preprocess(program, "");
255 std::vector<std::shared_ptr<storm::logic::Formula const>> formulas =
257 std::shared_ptr<storm::models::sparse::Model<storm::RationalNumber>> modelPtr = storm::api::buildSparseModel<storm::RationalNumber>(program, formulas);
258 auto dtmc = modelPtr->as<storm::models::sparse::Dtmc<storm::RationalNumber>>();
259
263 auto exresult = checker.check(env, taskCertain);
264 storm::RationalNumber certainValue = getQuantitativeResultAtInitialState(modelPtr, exresult);
265
266 storm::Environment envIntervals;
267 envIntervals.solver().minMax().setMethod(storm::solver::MinMaxMethod::ValueIteration);
269 auto idtmc = transformer.transform(amountOfUncertainty)->as<storm::models::sparse::Dtmc<storm::RationalInterval>>();
271
273 taskMin.setUncertaintyResolutionMode(storm::UncertaintyResolutionMode::Minimize);
274 auto iresultMin = ichecker.check(envIntervals, taskMin);
275 storm::RationalNumber minValue = getQuantitativeResultAtInitialState(idtmc, iresultMin);
276 EXPECT_LE(minValue, certainValue);
277
279 taskMax.setUncertaintyResolutionMode(storm::UncertaintyResolutionMode::Maximize);
280 auto iresultMax = ichecker.check(envIntervals, taskMax);
281 storm::RationalNumber maxValue = getQuantitativeResultAtInitialState(idtmc, iresultMax);
282 EXPECT_LE(certainValue, maxValue);
283}
284
285TEST(RobustDtmcModelCheckerTest, Tiny01ReachMaxMinProbs) {
286 // Maximal Reachability probabilities using explicit format.
287 checkExplicitModelForQuantitativeResult(STORM_TEST_RESOURCES_DIR "/idtmc/tiny-01.drn", "P=? [ F \"target\"];P=? [ F \"target\"]", 0.3, 0.5);
288}
289
290TEST(RobustDtmcModelCheckerTest, Tiny01MaxReachProbNoUncertaintyResolutionMode) {
291 // Nature requires a resolution mode, expect thrown.
292 expectThrow(STORM_TEST_RESOURCES_DIR "/idtmc/tiny-01.drn", "P=? [ F \"target\"];",
293 std::make_optional<storm::UncertaintyResolutionMode>(storm::UncertaintyResolutionMode::Unset));
294}
295
296TEST(RobustDtmcModelCheckerTest, Tiny01MaxReachProbNoOptimizationDirectionButRobust) {
297 // Nature requires a resolution mode, expect thrown.
298 expectThrow(STORM_TEST_RESOURCES_DIR "/idtmc/tiny-01.drn", "P=? [ F \"target\"];",
299 std::make_optional<storm::UncertaintyResolutionMode>(storm::UncertaintyResolutionMode::Robust));
300}
301
302TEST(RobustDtmcModelCheckerTest, Tiny02GloballyMaxMinProbs) {
303 // Globally not yet supported, expect throw.
304 expectThrow(STORM_TEST_RESOURCES_DIR "/idtmc/tiny-02.drn", "P=? [ G \"target\"];P=? [ G \"target\"]");
305}
306
307TEST(RobustDtmcModelCheckerTest, DieIntervalsMaxMin) {
308#ifndef STORM_HAVE_Z3
309 GTEST_SKIP() << "Z3 not available.";
310#endif
311 // Maxima reachability probabilities using PRISM format.
312 checkPrismModelForQuantitativeResult(STORM_TEST_RESOURCES_DIR "/idtmc/die-intervals.pm", "P=? [ F \"one\"];P=? [ F \"one\"]", 9.0 / 189.0, 72.0 / 189.0);
313}
314
315TEST(RobustDtmcModelCheckerTest, BrpIntervalsMaxMin) {
316#ifndef STORM_HAVE_Z3
317 GTEST_SKIP() << "Z3 not available.";
318#endif
319 // Maxima reachability probabilities using PRISM format.
320 checkPrismModelForQuantitativeResult(STORM_TEST_RESOURCES_DIR "/idtmc/brp-32-2-intervals.pm", "P=? [ F \"error\" ];P=? [ F \"error\" ]",
321 2.559615918664207e-10, 0.0008464876763422187);
322}
323
324TEST(RobustDtmcModelCheckerTest, DieIntervalsMaxMinRewards) {
325#ifndef STORM_HAVE_Z3
326 GTEST_SKIP() << "Z3 not available.";
327#endif
328 // Maxima reachability rewards using PRISM format.
329 checkPrismModelForQuantitativeResult(STORM_TEST_RESOURCES_DIR "/idtmc/die-intervals.pm", "R=? [ F \"done\"];R=? [ F \"done\"]", 3.25, 4.6);
330}
331
332TEST(RobustDtmcModelCheckerTest, Tiny03MaxMinRewards) {
333 // Maxima reachability rewards using explicit format.
334 checkExplicitModelForQuantitativeResult(STORM_TEST_RESOURCES_DIR "/idtmc/tiny-03.drn", "R=? [ F \"target\"];R=? [ F \"target\"]", 6.5, 8.5);
335}
336
337TEST(RobustDtmcModelCheckerTest, Tiny03RewardsNoUncertaintyResolutionMode) {
338 // Nature requires a resolution mode, expect thrown.
339 expectThrow(STORM_TEST_RESOURCES_DIR "/idtmc/tiny-03.drn", "R=? [ F \"target\"]", storm::UncertaintyResolutionMode::Unset);
340}
341
342TEST(RobustDtmcModelCheckerTest, Tiny04MaxMinRewards) {
343 // Maxima reachability rewards using explicit format - infinite reward case.
344 checkExplicitModelForQuantitativeResult(STORM_TEST_RESOURCES_DIR "/idtmc/tiny-04.drn", "R=? [ F \"target\"];R=? [ F \"target\"]",
345 std::numeric_limits<double>::infinity(), std::numeric_limits<double>::infinity());
346}
347
348TEST(RobustDtmcModelCheckerTest, CrowdsQuotientIDTMC) {
349 // Ensuring equivalent behavior when checking identical model as IDTMC and IMDP (cf. CrowdsQuotientIMDP)
350 checkExplicitModelForQuantitativeResult(STORM_TEST_RESOURCES_DIR "/idtmc/crowds-quotient-3-5.drn",
351 "P=? [ F \"observe0Greater1\"];P=? [ F \"observe0Greater1\"]", 0.1383409, 0.1383409);
352}
353
354TEST(RobustDtmcModelCheckerTest, TinyO2Propositional) {
355 // Propositional formula using explicit format.
356 std::vector<storm::storage::BitVector> expectedResults;
357 auto result1 = storm::storage::BitVector(3);
358 result1.set(0);
359 result1.set(2);
360 expectedResults.push_back(result1);
361 result1.complement();
362 expectedResults.push_back(result1);
363
364 checkModelForQualitativeResult(STORM_TEST_RESOURCES_DIR "/idtmc/tiny-02.drn", "\"target\";!\"target\"", expectedResults);
365}
366
367TEST(RobustDtmcModelCheckerTest, Tiny05StepBounded) {
368 // Maxima bounded reachability probabilities using explicit format.
369 checkExplicitModelForQuantitativeResult(STORM_TEST_RESOURCES_DIR "/idtmc/tiny-05.drn", "P=? [ F<=0 \"a\"];P=? [ F<=0 \"a\"]", 0, 0);
370 checkExplicitModelForQuantitativeResult(STORM_TEST_RESOURCES_DIR "/idtmc/tiny-05.drn", "P=? [ F<=1 \"a\"];P=? [ F<=1 \"a\"]", 0.2, 0.2);
371 checkExplicitModelForQuantitativeResult(STORM_TEST_RESOURCES_DIR "/idtmc/tiny-05.drn", "P=? [ F<=2 \"a\"];P=? [ F<=2 \"a\"]", 0.36, 0.366);
372}
373
374TEST(RobustDtmcModelCheckerTest, BoundedMaxmin) {
375 // Maxima bounded reachability probabilities using explicit format.
376 checkExplicitModelForQuantitativeResult(STORM_TEST_RESOURCES_DIR "/idtmc/tiny-bounded.drn", "P=? [ F<=4 \"target\"];P=? [ F<=4 \"target\"]", 0.6528, 0.81);
377 checkExplicitModelForQuantitativeResult(STORM_TEST_RESOURCES_DIR "/idtmc/tiny-bounded.drn", "P=? [ F[0,4] \"target\"];P=? [ F[0,4] \"target\"]", 0.6528,
378 0.81);
379 checkExplicitModelForQuantitativeResult(STORM_TEST_RESOURCES_DIR "/idtmc/tiny-bounded.drn", "P=? [ F[4,4] \"target\"];P=? [ F[4,4] \"target\"]", 0.1952,
380 0.324);
381 checkExplicitModelForQuantitativeResult(STORM_TEST_RESOURCES_DIR "/idtmc/tiny-bounded.drn", "P=? [ F[4,5] \"target\"];P=? [ F[4,5] \"target\"]", 0.3236,
382 0.50292);
383 checkExplicitModelForQuantitativeResult(STORM_TEST_RESOURCES_DIR "/idtmc/tiny-bounded.drn", "P=? [ F[4,6] \"target\"];P=? [ F[4,6] \"target\"]", 0.37928,
384 0.57888);
385 checkExplicitModelForQuantitativeResult(STORM_TEST_RESOURCES_DIR "/idtmc/tiny-bounded.drn", "P=? [ F[2,2] \"target\"];P=? [ F[2,2] \"target\"]", 0.32,
386 0.45);
387 checkExplicitModelForQuantitativeResult(STORM_TEST_RESOURCES_DIR "/idtmc/tiny-bounded.drn", "P=? [ F<=2 \"target\"];P=? [ F<=2 \"target\"]", 0.32, 0.45);
388}
389
390// ---- RationalInterval tests (exact arithmetic) ----
391
392TEST(RobustRationalDtmcModelCheckerTest, Tiny01ReachMaxMinProbs) {
393 checkExplicitModelForQuantitativeResultRational(STORM_TEST_RESOURCES_DIR "/idtmc/tiny-01.drn", "P=? [ F \"target\"];P=? [ F \"target\"]",
394 storm::RationalNumber("3/10"), storm::RationalNumber("1/2"));
395}
396
397TEST(RobustRationalDtmcModelCheckerTest, Tiny01MaxReachProbNoUncertaintyResolutionMode) {
398 expectThrowRational(STORM_TEST_RESOURCES_DIR "/idtmc/tiny-01.drn", "P=? [ F \"target\"];",
399 std::make_optional<storm::UncertaintyResolutionMode>(storm::UncertaintyResolutionMode::Unset));
400}
401
402TEST(RobustRationalDtmcModelCheckerTest, Tiny01MaxReachProbNoOptimizationDirectionButRobust) {
403 expectThrowRational(STORM_TEST_RESOURCES_DIR "/idtmc/tiny-01.drn", "P=? [ F \"target\"];",
404 std::make_optional<storm::UncertaintyResolutionMode>(storm::UncertaintyResolutionMode::Robust));
405}
406
407TEST(RobustRationalDtmcModelCheckerTest, Tiny02GloballyMaxMinProbs) {
408 expectThrowRational(STORM_TEST_RESOURCES_DIR "/idtmc/tiny-02.drn", "P=? [ G \"target\"];P=? [ G \"target\"]");
409}
410
411TEST(RobustRationalDtmcModelCheckerTest, DieIntervalsMaxMin) {
412#ifndef STORM_HAVE_Z3
413 GTEST_SKIP() << "Z3 not available.";
414#endif
415 checkPrismModelForQuantitativeResultRational(STORM_TEST_RESOURCES_DIR "/idtmc/die-intervals.pm", "P=? [ F \"one\"];P=? [ F \"one\"]",
416 storm::RationalNumber("4483008223/94143178827"), storm::RationalNumber("35864065784/94143178827"));
417}
418
419TEST(RobustRationalDtmcModelCheckerTest, BrpIntervalsMaxMin) {
420#ifndef STORM_HAVE_Z3
421 GTEST_SKIP() << "Z3 not available.";
422#endif
424 STORM_TEST_RESOURCES_DIR "/idtmc/brp-32-2-intervals.pm", "P=? [ F \"error\" ];P=? [ F \"error\" ]",
425 // The number is to large to be represented as a literal, so we construct it from strings.
426 storm::RationalNumber("10238464074071514998168131748974289312176706851339248682605279417683104172439385084862067764341447739354976890683145110072150529"
427 "29484271217452553595194641992099205093706027267658909966207049695357884534755950707204946503657943965652247014748702342577938440"
428 "579441829932769922685028147340905022682454110960938051"
429 "/"
430 "40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
431 "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
432 "000000000000000000000000000000000000000000000000000000000000000"),
433 storm::RationalNumber("73421101667166357614487085157865792442422423664718103404519649530149236548299533815461648662459394997073289369183682645650367121"
434 "4626220291672876565353557862092334897"
435 "/"
436 "86736173798840354720596224069595336914062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
437 "0000000000000000000000000000000000000000"));
438}
439
440TEST(RobustRationalDtmcModelCheckerTest, DieIntervalsMaxMinRewards) {
441#ifndef STORM_HAVE_Z3
442 GTEST_SKIP() << "Z3 not available.";
443#endif
444 checkPrismModelForQuantitativeResultRational(STORM_TEST_RESOURCES_DIR "/idtmc/die-intervals.pm", "R=? [ F \"done\"];R=? [ F \"done\"]",
445 storm::RationalNumber("15544649/4782969"), storm::RationalNumber("76715008330675523/16677181699666569"));
446}
447
448TEST(RobustRationalDtmcModelCheckerTest, Tiny03MaxMinRewards) {
449 checkExplicitModelForQuantitativeResultRational(STORM_TEST_RESOURCES_DIR "/idtmc/tiny-03.drn", "R=? [ F \"target\"];R=? [ F \"target\"]",
450 storm::RationalNumber("13/2"), storm::RationalNumber("17/2"));
451}
452
453TEST(RobustRationalDtmcModelCheckerTest, Tiny03RewardsNoUncertaintyResolutionMode) {
454 expectThrowRational(STORM_TEST_RESOURCES_DIR "/idtmc/tiny-03.drn", "R=? [ F \"target\"]", storm::UncertaintyResolutionMode::Unset);
455}
456
457TEST(RobustRationalDtmcModelCheckerTest, Tiny04MaxMinRewards) {
458 checkExplicitModelForQuantitativeResultRational(STORM_TEST_RESOURCES_DIR "/idtmc/tiny-04.drn", "R=? [ F \"target\"];R=? [ F \"target\"]",
460}
461
462TEST(RobustRationalDtmcModelCheckerTest, AddUncertaintyBrpMax) {
463#ifndef STORM_HAVE_Z3
464 GTEST_SKIP() << "Z3 not available.";
465#endif
466 makeUncertainAndCheckRational(STORM_TEST_RESOURCES_DIR "/dtmc/brp-16-2.pm", "P=? [ F \"target\"]", storm::RationalNumber("1/10"));
467 makeUncertainAndCheckRational(STORM_TEST_RESOURCES_DIR "/dtmc/brp-16-2.pm", "P=? [ F \"target\"]", storm::RationalNumber("1/20"));
468}
void checkPrismModelForQuantitativeResult(std::string const &path, std::string const &formulaString, double min, double max)
TEST(RobustDtmcModelCheckerTest, Tiny01ReachMaxMinProbs)
std::unique_ptr< storm::modelchecker::QualitativeCheckResult > getInitialStateFilter(std::shared_ptr< storm::models::sparse::Model< storm::Interval > > const &model)
void checkModelForQualitativeResult(std::string const &path, std::string const &formulaString, std::vector< storm::storage::BitVector > expectedResultVector)
void expectThrow(std::string const &path, std::string const &formulaString, std::optional< storm::UncertaintyResolutionMode > uncertaintyResolutionMode=std::nullopt)
void checkExplicitModelForQuantitativeResult(std::string const &path, std::string const &formulaString, double min, double max)
void checkPrismModelForQuantitativeResultRational(std::string const &path, std::string const &formulaString, storm::RationalNumber min, storm::RationalNumber max)
void expectThrowPrism(std::string const &path, std::string const &formulaString)
double getQuantitativeResultAtInitialState(std::shared_ptr< storm::models::sparse::Model< storm::Interval > > const &model, std::unique_ptr< storm::modelchecker::CheckResult > &result)
void makeUncertainAndCheckRational(std::string const &path, std::string const &formulaString, storm::RationalNumber amountOfUncertainty)
void expectThrowRational(std::string const &path, std::string const &formulaString, std::optional< storm::UncertaintyResolutionMode > uncertaintyResolutionMode=std::nullopt)
void checkExplicitModelForQuantitativeResultRational(std::string const &path, std::string const &formulaString, storm::RationalNumber min, storm::RationalNumber max)
SolverEnvironment & solver()
void setMethod(storm::solver::MinMaxMethod value, bool isSetFromDefault=false)
MinMaxSolverEnvironment & minMax()
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 chain.
Definition Dtmc.h:13
Base class for all sparse models.
Definition Model.h:30
A bit vector that is internally represented as a vector of 64-bit values.
Definition BitVector.h:16
This class is a convenience transformer to add uncertainty.
std::vector< storm::jani::Property > parsePropertiesForPrismProgram(std::string const &inputString, storm::prism::Program const &program, boost::optional< std::set< std::string > > const &propertyFilter)
std::shared_ptr< storm::models::sparse::Model< ValueType > > buildSparseModel(storm::storage::SymbolicModelDescription const &model, storm::builder::BuilderOptions const &options)
Definition builder.h:109
storm::prism::Program parseProgram(std::string const &filename, bool prismCompatibility, bool simplify)
std::vector< storm::jani::Property > parseProperties(storm::parser::FormulaParser &formulaParser, std::string const &inputString, boost::optional< std::set< std::string > > const &propertyFilter)
std::vector< std::shared_ptr< storm::logic::Formula const > > extractFormulasFromProperties(std::vector< storm::jani::Property > const &properties)
template std::shared_ptr< storm::models::sparse::Model< storm::RationalInterval > > parseDirectEncodingModel< storm::RationalInterval >(std::filesystem::path const &file, DirectEncodingParserOptions const &options)
template std::shared_ptr< storm::models::sparse::Model< storm::Interval > > parseDirectEncodingModel< storm::Interval >(std::filesystem::path const &file, DirectEncodingParserOptions const &options)
storm::prism::Program preprocess(storm::prism::Program const &program, std::map< storm::expressions::Variable, storm::expressions::Expression > const &constantDefinitions)
Definition prism.cpp:13
ValueType infinity()
Definition constants.cpp:29
#define STORM_SILENT_EXPECT_THROW(statement, expected_exception)
Definition storm_gtest.h:31