Author: erans Date: Tue Mar 19 14:51:30 2013 New Revision: 1458323 URL: http://svn.apache.org/r1458323 Log: MATH-949 Increment iteration counter. By default, the maximum number of iterations is "Integer.MAX_VALUE".
Modified: commons/proper/math/trunk/src/changes/changes.xml commons/proper/math/trunk/src/main/java/org/apache/commons/math3/optim/BaseOptimizer.java commons/proper/math/trunk/src/main/java/org/apache/commons/math3/optim/nonlinear/scalar/gradient/NonLinearConjugateGradientOptimizer.java commons/proper/math/trunk/src/main/java/org/apache/commons/math3/optim/nonlinear/scalar/noderiv/CMAESOptimizer.java commons/proper/math/trunk/src/main/java/org/apache/commons/math3/optim/nonlinear/scalar/noderiv/PowellOptimizer.java commons/proper/math/trunk/src/main/java/org/apache/commons/math3/optim/nonlinear/scalar/noderiv/SimplexOptimizer.java commons/proper/math/trunk/src/main/java/org/apache/commons/math3/optim/nonlinear/vector/jacobian/GaussNewtonOptimizer.java commons/proper/math/trunk/src/main/java/org/apache/commons/math3/optim/nonlinear/vector/jacobian/LevenbergMarquardtOptimizer.java commons/proper/math/trunk/src/test/java/org/apache/commons/math3/optim/nonlinear/scalar/gradient/NonLinearConjugateGradientOptimizerTest.java commons/proper/math/trunk/src/test/java/org/apache/commons/math3/optim/nonlinear/scalar/noderiv/CMAESOptimizerTest.java commons/proper/math/trunk/src/test/java/org/apache/commons/math3/optim/nonlinear/scalar/noderiv/PowellOptimizerTest.java commons/proper/math/trunk/src/test/java/org/apache/commons/math3/optim/nonlinear/scalar/noderiv/SimplexOptimizerMultiDirectionalTest.java commons/proper/math/trunk/src/test/java/org/apache/commons/math3/optim/nonlinear/scalar/noderiv/SimplexOptimizerNelderMeadTest.java commons/proper/math/trunk/src/test/java/org/apache/commons/math3/optim/nonlinear/vector/jacobian/AbstractLeastSquaresOptimizerAbstractTest.java Modified: commons/proper/math/trunk/src/changes/changes.xml URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/changes/changes.xml?rev=1458323&r1=1458322&r2=1458323&view=diff ============================================================================== --- commons/proper/math/trunk/src/changes/changes.xml (original) +++ commons/proper/math/trunk/src/changes/changes.xml Tue Mar 19 14:51:30 2013 @@ -55,6 +55,9 @@ This is a minor release: It combines bug Changes to existing features were made in a backwards-compatible way such as to allow drop-in replacement of the v3.1[.1] JAR file. "> + <action dev="erans" type="fix" issue="MATH-949"> + Increment iteration counter in optimization algorithms. + </action> <action dev="luc" type="add" issue="MATH-811" > Added a way to trigger only increasing or decreasing events in ODE integration. </action> Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math3/optim/BaseOptimizer.java URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math3/optim/BaseOptimizer.java?rev=1458323&r1=1458322&r2=1458323&view=diff ============================================================================== --- commons/proper/math/trunk/src/main/java/org/apache/commons/math3/optim/BaseOptimizer.java (original) +++ commons/proper/math/trunk/src/main/java/org/apache/commons/math3/optim/BaseOptimizer.java Tue Mar 19 14:51:30 2013 @@ -48,7 +48,7 @@ public abstract class BaseOptimizer<PAIR this.checker = checker; evaluations = new Incrementor(0, new MaxEvalCallback()); - iterations = new Incrementor(0, new MaxIterCallback()); + iterations = new Incrementor(Integer.MAX_VALUE, new MaxIterCallback()); } /** Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math3/optim/nonlinear/scalar/gradient/NonLinearConjugateGradientOptimizer.java URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math3/optim/nonlinear/scalar/gradient/NonLinearConjugateGradientOptimizer.java?rev=1458323&r1=1458322&r2=1458323&view=diff ============================================================================== --- commons/proper/math/trunk/src/main/java/org/apache/commons/math3/optim/nonlinear/scalar/gradient/NonLinearConjugateGradientOptimizer.java (original) +++ commons/proper/math/trunk/src/main/java/org/apache/commons/math3/optim/nonlinear/scalar/gradient/NonLinearConjugateGradientOptimizer.java Tue Mar 19 14:51:30 2013 @@ -211,16 +211,15 @@ public class NonLinearConjugateGradientO } PointValuePair current = null; - int iter = 0; int maxEval = getMaxEvaluations(); while (true) { - ++iter; + incrementIterationCount(); final double objective = computeObjectiveValue(point); PointValuePair previous = current; current = new PointValuePair(point, objective); if (previous != null) { - if (checker.converged(iter, previous, current)) { + if (checker.converged(getIterations(), previous, current)) { // We have found an optimum. return current; } @@ -274,7 +273,7 @@ public class NonLinearConjugateGradientO steepestDescent = newSteepestDescent; // Compute conjugate search direction. - if (iter % n == 0 || + if (getIterations() % n == 0 || beta < 0) { // Break conjugation: reset search direction. searchDirection = steepestDescent.clone(); Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math3/optim/nonlinear/scalar/noderiv/CMAESOptimizer.java URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math3/optim/nonlinear/scalar/noderiv/CMAESOptimizer.java?rev=1458323&r1=1458322&r2=1458323&view=diff ============================================================================== --- commons/proper/math/trunk/src/main/java/org/apache/commons/math3/optim/nonlinear/scalar/noderiv/CMAESOptimizer.java (original) +++ commons/proper/math/trunk/src/main/java/org/apache/commons/math3/optim/nonlinear/scalar/noderiv/CMAESOptimizer.java Tue Mar 19 14:51:30 2013 @@ -385,6 +385,8 @@ public class CMAESOptimizer generationLoop: for (iterations = 1; iterations <= maxIterations; iterations++) { + incrementIterationCount(); + // Generate and evaluate lambda offspring final RealMatrix arz = randn1(dimension, lambda); final RealMatrix arx = zeros(dimension, lambda); Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math3/optim/nonlinear/scalar/noderiv/PowellOptimizer.java URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math3/optim/nonlinear/scalar/noderiv/PowellOptimizer.java?rev=1458323&r1=1458322&r2=1458323&view=diff ============================================================================== --- commons/proper/math/trunk/src/main/java/org/apache/commons/math3/optim/nonlinear/scalar/noderiv/PowellOptimizer.java (original) +++ commons/proper/math/trunk/src/main/java/org/apache/commons/math3/optim/nonlinear/scalar/noderiv/PowellOptimizer.java Tue Mar 19 14:51:30 2013 @@ -188,9 +188,8 @@ public class PowellOptimizer double[] x = guess; double fVal = computeObjectiveValue(x); double[] x1 = x.clone(); - int iter = 0; while (true) { - ++iter; + incrementIterationCount(); double fX = fVal; double fX2 = 0; @@ -224,7 +223,7 @@ public class PowellOptimizer final PointValuePair current = new PointValuePair(x, fVal); if (!stop) { // User-defined stopping criteria. if (checker != null) { - stop = checker.converged(iter, previous, current); + stop = checker.converged(getIterations(), previous, current); } } if (stop) { Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math3/optim/nonlinear/scalar/noderiv/SimplexOptimizer.java URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math3/optim/nonlinear/scalar/noderiv/SimplexOptimizer.java?rev=1458323&r1=1458322&r2=1458323&view=diff ============================================================================== --- commons/proper/math/trunk/src/main/java/org/apache/commons/math3/optim/nonlinear/scalar/noderiv/SimplexOptimizer.java (original) +++ commons/proper/math/trunk/src/main/java/org/apache/commons/math3/optim/nonlinear/scalar/noderiv/SimplexOptimizer.java Tue Mar 19 14:51:30 2013 @@ -155,7 +155,7 @@ public class SimplexOptimizer extends Mu int iteration = 0; final ConvergenceChecker<PointValuePair> checker = getConvergenceChecker(); while (true) { - if (iteration > 0) { + if (getIterations() > 0) { boolean converged = true; for (int i = 0; i < simplex.getSize(); i++) { PointValuePair prev = previous[i]; @@ -171,7 +171,8 @@ public class SimplexOptimizer extends Mu // We still need to search. previous = simplex.getPoints(); simplex.iterate(evalFunc, comparator); - ++iteration; + + incrementIterationCount(); } } Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math3/optim/nonlinear/vector/jacobian/GaussNewtonOptimizer.java URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math3/optim/nonlinear/vector/jacobian/GaussNewtonOptimizer.java?rev=1458323&r1=1458322&r2=1458323&view=diff ============================================================================== --- commons/proper/math/trunk/src/main/java/org/apache/commons/math3/optim/nonlinear/vector/jacobian/GaussNewtonOptimizer.java (original) +++ commons/proper/math/trunk/src/main/java/org/apache/commons/math3/optim/nonlinear/vector/jacobian/GaussNewtonOptimizer.java Tue Mar 19 14:51:30 2013 @@ -103,9 +103,8 @@ public class GaussNewtonOptimizer extend // iterate until convergence is reached PointVectorValuePair current = null; - int iter = 0; for (boolean converged = false; !converged;) { - ++iter; + incrementIterationCount(); // evaluate the objective function and its jacobian PointVectorValuePair previous = current; @@ -157,7 +156,7 @@ public class GaussNewtonOptimizer extend // Check convergence. if (previous != null) { - converged = checker.converged(iter, previous, current); + converged = checker.converged(getIterations(), previous, current); if (converged) { setCost(computeCost(currentResiduals)); return current; Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math3/optim/nonlinear/vector/jacobian/LevenbergMarquardtOptimizer.java URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math3/optim/nonlinear/vector/jacobian/LevenbergMarquardtOptimizer.java?rev=1458323&r1=1458322&r2=1458323&view=diff ============================================================================== --- commons/proper/math/trunk/src/main/java/org/apache/commons/math3/optim/nonlinear/vector/jacobian/LevenbergMarquardtOptimizer.java (original) +++ commons/proper/math/trunk/src/main/java/org/apache/commons/math3/optim/nonlinear/vector/jacobian/LevenbergMarquardtOptimizer.java Tue Mar 19 14:51:30 2013 @@ -319,10 +319,10 @@ public class LevenbergMarquardtOptimizer // Outer loop. lmPar = 0; boolean firstIteration = true; - int iter = 0; final ConvergenceChecker<PointVectorValuePair> checker = getConvergenceChecker(); while (true) { - ++iter; + incrementIterationCount(); + final PointVectorValuePair previous = current; // QR decomposition of the jacobian matrix @@ -486,7 +486,7 @@ public class LevenbergMarquardtOptimizer // tests for convergence. if (checker != null) { // we use the vectorial convergence checker - if (checker.converged(iter, previous, current)) { + if (checker.converged(getIterations(), previous, current)) { setCost(currentCost); return current; } Modified: commons/proper/math/trunk/src/test/java/org/apache/commons/math3/optim/nonlinear/scalar/gradient/NonLinearConjugateGradientOptimizerTest.java URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math3/optim/nonlinear/scalar/gradient/NonLinearConjugateGradientOptimizerTest.java?rev=1458323&r1=1458322&r2=1458323&view=diff ============================================================================== --- commons/proper/math/trunk/src/test/java/org/apache/commons/math3/optim/nonlinear/scalar/gradient/NonLinearConjugateGradientOptimizerTest.java (original) +++ commons/proper/math/trunk/src/test/java/org/apache/commons/math3/optim/nonlinear/scalar/gradient/NonLinearConjugateGradientOptimizerTest.java Tue Mar 19 14:51:30 2013 @@ -136,6 +136,9 @@ public class NonLinearConjugateGradientO new InitialGuess(new double[] { 0 })); Assert.assertEquals(1.5, optimum.getPoint()[0], 1.0e-10); Assert.assertEquals(0.0, optimum.getValue(), 1.0e-10); + + // Check that the number of iterations is updated (MATH-949). + Assert.assertTrue(optimizer.getIterations() > 0); } @Test Modified: commons/proper/math/trunk/src/test/java/org/apache/commons/math3/optim/nonlinear/scalar/noderiv/CMAESOptimizerTest.java URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math3/optim/nonlinear/scalar/noderiv/CMAESOptimizerTest.java?rev=1458323&r1=1458322&r2=1458323&view=diff ============================================================================== --- commons/proper/math/trunk/src/test/java/org/apache/commons/math3/optim/nonlinear/scalar/noderiv/CMAESOptimizerTest.java (original) +++ commons/proper/math/trunk/src/test/java/org/apache/commons/math3/optim/nonlinear/scalar/noderiv/CMAESOptimizerTest.java Tue Mar 19 14:51:30 2013 @@ -49,7 +49,7 @@ public class CMAESOptimizerTest { static final int DIM = 13; static final int LAMBDA = 4 + (int)(3.*Math.log(DIM)); - + @Test(expected = NumberIsTooLargeException.class) public void testInitOutofbounds1() { double[] startPoint = point(DIM,3); @@ -510,6 +510,8 @@ public class CMAESOptimizerTest { for (int i = 0; i < dim; i++) { Assert.assertEquals(expected.getPoint()[i], result.getPoint()[i], pointTol); } + + Assert.assertTrue(optim.getIterations() > 0); } private static double[] point(int n, double value) { Modified: commons/proper/math/trunk/src/test/java/org/apache/commons/math3/optim/nonlinear/scalar/noderiv/PowellOptimizerTest.java URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math3/optim/nonlinear/scalar/noderiv/PowellOptimizerTest.java?rev=1458323&r1=1458322&r2=1458323&view=diff ============================================================================== --- commons/proper/math/trunk/src/test/java/org/apache/commons/math3/optim/nonlinear/scalar/noderiv/PowellOptimizerTest.java (original) +++ commons/proper/math/trunk/src/test/java/org/apache/commons/math3/optim/nonlinear/scalar/noderiv/PowellOptimizerTest.java Tue Mar 19 14:51:30 2013 @@ -262,5 +262,7 @@ public class PowellOptimizerTest { Assert.assertEquals("found[" + i + "]=" + point[i] + " value=" + result.getValue(), optimum[i], point[i], pointTol); } + + Assert.assertTrue(optim.getIterations() > 0); } } Modified: commons/proper/math/trunk/src/test/java/org/apache/commons/math3/optim/nonlinear/scalar/noderiv/SimplexOptimizerMultiDirectionalTest.java URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math3/optim/nonlinear/scalar/noderiv/SimplexOptimizerMultiDirectionalTest.java?rev=1458323&r1=1458322&r2=1458323&view=diff ============================================================================== --- commons/proper/math/trunk/src/test/java/org/apache/commons/math3/optim/nonlinear/scalar/noderiv/SimplexOptimizerMultiDirectionalTest.java (original) +++ commons/proper/math/trunk/src/test/java/org/apache/commons/math3/optim/nonlinear/scalar/noderiv/SimplexOptimizerMultiDirectionalTest.java Tue Mar 19 14:51:30 2013 @@ -61,6 +61,9 @@ public class SimplexOptimizerMultiDirect Assert.assertEquals(fourExtrema.valueXmYp, optimum.getValue(), 8e-13); Assert.assertTrue(optimizer.getEvaluations() > 120); Assert.assertTrue(optimizer.getEvaluations() < 150); + + // Check that the number of iterations is updated (MATH-949). + Assert.assertTrue(optimizer.getIterations() > 0); } @Test @@ -79,6 +82,9 @@ public class SimplexOptimizerMultiDirect Assert.assertEquals(fourExtrema.valueXpYm, optimum.getValue(), 2e-12); Assert.assertTrue(optimizer.getEvaluations() > 120); Assert.assertTrue(optimizer.getEvaluations() < 150); + + // Check that the number of iterations is updated (MATH-949). + Assert.assertTrue(optimizer.getIterations() > 0); } @Test @@ -97,6 +103,9 @@ public class SimplexOptimizerMultiDirect Assert.assertEquals(fourExtrema.valueXmYm, optimum.getValue(), 2e-14); Assert.assertTrue(optimizer.getEvaluations() > 120); Assert.assertTrue(optimizer.getEvaluations() < 150); + + // Check that the number of iterations is updated (MATH-949). + Assert.assertTrue(optimizer.getIterations() > 0); } @Test @@ -115,6 +124,9 @@ public class SimplexOptimizerMultiDirect Assert.assertEquals(fourExtrema.valueXpYp, optimum.getValue(), 2e-12); Assert.assertTrue(optimizer.getEvaluations() > 180); Assert.assertTrue(optimizer.getEvaluations() < 220); + + // Check that the number of iterations is updated (MATH-949). + Assert.assertTrue(optimizer.getIterations() > 0); } @Test Modified: commons/proper/math/trunk/src/test/java/org/apache/commons/math3/optim/nonlinear/scalar/noderiv/SimplexOptimizerNelderMeadTest.java URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math3/optim/nonlinear/scalar/noderiv/SimplexOptimizerNelderMeadTest.java?rev=1458323&r1=1458322&r2=1458323&view=diff ============================================================================== --- commons/proper/math/trunk/src/test/java/org/apache/commons/math3/optim/nonlinear/scalar/noderiv/SimplexOptimizerNelderMeadTest.java (original) +++ commons/proper/math/trunk/src/test/java/org/apache/commons/math3/optim/nonlinear/scalar/noderiv/SimplexOptimizerNelderMeadTest.java Tue Mar 19 14:51:30 2013 @@ -66,6 +66,9 @@ public class SimplexOptimizerNelderMeadT Assert.assertEquals(fourExtrema.valueXmYp, optimum.getValue(), 6e-12); Assert.assertTrue(optimizer.getEvaluations() > 60); Assert.assertTrue(optimizer.getEvaluations() < 90); + + // Check that the number of iterations is updated (MATH-949). + Assert.assertTrue(optimizer.getIterations() > 0); } @Test @@ -84,6 +87,9 @@ public class SimplexOptimizerNelderMeadT Assert.assertEquals(fourExtrema.valueXpYm, optimum.getValue(), 1e-11); Assert.assertTrue(optimizer.getEvaluations() > 60); Assert.assertTrue(optimizer.getEvaluations() < 90); + + // Check that the number of iterations is updated (MATH-949). + Assert.assertTrue(optimizer.getIterations() > 0); } @Test @@ -102,6 +108,9 @@ public class SimplexOptimizerNelderMeadT Assert.assertEquals(fourExtrema.valueXmYm, optimum.getValue(), 3e-12); Assert.assertTrue(optimizer.getEvaluations() > 60); Assert.assertTrue(optimizer.getEvaluations() < 90); + + // Check that the number of iterations is updated (MATH-949). + Assert.assertTrue(optimizer.getIterations() > 0); } @Test @@ -120,6 +129,9 @@ public class SimplexOptimizerNelderMeadT Assert.assertEquals(fourExtrema.valueXpYp, optimum.getValue(), 7e-12); Assert.assertTrue(optimizer.getEvaluations() > 60); Assert.assertTrue(optimizer.getEvaluations() < 90); + + // Check that the number of iterations is updated (MATH-949). + Assert.assertTrue(optimizer.getIterations() > 0); } @Test Modified: commons/proper/math/trunk/src/test/java/org/apache/commons/math3/optim/nonlinear/vector/jacobian/AbstractLeastSquaresOptimizerAbstractTest.java URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math3/optim/nonlinear/vector/jacobian/AbstractLeastSquaresOptimizerAbstractTest.java?rev=1458323&r1=1458322&r2=1458323&view=diff ============================================================================== --- commons/proper/math/trunk/src/test/java/org/apache/commons/math3/optim/nonlinear/vector/jacobian/AbstractLeastSquaresOptimizerAbstractTest.java (original) +++ commons/proper/math/trunk/src/test/java/org/apache/commons/math3/optim/nonlinear/vector/jacobian/AbstractLeastSquaresOptimizerAbstractTest.java Tue Mar 19 14:51:30 2013 @@ -106,6 +106,32 @@ public abstract class AbstractLeastSquar public abstract AbstractLeastSquaresOptimizer createOptimizer(); @Test + public void testGetIterations() { + AbstractLeastSquaresOptimizer optim = createOptimizer(); + optim.optimize(new MaxEval(100), new Target(new double[] { 1 }), + new Weight(new double[] { 1 }), + new InitialGuess(new double[] { 3 }), + new ModelFunction(new MultivariateVectorFunction() { + @Override + public double[] value(double[] point) { + return new double[] { + FastMath.pow(point[0], 4) + }; + } + }), + new ModelFunctionJacobian(new MultivariateMatrixFunction() { + @Override + public double[][] value(double[] point) { + return new double[][] { + { 0.25 * FastMath.pow(point[0], 3) } + }; + } + })); + + Assert.assertTrue(optim.getIterations() > 0); + } + + @Test public void testTrivial() { LinearProblem problem = new LinearProblem(new double[][] { { 2 } }, new double[] { 3 });