13namespace modelchecker {
16template<
typename ValueType, storm::dd::DdType DdType,
bool Nondeterministic>
19 : _model(model), _transitionMatrix(transitionMatrix), _markovianStates(nullptr), _exitRates(nullptr) {
23template<
typename ValueType, storm::dd::DdType DdType,
bool Nondeterministic>
28 : _model(model), _transitionMatrix(transitionMatrix), _markovianStates(&markovianStates), _exitRates(&exitRateVector) {
32template<
typename ValueType, storm::dd::DdType DdType,
bool Nondeterministic>
36 : _model(model), _transitionMatrix(transitionMatrix), _markovianStates(nullptr), _exitRates(&exitRateVector) {
40template<
typename ValueType, storm::dd::DdType DdType,
bool Nondeterministic>
41std::unique_ptr<HybridQuantitativeCheckResult<DdType, ValueType>>
49 if (Nondeterministic) {
50 explicitTransitionMatrix = _transitionMatrix.toMatrix(
53 explicitTransitionMatrix = _transitionMatrix.toMatrix(odd, odd);
55 std::vector<ValueType> explicitExitRateVector;
57 if (isContinuousTime()) {
58 explicitExitRateVector = _exitRates->toVector(odd);
59 if (_markovianStates) {
60 explicitMarkovianStates = _markovianStates->toVector(odd);
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));
70template<
typename ValueType, storm::dd::DdType DdType,
bool Nondeterministic>
71std::unique_ptr<HybridQuantitativeCheckResult<DdType, ValueType>>
81 std::vector<ValueType> explicitStateRewards, explicitActionRewards;
87 auto matrixRewards = _transitionMatrix.toMatrixVector(
90 explicitTransitionMatrix = std::move(matrixRewards.first);
91 explicitActionRewards = std::move(matrixRewards.second);
94 if (Nondeterministic) {
95 explicitTransitionMatrix = _transitionMatrix.toMatrix(
98 explicitTransitionMatrix = _transitionMatrix.toMatrix(odd, odd);
107 std::vector<ValueType> explicitExitRateVector;
109 if (isContinuousTime()) {
110 explicitExitRateVector = _exitRates->toVector(odd);
111 if (_markovianStates) {
112 explicitMarkovianStates = _markovianStates->toVector(odd);
115 auto sparseHelper = createSparseHelper(explicitTransitionMatrix, explicitMarkovianStates, explicitExitRateVector, odd);
116 auto explicitResult = sparseHelper->computeLongRunAverageValues(env, rewardModel.
hasStateRewards() ? &explicitStateRewards :
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));
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;
129template<
typename ValueType, storm::dd::DdType DdType,
bool Nondeterministic>
130template<
bool N, std::enable_if_t<N,
int>>
134 std::unique_ptr<SparseInfiniteHorizonHelper<ValueType, Nondeterministic>> result;
135 if (isContinuousTime()) {
137 std::make_unique<storm::modelchecker::helper::SparseNondeterministicInfiniteHorizonHelper<ValueType>>(transitionMatrix, markovianStates, exitRates);
139 result = std::make_unique<storm::modelchecker::helper::SparseNondeterministicInfiniteHorizonHelper<ValueType>>(transitionMatrix);
143 STORM_LOG_WARN_COND(!this->isProduceSchedulerSet(),
"Scheduler extraction not supported in Hybrid engine.");
147template<
typename ValueType, storm::dd::DdType DdType,
bool Nondeterministic>
148template<
bool N, std::enable_if_t<!N,
int>>
152 std::unique_ptr<SparseInfiniteHorizonHelper<ValueType, Nondeterministic>> result;
153 if (isContinuousTime()) {
154 result = std::make_unique<storm::modelchecker::helper::SparseDeterministicInfiniteHorizonHelper<ValueType>>(transitionMatrix, exitRates);
156 result = std::make_unique<storm::modelchecker::helper::SparseDeterministicInfiniteHorizonHelper<ValueType>>(transitionMatrix);
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>;
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.