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,
typename SolutionType>
48 STORM_LOG_THROW(
false, storm::exceptions::NotImplementedException,
"We do not support computing reward bounded values with interval models.");
63 std::vector<ValueType> x, b;
64 std::unique_ptr<storm::solver::LinearEquationSolver<ValueType>> linEqSolver;
72 std::vector<std::vector<ValueType>> cdfData;
81 uint64_t numCheckedEpochs = 0;
82 for (
auto const& epoch : epochOrder) {
87 rewardUnfolding.
setSolutionForCurrentEpoch(epochModel.analyzeSingleObjective(preciseEnv, x, b, linEqSolver, lowerBound, upperBound));
91 std::vector<ValueType> cdfEntry;
92 for (uint64_t i = 0; i < rewardUnfolding.
getEpochManager().getDimensionCount(); ++i) {
98 cdfData.push_back(std::move(cdfEntry));
107 std::map<storm::storage::sparse::state_type, ValueType> result;
115 std::vector<std::string> headers;
116 for (uint64_t i = 0; i < rewardUnfolding.
getEpochManager().getDimensionCount(); ++i) {
117 headers.push_back(rewardUnfolding.
getDimension(i).formula->toString());
119 headers.push_back(
"Result");
139template<
typename ValueType,
typename SolutionType>
142 bool computeReward) {
149 env, std::move(goal), minMaxLinearEquationSolverFactory, std::move(submatrix),
150 convert(OptimizationDirection::Maximize));
151 solver->setUncertaintyResolutionMode(goal.getUncertaintyResolutionMode());
152 solver->setHasUniqueSolution(computeReward);
153 solver->setHasNoEndComponents(
false);
156 auto req =
solver->getRequirements(env);
157 if (!computeReward) {
162 STORM_LOG_THROW(!req.hasEnabledCriticalRequirement(), storm::exceptions::UncheckedRequirementException,
163 "Solver requirements " + req.getEnabledRequirementsAsString() +
" not checked.");
165 solver->setRequirementsChecked();
168 solver->solveEquations(env, x, b);
173template<
typename ValueType,
typename RewardModelType,
typename SolutionType>
185 maybeStates = hint.template asExplicitModelCheckerHint<ValueType>().getMaybeStates();
188 std::vector<SolutionType>
const& resultsForNonMaybeStates = hint.template asExplicitModelCheckerHint<SolutionType>().getResultHint();
191 for (
auto state : nonMaybeStates) {
193 statesWithProbability1.
set(state,
true);
197 "Expected that the result hint specifies probabilities in {0,1} for non-maybe states");
202 <<
" states remaining).");
205 std::pair<storm::storage::BitVector, storm::storage::BitVector> statesWithProbability01 =
208 statesWithProbability1 = std::move(statesWithProbability01.second);
209 maybeStates = ~(statesWithProbability0 | statesWithProbability1);
213 <<
" states remaining).");
221 bool maybeStatesNotRelevant = goal.hasRelevantValues() && goal.relevantValues().
isDisjointFrom(maybeStates);
224 if (qualitative || maybeStatesNotRelevant) {
228 if (!maybeStates.
empty()) {
233 std::vector<ValueType> b;
245 result = std::move(resultForMaybeStates);
249 bool convertToEquationSystem =
254 if (convertToEquationSystem) {
263 std::vector<SolutionType> x;
275 goal.restrictRelevantValues(maybeStates);
276 std::unique_ptr<storm::solver::LinearEquationSolver<ValueType>>
solver =
279 solver->solveEquations(env, x, b);
289template<
typename ValueType,
typename RewardModelType,
typename SolutionType>
294 STORM_LOG_THROW(
false, storm::exceptions::NotImplementedException,
"We do not support computing all until probabilities with interval models.");
296 uint_fast64_t numberOfStates = transitionMatrix.
getRowCount();
303 if (!relevantStates.
empty()) {
306 bool convertToEquationSystem =
317 submatrix = submatrix.
getSubmatrix(
true, relevantStates, relevantStates, convertToEquationSystem);
319 if (convertToEquationSystem) {
335 for (
auto state : relevantStates) {
336 if (initialStates.
get(state)) {
343 goal.restrictRelevantValues(relevantStates);
344 std::unique_ptr<storm::solver::LinearEquationSolver<ValueType>>
solver =
347 solver->solveEquations(env, x, b);
356template<
typename ValueType,
typename RewardModelType,
typename SolutionType>
361 STORM_LOG_THROW(
false, storm::exceptions::NotImplementedException,
"We do not support computing globally probabilities with interval models.");
364 std::vector<SolutionType> result =
computeUntilProbabilities(env, std::move(goal), transitionMatrix, backwardTransitions,
366 for (
auto& entry : result) {
373template<
typename ValueType,
typename RewardModelType,
typename SolutionType>
377 STORM_LOG_THROW(
false, storm::exceptions::NotImplementedException,
"We do not support next probabilities with interval models.");
380 std::vector<ValueType> result(transitionMatrix.
getRowCount());
385 multiplier->multiply(env, result,
nullptr, result);
390template<
typename ValueType,
typename RewardModelType,
typename SolutionType>
393 RewardModelType
const& rewardModel, uint_fast64_t stepBound) {
395 STORM_LOG_THROW(
false, storm::exceptions::NotImplementedException,
"We do not support cumulative rewards with interval models.");
398 std::vector<ValueType> result(transitionMatrix.
getRowCount());
401 std::vector<ValueType> totalRewardVector = rewardModel.getTotalRewardVector(transitionMatrix);
405 multiplier->repeatedMultiply(env, result, &totalRewardVector, stepBound);
411template<
typename ValueType,
typename RewardModelType,
typename SolutionType>
414 RewardModelType
const& rewardModel, uint_fast64_t stepCount) {
416 STORM_LOG_THROW(
false, storm::exceptions::NotImplementedException,
"We do not support instantaneous rewards with interval models.");
419 STORM_LOG_THROW(rewardModel.hasStateRewards(), storm::exceptions::InvalidPropertyException,
420 "Computing instantaneous rewards for a reward model that does not define any state-rewards. The result is trivially 0.");
423 std::vector<ValueType> result = rewardModel.getStateRewardVector();
427 multiplier->repeatedMultiply(env, result,
nullptr, stepCount);
433template<
typename ValueType,
typename RewardModelType,
typename SolutionType>
438 STORM_LOG_THROW(
false, storm::exceptions::NotImplementedException,
"We do not support computing total rewards with interval models.");
445 return computeReachabilityRewards(env, std::move(goal), transitionMatrix, backwardTransitions, rewardModel, rew0States, qualitative, hint);
454 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"The specified property is not supported by this value type.");
458template<
typename ValueType,
typename RewardModelType,
typename SolutionType>
461 RewardModelType
const& rewardModel, uint_fast64_t stepBound, ValueType discountFactor) {
463 STORM_LOG_THROW(
false, storm::exceptions::NotImplementedException,
"We do not support discounted cumulative rewards with interval models.");
466 STORM_LOG_THROW(!rewardModel.empty(), storm::exceptions::InvalidPropertyException,
"Missing reward model for formula. Skipping formula.");
469 std::vector<ValueType> totalRewardVector = rewardModel.getTotalRewardVector(transitionMatrix);
475 multiplier->repeatedMultiplyWithFactor(env, result, &totalRewardVector, stepBound, discountFactor);
488 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"The specified property is not supported by this value type.");
492template<
typename ValueType,
typename RewardModelType,
typename SolutionType>
498 STORM_LOG_THROW(
false, storm::exceptions::NotImplementedException,
"We do not support discounted total rewards with interval models.");
502 "Exact solving of discounted total reward objectives is currently not supported.");
505 std::vector<ValueType> b;
508 b = rewardModel.getTotalRewardVector(transitionMatrix);
511 return std::vector<SolutionType>(std::move(x));
515template<
typename ValueType,
typename RewardModelType,
typename SolutionType>
521 env, std::move(goal), transitionMatrix, backwardTransitions,
523 return rewardModel.getTotalRewardVector(numberOfRows, transitionMatrix, maybeStates);
525 targetStates, qualitative, [&]() {
return rewardModel.getStatesWithZeroReward(transitionMatrix); }, hint);
528template<
typename ValueType,
typename RewardModelType,
typename SolutionType>
534 env, std::move(goal), transitionMatrix, backwardTransitions,
543template<
typename ValueType,
typename RewardModelType,
typename SolutionType>
549 STORM_LOG_THROW(
false, storm::exceptions::NotImplementedException,
"We do not support computing reachability times with interval models.");
552 env, std::move(goal), transitionMatrix, backwardTransitions,
561template<
typename ValueType,
typename SolutionType>
563 std::vector<SolutionType>
const& oneStepTargetProbabilities) {
565 STORM_LOG_THROW(
false, storm::exceptions::NotImplementedException,
"We do not support computing upper reward bounds with interval models.");
575 std::vector<storm::RationalFunction>
const& ,
576 std::vector<storm::RationalFunction>
const& ) {
577 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Computing upper reward bounds is not supported for rational functions.");
580template<
typename ValueType,
typename RewardModelType,
typename SolutionType>
585 totalStateRewardVectorGetter,
595 rew0States = targetStates;
601 maybeStates = hint.template asExplicitModelCheckerHint<ValueType>().getMaybeStates();
605 <<
" states remaining).");
607 storm::storage::BitVector trueStates(transitionMatrix.
getRowCount(),
true);
610 maybeStates = ~(rew0States | infinityStates);
613 <<
" states with reward zero (" << maybeStates.
getNumberOfSetBits() <<
" states remaining).");
619 bool maybeStatesNotRelevant = goal.hasRelevantValues() && goal.relevantValues().
isDisjointFrom(maybeStates);
622 if (qualitative || maybeStatesNotRelevant) {
627 if (!maybeStates.
empty()) {
631 storm::storage::SparseMatrix<ValueType> submatrix = transitionMatrix.
filterEntries(transitionMatrix.
getRowFilter(maybeStates));
634 std::vector<ValueType> b = totalStateRewardVectorGetter(submatrix.
getRowCount(), transitionMatrix, maybeStates);
643 storm::solver::GeneralLinearEquationSolverFactory<ValueType> linearEquationSolverFactory;
644 bool convertToEquationSystem =
649 storm::storage::SparseMatrix<ValueType> submatrix = transitionMatrix.
getSubmatrix(
true, maybeStates, maybeStates, convertToEquationSystem);
653 std::vector<ValueType> x;
661 std::vector<ValueType> b = totalStateRewardVectorGetter(submatrix.
getRowCount(), transitionMatrix, maybeStates);
663 storm::solver::LinearEquationSolverRequirements requirements = linearEquationSolverFactory.
getRequirements(env);
664 boost::optional<std::vector<ValueType>> upperRewardBounds;
674 if (convertToEquationSystem) {
680 goal.restrictRelevantValues(maybeStates);
681 std::unique_ptr<storm::solver::LinearEquationSolver<ValueType>> solver =
684 if (upperRewardBounds) {
685 solver->setUpperBounds(std::move(upperRewardBounds.get()));
689 solver->solveEquations(env, x, b);
699template<
typename ValueType,
typename RewardModelType,
typename SolutionType>
700typename SparseDtmcPrctlHelper<ValueType, RewardModelType, SolutionType>::BaierTransformedModel
701SparseDtmcPrctlHelper<ValueType, RewardModelType, SolutionType>::computeBaierTransformation(Environment
const& env,
702 storm::storage::SparseMatrix<ValueType>
const& transitionMatrix,
703 storm::storage::SparseMatrix<ValueType>
const& backwardTransitions,
704 storm::storage::BitVector
const& targetStates,
705 storm::storage::BitVector
const& conditionStates,
706 boost::optional<std::vector<ValueType>>
const& stateRewards) {
708 STORM_LOG_THROW(
false, storm::exceptions::NotImplementedException,
"We do not support baier transformation with interval models.");
710 BaierTransformedModel result;
713 std::vector<ValueType> probabilitiesToReachConditionStates =
714 computeUntilProbabilities(env, storm::solver::SolveGoal<ValueType>(), transitionMatrix, backwardTransitions,
715 storm::storage::BitVector(transitionMatrix.
getRowCount(),
true), conditionStates,
false);
717 result.beforeStates = storm::storage::BitVector(targetStates.
size(),
true);
718 uint_fast64_t state = 0;
719 uint_fast64_t beforeStateIndex = 0;
720 for (
auto const& value : probabilitiesToReachConditionStates) {
722 result.beforeStates.set(state,
false);
724 probabilitiesToReachConditionStates[beforeStateIndex] = value;
729 probabilitiesToReachConditionStates.resize(beforeStateIndex);
731 if (targetStates.
empty()) {
732 result.noTargetStates =
true;
734 }
else if (!result.beforeStates.empty()) {
740 storm::storage::BitVector allStates(targetStates.
size(),
true);
741 std::vector<uint_fast64_t> numberOfBeforeStatesUpToState = result.beforeStates.getNumberOfSetBitsBeforeIndices();
744 uint_fast64_t normalStatesOffset = result.beforeStates.getNumberOfSetBits();
748 bool addDeadlockState =
false;
749 uint_fast64_t deadlockState = normalStatesOffset + statesWithProbabilityGreater0.
getNumberOfSetBits();
752 storm::storage::SparseMatrixBuilder<ValueType> builder;
755 uint_fast64_t currentRow = 0;
756 for (
auto beforeState : result.beforeStates) {
757 if (conditionStates.
get(beforeState)) {
760 for (
auto const& successorEntry : transitionMatrix.
getRow(beforeState)) {
761 if (statesWithProbabilityGreater0.
get(successorEntry.getColumn())) {
762 builder.
addNextValue(currentRow, normalStatesOffset + numberOfNormalStatesUpToState[successorEntry.getColumn()],
763 successorEntry.getValue());
765 zeroProbability += successorEntry.getValue();
769 builder.
addNextValue(currentRow, deadlockState, zeroProbability);
773 for (
auto const& successorEntry : transitionMatrix.
getRow(beforeState)) {
774 if (result.beforeStates.get(successorEntry.getColumn())) {
775 builder.
addNextValue(currentRow, numberOfBeforeStatesUpToState[successorEntry.getColumn()],
776 successorEntry.getValue() *
777 probabilitiesToReachConditionStates[numberOfBeforeStatesUpToState[successorEntry.getColumn()]] /
778 probabilitiesToReachConditionStates[currentRow]);
786 for (
auto state : statesWithProbabilityGreater0) {
788 for (
auto const& successorEntry : transitionMatrix.
getRow(state)) {
789 if (statesWithProbabilityGreater0.get(successorEntry.getColumn())) {
790 builder.
addNextValue(currentRow, normalStatesOffset + numberOfNormalStatesUpToState[successorEntry.getColumn()],
791 successorEntry.getValue());
793 zeroProbability += successorEntry.getValue();
797 addDeadlockState =
true;
798 builder.
addNextValue(currentRow, deadlockState, zeroProbability);
802 if (addDeadlockState) {
807 result.transitionMatrix = builder.
build(addDeadlockState ? (deadlockState + 1) : deadlockState);
808 storm::storage::BitVector newTargetStates = targetStates % result.beforeStates;
809 newTargetStates.
resize(result.transitionMatrix.get().getRowCount());
810 for (
auto state : targetStates % statesWithProbabilityGreater0) {
811 newTargetStates.
set(normalStatesOffset + state,
true);
813 result.targetStates = std::move(newTargetStates);
817 std::vector<ValueType> newStateRewards(result.beforeStates.getNumberOfSetBits());
820 newStateRewards.reserve(result.transitionMatrix.get().getRowCount());
821 for (
auto state : statesWithProbabilityGreater0) {
822 newStateRewards.push_back(stateRewards.get()[state]);
825 if (addDeadlockState) {
828 result.stateRewards = std::move(newStateRewards);
836template<
typename ValueType,
typename RewardModelType,
typename SolutionType>
837storm::storage::BitVector SparseDtmcPrctlHelper<ValueType, RewardModelType, SolutionType>::BaierTransformedModel::getNewRelevantStates()
const {
838 storm::storage::BitVector newRelevantStates(transitionMatrix.get().getRowCount());
839 for (uint64_t i = 0;
i < this->beforeStates.getNumberOfSetBits(); ++
i) {
840 newRelevantStates.set(i);
842 return newRelevantStates;
845template<
typename ValueType,
typename RewardModelType,
typename SolutionType>
846storm::storage::BitVector SparseDtmcPrctlHelper<ValueType, RewardModelType, SolutionType>::BaierTransformedModel::getNewRelevantStates(
847 storm::storage::BitVector
const& oldRelevantStates)
const {
848 storm::storage::BitVector result = oldRelevantStates % this->beforeStates;
853template<
typename ValueType,
typename RewardModelType,
typename SolutionType>
859 STORM_LOG_THROW(
false, storm::exceptions::NotImplementedException,
"We do not support computing conditional probabilities with interval models.");
864 if (!conditionStates.
empty()) {
865 BaierTransformedModel transformedModel =
866 computeBaierTransformation(env, transitionMatrix, backwardTransitions, targetStates, conditionStates, boost::none);
868 if (transformedModel.noTargetStates) {
878 if (goal.hasRelevantValues()) {
879 newRelevantValues = transformedModel.getNewRelevantStates(goal.relevantValues());
881 newRelevantValues = transformedModel.getNewRelevantStates();
883 goal.setRelevantValues(std::move(newRelevantValues));
885 env, std::move(goal), newTransitionMatrix, newTransitionMatrix.
transpose(),
896template<
typename ValueType,
typename RewardModelType,
typename SolutionType>
902 STORM_LOG_THROW(
false, storm::exceptions::NotImplementedException,
"We do not support computing conditional rewards with interval models.");
907 if (!conditionStates.
empty()) {
908 BaierTransformedModel transformedModel = computeBaierTransformation(env, transitionMatrix, backwardTransitions, targetStates, conditionStates,
909 rewardModel.getTotalRewardVector(transitionMatrix));
911 if (transformedModel.noTargetStates) {
921 if (goal.hasRelevantValues()) {
922 newRelevantValues = transformedModel.getNewRelevantStates(goal.relevantValues());
924 newRelevantValues = transformedModel.getNewRelevantStates();
926 goal.setRelevantValues(std::move(newRelevantValues));
927 std::vector<ValueType> conditionalRewards =
929 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
std::vector< ValueType > computeUpperBounds()
Computes upper bounds on the expected rewards.
static std::vector< 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, ModelCheckerHint const &hint=ModelCheckerHint())
static std::vector< SolutionType > computeConditionalProbabilities(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, storm::storage::BitVector const &conditionStates, bool qualitative)
static std::vector< SolutionType > 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, ModelCheckerHint const &hint=ModelCheckerHint())
static std::vector< SolutionType > 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, ModelCheckerHint const &hint=ModelCheckerHint())
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)
static std::vector< SolutionType > computeConditionalRewards(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, storm::storage::BitVector const &conditionStates, bool qualitative)
static std::vector< SolutionType > 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, ValueType discountFactor, ModelCheckerHint const &hint=ModelCheckerHint())
static std::map< storm::storage::sparse::state_type, SolutionType > computeRewardBoundedValues(Environment const &env, storm::models::sparse::Dtmc< ValueType > const &model, std::shared_ptr< storm::logic::OperatorFormula const > rewardBoundedFormula)
static std::vector< SolutionType > computeAllUntilProbabilities(Environment const &env, storm::solver::SolveGoal< ValueType, SolutionType > &&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< 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)
static std::vector< SolutionType > 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, ModelCheckerHint const &hint=ModelCheckerHint())
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 > computeInstantaneousRewards(Environment const &env, storm::solver::SolveGoal< ValueType, SolutionType > &&goal, storm::storage::SparseMatrix< ValueType > const &transitionMatrix, RewardModelType const &rewardModel, uint_fast64_t stepCount)
static std::vector< SolutionType > computeNextProbabilities(Environment const &env, storm::storage::SparseMatrix< ValueType > const &transitionMatrix, storm::storage::BitVector const &nextStates)
bool hasBottomDimension(Epoch const &epoch) 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, SolutionType > > 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.
bool isDisjointFrom(BitVector const &other) const
Checks whether none of the bits that are set in the current bit vector are also set in the given bit ...
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.
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.
const_rows getRow(index_type row) const
Returns an object representing the given row.
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.
storm::storage::BitVector getRowFilter(storm::storage::BitVector const &groupConstraint) const
Returns a bitvector representing the set of rows, with all indices set that correspond to one of the ...
SparseMatrix filterEntries(storm::storage::BitVector const &rowFilter) const
Returns a copy of this matrix that only considers entries in the selected rows.
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_ASSERT(cond, message)
#define STORM_LOG_THROW(cond, exception, message)
#define STORM_PRINT_AND_LOG(message)
SFTBDDChecker::ValueType ValueType
void exportDataToCSVFile(std::string filepath, std::vector< std::vector< DataType > > const &data, boost::optional< std::vector< Header1Type > > const &header1=boost::none, boost::optional< std::vector< Header2Type > > const &header2=boost::none)
std::vector< SolutionType > computeRobustValuesForMaybeStates(Environment const &env, storm::solver::SolveGoal< ValueType, SolutionType > &&goal, storm::storage::SparseMatrix< ValueType > &&submatrix, std::vector< ValueType > const &b, bool computeReward)
std::vector< ValueType > computeUpperRewardBounds(storm::storage::SparseMatrix< ValueType > const &transitionMatrix, std::vector< ValueType > const &rewards, std::vector< ValueType > const &oneStepTargetProbabilities)
SettingsType const & getModule()
Get module.
std::unique_ptr< storm::solver::MinMaxLinearEquationSolver< ValueType, SolutionType > > configureMinMaxLinearEquationSolver(Environment const &env, SolveGoal< ValueType, SolutionType > &&goal, storm::solver::MinMaxLinearEquationSolverFactory< ValueType, SolutionType > const &factory, MatrixType &&matrix, OptimizationDirectionSetting optimizationDirectionSetting=OptimizationDirectionSetting::Unset)
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 setAllValues(std::vector< T > &vec, storm::storage::BitVector const &positions, T const &positiveValue=storm::utility::one< T >(), T const &negativeValue=storm::utility::zero< T >())
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)
TargetType convertNumber(SourceType const &number)
constexpr bool IsIntervalType
Helper to check if a type is an interval.
carl::RationalFunction< Polynomial, true > RationalFunction