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

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

Introduction

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

Prototype

MultivariateVectorialFunction

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);
    }//from  ww w.java 2s  . co  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());
}