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>
10
11namespace storm {
12
13namespace logic {
14class Formula;
15} // namespace logic
16
17namespace modelchecker {
18template<typename FormulaType, typename ValueType>
19class CheckTask;
20} // namespace modelchecker
21
22namespace storage {
23template<typename ValueType>
24class FlexibleSparseMatrix;
25} // namespace storage
26
27namespace transformer {
28
30
31// optimization for the polynomial cache - built in comparison is slow
33 bool operator()(const UniPoly& lhs, const UniPoly& rhs) const;
34};
35
36struct PolynomialCache : std::unordered_map<RationalFunctionVariable, std::pair<std::map<UniPoly, uint64_t, UniPolyCompare>, std::vector<UniPoly>>> {
44 uint64_t lookUpInCache(UniPoly const& f, RationalFunctionVariable const& p);
45
53 UniPoly polynomialFromFactorization(std::vector<uint64_t> const& factorization, RationalFunctionVariable const& p) const;
54};
55
56template<typename Container>
58 std::size_t operator()(Container const& c) const {
59 return boost::hash_range(c.begin(), c.end());
60 }
61};
62
63class Annotation : public std::unordered_map<std::vector<uint64_t>, RationalFunctionCoefficient, container_hash<std::vector<uint64_t>>> {
64 public:
65 Annotation(RationalFunctionVariable parameter, std::shared_ptr<PolynomialCache> polynomialCache);
66
72 void operator+=(const Annotation other);
73
79 void operator*=(RationalFunctionCoefficient n);
80
86 Annotation operator*(RationalFunctionCoefficient n) const;
87
94 void addAnnotationTimesConstant(Annotation const& other, RationalFunctionCoefficient timesConstant);
95
102 void addAnnotationTimesPolynomial(Annotation const& other, UniPoly&& polynomial);
103
110 void addAnnotationTimesAnnotation(Annotation const& anno1, Annotation const& anno2);
111
117 UniPoly getProbability() const;
118
124 std::vector<UniPoly> getTerms() const;
125
126 template<typename ConstantType>
127 ConstantType evaluate(ConstantType input) const {
128 ConstantType sumOfTerms = utility::zero<ConstantType>();
129 for (auto const& [info, constant] : *this) {
130 ConstantType outerMult = utility::one<ConstantType>();
131 for (uint64_t i = 0; i < info.size(); i++) {
132 auto polynomial = this->polynomialCache->at(parameter).second[i];
133 // Evaluate the inner polynomial by its coefficients
134 auto coefficients = polynomial.coefficients();
135 ConstantType innerSum = utility::zero<ConstantType>();
136 for (uint64_t exponent = 0; exponent < coefficients.size(); exponent++) {
137 if (exponent != 0) {
138 innerSum += carl::pow(input, exponent) * utility::convertNumber<ConstantType>(coefficients[exponent]);
139 } else {
140 innerSum += utility::convertNumber<ConstantType>(coefficients[exponent]);
141 }
142 }
143 // Inner polynomial ^ exponent
144 outerMult *= carl::pow(innerSum, info[i]);
145 }
146 sumOfTerms += outerMult * utility::convertNumber<ConstantType>(constant);
147 }
148 return sumOfTerms;
149 }
150
151 Interval evaluateOnIntervalMidpointTheorem(Interval input, bool higherOrderBounds = false) const;
152
154
155 void computeDerivative(uint64_t nth);
156
157 uint64_t maxDegree() const;
158
159 std::shared_ptr<Annotation> derivative();
160
161 friend std::ostream& operator<<(std::ostream& os, const Annotation& annotation);
162
163 private:
164 const RationalFunctionVariable parameter;
165 const std::shared_ptr<PolynomialCache> polynomialCache;
166 std::shared_ptr<Annotation> derivativeOfThis;
167};
168
169std::ostream& operator<<(std::ostream& os, const Annotation& annotation);
170
176class BigStep {
177 public:
182 BigStep() : polynomialCache(std::make_shared<PolynomialCache>()) {
183 // Intentionally left empty
184 }
185
187
195 std::pair<models::sparse::Dtmc<RationalFunction>, std::map<UniPoly, Annotation>> bigStep(
197
198 static std::unordered_map<RationalFunction, Annotation> lastSavedAnnotations;
199
200 private:
212 std::pair<std::map<uint64_t, Annotation>, std::pair<std::vector<uint64_t>, std::map<uint64_t, std::set<uint64_t>>>> bigStepBFS(
213 uint64_t start, const RationalFunctionVariable& parameter, const storage::FlexibleSparseMatrix<RationalFunction>& flexibleMatrix,
214 const storage::FlexibleSparseMatrix<RationalFunction>& backwardsFlexibleMatrix,
215 const std::map<RationalFunctionVariable, std::map<uint64_t, std::set<uint64_t>>>& treeStates,
216 const boost::optional<std::vector<RationalFunction>>& stateRewardVector, const std::map<UniPoly, Annotation>& storedAnnotations);
217
230 std::vector<std::pair<uint64_t, Annotation>> findBigStep(const std::map<uint64_t, Annotation> bigStepAnnotations, const RationalFunctionVariable& parameter,
233 std::map<RationalFunctionVariable, std::set<std::set<uint64_t>>>& alreadyTimeTravelledToThis,
234 std::map<RationalFunctionVariable, std::set<uint64_t>>& treeStatesNeedUpdate, uint64_t root,
235 uint64_t originalNumStates);
236
246 std::map<UniPoly, Annotation> replaceWithNewTransitions(uint64_t state, const std::vector<std::pair<uint64_t, Annotation>> transitions,
249 storage::BitVector& reachableStates,
250 std::map<RationalFunctionVariable, std::set<uint64_t>>& treeStatesNeedUpdate);
251
259 void updateUnreachableStates(storage::BitVector& reachableStates, std::vector<uint64_t> const& statesMaybeUnreachable,
260 storage::FlexibleSparseMatrix<RationalFunction> const& backwardsFlexibleMatrix, uint64_t initialState);
261
276 void updateTreeStates(std::map<RationalFunctionVariable, std::map<uint64_t, std::set<uint64_t>>>& treeStates,
277 std::map<RationalFunctionVariable, std::set<uint64_t>>& workingSets,
279 const storage::FlexibleSparseMatrix<RationalFunction>& backwardsTransitions, const std::set<RationalFunctionVariable>& allParameters,
280 const boost::optional<std::vector<RationalFunction>>& stateRewardVector, const models::sparse::StateLabeling stateLabelling);
281
292 models::sparse::StateLabeling extendStateLabeling(const models::sparse::StateLabeling& oldLabeling, uint64_t oldSize, uint64_t newSize,
293 uint64_t stateWithLabels, const std::set<std::string>& labelsInFormula);
300 std::vector<storm::storage::MatrixEntry<uint64_t, RationalFunction>> joinDuplicateTransitions(
302
303 std::shared_ptr<RawPolynomialCache> rawPolynomialCache;
304
305 const std::shared_ptr<PolynomialCache> polynomialCache;
306};
307
308} // namespace transformer
309} // namespace storm
This class represents a discrete-time Markov chain.
Definition Dtmc.h:14
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:180
void addAnnotationTimesPolynomial(Annotation const &other, UniPoly &&polynomial)
Adds another annotation times a polynomial to this annotation.
Definition BigStep.cpp:137
friend std::ostream & operator<<(std::ostream &os, const Annotation &annotation)
Definition BigStep.cpp:276
void addAnnotationTimesConstant(Annotation const &other, RationalFunctionCoefficient timesConstant)
Adds another annotation times a constant to this annotation.
Definition BigStep.cpp:128
std::vector< UniPoly > getTerms() const
Get all of the terms of the UniPoly.
Definition BigStep.cpp:188
void computeDerivative(uint64_t nth)
Definition BigStep.cpp:218
void operator*=(RationalFunctionCoefficient n)
Multiply this annotation with a rational number.
Definition BigStep.cpp:116
std::shared_ptr< Annotation > derivative()
Definition BigStep.cpp:270
Interval evaluateOnIntervalMidpointTheorem(Interval input, bool higherOrderBounds=false) const
Definition BigStep.cpp:196
void operator+=(const Annotation other)
Add another annotation to this annotation.
Definition BigStep.cpp:105
void addAnnotationTimesAnnotation(Annotation const &anno1, Annotation const &anno2)
Adds another annotation times an annotation to this annotation.
Definition BigStep.cpp:157
ConstantType evaluate(ConstantType input) const
Definition BigStep.h:127
RationalFunctionVariable getParameter() const
Definition BigStep.cpp:214
Annotation operator*(RationalFunctionCoefficient n) const
Multiply this annotation with a rational number to get a new annotation.
Definition BigStep.cpp:122
Shorthand for std::unordered_map<T, uint64_t>.
Definition BigStep.h:176
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:393
static std::unordered_map< RationalFunction, Annotation > lastSavedAnnotations
Definition BigStep.h:198
RationalFunction uniPolyToRationalFunction(UniPoly poly)
Definition BigStep.cpp:47
BigStep()
This class re-orders parameteric transitions of a pMC so bounds computed by Parameter Lifting will ev...
Definition BigStep.h:182
carl::UnivariatePolynomial< RationalFunctionCoefficient > UniPoly
Definition BigStep.cpp:45
LabParser.cpp.
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:67
UniPoly polynomialFromFactorization(std::vector< uint64_t > const &factorization, RationalFunctionVariable const &p) const
Computes a univariate polynomial from a factorization.
Definition BigStep.cpp:83
bool operator()(const UniPoly &lhs, const UniPoly &rhs) const
Definition BigStep.cpp:53
std::size_t operator()(Container const &c) const
Definition BigStep.h:58