31template<
typename SparseMdpModelType>
37template<
typename SparseMdpModelType>
39 bool* requiresSingleInitialState) {
49 storm::logic::prctlstar().setBoundedUntilFormulasAllowed(
true).setTimeOperatorsAllowed(
true).setReachbilityTimeFormulasAllowed(
true))) {
54 .setLongRunAverageRewardFormulasAllowed(
true)
55 .setLongRunAverageProbabilitiesAllowed(
true)
56 .setConditionalProbabilityFormulasAllowed(
true)
57 .setOnlyEventuallyFormuluasInConditionalFormulasAllowed(
true)
58 .setTotalRewardFormulasAllowed(
true)
59 .setRewardBoundedUntilFormulasAllowed(
true)
60 .setRewardBoundedCumulativeRewardFormulasAllowed(
true)
61 .setMultiDimensionalBoundedUntilFormulasAllowed(
true)
62 .setMultiDimensionalCumulativeRewardFormulasAllowed(
true)
63 .setTimeOperatorsAllowed(
true)
64 .setReachbilityTimeFormulasAllowed(
true)
65 .setRewardAccumulationAllowed(
true)
66 .setDiscountedTotalRewardFormulasAllowed(
true)
67 .setDiscountedCumulativeRewardFormulasAllowed(
true))) {
96 if (requiresSingleInitialState) {
97 *requiresSingleInitialState =
true;
106template<
typename SparseMdpModelType>
108 bool requiresSingleInitialState =
false;
110 return !requiresSingleInitialState || this->
getModel().getInitialStates().getNumberOfSetBits() == 1;
116template<
typename SparseMdpModelType>
121 "Formula needs to specify whether minimal or maximal values are to be computed on nondeterministic model.");
124 STORM_LOG_THROW(
false, storm::exceptions::NotImplementedException,
"We have not yet implemented multi dimensional bounded until with intervals.");
128 "Checking non-trivial bounded until probabilities can only be computed for the initial states of the model.");
134 auto formula = std::make_shared<storm::logic::ProbabilityOperatorFormula>(checkTask.
getFormula().asSharedPointer(), opInfo);
139 return std::unique_ptr<CheckResult>(
143 STORM_LOG_THROW(pathFormula.
hasUpperBound(), storm::exceptions::InvalidPropertyException,
"Formula needs to have (a single) upper step bound.");
151 std::vector<SolutionType> numericResult =
helper.computeStepBoundedUntilProbabilities(
155 auto result = std::make_unique<ExplicitQuantitativeCheckResult<SolutionType>>(std::move(numericResult));
156 result->setValuesExact();
161template<
typename SparseMdpModelType>
166 "Formula needs to specify whether minimal or maximal values are to be computed on nondeterministic model.");
167 std::unique_ptr<CheckResult> subResultPointer = this->
check(env, pathFormula.
getSubformula());
172 auto result = std::make_unique<ExplicitQuantitativeCheckResult<SolutionType>>(std::move(numericResult));
173 result->setValuesExact();
177template<
typename SparseMdpModelType>
182 "Formula needs to specify whether minimal or maximal values are to be computed on nondeterministic model.");
184 STORM_LOG_THROW(this->
getModel().getTransitionMatrix().isProbabilisticGraphPreserving(), storm::exceptions::InvalidSettingsException,
185 "Computing until probabilities on uncertain model requires graph-preservation.");
196 result->asExplicitQuantitativeCheckResult<
SolutionType>().setBounds(std::move(ret.solutionBounds));
198 result->asExplicitQuantitativeCheckResult<
SolutionType>().setScheduler(std::move(ret.scheduler));
203template<
typename SparseMdpModelType>
208 "Formula needs to specify whether minimal or maximal values are to be computed on nondeterministic model.");
209 std::unique_ptr<CheckResult> subResultPointer = this->
check(env, pathFormula.
getSubformula());
215 result->asExplicitQuantitativeCheckResult<
SolutionType>().setBounds(std::move(ret.solutionBounds));
217 result->asExplicitQuantitativeCheckResult<
SolutionType>().setScheduler(std::move(ret.scheduler));
222template<
typename SparseMdpModelType>
226 STORM_LOG_THROW(
false, storm::exceptions::NotImplementedException,
"We have not yet implemented automata-props with intervals.");
234 return this->
check(env, formula)->template asExplicitQualitativeCheckResult<SolutionType>().getTruthValuesVector();
237 std::vector<SolutionType> numericResult =
helper.computeDAProductProbabilities(env, *pathFormula.
readAutomaton(), apSets);
241 result->asExplicitQuantitativeCheckResult<
SolutionType>().setScheduler(
249template<
typename SparseMdpModelType>
253 STORM_LOG_THROW(
false, storm::exceptions::NotImplementedException,
"We have not yet implemented LTL with intervals.");
258 "Formula needs to specify whether minimal or maximal values are to be computed on nondeterministic model.");
264 return this->
check(env, formula)->template asExplicitQualitativeCheckResult<SolutionType>().getTruthValuesVector();
266 std::vector<SolutionType> numericResult =
helper.computeLTLProbabilities(env, pathFormula, formulaChecker);
270 result->asExplicitQuantitativeCheckResult<
SolutionType>().setScheduler(
278template<
typename SparseMdpModelType>
283 "Formula needs to specify whether minimal or maximal values are to be computed on nondeterministic model.");
284 STORM_LOG_THROW(this->
getModel().getInitialStates().hasUniqueSetBit(), storm::exceptions::InvalidPropertyException,
285 "Cannot compute conditional probabilities on MDPs with more than one initial state.");
287 "Conditional probabilities can only be computed for the initial states of the model.");
289 "Illegal conditional probability formula.");
291 "Illegal conditional probability formula.");
298 STORM_LOG_THROW(
false, exceptions::NotSupportedException,
"Conditional Probabilities are not supported with interval models.");
307template<
typename SparseMdpModelType>
312 "Formula needs to specify whether minimal or maximal values are to be computed on nondeterministic model.");
316 "We have not yet implemented multi-dimensional or reward-bounded cumulative rewards with intervals.");
319 "Checking reward bounded cumulative reward formulas can only be done for the initial states of the model.");
321 "Checking reward bounded cumulative reward formulas is not supported if reward accumulations are given.");
327 auto formula = std::make_shared<storm::logic::RewardOperatorFormula>(checkTask.
getFormula().asSharedPointer(), checkTask.
getRewardModel(), opInfo);
332 return std::unique_ptr<CheckResult>(
338 "Uncertainty resolution mode must be set for uncertain (interval) models.");
340 STORM_LOG_THROW(rewardPathFormula.
hasIntegerBound(), storm::exceptions::InvalidPropertyException,
"Formula needs to have a discrete time bound.");
345 auto result = std::make_unique<ExplicitQuantitativeCheckResult<SolutionType>>(std::move(numericResult));
346 result->setValuesExact();
354 STORM_LOG_THROW(
false, storm::exceptions::NotImplementedException,
"Discounted properties are not implemented for interval models.");
360 STORM_LOG_THROW(
false, storm::exceptions::NotImplementedException,
"Discounted properties are not implemented for interval models.");
363template<
typename SparseMdpModelType>
368 "Formula needs to specify whether minimal or maximal values are to be computed on nondeterministic model.");
369 STORM_LOG_THROW(rewardPathFormula.
hasIntegerBound(), storm::exceptions::InvalidPropertyException,
"Formula needs to have a discrete time bound.");
374 auto result = std::make_unique<ExplicitQuantitativeCheckResult<SolutionType>>(std::move(numericResult));
375 result->setValuesExact();
379template<
typename SparseMdpModelType>
384 "Formula needs to specify whether minimal or maximal values are to be computed on nondeterministic model.");
385 STORM_LOG_THROW(rewardPathFormula.
hasIntegerBound(), storm::exceptions::InvalidPropertyException,
"Formula needs to have a discrete time bound.");
389 rewardPathFormula.
getBound<uint64_t>());
390 auto result = std::make_unique<ExplicitQuantitativeCheckResult<SolutionType>>(std::move(numericResult));
391 result->setValuesExact();
395template<
typename SparseMdpModelType>
400 "Formula needs to specify whether minimal or maximal values are to be computed on nondeterministic model.");
402 STORM_LOG_THROW(this->
getModel().getTransitionMatrix().isProbabilisticGraphPreserving(), storm::exceptions::InvalidSettingsException,
403 "Computing rewards on uncertain model requires graph-preservation.");
405 std::unique_ptr<CheckResult> subResultPointer = this->
check(env, eventuallyFormula.
getSubformula());
413 result->asExplicitQuantitativeCheckResult<
SolutionType>().setBounds(std::move(ret.solutionBounds));
415 result->asExplicitQuantitativeCheckResult<
SolutionType>().setScheduler(std::move(ret.scheduler));
420template<
typename SparseMdpModelType>
425 "Formula needs to specify whether minimal or maximal values are to be computed on nondeterministic model.");
427 STORM_LOG_THROW(this->
getModel().getTransitionMatrix().isProbabilisticGraphPreserving(), storm::exceptions::InvalidSettingsException,
428 "Computing reachability times on uncertain model requires graph-preservation.");
430 std::unique_ptr<CheckResult> subResultPointer = this->
check(env, eventuallyFormula.
getSubformula());
437 result->asExplicitQuantitativeCheckResult<
SolutionType>().setBounds(std::move(ret.solutionBounds));
439 result->asExplicitQuantitativeCheckResult<
SolutionType>().setScheduler(std::move(ret.scheduler));
444template<
typename SparseMdpModelType>
448 "Formula needs to specify whether minimal or maximal values are to be computed on nondeterministic model.");
450 STORM_LOG_THROW(this->
getModel().getTransitionMatrix().isProbabilisticGraphPreserving(), storm::exceptions::InvalidSettingsException,
451 "Computing total rewards on uncertain model requires graph-preservation.");
458 result->asExplicitQuantitativeCheckResult<
SolutionType>().setBounds(std::move(ret.solutionBounds));
460 result->asExplicitQuantitativeCheckResult<
SolutionType>().setScheduler(std::move(ret.scheduler));
468 STORM_LOG_THROW(
false, storm::exceptions::NotImplementedException,
"Discounted properties are not implemented for interval models.");
474 STORM_LOG_THROW(
false, storm::exceptions::NotImplementedException,
"Discounted properties are not implemented for interval models.");
477template<
typename SparseMdpModelType>
481 "Formula needs to specify whether minimal or maximal values are to be computed on nondeterministic model.");
490 result->asExplicitQuantitativeCheckResult<
SolutionType>().setBounds(std::move(ret.solutionBounds));
492 result->asExplicitQuantitativeCheckResult<
SolutionType>().setScheduler(std::move(ret.scheduler));
497template<
typename SparseMdpModelType>
501 STORM_LOG_THROW(
false, storm::exceptions::NotImplementedException,
"We have not yet implemented LRA probabilities with intervals.");
505 "Formula needs to specify whether minimal or maximal values are to be computed on nondeterministic model.");
506 std::unique_ptr<CheckResult> subResultPointer = this->
check(env, stateFormula);
515 result->asExplicitQuantitativeCheckResult<
SolutionType>().setScheduler(
522template<
typename SparseMdpModelType>
526 STORM_LOG_THROW(
false, storm::exceptions::NotImplementedException,
"We have not yet implemented lra with intervals.");
529 "Formula needs to specify whether minimal or maximal values are to be computed on nondeterministic model.");
533 auto values =
helper.computeLongRunAverageRewards(env, rewardModel.get());
536 result->asExplicitQuantitativeCheckResult<
SolutionType>().setScheduler(
543template<
typename SparseMdpModelType>
547 STORM_LOG_THROW(
false, storm::exceptions::NotImplementedException,
"We have not yet implemented multi-objective with intervals.");
553template<
class SparseMdpModelType>
557 STORM_LOG_THROW(
false, storm::exceptions::NotImplementedException,
"We have not yet implemented lexicographic model checking with intervals.");
560 return this->
check(env, formula)->template asExplicitQualitativeCheckResult<SolutionType>().getTruthValuesVector();
568template<
typename SparseMdpModelType>
572 STORM_LOG_THROW(
false, storm::exceptions::NotImplementedException,
"We have not yet implemented quantile formulas with intervals.");
575 "Computing quantiles is only supported for the initial states of a model.");
576 STORM_LOG_THROW(this->
getModel().getInitialStates().getNumberOfSetBits() == 1, storm::exceptions::InvalidOperationException,
577 "Quantiles not supported on models with multiple initial states.");
578 uint64_t initialState = *this->
getModel().getInitialStates().begin();
583 if (res.size() == 1 && res.front().size() == 1) {
FragmentSpecification & setStepBoundedUntilFormulasAllowed(bool newValue)
FragmentSpecification & setRewardBoundedCumulativeRewardFormulasAllowed(bool newValue)
FragmentSpecification & setRewardAccumulationAllowed(bool newValue)
FragmentSpecification & setMultiDimensionalBoundedUntilFormulasAllowed(bool newValue)
FragmentSpecification & setTimeBoundedUntilFormulasAllowed(bool newValue)
FragmentSpecification & setCumulativeRewardFormulasAllowed(bool newValue)
FragmentSpecification & setMultiDimensionalCumulativeRewardFormulasAllowed(bool newValue)
FragmentSpecification & setRewardBoundedUntilFormulasAllowed(bool newValue)
FragmentSpecification & setTimeBoundedCumulativeRewardFormulasAllowed(bool newValue)
FragmentSpecification & setHOAPathFormulasAllowed(bool newValue)
FragmentSpecification & setTimeAllowed(bool newValue)
FragmentSpecification & setStepBoundedCumulativeRewardFormulasAllowed(bool newValue)
bool isRewardBound() const
virtual std::unique_ptr< CheckResult > check(Environment const &env, CheckTask< storm::logic::Formula, SolutionType > const &checkTask)
bool isBoundSet() const
Retrieves whether there is a bound with which the values for the states will be compared.
bool isOptimizationDirectionSet() const
Retrieves whether an optimization direction was set.
bool isRewardModelSet() const
Retrieves whether a reward model was set.
bool isQualitativeSet() const
Retrieves whether the computation only needs to be performed qualitatively, because the values will o...
std::string const & getRewardModel() const
Retrieves the reward model over which to perform the checking (if set).
FormulaType const & getFormula() const
Retrieves the formula from this task.
ModelCheckerHint const & getHint() const
Retrieves a hint that might contain information that speeds up the modelchecking process (if supporte...
bool isUncertaintyResolutionModeSet() const
Returns whether the mode, which decides how the uncertainty will be resolved, is set.
bool isProduceSchedulersSet() const
Retrieves whether scheduler(s) are to be produced (if supported).
storm::logic::Bound const & getBound() const
Retrieves the bound (if set).
storm::OptimizationDirection const & getOptimizationDirection() const
Retrieves the optimization direction (if set).
bool isOnlyInitialStatesRelevantSet() const
Retrieves whether only the initial states are relevant in the computation.
UncertaintyResolutionMode getUncertaintyResolutionMode() const
Retrieves the mode which decides how the uncertainty will be resolved.
A qualitative check result over the states of a sparse model.
vector_type const & getTruthValuesVector() const
Retrieves the truth values, one per state this result is for.
A quantitative check result over the states of a sparse model.
virtual std::unique_ptr< CheckResult > computeLongRunAverageProbabilities(Environment const &env, CheckTask< storm::logic::StateFormula, SolutionType > const &checkTask) override
SparseMdpModelType::ValueType ValueType
virtual std::unique_ptr< CheckResult > computeCumulativeRewards(Environment const &env, CheckTask< storm::logic::CumulativeRewardFormula, SolutionType > const &checkTask) override
virtual std::unique_ptr< CheckResult > computeLongRunAverageRewards(Environment const &env, CheckTask< storm::logic::LongRunAverageRewardFormula, SolutionType > const &checkTask) override
static bool canHandleStatic(CheckTask< storm::logic::Formula, SolutionType > const &checkTask, bool *requiresSingleInitialState=nullptr)
Returns false, if this task can certainly not be handled by this model checker (independent of the co...
virtual std::unique_ptr< CheckResult > checkMultiObjectiveFormula(Environment const &env, CheckTask< storm::logic::MultiObjectiveFormula, SolutionType > const &checkTask) override
virtual std::unique_ptr< CheckResult > computeReachabilityTimes(Environment const &env, CheckTask< storm::logic::EventuallyFormula, SolutionType > const &checkTask) override
virtual std::unique_ptr< CheckResult > computeDiscountedCumulativeRewards(Environment const &env, CheckTask< storm::logic::DiscountedCumulativeRewardFormula, SolutionType > const &checkTask) override
virtual std::unique_ptr< CheckResult > computeLTLProbabilities(Environment const &env, CheckTask< storm::logic::PathFormula, SolutionType > const &checkTask) override
virtual std::unique_ptr< CheckResult > computeGloballyProbabilities(Environment const &env, CheckTask< storm::logic::GloballyFormula, SolutionType > const &checkTask) override
virtual std::unique_ptr< CheckResult > computeUntilProbabilities(Environment const &env, CheckTask< storm::logic::UntilFormula, SolutionType > const &checkTask) override
virtual std::unique_ptr< CheckResult > checkQuantileFormula(Environment const &env, CheckTask< storm::logic::QuantileFormula, SolutionType > const &checkTask) override
virtual std::unique_ptr< CheckResult > checkLexObjectiveFormula(Environment const &env, CheckTask< storm::logic::MultiObjectiveFormula, SolutionType > const &checkTask) override
virtual bool canHandle(CheckTask< storm::logic::Formula, SolutionType > const &checkTask) const override
virtual std::unique_ptr< CheckResult > computeReachabilityRewards(Environment const &env, CheckTask< storm::logic::EventuallyFormula, SolutionType > const &checkTask) override
virtual std::unique_ptr< CheckResult > computeHOAPathProbabilities(Environment const &env, CheckTask< storm::logic::HOAPathFormula, SolutionType > const &checkTask) override
storm::IntervalBaseType< ValueType > SolutionType
virtual std::unique_ptr< CheckResult > computeInstantaneousRewards(Environment const &env, CheckTask< storm::logic::InstantaneousRewardFormula, SolutionType > const &checkTask) override
virtual std::unique_ptr< CheckResult > computeConditionalProbabilities(Environment const &env, CheckTask< storm::logic::ConditionalFormula, SolutionType > const &checkTask) override
virtual std::unique_ptr< CheckResult > computeNextProbabilities(Environment const &env, CheckTask< storm::logic::NextFormula, SolutionType > const &checkTask) override
virtual std::unique_ptr< CheckResult > computeDiscountedTotalRewards(Environment const &env, CheckTask< storm::logic::DiscountedTotalRewardFormula, SolutionType > const &checkTask) override
virtual std::unique_ptr< CheckResult > computeTotalRewards(Environment const &env, CheckTask< storm::logic::TotalRewardFormula, SolutionType > const &checkTask) override
SparseMdpPrctlModelChecker(SparseMdpModelType const &model)
virtual std::unique_ptr< CheckResult > computeBoundedUntilProbabilities(Environment const &env, CheckTask< storm::logic::BoundedUntilFormula, SolutionType > const &checkTask) override
SparsePropositionalModelChecker(SparseMdpModelType const &model)
SparseMdpModelType const & getModel() const
Helper class for LTL model checking.
static ExtendedReturnType computeDiscountedTotalRewards(Environment const &env, storm::solver::SolveGoal< ValueType, SolutionType > &&goal, storm::storage::SparseMatrix< ValueType > const &transitionMatrix, storm::storage::SparseMatrix< ValueType > const &backwardTransitions, RewardModelType const &rewardModel, bool qualitative, bool produceScheduler, ValueType discountFactor, ModelCheckerHint const &hint=ModelCheckerHint())
static ExtendedReturnType computeReachabilityRewards(Environment const &env, storm::solver::SolveGoal< ValueType, SolutionType > &&goal, storm::storage::SparseMatrix< ValueType > const &transitionMatrix, storm::storage::SparseMatrix< ValueType > const &backwardTransitions, RewardModelType const &rewardModel, storm::storage::BitVector const &targetStates, bool qualitative, bool produceScheduler, ModelCheckerHint const &hint=ModelCheckerHint())
static MDPSparseModelCheckingHelperReturnType< SolutionType > computeGloballyProbabilities(Environment const &env, storm::solver::SolveGoal< ValueType, SolutionType > &&goal, storm::storage::SparseMatrix< ValueType > const &transitionMatrix, storm::storage::SparseMatrix< ValueType > const &backwardTransitions, storm::storage::BitVector const &psiStates, bool qualitative, bool produceScheduler, bool useMecBasedTechnique=false)
static ExtendedReturnType computeTotalRewards(Environment const &env, storm::solver::SolveGoal< ValueType, SolutionType > &&goal, storm::storage::SparseMatrix< ValueType > const &transitionMatrix, storm::storage::SparseMatrix< ValueType > const &backwardTransitions, RewardModelType const &rewardModel, bool qualitative, bool produceScheduler, ModelCheckerHint const &hint=ModelCheckerHint())
static std::vector< SolutionType > computeNextProbabilities(Environment const &env, OptimizationDirection dir, UncertaintyResolutionMode uncertaintyResolutionMode, storm::storage::SparseMatrix< ValueType > const &transitionMatrix, storm::storage::BitVector const &nextStates)
static ExtendedReturnType computeReachabilityTimes(Environment const &env, storm::solver::SolveGoal< ValueType, SolutionType > &&goal, storm::storage::SparseMatrix< ValueType > const &transitionMatrix, storm::storage::SparseMatrix< ValueType > const &backwardTransitions, storm::storage::BitVector const &targetStates, bool qualitative, bool produceScheduler, ModelCheckerHint const &hint=ModelCheckerHint())
static std::vector< SolutionType > computeInstantaneousRewards(Environment const &env, storm::solver::SolveGoal< ValueType, SolutionType > &&goal, storm::storage::SparseMatrix< ValueType > const &transitionMatrix, RewardModelType const &rewardModel, uint_fast64_t stepCount)
static MDPSparseModelCheckingHelperReturnType< SolutionType > computeUntilProbabilities(Environment const &env, storm::solver::SolveGoal< ValueType, SolutionType > &&goal, storm::storage::SparseMatrix< ValueType > const &transitionMatrix, storm::storage::SparseMatrix< ValueType > const &backwardTransitions, storm::storage::BitVector const &phiStates, storm::storage::BitVector const &psiStates, bool qualitative, bool produceScheduler, ModelCheckerHint const &hint=ModelCheckerHint())
static std::vector< SolutionType > computeRewardBoundedValues(Environment const &env, OptimizationDirection dir, rewardbounded::MultiDimensionalRewardUnfolding< ValueType, true > &rewardUnfolding, storm::storage::BitVector const &initialStates)
static std::vector< SolutionType > computeCumulativeRewards(Environment const &env, storm::solver::SolveGoal< ValueType, SolutionType > &&goal, storm::storage::SparseMatrix< ValueType > const &transitionMatrix, RewardModelType const &rewardModel, uint_fast64_t stepBound)
static std::vector< SolutionType > computeDiscountedCumulativeRewards(Environment const &env, storm::solver::SolveGoal< ValueType, SolutionType > &&goal, storm::storage::SparseMatrix< ValueType > const &transitionMatrix, RewardModelType const &rewardModel, uint_fast64_t stepBound, ValueType discountFactor)
Helper class for model checking queries that depend on the long run behavior of the (nondeterministic...
std::vector< std::vector< storm::utility::ExtendedValueType< ValueType > > > computeQuantile(Environment const &env)
This class defines which action is chosen in a particular state of a non-deterministic model.
#define STORM_LOG_THROW_UNCONDITIONALLY(exception, message)
#define STORM_LOG_WARN_COND(cond, message)
#define STORM_LOG_THROW(cond, exception, message)
FragmentSpecification prctlstar()
FragmentSpecification propositional()
FragmentSpecification lexObjective()
FragmentSpecification multiObjective()
FragmentSpecification reachability()
FragmentSpecification quantiles()
void setInformationFromCheckTaskNondeterministic(HelperType &helper, storm::modelchecker::CheckTask< FormulaType, typename ModelType::ValueType > const &checkTask, ModelType const &model)
Forwards relevant information stored in the given CheckTask to the given helper.
helper::MDPSparseModelCheckingHelperReturnType< ValueType > check(Environment const &env, SparseModelType const &model, CheckTask< storm::logic::MultiObjectiveFormula, ValueType > const &checkTask, CheckFormulaCallback const &formulaChecker)
check a lexicographic LTL-formula
std::unique_ptr< CheckResult > performMultiObjectiveModelChecking(Environment const &env, SparseModelType const &model, storm::logic::MultiObjectiveFormula const &formula, bool produceScheduler)
std::unique_ptr< CheckResult > computeConditionalProbabilities(Environment const &env, storm::solver::SolveGoal< ValueType, SolutionType > &&goal, bool produceSchedulers, storm::storage::SparseMatrix< ValueType > const &transitionMatrix, storm::storage::SparseMatrix< ValueType > const &backwardTransitions, storm::storage::BitVector const &targetStates, storm::storage::BitVector const &conditionStates)
FilteredRewardModel< RewardModelType > createFilteredRewardModel(RewardModelType const &baseRewardModel, storm::logic::RewardAccumulation const &acc, bool isDiscreteTimeModel)
constexpr bool IsIntervalType
Helper to check if a type is an interval.