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