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,105 +23,122 @@
namespace gtsam { namespace gtsam {
// a container for all related parameters /**
struct NonlinearOptimizationParameters { * a container for all related parameters
*/
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;
typedef enum { double absDecrease_; ///< threshold for the absolute decrease per iteration
SILENT,
ERROR,
LAMBDA,
TRYLAMBDA,
VALUES,
DELTA,
TRYCONFIG,
TRYDELTA,
LINEAR,
DAMPED
} verbosityLevel;
typedef enum { /**
FAST, * Relative decrease threshold, where relative error = (new-current)/current.
BOUNDED, * This can be set to 0 if there is a possibility for negative error values.
CAUTIOUS */
} LambdaMode; double relDecrease_; ///< threshold for the relative decrease per iteration
// thresholds double sumError_; ///< threshold for the sum of error
double absDecrease_; /* threshold for the absolute decrease per iteration */ size_t maxIterations_; ///< maximum number of iterations
double relDecrease_; /* threshold for the relative decrease per iteration */ double lambda_; ///< starting lambda value
double sumError_; /* threshold for the sum of error */ double lambdaFactor_; ///< factor by which lambda is multiplied
size_t maxIterations_ ;
double lambda_ ;
double lambdaFactor_ ;
// flags and mode switches /// verbosity levels
verbosityLevel verbosity_; typedef enum {
LambdaMode lambdaMode_; SILENT,
bool useQR_; /// if true, solve whole system with QR, otherwise use LDL when possible ERROR,
LAMBDA,
TRYLAMBDA,
VALUES,
DELTA,
TRYCONFIG,
TRYDELTA,
LINEAR,
DAMPED
} verbosityLevel;
verbosityLevel verbosity_; ///< verbosity
NonlinearOptimizationParameters(): absDecrease_(1e-6), relDecrease_(1e-6), sumError_(0.0), /// trust-region method mode
maxIterations_(100), lambda_(1e-5), lambdaFactor_(10.0), verbosity_(SILENT), typedef enum {
lambdaMode_(BOUNDED), useQR_(false) {} FAST, BOUNDED, CAUTIOUS
} LambdaMode;
LambdaMode lambdaMode_; ///<trust-region method mode
NonlinearOptimizationParameters(double absDecrease, double relDecrease, double sumError, /// if true, solve whole system with QR, otherwise use LDL when possible
int iIters = 100, double lambda = 1e-5, double lambdaFactor = 10, bool useQR_;
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(const NonlinearOptimizationParameters &parameters): /// Default constructor
absDecrease_(parameters.absDecrease_), NonlinearOptimizationParameters() :
relDecrease_(parameters.relDecrease_), absDecrease_(1e-6), relDecrease_(1e-6), sumError_(0.0), maxIterations_(
sumError_(parameters.sumError_), 100), lambda_(1e-5), lambdaFactor_(10.0), verbosity_(SILENT), lambdaMode_(
maxIterations_(parameters.maxIterations_), BOUNDED), useQR_(false) {
lambda_(parameters.lambda_), }
lambdaFactor_(parameters.lambdaFactor_),
verbosity_(parameters.verbosity_),
lambdaMode_(parameters.lambdaMode_),
useQR_(parameters.useQR_) {}
/* a copy of old instance except some parameters */ /// Constructor from doubles
sharedThis newLambda_(double lambda) const { NonlinearOptimizationParameters(double absDecrease, double relDecrease,
sharedThis ptr (boost::make_shared<NonlinearOptimizationParameters>(*this)) ; double sumError, int iIters = 100, double lambda = 1e-5,
ptr->lambda_ = lambda ; double lambdaFactor = 10, verbosityLevel v = SILENT,
return ptr ; 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 &parameters) :
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) { /// a copy of old instance except new lambda
sharedThis ptr (boost::make_shared<NonlinearOptimizationParameters>()) ; sharedThis newLambda_(double lambda) const {
ptr->verbosity_ = verbosity ; sharedThis ptr(
return ptr ; boost::make_shared < NonlinearOptimizationParameters > (*this));
} ptr->lambda_ = lambda;
return ptr;
}
static sharedThis newMaxIterations(int maxIterations) { /// a copy of old instance except new verbosity
sharedThis ptr (boost::make_shared<NonlinearOptimizationParameters>()) ; static sharedThis newVerbosity(verbosityLevel verbosity) {
ptr->maxIterations_ = maxIterations ; sharedThis ptr(boost::make_shared<NonlinearOptimizationParameters>());
return ptr ; ptr->verbosity_ = verbosity;
} return ptr;
}
static sharedThis newLambda(double lambda) { /// a copy of old instance except new maxIterations
sharedThis ptr (boost::make_shared<NonlinearOptimizationParameters>()); static sharedThis newMaxIterations(int maxIterations) {
ptr->lambda_ = lambda ; sharedThis ptr(boost::make_shared<NonlinearOptimizationParameters>());
return ptr ; ptr->maxIterations_ = maxIterations;
} return ptr;
}
static sharedThis newDrecreaseThresholds(double absDecrease, double relDecrease) { /// a copy of old instance except new lambda
sharedThis ptr (boost::make_shared<NonlinearOptimizationParameters>()); static sharedThis newLambda(double lambda) {
ptr->absDecrease_ = absDecrease; sharedThis ptr(boost::make_shared<NonlinearOptimizationParameters>());
ptr->relDecrease_ = relDecrease; ptr->lambda_ = lambda;
return ptr ; return ptr;
} }
static sharedThis newFactorization(bool useQR) { /// a copy of old instance except new thresholds
sharedThis ptr (boost::make_shared<NonlinearOptimizationParameters>()); static sharedThis newDrecreaseThresholds(double absDecrease,
ptr->useQR_= useQR; double relDecrease) {
return ptr ; sharedThis ptr(boost::make_shared<NonlinearOptimizationParameters>());
} 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<NonlinearOptimizationParameters>());
ptr->useQR_ = useQR;
return ptr;
}
};
} }

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;