Storm 1.11.1.1
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
IntervalEndComponentPreserverCheckTest.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
22#include "storm/api/builder.h"
40#include "storm/utility/prism.h"
42
43void testModelInterval(std::string programFile, std::string formulaAsString, std::string constantsAsString) {
45 program = storm::utility::prism::preprocess(program, constantsAsString);
46 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
48 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
49 storm::api::buildSparseModel<storm::RationalFunction>(program, formulas)->as<storm::models::sparse::Dtmc<storm::RationalFunction>>();
51 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> dtmc = model->as<storm::models::sparse::Dtmc<storm::RationalFunction>>();
52
55 propositionalChecker.check(checkTask.getFormula().asProbabilityOperatorFormula().getSubformula().asEventuallyFormula().getSubformula())
56 ->asExplicitQualitativeCheckResult()
57 .getTruthValuesVector();
58
59 std::vector<storm::RationalFunction> target(model->getNumberOfStates(), storm::utility::zero<storm::RationalFunction>());
60 storm::utility::vector::setVectorValues(target, psiStates, storm::utility::one<storm::RationalFunction>());
61
62 storm::storage::BitVector allTrue(model->getNumberOfStates(), true);
63
64 // Lift parameters for region [0,1]
65 storm::transformer::RobustParameterLifter<storm::RationalFunction, double> parameterLifter(dtmc->getTransitionMatrix().filterEntries(~psiStates), target,
66 allTrue, allTrue);
67
68 storm::storage::ParameterRegion<storm::RationalFunction> region = storm::api::createRegion<storm::RationalFunction>("0", *dtmc)[0];
69
70 parameterLifter.specifyRegion(region, storm::solver::OptimizationDirection::Maximize);
71
73 auto result = preserver.eliminateMECs(parameterLifter.getMatrix(), parameterLifter.getVector());
74 ASSERT_TRUE(result.has_value());
75 auto const& withoutMECs = *result;
76
77 auto target2 = parameterLifter.getVector();
78 target2.push_back(storm::utility::zero<storm::Interval>());
79
80 auto env = storm::Environment();
81 env.solver().minMax().setMethod(storm::solver::MinMaxMethod::ValueIteration);
82 env.solver().minMax().setPrecision(storm::utility::convertNumber<storm::RationalNumber>(1e-8));
83
84 auto factory = std::make_unique<storm::solver::GeneralMinMaxLinearEquationSolverFactory<storm::Interval, double>>();
85
86 auto const& solver1 = factory->create(env);
87 auto x1 = std::vector<double>(parameterLifter.getVector().size(), 0);
88 solver1->setMatrix(parameterLifter.getMatrix());
89
90 auto const& solver2 = factory->create(env);
91 solver2->setMatrix(withoutMECs);
92 auto x2 = std::vector<double>(target2.size(), 0);
93
94 solver1->setUncertaintyIsRobust(false);
95 solver2->setUncertaintyIsRobust(false);
96
97 // Check that maximize is the same
98 solver1->setOptimizationDirection(storm::solver::OptimizationDirection::Maximize);
99 solver1->solveEquations(env, x1, parameterLifter.getVector());
100 solver2->setOptimizationDirection(storm::solver::OptimizationDirection::Maximize);
101 solver2->solveEquations(env, x2, target2);
102
103 for (uint64_t i = 0; i < x1.size(); i++) {
104 if (withoutMECs.getRow(i).getNumberOfEntries() > 0) {
105 ASSERT_NEAR(x1[i], x2[i], 1e-7);
106 }
107 }
108
109 // We can't check minimize because we don't know what is happening, and
110 // also, minimizing solver1 is what we want to avoid
111}
112
113class IntervalEndComponentPreserverCheckTest : public ::testing::Test {
114 protected:
115 void SetUp() override {
116#ifndef STORM_HAVE_Z3
117 GTEST_SKIP() << "Z3 not available.";
118#endif
119 }
120};
121
123 std::string programFile = STORM_TEST_RESOURCES_DIR "/pdtmc/only_p.pm";
124 std::string formulaAsString = "P=? [F \"target\"]";
125 std::string constantsAsString = ""; // e.g. pL=0.9,TOACK=0.5
126 testModelInterval(programFile, formulaAsString, constantsAsString);
127}
128
130 std::string programFile = STORM_TEST_RESOURCES_DIR "/pdtmc/brp16_2.pm";
131 std::string formulaAsString = "P=? [F \"error\"]";
132 std::string constantsAsString = ""; // e.g. pL=0.9,TOACK=0.5
133 testModelInterval(programFile, formulaAsString, constantsAsString);
134}
135
137 std::string programFile = STORM_TEST_RESOURCES_DIR "/pdtmc/crowds3_5.pm";
138 std::string formulaAsString = "P=? [F \"observeIGreater1\"]";
139 std::string constantsAsString = ""; // e.g. pL=0.9,TOACK=0.5
140 testModelInterval(programFile, formulaAsString, constantsAsString);
141}
142
144 std::string programFile = STORM_TEST_RESOURCES_DIR "/pdtmc/nand-5-2.pm";
145 std::string formulaAsString = "P=? [F \"target\"]";
146 std::string constantsAsString = ""; // e.g. pL=0.9,TOACK=0.5
147 testModelInterval(programFile, formulaAsString, constantsAsString);
148}
TEST_F(IntervalEndComponentPreserverCheckTest, Simple)
void testModelInterval(std::string programFile, std::string formulaAsString, std::string constantsAsString)
This class represents a discrete-time Markov chain.
Definition Dtmc.h:14
A bit vector that is internally represented as a vector of 64-bit values.
Definition BitVector.h:16
std::optional< storage::SparseMatrix< Interval > > eliminateMECs(storm::storage::SparseMatrix< Interval > const &matrix, std::vector< Interval > const &vector)
This class lifts parameter choices to nondeterminism: For each row in the given matrix that considerd...
storm::storage::SparseMatrix< Interval > const & getMatrix() const
std::vector< Interval > const & getVector() const
void specifyRegion(storm::storage::ParameterRegion< ParametricType > const &region, storm::solver::OptimizationDirection const &dirForParameters)
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)
storm::prism::Program preprocess(storm::prism::Program const &program, std::map< storm::expressions::Variable, storm::expressions::Expression > const &constantDefinitions)
Definition prism.cpp:19
void setVectorValues(std::vector< T > &vector, storm::storage::BitVector const &positions, std::vector< T > const &values)
Sets the provided values at the provided positions in the given vector.
Definition vector.h:82