Gilles Sadowski <gil...@harfang.homelinux.org> a écrit :

>Hello.
> 
>> > 
>> > I would propose to simply revert my changes on the optimization
>package 
>> > and prepare for a reorganization for 4.0. I understand I focused
>only on
>> > the type of problems Gilles and myself routinely use, i .e. small
>size problems 
>> > where the cost of the evaluation is several orders of magnitude
>larger than the
>> > data copying. I forgot the dual case with  very large data sets. I
>apologize for that.
>> 
>> In the context of an FLOSS project, I don't think that you should
>apologize
>> for that. We all do our best (and sometimes beyond) and the lack of
>full
>> problem coverage should certainly not rest on the usual suspects (eh,
>> contributors, I mean. ;-)
>> 
>> > 
>> > When 3.1 will be out, we will have to solve this so both  cases are
>handled efficiently, 
>> > and this would probably be implemented in 4.0.
>> > 
>> > Does this seems reasonable? 
>> 
>> At this point, no!
>> 
>> I really want to understand what is wrong, and improve the API on all
>> accounts (the issues you had, the one I raised, and the feedback from
>> Konstantin, plus advice from others if possible).
>
>If I understood correctly, the main API problem is that the objective
>function and gradient or Jacobian are accessed separately. This forces
>users
>who have code to compute the value and Jacobian together to create an
>adapter
>that can return the two functions (objective and Jacobian) required by
>the
>API but would avoid the computation if the a call to the other was
>already
>made with the same parameter values.
>
>For example, instead of passing a
>"DifferentiableMultivariateVectorFunction"
>to the method "optimize" in "AbstractLeastSquareOptimizer", a type like
>the
>following would be required:
>-----
>interface VectorFunctionWithJacobian {
>  ValueAndGradient[] computeValueAndJacobian(double[] parameters);
>}
>-----
>with
>-----
>public class ValueAndGradient {
>    /** Value of a function at a given point. */
>    private final double value;
>    /** Gradient of the function at the same point. */
>    private final double[] gradient;
>
>    /**
>     * Creates an instance for the given value and gradient.
>* Note that no copy is performed: this instance will contain references
>     * to the original data.
>     *
>     * @param value Value.
>     * @param gradient Vector.
>     */
>    public ValueAndGradient(double value,
>                            double[] gradient) {
>        this.value = value;
>        this.gradient = gradient;
>    }
>
>    /**
>     * @eturn a reference to the value.
>     */
>    public double getValue() {
>    }
>    /**
>     * @eturn a reference to the gradient.
>     */
>    public double[] getGradient() {
>        return gradient;
>    }
>}
>-----
>
>Is that a better approach?
>
>IIUC, the "DerivativeStructure" can also be used if just as a storage
>layout
>equivalent to "ValueAndGradient". If so, then the new proposed API
>(where the objective function is a
>"MultivariateDifferentiableVectorFunction")
>is indeed better than the old, except for the (perhaps major) caveat
>that
>from the "optimization" package, it indeed looks over-engineered and
>quite
>unfamiliar.

Most importantly, it forces data copies, which is a problem for large data sets.

Best regards
Luc

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

-- 
Envoyé de mon téléphone Android avec K-9 Mail. Excusez la brièveté.

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

Reply via email to