66template<storm::OptimizationDirection Dir,
bool Relative, storm::OptimizationDirection RobustDir>
68 uint64_t& numIterations, SolutionType
const& precision,
72 std::vector<SolutionType>* operand1{&operand};
73 std::vector<SolutionType>* operand2{&operand};
75 operand2 = &viOperator->allocateAuxiliaryVector(operand.size());
77 bool resultInAuxVector{
false};
81 bool applyResult = viOperator->template applyRobust<RobustDir>(*operand1, *operand2, offsets, backend);
84 }
else if (iterationCallback) {
85 status = iterationCallback(status);
88 std::swap(operand1, operand2);
89 resultInAuxVector = !resultInAuxVector;
93 if (resultInAuxVector) {
95 std::swap(*operand1, *operand2);
97 viOperator->freeAuxiliaryVector();
105 uint64_t& numIterations, SolutionType
const& precision,
108 if (adversarialRobust) {
109 return VI<Dir, Relative, invert(Dir)>(operand, offsets, numIterations, precision, iterationCallback, mult);
111 return VI<Dir, Relative, Dir>(operand, offsets, numIterations, precision, iterationCallback, mult);
117 uint64_t& numIterations,
bool relative, SolutionType
const& precision,
118 std::optional<storm::OptimizationDirection>
const& dir,
121 STORM_LOG_ASSERT(TrivialRowGrouping || dir.has_value(),
"no optimization direction given!");
122 if (!dir.has_value() ||
maximize(*dir)) {
124 return VI<storm::OptimizationDirection::Maximize, true>(operand, offsets, numIterations, precision, iterationCallback, mult, adversarialRobust);
126 return VI<storm::OptimizationDirection::Maximize, false>(operand, offsets, numIterations, precision, iterationCallback, mult, adversarialRobust);
130 return VI<storm::OptimizationDirection::Minimize, true>(operand, offsets, numIterations, precision, iterationCallback, mult, adversarialRobust);
132 return VI<storm::OptimizationDirection::Minimize, false>(operand, offsets, numIterations, precision, iterationCallback, mult, adversarialRobust);
139 bool relative, SolutionType
const& precision,
140 std::optional<storm::OptimizationDirection>
const& dir,
143 uint64_t numIterations = 0;
144 return VI(operand, offsets, numIterations, relative, precision, dir, iterationCallback, mult, adversarialRobust);
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