You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by er...@apache.org on 2013/03/19 15:51:30 UTC

svn commit: r1458323 - in /commons/proper/math/trunk/src: changes/ main/java/org/apache/commons/math3/optim/ main/java/org/apache/commons/math3/optim/nonlinear/scalar/gradient/ main/java/org/apache/commons/math3/optim/nonlinear/scalar/noderiv/ main/jav...

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 });