32namespace modelchecker {
35template<storm::dd::DdType DdType,
typename ValueType>
48 STORM_LOG_INFO(
"Preprocessing: " << statesWithProbability01.first.getNonZeroCount() <<
" states with probability 0, "
49 << statesWithProbability01.second.getNonZeroCount() <<
" with probability 1 (" << maybeStates.
getNonZeroCount()
50 <<
" states remaining).");
57 statesWithProbability01.second.template toAdd<ValueType>() +
58 maybeStates.template toAdd<ValueType>() * model.
getManager().template getConstant<ValueType>(storm::utility::convertNumber<ValueType>(0.5))));
61 if (!maybeStates.
isZero()) {
65 conversionWatch.
start();
67 conversionWatch.
stop();
86 req.clearUpperBounds();
87 STORM_LOG_THROW(!req.hasEnabledCriticalRequirement(), storm::exceptions::UncheckedRequirementException,
88 "Solver requirements " + req.getEnabledRequirementsAsString() +
" not checked.");
91 bool convertToEquationSystem =
97 if (convertToEquationSystem) {
102 std::vector<ValueType> x(maybeStates.
getNonZeroCount(), storm::utility::convertNumber<ValueType>(0.5));
105 conversionWatch.
start();
107 std::vector<ValueType> b = subvector.
toVector(odd);
108 conversionWatch.
stop();
111 std::unique_ptr<storm::solver::LinearEquationSolver<ValueType>> solver = linearEquationSolverFactory.
create(env, std::move(explicitSubmatrix));
112 solver->setBounds(storm::utility::zero<ValueType>(), storm::utility::one<ValueType>());
113 solver->solveEquations(env, x, b);
121 model.
getReachableStates(), statesWithProbability01.second.template toAdd<ValueType>()));
126template<storm::dd::DdType DdType,
typename ValueType>
130 std::unique_ptr<CheckResult> result =
132 result->asQuantitativeCheckResult<ValueType>().oneMinus();
136template<storm::dd::DdType DdType,
typename ValueType>
142 return std::unique_ptr<CheckResult>(
146template<storm::dd::DdType DdType,
typename ValueType>
159 if (!maybeStates.
isZero()) {
163 conversionWatch.
start();
165 conversionWatch.
stop();
183 std::vector<ValueType> x(maybeStates.
getNonZeroCount(), storm::utility::zero<ValueType>());
186 conversionWatch.
start();
188 std::vector<ValueType> b = subvector.
toVector(odd);
189 conversionWatch.
stop();
193 multiplier->repeatedMultiply(env, x, &b, stepBound);
199 return std::unique_ptr<CheckResult>(
204template<storm::dd::DdType DdType,
typename ValueType>
210 "Computing instantaneous rewards for a reward model that does not define any state-rewards. The result is trivially 0.");
222 conversionWatch.
stop();
227 multiplier->repeatedMultiply(env, x,
nullptr, stepBound);
234template<storm::dd::DdType DdType,
typename ValueType>
240 STORM_LOG_THROW(!rewardModel.
empty(), storm::exceptions::InvalidPropertyException,
"Missing reward model for formula. Skipping formula.");
246 std::vector<ValueType> x(model.
getNumberOfStates(), storm::utility::zero<ValueType>());
255 std::vector<ValueType> b = totalRewardVector.
toVector(odd);
256 conversionWatch.
stop();
261 multiplier->repeatedMultiply(env, x, &b, stepBound);
269template<
typename ValueType>
271 std::vector<ValueType>
const& oneStepTargetProbabilities) {
279 std::vector<storm::RationalFunction>
const& rewards,
280 std::vector<storm::RationalFunction>
const& oneStepTargetProbabilities) {
281 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Computing upper reward bounds is not supported for rational functions.");
284template<storm::dd::DdType DdType,
typename ValueType>
289 STORM_LOG_THROW(!rewardModel.
empty(), storm::exceptions::InvalidPropertyException,
"Missing reward model for formula. Skipping formula.");
297 <<
" target states (" << maybeStates.
getNonZeroCount() <<
" states remaining).");
305 infinityStates.
ite(model.
getManager().getConstant(storm::utility::infinity<ValueType>()), model.
getManager().template getAddZero<ValueType>()) +
306 maybeStates.template toAdd<ValueType>() * model.
getManager().template getAddOne<ValueType>()));
309 if (!maybeStates.
isZero()) {
313 conversionWatch.
start();
315 conversionWatch.
stop();
329 boost::optional<storm::dd::Add<DdType, ValueType>> oneStepTargetProbs;
333 if (req.upperBounds()) {
336 oneStepTargetProbs = submatrix * targetStatesAsColumn;
338 req.clearUpperBounds();
340 STORM_LOG_THROW(!req.hasEnabledCriticalRequirement(), storm::exceptions::UncheckedRequirementException,
341 "Solver requirements " + req.getEnabledRequirementsAsString() +
" not checked.");
344 bool convertToEquationSystem =
350 if (convertToEquationSystem) {
355 std::vector<ValueType> x(maybeStates.
getNonZeroCount(), storm::utility::convertNumber<ValueType>(0.5));
358 conversionWatch.
start();
360 std::vector<ValueType> b = subvector.
toVector(odd);
361 conversionWatch.
stop();
365 boost::optional<std::vector<ValueType>> upperBounds;
366 if (oneStepTargetProbs) {
368 STORM_LOG_ASSERT(!convertToEquationSystem,
"Upper reward bounds required, but the matrix is in the wrong format for the computation.");
373 std::unique_ptr<storm::solver::LinearEquationSolver<ValueType>> solver = linearEquationSolverFactory.
create(env, std::move(explicitSubmatrix));
374 solver->setLowerBound(storm::utility::zero<ValueType>());
376 solver->setUpperBounds(std::move(upperBounds.get()));
378 solver->solveEquations(env, x, b);
383 infinityStates.
ite(model.
getManager().getConstant(storm::utility::infinity<ValueType>()), model.
getManager().template getAddZero<ValueType>()),
384 maybeStates, odd, x));
388 model.
getManager().template getAddZero<ValueType>())));
393template<storm::dd::DdType DdType,
typename ValueType>
399 return computeReachabilityRewards(env, model, transitionMatrix, rewardModel, targetStates, qualitative);
Add< LibraryType, ValueType > swapVariables(std::vector< std::pair< storm::expressions::Variable, storm::expressions::Variable > > const &metaVariablePairs) const
Swaps the given pairs of meta variables in the ADD.
storm::storage::SparseMatrix< ValueType > toMatrix() const
Converts the ADD to a (sparse) matrix.
Add< LibraryType, ValueType > sumAbstract(std::set< storm::expressions::Variable > const &metaVariables) const
Sum-abstracts from the given meta variables.
Bdd< LibraryType > notZero() const
Computes a BDD that represents the function in which all assignments with a function value unequal to...
std::vector< ValueType > toVector() const
Converts the ADD to a vector.
bool isZero() const
Retrieves whether this DD represents the constant zero function.
virtual uint_fast64_t getNonZeroCount() const override
Retrieves the number of encodings that are mapped to a non-zero value.
Bdd< LibraryType > swapVariables(std::vector< std::pair< storm::expressions::Variable, storm::expressions::Variable > > const &metaVariablePairs) const
Swaps the given pairs of meta variables in the BDD.
Odd createOdd() const
Creates an ODD based on the current BDD.
Bdd< LibraryType > ite(Bdd< LibraryType > const &thenBdd, Bdd< LibraryType > const &elseBdd) const
Performs an if-then-else with the given operands, i.e.
std::vector< ValueType > computeUpperBounds()
Computes upper bounds on the expected rewards.
static std::unique_ptr< CheckResult > computeReachabilityTimes(Environment const &env, storm::models::symbolic::Model< DdType, ValueType > const &model, storm::dd::Add< DdType, ValueType > const &transitionMatrix, storm::dd::Bdd< DdType > const &targetStates, bool qualitative)
static std::unique_ptr< CheckResult > computeInstantaneousRewards(Environment const &env, storm::models::symbolic::Model< DdType, ValueType > const &model, storm::dd::Add< DdType, ValueType > const &transitionMatrix, RewardModelType const &rewardModel, uint_fast64_t stepBound)
static std::unique_ptr< CheckResult > computeReachabilityRewards(Environment const &env, storm::models::symbolic::Model< DdType, ValueType > const &model, storm::dd::Add< DdType, ValueType > const &transitionMatrix, RewardModelType const &rewardModel, storm::dd::Bdd< DdType > const &targetStates, bool qualitative)
static std::unique_ptr< CheckResult > computeNextProbabilities(Environment const &env, storm::models::symbolic::Model< DdType, ValueType > const &model, storm::dd::Add< DdType, ValueType > const &transitionMatrix, storm::dd::Bdd< DdType > const &nextStates)
static std::unique_ptr< CheckResult > computeGloballyProbabilities(Environment const &env, storm::models::symbolic::Model< DdType, ValueType > const &model, storm::dd::Add< DdType, ValueType > const &transitionMatrix, storm::dd::Bdd< DdType > const &psiStates, bool qualitative)
static std::unique_ptr< CheckResult > computeBoundedUntilProbabilities(Environment const &env, storm::models::symbolic::Model< DdType, ValueType > const &model, storm::dd::Add< DdType, ValueType > const &transitionMatrix, storm::dd::Bdd< DdType > const &phiStates, storm::dd::Bdd< DdType > const &psiStates, uint_fast64_t stepBound)
static std::unique_ptr< CheckResult > computeCumulativeRewards(Environment const &env, storm::models::symbolic::Model< DdType, ValueType > const &model, storm::dd::Add< DdType, ValueType > const &transitionMatrix, RewardModelType const &rewardModel, uint_fast64_t stepBound)
static std::unique_ptr< CheckResult > computeUntilProbabilities(Environment const &env, storm::models::symbolic::Model< DdType, ValueType > const &model, storm::dd::Add< DdType, ValueType > const &transitionMatrix, storm::dd::Bdd< DdType > const &phiStates, storm::dd::Bdd< DdType > const &psiStates, bool qualitative)
Base class for all symbolic models.
storm::dd::DdManager< Type > & getManager() const
Retrieves the manager responsible for the DDs that represent this model.
std::set< storm::expressions::Variable > const & getColumnVariables() const
Retrieves the meta variables used to encode the columns of the transition matrix and the vector indic...
storm::dd::Add< Type, ValueType > getRowColumnIdentity() const
Retrieves an ADD that represents the diagonal of the transition matrix.
std::vector< std::pair< storm::expressions::Variable, storm::expressions::Variable > > const & getRowColumnMetaVariablePairs() const
Retrieves the pairs of row and column meta variables.
storm::dd::Bdd< Type > const & getReachableStates() const
Retrieves the reachable states of the model.
virtual uint_fast64_t getNumberOfStates() const override
Returns the number of states of the model.
bool hasStateRewards() const
Retrieves whether the reward model has state rewards.
storm::dd::Add< Type, ValueType > getTotalRewardVector(storm::dd::Add< Type, ValueType > const &transitionMatrix, std::set< storm::expressions::Variable > const &columnVariables) const
Creates a vector representing the complete reward vector based on the state-, state-action- and trans...
bool empty() const
Retrieves whether the reward model is empty.
storm::dd::Add< Type, ValueType > const & getStateRewardVector() const
Retrieves the state rewards of the reward model.
virtual std::unique_ptr< LinearEquationSolver< ValueType > > create(Environment const &env) const override
Creates an equation solver with the current settings, but without a matrix.
LinearEquationSolverRequirements getRequirements(Environment const &env) const
Retrieves the requirements of the solver if it was created with the current settings.
virtual LinearEquationSolverProblemFormat getEquationProblemFormat(Environment const &env) const
Retrieves the problem format that the solver expects if it was created with the current settings.
std::unique_ptr< Multiplier< ValueType > > create(Environment const &env, storm::storage::SparseMatrix< ValueType > const &matrix)
A class that holds a possibly non-square matrix in the compressed row storage format.
A class that provides convenience operations to display run times.
MilisecondType getTimeInMilliseconds() const
Gets the measured time in milliseconds.
void start()
Start stopwatch (again) and start measuring time.
void stop()
Stop stopwatch and add measured time to total time.
#define STORM_LOG_INFO(message)
#define STORM_LOG_TRACE(message)
#define STORM_LOG_ASSERT(cond, message)
#define STORM_LOG_THROW(cond, exception, message)
std::vector< ValueType > computeUpperRewardBounds(storm::storage::SparseMatrix< ValueType > const &transitionMatrix, std::vector< ValueType > const &rewards, std::vector< ValueType > const &oneStepTargetProbabilities)
std::pair< storm::storage::BitVector, storm::storage::BitVector > performProb01(storm::models::sparse::DeterministicModel< T > const &model, storm::storage::BitVector const &phiStates, storm::storage::BitVector const &psiStates)
Computes the sets of states that have probability 0 or 1, respectively, of satisfying phi until psi i...
storm::storage::BitVector performProbGreater0(storm::storage::SparseMatrix< T > const &backwardTransitions, storm::storage::BitVector const &phiStates, storm::storage::BitVector const &psiStates, bool useStepBound, uint_fast64_t maximalSteps)
Performs a backward depth-first search trough the underlying graph structure of the given model to de...
storm::storage::BitVector performProb1(storm::storage::SparseMatrix< T > const &backwardTransitions, storm::storage::BitVector const &, storm::storage::BitVector const &psiStates, storm::storage::BitVector const &statesWithProbabilityGreater0)
Computes the set of states of the given model for which all paths lead to the given set of target sta...