From db697e7bfc34bda19ed00055069fbdd213ee7b8d Mon Sep 17 00:00:00 2001 From: Jan Erik Karuc Date: Sun, 23 Feb 2020 17:23:13 +0100 Subject: [PATCH] Split upper bound guessing for relative and absolute --- .../IterativeMinMaxLinearEquationSolver.cpp | 22 ++++++++++++------- .../IterativeMinMaxLinearEquationSolver.h | 3 ++- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/storm/solver/IterativeMinMaxLinearEquationSolver.cpp b/src/storm/solver/IterativeMinMaxLinearEquationSolver.cpp index 8cdfa8394..989db3e22 100644 --- a/src/storm/solver/IterativeMinMaxLinearEquationSolver.cpp +++ b/src/storm/solver/IterativeMinMaxLinearEquationSolver.cpp @@ -389,9 +389,9 @@ namespace storm { std::vector ubDiffV(newX->size()); std::vector boundsDiffV(currentX->size()); - ValueType one = storm::utility::one(); ValueType two = storm::utility::convertNumber(2.0); ValueType precision = storm::utility::convertNumber(env.solver().minMax().getPrecision()); + ValueType relativeBoundGuessingScaler = (storm::utility::one() + precision); ValueType doublePrecision = precision * two; ValueType terminationPrecision = doublePrecision; ValueType iterationPrecision = precision; @@ -414,7 +414,12 @@ namespace storm { currentVerificationIterations = 0; currentUpperBound = *currentX; - guessUpperBound(*currentX, currentUpperBound, precision, relative, one); + if (relative) { + guessUpperBoundRelative(*currentX, currentUpperBound, relativeBoundGuessingScaler); + } else { + guessUpperBoundAbsolute(*currentX, currentUpperBound, precision); + } + newUpperBound = currentUpperBound; // TODO: More efficient check for verification iterations @@ -508,12 +513,13 @@ namespace storm { } template - void IterativeMinMaxLinearEquationSolver::guessUpperBound(std::vector &x, std::vector &target, ValueType const& precision, bool const& relative, ValueType const& one) const { - if (relative) { - storm::utility::vector::scaleVectorInPlace(target, (one + precision)); - } else { - storm::utility::vector::applyPointwise(x, target, [&precision] (ValueType const& argument) -> ValueType { return argument + precision; }); - } + void IterativeMinMaxLinearEquationSolver::guessUpperBoundRelative(std::vector &x, std::vector &target, ValueType const& relativeBoundGuessingScaler) const { + storm::utility::vector::scaleVectorInPlace(target, relativeBoundGuessingScaler); + } + + template + void IterativeMinMaxLinearEquationSolver::guessUpperBoundAbsolute(std::vector &x, std::vector &target, ValueType const& precision) const { + storm::utility::vector::applyPointwise(x, target, [&precision] (ValueType const& argument) -> ValueType { return argument + precision; }); } template diff --git a/src/storm/solver/IterativeMinMaxLinearEquationSolver.h b/src/storm/solver/IterativeMinMaxLinearEquationSolver.h index 65f8c1e3e..a43dde906 100644 --- a/src/storm/solver/IterativeMinMaxLinearEquationSolver.h +++ b/src/storm/solver/IterativeMinMaxLinearEquationSolver.h @@ -45,7 +45,8 @@ namespace storm { bool solveEquationsSoundValueIteration(Environment const& env, OptimizationDirection dir, std::vector& x, std::vector const& b) const; bool solveEquationsViToPi(Environment const& env, OptimizationDirection dir, std::vector& x, std::vector const& b) const; - void guessUpperBound(std::vector &x, std::vector &target, ValueType const& precision, bool const& relative, ValueType const& one) const; + void guessUpperBoundRelative(std::vector &x, std::vector &target, ValueType const& relativeBoundGuessingScaler) const; + void guessUpperBoundAbsolute(std::vector &x, std::vector &target, ValueType const& precision) const; bool solveEquationsRationalSearch(Environment const& env, OptimizationDirection dir, std::vector& x, std::vector const& b) const;