1#include "storm-config.h"
4#pragma clang diagnostic push
5#pragma clang diagnostic ignored "-Wthread-safety-negative"
6#pragma clang diagnostic ignored "-Wundefined-reinterpret-cast"
7#pragma clang diagnostic ignored "-Wunused-template"
8#include <carl/util/stringparser.h>
9#pragma clang diagnostic pop
28 GTEST_SKIP() <<
"Z3 not available.";
42 EXPECT_TRUE(constFunctionRes.first);
43 EXPECT_TRUE(constFunctionRes.second);
48 EXPECT_TRUE(constFunctionRes.first);
49 EXPECT_FALSE(constFunctionRes.second);
54 EXPECT_FALSE(constFunctionRes.first);
55 EXPECT_TRUE(constFunctionRes.second);
57 std::shared_ptr<storm::RawPolynomialCache> cache = std::make_shared<storm::RawPolynomialCache>();
58 carl::StringParser parser;
59 parser.setVariables({
"p",
"q"});
65 auto varsP = functionP.gatherVariables();
66 auto varsQ = functionQ.gatherVariables();
69 for (
auto var : varsP) {
74 lowerBoundaries2.emplace(std::make_pair(var, lb));
75 upperBoundaries2.emplace(std::make_pair(var, ub));
77 for (
auto var : varsQ) {
82 lowerBoundaries2.emplace(std::make_pair(var, lb));
83 upperBoundaries2.emplace(std::make_pair(var, ub));
88 auto function = functionP;
90 EXPECT_TRUE(functionRes.first);
91 EXPECT_FALSE(functionRes.second);
96 EXPECT_TRUE(functionDecrRes.first);
97 EXPECT_FALSE(functionDecrRes.second);
102 EXPECT_FALSE(functionNonMonotonicRes.first);
103 EXPECT_FALSE(functionNonMonotonicRes.second);
108 EXPECT_FALSE(functionDecrRes.first);
109 EXPECT_TRUE(functionDecrRes.second);
112 function = functionP * functionQ;
114 EXPECT_TRUE(functionRes.first);
115 EXPECT_FALSE(functionRes.second);
119 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/brp16_2.pm";
120 std::string formulaAsString =
"P=? [true U s=4 & i=N ]";
121 std::string constantsAsString =
"";
125 program = program.
preprocess(constantsAsString);
126 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
128 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
131 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
132 model = simplifier.getSimplifiedModel();
139 ASSERT_EQ(99ul, model->getNumberOfStates());
140 ASSERT_EQ(195ul, model->getNumberOfTransitions());
145 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
152 EXPECT_EQ(1ul, result.size());
155 auto order = result.begin()->first;
156 auto monotonicityResult = result.begin()->second.first;
157 EXPECT_TRUE(monotonicityResult->isDone());
158 EXPECT_TRUE(monotonicityResult->existsMonotonicity());
159 EXPECT_TRUE(monotonicityResult->isAllMonotonicity());
160 auto assumptions = result.begin()->second.second;
161 EXPECT_EQ(0ul, assumptions.size());
164 auto monRes = monotonicityResult->getMonotonicityResult();
165 for (
auto entry : monRes) {
171 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/brp16_2.pm";
172 std::string formulaAsString =
"P=? [true U s=4 & i=N ]";
173 std::string constantsAsString =
"";
177 program = program.
preprocess(constantsAsString);
178 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
180 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
183 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
184 model = simplifier.getSimplifiedModel();
191 ASSERT_EQ(99ul, model->getNumberOfStates());
192 ASSERT_EQ(195ul, model->getNumberOfTransitions());
197 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
204 EXPECT_EQ(1ul, result.size());
207 auto order = result.begin()->first;
208 auto monotonicityResult = result.begin()->second.first;
209 EXPECT_TRUE(monotonicityResult->isDone());
210 EXPECT_TRUE(monotonicityResult->existsMonotonicity());
211 EXPECT_TRUE(monotonicityResult->isAllMonotonicity());
212 auto assumptions = result.begin()->second.second;
213 EXPECT_EQ(0ul, assumptions.size());
216 auto monRes = monotonicityResult->getMonotonicityResult();
217 for (
auto entry : monRes) {
223 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/zeroconf4.pm";
224 std::string formulaAsString =
"P > 0.5 [ F s=5 ]";
225 std::string constantsAsString =
"n = 4";
229 program = program.
preprocess(constantsAsString);
230 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
232 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
235 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
236 model = simplifier.getSimplifiedModel();
242 ASSERT_EQ(7ul, model->getNumberOfStates());
243 ASSERT_EQ(12ul, model->getNumberOfTransitions());
248 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
253 auto result = MonotonicityHelper.checkMonotonicityInBuild(std::cout,
false);
254 EXPECT_EQ(1ul, result.size());
257 auto order = result.begin()->first;
258 auto monotonicityResult = result.begin()->second.first;
259 EXPECT_TRUE(monotonicityResult->isDone());
260 EXPECT_TRUE(monotonicityResult->existsMonotonicity());
261 EXPECT_TRUE(monotonicityResult->isAllMonotonicity());
263 auto assumptions = result.begin()->second.second;
264 EXPECT_EQ(0ul, assumptions.size());
267 auto monRes = monotonicityResult->getMonotonicityResult();
268 for (
auto entry : monRes) {
274 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/simple1.pm";
275 std::string formulaAsString =
"P > 0.5 [ F s=3 ]";
276 std::string constantsAsString =
"";
280 program = program.
preprocess(constantsAsString);
281 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
283 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
286 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
287 model = simplifier.getSimplifiedModel();
288 ASSERT_EQ(5ul, model->getNumberOfStates());
289 ASSERT_EQ(8ul, model->getNumberOfTransitions());
294 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
300 auto result = MonotonicityHelper.checkMonotonicityInBuild(std::cout,
false);
301 EXPECT_EQ(1ul, result.size());
304 auto order = result.begin()->first;
305 auto monotonicityResult = result.begin()->second.first;
306 EXPECT_TRUE(monotonicityResult->isDone());
307 EXPECT_FALSE(monotonicityResult->existsMonotonicity());
308 EXPECT_FALSE(monotonicityResult->isAllMonotonicity());
309 auto assumptions = result.begin()->second.second;
310 EXPECT_EQ(0ul, assumptions.size());
313 auto monRes = monotonicityResult->getMonotonicityResult();
314 for (
auto entry : monRes) {
320 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/casestudy1.pm";
321 std::string formulaAsString =
"P > 0.5 [ F s=3 ]";
322 std::string constantsAsString =
"";
326 program = program.
preprocess(constantsAsString);
327 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
329 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
332 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
333 model = simplifier.getSimplifiedModel();
338 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
340 ASSERT_EQ(5ul, model->getNumberOfStates());
341 ASSERT_EQ(8ul, model->getNumberOfTransitions());
344 auto result = MonotonicityHelper.checkMonotonicityInBuild(std::cout,
false);
345 ASSERT_EQ(1ul, result.size());
347 auto order = result.begin()->first;
348 auto monotonicityResult = result.begin()->second.first;
349 EXPECT_TRUE(monotonicityResult->isDone());
350 EXPECT_TRUE(monotonicityResult->existsMonotonicity());
351 EXPECT_TRUE(monotonicityResult->isAllMonotonicity());
352 auto assumptions = result.begin()->second.second;
353 EXPECT_EQ(0ul, assumptions.size());
355 auto monRes = monotonicityResult->getMonotonicityResult();
356 for (
auto entry : monRes) {
362 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/casestudy2.pm";
363 std::string formulaAsString =
"P > 0.5 [ F s=4 ]";
364 std::string constantsAsString =
"";
368 program = program.
preprocess(constantsAsString);
369 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
371 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
374 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
375 model = simplifier.getSimplifiedModel();
380 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
382 ASSERT_EQ(6ul, model->getNumberOfStates());
383 ASSERT_EQ(12ul, model->getNumberOfTransitions());
389 auto result = monotonicityHelper.checkMonotonicityInBuild(std::cout,
false);
390 EXPECT_EQ(1ul, result.size());
391 EXPECT_FALSE(result.begin()->first->getDoneBuilding());
395 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/casestudy3.pm";
396 std::string formulaAsString =
"P > 0.5 [ F s=3 ]";
397 std::string constantsAsString =
"";
401 program = program.
preprocess(constantsAsString);
402 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
404 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
407 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
408 model = simplifier.getSimplifiedModel();
413 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
415 ASSERT_EQ(5ul, model->getNumberOfStates());
416 ASSERT_EQ(8ul, model->getNumberOfTransitions());
419 auto result = MonotonicityHelper.checkMonotonicityInBuild(std::cout,
false);
421 ASSERT_EQ(1ul, result.size());
422 auto order = result.begin()->first;
424 auto monotonicityResult = result.begin()->second.first;
425 EXPECT_TRUE(monotonicityResult->isDone());
426 EXPECT_FALSE(monotonicityResult->existsMonotonicity());
427 EXPECT_FALSE(monotonicityResult->isAllMonotonicity());
428 auto assumptions = result.begin()->second.second;
429 EXPECT_EQ(0ul, assumptions.size());
431 auto monRes = monotonicityResult->getMonotonicityResult();
432 for (
auto entry : monRes) {
438 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/casestudy3.pm";
439 std::string formulaAsString =
"P > 0.5 [ F s=3 ]";
440 std::string constantsAsString =
"";
444 program = program.
preprocess(constantsAsString);
445 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
447 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
450 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
451 model = simplifier.getSimplifiedModel();
456 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
458 ASSERT_EQ(5ul, model->getNumberOfStates());
459 ASSERT_EQ(8ul, model->getNumberOfTransitions());
462 auto result = MonotonicityHelper.checkMonotonicityInBuild(std::cout,
false);
464 ASSERT_EQ(1ul, result.size());
465 auto order = result.begin()->first;
467 auto monotonicityResult = result.begin()->second.first;
468 EXPECT_TRUE(monotonicityResult->isDone());
469 EXPECT_TRUE(monotonicityResult->existsMonotonicity());
470 EXPECT_TRUE(monotonicityResult->isAllMonotonicity());
471 auto assumptions = result.begin()->second.second;
472 EXPECT_EQ(0ul, assumptions.size());
474 auto monRes = monotonicityResult->getMonotonicityResult();
475 for (
auto entry : monRes) {
TEST_F(MonotonicityHelperTest, Derivative_checker)
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...
static std::pair< bool, bool > checkDerivative(ValueType derivative, storage::ParameterRegion< ValueType > reg)
Checks if a derivative >=0 or/and <=0.
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...
storm::utility::parametric::CoefficientType< ParametricType >::type CoefficientType
storm::utility::parametric::Valuation< ParametricType > Valuation
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::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::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)
std::set< storm::RationalFunctionVariable > getProbabilityParameters(Model< storm::RationalFunction > const &model)
Get all probability parameters occurring on transitions.
std::map< typename VariableType< FunctionType >::type, typename CoefficientType< FunctionType >::type > Valuation
TargetType convertNumber(SourceType const &number)
carl::FactorizedPolynomial< RawPolynomial > Polynomial
carl::RationalFunction< Polynomial, true > RationalFunction