12 #include <boost/tuple/tuple.hpp>
21 :
Base(graph, values) {}
37 double error(
const State &state)
const ;
38 Gradient gradient(
const State &state)
const ;
39 State advance(
const State ¤t,
const double alpha,
const Gradient &g)
const ;
46 typedef boost::shared_ptr<NonlinearConjugateGradientOptimizer> shared_ptr;
56 :
Base(graph), state_(graph, initialValues), params_(params) {}
59 virtual void iterate();
66 template <
class S,
class V,
class W>
67 double lineSearch(
const S &system,
const V currentValues,
const W &gradient) {
70 const double g = gradient.norm();
74 const double phi = 0.5*(1.0+std::sqrt(5.0)), resphi = 2.0 - phi, tau = 1e-5;
75 double minStep = -1.0/g, maxStep = 0,
76 newStep = minStep + (maxStep-minStep) / (phi+1.0) ;
78 V newValues = system.advance(currentValues, newStep, gradient);
79 double newError = system.error(newValues);
82 const bool flag = (maxStep - newStep > newStep - minStep) ?
true :
false ;
83 const double testStep = flag ?
84 newStep + resphi * (maxStep - newStep) : newStep - resphi * (newStep - minStep);
86 if ( (maxStep- minStep) < tau * (std::fabs(testStep) + std::fabs(newStep)) ) {
87 return 0.5*(minStep+maxStep);
90 const V testValues = system.advance(currentValues, testStep, gradient);
91 const double testError = system.error(testValues);
94 if ( testError >= newError ) {
95 if ( flag ) maxStep = testStep;
96 else minStep = testStep;
102 newError = testError;
107 newError = testError;
123 template <
class S,
class V>
131 double currentError = system.error(initial);
132 if(currentError <= params.
errorTol) {
133 if (params.
verbosity >= NonlinearOptimizerParams::ERROR){
134 std::cout <<
"Exiting, as error = " << currentError <<
" < " << params.
errorTol << std::endl;
136 return boost::tie(initial, iteration);
139 V currentValues = initial;
140 typename S::Gradient currentGradient = system.gradient(currentValues), prevGradient,
141 direction = currentGradient;
144 V prevValues = currentValues;
double prevError = currentError;
145 double alpha =
lineSearch(system, currentValues, direction);
146 currentValues = system.advance(prevValues, alpha, direction);
147 currentError = system.error(currentValues);
150 if (params.
verbosity >= NonlinearOptimizerParams::ERROR) std::cout <<
"Initial error: " << currentError << std::endl;
154 if ( gradientDescent ==
true) {
155 direction = system.gradient(currentValues);
158 prevGradient = currentGradient;
159 currentGradient = system.gradient(currentValues);
160 const double beta =
std::max(0.0, currentGradient.dot(currentGradient-prevGradient)/currentGradient.dot(currentGradient));
161 direction = currentGradient + (beta*direction);
164 alpha =
lineSearch(system, currentValues, direction);
166 prevValues = currentValues; prevError = currentError;
168 currentValues = system.advance(prevValues, alpha, direction);
169 currentError = system.error(currentValues);
172 if(params.
verbosity >= NonlinearOptimizerParams::ERROR) std::cout <<
"currentError: " << currentError << std::endl;
179 std::cout <<
"nonlinearConjugateGradient: Terminating because reached maximum iterations" << std::endl;
181 return boost::tie(currentValues, iteration);
double lineSearch(const S &system, const V currentValues, const W &gradient)
Implement the golden-section line search algorithm.
Definition: NonlinearConjugateGradientOptimizer.h:67
double errorTol
The maximum total error to stop iterating (default 0.0)
Definition: NonlinearOptimizerParams.h:43
An implementation of the nonlinear cg method using the template below.
Definition: NonlinearConjugateGradientOptimizer.h:17
Base class and basic functions for Manifold types.
The common parameters for Nonlinear optimizers.
Definition: NonlinearOptimizerParams.h:33
double absoluteErrorTol
The maximum absolute error decrease to stop iterating (default 1e-5)
Definition: NonlinearOptimizerParams.h:42
double relativeErrorTol
The maximum relative error decrease to stop iterating (default 1e-5)
Definition: NonlinearOptimizerParams.h:41
Definition: NonlinearConjugateGradientOptimizer.h:24
A non-templated config holding any types of Manifold-group elements.
Definition: Values.h:75
bool checkConvergence(double relativeErrorTreshold, double absoluteErrorTreshold, double errorThreshold, double currentError, double newError, NonlinearOptimizerParams::Verbosity verbosity)
Check whether the relative error decrease is less than relativeErrorTreshold, the absolute error decr...
Definition: NonlinearOptimizer.cpp:138
boost::tuple< V, int > nonlinearConjugateGradient(const S &system, const V &initial, const NonlinearOptimizerParams ¶ms, const bool singleIteration, const bool gradientDescent=false)
Implement the nonlinear conjugate gradient method using the Polak-Ribieve formula suggested in http:/...
Definition: NonlinearConjugateGradientOptimizer.h:124
This is the abstract interface for classes that can optimize for the maximum-likelihood estimate of a...
Definition: NonlinearOptimizer.h:134
double max(const Vector &a)
Return the max element of a vector.
Definition: Vector.cpp:238
A non-linear factor graph is a graph of non-Gaussian, i.e.
Definition: NonlinearFactorGraph.h:69
int maxIterations
The maximum iterations to stop iterating (default 100)
Definition: NonlinearOptimizerParams.h:40
Point3 optimize(const NonlinearFactorGraph &graph, const Values &values, Key landmarkKey)
Optimize for triangulation.
Definition: triangulation.cpp:72
Base class and parameters for nonlinear optimization algorithms.
This class represents a collection of vector-valued variables associated each with a unique integer i...
Definition: VectorValues.h:89
Verbosity verbosity
The printing verbosity during optimization (default SILENT)
Definition: NonlinearOptimizerParams.h:44
Base class for a nonlinear optimization state, including the current estimate of the variable values...
Definition: NonlinearOptimizer.h:35