gtsam/gtsam/nonlinear/LevenbergMarquardtOptimizer.h

174 lines
6.2 KiB
C
Raw Normal View History

/* ----------------------------------------------------------------------------
* GTSAM Copyright 2010, Georgia Tech Research Corporation,
* Atlanta, Georgia 30332-0415
* All Rights Reserved
* Authors: Frank Dellaert, et al. (see THANKS for the full author list)
* See LICENSE for the license information
* -------------------------------------------------------------------------- */
/**
* @file LevenbergMarquardtOptimizer.h
* @brief
* @author Richard Roberts
2012-06-08 07:08:43 +08:00
* @date Feb 26, 2012
*/
#pragma once
#include <gtsam/nonlinear/SuccessiveLinearizationOptimizer.h>
namespace gtsam {
2012-05-15 03:10:02 +08:00
class LevenbergMarquardtOptimizer;
2012-05-15 02:32:54 +08:00
/** Parameters for Levenberg-Marquardt optimization. Note that this parameters
* class inherits from NonlinearOptimizerParams, which specifies the parameters
* common to all nonlinear optimization algorithms. This class also contains
* all of those parameters.
*/
class LevenbergMarquardtParams : public SuccessiveLinearizationParams {
public:
/** See LevenbergMarquardtParams::lmVerbosity */
enum VerbosityLM {
SILENT = 0,
2012-05-15 02:32:54 +08:00
LAMBDA,
TRYLAMBDA,
TRYCONFIG,
TRYDELTA,
DAMPED
};
double lambdaInitial; ///< The initial Levenberg-Marquardt damping term (default: 1e-5)
double lambdaFactor; ///< The amount by which to multiply or divide lambda when adjusting lambda (default: 10.0)
double lambdaUpperBound; ///< The maximum lambda to try before assuming the optimization has failed (default: 1e5)
VerbosityLM verbosityLM; ///< The verbosity level for Levenberg-Marquardt (default: SILENT), see also NonlinearOptimizerParams::verbosity
2012-05-15 02:32:54 +08:00
LevenbergMarquardtParams() :
lambdaInitial(1e-5), lambdaFactor(10.0), lambdaUpperBound(1e5), verbosityLM(SILENT) {}
2012-05-15 02:32:54 +08:00
LevenbergMarquardtParams(double initial, double factor, double bound, size_t verbose) :
lambdaInitial(initial), lambdaFactor(factor), lambdaUpperBound(bound), verbosityLM(VerbosityLM(verbose)) {}
2012-05-15 02:32:54 +08:00
virtual ~LevenbergMarquardtParams() {}
virtual void print(const std::string& str = "") const;
2012-05-15 02:32:54 +08:00
inline double getlambdaInitial() const { return lambdaInitial; }
inline double getlambdaFactor() const { return lambdaFactor; }
inline double getlambdaUpperBound() const { return lambdaUpperBound; }
inline std::string getVerbosityLM() const { return verbosityLMTranslator(verbosityLM); }
inline void setlambdaInitial(double value) { lambdaInitial = value; }
inline void setlambdaFactor(double value) { lambdaFactor = value; }
inline void setlambdaUpperBound(double value) { lambdaUpperBound = value; }
inline void setVerbosityLM(const std::string &s) { verbosityLM = verbosityLMTranslator(s); }
VerbosityLM verbosityLMTranslator(const std::string &s) const;
std::string verbosityLMTranslator(VerbosityLM value) const;
2012-05-15 02:32:54 +08:00
};
/**
* State for LevenbergMarquardtOptimizer
*/
class LevenbergMarquardtState : public NonlinearOptimizerState {
public:
double lambda;
2012-05-15 03:10:02 +08:00
LevenbergMarquardtState() {}
virtual ~LevenbergMarquardtState() {}
protected:
LevenbergMarquardtState(const NonlinearFactorGraph& graph, const Values& initialValues, const LevenbergMarquardtParams& params, unsigned int iterations = 0) :
NonlinearOptimizerState(graph, initialValues, iterations), lambda(params.lambdaInitial) {}
2012-05-15 03:10:02 +08:00
friend class LevenbergMarquardtOptimizer;
2012-05-15 02:32:54 +08:00
};
/**
* This class performs Levenberg-Marquardt nonlinear optimization
*/
2012-05-15 00:51:33 +08:00
class LevenbergMarquardtOptimizer : public NonlinearOptimizer {
public:
typedef boost::shared_ptr<LevenbergMarquardtOptimizer> shared_ptr;
/// @name Standard interface
/// @{
/** Standard constructor, requires a nonlinear factor graph, initial
* variable assignments, and optimization parameters. For convenience this
* version takes plain objects instead of shared pointers, but internally
* copies the objects.
* @param graph The nonlinear factor graph to optimize
* @param initialValues The initial variable assignments
* @param params The optimization parameters
*/
2012-05-15 00:51:33 +08:00
LevenbergMarquardtOptimizer(const NonlinearFactorGraph& graph, const Values& initialValues,
const LevenbergMarquardtParams& params = LevenbergMarquardtParams()) :
2012-05-15 03:10:02 +08:00
NonlinearOptimizer(graph), params_(ensureHasOrdering(params, graph, initialValues)),
state_(graph, initialValues, params_), dimensions_(initialValues.dims(*params_.ordering)) {}
/** Standard constructor, requires a nonlinear factor graph, initial
* variable assignments, and optimization parameters. For convenience this
* version takes plain objects instead of shared pointers, but internally
* copies the objects.
* @param graph The nonlinear factor graph to optimize
* @param initialValues The initial variable assignments
*/
2012-05-15 00:51:33 +08:00
LevenbergMarquardtOptimizer(const NonlinearFactorGraph& graph, const Values& initialValues, const Ordering& ordering) :
2012-05-15 03:10:02 +08:00
NonlinearOptimizer(graph), dimensions_(initialValues.dims(ordering)) {
params_.ordering = ordering;
2012-05-15 03:10:02 +08:00
state_ = LevenbergMarquardtState(graph, initialValues, params_); }
/** Access the current damping value */
double lambda() const { return state_.lambda; }
2012-03-25 03:53:25 +08:00
/// @}
/// @name Advanced interface
/// @{
/** Virtual destructor */
virtual ~LevenbergMarquardtOptimizer() {}
/** Perform a single iteration, returning a new NonlinearOptimizer class
* containing the updated variable assignments, which may be retrieved with
* values().
*/
2012-05-15 03:10:02 +08:00
virtual void iterate();
2012-05-15 00:51:33 +08:00
/** Access the parameters */
const LevenbergMarquardtParams& params() const { return params_; }
2012-05-15 00:51:33 +08:00
/** Access the last state */
const LevenbergMarquardtState& state() const { return state_; }
/// @}
protected:
2012-05-15 00:51:33 +08:00
LevenbergMarquardtParams params_;
LevenbergMarquardtState state_;
std::vector<size_t> dimensions_;
2012-05-15 00:51:33 +08:00
/** Access the parameters (base class version) */
virtual const NonlinearOptimizerParams& _params() const { return params_; }
/** Access the state (base class version) */
virtual const NonlinearOptimizerState& _state() const { return state_; }
/** Internal function for computing a COLAMD ordering if no ordering is specified */
LevenbergMarquardtParams ensureHasOrdering(LevenbergMarquardtParams params, const NonlinearFactorGraph& graph, const Values& values) const {
2012-05-15 00:51:33 +08:00
if(!params.ordering)
2012-05-15 03:10:02 +08:00
params.ordering = *graph.orderingCOLAMD(values);
2012-05-15 00:51:33 +08:00
return params;
}
};
}