Example usage for org.apache.commons.math.analysis DifferentiableMultivariateRealFunction DifferentiableMultivariateRealFunction

List of usage examples for org.apache.commons.math.analysis DifferentiableMultivariateRealFunction DifferentiableMultivariateRealFunction

Introduction

In this page you can find the example usage for org.apache.commons.math.analysis DifferentiableMultivariateRealFunction DifferentiableMultivariateRealFunction.

Prototype

DifferentiableMultivariateRealFunction

Source Link

Usage

From source file:uk.ac.diamond.scisoft.analysis.optimize.ApacheConjugateGradient.java

@Override
public void optimize(IDataset[] coords, IDataset data, final IFunction function) throws Exception {

    // pull out appropriate data from the inputs in a way that they can be used
    final int numCoords = coords.length;
    final DoubleDataset[] newCoords = new DoubleDataset[numCoords];
    for (int i = 0; i < numCoords; i++) {
        newCoords[i] = (DoubleDataset) DatasetUtils.convertToAbstractDataset(coords[i])
                .cast(AbstractDataset.FLOAT64);
    }/*  www  .ja  va  2s . c  o m*/

    final DoubleDataset values = (DoubleDataset) DatasetUtils.convertToAbstractDataset(data)
            .cast(AbstractDataset.FLOAT64);

    NonLinearConjugateGradientOptimizer cg = new NonLinearConjugateGradientOptimizer(
            ConjugateGradientFormula.POLAK_RIBIERE);

    //FIXME - this does not work very well for many cases.
    DifferentiableMultivariateRealFunction f = new DifferentiableMultivariateRealFunction() {

        @Override
        public double value(double[] arg0) throws FunctionEvaluationException, IllegalArgumentException {
            function.setParameterValues(arg0);
            return function.residual(true, values, newCoords);

        }

        @Override
        public MultivariateRealFunction partialDerivative(final int parameter) {

            MultivariateRealFunction result = new MultivariateRealFunction() {

                @Override
                public double value(double[] parameters)
                        throws FunctionEvaluationException, IllegalArgumentException {
                    double step = 0.1;
                    parameters[parameter] -= step;
                    function.setParameterValues(parameters);
                    double min = function.residual(true, values, newCoords);
                    parameters[parameter] += 2.0 * step;
                    function.setParameterValues(parameters);
                    double max = function.residual(true, values, newCoords);
                    return -((max - min) / (2.0 * step));
                }
            };

            return result;
        }

        @Override
        public MultivariateVectorialFunction gradient() {

            MultivariateVectorialFunction result = new MultivariateVectorialFunction() {

                @Override
                public double[] value(double[] parameters)
                        throws FunctionEvaluationException, IllegalArgumentException {
                    double[] result = new double[parameters.length];
                    for (int i = 0; i < parameters.length; i++) {
                        result[i] = partialDerivative(i).value(parameters);
                    }
                    return result;
                }
            };
            return result;
        }
    };

    double[] start = function.getParameterValues();

    RealPointValuePair result = cg.optimize(f, GoalType.MINIMIZE, start);
    function.setParameterValues(result.getPoint());
}