1#include "storm-config.h"
16class DoubleSVIEnvironment {
28class RationalPiEnvironment {
38template<
typename TestType>
39class SparseDtmcParameterLiftingMonotonicityTest :
public ::testing::Test {
41 typedef typename TestType::ValueType
ValueType;
42 SparseDtmcParameterLiftingMonotonicityTest() : _environment(TestType::createEnvironment()) {}
48 bool useMonotonicity) {
53 virtual void SetUp() {
55 GTEST_SKIP() <<
"Z3 not available.";
57 carl::VariablePool::getInstance().clear();
59 virtual void TearDown() {
60 carl::VariablePool::getInstance().clear();
67typedef ::testing::Types<DoubleSVIEnvironment, RationalPiEnvironment>
TestingTypes;
71TYPED_TEST(SparseDtmcParameterLiftingMonotonicityTest, Brp_Prob_Mon_LEQ) {
72 typedef typename TestFixture::ValueType
ValueType;
74 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/brp16_2.pm";
75 std::string formulaAsString =
"P<=0.84 [F s=5 ]";
76 std::string constantsAsString =
"";
81 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
83 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
88 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
90 formulas[0] = simplifier.getSimplifiedFormula();
94 if (storm::settings::getModule<storm::settings::modules::BisimulationSettings>().isWeakBisimulationSet()) {
97 model = storm::api::performBisimulationMinimization<storm::RationalFunction>(model, formulas, bisimType)
103 modelParameters.insert(rewParameters.begin(), rewParameters.end());
108 auto order = monRes.begin()->first;
109 ASSERT_EQ(order->getNumberOfAddedStates(), model->getTransitionMatrix().getColumnCount());
110 ASSERT_TRUE(order->getDoneBuilding());
112 std::make_shared<storm::analysis::LocalMonotonicityResult<storm::RationalFunctionVariable>>(monRes.begin()->second.first, order->getNumberOfStates());
119 auto allSatRegion = storm::api::parseRegion<storm::RationalFunction>(
"0.7<=pL<=0.9,0.75<=pK<=0.95", modelParameters);
123 auto exBothRegion = storm::api::parseRegion<storm::RationalFunction>(
"0.4<=pL<=0.65,0.75<=pK<=0.95", modelParameters);
127 auto allVioRegion = storm::api::parseRegion<storm::RationalFunction>(
"0.1<=pL<=0.73,0.2<=pK<=0.715", modelParameters);
132TYPED_TEST(SparseDtmcParameterLiftingMonotonicityTest, Brp_Prob_Mon_GEQ) {
133 typedef typename TestFixture::ValueType
ValueType;
135 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/brp16_2.pm";
136 std::string formulaAsString =
"P>=0.84 [F s=5 ]";
137 std::string constantsAsString =
"";
142 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
144 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
149 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
151 formulas[0] = simplifier.getSimplifiedFormula();
155 if (storm::settings::getModule<storm::settings::modules::BisimulationSettings>().isWeakBisimulationSet()) {
158 model = storm::api::performBisimulationMinimization<storm::RationalFunction>(model, formulas, bisimType)
164 modelParameters.insert(rewParameters.begin(), rewParameters.end());
169 auto order = monRes.begin()->first;
170 ASSERT_EQ(order->getNumberOfAddedStates(), model->getTransitionMatrix().getColumnCount());
171 ASSERT_TRUE(order->getDoneBuilding());
173 std::make_shared<storm::analysis::LocalMonotonicityResult<storm::RationalFunctionVariable>>(monRes.begin()->second.first, order->getNumberOfStates());
180 auto allSatRegion = storm::api::parseRegion<storm::RationalFunction>(
"0.1<=pL<=0.73,0.2<=pK<=0.715", modelParameters);
184 auto exBothRegion = storm::api::parseRegion<storm::RationalFunction>(
"0.4<=pL<=0.65,0.75<=pK<=0.95", modelParameters);
188 auto allVioRegion = storm::api::parseRegion<storm::RationalFunction>(
"0.7<=pL<=0.9,0.75<=pK<=0.95", modelParameters);
193TYPED_TEST(SparseDtmcParameterLiftingMonotonicityTest, Brp_Prob_Mon_LEQ_Incr) {
194 typedef typename TestFixture::ValueType
ValueType;
196 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/brp16_2_mon_incr.pm";
197 std::string formulaAsString =
"P<=0.84 [F s=5 ]";
198 std::string constantsAsString =
"";
203 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
205 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
210 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
212 formulas[0] = simplifier.getSimplifiedFormula();
216 if (storm::settings::getModule<storm::settings::modules::BisimulationSettings>().isWeakBisimulationSet()) {
219 model = storm::api::performBisimulationMinimization<storm::RationalFunction>(model, formulas, bisimType)
225 modelParameters.insert(rewParameters.begin(), rewParameters.end());
230 auto order = monRes.begin()->first;
231 ASSERT_EQ(order->getNumberOfAddedStates(), model->getTransitionMatrix().getColumnCount());
232 ASSERT_TRUE(order->getDoneBuilding());
234 std::make_shared<storm::analysis::LocalMonotonicityResult<storm::RationalFunctionVariable>>(monRes.begin()->second.first, order->getNumberOfStates());
241 auto allSatRegion = storm::api::parseRegion<storm::RationalFunction>(
"0.7<=pL<=0.9,0.75<=pK<=0.95", modelParameters);
245 auto exBothRegion = storm::api::parseRegion<storm::RationalFunction>(
"0.4<=pL<=0.65,0.75<=pK<=0.95", modelParameters);
249 auto allVioRegion = storm::api::parseRegion<storm::RationalFunction>(
"0.1<=pL<=0.73,0.2<=pK<=0.715", modelParameters);
254TYPED_TEST(SparseDtmcParameterLiftingMonotonicityTest, Brp_Prob_Mon_GEQ_Incr) {
255 typedef typename TestFixture::ValueType
ValueType;
257 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/brp16_2_mon_incr.pm";
258 std::string formulaAsString =
"P>=0.84 [F s=5 ]";
259 std::string constantsAsString =
"";
264 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
266 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
271 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
273 formulas[0] = simplifier.getSimplifiedFormula();
277 if (storm::settings::getModule<storm::settings::modules::BisimulationSettings>().isWeakBisimulationSet()) {
280 model = storm::api::performBisimulationMinimization<storm::RationalFunction>(model, formulas, bisimType)
286 modelParameters.insert(rewParameters.begin(), rewParameters.end());
291 auto order = monRes.begin()->first;
292 ASSERT_EQ(order->getNumberOfAddedStates(), model->getTransitionMatrix().getColumnCount());
293 ASSERT_TRUE(order->getDoneBuilding());
295 std::make_shared<storm::analysis::LocalMonotonicityResult<storm::RationalFunctionVariable>>(monRes.begin()->second.first, order->getNumberOfStates());
302 auto allSatRegion = storm::api::parseRegion<storm::RationalFunction>(
"0.1<=pL<=0.73,0.2<=pK<=0.715", modelParameters);
306 auto exBothRegion = storm::api::parseRegion<storm::RationalFunction>(
"0.4<=pL<=0.65,0.75<=pK<=0.95", modelParameters);
310 auto allVioRegion = storm::api::parseRegion<storm::RationalFunction>(
"0.7<=pL<=0.9,0.75<=pK<=0.95", modelParameters);
315TYPED_TEST(SparseDtmcParameterLiftingMonotonicityTest, Parametric_Die_Mon) {
316 typedef typename TestFixture::ValueType
ValueType;
318 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/parametric_die_2.pm";
319 std::string formulaAsString =
"P <=0.5 [F s=7 & d=2 ]";
320 std::string constantsAsString =
"";
325 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
327 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
333 modelParameters.insert(rewParameters.begin(), rewParameters.end());
337 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
339 formulas[0] = simplifier.getSimplifiedFormula();
343 if (storm::settings::getModule<storm::settings::modules::BisimulationSettings>().isWeakBisimulationSet()) {
346 model = storm::api::performBisimulationMinimization<storm::RationalFunction>(model, formulas, bisimType)
354 auto allSatRegion = storm::api::parseRegion<storm::RationalFunction>(
"0.1<=p<=0.2,0.8<=q<=0.9", modelParameters);
361 auto exBothRegion = storm::api::parseRegion<storm::RationalFunction>(
"0.1<=p<=0.9,0.1<=q<=0.9", modelParameters);
365 auto allVioRegion = storm::api::parseRegion<storm::RationalFunction>(
"0.8<=p<=0.9,0.1<=q<=0.2", modelParameters);
370TYPED_TEST(SparseDtmcParameterLiftingMonotonicityTest, Simple1_Mon) {
371 typedef typename TestFixture::ValueType
ValueType;
373 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/simple1.pm";
374 std::string formulaAsString =
"P<0.75 [F s=3 ]";
375 std::string constantsAsString =
"";
380 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
382 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
388 modelParameters.insert(rewParameters.begin(), rewParameters.end());
395 auto allSatRegion = storm::api::parseRegion<storm::RationalFunction>(
"0.4<=p<=0.6", modelParameters);
402 auto exBothRegion = storm::api::parseRegion<storm::RationalFunction>(
"0.1<=p<=0.9", modelParameters);
406 auto allVioRegion = storm::api::parseRegion<storm::RationalFunction>(
"0.05<=p<=0.1", modelParameters);
411TYPED_TEST(SparseDtmcParameterLiftingMonotonicityTest, Casestudy1_Mon) {
412 typedef typename TestFixture::ValueType
ValueType;
414 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/casestudy1.pm";
415 std::string formulaAsString =
"P<0.5 [F s=3 ]";
416 std::string constantsAsString =
"";
421 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
423 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
429 modelParameters.insert(rewParameters.begin(), rewParameters.end());
436 auto allSatRegion = storm::api::parseRegion<storm::RationalFunction>(
"0.1<=p<=0.5", modelParameters);
443 auto exBothRegion = storm::api::parseRegion<storm::RationalFunction>(
"0.4<=p<=0.8", modelParameters);
447 auto allVioRegion = storm::api::parseRegion<storm::RationalFunction>(
"0.7<=p<=0.9", modelParameters);
452TYPED_TEST(SparseDtmcParameterLiftingMonotonicityTest, Casestudy2_Mon) {
453 typedef typename TestFixture::ValueType
ValueType;
455 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/casestudy2.pm";
456 std::string formulaAsString =
"P<0.5 [F s=4 ]";
457 std::string constantsAsString =
"";
462 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
464 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
470 modelParameters.insert(rewParameters.begin(), rewParameters.end());
477 auto allSatRegion = storm::api::parseRegion<storm::RationalFunction>(
"0.1<=p<=0.4", modelParameters);
484 auto exBothRegion = storm::api::parseRegion<storm::RationalFunction>(
"0.4<=p<=0.9", modelParameters);
488 auto allVioRegion = storm::api::parseRegion<storm::RationalFunction>(
"0.8<=p<=0.9", modelParameters);
493TYPED_TEST(SparseDtmcParameterLiftingMonotonicityTest, Casestudy3_Mon) {
494 typedef typename TestFixture::ValueType
ValueType;
496 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/casestudy3.pm";
497 std::string formulaAsString =
"P<0.5 [F s=3 ]";
498 std::string constantsAsString =
"";
503 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
505 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
511 modelParameters.insert(rewParameters.begin(), rewParameters.end());
517 model->getTransitionMatrix().printAsMatlabMatrix(std::cout);
521 ASSERT_TRUE(order->getDoneBuilding());
524 auto allSatRegion = storm::api::parseRegion<storm::RationalFunction>(
"0.6<=p<=0.9", modelParameters);
529 auto exBothRegion = storm::api::parseRegion<storm::RationalFunction>(
"0.3<=p<=0.7", modelParameters);
534 auto allVioRegion = storm::api::parseRegion<storm::RationalFunction>(
"0.1<=p<=0.4", modelParameters);
SolverEnvironment & solver()
void setPrecision(storm::RationalNumber value)
void setMethod(storm::solver::MinMaxMethod value, bool isSetFromDefault=false)
MinMaxSolverEnvironment & minMax()
std::map< std::shared_ptr< Order >, std::pair< std::shared_ptr< MonotonicityResult< VariableType > >, std::vector< std::shared_ptr< expressions::BinaryRelationExpression > > > > checkMonotonicityInBuild(std::ostream &outfile, bool usePLA=false, std::string dotOutfileName="dotOutput")
Builds Reachability Orders for the given model and simultaneously uses them to check for Monotonicity...
std::shared_ptr< LocalMonotonicityResult< VariableType > > createLocalMonotonicityResult(std::shared_ptr< Order > order, storage::ParameterRegion< ValueType > region)
Builds Reachability Orders for the given model and simultaneously uses them to check for Monotonicity...
std::shared_ptr< ModelType > as()
Casts the model into the model type given by the template parameter.
This class represents a discrete-time Markov chain.
Base class for all sparse models.
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::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)
std::vector< std::shared_ptr< storm::logic::Formula const > > extractFormulasFromProperties(std::vector< storm::jani::Property > const &properties)
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.
std::set< storm::RationalFunctionVariable > getProbabilityParameters(Model< storm::RationalFunction > const &model)
Get all probability parameters occurring on transitions.
storm::prism::Program preprocess(storm::prism::Program const &program, std::map< storm::expressions::Variable, storm::expressions::Expression > const &constantDefinitions)
TYPED_TEST(GraphTestAR, SymbolicProb01StochasticGameDieSmall)
TYPED_TEST_SUITE(GraphTestAR, TestingTypes,)
::testing::Types< Cudd, Sylvan > TestingTypes