Allow for negative error: set relDecrease to 0. Commented parameters.
parent
f275126815
commit
43bc372a83
|
|
@ -23,13 +23,29 @@
|
||||||
|
|
||||||
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;
|
||||||
|
|
||||||
|
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,86 +58,87 @@ 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 ¶meters) :
|
||||||
: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 ¶meters):
|
/// 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(
|
||||||
ptr->lambda_ = lambda ;
|
boost::make_shared < NonlinearOptimizationParameters > (*this));
|
||||||
return ptr ;
|
ptr->lambda_ = lambda;
|
||||||
|
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
|
||||||
sharedThis ptr (boost::make_shared<NonlinearOptimizationParameters>());
|
static sharedThis newDrecreaseThresholds(double absDecrease,
|
||||||
|
double relDecrease) {
|
||||||
|
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;
|
||||||
return ptr ;
|
return ptr;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue