Storm
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
HybridInfiniteHorizonHelper.cpp
Go to the documentation of this file.
2
6
8
10
12
14
16
17namespace storm {
18namespace modelchecker {
19namespace helper {
20
21template<typename ValueType, storm::dd::DdType DdType, bool Nondeterministic>
23 storm::dd::Add<DdType, ValueType> const& transitionMatrix)
24 : _model(model), _transitionMatrix(transitionMatrix), _markovianStates(nullptr), _exitRates(nullptr) {
25 STORM_LOG_ASSERT(model.isNondeterministicModel() == Nondeterministic, "Template Parameter does not match model type.");
26}
27
28template<typename ValueType, storm::dd::DdType DdType, bool Nondeterministic>
30 storm::dd::Add<DdType, ValueType> const& transitionMatrix,
31 storm::dd::Bdd<DdType> const& markovianStates,
32 storm::dd::Add<DdType, ValueType> const& exitRateVector)
33 : _model(model), _transitionMatrix(transitionMatrix), _markovianStates(&markovianStates), _exitRates(&exitRateVector) {
34 STORM_LOG_ASSERT(model.isNondeterministicModel() == Nondeterministic, "Template Parameter does not match model type.");
35}
36
37template<typename ValueType, storm::dd::DdType DdType, bool Nondeterministic>
39 storm::dd::Add<DdType, ValueType> const& transitionMatrix,
40 storm::dd::Add<DdType, ValueType> const& exitRateVector)
41 : _model(model), _transitionMatrix(transitionMatrix), _markovianStates(nullptr), _exitRates(&exitRateVector) {
42 STORM_LOG_ASSERT(model.isNondeterministicModel() == Nondeterministic, "Template Parameter does not match model type.");
43}
44
45template<typename ValueType, storm::dd::DdType DdType, bool Nondeterministic>
46std::unique_ptr<HybridQuantitativeCheckResult<DdType, ValueType>>
48 storm::dd::Bdd<DdType> const& psiStates) {
49 // Convert this query to an instance for the sparse engine.
50 // Create ODD for the translation.
51 storm::dd::Odd odd = _model.getReachableStates().createOdd();
52 // Translate all required components
53 storm::storage::SparseMatrix<ValueType> explicitTransitionMatrix;
54 if (Nondeterministic) {
55 explicitTransitionMatrix = _transitionMatrix.toMatrix(
56 dynamic_cast<storm::models::symbolic::NondeterministicModel<DdType, ValueType> const&>(_model).getNondeterminismVariables(), odd, odd);
57 } else {
58 explicitTransitionMatrix = _transitionMatrix.toMatrix(odd, odd);
59 }
60 std::vector<ValueType> explicitExitRateVector;
61 storm::storage::BitVector explicitMarkovianStates;
62 if (isContinuousTime()) {
63 explicitExitRateVector = _exitRates->toVector(odd);
64 if (_markovianStates) {
65 explicitMarkovianStates = _markovianStates->toVector(odd);
66 }
67 }
68 auto sparseHelper = createSparseHelper(explicitTransitionMatrix, explicitMarkovianStates, explicitExitRateVector, odd);
69 auto explicitResult = sparseHelper->computeLongRunAverageProbabilities(env, psiStates.toVector(odd));
70 return std::make_unique<HybridQuantitativeCheckResult<DdType, ValueType>>(_model.getReachableStates(), _model.getManager().getBddZero(),
71 _model.getManager().template getAddZero<ValueType>(), _model.getReachableStates(),
72 std::move(odd), std::move(explicitResult));
73}
74
75template<typename ValueType, storm::dd::DdType DdType, bool Nondeterministic>
76std::unique_ptr<HybridQuantitativeCheckResult<DdType, ValueType>>
79 // Convert this query to an instance for the sparse engine.
80 // Create ODD for the translation.
81 storm::dd::Odd odd = _model.getReachableStates().createOdd();
82
83 // Translate all required components
84 // Transitions and rewards
85 storm::storage::SparseMatrix<ValueType> explicitTransitionMatrix;
86 std::vector<ValueType> explicitStateRewards, explicitActionRewards;
87 if (rewardModel.hasStateRewards()) {
88 explicitStateRewards = rewardModel.getStateRewardVector().toVector(odd);
89 }
90 if (Nondeterministic && rewardModel.hasStateActionRewards()) {
91 // Matrix and action-based vector have to be produced at the same time to guarantee the correct order
92 auto matrixRewards = _transitionMatrix.toMatrixVector(
93 rewardModel.getStateActionRewardVector(),
95 explicitTransitionMatrix = std::move(matrixRewards.first);
96 explicitActionRewards = std::move(matrixRewards.second);
97 } else {
98 // Translate matrix only
99 if (Nondeterministic) {
100 explicitTransitionMatrix = _transitionMatrix.toMatrix(
101 dynamic_cast<storm::models::symbolic::NondeterministicModel<DdType, ValueType> const&>(_model).getNondeterminismVariables(), odd, odd);
102 } else {
103 explicitTransitionMatrix = _transitionMatrix.toMatrix(odd, odd);
104 }
105 if (rewardModel.hasStateActionRewards()) {
106 // For deterministic models we can translate the action rewards easily
107 explicitActionRewards = rewardModel.getStateActionRewardVector().toVector(odd);
108 }
109 }
110 STORM_LOG_THROW(!rewardModel.hasTransitionRewards(), storm::exceptions::NotSupportedException, "Transition rewards are not supported in this engine.");
111 // Continuous time information
112 std::vector<ValueType> explicitExitRateVector;
113 storm::storage::BitVector explicitMarkovianStates;
114 if (isContinuousTime()) {
115 explicitExitRateVector = _exitRates->toVector(odd);
116 if (_markovianStates) {
117 explicitMarkovianStates = _markovianStates->toVector(odd);
118 }
119 }
120 auto sparseHelper = createSparseHelper(explicitTransitionMatrix, explicitMarkovianStates, explicitExitRateVector, odd);
121 auto explicitResult = sparseHelper->computeLongRunAverageValues(env, rewardModel.hasStateRewards() ? &explicitStateRewards : nullptr,
122 rewardModel.hasStateActionRewards() ? &explicitActionRewards : nullptr);
123 return std::make_unique<HybridQuantitativeCheckResult<DdType, ValueType>>(_model.getReachableStates(), _model.getManager().getBddZero(),
124 _model.getManager().template getAddZero<ValueType>(), _model.getReachableStates(),
125 std::move(odd), std::move(explicitResult));
126}
127
128template<typename ValueType, storm::dd::DdType DdType, bool Nondeterministic>
130 STORM_LOG_ASSERT((_markovianStates == nullptr) || (_exitRates != nullptr), "Inconsistent information given: Have Markovian states but no exit rates.");
131 return _exitRates != nullptr;
132}
133
134template<typename ValueType, storm::dd::DdType DdType, bool Nondeterministic>
135template<bool N, std::enable_if_t<N, int>>
136std::unique_ptr<SparseInfiniteHorizonHelper<ValueType, Nondeterministic>> HybridInfiniteHorizonHelper<ValueType, DdType, Nondeterministic>::createSparseHelper(
137 storm::storage::SparseMatrix<ValueType> const& transitionMatrix, storm::storage::BitVector const& markovianStates, std::vector<ValueType> const& exitRates,
138 storm::dd::Odd const& odd) const {
139 std::unique_ptr<SparseInfiniteHorizonHelper<ValueType, Nondeterministic>> result;
140 if (isContinuousTime()) {
141 result =
142 std::make_unique<storm::modelchecker::helper::SparseNondeterministicInfiniteHorizonHelper<ValueType>>(transitionMatrix, markovianStates, exitRates);
143 } else {
144 result = std::make_unique<storm::modelchecker::helper::SparseNondeterministicInfiniteHorizonHelper<ValueType>>(transitionMatrix);
145 }
147 [&odd](storm::dd::Bdd<DdType> const& s) { return s.toVector(odd); });
148 STORM_LOG_WARN_COND(!this->isProduceSchedulerSet(), "Scheduler extraction not supported in Hybrid engine.");
149 return result;
150}
151
152template<typename ValueType, storm::dd::DdType DdType, bool Nondeterministic>
153template<bool N, std::enable_if_t<!N, int>>
154std::unique_ptr<SparseInfiniteHorizonHelper<ValueType, Nondeterministic>> HybridInfiniteHorizonHelper<ValueType, DdType, Nondeterministic>::createSparseHelper(
155 storm::storage::SparseMatrix<ValueType> const& transitionMatrix, storm::storage::BitVector const& markovianStates, std::vector<ValueType> const& exitRates,
156 storm::dd::Odd const& odd) const {
157 std::unique_ptr<SparseInfiniteHorizonHelper<ValueType, Nondeterministic>> result;
158 if (isContinuousTime()) {
159 result = std::make_unique<storm::modelchecker::helper::SparseDeterministicInfiniteHorizonHelper<ValueType>>(transitionMatrix, exitRates);
160 } else {
161 result = std::make_unique<storm::modelchecker::helper::SparseDeterministicInfiniteHorizonHelper<ValueType>>(transitionMatrix);
162 }
164 [&odd](storm::dd::Bdd<DdType> const& s) { return s.toVector(odd); });
165 return result;
166}
167
168template class HybridInfiniteHorizonHelper<double, storm::dd::DdType::CUDD, false>;
169template class HybridInfiniteHorizonHelper<double, storm::dd::DdType::CUDD, true>;
170template class HybridInfiniteHorizonHelper<double, storm::dd::DdType::Sylvan, false>;
171template class HybridInfiniteHorizonHelper<double, storm::dd::DdType::Sylvan, true>;
172template class HybridInfiniteHorizonHelper<storm::RationalNumber, storm::dd::DdType::Sylvan, false>;
173template class HybridInfiniteHorizonHelper<storm::RationalNumber, storm::dd::DdType::Sylvan, true>;
174template class HybridInfiniteHorizonHelper<storm::RationalFunction, storm::dd::DdType::Sylvan, false>;
175
176} // namespace helper
177} // namespace modelchecker
178} // namespace storm
std::vector< ValueType > toVector() const
Converts the ADD to a vector.
Definition Add.cpp:552
storm::storage::BitVector toVector(storm::dd::Odd const &rowOdd) const
Converts the BDD to a bit vector.
Definition Bdd.cpp:497
std::unique_ptr< HybridQuantitativeCheckResult< DdType, ValueType > > computeLongRunAverageProbabilities(Environment const &env, storm::dd::Bdd< DdType > const &psiStates)
Computes the long run average probabilities, i.e., the fraction of the time we are in a psiState.
std::unique_ptr< SparseInfiniteHorizonHelper< ValueType, Nondeterministic > > createSparseHelper(storm::storage::SparseMatrix< ValueType > const &transitionMatrix, storm::storage::BitVector const &markovianStates, std::vector< ValueType > const &exitRates, storm::dd::Odd const &odd) const
HybridInfiniteHorizonHelper(storm::models::symbolic::Model< DdType, ValueType > const &model, storm::dd::Add< DdType, ValueType > const &transitionMatrix)
Initializes the helper for a discrete time model (MDP or DTMC)
std::unique_ptr< HybridQuantitativeCheckResult< DdType, ValueType > > computeLongRunAverageRewards(Environment const &env, storm::models::symbolic::StandardRewardModel< DdType, ValueType > const &rewardModel)
Computes the long run average rewards, i.e., the average reward collected per time unit.
bool isNondeterministicModel() const
Returns true if the model is a nondeterministic model.
Definition ModelBase.cpp:23
Base class for all symbolic models.
Definition Model.h:46
Base class for all nondeterministic symbolic models.
virtual std::set< storm::expressions::Variable > const & getNondeterminismVariables() const override
Retrieves the meta variables used to encode the nondeterminism in the model.
storm::dd::Add< Type, ValueType > const & getStateActionRewardVector() const
Retrieves the state-action rewards of the reward model.
bool hasStateRewards() const
Retrieves whether the reward model has state rewards.
storm::dd::Add< Type, ValueType > const & getStateRewardVector() const
Retrieves the state rewards of the reward model.
bool hasStateActionRewards() const
Retrieves whether the reward model has state-action rewards.
bool hasTransitionRewards() const
Retrieves whether the reward model has transition rewards.
A bit vector that is internally represented as a vector of 64-bit values.
Definition BitVector.h:18
A class that holds a possibly non-square matrix in the compressed row storage format.
#define STORM_LOG_ASSERT(cond, message)
Definition macros.h:11
#define STORM_LOG_WARN_COND(cond, message)
Definition macros.h:38
#define STORM_LOG_THROW(cond, exception, message)
Definition macros.h:30
void setInformationFromOtherHelperNondeterministic(TargetHelperType &targetHelper, SourceHelperType const &sourceHelperType, std::function< typename TargetHelperType::StateSet(typename SourceHelperType::StateSet const &)> const &stateSetTransformer)
Forwards relevant information stored in another helper to the given helper.
void setInformationFromOtherHelperDeterministic(TargetHelperType &targetHelper, SourceHelperType const &sourceHelperType, std::function< typename TargetHelperType::StateSet(typename SourceHelperType::StateSet const &)> const &stateSetTransformer)
Forwards relevant information stored in another helper to the given helper.
LabParser.cpp.
Definition cli.cpp:18