Allow for negative error: set relDecrease to 0. Commented parameters.
parent
f275126815
commit
43bc372a83
|
|
@ -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<NonlinearOptimizationParameters> shared_ptr ;
|
||||
typedef NonlinearOptimizationParameters This;
|
||||
typedef boost::shared_ptr<NonlinearOptimizationParameters> sharedThis ;
|
||||
typedef boost::shared_ptr<NonlinearOptimizationParameters> shared_ptr;
|
||||
typedef NonlinearOptimizationParameters This;
|
||||
typedef boost::shared_ptr<NonlinearOptimizationParameters> 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_; ///<trust-region method mode
|
||||
|
||||
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) {}
|
||||
/// if true, solve whole system with QR, otherwise use LDL when possible
|
||||
bool useQR_;
|
||||
|
||||
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_) {}
|
||||
/// Default constructor
|
||||
NonlinearOptimizationParameters() :
|
||||
absDecrease_(1e-6), relDecrease_(1e-6), sumError_(0.0), maxIterations_(
|
||||
100), lambda_(1e-5), lambdaFactor_(10.0), verbosity_(SILENT), lambdaMode_(
|
||||
BOUNDED), useQR_(false) {
|
||||
}
|
||||
|
||||
/* a copy of old instance except some parameters */
|
||||
sharedThis newLambda_(double lambda) const {
|
||||
sharedThis ptr (boost::make_shared<NonlinearOptimizationParameters>(*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<NonlinearOptimizationParameters>()) ;
|
||||
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<NonlinearOptimizationParameters>()) ;
|
||||
ptr->maxIterations_ = maxIterations ;
|
||||
return ptr ;
|
||||
}
|
||||
/// a copy of old instance except new verbosity
|
||||
static sharedThis newVerbosity(verbosityLevel verbosity) {
|
||||
sharedThis ptr(boost::make_shared<NonlinearOptimizationParameters>());
|
||||
ptr->verbosity_ = verbosity;
|
||||
return ptr;
|
||||
}
|
||||
|
||||
static sharedThis newLambda(double lambda) {
|
||||
sharedThis ptr (boost::make_shared<NonlinearOptimizationParameters>());
|
||||
ptr->lambda_ = lambda ;
|
||||
return ptr ;
|
||||
}
|
||||
/// a copy of old instance except new maxIterations
|
||||
static sharedThis newMaxIterations(int maxIterations) {
|
||||
sharedThis ptr(boost::make_shared<NonlinearOptimizationParameters>());
|
||||
ptr->maxIterations_ = maxIterations;
|
||||
return ptr;
|
||||
}
|
||||
|
||||
static sharedThis newDrecreaseThresholds(double absDecrease, double relDecrease) {
|
||||
sharedThis ptr (boost::make_shared<NonlinearOptimizationParameters>());
|
||||
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<NonlinearOptimizationParameters>());
|
||||
ptr->lambda_ = lambda;
|
||||
return ptr;
|
||||
}
|
||||
|
||||
static sharedThis newFactorization(bool useQR) {
|
||||
sharedThis ptr (boost::make_shared<NonlinearOptimizationParameters>());
|
||||
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<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;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue