#include <conjugate_gradient.h>
Public Member Functions | |
template<class Func > | |
ConjugateGradient (const Vector< Size > &start, const Func &func, const Vector< Size > &deriv) | |
template<class Func , class Deriv > | |
ConjugateGradient (const Vector< Size > &start, const Func &func, const Deriv &deriv) | |
template<class Func > | |
void | find_next_point (const Func &func) |
bool | finished () |
void | init (const Vector< Size > &start, const Precision &func, const Vector< Size > &deriv) |
template<class Func , class Deriv > | |
bool | iterate (const Func &func, const Deriv &deriv) |
void | update_vectors_PR (const Vector< Size > &grad) |
Public Attributes | |
Precision | bracket_epsilon |
Minimum size for initial minima bracketing. Below this, it is assumed that the system has converged. Defaults to 1e-20. | |
Precision | bracket_initial_lambda |
Initial stepsize used in bracketing the minimum for the line search. Defaults to 1. | |
Precision | epsilon |
Additive term in tolerance to prevent excessive iterations if . Known as ZEPS in numerical recipies. Defaults to 1e-20. | |
Vector< Size > | g |
Gradient vector used by the next call to iterate(). | |
Vector< Size > | h |
Conjugate vector to be searched along in the next call to iterate(). | |
int | iterations |
Number of iterations performed. | |
Precision | linesearch_epsilon |
Additive term in tolerance to prevent excessive iterations if . Known as ZEPS in numerical recipies. Defaults to 1e-20. | |
int | linesearch_max_iterations |
Maximum number of iterations in the linesearch. Defaults to 100. | |
Precision | linesearch_tolerance |
Tolerance used to determine if the linesearch is complete. Defaults to square root of machine precision. | |
int | max_iterations |
Maximum number of iterations. Defaults to size . | |
Vector< Size > | minus_h |
negative of h as this is required to be passed into a function which uses references (so can't be temporary) | |
Vector< Size > | old_g |
Gradient vector used to compute $h$ in the last call to iterate(). | |
Vector< Size > | old_h |
Conjugate vector searched along in the last call to iterate(). | |
Vector< Size > | old_x |
Previous best known point (not set at construction). | |
Precision | old_y |
Function at old_x. | |
const int | size |
Dimensionality of the space. | |
Precision | tolerance |
Tolerance used to determine if the optimization is complete. Defaults to square root of machine precision. | |
Vector< Size > | x |
Current position (best known point). | |
Precision | y |
Function at . |
This class provides a nonlinear conjugate-gradient optimizer. The following code snippet will perform an optimization on the Rosenbrock Bananna function in two dimensions:
double Rosenbrock(const Vector<2>& v) { return sq(1 - v[0]) + 100 * sq(v[1] - sq(v[0])); } Vector<2> RosenbrockDerivatives(const Vector<2>& v) { double x = v[0]; double y = v[1]; Vector<2> ret; ret[0] = -2+2*x-400*(y-sq(x))*x; ret[1] = 200*y-200*sq(x); return ret; } int main() { ConjugateGradient<2> cg(makeVector(0,0), Rosenbrock, RosenbrockDerivatives); while(cg.iterate(Rosenbrock, RosenbrockDerivatives)) cout << "y_" << iteration << " = " << cg.y << endl; cout << "Optimal value: " << cg.y << endl; }
The chances are that you will want to read the documentation for ConjugateGradient::ConjugateGradient and ConjugateGradient::iterate.
Linesearch is currently performed using golden-section search and conjugate vector updates are performed using the Polak-Ribiere equations. There many tunable parameters, and the internals are readily accessible, so alternative termination conditions etc can easily be substituted. However, ususally these will not be necessary.
Definition at line 195 of file conjugate_gradient.h.
TooN::ConjugateGradient< Size, Precision >::ConjugateGradient | ( | const Vector< Size > & | start, | |
const Func & | func, | |||
const Deriv & | deriv | |||
) | [inline] |
Initialize the ConjugateGradient class with sensible values.
start | Starting point, x | |
func | Function f to compute | |
deriv | Function to compute |
Definition at line 225 of file conjugate_gradient.h.
TooN::ConjugateGradient< Size, Precision >::ConjugateGradient | ( | const Vector< Size > & | start, | |
const Func & | func, | |||
const Vector< Size > & | deriv | |||
) | [inline] |
Initialize the ConjugateGradient class with sensible values.
start | Starting point, x | |
func | Function f to compute | |
deriv |
Definition at line 236 of file conjugate_gradient.h.
void TooN::ConjugateGradient< Size, Precision >::find_next_point | ( | const Func & | func | ) | [inline] |
Perform a linesearch from the current point (x) along the current conjugate vector (h). The linesearch does not make use of derivatives. You probably do not want to use this function. See iterate() instead. This function updates:
func | Functor returning the function value at a given point. |
Definition at line 291 of file conjugate_gradient.h.
bool TooN::ConjugateGradient< Size, Precision >::finished | ( | ) | [inline] |
Check to see it iteration should stop. You probably do not want to use this function. See iterate() instead. This function updates nothing.
Definition at line 344 of file conjugate_gradient.h.
void TooN::ConjugateGradient< Size, Precision >::init | ( | const Vector< Size > & | start, | |
const Precision & | func, | |||
const Vector< Size > & | deriv | |||
) | [inline] |
Initialize the ConjugateGradient class with sensible values. Used internally.
start | Starting point, x | |
func | ||
deriv |
Definition at line 247 of file conjugate_gradient.h.
bool TooN::ConjugateGradient< Size, Precision >::iterate | ( | const Func & | func, | |
const Deriv & | deriv | |||
) | [inline] |
Use this function to iterate over the optimization. Note that after iterate returns false, g, h, old_g and old_h will not have been updated. This function updates:
func | Functor returning the function value at a given point. | |
deriv | Functor to compute derivatives at the specified point. |
Definition at line 388 of file conjugate_gradient.h.
void TooN::ConjugateGradient< Size, Precision >::update_vectors_PR | ( | const Vector< Size > & | grad | ) | [inline] |
After an iteration, update the gradient and conjugate using the Polak-Ribiere equations. This function updates:
grad | The derivatives of the function at x |
Definition at line 358 of file conjugate_gradient.h.
Precision TooN::ConjugateGradient< Size, Precision >::bracket_epsilon |
Minimum size for initial minima bracketing. Below this, it is assumed that the system has converged. Defaults to 1e-20.
Definition at line 217 of file conjugate_gradient.h.
Precision TooN::ConjugateGradient< Size, Precision >::bracket_initial_lambda |
Initial stepsize used in bracketing the minimum for the line search. Defaults to 1.
Definition at line 212 of file conjugate_gradient.h.
Precision TooN::ConjugateGradient< Size, Precision >::epsilon |
Additive term in tolerance to prevent excessive iterations if . Known as ZEPS
in numerical recipies. Defaults to 1e-20.
Definition at line 209 of file conjugate_gradient.h.
Vector<Size> TooN::ConjugateGradient< Size, Precision >::g |
Gradient vector used by the next call to iterate().
Definition at line 198 of file conjugate_gradient.h.
Vector<Size> TooN::ConjugateGradient< Size, Precision >::h |
Conjugate vector to be searched along in the next call to iterate().
Definition at line 199 of file conjugate_gradient.h.
int TooN::ConjugateGradient< Size, Precision >::iterations |
Number of iterations performed.
Definition at line 219 of file conjugate_gradient.h.
Precision TooN::ConjugateGradient< Size, Precision >::linesearch_epsilon |
Additive term in tolerance to prevent excessive iterations if . Known as ZEPS
in numerical recipies. Defaults to 1e-20.
Definition at line 214 of file conjugate_gradient.h.
int TooN::ConjugateGradient< Size, Precision >::linesearch_max_iterations |
Maximum number of iterations in the linesearch. Defaults to 100.
Definition at line 215 of file conjugate_gradient.h.
Precision TooN::ConjugateGradient< Size, Precision >::linesearch_tolerance |
Tolerance used to determine if the linesearch is complete. Defaults to square root of machine precision.
Definition at line 213 of file conjugate_gradient.h.
int TooN::ConjugateGradient< Size, Precision >::max_iterations |
Maximum number of iterations. Defaults to size
.
Definition at line 210 of file conjugate_gradient.h.
Vector<Size> TooN::ConjugateGradient< Size, Precision >::minus_h |
negative of h as this is required to be passed into a function which uses references (so can't be temporary)
Definition at line 200 of file conjugate_gradient.h.
Vector<Size> TooN::ConjugateGradient< Size, Precision >::old_g |
Gradient vector used to compute $h$ in the last call to iterate().
Definition at line 201 of file conjugate_gradient.h.
Vector<Size> TooN::ConjugateGradient< Size, Precision >::old_h |
Conjugate vector searched along in the last call to iterate().
Definition at line 202 of file conjugate_gradient.h.
Vector<Size> TooN::ConjugateGradient< Size, Precision >::old_x |
Previous best known point (not set at construction).
Definition at line 204 of file conjugate_gradient.h.
Precision TooN::ConjugateGradient< Size, Precision >::old_y |
Function at old_x.
Definition at line 206 of file conjugate_gradient.h.
const int TooN::ConjugateGradient< Size, Precision >::size |
Dimensionality of the space.
Definition at line 197 of file conjugate_gradient.h.
Precision TooN::ConjugateGradient< Size, Precision >::tolerance |
Tolerance used to determine if the optimization is complete. Defaults to square root of machine precision.
Definition at line 208 of file conjugate_gradient.h.
Vector<Size> TooN::ConjugateGradient< Size, Precision >::x |
Current position (best known point).
Definition at line 203 of file conjugate_gradient.h.
Precision TooN::ConjugateGradient< Size, Precision >::y |
Function at .
Definition at line 205 of file conjugate_gradient.h.