17namespace modelchecker {
18template<
typename FormulaType,
typename ValueType>
23template<
typename ValueType>
24class FlexibleSparseMatrix;
27namespace transformer {
36struct PolynomialCache : std::unordered_map<RationalFunctionVariable, std::pair<std::map<UniPoly, uint64_t, UniPolyCompare>, std::vector<UniPoly>>> {
56template<
typename Container>
59 return boost::hash_range(c.begin(), c.end());
63class Annotation :
public std::unordered_map<std::vector<uint64_t>, RationalFunctionCoefficient, container_hash<std::vector<uint64_t>>> {
79 void operator*=(RationalFunctionCoefficient n);
124 std::vector<UniPoly>
getTerms()
const;
126 template<
typename ConstantType>
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];
134 auto coefficients = polynomial.coefficients();
135 ConstantType innerSum = utility::zero<ConstantType>();
136 for (uint64_t exponent = 0; exponent < coefficients.size(); exponent++) {
138 innerSum += carl::pow(input, exponent) * utility::convertNumber<ConstantType>(coefficients[exponent]);
140 innerSum += utility::convertNumber<ConstantType>(coefficients[exponent]);
144 outerMult *= carl::pow(innerSum, info[i]);
146 sumOfTerms += outerMult * utility::convertNumber<ConstantType>(constant);
165 const std::shared_ptr<PolynomialCache> polynomialCache;
166 std::shared_ptr<Annotation> derivativeOfThis;
169std::ostream& operator<<(std::ostream& os,
const Annotation& annotation);
195 std::pair<models::sparse::Dtmc<RationalFunction>, std::map<UniPoly, Annotation>>
bigStep(
212 std::pair<std::map<uint64_t, Annotation>, std::pair<std::vector<uint64_t>, std::map<uint64_t, std::set<uint64_t>>>> bigStepBFS(
216 const boost::optional<std::vector<RationalFunction>>& stateRewardVector,
const std::map<UniPoly, Annotation>& storedAnnotations);
230 std::vector<std::pair<uint64_t, Annotation>> findBigStep(
const std::map<uint64_t, Annotation> bigStepAnnotations,
const RationalFunctionVariable& parameter,
235 uint64_t originalNumStates);
246 std::map<UniPoly, Annotation> replaceWithNewTransitions(uint64_t state,
const std::vector<std::pair<uint64_t, Annotation>> transitions,
259 void updateUnreachableStates(
storage::BitVector& reachableStates, std::vector<uint64_t>
const& statesMaybeUnreachable,
293 uint64_t stateWithLabels,
const std::set<std::string>& labelsInFormula);
300 std::vector<storm::storage::MatrixEntry<uint64_t, RationalFunction>> joinDuplicateTransitions(
303 std::shared_ptr<RawPolynomialCache> rawPolynomialCache;
305 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