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 2010/08/30 15:06:24 UTC

svn commit: r990792 [5/5] - in /commons/proper/math/trunk/src: main/java/org/apache/commons/math/ main/java/org/apache/commons/math/optimization/ main/java/org/apache/commons/math/optimization/direct/ main/java/org/apache/commons/math/optimization/fitt...

Modified: commons/proper/math/trunk/src/test/java/org/apache/commons/math/optimization/general/LevenbergMarquardtOptimizerTest.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math/optimization/general/LevenbergMarquardtOptimizerTest.java?rev=990792&r1=990791&r2=990792&view=diff
==============================================================================
--- commons/proper/math/trunk/src/test/java/org/apache/commons/math/optimization/general/LevenbergMarquardtOptimizerTest.java (original)
+++ commons/proper/math/trunk/src/test/java/org/apache/commons/math/optimization/general/LevenbergMarquardtOptimizerTest.java Mon Aug 30 13:06:22 2010
@@ -26,11 +26,13 @@ import java.util.List;
 import junit.framework.TestCase;
 
 import org.apache.commons.math.FunctionEvaluationException;
+import org.apache.commons.math.exception.ConvergenceException;
+import org.apache.commons.math.exception.DimensionMismatchException;
+import org.apache.commons.math.exception.TooManyEvaluationsException;
 import org.apache.commons.math.analysis.DifferentiableMultivariateVectorialFunction;
 import org.apache.commons.math.analysis.MultivariateMatrixFunction;
 import org.apache.commons.math.linear.BlockRealMatrix;
 import org.apache.commons.math.linear.RealMatrix;
-import org.apache.commons.math.optimization.OptimizationException;
 import org.apache.commons.math.optimization.SimpleVectorialValueChecker;
 import org.apache.commons.math.optimization.VectorialPointValuePair;
 import org.apache.commons.math.util.FastMath;
@@ -104,7 +106,7 @@ public class LevenbergMarquardtOptimizer
         super(name);
     }
 
-    public void testTrivial() throws FunctionEvaluationException, OptimizationException {
+    public void testTrivial() throws FunctionEvaluationException {
         LinearProblem problem =
             new LinearProblem(new double[][] { { 2 } }, new double[] { 3 });
         LevenbergMarquardtOptimizer optimizer = new LevenbergMarquardtOptimizer();
@@ -114,7 +116,7 @@ public class LevenbergMarquardtOptimizer
         try {
             optimizer.guessParametersErrors();
             fail("an exception should have been thrown");
-        } catch (OptimizationException ee) {
+        } catch (ConvergenceException ee) {
             // expected behavior
         } catch (Exception e) {
             fail("wrong exception caught");
@@ -123,7 +125,7 @@ public class LevenbergMarquardtOptimizer
         assertEquals(3.0, optimum.getValue()[0], 1.0e-10);
     }
 
-    public void testQRColumnsPermutation() throws FunctionEvaluationException, OptimizationException {
+    public void testQRColumnsPermutation() throws FunctionEvaluationException {
 
         LinearProblem problem =
             new LinearProblem(new double[][] { { 1.0, -1.0 }, { 0.0, 2.0 }, { 1.0, -2.0 } },
@@ -141,7 +143,7 @@ public class LevenbergMarquardtOptimizer
 
     }
 
-    public void testNoDependency() throws FunctionEvaluationException, OptimizationException {
+    public void testNoDependency() throws FunctionEvaluationException {
         LinearProblem problem = new LinearProblem(new double[][] {
                 { 2, 0, 0, 0, 0, 0 },
                 { 0, 2, 0, 0, 0, 0 },
@@ -160,7 +162,7 @@ public class LevenbergMarquardtOptimizer
         }
     }
 
-    public void testOneSet() throws FunctionEvaluationException, OptimizationException {
+    public void testOneSet() throws FunctionEvaluationException {
 
         LinearProblem problem = new LinearProblem(new double[][] {
                 {  1,  0, 0 },
@@ -177,7 +179,7 @@ public class LevenbergMarquardtOptimizer
 
     }
 
-    public void testTwoSets() throws FunctionEvaluationException, OptimizationException {
+    public void testTwoSets() throws FunctionEvaluationException {
         double epsilon = 1.0e-7;
         LinearProblem problem = new LinearProblem(new double[][] {
                 {  2,  1,   0,  4,       0, 0 },
@@ -202,7 +204,7 @@ public class LevenbergMarquardtOptimizer
 
     }
 
-    public void testNonInversible() throws FunctionEvaluationException, OptimizationException {
+    public void testNonInversible() throws FunctionEvaluationException {
 
         LinearProblem problem = new LinearProblem(new double[][] {
                 {  1, 2, -3 },
@@ -216,7 +218,7 @@ public class LevenbergMarquardtOptimizer
         try {
             optimizer.getCovariances();
             fail("an exception should have been thrown");
-        } catch (OptimizationException ee) {
+        } catch (ConvergenceException ee) {
             // expected behavior
         } catch (Exception e) {
             fail("wrong exception caught");
@@ -224,7 +226,7 @@ public class LevenbergMarquardtOptimizer
 
     }
 
-    public void testIllConditioned() throws FunctionEvaluationException, OptimizationException {
+    public void testIllConditioned() throws FunctionEvaluationException {
         LinearProblem problem1 = new LinearProblem(new double[][] {
                 { 10.0, 7.0,  8.0,  7.0 },
                 {  7.0, 5.0,  6.0,  5.0 },
@@ -258,7 +260,7 @@ public class LevenbergMarquardtOptimizer
 
     }
 
-    public void testMoreEstimatedParametersSimple() throws FunctionEvaluationException, OptimizationException {
+    public void testMoreEstimatedParametersSimple() throws FunctionEvaluationException {
 
         LinearProblem problem = new LinearProblem(new double[][] {
                 { 3.0, 2.0,  0.0, 0.0 },
@@ -273,7 +275,7 @@ public class LevenbergMarquardtOptimizer
 
     }
 
-    public void testMoreEstimatedParametersUnsorted() throws FunctionEvaluationException, OptimizationException {
+    public void testMoreEstimatedParametersUnsorted() throws FunctionEvaluationException {
         LinearProblem problem = new LinearProblem(new double[][] {
                 { 1.0, 1.0,  0.0,  0.0, 0.0,  0.0 },
                 { 0.0, 0.0,  1.0,  1.0, 1.0,  0.0 },
@@ -294,7 +296,7 @@ public class LevenbergMarquardtOptimizer
 
     }
 
-    public void testRedundantEquations() throws FunctionEvaluationException, OptimizationException {
+    public void testRedundantEquations() throws FunctionEvaluationException {
         LinearProblem problem = new LinearProblem(new double[][] {
                 { 1.0,  1.0 },
                 { 1.0, -1.0 },
@@ -311,7 +313,7 @@ public class LevenbergMarquardtOptimizer
 
     }
 
-    public void testInconsistentEquations() throws FunctionEvaluationException, OptimizationException {
+    public void testInconsistentEquations() throws FunctionEvaluationException {
         LinearProblem problem = new LinearProblem(new double[][] {
                 { 1.0,  1.0 },
                 { 1.0, -1.0 },
@@ -324,7 +326,7 @@ public class LevenbergMarquardtOptimizer
 
     }
 
-    public void testInconsistentSizes() throws FunctionEvaluationException, OptimizationException {
+    public void testInconsistentSizes() throws FunctionEvaluationException {
         LinearProblem problem =
             new LinearProblem(new double[][] { { 1, 0 }, { 0, 1 } }, new double[] { -1, 1 });
         LevenbergMarquardtOptimizer optimizer = new LevenbergMarquardtOptimizer();
@@ -340,7 +342,7 @@ public class LevenbergMarquardtOptimizer
                                new double[] { 1 },
                                new double[] { 0, 0 });
             fail("an exception should have been thrown");
-        } catch (OptimizationException oe) {
+        } catch (DimensionMismatchException oe) {
             // expected behavior
         } catch (Exception e) {
             fail("wrong exception caught");
@@ -380,23 +382,23 @@ public class LevenbergMarquardtOptimizer
         try {
             LevenbergMarquardtOptimizer optimizer = new LevenbergMarquardtOptimizer();
             optimizer.setInitialStepBoundFactor(initialStepBoundFactor);
-            optimizer.setMaxIterations(maxCostEval);
+            optimizer.setMaxEvaluations(maxCostEval);
             optimizer.setCostRelativeTolerance(costRelativeTolerance);
             optimizer.setParRelativeTolerance(parRelativeTolerance);
             optimizer.setOrthoTolerance(orthoTolerance);
             optimizer.optimize(problem, new double[] { 0, 0, 0, 0, 0 }, new double[] { 1, 1, 1, 1, 1 },
                                new double[] { 98.680, 47.345 });
-            assertTrue(! shouldFail);
-        } catch (OptimizationException ee) {
-            assertTrue(shouldFail);
+            assertTrue(!shouldFail);
         } catch (FunctionEvaluationException ee) {
             assertTrue(shouldFail);
+        } catch (TooManyEvaluationsException ee) {
+            assertTrue(shouldFail);
         } catch (Exception e) {
             fail("wrong exception type caught");
         }
     }
 
-    public void testCircleFitting() throws FunctionEvaluationException, OptimizationException {
+    public void testCircleFitting() throws FunctionEvaluationException {
         Circle circle = new Circle();
         circle.addPoint( 30.0,  68.0);
         circle.addPoint( 50.0,  -6.0);
@@ -445,7 +447,7 @@ public class LevenbergMarquardtOptimizer
 
     }
 
-    public void testCircleFittingBadInit() throws FunctionEvaluationException, OptimizationException {
+    public void testCircleFittingBadInit() throws FunctionEvaluationException {
         Circle circle = new Circle();
         double[][] points = new double[][] {
                 {-0.312967,  0.072366}, {-0.339248,  0.132965}, {-0.379780,  0.202724},
@@ -513,7 +515,7 @@ public class LevenbergMarquardtOptimizer
                                new double[] { 0.0, 4.4e-323, 1.0, 4.4e-323, 0.0 },
                                new double[] { 0, 0, 0 });
             fail("an exception should have been thrown");
-        } catch (OptimizationException ee) {
+        } catch (ConvergenceException ee) {
             // expected behavior
         }
 

Modified: commons/proper/math/trunk/src/test/java/org/apache/commons/math/optimization/general/MinpackTest.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math/optimization/general/MinpackTest.java?rev=990792&r1=990791&r2=990792&view=diff
==============================================================================
--- commons/proper/math/trunk/src/test/java/org/apache/commons/math/optimization/general/MinpackTest.java (original)
+++ commons/proper/math/trunk/src/test/java/org/apache/commons/math/optimization/general/MinpackTest.java Mon Aug 30 13:06:22 2010
@@ -23,9 +23,9 @@ import java.util.Arrays;
 import junit.framework.TestCase;
 
 import org.apache.commons.math.FunctionEvaluationException;
+import org.apache.commons.math.exception.TooManyEvaluationsException;
 import org.apache.commons.math.analysis.DifferentiableMultivariateVectorialFunction;
 import org.apache.commons.math.analysis.MultivariateMatrixFunction;
-import org.apache.commons.math.optimization.OptimizationException;
 import org.apache.commons.math.optimization.VectorialPointValuePair;
 import org.apache.commons.math.util.FastMath;
 
@@ -490,7 +490,7 @@ public class MinpackTest extends TestCas
 
   private void minpackTest(MinpackFunction function, boolean exceptionExpected) {
       LevenbergMarquardtOptimizer optimizer = new LevenbergMarquardtOptimizer();
-      optimizer.setMaxIterations(100 * (function.getN() + 1));
+      optimizer.setMaxEvaluations(400 * (function.getN() + 1));
       optimizer.setCostRelativeTolerance(FastMath.sqrt(2.22044604926e-16));
       optimizer.setParRelativeTolerance(FastMath.sqrt(2.22044604926e-16));
       optimizer.setOrthoTolerance(2.22044604926e-16);
@@ -503,7 +503,7 @@ public class MinpackTest extends TestCas
           assertFalse(exceptionExpected);
           function.checkTheoreticalMinCost(optimizer.getRMS());
           function.checkTheoreticalMinParams(optimum);
-      } catch (OptimizationException lsse) {
+      } catch (TooManyEvaluationsException e) {
           assertTrue(exceptionExpected);
       } catch (FunctionEvaluationException fe) {
           assertTrue(exceptionExpected);

Modified: commons/proper/math/trunk/src/test/java/org/apache/commons/math/optimization/general/NonLinearConjugateGradientOptimizerTest.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math/optimization/general/NonLinearConjugateGradientOptimizerTest.java?rev=990792&r1=990791&r2=990792&view=diff
==============================================================================
--- commons/proper/math/trunk/src/test/java/org/apache/commons/math/optimization/general/NonLinearConjugateGradientOptimizerTest.java (original)
+++ commons/proper/math/trunk/src/test/java/org/apache/commons/math/optimization/general/NonLinearConjugateGradientOptimizerTest.java Mon Aug 30 13:06:22 2010
@@ -109,7 +109,7 @@ extends TestCase {
             new LinearProblem(new double[][] { { 2 } }, new double[] { 3 });
         NonLinearConjugateGradientOptimizer optimizer =
             new NonLinearConjugateGradientOptimizer(ConjugateGradientFormula.POLAK_RIBIERE);
-        optimizer.setMaxIterations(100);
+        optimizer.setMaxEvaluations(100);
         optimizer.setConvergenceChecker(new SimpleScalarValueChecker(1.0e-6, 1.0e-6));
         RealPointValuePair optimum =
             optimizer.optimize(problem, GoalType.MINIMIZE, new double[] { 0 });
@@ -125,7 +125,7 @@ extends TestCase {
 
         NonLinearConjugateGradientOptimizer optimizer =
             new NonLinearConjugateGradientOptimizer(ConjugateGradientFormula.POLAK_RIBIERE);
-        optimizer.setMaxIterations(100);
+        optimizer.setMaxEvaluations(100);
         optimizer.setConvergenceChecker(new SimpleScalarValueChecker(1.0e-6, 1.0e-6));
         RealPointValuePair optimum =
             optimizer.optimize(problem, GoalType.MINIMIZE, new double[] { 0, 0 });
@@ -146,7 +146,7 @@ extends TestCase {
         }, new double[] { 0.0, 1.1, 2.2, 3.3, 4.4, 5.5 });
         NonLinearConjugateGradientOptimizer optimizer =
             new NonLinearConjugateGradientOptimizer(ConjugateGradientFormula.POLAK_RIBIERE);
-        optimizer.setMaxIterations(100);
+        optimizer.setMaxEvaluations(100);
         optimizer.setConvergenceChecker(new SimpleScalarValueChecker(1.0e-6, 1.0e-6));
         RealPointValuePair optimum =
             optimizer.optimize(problem, GoalType.MINIMIZE, new double[] { 0, 0, 0, 0, 0, 0 });
@@ -164,7 +164,7 @@ extends TestCase {
         }, new double[] { 1, 1, 1});
         NonLinearConjugateGradientOptimizer optimizer =
             new NonLinearConjugateGradientOptimizer(ConjugateGradientFormula.POLAK_RIBIERE);
-        optimizer.setMaxIterations(100);
+        optimizer.setMaxEvaluations(100);
         optimizer.setConvergenceChecker(new SimpleScalarValueChecker(1.0e-6, 1.0e-6));
         RealPointValuePair optimum =
             optimizer.optimize(problem, GoalType.MINIMIZE, new double[] { 0, 0, 0 });
@@ -187,7 +187,7 @@ extends TestCase {
 
         NonLinearConjugateGradientOptimizer optimizer =
             new NonLinearConjugateGradientOptimizer(ConjugateGradientFormula.POLAK_RIBIERE);
-        optimizer.setMaxIterations(100);
+        optimizer.setMaxEvaluations(100);
         optimizer.setPreconditioner(new Preconditioner() {
             public double[] precondition(double[] point, double[] r) {
                 double[] d = r.clone();
@@ -222,7 +222,7 @@ extends TestCase {
         }, new double[] { 1, 1, 1 });
         NonLinearConjugateGradientOptimizer optimizer =
             new NonLinearConjugateGradientOptimizer(ConjugateGradientFormula.POLAK_RIBIERE);
-        optimizer.setMaxIterations(100);
+        optimizer.setMaxEvaluations(100);
         optimizer.setConvergenceChecker(new SimpleScalarValueChecker(1.0e-6, 1.0e-6));
         RealPointValuePair optimum =
                 optimizer.optimize(problem, GoalType.MINIMIZE, new double[] { 0, 0, 0 });
@@ -238,7 +238,7 @@ extends TestCase {
         }, new double[] { 32, 23, 33, 31 });
         NonLinearConjugateGradientOptimizer optimizer =
             new NonLinearConjugateGradientOptimizer(ConjugateGradientFormula.POLAK_RIBIERE);
-        optimizer.setMaxIterations(100);
+        optimizer.setMaxEvaluations(100);
         optimizer.setConvergenceChecker(new SimpleScalarValueChecker(1.0e-13, 1.0e-13));
         BrentSolver solver = new BrentSolver();
         solver.setAbsoluteAccuracy(1.0e-15);
@@ -277,7 +277,7 @@ extends TestCase {
 
         NonLinearConjugateGradientOptimizer optimizer =
             new NonLinearConjugateGradientOptimizer(ConjugateGradientFormula.POLAK_RIBIERE);
-        optimizer.setMaxIterations(100);
+        optimizer.setMaxEvaluations(100);
         optimizer.setConvergenceChecker(new SimpleScalarValueChecker(1.0e-6, 1.0e-6));
         RealPointValuePair optimum =
             optimizer.optimize(problem, GoalType.MINIMIZE, new double[] { 7, 6, 5, 4 });
@@ -296,7 +296,7 @@ extends TestCase {
         }, new double[] { 3.0, 12.0, -1.0, 7.0, 1.0 });
         NonLinearConjugateGradientOptimizer optimizer =
             new NonLinearConjugateGradientOptimizer(ConjugateGradientFormula.POLAK_RIBIERE);
-        optimizer.setMaxIterations(100);
+        optimizer.setMaxEvaluations(100);
         optimizer.setConvergenceChecker(new SimpleScalarValueChecker(1.0e-6, 1.0e-6));
         RealPointValuePair optimum =
             optimizer.optimize(problem, GoalType.MINIMIZE, new double[] { 2, 2, 2, 2, 2, 2 });
@@ -312,7 +312,7 @@ extends TestCase {
 
         NonLinearConjugateGradientOptimizer optimizer =
             new NonLinearConjugateGradientOptimizer(ConjugateGradientFormula.POLAK_RIBIERE);
-        optimizer.setMaxIterations(100);
+        optimizer.setMaxEvaluations(100);
         optimizer.setConvergenceChecker(new SimpleScalarValueChecker(1.0e-6, 1.0e-6));
         RealPointValuePair optimum =
             optimizer.optimize(problem, GoalType.MINIMIZE, new double[] { 1, 1 });
@@ -330,7 +330,7 @@ extends TestCase {
 
         NonLinearConjugateGradientOptimizer optimizer =
             new NonLinearConjugateGradientOptimizer(ConjugateGradientFormula.POLAK_RIBIERE);
-        optimizer.setMaxIterations(100);
+        optimizer.setMaxEvaluations(100);
         optimizer.setConvergenceChecker(new SimpleScalarValueChecker(1.0e-6, 1.0e-6));
         RealPointValuePair optimum =
             optimizer.optimize(problem, GoalType.MINIMIZE, new double[] { 1, 1 });
@@ -347,7 +347,7 @@ extends TestCase {
         circle.addPoint( 45.0,  97.0);
         NonLinearConjugateGradientOptimizer optimizer =
             new NonLinearConjugateGradientOptimizer(ConjugateGradientFormula.POLAK_RIBIERE);
-        optimizer.setMaxIterations(100);
+        optimizer.setMaxEvaluations(100);
         optimizer.setConvergenceChecker(new SimpleScalarValueChecker(1.0e-30, 1.0e-30));
         BrentSolver solver = new BrentSolver();
         solver.setAbsoluteAccuracy(1.0e-13);

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=990792&r1=990791&r2=990792&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 Mon Aug 30 13:06:22 2010
@@ -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-5, 1e-9, 1e-7);
+        doTest(func, minPoint, init,  GoalType.MINIMIZE, 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-5, 1e-9, 1e-7);
+        doTest(func, minPoint, init,  GoalType.MINIMIZE, 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-5, 1e-9, 1e-8);
+        doTest(func, minPoint, init, GoalType.MINIMIZE, 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-5, 1e-9, 1e-8);
+        doTest(func, minPoint, init, GoalType.MINIMIZE, 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-5, 1e-9, 1e-8);
+        doTest(func, maxPoint, init,  GoalType.MAXIMIZE, 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-5, 1e-9, 1e-8);
+        doTest(func, maxPoint, init, GoalType.MAXIMIZE, 1e-9, 1e-8);
     }
 
     /**
@@ -126,8 +126,6 @@ public class PowellOptimizerTest {
      * @param optimum Expected optimum.
      * @param init Starting point.
      * @param goal Minimization or maximization.
-     * @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.
@@ -136,12 +134,12 @@ public class PowellOptimizerTest {
                         double[] optimum,
                         double[] init,
                         GoalType goal,
-                        double xTol,
                         double fTol,
                         double pointTol)
         throws MathException {
-        final MultivariateRealOptimizer optim = new PowellOptimizer(xTol);
-        optim.setConvergenceChecker(new SimpleScalarValueChecker(fTol, -1));
+        final MultivariateRealOptimizer optim = new PowellOptimizer();
+        optim.setMaxEvaluations(1000);
+        optim.setConvergenceChecker(new SimpleScalarValueChecker(fTol, Math.ulp(1d)));
 
         final RealPointValuePair result = optim.optimize(func, goal, init);
         final double[] found = result.getPoint();

Modified: commons/proper/math/trunk/src/test/java/org/apache/commons/math/optimization/univariate/BracketFinderTest.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math/optimization/univariate/BracketFinderTest.java?rev=990792&r1=990791&r2=990792&view=diff
==============================================================================
--- commons/proper/math/trunk/src/test/java/org/apache/commons/math/optimization/univariate/BracketFinderTest.java (original)
+++ commons/proper/math/trunk/src/test/java/org/apache/commons/math/optimization/univariate/BracketFinderTest.java Mon Aug 30 13:06:22 2010
@@ -24,6 +24,9 @@ import org.apache.commons.math.optimizat
 import org.junit.Assert;
 import org.junit.Test;
 
+/**
+ * Test for {@link BracketFinder}.
+ */
 public class BracketFinderTest {
 
     @Test
@@ -70,4 +73,52 @@ public class BracketFinderTest {
         Assert.assertEquals(-1, bFind.getMid(), tol);
         Assert.assertEquals(0.61803399999999997, bFind.getHi(), tol);
     }
+
+    @Test
+    public void testMinimumIsOnIntervalBoundary() throws MathException {
+        final UnivariateRealFunction func = new UnivariateRealFunction() {
+                public double value(double x)
+                    throws FunctionEvaluationException {
+                    return x * x;
+                }
+            };
+
+        final BracketFinder bFind = new BracketFinder();
+
+        bFind.search(func, GoalType.MINIMIZE, 0, 1);
+        Assert.assertTrue(bFind.getLo() <= 0);
+        Assert.assertTrue(0 <= bFind.getHi());
+
+        bFind.search(func, GoalType.MINIMIZE, -1, 0);
+        Assert.assertTrue(bFind.getLo() <= 0);
+        Assert.assertTrue(0 <= bFind.getHi());
+    }
+
+    @Test
+    public void testIntervalBoundsOrdering() throws MathException {
+        final UnivariateRealFunction func = new UnivariateRealFunction() {
+                public double value(double x)
+                    throws FunctionEvaluationException {
+                    return x * x;
+                }
+            };
+
+        final BracketFinder bFind = new BracketFinder();
+
+        bFind.search(func, GoalType.MINIMIZE, -1, 1);
+        Assert.assertTrue(bFind.getLo() <= 0);
+        Assert.assertTrue(0 <= bFind.getHi());
+
+        bFind.search(func, GoalType.MINIMIZE, 1, -1);
+        Assert.assertTrue(bFind.getLo() <= 0);
+        Assert.assertTrue(0 <= bFind.getHi());
+
+        bFind.search(func, GoalType.MINIMIZE, 1, 2);
+        Assert.assertTrue(bFind.getLo() <= 0);
+        Assert.assertTrue(0 <= bFind.getHi());
+
+        bFind.search(func, GoalType.MINIMIZE, 2, 1);
+        Assert.assertTrue(bFind.getLo() <= 0);
+        Assert.assertTrue(0 <= bFind.getHi());
+    }
 }

Modified: commons/proper/math/trunk/src/test/java/org/apache/commons/math/optimization/univariate/BrentOptimizerTest.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math/optimization/univariate/BrentOptimizerTest.java?rev=990792&r1=990791&r2=990792&view=diff
==============================================================================
--- commons/proper/math/trunk/src/test/java/org/apache/commons/math/optimization/univariate/BrentOptimizerTest.java (original)
+++ commons/proper/math/trunk/src/test/java/org/apache/commons/math/optimization/univariate/BrentOptimizerTest.java Mon Aug 30 13:06:22 2010
@@ -20,17 +20,14 @@ import static org.junit.Assert.assertEqu
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
-import org.apache.commons.math.FunctionEvaluationException;
 import org.apache.commons.math.MathException;
-import org.apache.commons.math.MaxIterationsExceededException;
-import org.apache.commons.math.exception.NoDataException;
+import org.apache.commons.math.FunctionEvaluationException;
+import org.apache.commons.math.exception.TooManyEvaluationsException;
 import org.apache.commons.math.analysis.QuinticFunction;
 import org.apache.commons.math.analysis.SinFunction;
 import org.apache.commons.math.analysis.UnivariateRealFunction;
 import org.apache.commons.math.optimization.GoalType;
-import org.apache.commons.math.optimization.UnivariateRealOptimizer;
 import org.apache.commons.math.stat.descriptive.DescriptiveStatistics;
-import org.apache.commons.math.util.FastMath;
 import org.junit.Test;
 
 /**
@@ -41,28 +38,22 @@ public final class BrentOptimizerTest {
     @Test
     public void testSinMin() throws MathException {
         UnivariateRealFunction f = new SinFunction();
-        UnivariateRealOptimizer minimizer = new BrentOptimizer();
-        minimizer.setMaxEvaluations(200);
-        assertEquals(200, minimizer.getMaxEvaluations());
-        try {
-            minimizer.getResult();
-            fail("an exception should have been thrown");
-        } catch (NoDataException ise) {
-            // expected
-        } catch (Exception e) {
-            fail("wrong exception caught");
-        }
-        assertEquals(3 * FastMath.PI / 2, minimizer.optimize(f, GoalType.MINIMIZE, 4, 5), 10 * minimizer.getRelativeAccuracy());
-        assertTrue(minimizer.getIterationCount() <= 50);
-        assertEquals(3 * FastMath.PI / 2, minimizer.optimize(f, GoalType.MINIMIZE, 1, 5), 10 * minimizer.getRelativeAccuracy());
-        assertTrue(minimizer.getIterationCount() <= 50);
-        assertTrue(minimizer.getEvaluations()    <= 100);
-        assertTrue(minimizer.getEvaluations()    >=  15);
-        minimizer.setMaxEvaluations(10);
+        UnivariateRealOptimizer optimizer = new BrentOptimizer();
+        optimizer.setConvergenceChecker(new BrentOptimizer.BrentConvergenceChecker(1e-10, 1e-14));
+        optimizer.setMaxEvaluations(200);
+        assertEquals(200, optimizer.getMaxEvaluations());
+        assertEquals(3 * Math.PI / 2, optimizer.optimize(f, GoalType.MINIMIZE, 4, 5).getPoint(),
+                     100 * optimizer.getConvergenceChecker().getRelativeThreshold());
+        assertTrue(optimizer.getEvaluations() <= 50);
+        assertEquals(3 * Math.PI / 2, optimizer.optimize(f, GoalType.MINIMIZE, 1, 5).getPoint(),
+                     100 * optimizer.getConvergenceChecker().getRelativeThreshold());
+        assertTrue(optimizer.getEvaluations() <= 100);
+        assertTrue(optimizer.getEvaluations() >= 15);
+        optimizer.setMaxEvaluations(10);
         try {
-            minimizer.optimize(f, GoalType.MINIMIZE, 4, 5);
+            optimizer.optimize(f, GoalType.MINIMIZE, 4, 5);
             fail("an exception should have been thrown");
-        } catch (FunctionEvaluationException fee) {
+        } catch (TooManyEvaluationsException fee) {
             // expected
         } catch (Exception e) {
             fail("wrong exception caught");
@@ -73,25 +64,27 @@ public final class BrentOptimizerTest {
     public void testQuinticMin() throws MathException {
         // The function has local minima at -0.27195613 and 0.82221643.
         UnivariateRealFunction f = new QuinticFunction();
-        UnivariateRealOptimizer minimizer = new BrentOptimizer();
-        assertEquals(-0.27195613, minimizer.optimize(f, GoalType.MINIMIZE, -0.3, -0.2), 1.0e-8);
-        assertEquals( 0.82221643, minimizer.optimize(f, GoalType.MINIMIZE,  0.3,  0.9), 1.0e-8);
-        assertTrue(minimizer.getIterationCount() <= 50);
+        UnivariateRealOptimizer optimizer = new BrentOptimizer();
+        optimizer.setConvergenceChecker(new BrentOptimizer.BrentConvergenceChecker(1e-10, 1e-14));
+        optimizer.setMaxEvaluations(200);
+        assertEquals(-0.27195613, optimizer.optimize(f, GoalType.MINIMIZE, -0.3, -0.2).getPoint(), 1.0e-8);
+        assertEquals( 0.82221643, optimizer.optimize(f, GoalType.MINIMIZE,  0.3,  0.9).getPoint(), 1.0e-8);
+        assertTrue(optimizer.getEvaluations() <= 50);
 
         // search in a large interval
-        assertEquals(-0.27195613, minimizer.optimize(f, GoalType.MINIMIZE, -1.0, 0.2), 1.0e-8);
-        assertTrue(minimizer.getIterationCount() <= 50);
+        assertEquals(-0.27195613, optimizer.optimize(f, GoalType.MINIMIZE, -1.0, 0.2).getPoint(), 1.0e-8);
+        assertTrue(optimizer.getEvaluations() <= 50);
     }
 
     @Test
     public void testQuinticMinStatistics() throws MathException {
         // The function has local minima at -0.27195613 and 0.82221643.
         UnivariateRealFunction f = new QuinticFunction();
-        UnivariateRealOptimizer minimizer = new BrentOptimizer();
-        minimizer.setRelativeAccuracy(1e-10);
-        minimizer.setAbsoluteAccuracy(1e-11);
+        UnivariateRealOptimizer optimizer = new BrentOptimizer();
+        optimizer.setConvergenceChecker(new BrentOptimizer.BrentConvergenceChecker(1e-12, 1e-14));
+        optimizer.setMaxEvaluations(40);
 
-        final DescriptiveStatistics[] stat = new DescriptiveStatistics[3];
+        final DescriptiveStatistics[] stat = new DescriptiveStatistics[2];
         for (int i = 0; i < stat.length; i++) {
             stat[i] = new DescriptiveStatistics();
         }
@@ -102,31 +95,29 @@ public final class BrentOptimizerTest {
         final double delta = (max - min) / nSamples;
         for (int i = 0; i < nSamples; i++) {
             final double start = min + i * delta;
-            stat[0].addValue(minimizer.optimize(f, GoalType.MINIMIZE, min, max, start));
-            stat[1].addValue(minimizer.getIterationCount());
-            stat[2].addValue(minimizer.getEvaluations());
+            stat[0].addValue(optimizer.optimize(f, GoalType.MINIMIZE, min, max, start).getPoint());
+            stat[1].addValue(optimizer.getEvaluations());
         }
 
         final double meanOptValue = stat[0].getMean();
-        final double medianIter = stat[1].getPercentile(50);
-        final double medianEval = stat[2].getPercentile(50);
-        assertTrue(meanOptValue > -0.27195612812 && meanOptValue < -0.27195612811);
-        assertEquals(medianIter, 17, FastMath.ulp(1d));
-        assertEquals(medianEval, 18, FastMath.ulp(1d));
+        final double medianEval = stat[1].getPercentile(50);
+        assertTrue(meanOptValue > -0.2719561281 && meanOptValue < -0.2719561280);
+        assertEquals((int) medianEval, 27);
     }
 
-    @Test
+    @Test(expected = TooManyEvaluationsException.class)
     public void testQuinticMax() throws MathException {
         // The quintic function has zeros at 0, +-0.5 and +-1.
         // The function has a local maximum at 0.27195613.
         UnivariateRealFunction f = new QuinticFunction();
-        UnivariateRealOptimizer minimizer = new BrentOptimizer();
-        assertEquals(0.27195613, minimizer.optimize(f, GoalType.MAXIMIZE, 0.2, 0.3), 1.0e-8);
-        minimizer.setMaximalIterationCount(5);
+        UnivariateRealOptimizer optimizer = new BrentOptimizer();
+        optimizer.setConvergenceChecker(new BrentOptimizer.BrentConvergenceChecker(1e-12, 1e-14));
+        assertEquals(0.27195613, optimizer.optimize(f, GoalType.MAXIMIZE, 0.2, 0.3).getPoint(), 1e-8);
+        optimizer.setMaxEvaluations(5);
         try {
-            minimizer.optimize(f, GoalType.MAXIMIZE, 0.2, 0.3);
+            optimizer.optimize(f, GoalType.MAXIMIZE, 0.2, 0.3);
             fail("an exception should have been thrown");
-        } catch (MaxIterationsExceededException miee) {
+        } catch (TooManyEvaluationsException miee) {
             // expected
         } catch (Exception e) {
             fail("wrong exception caught");
@@ -136,15 +127,15 @@ public final class BrentOptimizerTest {
     @Test
     public void testMinEndpoints() throws Exception {
         UnivariateRealFunction f = new SinFunction();
-        UnivariateRealOptimizer solver = new BrentOptimizer();
-
-        solver.setRelativeAccuracy(1e-8);
+        UnivariateRealOptimizer optimizer = new BrentOptimizer();
+        optimizer.setConvergenceChecker(new BrentOptimizer.BrentConvergenceChecker(1e-8, 1e-14));
+        optimizer.setMaxEvaluations(50);
 
         // endpoint is minimum
-        double result = solver.optimize(f, GoalType.MINIMIZE, 3 * FastMath.PI / 2, 5);
-        assertEquals(3 * FastMath.PI / 2, result, 10 * solver.getRelativeAccuracy());
+        double result = optimizer.optimize(f, GoalType.MINIMIZE, 3 * Math.PI / 2, 5).getPoint();
+        assertEquals(3 * Math.PI / 2, result, 100 * optimizer.getConvergenceChecker().getRelativeThreshold());
 
-        result = solver.optimize(f, GoalType.MINIMIZE, 4, 3 * FastMath.PI / 2);
-        assertEquals(3 * FastMath.PI / 2, result, 10 * solver.getRelativeAccuracy());
+        result = optimizer.optimize(f, GoalType.MINIMIZE, 4, 3 * Math.PI / 2).getPoint();
+        assertEquals(3 * Math.PI / 2, result, 100 * optimizer.getConvergenceChecker().getRelativeThreshold());
     }
 }

Copied: commons/proper/math/trunk/src/test/java/org/apache/commons/math/optimization/univariate/MultiStartUnivariateRealOptimizerTest.java (from r985626, commons/proper/math/trunk/src/test/java/org/apache/commons/math/optimization/MultiStartUnivariateRealOptimizerTest.java)
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math/optimization/univariate/MultiStartUnivariateRealOptimizerTest.java?p2=commons/proper/math/trunk/src/test/java/org/apache/commons/math/optimization/univariate/MultiStartUnivariateRealOptimizerTest.java&p1=commons/proper/math/trunk/src/test/java/org/apache/commons/math/optimization/MultiStartUnivariateRealOptimizerTest.java&r1=985626&r2=990792&rev=990792&view=diff
==============================================================================
--- commons/proper/math/trunk/src/test/java/org/apache/commons/math/optimization/MultiStartUnivariateRealOptimizerTest.java (original)
+++ commons/proper/math/trunk/src/test/java/org/apache/commons/math/optimization/univariate/MultiStartUnivariateRealOptimizerTest.java Mon Aug 30 13:06:22 2010
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.commons.math.optimization;
+package org.apache.commons.math.optimization.univariate;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
@@ -26,7 +26,9 @@ import org.apache.commons.math.analysis.
 import org.apache.commons.math.analysis.SinFunction;
 import org.apache.commons.math.analysis.UnivariateRealFunction;
 import org.apache.commons.math.optimization.univariate.BrentOptimizer;
+import org.apache.commons.math.optimization.GoalType;
 import org.apache.commons.math.random.JDKRandomGenerator;
+import org.apache.commons.math.util.FastMath;
 import org.junit.Test;
 
 public class MultiStartUnivariateRealOptimizerTest {
@@ -35,21 +37,22 @@ public class MultiStartUnivariateRealOpt
     public void testSinMin() throws MathException {
         UnivariateRealFunction f = new SinFunction();
         UnivariateRealOptimizer underlying = new BrentOptimizer();
+        underlying.setConvergenceChecker(new BrentOptimizer.BrentConvergenceChecker(1e-10, 1e-14));
+        underlying.setMaxEvaluations(300);
         JDKRandomGenerator g = new JDKRandomGenerator();
         g.setSeed(44428400075l);
-        MultiStartUnivariateRealOptimizer minimizer =
+        MultiStartUnivariateRealOptimizer optimizer =
             new MultiStartUnivariateRealOptimizer(underlying, 10, g);
-        minimizer.optimize(f, GoalType.MINIMIZE, -100.0, 100.0);
-        double[] optima = minimizer.getOptima();
-        double[] optimaValues = minimizer.getOptimaValues();
+        optimizer.optimize(f, GoalType.MINIMIZE, -100.0, 100.0);
+        UnivariateRealPointValuePair[] optima = optimizer.getOptima();
         for (int i = 1; i < optima.length; ++i) {
-            double d = (optima[i] - optima[i-1]) / (2 * Math.PI);
-            assertTrue (Math.abs(d - Math.rint(d)) < 1.0e-8);
-            assertEquals(-1.0, f.value(optima[i]), 1.0e-10);
-            assertEquals(f.value(optima[i]), optimaValues[i], 1.0e-10);
+            double d = (optima[i].getPoint() - optima[i-1].getPoint()) / (2 * FastMath.PI);
+            assertTrue (FastMath.abs(d - FastMath.rint(d)) < 1.0e-8);
+            assertEquals(-1.0, f.value(optima[i].getPoint()), 1.0e-10);
+            assertEquals(f.value(optima[i].getPoint()), optima[i].getValue(), 1.0e-10);
         }
-        assertTrue(minimizer.getEvaluations() > 150);
-        assertTrue(minimizer.getEvaluations() < 250);
+        assertTrue(optimizer.getEvaluations() > 150);
+        assertTrue(optimizer.getEvaluations() < 250);
     }
 
     @Test
@@ -58,44 +61,23 @@ public class MultiStartUnivariateRealOpt
         // The function has extrema (first derivative is zero) at 0.27195613 and 0.82221643,
         UnivariateRealFunction f = new QuinticFunction();
         UnivariateRealOptimizer underlying = new BrentOptimizer();
-        underlying.setRelativeAccuracy(1e-15);
+        underlying.setConvergenceChecker(new BrentOptimizer.BrentConvergenceChecker(1e-9, 1e-14));
+        underlying.setMaxEvaluations(300);
         JDKRandomGenerator g = new JDKRandomGenerator();
         g.setSeed(4312000053L);
-        MultiStartUnivariateRealOptimizer minimizer =
+        MultiStartUnivariateRealOptimizer optimizer =
             new MultiStartUnivariateRealOptimizer(underlying, 5, g);
-        minimizer.setAbsoluteAccuracy(10 * minimizer.getAbsoluteAccuracy());
-        minimizer.setRelativeAccuracy(10 * minimizer.getRelativeAccuracy());
 
-        try {
-            minimizer.getOptima();
-            fail("an exception should have been thrown");
-        } catch (IllegalStateException ise) {
-            // expected
-        } catch (Exception e) {
-            fail("wrong exception caught");
-        }
-        try {
-            minimizer.getOptimaValues();
-            fail("an exception should have been thrown");
-        } catch (IllegalStateException ise) {
-            // expected
-        } catch (Exception e) {
-            fail("wrong exception caught");
-        }
-
-        double result = minimizer.optimize(f, GoalType.MINIMIZE, -0.3, -0.2);
-        assertEquals(-0.2719561270319131, result, 1.0e-13);
-        assertEquals(-0.2719561270319131, minimizer.getResult(), 1.0e-13);
-        assertEquals(-0.04433426954946637, minimizer.getFunctionValue(), 1.0e-13);
+        UnivariateRealPointValuePair optimum
+            = optimizer.optimize(f, GoalType.MINIMIZE, -0.3, -0.2);
+        assertEquals(-0.2719561271, optimum.getPoint(), 1e-9);
+        assertEquals(-0.0443342695, optimum.getValue(), 1e-9);
 
-        double[] optima = minimizer.getOptima();
-        double[] optimaValues = minimizer.getOptimaValues();
+        UnivariateRealPointValuePair[] optima = optimizer.getOptima();
         for (int i = 0; i < optima.length; ++i) {
-            assertEquals(f.value(optima[i]), optimaValues[i], 1.0e-10);
+            assertEquals(f.value(optima[i].getPoint()), optima[i].getValue(), 1e-9);
         }
-        assertTrue(minimizer.getEvaluations()    >= 120);
-        assertTrue(minimizer.getEvaluations()    <= 170);
-        assertTrue(minimizer.getIterationCount() >= 120);
-        assertTrue(minimizer.getIterationCount() <= 170);
+        assertTrue(optimizer.getEvaluations() >= 110);
+        assertTrue(optimizer.getEvaluations() <= 150);
     }
 }