Storm 1.14.0.1
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
BigStep.h
Go to the documentation of this file.
1#pragma once
2
3#include <map>
4#include <memory>
5#include <set>
6
8#include "storm/adapters/RationalFunctionAdapter.h" // TODO: use forward header
11
12namespace storm {
13
14namespace logic {
15class Formula;
16} // namespace logic
17
18namespace modelchecker {
19template<typename FormulaType, typename ValueType>
20class CheckTask;
21} // namespace modelchecker
22
23namespace storage {
24template<typename ValueType>
26} // namespace storage
27
28namespace transformer {
29
31
32// optimization for the polynomial cache - built in comparison is slow
34 bool operator()(const UniPoly& lhs, const UniPoly& rhs) const;
35};
36
38 bool operator()(UniPoly const& lhs, UniPoly const& rhs) const {
39 return lhs.less(rhs);
40 }
41};
42
43struct PolynomialCache : std::unordered_map<RationalFunctionVariable, std::pair<std::map<UniPoly, uint64_t, UniPolyCompare>, std::vector<UniPoly>>> {
51 uint64_t lookUpInCache(UniPoly const& f, RationalFunctionVariable const& p);
52
60 UniPoly polynomialFromFactorization(std::vector<uint64_t> const& factorization, RationalFunctionVariable const& p) const;
61};
62
63template<typename Container>
65 std::size_t operator()(Container const& c) const {
66 return boost::hash_range(c.begin(), c.end());
67 }
68};
69
70class Annotation : public std::unordered_map<std::vector<uint64_t>, RationalFunctionCoefficient, container_hash<std::vector<uint64_t>>> {
71 public:
72 Annotation(RationalFunctionVariable parameter, std::shared_ptr<PolynomialCache> polynomialCache);
73
79 void operator+=(const Annotation other);
80
86 void operator*=(RationalFunctionCoefficient n);
87
93 Annotation operator*(RationalFunctionCoefficient n) const;
94
101 void addAnnotationTimesConstant(Annotation const& other, RationalFunctionCoefficient timesConstant);
102
109 void addAnnotationTimesPolynomial(Annotation const& other, UniPoly&& polynomial);
110
117 void addAnnotationTimesAnnotation(Annotation const& anno1, Annotation const& anno2);
118
124 UniPoly getProbability() const;
125
131 std::vector<UniPoly> getTerms() const;
132
133 template<typename ConstantType>
134 ConstantType evaluate(ConstantType input) const {
135 ConstantType sumOfTerms = utility::zero<ConstantType>();
136 for (auto const& [info, constant] : *this) {
137 ConstantType outerMult = utility::one<ConstantType>();
138 for (uint64_t i = 0; i < info.size(); i++) {
139 auto polynomial = this->polynomialCache->at(parameter).second[i];
140 // Evaluate the inner polynomial by its coefficients
141 auto coefficients = polynomial.coefficients();
142 ConstantType innerSum = utility::zero<ConstantType>();
143 for (uint64_t exponent = 0; exponent < coefficients.size(); exponent++) {
144 if (exponent != 0) {
145 innerSum += storm::utility::pow(input, exponent) * storm::utility::convertNumber<ConstantType>(coefficients[exponent]);
146 } else {
147 innerSum += utility::convertNumber<ConstantType>(coefficients[exponent]);
148 }
149 }
150 // Inner polynomial ^ exponent
151 outerMult *= storm::utility::pow(innerSum, info[i]);
152 }
153 sumOfTerms += outerMult * utility::convertNumber<ConstantType>(constant);
154 }
155 return sumOfTerms;
156 }
157
158 Interval evaluateOnIntervalMidpointTheorem(Interval input, bool higherOrderBounds = false) const;
159
161
162 void computeDerivative(uint64_t nth);
163
164 uint64_t maxDegree() const;
165
166 std::shared_ptr<Annotation> derivative();
167
168 friend std::ostream& operator<<(std::ostream& os, const Annotation& annotation);
169
170 private:
171 const RationalFunctionVariable parameter;
172 const std::shared_ptr<PolynomialCache> polynomialCache;
173 std::shared_ptr<Annotation> derivativeOfThis;
174};
175
176std::ostream& operator<<(std::ostream& os, const Annotation& annotation);
177
178using UniPolyAnnotationMap = std::map<UniPoly, Annotation, UniPolyDefaultCompare>;
179
185class BigStep {
186 public:
191 BigStep() : polynomialCache(std::make_shared<PolynomialCache>()) {
192 // Intentionally left empty
193 }
194
196
204 std::pair<models::sparse::Dtmc<RationalFunction>, UniPolyAnnotationMap> bigStep(models::sparse::Dtmc<RationalFunction> const& model,
206
207 static std::unordered_map<RationalFunction, Annotation> lastSavedAnnotations;
208
209 private:
221 std::pair<std::map<uint64_t, Annotation>, std::pair<std::vector<uint64_t>, std::map<uint64_t, std::set<uint64_t>>>> bigStepBFS(
222 uint64_t start, const RationalFunctionVariable& parameter, const storage::FlexibleSparseMatrix<RationalFunction>& flexibleMatrix,
223 const storage::FlexibleSparseMatrix<RationalFunction>& backwardsFlexibleMatrix,
224 const std::map<RationalFunctionVariable, std::map<uint64_t, std::set<uint64_t>>>& treeStates,
225 const boost::optional<std::vector<RationalFunction>>& stateRewardVector, const UniPolyAnnotationMap& storedAnnotations);
226
239 std::vector<std::pair<uint64_t, Annotation>> findBigStep(const std::map<uint64_t, Annotation> bigStepAnnotations, const RationalFunctionVariable& parameter,
242 std::map<RationalFunctionVariable, std::set<std::set<uint64_t>>>& alreadyTimeTravelledToThis,
243 std::map<RationalFunctionVariable, std::set<uint64_t>>& treeStatesNeedUpdate, uint64_t root,
244 uint64_t originalNumStates);
245
255 UniPolyAnnotationMap replaceWithNewTransitions(uint64_t state, const std::vector<std::pair<uint64_t, Annotation>> transitions,
258 storage::BitVector& reachableStates,
259 std::map<RationalFunctionVariable, std::set<uint64_t>>& treeStatesNeedUpdate);
260
268 void updateUnreachableStates(storage::BitVector& reachableStates, std::vector<uint64_t> const& statesMaybeUnreachable,
269 storage::FlexibleSparseMatrix<RationalFunction> const& backwardsFlexibleMatrix, uint64_t initialState);
270
285 void updateTreeStates(std::map<RationalFunctionVariable, std::map<uint64_t, std::set<uint64_t>>>& treeStates,
286 std::map<RationalFunctionVariable, std::set<uint64_t>>& workingSets,
288 const storage::FlexibleSparseMatrix<RationalFunction>& backwardsTransitions, const std::set<RationalFunctionVariable>& allParameters,
289 const boost::optional<std::vector<RationalFunction>>& stateRewardVector, const models::sparse::StateLabeling stateLabelling);
290
301 models::sparse::StateLabeling extendStateLabeling(const models::sparse::StateLabeling& oldLabeling, uint64_t oldSize, uint64_t newSize,
302 uint64_t stateWithLabels, const std::set<std::string>& labelsInFormula);
309 std::vector<storm::storage::MatrixEntry<uint64_t, RationalFunction>> joinDuplicateTransitions(
311
312 std::shared_ptr<RawPolynomialCache> rawPolynomialCache;
313
314 const std::shared_ptr<PolynomialCache> polynomialCache;
315};
316
317} // namespace transformer
318} // namespace storm
This class represents a discrete-time Markov chain.
Definition Dtmc.h:16
This class manages the labeling of the state space with a number of (atomic) labels.
A bit vector that is internally represented as a vector of 64-bit values.
Definition BitVector.h:16
The flexible sparse matrix is used during state elimination.
UniPoly getProbability() const
Get the probability of this annotation as a univariate polynomial (which isn't factorized).
Definition BigStep.cpp:167
void addAnnotationTimesPolynomial(Annotation const &other, UniPoly &&polynomial)
Adds another annotation times a polynomial to this annotation.
Definition BigStep.cpp:124
friend std::ostream & operator<<(std::ostream &os, const Annotation &annotation)
Definition BigStep.cpp:263
void addAnnotationTimesConstant(Annotation const &other, RationalFunctionCoefficient timesConstant)
Adds another annotation times a constant to this annotation.
Definition BigStep.cpp:115
std::vector< UniPoly > getTerms() const
Get all of the terms of the UniPoly.
Definition BigStep.cpp:175
void computeDerivative(uint64_t nth)
Definition BigStep.cpp:205
Annotation(RationalFunctionVariable parameter, std::shared_ptr< PolynomialCache > polynomialCache)
Definition BigStep.cpp:87
void operator*=(RationalFunctionCoefficient n)
Multiply this annotation with a rational number.
Definition BigStep.cpp:103
std::shared_ptr< Annotation > derivative()
Definition BigStep.cpp:257
Interval evaluateOnIntervalMidpointTheorem(Interval input, bool higherOrderBounds=false) const
Definition BigStep.cpp:183
void operator+=(const Annotation other)
Add another annotation to this annotation.
Definition BigStep.cpp:92
void addAnnotationTimesAnnotation(Annotation const &anno1, Annotation const &anno2)
Adds another annotation times an annotation to this annotation.
Definition BigStep.cpp:144
ConstantType evaluate(ConstantType input) const
Definition BigStep.h:134
RationalFunctionVariable getParameter() const
Definition BigStep.cpp:201
Annotation operator*(RationalFunctionCoefficient n) const
Multiply this annotation with a rational number to get a new annotation.
Definition BigStep.cpp:109
static std::unordered_map< RationalFunction, Annotation > lastSavedAnnotations
Definition BigStep.h:207
std::pair< models::sparse::Dtmc< RationalFunction >, UniPolyAnnotationMap > bigStep(models::sparse::Dtmc< RationalFunction > const &model, modelchecker::CheckTask< logic::Formula, RationalFunction > const &checkTask)
Perform big-step on the given model and the given checkTask.
Definition BigStep.cpp:381
RationalFunction uniPolyToRationalFunction(UniPoly poly)
Definition BigStep.cpp:35
BigStep()
This class re-orders parameteric transitions of a pMC so bounds computed by Parameter Lifting will ev...
Definition BigStep.h:191
std::map< UniPoly, Annotation, UniPolyDefaultCompare > UniPolyAnnotationMap
Definition BigStep.h:178
std::ostream & operator<<(std::ostream &os, const Annotation &annotation)
Definition BigStep.cpp:263
carl::UnivariatePolynomial< RationalFunctionCoefficient > UniPoly
Definition BigStep.cpp:33
ValueType zero()
Definition constants.cpp:26
ValueType pow(ValueType const &value, int_fast64_t exponent)
ValueType one()
Definition constants.cpp:21
TargetType convertNumber(SourceType const &number)
carl::Interval< double > Interval
Interval type.
carl::UnivariatePolynomial< RationalFunctionCoefficient > RawUnivariatePolynomial
carl::Variable RationalFunctionVariable
carl::RationalFunction< Polynomial, true > RationalFunction
uint64_t lookUpInCache(UniPoly const &f, RationalFunctionVariable const &p)
Look up the index of this polynomial in the cache.
Definition BigStep.cpp:55
UniPoly polynomialFromFactorization(std::vector< uint64_t > const &factorization, RationalFunctionVariable const &p) const
Computes a univariate polynomial from a factorization.
Definition BigStep.cpp:70
bool operator()(const UniPoly &lhs, const UniPoly &rhs) const
Definition BigStep.cpp:41
bool operator()(UniPoly const &lhs, UniPoly const &rhs) const
Definition BigStep.h:38
std::size_t operator()(Container const &c) const
Definition BigStep.h:65