Storm 1.11.1.1
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
HybridInfiniteHorizonHelper.cpp
Go to the documentation of this file.
2
11
12namespace storm {
13namespace modelchecker {
14namespace helper {
15
16template<typename ValueType, storm::dd::DdType DdType, bool Nondeterministic>
18 storm::dd::Add<DdType, ValueType> const& transitionMatrix)
19 : _model(model), _transitionMatrix(transitionMatrix), _markovianStates(nullptr), _exitRates(nullptr) {
20 STORM_LOG_ASSERT(model.isNondeterministicModel() == Nondeterministic, "Template Parameter does not match model type.");
21}
22
23template<typename ValueType, storm::dd::DdType DdType, bool Nondeterministic>
25 storm::dd::Add<DdType, ValueType> const& transitionMatrix,
26 storm::dd::Bdd<DdType> const& markovianStates,
27 storm::dd::Add<DdType, ValueType> const& exitRateVector)
28 : _model(model), _transitionMatrix(transitionMatrix), _markovianStates(&markovianStates), _exitRates(&exitRateVector) {
29 STORM_LOG_ASSERT(model.isNondeterministicModel() == Nondeterministic, "Template Parameter does not match model type.");
30}
31
32template<typename ValueType, storm::dd::DdType DdType, bool Nondeterministic>
34 storm::dd::Add<DdType, ValueType> const& transitionMatrix,
35 storm::dd::Add<DdType, ValueType> const& exitRateVector)
36 : _model(model), _transitionMatrix(transitionMatrix), _markovianStates(nullptr), _exitRates(&exitRateVector) {
37 STORM_LOG_ASSERT(model.isNondeterministicModel() == Nondeterministic, "Template Parameter does not match model type.");
38}
39
40template<typename ValueType, storm::dd::DdType DdType, bool Nondeterministic>
41std::unique_ptr<HybridQuantitativeCheckResult<DdType, ValueType>>
43 storm::dd::Bdd<DdType> const& psiStates) {
44 // Convert this query to an instance for the sparse engine.
45 // Create ODD for the translation.
46 storm::dd::Odd odd = _model.getReachableStates().createOdd();
47 // Translate all required components
48 storm::storage::SparseMatrix<ValueType> explicitTransitionMatrix;
49 if (Nondeterministic) {
50 explicitTransitionMatrix = _transitionMatrix.toMatrix(
51 dynamic_cast<storm::models::symbolic::NondeterministicModel<DdType, ValueType> const&>(_model).getNondeterminismVariables(), odd, odd);
52 } else {
53 explicitTransitionMatrix = _transitionMatrix.toMatrix(odd, odd);
54 }
55 std::vector<ValueType> explicitExitRateVector;
56 storm::storage::BitVector explicitMarkovianStates;
57 if (isContinuousTime()) {
58 explicitExitRateVector = _exitRates->toVector(odd);
59 if (_markovianStates) {
60 explicitMarkovianStates = _markovianStates->toVector(odd);
61 }
62 }
63 auto sparseHelper = createSparseHelper(explicitTransitionMatrix, explicitMarkovianStates, explicitExitRateVector, odd);
64 auto explicitResult = sparseHelper->computeLongRunAverageProbabilities(env, psiStates.toVector(odd));
65 return std::make_unique<HybridQuantitativeCheckResult<DdType, ValueType>>(_model.getReachableStates(), _model.getManager().getBddZero(),
66 _model.getManager().template getAddZero<ValueType>(), _model.getReachableStates(),
67 std::move(odd), std::move(explicitResult));
68}
69
70template<typename ValueType, storm::dd::DdType DdType, bool Nondeterministic>
71std::unique_ptr<HybridQuantitativeCheckResult<DdType, ValueType>>
74 // Convert this query to an instance for the sparse engine.
75 // Create ODD for the translation.
76 storm::dd::Odd odd = _model.getReachableStates().createOdd();
77
78 // Translate all required components
79 // Transitions and rewards
80 storm::storage::SparseMatrix<ValueType> explicitTransitionMatrix;
81 std::vector<ValueType> explicitStateRewards, explicitActionRewards;
82 if (rewardModel.hasStateRewards()) {
83 explicitStateRewards = rewardModel.getStateRewardVector().toVector(odd);
84 }
85 if (Nondeterministic && rewardModel.hasStateActionRewards()) {
86 // Matrix and action-based vector have to be produced at the same time to guarantee the correct order
87 auto matrixRewards = _transitionMatrix.toMatrixVector(
88 rewardModel.getStateActionRewardVector(),
90 explicitTransitionMatrix = std::move(matrixRewards.first);
91 explicitActionRewards = std::move(matrixRewards.second);
92 } else {
93 // Translate matrix only
94 if (Nondeterministic) {
95 explicitTransitionMatrix = _transitionMatrix.toMatrix(
96 dynamic_cast<storm::models::symbolic::NondeterministicModel<DdType, ValueType> const&>(_model).getNondeterminismVariables(), odd, odd);
97 } else {
98 explicitTransitionMatrix = _transitionMatrix.toMatrix(odd, odd);
99 }
100 if (rewardModel.hasStateActionRewards()) {
101 // For deterministic models we can translate the action rewards easily
102 explicitActionRewards = rewardModel.getStateActionRewardVector().toVector(odd);
103 }
104 }
105 STORM_LOG_THROW(!rewardModel.hasTransitionRewards(), storm::exceptions::NotSupportedException, "Transition rewards are not supported in this engine.");
106 // Continuous time information
107 std::vector<ValueType> explicitExitRateVector;
108 storm::storage::BitVector explicitMarkovianStates;
109 if (isContinuousTime()) {
110 explicitExitRateVector = _exitRates->toVector(odd);
111 if (_markovianStates) {
112 explicitMarkovianStates = _markovianStates->toVector(odd);
113 }
114 }
115 auto sparseHelper = createSparseHelper(explicitTransitionMatrix, explicitMarkovianStates, explicitExitRateVector, odd);
116 auto explicitResult = sparseHelper->computeLongRunAverageValues(env, rewardModel.hasStateRewards() ? &explicitStateRewards : nullptr,
117 rewardModel.hasStateActionRewards() ? &explicitActionRewards : nullptr);
118 return std::make_unique<HybridQuantitativeCheckResult<DdType, ValueType>>(_model.getReachableStates(), _model.getManager().getBddZero(),
119 _model.getManager().template getAddZero<ValueType>(), _model.getReachableStates(),
120 std::move(odd), std::move(explicitResult));
121}
122
123template<typename ValueType, storm::dd::DdType DdType, bool Nondeterministic>
125 STORM_LOG_ASSERT((_markovianStates == nullptr) || (_exitRates != nullptr), "Inconsistent information given: Have Markovian states but no exit rates.");
126 return _exitRates != nullptr;
127}
128
129template<typename ValueType, storm::dd::DdType DdType, bool Nondeterministic>
130template<bool N, std::enable_if_t<N, int>>
131std::unique_ptr<SparseInfiniteHorizonHelper<ValueType, Nondeterministic>> HybridInfiniteHorizonHelper<ValueType, DdType, Nondeterministic>::createSparseHelper(
132 storm::storage::SparseMatrix<ValueType> const& transitionMatrix, storm::storage::BitVector const& markovianStates, std::vector<ValueType> const& exitRates,
133 storm::dd::Odd const& odd) const {
134 std::unique_ptr<SparseInfiniteHorizonHelper<ValueType, Nondeterministic>> result;
135 if (isContinuousTime()) {
136 result =
137 std::make_unique<storm::modelchecker::helper::SparseNondeterministicInfiniteHorizonHelper<ValueType>>(transitionMatrix, markovianStates, exitRates);
138 } else {
139 result = std::make_unique<storm::modelchecker::helper::SparseNondeterministicInfiniteHorizonHelper<ValueType>>(transitionMatrix);
140 }
142 [&odd](storm::dd::Bdd<DdType> const& s) { return s.toVector(odd); });
143 STORM_LOG_WARN_COND(!this->isProduceSchedulerSet(), "Scheduler extraction not supported in Hybrid engine.");
144 return result;
145}
146
147template<typename ValueType, storm::dd::DdType DdType, bool Nondeterministic>
148template<bool N, std::enable_if_t<!N, int>>
149std::unique_ptr<SparseInfiniteHorizonHelper<ValueType, Nondeterministic>> HybridInfiniteHorizonHelper<ValueType, DdType, Nondeterministic>::createSparseHelper(
150 storm::storage::SparseMatrix<ValueType> const& transitionMatrix, storm::storage::BitVector const& markovianStates, std::vector<ValueType> const& exitRates,
151 storm::dd::Odd const& odd) const {
152 std::unique_ptr<SparseInfiniteHorizonHelper<ValueType, Nondeterministic>> result;
153 if (isContinuousTime()) {
154 result = std::make_unique<storm::modelchecker::helper::SparseDeterministicInfiniteHorizonHelper<ValueType>>(transitionMatrix, exitRates);
155 } else {
156 result = std::make_unique<storm::modelchecker::helper::SparseDeterministicInfiniteHorizonHelper<ValueType>>(transitionMatrix);
157 }
159 [&odd](storm::dd::Bdd<DdType> const& s) { return s.toVector(odd); });
160 return result;
161}
162
163template class HybridInfiniteHorizonHelper<double, storm::dd::DdType::CUDD, false>;
164template class HybridInfiniteHorizonHelper<double, storm::dd::DdType::CUDD, true>;
165template class HybridInfiniteHorizonHelper<double, storm::dd::DdType::Sylvan, false>;
166template class HybridInfiniteHorizonHelper<double, storm::dd::DdType::Sylvan, true>;
167template class HybridInfiniteHorizonHelper<storm::RationalNumber, storm::dd::DdType::Sylvan, false>;
168template class HybridInfiniteHorizonHelper<storm::RationalNumber, storm::dd::DdType::Sylvan, true>;
169template class HybridInfiniteHorizonHelper<storm::RationalFunction, storm::dd::DdType::Sylvan, false>;
170
171} // namespace helper
172} // namespace modelchecker
173} // namespace storm
std::vector< ValueType > toVector() const
Converts the ADD to a vector.
Definition Add.cpp:545
storm::storage::BitVector toVector(storm::dd::Odd const &rowOdd) const
Converts the BDD to a bit vector.
Definition Bdd.cpp:491
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:31
Base class for all symbolic models.
Definition Model.h:42
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:16
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.