81 std::vector<ValueType>& operand, std::vector<ValueType>
const& offsets, uint64_t& numIterations, ValueType
const& precision,
82 ValueType
const& discountFactor, ValueType
const& maximalAbsoluteReward, std::function<
SolverStatus(
SolverStatus const&)>
const& iterationCallback,
85 std::vector<ValueType>* operand1{&operand};
86 std::vector<ValueType>* operand2{&operand};
88 operand2 = &viOperator->allocateAuxiliaryVector(operand.size());
90 bool resultInAuxVector{
false};
94 if (viOperator->apply(*operand1, *operand2, offsets, backend)) {
96 }
else if (iterationCallback) {
97 status = iterationCallback(status);
100 std::swap(operand1, operand2);
101 resultInAuxVector = !resultInAuxVector;
105 if (resultInAuxVector) {
107 std::swap(*operand1, *operand2);
109 viOperator->freeAuxiliaryVector();
116 std::vector<ValueType>& operand, std::vector<ValueType>
const& offsets, uint64_t& numIterations,
bool relative, ValueType
const& precision,
117 ValueType
const& discountFactor, ValueType
const& maximalAbsoluteReward, std::optional<storm::OptimizationDirection>
const& dir,
119 STORM_LOG_ASSERT(TrivialRowGrouping || dir.has_value(),
"no optimization direction given!");
120 if (!dir.has_value() ||
maximize(*dir)) {
122 return DiscountedVI<storm::OptimizationDirection::Maximize, true>(operand, offsets, numIterations, precision, discountFactor, maximalAbsoluteReward,
123 iterationCallback, mult);
125 return DiscountedVI<storm::OptimizationDirection::Maximize, false>(operand, offsets, numIterations, precision, discountFactor,
126 maximalAbsoluteReward, iterationCallback, mult);
130 return DiscountedVI<storm::OptimizationDirection::Minimize, true>(operand, offsets, numIterations, precision, discountFactor, maximalAbsoluteReward,
131 iterationCallback, mult);
133 return DiscountedVI<storm::OptimizationDirection::Minimize, false>(operand, offsets, numIterations, precision, discountFactor,
134 maximalAbsoluteReward, iterationCallback, mult);
141 std::vector<ValueType>& operand, std::vector<ValueType>
const& offsets,
bool relative, ValueType
const& precision, ValueType
const& discountFactor,
142 ValueType
const& maximalAbsoluteReward, std::optional<storm::OptimizationDirection>
const& dir,
144 uint64_t numIterations = 0;
145 return DiscountedVI(operand, offsets, numIterations, relative, precision, discountFactor, maximalAbsoluteReward, dir, iterationCallback, mult);
SolverStatus DiscountedVI(std::vector< ValueType > &operand, std::vector< ValueType > const &offsets, uint64_t &numIterations, ValueType const &precision, ValueType const &discountFactor, ValueType const &maximalAbsoluteReward, std::function< SolverStatus(SolverStatus const &)> const &iterationCallback={}, MultiplicationStyle mult=MultiplicationStyle::GaussSeidel) const