1#include "storm-config.h"
4#include <carl/util/stringparser.h>
18 GTEST_SKIP() <<
"Z3 not available.";
32 EXPECT_TRUE(constFunctionRes.first);
33 EXPECT_TRUE(constFunctionRes.second);
38 EXPECT_TRUE(constFunctionRes.first);
39 EXPECT_FALSE(constFunctionRes.second);
44 EXPECT_FALSE(constFunctionRes.first);
45 EXPECT_TRUE(constFunctionRes.second);
47 std::shared_ptr<storm::RawPolynomialCache> cache = std::make_shared<storm::RawPolynomialCache>();
48 carl::StringParser parser;
49 parser.setVariables({
"p",
"q"});
55 auto varsP = functionP.gatherVariables();
56 auto varsQ = functionQ.gatherVariables();
59 for (
auto var : varsP) {
64 lowerBoundaries2.emplace(std::make_pair(var, lb));
65 upperBoundaries2.emplace(std::make_pair(var, ub));
67 for (
auto var : varsQ) {
72 lowerBoundaries2.emplace(std::make_pair(var, lb));
73 upperBoundaries2.emplace(std::make_pair(var, ub));
78 auto function = functionP;
80 EXPECT_TRUE(functionRes.first);
81 EXPECT_FALSE(functionRes.second);
86 EXPECT_TRUE(functionDecrRes.first);
87 EXPECT_FALSE(functionDecrRes.second);
92 EXPECT_FALSE(functionNonMonotonicRes.first);
93 EXPECT_FALSE(functionNonMonotonicRes.second);
98 EXPECT_FALSE(functionDecrRes.first);
99 EXPECT_TRUE(functionDecrRes.second);
102 function = functionP * functionQ;
104 EXPECT_TRUE(functionRes.first);
105 EXPECT_FALSE(functionRes.second);
109 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/brp16_2.pm";
110 std::string formulaAsString =
"P=? [true U s=4 & i=N ]";
111 std::string constantsAsString =
"";
116 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
118 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
121 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
122 model = simplifier.getSimplifiedModel();
132 ASSERT_EQ(99ul, model->getNumberOfStates());
133 ASSERT_EQ(195ul, model->getNumberOfTransitions());
138 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
145 EXPECT_EQ(1ul, result.size());
148 auto order = result.begin()->first;
149 auto monotonicityResult = result.begin()->second.first;
150 EXPECT_TRUE(monotonicityResult->isDone());
151 EXPECT_TRUE(monotonicityResult->existsMonotonicity());
152 EXPECT_TRUE(monotonicityResult->isAllMonotonicity());
153 auto assumptions = result.begin()->second.second;
154 EXPECT_EQ(0ul, assumptions.size());
157 auto monRes = monotonicityResult->getMonotonicityResult();
158 for (
auto entry : monRes) {
164 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/brp16_2.pm";
165 std::string formulaAsString =
"P=? [true U s=4 & i=N ]";
166 std::string constantsAsString =
"";
171 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
173 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
176 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
177 model = simplifier.getSimplifiedModel();
187 ASSERT_EQ(99ul, model->getNumberOfStates());
188 ASSERT_EQ(195ul, model->getNumberOfTransitions());
193 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
200 EXPECT_EQ(1ul, result.size());
203 auto order = result.begin()->first;
204 auto monotonicityResult = result.begin()->second.first;
205 EXPECT_TRUE(monotonicityResult->isDone());
206 EXPECT_TRUE(monotonicityResult->existsMonotonicity());
207 EXPECT_TRUE(monotonicityResult->isAllMonotonicity());
208 auto assumptions = result.begin()->second.second;
209 EXPECT_EQ(0ul, assumptions.size());
212 auto monRes = monotonicityResult->getMonotonicityResult();
213 for (
auto entry : monRes) {
219 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/zeroconf4.pm";
220 std::string formulaAsString =
"P > 0.5 [ F s=5 ]";
221 std::string constantsAsString =
"n = 4";
226 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
228 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
231 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
232 model = simplifier.getSimplifiedModel();
241 ASSERT_EQ(7ul, model->getNumberOfStates());
242 ASSERT_EQ(12ul, model->getNumberOfTransitions());
247 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
252 auto result = MonotonicityHelper.checkMonotonicityInBuild(std::cout,
false);
253 EXPECT_EQ(1ul, result.size());
256 auto order = result.begin()->first;
257 auto monotonicityResult = result.begin()->second.first;
258 EXPECT_TRUE(monotonicityResult->isDone());
259 EXPECT_TRUE(monotonicityResult->existsMonotonicity());
260 EXPECT_TRUE(monotonicityResult->isAllMonotonicity());
262 auto assumptions = result.begin()->second.second;
263 EXPECT_EQ(0ul, assumptions.size());
266 auto monRes = monotonicityResult->getMonotonicityResult();
267 for (
auto entry : monRes) {
273 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/simple1.pm";
274 std::string formulaAsString =
"P > 0.5 [ F s=3 ]";
275 std::string constantsAsString =
"";
280 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
282 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
285 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
286 model = simplifier.getSimplifiedModel();
287 ASSERT_EQ(5ul, model->getNumberOfStates());
288 ASSERT_EQ(8ul, model->getNumberOfTransitions());
293 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
299 auto result = MonotonicityHelper.checkMonotonicityInBuild(std::cout,
false);
300 EXPECT_EQ(1ul, result.size());
303 auto order = result.begin()->first;
304 auto monotonicityResult = result.begin()->second.first;
305 EXPECT_TRUE(monotonicityResult->isDone());
306 EXPECT_FALSE(monotonicityResult->existsMonotonicity());
307 EXPECT_FALSE(monotonicityResult->isAllMonotonicity());
308 auto assumptions = result.begin()->second.second;
309 EXPECT_EQ(0ul, assumptions.size());
312 auto monRes = monotonicityResult->getMonotonicityResult();
313 for (
auto entry : monRes) {
319 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/casestudy1.pm";
320 std::string formulaAsString =
"P > 0.5 [ F s=3 ]";
321 std::string constantsAsString =
"";
326 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
328 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
331 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
332 model = simplifier.getSimplifiedModel();
337 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
339 ASSERT_EQ(5ul, model->getNumberOfStates());
340 ASSERT_EQ(8ul, model->getNumberOfTransitions());
343 auto result = MonotonicityHelper.checkMonotonicityInBuild(std::cout,
false);
344 ASSERT_EQ(1ul, result.size());
346 auto order = result.begin()->first;
347 auto monotonicityResult = result.begin()->second.first;
348 EXPECT_TRUE(monotonicityResult->isDone());
349 EXPECT_TRUE(monotonicityResult->existsMonotonicity());
350 EXPECT_TRUE(monotonicityResult->isAllMonotonicity());
351 auto assumptions = result.begin()->second.second;
352 EXPECT_EQ(0ul, assumptions.size());
354 auto monRes = monotonicityResult->getMonotonicityResult();
355 for (
auto entry : monRes) {
361 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/casestudy2.pm";
362 std::string formulaAsString =
"P > 0.5 [ F s=4 ]";
363 std::string constantsAsString =
"";
368 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
370 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
373 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
374 model = simplifier.getSimplifiedModel();
379 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
381 ASSERT_EQ(6ul, model->getNumberOfStates());
382 ASSERT_EQ(12ul, model->getNumberOfTransitions());
388 auto result = monotonicityHelper.checkMonotonicityInBuild(std::cout,
false);
389 EXPECT_EQ(1ul, result.size());
390 EXPECT_FALSE(result.begin()->first->getDoneBuilding());
394 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/casestudy3.pm";
395 std::string formulaAsString =
"P > 0.5 [ F s=3 ]";
396 std::string constantsAsString =
"";
401 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
403 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
406 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
407 model = simplifier.getSimplifiedModel();
412 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
414 ASSERT_EQ(5ul, model->getNumberOfStates());
415 ASSERT_EQ(8ul, model->getNumberOfTransitions());
418 auto result = MonotonicityHelper.checkMonotonicityInBuild(std::cout,
false);
420 ASSERT_EQ(1ul, result.size());
421 auto order = result.begin()->first;
423 auto monotonicityResult = result.begin()->second.first;
424 EXPECT_TRUE(monotonicityResult->isDone());
425 EXPECT_FALSE(monotonicityResult->existsMonotonicity());
426 EXPECT_FALSE(monotonicityResult->isAllMonotonicity());
427 auto assumptions = result.begin()->second.second;
428 EXPECT_EQ(0ul, assumptions.size());
430 auto monRes = monotonicityResult->getMonotonicityResult();
431 for (
auto entry : monRes) {
437 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/casestudy3.pm";
438 std::string formulaAsString =
"P > 0.5 [ F s=3 ]";
439 std::string constantsAsString =
"";
444 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
446 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
449 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
450 model = simplifier.getSimplifiedModel();
455 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
457 ASSERT_EQ(5ul, model->getNumberOfStates());
458 ASSERT_EQ(8ul, model->getNumberOfTransitions());
461 auto result = MonotonicityHelper.checkMonotonicityInBuild(std::cout,
false);
463 ASSERT_EQ(1ul, result.size());
464 auto order = result.begin()->first;
466 auto monotonicityResult = result.begin()->second.first;
467 EXPECT_TRUE(monotonicityResult->isDone());
468 EXPECT_TRUE(monotonicityResult->existsMonotonicity());
469 EXPECT_TRUE(monotonicityResult->isAllMonotonicity());
470 auto assumptions = result.begin()->second.second;
471 EXPECT_EQ(0ul, assumptions.size());
473 auto monRes = monotonicityResult->getMonotonicityResult();
474 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.
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 > > buildSparseModel(storm::storage::SymbolicModelDescription const &model, storm::builder::BuilderOptions const &options)
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 > > 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::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.
SettingsType const & getModule()
Get module.
std::map< typename VariableType< FunctionType >::type, typename CoefficientType< FunctionType >::type > Valuation
storm::prism::Program preprocess(storm::prism::Program const &program, std::map< storm::expressions::Variable, storm::expressions::Expression > const &constantDefinitions)
TargetType convertNumber(SourceType const &number)
carl::FactorizedPolynomial< RawPolynomial > Polynomial
carl::RationalFunction< Polynomial, true > RationalFunction