33namespace modelchecker {
39 std::shared_ptr<storm::logic::OperatorFormula const> ) {
40 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"The specified property is not supported by this value type.");
41 return std::map<storm::storage::sparse::state_type, storm::RationalFunction>();
44template<
typename ValueType,
typename RewardModelType>
60 std::vector<ValueType> x, b;
61 std::unique_ptr<storm::solver::LinearEquationSolver<ValueType>> linEqSolver;
65 initEpoch, storm::utility::convertNumber<ValueType>(storm::settings::getModule<storm::settings::modules::GeneralSettings>().getPrecision()));
69 std::vector<std::vector<ValueType>> cdfData;
78 uint64_t numCheckedEpochs = 0;
79 for (
auto const& epoch : epochOrder) {
84 rewardUnfolding.
setSolutionForCurrentEpoch(epochModel.analyzeSingleObjective(preciseEnv, x, b, linEqSolver, lowerBound, upperBound));
86 if (storm::settings::getModule<storm::settings::modules::IOSettings>().isExportCdfSet() &&
88 std::vector<ValueType> cdfEntry;
95 cdfData.push_back(std::move(cdfEntry));
104 std::map<storm::storage::sparse::state_type, ValueType> result;
111 if (storm::settings::getModule<storm::settings::modules::IOSettings>().isExportCdfSet()) {
112 std::vector<std::string> headers;
114 headers.push_back(rewardUnfolding.
getDimension(i).formula->toString());
116 headers.push_back(
"Result");
117 storm::io::exportDataToCSVFile<ValueType, std::string, std::string>(
118 storm::settings::getModule<storm::settings::modules::IOSettings>().getExportCdfDirectory() +
"cdf.csv", cdfData, headers);
121 if (storm::settings::getModule<storm::settings::modules::CoreSettings>().isShowStatisticsSet()) {
135template<
typename ValueType,
typename RewardModelType>
140 std::vector<ValueType> result(transitionMatrix.
getRowCount(), storm::utility::zero<ValueType>());
147 maybeStates = hint.template asExplicitModelCheckerHint<ValueType>().getMaybeStates();
150 std::vector<ValueType>
const& resultsForNonMaybeStates = hint.template asExplicitModelCheckerHint<ValueType>().getResultHint();
153 for (
auto state : nonMaybeStates) {
155 statesWithProbability1.
set(state,
true);
156 result[state] = storm::utility::one<ValueType>();
159 "Expected that the result hint specifies probabilities in {0,1} for non-maybe states");
164 <<
" states remaining).");
167 std::pair<storm::storage::BitVector, storm::storage::BitVector> statesWithProbability01 =
170 statesWithProbability1 = std::move(statesWithProbability01.second);
171 maybeStates = ~(statesWithProbability0 | statesWithProbability1);
175 <<
" states remaining).");
178 storm::utility::vector::setVectorValues<ValueType>(result, statesWithProbability0, storm::utility::zero<ValueType>());
179 storm::utility::vector::setVectorValues<ValueType>(result, statesWithProbability1, storm::utility::one<ValueType>());
183 bool maybeStatesNotRelevant = goal.hasRelevantValues() && goal.relevantValues().isDisjointFrom(maybeStates);
186 if (qualitative || maybeStatesNotRelevant) {
188 storm::utility::vector::setVectorValues<ValueType>(result, maybeStates, storm::utility::convertNumber<ValueType>(0.5));
190 if (!maybeStates.
empty()) {
195 bool convertToEquationSystem =
200 if (convertToEquationSystem) {
209 std::vector<ValueType> x;
213 x = std::vector<ValueType>(maybeStates.
getNumberOfSetBits(), storm::utility::convertNumber<ValueType>(0.5));
221 goal.restrictRelevantValues(maybeStates);
222 std::unique_ptr<storm::solver::LinearEquationSolver<ValueType>> solver =
224 solver->setBounds(storm::utility::zero<ValueType>(), storm::utility::one<ValueType>());
225 solver->solveEquations(env, x, b);
228 storm::utility::vector::setVectorValues<ValueType>(result, maybeStates, x);
234template<
typename ValueType,
typename RewardModelType>
238 uint_fast64_t numberOfStates = transitionMatrix.
getRowCount();
239 std::vector<ValueType> result(numberOfStates, storm::utility::zero<ValueType>());
245 if (!relevantStates.
empty()) {
248 bool convertToEquationSystem =
259 submatrix = submatrix.
getSubmatrix(
true, relevantStates, relevantStates, convertToEquationSystem);
261 if (convertToEquationSystem) {
270 std::vector<ValueType> x = std::vector<ValueType>(relevantStates.
getNumberOfSetBits(), storm::utility::convertNumber<ValueType>(0.5));
273 std::vector<ValueType> b(relevantStates.
getNumberOfSetBits(), storm::utility::zero<ValueType>());
276 ValueType initDist = storm::utility::one<ValueType>() / storm::utility::convertNumber<ValueType>(initialStates.
getNumberOfSetBits());
277 for (
auto state : relevantStates) {
278 if (initialStates.
get(state)) {
285 goal.restrictRelevantValues(relevantStates);
286 std::unique_ptr<storm::solver::LinearEquationSolver<ValueType>> solver =
288 solver->setBounds(storm::utility::zero<ValueType>(), storm::utility::one<ValueType>());
289 solver->solveEquations(env, x, b);
292 storm::utility::vector::setVectorValues<ValueType>(result, relevantStates, x);
297template<
typename ValueType,
typename RewardModelType>
302 std::vector<ValueType> result = computeUntilProbabilities(env, std::move(goal), transitionMatrix, backwardTransitions,
304 for (
auto& entry : result) {
305 entry = storm::utility::one<ValueType>() - entry;
310template<
typename ValueType,
typename RewardModelType>
314 std::vector<ValueType> result(transitionMatrix.
getRowCount());
319 multiplier->multiply(env, result,
nullptr, result);
323template<
typename ValueType,
typename RewardModelType>
326 RewardModelType
const& rewardModel, uint_fast64_t stepBound) {
328 std::vector<ValueType> result(transitionMatrix.
getRowCount());
331 std::vector<ValueType> totalRewardVector = rewardModel.getTotalRewardVector(transitionMatrix);
335 multiplier->repeatedMultiply(env, result, &totalRewardVector, stepBound);
340template<
typename ValueType,
typename RewardModelType>
343 RewardModelType
const& rewardModel, uint_fast64_t stepCount) {
345 STORM_LOG_THROW(rewardModel.hasStateRewards(), storm::exceptions::InvalidPropertyException,
346 "Computing instantaneous rewards for a reward model that does not define any state-rewards. The result is trivially 0.");
349 std::vector<ValueType> result = rewardModel.getStateRewardVector();
353 multiplier->repeatedMultiply(env, result,
nullptr, stepCount);
358template<
typename ValueType,
typename RewardModelType>
367 return computeReachabilityRewards(env, std::move(goal), transitionMatrix, backwardTransitions, rewardModel, rew0States, qualitative, hint);
375 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"The specified property is not supported by this value type.");
379template<
typename ValueType,
typename RewardModelType>
382 RewardModelType
const& rewardModel, uint_fast64_t stepBound, ValueType discountFactor) {
384 STORM_LOG_THROW(!rewardModel.empty(), storm::exceptions::InvalidPropertyException,
"Missing reward model for formula. Skipping formula.");
387 std::vector<ValueType> totalRewardVector = rewardModel.getTotalRewardVector(transitionMatrix);
390 std::vector<ValueType> result(transitionMatrix.
getRowGroupCount(), storm::utility::zero<ValueType>());
393 multiplier->repeatedMultiplyWithFactor(env, result, &totalRewardVector, stepBound, discountFactor);
405 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"The specified property is not supported by this value type.");
409template<
typename ValueType,
typename RewardModelType>
416 "Exact solving of discounted total reward objectives is currently not supported.");
419 std::vector<ValueType> b;
421 std::vector<ValueType> x = std::vector<ValueType>(transitionMatrix.
getRowGroupCount(), storm::utility::zero<ValueType>());
422 b = rewardModel.getTotalRewardVector(transitionMatrix);
425 return std::vector<ValueType>(std::move(x));
428template<
typename ValueType,
typename RewardModelType>
433 return computeReachabilityRewards(
434 env, std::move(goal), transitionMatrix, backwardTransitions,
436 return rewardModel.getTotalRewardVector(numberOfRows, transitionMatrix, maybeStates);
438 targetStates, qualitative, [&]() {
return rewardModel.getStatesWithZeroReward(transitionMatrix); }, hint);
441template<
typename ValueType,
typename RewardModelType>
446 return computeReachabilityRewards(
447 env, std::move(goal), transitionMatrix, backwardTransitions,
449 std::vector<ValueType> result(numberOfRows);
456template<
typename ValueType,
typename RewardModelType>
461 return computeReachabilityRewards(
462 env, std::move(goal), transitionMatrix, backwardTransitions,
464 return std::vector<ValueType>(numberOfRows, storm::utility::one<ValueType>());
470template<
typename ValueType>
472 std::vector<ValueType>
const& oneStepTargetProbabilities) {
474 std::vector<ValueType> bounds = dsmpi.computeUpperBounds();
480 std::vector<storm::RationalFunction>
const& ,
481 std::vector<storm::RationalFunction>
const& ) {
482 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Computing upper reward bounds is not supported for rational functions.");
485template<
typename ValueType,
typename RewardModelType>
490 totalStateRewardVectorGetter,
493 std::vector<ValueType> result(transitionMatrix.
getRowCount(), storm::utility::zero<ValueType>());
497 if (storm::settings::getModule<storm::settings::modules::ModelCheckerSettings>().isFilterRewZeroSet()) {
500 rew0States = targetStates;
506 maybeStates = hint.template asExplicitModelCheckerHint<ValueType>().getMaybeStates();
510 <<
" states remaining).");
515 maybeStates = ~(rew0States | infinityStates);
518 <<
" states with reward zero (" << maybeStates.
getNumberOfSetBits() <<
" states remaining).");
524 bool maybeStatesNotRelevant = goal.hasRelevantValues() && goal.relevantValues().isDisjointFrom(maybeStates);
527 if (qualitative || maybeStatesNotRelevant) {
530 storm::utility::vector::setVectorValues<ValueType>(result, maybeStates, storm::utility::one<ValueType>());
532 if (!maybeStates.
empty()) {
535 bool convertToEquationSystem =
544 std::vector<ValueType> x;
548 x = std::vector<ValueType>(submatrix.
getColumnCount(), storm::utility::one<ValueType>());
552 std::vector<ValueType> b = totalStateRewardVectorGetter(submatrix.
getRowCount(), transitionMatrix, maybeStates);
555 boost::optional<std::vector<ValueType>> upperRewardBounds;
565 if (convertToEquationSystem) {
571 goal.restrictRelevantValues(maybeStates);
572 std::unique_ptr<storm::solver::LinearEquationSolver<ValueType>> solver =
574 solver->setLowerBound(storm::utility::zero<ValueType>());
575 if (upperRewardBounds) {
576 solver->setUpperBounds(std::move(upperRewardBounds.get()));
580 solver->solveEquations(env, x, b);
583 storm::utility::vector::setVectorValues<ValueType>(result, maybeStates, x);
589template<
typename ValueType,
typename RewardModelType>
590typename SparseDtmcPrctlHelper<ValueType, RewardModelType>::BaierTransformedModel SparseDtmcPrctlHelper<ValueType, RewardModelType>::computeBaierTransformation(
593 boost::optional<std::vector<ValueType>>
const& stateRewards) {
594 BaierTransformedModel result;
597 std::vector<ValueType> probabilitiesToReachConditionStates =
602 uint_fast64_t state = 0;
603 uint_fast64_t beforeStateIndex = 0;
604 for (
auto const& value : probabilitiesToReachConditionStates) {
605 if (value == storm::utility::zero<ValueType>()) {
606 result.beforeStates.set(state,
false);
608 probabilitiesToReachConditionStates[beforeStateIndex] = value;
613 probabilitiesToReachConditionStates.resize(beforeStateIndex);
615 if (targetStates.
empty()) {
616 result.noTargetStates =
true;
618 }
else if (!result.beforeStates.empty()) {
625 std::vector<uint_fast64_t> numberOfBeforeStatesUpToState = result.beforeStates.getNumberOfSetBitsBeforeIndices();
628 uint_fast64_t normalStatesOffset = result.beforeStates.getNumberOfSetBits();
632 bool addDeadlockState =
false;
633 uint_fast64_t deadlockState = normalStatesOffset + statesWithProbabilityGreater0.
getNumberOfSetBits();
639 uint_fast64_t currentRow = 0;
640 for (
auto beforeState : result.beforeStates) {
641 if (conditionStates.
get(beforeState)) {
643 ValueType zeroProbability = storm::utility::zero<ValueType>();
644 for (
auto const& successorEntry : transitionMatrix.getRow(beforeState)) {
645 if (statesWithProbabilityGreater0.
get(successorEntry.getColumn())) {
646 builder.
addNextValue(currentRow, normalStatesOffset + numberOfNormalStatesUpToState[successorEntry.getColumn()],
647 successorEntry.getValue());
649 zeroProbability += successorEntry.getValue();
653 builder.
addNextValue(currentRow, deadlockState, zeroProbability);
657 for (
auto const& successorEntry : transitionMatrix.getRow(beforeState)) {
658 if (result.beforeStates.get(successorEntry.getColumn())) {
659 builder.
addNextValue(currentRow, numberOfBeforeStatesUpToState[successorEntry.getColumn()],
660 successorEntry.getValue() *
661 probabilitiesToReachConditionStates[numberOfBeforeStatesUpToState[successorEntry.getColumn()]] /
662 probabilitiesToReachConditionStates[currentRow]);
670 for (
auto state : statesWithProbabilityGreater0) {
671 ValueType zeroProbability = storm::utility::zero<ValueType>();
672 for (
auto const& successorEntry : transitionMatrix.getRow(state)) {
673 if (statesWithProbabilityGreater0.
get(successorEntry.getColumn())) {
674 builder.
addNextValue(currentRow, normalStatesOffset + numberOfNormalStatesUpToState[successorEntry.getColumn()], successorEntry.getValue());
676 zeroProbability += successorEntry.getValue();
680 addDeadlockState =
true;
681 builder.
addNextValue(currentRow, deadlockState, zeroProbability);
685 if (addDeadlockState) {
686 builder.
addNextValue(deadlockState, deadlockState, storm::utility::one<ValueType>());
690 result.transitionMatrix = builder.
build(addDeadlockState ? (deadlockState + 1) : deadlockState);
692 newTargetStates.
resize(result.transitionMatrix.get().getRowCount());
693 for (
auto state : targetStates % statesWithProbabilityGreater0) {
694 newTargetStates.
set(normalStatesOffset + state,
true);
696 result.targetStates = std::move(newTargetStates);
700 std::vector<ValueType> newStateRewards(result.beforeStates.getNumberOfSetBits());
703 newStateRewards.reserve(result.transitionMatrix.get().getRowCount());
704 for (
auto state : statesWithProbabilityGreater0) {
705 newStateRewards.push_back(stateRewards.get()[state]);
708 if (addDeadlockState) {
709 newStateRewards.push_back(storm::utility::zero<ValueType>());
711 result.stateRewards = std::move(newStateRewards);
718template<
typename ValueType,
typename RewardModelType>
719storm::storage::BitVector SparseDtmcPrctlHelper<ValueType, RewardModelType>::BaierTransformedModel::getNewRelevantStates()
const {
721 for (uint64_t i = 0;
i < this->beforeStates.getNumberOfSetBits(); ++
i) {
722 newRelevantStates.set(i);
724 return newRelevantStates;
727template<
typename ValueType,
typename RewardModelType>
735template<
typename ValueType,
typename RewardModelType>
741 std::vector<ValueType> result(transitionMatrix.
getRowCount(), storm::utility::infinity<ValueType>());
743 if (!conditionStates.
empty()) {
744 BaierTransformedModel transformedModel =
745 computeBaierTransformation(env, transitionMatrix, backwardTransitions, targetStates, conditionStates, boost::none);
747 if (transformedModel.noTargetStates) {
757 if (goal.hasRelevantValues()) {
758 newRelevantValues = transformedModel.getNewRelevantStates(goal.relevantValues());
760 newRelevantValues = transformedModel.getNewRelevantStates();
762 goal.setRelevantValues(std::move(newRelevantValues));
763 std::vector<ValueType> conditionalProbabilities =
764 computeUntilProbabilities(env, std::move(goal), newTransitionMatrix, newTransitionMatrix.
transpose(),
774template<
typename ValueType,
typename RewardModelType>
780 std::vector<ValueType> result(transitionMatrix.
getRowCount(), storm::utility::infinity<ValueType>());
782 if (!conditionStates.
empty()) {
783 BaierTransformedModel transformedModel = computeBaierTransformation(env, transitionMatrix, backwardTransitions, targetStates, conditionStates,
784 rewardModel.getTotalRewardVector(transitionMatrix));
786 if (transformedModel.noTargetStates) {
796 if (goal.hasRelevantValues()) {
797 newRelevantValues = transformedModel.getNewRelevantStates(goal.relevantValues());
799 newRelevantValues = transformedModel.getNewRelevantStates();
801 goal.setRelevantValues(std::move(newRelevantValues));
802 std::vector<ValueType> conditionalRewards =
803 computeReachabilityRewards(env, std::move(goal), newTransitionMatrix, newTransitionMatrix.
transpose(), transformedModel.stateRewards.get(),
804 transformedModel.targetStates.get(), qualitative);
SolverEnvironment & solver()
void setLinearEquationSolverPrecision(boost::optional< storm::RationalNumber > const &newPrecision, boost::optional< bool > const &relativePrecision=boost::none)
bool isForceExact() const
This class contains information that might accelerate the model checking process.
virtual bool isExplicitModelCheckerHint() const
bool solveWithDiscountedValueIteration(Environment const &env, std::optional< OptimizationDirection > dir, std::vector< ValueType > &x, std::vector< ValueType > const &b) const
static std::vector< ValueType > computeNextProbabilities(Environment const &env, storm::storage::SparseMatrix< ValueType > const &transitionMatrix, storm::storage::BitVector const &nextStates)
static std::vector< ValueType > computeReachabilityTimes(Environment const &env, storm::solver::SolveGoal< ValueType > &&goal, storm::storage::SparseMatrix< ValueType > const &transitionMatrix, storm::storage::SparseMatrix< ValueType > const &backwardTransitions, storm::storage::BitVector const &targetStates, bool qualitative, ModelCheckerHint const &hint=ModelCheckerHint())
static std::vector< ValueType > computeReachabilityRewards(Environment const &env, storm::solver::SolveGoal< ValueType > &&goal, storm::storage::SparseMatrix< ValueType > const &transitionMatrix, storm::storage::SparseMatrix< ValueType > const &backwardTransitions, RewardModelType const &rewardModel, storm::storage::BitVector const &targetStates, bool qualitative, ModelCheckerHint const &hint=ModelCheckerHint())
static std::vector< ValueType > computeUntilProbabilities(Environment const &env, storm::solver::SolveGoal< ValueType > &&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, ModelCheckerHint const &hint=ModelCheckerHint())
static std::vector< ValueType > computeConditionalProbabilities(Environment const &env, storm::solver::SolveGoal< ValueType > &&goal, storm::storage::SparseMatrix< ValueType > const &transitionMatrix, storm::storage::SparseMatrix< ValueType > const &backwardTransitions, storm::storage::BitVector const &targetStates, storm::storage::BitVector const &conditionStates, bool qualitative)
static std::vector< ValueType > computeAllUntilProbabilities(Environment const &env, storm::solver::SolveGoal< ValueType > &&goal, storm::storage::SparseMatrix< ValueType > const &transitionMatrix, storm::storage::BitVector const &initialStates, storm::storage::BitVector const &phiStates, storm::storage::BitVector const &psiStates)
static std::vector< ValueType > computeTotalRewards(Environment const &env, storm::solver::SolveGoal< ValueType > &&goal, storm::storage::SparseMatrix< ValueType > const &transitionMatrix, storm::storage::SparseMatrix< ValueType > const &backwardTransitions, RewardModelType const &rewardModel, bool qualitative, ModelCheckerHint const &hint=ModelCheckerHint())
static std::map< storm::storage::sparse::state_type, ValueType > computeRewardBoundedValues(Environment const &env, storm::models::sparse::Dtmc< ValueType > const &model, std::shared_ptr< storm::logic::OperatorFormula const > rewardBoundedFormula)
static std::vector< ValueType > computeConditionalRewards(Environment const &env, storm::solver::SolveGoal< ValueType > &&goal, storm::storage::SparseMatrix< ValueType > const &transitionMatrix, storm::storage::SparseMatrix< ValueType > const &backwardTransitions, RewardModelType const &rewardModel, storm::storage::BitVector const &targetStates, storm::storage::BitVector const &conditionStates, bool qualitative)
static std::vector< ValueType > computeInstantaneousRewards(Environment const &env, storm::solver::SolveGoal< ValueType > &&goal, storm::storage::SparseMatrix< ValueType > const &transitionMatrix, RewardModelType const &rewardModel, uint_fast64_t stepCount)
static std::vector< ValueType > computeDiscountedTotalRewards(Environment const &env, storm::solver::SolveGoal< ValueType > &&goal, storm::storage::SparseMatrix< ValueType > const &transitionMatrix, storm::storage::SparseMatrix< ValueType > const &backwardTransitions, RewardModelType const &rewardModel, bool qualitative, ValueType discountFactor, ModelCheckerHint const &hint=ModelCheckerHint())
static std::vector< ValueType > computeGloballyProbabilities(Environment const &env, storm::solver::SolveGoal< ValueType > &&goal, storm::storage::SparseMatrix< ValueType > const &transitionMatrix, storm::storage::SparseMatrix< ValueType > const &backwardTransitions, storm::storage::BitVector const &psiStates, bool qualitative)
static std::vector< ValueType > computeDiscountedCumulativeRewards(Environment const &env, storm::solver::SolveGoal< ValueType > &&goal, storm::storage::SparseMatrix< ValueType > const &transitionMatrix, RewardModelType const &rewardModel, uint_fast64_t stepBound, ValueType discountFactor)
static std::vector< ValueType > computeCumulativeRewards(Environment const &env, storm::solver::SolveGoal< ValueType > &&goal, storm::storage::SparseMatrix< ValueType > const &transitionMatrix, RewardModelType const &rewardModel, uint_fast64_t stepBound)
bool hasBottomDimension(Epoch const &epoch) const
uint64_t const & getDimensionCount() const
uint64_t getDimensionOfEpoch(Epoch const &epoch, uint64_t const &dimension) const
Epoch getStartEpoch(bool setUnknownDimsToBottom=false)
Retrieves the desired epoch that needs to be analyzed to compute the reward bounded values.
SolutionType getInitialStateResult(Epoch const &epoch)
Dimension< ValueType > const & getDimension(uint64_t dim) const
EpochManager const & getEpochManager() const
EpochModel< ValueType, SingleObjectiveMode > & setCurrentEpoch(Epoch const &epoch)
std::vector< Epoch > getEpochComputationOrder(Epoch const &startEpoch, bool stopAtComputedEpochs=false)
Computes a sequence of epochs that need to be analyzed to get a result at the start epoch.
ValueType getRequiredEpochModelPrecision(Epoch const &startEpoch, ValueType const &precision)
Returns the precision required for the analyzis of each epoch model in order to achieve the given ove...
boost::optional< ValueType > getLowerObjectiveBound(uint64_t objectiveIndex=0)
void setSolutionForCurrentEpoch(std::vector< SolutionType > &&inStateSolutions)
boost::optional< ValueType > getUpperObjectiveBound(uint64_t objectiveIndex=0)
Returns an upper/lower bound for the objective result in every state (if this bound could be computed...
void setEquationSystemFormatForEpochModel(storm::solver::LinearEquationSolverProblemFormat eqSysFormat)
This class represents a discrete-time Markov chain.
storm::storage::BitVector const & getInitialStates() const
Retrieves the initial states of the model.
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.
SolverRequirement const & upperBounds() const
std::string getEnabledRequirementsAsString() const
Checks whether there are no critical requirements left.
bool hasEnabledCriticalRequirement() const
std::unique_ptr< Multiplier< ValueType > > create(Environment const &env, storm::storage::SparseMatrix< ValueType > const &matrix)
A bit vector that is internally represented as a vector of 64-bit values.
void complement()
Negates all bits in the bit vector.
std::vector< uint64_t > getNumberOfSetBitsBeforeIndices() const
Retrieves a vector that holds at position i the number of bits set before index i.
bool empty() const
Retrieves whether no bits are set to true in this bit vector.
uint64_t getNumberOfSetBits() const
Returns the number of bits that are set to true in this bit vector.
void set(uint64_t index, bool value=true)
Sets the given truth value at the given index.
size_t size() const
Retrieves the number of bits this bit vector can store.
void resize(uint64_t newLength, bool init=false)
Resizes the bit vector to hold the given new number of bits.
bool get(uint64_t index) const
Retrieves the truth value of the bit at the given index and performs a bound check.
A class that can be used to build a sparse matrix by adding value by value.
void addNextValue(index_type row, index_type column, value_type const &value)
Sets the matrix entry at the given row and column to the given value.
SparseMatrix< value_type > build(index_type overriddenRowCount=0, index_type overriddenColumnCount=0, index_type overriddenRowGroupCount=0)
A class that holds a possibly non-square matrix in the compressed row storage format.
void convertToEquationSystem()
Transforms the matrix into an equation system.
void makeRowsAbsorbing(storm::storage::BitVector const &rows, bool dropZeroEntries=false)
This function makes the given rows absorbing.
SparseMatrix getSubmatrix(bool useGroups, storm::storage::BitVector const &rowConstraint, storm::storage::BitVector const &columnConstraint, bool insertDiagonalEntries=false, storm::storage::BitVector const &makeZeroColumns=storm::storage::BitVector()) const
Creates a submatrix of the current matrix by dropping all rows and columns whose bits are not set to ...
std::vector< value_type > getConstrainedRowSumVector(storm::storage::BitVector const &rowConstraint, storm::storage::BitVector const &columnConstraint) const
Computes a vector whose i-th entry is the sum of the entries in the i-th selected row where only thos...
index_type getRowGroupCount() const
Returns the number of row groups in the matrix.
index_type getColumnCount() const
Returns the number of columns of the matrix.
void deleteDiagonalEntries(bool dropZeroEntries=false)
Sets all diagonal elements to zero.
storm::storage::SparseMatrix< value_type > transpose(bool joinGroups=false, bool keepZeros=false) const
Transposes the matrix.
index_type getRowCount() const
Returns the number of rows of the matrix.
A class that provides convenience operations to display run times.
bool updateProgress(uint64_t count)
Updates the progress to the current count and prints it if the delay passed.
void setMaxCount(uint64_t maxCount)
Sets the maximal possible count.
void startNewMeasurement(uint64_t startCount)
Starts a new measurement, dropping all progress information collected so far.
A class that provides convenience operations to display run times.
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_THROW(cond, exception, message)
#define STORM_PRINT_AND_LOG(message)
SFTBDDChecker::ValueType ValueType
std::vector< ValueType > computeUpperRewardBounds(storm::storage::SparseMatrix< ValueType > const &transitionMatrix, std::vector< ValueType > const &rewards, std::vector< ValueType > const &oneStepTargetProbabilities)
std::unique_ptr< storm::solver::LinearEquationSolver< ValueType > > configureLinearEquationSolver(Environment const &env, SolveGoal< ValueType, SolutionType > &&goal, storm::solver::LinearEquationSolverFactory< ValueType > const &factory, MatrixType &&matrix)
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 getReachableStates(storm::storage::SparseMatrix< T > const &transitionMatrix, storm::storage::BitVector const &initialStates, storm::storage::BitVector const &constraintStates, storm::storage::BitVector const &targetStates, bool useStepBound, uint_fast64_t maximalSteps, boost::optional< storm::storage::BitVector > const &choiceFilter)
Performs a forward depth-first search through the underlying graph structure to identify the states t...
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...
bool isTerminate()
Check whether the program should terminate (due to some abort signal).
void setVectorValues(std::vector< T > &vector, storm::storage::BitVector const &positions, std::vector< T > const &values)
Sets the provided values at the provided positions in the given vector.
void selectVectorValues(std::vector< T > &vector, storm::storage::BitVector const &positions, std::vector< T > const &values)
Selects the elements from a vector at the specified positions and writes them consecutively into anot...
storm::storage::BitVector filterZero(std::vector< T > const &values)
Retrieves a bit vector containing all the indices for which the value at this position is equal to ze...
std::vector< Type > filterVector(std::vector< Type > const &in, storm::storage::BitVector const &filter)
bool isOne(ValueType const &a)
bool isZero(ValueType const &a)