Author: erans Date: Thu Aug 5 14:26:13 2010 New Revision: 982639 URL: http://svn.apache.org/viewvc?rev=982639&view=rev Log: "PowellOptimizer": Added a constructor for setting of the absolute tolerance, removed one redundant function evaluation. Line search relative tolerance explicitly set in the optimizer instance created in "PowellOptimizerTest".
Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math/optimization/general/PowellOptimizer.java commons/proper/math/trunk/src/test/java/org/apache/commons/math/optimization/general/PowellOptimizerTest.java Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math/optimization/general/PowellOptimizer.java URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math/optimization/general/PowellOptimizer.java?rev=982639&r1=982638&r2=982639&view=diff ============================================================================== --- commons/proper/math/trunk/src/main/java/org/apache/commons/math/optimization/general/PowellOptimizer.java (original) +++ commons/proper/math/trunk/src/main/java/org/apache/commons/math/optimization/general/PowellOptimizer.java Thu Aug 5 14:26:13 2010 @@ -17,6 +17,8 @@ package org.apache.commons.math.optimization.general; +import java.util.Arrays; + import org.apache.commons.math.FunctionEvaluationException; import org.apache.commons.math.MaxIterationsExceededException; import org.apache.commons.math.analysis.UnivariateRealFunction; @@ -39,28 +41,49 @@ import org.apache.commons.math.optimizat public class PowellOptimizer extends AbstractScalarOptimizer { /** - * Defautl line search tolerance ({...@value}). + * Default relative tolerance for line search ({...@value}). + */ + public static final double DEFAULT_LS_RELATIVE_TOLERANCE = 1e-7; + /** + * Default absolute tolerance for line search ({...@value}). */ - public static final double DEFAULT_LINE_SEARCH_TOLERANCE = 1e-7; + public static final double DEFAULT_LS_ABSOLUTE_TOLERANCE = 1e-11; /** * Line search. */ private final LineSearch line; /** - * Constructor using the default line search tolerance (see the - * {...@link #PowellOptimizer(double) other constructor}). + * Constructor with default line search tolerances (see the + * {...@link #PowellOptimizer(double,double) other constructor}). */ public PowellOptimizer() { - this(DEFAULT_LINE_SEARCH_TOLERANCE); + this(DEFAULT_LS_RELATIVE_TOLERANCE, + DEFAULT_LS_ABSOLUTE_TOLERANCE); + } + + /** + * Constructor with default absolute line search tolerances (see + * the {...@link #PowellOptimizer(double,double) other constructor}). + * + * @param lsRelativeTolerance Relative error tolerance for + * the line search algorithm ({...@link BrentOptimizer}). + */ + public PowellOptimizer(double lsRelativeTolerance) { + this(lsRelativeTolerance, + DEFAULT_LS_ABSOLUTE_TOLERANCE); } /** - * @param lineSearchTolerance Relative error tolerance for the line search - * algorithm ({...@link BrentOptimizer}). + * @param lsRelativeTolerance Relative error tolerance for + * the line search algorithm ({...@link BrentOptimizer}). + * @param lsAbsoluteTolerance Relative error tolerance for + * the line search algorithm ({...@link BrentOptimizer}). */ - public PowellOptimizer(double lineSearchTolerance) { - line = new LineSearch(lineSearchTolerance); + public PowellOptimizer(double lsRelativeTolerance, + double lsAbsoluteTolerance) { + line = new LineSearch(lsRelativeTolerance, + lsAbsoluteTolerance); } /** {...@inheritdoc} */ @@ -89,9 +112,9 @@ public class PowellOptimizer int bigInd = 0; double alphaMin = 0; - double[] direc1 = new double[n]; + double[] direc1 = null; for (int i = 0; i < n; i++) { - direc1 = direc[i]; + direc1 = Arrays.copyOf(direc[i], n); fX2 = fVal; @@ -188,11 +211,13 @@ public class PowellOptimizer private double valueAtOptimum = Double.NaN; /** - * @param tolerance Relative tolerance. + * @param relativeTolerance Relative tolerance. + * @param absoluteTolerance Absolute tolerance. */ - public LineSearch(double tolerance) { - optim.setRelativeAccuracy(tolerance); - optim.setAbsoluteAccuracy(Math.ulp(1d)); + public LineSearch(double relativeTolerance, + double absoluteTolerance) { + optim.setRelativeAccuracy(relativeTolerance); + optim.setAbsoluteAccuracy(absoluteTolerance); } /** @@ -206,6 +231,11 @@ public class PowellOptimizer public void search(final double[] p, final double[] d) throws OptimizationException { + + // Reset. + optimum = Double.NaN; + valueAtOptimum = Double.NaN; + try { final int n = p.length; final UnivariateRealFunction f = new UnivariateRealFunction() { @@ -216,7 +246,8 @@ public class PowellOptimizer for (int i = 0; i < n; i++) { x[i] = p[i] + alpha * d[i]; } - return computeObjectiveValue(x); + final double obj = computeObjectiveValue(x); + return obj; } }; @@ -226,7 +257,7 @@ public class PowellOptimizer bracket.getLo(), bracket.getHi(), bracket.getMid()); - valueAtOptimum = f.value(optimum); + valueAtOptimum = optim.getFunctionValue(); } catch (FunctionEvaluationException e) { throw new OptimizationException(e); } catch (MaxIterationsExceededException e) { Modified: commons/proper/math/trunk/src/test/java/org/apache/commons/math/optimization/general/PowellOptimizerTest.java URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math/optimization/general/PowellOptimizerTest.java?rev=982639&r1=982638&r2=982639&view=diff ============================================================================== --- commons/proper/math/trunk/src/test/java/org/apache/commons/math/optimization/general/PowellOptimizerTest.java (original) +++ commons/proper/math/trunk/src/test/java/org/apache/commons/math/optimization/general/PowellOptimizerTest.java Thu Aug 5 14:26:13 2010 @@ -36,7 +36,7 @@ public class PowellOptimizerTest { public void testSumSinc() throws MathException { final MultivariateRealFunction func = new SumSincFunction(-1); - int dim = 10; + int dim = 2; final double[] minPoint = new double[dim]; for (int i = 0; i < dim; i++) { minPoint[i] = 0; @@ -48,13 +48,13 @@ public class PowellOptimizerTest { for (int i = 0; i < dim; i++) { init[i] = minPoint[i]; } - doTest(func, minPoint, init, GoalType.MINIMIZE, 1e-9, 1e-7); + // doTest(func, minPoint, init, GoalType.MINIMIZE, 1e-5, 1e-9, 1e-7); // Initial is far from minimum. for (int i = 0; i < dim; i++) { init[i] = minPoint[i] + 3; } - doTest(func, minPoint, init, GoalType.MINIMIZE, 1e-9, 1e-7); + doTest(func, minPoint, init, GoalType.MINIMIZE, 1e-5, 1e-9, 1e-7); } @Test @@ -80,13 +80,13 @@ public class PowellOptimizerTest { for (int i = 0; i < dim; i++) { init[i] = minPoint[i]; } - doTest(func, minPoint, init, GoalType.MINIMIZE, 1e-9, 1e-8); + doTest(func, minPoint, init, GoalType.MINIMIZE, 1e-5, 1e-9, 1e-8); // Initial is far from minimum. for (int i = 0; i < dim; i++) { init[i] = minPoint[i] - 20; } - doTest(func, minPoint, init, GoalType.MINIMIZE, 1e-9, 1e-8); + doTest(func, minPoint, init, GoalType.MINIMIZE, 1e-5, 1e-9, 1e-8); } @Test @@ -112,13 +112,13 @@ public class PowellOptimizerTest { for (int i = 0; i < dim; i++) { init[i] = maxPoint[i]; } - doTest(func, maxPoint, init, GoalType.MAXIMIZE, 1e-9, 1e-8); + doTest(func, maxPoint, init, GoalType.MAXIMIZE, 1e-5, 1e-9, 1e-8); // Initial is far from minimum. for (int i = 0; i < dim; i++) { init[i] = maxPoint[i] - 20; } - doTest(func, maxPoint, init, GoalType.MAXIMIZE, 1e-9, 1e-8); + doTest(func, maxPoint, init, GoalType.MAXIMIZE, 1e-5, 1e-9, 1e-8); } /** @@ -126,18 +126,22 @@ public class PowellOptimizerTest { * @param optimum Expected optimum. * @param init Starting point. * @param goal Minimization or maximization. - * @param objTol Tolerance (relative error on the objective function). - * @param pointTol Tolerance on the position of the optimum. + * @param xTol Tolerance (relative error on the objective function) for + * "Brent" line search algorithm used by "Powell". + * @param fTol Tolerance (relative error on the objective function) for + * "Powell" algorithm. + * @param pointTol Tolerance for checking that the optimum is correct. */ private void doTest(MultivariateRealFunction func, double[] optimum, double[] init, GoalType goal, - double objTol, + double xTol, + double fTol, double pointTol) throws MathException { - final MultivariateRealOptimizer optim = new PowellOptimizer(); - optim.setConvergenceChecker(new SimpleScalarValueChecker(objTol, -1)); + final MultivariateRealOptimizer optim = new PowellOptimizer(xTol); + optim.setConvergenceChecker(new SimpleScalarValueChecker(fTol, -1)); final RealPointValuePair result = optim.optimize(func, goal, init); final double[] found = result.getPoint();