1 // This is core/vnl/algo/vnl_brent.cxx
2
3 #include <cassert>
4 #include "vnl_brent.h"
5 #include <vnl/algo/vnl_bracket_minimum.h>
6
vnl_brent(vnl_cost_function * functor)7 vnl_brent::vnl_brent(vnl_cost_function * functor)
8 : vnl_brent_minimizer(*functor)
9 {}
10
11 vnl_brent::~vnl_brent() = default;
12
13 double
minimize_given_bounds(double ax,double bx,double cx,double tol,double * xmin)14 vnl_brent::minimize_given_bounds(double ax, double bx, double cx, double tol, double * xmin)
15 {
16 assert(xmin != nullptr);
17 this->set_x_tolerance(tol);
18 *xmin = vnl_brent_minimizer::minimize_given_bounds(ax, bx, cx);
19 return vnl_brent_minimizer::f_at_last_minimum();
20 }
21
22 double
minimize_given_bounds_and_1st_f(double ax,double bx,double fb,double cx,double tol,double * xmin)23 vnl_brent::minimize_given_bounds_and_1st_f(double ax, double bx, double fb, double cx, double tol, double * xmin)
24 {
25 assert(xmin != nullptr);
26 this->set_x_tolerance(tol);
27 *xmin = vnl_brent_minimizer::minimize_given_bounds_and_one_f(ax, bx, cx, fb);
28 return vnl_brent_minimizer::f_at_last_minimum();
29 }
30
31
32 void
bracket_minimum(double * ax,double * bx,double * cx)33 vnl_brent::bracket_minimum(double * ax, double * bx, double * cx)
34 {
35 double fa, fb, fc;
36 bracket_minimum(ax, bx, cx, &fa, &fb, &fc);
37 }
38
39 void
bracket_minimum(double * ax,double * bx,double * cx,double * fa,double * fb,double * fc)40 vnl_brent::bracket_minimum(double * ax, double * bx, double * cx, double * fa, double * fb, double * fc)
41 {
42 vnl_bracket_minimum(*f_, *cx, *bx, *ax, *fc, *fb, *fa);
43 }
44
45
46 double
minimize(double x)47 vnl_brent::minimize(double x)
48 {
49 double ax = x - 1.0;
50 double xx = x + 1.0;
51 double bx = 0.0;
52 double fa, fx, fb;
53 bracket_minimum(&ax, &xx, &bx, &fa, &fx, &fb);
54 minimize_given_bounds(bx, xx, ax, ftol, &x);
55 return x;
56 }
57