18namespace modelchecker {
19template<
typename FormulaType,
typename ValueType>
24template<
typename ValueType>
25class FlexibleSparseMatrix;
28namespace transformer {
37struct PolynomialCache : std::unordered_map<RationalFunctionVariable, std::pair<std::map<UniPoly, uint64_t, UniPolyCompare>, std::vector<UniPoly>>> {
57template<
typename Container>
60 return boost::hash_range(c.begin(), c.end());
64class Annotation :
public std::unordered_map<std::vector<uint64_t>, RationalFunctionCoefficient, container_hash<std::vector<uint64_t>>> {
80 void operator*=(RationalFunctionCoefficient n);
125 std::vector<UniPoly>
getTerms()
const;
127 template<
typename ConstantType>
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];
135 auto coefficients = polynomial.coefficients();
136 ConstantType innerSum = utility::zero<ConstantType>();
137 for (uint64_t exponent = 0; exponent < coefficients.size(); exponent++) {
139 innerSum += carl::pow(input, exponent) * utility::convertNumber<ConstantType>(coefficients[exponent]);
141 innerSum += utility::convertNumber<ConstantType>(coefficients[exponent]);
145 outerMult *= carl::pow(innerSum, info[i]);
147 sumOfTerms += outerMult * utility::convertNumber<ConstantType>(constant);
166 const std::shared_ptr<PolynomialCache> polynomialCache;
167 std::shared_ptr<Annotation> derivativeOfThis;
170std::ostream& operator<<(std::ostream& os,
const Annotation& annotation);
196 std::pair<models::sparse::Dtmc<RationalFunction>, std::map<UniPoly, Annotation>>
bigStep(
213 std::pair<std::map<uint64_t, Annotation>, std::pair<std::vector<uint64_t>, std::map<uint64_t, std::set<uint64_t>>>> bigStepBFS(
217 const boost::optional<std::vector<RationalFunction>>& stateRewardVector,
const std::map<UniPoly, Annotation>& storedAnnotations);
231 std::vector<std::pair<uint64_t, Annotation>> findBigStep(
const std::map<uint64_t, Annotation> bigStepAnnotations,
const RationalFunctionVariable& parameter,
236 uint64_t originalNumStates);
247 std::map<UniPoly, Annotation> replaceWithNewTransitions(uint64_t state,
const std::vector<std::pair<uint64_t, Annotation>> transitions,
260 void updateUnreachableStates(
storage::BitVector& reachableStates, std::vector<uint64_t>
const& statesMaybeUnreachable,
294 uint64_t stateWithLabels,
const std::set<std::string>& labelsInFormula);
301 std::vector<storm::storage::MatrixEntry<uint64_t, RationalFunction>> joinDuplicateTransitions(
304 std::shared_ptr<RawPolynomialCache> rawPolynomialCache;
306 const std::shared_ptr<PolynomialCache> polynomialCache;
This class represents a discrete-time Markov chain.
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.
The flexible sparse matrix is used during state elimination.
carl::UnivariatePolynomial< RationalFunctionCoefficient > RawUnivariatePolynomial
carl::Variable RationalFunctionVariable