Storm
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
TimeTravellingTest.cpp
Go to the documentation of this file.
1#include <memory>
2#include <string>
3#include "storm-config.h"
16#include "storm/api/builder.h"
26#include "storm/utility/prism.h"
27#include "test/storm_gtest.h"
28
31
32void testModel(std::string programFile, std::string formulaAsString, std::string constantsAsString) {
34 program = storm::utility::prism::preprocess(program, constantsAsString);
35 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
37 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
38 storm::api::buildSparseModel<storm::RationalFunction>(program, formulas)->as<storm::models::sparse::Dtmc<storm::RationalFunction>>();
40 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> dtmc = model->as<storm::models::sparse::Dtmc<storm::RationalFunction>>();
41 uint64_t initialStateModel = dtmc->getStates("init").getNextSetIndex(0);
42
43 dtmc = storm::api::performBisimulationMinimization<storm::RationalFunction>(dtmc, formulas, storm::storage::BisimulationType::Weak)
45
47 auto timeTravelledDtmc = timeTravelling.timeTravel(*dtmc, checkTask);
48
50 modelChecker.specifyFormula(checkTask);
52 modelCheckerTT.specifyFormula(checkTask);
53
54 auto parameters = storm::models::sparse::getAllParameters(*dtmc);
55
56 // Check if both DTMCs are equivalent just by sampling.
57 std::vector<std::map<storm::RationalFunctionVariable, storm::RationalFunctionCoefficient>> testInstantiations;
58 std::map<storm::RationalFunctionVariable, storm::RationalFunctionCoefficient> emptyInstantiation;
59 testInstantiations.push_back(emptyInstantiation);
60 for (auto const& param : parameters) {
61 std::vector<std::map<storm::RationalFunctionVariable, storm::RationalFunctionCoefficient>> newInstantiations;
62 for (auto point : testInstantiations) {
63 for (storm::RationalNumber x = storm::utility::convertNumber<storm::RationalNumber>(1e-6); x <= 1;
64 x += (1 - storm::utility::convertNumber<storm::RationalNumber>(1e-6)) / 10) {
65 std::map<storm::RationalFunctionVariable, storm::RationalFunctionCoefficient> newMap(point);
66 newMap[param] = storm::utility::convertNumber<storm::RationalFunctionCoefficient>(x);
67 newInstantiations.push_back(newMap);
68 }
69 }
70 testInstantiations = newInstantiations;
71 }
72
74 for (auto const& instantiation : testInstantiations) {
75 auto result = modelChecker.check(env, instantiation)->asExplicitQuantitativeCheckResult<double>()[initialStateModel];
76 auto resultTT = modelCheckerTT.check(env, instantiation)->asExplicitQuantitativeCheckResult<double>()[initialStateModel];
77 ASSERT_TRUE(storm::utility::isAlmostZero(result - resultTT)) << "Results " << result << " and " << resultTT << " are not the same but should be.";
78 }
79
80 auto region = storm::api::createRegion<storm::RationalFunction>("0.4", *dtmc);
81
83 pla.specify(env, dtmc, checkTask);
84 auto resultPLA = pla.getBoundAtInitState(env, region[0], storm::OptimizationDirection::Minimize);
85
87 auto sharedDtmc = std::make_shared<storm::models::sparse::Dtmc<storm::RationalFunction>>(timeTravelledDtmc);
88 plaTT.specify(env, sharedDtmc, checkTask);
89 auto resultPLATT = plaTT.getBoundAtInitState(env, region[0], storm::OptimizationDirection::Minimize);
90
91 ASSERT_TRUE(resultPLA < resultPLATT) << "Time-Travelling did not make bound better";
92}
93
94class TimeTravelling : public ::testing::Test {
95 protected:
96 void SetUp() override {
97#ifndef STORM_HAVE_Z3
98 GTEST_SKIP() << "Z3 not available.";
99#endif
100 }
101};
102
104 std::string programFile = STORM_TEST_RESOURCES_DIR "/pdtmc/crowds3_5.pm";
105 std::string formulaAsString = "P=? [F \"observeIGreater1\"]";
106 std::string constantsAsString = ""; // e.g. pL=0.9,TOACK=0.5
107 testModel(programFile, formulaAsString, constantsAsString);
108}
110 std::string programFile = STORM_TEST_RESOURCES_DIR "/pdtmc/nand-5-2.pm";
111 std::string formulaAsString = "P=? [F \"target\"]";
112 std::string constantsAsString = ""; // e.g. pL=0.9,TOACK=0.5
113 testModel(programFile, formulaAsString, constantsAsString);
114}
116 std::string programFile = STORM_TEST_RESOURCES_DIR "/pdtmc/herman5_pla.pm";
117 std::string formulaAsString = "R=? [F \"stable\"]";
118 std::string constantsAsString = ""; // e.g. pL=0.9,TOACK=0.5
119 testModel(programFile, formulaAsString, constantsAsString);
120}
TEST_F(TimeTravelling, Crowds)
void testModel(std::string programFile, std::string formulaAsString, std::string constantsAsString)
void SetUp() override
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
virtual void specify(Environment const &env, std::shared_ptr< storm::models::ModelBase > parametricModel, CheckTask< storm::logic::Formula, ValueType > const &checkTask, bool generateRegionSplitEstimates=false, bool allowModelSimplification=true) override
void specifyFormula(CheckTask< storm::logic::Formula, typename SparseModelType::ValueType > const &checkTask)
virtual SparseModelType::ValueType getBoundAtInitState(Environment const &env, storm::storage::ParameterRegion< typename SparseModelType::ValueType > const &region, storm::solver::OptimizationDirection const &dirForParameters) override
This class represents a discrete-time Markov chain.
Definition Dtmc.h:14
storm::storage::BitVector const & getStates(std::string const &label) const
Returns the sets of states labeled with the given label.
Definition Model.cpp:187
uint_fast64_t getNextSetIndex(uint_fast64_t startingIndex) const
Retrieves the index of the bit that is the next bit set to true in the bit vector.
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)
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
bool isAlmostZero(ValueType const &a)
Definition constants.cpp:56