Storm 1.14.0.1
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
SparseDtmcParameterLiftingMonotonicityTest.cpp
Go to the documentation of this file.
1#include "storm-config.h"
2#include "test/storm_gtest.h"
3
11#include "storm/api/builder.h"
18
19namespace {
20class DoubleSVIEnvironment {
21 public:
22 typedef double ValueType;
24 static storm::Environment createEnvironment() {
25 storm::Environment env;
26 env.solver().minMax().setMethod(storm::solver::MinMaxMethod::SoundValueIteration);
28 return env;
29 }
30};
31
32class RationalPiEnvironment {
33 public:
34 typedef storm::RationalNumber ValueType;
36 static storm::Environment createEnvironment() {
37 storm::Environment env;
38 env.solver().minMax().setMethod(storm::solver::MinMaxMethod::PolicyIteration);
39 return env;
40 }
41};
42
43template<typename TestType>
44class SparseDtmcParameterLiftingMonotonicityTest : public ::testing::Test {
45 public:
46 typedef typename TestType::ValueType ValueType;
47 SparseDtmcParameterLiftingMonotonicityTest() : _environment(TestType::createEnvironment()) {}
48 storm::Environment const& env() const {
49 return _environment;
50 }
51 virtual void SetUp() {
52#ifndef STORM_HAVE_Z3
53 GTEST_SKIP() << "Z3 not available.";
54#endif
56 }
57 virtual void TearDown() {
59 }
60
61 private:
62 storm::Environment _environment;
63};
64
65struct MonotonicityTestData {
66 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model;
67 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas;
68 std::set<storm::RationalFunctionVariable> modelParameters;
69};
70
71void buildMonotonicityModel(std::string const& programFile, std::string const& formulaAsString, std::string const& constantsAsString,
72 bool simplifyAndBisimulate, MonotonicityTestData& data) {
73 // Program and formula
75 program = program.preprocess(constantsAsString);
76 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
78 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
80
81 if (simplifyAndBisimulate) {
82 // Simplify model
84 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
86 formulas[0] = simplifier.getSimplifiedFormula();
87
88 // Apply bisimulation
89 model =
91 }
92
93 // Model parameters
94 auto modelParameters = storm::models::sparse::getProbabilityParameters(*model);
95 auto rewParameters = storm::models::sparse::getRewardParameters(*model);
96 modelParameters.insert(rewParameters.begin(), rewParameters.end());
97
98 data.model = std::move(model);
99 data.formulas = std::move(formulas);
100 data.modelParameters = std::move(modelParameters);
101}
102
103template<typename ValueType>
104void checkBrpMonotonicity(storm::Environment const& env, storm::modelchecker::RegionCheckEngine regionEngine, MonotonicityTestData data,
105 std::vector<std::string> const& regionStrings) {
106 // Reachability order, as it is already done building we don't need to recreate the order for each region
108 auto monRes = monHelper.checkMonotonicityInBuild(std::cout);
109 auto order = monRes.front().order;
110 ASSERT_EQ(order->getNumberOfAddedStates(), data.model->getTransitionMatrix().getColumnCount());
111 ASSERT_TRUE(order->getDoneBuilding());
112
113 // Modelcheckers
115 env, data.model, storm::api::createTask<storm::RationalFunction>(data.formulas[0], true), regionEngine, true,
118 env, data.model, storm::api::createTask<storm::RationalFunction>(data.formulas[0], true), regionEngine, true,
120
121 // start testing
122 for (auto const& regionString : regionStrings) {
123 auto region = storm::api::parseRegion<storm::RationalFunction>(regionString, data.modelParameters);
124 auto expectedResult = regionChecker->analyzeRegion(env, region, storm::modelchecker::RegionResultHypothesis::Unknown, true);
125 EXPECT_EQ(expectedResult, regionCheckerMon->analyzeRegion(env, region, storm::modelchecker::RegionResultHypothesis::Unknown, true));
126 }
127}
128
129template<typename ValueType>
130void checkSimpleMonotonicity(storm::Environment const& env, storm::modelchecker::RegionCheckEngine regionEngine, MonotonicityTestData data,
131 std::vector<std::string> const& regionStrings, bool assertDoneBuilding = false, bool printMatrix = false) {
132 if (printMatrix) {
133 data.model->getTransitionMatrix().printAsMatlabMatrix(std::cout);
134 }
136 auto order = monHelper.checkMonotonicityInBuild(std::cout).front().order;
137 if (assertDoneBuilding) {
138 ASSERT_TRUE(order->getDoneBuilding());
139 }
140
141 // Modelcheckers
143 env, data.model, storm::api::createTask<storm::RationalFunction>(data.formulas[0], true), regionEngine, true,
146 env, data.model, storm::api::createTask<storm::RationalFunction>(data.formulas[0], true), regionEngine, true,
148
149 // Start testing
150 for (auto const& regionString : regionStrings) {
151 auto region = storm::api::parseRegion<storm::RationalFunction>(regionString, data.modelParameters);
152 monHelper.createLocalMonotonicityResult(order, region);
153 EXPECT_EQ(regionChecker->analyzeRegion(env, region, storm::modelchecker::RegionResultHypothesis::Unknown, true),
154 regionCheckerMon->analyzeRegion(env, region, storm::modelchecker::RegionResultHypothesis::Unknown, true));
155 }
156}
157
158typedef ::testing::Types<DoubleSVIEnvironment, RationalPiEnvironment> TestingTypes;
159
160TYPED_TEST_SUITE(SparseDtmcParameterLiftingMonotonicityTest, TestingTypes, );
161
162TYPED_TEST(SparseDtmcParameterLiftingMonotonicityTest, Brp_Prob_Mon_LEQ) {
163 typedef typename TestFixture::ValueType ValueType;
164 MonotonicityTestData data;
165 buildMonotonicityModel(STORM_TEST_RESOURCES_DIR "/pdtmc/brp16_2.pm", "P<=0.84 [F s=5 ]", "", true, data);
166 checkBrpMonotonicity<ValueType>(this->env(), TypeParam::regionEngine, std::move(data),
167 {"0.7<=pL<=0.9,0.75<=pK<=0.95", "0.4<=pL<=0.65,0.75<=pK<=0.95", "0.1<=pL<=0.73,0.2<=pK<=0.715"});
168}
169
170TYPED_TEST(SparseDtmcParameterLiftingMonotonicityTest, Brp_Prob_Mon_GEQ) {
171 typedef typename TestFixture::ValueType ValueType;
172 MonotonicityTestData data;
173 buildMonotonicityModel(STORM_TEST_RESOURCES_DIR "/pdtmc/brp16_2.pm", "P>=0.84 [F s=5 ]", "", true, data);
174 checkBrpMonotonicity<ValueType>(this->env(), TypeParam::regionEngine, std::move(data),
175 {"0.1<=pL<=0.73,0.2<=pK<=0.715", "0.4<=pL<=0.65,0.75<=pK<=0.95", "0.7<=pL<=0.9,0.75<=pK<=0.95"});
176}
177
178TYPED_TEST(SparseDtmcParameterLiftingMonotonicityTest, Brp_Prob_Mon_LEQ_Incr) {
179 typedef typename TestFixture::ValueType ValueType;
180 MonotonicityTestData data;
181 buildMonotonicityModel(STORM_TEST_RESOURCES_DIR "/pdtmc/brp16_2_mon_incr.pm", "P<=0.84 [F s=5 ]", "", true, data);
182 checkBrpMonotonicity<ValueType>(this->env(), TypeParam::regionEngine, std::move(data),
183 {"0.7<=pL<=0.9,0.75<=pK<=0.95", "0.4<=pL<=0.65,0.75<=pK<=0.95", "0.1<=pL<=0.73,0.2<=pK<=0.715"});
184}
185
186TYPED_TEST(SparseDtmcParameterLiftingMonotonicityTest, Brp_Prob_Mon_GEQ_Incr) {
187 typedef typename TestFixture::ValueType ValueType;
188 MonotonicityTestData data;
189 buildMonotonicityModel(STORM_TEST_RESOURCES_DIR "/pdtmc/brp16_2_mon_incr.pm", "P>=0.84 [F s=5 ]", "", true, data);
190 checkBrpMonotonicity<ValueType>(this->env(), TypeParam::regionEngine, std::move(data),
191 {"0.1<=pL<=0.73,0.2<=pK<=0.715", "0.4<=pL<=0.65,0.75<=pK<=0.95", "0.7<=pL<=0.9,0.75<=pK<=0.95"});
192}
193
194TYPED_TEST(SparseDtmcParameterLiftingMonotonicityTest, Parametric_Die_Mon) {
195 typedef typename TestFixture::ValueType ValueType;
196 MonotonicityTestData data;
197 buildMonotonicityModel(STORM_TEST_RESOURCES_DIR "/pdtmc/parametric_die_2.pm", "P <=0.5 [F s=7 & d=2 ]", "", true, data);
198 checkSimpleMonotonicity<ValueType>(this->env(), TypeParam::regionEngine, std::move(data),
199 {"0.1<=p<=0.2,0.8<=q<=0.9", "0.1<=p<=0.9,0.1<=q<=0.9", "0.8<=p<=0.9,0.1<=q<=0.2"});
200}
201
202TYPED_TEST(SparseDtmcParameterLiftingMonotonicityTest, Simple1_Mon) {
203 typedef typename TestFixture::ValueType ValueType;
204 MonotonicityTestData data;
205 buildMonotonicityModel(STORM_TEST_RESOURCES_DIR "/pdtmc/simple1.pm", "P<0.75 [F s=3 ]", "", false, data);
206 checkSimpleMonotonicity<ValueType>(this->env(), TypeParam::regionEngine, std::move(data), {"0.4<=p<=0.6", "0.1<=p<=0.9", "0.05<=p<=0.1"});
207}
208
209TYPED_TEST(SparseDtmcParameterLiftingMonotonicityTest, Casestudy1_Mon) {
210 typedef typename TestFixture::ValueType ValueType;
211 MonotonicityTestData data;
212 buildMonotonicityModel(STORM_TEST_RESOURCES_DIR "/pdtmc/casestudy1.pm", "P<0.5 [F s=3 ]", "", false, data);
213 checkSimpleMonotonicity<ValueType>(this->env(), TypeParam::regionEngine, std::move(data), {"0.1<=p<=0.5", "0.4<=p<=0.8", "0.7<=p<=0.9"});
214}
215
216TYPED_TEST(SparseDtmcParameterLiftingMonotonicityTest, Casestudy2_Mon) {
217 typedef typename TestFixture::ValueType ValueType;
218 MonotonicityTestData data;
219 buildMonotonicityModel(STORM_TEST_RESOURCES_DIR "/pdtmc/casestudy2.pm", "P<0.5 [F s=4 ]", "", false, data);
220 checkSimpleMonotonicity<ValueType>(this->env(), TypeParam::regionEngine, std::move(data), {"0.1<=p<=0.4", "0.4<=p<=0.9", "0.8<=p<=0.9"});
221}
222
223TYPED_TEST(SparseDtmcParameterLiftingMonotonicityTest, Casestudy3_Mon) {
224 typedef typename TestFixture::ValueType ValueType;
225 MonotonicityTestData data;
226 buildMonotonicityModel(STORM_TEST_RESOURCES_DIR "/pdtmc/casestudy3.pm", "P<0.5 [F s=3 ]", "", false, data);
227 checkSimpleMonotonicity<ValueType>(this->env(), TypeParam::regionEngine, std::move(data), {"0.6<=p<=0.9", "0.3<=p<=0.7", "0.1<=p<=0.4"}, true, true);
228}
229} // namespace
SolverEnvironment & solver()
void setPrecision(storm::RationalNumber value)
void setMethod(storm::solver::MinMaxMethod value, bool isSetFromDefault=false)
MinMaxSolverEnvironment & minMax()
This class represents a discrete-time Markov chain.
Definition Dtmc.h:16
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
This class performs different steps to simplify the given (parametric) model.
storm::modelchecker::CheckTask< storm::logic::Formula, ValueType > createTask(std::shared_ptr< const storm::logic::Formula > const &formula, bool onlyInitialStatesRelevant=false)
storm::storage::ParameterRegion< ValueType > parseRegion(std::string const &inputString, std::set< typename storm::storage::ParameterRegion< ValueType >::VariableType > const &consideredVariables)
Definition region.h:134
std::vector< storm::jani::Property > parsePropertiesForPrismProgram(std::string const &inputString, storm::prism::Program const &program, boost::optional< std::set< std::string > > const &propertyFilter)
storm::prism::Program parseProgram(std::string const &filename, bool prismCompatibility, bool simplify)
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::pars::modelchecker::MonotonicityOptions MonotonicitySetting
Definition region.h:44
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, storm::pars::analysis::GraphPreservationStatus graphPreservationStatus=storm::pars::analysis::GraphPreservationStatus::GraphPreserving, 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:238
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::bisimulation::Options const &options={})
SFTBDDChecker::ValueType ValueType
RegionCheckEngine
The considered engine for region checking.
@ ParameterLifting
Parameter lifting approach.
@ ExactParameterLifting
Parameter lifting approach with exact arithmethics.
std::set< storm::RationalFunctionVariable > getRewardParameters(Model< storm::RationalFunction > const &model)
Get all parameters occurring in rewards.
Definition Model.cpp:736
std::set< storm::RationalFunctionVariable > getProbabilityParameters(Model< storm::RationalFunction > const &model)
Get all probability parameters occurring on transitions.
Definition Model.cpp:732
@ GraphPreserving
The regions are known (or assumed) to preserve the graph structure of the model.
TargetType convertNumber(SourceType const &number)
void clearRFVariablePool()
Clears the global pool of rational-function variables.
TYPED_TEST(GraphTestAR, SymbolicProb01StochasticGameDieSmall)
Definition GraphTest.cpp:64
TYPED_TEST_SUITE(GraphTestAR, TestingTypes,)
::testing::Types< Cudd, Sylvan > TestingTypes
Definition GraphTest.cpp:61