You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by lu...@apache.org on 2009/03/24 23:15:09 UTC

svn commit: r758058 - in /commons/proper/math/trunk/src: java/org/apache/commons/math/optimization/general/ test/org/apache/commons/math/optimization/general/

Author: luc
Date: Tue Mar 24 22:15:08 2009
New Revision: 758058

URL: http://svn.apache.org/viewvc?rev=758058&view=rev
Log:
updated general algorithms with latest interfaces definitions

Modified:
    commons/proper/math/trunk/src/java/org/apache/commons/math/optimization/general/AbstractLeastSquaresOptimizer.java
    commons/proper/math/trunk/src/java/org/apache/commons/math/optimization/general/GaussNewtonOptimizer.java
    commons/proper/math/trunk/src/java/org/apache/commons/math/optimization/general/LevenbergMarquardtOptimizer.java
    commons/proper/math/trunk/src/test/org/apache/commons/math/optimization/general/GaussNewtonOptimizerTest.java
    commons/proper/math/trunk/src/test/org/apache/commons/math/optimization/general/LevenbergMarquardtOptimizerTest.java
    commons/proper/math/trunk/src/test/org/apache/commons/math/optimization/general/MinpackTest.java

Modified: commons/proper/math/trunk/src/java/org/apache/commons/math/optimization/general/AbstractLeastSquaresOptimizer.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/java/org/apache/commons/math/optimization/general/AbstractLeastSquaresOptimizer.java?rev=758058&r1=758057&r2=758058&view=diff
==============================================================================
--- commons/proper/math/trunk/src/java/org/apache/commons/math/optimization/general/AbstractLeastSquaresOptimizer.java (original)
+++ commons/proper/math/trunk/src/java/org/apache/commons/math/optimization/general/AbstractLeastSquaresOptimizer.java Tue Mar 24 22:15:08 2009
@@ -17,17 +17,18 @@
 
 package org.apache.commons.math.optimization.general;
 
+import org.apache.commons.math.FunctionEvaluationException;
 import org.apache.commons.math.MaxIterationsExceededException;
+import org.apache.commons.math.analysis.DifferentiableMultivariateVectorialFunction;
+import org.apache.commons.math.analysis.MultivariateMatrixFunction;
 import org.apache.commons.math.linear.InvalidMatrixException;
 import org.apache.commons.math.linear.MatrixUtils;
 import org.apache.commons.math.linear.RealMatrix;
 import org.apache.commons.math.linear.decomposition.LUDecompositionImpl;
-import org.apache.commons.math.optimization.ObjectiveException;
 import org.apache.commons.math.optimization.OptimizationException;
 import org.apache.commons.math.optimization.SimpleVectorialValueChecker;
 import org.apache.commons.math.optimization.VectorialConvergenceChecker;
-import org.apache.commons.math.optimization.VectorialDifferentiableObjectiveFunction;
-import org.apache.commons.math.optimization.VectorialDifferentiableOptimizer;
+import org.apache.commons.math.optimization.DifferentiableMultivariateVectorialOptimizer;
 import org.apache.commons.math.optimization.VectorialPointValuePair;
 
 /**
@@ -38,7 +39,7 @@
  * @since 1.2
  *
  */
-public abstract class AbstractLeastSquaresOptimizer implements VectorialDifferentiableOptimizer {
+public abstract class AbstractLeastSquaresOptimizer implements DifferentiableMultivariateVectorialOptimizer {
 
     /** Serializable version identifier */
     private static final long serialVersionUID = 5413193243329026789L;
@@ -77,7 +78,10 @@
     protected int rows;
 
     /** Objective function. */
-    private VectorialDifferentiableObjectiveFunction f;
+    private DifferentiableMultivariateVectorialFunction f;
+
+    /** Objective function derivatives. */
+    private MultivariateMatrixFunction jF;
 
     /** Target value for the objective functions at optimum. */
     protected double[] target;
@@ -85,8 +89,8 @@
     /** Weight for the least squares cost computation. */
     protected double[] weights;
 
-    /** Current variables set. */
-    protected double[] variables;
+    /** Current point. */
+    protected double[] point;
 
     /** Current objective function value. */
     protected double[] objective;
@@ -156,15 +160,15 @@
 
     /** 
      * Update the jacobian matrix.
-     * @exception ObjectiveException if the function jacobian
+     * @exception FunctionEvaluationException if the function jacobian
      * cannot be evaluated or its dimension doesn't match problem dimension
      */
-    protected void updateJacobian() throws ObjectiveException {
+    protected void updateJacobian() throws FunctionEvaluationException {
         ++jacobianEvaluations;
-        jacobian = f.jacobian(variables, objective);
+        jacobian = jF.value(point);
         if (jacobian.length != rows) {
-            throw new ObjectiveException("dimension mismatch {0} != {1}",
-                                         jacobian.length, rows);
+            throw new FunctionEvaluationException(point, "dimension mismatch {0} != {1}",
+                                                  jacobian.length, rows);
         }
         for (int i = 0; i < rows; i++) {
             final double[] ji = jacobian[i];
@@ -177,17 +181,17 @@
 
     /** 
      * Update the residuals array and cost function value.
-     * @exception ObjectiveException if the function cannot be evaluated
+     * @exception FunctionEvaluationException if the function cannot be evaluated
      * or its dimension doesn't match problem dimension
      */
     protected void updateResidualsAndCost()
-        throws ObjectiveException {
+        throws FunctionEvaluationException {
 
         ++objectiveEvaluations;
-        objective = f.objective(variables);
+        objective = f.value(point);
         if (objective.length != rows) {
-            throw new ObjectiveException("dimension mismatch {0} != {1}",
-                                         objective.length, rows);
+            throw new FunctionEvaluationException(point, "dimension mismatch {0} != {1}",
+                                                  objective.length, rows);
         }
         cost = 0;
         for (int i = 0, index = 0; i < rows; i++, index += cols) {
@@ -234,13 +238,13 @@
     /**
      * Get the covariance matrix of optimized parameters.
      * @return covariance matrix
-     * @exception ObjectiveException if the function jacobian cannot
+     * @exception FunctionEvaluationException if the function jacobian cannot
      * be evaluated
      * @exception OptimizationException if the covariance matrix
      * cannot be computed (singular problem)
      */
     public double[][] getCovariances()
-        throws ObjectiveException, OptimizationException {
+        throws FunctionEvaluationException, OptimizationException {
 
         // set up the jacobian
         updateJacobian();
@@ -273,13 +277,13 @@
      * Guess the errors in optimized parameters.
      * <p>Guessing is covariance-based, it only gives rough order of magnitude.</p>
      * @return errors in optimized parameters
-     * @exception ObjectiveException if the function jacobian cannot b evaluated
+     * @exception FunctionEvaluationException if the function jacobian cannot b evaluated
      * @exception OptimizationException if the covariances matrix cannot be computed
      * or the number of degrees of freedom is not positive (number of measurements
      * lesser or equal to number of parameters)
      */
     public double[] guessParametersErrors()
-        throws ObjectiveException, OptimizationException {
+        throws FunctionEvaluationException, OptimizationException {
         if (rows <= cols) {
             throw new OptimizationException(
                     "no degrees of freedom ({0} measurements, {1} parameters)",
@@ -295,10 +299,10 @@
     }
 
     /** {@inheritDoc} */
-    public VectorialPointValuePair optimize(final VectorialDifferentiableObjectiveFunction f,
+    public VectorialPointValuePair optimize(final DifferentiableMultivariateVectorialFunction f,
                                             final double[] target, final double[] weights,
                                             final double[] startPoint)
-        throws ObjectiveException, OptimizationException, IllegalArgumentException {
+        throws FunctionEvaluationException, OptimizationException, IllegalArgumentException {
 
         if (target.length != weights.length) {
             throw new OptimizationException("dimension mismatch {0} != {1}",
@@ -312,14 +316,15 @@
 
         // store least squares problem characteristics
         this.f         = f;
+        jF             = f.jacobian();
         this.target    = target.clone();
         this.weights   = weights.clone();
-        this.variables = startPoint.clone();
+        this.point     = startPoint.clone();
         this.residuals = new double[target.length];
 
         // arrays shared with the other private methods
         rows      = target.length;
-        cols      = variables.length;
+        cols      = point.length;
         jacobian  = new double[rows][cols];
 
         cost = Double.POSITIVE_INFINITY;
@@ -330,12 +335,12 @@
 
     /** Perform the bulk of optimization algorithm.
      * @return the point/value pair giving the optimal value for objective function
-     * @exception ObjectiveException if the objective function throws one during
+     * @exception FunctionEvaluationException if the objective function throws one during
      * the search
      * @exception OptimizationException if the algorithm failed to converge
      * @exception IllegalArgumentException if the start point dimension is wrong
      */
     abstract protected VectorialPointValuePair doOptimize()
-        throws ObjectiveException, OptimizationException, IllegalArgumentException;
+        throws FunctionEvaluationException, OptimizationException, IllegalArgumentException;
 
 }
\ No newline at end of file

Modified: commons/proper/math/trunk/src/java/org/apache/commons/math/optimization/general/GaussNewtonOptimizer.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/java/org/apache/commons/math/optimization/general/GaussNewtonOptimizer.java?rev=758058&r1=758057&r2=758058&view=diff
==============================================================================
--- commons/proper/math/trunk/src/java/org/apache/commons/math/optimization/general/GaussNewtonOptimizer.java (original)
+++ commons/proper/math/trunk/src/java/org/apache/commons/math/optimization/general/GaussNewtonOptimizer.java Tue Mar 24 22:15:08 2009
@@ -17,13 +17,13 @@
 
 package org.apache.commons.math.optimization.general;
 
+import org.apache.commons.math.FunctionEvaluationException;
 import org.apache.commons.math.linear.DenseRealMatrix;
 import org.apache.commons.math.linear.InvalidMatrixException;
 import org.apache.commons.math.linear.RealMatrix;
 import org.apache.commons.math.linear.decomposition.DecompositionSolver;
 import org.apache.commons.math.linear.decomposition.LUDecompositionImpl;
 import org.apache.commons.math.linear.decomposition.QRDecompositionImpl;
-import org.apache.commons.math.optimization.ObjectiveException;
 import org.apache.commons.math.optimization.OptimizationException;
 import org.apache.commons.math.optimization.SimpleVectorialValueChecker;
 import org.apache.commons.math.optimization.VectorialPointValuePair;
@@ -63,7 +63,7 @@
 
     /** {@inheritDoc} */
     public VectorialPointValuePair doOptimize()
-        throws ObjectiveException, OptimizationException, IllegalArgumentException {
+        throws FunctionEvaluationException, OptimizationException, IllegalArgumentException {
 
         // iterate until convergence is reached
         VectorialPointValuePair current = null;
@@ -75,7 +75,7 @@
             VectorialPointValuePair previous = current;
             updateResidualsAndCost();
             updateJacobian();
-            current = new VectorialPointValuePair(variables, objective);
+            current = new VectorialPointValuePair(point, objective);
 
             // build the linear problem
             final double[]   b = new double[cols];
@@ -114,7 +114,7 @@
 
                 // update the estimated parameters
                 for (int i = 0; i < cols; ++i) {
-                    variables[i] += dX[i];
+                    point[i] += dX[i];
                 }
 
             } catch(InvalidMatrixException e) {

Modified: commons/proper/math/trunk/src/java/org/apache/commons/math/optimization/general/LevenbergMarquardtOptimizer.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/java/org/apache/commons/math/optimization/general/LevenbergMarquardtOptimizer.java?rev=758058&r1=758057&r2=758058&view=diff
==============================================================================
--- commons/proper/math/trunk/src/java/org/apache/commons/math/optimization/general/LevenbergMarquardtOptimizer.java (original)
+++ commons/proper/math/trunk/src/java/org/apache/commons/math/optimization/general/LevenbergMarquardtOptimizer.java Tue Mar 24 22:15:08 2009
@@ -18,7 +18,7 @@
 
 import java.util.Arrays;
 
-import org.apache.commons.math.optimization.ObjectiveException;
+import org.apache.commons.math.FunctionEvaluationException;
 import org.apache.commons.math.optimization.OptimizationException;
 import org.apache.commons.math.optimization.VectorialPointValuePair;
 
@@ -27,8 +27,8 @@
  * This class solves a least squares problem using the Levenberg-Marquardt algorithm.
  *
  * <p>This implementation <em>should</em> work even for over-determined systems
- * (i.e. systems having more variables than equations). Over-determined systems
- * are solved by ignoring the variables which have the smallest impact according
+ * (i.e. systems having more point than equations). Over-determined systems
+ * are solved by ignoring the point which have the smallest impact according
  * to their jacobian column norm. Only the rank of the matrix and some loop bounds
  * are changed to implement this.</p>
  *
@@ -104,7 +104,7 @@
     /** Serializable version identifier */
     private static final long serialVersionUID = 8851282236194244323L;
 
-    /** Number of solved variables. */
+    /** Number of solved point. */
     private int solvedCols;
 
     /** Diagonal elements of the R matrix in the Q.R. decomposition. */
@@ -210,7 +210,7 @@
 
     /** {@inheritDoc} */
     protected VectorialPointValuePair doOptimize()
-        throws ObjectiveException, OptimizationException, IllegalArgumentException {
+        throws FunctionEvaluationException, OptimizationException, IllegalArgumentException {
 
         // arrays shared with the other private methods
         solvedCols  = Math.min(rows, cols);
@@ -220,7 +220,7 @@
         permutation = new int[cols];
         lmDir       = new double[cols];
 
-        // local variables
+        // local point
         double   delta   = 0, xNorm = 0;
         double[] diag    = new double[cols];
         double[] oldX    = new double[cols];
@@ -255,7 +255,7 @@
 
             if (firstIteration) {
 
-                // scale the variables according to the norms of the columns
+                // scale the point according to the norms of the columns
                 // of the initial jacobian
                 xNorm = 0;
                 for (int k = 0; k < cols; ++k) {
@@ -263,7 +263,7 @@
                     if (dk == 0) {
                         dk = 1.0;
                     }
-                    double xk = dk * variables[k];
+                    double xk = dk * point[k];
                     xNorm  += xk * xk;
                     diag[k] = dk;
                 }
@@ -291,7 +291,7 @@
             }
             if (maxCosine <= orthoTolerance) {
                 // convergence has been reached
-                return new VectorialPointValuePair(variables, objective);
+                return new VectorialPointValuePair(point, objective);
             }
 
             // rescale if necessary
@@ -305,7 +305,7 @@
                 // save the state
                 for (int j = 0; j < solvedCols; ++j) {
                     int pj = permutation[j];
-                    oldX[pj] = variables[pj];
+                    oldX[pj] = point[pj];
                 }
                 double previousCost = cost;
                 double[] tmpVec = residuals;
@@ -320,7 +320,7 @@
                 for (int j = 0; j < solvedCols; ++j) {
                     int pj = permutation[j];
                     lmDir[pj] = -lmDir[pj];
-                    variables[pj] = oldX[pj] + lmDir[pj];
+                    point[pj] = oldX[pj] + lmDir[pj];
                     double s = diag[pj] * lmDir[pj];
                     lmNorm  += s * s;
                 }
@@ -384,7 +384,7 @@
                     firstIteration = false;
                     xNorm = 0;
                     for (int k = 0; k < cols; ++k) {
-                        double xK = diag[k] * variables[k];
+                        double xK = diag[k] * point[k];
                         xNorm    += xK * xK;
                     }
                     xNorm = Math.sqrt(xNorm);
@@ -393,7 +393,7 @@
                     cost = previousCost;
                     for (int j = 0; j < solvedCols; ++j) {
                         int pj = permutation[j];
-                        variables[pj] = oldX[pj];
+                        point[pj] = oldX[pj];
                     }
                     tmpVec    = residuals;
                     residuals = oldRes;
@@ -405,7 +405,7 @@
                         (preRed <= costRelativeTolerance) &&
                         (ratio <= 2.0)) ||
                         (delta <= parRelativeTolerance * xNorm)) {
-                    return new VectorialPointValuePair(variables, objective);
+                    return new VectorialPointValuePair(point, objective);
                 }
 
                 // tests for termination and stringent tolerances

Modified: commons/proper/math/trunk/src/test/org/apache/commons/math/optimization/general/GaussNewtonOptimizerTest.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/org/apache/commons/math/optimization/general/GaussNewtonOptimizerTest.java?rev=758058&r1=758057&r2=758058&view=diff
==============================================================================
--- commons/proper/math/trunk/src/test/org/apache/commons/math/optimization/general/GaussNewtonOptimizerTest.java (original)
+++ commons/proper/math/trunk/src/test/org/apache/commons/math/optimization/general/GaussNewtonOptimizerTest.java Tue Mar 24 22:15:08 2009
@@ -25,12 +25,14 @@
 import junit.framework.TestCase;
 import junit.framework.TestSuite;
 
+import org.apache.commons.math.FunctionEvaluationException;
+import org.apache.commons.math.analysis.DifferentiableMultivariateVectorialFunction;
+import org.apache.commons.math.analysis.MultivariateMatrixFunction;
+import org.apache.commons.math.analysis.MultivariateVectorialFunction;
 import org.apache.commons.math.linear.DenseRealMatrix;
 import org.apache.commons.math.linear.RealMatrix;
-import org.apache.commons.math.optimization.ObjectiveException;
 import org.apache.commons.math.optimization.OptimizationException;
 import org.apache.commons.math.optimization.SimpleVectorialValueChecker;
-import org.apache.commons.math.optimization.VectorialDifferentiableObjectiveFunction;
 import org.apache.commons.math.optimization.VectorialPointValuePair;
 
 /**
@@ -102,7 +104,7 @@
         super(name);
     }
 
-    public void testTrivial() throws ObjectiveException, OptimizationException {
+    public void testTrivial() throws FunctionEvaluationException, OptimizationException {
         LinearProblem problem =
             new LinearProblem(new double[][] { { 2 } }, new double[] { 3 });
         GaussNewtonOptimizer optimizer = new GaussNewtonOptimizer(true);
@@ -115,7 +117,7 @@
         assertEquals(3.0, optimum.getValue()[0], 1.0e-10);
     }
 
-    public void testColumnsPermutation() throws ObjectiveException, OptimizationException {
+    public void testColumnsPermutation() throws FunctionEvaluationException, OptimizationException {
 
         LinearProblem problem =
             new LinearProblem(new double[][] { { 1.0, -1.0 }, { 0.0, 2.0 }, { 1.0, -2.0 } },
@@ -135,7 +137,7 @@
 
     }
 
-    public void testNoDependency() throws ObjectiveException, OptimizationException {
+    public void testNoDependency() throws FunctionEvaluationException, OptimizationException {
         LinearProblem problem = new LinearProblem(new double[][] {
                 { 2, 0, 0, 0, 0, 0 },
                 { 0, 2, 0, 0, 0, 0 },
@@ -156,7 +158,7 @@
         }
     }
 
-    public void testOneSet() throws ObjectiveException, OptimizationException {
+    public void testOneSet() throws FunctionEvaluationException, OptimizationException {
 
         LinearProblem problem = new LinearProblem(new double[][] {
                 {  1,  0, 0 },
@@ -175,7 +177,7 @@
 
     }
 
-    public void testTwoSets() throws ObjectiveException, OptimizationException {
+    public void testTwoSets() throws FunctionEvaluationException, OptimizationException {
         double epsilon = 1.0e-7;
         LinearProblem problem = new LinearProblem(new double[][] {
                 {  2,  1,   0,  4,       0, 0 },
@@ -222,7 +224,7 @@
         }
     }
 
-    public void testIllConditioned() throws ObjectiveException, OptimizationException {
+    public void testIllConditioned() throws FunctionEvaluationException, OptimizationException {
         LinearProblem problem1 = new LinearProblem(new double[][] {
                 { 10.0, 7.0,  8.0,  7.0 },
                 {  7.0, 5.0,  6.0,  5.0 },
@@ -303,7 +305,7 @@
         }
     }
 
-    public void testRedundantEquations() throws ObjectiveException, OptimizationException {
+    public void testRedundantEquations() throws FunctionEvaluationException, OptimizationException {
         LinearProblem problem = new LinearProblem(new double[][] {
                 { 1.0,  1.0 },
                 { 1.0, -1.0 },
@@ -322,7 +324,7 @@
 
     }
 
-    public void testInconsistentEquations() throws ObjectiveException, OptimizationException {
+    public void testInconsistentEquations() throws FunctionEvaluationException, OptimizationException {
         LinearProblem problem = new LinearProblem(new double[][] {
                 { 1.0,  1.0 },
                 { 1.0, -1.0 },
@@ -337,7 +339,7 @@
 
     }
 
-    public void testInconsistentSizes() throws ObjectiveException, OptimizationException {
+    public void testInconsistentSizes() throws FunctionEvaluationException, OptimizationException {
         LinearProblem problem =
             new LinearProblem(new double[][] { { 1, 0 }, { 0, 1 } }, new double[] { -1, 1 });
         GaussNewtonOptimizer optimizer = new GaussNewtonOptimizer(true);
@@ -366,7 +368,7 @@
                                new double[] { 1 },
                                new double[] { 0, 0 });
             fail("an exception should have been thrown");
-        } catch (ObjectiveException oe) {
+        } catch (FunctionEvaluationException oe) {
             // expected behavior
         } catch (Exception e) {
             fail("wrong exception caught");
@@ -396,7 +398,7 @@
         }
     }
 
-    public void testCircleFitting() throws ObjectiveException, OptimizationException {
+    public void testCircleFitting() throws FunctionEvaluationException, OptimizationException {
         Circle circle = new Circle();
         circle.addPoint( 30.0,  68.0);
         circle.addPoint( 50.0,  -6.0);
@@ -417,7 +419,7 @@
         assertEquals(48.135167894714,   center.y, 1.0e-10);
     }
 
-    public void testCircleFittingBadInit() throws ObjectiveException, OptimizationException {
+    public void testCircleFittingBadInit() throws FunctionEvaluationException, OptimizationException {
         Circle circle = new Circle();
         double[][] points = new double[][] {
                 {-0.312967,  0.072366}, {-0.339248,  0.132965}, {-0.379780,  0.202724},
@@ -477,9 +479,9 @@
 
     }
 
-    private static class LinearProblem implements VectorialDifferentiableObjectiveFunction {
+    private static class LinearProblem implements DifferentiableMultivariateVectorialFunction {
 
-        private static final long serialVersionUID = 703247177355019415L;
+        private static final long serialVersionUID = -8804268799379350190L;
         final RealMatrix factors;
         final double[] target;
         public LinearProblem(double[][] factors, double[] target) {
@@ -487,20 +489,42 @@
             this.target  = target;
         }
 
-        public double[][] jacobian(double[] variables, double[] value) {
-            return factors.getData();
+        public double[] value(double[] variables) {
+            return factors.operate(variables);
         }
 
-        public double[] objective(double[] variables) {
-            return factors.operate(variables);
+        public MultivariateVectorialFunction partialDerivative(final int i) {
+            return new MultivariateVectorialFunction() {
+                private static final long serialVersionUID = 1037082026387842358L;
+                public double[] value(double[] point) {
+                    return factors.getColumn(i);
+                }
+            };
         }
 
-    }
+        public MultivariateVectorialFunction gradient(final int i) {
+            return new MultivariateVectorialFunction() {
+                private static final long serialVersionUID = -3268626996728727146L;
+                public double[] value(double[] point) {
+                    return factors.getRow(i);
+                }
+            };
+        }
 
-    private static class Circle implements VectorialDifferentiableObjectiveFunction {
+        public MultivariateMatrixFunction jacobian() {
+            return new MultivariateMatrixFunction() {
+                private static final long serialVersionUID = -8387467946663627585L;
+                public double[][] value(double[] point) {
+                    return factors.getData();
+                }
+            };
+        }
 
-        private static final long serialVersionUID = -4711170319243817874L;
+    }
+
+    private static class Circle implements DifferentiableMultivariateVectorialFunction {
 
+        private static final long serialVersionUID = -7165774454925027042L;
         private ArrayList<Point2D.Double> points;
 
         public Circle() {
@@ -523,8 +547,7 @@
             return r / points.size();
         }
 
-        public double[][] jacobian(double[] variables, double[] value)
-                throws ObjectiveException, IllegalArgumentException {
+        private double[][] jacobian(double[] variables) {
 
             int n = points.size();
             Point2D.Double center = new Point2D.Double(variables[0], variables[1]);
@@ -553,8 +576,7 @@
 
         }
 
-        public double[] objective(double[] variables)
-                throws ObjectiveException, IllegalArgumentException {
+        public double[] value(double[] variables) {
 
             Point2D.Double center = new Point2D.Double(variables[0], variables[1]);
             double radius = getRadius(center);
@@ -568,6 +590,38 @@
 
         }
 
+        public MultivariateVectorialFunction partialDerivative(final int i) {
+            return new MultivariateVectorialFunction() {
+                private static final long serialVersionUID = -2884159755283203273L;
+                public double[] value(double[] point) {
+                    double[][] m = jacobian(point);
+                    double[] partial = new double[m.length];
+                    for (int j = 0; j < partial.length; ++j) {
+                        partial[i] = m[i][j];
+                    }
+                    return partial;
+                }
+            };
+        }
+
+        public MultivariateVectorialFunction gradient(final int i) {
+            return new MultivariateVectorialFunction() {
+                private static final long serialVersionUID = -43357217231860547L;
+                public double[] value(double[] point) {
+                    return jacobian(point)[i];
+                }
+            };
+        }
+
+        public MultivariateMatrixFunction jacobian() {
+            return new MultivariateMatrixFunction() {
+                private static final long serialVersionUID = -4340046230875165095L;
+                public double[][] value(double[] point) {
+                    return jacobian(point);
+                }
+            };
+        }
+
     }
 
     public static Test suite() {

Modified: commons/proper/math/trunk/src/test/org/apache/commons/math/optimization/general/LevenbergMarquardtOptimizerTest.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/org/apache/commons/math/optimization/general/LevenbergMarquardtOptimizerTest.java?rev=758058&r1=758057&r2=758058&view=diff
==============================================================================
--- commons/proper/math/trunk/src/test/org/apache/commons/math/optimization/general/LevenbergMarquardtOptimizerTest.java (original)
+++ commons/proper/math/trunk/src/test/org/apache/commons/math/optimization/general/LevenbergMarquardtOptimizerTest.java Tue Mar 24 22:15:08 2009
@@ -26,12 +26,14 @@
 import junit.framework.TestCase;
 import junit.framework.TestSuite;
 
+import org.apache.commons.math.FunctionEvaluationException;
+import org.apache.commons.math.analysis.DifferentiableMultivariateVectorialFunction;
+import org.apache.commons.math.analysis.MultivariateMatrixFunction;
+import org.apache.commons.math.analysis.MultivariateVectorialFunction;
 import org.apache.commons.math.linear.DenseRealMatrix;
 import org.apache.commons.math.linear.RealMatrix;
-import org.apache.commons.math.optimization.ObjectiveException;
 import org.apache.commons.math.optimization.OptimizationException;
 import org.apache.commons.math.optimization.SimpleVectorialValueChecker;
-import org.apache.commons.math.optimization.VectorialDifferentiableObjectiveFunction;
 import org.apache.commons.math.optimization.VectorialPointValuePair;
 
 /**
@@ -103,7 +105,7 @@
         super(name);
     }
 
-    public void testTrivial() throws ObjectiveException, OptimizationException {
+    public void testTrivial() throws FunctionEvaluationException, OptimizationException {
         LinearProblem problem =
             new LinearProblem(new double[][] { { 2 } }, new double[] { 3 });
         LevenbergMarquardtOptimizer optimizer = new LevenbergMarquardtOptimizer();
@@ -122,7 +124,7 @@
         assertEquals(3.0, optimum.getValue()[0], 1.0e-10);
     }
 
-    public void testQRColumnsPermutation() throws ObjectiveException, OptimizationException {
+    public void testQRColumnsPermutation() throws FunctionEvaluationException, OptimizationException {
 
         LinearProblem problem =
             new LinearProblem(new double[][] { { 1.0, -1.0 }, { 0.0, 2.0 }, { 1.0, -2.0 } },
@@ -140,7 +142,7 @@
 
     }
 
-    public void testNoDependency() throws ObjectiveException, OptimizationException {
+    public void testNoDependency() throws FunctionEvaluationException, OptimizationException {
         LinearProblem problem = new LinearProblem(new double[][] {
                 { 2, 0, 0, 0, 0, 0 },
                 { 0, 2, 0, 0, 0, 0 },
@@ -159,7 +161,7 @@
         }
     }
 
-    public void testOneSet() throws ObjectiveException, OptimizationException {
+    public void testOneSet() throws FunctionEvaluationException, OptimizationException {
 
         LinearProblem problem = new LinearProblem(new double[][] {
                 {  1,  0, 0 },
@@ -176,7 +178,7 @@
 
     }
 
-    public void testTwoSets() throws ObjectiveException, OptimizationException {
+    public void testTwoSets() throws FunctionEvaluationException, OptimizationException {
         double epsilon = 1.0e-7;
         LinearProblem problem = new LinearProblem(new double[][] {
                 {  2,  1,   0,  4,       0, 0 },
@@ -201,7 +203,7 @@
 
     }
 
-    public void testNonInversible() throws ObjectiveException, OptimizationException {
+    public void testNonInversible() throws FunctionEvaluationException, OptimizationException {
 
         LinearProblem problem = new LinearProblem(new double[][] {
                 {  1, 2, -3 },
@@ -223,7 +225,7 @@
 
     }
 
-    public void testIllConditioned() throws ObjectiveException, OptimizationException {
+    public void testIllConditioned() throws FunctionEvaluationException, OptimizationException {
         LinearProblem problem1 = new LinearProblem(new double[][] {
                 { 10.0, 7.0,  8.0,  7.0 },
                 {  7.0, 5.0,  6.0,  5.0 },
@@ -257,7 +259,7 @@
 
     }
 
-    public void testMoreEstimatedParametersSimple() throws ObjectiveException, OptimizationException {
+    public void testMoreEstimatedParametersSimple() throws FunctionEvaluationException, OptimizationException {
 
         LinearProblem problem = new LinearProblem(new double[][] {
                 { 3.0, 2.0,  0.0, 0.0 },
@@ -272,7 +274,7 @@
 
     }
 
-    public void testMoreEstimatedParametersUnsorted() throws ObjectiveException, OptimizationException {
+    public void testMoreEstimatedParametersUnsorted() throws FunctionEvaluationException, OptimizationException {
         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 },
@@ -293,7 +295,7 @@
 
     }
 
-    public void testRedundantEquations() throws ObjectiveException, OptimizationException {
+    public void testRedundantEquations() throws FunctionEvaluationException, OptimizationException {
         LinearProblem problem = new LinearProblem(new double[][] {
                 { 1.0,  1.0 },
                 { 1.0, -1.0 },
@@ -310,7 +312,7 @@
 
     }
 
-    public void testInconsistentEquations() throws ObjectiveException, OptimizationException {
+    public void testInconsistentEquations() throws FunctionEvaluationException, OptimizationException {
         LinearProblem problem = new LinearProblem(new double[][] {
                 { 1.0,  1.0 },
                 { 1.0, -1.0 },
@@ -323,7 +325,7 @@
 
     }
 
-    public void testInconsistentSizes() throws ObjectiveException, OptimizationException {
+    public void testInconsistentSizes() throws FunctionEvaluationException, OptimizationException {
         LinearProblem problem =
             new LinearProblem(new double[][] { { 1, 0 }, { 0, 1 } }, new double[] { -1, 1 });
         LevenbergMarquardtOptimizer optimizer = new LevenbergMarquardtOptimizer();
@@ -350,7 +352,7 @@
                                new double[] { 1 },
                                new double[] { 0, 0 });
             fail("an exception should have been thrown");
-        } catch (ObjectiveException oe) {
+        } catch (FunctionEvaluationException oe) {
             // expected behavior
         } catch (Exception e) {
             fail("wrong exception caught");
@@ -372,7 +374,7 @@
         checkEstimate(circle, 0.1, 20, 1.0e-18, 1.0e-16, 1.0e-10, true);
     }
 
-    private void checkEstimate(VectorialDifferentiableObjectiveFunction problem,
+    private void checkEstimate(DifferentiableMultivariateVectorialFunction problem,
                                double initialStepBoundFactor, int maxCostEval,
                                double costRelativeTolerance, double parRelativeTolerance,
                                double orthoTolerance, boolean shouldFail) {
@@ -388,14 +390,14 @@
             assertTrue(! shouldFail);
         } catch (OptimizationException ee) {
             assertTrue(shouldFail);
-        } catch (ObjectiveException ee) {
+        } catch (FunctionEvaluationException ee) {
             assertTrue(shouldFail);
         } catch (Exception e) {
             fail("wrong exception type caught");
         }
     }
 
-    public void testCircleFitting() throws ObjectiveException, OptimizationException {
+    public void testCircleFitting() throws FunctionEvaluationException, OptimizationException {
         Circle circle = new Circle();
         circle.addPoint( 30.0,  68.0);
         circle.addPoint( 50.0,  -6.0);
@@ -445,7 +447,7 @@
 
     }
 
-    public void testCircleFittingBadInit() throws ObjectiveException, OptimizationException {
+    public void testCircleFittingBadInit() throws FunctionEvaluationException, OptimizationException {
         Circle circle = new Circle();
         double[][] points = new double[][] {
                 {-0.312967,  0.072366}, {-0.339248,  0.132965}, {-0.379780,  0.202724},
@@ -498,7 +500,7 @@
         assertEquals( 0.2075001, center.y,      1.0e-6);
     }
 
-    public void testMath199() throws ObjectiveException, OptimizationException {
+    public void testMath199() throws FunctionEvaluationException, OptimizationException {
         try {
             QuadraticProblem problem = new QuadraticProblem();
             problem.addPoint (0, -3.182591015485607);
@@ -517,7 +519,7 @@
 
     }
 
-    private static class LinearProblem implements VectorialDifferentiableObjectiveFunction {
+    private static class LinearProblem implements DifferentiableMultivariateVectorialFunction {
 
         private static final long serialVersionUID = 703247177355019415L;
         final RealMatrix factors;
@@ -527,17 +529,40 @@
             this.target  = target;
         }
 
-        public double[][] jacobian(double[] variables, double[] value) {
-            return factors.getData();
+        public double[] value(double[] variables) {
+            return factors.operate(variables);
         }
 
-        public double[] objective(double[] variables) {
-            return factors.operate(variables);
+        public MultivariateVectorialFunction partialDerivative(final int i) {
+            return new MultivariateVectorialFunction() {
+                private static final long serialVersionUID = 4868131119285501303L;
+                public double[] value(double[] point) {
+                    return factors.getColumn(i);
+                }
+            };
+        }
+
+        public MultivariateVectorialFunction gradient(final int i) {
+            return new MultivariateVectorialFunction() {
+                private static final long serialVersionUID = 6280336674474631774L;
+                public double[] value(double[] point) {
+                    return factors.getRow(i);
+                }
+            };
+        }
+
+        public MultivariateMatrixFunction jacobian() {
+            return new MultivariateMatrixFunction() {
+                private static final long serialVersionUID = 556396458721526234L;
+                public double[][] value(double[] point) {
+                    return factors.getData();
+                }
+            };
         }
 
     }
 
-    private static class Circle implements VectorialDifferentiableObjectiveFunction {
+    private static class Circle implements DifferentiableMultivariateVectorialFunction {
 
         private static final long serialVersionUID = -4711170319243817874L;
 
@@ -563,11 +588,10 @@
             return r / points.size();
         }
 
-        public double[][] jacobian(double[] variables, double[] value)
-        throws ObjectiveException, IllegalArgumentException {
+        private double[][] jacobian(double[] point) {
 
             int n = points.size();
-            Point2D.Double center = new Point2D.Double(variables[0], variables[1]);
+            Point2D.Double center = new Point2D.Double(point[0], point[1]);
 
             // gradient of the optimal radius
             double dRdX = 0;
@@ -593,8 +617,8 @@
 
         }
 
-        public double[] objective(double[] variables)
-        throws ObjectiveException, IllegalArgumentException {
+        public double[] value(double[] variables)
+        throws FunctionEvaluationException, IllegalArgumentException {
 
             Point2D.Double center = new Point2D.Double(variables[0], variables[1]);
             double radius = getRadius(center);
@@ -608,11 +632,43 @@
 
         }
 
+        public MultivariateVectorialFunction partialDerivative(final int i) {
+            return new MultivariateVectorialFunction() {
+                private static final long serialVersionUID = -2884159755283203273L;
+                public double[] value(double[] point) {
+                    double[][] m = jacobian(point);
+                    double[] partial = new double[m.length];
+                    for (int j = 0; j < partial.length; ++j) {
+                        partial[i] = m[i][j];
+                    }
+                    return partial;
+                }
+            };
+        }
+
+        public MultivariateVectorialFunction gradient(final int i) {
+            return new MultivariateVectorialFunction() {
+                private static final long serialVersionUID = -43357217231860547L;
+                public double[] value(double[] point) {
+                    return jacobian(point)[i];
+                }
+            };
+        }
+
+        public MultivariateMatrixFunction jacobian() {
+            return new MultivariateMatrixFunction() {
+                private static final long serialVersionUID = -4340046230875165095L;
+                public double[][] value(double[] point) {
+                    return jacobian(point);
+                }
+            };
+        }
+
     }
 
-    private static class QuadraticProblem implements VectorialDifferentiableObjectiveFunction {
+    private static class QuadraticProblem implements DifferentiableMultivariateVectorialFunction {
 
-        private static final long serialVersionUID = -247096133023967957L;
+        private static final long serialVersionUID = 7072187082052755854L;
         private List<Double> x;
         private List<Double> y;
 
@@ -626,7 +682,7 @@
             this.y.add(y);
         }
 
-        public double[][] jacobian(double[] variables, double[] value) {
+        private double[][] jacobian(double[] variables) {
             double[][] jacobian = new double[x.size()][3];
             for (int i = 0; i < jacobian.length; ++i) {
                 jacobian[i][0] = x.get(i) * x.get(i);
@@ -636,7 +692,7 @@
             return jacobian;
         }
 
-        public double[] objective(double[] variables) {
+        public double[] value(double[] variables) {
             double[] values = new double[x.size()];
             for (int i = 0; i < values.length; ++i) {
                 values[i] = (variables[0] * x.get(i) + variables[1]) * x.get(i) + variables[2];
@@ -644,6 +700,38 @@
             return values;
         }
 
+        public MultivariateVectorialFunction partialDerivative(final int i) {
+            return new MultivariateVectorialFunction() {
+                private static final long serialVersionUID = 2371658898687841192L;
+                public double[] value(double[] point) {
+                    double[][] m = jacobian(point);
+                    double[] partial = new double[m.length];
+                    for (int j = 0; j < partial.length; ++j) {
+                        partial[i] = m[i][j];
+                    }
+                    return partial;
+                }
+            };
+        }
+
+        public MultivariateVectorialFunction gradient(final int i) {
+            return new MultivariateVectorialFunction() {
+                private static final long serialVersionUID = 6863958501785879369L;
+                public double[] value(double[] point) {
+                    return jacobian(point)[i];
+                }
+            };
+        }
+
+        public MultivariateMatrixFunction jacobian() {
+            return new MultivariateMatrixFunction() {
+                private static final long serialVersionUID = -8673650298627399464L;
+                public double[][] value(double[] point) {
+                    return jacobian(point);
+                }
+            };
+        }
+
     }
 
     public static Test suite() {

Modified: commons/proper/math/trunk/src/test/org/apache/commons/math/optimization/general/MinpackTest.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/org/apache/commons/math/optimization/general/MinpackTest.java?rev=758058&r1=758057&r2=758058&view=diff
==============================================================================
--- commons/proper/math/trunk/src/test/org/apache/commons/math/optimization/general/MinpackTest.java (original)
+++ commons/proper/math/trunk/src/test/org/apache/commons/math/optimization/general/MinpackTest.java Tue Mar 24 22:15:08 2009
@@ -19,14 +19,17 @@
 
 import java.util.Arrays;
 
-import org.apache.commons.math.optimization.ObjectiveException;
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.apache.commons.math.FunctionEvaluationException;
+import org.apache.commons.math.analysis.DifferentiableMultivariateVectorialFunction;
+import org.apache.commons.math.analysis.MultivariateMatrixFunction;
+import org.apache.commons.math.analysis.MultivariateVectorialFunction;
 import org.apache.commons.math.optimization.OptimizationException;
-import org.apache.commons.math.optimization.VectorialDifferentiableObjectiveFunction;
 import org.apache.commons.math.optimization.VectorialPointValuePair;
 
-
-import junit.framework.*;
-
 /**
  * <p>Some of the unit tests are re-implementations of the MINPACK <a
  * href="http://www.netlib.org/minpack/ex/file17">file17</a> and <a
@@ -520,13 +523,13 @@
           assertTrue(function.checkTheoreticalMinParams(optimum));
       } catch (OptimizationException lsse) {
           assertTrue(exceptionExpected);
-      } catch (ObjectiveException oe) {
+      } catch (FunctionEvaluationException fe) {
           assertTrue(exceptionExpected);
       }
   }
 
   private static abstract class MinpackFunction
-      implements VectorialDifferentiableObjectiveFunction {
+      implements DifferentiableMultivariateVectorialFunction {
  
       private static final long serialVersionUID = -6209760235478794233L;
       protected int      n;
@@ -597,9 +600,41 @@
           return true;
       }
 
-      public abstract double[][] jacobian(double[] variables, double[] value);
+      public MultivariateVectorialFunction partialDerivative(final int i) {
+          return new MultivariateVectorialFunction() {
+            private static final long serialVersionUID = 2192585229396907068L;
+            public double[] value(double[] point) {
+                  double[][] m = jacobian(point);
+                  double[] partial = new double[m.length];
+                  for (int j = 0; j < partial.length; ++j) {
+                      partial[i] = m[i][j];
+                  }
+                  return partial;
+              }
+          };
+      }
+
+      public MultivariateVectorialFunction gradient(final int i) {
+          return new MultivariateVectorialFunction() {
+            private static final long serialVersionUID = -5562016064510078300L;
+            public double[] value(double[] point) {
+                  return jacobian(point)[i];
+              }
+          };
+      }
+
+      public MultivariateMatrixFunction jacobian() {
+          return new MultivariateMatrixFunction() {
+            private static final long serialVersionUID = -2435076097232923678L;
+            public double[][] value(double[] point) {
+                  return jacobian(point);
+              }
+          };
+      }
+
+      public abstract double[][] jacobian(double[] variables);
 
-      public abstract double[] objective(double[] variables);
+      public abstract double[] value(double[] variables);
 
   }
 
@@ -614,7 +649,7 @@
             buildArray(n, -1.0));
     }
 
-    public double[][] jacobian(double[] variables, double[] value) {
+    public double[][] jacobian(double[] variables) {
       double t = 2.0 / m;
       double[][] jacobian = new double[m][];
       for (int i = 0; i < m; ++i) {
@@ -626,7 +661,7 @@
       return jacobian;
     }
 
-    public double[] objective(double[] variables) {
+    public double[] value(double[] variables) {
       double sum = 0;
       for (int i = 0; i < n; ++i) {
         sum += variables[i];
@@ -652,7 +687,7 @@
       super(m, buildArray(n, x0), theoreticalMinCost, null);
     }
 
-    public double[][] jacobian(double[] variables, double[] value) {
+    public double[][] jacobian(double[] variables) {
       double[][] jacobian = new double[m][];
       for (int i = 0; i < m; ++i) {
         jacobian[i] = new double[n];
@@ -663,7 +698,7 @@
       return jacobian;
     }
 
-    public double[] objective(double[] variables) {
+    public double[] value(double[] variables) {
       double[] f = new double[m];
       double sum = 0;
       for (int i = 0; i < n; ++i) {
@@ -687,7 +722,7 @@
             null);
     }
 
-    public double[][] jacobian(double[] variables, double[] value) {
+    public double[][] jacobian(double[] variables) {
       double[][] jacobian = new double[m][];
       for (int i = 0; i < m; ++i) {
         jacobian[i] = new double[n];
@@ -706,7 +741,7 @@
       return jacobian;
     }
 
-    public double[] objective(double[] variables) {
+    public double[] value(double[] variables) {
       double[] f = new double[m];
       double sum = 0;
       for (int i = 1; i < (n - 1); ++i) {
@@ -729,12 +764,12 @@
       super(2, startParams, 0.0, buildArray(2, 1.0));
     }
 
-    public double[][] jacobian(double[] variables, double[] value) {
+    public double[][] jacobian(double[] variables) {
       double x1 = variables[0];
       return new double[][] { { -20 * x1, 10 }, { -1, 0 } };
     }
 
-    public double[] objective(double[] variables) {
+    public double[] value(double[] variables) {
       double x1 = variables[0];
       double x2 = variables[1];
       return new double[] { 10 * (x2 - x1 * x1), 1 - x1 };
@@ -751,7 +786,7 @@
       super(3, startParams, 0.0, new double[] { 1.0, 0.0, 0.0 });
     }
 
-    public double[][] jacobian(double[] variables, double[] value) {
+    public double[][] jacobian(double[] variables) {
       double x1 = variables[0];
       double x2 = variables[1];
       double tmpSquare = x1 * x1 + x2 * x2;
@@ -764,7 +799,7 @@
       };
     }
 
-    public double[] objective(double[] variables) {
+    public double[] value(double[] variables) {
       double x1 = variables[0];
       double x2 = variables[1];
       double x3 = variables[2];
@@ -798,7 +833,7 @@
       super(4, startParams, 0.0, buildArray(4, 0.0));
     }
 
-    public double[][] jacobian(double[] variables, double[] value) {
+    public double[][] jacobian(double[] variables) {
       double x1 = variables[0];
       double x2 = variables[1];
       double x3 = variables[2];
@@ -811,7 +846,7 @@
       };
     }
 
-    public double[] objective(double[] variables) {
+    public double[] value(double[] variables) {
       double x1 = variables[0];
       double x2 = variables[1];
       double x3 = variables[2];
@@ -841,7 +876,7 @@
             theoreticalMinParams);
     }
 
-    public double[][] jacobian(double[] variables, double[] value) {
+    public double[][] jacobian(double[] variables) {
       double x2 = variables[1];
       return new double[][] {
         { 1, x2 * (10 - 3 * x2) -  2 },
@@ -849,7 +884,7 @@
       };
     }
 
-    public double[] objective(double[] variables) {
+    public double[] value(double[] variables) {
       double x1 = variables[0];
       double x2 = variables[1];
       return new double[] {
@@ -872,7 +907,7 @@
             theoreticalMinParams);
     }
 
-    public double[][] jacobian(double[] variables, double[] value) {
+    public double[][] jacobian(double[] variables) {
       double   x2 = variables[1];
       double   x3 = variables[2];
       double[][] jacobian = new double[m][];
@@ -887,7 +922,7 @@
       return jacobian;
     }
 
-    public double[] objective(double[] variables) {
+    public double[] value(double[] variables) {
       double   x1 = variables[0];
       double   x2 = variables[1];
       double   x3 = variables[2];
@@ -925,7 +960,7 @@
       }
     }
 
-    public double[][] jacobian(double[] variables, double[] value) {
+    public double[][] jacobian(double[] variables) {
       double   x1 = variables[0];
       double   x2 = variables[1];
       double   x3 = variables[2];
@@ -942,7 +977,7 @@
       return jacobian;
     }
 
-    public double[] objective(double[] variables) {
+    public double[] value(double[] variables) {
       double x1 = variables[0];
       double x2 = variables[1];
       double x3 = variables[2];
@@ -981,7 +1016,7 @@
       }
     }
 
-    public double[][] jacobian(double[] variables, double[] value) {
+    public double[][] jacobian(double[] variables) {
       double   x1 = variables[0];
       double   x2 = variables[1];
       double   x3 = variables[2];
@@ -996,7 +1031,7 @@
       return jacobian;
     }
 
-    public double[] objective(double[] variables) {
+    public double[] value(double[] variables) {
       double x1 = variables[0];
       double x2 = variables[1];
       double x3 = variables[2];
@@ -1028,7 +1063,7 @@
             theoreticalMinParams);
     }
 
-    public double[][] jacobian(double[] variables, double[] value) {
+    public double[][] jacobian(double[] variables) {
 
       double[][] jacobian = new double[m][];
 
@@ -1060,7 +1095,7 @@
 
     }
 
-    public double[] objective(double[] variables) {
+    public double[] value(double[] variables) {
      double[] f = new double[m];
      for (int i = 0; i < (m - 2); ++i) {
        double div = (i + 1) / 29.0;
@@ -1100,7 +1135,7 @@
             new double[] { 1.0, 10.0, 1.0 });
    }
 
-    public double[][] jacobian(double[] variables, double[] value) {
+    public double[][] jacobian(double[] variables) {
       double   x1 = variables[0];
       double   x2 = variables[1];
       double[][] jacobian = new double[m][];
@@ -1115,7 +1150,7 @@
       return jacobian;
     }
 
-    public double[] objective(double[] variables) {
+    public double[] value(double[] variables) {
       double x1 = variables[0];
       double x2 = variables[1];
       double x3 = variables[2];
@@ -1142,7 +1177,7 @@
             theoreticalMinParams);
     }
 
-    public double[][] jacobian(double[] variables, double[] value) {
+    public double[][] jacobian(double[] variables) {
       double   x1 = variables[0];
       double   x2 = variables[1];
       double[][] jacobian = new double[m][];
@@ -1153,7 +1188,7 @@
       return jacobian;
     }
 
-    public double[] objective(double[] variables) {
+    public double[] value(double[] variables) {
       double x1 = variables[0];
       double x2 = variables[1];
       double[] f = new double[m];
@@ -1178,7 +1213,7 @@
             theoreticalMinParams);
     }
 
-    public double[][] jacobian(double[] variables, double[] value) {
+    public double[][] jacobian(double[] variables) {
       double   x1 = variables[0];
       double   x2 = variables[1];
       double   x3 = variables[2];
@@ -1196,7 +1231,7 @@
       return jacobian;
     }
 
-    public double[] objective(double[] variables) {
+    public double[] value(double[] variables) {
       double x1 = variables[0];
       double x2 = variables[1];
       double x3 = variables[2];
@@ -1234,7 +1269,7 @@
             theoreticalMinParams);
     }
 
-    public double[][] jacobian(double[] variables, double[] value) {
+    public double[][] jacobian(double[] variables) {
 
       double[][] jacobian = new double[m][];
       for (int i = 0; i < m; ++i) {
@@ -1263,7 +1298,7 @@
 
     }
 
-    public double[] objective(double[] variables) {
+    public double[] value(double[] variables) {
 
       double[] f = new double[m];
 
@@ -1307,7 +1342,7 @@
             theoreticalMinParams);
     }
 
-    public double[][] jacobian(double[] variables, double[] value) {
+    public double[][] jacobian(double[] variables) {
       double[][] jacobian = new double[m][];
       for (int i = 0; i < m; ++i) {
         jacobian[i] = new double[n];
@@ -1340,7 +1375,7 @@
 
     }
 
-    public double[] objective(double[] variables) {
+    public double[] value(double[] variables) {
       double[] f = new double[m];
       double sum  = -(n + 1);
       double prod = 1;
@@ -1369,7 +1404,7 @@
             theoreticalMinParams);
     }
 
-    public double[][] jacobian(double[] variables, double[] value) {
+    public double[][] jacobian(double[] variables) {
       double   x2 = variables[1];
       double   x3 = variables[2];
       double   x4 = variables[3];
@@ -1386,7 +1421,7 @@
       return jacobian;
     }
 
-    public double[] objective(double[] variables) {
+    public double[] value(double[] variables) {
       double x1 = variables[0];
       double x2 = variables[1];
       double x3 = variables[2];
@@ -1422,7 +1457,7 @@
             theoreticalMinParams);
     }
 
-    public double[][] jacobian(double[] variables, double[] value) {
+    public double[][] jacobian(double[] variables) {
       double   x01 = variables[0];
       double   x02 = variables[1];
       double   x03 = variables[2];
@@ -1458,7 +1493,7 @@
       return jacobian;
     }
 
-    public double[] objective(double[] variables) {
+    public double[] value(double[] variables) {
       double x01 = variables[0];
       double x02 = variables[1];
       double x03 = variables[2];