45 GTEST_SKIP() <<
"Z3 not available.";
53 std::map<storm::expressions::Variable, storm::expressions::Expression> consts,
double expectedValue) {
55 properties[0] = properties[0].
substitute(consts);
60 auto explicitModel = storm::api::buildSparseModel<double>(model, options)->template as<Dtmc>();
64 auto checkResult = storm::api::verifyWithSparseEngine<double>(env, explicitModel, task);
65 auto quantResult = checkResult->asExplicitQuantitativeCheckResult<
double>();
67 auto initialStates = explicitModel->getInitialStates();
68 EXPECT_EQ(1u, initialStates.getNumberOfSetBits());
69 for (
auto state = initialStates.begin(); state != initialStates.end(); ++state) {
89 auto property =
storm::jani::Property(
"steady_state", formula, std::set<storm::expressions::Variable>());
95 auto property =
storm::jani::Property(
"generally", formula, std::set<storm::expressions::Variable>());
108 auto property =
storm::jani::Property(
"reachability", formula, std::set<storm::expressions::Variable>());
114 auto property =
storm::jani::Property(
"reward_reachability", formula, std::set<storm::expressions::Variable>());
123 std::vector<storm::jani::Property> empty_properties;
133 eliminator.eliminate();
134 auto result = eliminator.getResult();
135 EXPECT_EQ(1u, result.getNumberOfAutomata());
152 eliminator.scheduler.addAction(std::make_unique<UnfoldAction>(
"main",
"s"));
153 eliminator.scheduler.addAction(std::make_unique<EliminateAction>(
"main",
"l_s_1"));
154 eliminator.eliminate();
155 auto result = eliminator.getResult();
156 EXPECT_EQ(1u, result.getNumberOfAutomata());
157 checkModel(result, modelAndProps.second, std::map<storm::expressions::Variable, storm::expressions::Expression>(), 0.5);
175 EXPECT_FALSE(session.hasLoops(
"main",
"l_s_0"));
176 EXPECT_TRUE(session.hasLoops(
"main",
"l_s_1"));
177 EXPECT_TRUE(session.hasLoops(
"main",
"l_s_2"));
178 EXPECT_FALSE(session.hasLoops(
"main",
"l_s_3"));
179 EXPECT_TRUE(session.hasLoops(
"main",
"l_s_4"));
180 EXPECT_TRUE(session.hasLoops(
"main",
"l_s_5"));
181 EXPECT_FALSE(session.hasLoops(
"main",
"l_s_6"));
198 EXPECT_TRUE(session.computeIsPartOfProp(
"main",
"l"));
203 EXPECT_FALSE(session.computeIsPartOfProp(
"main",
"l_x_0"));
204 EXPECT_TRUE(session.computeIsPartOfProp(
"main",
"l_x_1"));
205 EXPECT_FALSE(session.computeIsPartOfProp(
"main",
"l_x_2"));
210 EXPECT_TRUE(session.computeIsPartOfProp(
"main",
"l_x_1_y_4"));
211 EXPECT_TRUE(session.computeIsPartOfProp(
"main",
"l_x_1_y_3"));
212 EXPECT_FALSE(session.computeIsPartOfProp(
"main",
"l_x_2_y_4"));
217 EXPECT_FALSE(session.computeIsPartOfProp(
"main",
"l_x_0_y_2_z_3"));
218 EXPECT_FALSE(session.computeIsPartOfProp(
"main",
"l_x_0_y_2_z_1"));
219 EXPECT_FALSE(session.computeIsPartOfProp(
"main",
"l_x_0_y_5_z_3"));
220 EXPECT_FALSE(session.computeIsPartOfProp(
"main",
"l_x_0_y_5_z_1"));
221 EXPECT_FALSE(session.computeIsPartOfProp(
"main",
"l_x_1_y_2_z_3"));
222 EXPECT_TRUE(session.computeIsPartOfProp(
"main",
"l_x_1_y_2_z_1"));
223 EXPECT_TRUE(session.computeIsPartOfProp(
"main",
"l_x_1_y_5_z_3"));
224 EXPECT_TRUE(session.computeIsPartOfProp(
"main",
"l_x_1_y_5_z_1"));
225 EXPECT_TRUE(session.computeIsPartOfProp(
"main",
"l_x_1_y_4_z_1"));
226 EXPECT_TRUE(session.computeIsPartOfProp(
"main",
"l_x_1_y_5_z_0"));
241 EXPECT_TRUE(session.isPossiblyInitial(
"main",
"l"));
246 EXPECT_FALSE(session.isPossiblyInitial(
"main",
"l_x_0"));
247 EXPECT_FALSE(session.isPossiblyInitial(
"main",
"l_x_1"));
248 EXPECT_TRUE(session.isPossiblyInitial(
"main",
"l_x_2"));
253 EXPECT_TRUE(session.isPossiblyInitial(
"main",
"l_x_2_y_-1"));
254 EXPECT_FALSE(session.isPossiblyInitial(
"main",
"l_x_2_y_0"));
255 EXPECT_FALSE(session.isPossiblyInitial(
"main",
"l_x_0_y_0"));
256 EXPECT_FALSE(session.isPossiblyInitial(
"main",
"l_x_0_y_-1"));
261 EXPECT_TRUE(session.isPossiblyInitial(
"main",
"l_x_2_y_-1_z_0"));
262 EXPECT_FALSE(session.isPossiblyInitial(
"main",
"l_x_2_y_-1_z_1"));
263 EXPECT_FALSE(session.isPossiblyInitial(
"main",
"l_x_2_y_0_z_0"));
264 EXPECT_FALSE(session.isPossiblyInitial(
"main",
"l_x_1_y_-1_z_0"));
269 EXPECT_TRUE(session.isPossiblyInitial(
"main",
"l_x_2_y_-1_z_0_a_true"));
270 EXPECT_FALSE(session.isPossiblyInitial(
"main",
"l_x_2_y_-1_z_0_a_false"));
271 EXPECT_FALSE(session.isPossiblyInitial(
"main",
"l_x_0_y_-1_z_0_a_true"));
276 EXPECT_TRUE(session.isPossiblyInitial(
"main",
"l_x_2_y_-1_z_0_a_true_b_false"));
277 EXPECT_FALSE(session.isPossiblyInitial(
"main",
"l_x_2_y_-1_z_0_a_true_b_true"));
278 EXPECT_FALSE(session.isPossiblyInitial(
"main",
"l_x_2_y_0_z_0_a_true_b_true"));
283 EXPECT_TRUE(session.isPossiblyInitial(
"main",
"l_x_2_y_-1_z_0_a_true_b_false_c_false"));
284 EXPECT_FALSE(session.isPossiblyInitial(
"main",
"l_x_2_y_-1_z_0_a_true_b_false_c_true"));
299 EXPECT_FALSE(session.isEliminable(
"main",
"l"));
304 EXPECT_FALSE(session.isEliminable(
"main",
"l_s_0"));
305 EXPECT_FALSE(session.isEliminable(
"main",
"l_s_1"));
306 EXPECT_TRUE(session.isEliminable(
"main",
"l_s_2"));
307 EXPECT_TRUE(session.isEliminable(
"main",
"l_s_3"));
308 EXPECT_FALSE(session.isEliminable(
"main",
"l_s_4"));
309 EXPECT_FALSE(session.isEliminable(
"main",
"l_s_5"));
321 EXPECT_TRUE(session.isVariablePartOfProperty(
"x"));
322 EXPECT_FALSE(session.isVariablePartOfProperty(
"y"));
329 EXPECT_TRUE(session.isVariablePartOfProperty(
"x"));
330 EXPECT_TRUE(session.isVariablePartOfProperty(
"y"));
348 eliminator.scheduler.addAction(std::make_unique<UnfoldAction>(
"main",
"x"));
349 eliminator.eliminate();
350 auto result = eliminator.getResult();
351 EXPECT_EQ(5u, result.getAutomaton(0).getNumberOfLocations());
352 checkModel(result, {
property}, std::map<storm::expressions::Variable, storm::expressions::Expression>(), 0.25);
365 eliminator.scheduler.addAction(std::make_unique<UnfoldAction>(
"main",
"x"));
366 eliminator.eliminate();
367 auto result = eliminator.getResult();
368 EXPECT_EQ(2u, result.getAutomaton(0).getNumberOfLocations());
369 checkModel(result, {
property}, std::map<storm::expressions::Variable, storm::expressions::Expression>(), 0.875);
382 eliminator.scheduler.addAction(std::make_unique<UnfoldAction>(
"main",
"x"));
383 eliminator.scheduler.addAction(std::make_unique<UnfoldAction>(
"main",
"x"));
392 eliminator.scheduler.addAction(std::make_unique<UnfoldAction>(
"main",
"s"));
393 eliminator.eliminate();
394 auto result = eliminator.getResult();
395 EXPECT_EQ(5u, result.getAutomaton(0).getNumberOfLocations());
417 eliminator.scheduler.addAction(std::make_unique<UnfoldAction>(
"main",
"c"));
418 eliminator.scheduler.addAction(std::make_unique<EliminateAction>(
"main",
"l_c_1"));
419 eliminator.scheduler.addAction(std::make_unique<RebuildWithoutUnreachableAction>());
420 eliminator.eliminate();
421 auto result = eliminator.getResult();
423 EXPECT_EQ(2u, result.getAutomaton(0).getNumberOfLocations());
424 checkModel(result, {
property}, std::map<storm::expressions::Variable, storm::expressions::Expression>(), 1.0);
437 eliminator.scheduler.addAction(std::make_unique<UnfoldAction>(
"main",
"c"));
438 eliminator.scheduler.addAction(std::make_unique<EliminateAction>(
"main",
"l_c_1"));
439 eliminator.scheduler.addAction(std::make_unique<RebuildWithoutUnreachableAction>());
440 eliminator.eliminate();
441 auto result = eliminator.getResult();
443 EXPECT_EQ(3u, result.getAutomaton(0).getNumberOfLocations());
444 checkModel(result, {
property}, std::map<storm::expressions::Variable, storm::expressions::Expression>(), 1.0 / 12.0);
457 eliminator.scheduler.addAction(std::make_unique<UnfoldAction>(
"main",
"c"));
458 eliminator.scheduler.addAction(std::make_unique<EliminateAction>(
"main",
"l_c_1"));
459 eliminator.scheduler.addAction(std::make_unique<RebuildWithoutUnreachableAction>());
460 eliminator.eliminate();
461 auto result = eliminator.getResult();
463 EXPECT_EQ(2u, result.getAutomaton(0).getNumberOfLocations());
464 EXPECT_EQ(4u, result.getAutomaton(0).getEdgesFromLocation(0).begin()->getDestination(0).getOrderedAssignments().getNumberOfAssignments());
465 checkModel(result, {
property}, std::map<storm::expressions::Variable, storm::expressions::Expression>(), 1.0);
478 eliminator.scheduler.addAction(std::make_unique<UnfoldAction>(
"main",
"c"));
479 eliminator.scheduler.addAction(std::make_unique<EliminateAction>(
"main",
"l_c_3"));
480 eliminator.scheduler.addAction(std::make_unique<RebuildWithoutUnreachableAction>());
481 eliminator.eliminate();
482 auto result = eliminator.getResult();
484 EXPECT_EQ(6u, result.getAutomaton(0).getNumberOfLocations());
485 checkModel(result, {
property}, std::map<storm::expressions::Variable, storm::expressions::Expression>(), 0.01845238095);
497 eliminator.scheduler.addAction(std::make_unique<UnfoldAction>(
"main",
"c"));
498 eliminator.scheduler.addAction(std::make_unique<EliminateAction>(
"main",
"l_c_1"));
499 eliminator.scheduler.addAction(std::make_unique<RebuildWithoutUnreachableAction>());
500 eliminator.eliminate();
501 auto result = eliminator.getResult();
503 EXPECT_EQ(2u, result.getAutomaton(0).getNumberOfLocations());
504 checkModel(result, {
property}, std::map<storm::expressions::Variable, storm::expressions::Expression>(), 2.0 / 15.0);
storm::models::sparse::Dtmc< double > Dtmc
TEST_F(JaniLocalElimination, PropertyTypeTest)
storm::models::sparse::Mdp< double > Mdp
storm::modelchecker::SparseMdpPrctlModelChecker< Dtmc > MdpModelChecker
storm::modelchecker::SparseDtmcPrctlModelChecker< Dtmc > DtmcModelChecker
void checkModel(storm::jani::Model model, std::vector< storm::jani::Property > properties, std::map< storm::expressions::Variable, storm::expressions::Expression > consts, double expectedValue)
BuilderOptions & setBuildAllLabels(bool newValue=true)
Should all reward models be built? If not set, only required reward models are build.
void substitute(std::map< storm::expressions::Variable, storm::expressions::Expression > const &substitution, bool const substituteTranscendentalNumbers)
Substitutes all expression variables in all expressions of the model.
Model defineUndefinedConstants(std::map< storm::expressions::Variable, storm::expressions::Expression > const &constantDefinitions) const
Defines the undefined constants of the model by the given expressions.
void doAction(JaniLocalEliminator::Session &session) override
This class represents a discrete-time Markov chain.
This class represents a (discrete-time) Markov decision process.
std::pair< storm::jani::Model, std::vector< storm::jani::Property > > parseJaniModel(std::string const &filename, boost::optional< std::vector< std::string > > const &propertyFilter)
std::vector< std::shared_ptr< storm::logic::Formula const > > extractFormulasFromProperties(std::vector< storm::jani::Property > const &properties)
ModelFeatures getAllKnownModelFeatures()
SettingsType const & getModule()
Get module.
#define STORM_SILENT_EXPECT_THROW(statement, expected_exception)
#define STORM_SILENT_ASSERT_THROW(statement, expected_exception)