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
156 program = storm::parser::PrismParser::parse(STORM_TEST_RESOURCES_DIR "/pomdp/globalvars.prism");
158
159 program = storm::parser::PrismParser::parse(STORM_TEST_RESOURCES_DIR "/pomdp/maze2.prism");
160 program = storm::utility::prism::preprocess(program, "sl=0.4");
162
163 program = storm::parser::PrismParser::parse(STORM_TEST_RESOURCES_DIR "/pomdp/refuel.prism");
164 program = storm::utility::prism::preprocess(program, "N=5");
166}
167
169 storm::prism::Program program = storm::parser::PrismParser::parse(STORM_TEST_RESOURCES_DIR "/imdp/robot.prism");
170 program = storm::utility::prism::preprocess(program, "delta=0.2");
171 std::shared_ptr<storm::models::sparse::Model<storm::Interval>> model = storm::builder::ExplicitModelBuilder<storm::Interval>(program).build();
172
173 program = storm::parser::PrismParser::parse(STORM_TEST_RESOURCES_DIR "/imdp/coin2.prism");
174 program = storm::utility::prism::preprocess(program, "K=2,bias1=0.1");
176}
177
179 storm::prism::Program program = storm::parser::PrismParser::parse(STORM_TEST_RESOURCES_DIR "/smg/action_labels.prism");
180 program = storm::utility::prism::preprocess(program, "");
181 std::shared_ptr<storm::models::sparse::Model<double>> model = storm::builder::ExplicitModelBuilder<double>(program).build();
182 EXPECT_EQ(3ul, model->getNumberOfStates());
183 EXPECT_EQ(3ul, model->getNumberOfChoices());
184 EXPECT_EQ(6ul, model->getNumberOfTransitions());
185}
186
188 storm::prism::Program program = storm::parser::PrismParser::parse(STORM_TEST_RESOURCES_DIR "/mdp/system_composition.nm");
189
190 STORM_SILENT_ASSERT_THROW(storm::builder::ExplicitModelBuilder<double>(program).build(), storm::exceptions::WrongFormatException);
191}
192
194 storm::storage::SymbolicModelDescription modelDescription = storm::parser::PrismParser::parse(STORM_TEST_RESOURCES_DIR "/mdp/unbounded.nm");
195 storm::prism::Program program = modelDescription.preprocess("N=7").asPrismProgram();
196 STORM_SILENT_ASSERT_THROW(storm::builder::ExplicitModelBuilder<double>(program).build(), storm::exceptions::WrongFormatException);
197}
198
199TEST_F(ExplicitPrismModelBuilderTest, ExportExplicitLookup) {
200 storm::prism::Program program = storm::parser::PrismParser::parse(STORM_TEST_RESOURCES_DIR "/dtmc/die.pm");
202 generatorOptions.setBuildAllLabels();
203 auto builder = storm::builder::ExplicitModelBuilder<double>(program, generatorOptions);
204 std::shared_ptr<storm::models::sparse::Model<double>> model = builder.build();
205 auto lookup = builder.exportExplicitStateLookup();
206 auto svar = program.getModules()[0].getIntegerVariable("s").getExpressionVariable();
207 auto dvar = program.getModules()[0].getIntegerVariable("d").getExpressionVariable();
208 auto& manager = program.getManager();
209 EXPECT_EQ(model->getNumberOfStates(), lookup.lookup({{svar, manager.integer(1)}, {dvar, manager.integer(2)}}));
210 EXPECT_TRUE(model->getNumberOfStates() > lookup.lookup({{svar, manager.integer(7)}, {dvar, manager.integer(2)}}));
211 EXPECT_EQ(1ul, model->getLabelsOfState(lookup.lookup({{svar, manager.integer(7)}, {dvar, manager.integer(2)}})).count("two"));
212}
213
215 return true;
216}
217
219 return false;
220}
221
223 return actionIndex <= 1;
224}
225
227 storm::prism::Program program = storm::parser::PrismParser::parse(STORM_TEST_RESOURCES_DIR "/mdp/die_selection.nm");
229 generatorOptions.setBuildAllLabels();
230 generatorOptions.setBuildChoiceLabels();
231 std::shared_ptr<storm::generator::StateValuationFunctionMask<double>> mask_object =
232 std::make_shared<storm::generator::StateValuationFunctionMask<double>>(trivial_true_mask);
233 std::shared_ptr<storm::generator::PrismNextStateGenerator<double>> generator =
234 std::make_shared<storm::generator::PrismNextStateGenerator<double>>(program, generatorOptions, mask_object);
235 auto builder = storm::builder::ExplicitModelBuilder<double>(generator);
236
237 std::shared_ptr<storm::models::sparse::Model<double>> model = builder.build();
238 EXPECT_EQ(13ul, model->getNumberOfStates());
239 EXPECT_EQ(48ul, model->getNumberOfTransitions());
240
241 mask_object = std::make_shared<storm::generator::StateValuationFunctionMask<double>>(trivial_false_mask);
242 generator = std::make_shared<storm::generator::PrismNextStateGenerator<double>>(program, generatorOptions, mask_object);
244
245 model = builder.build();
246 EXPECT_EQ(1ul, model->getNumberOfStates());
247 EXPECT_EQ(1ul, model->getNumberOfTransitions());
248
249 mask_object = std::make_shared<storm::generator::StateValuationFunctionMask<double>>(only_first_action_mask);
250 generator = std::make_shared<storm::generator::PrismNextStateGenerator<double>>(program, generatorOptions, mask_object);
252
253 model = builder.build();
254 EXPECT_EQ(13ul, model->getNumberOfStates());
255 EXPECT_EQ(20ul, model->getNumberOfTransitions());
256}
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:19
#define STORM_SILENT_ASSERT_THROW(statement, expected_exception)
Definition storm_gtest.h:26