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
14#include "storm/api/builder.h"
28#include "storm/utility/prism.h"
30
31void testModelInterval(std::string programFile, std::string formulaAsString, std::string constantsAsString) {
33 program = storm::utility::prism::preprocess(program, constantsAsString);
34 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
36 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
37 storm::api::buildSparseModel<storm::RationalFunction>(program, formulas)->as<storm::models::sparse::Dtmc<storm::RationalFunction>>();
39 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> dtmc = model->as<storm::models::sparse::Dtmc<storm::RationalFunction>>();
40
43 propositionalChecker.check(checkTask.getFormula().asProbabilityOperatorFormula().getSubformula().asEventuallyFormula().getSubformula())
44 ->asExplicitQualitativeCheckResult()
45 .getTruthValuesVector();
46
47 std::vector<storm::RationalFunction> target(model->getNumberOfStates(), storm::utility::zero<storm::RationalFunction>());
48 storm::utility::vector::setVectorValues(target, psiStates, storm::utility::one<storm::RationalFunction>());
49
50 storm::storage::BitVector allTrue(model->getNumberOfStates(), true);
51
52 // Lift parameters for region [0,1]
53 storm::transformer::RobustParameterLifter<storm::RationalFunction, double> parameterLifter(dtmc->getTransitionMatrix().filterEntries(~psiStates), target,
54 allTrue, allTrue);
55
56 storm::storage::ParameterRegion<storm::RationalFunction> region = storm::api::createRegion<storm::RationalFunction>("0", *dtmc)[0];
57
58 parameterLifter.specifyRegion(region, storm::solver::OptimizationDirection::Maximize);
59
61 auto result = preserver.eliminateMECs(parameterLifter.getMatrix(), parameterLifter.getVector());
62 ASSERT_TRUE(result.has_value());
63 auto const& withoutMECs = *result;
64
65 auto target2 = parameterLifter.getVector();
66 target2.push_back(storm::utility::zero<storm::Interval>());
67
68 auto env = storm::Environment();
69 env.solver().minMax().setMethod(storm::solver::MinMaxMethod::ValueIteration);
70 env.solver().minMax().setPrecision(storm::utility::convertNumber<storm::RationalNumber>(1e-8));
71
72 auto factory = std::make_unique<storm::solver::GeneralMinMaxLinearEquationSolverFactory<storm::Interval, double>>();
73
74 auto const& solver1 = factory->create(env);
75 auto x1 = std::vector<double>(parameterLifter.getVector().size(), 0);
76 solver1->setMatrix(parameterLifter.getMatrix());
77
78 auto const& solver2 = factory->create(env);
79 solver2->setMatrix(withoutMECs);
80 auto x2 = std::vector<double>(target2.size(), 0);
81
82 solver1->setUncertaintyIsRobust(false);
83 solver2->setUncertaintyIsRobust(false);
84
85 // Check that maximize is the same
86 solver1->setOptimizationDirection(storm::solver::OptimizationDirection::Maximize);
87 solver1->solveEquations(env, x1, parameterLifter.getVector());
88 solver2->setOptimizationDirection(storm::solver::OptimizationDirection::Maximize);
89 solver2->solveEquations(env, x2, target2);
90
91 for (uint64_t i = 0; i < x1.size(); i++) {
92 if (withoutMECs.getRow(i).getNumberOfEntries() > 0) {
93 ASSERT_NEAR(x1[i], x2[i], 1e-7);
94 }
95 }
96
97 // We can't check minimize because we don't know what is happening, and
98 // also, minimizing solver1 is what we want to avoid
99}
100
101class IntervalEndComponentPreserverCheckTest : public ::testing::Test {
102 protected:
103 void SetUp() override {
104#ifndef STORM_HAVE_Z3
105 GTEST_SKIP() << "Z3 not available.";
106#endif
107 }
108};
109
111 std::string programFile = STORM_TEST_RESOURCES_DIR "/pdtmc/only_p.pm";
112 std::string formulaAsString = "P=? [F \"target\"]";
113 std::string constantsAsString = ""; // e.g. pL=0.9,TOACK=0.5
114 testModelInterval(programFile, formulaAsString, constantsAsString);
115}
116
118 std::string programFile = STORM_TEST_RESOURCES_DIR "/pdtmc/brp16_2.pm";
119 std::string formulaAsString = "P=? [F \"error\"]";
120 std::string constantsAsString = ""; // e.g. pL=0.9,TOACK=0.5
121 testModelInterval(programFile, formulaAsString, constantsAsString);
122}
123
125 std::string programFile = STORM_TEST_RESOURCES_DIR "/pdtmc/crowds3_5.pm";
126 std::string formulaAsString = "P=? [F \"observeIGreater1\"]";
127 std::string constantsAsString = ""; // e.g. pL=0.9,TOACK=0.5
128 testModelInterval(programFile, formulaAsString, constantsAsString);
129}
130
132 std::string programFile = STORM_TEST_RESOURCES_DIR "/pdtmc/nand-5-2.pm";
133 std::string formulaAsString = "P=? [F \"target\"]";
134 std::string constantsAsString = ""; // e.g. pL=0.9,TOACK=0.5
135 testModelInterval(programFile, formulaAsString, constantsAsString);
136}
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:13
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:13
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:78