1#include "storm-config.h"
48 GTEST_SKIP() <<
"Z3 not available.";
56 std::map<storm::expressions::Variable, storm::expressions::Expression> consts,
double expectedValue) {
58 properties[0] = properties[0].
substitute(consts);
68 auto quantResult = checkResult->asExplicitQuantitativeCheckResult<
double>();
70 auto initialStates = explicitModel->getInitialStates();
71 EXPECT_EQ(1u, initialStates.getNumberOfSetBits());
72 for (
auto state = initialStates.begin(); state != initialStates.end(); ++state) {
92 auto property =
storm::jani::Property(
"steady_state", formula, std::set<storm::expressions::Variable>());
98 auto property =
storm::jani::Property(
"generally", formula, std::set<storm::expressions::Variable>());
111 auto property =
storm::jani::Property(
"reachability", formula, std::set<storm::expressions::Variable>());
117 auto property =
storm::jani::Property(
"reward_reachability", formula, std::set<storm::expressions::Variable>());
126 std::vector<storm::jani::Property> empty_properties;
136 eliminator.eliminate();
137 auto result = eliminator.getResult();
138 EXPECT_EQ(1u, result.getNumberOfAutomata());
155 eliminator.scheduler.addAction(std::make_unique<UnfoldAction>(
"main",
"s"));
156 eliminator.scheduler.addAction(std::make_unique<EliminateAction>(
"main",
"l_s_1"));
157 eliminator.eliminate();
158 auto result = eliminator.getResult();
159 EXPECT_EQ(1u, result.getNumberOfAutomata());
160 checkModel(result, modelAndProps.second, std::map<storm::expressions::Variable, storm::expressions::Expression>(), 0.5);
178 EXPECT_FALSE(session.hasLoops(
"main",
"l_s_0"));
179 EXPECT_TRUE(session.hasLoops(
"main",
"l_s_1"));
180 EXPECT_TRUE(session.hasLoops(
"main",
"l_s_2"));
181 EXPECT_FALSE(session.hasLoops(
"main",
"l_s_3"));
182 EXPECT_TRUE(session.hasLoops(
"main",
"l_s_4"));
183 EXPECT_TRUE(session.hasLoops(
"main",
"l_s_5"));
184 EXPECT_FALSE(session.hasLoops(
"main",
"l_s_6"));
201 EXPECT_TRUE(session.computeIsPartOfProp(
"main",
"l"));
206 EXPECT_FALSE(session.computeIsPartOfProp(
"main",
"l_x_0"));
207 EXPECT_TRUE(session.computeIsPartOfProp(
"main",
"l_x_1"));
208 EXPECT_FALSE(session.computeIsPartOfProp(
"main",
"l_x_2"));
213 EXPECT_TRUE(session.computeIsPartOfProp(
"main",
"l_x_1_y_4"));
214 EXPECT_TRUE(session.computeIsPartOfProp(
"main",
"l_x_1_y_3"));
215 EXPECT_FALSE(session.computeIsPartOfProp(
"main",
"l_x_2_y_4"));
220 EXPECT_FALSE(session.computeIsPartOfProp(
"main",
"l_x_0_y_2_z_3"));
221 EXPECT_FALSE(session.computeIsPartOfProp(
"main",
"l_x_0_y_2_z_1"));
222 EXPECT_FALSE(session.computeIsPartOfProp(
"main",
"l_x_0_y_5_z_3"));
223 EXPECT_FALSE(session.computeIsPartOfProp(
"main",
"l_x_0_y_5_z_1"));
224 EXPECT_FALSE(session.computeIsPartOfProp(
"main",
"l_x_1_y_2_z_3"));
225 EXPECT_TRUE(session.computeIsPartOfProp(
"main",
"l_x_1_y_2_z_1"));
226 EXPECT_TRUE(session.computeIsPartOfProp(
"main",
"l_x_1_y_5_z_3"));
227 EXPECT_TRUE(session.computeIsPartOfProp(
"main",
"l_x_1_y_5_z_1"));
228 EXPECT_TRUE(session.computeIsPartOfProp(
"main",
"l_x_1_y_4_z_1"));
229 EXPECT_TRUE(session.computeIsPartOfProp(
"main",
"l_x_1_y_5_z_0"));
244 EXPECT_TRUE(session.isPossiblyInitial(
"main",
"l"));
249 EXPECT_FALSE(session.isPossiblyInitial(
"main",
"l_x_0"));
250 EXPECT_FALSE(session.isPossiblyInitial(
"main",
"l_x_1"));
251 EXPECT_TRUE(session.isPossiblyInitial(
"main",
"l_x_2"));
256 EXPECT_TRUE(session.isPossiblyInitial(
"main",
"l_x_2_y_-1"));
257 EXPECT_FALSE(session.isPossiblyInitial(
"main",
"l_x_2_y_0"));
258 EXPECT_FALSE(session.isPossiblyInitial(
"main",
"l_x_0_y_0"));
259 EXPECT_FALSE(session.isPossiblyInitial(
"main",
"l_x_0_y_-1"));
264 EXPECT_TRUE(session.isPossiblyInitial(
"main",
"l_x_2_y_-1_z_0"));
265 EXPECT_FALSE(session.isPossiblyInitial(
"main",
"l_x_2_y_-1_z_1"));
266 EXPECT_FALSE(session.isPossiblyInitial(
"main",
"l_x_2_y_0_z_0"));
267 EXPECT_FALSE(session.isPossiblyInitial(
"main",
"l_x_1_y_-1_z_0"));
272 EXPECT_TRUE(session.isPossiblyInitial(
"main",
"l_x_2_y_-1_z_0_a_true"));
273 EXPECT_FALSE(session.isPossiblyInitial(
"main",
"l_x_2_y_-1_z_0_a_false"));
274 EXPECT_FALSE(session.isPossiblyInitial(
"main",
"l_x_0_y_-1_z_0_a_true"));
279 EXPECT_TRUE(session.isPossiblyInitial(
"main",
"l_x_2_y_-1_z_0_a_true_b_false"));
280 EXPECT_FALSE(session.isPossiblyInitial(
"main",
"l_x_2_y_-1_z_0_a_true_b_true"));
281 EXPECT_FALSE(session.isPossiblyInitial(
"main",
"l_x_2_y_0_z_0_a_true_b_true"));
286 EXPECT_TRUE(session.isPossiblyInitial(
"main",
"l_x_2_y_-1_z_0_a_true_b_false_c_false"));
287 EXPECT_FALSE(session.isPossiblyInitial(
"main",
"l_x_2_y_-1_z_0_a_true_b_false_c_true"));
302 EXPECT_FALSE(session.isEliminable(
"main",
"l"));
307 EXPECT_FALSE(session.isEliminable(
"main",
"l_s_0"));
308 EXPECT_FALSE(session.isEliminable(
"main",
"l_s_1"));
309 EXPECT_TRUE(session.isEliminable(
"main",
"l_s_2"));
310 EXPECT_TRUE(session.isEliminable(
"main",
"l_s_3"));
311 EXPECT_FALSE(session.isEliminable(
"main",
"l_s_4"));
312 EXPECT_FALSE(session.isEliminable(
"main",
"l_s_5"));
324 EXPECT_TRUE(session.isVariablePartOfProperty(
"x"));
325 EXPECT_FALSE(session.isVariablePartOfProperty(
"y"));
332 EXPECT_TRUE(session.isVariablePartOfProperty(
"x"));
333 EXPECT_TRUE(session.isVariablePartOfProperty(
"y"));
351 eliminator.scheduler.addAction(std::make_unique<UnfoldAction>(
"main",
"x"));
352 eliminator.eliminate();
353 auto result = eliminator.getResult();
354 EXPECT_EQ(5u, result.getAutomaton(0).getNumberOfLocations());
355 checkModel(result, {
property}, std::map<storm::expressions::Variable, storm::expressions::Expression>(), 0.25);
368 eliminator.scheduler.addAction(std::make_unique<UnfoldAction>(
"main",
"x"));
369 eliminator.eliminate();
370 auto result = eliminator.getResult();
371 EXPECT_EQ(2u, result.getAutomaton(0).getNumberOfLocations());
372 checkModel(result, {
property}, std::map<storm::expressions::Variable, storm::expressions::Expression>(), 0.875);
385 eliminator.scheduler.addAction(std::make_unique<UnfoldAction>(
"main",
"x"));
386 eliminator.scheduler.addAction(std::make_unique<UnfoldAction>(
"main",
"x"));
395 eliminator.scheduler.addAction(std::make_unique<UnfoldAction>(
"main",
"s"));
396 eliminator.eliminate();
397 auto result = eliminator.getResult();
398 EXPECT_EQ(5u, result.getAutomaton(0).getNumberOfLocations());
420 eliminator.scheduler.addAction(std::make_unique<UnfoldAction>(
"main",
"c"));
421 eliminator.scheduler.addAction(std::make_unique<EliminateAction>(
"main",
"l_c_1"));
422 eliminator.scheduler.addAction(std::make_unique<RebuildWithoutUnreachableAction>());
423 eliminator.eliminate();
424 auto result = eliminator.getResult();
426 EXPECT_EQ(2u, result.getAutomaton(0).getNumberOfLocations());
427 checkModel(result, {
property}, std::map<storm::expressions::Variable, storm::expressions::Expression>(), 1.0);
440 eliminator.scheduler.addAction(std::make_unique<UnfoldAction>(
"main",
"c"));
441 eliminator.scheduler.addAction(std::make_unique<EliminateAction>(
"main",
"l_c_1"));
442 eliminator.scheduler.addAction(std::make_unique<RebuildWithoutUnreachableAction>());
443 eliminator.eliminate();
444 auto result = eliminator.getResult();
446 EXPECT_EQ(3u, result.getAutomaton(0).getNumberOfLocations());
447 checkModel(result, {
property}, std::map<storm::expressions::Variable, storm::expressions::Expression>(), 1.0 / 12.0);
460 eliminator.scheduler.addAction(std::make_unique<UnfoldAction>(
"main",
"c"));
461 eliminator.scheduler.addAction(std::make_unique<EliminateAction>(
"main",
"l_c_1"));
462 eliminator.scheduler.addAction(std::make_unique<RebuildWithoutUnreachableAction>());
463 eliminator.eliminate();
464 auto result = eliminator.getResult();
466 EXPECT_EQ(2u, result.getAutomaton(0).getNumberOfLocations());
467 EXPECT_EQ(4u, result.getAutomaton(0).getEdgesFromLocation(0).begin()->getDestination(0).getOrderedAssignments().getNumberOfAssignments());
468 checkModel(result, {
property}, std::map<storm::expressions::Variable, storm::expressions::Expression>(), 1.0);
481 eliminator.scheduler.addAction(std::make_unique<UnfoldAction>(
"main",
"c"));
482 eliminator.scheduler.addAction(std::make_unique<EliminateAction>(
"main",
"l_c_3"));
483 eliminator.scheduler.addAction(std::make_unique<RebuildWithoutUnreachableAction>());
484 eliminator.eliminate();
485 auto result = eliminator.getResult();
487 EXPECT_EQ(6u, result.getAutomaton(0).getNumberOfLocations());
488 checkModel(result, {
property}, std::map<storm::expressions::Variable, storm::expressions::Expression>(), 0.01845238095);
500 eliminator.scheduler.addAction(std::make_unique<UnfoldAction>(
"main",
"c"));
501 eliminator.scheduler.addAction(std::make_unique<EliminateAction>(
"main",
"l_c_1"));
502 eliminator.scheduler.addAction(std::make_unique<RebuildWithoutUnreachableAction>());
503 eliminator.eliminate();
504 auto result = eliminator.getResult();
506 EXPECT_EQ(2u, result.getAutomaton(0).getNumberOfLocations());
507 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?
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::shared_ptr< storm::models::sparse::Model< ValueType > > buildSparseModel(storm::storage::SymbolicModelDescription const &model, storm::builder::BuilderOptions const &options, typename storm::builder::ExplicitModelBuilder< ValueType >::Options const &explorationOptions=typename storm::builder::ExplicitModelBuilder< ValueType >::Options())
std::vector< std::shared_ptr< storm::logic::Formula const > > extractFormulasFromProperties(std::vector< storm::jani::Property > const &properties)
std::pair< storm::jani::Model, std::vector< storm::jani::Property > > parseJaniModel(std::string const &filename, boost::optional< std::vector< std::string > > const &propertyFilter)
std::unique_ptr< storm::modelchecker::CheckResult > verifyWithSparseEngine(storm::Environment const &env, std::shared_ptr< storm::models::sparse::Dtmc< ValueType > > const &dtmc, storm::modelchecker::CheckTask< storm::logic::Formula, ValueType > const &task, bool preferEliminationChecker=false)
ModelFeatures getAllKnownModelFeatures()
SettingsType const & getModule()
Get module.
#define STORM_SILENT_EXPECT_THROW(statement, expected_exception)
#define STORM_SILENT_ASSERT_THROW(statement, expected_exception)