23 #include <boost/tuple/tuple.hpp> 44 double error(
const State &state)
const;
45 Gradient gradient(
const State &state)
const;
46 State advance(
const State ¤t,
const double alpha,
47 const Gradient &g)
const;
54 typedef boost::shared_ptr<NonlinearConjugateGradientOptimizer> shared_ptr;
67 const Values& initialValues,
const Parameters& params = Parameters());
78 template<
class S,
class V,
class W>
79 double lineSearch(
const S &system,
const V currentValues,
const W &gradient) {
82 const double g = gradient.norm();
86 const double phi = 0.5 * (1.0 + std::sqrt(5.0)), resphi = 2.0 - phi, tau =
88 double minStep = -1.0 / g, maxStep = 0, newStep = minStep
89 + (maxStep - minStep) / (phi + 1.0);
91 V newValues = system.advance(currentValues, newStep, gradient);
92 double newError = system.error(newValues);
95 const bool flag = (maxStep - newStep > newStep - minStep) ?
true :
false;
96 const double testStep =
97 flag ? newStep + resphi * (maxStep - newStep) :
98 newStep - resphi * (newStep - minStep);
100 if ((maxStep - minStep)
101 < tau * (std::fabs(testStep) + std::fabs(newStep))) {
102 return 0.5 * (minStep + maxStep);
105 const V testValues = system.advance(currentValues, testStep, gradient);
106 const double testError = system.error(testValues);
109 if (testError >= newError) {
118 newError = testError;
122 newError = testError;
138 template<
class S,
class V>
141 const bool singleIteration,
const bool gradientDescent =
false) {
145 size_t iteration = 0;
148 double currentError = system.error(initial);
149 if (currentError <= params.
errorTol) {
150 if (params.
verbosity >= NonlinearOptimizerParams::ERROR) {
151 std::cout <<
"Exiting, as error = " << currentError <<
" < " 154 return boost::tie(initial, iteration);
157 V currentValues = initial;
158 typename S::Gradient currentGradient = system.gradient(currentValues),
159 prevGradient, direction = currentGradient;
162 V prevValues = currentValues;
163 double prevError = currentError;
164 double alpha =
lineSearch(system, currentValues, direction);
165 currentValues = system.advance(prevValues, alpha, direction);
166 currentError = system.error(currentValues);
169 if (params.
verbosity >= NonlinearOptimizerParams::ERROR)
170 std::cout <<
"Initial error: " << currentError << std::endl;
174 if (gradientDescent ==
true) {
175 direction = system.gradient(currentValues);
177 prevGradient = currentGradient;
178 currentGradient = system.gradient(currentValues);
180 const double beta = std::max(0.0,
181 currentGradient.dot(currentGradient - prevGradient)
182 / prevGradient.dot(prevGradient));
183 direction = currentGradient + (beta * direction);
186 alpha =
lineSearch(system, currentValues, direction);
188 prevValues = currentValues;
189 prevError = currentError;
191 currentValues = system.advance(prevValues, alpha, direction);
192 currentError = system.error(currentValues);
195 if (params.
verbosity >= NonlinearOptimizerParams::ERROR)
196 std::cout <<
"iteration: " << iteration <<
", currentError: " << currentError << std::endl;
197 }
while (++iteration < params.
maxIterations && !singleIteration
202 if (params.
verbosity >= NonlinearOptimizerParams::ERROR
205 <<
"nonlinearConjugateGradient: Terminating because reached maximum iterations" 208 return boost::tie(currentValues, iteration);
Verbosity verbosity
The printing verbosity during optimization (default SILENT)
Definition: NonlinearOptimizerParams.h:45
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-Ribiere formula suggested in http:/...
Definition: NonlinearConjugateGradientOptimizer.h:139
This is the abstract interface for classes that can optimize for the maximum-likelihood estimate of a...
Definition: NonlinearOptimizer.h:75
size_t maxIterations
The maximum iterations to stop iterating (default 100)
Definition: NonlinearOptimizerParams.h:41
A non-templated config holding any types of Manifold-group elements.
Definition: Values.h:70
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:169
Base class and basic functions for Manifold types.
double absoluteErrorTol
The maximum absolute error decrease to stop iterating (default 1e-5)
Definition: NonlinearOptimizerParams.h:43
double lineSearch(const S &system, const V currentValues, const W &gradient)
Implement the golden-section line search algorithm.
Definition: NonlinearConjugateGradientOptimizer.h:79
boost::shared_ptr< This > shared_ptr
shared_ptr to this class
Definition: GaussianFactorGraph.h:74
This class represents a collection of vector-valued variables associated each with a unique integer i...
Definition: VectorValues.h:90
Base class and parameters for nonlinear optimization algorithms.
Point3 optimize(const NonlinearFactorGraph &graph, const Values &values, Key landmarkKey)
Optimize for triangulation.
Definition: triangulation.cpp:73
An implementation of the nonlinear CG method using the template below.
Definition: NonlinearConjugateGradientOptimizer.h:28
A non-linear factor graph is a graph of non-Gaussian, i.e.
Definition: NonlinearFactorGraph.h:77
double relativeErrorTol
The maximum relative error decrease to stop iterating (default 1e-5)
Definition: NonlinearOptimizerParams.h:42
The common parameters for Nonlinear optimizers.
Definition: NonlinearOptimizerParams.h:34
double errorTol
The maximum total error to stop iterating (default 0.0)
Definition: NonlinearOptimizerParams.h:44
virtual ~NonlinearConjugateGradientOptimizer()
Destructor.
Definition: NonlinearConjugateGradientOptimizer.h:70
Global functions in a separate testing namespace.
Definition: chartTesting.h:28