/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.math.minimization; import static com.opengamma.analytics.math.matrix.MatrixAlgebraFactory.OG_ALGEBRA; import org.apache.commons.lang.Validate; import com.opengamma.analytics.math.function.Function1D; import com.opengamma.analytics.math.matrix.DoubleMatrix1D; /** * */ public class LineSearch { private final ScalarMinimizer _minimizer; private final MinimumBracketer _bracketer; public LineSearch(final ScalarMinimizer minimizer) { Validate.notNull(minimizer, "null minimizer"); _minimizer = minimizer; _bracketer = new ParabolicMinimumBracketer(); } public double minimise(final Function1D<DoubleMatrix1D, Double> function, final DoubleMatrix1D direction, final DoubleMatrix1D x) { Validate.notNull(function, "function"); Validate.notNull(direction, "direction"); Validate.notNull(x, "x"); final LineSearchFunction f = new LineSearchFunction(function, direction, x); final double[] bracketPoints = _bracketer.getBracketedPoints(f, 0, 1); if (bracketPoints[2] < bracketPoints[0]) { final double temp = bracketPoints[0]; bracketPoints[0] = bracketPoints[2]; bracketPoints[2] = temp; } return _minimizer.minimize(f, bracketPoints[1], bracketPoints[0], bracketPoints[2]); } private static class LineSearchFunction extends Function1D<Double, Double> { private final Function1D<DoubleMatrix1D, Double> _f; private final DoubleMatrix1D _p; private final DoubleMatrix1D _x0; public LineSearchFunction(final Function1D<DoubleMatrix1D, Double> function, final DoubleMatrix1D direction, final DoubleMatrix1D x) { _f = function; _p = direction; _x0 = x; } @Override public Double evaluate(final Double lambda) { final DoubleMatrix1D x = (DoubleMatrix1D) OG_ALGEBRA.add(_x0, OG_ALGEBRA.scale(_p, lambda)); return _f.evaluate(x); } } }