1#include "storm-config.h"
6#pragma clang diagnostic push
7#pragma clang diagnostic ignored "-Wthread-safety-negative"
8#pragma clang diagnostic ignored "-Wundefined-reinterpret-cast"
9#pragma clang diagnostic ignored "-Wunused-template"
10#include <carl/util/stringparser.h>
11#pragma clang diagnostic pop
30 GTEST_SKIP() <<
"Z3 not available.";
44 EXPECT_TRUE(constFunctionRes.first);
45 EXPECT_TRUE(constFunctionRes.second);
50 EXPECT_TRUE(constFunctionRes.first);
51 EXPECT_FALSE(constFunctionRes.second);
56 EXPECT_FALSE(constFunctionRes.first);
57 EXPECT_TRUE(constFunctionRes.second);
59 std::shared_ptr<storm::RawPolynomialCache> cache = std::make_shared<storm::RawPolynomialCache>();
60 carl::StringParser parser;
61 parser.setVariables({
"p",
"q"});
67 auto varsP = functionP.gatherVariables();
68 auto varsQ = functionQ.gatherVariables();
71 for (
auto var : varsP) {
76 lowerBoundaries2.emplace(std::make_pair(var, lb));
77 upperBoundaries2.emplace(std::make_pair(var, ub));
79 for (
auto var : varsQ) {
84 lowerBoundaries2.emplace(std::make_pair(var, lb));
85 upperBoundaries2.emplace(std::make_pair(var, ub));
90 auto function = functionP;
92 EXPECT_TRUE(functionRes.first);
93 EXPECT_FALSE(functionRes.second);
98 EXPECT_TRUE(functionDecrRes.first);
99 EXPECT_FALSE(functionDecrRes.second);
104 EXPECT_FALSE(functionNonMonotonicRes.first);
105 EXPECT_FALSE(functionNonMonotonicRes.second);
110 EXPECT_FALSE(functionDecrRes.first);
111 EXPECT_TRUE(functionDecrRes.second);
114 function = functionP * functionQ;
116 EXPECT_TRUE(functionRes.first);
117 EXPECT_FALSE(functionRes.second);
121 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/brp16_2.pm";
122 std::string formulaAsString =
"P=? [true U s=4 & i=N ]";
123 std::string constantsAsString =
"";
127 program = program.
preprocess(constantsAsString);
128 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
130 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
133 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
134 model = simplifier.getSimplifiedModel();
138 ASSERT_EQ(99ul, model->getNumberOfStates());
139 ASSERT_EQ(195ul, model->getNumberOfTransitions());
144 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
151 EXPECT_EQ(1ul, result.size());
154 auto order = result.front().order;
155 auto monotonicityResult = result.front().monotonicityResult;
156 EXPECT_TRUE(monotonicityResult->isDone());
157 EXPECT_TRUE(monotonicityResult->existsMonotonicity());
158 EXPECT_TRUE(monotonicityResult->isAllMonotonicity());
159 auto assumptions = result.front().assumptions;
160 EXPECT_EQ(0ul, assumptions.size());
163 auto monRes = monotonicityResult->getMonotonicityResult();
164 for (
auto entry : monRes) {
170 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/brp16_2.pm";
171 std::string formulaAsString =
"P=? [true U s=4 & i=N ]";
172 std::string constantsAsString =
"";
176 program = program.
preprocess(constantsAsString);
177 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
179 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
182 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
183 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.front().order;
204 auto monotonicityResult = result.front().monotonicityResult;
205 EXPECT_TRUE(monotonicityResult->isDone());
206 EXPECT_TRUE(monotonicityResult->existsMonotonicity());
207 EXPECT_TRUE(monotonicityResult->isAllMonotonicity());
208 auto assumptions = result.front().assumptions;
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";
225 program = program.
preprocess(constantsAsString);
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();
235 ASSERT_EQ(7ul, model->getNumberOfStates());
236 ASSERT_EQ(12ul, model->getNumberOfTransitions());
241 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
246 auto result = MonotonicityHelper.checkMonotonicityInBuild(std::cout,
false);
247 EXPECT_EQ(1ul, result.size());
250 auto order = result.front().order;
251 auto monotonicityResult = result.front().monotonicityResult;
252 EXPECT_TRUE(monotonicityResult->isDone());
253 EXPECT_TRUE(monotonicityResult->existsMonotonicity());
254 EXPECT_TRUE(monotonicityResult->isAllMonotonicity());
256 auto assumptions = result.front().assumptions;
257 EXPECT_EQ(0ul, assumptions.size());
260 auto monRes = monotonicityResult->getMonotonicityResult();
261 for (
auto entry : monRes) {
267 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/simple1.pm";
268 std::string formulaAsString =
"P > 0.5 [ F s=3 ]";
269 std::string constantsAsString =
"";
273 program = program.
preprocess(constantsAsString);
274 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
276 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
279 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
280 model = simplifier.getSimplifiedModel();
281 ASSERT_EQ(5ul, model->getNumberOfStates());
282 ASSERT_EQ(8ul, model->getNumberOfTransitions());
287 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
293 auto result = MonotonicityHelper.checkMonotonicityInBuild(std::cout,
false);
294 EXPECT_EQ(1ul, result.size());
297 auto order = result.front().order;
298 auto monotonicityResult = result.front().monotonicityResult;
299 EXPECT_TRUE(monotonicityResult->isDone());
300 EXPECT_FALSE(monotonicityResult->existsMonotonicity());
301 EXPECT_FALSE(monotonicityResult->isAllMonotonicity());
302 auto assumptions = result.front().assumptions;
303 EXPECT_EQ(0ul, assumptions.size());
306 auto monRes = monotonicityResult->getMonotonicityResult();
307 for (
auto entry : monRes) {
313 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/casestudy1.pm";
314 std::string formulaAsString =
"P > 0.5 [ F s=3 ]";
315 std::string constantsAsString =
"";
319 program = program.
preprocess(constantsAsString);
320 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
322 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
325 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
326 model = simplifier.getSimplifiedModel();
331 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
333 ASSERT_EQ(5ul, model->getNumberOfStates());
334 ASSERT_EQ(8ul, model->getNumberOfTransitions());
337 auto result = MonotonicityHelper.checkMonotonicityInBuild(std::cout,
false);
338 ASSERT_EQ(1ul, result.size());
340 auto order = result.front().order;
341 auto monotonicityResult = result.front().monotonicityResult;
342 EXPECT_TRUE(monotonicityResult->isDone());
343 EXPECT_TRUE(monotonicityResult->existsMonotonicity());
344 EXPECT_TRUE(monotonicityResult->isAllMonotonicity());
345 auto assumptions = result.front().assumptions;
346 EXPECT_EQ(0ul, assumptions.size());
348 auto monRes = monotonicityResult->getMonotonicityResult();
349 for (
auto entry : monRes) {
355 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/casestudy2.pm";
356 std::string formulaAsString =
"P > 0.5 [ F s=4 ]";
357 std::string constantsAsString =
"";
361 program = program.
preprocess(constantsAsString);
362 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
364 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
367 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
368 model = simplifier.getSimplifiedModel();
373 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
375 ASSERT_EQ(6ul, model->getNumberOfStates());
376 ASSERT_EQ(12ul, model->getNumberOfTransitions());
382 auto result = monotonicityHelper.checkMonotonicityInBuild(std::cout,
false);
383 EXPECT_EQ(1ul, result.size());
384 EXPECT_FALSE(result.front().order->getDoneBuilding());
388 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/casestudy3.pm";
389 std::string formulaAsString =
"P > 0.5 [ F s=3 ]";
390 std::string constantsAsString =
"";
394 program = program.
preprocess(constantsAsString);
395 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
397 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
400 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
401 model = simplifier.getSimplifiedModel();
406 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
408 ASSERT_EQ(5ul, model->getNumberOfStates());
409 ASSERT_EQ(8ul, model->getNumberOfTransitions());
412 auto result = MonotonicityHelper.checkMonotonicityInBuild(std::cout,
false);
414 ASSERT_EQ(1ul, result.size());
415 auto order = result.front().order;
417 auto monotonicityResult = result.front().monotonicityResult;
418 EXPECT_TRUE(monotonicityResult->isDone());
419 EXPECT_FALSE(monotonicityResult->existsMonotonicity());
420 EXPECT_FALSE(monotonicityResult->isAllMonotonicity());
421 auto assumptions = result.front().assumptions;
422 EXPECT_EQ(0ul, assumptions.size());
424 auto monRes = monotonicityResult->getMonotonicityResult();
425 for (
auto entry : monRes) {
431 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/casestudy3.pm";
432 std::string formulaAsString =
"P > 0.5 [ F s=3 ]";
433 std::string constantsAsString =
"";
437 program = program.
preprocess(constantsAsString);
438 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
440 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
443 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
444 model = simplifier.getSimplifiedModel();
449 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
451 ASSERT_EQ(5ul, model->getNumberOfStates());
452 ASSERT_EQ(8ul, model->getNumberOfTransitions());
455 auto result = MonotonicityHelper.checkMonotonicityInBuild(std::cout,
false);
457 ASSERT_EQ(1ul, result.size());
458 auto order = result.front().order;
460 auto monotonicityResult = result.front().monotonicityResult;
461 EXPECT_TRUE(monotonicityResult->isDone());
462 EXPECT_TRUE(monotonicityResult->existsMonotonicity());
463 EXPECT_TRUE(monotonicityResult->isAllMonotonicity());
464 auto assumptions = result.front().assumptions;
465 EXPECT_EQ(0ul, assumptions.size());
467 auto monRes = monotonicityResult->getMonotonicityResult();
468 for (
auto entry : monRes) {
TEST_F(MonotonicityHelperTest, Derivative_checker)
std::vector< ExpectedMonotonicityResult > 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.
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.
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
storm::storage::ParameterRegion< ValueType > parseRegion(std::string const &inputString, std::set< typename storm::storage::ParameterRegion< ValueType >::VariableType > const &consideredVariables)
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::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::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::bisimulation::Options const &options={})
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