Storm 1.14.0.1
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
BigStepTest.cpp
Go to the documentation of this file.
1#include "storm-config.h"
2#include "test/storm_gtest.h"
3
4#include <memory>
5#include <string>
6
15#include "storm/api/builder.h"
27
28void testModel(std::string programFile, std::string formulaAsString, std::string constantsAsString) {
30 program = program.preprocess(constantsAsString);
31 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
33 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
36 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> dtmc = model->as<storm::models::sparse::Dtmc<storm::RationalFunction>>();
37
40
42 auto timeTravelledDtmc = BigStep.bigStep(*dtmc, checkTask).first;
43
45 modelChecker.specifyFormula(checkTask);
47 timeTravelledDtmc);
48 modelCheckerTT.specifyFormula(checkTask);
49
50 auto parameters = storm::models::sparse::getAllParameters(*dtmc);
51
52 // Check if both DTMCs are equivalent just by sampling.
53 std::vector<std::map<storm::RationalFunctionVariable, storm::RationalFunctionCoefficient>> testInstantiations;
54 std::map<storm::RationalFunctionVariable, storm::RationalFunctionCoefficient> emptyInstantiation;
55 testInstantiations.push_back(emptyInstantiation);
56 for (auto const& param : parameters) {
57 std::vector<std::map<storm::RationalFunctionVariable, storm::RationalFunctionCoefficient>> newInstantiations;
58 for (auto point : testInstantiations) {
59 for (storm::RationalNumber x = storm::utility::convertNumber<storm::RationalNumber>(1e-5); x <= 1;
61 std::map<storm::RationalFunctionVariable, storm::RationalFunctionCoefficient> newMap(point);
63 newInstantiations.push_back(newMap);
64 }
65 }
66 testInstantiations = newInstantiations;
67 }
68
70 storm::Environment envRobust;
71 env.solver().minMax().setMethod(storm::solver::MinMaxMethod::ValueIteration);
72 envRobust.solver().minMax().setMethod(storm::solver::MinMaxMethod::ValueIteration);
73 for (auto const& instantiation : testInstantiations) {
74 auto result = modelChecker.check(env, instantiation)->asExplicitQuantitativeCheckResult<storm::RationalNumber>();
75 auto resultTT = modelCheckerTT.check(env, instantiation)->asExplicitQuantitativeCheckResult<storm::RationalNumber>();
76
77 storm::RationalNumber resA = result[*modelChecker.getOriginalModel().getInitialStates().begin()];
78 storm::RationalNumber resB = resultTT[*modelCheckerTT.getOriginalModel().getInitialStates().begin()];
79 ASSERT_NEAR(resA, resB, storm::utility::convertNumber<storm::RationalNumber>(1e-6));
80 }
81
82 auto region = storm::api::createRegion<storm::RationalFunction>("0.4", *dtmc);
83
84 auto pla =
86 auto resultPLA = pla->getBoundAtInitState(env, region[0], storm::OptimizationDirection::Minimize);
87
88 auto sharedDtmc = std::make_shared<storm::models::sparse::Dtmc<storm::RationalFunction>>(timeTravelledDtmc);
89 auto plaTT = storm::api::initializeRegionModelChecker<storm::RationalFunction>(env, sharedDtmc, checkTask,
91 auto resultPLATT = plaTT->getBoundAtInitState(env, region[0], storm::OptimizationDirection::Minimize);
92
93 ASSERT_TRUE(resultPLA < resultPLATT) << "Time-Travelling did not make bound better";
94}
95
96class BigStep : public ::testing::Test {
97 protected:
98 void SetUp() override {
99#ifndef STORM_HAVE_Z3
100 GTEST_SKIP() << "Z3 not available.";
101#endif
102 }
103};
104
105TEST_F(BigStep, Crowds) {
106 std::string programFile = STORM_TEST_RESOURCES_DIR "/pdtmc/crowds3_5.pm";
107 std::string formulaAsString = "P=? [F \"observeIGreater1\"]";
108 std::string constantsAsString = ""; // e.g. pL=0.9,TOACK=0.5
109 testModel(programFile, formulaAsString, constantsAsString);
110}
112 std::string programFile = STORM_TEST_RESOURCES_DIR "/pdtmc/nand-5-2.pm";
113 std::string formulaAsString = "P=? [F \"target\"]";
114 std::string constantsAsString = ""; // e.g. pL=0.9,TOACK=0.5
115 testModel(programFile, formulaAsString, constantsAsString);
116}
117TEST_F(BigStep, Herman) {
118 std::string programFile = STORM_TEST_RESOURCES_DIR "/pdtmc/herman5_pla.pm";
119 std::string formulaAsString = "R=? [F \"stable\"]";
120 std::string constantsAsString = ""; // e.g. pL=0.9,TOACK=0.5
121 testModel(programFile, formulaAsString, constantsAsString);
122}
TEST_F(BigStep, Crowds)
void testModel(std::string programFile, std::string formulaAsString, std::string constantsAsString)
void SetUp() override
SolverEnvironment & solver()
void setMethod(storm::solver::MinMaxMethod value, bool isSetFromDefault=false)
MinMaxSolverEnvironment & minMax()
Class to efficiently check a formula on a parametric model with different parameter instantiations.
virtual std::unique_ptr< CheckResult > check(Environment const &env, storm::utility::parametric::Valuation< typename SparseModelType::ValueType > const &valuation) override
void specifyFormula(CheckTask< storm::logic::Formula, typename SparseModelType::ValueType > const &checkTask)
std::shared_ptr< ModelType > as()
Casts the model into the model type given by the template parameter.
Definition ModelBase.h:38
This class represents a discrete-time Markov chain.
Definition Dtmc.h:13
Program preprocess(std::map< storm::expressions::Variable, storm::expressions::Expression > const &constantDefinitions) const
Preprocesses the program by defining the given constant definitions, substituting constants and formu...
Definition Program.cpp:1170
Shorthand for std::unordered_map<T, uint64_t>.
Definition BigStep.h:176
std::vector< storm::jani::Property > parsePropertiesForPrismProgram(std::string const &inputString, storm::prism::Program const &program, boost::optional< std::set< std::string > > const &propertyFilter)
std::shared_ptr< storm::models::sparse::Model< ValueType > > performBisimulationMinimization(std::shared_ptr< storm::models::sparse::Model< ValueType > > const &model, std::vector< std::shared_ptr< storm::logic::Formula const > > const &formulas, storm::storage::BisimulationType type=storm::storage::BisimulationType::Strong, bool graphPreserving=true, std::optional< double > const &tolerance=std::nullopt)
storm::prism::Program parseProgram(std::string const &filename, bool prismCompatibility, bool simplify)
std::unique_ptr< storm::modelchecker::RegionModelChecker< ValueType > > initializeRegionModelChecker(Environment const &env, std::shared_ptr< storm::models::sparse::Model< ValueType > > const &model, storm::modelchecker::CheckTask< storm::logic::Formula, ValueType > const &task, storm::modelchecker::RegionCheckEngine engine, bool allowModelSimplification=true, bool graphPreserving=true, bool preconditionsValidated=false, MonotonicitySetting monotonicitySetting=MonotonicitySetting(), std::optional< std::pair< std::set< typename storm::storage::ParameterRegion< ValueType >::VariableType >, std::set< typename storm::storage::ParameterRegion< ValueType >::VariableType > > > monotoneParameters=std::nullopt)
Definition region.h:237
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())
Definition builder.h:117
std::vector< std::shared_ptr< storm::logic::Formula const > > extractFormulasFromProperties(std::vector< storm::jani::Property > const &properties)
storm::storage::ParameterRegion< ValueType > createRegion(std::string const &inputString, std::set< typename storm::storage::ParameterRegion< ValueType >::VariableType > const &consideredVariables)
Definition region.h:113
@ ParameterLifting
Parameter lifting approach.
@ RobustParameterLifting
Parameter lifting approach based on robust markov models instead of generating nondeterminism.
std::set< storm::RationalFunctionVariable > getAllParameters(Model< storm::RationalFunction > const &model)
Get all parameters (probability, rewards, and rates) occurring in the model.
Definition Model.cpp:719
TargetType convertNumber(SourceType const &number)