[ 
https://issues.apache.org/jira/browse/MATH-303?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Phil Steitz closed MATH-303.
----------------------------


> CurveFitter.fit(ParametricRealFunction, double[]) used with 
> LevenbergMarquardtOptimizer throws ArrayIndexOutOfBoundsException when 
> double[] length > 1 (AbstractLeastSquaresOptimizer.java:187)
> -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: MATH-303
>                 URL: https://issues.apache.org/jira/browse/MATH-303
>             Project: Commons Math
>          Issue Type: Bug
>    Affects Versions: 2.0
>         Environment: Java, Linux Ubuntu 9.04 (64 bit)
>            Reporter: Daren Drummond
>             Fix For: 2.1
>
>
> CurveFitter.fit(ParametricRealFunction, double[]) throws 
> ArrayIndexOutOfBoundsException at AbstractLeastSquaresOptimizer.java:187 when 
> used with the  LevenbergMarquardtOptimizer  and the length of the initial 
> guess array is greater than 1.  The code will run if the initialGuess array 
> is of length 1, but then CurveFitter.fit() just returns the same value as the 
> initialGuess array (I'll file this as a separate issue).  Here is my example 
> code:
> {code:title=CurveFitter with LevenbergMarquardtOptimizer and 
> SimpleInverseFunction|borderStyle=solid}
>   LevenbergMarquardtOptimizer optimizer = new LevenbergMarquardtOptimizer();
>   CurveFitter fitter = new CurveFitter(optimizer);
>   fitter.addObservedPoint(2.805d, 0.6934785852953367d);
>   fitter.addObservedPoint(2.74333333333333d, 0.6306772025518496d);
>   fitter.addObservedPoint(1.655d, 0.9474675497289684);
>   fitter.addObservedPoint(1.725d, 0.9013594835804194d);
>   SimpleInverseFunction sif = new SimpleInverseFunction(); // Class provided 
> below
>   double[] initialguess = new double[2];
>   initialguess[0] = 1.0d;
>   initialguess[1] = .5d;
>   double[] bestCoefficients = fitter.fit(sif, initialguess); // <---- throws 
> exception here
>     /**
>      * This is my implementation of ParametricRealFunction
>      * Implements y = ax^-1 + b for use with an Apache CurveFitter 
> implementation
>       */
>     private class SimpleInverseFunction implements ParametricRealFunction
>     {
>         public double value(double x, double[] doubles) throws 
> FunctionEvaluationException
>         {
>             //y = ax^-1 + b
>             //"double[] must include at least 1 but not more than 2 
> coefficients."
>             if(doubles == null || doubles.length ==0 || doubles.length > 2) 
> throw new FunctionEvaluationException(doubles);
>             double a = doubles[0];
>             double b = 0;
>             if(doubles.length >= 2) b = doubles[1];
>             return a * Math.pow(x, -1d) + b;
>         }
>         public double[] gradient(double x, double[] doubles) throws 
> FunctionEvaluationException
>         {
>             //derivative: -ax^-2
>             //"double[] must include at least 1 but not more than 2 
> coefficients."
>             if(doubles == null || doubles.length ==0 || doubles.length > 2) 
> throw new FunctionEvaluationException(doubles);
>             double a = doubles[0];
>             double b = 0;
>             if(doubles.length >= 2) b = doubles[1];
>             double derivative = -a * Math.pow(x, -2d);
>             double[]gradientVector = new double[1];
>             gradientVector[0] = derivative;
>             return gradientVector; 
>         }
>     }
> {code} 
> This is the resulting stack trace:
> java.lang.ArrayIndexOutOfBoundsException: 1
>       at 
> org.apache.commons.math.optimization.general.AbstractLeastSquaresOptimizer.updateJacobian(AbstractLeastSquaresOptimizer.java:187)
>       at 
> org.apache.commons.math.optimization.general.LevenbergMarquardtOptimizer.doOptimize(LevenbergMarquardtOptimizer.java:241)
>       at 
> org.apache.commons.math.optimization.general.AbstractLeastSquaresOptimizer.optimize(AbstractLeastSquaresOptimizer.java:346)
>       at 
> org.apache.commons.math.optimization.fitting.CurveFitter.fit(CurveFitter.java:134)
>       at 
> com.yieldsoftware.analyticstest.tasks.ppcbidder.CurveFittingTest.testFitnessRankCurveIntercept(CurveFittingTest.java:181)

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
https://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to