You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

162 lines
6.6 KiB

  1. #include "gtest/gtest.h"
  2. #include "storm-config.h"
  3. #include "src/utility/Settings.h"
  4. #include "src/modelchecker/GmmxxDtmcPrctlModelChecker.h"
  5. #include "src/parser/AutoParser.h"
  6. TEST(GmmxxDtmcPrctModelCheckerTest, Die) {
  7. storm::settings::Settings* s = storm::settings::instance();
  8. s->set("fix-deadlocks");
  9. storm::parser::AutoParser<double> parser(STORM_CPP_TESTS_BASE_PATH "/functional/die/die.tra", STORM_CPP_TESTS_BASE_PATH "/functional/die/die.lab", "", STORM_CPP_TESTS_BASE_PATH "/functional/die/die.coin_flips.trans.rew");
  10. ASSERT_EQ(parser.getType(), storm::models::DTMC);
  11. std::shared_ptr<storm::models::Dtmc<double>> dtmc = parser.getModel<storm::models::Dtmc<double>>();
  12. ASSERT_EQ(dtmc->getNumberOfStates(), 13);
  13. ASSERT_EQ(dtmc->getNumberOfTransitions(), 27);
  14. storm::modelchecker::GmmxxDtmcPrctlModelChecker<double> mc(*dtmc);
  15. storm::formula::Ap<double>* apFormula = new storm::formula::Ap<double>("one");
  16. storm::formula::Eventually<double>* eventuallyFormula = new storm::formula::Eventually<double>(apFormula);
  17. storm::formula::ProbabilisticNoBoundOperator<double>* probFormula = new storm::formula::ProbabilisticNoBoundOperator<double>(eventuallyFormula);
  18. std::vector<double>* result = probFormula->check(mc);
  19. ASSERT_LT(std::abs((*result)[0] - ((double)1/6)), s->get<double>("precision"));
  20. delete probFormula;
  21. delete result;
  22. apFormula = new storm::formula::Ap<double>("two");
  23. eventuallyFormula = new storm::formula::Eventually<double>(apFormula);
  24. probFormula = new storm::formula::ProbabilisticNoBoundOperator<double>(eventuallyFormula);
  25. result = probFormula->check(mc);
  26. ASSERT_LT(std::abs((*result)[0] - ((double)1/6)), s->get<double>("precision"));
  27. delete probFormula;
  28. delete result;
  29. apFormula = new storm::formula::Ap<double>("three");
  30. eventuallyFormula = new storm::formula::Eventually<double>(apFormula);
  31. probFormula = new storm::formula::ProbabilisticNoBoundOperator<double>(eventuallyFormula);
  32. result = probFormula->check(mc);
  33. ASSERT_LT(std::abs((*result)[0] - ((double)1/6)), s->get<double>("precision"));
  34. delete probFormula;
  35. delete result;
  36. storm::formula::Ap<double>* done = new storm::formula::Ap<double>("done");
  37. storm::formula::ReachabilityReward<double>* reachabilityRewardFormula = new storm::formula::ReachabilityReward<double>(done);
  38. storm::formula::RewardNoBoundOperator<double>* rewardFormula = new storm::formula::RewardNoBoundOperator<double>(reachabilityRewardFormula);
  39. result = rewardFormula->check(mc);
  40. ASSERT_LT(std::abs((*result)[0] - ((double)11/3)), s->get<double>("precision"));
  41. delete rewardFormula;
  42. delete result;
  43. }
  44. TEST(GmmxxDtmcPrctModelCheckerTest, Crowds) {
  45. storm::settings::Settings* s = storm::settings::instance();
  46. s->set("fix-deadlocks");
  47. storm::parser::AutoParser<double> parser(STORM_CPP_TESTS_BASE_PATH "/functional/crowds/crowds5_5.tra", STORM_CPP_TESTS_BASE_PATH "/functional/crowds/crowds5_5.lab", "", "");
  48. ASSERT_EQ(parser.getType(), storm::models::DTMC);
  49. std::shared_ptr<storm::models::Dtmc<double>> dtmc = parser.getModel<storm::models::Dtmc<double>>();
  50. ASSERT_EQ(dtmc->getNumberOfStates(), 8607);
  51. ASSERT_EQ(dtmc->getNumberOfTransitions(), 22460);
  52. storm::modelchecker::GmmxxDtmcPrctlModelChecker<double> mc(*dtmc);
  53. storm::formula::Ap<double>* apFormula = new storm::formula::Ap<double>("observe0Greater1");
  54. storm::formula::Eventually<double>* eventuallyFormula = new storm::formula::Eventually<double>(apFormula);
  55. storm::formula::ProbabilisticNoBoundOperator<double>* probFormula = new storm::formula::ProbabilisticNoBoundOperator<double>(eventuallyFormula);
  56. std::vector<double>* result = probFormula->check(mc);
  57. ASSERT_LT(std::abs((*result)[0] - 0.3328800375801578281), s->get<double>("precision"));
  58. delete probFormula;
  59. delete result;
  60. apFormula = new storm::formula::Ap<double>("observeIGreater1");
  61. eventuallyFormula = new storm::formula::Eventually<double>(apFormula);
  62. probFormula = new storm::formula::ProbabilisticNoBoundOperator<double>(eventuallyFormula);
  63. result = probFormula->check(mc);
  64. ASSERT_LT(std::abs((*result)[0] - 0.1522173670950556501), s->get<double>("precision"));
  65. delete probFormula;
  66. delete result;
  67. apFormula = new storm::formula::Ap<double>("observeOnlyTrueSender");
  68. eventuallyFormula = new storm::formula::Eventually<double>(apFormula);
  69. probFormula = new storm::formula::ProbabilisticNoBoundOperator<double>(eventuallyFormula);
  70. result = probFormula->check(mc);
  71. ASSERT_LT(std::abs((*result)[0] - 0.32153724292835045), s->get<double>("precision"));
  72. delete probFormula;
  73. delete result;
  74. }
  75. TEST(GmmxxDtmcPrctModelCheckerTest, SynchronousLeader) {
  76. storm::settings::Settings* s = storm::settings::instance();
  77. s->set("fix-deadlocks");
  78. storm::parser::AutoParser<double> parser(STORM_CPP_TESTS_BASE_PATH "/functional/synchronous_leader/leader4_8.tra", STORM_CPP_TESTS_BASE_PATH "/functional/synchronous_leader/leader4_8.lab", "", STORM_CPP_TESTS_BASE_PATH "/functional/synchronous_leader/leader4_8.pick.trans.rew");
  79. ASSERT_EQ(parser.getType(), storm::models::DTMC);
  80. std::shared_ptr<storm::models::Dtmc<double>> dtmc = parser.getModel<storm::models::Dtmc<double>>();
  81. ASSERT_EQ(dtmc->getNumberOfStates(), 12400);
  82. ASSERT_EQ(dtmc->getNumberOfTransitions(), 28894);
  83. storm::modelchecker::GmmxxDtmcPrctlModelChecker<double> mc(*dtmc);
  84. storm::formula::Ap<double>* apFormula = new storm::formula::Ap<double>("elected");
  85. storm::formula::Eventually<double>* eventuallyFormula = new storm::formula::Eventually<double>(apFormula);
  86. storm::formula::ProbabilisticNoBoundOperator<double>* probFormula = new storm::formula::ProbabilisticNoBoundOperator<double>(eventuallyFormula);
  87. std::vector<double>* result = probFormula->check(mc);
  88. ASSERT_LT(std::abs((*result)[0] - 1), s->get<double>("precision"));
  89. delete probFormula;
  90. delete result;
  91. apFormula = new storm::formula::Ap<double>("elected");
  92. storm::formula::BoundedUntil<double>* boundedUntilFormula = new storm::formula::BoundedUntil<double>(new storm::formula::Ap<double>("true"), apFormula, 20);
  93. probFormula = new storm::formula::ProbabilisticNoBoundOperator<double>(boundedUntilFormula);
  94. result = probFormula->check(mc);
  95. ASSERT_LT(std::abs((*result)[0] - 0.9999965911265462636), s->get<double>("precision"));
  96. delete probFormula;
  97. delete result;
  98. apFormula = new storm::formula::Ap<double>("elected");
  99. storm::formula::ReachabilityReward<double>* reachabilityRewardFormula = new storm::formula::ReachabilityReward<double>(apFormula);
  100. storm::formula::RewardNoBoundOperator<double>* rewardFormula = new storm::formula::RewardNoBoundOperator<double>(reachabilityRewardFormula);
  101. result = rewardFormula->check(mc);
  102. ASSERT_LT(std::abs((*result)[0] - 1.0448979591835938496), s->get<double>("precision"));
  103. delete rewardFormula;
  104. delete result;
  105. }