Allow for negative error: set relDecrease to 0. Commented parameters.

release/4.3a0
Frank Dellaert 2011-09-09 00:47:43 +00:00
parent f275126815
commit 43bc372a83
2 changed files with 104 additions and 87 deletions

View File

@ -23,13 +23,29 @@
namespace gtsam { namespace gtsam {
// a container for all related parameters /**
* a container for all related parameters
*/
struct NonlinearOptimizationParameters { struct NonlinearOptimizationParameters {
typedef boost::shared_ptr<NonlinearOptimizationParameters> shared_ptr; typedef boost::shared_ptr<NonlinearOptimizationParameters> shared_ptr;
typedef NonlinearOptimizationParameters This; typedef NonlinearOptimizationParameters This;
typedef boost::shared_ptr<NonlinearOptimizationParameters> sharedThis; typedef boost::shared_ptr<NonlinearOptimizationParameters> sharedThis;
double absDecrease_; ///< threshold for the absolute decrease per iteration
/**
* 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
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
/// verbosity levels
typedef enum { typedef enum {
SILENT, SILENT,
ERROR, ERROR,
@ -42,82 +58,83 @@ struct NonlinearOptimizationParameters {
LINEAR, LINEAR,
DAMPED DAMPED
} verbosityLevel; } verbosityLevel;
verbosityLevel verbosity_; ///< verbosity
/// trust-region method mode
typedef enum { typedef enum {
FAST, FAST, BOUNDED, CAUTIOUS
BOUNDED,
CAUTIOUS
} LambdaMode; } LambdaMode;
LambdaMode lambdaMode_; ///<trust-region method mode
// thresholds /// if true, solve whole system with QR, otherwise use LDL when possible
double absDecrease_; /* threshold for the absolute decrease per iteration */ bool useQR_;
double relDecrease_; /* threshold for the relative decrease per iteration */
double sumError_; /* threshold for the sum of error */
size_t maxIterations_ ;
double lambda_ ;
double lambdaFactor_ ;
// flags and mode switches /// Default constructor
verbosityLevel verbosity_; NonlinearOptimizationParameters() :
LambdaMode lambdaMode_; absDecrease_(1e-6), relDecrease_(1e-6), sumError_(0.0), maxIterations_(
bool useQR_; /// if true, solve whole system with QR, otherwise use LDL when possible 100), lambda_(1e-5), lambdaFactor_(10.0), verbosity_(SILENT), lambdaMode_(
BOUNDED), useQR_(false) {
}
NonlinearOptimizationParameters(): absDecrease_(1e-6), relDecrease_(1e-6), sumError_(0.0), /// Constructor from doubles
maxIterations_(100), lambda_(1e-5), lambdaFactor_(10.0), verbosity_(SILENT), NonlinearOptimizationParameters(double absDecrease, double relDecrease,
lambdaMode_(BOUNDED), useQR_(false) {} 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) {
}
NonlinearOptimizationParameters(double absDecrease, double relDecrease, double sumError, /// Copy constructor
int iIters = 100, double lambda = 1e-5, double lambdaFactor = 10, NonlinearOptimizationParameters(
verbosityLevel v = SILENT, LambdaMode lambdaMode = BOUNDED, bool useQR = false) const NonlinearOptimizationParameters &parameters) :
:absDecrease_(absDecrease), relDecrease_(relDecrease), sumError_(sumError), absDecrease_(parameters.absDecrease_), relDecrease_(
maxIterations_(iIters), lambda_(lambda), lambdaFactor_(lambdaFactor), verbosity_(v), parameters.relDecrease_), sumError_(parameters.sumError_), maxIterations_(
lambdaMode_(lambdaMode), useQR_(useQR) {} parameters.maxIterations_), lambda_(parameters.lambda_), lambdaFactor_(
parameters.lambdaFactor_), verbosity_(parameters.verbosity_), lambdaMode_(
parameters.lambdaMode_), useQR_(parameters.useQR_) {
}
NonlinearOptimizationParameters(const NonlinearOptimizationParameters &parameters): /// a copy of old instance except new lambda
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_) {}
/* a copy of old instance except some parameters */
sharedThis newLambda_(double lambda) const { sharedThis newLambda_(double lambda) const {
sharedThis ptr (boost::make_shared<NonlinearOptimizationParameters>(*this)) ; sharedThis ptr(
boost::make_shared < NonlinearOptimizationParameters > (*this));
ptr->lambda_ = lambda; ptr->lambda_ = lambda;
return ptr; return ptr;
} }
/* new instance with default parameters except some partially assigned parameters */ /// a copy of old instance except new verbosity
static sharedThis newVerbosity(verbosityLevel verbosity) { static sharedThis newVerbosity(verbosityLevel verbosity) {
sharedThis ptr(boost::make_shared<NonlinearOptimizationParameters>()); sharedThis ptr(boost::make_shared<NonlinearOptimizationParameters>());
ptr->verbosity_ = verbosity; ptr->verbosity_ = verbosity;
return ptr; return ptr;
} }
/// a copy of old instance except new maxIterations
static sharedThis newMaxIterations(int maxIterations) { static sharedThis newMaxIterations(int maxIterations) {
sharedThis ptr(boost::make_shared<NonlinearOptimizationParameters>()); sharedThis ptr(boost::make_shared<NonlinearOptimizationParameters>());
ptr->maxIterations_ = maxIterations; ptr->maxIterations_ = maxIterations;
return ptr; return ptr;
} }
/// a copy of old instance except new lambda
static sharedThis newLambda(double lambda) { static sharedThis newLambda(double lambda) {
sharedThis ptr(boost::make_shared<NonlinearOptimizationParameters>()); sharedThis ptr(boost::make_shared<NonlinearOptimizationParameters>());
ptr->lambda_ = lambda; ptr->lambda_ = lambda;
return ptr; return ptr;
} }
static sharedThis newDrecreaseThresholds(double absDecrease, double relDecrease) { /// a copy of old instance except new thresholds
static sharedThis newDrecreaseThresholds(double absDecrease,
double relDecrease) {
sharedThis ptr(boost::make_shared<NonlinearOptimizationParameters>()); sharedThis ptr(boost::make_shared<NonlinearOptimizationParameters>());
ptr->absDecrease_ = absDecrease; ptr->absDecrease_ = absDecrease;
ptr->relDecrease_ = relDecrease; ptr->relDecrease_ = relDecrease;
return ptr; return ptr;
} }
/// a copy of old instance except new QR flag
static sharedThis newFactorization(bool useQR) { static sharedThis newFactorization(bool useQR) {
sharedThis ptr(boost::make_shared<NonlinearOptimizationParameters>()); sharedThis ptr(boost::make_shared<NonlinearOptimizationParameters>());
ptr->useQR_ = useQR; ptr->useQR_ = useQR;

View File

@ -67,7 +67,7 @@ bool check_convergence(
else else
cout << "relativeDecrease: " << setprecision(12) << relativeDecrease << " >= " << relativeErrorTreshold << endl; cout << "relativeDecrease: " << setprecision(12) << relativeDecrease << " >= " << relativeErrorTreshold << endl;
} }
bool converged = (relativeDecrease < relativeErrorTreshold) bool converged = (relativeErrorTreshold && (relativeDecrease < relativeErrorTreshold))
|| (absoluteDecrease < absoluteErrorTreshold); || (absoluteDecrease < absoluteErrorTreshold);
if (verbosity >= 1 && converged) if (verbosity >= 1 && converged)
cout << "converged" << endl; cout << "converged" << endl;