1#include "storm-config.h"
21class DoubleSVIEnvironment {
33class RationalPiEnvironment {
43template<
typename TestType>
44class SparseDtmcParameterLiftingMonotonicityTest :
public ::testing::Test {
46 typedef typename TestType::ValueType
ValueType;
47 SparseDtmcParameterLiftingMonotonicityTest() : _environment(TestType::createEnvironment()) {}
53 bool useMonotonicity) {
58 virtual void SetUp() {
60 GTEST_SKIP() <<
"Z3 not available.";
62 carl::VariablePool::getInstance().clear();
64 virtual void TearDown() {
65 carl::VariablePool::getInstance().clear();
72typedef ::testing::Types<DoubleSVIEnvironment, RationalPiEnvironment>
TestingTypes;
76TYPED_TEST(SparseDtmcParameterLiftingMonotonicityTest, Brp_Prob_Mon_LEQ) {
77 typedef typename TestFixture::ValueType
ValueType;
79 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/brp16_2.pm";
80 std::string formulaAsString =
"P<=0.84 [F s=5 ]";
81 std::string constantsAsString =
"";
86 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
88 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
93 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
95 formulas[0] = simplifier.getSimplifiedFormula();
99 if (storm::settings::getModule<storm::settings::modules::BisimulationSettings>().isWeakBisimulationSet()) {
102 model = storm::api::performBisimulationMinimization<storm::RationalFunction>(model, formulas, bisimType)
108 modelParameters.insert(rewParameters.begin(), rewParameters.end());
113 auto order = monRes.begin()->first;
114 ASSERT_EQ(order->getNumberOfAddedStates(), model->getTransitionMatrix().getColumnCount());
115 ASSERT_TRUE(order->getDoneBuilding());
117 std::make_shared<storm::analysis::LocalMonotonicityResult<storm::RationalFunctionVariable>>(monRes.begin()->second.first, order->getNumberOfStates());
124 auto allSatRegion = storm::api::parseRegion<storm::RationalFunction>(
"0.7<=pL<=0.9,0.75<=pK<=0.95", modelParameters);
128 auto exBothRegion = storm::api::parseRegion<storm::RationalFunction>(
"0.4<=pL<=0.65,0.75<=pK<=0.95", modelParameters);
132 auto allVioRegion = storm::api::parseRegion<storm::RationalFunction>(
"0.1<=pL<=0.73,0.2<=pK<=0.715", modelParameters);
137TYPED_TEST(SparseDtmcParameterLiftingMonotonicityTest, Brp_Prob_Mon_GEQ) {
138 typedef typename TestFixture::ValueType
ValueType;
140 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/brp16_2.pm";
141 std::string formulaAsString =
"P>=0.84 [F s=5 ]";
142 std::string constantsAsString =
"";
147 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
149 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
154 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
156 formulas[0] = simplifier.getSimplifiedFormula();
160 if (storm::settings::getModule<storm::settings::modules::BisimulationSettings>().isWeakBisimulationSet()) {
163 model = storm::api::performBisimulationMinimization<storm::RationalFunction>(model, formulas, bisimType)
169 modelParameters.insert(rewParameters.begin(), rewParameters.end());
174 auto order = monRes.begin()->first;
175 ASSERT_EQ(order->getNumberOfAddedStates(), model->getTransitionMatrix().getColumnCount());
176 ASSERT_TRUE(order->getDoneBuilding());
178 std::make_shared<storm::analysis::LocalMonotonicityResult<storm::RationalFunctionVariable>>(monRes.begin()->second.first, order->getNumberOfStates());
185 auto allSatRegion = storm::api::parseRegion<storm::RationalFunction>(
"0.1<=pL<=0.73,0.2<=pK<=0.715", modelParameters);
189 auto exBothRegion = storm::api::parseRegion<storm::RationalFunction>(
"0.4<=pL<=0.65,0.75<=pK<=0.95", modelParameters);
193 auto allVioRegion = storm::api::parseRegion<storm::RationalFunction>(
"0.7<=pL<=0.9,0.75<=pK<=0.95", modelParameters);
198TYPED_TEST(SparseDtmcParameterLiftingMonotonicityTest, Brp_Prob_Mon_LEQ_Incr) {
199 typedef typename TestFixture::ValueType
ValueType;
201 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/brp16_2_mon_incr.pm";
202 std::string formulaAsString =
"P<=0.84 [F s=5 ]";
203 std::string constantsAsString =
"";
208 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
210 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
215 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
217 formulas[0] = simplifier.getSimplifiedFormula();
221 if (storm::settings::getModule<storm::settings::modules::BisimulationSettings>().isWeakBisimulationSet()) {
224 model = storm::api::performBisimulationMinimization<storm::RationalFunction>(model, formulas, bisimType)
230 modelParameters.insert(rewParameters.begin(), rewParameters.end());
235 auto order = monRes.begin()->first;
236 ASSERT_EQ(order->getNumberOfAddedStates(), model->getTransitionMatrix().getColumnCount());
237 ASSERT_TRUE(order->getDoneBuilding());
239 std::make_shared<storm::analysis::LocalMonotonicityResult<storm::RationalFunctionVariable>>(monRes.begin()->second.first, order->getNumberOfStates());
246 auto allSatRegion = storm::api::parseRegion<storm::RationalFunction>(
"0.7<=pL<=0.9,0.75<=pK<=0.95", modelParameters);
250 auto exBothRegion = storm::api::parseRegion<storm::RationalFunction>(
"0.4<=pL<=0.65,0.75<=pK<=0.95", modelParameters);
254 auto allVioRegion = storm::api::parseRegion<storm::RationalFunction>(
"0.1<=pL<=0.73,0.2<=pK<=0.715", modelParameters);
259TYPED_TEST(SparseDtmcParameterLiftingMonotonicityTest, Brp_Prob_Mon_GEQ_Incr) {
260 typedef typename TestFixture::ValueType
ValueType;
262 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/brp16_2_mon_incr.pm";
263 std::string formulaAsString =
"P>=0.84 [F s=5 ]";
264 std::string constantsAsString =
"";
269 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
271 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
276 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
278 formulas[0] = simplifier.getSimplifiedFormula();
282 if (storm::settings::getModule<storm::settings::modules::BisimulationSettings>().isWeakBisimulationSet()) {
285 model = storm::api::performBisimulationMinimization<storm::RationalFunction>(model, formulas, bisimType)
291 modelParameters.insert(rewParameters.begin(), rewParameters.end());
296 auto order = monRes.begin()->first;
297 ASSERT_EQ(order->getNumberOfAddedStates(), model->getTransitionMatrix().getColumnCount());
298 ASSERT_TRUE(order->getDoneBuilding());
300 std::make_shared<storm::analysis::LocalMonotonicityResult<storm::RationalFunctionVariable>>(monRes.begin()->second.first, order->getNumberOfStates());
307 auto allSatRegion = storm::api::parseRegion<storm::RationalFunction>(
"0.1<=pL<=0.73,0.2<=pK<=0.715", modelParameters);
311 auto exBothRegion = storm::api::parseRegion<storm::RationalFunction>(
"0.4<=pL<=0.65,0.75<=pK<=0.95", modelParameters);
315 auto allVioRegion = storm::api::parseRegion<storm::RationalFunction>(
"0.7<=pL<=0.9,0.75<=pK<=0.95", modelParameters);
320TYPED_TEST(SparseDtmcParameterLiftingMonotonicityTest, Parametric_Die_Mon) {
321 typedef typename TestFixture::ValueType
ValueType;
323 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/parametric_die_2.pm";
324 std::string formulaAsString =
"P <=0.5 [F s=7 & d=2 ]";
325 std::string constantsAsString =
"";
330 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
332 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
338 modelParameters.insert(rewParameters.begin(), rewParameters.end());
342 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
344 formulas[0] = simplifier.getSimplifiedFormula();
348 if (storm::settings::getModule<storm::settings::modules::BisimulationSettings>().isWeakBisimulationSet()) {
351 model = storm::api::performBisimulationMinimization<storm::RationalFunction>(model, formulas, bisimType)
359 auto allSatRegion = storm::api::parseRegion<storm::RationalFunction>(
"0.1<=p<=0.2,0.8<=q<=0.9", modelParameters);
366 auto exBothRegion = storm::api::parseRegion<storm::RationalFunction>(
"0.1<=p<=0.9,0.1<=q<=0.9", modelParameters);
370 auto allVioRegion = storm::api::parseRegion<storm::RationalFunction>(
"0.8<=p<=0.9,0.1<=q<=0.2", modelParameters);
375TYPED_TEST(SparseDtmcParameterLiftingMonotonicityTest, Simple1_Mon) {
376 typedef typename TestFixture::ValueType
ValueType;
378 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/simple1.pm";
379 std::string formulaAsString =
"P<0.75 [F s=3 ]";
380 std::string constantsAsString =
"";
385 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
387 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
393 modelParameters.insert(rewParameters.begin(), rewParameters.end());
400 auto allSatRegion = storm::api::parseRegion<storm::RationalFunction>(
"0.4<=p<=0.6", modelParameters);
407 auto exBothRegion = storm::api::parseRegion<storm::RationalFunction>(
"0.1<=p<=0.9", modelParameters);
411 auto allVioRegion = storm::api::parseRegion<storm::RationalFunction>(
"0.05<=p<=0.1", modelParameters);
416TYPED_TEST(SparseDtmcParameterLiftingMonotonicityTest, Casestudy1_Mon) {
417 typedef typename TestFixture::ValueType
ValueType;
419 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/casestudy1.pm";
420 std::string formulaAsString =
"P<0.5 [F s=3 ]";
421 std::string constantsAsString =
"";
426 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
428 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
434 modelParameters.insert(rewParameters.begin(), rewParameters.end());
441 auto allSatRegion = storm::api::parseRegion<storm::RationalFunction>(
"0.1<=p<=0.5", modelParameters);
448 auto exBothRegion = storm::api::parseRegion<storm::RationalFunction>(
"0.4<=p<=0.8", modelParameters);
452 auto allVioRegion = storm::api::parseRegion<storm::RationalFunction>(
"0.7<=p<=0.9", modelParameters);
457TYPED_TEST(SparseDtmcParameterLiftingMonotonicityTest, Casestudy2_Mon) {
458 typedef typename TestFixture::ValueType
ValueType;
460 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/casestudy2.pm";
461 std::string formulaAsString =
"P<0.5 [F s=4 ]";
462 std::string constantsAsString =
"";
467 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
469 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
475 modelParameters.insert(rewParameters.begin(), rewParameters.end());
482 auto allSatRegion = storm::api::parseRegion<storm::RationalFunction>(
"0.1<=p<=0.4", modelParameters);
489 auto exBothRegion = storm::api::parseRegion<storm::RationalFunction>(
"0.4<=p<=0.9", modelParameters);
493 auto allVioRegion = storm::api::parseRegion<storm::RationalFunction>(
"0.8<=p<=0.9", modelParameters);
498TYPED_TEST(SparseDtmcParameterLiftingMonotonicityTest, Casestudy3_Mon) {
499 typedef typename TestFixture::ValueType
ValueType;
501 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/casestudy3.pm";
502 std::string formulaAsString =
"P<0.5 [F s=3 ]";
503 std::string constantsAsString =
"";
508 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
510 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
516 modelParameters.insert(rewParameters.begin(), rewParameters.end());
522 model->getTransitionMatrix().printAsMatlabMatrix(std::cout);
526 ASSERT_TRUE(order->getDoneBuilding());
529 auto allSatRegion = storm::api::parseRegion<storm::RationalFunction>(
"0.6<=p<=0.9", modelParameters);
534 auto exBothRegion = storm::api::parseRegion<storm::RationalFunction>(
"0.3<=p<=0.7", modelParameters);
539 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