1#include "storm-config.h"
19class DoubleSVIEnvironment {
21 typedef double ValueType;
23 static storm::Environment createEnvironment() {
24 storm::Environment env;
31class RationalPiEnvironment {
33 typedef storm::RationalNumber ValueType;
35 static storm::Environment createEnvironment() {
36 storm::Environment env;
42template<
typename TestType>
43class SparseDtmcParameterLiftingMonotonicityTest :
public ::testing::Test {
45 typedef typename TestType::ValueType ValueType;
46 SparseDtmcParameterLiftingMonotonicityTest() : _environment(TestType::createEnvironment()) {}
47 storm::Environment
const& env()
const {
50 virtual void SetUp() {
52 GTEST_SKIP() <<
"Z3 not available.";
54 carl::VariablePool::getInstance().clear();
56 virtual void TearDown() {
57 carl::VariablePool::getInstance().clear();
61 storm::Environment _environment;
64struct MonotonicityTestData {
65 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model;
66 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas;
67 std::set<storm::RationalFunctionVariable> modelParameters;
70void buildMonotonicityModel(std::string
const& programFile, std::string
const& formulaAsString, std::string
const& constantsAsString,
71 bool simplifyAndBisimulate, MonotonicityTestData& data) {
74 program = program.
preprocess(constantsAsString);
75 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
77 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
80 if (simplifyAndBisimulate) {
83 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
85 formulas[0] = simplifier.getSimplifiedFormula();
95 modelParameters.insert(rewParameters.begin(), rewParameters.end());
97 data.model = std::move(model);
98 data.formulas = std::move(formulas);
99 data.modelParameters = std::move(modelParameters);
102template<
typename ValueType>
104 std::vector<std::string>
const& regionStrings) {
107 auto monRes = monHelper.checkMonotonicityInBuild(std::cout);
108 auto order = monRes.begin()->first;
109 ASSERT_EQ(order->getNumberOfAddedStates(), data.model->getTransitionMatrix().getColumnCount());
110 ASSERT_TRUE(order->getDoneBuilding());
121 for (
auto const& regionString : regionStrings) {
128template<
typename ValueType>
130 std::vector<std::string>
const& regionStrings,
bool assertDoneBuilding =
false,
bool printMatrix =
false) {
132 data.model->getTransitionMatrix().printAsMatlabMatrix(std::cout);
135 auto order = monHelper.checkMonotonicityInBuild(std::cout).begin()->first;
136 if (assertDoneBuilding) {
137 ASSERT_TRUE(order->getDoneBuilding());
149 for (
auto const& regionString : regionStrings) {
151 monHelper.createLocalMonotonicityResult(order, region);
157typedef ::testing::Types<DoubleSVIEnvironment, RationalPiEnvironment>
TestingTypes;
161TYPED_TEST(SparseDtmcParameterLiftingMonotonicityTest, Brp_Prob_Mon_LEQ) {
162 typedef typename TestFixture::ValueType
ValueType;
163 MonotonicityTestData data;
164 buildMonotonicityModel(STORM_TEST_RESOURCES_DIR
"/pdtmc/brp16_2.pm",
"P<=0.84 [F s=5 ]",
"",
true, data);
165 checkBrpMonotonicity<ValueType>(this->env(), TypeParam::regionEngine, std::move(data),
166 {
"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"});
169TYPED_TEST(SparseDtmcParameterLiftingMonotonicityTest, Brp_Prob_Mon_GEQ) {
170 typedef typename TestFixture::ValueType
ValueType;
171 MonotonicityTestData data;
172 buildMonotonicityModel(STORM_TEST_RESOURCES_DIR
"/pdtmc/brp16_2.pm",
"P>=0.84 [F s=5 ]",
"",
true, data);
173 checkBrpMonotonicity<ValueType>(this->env(), TypeParam::regionEngine, std::move(data),
174 {
"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"});
177TYPED_TEST(SparseDtmcParameterLiftingMonotonicityTest, Brp_Prob_Mon_LEQ_Incr) {
178 typedef typename TestFixture::ValueType
ValueType;
179 MonotonicityTestData data;
180 buildMonotonicityModel(STORM_TEST_RESOURCES_DIR
"/pdtmc/brp16_2_mon_incr.pm",
"P<=0.84 [F s=5 ]",
"",
true, data);
181 checkBrpMonotonicity<ValueType>(this->env(), TypeParam::regionEngine, std::move(data),
182 {
"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"});
185TYPED_TEST(SparseDtmcParameterLiftingMonotonicityTest, Brp_Prob_Mon_GEQ_Incr) {
186 typedef typename TestFixture::ValueType
ValueType;
187 MonotonicityTestData data;
188 buildMonotonicityModel(STORM_TEST_RESOURCES_DIR
"/pdtmc/brp16_2_mon_incr.pm",
"P>=0.84 [F s=5 ]",
"",
true, data);
189 checkBrpMonotonicity<ValueType>(this->env(), TypeParam::regionEngine, std::move(data),
190 {
"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"});
193TYPED_TEST(SparseDtmcParameterLiftingMonotonicityTest, Parametric_Die_Mon) {
194 typedef typename TestFixture::ValueType
ValueType;
195 MonotonicityTestData data;
196 buildMonotonicityModel(STORM_TEST_RESOURCES_DIR
"/pdtmc/parametric_die_2.pm",
"P <=0.5 [F s=7 & d=2 ]",
"",
true, data);
197 checkSimpleMonotonicity<ValueType>(this->env(), TypeParam::regionEngine, std::move(data),
198 {
"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"});
201TYPED_TEST(SparseDtmcParameterLiftingMonotonicityTest, Simple1_Mon) {
202 typedef typename TestFixture::ValueType
ValueType;
203 MonotonicityTestData data;
204 buildMonotonicityModel(STORM_TEST_RESOURCES_DIR
"/pdtmc/simple1.pm",
"P<0.75 [F s=3 ]",
"",
false, data);
205 checkSimpleMonotonicity<ValueType>(this->env(), TypeParam::regionEngine, std::move(data), {
"0.4<=p<=0.6",
"0.1<=p<=0.9",
"0.05<=p<=0.1"});
208TYPED_TEST(SparseDtmcParameterLiftingMonotonicityTest, Casestudy1_Mon) {
209 typedef typename TestFixture::ValueType
ValueType;
210 MonotonicityTestData data;
211 buildMonotonicityModel(STORM_TEST_RESOURCES_DIR
"/pdtmc/casestudy1.pm",
"P<0.5 [F s=3 ]",
"",
false, data);
212 checkSimpleMonotonicity<ValueType>(this->env(), TypeParam::regionEngine, std::move(data), {
"0.1<=p<=0.5",
"0.4<=p<=0.8",
"0.7<=p<=0.9"});
215TYPED_TEST(SparseDtmcParameterLiftingMonotonicityTest, Casestudy2_Mon) {
216 typedef typename TestFixture::ValueType
ValueType;
217 MonotonicityTestData data;
218 buildMonotonicityModel(STORM_TEST_RESOURCES_DIR
"/pdtmc/casestudy2.pm",
"P<0.5 [F s=4 ]",
"",
false, data);
219 checkSimpleMonotonicity<ValueType>(this->env(), TypeParam::regionEngine, std::move(data), {
"0.1<=p<=0.4",
"0.4<=p<=0.9",
"0.8<=p<=0.9"});
222TYPED_TEST(SparseDtmcParameterLiftingMonotonicityTest, Casestudy3_Mon) {
223 typedef typename TestFixture::ValueType
ValueType;
224 MonotonicityTestData data;
225 buildMonotonicityModel(STORM_TEST_RESOURCES_DIR
"/pdtmc/casestudy3.pm",
"P<0.5 [F s=3 ]",
"",
false, data);
226 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);
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.
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...
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::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)
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::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)
storm::pars::modelchecker::MonotonicityOptions MonotonicitySetting
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.
TargetType convertNumber(SourceType const &number)
TYPED_TEST(GraphTestAR, SymbolicProb01StochasticGameDieSmall)
TYPED_TEST_SUITE(GraphTestAR, TestingTypes,)
::testing::Types< Cudd, Sylvan > TestingTypes