24namespace modelchecker {
27template<storm::dd::DdType DdType,
typename ValueType>
40 STORM_LOG_INFO(
"Preprocessing: " << statesWithProbability01.first.getNonZeroCount() <<
" states with probability 0, "
41 << statesWithProbability01.second.getNonZeroCount() <<
" with probability 1 (" << maybeStates.
getNonZeroCount()
42 <<
" states remaining).");
49 statesWithProbability01.second.template toAdd<ValueType>() +
50 maybeStates.template toAdd<ValueType>() * model.
getManager().template getConstant<ValueType>(storm::utility::convertNumber<ValueType>(0.5))));
53 if (!maybeStates.
isZero()) {
57 conversionWatch.
start();
59 conversionWatch.
stop();
78 req.clearUpperBounds();
79 STORM_LOG_THROW(!req.hasEnabledCriticalRequirement(), storm::exceptions::UncheckedRequirementException,
80 "Solver requirements " + req.getEnabledRequirementsAsString() +
" not checked.");
83 bool convertToEquationSystem =
89 if (convertToEquationSystem) {
94 std::vector<ValueType> x(maybeStates.
getNonZeroCount(), storm::utility::convertNumber<ValueType>(0.5));
97 conversionWatch.
start();
99 std::vector<ValueType> b = subvector.
toVector(odd);
100 conversionWatch.
stop();
103 std::unique_ptr<storm::solver::LinearEquationSolver<ValueType>> solver = linearEquationSolverFactory.
create(env, std::move(explicitSubmatrix));
104 solver->setBounds(storm::utility::zero<ValueType>(), storm::utility::one<ValueType>());
105 solver->solveEquations(env, x, b);
113 model.
getReachableStates(), statesWithProbability01.second.template toAdd<ValueType>()));
118template<storm::dd::DdType DdType,
typename ValueType>
122 std::unique_ptr<CheckResult> result =
124 result->asQuantitativeCheckResult<ValueType>().oneMinus();
128template<storm::dd::DdType DdType,
typename ValueType>
134 return std::unique_ptr<CheckResult>(
138template<storm::dd::DdType DdType,
typename ValueType>
151 if (!maybeStates.
isZero()) {
155 conversionWatch.
start();
157 conversionWatch.
stop();
175 std::vector<ValueType> x(maybeStates.
getNonZeroCount(), storm::utility::zero<ValueType>());
178 conversionWatch.
start();
180 std::vector<ValueType> b = subvector.
toVector(odd);
181 conversionWatch.
stop();
185 multiplier->repeatedMultiply(env, x, &b, stepBound);
191 return std::unique_ptr<CheckResult>(
196template<storm::dd::DdType DdType,
typename ValueType>
202 "Computing instantaneous rewards for a reward model that does not define any state-rewards. The result is trivially 0.");
214 conversionWatch.
stop();
219 multiplier->repeatedMultiply(env, x,
nullptr, stepBound);
226template<storm::dd::DdType DdType,
typename ValueType>
232 STORM_LOG_THROW(!rewardModel.
empty(), storm::exceptions::InvalidPropertyException,
"Missing reward model for formula. Skipping formula.");
238 std::vector<ValueType> x(model.
getNumberOfStates(), storm::utility::zero<ValueType>());
247 std::vector<ValueType> b = totalRewardVector.
toVector(odd);
248 conversionWatch.
stop();
253 multiplier->repeatedMultiply(env, x, &b, stepBound);
261template<
typename ValueType>
263 std::vector<ValueType>
const& oneStepTargetProbabilities) {
271 std::vector<storm::RationalFunction>
const& rewards,
272 std::vector<storm::RationalFunction>
const& oneStepTargetProbabilities) {
273 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Computing upper reward bounds is not supported for rational functions.");
276template<storm::dd::DdType DdType,
typename ValueType>
281 STORM_LOG_THROW(!rewardModel.
empty(), storm::exceptions::InvalidPropertyException,
"Missing reward model for formula. Skipping formula.");
289 <<
" target states (" << maybeStates.
getNonZeroCount() <<
" states remaining).");
297 infinityStates.
ite(model.
getManager().getConstant(storm::utility::infinity<ValueType>()), model.
getManager().template getAddZero<ValueType>()) +
298 maybeStates.template toAdd<ValueType>() * model.
getManager().template getAddOne<ValueType>()));
301 if (!maybeStates.
isZero()) {
305 conversionWatch.
start();
307 conversionWatch.
stop();
321 boost::optional<storm::dd::Add<DdType, ValueType>> oneStepTargetProbs;
325 if (req.upperBounds()) {
328 oneStepTargetProbs = submatrix * targetStatesAsColumn;
330 req.clearUpperBounds();
332 STORM_LOG_THROW(!req.hasEnabledCriticalRequirement(), storm::exceptions::UncheckedRequirementException,
333 "Solver requirements " + req.getEnabledRequirementsAsString() +
" not checked.");
336 bool convertToEquationSystem =
342 if (convertToEquationSystem) {
347 std::vector<ValueType> x(maybeStates.
getNonZeroCount(), storm::utility::convertNumber<ValueType>(0.5));
350 conversionWatch.
start();
352 std::vector<ValueType> b = subvector.
toVector(odd);
353 conversionWatch.
stop();
357 boost::optional<std::vector<ValueType>> upperBounds;
358 if (oneStepTargetProbs) {
360 STORM_LOG_ASSERT(!convertToEquationSystem,
"Upper reward bounds required, but the matrix is in the wrong format for the computation.");
365 std::unique_ptr<storm::solver::LinearEquationSolver<ValueType>> solver = linearEquationSolverFactory.
create(env, std::move(explicitSubmatrix));
366 solver->setLowerBound(storm::utility::zero<ValueType>());
368 solver->setUpperBounds(std::move(upperBounds.get()));
370 solver->solveEquations(env, x, b);
375 infinityStates.
ite(model.
getManager().getConstant(storm::utility::infinity<ValueType>()), model.
getManager().template getAddZero<ValueType>()),
376 maybeStates, odd, x));
380 model.
getManager().template getAddZero<ValueType>())));
385template<storm::dd::DdType DdType,
typename ValueType>
391 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...