diff --git a/src/storm/solver/IterativeMinMaxLinearEquationSolver.cpp b/src/storm/solver/IterativeMinMaxLinearEquationSolver.cpp index 989db3e22..037e916a3 100644 --- a/src/storm/solver/IterativeMinMaxLinearEquationSolver.cpp +++ b/src/storm/solver/IterativeMinMaxLinearEquationSolver.cpp @@ -356,10 +356,8 @@ namespace storm { template bool IterativeMinMaxLinearEquationSolver::solveEquationsOptimisticValueIteration(Environment const& env, OptimizationDirection dir, std::vector& x, std::vector const& b) const { - // TODO: Differentiate between relative and absolute precision - // TODO: Updating solver status when iterations exceed - uint64_t overallIterations = 0; + uint64_t maxOverallIterations = env.solver().minMax().getMaximalNumberOfIterations(); uint64_t lastValueIterationIterations = 0; uint64_t currentVerificationIterations = 0; uint64_t valueIterationInvocations = 0; @@ -382,10 +380,10 @@ namespace storm { // Relative errors bool relative = env.solver().minMax().getRelativeTerminationCriterion(); - std::vector *newX = auxiliaryRowGroupVector.get(); std::vector *currentX = &x; - std::vector newUpperBound; + std::vector *newX = auxiliaryRowGroupVector.get(); std::vector currentUpperBound(currentX->size()); + std::vector newUpperBound; std::vector ubDiffV(newX->size()); std::vector boundsDiffV(currentX->size()); @@ -399,7 +397,7 @@ namespace storm { SolverStatus status = SolverStatus::InProgress; this->startMeasureProgress(); - while (status == SolverStatus::InProgress && overallIterations < env.solver().minMax().getMaximalNumberOfIterations()) { + while (status == SolverStatus::InProgress && overallIterations <= maxOverallIterations) { // Perform value iteration until convergence ++valueIterationInvocations; @@ -423,7 +421,7 @@ namespace storm { newUpperBound = currentUpperBound; // TODO: More efficient check for verification iterations - while (status == SolverStatus::InProgress && overallIterations < env.solver().minMax().getMaximalNumberOfIterations() && (currentVerificationIterations / 10) < lastValueIterationIterations) { + while (status == SolverStatus::InProgress && overallIterations <= maxOverallIterations && (currentVerificationIterations / 10) < lastValueIterationIterations) { // Perform value iteration stepwise for lower bound and guessed upper bound // Lower and upper bound iteration @@ -491,6 +489,10 @@ namespace storm { iterationPrecision = iterationPrecision / two; } + if (overallIterations > maxOverallIterations) { + status = SolverStatus::MaximalIterationsExceeded; + } + // Swap the result into the output x. if (currentX == auxiliaryRowGroupVector.get()) { std::swap(x, *currentX);