23 #include <boost/date_time/posix_time/posix_time.hpp>
25 class NonlinearOptimizerMoreOptimizationTest;
29 class LevenbergMarquardtOptimizer;
41 SILENT = 0, TERMINATION, LAMBDA, TRYLAMBDA, TRYCONFIG, DAMPED, TRYDELTA
44 static VerbosityLM verbosityLMTranslator(
const std::string &s);
45 static std::string verbosityLMTranslator(VerbosityLM value);
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) {
71 virtual void print(
const std::string& str =
"")
const;
73 inline double getlambdaInitial()
const {
76 inline double getlambdaFactor()
const {
79 inline double getlambdaUpperBound()
const {
80 return lambdaUpperBound;
82 inline double getlambdaLowerBound()
const {
83 return lambdaLowerBound;
85 inline std::string getVerbosityLM()
const {
86 return verbosityLMTranslator(verbosityLM);
88 inline std::string getLogFile()
const {
91 inline bool getDiagonalDamping()
const {
92 return diagonalDamping;
95 inline void setlambdaInitial(
double value) {
96 lambdaInitial = value;
98 inline void setlambdaFactor(
double value) {
101 inline void setlambdaUpperBound(
double value) {
102 lambdaUpperBound = value;
104 inline void setlambdaLowerBound(
double value) {
105 lambdaLowerBound = value;
107 inline void setVerbosityLM(
const std::string &s) {
108 verbosityLM = verbosityLMTranslator(s);
110 inline void setLogFile(
const std::string &s) {
113 inline void setDiagonalDamping(
bool flag) {
114 diagonalDamping = flag;
116 inline void setUseFixedLambdaFactor(
bool flag) {
117 useFixedLambdaFactor_ = flag;
128 int totalNumberInnerIterations;
129 boost::posix_time::ptime startTime;
137 startTime = boost::posix_time::microsec_clock::universal_time();
146 unsigned int iterations = 0) :
165 typedef boost::shared_ptr<LevenbergMarquardtOptimizer> shared_ptr;
182 graph, initialValues, params_) {
195 params_.ordering = ordering;
201 return state_.lambda;
205 void increaseLambda();
208 void decreaseLambda(
double stepQuality);
212 return state_.totalNumberInnerIterations;
216 virtual void print(
const std::string& str =
"")
const {
217 std::cout << str <<
"LevenbergMarquardtOptimizer" << std::endl;
218 this->params_.print(
" parameters:\n");
234 virtual void iterate();
258 friend class ::NonlinearOptimizerMoreOptimizationTest;
260 void writeLogFile(
double currentError);
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
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 ¶ms=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