Storm 1.11.1.1
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
BigStepTest.cpp
Go to the documentation of this file.
1#include <memory>
2#include <string>
3#include "gtest/gtest.h"
4#include "storm-config.h"
17#include "storm/api/builder.h"
28#include "storm/utility/prism.h"
29#include "test/storm_gtest.h"
30
33
34void testModel(std::string programFile, std::string formulaAsString, std::string constantsAsString) {
36 program = storm::utility::prism::preprocess(program, constantsAsString);
37 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
39 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
40 storm::api::buildSparseModel<storm::RationalFunction>(program, formulas)->as<storm::models::sparse::Dtmc<storm::RationalFunction>>();
42 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> dtmc = model->as<storm::models::sparse::Dtmc<storm::RationalFunction>>();
43
44 dtmc = storm::api::performBisimulationMinimization<storm::RationalFunction>(dtmc, formulas, storm::storage::BisimulationType::Strong)
46
48 auto timeTravelledDtmc = BigStep.bigStep(*dtmc, checkTask).first;
49
51 modelChecker.specifyFormula(checkTask);
53 timeTravelledDtmc);
54 modelCheckerTT.specifyFormula(checkTask);
55
56 auto parameters = storm::models::sparse::getAllParameters(*dtmc);
57
58 // Check if both DTMCs are equivalent just by sampling.
59 std::vector<std::map<storm::RationalFunctionVariable, storm::RationalFunctionCoefficient>> testInstantiations;
60 std::map<storm::RationalFunctionVariable, storm::RationalFunctionCoefficient> emptyInstantiation;
61 testInstantiations.push_back(emptyInstantiation);
62 for (auto const& param : parameters) {
63 std::vector<std::map<storm::RationalFunctionVariable, storm::RationalFunctionCoefficient>> newInstantiations;
64 for (auto point : testInstantiations) {
65 for (storm::RationalNumber x = storm::utility::convertNumber<storm::RationalNumber>(1e-5); x <= 1;
66 x += (1 - storm::utility::convertNumber<storm::RationalNumber>(1e-5)) / 10) {
67 std::map<storm::RationalFunctionVariable, storm::RationalFunctionCoefficient> newMap(point);
68 newMap[param] = storm::utility::convertNumber<storm::RationalFunctionCoefficient>(x);
69 newInstantiations.push_back(newMap);
70 }
71 }
72 testInstantiations = newInstantiations;
73 }
74
76 storm::Environment envRobust;
77 env.solver().minMax().setMethod(storm::solver::MinMaxMethod::ValueIteration);
78 envRobust.solver().minMax().setMethod(storm::solver::MinMaxMethod::ValueIteration);
79 for (auto const& instantiation : testInstantiations) {
80 auto result = modelChecker.check(env, instantiation)->asExplicitQuantitativeCheckResult<storm::RationalNumber>();
81 auto resultTT = modelCheckerTT.check(env, instantiation)->asExplicitQuantitativeCheckResult<storm::RationalNumber>();
82
83 storm::RationalNumber resA = result[*modelChecker.getOriginalModel().getInitialStates().begin()];
84 storm::RationalNumber resB = resultTT[*modelCheckerTT.getOriginalModel().getInitialStates().begin()];
85 ASSERT_NEAR(resA, resB, storm::utility::convertNumber<storm::RationalNumber>(1e-6));
86 }
87
88 auto region = storm::api::createRegion<storm::RationalFunction>("0.4", *dtmc);
89
90 auto pla =
91 storm::api::initializeRegionModelChecker<storm::RationalFunction>(env, dtmc, checkTask, storm::modelchecker::RegionCheckEngine::ParameterLifting);
92 auto resultPLA = pla->getBoundAtInitState(env, region[0], storm::OptimizationDirection::Minimize);
93
94 auto sharedDtmc = std::make_shared<storm::models::sparse::Dtmc<storm::RationalFunction>>(timeTravelledDtmc);
95 auto plaTT = storm::api::initializeRegionModelChecker<storm::RationalFunction>(env, sharedDtmc, checkTask,
97 auto resultPLATT = plaTT->getBoundAtInitState(env, region[0], storm::OptimizationDirection::Minimize);
98
99 ASSERT_TRUE(resultPLA < resultPLATT) << "Time-Travelling did not make bound better";
100}
101
102class BigStep : public ::testing::Test {
103 protected:
104 void SetUp() override {
105#ifndef STORM_HAVE_Z3
106 GTEST_SKIP() << "Z3 not available.";
107#endif
108 }
109};
110
111TEST_F(BigStep, Crowds) {
112 std::string programFile = STORM_TEST_RESOURCES_DIR "/pdtmc/crowds3_5.pm";
113 std::string formulaAsString = "P=? [F \"observeIGreater1\"]";
114 std::string constantsAsString = ""; // e.g. pL=0.9,TOACK=0.5
115 testModel(programFile, formulaAsString, constantsAsString);
116}
118 std::string programFile = STORM_TEST_RESOURCES_DIR "/pdtmc/nand-5-2.pm";
119 std::string formulaAsString = "P=? [F \"target\"]";
120 std::string constantsAsString = ""; // e.g. pL=0.9,TOACK=0.5
121 testModel(programFile, formulaAsString, constantsAsString);
122}
123TEST_F(BigStep, Herman) {
124 std::string programFile = STORM_TEST_RESOURCES_DIR "/pdtmc/herman5_pla.pm";
125 std::string formulaAsString = "R=? [F \"stable\"]";
126 std::string constantsAsString = ""; // e.g. pL=0.9,TOACK=0.5
127 testModel(programFile, formulaAsString, constantsAsString);
128}
TEST_F(BigStep, Crowds)
void testModel(std::string programFile, std::string formulaAsString, std::string constantsAsString)
void SetUp() override
SolverEnvironment & solver()
void setMethod(storm::solver::MinMaxMethod value, bool isSetFromDefault=false)
MinMaxSolverEnvironment & minMax()
Class to efficiently check a formula on a parametric model with different parameter instantiations.
virtual std::unique_ptr< CheckResult > check(Environment const &env, storm::utility::parametric::Valuation< typename SparseModelType::ValueType > const &valuation) override
void specifyFormula(CheckTask< storm::logic::Formula, typename SparseModelType::ValueType > const &checkTask)
std::shared_ptr< ModelType > as()
Casts the model into the model type given by the template parameter.
Definition ModelBase.h:38
This class represents a discrete-time Markov chain.
Definition Dtmc.h:14
Shorthand for std::unordered_map<T, uint64_t>.
Definition BigStep.h:176
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::vector< std::shared_ptr< storm::logic::Formula const > > extractFormulasFromProperties(std::vector< storm::jani::Property > const &properties)
@ ParameterLifting
Parameter lifting approach.
@ RobustParameterLifting
Parameter lifting approach based on robust markov models instead of generating nondeterminism.
std::set< storm::RationalFunctionVariable > getAllParameters(Model< storm::RationalFunction > const &model)
Get all parameters (probability, rewards, and rates) occurring in the model.
Definition Model.cpp:728
storm::prism::Program preprocess(storm::prism::Program const &program, std::map< storm::expressions::Variable, storm::expressions::Expression > const &constantDefinitions)
Definition prism.cpp:19