Storm 1.11.1.1
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
BinaryDtmcTransformerTest.cpp
Go to the documentation of this file.
1#include "storm-config.h"
2#include "test/storm_gtest.h"
3
4#include <memory>
5#include <string>
6
14#include "storm/api/builder.h"
24#include "storm/utility/prism.h"
25
26void testModelB(std::string programFile, std::string formulaAsString, std::string constantsAsString) {
28 program = storm::utility::prism::preprocess(program, constantsAsString);
29 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
31 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
32 storm::api::buildSparseModel<storm::RationalFunction>(program, formulas)->as<storm::models::sparse::Dtmc<storm::RationalFunction>>();
34 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> dtmc = model->as<storm::models::sparse::Dtmc<storm::RationalFunction>>();
35 uint64_t initialStateModel = dtmc->getStates("init").getNextSetIndex(0);
36
37 dtmc = storm::api::performBisimulationMinimization<storm::RationalFunction>(dtmc, formulas, storm::storage::BisimulationType::Weak)
39
41 auto simpleDtmc = binaryDtmcTransformer.transform(*dtmc, true);
42
44 modelChecker.specifyFormula(checkTask);
46 modelCheckerSimple.specifyFormula(checkTask);
47
48 auto parameters = storm::models::sparse::getAllParameters(*dtmc);
49
50 // Check if both DTMCs are equivalent just by sampling.
51 std::vector<std::map<storm::RationalFunctionVariable, storm::RationalFunctionCoefficient>> testInstantiations;
52 std::map<storm::RationalFunctionVariable, storm::RationalFunctionCoefficient> emptyInstantiation;
53 testInstantiations.push_back(emptyInstantiation);
54 for (auto const& param : parameters) {
55 std::vector<std::map<storm::RationalFunctionVariable, storm::RationalFunctionCoefficient>> newInstantiations;
56 for (auto point : testInstantiations) {
57 for (storm::RationalNumber x = storm::utility::convertNumber<storm::RationalNumber>(1e-6); x <= 1;
58 x += (1 - storm::utility::convertNumber<storm::RationalNumber>(1e-6)) / 10) {
59 std::map<storm::RationalFunctionVariable, storm::RationalFunctionCoefficient> newMap(point);
60 newMap[param] = storm::utility::convertNumber<storm::RationalFunctionCoefficient>(x);
61 newInstantiations.push_back(newMap);
62 }
63 }
64 testInstantiations = newInstantiations;
65 }
66
68 for (auto const& instantiation : testInstantiations) {
69 auto result = modelChecker.check(env, instantiation)->asExplicitQuantitativeCheckResult<double>()[initialStateModel];
70 auto resultSimple = modelCheckerSimple.check(env, instantiation)->asExplicitQuantitativeCheckResult<double>()[initialStateModel];
71 ASSERT_TRUE(storm::utility::isAlmostZero(result - resultSimple))
72 << "Results " << result << " and " << resultSimple << " are not the same but should be.";
73 }
74
75 auto region = storm::api::createRegion<storm::RationalFunction>("0.4", *dtmc);
76
77 auto pla =
78 storm::api::initializeRegionModelChecker<storm::RationalFunction>(env, dtmc, checkTask, storm::modelchecker::RegionCheckEngine::ParameterLifting);
79 auto resultPLA = pla->getBoundAtInitState(env, region[0], storm::OptimizationDirection::Minimize);
80
81 auto plaSimple =
82 storm::api::initializeRegionModelChecker<storm::RationalFunction>(env, simpleDtmc, checkTask, storm::modelchecker::RegionCheckEngine::ParameterLifting);
83 auto resultPLASimple = plaSimple->getBoundAtInitState(env, region[0], storm::OptimizationDirection::Minimize);
84
85 ASSERT_TRUE(resultPLA == resultPLASimple) << "Different PLA result with simplified DTMC";
86
87 // Check that simpleDtmc is in fact simple
88 for (uint64_t state = 0; state < simpleDtmc->getTransitionMatrix().getRowCount(); ++state) {
89 auto row = simpleDtmc->getTransitionMatrix().getRow(state);
90
91 std::set<storm::RationalFunctionVariable> variables;
92
93 for (auto const& entry : row) {
94 for (auto const& variable : entry.getValue().gatherVariables()) {
95 variables.emplace(variable);
96 }
97 }
98
99 if (variables.size() != 0) {
100 ASSERT_TRUE(variables.size() == 1);
101 auto parameter = *variables.begin();
102
103 auto parameterPol = storm::RawPolynomial(parameter);
104 auto parameterRational = storm::RationalFunction(carl::makePolynomial<storm::Polynomial>(parameterPol));
105 auto oneMinusParameter = storm::RawPolynomial(1) - parameterPol;
106 auto oneMinusParameterRational = storm::RationalFunction(carl::makePolynomial<storm::Polynomial>(oneMinusParameter));
107
108 uint64_t seenP = 0;
109 uint64_t seenOneMinusP = 0;
110
111 for (auto const& entry : row) {
112 if (!storm::utility::isZero(entry.getValue())) {
113 if (entry.getValue() == parameterRational) {
114 seenP++;
115 } else if (entry.getValue() == oneMinusParameterRational) {
116 seenOneMinusP++;
117 } else {
118 ASSERT_TRUE(false) << "Value " << entry.getValue() << " is not simple";
119 }
120 }
121 }
122
123 ASSERT_TRUE(seenP == 1 && seenOneMinusP == 1) << "State " << state << " not simple";
124 }
125 }
126}
127
128class BinaryDtmcTransformerTest : public ::testing::Test {
129 protected:
130 void SetUp() override {
131#ifndef STORM_HAVE_Z3
132 GTEST_SKIP() << "Z3 not available.";
133#endif
134 }
135};
136
138 // for some reason this test fails on some machines (on debian 12, but not on ubuntu 22.04)
139 // probably some exact model checking thing? no clue
140 std::string programFile = STORM_TEST_RESOURCES_DIR "/pdtmc/crowds3_5.pm";
141 std::string formulaAsString = "P=? [F \"observeIGreater1\"]";
142 std::string constantsAsString = ""; // e.g. pL=0.9,TOACK=0.5
143 testModelB(programFile, formulaAsString, constantsAsString);
144}
146 std::string programFile = STORM_TEST_RESOURCES_DIR "/pdtmc/nand-5-2.pm";
147 std::string formulaAsString = "P=? [F \"target\"]";
148 std::string constantsAsString = ""; // e.g. pL=0.9,TOACK=0.5
149 testModelB(programFile, formulaAsString, constantsAsString);
150}
152 std::string programFile = STORM_TEST_RESOURCES_DIR "/pdtmc/brp16_2.pm";
153 std::string formulaAsString = "P=? [F \"error\"]";
154 std::string constantsAsString = ""; // e.g. pL=0.9,TOACK=0.5
155 testModelB(programFile, formulaAsString, constantsAsString);
156}
TEST_F(BinaryDtmcTransformerTest, DISABLED_Crowds)
void testModelB(std::string programFile, std::string formulaAsString, std::string constantsAsString)
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)
This class represents a discrete-time Markov chain.
Definition Dtmc.h:13
storm::storage::BitVector const & getStates(std::string const &label) const
Returns the sets of states labeled with the given label.
Definition Model.cpp:189
uint64_t getNextSetIndex(uint64_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)
@ ParameterLifting
Parameter lifting approach.
std::set< storm::RationalFunctionVariable > getAllParameters(Model< storm::RationalFunction > const &model)
Get all parameters (probability, rewards, and rates) occurring in the model.
Definition Model.cpp:720
storm::prism::Program preprocess(storm::prism::Program const &program, std::map< storm::expressions::Variable, storm::expressions::Expression > const &constantDefinitions)
Definition prism.cpp:13
bool isAlmostZero(ValueType const &a)
Definition constants.cpp:93
bool isZero(ValueType const &a)
Definition constants.cpp:39
carl::RationalFunction< Polynomial, true > RationalFunction
carl::MultivariatePolynomial< RationalFunctionCoefficient > RawPolynomial