Author: erans Date: Thu Aug 18 14:10:28 2011 New Revision: 1159233 URL: http://svn.apache.org/viewvc?rev=1159233&view=rev Log: MATH-413 Passing convergence checker in constructor. Added default constructor.
Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math/optimization/general/GaussNewtonOptimizer.java commons/proper/math/trunk/src/test/java/org/apache/commons/math/optimization/general/GaussNewtonOptimizerTest.java Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math/optimization/general/GaussNewtonOptimizer.java URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math/optimization/general/GaussNewtonOptimizer.java?rev=1159233&r1=1159232&r2=1159233&view=diff ============================================================================== --- commons/proper/math/trunk/src/main/java/org/apache/commons/math/optimization/general/GaussNewtonOptimizer.java (original) +++ commons/proper/math/trunk/src/main/java/org/apache/commons/math/optimization/general/GaussNewtonOptimizer.java Thu Aug 18 14:10:28 2011 @@ -28,6 +28,7 @@ import org.apache.commons.math.linear.Re import org.apache.commons.math.linear.SingularMatrixException; import org.apache.commons.math.optimization.VectorialPointValuePair; import org.apache.commons.math.optimization.ConvergenceChecker; +import org.apache.commons.math.optimization.SimpleVectorialValueChecker; /** * Gauss-Newton least-squares solver. @@ -49,14 +50,46 @@ public class GaussNewtonOptimizer extend /** * Simple constructor with default settings. - * The convergence check is set to a {@link - * org.apache.commons.math.optimization.SimpleVectorialValueChecker}. + * The normal equations will be solved using LU decomposition and the + * convergence check is set to a {@link SimpleVectorialValueChecker} + * with default tolerances. + */ + public GaussNewtonOptimizer() { + this(true); + } + + /** + * Simple constructor with default settings. + * The normal equations will be solved using LU decomposition. * - * @param useLU if {@code true}, the normal equations will be solved + * @param checker Convergence checker. + */ + public GaussNewtonOptimizer(ConvergenceChecker<VectorialPointValuePair> checker) { + this(true, checker); + } + + /** + * Simple constructor with default settings. + * The convergence check is set to a {@link SimpleVectorialValueChecker} + * with default tolerances. + * + * @param useLU If {@code true}, the normal equations will be solved * using LU decomposition, otherwise they will be solved using QR * decomposition. */ public GaussNewtonOptimizer(final boolean useLU) { + this(useLU, new SimpleVectorialValueChecker()); + } + + /** + * @param useLU If {@code true}, the normal equations will be solved + * using LU decomposition, otherwise they will be solved using QR + * decomposition. + * @param checker Convergence checker. + */ + public GaussNewtonOptimizer(final boolean useLU, + ConvergenceChecker<VectorialPointValuePair> checker) { + super(checker); this.useLU = useLU; } Modified: commons/proper/math/trunk/src/test/java/org/apache/commons/math/optimization/general/GaussNewtonOptimizerTest.java URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math/optimization/general/GaussNewtonOptimizerTest.java?rev=1159233&r1=1159232&r2=1159233&view=diff ============================================================================== --- commons/proper/math/trunk/src/test/java/org/apache/commons/math/optimization/general/GaussNewtonOptimizerTest.java (original) +++ commons/proper/math/trunk/src/test/java/org/apache/commons/math/optimization/general/GaussNewtonOptimizerTest.java Thu Aug 18 14:10:28 2011 @@ -105,8 +105,10 @@ public class GaussNewtonOptimizerTest { public void testTrivial() throws MathUserException { LinearProblem problem = new LinearProblem(new double[][] { { 2 } }, new double[] { 3 }); - GaussNewtonOptimizer optimizer = new GaussNewtonOptimizer(true); - optimizer.setConvergenceChecker(new SimpleVectorialValueChecker(1.0e-6, 1.0e-6)); + + GaussNewtonOptimizer optimizer + = new GaussNewtonOptimizer(new SimpleVectorialValueChecker(1.0e-6, 1.0e-6)); + VectorialPointValuePair optimum = optimizer.optimize(100, problem, problem.target, new double[] { 1 }, new double[] { 0 }); Assert.assertEquals(0, optimizer.getRMS(), 1.0e-10); @@ -121,8 +123,9 @@ public class GaussNewtonOptimizerTest { new LinearProblem(new double[][] { { 1.0, -1.0 }, { 0.0, 2.0 }, { 1.0, -2.0 } }, new double[] { 4.0, 6.0, 1.0 }); - GaussNewtonOptimizer optimizer = new GaussNewtonOptimizer(true); - optimizer.setConvergenceChecker(new SimpleVectorialValueChecker(1.0e-6, 1.0e-6)); + GaussNewtonOptimizer optimizer + = new GaussNewtonOptimizer(new SimpleVectorialValueChecker(1.0e-6, 1.0e-6)); + VectorialPointValuePair optimum = optimizer.optimize(100, problem, problem.target, new double[] { 1, 1, 1 }, new double[] { 0, 0 }); Assert.assertEquals(0, optimizer.getRMS(), 1.0e-10); @@ -144,8 +147,10 @@ public class GaussNewtonOptimizerTest { { 0, 0, 0, 0, 2, 0 }, { 0, 0, 0, 0, 0, 2 } }, new double[] { 0.0, 1.1, 2.2, 3.3, 4.4, 5.5 }); - GaussNewtonOptimizer optimizer = new GaussNewtonOptimizer(true); - optimizer.setConvergenceChecker(new SimpleVectorialValueChecker(1.0e-6, 1.0e-6)); + + GaussNewtonOptimizer optimizer + = new GaussNewtonOptimizer(new SimpleVectorialValueChecker(1.0e-6, 1.0e-6)); + VectorialPointValuePair optimum = optimizer.optimize(100, problem, problem.target, new double[] { 1, 1, 1, 1, 1, 1 }, new double[] { 0, 0, 0, 0, 0, 0 }); @@ -163,8 +168,10 @@ public class GaussNewtonOptimizerTest { { -1, 1, 0 }, { 0, -1, 1 } }, new double[] { 1, 1, 1}); - GaussNewtonOptimizer optimizer = new GaussNewtonOptimizer(true); - optimizer.setConvergenceChecker(new SimpleVectorialValueChecker(1.0e-6, 1.0e-6)); + + GaussNewtonOptimizer optimizer + = new GaussNewtonOptimizer(new SimpleVectorialValueChecker(1.0e-6, 1.0e-6)); + VectorialPointValuePair optimum = optimizer.optimize(100, problem, problem.target, new double[] { 1, 1, 1 }, new double[] { 0, 0, 0 }); Assert.assertEquals(0, optimizer.getRMS(), 1.0e-10); @@ -186,8 +193,9 @@ public class GaussNewtonOptimizerTest { { 0, 0, 0, 0, 1, 1 } }, new double[] { 2, -9, 2, 2, 1 + epsilon * epsilon, 2}); - GaussNewtonOptimizer optimizer = new GaussNewtonOptimizer(true); - optimizer.setConvergenceChecker(new SimpleVectorialValueChecker(1.0e-6, 1.0e-6)); + GaussNewtonOptimizer optimizer + = new GaussNewtonOptimizer(new SimpleVectorialValueChecker(1.0e-6, 1.0e-6)); + VectorialPointValuePair optimum = optimizer.optimize(100, problem, problem.target, new double[] { 1, 1, 1, 1, 1, 1 }, new double[] { 0, 0, 0, 0, 0, 0 }); @@ -209,8 +217,10 @@ public class GaussNewtonOptimizerTest { { 2, 1, 3 }, { -3, 0, -9 } }, new double[] { 1, 1, 1 }); - GaussNewtonOptimizer optimizer = new GaussNewtonOptimizer(true); - optimizer.setConvergenceChecker(new SimpleVectorialValueChecker(1.0e-6, 1.0e-6)); + + GaussNewtonOptimizer optimizer + = new GaussNewtonOptimizer(new SimpleVectorialValueChecker(1.0e-6, 1.0e-6)); + optimizer.optimize(100, problem, problem.target, new double[] { 1, 1, 1 }, new double[] { 0, 0, 0 }); } @@ -222,8 +232,10 @@ public class GaussNewtonOptimizerTest { { 8.0, 6.0, 10.0, 9.0 }, { 7.0, 5.0, 9.0, 10.0 } }, new double[] { 32, 23, 33, 31 }); - GaussNewtonOptimizer optimizer = new GaussNewtonOptimizer(true); - optimizer.setConvergenceChecker(new SimpleVectorialValueChecker(1.0e-6, 1.0e-6)); + + GaussNewtonOptimizer optimizer + = new GaussNewtonOptimizer(new SimpleVectorialValueChecker(1.0e-6, 1.0e-6)); + VectorialPointValuePair optimum1 = optimizer.optimize(100, problem1, problem1.target, new double[] { 1, 1, 1, 1 }, new double[] { 0, 1, 2, 3 }); @@ -259,8 +271,9 @@ public class GaussNewtonOptimizerTest { { 2.0, 0.0, 1.0, 0.0 } }, new double[] { 7.0, 3.0, 5.0 }); - GaussNewtonOptimizer optimizer = new GaussNewtonOptimizer(true); - optimizer.setConvergenceChecker(new SimpleVectorialValueChecker(1.0e-6, 1.0e-6)); + GaussNewtonOptimizer optimizer + = new GaussNewtonOptimizer(new SimpleVectorialValueChecker(1.0e-6, 1.0e-6)); + optimizer.optimize(100, problem, problem.target, new double[] { 1, 1, 1 }, new double[] { 7, 6, 5, 4 }); } @@ -274,8 +287,10 @@ public class GaussNewtonOptimizerTest { { 0.0, 0.0, -1.0, 1.0, 0.0, 1.0 }, { 0.0, 0.0, 0.0, -1.0, 1.0, 0.0 } }, new double[] { 3.0, 12.0, -1.0, 7.0, 1.0 }); - GaussNewtonOptimizer optimizer = new GaussNewtonOptimizer(true); - optimizer.setConvergenceChecker(new SimpleVectorialValueChecker(1.0e-6, 1.0e-6)); + + GaussNewtonOptimizer optimizer + = new GaussNewtonOptimizer(new SimpleVectorialValueChecker(1.0e-6, 1.0e-6)); + optimizer.optimize(100, problem, problem.target, new double[] { 1, 1, 1, 1, 1 }, new double[] { 2, 2, 2, 2, 2, 2 }); } @@ -288,8 +303,9 @@ public class GaussNewtonOptimizerTest { { 1.0, 3.0 } }, new double[] { 3.0, 1.0, 5.0 }); - GaussNewtonOptimizer optimizer = new GaussNewtonOptimizer(true); - optimizer.setConvergenceChecker(new SimpleVectorialValueChecker(1.0e-6, 1.0e-6)); + GaussNewtonOptimizer optimizer + = new GaussNewtonOptimizer(new SimpleVectorialValueChecker(1.0e-6, 1.0e-6)); + VectorialPointValuePair optimum = optimizer.optimize(100, problem, problem.target, new double[] { 1, 1, 1 }, new double[] { 1, 1 }); @@ -306,8 +322,9 @@ public class GaussNewtonOptimizerTest { { 1.0, 3.0 } }, new double[] { 3.0, 1.0, 4.0 }); - GaussNewtonOptimizer optimizer = new GaussNewtonOptimizer(true); - optimizer.setConvergenceChecker(new SimpleVectorialValueChecker(1.0e-6, 1.0e-6)); + GaussNewtonOptimizer optimizer + = new GaussNewtonOptimizer(new SimpleVectorialValueChecker(1.0e-6, 1.0e-6)); + optimizer.optimize(100, problem, problem.target, new double[] { 1, 1, 1 }, new double[] { 1, 1 }); Assert.assertTrue(optimizer.getRMS() > 0.1); @@ -317,8 +334,9 @@ public class GaussNewtonOptimizerTest { public void testInconsistentSizes1() throws MathUserException { LinearProblem problem = new LinearProblem(new double[][] { { 1, 0 }, { 0, 1 } }, new double[] { -1, 1 }); - GaussNewtonOptimizer optimizer = new GaussNewtonOptimizer(true); - optimizer.setConvergenceChecker(new SimpleVectorialValueChecker(1.0e-6, 1.0e-6)); + + GaussNewtonOptimizer optimizer + = new GaussNewtonOptimizer(new SimpleVectorialValueChecker(1.0e-6, 1.0e-6)); VectorialPointValuePair optimum = optimizer.optimize(100, problem, problem.target, new double[] { 1, 1 }, new double[] { 0, 0 }); @@ -335,8 +353,9 @@ public class GaussNewtonOptimizerTest { public void testInconsistentSizes2() throws MathUserException { LinearProblem problem = new LinearProblem(new double[][] { { 1, 0 }, { 0, 1 } }, new double[] { -1, 1 }); - GaussNewtonOptimizer optimizer = new GaussNewtonOptimizer(true); - optimizer.setConvergenceChecker(new SimpleVectorialValueChecker(1.0e-6, 1.0e-6)); + + GaussNewtonOptimizer optimizer + = new GaussNewtonOptimizer(new SimpleVectorialValueChecker(1.0e-6, 1.0e-6)); VectorialPointValuePair optimum = optimizer.optimize(100, problem, problem.target, new double[] { 1, 1 }, new double[] { 0, 0 }); @@ -357,8 +376,9 @@ public class GaussNewtonOptimizerTest { circle.addPoint(110.0, -20.0); circle.addPoint( 35.0, 15.0); circle.addPoint( 45.0, 97.0); - GaussNewtonOptimizer optimizer = new GaussNewtonOptimizer(true); - optimizer.setConvergenceChecker(new SimpleVectorialPointChecker(1.0e-30, 1.0e-30)); + + GaussNewtonOptimizer optimizer + = new GaussNewtonOptimizer(new SimpleVectorialValueChecker(1.0e-30, 1.0e-30)); optimizer.optimize(100, circle, new double[] { 0, 0, 0, 0, 0 }, new double[] { 1, 1, 1, 1, 1 }, @@ -373,8 +393,10 @@ public class GaussNewtonOptimizerTest { circle.addPoint(110.0, -20.0); circle.addPoint( 35.0, 15.0); circle.addPoint( 45.0, 97.0); - GaussNewtonOptimizer optimizer = new GaussNewtonOptimizer(true); - optimizer.setConvergenceChecker(new SimpleVectorialValueChecker(1.0e-13, 1.0e-13)); + + GaussNewtonOptimizer optimizer + = new GaussNewtonOptimizer(new SimpleVectorialValueChecker(1.0e-13, 1.0e-13)); + VectorialPointValuePair optimum = optimizer.optimize(100, circle, new double[] { 0, 0, 0, 0, 0 }, new double[] { 1, 1, 1, 1, 1 }, @@ -397,8 +419,9 @@ public class GaussNewtonOptimizerTest { for (int i = 0; i < points.length; ++i) { circle.addPoint(points[i][0], points[i][1]); } - GaussNewtonOptimizer optimizer = new GaussNewtonOptimizer(true); - optimizer.setConvergenceChecker(new SimpleVectorialValueChecker(1.0e-6, 1.0e-6)); + + GaussNewtonOptimizer optimizer + = new GaussNewtonOptimizer(new SimpleVectorialValueChecker(1.0e-6, 1.0e-6)); optimizer.optimize(100, circle, target, weights, new double[] { -12, -12 }); } @@ -414,8 +437,9 @@ public class GaussNewtonOptimizerTest { for (int i = 0; i < points.length; ++i) { circle.addPoint(points[i][0], points[i][1]); } - GaussNewtonOptimizer optimizer = new GaussNewtonOptimizer(true); - optimizer.setConvergenceChecker(new SimpleVectorialValueChecker(1.0e-6, 1.0e-6)); + + GaussNewtonOptimizer optimizer + = new GaussNewtonOptimizer(new SimpleVectorialValueChecker(1.0e-6, 1.0e-6)); VectorialPointValuePair optimum = optimizer.optimize(100, circle, target, weights, new double[] { 0, 0 });