1#include "storm-config.h"
47 GTEST_SKIP() <<
"Z3 not available.";
55 std::map<storm::expressions::Variable, storm::expressions::Expression> consts,
double expectedValue) {
57 properties[0] = properties[0].
substitute(consts);
62 auto explicitModel = storm::api::buildSparseModel<double>(model, options)->template as<Dtmc>();
66 auto checkResult = storm::api::verifyWithSparseEngine<double>(env, explicitModel, task);
67 auto quantResult = checkResult->asExplicitQuantitativeCheckResult<
double>();
69 auto initialStates = explicitModel->getInitialStates();
70 EXPECT_EQ(1u, initialStates.getNumberOfSetBits());
71 for (
auto state = initialStates.begin(); state != initialStates.end(); ++state) {
72 EXPECT_NEAR(expectedValue, quantResult[*state], storm::settings::getModule<storm::settings::modules::GeneralSettings>().getPrecision());
91 auto property =
storm::jani::Property(
"steady_state", formula, std::set<storm::expressions::Variable>());
97 auto property =
storm::jani::Property(
"generally", formula, std::set<storm::expressions::Variable>());
110 auto property =
storm::jani::Property(
"reachability", formula, std::set<storm::expressions::Variable>());
116 auto property =
storm::jani::Property(
"reward_reachability", formula, std::set<storm::expressions::Variable>());
125 std::vector<storm::jani::Property> empty_properties;
135 eliminator.eliminate();
136 auto result = eliminator.getResult();
137 EXPECT_EQ(1u, result.getNumberOfAutomata());
154 eliminator.scheduler.addAction(std::make_unique<UnfoldAction>(
"main",
"s"));
155 eliminator.scheduler.addAction(std::make_unique<EliminateAction>(
"main",
"l_s_1"));
156 eliminator.eliminate();
157 auto result = eliminator.getResult();
158 EXPECT_EQ(1u, result.getNumberOfAutomata());
159 checkModel(result, modelAndProps.second, std::map<storm::expressions::Variable, storm::expressions::Expression>(), 0.5);
177 EXPECT_FALSE(session.hasLoops(
"main",
"l_s_0"));
178 EXPECT_TRUE(session.hasLoops(
"main",
"l_s_1"));
179 EXPECT_TRUE(session.hasLoops(
"main",
"l_s_2"));
180 EXPECT_FALSE(session.hasLoops(
"main",
"l_s_3"));
181 EXPECT_TRUE(session.hasLoops(
"main",
"l_s_4"));
182 EXPECT_TRUE(session.hasLoops(
"main",
"l_s_5"));
183 EXPECT_FALSE(session.hasLoops(
"main",
"l_s_6"));
200 EXPECT_TRUE(session.computeIsPartOfProp(
"main",
"l"));
205 EXPECT_FALSE(session.computeIsPartOfProp(
"main",
"l_x_0"));
206 EXPECT_TRUE(session.computeIsPartOfProp(
"main",
"l_x_1"));
207 EXPECT_FALSE(session.computeIsPartOfProp(
"main",
"l_x_2"));
212 EXPECT_TRUE(session.computeIsPartOfProp(
"main",
"l_x_1_y_4"));
213 EXPECT_TRUE(session.computeIsPartOfProp(
"main",
"l_x_1_y_3"));
214 EXPECT_FALSE(session.computeIsPartOfProp(
"main",
"l_x_2_y_4"));
219 EXPECT_FALSE(session.computeIsPartOfProp(
"main",
"l_x_0_y_2_z_3"));
220 EXPECT_FALSE(session.computeIsPartOfProp(
"main",
"l_x_0_y_2_z_1"));
221 EXPECT_FALSE(session.computeIsPartOfProp(
"main",
"l_x_0_y_5_z_3"));
222 EXPECT_FALSE(session.computeIsPartOfProp(
"main",
"l_x_0_y_5_z_1"));
223 EXPECT_FALSE(session.computeIsPartOfProp(
"main",
"l_x_1_y_2_z_3"));
224 EXPECT_TRUE(session.computeIsPartOfProp(
"main",
"l_x_1_y_2_z_1"));
225 EXPECT_TRUE(session.computeIsPartOfProp(
"main",
"l_x_1_y_5_z_3"));
226 EXPECT_TRUE(session.computeIsPartOfProp(
"main",
"l_x_1_y_5_z_1"));
227 EXPECT_TRUE(session.computeIsPartOfProp(
"main",
"l_x_1_y_4_z_1"));
228 EXPECT_TRUE(session.computeIsPartOfProp(
"main",
"l_x_1_y_5_z_0"));
243 EXPECT_TRUE(session.isPossiblyInitial(
"main",
"l"));
248 EXPECT_FALSE(session.isPossiblyInitial(
"main",
"l_x_0"));
249 EXPECT_FALSE(session.isPossiblyInitial(
"main",
"l_x_1"));
250 EXPECT_TRUE(session.isPossiblyInitial(
"main",
"l_x_2"));
255 EXPECT_TRUE(session.isPossiblyInitial(
"main",
"l_x_2_y_-1"));
256 EXPECT_FALSE(session.isPossiblyInitial(
"main",
"l_x_2_y_0"));
257 EXPECT_FALSE(session.isPossiblyInitial(
"main",
"l_x_0_y_0"));
258 EXPECT_FALSE(session.isPossiblyInitial(
"main",
"l_x_0_y_-1"));
263 EXPECT_TRUE(session.isPossiblyInitial(
"main",
"l_x_2_y_-1_z_0"));
264 EXPECT_FALSE(session.isPossiblyInitial(
"main",
"l_x_2_y_-1_z_1"));
265 EXPECT_FALSE(session.isPossiblyInitial(
"main",
"l_x_2_y_0_z_0"));
266 EXPECT_FALSE(session.isPossiblyInitial(
"main",
"l_x_1_y_-1_z_0"));
271 EXPECT_TRUE(session.isPossiblyInitial(
"main",
"l_x_2_y_-1_z_0_a_true"));
272 EXPECT_FALSE(session.isPossiblyInitial(
"main",
"l_x_2_y_-1_z_0_a_false"));
273 EXPECT_FALSE(session.isPossiblyInitial(
"main",
"l_x_0_y_-1_z_0_a_true"));
278 EXPECT_TRUE(session.isPossiblyInitial(
"main",
"l_x_2_y_-1_z_0_a_true_b_false"));
279 EXPECT_FALSE(session.isPossiblyInitial(
"main",
"l_x_2_y_-1_z_0_a_true_b_true"));
280 EXPECT_FALSE(session.isPossiblyInitial(
"main",
"l_x_2_y_0_z_0_a_true_b_true"));
285 EXPECT_TRUE(session.isPossiblyInitial(
"main",
"l_x_2_y_-1_z_0_a_true_b_false_c_false"));
286 EXPECT_FALSE(session.isPossiblyInitial(
"main",
"l_x_2_y_-1_z_0_a_true_b_false_c_true"));
301 EXPECT_FALSE(session.isEliminable(
"main",
"l"));
306 EXPECT_FALSE(session.isEliminable(
"main",
"l_s_0"));
307 EXPECT_FALSE(session.isEliminable(
"main",
"l_s_1"));
308 EXPECT_TRUE(session.isEliminable(
"main",
"l_s_2"));
309 EXPECT_TRUE(session.isEliminable(
"main",
"l_s_3"));
310 EXPECT_FALSE(session.isEliminable(
"main",
"l_s_4"));
311 EXPECT_FALSE(session.isEliminable(
"main",
"l_s_5"));
323 EXPECT_TRUE(session.isVariablePartOfProperty(
"x"));
324 EXPECT_FALSE(session.isVariablePartOfProperty(
"y"));
331 EXPECT_TRUE(session.isVariablePartOfProperty(
"x"));
332 EXPECT_TRUE(session.isVariablePartOfProperty(
"y"));
350 eliminator.scheduler.addAction(std::make_unique<UnfoldAction>(
"main",
"x"));
351 eliminator.eliminate();
352 auto result = eliminator.getResult();
353 EXPECT_EQ(5u, result.getAutomaton(0).getNumberOfLocations());
354 checkModel(result, {
property}, std::map<storm::expressions::Variable, storm::expressions::Expression>(), 0.25);
367 eliminator.scheduler.addAction(std::make_unique<UnfoldAction>(
"main",
"x"));
368 eliminator.eliminate();
369 auto result = eliminator.getResult();
370 EXPECT_EQ(2u, result.getAutomaton(0).getNumberOfLocations());
371 checkModel(result, {
property}, std::map<storm::expressions::Variable, storm::expressions::Expression>(), 0.875);
384 eliminator.scheduler.addAction(std::make_unique<UnfoldAction>(
"main",
"x"));
385 eliminator.scheduler.addAction(std::make_unique<UnfoldAction>(
"main",
"x"));
394 eliminator.scheduler.addAction(std::make_unique<UnfoldAction>(
"main",
"s"));
395 eliminator.eliminate();
396 auto result = eliminator.getResult();
397 EXPECT_EQ(5u, result.getAutomaton(0).getNumberOfLocations());
419 eliminator.scheduler.addAction(std::make_unique<UnfoldAction>(
"main",
"c"));
420 eliminator.scheduler.addAction(std::make_unique<EliminateAction>(
"main",
"l_c_1"));
421 eliminator.scheduler.addAction(std::make_unique<RebuildWithoutUnreachableAction>());
422 eliminator.eliminate();
423 auto result = eliminator.getResult();
425 EXPECT_EQ(2u, result.getAutomaton(0).getNumberOfLocations());
426 checkModel(result, {
property}, std::map<storm::expressions::Variable, storm::expressions::Expression>(), 1.0);
439 eliminator.scheduler.addAction(std::make_unique<UnfoldAction>(
"main",
"c"));
440 eliminator.scheduler.addAction(std::make_unique<EliminateAction>(
"main",
"l_c_1"));
441 eliminator.scheduler.addAction(std::make_unique<RebuildWithoutUnreachableAction>());
442 eliminator.eliminate();
443 auto result = eliminator.getResult();
445 EXPECT_EQ(3u, result.getAutomaton(0).getNumberOfLocations());
446 checkModel(result, {
property}, std::map<storm::expressions::Variable, storm::expressions::Expression>(), 1.0 / 12.0);
459 eliminator.scheduler.addAction(std::make_unique<UnfoldAction>(
"main",
"c"));
460 eliminator.scheduler.addAction(std::make_unique<EliminateAction>(
"main",
"l_c_1"));
461 eliminator.scheduler.addAction(std::make_unique<RebuildWithoutUnreachableAction>());
462 eliminator.eliminate();
463 auto result = eliminator.getResult();
465 EXPECT_EQ(2u, result.getAutomaton(0).getNumberOfLocations());
466 EXPECT_EQ(4u, result.getAutomaton(0).getEdgesFromLocation(0).begin()->getDestination(0).getOrderedAssignments().getNumberOfAssignments());
467 checkModel(result, {
property}, std::map<storm::expressions::Variable, storm::expressions::Expression>(), 1.0);
480 eliminator.scheduler.addAction(std::make_unique<UnfoldAction>(
"main",
"c"));
481 eliminator.scheduler.addAction(std::make_unique<EliminateAction>(
"main",
"l_c_3"));
482 eliminator.scheduler.addAction(std::make_unique<RebuildWithoutUnreachableAction>());
483 eliminator.eliminate();
484 auto result = eliminator.getResult();
486 EXPECT_EQ(6u, result.getAutomaton(0).getNumberOfLocations());
487 checkModel(result, {
property}, std::map<storm::expressions::Variable, storm::expressions::Expression>(), 0.01845238095);
499 eliminator.scheduler.addAction(std::make_unique<UnfoldAction>(
"main",
"c"));
500 eliminator.scheduler.addAction(std::make_unique<EliminateAction>(
"main",
"l_c_1"));
501 eliminator.scheduler.addAction(std::make_unique<RebuildWithoutUnreachableAction>());
502 eliminator.eliminate();
503 auto result = eliminator.getResult();
505 EXPECT_EQ(2u, result.getAutomaton(0).getNumberOfLocations());
506 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()
#define STORM_SILENT_EXPECT_THROW(statement, expected_exception)
#define STORM_SILENT_ASSERT_THROW(statement, expected_exception)