18namespace modelchecker {
21template<
typename ValueType, storm::dd::DdType DdType,
bool Nondeterministic>
24 : _model(model), _transitionMatrix(transitionMatrix), _markovianStates(nullptr), _exitRates(nullptr) {
28template<
typename ValueType, storm::dd::DdType DdType,
bool Nondeterministic>
33 : _model(model), _transitionMatrix(transitionMatrix), _markovianStates(&markovianStates), _exitRates(&exitRateVector) {
37template<
typename ValueType, storm::dd::DdType DdType,
bool Nondeterministic>
41 : _model(model), _transitionMatrix(transitionMatrix), _markovianStates(nullptr), _exitRates(&exitRateVector) {
45template<
typename ValueType, storm::dd::DdType DdType,
bool Nondeterministic>
46std::unique_ptr<HybridQuantitativeCheckResult<DdType, ValueType>>
54 if (Nondeterministic) {
55 explicitTransitionMatrix = _transitionMatrix.toMatrix(
58 explicitTransitionMatrix = _transitionMatrix.toMatrix(odd, odd);
60 std::vector<ValueType> explicitExitRateVector;
62 if (isContinuousTime()) {
63 explicitExitRateVector = _exitRates->toVector(odd);
64 if (_markovianStates) {
65 explicitMarkovianStates = _markovianStates->toVector(odd);
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));
75template<
typename ValueType, storm::dd::DdType DdType,
bool Nondeterministic>
76std::unique_ptr<HybridQuantitativeCheckResult<DdType, ValueType>>
86 std::vector<ValueType> explicitStateRewards, explicitActionRewards;
92 auto matrixRewards = _transitionMatrix.toMatrixVector(
95 explicitTransitionMatrix = std::move(matrixRewards.first);
96 explicitActionRewards = std::move(matrixRewards.second);
99 if (Nondeterministic) {
100 explicitTransitionMatrix = _transitionMatrix.toMatrix(
103 explicitTransitionMatrix = _transitionMatrix.toMatrix(odd, odd);
112 std::vector<ValueType> explicitExitRateVector;
114 if (isContinuousTime()) {
115 explicitExitRateVector = _exitRates->toVector(odd);
116 if (_markovianStates) {
117 explicitMarkovianStates = _markovianStates->toVector(odd);
120 auto sparseHelper = createSparseHelper(explicitTransitionMatrix, explicitMarkovianStates, explicitExitRateVector, odd);
121 auto explicitResult = sparseHelper->computeLongRunAverageValues(env, rewardModel.
hasStateRewards() ? &explicitStateRewards :
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));
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;
134template<
typename ValueType, storm::dd::DdType DdType,
bool Nondeterministic>
135template<
bool N, std::enable_if_t<N,
int>>
139 std::unique_ptr<SparseInfiniteHorizonHelper<ValueType, Nondeterministic>> result;
140 if (isContinuousTime()) {
142 std::make_unique<storm::modelchecker::helper::SparseNondeterministicInfiniteHorizonHelper<ValueType>>(transitionMatrix, markovianStates, exitRates);
144 result = std::make_unique<storm::modelchecker::helper::SparseNondeterministicInfiniteHorizonHelper<ValueType>>(transitionMatrix);
148 STORM_LOG_WARN_COND(!this->isProduceSchedulerSet(),
"Scheduler extraction not supported in Hybrid engine.");
152template<
typename ValueType, storm::dd::DdType DdType,
bool Nondeterministic>
153template<
bool N, std::enable_if_t<!N,
int>>
157 std::unique_ptr<SparseInfiniteHorizonHelper<ValueType, Nondeterministic>> result;
158 if (isContinuousTime()) {
159 result = std::make_unique<storm::modelchecker::helper::SparseDeterministicInfiniteHorizonHelper<ValueType>>(transitionMatrix, exitRates);
161 result = std::make_unique<storm::modelchecker::helper::SparseDeterministicInfiniteHorizonHelper<ValueType>>(transitionMatrix);
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>;
std::vector< ValueType > toVector() const
Converts the ADD to a vector.
storm::storage::BitVector toVector(storm::dd::Odd const &rowOdd) const
Converts the BDD to a bit vector.
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 isContinuousTime() const
bool isNondeterministicModel() const
Returns true if the model is a nondeterministic model.
Base class for all symbolic models.
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.
A class that holds a possibly non-square matrix in the compressed row storage format.
#define STORM_LOG_ASSERT(cond, message)
#define STORM_LOG_WARN_COND(cond, message)
#define STORM_LOG_THROW(cond, exception, message)
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.