Storm 1.11.1.1
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
ExplicitPrismModelBuilderTest.cpp
Go to the documentation of this file.
1#include "storm-config.h"
2#include "test/storm_gtest.h"
3
11
12class ExplicitPrismModelBuilderTest : public ::testing::Test {
13 protected:
14 void SetUp() override {
15#ifndef STORM_HAVE_Z3
16 GTEST_SKIP() << "Z3 not available.";
17#endif
18 }
19};
20
22 storm::prism::Program program = storm::parser::PrismParser::parse(STORM_TEST_RESOURCES_DIR "/dtmc/die.pm");
23
24 std::shared_ptr<storm::models::sparse::Model<double>> model = storm::builder::ExplicitModelBuilder<double>(program).build();
25 EXPECT_EQ(13ul, model->getNumberOfStates());
26 EXPECT_EQ(20ul, model->getNumberOfTransitions());
27
28 program = storm::parser::PrismParser::parse(STORM_TEST_RESOURCES_DIR "/dtmc/brp-16-2.pm");
30 EXPECT_EQ(677ul, model->getNumberOfStates());
31 EXPECT_EQ(867ul, model->getNumberOfTransitions());
32
33 program = storm::parser::PrismParser::parse(STORM_TEST_RESOURCES_DIR "/dtmc/crowds-5-5.pm");
35 EXPECT_EQ(8607ul, model->getNumberOfStates());
36 EXPECT_EQ(15113ul, model->getNumberOfTransitions());
37
38 program = storm::parser::PrismParser::parse(STORM_TEST_RESOURCES_DIR "/dtmc/leader-3-5.pm");
40 EXPECT_EQ(273ul, model->getNumberOfStates());
41 EXPECT_EQ(397ul, model->getNumberOfTransitions());
42
43 program = storm::parser::PrismParser::parse(STORM_TEST_RESOURCES_DIR "/dtmc/nand-5-2.pm");
45 EXPECT_EQ(1728ul, model->getNumberOfStates());
46 EXPECT_EQ(2505ul, model->getNumberOfTransitions());
47}
48
50 storm::prism::Program program = storm::parser::PrismParser::parse(STORM_TEST_RESOURCES_DIR "/ctmc/cluster2.sm", true);
51
52 std::shared_ptr<storm::models::sparse::Model<double>> model = storm::builder::ExplicitModelBuilder<double>(program).build();
53 EXPECT_EQ(276ul, model->getNumberOfStates());
54 EXPECT_EQ(1120ul, model->getNumberOfTransitions());
55
56 program = storm::parser::PrismParser::parse(STORM_TEST_RESOURCES_DIR "/ctmc/embedded2.sm", true);
58 EXPECT_EQ(3478ul, model->getNumberOfStates());
59 EXPECT_EQ(14639ul, model->getNumberOfTransitions());
60
61 program = storm::parser::PrismParser::parse(STORM_TEST_RESOURCES_DIR "/ctmc/polling2.sm", true);
63 EXPECT_EQ(12ul, model->getNumberOfStates());
64 EXPECT_EQ(22ul, model->getNumberOfTransitions());
65
66 program = storm::parser::PrismParser::parse(STORM_TEST_RESOURCES_DIR "/ctmc/fms2.sm", true);
68 EXPECT_EQ(810ul, model->getNumberOfStates());
69 EXPECT_EQ(3699ul, model->getNumberOfTransitions());
70
71 program = storm::parser::PrismParser::parse(STORM_TEST_RESOURCES_DIR "/ctmc/tandem5.sm", true);
73 EXPECT_EQ(66ul, model->getNumberOfStates());
74 EXPECT_EQ(189ul, model->getNumberOfTransitions());
75}
76
78 storm::prism::Program program = storm::parser::PrismParser::parse(STORM_TEST_RESOURCES_DIR "/mdp/two_dice.nm");
79 std::shared_ptr<storm::models::sparse::Model<double>> model = storm::builder::ExplicitModelBuilder<double>(program).build();
80 EXPECT_EQ(169ul, model->getNumberOfStates());
81 EXPECT_EQ(436ul, model->getNumberOfTransitions());
82
83 program = storm::parser::PrismParser::parse(STORM_TEST_RESOURCES_DIR "/mdp/leader3.nm");
85 EXPECT_EQ(364ul, model->getNumberOfStates());
86 EXPECT_EQ(654ul, model->getNumberOfTransitions());
87
88 program = storm::parser::PrismParser::parse(STORM_TEST_RESOURCES_DIR "/mdp/coin2-2.nm");
90 EXPECT_EQ(272ul, model->getNumberOfStates());
91 EXPECT_EQ(492ul, model->getNumberOfTransitions());
92
93 program = storm::parser::PrismParser::parse(STORM_TEST_RESOURCES_DIR "/mdp/csma2-2.nm");
95 EXPECT_EQ(1038ul, model->getNumberOfStates());
96 EXPECT_EQ(1282ul, model->getNumberOfTransitions());
97
98 program = storm::parser::PrismParser::parse(STORM_TEST_RESOURCES_DIR "/mdp/firewire3-0.5.nm");
100 EXPECT_EQ(4093ul, model->getNumberOfStates());
101 EXPECT_EQ(5585ul, model->getNumberOfTransitions());
102
103 program = storm::parser::PrismParser::parse(STORM_TEST_RESOURCES_DIR "/mdp/wlan0-2-2.nm");
105 EXPECT_EQ(37ul, model->getNumberOfStates());
106 EXPECT_EQ(59ul, model->getNumberOfTransitions());
107
108 storm::storage::SymbolicModelDescription modelDescription = storm::parser::PrismParser::parse(STORM_TEST_RESOURCES_DIR "/mdp/unbounded.nm");
109 program = modelDescription.preprocess("N=-7").asPrismProgram();
111 EXPECT_EQ(9ul, model->getNumberOfStates());
112 EXPECT_EQ(9ul, model->getNumberOfTransitions());
113
114 program = storm::parser::PrismParser::parse(STORM_TEST_RESOURCES_DIR "/mdp/enumerate_init.prism");
116 EXPECT_EQ(36ul, model->getNumberOfStates());
117 EXPECT_EQ(66ul, model->getNumberOfTransitions());
118 EXPECT_EQ(36ul, model->getInitialStates().getNumberOfSetBits());
119
120 program = storm::parser::PrismParser::parse(STORM_TEST_RESOURCES_DIR "/mdp/sync.nm");
122 EXPECT_EQ(5ul, model->getNumberOfStates());
123 EXPECT_EQ(24ul, model->getNumberOfTransitions());
124 EXPECT_EQ(12ul, model->getNumberOfChoices());
125}
126
128 storm::prism::Program program = storm::parser::PrismParser::parse(STORM_TEST_RESOURCES_DIR "/ma/simple.ma");
129
130 std::shared_ptr<storm::models::sparse::Model<double>> model = storm::builder::ExplicitModelBuilder<double>(program).build();
131 EXPECT_EQ(5ul, model->getNumberOfStates());
132 EXPECT_EQ(8ul, model->getNumberOfTransitions());
133 ASSERT_TRUE(model->isOfType(storm::models::ModelType::MarkovAutomaton));
135
136 program = storm::parser::PrismParser::parse(STORM_TEST_RESOURCES_DIR "/ma/hybrid_states.ma");
138 EXPECT_EQ(5ul, model->getNumberOfStates());
139 EXPECT_EQ(13ul, model->getNumberOfTransitions());
140 ASSERT_TRUE(model->isOfType(storm::models::ModelType::MarkovAutomaton));
142
143 program = storm::parser::PrismParser::parse(STORM_TEST_RESOURCES_DIR "/ma/stream2.ma");
145 EXPECT_EQ(12ul, model->getNumberOfStates());
146 EXPECT_EQ(14ul, model->getNumberOfTransitions());
147 ASSERT_TRUE(model->isOfType(storm::models::ModelType::MarkovAutomaton));
149}
150
152 storm::prism::Program program = storm::parser::PrismParser::parse(STORM_TEST_RESOURCES_DIR "/pomdp/simple.prism");
153 program = storm::utility::prism::preprocess(program, "slippery=0.4");
154 std::shared_ptr<storm::models::sparse::Model<double>> model = storm::builder::ExplicitModelBuilder<double>(program).build();
155 EXPECT_EQ(7ul, model->getNumberOfStates());
156 EXPECT_EQ(17ul, model->getNumberOfTransitions());
157
158 program = storm::parser::PrismParser::parse(STORM_TEST_RESOURCES_DIR "/pomdp/globalvars.prism");
160 EXPECT_EQ(3ul, model->getNumberOfStates());
161 EXPECT_EQ(6ul, model->getNumberOfTransitions());
162
163 program = storm::parser::PrismParser::parse(STORM_TEST_RESOURCES_DIR "/pomdp/maze2.prism");
164 program = storm::utility::prism::preprocess(program, "sl=0.4");
166 EXPECT_EQ(15ul, model->getNumberOfStates());
167 EXPECT_EQ(91ul, model->getNumberOfTransitions());
168
169 program = storm::parser::PrismParser::parse(STORM_TEST_RESOURCES_DIR "/pomdp/refuel.prism");
170 program = storm::utility::prism::preprocess(program, "N=5");
172 EXPECT_EQ(126ul, model->getNumberOfStates());
173 EXPECT_EQ(547ul, model->getNumberOfTransitions());
174}
175
177 storm::prism::Program program = storm::parser::PrismParser::parse(STORM_TEST_RESOURCES_DIR "/imdp/robot.prism");
178 program = storm::utility::prism::preprocess(program, "delta=0.2");
179 std::shared_ptr<storm::models::sparse::Model<storm::Interval>> model = storm::builder::ExplicitModelBuilder<storm::Interval>(program).build();
180 EXPECT_EQ(6ul, model->getNumberOfStates());
181 EXPECT_EQ(17ul, model->getNumberOfTransitions());
182
183 program = storm::parser::PrismParser::parse(STORM_TEST_RESOURCES_DIR "/imdp/coin2.prism");
184 program = storm::utility::prism::preprocess(program, "K=2,bias1=0.1");
186 EXPECT_EQ(272ul, model->getNumberOfStates());
187 EXPECT_EQ(492ul, model->getNumberOfTransitions());
188}
189
191 storm::prism::Program program = storm::parser::PrismParser::parse(STORM_TEST_RESOURCES_DIR "/smg/action_labels.prism");
192 program = storm::utility::prism::preprocess(program, "");
193 std::shared_ptr<storm::models::sparse::Model<double>> model = storm::builder::ExplicitModelBuilder<double>(program).build();
194 EXPECT_EQ(3ul, model->getNumberOfStates());
195 EXPECT_EQ(3ul, model->getNumberOfChoices());
196 EXPECT_EQ(6ul, model->getNumberOfTransitions());
197}
198
200 storm::prism::Program program = storm::parser::PrismParser::parse(STORM_TEST_RESOURCES_DIR "/mdp/system_composition.nm");
201
202 STORM_SILENT_ASSERT_THROW(storm::builder::ExplicitModelBuilder<double>(program).build(), storm::exceptions::WrongFormatException);
203}
204
206 storm::storage::SymbolicModelDescription modelDescription = storm::parser::PrismParser::parse(STORM_TEST_RESOURCES_DIR "/mdp/unbounded.nm");
207 storm::prism::Program program = modelDescription.preprocess("N=7").asPrismProgram();
208 STORM_SILENT_ASSERT_THROW(storm::builder::ExplicitModelBuilder<double>(program).build(), storm::exceptions::WrongFormatException);
209}
210
211TEST_F(ExplicitPrismModelBuilderTest, ExportExplicitLookup) {
212 storm::prism::Program program = storm::parser::PrismParser::parse(STORM_TEST_RESOURCES_DIR "/dtmc/die.pm");
214 generatorOptions.setBuildAllLabels();
215 auto builder = storm::builder::ExplicitModelBuilder<double>(program, generatorOptions);
216 std::shared_ptr<storm::models::sparse::Model<double>> model = builder.build();
217 auto lookup = builder.exportExplicitStateLookup();
218 auto svar = program.getModules()[0].getIntegerVariable("s").getExpressionVariable();
219 auto dvar = program.getModules()[0].getIntegerVariable("d").getExpressionVariable();
220 auto& manager = program.getManager();
221 EXPECT_EQ(model->getNumberOfStates(), lookup.lookup({{svar, manager.integer(1)}, {dvar, manager.integer(2)}}));
222 EXPECT_TRUE(model->getNumberOfStates() > lookup.lookup({{svar, manager.integer(7)}, {dvar, manager.integer(2)}}));
223 EXPECT_EQ(1ul, model->getLabelsOfState(lookup.lookup({{svar, manager.integer(7)}, {dvar, manager.integer(2)}})).count("two"));
224}
225
227 return true;
228}
229
231 return false;
232}
233
235 return actionIndex <= 1;
236}
237
239 storm::prism::Program program = storm::parser::PrismParser::parse(STORM_TEST_RESOURCES_DIR "/mdp/die_selection.nm");
241 generatorOptions.setBuildAllLabels();
242 generatorOptions.setBuildChoiceLabels();
243 std::shared_ptr<storm::generator::StateValuationFunctionMask<double>> mask_object =
244 std::make_shared<storm::generator::StateValuationFunctionMask<double>>(trivial_true_mask);
245 std::shared_ptr<storm::generator::PrismNextStateGenerator<double>> generator =
246 std::make_shared<storm::generator::PrismNextStateGenerator<double>>(program, generatorOptions, mask_object);
247 auto builder = storm::builder::ExplicitModelBuilder<double>(generator);
248
249 std::shared_ptr<storm::models::sparse::Model<double>> model = builder.build();
250 EXPECT_EQ(13ul, model->getNumberOfStates());
251 EXPECT_EQ(48ul, model->getNumberOfTransitions());
252
253 mask_object = std::make_shared<storm::generator::StateValuationFunctionMask<double>>(trivial_false_mask);
254 generator = std::make_shared<storm::generator::PrismNextStateGenerator<double>>(program, generatorOptions, mask_object);
256
257 model = builder.build();
258 EXPECT_EQ(1ul, model->getNumberOfStates());
259 EXPECT_EQ(1ul, model->getNumberOfTransitions());
260
261 mask_object = std::make_shared<storm::generator::StateValuationFunctionMask<double>>(only_first_action_mask);
262 generator = std::make_shared<storm::generator::PrismNextStateGenerator<double>>(program, generatorOptions, mask_object);
264
265 model = builder.build();
266 EXPECT_EQ(13ul, model->getNumberOfStates());
267 EXPECT_EQ(20ul, model->getNumberOfTransitions());
268}
TEST_F(ExplicitPrismModelBuilderTest, Dtmc)
bool trivial_false_mask(storm::expressions::SimpleValuation const &, uint64_t)
bool trivial_true_mask(storm::expressions::SimpleValuation const &, uint64_t)
bool only_first_action_mask(storm::expressions::SimpleValuation const &, uint64_t actionIndex)
BuilderOptions & setBuildAllLabels(bool newValue=true)
Should all reward models be built? If not set, only required reward models are build.
BuilderOptions & setBuildChoiceLabels(bool newValue=true)
Should the choice labels be built?
std::shared_ptr< storm::models::sparse::Model< ValueType, RewardModelType > > build()
Convert the program given at construction time to an abstract model.
A simple implementation of the valuation interface.
This class represents a discrete-time Markov chain.
Definition Dtmc.h:13
This class represents a Markov automaton.
storm::storage::BitVector const & getMarkovianStates() const
Retrieves the set of Markovian states of the model.
This class represents a (discrete-time) Markov decision process.
Definition Mdp.h:13
static storm::prism::Program parse(std::string const &filename, bool prismCompatability=false)
Parses the given file into the PRISM storage classes assuming it complies with the PRISM syntax.
std::vector< Module > const & getModules() const
Retrieves all modules of the program.
Definition Program.cpp:629
storm::expressions::ExpressionManager & getManager() const
Retrieves the manager responsible for the expressions of this program.
Definition Program.cpp:2378
uint64_t getNumberOfSetBits() const
Returns the number of bits that are set to true in this bit vector.
storm::prism::Program const & asPrismProgram() const
SymbolicModelDescription preprocess(std::string const &constantDefinitionString="") const
std::pair< storm::RationalNumber, storm::RationalNumber > count(std::vector< storm::storage::BitVector > const &origSets, std::vector< storm::storage::BitVector > const &intersects, std::vector< storm::storage::BitVector > const &intersectsInfo, storm::RationalNumber val, bool plus, uint64_t remdepth)
storm::prism::Program preprocess(storm::prism::Program const &program, std::map< storm::expressions::Variable, storm::expressions::Expression > const &constantDefinitions)
Definition prism.cpp:13
#define STORM_SILENT_ASSERT_THROW(statement, expected_exception)
Definition storm_gtest.h:26