Added a named constructor to mimick Ceres defaults

release/4.3a0
Frank Dellaert 2015-06-16 22:24:39 -07:00
parent b68f763fe7
commit 32044eaac8
3 changed files with 42 additions and 17 deletions

View File

@ -105,8 +105,8 @@ void LevenbergMarquardtParams::print(const std::string& str) const {
std::cout << " lambdaLowerBound: " << lambdaLowerBound << "\n";
std::cout << " minModelFidelity: " << minModelFidelity << "\n";
std::cout << " diagonalDamping: " << diagonalDamping << "\n";
std::cout << " min_diagonal: " << min_diagonal_ << "\n";
std::cout << " max_diagonal: " << max_diagonal_ << "\n";
std::cout << " min_diagonal: " << min_diagonal << "\n";
std::cout << " max_diagonal: " << max_diagonal << "\n";
std::cout << " verbosityLM: "
<< verbosityLMTranslator(verbosityLM) << "\n";
std::cout.flush();
@ -119,7 +119,7 @@ GaussianFactorGraph::shared_ptr LevenbergMarquardtOptimizer::linearize() const {
/* ************************************************************************* */
void LevenbergMarquardtOptimizer::increaseLambda() {
if (params_.useFixedLambdaFactor_) {
if (params_.useFixedLambdaFactor) {
state_.lambda *= params_.lambdaFactor;
} else {
state_.lambda *= params_.lambdaFactor;
@ -131,7 +131,7 @@ void LevenbergMarquardtOptimizer::increaseLambda() {
/* ************************************************************************* */
void LevenbergMarquardtOptimizer::decreaseLambda(double stepQuality) {
if (params_.useFixedLambdaFactor_) {
if (params_.useFixedLambdaFactor) {
state_.lambda /= params_.lambdaFactor;
} else {
// CHECK_GT(step_quality, 0.0);
@ -156,8 +156,8 @@ GaussianFactorGraph::shared_ptr LevenbergMarquardtOptimizer::buildDampedSystem(
state_.hessianDiagonal = linear.hessianDiagonal();
BOOST_FOREACH(Vector& v, state_.hessianDiagonal | map_values) {
for (int aa = 0; aa < v.size(); aa++) {
v(aa) = std::min(std::max(v(aa), params_.min_diagonal_),
params_.max_diagonal_);
v(aa) = std::min(std::max(v(aa), params_.min_diagonal),
params_.max_diagonal);
v(aa) = sqrt(v(aa));
}
}

View File

@ -55,9 +55,9 @@ public:
std::string logFile; ///< an optional CSV log file, with [iteration, time, error, labda]
bool diagonalDamping; ///< if true, use diagonal of Hessian
bool reuse_diagonal_; ///< an additional option in Ceres for diagonalDamping (TODO: should be in state?)
bool useFixedLambdaFactor_; ///< if true applies constant increase (or decrease) to lambda according to lambdaFactor
double min_diagonal_; ///< when using diagonal damping saturates the minimum diagonal entries (default: 1e-6)
double max_diagonal_; ///< when using diagonal damping saturates the maximum diagonal entries (default: 1e32)
bool useFixedLambdaFactor; ///< if true applies constant increase (or decrease) to lambda according to lambdaFactor
double min_diagonal; ///< when using diagonal damping saturates the minimum diagonal entries (default: 1e-6)
double max_diagonal; ///< when using diagonal damping saturates the maximum diagonal entries (default: 1e32)
LevenbergMarquardtParams()
: lambdaInitial(1e-5),
@ -68,9 +68,37 @@ public:
minModelFidelity(1e-3),
diagonalDamping(false),
reuse_diagonal_(false),
useFixedLambdaFactor_(true),
min_diagonal_(1e-6),
max_diagonal_(1e32) {}
useFixedLambdaFactor(true),
min_diagonal(1e-6),
max_diagonal(1e32) {}
static LevenbergMarquardtParams CeresDefaults() {
LevenbergMarquardtParams p;
// Termination condition, same as options.max_num_iterations
p.maxIterations = 50;
// Termination condition, turn off because no corresponding option in CERES
p.absoluteErrorTol = 0; // Frank thinks this is not tolerance (was 1e-6)
// Termination condition, turn off because no corresponding option in CERES
p.errorTol = 0; // 1e-6;
// Termination condition, same as options.function_tolerance
p.relativeErrorTol = 1e-6; // This is function_tolerance (was 1e-03)
// Change lambda parameters to be the same as Ceres
p.lambdaUpperBound = 1e32;
p.lambdaLowerBound = 1e-16;
p.lambdaInitial = 1e-04;
p.lambdaFactor = 2.0;
p.useFixedLambdaFactor = false; // Luca says this is important
p.diagonalDamping = true;
p.minModelFidelity = 1e-3; // options.min_relative_decrease in CERES
return p;
}
virtual ~LevenbergMarquardtParams() {}
virtual void print(const std::string& str = "") const;
@ -94,7 +122,7 @@ public:
inline void setLogFile(const std::string& s) { logFile = s; }
inline void setDiagonalDamping(bool flag) { diagonalDamping = flag; }
inline void setUseFixedLambdaFactor(bool flag) {
useFixedLambdaFactor_ = flag;
useFixedLambdaFactor = flag;
}
};

View File

@ -72,13 +72,10 @@ int main(int argc, char* argv[]) {
// Optimize
// Set parameters to be similar to ceres
LevenbergMarquardtParams params;
LevenbergMarquardtParams params = LevenbergMarquardtParams::CeresDefaults();
params.setOrdering(ordering);
params.setVerbosity("ERROR");
params.setVerbosityLM("TRYLAMBDA");
params.setDiagonalDamping(true);
params.setlambdaInitial(1e-4);
params.setlambdaFactor(2.0);
LevenbergMarquardtOptimizer lm(graph, initial, params);
Values actual = lm.optimize();