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.

248 lines
10 KiB

  1. #include "gtest/gtest.h"
  2. #include "storm-config.h"
  3. #include "src/utility/Settings.h"
  4. #include "src/modelchecker/GmmxxMdpPrctlModelChecker.h"
  5. #include "src/parser/AutoParser.h"
  6. TEST(GmmxxMdpPrctModelCheckerTest, Dice) {
  7. storm::settings::Settings* s = storm::settings::instance();
  8. storm::parser::AutoParser<double> parser(STORM_CPP_TESTS_BASE_PATH "/functional/two_dice/two_dice.tra", STORM_CPP_TESTS_BASE_PATH "/functional/two_dice/two_dice.lab", "", STORM_CPP_TESTS_BASE_PATH "/functional/two_dice/two_dice.flip.trans.rew");
  9. ASSERT_EQ(parser.getType(), storm::models::MDP);
  10. std::shared_ptr<storm::models::Mdp<double>> mdp = parser.getModel<storm::models::Mdp<double>>();
  11. ASSERT_EQ(mdp->getNumberOfStates(), 169);
  12. ASSERT_EQ(mdp->getNumberOfTransitions(), 436);
  13. storm::modelchecker::GmmxxMdpPrctlModelChecker<double> mc(*mdp);
  14. storm::formula::Ap<double>* apFormula = new storm::formula::Ap<double>("two");
  15. storm::formula::Eventually<double>* eventuallyFormula = new storm::formula::Eventually<double>(apFormula);
  16. storm::formula::ProbabilisticNoBoundOperator<double>* probFormula = new storm::formula::ProbabilisticNoBoundOperator<double>(eventuallyFormula, true);
  17. std::vector<double>* result = probFormula->check(mc);
  18. ASSERT_LT(std::abs((*result)[0] - 0.0277777612209320068), s->get<double>("precision"));
  19. delete probFormula;
  20. delete result;
  21. apFormula = new storm::formula::Ap<double>("two");
  22. eventuallyFormula = new storm::formula::Eventually<double>(apFormula);
  23. probFormula = new storm::formula::ProbabilisticNoBoundOperator<double>(eventuallyFormula, false);
  24. result = probFormula->check(mc);
  25. ASSERT_LT(std::abs((*result)[0] - 0.0277777612209320068), s->get<double>("precision"));
  26. delete probFormula;
  27. delete result;
  28. apFormula = new storm::formula::Ap<double>("three");
  29. eventuallyFormula = new storm::formula::Eventually<double>(apFormula);
  30. probFormula = new storm::formula::ProbabilisticNoBoundOperator<double>(eventuallyFormula, true);
  31. result = probFormula->check(mc);
  32. ASSERT_LT(std::abs((*result)[0] - 0.0555555224418640136), s->get<double>("precision"));
  33. delete probFormula;
  34. delete result;
  35. apFormula = new storm::formula::Ap<double>("three");
  36. eventuallyFormula = new storm::formula::Eventually<double>(apFormula);
  37. probFormula = new storm::formula::ProbabilisticNoBoundOperator<double>(eventuallyFormula, false);
  38. result = probFormula->check(mc);
  39. ASSERT_LT(std::abs((*result)[0] - 0.0555555224418640136), s->get<double>("precision"));
  40. delete probFormula;
  41. delete result;
  42. apFormula = new storm::formula::Ap<double>("four");
  43. eventuallyFormula = new storm::formula::Eventually<double>(apFormula);
  44. probFormula = new storm::formula::ProbabilisticNoBoundOperator<double>(eventuallyFormula, true);
  45. result = probFormula->check(mc);
  46. ASSERT_LT(std::abs((*result)[0] - 0.083333283662796020508), s->get<double>("precision"));
  47. delete probFormula;
  48. delete result;
  49. apFormula = new storm::formula::Ap<double>("four");
  50. eventuallyFormula = new storm::formula::Eventually<double>(apFormula);
  51. probFormula = new storm::formula::ProbabilisticNoBoundOperator<double>(eventuallyFormula, false);
  52. result = probFormula->check(mc);
  53. ASSERT_LT(std::abs((*result)[0] - 0.083333283662796020508), s->get<double>("precision"));
  54. delete probFormula;
  55. delete result;
  56. apFormula = new storm::formula::Ap<double>("done");
  57. storm::formula::ReachabilityReward<double>* reachabilityRewardFormula = new storm::formula::ReachabilityReward<double>(apFormula);
  58. storm::formula::RewardNoBoundOperator<double>* rewardFormula = new storm::formula::RewardNoBoundOperator<double>(reachabilityRewardFormula, true);
  59. result = rewardFormula->check(mc);
  60. ASSERT_LT(std::abs((*result)[0] - 7.3333294987678527832), s->get<double>("precision"));
  61. delete rewardFormula;
  62. delete result;
  63. apFormula = new storm::formula::Ap<double>("done");
  64. reachabilityRewardFormula = new storm::formula::ReachabilityReward<double>(apFormula);
  65. rewardFormula = new storm::formula::RewardNoBoundOperator<double>(reachabilityRewardFormula, false);
  66. result = rewardFormula->check(mc);
  67. ASSERT_LT(std::abs((*result)[0] - 7.3333294987678527832), s->get<double>("precision"));
  68. delete rewardFormula;
  69. delete result;
  70. storm::parser::AutoParser<double> stateRewardParser(STORM_CPP_TESTS_BASE_PATH "/functional/two_dice/two_dice.tra", STORM_CPP_TESTS_BASE_PATH "/functional/two_dice/two_dice.lab", STORM_CPP_TESTS_BASE_PATH "/functional/two_dice/two_dice.flip.state.rew", "");
  71. ASSERT_EQ(stateRewardParser.getType(), storm::models::MDP);
  72. std::shared_ptr<storm::models::Mdp<double>> stateRewardMdp = stateRewardParser.getModel<storm::models::Mdp<double>>();
  73. storm::modelchecker::GmmxxMdpPrctlModelChecker<double> stateRewardModelChecker(*stateRewardMdp);
  74. apFormula = new storm::formula::Ap<double>("done");
  75. reachabilityRewardFormula = new storm::formula::ReachabilityReward<double>(apFormula);
  76. rewardFormula = new storm::formula::RewardNoBoundOperator<double>(reachabilityRewardFormula, true);
  77. result = rewardFormula->check(stateRewardModelChecker);
  78. ASSERT_LT(std::abs((*result)[0] - 7.3333294987678527832), s->get<double>("precision"));
  79. delete rewardFormula;
  80. delete result;
  81. apFormula = new storm::formula::Ap<double>("done");
  82. reachabilityRewardFormula = new storm::formula::ReachabilityReward<double>(apFormula);
  83. rewardFormula = new storm::formula::RewardNoBoundOperator<double>(reachabilityRewardFormula, false);
  84. result = rewardFormula->check(stateRewardModelChecker);
  85. ASSERT_LT(std::abs((*result)[0] - 7.3333294987678527832), s->get<double>("precision"));
  86. delete rewardFormula;
  87. delete result;
  88. storm::parser::AutoParser<double> stateAndTransitionRewardParser(STORM_CPP_TESTS_BASE_PATH "/functional/two_dice/two_dice.tra", STORM_CPP_TESTS_BASE_PATH "/functional/two_dice/two_dice.lab", STORM_CPP_TESTS_BASE_PATH "/functional/two_dice/two_dice.flip.state.rew", STORM_CPP_TESTS_BASE_PATH "/functional/two_dice/two_dice.flip.trans.rew");
  89. ASSERT_EQ(stateAndTransitionRewardParser.getType(), storm::models::MDP);
  90. std::shared_ptr<storm::models::Mdp<double>> stateAndTransitionRewardMdp = stateAndTransitionRewardParser.getModel<storm::models::Mdp<double>>();
  91. storm::modelchecker::GmmxxMdpPrctlModelChecker<double> stateAndTransitionRewardModelChecker(*stateAndTransitionRewardMdp);
  92. apFormula = new storm::formula::Ap<double>("done");
  93. reachabilityRewardFormula = new storm::formula::ReachabilityReward<double>(apFormula);
  94. rewardFormula = new storm::formula::RewardNoBoundOperator<double>(reachabilityRewardFormula, true);
  95. result = rewardFormula->check(stateAndTransitionRewardModelChecker);
  96. ASSERT_LT(std::abs((*result)[0] - (2 * 7.3333294987678527832)), s->get<double>("precision"));
  97. delete rewardFormula;
  98. delete result;
  99. apFormula = new storm::formula::Ap<double>("done");
  100. reachabilityRewardFormula = new storm::formula::ReachabilityReward<double>(apFormula);
  101. rewardFormula = new storm::formula::RewardNoBoundOperator<double>(reachabilityRewardFormula, false);
  102. result = rewardFormula->check(stateAndTransitionRewardModelChecker);
  103. ASSERT_LT(std::abs((*result)[0] - (2 * 7.3333294987678527832)), s->get<double>("precision"));
  104. delete rewardFormula;
  105. delete result;
  106. }
  107. TEST(GmmxxMdpPrctModelCheckerTest, AsynchronousLeader) {
  108. storm::settings::Settings* s = storm::settings::instance();
  109. storm::parser::AutoParser<double> parser(STORM_CPP_TESTS_BASE_PATH "/functional/asynchronous_leader/leader4.tra", STORM_CPP_TESTS_BASE_PATH "/functional/asynchronous_leader/leader4.lab", "", STORM_CPP_TESTS_BASE_PATH "/functional/asynchronous_leader/leader4.trans.rew");
  110. ASSERT_EQ(parser.getType(), storm::models::MDP);
  111. std::shared_ptr<storm::models::Mdp<double>> mdp = parser.getModel<storm::models::Mdp<double>>();
  112. ASSERT_EQ(mdp->getNumberOfStates(), 3172);
  113. ASSERT_EQ(mdp->getNumberOfTransitions(), 7144);
  114. storm::modelchecker::GmmxxMdpPrctlModelChecker<double> mc(*mdp);
  115. storm::formula::Ap<double>* apFormula = new storm::formula::Ap<double>("elected");
  116. storm::formula::Eventually<double>* eventuallyFormula = new storm::formula::Eventually<double>(apFormula);
  117. storm::formula::ProbabilisticNoBoundOperator<double>* probFormula = new storm::formula::ProbabilisticNoBoundOperator<double>(eventuallyFormula, true);
  118. std::vector<double>* result = probFormula->check(mc);
  119. ASSERT_LT(std::abs((*result)[0] - 1), s->get<double>("precision"));
  120. delete probFormula;
  121. delete result;
  122. apFormula = new storm::formula::Ap<double>("elected");
  123. eventuallyFormula = new storm::formula::Eventually<double>(apFormula);
  124. probFormula = new storm::formula::ProbabilisticNoBoundOperator<double>(eventuallyFormula, false);
  125. result = probFormula->check(mc);
  126. ASSERT_LT(std::abs((*result)[0] - 1), s->get<double>("precision"));
  127. delete probFormula;
  128. delete result;
  129. apFormula = new storm::formula::Ap<double>("elected");
  130. storm::formula::BoundedEventually<double>* boundedEventuallyFormula = new storm::formula::BoundedEventually<double>(apFormula, 25);
  131. probFormula = new storm::formula::ProbabilisticNoBoundOperator<double>(boundedEventuallyFormula, true);
  132. result = probFormula->check(mc);
  133. ASSERT_LT(std::abs((*result)[0] - 0.0625), s->get<double>("precision"));
  134. delete probFormula;
  135. delete result;
  136. apFormula = new storm::formula::Ap<double>("elected");
  137. boundedEventuallyFormula = new storm::formula::BoundedEventually<double>(apFormula, 25);
  138. probFormula = new storm::formula::ProbabilisticNoBoundOperator<double>(boundedEventuallyFormula, false);
  139. result = probFormula->check(mc);
  140. ASSERT_LT(std::abs((*result)[0] - 0.0625), s->get<double>("precision"));
  141. delete probFormula;
  142. delete result;
  143. apFormula = new storm::formula::Ap<double>("elected");
  144. storm::formula::ReachabilityReward<double>* reachabilityRewardFormula = new storm::formula::ReachabilityReward<double>(apFormula);
  145. storm::formula::RewardNoBoundOperator<double>* rewardFormula = new storm::formula::RewardNoBoundOperator<double>(reachabilityRewardFormula, true);
  146. result = rewardFormula->check(mc);
  147. ASSERT_LT(std::abs((*result)[0] - 4.28568908480604982), s->get<double>("precision"));
  148. delete rewardFormula;
  149. delete result;
  150. apFormula = new storm::formula::Ap<double>("elected");
  151. reachabilityRewardFormula = new storm::formula::ReachabilityReward<double>(apFormula);
  152. rewardFormula = new storm::formula::RewardNoBoundOperator<double>(reachabilityRewardFormula, false);
  153. result = rewardFormula->check(mc);
  154. ASSERT_LT(std::abs((*result)[0] - 4.2856904354441400784), s->get<double>("precision"));
  155. delete rewardFormula;
  156. delete result;
  157. }