42 EXPECT_TRUE(constFunctionRes.first);
43 EXPECT_TRUE(constFunctionRes.second);
48 EXPECT_TRUE(constFunctionRes.first);
49 EXPECT_FALSE(constFunctionRes.second);
54 EXPECT_FALSE(constFunctionRes.first);
55 EXPECT_TRUE(constFunctionRes.second);
57 std::shared_ptr<storm::RawPolynomialCache> cache = std::make_shared<storm::RawPolynomialCache>();
58 carl::StringParser parser;
59 parser.setVariables({
"p",
"q"});
65 auto varsP = functionP.gatherVariables();
66 auto varsQ = functionQ.gatherVariables();
69 for (
auto var : varsP) {
71 storm::utility::convertNumber<typename storm::storage::ParameterRegion<storm::RationalFunction>::CoefficientType>(0 + 0.000001);
73 storm::utility::convertNumber<typename storm::storage::ParameterRegion<storm::RationalFunction>::CoefficientType>(1 - 0.000001);
74 lowerBoundaries2.emplace(std::make_pair(var, lb));
75 upperBoundaries2.emplace(std::make_pair(var, ub));
77 for (
auto var : varsQ) {
79 storm::utility::convertNumber<typename storm::storage::ParameterRegion<storm::RationalFunction>::CoefficientType>(0 + 0.000001);
81 storm::utility::convertNumber<typename storm::storage::ParameterRegion<storm::RationalFunction>::CoefficientType>(1 - 0.000001);
82 lowerBoundaries2.emplace(std::make_pair(var, lb));
83 upperBoundaries2.emplace(std::make_pair(var, ub));
88 auto function = functionP;
90 EXPECT_TRUE(functionRes.first);
91 EXPECT_FALSE(functionRes.second);
96 EXPECT_TRUE(functionDecrRes.first);
97 EXPECT_FALSE(functionDecrRes.second);
102 EXPECT_FALSE(functionNonMonotonicRes.first);
103 EXPECT_FALSE(functionNonMonotonicRes.second);
108 EXPECT_FALSE(functionDecrRes.first);
109 EXPECT_TRUE(functionDecrRes.second);
112 function = functionP * functionQ;
114 EXPECT_TRUE(functionRes.first);
115 EXPECT_FALSE(functionRes.second);
119 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/brp16_2.pm";
120 std::string formulaAsString =
"P=? [true U s=4 & i=N ]";
121 std::string constantsAsString =
"";
126 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
128 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
131 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
132 model = simplifier.getSimplifiedModel();
136 if (storm::settings::getModule<storm::settings::modules::BisimulationSettings>().isWeakBisimulationSet()) {
140 model = storm::api::performBisimulationMinimization<storm::RationalFunction>(model, formulas, bisimType)
142 ASSERT_EQ(99ul, model->getNumberOfStates());
143 ASSERT_EQ(195ul, model->getNumberOfTransitions());
147 auto region = storm::api::parseRegion<storm::RationalFunction>(
"0.1<=pL<=0.9, 0.1<=pK<=0.9", modelParameters);
148 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
155 EXPECT_EQ(1ul, result.size());
158 auto order = result.begin()->first;
159 auto monotonicityResult = result.begin()->second.first;
160 EXPECT_TRUE(monotonicityResult->isDone());
161 EXPECT_TRUE(monotonicityResult->existsMonotonicity());
162 EXPECT_TRUE(monotonicityResult->isAllMonotonicity());
163 auto assumptions = result.begin()->second.second;
164 EXPECT_EQ(0ul, assumptions.size());
167 auto monRes = monotonicityResult->getMonotonicityResult();
168 for (
auto entry : monRes) {
174 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/brp16_2.pm";
175 std::string formulaAsString =
"P=? [true U s=4 & i=N ]";
176 std::string constantsAsString =
"";
181 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
183 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
186 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
187 model = simplifier.getSimplifiedModel();
191 if (storm::settings::getModule<storm::settings::modules::BisimulationSettings>().isWeakBisimulationSet()) {
195 model = storm::api::performBisimulationMinimization<storm::RationalFunction>(model, formulas, bisimType)
197 ASSERT_EQ(99ul, model->getNumberOfStates());
198 ASSERT_EQ(195ul, model->getNumberOfTransitions());
202 auto region = storm::api::parseRegion<storm::RationalFunction>(
"0.1<=pL<=0.9, 0.1<=pK<=0.9", modelParameters);
203 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
210 EXPECT_EQ(1ul, result.size());
213 auto order = result.begin()->first;
214 auto monotonicityResult = result.begin()->second.first;
215 EXPECT_TRUE(monotonicityResult->isDone());
216 EXPECT_TRUE(monotonicityResult->existsMonotonicity());
217 EXPECT_TRUE(monotonicityResult->isAllMonotonicity());
218 auto assumptions = result.begin()->second.second;
219 EXPECT_EQ(0ul, assumptions.size());
222 auto monRes = monotonicityResult->getMonotonicityResult();
223 for (
auto entry : monRes) {
229 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/zeroconf4.pm";
230 std::string formulaAsString =
"P > 0.5 [ F s=5 ]";
231 std::string constantsAsString =
"n = 4";
236 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
238 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
241 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
242 model = simplifier.getSimplifiedModel();
245 if (storm::settings::getModule<storm::settings::modules::BisimulationSettings>().isWeakBisimulationSet()) {
249 model = storm::api::performBisimulationMinimization<storm::RationalFunction>(model, formulas, bisimType)
251 ASSERT_EQ(7ul, model->getNumberOfStates());
252 ASSERT_EQ(12ul, model->getNumberOfTransitions());
256 auto region = storm::api::parseRegion<storm::RationalFunction>(
"0.1<=pL<=0.9, 0.1<=pK<=0.9", modelParameters);
257 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
262 auto result = MonotonicityHelper.checkMonotonicityInBuild(std::cout,
false);
263 EXPECT_EQ(1ul, result.size());
266 auto order = result.begin()->first;
267 auto monotonicityResult = result.begin()->second.first;
268 EXPECT_TRUE(monotonicityResult->isDone());
269 EXPECT_TRUE(monotonicityResult->existsMonotonicity());
270 EXPECT_TRUE(monotonicityResult->isAllMonotonicity());
272 auto assumptions = result.begin()->second.second;
273 EXPECT_EQ(0ul, assumptions.size());
276 auto monRes = monotonicityResult->getMonotonicityResult();
277 for (
auto entry : monRes) {
283 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/simple1.pm";
284 std::string formulaAsString =
"P > 0.5 [ F s=3 ]";
285 std::string constantsAsString =
"";
290 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
292 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
295 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
296 model = simplifier.getSimplifiedModel();
297 ASSERT_EQ(5ul, model->getNumberOfStates());
298 ASSERT_EQ(8ul, model->getNumberOfTransitions());
302 auto region = storm::api::parseRegion<storm::RationalFunction>(
"0.1<=p<=0.49", modelParameters);
303 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
309 auto result = MonotonicityHelper.checkMonotonicityInBuild(std::cout,
false);
310 EXPECT_EQ(1ul, result.size());
313 auto order = result.begin()->first;
314 auto monotonicityResult = result.begin()->second.first;
315 EXPECT_TRUE(monotonicityResult->isDone());
316 EXPECT_FALSE(monotonicityResult->existsMonotonicity());
317 EXPECT_FALSE(monotonicityResult->isAllMonotonicity());
318 auto assumptions = result.begin()->second.second;
319 EXPECT_EQ(0ul, assumptions.size());
322 auto monRes = monotonicityResult->getMonotonicityResult();
323 for (
auto entry : monRes) {
329 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/casestudy1.pm";
330 std::string formulaAsString =
"P > 0.5 [ F s=3 ]";
331 std::string constantsAsString =
"";
336 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
338 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
341 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
342 model = simplifier.getSimplifiedModel();
346 auto region = storm::api::parseRegion<storm::RationalFunction>(
"0.1<=p<=0.9", modelParameters);
347 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
349 ASSERT_EQ(5ul, model->getNumberOfStates());
350 ASSERT_EQ(8ul, model->getNumberOfTransitions());
353 auto result = MonotonicityHelper.checkMonotonicityInBuild(std::cout,
false);
354 ASSERT_EQ(1ul, result.size());
356 auto order = result.begin()->first;
357 auto monotonicityResult = result.begin()->second.first;
358 EXPECT_TRUE(monotonicityResult->isDone());
359 EXPECT_TRUE(monotonicityResult->existsMonotonicity());
360 EXPECT_TRUE(monotonicityResult->isAllMonotonicity());
361 auto assumptions = result.begin()->second.second;
362 EXPECT_EQ(0ul, assumptions.size());
364 auto monRes = monotonicityResult->getMonotonicityResult();
365 for (
auto entry : monRes) {
371 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/casestudy2.pm";
372 std::string formulaAsString =
"P > 0.5 [ F s=4 ]";
373 std::string constantsAsString =
"";
378 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
380 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
383 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
384 model = simplifier.getSimplifiedModel();
388 auto region = storm::api::parseRegion<storm::RationalFunction>(
"0.1<=p<=0.9", modelParameters);
389 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
391 ASSERT_EQ(6ul, model->getNumberOfStates());
392 ASSERT_EQ(12ul, model->getNumberOfTransitions());
398 auto result = monotonicityHelper.checkMonotonicityInBuild(std::cout,
false);
399 EXPECT_EQ(1ul, result.size());
400 EXPECT_FALSE(result.begin()->first->getDoneBuilding());
404 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/casestudy3.pm";
405 std::string formulaAsString =
"P > 0.5 [ F s=3 ]";
406 std::string constantsAsString =
"";
411 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
413 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
416 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
417 model = simplifier.getSimplifiedModel();
421 auto region = storm::api::parseRegion<storm::RationalFunction>(
"0.1<=p<=0.9", modelParameters);
422 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
424 ASSERT_EQ(5ul, model->getNumberOfStates());
425 ASSERT_EQ(8ul, model->getNumberOfTransitions());
428 auto result = MonotonicityHelper.checkMonotonicityInBuild(std::cout,
false);
430 ASSERT_EQ(1ul, result.size());
431 auto order = result.begin()->first;
433 auto monotonicityResult = result.begin()->second.first;
434 EXPECT_TRUE(monotonicityResult->isDone());
435 EXPECT_FALSE(monotonicityResult->existsMonotonicity());
436 EXPECT_FALSE(monotonicityResult->isAllMonotonicity());
437 auto assumptions = result.begin()->second.second;
438 EXPECT_EQ(0ul, assumptions.size());
440 auto monRes = monotonicityResult->getMonotonicityResult();
441 for (
auto entry : monRes) {
447 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/casestudy3.pm";
448 std::string formulaAsString =
"P > 0.5 [ F s=3 ]";
449 std::string constantsAsString =
"";
454 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
456 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
459 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
460 model = simplifier.getSimplifiedModel();
464 auto region = storm::api::parseRegion<storm::RationalFunction>(
"0.1<=p<=0.49", modelParameters);
465 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
467 ASSERT_EQ(5ul, model->getNumberOfStates());
468 ASSERT_EQ(8ul, model->getNumberOfTransitions());
471 auto result = MonotonicityHelper.checkMonotonicityInBuild(std::cout,
false);
473 ASSERT_EQ(1ul, result.size());
474 auto order = result.begin()->first;
476 auto monotonicityResult = result.begin()->second.first;
477 EXPECT_TRUE(monotonicityResult->isDone());
478 EXPECT_TRUE(monotonicityResult->existsMonotonicity());
479 EXPECT_TRUE(monotonicityResult->isAllMonotonicity());
480 auto assumptions = result.begin()->second.second;
481 EXPECT_EQ(0ul, assumptions.size());
483 auto monRes = monotonicityResult->getMonotonicityResult();
484 for (
auto entry : monRes) {
std::map< std::shared_ptr< Order >, std::pair< std::shared_ptr< MonotonicityResult< VariableType > >, std::vector< std::shared_ptr< expressions::BinaryRelationExpression > > > > checkMonotonicityInBuild(std::ostream &outfile, bool usePLA=false, std::string dotOutfileName="dotOutput")
Builds Reachability Orders for the given model and simultaneously uses them to check for Monotonicity...