26 #include <TooN/optimization/brent.h> 42 template<
int Size,
typename Precision,
typename Func>
struct LineSearch 54 :start(s),direction(d),f(func)
61 return f(start + x * direction);
79 Precision a, b, c, b_val, c_val;
84 Precision lambda=initial_lambda;
102 double last_good_lambda = lambda;
112 last_good_lambda = lambda;
129 double bad_lambda=lambda;
135 c = last_good_lambda + (bad_lambda - last_good_lambda)*l;
160 else if(lambda < zeps)
171 ret[0] = makeVector(a, a_val);
172 ret[1] = makeVector(b, b_val);
173 ret[2] = makeVector(c, c_val);
256 : size(start.size()),
257 g(size),h(size),minus_h(size),old_g(size),old_h(size),x(start),old_x(size)
259 init(start, func(start), deriv(start));
267 : size(start.size()),
268 g(size),h(size),minus_h(size),old_g(size),old_h(size),x(start),old_x(size)
270 init(start, func(start), deriv);
280 using std::numeric_limits;
293 tolerance =
sqrt(numeric_limits<Precision>::epsilon());
295 max_iterations = size * 100;
297 bracket_initial_lambda = 1;
299 linesearch_tolerance =
sqrt(numeric_limits<Precision>::epsilon());
300 linesearch_epsilon = 1e-20;
301 linesearch_max_iterations=100;
303 bracket_epsilon=1e-20;
330 double a = bracket[0][0];
331 double b = bracket[1][0];
332 double c = bracket[2][0];
334 double a_val = bracket[0][1];
335 double b_val = bracket[1][1];
336 double c_val = bracket[2][1];
343 if(a==0 && b== 0 && c == 0)
358 assert(a < b && b < c);
359 assert(a_val > b_val && b_val < c_val);
364 assert(m[0] >= a && m[0] <= c);
365 assert(m[1] <= b_val);
378 return iterations > max_iterations || 2*abs(y - old_y) <= tolerance * (abs(y) + abs(old_y) + epsilon);
397 Precision gamma = (g * g - old_g*g)/(old_g * old_g);
398 h = g + gamma * old_h;
419 template<
class Func,
class Deriv>
bool iterate(
const Func& func,
const Deriv& deriv)
421 find_next_point(func);
425 update_vectors_PR(deriv(x));
Precision bracket_epsilon
Minimum size for initial minima bracketing. Below this, it is assumed that the system has converged...
Definition: conjugate_gradient.h:247
Precision old_y
Function at old_x.
Definition: conjugate_gradient.h:236
This class provides a nonlinear conjugate-gradient optimizer.
Definition: conjugate_gradient.h:225
Precision linesearch_epsilon
Additive term in tolerance to prevent excessive iterations if . Known as ZEPS in numerical recipies...
Definition: conjugate_gradient.h:244
Pretty generic SFINAE introspection generator.
Definition: vec_test.cc:21
int max_iterations
Maximum number of iterations. Defaults to size .
Definition: conjugate_gradient.h:240
Precision bracket_initial_lambda
Initial stepsize used in bracketing the minimum for the line search. Defaults to 1.
Definition: conjugate_gradient.h:242
Vector< Size > h
Conjugate vector to be searched along in the next call to iterate()
Definition: conjugate_gradient.h:229
A matrix.
Definition: matrix.hh:105
void init(const Vector< Size > &start, const Precision &func, const Vector< Size > &deriv)
Initialize the ConjugateGradient class with sensible values.
Definition: conjugate_gradient.h:277
int iterations
Number of iterations performed.
Definition: conjugate_gradient.h:249
const Vector< Size, Precision > & start
Definition: conjugate_gradient.h:44
Vector< Size > old_g
Gradient vector used to compute $h$ in the last call to iterate()
Definition: conjugate_gradient.h:231
bool isnan(const Vector< S, P, B > &v)
Returns true if any element is NaN.
Definition: helpers.h:396
bool finished()
Check to see it iteration should stop.
Definition: conjugate_gradient.h:375
Vector< Size > minus_h
negative of h as this is required to be passed into a function which uses references (so can't be tem...
Definition: conjugate_gradient.h:230
ConjugateGradient(const Vector< Size > &start, const Func &func, const Deriv &deriv)
Initialize the ConjugateGradient class with sensible values.
Definition: conjugate_gradient.h:255
Precision linesearch_tolerance
Tolerance used to determine if the linesearch is complete. Defaults to square root of machine precisi...
Definition: conjugate_gradient.h:243
Precision y
Function at .
Definition: conjugate_gradient.h:235
Precision epsilon
Additive term in tolerance to prevent excessive iterations if . Known as ZEPS in numerical recipies...
Definition: conjugate_gradient.h:239
void update_vectors_PR(const Vector< Size > &grad)
After an iteration, update the gradient and conjugate using the Polak-Ribiere equations.
Definition: conjugate_gradient.h:389
Vector< 2, Precision > brent_line_search(Precision a, Precision x, Precision b, Precision fx, const Functor &func, int maxiterations, Precision tolerance=sqrt(numeric_limits< Precision >::epsilon()), Precision epsilon=numeric_limits< Precision >::epsilon())
brent_line_search performs Brent's golden section/quadratic interpolation search on the functor provi...
Definition: brent.h:55
const Vector< Size, Precision > & direction
Definition: conjugate_gradient.h:45
Vector< Size > g
Gradient vector used by the next call to iterate()
Definition: conjugate_gradient.h:228
ConjugateGradient(const Vector< Size > &start, const Func &func, const Vector< Size > &deriv)
Initialize the ConjugateGradient class with sensible values.
Definition: conjugate_gradient.h:266
Vector< Size > old_h
Conjugate vector searched along in the last call to iterate()
Definition: conjugate_gradient.h:232
bool iterate(const Func &func, const Deriv &deriv)
Use this function to iterate over the optimization.
Definition: conjugate_gradient.h:419
Vector< Size > old_x
Previous best known point (not set at construction)
Definition: conjugate_gradient.h:234
Precision operator()(Precision x) const
Definition: conjugate_gradient.h:59
Matrix< R, C, P > sqrt(const Matrix< R, C, P, B > &m)
computes a matrix square root of a matrix m by the product form of the Denman and Beavers iteration a...
Definition: helpers.h:350
LineSearch(const Vector< Size, Precision > &s, const Vector< Size, Precision > &d, const Func &func)
Set up the line search class.
Definition: conjugate_gradient.h:53
Vector< Size > x
Current position (best known point)
Definition: conjugate_gradient.h:233
Turn a multidimensional function in to a 1D function by specifying a point and direction.
Definition: conjugate_gradient.h:42
const int size
Dimensionality of the space.
Definition: conjugate_gradient.h:227
void find_next_point(const Func &func)
Perform a linesearch from the current point (x) along the current conjugate vector (h)...
Definition: conjugate_gradient.h:322
Matrix< 3, 2, Precision > bracket_minimum_forward(Precision a_val, const Func &func, Precision initial_lambda, Precision zeps)
Bracket a 1D function by searching forward from zero.
Definition: conjugate_gradient.h:76
const Func & f
Definition: conjugate_gradient.h:47
int linesearch_max_iterations
Maximum number of iterations in the linesearch. Defaults to 100.
Definition: conjugate_gradient.h:245
Precision tolerance
Tolerance used to determine if the optimization is complete. Defaults to square root of machine preci...
Definition: conjugate_gradient.h:238