44 EXPECT_TRUE(constFunctionRes.first);
45 EXPECT_TRUE(constFunctionRes.second);
50 EXPECT_TRUE(constFunctionRes.first);
51 EXPECT_FALSE(constFunctionRes.second);
56 EXPECT_FALSE(constFunctionRes.first);
57 EXPECT_TRUE(constFunctionRes.second);
59 std::shared_ptr<storm::RawPolynomialCache> cache = std::make_shared<storm::RawPolynomialCache>();
60 carl::StringParser parser;
61 parser.setVariables({
"p",
"q"});
67 auto varsP = functionP.gatherVariables();
68 auto varsQ = functionQ.gatherVariables();
71 for (
auto var : varsP) {
73 storm::utility::convertNumber<typename storm::storage::ParameterRegion<storm::RationalFunction>::CoefficientType>(0 + 0.000001);
75 storm::utility::convertNumber<typename storm::storage::ParameterRegion<storm::RationalFunction>::CoefficientType>(1 - 0.000001);
76 lowerBoundaries2.emplace(std::make_pair(var, lb));
77 upperBoundaries2.emplace(std::make_pair(var, ub));
79 for (
auto var : varsQ) {
81 storm::utility::convertNumber<typename storm::storage::ParameterRegion<storm::RationalFunction>::CoefficientType>(0 + 0.000001);
83 storm::utility::convertNumber<typename storm::storage::ParameterRegion<storm::RationalFunction>::CoefficientType>(1 - 0.000001);
84 lowerBoundaries2.emplace(std::make_pair(var, lb));
85 upperBoundaries2.emplace(std::make_pair(var, ub));
90 auto function = functionP;
92 EXPECT_TRUE(functionRes.first);
93 EXPECT_FALSE(functionRes.second);
98 EXPECT_TRUE(functionDecrRes.first);
99 EXPECT_FALSE(functionDecrRes.second);
104 EXPECT_FALSE(functionNonMonotonicRes.first);
105 EXPECT_FALSE(functionNonMonotonicRes.second);
110 EXPECT_FALSE(functionDecrRes.first);
111 EXPECT_TRUE(functionDecrRes.second);
114 function = functionP * functionQ;
116 EXPECT_TRUE(functionRes.first);
117 EXPECT_FALSE(functionRes.second);
121 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/brp16_2.pm";
122 std::string formulaAsString =
"P=? [true U s=4 & i=N ]";
123 std::string constantsAsString =
"";
128 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
130 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
133 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
134 model = simplifier.getSimplifiedModel();
142 model = storm::api::performBisimulationMinimization<storm::RationalFunction>(model, formulas, bisimType)
144 ASSERT_EQ(99ul, model->getNumberOfStates());
145 ASSERT_EQ(195ul, model->getNumberOfTransitions());
149 auto region = storm::api::parseRegion<storm::RationalFunction>(
"0.1<=pL<=0.9, 0.1<=pK<=0.9", modelParameters);
150 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
157 EXPECT_EQ(1ul, result.size());
160 auto order = result.begin()->first;
161 auto monotonicityResult = result.begin()->second.first;
162 EXPECT_TRUE(monotonicityResult->isDone());
163 EXPECT_TRUE(monotonicityResult->existsMonotonicity());
164 EXPECT_TRUE(monotonicityResult->isAllMonotonicity());
165 auto assumptions = result.begin()->second.second;
166 EXPECT_EQ(0ul, assumptions.size());
169 auto monRes = monotonicityResult->getMonotonicityResult();
170 for (
auto entry : monRes) {
176 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/brp16_2.pm";
177 std::string formulaAsString =
"P=? [true U s=4 & i=N ]";
178 std::string constantsAsString =
"";
183 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
185 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
188 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
189 model = simplifier.getSimplifiedModel();
197 model = storm::api::performBisimulationMinimization<storm::RationalFunction>(model, formulas, bisimType)
199 ASSERT_EQ(99ul, model->getNumberOfStates());
200 ASSERT_EQ(195ul, model->getNumberOfTransitions());
204 auto region = storm::api::parseRegion<storm::RationalFunction>(
"0.1<=pL<=0.9, 0.1<=pK<=0.9", modelParameters);
205 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
212 EXPECT_EQ(1ul, result.size());
215 auto order = result.begin()->first;
216 auto monotonicityResult = result.begin()->second.first;
217 EXPECT_TRUE(monotonicityResult->isDone());
218 EXPECT_TRUE(monotonicityResult->existsMonotonicity());
219 EXPECT_TRUE(monotonicityResult->isAllMonotonicity());
220 auto assumptions = result.begin()->second.second;
221 EXPECT_EQ(0ul, assumptions.size());
224 auto monRes = monotonicityResult->getMonotonicityResult();
225 for (
auto entry : monRes) {
231 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/zeroconf4.pm";
232 std::string formulaAsString =
"P > 0.5 [ F s=5 ]";
233 std::string constantsAsString =
"n = 4";
238 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
240 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
243 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
244 model = simplifier.getSimplifiedModel();
251 model = storm::api::performBisimulationMinimization<storm::RationalFunction>(model, formulas, bisimType)
253 ASSERT_EQ(7ul, model->getNumberOfStates());
254 ASSERT_EQ(12ul, model->getNumberOfTransitions());
258 auto region = storm::api::parseRegion<storm::RationalFunction>(
"0.1<=pL<=0.9, 0.1<=pK<=0.9", modelParameters);
259 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
264 auto result = MonotonicityHelper.checkMonotonicityInBuild(std::cout,
false);
265 EXPECT_EQ(1ul, result.size());
268 auto order = result.begin()->first;
269 auto monotonicityResult = result.begin()->second.first;
270 EXPECT_TRUE(monotonicityResult->isDone());
271 EXPECT_TRUE(monotonicityResult->existsMonotonicity());
272 EXPECT_TRUE(monotonicityResult->isAllMonotonicity());
274 auto assumptions = result.begin()->second.second;
275 EXPECT_EQ(0ul, assumptions.size());
278 auto monRes = monotonicityResult->getMonotonicityResult();
279 for (
auto entry : monRes) {
285 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/simple1.pm";
286 std::string formulaAsString =
"P > 0.5 [ F s=3 ]";
287 std::string constantsAsString =
"";
292 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
294 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
297 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
298 model = simplifier.getSimplifiedModel();
299 ASSERT_EQ(5ul, model->getNumberOfStates());
300 ASSERT_EQ(8ul, model->getNumberOfTransitions());
304 auto region = storm::api::parseRegion<storm::RationalFunction>(
"0.1<=p<=0.49", modelParameters);
305 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
311 auto result = MonotonicityHelper.checkMonotonicityInBuild(std::cout,
false);
312 EXPECT_EQ(1ul, result.size());
315 auto order = result.begin()->first;
316 auto monotonicityResult = result.begin()->second.first;
317 EXPECT_TRUE(monotonicityResult->isDone());
318 EXPECT_FALSE(monotonicityResult->existsMonotonicity());
319 EXPECT_FALSE(monotonicityResult->isAllMonotonicity());
320 auto assumptions = result.begin()->second.second;
321 EXPECT_EQ(0ul, assumptions.size());
324 auto monRes = monotonicityResult->getMonotonicityResult();
325 for (
auto entry : monRes) {
331 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/casestudy1.pm";
332 std::string formulaAsString =
"P > 0.5 [ F s=3 ]";
333 std::string constantsAsString =
"";
338 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
340 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
343 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
344 model = simplifier.getSimplifiedModel();
348 auto region = storm::api::parseRegion<storm::RationalFunction>(
"0.1<=p<=0.9", modelParameters);
349 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
351 ASSERT_EQ(5ul, model->getNumberOfStates());
352 ASSERT_EQ(8ul, model->getNumberOfTransitions());
355 auto result = MonotonicityHelper.checkMonotonicityInBuild(std::cout,
false);
356 ASSERT_EQ(1ul, result.size());
358 auto order = result.begin()->first;
359 auto monotonicityResult = result.begin()->second.first;
360 EXPECT_TRUE(monotonicityResult->isDone());
361 EXPECT_TRUE(monotonicityResult->existsMonotonicity());
362 EXPECT_TRUE(monotonicityResult->isAllMonotonicity());
363 auto assumptions = result.begin()->second.second;
364 EXPECT_EQ(0ul, assumptions.size());
366 auto monRes = monotonicityResult->getMonotonicityResult();
367 for (
auto entry : monRes) {
373 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/casestudy2.pm";
374 std::string formulaAsString =
"P > 0.5 [ F s=4 ]";
375 std::string constantsAsString =
"";
380 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
382 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
385 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
386 model = simplifier.getSimplifiedModel();
390 auto region = storm::api::parseRegion<storm::RationalFunction>(
"0.1<=p<=0.9", modelParameters);
391 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
393 ASSERT_EQ(6ul, model->getNumberOfStates());
394 ASSERT_EQ(12ul, model->getNumberOfTransitions());
400 auto result = monotonicityHelper.checkMonotonicityInBuild(std::cout,
false);
401 EXPECT_EQ(1ul, result.size());
402 EXPECT_FALSE(result.begin()->first->getDoneBuilding());
406 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/casestudy3.pm";
407 std::string formulaAsString =
"P > 0.5 [ F s=3 ]";
408 std::string constantsAsString =
"";
413 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
415 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
418 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
419 model = simplifier.getSimplifiedModel();
423 auto region = storm::api::parseRegion<storm::RationalFunction>(
"0.1<=p<=0.9", modelParameters);
424 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
426 ASSERT_EQ(5ul, model->getNumberOfStates());
427 ASSERT_EQ(8ul, model->getNumberOfTransitions());
430 auto result = MonotonicityHelper.checkMonotonicityInBuild(std::cout,
false);
432 ASSERT_EQ(1ul, result.size());
433 auto order = result.begin()->first;
435 auto monotonicityResult = result.begin()->second.first;
436 EXPECT_TRUE(monotonicityResult->isDone());
437 EXPECT_FALSE(monotonicityResult->existsMonotonicity());
438 EXPECT_FALSE(monotonicityResult->isAllMonotonicity());
439 auto assumptions = result.begin()->second.second;
440 EXPECT_EQ(0ul, assumptions.size());
442 auto monRes = monotonicityResult->getMonotonicityResult();
443 for (
auto entry : monRes) {
449 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/casestudy3.pm";
450 std::string formulaAsString =
"P > 0.5 [ F s=3 ]";
451 std::string constantsAsString =
"";
456 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
458 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
461 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
462 model = simplifier.getSimplifiedModel();
466 auto region = storm::api::parseRegion<storm::RationalFunction>(
"0.1<=p<=0.49", modelParameters);
467 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
469 ASSERT_EQ(5ul, model->getNumberOfStates());
470 ASSERT_EQ(8ul, model->getNumberOfTransitions());
473 auto result = MonotonicityHelper.checkMonotonicityInBuild(std::cout,
false);
475 ASSERT_EQ(1ul, result.size());
476 auto order = result.begin()->first;
478 auto monotonicityResult = result.begin()->second.first;
479 EXPECT_TRUE(monotonicityResult->isDone());
480 EXPECT_TRUE(monotonicityResult->existsMonotonicity());
481 EXPECT_TRUE(monotonicityResult->isAllMonotonicity());
482 auto assumptions = result.begin()->second.second;
483 EXPECT_EQ(0ul, assumptions.size());
485 auto monRes = monotonicityResult->getMonotonicityResult();
486 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...