67template<storm::OptimizationDirection Dir,
bool Relative, storm::OptimizationDirection RobustDir>
69 uint64_t& numIterations, SolutionType
const& precision,
73 std::vector<SolutionType>* operand1{&operand};
74 std::vector<SolutionType>* operand2{&operand};
76 operand2 = &viOperator->allocateAuxiliaryVector(operand.size());
78 bool resultInAuxVector{
false};
82 bool applyResult = viOperator->template applyRobust<RobustDir>(*operand1, *operand2, offsets, backend);
85 }
else if (iterationCallback) {
86 status = iterationCallback(status);
89 std::swap(operand1, operand2);
90 resultInAuxVector = !resultInAuxVector;
94 if (resultInAuxVector) {
96 std::swap(*operand1, *operand2);
98 viOperator->freeAuxiliaryVector();
106 uint64_t& numIterations, SolutionType
const& precision,
110 bool robustUncertainty =
false;
111 if (storm::IsIntervalType<ValueType>) {
115 if (robustUncertainty) {
116 return VI<Dir, Relative, invert(Dir)>(operand, offsets, numIterations, precision, iterationCallback, mult);
118 return VI<Dir, Relative, Dir>(operand, offsets, numIterations, precision, iterationCallback, mult);
124 uint64_t& numIterations,
bool relative, SolutionType
const& precision,
125 std::optional<storm::OptimizationDirection>
const& dir,
129 if (storm::IsIntervalType<ValueType>) {
130 STORM_LOG_THROW(uncertaintyResolutionMode != UncertaintyResolutionMode::Unset, storm::exceptions::IllegalFunctionCallException,
131 "Uncertainty resolution mode must be set for uncertain (interval) models.");
132 STORM_LOG_THROW(dir.has_value() || (uncertaintyResolutionMode != UncertaintyResolutionMode::Robust &&
133 uncertaintyResolutionMode != UncertaintyResolutionMode::Cooperative),
134 storm::exceptions::IllegalFunctionCallException,
135 "Robust or cooperative nature resolution modes cannot be used if optimization direction is not set.");
138 STORM_LOG_ASSERT(TrivialRowGrouping || dir.has_value(),
"no optimization direction given!");
139 if (!dir.has_value() ||
maximize(*dir)) {
141 return VI<storm::OptimizationDirection::Maximize, true>(operand, offsets, numIterations, precision, iterationCallback, mult,
142 uncertaintyResolutionMode);
144 return VI<storm::OptimizationDirection::Maximize, false>(operand, offsets, numIterations, precision, iterationCallback, mult,
145 uncertaintyResolutionMode);
149 return VI<storm::OptimizationDirection::Minimize, true>(operand, offsets, numIterations, precision, iterationCallback, mult,
150 uncertaintyResolutionMode);
152 return VI<storm::OptimizationDirection::Minimize, false>(operand, offsets, numIterations, precision, iterationCallback, mult,
153 uncertaintyResolutionMode);
160 bool relative, SolutionType
const& precision,
161 std::optional<storm::OptimizationDirection>
const& dir,
165 uint64_t numIterations = 0;
166 return VI(operand, offsets, numIterations, relative, precision, dir, iterationCallback, mult, uncertaintyResolutionMode);
SolverStatus VI(std::vector< SolutionType > &operand, std::vector< ValueType > const &offsets, uint64_t &numIterations, SolutionType const &precision, std::function< SolverStatus(SolverStatus const &)> const &iterationCallback={}, MultiplicationStyle mult=MultiplicationStyle::GaussSeidel) const