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.

325 lines
19 KiB

  1. #include "gtest/gtest.h"
  2. #include "storm-config.h"
  3. #include "src/settings/SettingMemento.h"
  4. #include "src/settings/SettingsManager.h"
  5. #include "src/settings/modules/IOSettings.h"
  6. #include "src/storage/SymbolicModelDescription.h"
  7. #include "src/models/symbolic/Dtmc.h"
  8. #include "src/models/symbolic/Ctmc.h"
  9. #include "src/models/symbolic/Mdp.h"
  10. #include "src/models/symbolic/StandardRewardModel.h"
  11. #include "src/parser/PrismParser.h"
  12. #include "src/builder/DdPrismModelBuilder.h"
  13. TEST(DdPrismModelBuilderTest_Sylvan, Dtmc) {
  14. storm::storage::SymbolicModelDescription modelDescription = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/die.pm");
  15. storm::prism::Program program = modelDescription.preprocess().asPrismProgram();
  16. std::shared_ptr<storm::models::symbolic::Model<storm::dd::DdType::Sylvan>> model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::Sylvan>().build(program);
  17. EXPECT_EQ(13ul, model->getNumberOfStates());
  18. EXPECT_EQ(20ul, model->getNumberOfTransitions());
  19. modelDescription = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/brp-16-2.pm");
  20. program = modelDescription.preprocess().asPrismProgram();
  21. model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::Sylvan>().build(program);
  22. EXPECT_EQ(677ul, model->getNumberOfStates());
  23. EXPECT_EQ(867ul, model->getNumberOfTransitions());
  24. modelDescription = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/crowds-5-5.pm");
  25. program = modelDescription.preprocess().asPrismProgram();
  26. model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::Sylvan>().build(program);
  27. EXPECT_EQ(8607ul, model->getNumberOfStates());
  28. EXPECT_EQ(15113ul, model->getNumberOfTransitions());
  29. modelDescription = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/leader-3-5.pm");
  30. program = modelDescription.preprocess().asPrismProgram();
  31. model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::Sylvan>().build(program);
  32. EXPECT_EQ(273ul, model->getNumberOfStates());
  33. EXPECT_EQ(397ul, model->getNumberOfTransitions());
  34. modelDescription = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/nand-5-2.pm");
  35. program = modelDescription.preprocess().asPrismProgram();
  36. model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::Sylvan>().build(program);
  37. EXPECT_EQ(1728ul, model->getNumberOfStates());
  38. EXPECT_EQ(2505ul, model->getNumberOfTransitions());
  39. }
  40. TEST(DdPrismModelBuilderTest_Cudd, Dtmc) {
  41. storm::storage::SymbolicModelDescription modelDescription = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/die.pm");
  42. storm::prism::Program program = modelDescription.preprocess().asPrismProgram();
  43. std::shared_ptr<storm::models::symbolic::Model<storm::dd::DdType::CUDD>> model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::CUDD>().build(program);
  44. EXPECT_EQ(13ul, model->getNumberOfStates());
  45. EXPECT_EQ(20ul, model->getNumberOfTransitions());
  46. modelDescription = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/brp-16-2.pm");
  47. program = modelDescription.preprocess().asPrismProgram();
  48. model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::CUDD>().build(program);
  49. EXPECT_EQ(677ul, model->getNumberOfStates());
  50. EXPECT_EQ(867ul, model->getNumberOfTransitions());
  51. modelDescription = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/crowds-5-5.pm");
  52. program = modelDescription.preprocess().asPrismProgram();
  53. model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::CUDD>().build(program);
  54. EXPECT_EQ(8607ul, model->getNumberOfStates());
  55. EXPECT_EQ(15113ul, model->getNumberOfTransitions());
  56. modelDescription = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/leader-3-5.pm");
  57. program = modelDescription.preprocess().asPrismProgram();
  58. model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::CUDD>().build(program);
  59. EXPECT_EQ(273ul, model->getNumberOfStates());
  60. EXPECT_EQ(397ul, model->getNumberOfTransitions());
  61. modelDescription = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/nand-5-2.pm");
  62. program = modelDescription.preprocess().asPrismProgram();
  63. model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::CUDD>().build(program);
  64. EXPECT_EQ(1728ul, model->getNumberOfStates());
  65. EXPECT_EQ(2505ul, model->getNumberOfTransitions());
  66. }
  67. TEST(DdPrismModelBuilderTest_Sylvan, Ctmc) {
  68. // Set the PRISM compatibility mode temporarily. It is set to its old value once the returned object is destructed.
  69. std::unique_ptr<storm::settings::SettingMemento> enablePrismCompatibility = storm::settings::mutableIOSettings().overridePrismCompatibilityMode(true);
  70. storm::storage::SymbolicModelDescription modelDescription = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/cluster2.sm");
  71. storm::prism::Program program = modelDescription.preprocess().asPrismProgram();
  72. std::shared_ptr<storm::models::symbolic::Model<storm::dd::DdType::Sylvan>> model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::Sylvan>().build(program);
  73. EXPECT_EQ(276ul, model->getNumberOfStates());
  74. EXPECT_EQ(1120ul, model->getNumberOfTransitions());
  75. modelDescription = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/embedded2.sm");
  76. program = modelDescription.preprocess().asPrismProgram();
  77. model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::Sylvan>().build(program);
  78. EXPECT_EQ(3478ul, model->getNumberOfStates());
  79. EXPECT_EQ(14639ul, model->getNumberOfTransitions());
  80. modelDescription = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/polling2.sm");
  81. program = modelDescription.preprocess().asPrismProgram();
  82. model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::Sylvan>().build(program);
  83. EXPECT_EQ(12ul, model->getNumberOfStates());
  84. EXPECT_EQ(22ul, model->getNumberOfTransitions());
  85. modelDescription = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/fms2.sm");
  86. program = modelDescription.preprocess().asPrismProgram();
  87. model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::Sylvan>().build(program);
  88. EXPECT_EQ(810ul, model->getNumberOfStates());
  89. EXPECT_EQ(3699ul, model->getNumberOfTransitions());
  90. modelDescription = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/tandem5.sm");
  91. program = modelDescription.preprocess().asPrismProgram();
  92. model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::Sylvan>().build(program);
  93. EXPECT_EQ(66ul, model->getNumberOfStates());
  94. EXPECT_EQ(189ul, model->getNumberOfTransitions());
  95. }
  96. TEST(DdPrismModelBuilderTest_Cudd, Ctmc) {
  97. // Set the PRISM compatibility mode temporarily. It is set to its old value once the returned object is destructed.
  98. std::unique_ptr<storm::settings::SettingMemento> enablePrismCompatibility = storm::settings::mutableIOSettings().overridePrismCompatibilityMode(true);
  99. storm::storage::SymbolicModelDescription modelDescription = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/cluster2.sm");
  100. storm::prism::Program program = modelDescription.preprocess().asPrismProgram();
  101. std::shared_ptr<storm::models::symbolic::Model<storm::dd::DdType::CUDD>> model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::CUDD>().build(program);
  102. EXPECT_EQ(276ul, model->getNumberOfStates());
  103. EXPECT_EQ(1120ul, model->getNumberOfTransitions());
  104. modelDescription = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/embedded2.sm");
  105. program = modelDescription.preprocess().asPrismProgram();
  106. model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::CUDD>().build(program);
  107. EXPECT_EQ(3478ul, model->getNumberOfStates());
  108. EXPECT_EQ(14639ul, model->getNumberOfTransitions());
  109. modelDescription = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/polling2.sm");
  110. program = modelDescription.preprocess().asPrismProgram();
  111. model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::CUDD>().build(program);
  112. EXPECT_EQ(12ul, model->getNumberOfStates());
  113. EXPECT_EQ(22ul, model->getNumberOfTransitions());
  114. modelDescription = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/fms2.sm");
  115. program = modelDescription.preprocess().asPrismProgram();
  116. model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::CUDD>().build(program);
  117. EXPECT_EQ(810ul, model->getNumberOfStates());
  118. EXPECT_EQ(3699ul, model->getNumberOfTransitions());
  119. modelDescription = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/tandem5.sm");
  120. program = modelDescription.preprocess().asPrismProgram();
  121. model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::CUDD>().build(program);
  122. EXPECT_EQ(66ul, model->getNumberOfStates());
  123. EXPECT_EQ(189ul, model->getNumberOfTransitions());
  124. }
  125. TEST(DdPrismModelBuilderTest_Sylvan, Mdp) {
  126. storm::storage::SymbolicModelDescription modelDescription = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/two_dice.nm");
  127. storm::prism::Program program = modelDescription.preprocess().asPrismProgram();
  128. std::shared_ptr<storm::models::symbolic::Model<storm::dd::DdType::Sylvan>> model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::Sylvan>().build(program);
  129. EXPECT_TRUE(model->getType() == storm::models::ModelType::Mdp);
  130. std::shared_ptr<storm::models::symbolic::Mdp<storm::dd::DdType::Sylvan>> mdp = model->as<storm::models::symbolic::Mdp<storm::dd::DdType::Sylvan>>();
  131. EXPECT_EQ(169ul, mdp->getNumberOfStates());
  132. EXPECT_EQ(436ul, mdp->getNumberOfTransitions());
  133. EXPECT_EQ(254ul, mdp->getNumberOfChoices());
  134. modelDescription = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/leader3.nm");
  135. program = modelDescription.preprocess().asPrismProgram();
  136. model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::Sylvan>().build(program);
  137. EXPECT_TRUE(model->getType() == storm::models::ModelType::Mdp);
  138. mdp = model->as<storm::models::symbolic::Mdp<storm::dd::DdType::Sylvan>>();
  139. EXPECT_EQ(364ul, mdp->getNumberOfStates());
  140. EXPECT_EQ(654ul, mdp->getNumberOfTransitions());
  141. EXPECT_EQ(573ul, mdp->getNumberOfChoices());
  142. modelDescription = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/coin2-2.nm");
  143. program = modelDescription.preprocess().asPrismProgram();
  144. model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::Sylvan>().build(program);
  145. EXPECT_TRUE(model->getType() == storm::models::ModelType::Mdp);
  146. mdp = model->as<storm::models::symbolic::Mdp<storm::dd::DdType::Sylvan>>();
  147. EXPECT_EQ(272ul, mdp->getNumberOfStates());
  148. EXPECT_EQ(492ul, mdp->getNumberOfTransitions());
  149. EXPECT_EQ(400ul, mdp->getNumberOfChoices());
  150. modelDescription = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/csma2-2.nm");
  151. program = modelDescription.preprocess().asPrismProgram();
  152. model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::Sylvan>().build(program);
  153. EXPECT_TRUE(model->getType() == storm::models::ModelType::Mdp);
  154. mdp = model->as<storm::models::symbolic::Mdp<storm::dd::DdType::Sylvan>>();
  155. EXPECT_EQ(1038ul, mdp->getNumberOfStates());
  156. EXPECT_EQ(1282ul, mdp->getNumberOfTransitions());
  157. EXPECT_EQ(1054ul, mdp->getNumberOfChoices());
  158. modelDescription = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/firewire3-0.5.nm");
  159. program = modelDescription.preprocess().asPrismProgram();
  160. model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::Sylvan>().build(program);
  161. EXPECT_TRUE(model->getType() == storm::models::ModelType::Mdp);
  162. mdp = model->as<storm::models::symbolic::Mdp<storm::dd::DdType::Sylvan>>();
  163. EXPECT_EQ(4093ul, mdp->getNumberOfStates());
  164. EXPECT_EQ(5585ul, mdp->getNumberOfTransitions());
  165. EXPECT_EQ(5519ul, mdp->getNumberOfChoices());
  166. modelDescription = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/wlan0-2-2.nm");
  167. program = modelDescription.preprocess().asPrismProgram();
  168. model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::Sylvan>().build(program);
  169. EXPECT_TRUE(model->getType() == storm::models::ModelType::Mdp);
  170. mdp = model->as<storm::models::symbolic::Mdp<storm::dd::DdType::Sylvan>>();
  171. EXPECT_EQ(37ul, mdp->getNumberOfStates());
  172. EXPECT_EQ(59ul, mdp->getNumberOfTransitions());
  173. EXPECT_EQ(59ul, mdp->getNumberOfChoices());
  174. }
  175. TEST(DdPrismModelBuilderTest_Cudd, Mdp) {
  176. storm::storage::SymbolicModelDescription modelDescription = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/two_dice.nm");
  177. storm::prism::Program program = modelDescription.preprocess().asPrismProgram();
  178. std::shared_ptr<storm::models::symbolic::Model<storm::dd::DdType::CUDD>> model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::CUDD>().build(program);
  179. EXPECT_TRUE(model->getType() == storm::models::ModelType::Mdp);
  180. std::shared_ptr<storm::models::symbolic::Mdp<storm::dd::DdType::CUDD>> mdp = model->as<storm::models::symbolic::Mdp<storm::dd::DdType::CUDD>>();
  181. EXPECT_EQ(169ul, mdp->getNumberOfStates());
  182. EXPECT_EQ(436ul, mdp->getNumberOfTransitions());
  183. EXPECT_EQ(254ul, mdp->getNumberOfChoices());
  184. modelDescription = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/leader3.nm");
  185. program = modelDescription.preprocess().asPrismProgram();
  186. model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::CUDD>().build(program);
  187. EXPECT_TRUE(model->getType() == storm::models::ModelType::Mdp);
  188. mdp = model->as<storm::models::symbolic::Mdp<storm::dd::DdType::CUDD>>();
  189. EXPECT_EQ(364ul, mdp->getNumberOfStates());
  190. EXPECT_EQ(654ul, mdp->getNumberOfTransitions());
  191. EXPECT_EQ(573ul, mdp->getNumberOfChoices());
  192. modelDescription = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/coin2-2.nm");
  193. program = modelDescription.preprocess().asPrismProgram();
  194. model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::CUDD>().build(program);
  195. EXPECT_TRUE(model->getType() == storm::models::ModelType::Mdp);
  196. mdp = model->as<storm::models::symbolic::Mdp<storm::dd::DdType::CUDD>>();
  197. EXPECT_EQ(272ul, mdp->getNumberOfStates());
  198. EXPECT_EQ(492ul, mdp->getNumberOfTransitions());
  199. EXPECT_EQ(400ul, mdp->getNumberOfChoices());
  200. modelDescription = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/csma2-2.nm");
  201. program = modelDescription.preprocess().asPrismProgram();
  202. model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::CUDD>().build(program);
  203. EXPECT_TRUE(model->getType() == storm::models::ModelType::Mdp);
  204. mdp = model->as<storm::models::symbolic::Mdp<storm::dd::DdType::CUDD>>();
  205. EXPECT_EQ(1038ul, mdp->getNumberOfStates());
  206. EXPECT_EQ(1282ul, mdp->getNumberOfTransitions());
  207. EXPECT_EQ(1054ul, mdp->getNumberOfChoices());
  208. modelDescription = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/firewire3-0.5.nm");
  209. program = modelDescription.preprocess().asPrismProgram();
  210. model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::CUDD>().build(program);
  211. EXPECT_TRUE(model->getType() == storm::models::ModelType::Mdp);
  212. mdp = model->as<storm::models::symbolic::Mdp<storm::dd::DdType::CUDD>>();
  213. EXPECT_EQ(4093ul, mdp->getNumberOfStates());
  214. EXPECT_EQ(5585ul, mdp->getNumberOfTransitions());
  215. EXPECT_EQ(5519ul, mdp->getNumberOfChoices());
  216. modelDescription = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/wlan0-2-2.nm");
  217. program = modelDescription.preprocess().asPrismProgram();
  218. model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::CUDD>().build(program);
  219. EXPECT_TRUE(model->getType() == storm::models::ModelType::Mdp);
  220. mdp = model->as<storm::models::symbolic::Mdp<storm::dd::DdType::CUDD>>();
  221. EXPECT_EQ(37ul, mdp->getNumberOfStates());
  222. EXPECT_EQ(59ul, mdp->getNumberOfTransitions());
  223. EXPECT_EQ(59ul, mdp->getNumberOfChoices());
  224. }
  225. TEST(DdPrismModelBuilderTest_Sylvan, Composition) {
  226. storm::storage::SymbolicModelDescription modelDescription = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/system_composition.nm");
  227. storm::prism::Program program = modelDescription.preprocess().asPrismProgram();
  228. std::shared_ptr<storm::models::symbolic::Model<storm::dd::DdType::Sylvan>> model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::Sylvan>().build(program);
  229. EXPECT_TRUE(model->getType() == storm::models::ModelType::Mdp);
  230. std::shared_ptr<storm::models::symbolic::Mdp<storm::dd::DdType::Sylvan>> mdp = model->as<storm::models::symbolic::Mdp<storm::dd::DdType::Sylvan>>();
  231. EXPECT_EQ(21ul, mdp->getNumberOfStates());
  232. EXPECT_EQ(61ul, mdp->getNumberOfTransitions());
  233. EXPECT_EQ(61ul, mdp->getNumberOfChoices());
  234. modelDescription = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/system_composition2.nm");
  235. program = modelDescription.preprocess().asPrismProgram();
  236. model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::Sylvan>().build(program);
  237. EXPECT_TRUE(model->getType() == storm::models::ModelType::Mdp);
  238. mdp = model->as<storm::models::symbolic::Mdp<storm::dd::DdType::Sylvan>>();
  239. EXPECT_EQ(8ul, mdp->getNumberOfStates());
  240. EXPECT_EQ(21ul, mdp->getNumberOfTransitions());
  241. EXPECT_EQ(21ul, mdp->getNumberOfChoices());
  242. }
  243. TEST(DdPrismModelBuilderTest_Cudd, Composition) {
  244. storm::storage::SymbolicModelDescription modelDescription = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/system_composition.nm");
  245. storm::prism::Program program = modelDescription.preprocess().asPrismProgram();
  246. std::shared_ptr<storm::models::symbolic::Model<storm::dd::DdType::CUDD>> model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::CUDD>().build(program);
  247. EXPECT_TRUE(model->getType() == storm::models::ModelType::Mdp);
  248. std::shared_ptr<storm::models::symbolic::Mdp<storm::dd::DdType::CUDD>> mdp = model->as<storm::models::symbolic::Mdp<storm::dd::DdType::CUDD>>();
  249. EXPECT_EQ(21ul, mdp->getNumberOfStates());
  250. EXPECT_EQ(61ul, mdp->getNumberOfTransitions());
  251. EXPECT_EQ(61ul, mdp->getNumberOfChoices());
  252. modelDescription = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/system_composition2.nm");
  253. program = modelDescription.preprocess().asPrismProgram();
  254. model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::CUDD>().build(program);
  255. EXPECT_TRUE(model->getType() == storm::models::ModelType::Mdp);
  256. mdp = model->as<storm::models::symbolic::Mdp<storm::dd::DdType::CUDD>>();
  257. EXPECT_EQ(8ul, mdp->getNumberOfStates());
  258. EXPECT_EQ(21ul, mdp->getNumberOfTransitions());
  259. EXPECT_EQ(21ul, mdp->getNumberOfChoices());
  260. }