gtsam  3.2.1
gtsam
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
LevenbergMarquardtOptimizer.h
Go to the documentation of this file.
1 /* ----------------------------------------------------------------------------
2 
3  * GTSAM Copyright 2010, Georgia Tech Research Corporation,
4  * Atlanta, Georgia 30332-0415
5  * All Rights Reserved
6  * Authors: Frank Dellaert, et al. (see THANKS for the full author list)
7 
8  * See LICENSE for the license information
9 
10  * -------------------------------------------------------------------------- */
11 
19 #pragma once
20 
23 #include <boost/date_time/posix_time/posix_time.hpp>
24 
25 class NonlinearOptimizerMoreOptimizationTest;
26 
27 namespace gtsam {
28 
29 class LevenbergMarquardtOptimizer;
30 
37 
38 public:
40  enum VerbosityLM {
41  SILENT = 0, TERMINATION, LAMBDA, TRYLAMBDA, TRYCONFIG, DAMPED, TRYDELTA
42  };
43 
44  static VerbosityLM verbosityLMTranslator(const std::string &s);
45  static std::string verbosityLMTranslator(VerbosityLM value);
46 
47 public:
48 
49  double lambdaInitial;
50  double lambdaFactor;
55  std::string logFile;
59  double min_diagonal_;
60  double max_diagonal_;
61 
63  lambdaInitial(1e-5), lambdaFactor(10.0), lambdaUpperBound(1e5), lambdaLowerBound(
64  0.0), verbosityLM(SILENT), minModelFidelity(1e-3),
65  diagonalDamping(false), reuse_diagonal_(false), useFixedLambdaFactor_(true),
66  min_diagonal_(1e-6), max_diagonal_(1e32) {
67  }
68  virtual ~LevenbergMarquardtParams() {
69  }
70 
71  virtual void print(const std::string& str = "") const;
72 
73  inline double getlambdaInitial() const {
74  return lambdaInitial;
75  }
76  inline double getlambdaFactor() const {
77  return lambdaFactor;
78  }
79  inline double getlambdaUpperBound() const {
80  return lambdaUpperBound;
81  }
82  inline double getlambdaLowerBound() const {
83  return lambdaLowerBound;
84  }
85  inline std::string getVerbosityLM() const {
86  return verbosityLMTranslator(verbosityLM);
87  }
88  inline std::string getLogFile() const {
89  return logFile;
90  }
91  inline bool getDiagonalDamping() const {
92  return diagonalDamping;
93  }
94 
95  inline void setlambdaInitial(double value) {
96  lambdaInitial = value;
97  }
98  inline void setlambdaFactor(double value) {
99  lambdaFactor = value;
100  }
101  inline void setlambdaUpperBound(double value) {
102  lambdaUpperBound = value;
103  }
104  inline void setlambdaLowerBound(double value) {
105  lambdaLowerBound = value;
106  }
107  inline void setVerbosityLM(const std::string &s) {
108  verbosityLM = verbosityLMTranslator(s);
109  }
110  inline void setLogFile(const std::string &s) {
111  logFile = s;
112  }
113  inline void setDiagonalDamping(bool flag) {
114  diagonalDamping = flag;
115  }
116  inline void setUseFixedLambdaFactor(bool flag) {
117  useFixedLambdaFactor_ = flag;
118  }
119 };
120 
125 
126 public:
127  double lambda;
128  int totalNumberInnerIterations; // The total number of inner iterations in the optimization (for each iteration, LM may try multiple iterations with different lambdas)
129  boost::posix_time::ptime startTime;
130  VectorValues hessianDiagonal; //only update hessianDiagonal when reuse_diagonal_ = false
131 
133  initTime();
134  }
135 
136  void initTime() {
137  startTime = boost::posix_time::microsec_clock::universal_time();
138  }
139 
140  virtual ~LevenbergMarquardtState() {
141  }
142 
143 protected:
145  const Values& initialValues, const LevenbergMarquardtParams& params,
146  unsigned int iterations = 0) :
147  NonlinearOptimizerState(graph, initialValues, iterations), lambda(
148  params.lambdaInitial), totalNumberInnerIterations(0) {
149  initTime();
150  }
151 
152  friend class LevenbergMarquardtOptimizer;
153 };
154 
159 
160 protected:
163 
164 public:
165  typedef boost::shared_ptr<LevenbergMarquardtOptimizer> shared_ptr;
166 
169 
179  const Values& initialValues, const LevenbergMarquardtParams& params =
181  NonlinearOptimizer(graph), params_(ensureHasOrdering(params, graph)), state_(
182  graph, initialValues, params_) {
183  }
184 
193  const Values& initialValues, const Ordering& ordering) :
194  NonlinearOptimizer(graph) {
195  params_.ordering = ordering;
196  state_ = LevenbergMarquardtState(graph, initialValues, params_);
197  }
198 
200  double lambda() const {
201  return state_.lambda;
202  }
203 
204  // Apply policy to increase lambda if the current update was successful (stepQuality not used in the naive policy)
205  void increaseLambda();
206 
207  // Apply policy to decrease lambda if the current update was NOT successful (stepQuality not used in the naive policy)
208  void decreaseLambda(double stepQuality);
209 
211  int getInnerIterations() const {
212  return state_.totalNumberInnerIterations;
213  }
214 
216  virtual void print(const std::string& str = "") const {
217  std::cout << str << "LevenbergMarquardtOptimizer" << std::endl;
218  this->params_.print(" parameters:\n");
219  }
220 
222 
225 
228  }
229 
234  virtual void iterate();
235 
238  return params_;
239  }
240 
243  return params_;
244  }
245 
248  return state_;
249  }
250 
253  return state_;
254  }
255 
257  GaussianFactorGraph::shared_ptr buildDampedSystem(const GaussianFactorGraph& linear);
258  friend class ::NonlinearOptimizerMoreOptimizationTest;
259 
260  void writeLogFile(double currentError);
261 
263 
264 protected:
265 
267  virtual const NonlinearOptimizerParams& _params() const {
268  return params_;
269  }
270 
272  virtual const NonlinearOptimizerState& _state() const {
273  return state_;
274  }
275 
277  LevenbergMarquardtParams ensureHasOrdering(LevenbergMarquardtParams params,
278  const NonlinearFactorGraph& graph) const;
279 
281  virtual GaussianFactorGraph::shared_ptr linearize() const;
282 };
283 
284 }
double lambdaLowerBound
The minimum lambda used in LM (default: 0)
Definition: LevenbergMarquardtOptimizer.h:52
double lambda() const
Access the current damping value.
Definition: LevenbergMarquardtOptimizer.h:200
LevenbergMarquardtState state_
optimization state
Definition: LevenbergMarquardtOptimizer.h:162
State for LevenbergMarquardtOptimizer.
Definition: LevenbergMarquardtOptimizer.h:124
virtual void print(const std::string &str="") const
print
Definition: LevenbergMarquardtOptimizer.h:216
double min_diagonal_
when using diagonal damping saturates the minimum diagonal entries (default: 1e-6) ...
Definition: LevenbergMarquardtOptimizer.h:59
VerbosityLM
See LevenbergMarquardtParams::lmVerbosity.
Definition: LevenbergMarquardtOptimizer.h:40
double max_diagonal_
when using diagonal damping saturates the maximum diagonal entries (default: 1e32) ...
Definition: LevenbergMarquardtOptimizer.h:60
LevenbergMarquardtParams & params()
Read/write access the parameters.
Definition: LevenbergMarquardtOptimizer.h:242
std::string logFile
an optional CSV log file, with [iteration, time, error, labda]
Definition: LevenbergMarquardtOptimizer.h:55
int getInnerIterations() const
Access the current number of inner iterations.
Definition: LevenbergMarquardtOptimizer.h:211
bool reuse_diagonal_
an additional option in Ceres for diagonalDamping (related to efficiency)
Definition: LevenbergMarquardtOptimizer.h:57
The common parameters for Nonlinear optimizers.
Definition: NonlinearOptimizerParams.h:33
Parameters for Levenberg-Marquardt optimization.
Definition: LevenbergMarquardtOptimizer.h:36
Factor Graph Values.
double lambdaUpperBound
The maximum lambda to try before assuming the optimization has failed (default: 1e5) ...
Definition: LevenbergMarquardtOptimizer.h:51
LevenbergMarquardtOptimizer(const NonlinearFactorGraph &graph, const Values &initialValues, const LevenbergMarquardtParams &params=LevenbergMarquardtParams())
Standard constructor, requires a nonlinear factor graph, initial variable assignments, and optimization parameters.
Definition: LevenbergMarquardtOptimizer.h:178
bool useFixedLambdaFactor_
if true applies constant increase (or decrease) to lambda according to lambdaFactor ...
Definition: LevenbergMarquardtOptimizer.h:58
LevenbergMarquardtOptimizer(const NonlinearFactorGraph &graph, const Values &initialValues, const Ordering &ordering)
Standard constructor, requires a nonlinear factor graph, initial variable assignments, and optimization parameters.
Definition: LevenbergMarquardtOptimizer.h:192
A non-templated config holding any types of Manifold-group elements.
Definition: Values.h:75
void print(const Matrix &A, const string &s, ostream &stream)
print a matrix
Definition: Matrix.cpp:183
double lambdaInitial
The initial Levenberg-Marquardt damping term (default: 1e-5)
Definition: LevenbergMarquardtOptimizer.h:49
VerbosityLM verbosityLM
The verbosity level for Levenberg-Marquardt (default: SILENT), see also NonlinearOptimizerParams::ver...
Definition: LevenbergMarquardtOptimizer.h:53
double minModelFidelity
Lower bound for the modelFidelity to accept the result of an LM iteration.
Definition: LevenbergMarquardtOptimizer.h:54
This is the abstract interface for classes that can optimize for the maximum-likelihood estimate of a...
Definition: NonlinearOptimizer.h:134
A non-linear factor graph is a graph of non-Gaussian, i.e.
Definition: NonlinearFactorGraph.h:69
boost::shared_ptr< This > shared_ptr
shared_ptr to this class
Definition: GaussianFactorGraph.h:74
double lambdaFactor
The amount by which to multiply or divide lambda when adjusting lambda (default: 10.0)
Definition: LevenbergMarquardtOptimizer.h:50
LevenbergMarquardtState & state()
Read/write access the last state.
Definition: LevenbergMarquardtOptimizer.h:252
const LevenbergMarquardtParams & params() const
Read-only access the parameters.
Definition: LevenbergMarquardtOptimizer.h:237
This class performs Levenberg-Marquardt nonlinear optimization.
Definition: LevenbergMarquardtOptimizer.h:158
LevenbergMarquardtParams params_
LM parameters.
Definition: LevenbergMarquardtOptimizer.h:161
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
virtual ~LevenbergMarquardtOptimizer()
Virtual destructor.
Definition: LevenbergMarquardtOptimizer.h:227
virtual const NonlinearOptimizerParams & _params() const
Access the parameters (base class version)
Definition: LevenbergMarquardtOptimizer.h:267
A Linear Factor Graph is a factor graph where all factors are Gaussian, i.e.
Definition: GaussianFactorGraph.h:65
Definition: Ordering.h:30
bool diagonalDamping
if true, use diagonal of Hessian
Definition: LevenbergMarquardtOptimizer.h:56
Base class for a nonlinear optimization state, including the current estimate of the variable values...
Definition: NonlinearOptimizer.h:35
const LevenbergMarquardtState & state() const
Read-only access the last state.
Definition: LevenbergMarquardtOptimizer.h:247
virtual const NonlinearOptimizerState & _state() const
Access the state (base class version)
Definition: LevenbergMarquardtOptimizer.h:272