285 lines
16 KiB

  1. #include "gtest/gtest.h"
  2. #include "storm-config.h"
  3. #include "src/logic/Formulas.h"
  4. #include "src/solver/NativeNondeterministicLinearEquationSolver.h"
  5. #include "src/modelchecker/prctl/TopologicalValueIterationMdpPrctlModelChecker.h"
  6. #include "src/modelchecker/prctl/SparseMdpPrctlModelChecker.h"
  7. #include "src/modelchecker/ExplicitQuantitativeCheckResult.h"
  8. #include "src/settings/SettingsManager.h"
  9. #include "src/settings/SettingMemento.h"
  10. #include "src/parser/AutoParser.h"
  11. #include "storm-config.h"
  12. TEST(TopologicalValueIterationMdpPrctlModelCheckerTest, Dice) {
  13. //storm::settings::Settings* s = storm::settings::Settings::getInstance();
  14. std::shared_ptr<storm::models::Mdp<double>> mdp = storm::parser::AutoParser::parseModel(STORM_CPP_BASE_PATH "/examples/mdp/two_dice/two_dice.tra", STORM_CPP_BASE_PATH "/examples/mdp/two_dice/two_dice.lab", "", STORM_CPP_BASE_PATH "/examples/mdp/two_dice/two_dice.flip.trans.rew")->as<storm::models::Mdp<double>>();
  15. ASSERT_EQ(mdp->getNumberOfStates(), 169ull);
  16. ASSERT_EQ(mdp->getNumberOfTransitions(), 436ull);
  17. storm::modelchecker::prctl::TopologicalValueIterationMdpPrctlModelChecker<double> mc(*mdp);
  18. //storm::property::prctl::Ap<double>* apFormula = new storm::property::prctl::Ap<double>("two");
  19. auto apFormula = std::make_shared<storm::logic::AtomicLabelFormula>("two");
  20. //storm::property::prctl::Eventually<double>* eventuallyFormula = new storm::property::prctl::Eventually<double>(apFormula);
  21. auto eventuallyFormula = std::make_shared<storm::logic::EventuallyFormula>(apFormula);
  22. //storm::property::prctl::ProbabilisticNoBoundOperator<double>* probFormula = new storm::property::prctl::ProbabilisticNoBoundOperator<double>(eventuallyFormula, true);
  23. auto probabilityOperatorFormula = std::make_shared<storm::logic::ProbabilityOperatorFormula>(storm::logic::OptimalityType::Minimize, eventuallyFormula);
  24. //std::vector<double> result = mc.checkNoBoundOperator(*probFormula);
  25. std::unique_ptr<storm::modelchecker::CheckResult> result = mc.check(*probabilityOperatorFormula);
  26. //ASSERT_LT(std::abs(result[0] - 0.0277777612209320068), s->getOptionByLongName("precision").getArgument(0).getValueAsDouble());
  27. ASSERT_LT(std::abs(result->asExplicitQuantitativeCheckResult<double>()[0] - 0.0277777612209320068),
  28. storm::settings::topologicalValueIterationEquationSolverSettings().getPrecision());
  29. //delete probFormula;
  30. probabilityOperatorFormula.reset();
  31. //apFormula = new storm::property::prctl::Ap<double>("two");
  32. apFormula = std::make_shared<storm::logic::AtomicLabelFormula>("two");
  33. //eventuallyFormula = new storm::property::prctl::Eventually<double>(apFormula);
  34. eventuallyFormula = std::make_shared<storm::logic::EventuallyFormula>(apFormula);
  35. //probFormula = new storm::property::prctl::ProbabilisticNoBoundOperator<double>(eventuallyFormula, false);
  36. probabilityOperatorFormula = std::make_shared<storm::logic::ProbabilityOperatorFormula>(storm::logic::OptimalityType::Maximize, eventuallyFormula);
  37. //result = mc.checkNoBoundOperator(*probFormula);
  38. result = mc.check(*probabilityOperatorFormula);
  39. //ASSERT_LT(std::abs(result[0] - 0.0277777612209320068), s->getOptionByLongName("precision").getArgument(0).getValueAsDouble());
  40. ASSERT_LT(std::abs(result->asExplicitQuantitativeCheckResult<double>()[0] - 0.0277777612209320068),
  41. storm::settings::topologicalValueIterationEquationSolverSettings().getPrecision());
  42. //delete probFormula;
  43. probabilityOperatorFormula.reset();
  44. // ---------------- test ap "three" ----------------
  45. apFormula = std::make_shared<storm::logic::AtomicLabelFormula>("three");
  46. eventuallyFormula = std::make_shared<storm::logic::EventuallyFormula>(apFormula);
  47. probabilityOperatorFormula = std::make_shared<storm::logic::ProbabilityOperatorFormula>(storm::logic::OptimalityType::Minimize, eventuallyFormula);
  48. result = mc.check(*probabilityOperatorFormula);
  49. ASSERT_LT(std::abs(result->asExplicitQuantitativeCheckResult<double>()[0] - 0.0555555224418640136),
  50. storm::settings::topologicalValueIterationEquationSolverSettings().getPrecision());
  51. probabilityOperatorFormula.reset();
  52. apFormula = std::make_shared<storm::logic::AtomicLabelFormula>("three");
  53. eventuallyFormula = std::make_shared<storm::logic::EventuallyFormula>(apFormula);
  54. probabilityOperatorFormula = std::make_shared<storm::logic::ProbabilityOperatorFormula>(storm::logic::OptimalityType::Maximize, eventuallyFormula);
  55. result = mc.check(*probabilityOperatorFormula);
  56. ASSERT_LT(std::abs(result->asExplicitQuantitativeCheckResult<double>()[0] - 0.0555555224418640136),
  57. storm::settings::topologicalValueIterationEquationSolverSettings().getPrecision());
  58. probabilityOperatorFormula.reset();
  59. // ---------------- test ap "four" ----------------
  60. apFormula = std::make_shared<storm::logic::AtomicLabelFormula>("four");
  61. eventuallyFormula = std::make_shared<storm::logic::EventuallyFormula>(apFormula);
  62. probabilityOperatorFormula = std::make_shared<storm::logic::ProbabilityOperatorFormula>(storm::logic::OptimalityType::Minimize, eventuallyFormula);
  63. result = mc.check(*probabilityOperatorFormula);
  64. ASSERT_LT(std::abs(result->asExplicitQuantitativeCheckResult<double>()[0] - 0.083333283662796020508),
  65. storm::settings::topologicalValueIterationEquationSolverSettings().getPrecision());
  66. probabilityOperatorFormula.reset();
  67. apFormula = std::make_shared<storm::logic::AtomicLabelFormula>("four");
  68. eventuallyFormula = std::make_shared<storm::logic::EventuallyFormula>(apFormula);
  69. probabilityOperatorFormula = std::make_shared<storm::logic::ProbabilityOperatorFormula>(storm::logic::OptimalityType::Maximize, eventuallyFormula);
  70. result = mc.check(*probabilityOperatorFormula);
  71. ASSERT_LT(std::abs(result->asExplicitQuantitativeCheckResult<double>()[0] - 0.083333283662796020508),
  72. storm::settings::topologicalValueIterationEquationSolverSettings().getPrecision());
  73. probabilityOperatorFormula.reset();
  74. // ---------------- test ap "done" ----------------
  75. apFormula = std::make_shared<storm::logic::AtomicLabelFormula>("done");
  76. auto reachabilityRewardFormula = std::make_shared<storm::logic::ReachabilityRewardFormula>(apFormula);
  77. auto rewardFormula = std::make_shared<storm::logic::RewardOperatorFormula>(storm::logic::OptimalityType::Minimize, reachabilityRewardFormula);
  78. result = mc.check(*rewardFormula);
  79. #ifdef STORM_HAVE_CUDAFORSTORM
  80. ASSERT_LT(std::abs(result->asExplicitQuantitativeCheckResult<double>()[0] - 7.333329499),
  81. storm::settings::topologicalValueIterationEquationSolverSettings().getPrecision());
  82. #else
  83. ASSERT_LT(std::abs(result->asExplicitQuantitativeCheckResult<double>()[0] - 7.33332904),
  84. storm::settings::topologicalValueIterationEquationSolverSettings().getPrecision());
  85. #endif
  86. rewardFormula.reset();
  87. apFormula = std::make_shared<storm::logic::AtomicLabelFormula>("done");
  88. reachabilityRewardFormula = std::make_shared<storm::logic::ReachabilityRewardFormula>(apFormula);
  89. rewardFormula = std::make_shared<storm::logic::RewardOperatorFormula>(storm::logic::OptimalityType::Maximize, reachabilityRewardFormula);
  90. result = mc.check(*rewardFormula);
  91. #ifdef STORM_HAVE_CUDAFORSTORM
  92. ASSERT_LT(std::abs(result->asExplicitQuantitativeCheckResult<double>()[0] - 7.333329499),
  93. storm::settings::topologicalValueIterationEquationSolverSettings().getPrecision());
  94. #else
  95. ASSERT_LT(std::abs(result->asExplicitQuantitativeCheckResult<double>()[0] - 7.33333151),
  96. storm::settings::topologicalValueIterationEquationSolverSettings().getPrecision());
  97. #endif
  98. rewardFormula.reset();
  99. // ------------- state rewards --------------
  100. std::shared_ptr<storm::models::Mdp<double>> stateRewardMdp = storm::parser::AutoParser::parseModel(STORM_CPP_BASE_PATH "/examples/mdp/two_dice/two_dice.tra", STORM_CPP_BASE_PATH "/examples/mdp/two_dice/two_dice.lab", STORM_CPP_BASE_PATH "/examples/mdp/two_dice/two_dice.flip.state.rew", "")->as<storm::models::Mdp<double>>();
  101. storm::modelchecker::prctl::TopologicalValueIterationMdpPrctlModelChecker<double> stateRewardModelChecker(*stateRewardMdp);
  102. apFormula = std::make_shared<storm::logic::AtomicLabelFormula>("done");
  103. reachabilityRewardFormula = std::make_shared<storm::logic::ReachabilityRewardFormula>(apFormula);
  104. rewardFormula = std::make_shared<storm::logic::RewardOperatorFormula>(storm::logic::OptimalityType::Minimize, reachabilityRewardFormula);
  105. result = stateRewardModelChecker.check(*rewardFormula);
  106. #ifdef STORM_HAVE_CUDAFORSTORM
  107. ASSERT_LT(std::abs(result->asExplicitQuantitativeCheckResult<double>()[0] - 7.333329499),
  108. storm::settings::topologicalValueIterationEquationSolverSettings().getPrecision());
  109. #else
  110. ASSERT_LT(std::abs(result->asExplicitQuantitativeCheckResult<double>()[0] - 7.33332904),
  111. storm::settings::topologicalValueIterationEquationSolverSettings().getPrecision());
  112. #endif
  113. rewardFormula.reset();
  114. apFormula = std::make_shared<storm::logic::AtomicLabelFormula>("done");
  115. reachabilityRewardFormula = std::make_shared<storm::logic::ReachabilityRewardFormula>(apFormula);
  116. rewardFormula = std::make_shared<storm::logic::RewardOperatorFormula>(storm::logic::OptimalityType::Maximize, reachabilityRewardFormula);
  117. result = stateRewardModelChecker.check(*rewardFormula);
  118. #ifdef STORM_HAVE_CUDAFORSTORM
  119. ASSERT_LT(std::abs(result->asExplicitQuantitativeCheckResult<double>()[0] - 7.333329499),
  120. storm::settings::topologicalValueIterationEquationSolverSettings().getPrecision());
  121. #else
  122. ASSERT_LT(std::abs(result->asExplicitQuantitativeCheckResult<double>()[0] - 7.33333151),
  123. storm::settings::topologicalValueIterationEquationSolverSettings().getPrecision());
  124. #endif
  125. rewardFormula.reset();
  126. // -------------------------------- state and transition reward ------------------------
  127. std::shared_ptr<storm::models::Mdp<double>> stateAndTransitionRewardMdp = storm::parser::AutoParser::parseModel(STORM_CPP_BASE_PATH "/examples/mdp/two_dice/two_dice.tra", STORM_CPP_BASE_PATH "/examples/mdp/two_dice/two_dice.lab", STORM_CPP_BASE_PATH "/examples/mdp/two_dice/two_dice.flip.state.rew", STORM_CPP_BASE_PATH "/examples/mdp/two_dice/two_dice.flip.trans.rew")->as<storm::models::Mdp<double>>();
  128. storm::modelchecker::prctl::TopologicalValueIterationMdpPrctlModelChecker<double> stateAndTransitionRewardModelChecker(*stateAndTransitionRewardMdp);
  129. apFormula = std::make_shared<storm::logic::AtomicLabelFormula>("done");
  130. reachabilityRewardFormula = std::make_shared<storm::logic::ReachabilityRewardFormula>(apFormula);
  131. rewardFormula = std::make_shared<storm::logic::RewardOperatorFormula>(storm::logic::OptimalityType::Minimize, reachabilityRewardFormula);
  132. result = stateAndTransitionRewardModelChecker.check(*rewardFormula);
  133. #ifdef STORM_HAVE_CUDAFORSTORM
  134. ASSERT_LT(std::abs(result->asExplicitQuantitativeCheckResult<double>()[0] - 14.666658998),
  135. storm::settings::topologicalValueIterationEquationSolverSettings().getPrecision());
  136. #else
  137. ASSERT_LT(std::abs(result->asExplicitQuantitativeCheckResult<double>()[0] - 14.6666581),
  138. storm::settings::topologicalValueIterationEquationSolverSettings().getPrecision());
  139. #endif
  140. rewardFormula.reset();
  141. apFormula = std::make_shared<storm::logic::AtomicLabelFormula>("done");
  142. reachabilityRewardFormula = std::make_shared<storm::logic::ReachabilityRewardFormula>(apFormula);
  143. rewardFormula = std::make_shared<storm::logic::RewardOperatorFormula>(storm::logic::OptimalityType::Maximize, reachabilityRewardFormula);
  144. result = stateAndTransitionRewardModelChecker.check(*rewardFormula);
  145. #ifdef STORM_HAVE_CUDAFORSTORM
  146. ASSERT_LT(std::abs(result->asExplicitQuantitativeCheckResult<double>()[0] - 14.666658998),
  147. storm::settings::topologicalValueIterationEquationSolverSettings().getPrecision());
  148. #else
  149. ASSERT_LT(std::abs(result->asExplicitQuantitativeCheckResult<double>()[0] - 14.666663),
  150. storm::settings::topologicalValueIterationEquationSolverSettings().getPrecision());
  151. #endif
  152. rewardFormula.reset();
  153. }
  154. TEST(TopologicalValueIterationMdpPrctlModelCheckerTest, AsynchronousLeader) {
  155. //storm::settings::Settings* s = storm::settings::Settings::getInstance();
  156. std::shared_ptr<storm::models::Mdp<double>> mdp = storm::parser::AutoParser::parseModel(STORM_CPP_BASE_PATH "/examples/mdp/asynchronous_leader/leader4.tra", STORM_CPP_BASE_PATH "/examples/mdp/asynchronous_leader/leader4.lab", "", STORM_CPP_BASE_PATH "/examples/mdp/asynchronous_leader/leader4.trans.rew")->as<storm::models::Mdp<double>>();
  157. //ASSERT_EQ(mdp->getNumberOfStates(), 3172ull);
  158. //ASSERT_EQ(mdp->getNumberOfTransitions(), 7144ull);
  159. //storm::modelchecker::prctl::TopologicalValueIterationMdpPrctlModelChecker<double> mc(*mdp);
  160. //storm::property::prctl::Ap<double>* apFormula = new storm::property::prctl::Ap<double>("elected");
  161. //storm::property::prctl::Eventually<double>* eventuallyFormula = new storm::property::prctl::Eventually<double>(apFormula);
  162. //storm::property::prctl::ProbabilisticNoBoundOperator<double>* probFormula = new storm::property::prctl::ProbabilisticNoBoundOperator<double>(eventuallyFormula, true);
  163. //std::vector<double> result = mc.checkNoBoundOperator(*probFormula);
  164. //ASSERT_LT(std::abs(result[0] - 1), s->getOptionByLongName("precision").getArgument(0).getValueAsDouble());
  165. //delete probFormula;
  166. //apFormula = new storm::property::prctl::Ap<double>("elected");
  167. //eventuallyFormula = new storm::property::prctl::Eventually<double>(apFormula);
  168. //probFormula = new storm::property::prctl::ProbabilisticNoBoundOperator<double>(eventuallyFormula, false);
  169. //result = mc.checkNoBoundOperator(*probFormula);
  170. //ASSERT_LT(std::abs(result[0] - 1), s->getOptionByLongName("precision").getArgument(0).getValueAsDouble());
  171. //delete probFormula;
  172. //apFormula = new storm::property::prctl::Ap<double>("elected");
  173. //storm::property::prctl::BoundedEventually<double>* boundedEventuallyFormula = new storm::property::prctl::BoundedEventually<double>(apFormula, 25);
  174. //probFormula = new storm::property::prctl::ProbabilisticNoBoundOperator<double>(boundedEventuallyFormula, false);
  175. //result = mc.checkNoBoundOperator(*probFormula);
  176. //ASSERT_LT(std::abs(result[0] - 0.0625), s->getOptionByLongName("precision").getArgument(0).getValueAsDouble());
  177. //delete probFormula;
  178. //apFormula = new storm::property::prctl::Ap<double>("elected");
  179. //boundedEventuallyFormula = new storm::property::prctl::BoundedEventually<double>(apFormula, 25);
  180. //probFormula = new storm::property::prctl::ProbabilisticNoBoundOperator<double>(boundedEventuallyFormula, true);
  181. //result = mc.checkNoBoundOperator(*probFormula);
  182. //ASSERT_LT(std::abs(result[0] - 0.0625), s->getOptionByLongName("precision").getArgument(0).getValueAsDouble());
  183. //delete probFormula;
  184. //apFormula = new storm::property::prctl::Ap<double>("elected");
  185. //storm::property::prctl::ReachabilityReward<double>* reachabilityRewardFormula = new storm::property::prctl::ReachabilityReward<double>(apFormula);
  186. //storm::property::prctl::RewardNoBoundOperator<double>* rewardFormula = new storm::property::prctl::RewardNoBoundOperator<double>(reachabilityRewardFormula, true);
  187. //result = mc.checkNoBoundOperator(*rewardFormula);
  188. #ifdef STORM_HAVE_CUDAFORSTORM
  189. //ASSERT_LT(std::abs(result[0] - 4.285689611), s->getOptionByLongName("precision").getArgument(0).getValueAsDouble());
  190. #else
  191. //ASSERT_LT(std::abs(result[0] - 4.285701547), s->getOptionByLongName("precision").getArgument(0).getValueAsDouble());
  192. #endif
  193. //delete rewardFormula;
  194. //apFormula = new storm::property::prctl::Ap<double>("elected");
  195. //reachabilityRewardFormula = new storm::property::prctl::ReachabilityReward<double>(apFormula);
  196. //rewardFormula = new storm::property::prctl::RewardNoBoundOperator<double>(reachabilityRewardFormula, false);
  197. //result = mc.checkNoBoundOperator(*rewardFormula);
  198. #ifdef STORM_HAVE_CUDAFORSTORM
  199. //ASSERT_LT(std::abs(result[0] - 4.285689611), s->getOptionByLongName("precision").getArgument(0).getValueAsDouble());
  200. #else
  201. //ASSERT_LT(std::abs(result[0] - 4.285703591), s->getOptionByLongName("precision").getArgument(0).getValueAsDouble());
  202. #endif
  203. //delete rewardFormula;
  204. }