1dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond/*
2dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * Licensed to the Apache Software Foundation (ASF) under one or more
3dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * contributor license agreements.  See the NOTICE file distributed with
4dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * this work for additional information regarding copyright ownership.
5dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * The ASF licenses this file to You under the Apache License, Version 2.0
6dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * (the "License"); you may not use this file except in compliance with
7dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * the License.  You may obtain a copy of the License at
8dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond *
9dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond *      http://www.apache.org/licenses/LICENSE-2.0
10dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond *
11dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * Unless required by applicable law or agreed to in writing, software
12dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * distributed under the License is distributed on an "AS IS" BASIS,
13dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * See the License for the specific language governing permissions and
15dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * limitations under the License.
16dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond */
17dee0849a9704d532af0b550146cbafbaa6ee1d19Raymondpackage org.apache.commons.math.optimization.univariate;
18dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond
19dee0849a9704d532af0b550146cbafbaa6ee1d19Raymondimport org.apache.commons.math.FunctionEvaluationException;
20dee0849a9704d532af0b550146cbafbaa6ee1d19Raymondimport org.apache.commons.math.exception.NotStrictlyPositiveException;
21dee0849a9704d532af0b550146cbafbaa6ee1d19Raymondimport org.apache.commons.math.MaxIterationsExceededException;
22dee0849a9704d532af0b550146cbafbaa6ee1d19Raymondimport org.apache.commons.math.analysis.UnivariateRealFunction;
23dee0849a9704d532af0b550146cbafbaa6ee1d19Raymondimport org.apache.commons.math.optimization.GoalType;
24dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond
25dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond/**
26dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * Provide an interval that brackets a local optimum of a function.
27dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * This code is based on a Python implementation (from <em>SciPy</em>,
28dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * module {@code optimize.py} v0.5).
29dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * @version $Revision$ $Date$
30dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * @since 2.2
31dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond */
32dee0849a9704d532af0b550146cbafbaa6ee1d19Raymondpublic class BracketFinder {
33dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    /** Tolerance to avoid division by zero. */
34dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    private static final double EPS_MIN = 1e-21;
35dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    /**
36dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     * Golden section.
37dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     */
38dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    private static final double GOLD = 1.618034;
39dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    /**
40dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     * Factor for expanding the interval.
41dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     */
42dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    private final double growLimit;
43dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    /**
44dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     * Maximum number of iterations.
45dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     */
46dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    private final int maxIterations;
47dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    /**
48dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     * Number of iterations.
49dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     */
50dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    private int iterations;
51dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    /**
52dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     * Number of function evaluations.
53dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     */
54dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    private int evaluations;
55dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    /**
56dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     * Lower bound of the bracket.
57dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     */
58dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    private double lo;
59dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    /**
60dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     * Higher bound of the bracket.
61dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     */
62dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    private double hi;
63dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    /**
64dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     * Point inside the bracket.
65dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     */
66dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    private double mid;
67dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    /**
68dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     * Function value at {@link #lo}.
69dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     */
70dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    private double fLo;
71dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    /**
72dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     * Function value at {@link #hi}.
73dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     */
74dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    private double fHi;
75dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    /**
76dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     * Function value at {@link #mid}.
77dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     */
78dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    private double fMid;
79dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond
80dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    /**
81dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     * Constructor with default values {@code 100, 50} (see the
82dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     * {@link #BracketFinder(double,int) other constructor}).
83dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     */
84dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    public BracketFinder() {
85dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond        this(100, 50);
86dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    }
87dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond
88dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    /**
89dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     * Create a bracketing interval finder.
90dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     *
91dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     * @param growLimit Expanding factor.
92dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     * @param maxIterations Maximum number of iterations allowed for finding
93dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     * a bracketing interval.
94dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     */
95dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    public BracketFinder(double growLimit,
96dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond                         int maxIterations) {
97dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond        if (growLimit <= 0) {
98dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond            throw new NotStrictlyPositiveException(growLimit);
99dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond        }
100dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond        if (maxIterations <= 0) {
101dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond            throw new NotStrictlyPositiveException(maxIterations);
102dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond        }
103dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond
104dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond        this.growLimit = growLimit;
105dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond        this.maxIterations = maxIterations;
106dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    }
107dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond
108dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    /**
109dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     * Search new points that bracket a local optimum of the function.
110dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     *
111dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     * @param func Function whose optimum should be bracketted.
112dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     * @param goal {@link GoalType Goal type}.
113dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     * @param xA Initial point.
114dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     * @param xB Initial point.
115dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     * @throws MaxIterationsExceededException if the maximum iteration count
116dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     * is exceeded.
117dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     * @throws FunctionEvaluationException if an error occurs evaluating the function.
118dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     */
119dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    public void search(UnivariateRealFunction func,
120dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond                       GoalType goal,
121dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond                       double xA,
122dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond                       double xB)
123dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond        throws MaxIterationsExceededException, FunctionEvaluationException {
124dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond        reset();
125dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond        final boolean isMinim = goal == GoalType.MINIMIZE;
126dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond
127dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond        double fA = eval(func, xA);
128dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond        double fB = eval(func, xB);
129dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond        if (isMinim ?
130dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond            fA < fB :
131dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond            fA > fB) {
132dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond            double tmp = xA;
133dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond            xA = xB;
134dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond            xB = tmp;
135dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond
136dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond            tmp = fA;
137dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond            fA = fB;
138dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond            fB = tmp;
139dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond        }
140dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond
141dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond        double xC = xB + GOLD * (xB - xA);
142dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond        double fC = eval(func, xC);
143dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond
144dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond        while (isMinim ? fC < fB : fC > fB) {
145dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond            if (++iterations > maxIterations) {
146dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond                throw new MaxIterationsExceededException(maxIterations);
147dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond            }
148dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond
149dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond            double tmp1 = (xB - xA) * (fB - fC);
150dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond            double tmp2 = (xB - xC) * (fB - fA);
151dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond
152dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond            double val = tmp2 - tmp1;
153dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond            double denom = Math.abs(val) < EPS_MIN ? 2 * EPS_MIN : 2 * val;
154dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond
155dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond            double w = xB - ((xB - xC) * tmp2 - (xB -xA) * tmp1) / denom;
156dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond            double wLim = xB + growLimit * (xC - xB);
157dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond
158dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond            double fW;
159dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond            if ((w - xC) * (xB - w) > 0) {
160dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond                fW = eval(func, w);
161dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond                if (isMinim ?
162dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond                    fW < fC :
163dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond                    fW > fC) {
164dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond                    xA = xB;
165dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond                    xB = w;
166dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond                    fA = fB;
167dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond                    fB = fW;
168dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond                    break;
169dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond                } else if (isMinim ?
170dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond                           fW > fB :
171dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond                           fW < fB) {
172dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond                    xC = w;
173dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond                    fC = fW;
174dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond                    break;
175dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond                }
176dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond                w = xC + GOLD * (xC - xB);
177dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond                fW = eval(func, w);
178dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond            } else if ((w - wLim) * (wLim - xC) >= 0) {
179dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond                w = wLim;
180dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond                fW = eval(func, w);
181dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond            } else if ((w - wLim) * (xC - w) > 0) {
182dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond                fW = eval(func, w);
183dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond                if (isMinim ?
184dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond                    fW < fC :
185dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond                    fW > fC) {
186dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond                    xB = xC;
187dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond                    xC = w;
188dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond                    w = xC + GOLD * (xC -xB);
189dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond                    fB = fC;
190dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond                    fC =fW;
191dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond                    fW = eval(func, w);
192dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond                }
193dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond            } else {
194dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond                w = xC + GOLD * (xC - xB);
195dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond                fW = eval(func, w);
196dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond            }
197dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond
198dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond            xA = xB;
199dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond            xB = xC;
200dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond            xC = w;
201dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond            fA = fB;
202dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond            fB = fC;
203dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond            fC = fW;
204dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond        }
205dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond
206dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond        lo = xA;
207dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond        mid = xB;
208dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond        hi = xC;
209dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond        fLo = fA;
210dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond        fMid = fB;
211dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond        fHi = fC;
212dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    }
213dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond
214dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    /**
215dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     * @return the number of iterations.
216dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     */
217dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    public int getIterations() {
218dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond        return iterations;
219dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    }
220dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    /**
221dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     * @return the number of evaluations.
222dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     */
223dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    public int getEvaluations() {
224dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond        return evaluations;
225dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    }
226dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond
227dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    /**
228dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     * @return the lower bound of the bracket.
229dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     * @see #getFLow()
230dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     */
231dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    public double getLo() {
232dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond        return lo;
233dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    }
234dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond
235dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    /**
236dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     * Get function value at {@link #getLo()}.
237dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     * @return function value at {@link #getLo()}
238dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     */
239dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    public double getFLow() {
240dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond        return fLo;
241dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    }
242dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond
243dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    /**
244dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     * @return the higher bound of the bracket.
245dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     * @see #getFHi()
246dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     */
247dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    public double getHi() {
248dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond        return hi;
249dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    }
250dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond
251dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    /**
252dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     * Get function value at {@link #getHi()}.
253dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     * @return function value at {@link #getHi()}
254dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     */
255dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    public double getFHi() {
256dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond        return fHi;
257dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    }
258dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond
259dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    /**
260dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     * @return a point in the middle of the bracket.
261dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     * @see #getFMid()
262dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     */
263dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    public double getMid() {
264dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond        return mid;
265dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    }
266dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond
267dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    /**
268dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     * Get function value at {@link #getMid()}.
269dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     * @return function value at {@link #getMid()}
270dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     */
271dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    public double getFMid() {
272dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond        return fMid;
273dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    }
274dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond
275dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    /**
276dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     * @param f Function.
277dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     * @param x Argument.
278dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     * @return {@code f(x)}
279dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     * @throws FunctionEvaluationException if function cannot be evaluated at x
280dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     */
281dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    private double eval(UnivariateRealFunction f, double x)
282dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond        throws FunctionEvaluationException {
283dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond
284dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond        ++evaluations;
285dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond        return f.value(x);
286dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    }
287dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond
288dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    /**
289dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     * Reset internal state.
290dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     */
291dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    private void reset() {
292dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond        iterations = 0;
293dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond        evaluations = 0;
294dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    }
295dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond}
296