Hi Gilles,

Looks good to me. It is the explicit update now. I would like to propose 
different names for the new function:
    "applyConstraints()" or "renormalize()"

Thanks,
Olexiy

-----Original Message-----
From: Gilles [mailto:gil...@harfang.homelinux.org] 
Sent: Monday, September 08, 2014 3:11 AM
To: dev@commons.apache.org
Subject: Re: [math] Side effect of LevenbergMarquardtOptimizer

On Thu, 4 Sep 2014 12:52:24 -0400, Evan Ward wrote:
> Hi Olexiy,
>
> In my field we often encounter a similar problem when estimating 
> attitude since a quaternion is only a valid rotation when it is 
> normalized. We often escape this issue by estimating a "small"
> adjustment to an apriori guess. (For the details see [1].)  For this 
> technique to work the cost function must be smooth and the apriori 
> guess must be "close enough" to the true value. Both of these 
> assumptions are also required to apply a non-linear least squares 
> optimizer. Perhaps you can apply a similar technique to your problem. 
> (It seems that your 'A'
> parameter is orientation in 3D space.)
>
> If there is a need for an extra steps, I would prefer to make those 
> explicit rather than depending on side effects of cost function 
> evaluation.

IIUC, the feature could be made explicit by adding a method to the 
"MultivariateJacobianFunction" interface to allow the user to change the point 
about to be evaluated:

interface MultivariateJacobianFunction {
   Pair<RealVector, RealMatrix> value(RealVector point);

   /** @param point Point provided by the optimizer. */
   /** @return the point that will actually be evaluated. */
   RealVector validate(RealVector point); }

Thus, in "LeastSquaresFactory":

private static class LocalLeastSquaresProblem
    extends AbstractOptimizationProblem<Evaluation>
    implements LeastSquaresProblem {

    // ...

    private final MultivariateJacobianFunction model;

    // ...

    public Evaluation evaluate(final RealVector point) {
      final RealVector p = model.validate(point).copy(); // <--- Change here 
(at line 403).

      if (lazyEvaluation) {
        return new LazyUnweightedEvaluation(model,
                                            target,
                                            p);
      } else {
        final Pair<RealVector, RealMatrix> value = model.value(p);
        return new UnweightedEvaluation(value.getFirst(),
                                        value.getSecond(),
                                        target,
                                        p);
      }
   }

   // ...
}

What do you think?

Best,
Gilles

>
> Best Regards,
> Evan
>
> [1] Crassidis, John L., and John L. Junkins. /Optimal Estimation of 
> Dynamic Systems/. Boca Raton, FL: CRC, 2012.
>
> On 09/04/2014 05:37 AM, Olexiy Movchan wrote:
>> Hello,
>>
>> I created the math issue
>> https://issues.apache.org/jira/browse/MATH-1144.
>>
>> In version 2.0, LevenbergMarquardtOptimizer passed point to evaluator 
>> by reference. So our software could modify it on every step of 
>> algorithm.
>> In version 3.3, point is copied and then passed to evaluator, so it 
>> can't be updated by evaluator.
>>
>> We use LevenbergMarquardtOptimizer for 3d surface fitting (cylinders, 
>> cones, tori) by sampled points. And surface parameters should be 
>> renormalized on every step of algorithm. Please see this
>> article:
>>                 
>> http://nvlpubs.nist.gov/nistpubs/jres/103/6/j36sha.pdf
>>
>> Also please read the description of MATH-1144 jira issue.
>>
>> Can you modify optimizer or evaluator interface to allow in/out 
>> parameters there?
>>
>> Thanks,
>> Olexiy Movchan
>>
>>


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
For additional commands, e-mail: dev-h...@commons.apache.org

Reply via email to