From 43bc372a83712a760c80ddde8d14873347952fd1 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Fri, 9 Sep 2011 00:47:43 +0000 Subject: [PATCH] Allow for negative error: set relDecrease to 0. Commented parameters. --- .../NonlinearOptimizationParameters.h | 189 ++++++++++-------- gtsam/nonlinear/NonlinearOptimizer.cpp | 2 +- 2 files changed, 104 insertions(+), 87 deletions(-) diff --git a/gtsam/nonlinear/NonlinearOptimizationParameters.h b/gtsam/nonlinear/NonlinearOptimizationParameters.h index cdfd543ff..76bd0a5a5 100644 --- a/gtsam/nonlinear/NonlinearOptimizationParameters.h +++ b/gtsam/nonlinear/NonlinearOptimizationParameters.h @@ -23,105 +23,122 @@ namespace gtsam { -// a container for all related parameters -struct NonlinearOptimizationParameters { + /** + * a container for all related parameters + */ + struct NonlinearOptimizationParameters { - typedef boost::shared_ptr shared_ptr ; - typedef NonlinearOptimizationParameters This; - typedef boost::shared_ptr sharedThis ; + typedef boost::shared_ptr shared_ptr; + typedef NonlinearOptimizationParameters This; + typedef boost::shared_ptr sharedThis; - typedef enum { - SILENT, - ERROR, - LAMBDA, - TRYLAMBDA, - VALUES, - DELTA, - TRYCONFIG, - TRYDELTA, - LINEAR, - DAMPED - } verbosityLevel; + double absDecrease_; ///< threshold for the absolute decrease per iteration - typedef enum { - FAST, - BOUNDED, - CAUTIOUS - } LambdaMode; + /** + * Relative decrease threshold, where relative error = (new-current)/current. + * This can be set to 0 if there is a possibility for negative error values. + */ + double relDecrease_; ///< threshold for the relative decrease per iteration - // thresholds - double absDecrease_; /* threshold for the absolute decrease per iteration */ - double relDecrease_; /* threshold for the relative decrease per iteration */ - double sumError_; /* threshold for the sum of error */ - size_t maxIterations_ ; - double lambda_ ; - double lambdaFactor_ ; + double sumError_; ///< threshold for the sum of error + size_t maxIterations_; ///< maximum number of iterations + double lambda_; ///< starting lambda value + double lambdaFactor_; ///< factor by which lambda is multiplied - // flags and mode switches - verbosityLevel verbosity_; - LambdaMode lambdaMode_; - bool useQR_; /// if true, solve whole system with QR, otherwise use LDL when possible + /// verbosity levels + typedef enum { + SILENT, + ERROR, + LAMBDA, + TRYLAMBDA, + VALUES, + DELTA, + TRYCONFIG, + TRYDELTA, + LINEAR, + DAMPED + } verbosityLevel; + verbosityLevel verbosity_; ///< verbosity - NonlinearOptimizationParameters(): absDecrease_(1e-6), relDecrease_(1e-6), sumError_(0.0), - maxIterations_(100), lambda_(1e-5), lambdaFactor_(10.0), verbosity_(SILENT), - lambdaMode_(BOUNDED), useQR_(false) {} + /// trust-region method mode + typedef enum { + FAST, BOUNDED, CAUTIOUS + } LambdaMode; + LambdaMode lambdaMode_; ///(*this)) ; - ptr->lambda_ = lambda ; - return ptr ; - } + /// Constructor from doubles + NonlinearOptimizationParameters(double absDecrease, double relDecrease, + double sumError, int iIters = 100, double lambda = 1e-5, + double lambdaFactor = 10, verbosityLevel v = SILENT, + LambdaMode lambdaMode = BOUNDED, bool useQR = false) : + absDecrease_(absDecrease), relDecrease_(relDecrease), sumError_( + sumError), maxIterations_(iIters), lambda_(lambda), lambdaFactor_( + lambdaFactor), verbosity_(v), lambdaMode_(lambdaMode), useQR_(useQR) { + } - /* new instance with default parameters except some partially assigned parameters */ + /// Copy constructor + NonlinearOptimizationParameters( + const NonlinearOptimizationParameters ¶meters) : + absDecrease_(parameters.absDecrease_), relDecrease_( + parameters.relDecrease_), sumError_(parameters.sumError_), maxIterations_( + parameters.maxIterations_), lambda_(parameters.lambda_), lambdaFactor_( + parameters.lambdaFactor_), verbosity_(parameters.verbosity_), lambdaMode_( + parameters.lambdaMode_), useQR_(parameters.useQR_) { + } - static sharedThis newVerbosity(verbosityLevel verbosity) { - sharedThis ptr (boost::make_shared()) ; - ptr->verbosity_ = verbosity ; - return ptr ; - } + /// a copy of old instance except new lambda + sharedThis newLambda_(double lambda) const { + sharedThis ptr( + boost::make_shared < NonlinearOptimizationParameters > (*this)); + ptr->lambda_ = lambda; + return ptr; + } - static sharedThis newMaxIterations(int maxIterations) { - sharedThis ptr (boost::make_shared()) ; - ptr->maxIterations_ = maxIterations ; - return ptr ; - } + /// a copy of old instance except new verbosity + static sharedThis newVerbosity(verbosityLevel verbosity) { + sharedThis ptr(boost::make_shared()); + ptr->verbosity_ = verbosity; + return ptr; + } - static sharedThis newLambda(double lambda) { - sharedThis ptr (boost::make_shared()); - ptr->lambda_ = lambda ; - return ptr ; - } + /// a copy of old instance except new maxIterations + static sharedThis newMaxIterations(int maxIterations) { + sharedThis ptr(boost::make_shared()); + ptr->maxIterations_ = maxIterations; + return ptr; + } - static sharedThis newDrecreaseThresholds(double absDecrease, double relDecrease) { - sharedThis ptr (boost::make_shared()); - ptr->absDecrease_ = absDecrease; - ptr->relDecrease_ = relDecrease; - return ptr ; - } + /// a copy of old instance except new lambda + static sharedThis newLambda(double lambda) { + sharedThis ptr(boost::make_shared()); + ptr->lambda_ = lambda; + return ptr; + } - static sharedThis newFactorization(bool useQR) { - sharedThis ptr (boost::make_shared()); - ptr->useQR_= useQR; - return ptr ; - } -}; + /// a copy of old instance except new thresholds + static sharedThis newDrecreaseThresholds(double absDecrease, + double relDecrease) { + sharedThis ptr(boost::make_shared()); + ptr->absDecrease_ = absDecrease; + ptr->relDecrease_ = relDecrease; + return ptr; + } + + /// a copy of old instance except new QR flag + static sharedThis newFactorization(bool useQR) { + sharedThis ptr(boost::make_shared()); + ptr->useQR_ = useQR; + return ptr; + } + }; } diff --git a/gtsam/nonlinear/NonlinearOptimizer.cpp b/gtsam/nonlinear/NonlinearOptimizer.cpp index e5cbfeecf..f45278da4 100644 --- a/gtsam/nonlinear/NonlinearOptimizer.cpp +++ b/gtsam/nonlinear/NonlinearOptimizer.cpp @@ -67,7 +67,7 @@ bool check_convergence( else cout << "relativeDecrease: " << setprecision(12) << relativeDecrease << " >= " << relativeErrorTreshold << endl; } - bool converged = (relativeDecrease < relativeErrorTreshold) + bool converged = (relativeErrorTreshold && (relativeDecrease < relativeErrorTreshold)) || (absoluteDecrease < absoluteErrorTreshold); if (verbosity >= 1 && converged) cout << "converged" << endl;