Gilles, I like this approach. My only thought is that a separate interface for the validate method would be nicer for our Java 8 users. Then the implementation could be a lambda: (p) -> p.unitVector()
Best Regards, Evan On 09/07/2014 08:11 PM, Gilles wrote: > 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 > --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org For additional commands, e-mail: dev-h...@commons.apache.org