/* * File: AbstractLineBracketInterpolatorPolynomial.java * Authors: Kevin R. Dixon * Company: Sandia National Laboratories * Project: Cognitive Foundry * * Copyright Jun 17, 2008, Sandia Corporation. * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive * license for use of this work by or on behalf of the U.S. Government. * Export of this program may require a license from the United States * Government. See CopyrightHistory.txt for complete details. * */ package gov.sandia.cognition.learning.algorithm.minimization.line.interpolator; import gov.sandia.cognition.evaluator.Evaluator; import gov.sandia.cognition.learning.algorithm.minimization.line.LineBracket; import gov.sandia.cognition.learning.function.scalar.PolynomialFunction; /** * Partial implementation of a LineBracketInterpolator based on a closed-form * polynomial function. * @param <EvaluatorType> Type of Evaluator to consider * @author Kevin R. Dixon * @since 2.2 */ public abstract class AbstractLineBracketInterpolatorPolynomial<EvaluatorType extends Evaluator<Double,Double>> extends AbstractLineBracketInterpolator<EvaluatorType> { /** * Creates a new instance of AbstractLineBracketInterpolatorPolynomial * @param tolerance * Collinear tolerance of the algorithm. */ public AbstractLineBracketInterpolatorPolynomial( double tolerance ) { super( tolerance ); } public double findMinimum( LineBracket bracket, double minx, double maxx, EvaluatorType function ) { // Compute the interpolating polynomial first PolynomialFunction.ClosedForm interpolator = this.computePolynomial( bracket, function ); //Find the optimal stationary point within the required interval double fstar = Double.POSITIVE_INFINITY; double xstar = 0.0; Double[] stationaryPoints = interpolator.stationaryPoints(); for( int i = 0; i < stationaryPoints.length; i++ ) { double x = stationaryPoints[i]; if( (minx <= x) && (x <= maxx) ) { double f = interpolator.evaluate( x ); if( fstar > f ) { fstar = f; xstar = x; } } } // Find the lowest-value bound on the interval double bestBoundx; double bestBoundfx; double fminx = interpolator.evaluate( minx ); double fmaxx = interpolator.evaluate( maxx ); if( fminx < fmaxx ) { bestBoundx = minx; bestBoundfx = fminx; } else { bestBoundx = maxx; bestBoundfx = fmaxx; } // return the best of the stationary points OR the interval bound double bestx; if( fstar <= bestBoundfx ) { bestx = xstar; } else { bestx = bestBoundx; } return bestx; } /** * Fits the interpolating polynomial to the given LineBracket * @param bracket * LineBracket to consider * @param function * Function to use to fill in missing information * @return * Interpolating polynomial */ public abstract PolynomialFunction.ClosedForm computePolynomial( LineBracket bracket, EvaluatorType function ); }