Example usage for org.apache.commons.math.optimization.general ConjugateGradientFormula POLAK_RIBIERE

List of usage examples for org.apache.commons.math.optimization.general ConjugateGradientFormula POLAK_RIBIERE

Introduction

In this page you can find the example usage for org.apache.commons.math.optimization.general ConjugateGradientFormula POLAK_RIBIERE.

Prototype

ConjugateGradientFormula POLAK_RIBIERE

To view the source code for org.apache.commons.math.optimization.general ConjugateGradientFormula POLAK_RIBIERE.

Click Source Link

Document

Polak-Ribière formula.

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 www.  java2s .c  om*/

    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());
}