Storm 1.11.1.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 <cstdint>
4#include <memory>
5#include <set>
6
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>
25class FlexibleSparseMatrix;
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
37struct PolynomialCache : std::unordered_map<RationalFunctionVariable, std::pair<std::map<UniPoly, uint64_t, UniPolyCompare>, std::vector<UniPoly>>> {
45 uint64_t lookUpInCache(UniPoly const& f, RationalFunctionVariable const& p);
46
54 UniPoly polynomialFromFactorization(std::vector<uint64_t> const& factorization, RationalFunctionVariable const& p) const;
55};
56
57template<typename Container>
59 std::size_t operator()(Container const& c) const {
60 return boost::hash_range(c.begin(), c.end());
61 }
62};
63
64class Annotation : public std::unordered_map<std::vector<uint64_t>, RationalFunctionCoefficient, container_hash<std::vector<uint64_t>>> {
65 public:
66 Annotation(RationalFunctionVariable parameter, std::shared_ptr<PolynomialCache> polynomialCache);
67
73 void operator+=(const Annotation other);
74
80 void operator*=(RationalFunctionCoefficient n);
81
87 Annotation operator*(RationalFunctionCoefficient n) const;
88
95 void addAnnotationTimesConstant(Annotation const& other, RationalFunctionCoefficient timesConstant);
96
103 void addAnnotationTimesPolynomial(Annotation const& other, UniPoly&& polynomial);
104
111 void addAnnotationTimesAnnotation(Annotation const& anno1, Annotation const& anno2);
112
118 UniPoly getProbability() const;
119
125 std::vector<UniPoly> getTerms() const;
126
127 template<typename ConstantType>
128 ConstantType evaluate(ConstantType input) const {
129 ConstantType sumOfTerms = utility::zero<ConstantType>();
130 for (auto const& [info, constant] : *this) {
131 ConstantType outerMult = utility::one<ConstantType>();
132 for (uint64_t i = 0; i < info.size(); i++) {
133 auto polynomial = this->polynomialCache->at(parameter).second[i];
134 // Evaluate the inner polynomial by its coefficients
135 auto coefficients = polynomial.coefficients();
136 ConstantType innerSum = utility::zero<ConstantType>();
137 for (uint64_t exponent = 0; exponent < coefficients.size(); exponent++) {
138 if (exponent != 0) {
139 innerSum += carl::pow(input, exponent) * utility::convertNumber<ConstantType>(coefficients[exponent]);
140 } else {
141 innerSum += utility::convertNumber<ConstantType>(coefficients[exponent]);
142 }
143 }
144 // Inner polynomial ^ exponent
145 outerMult *= carl::pow(innerSum, info[i]);
146 }
147 sumOfTerms += outerMult * utility::convertNumber<ConstantType>(constant);
148 }
149 return sumOfTerms;
150 }
151
152 Interval evaluateOnIntervalMidpointTheorem(Interval input, bool higherOrderBounds = false) const;
153
155
156 void computeDerivative(uint64_t nth);
157
158 uint64_t maxDegree() const;
159
160 std::shared_ptr<Annotation> derivative();
161
162 friend std::ostream& operator<<(std::ostream& os, const Annotation& annotation);
163
164 private:
165 const RationalFunctionVariable parameter;
166 const std::shared_ptr<PolynomialCache> polynomialCache;
167 std::shared_ptr<Annotation> derivativeOfThis;
168};
169
170std::ostream& operator<<(std::ostream& os, const Annotation& annotation);
171
177class BigStep {
178 public:
183 BigStep() : polynomialCache(std::make_shared<PolynomialCache>()) {
184 // Intentionally left empty
185 }
186
188
196 std::pair<models::sparse::Dtmc<RationalFunction>, std::map<UniPoly, Annotation>> bigStep(
198
199 static std::unordered_map<RationalFunction, Annotation> lastSavedAnnotations;
200
201 private:
213 std::pair<std::map<uint64_t, Annotation>, std::pair<std::vector<uint64_t>, std::map<uint64_t, std::set<uint64_t>>>> bigStepBFS(
214 uint64_t start, const RationalFunctionVariable& parameter, const storage::FlexibleSparseMatrix<RationalFunction>& flexibleMatrix,
215 const storage::FlexibleSparseMatrix<RationalFunction>& backwardsFlexibleMatrix,
216 const std::map<RationalFunctionVariable, std::map<uint64_t, std::set<uint64_t>>>& treeStates,
217 const boost::optional<std::vector<RationalFunction>>& stateRewardVector, const std::map<UniPoly, Annotation>& storedAnnotations);
218
231 std::vector<std::pair<uint64_t, Annotation>> findBigStep(const std::map<uint64_t, Annotation> bigStepAnnotations, const RationalFunctionVariable& parameter,
234 std::map<RationalFunctionVariable, std::set<std::set<uint64_t>>>& alreadyTimeTravelledToThis,
235 std::map<RationalFunctionVariable, std::set<uint64_t>>& treeStatesNeedUpdate, uint64_t root,
236 uint64_t originalNumStates);
237
247 std::map<UniPoly, Annotation> replaceWithNewTransitions(uint64_t state, const std::vector<std::pair<uint64_t, Annotation>> transitions,
250 storage::BitVector& reachableStates,
251 std::map<RationalFunctionVariable, std::set<uint64_t>>& treeStatesNeedUpdate);
252
260 void updateUnreachableStates(storage::BitVector& reachableStates, std::vector<uint64_t> const& statesMaybeUnreachable,
261 storage::FlexibleSparseMatrix<RationalFunction> const& backwardsFlexibleMatrix, uint64_t initialState);
262
277 void updateTreeStates(std::map<RationalFunctionVariable, std::map<uint64_t, std::set<uint64_t>>>& treeStates,
278 std::map<RationalFunctionVariable, std::set<uint64_t>>& workingSets,
280 const storage::FlexibleSparseMatrix<RationalFunction>& backwardsTransitions, const std::set<RationalFunctionVariable>& allParameters,
281 const boost::optional<std::vector<RationalFunction>>& stateRewardVector, const models::sparse::StateLabeling stateLabelling);
282
293 models::sparse::StateLabeling extendStateLabeling(const models::sparse::StateLabeling& oldLabeling, uint64_t oldSize, uint64_t newSize,
294 uint64_t stateWithLabels, const std::set<std::string>& labelsInFormula);
301 std::vector<storm::storage::MatrixEntry<uint64_t, RationalFunction>> joinDuplicateTransitions(
303
304 std::shared_ptr<RawPolynomialCache> rawPolynomialCache;
305
306 const std::shared_ptr<PolynomialCache> polynomialCache;
307};
308
309} // namespace transformer
310} // namespace storm
This class represents a discrete-time Markov chain.
Definition Dtmc.h:13
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:174
void addAnnotationTimesPolynomial(Annotation const &other, UniPoly &&polynomial)
Adds another annotation times a polynomial to this annotation.
Definition BigStep.cpp:131
friend std::ostream & operator<<(std::ostream &os, const Annotation &annotation)
Definition BigStep.cpp:270
void addAnnotationTimesConstant(Annotation const &other, RationalFunctionCoefficient timesConstant)
Adds another annotation times a constant to this annotation.
Definition BigStep.cpp:122
std::vector< UniPoly > getTerms() const
Get all of the terms of the UniPoly.
Definition BigStep.cpp:182
void computeDerivative(uint64_t nth)
Definition BigStep.cpp:212
void operator*=(RationalFunctionCoefficient n)
Multiply this annotation with a rational number.
Definition BigStep.cpp:110
std::shared_ptr< Annotation > derivative()
Definition BigStep.cpp:264
Interval evaluateOnIntervalMidpointTheorem(Interval input, bool higherOrderBounds=false) const
Definition BigStep.cpp:190
void operator+=(const Annotation other)
Add another annotation to this annotation.
Definition BigStep.cpp:99
void addAnnotationTimesAnnotation(Annotation const &anno1, Annotation const &anno2)
Adds another annotation times an annotation to this annotation.
Definition BigStep.cpp:151
ConstantType evaluate(ConstantType input) const
Definition BigStep.h:128
RationalFunctionVariable getParameter() const
Definition BigStep.cpp:208
Annotation operator*(RationalFunctionCoefficient n) const
Multiply this annotation with a rational number to get a new annotation.
Definition BigStep.cpp:116
Shorthand for std::unordered_map<T, uint64_t>.
Definition BigStep.h:177
std::pair< models::sparse::Dtmc< RationalFunction >, std::map< UniPoly, Annotation > > 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:387
static std::unordered_map< RationalFunction, Annotation > lastSavedAnnotations
Definition BigStep.h:199
RationalFunction uniPolyToRationalFunction(UniPoly poly)
Definition BigStep.cpp:41
BigStep()
This class re-orders parameteric transitions of a pMC so bounds computed by Parameter Lifting will ev...
Definition BigStep.h:183
carl::UnivariatePolynomial< RationalFunctionCoefficient > UniPoly
Definition BigStep.cpp:39
carl::UnivariatePolynomial< RationalFunctionCoefficient > RawUnivariatePolynomial
carl::Variable RationalFunctionVariable
uint64_t lookUpInCache(UniPoly const &f, RationalFunctionVariable const &p)
Look up the index of this polynomial in the cache.
Definition BigStep.cpp:61
UniPoly polynomialFromFactorization(std::vector< uint64_t > const &factorization, RationalFunctionVariable const &p) const
Computes a univariate polynomial from a factorization.
Definition BigStep.cpp:77
bool operator()(const UniPoly &lhs, const UniPoly &rhs) const
Definition BigStep.cpp:47
std::size_t operator()(Container const &c) const
Definition BigStep.h:59