renamed enum

release/4.3a0
lcarlone 2020-12-28 20:49:17 -05:00
parent 06dfeb7ac5
commit eea52766d1
2 changed files with 26 additions and 26 deletions

View File

@ -44,7 +44,7 @@ public:
}; };
/** Choice of robust loss function for GNC */ /** Choice of robust loss function for GNC */
enum RobustLossType { enum GncLossType {
GM /*Geman McClure*/, TLS /*Truncated least squares*/ GM /*Geman McClure*/, TLS /*Truncated least squares*/
}; };
@ -61,7 +61,7 @@ public:
/// GNC parameters /// GNC parameters
BaseOptimizerParameters baseOptimizerParams; /*optimization parameters used to solve the weighted least squares problem at each GNC iteration*/ BaseOptimizerParameters baseOptimizerParams; /*optimization parameters used to solve the weighted least squares problem at each GNC iteration*/
/// any other specific GNC parameters: /// any other specific GNC parameters:
RobustLossType lossType = TLS; /* default loss*/ GncLossType lossType = TLS; /* default loss*/
size_t maxIterations = 100; /* maximum number of iterations*/ size_t maxIterations = 100; /* maximum number of iterations*/
double barcSq = 1.0; /* a factor is considered an inlier if factor.error() < barcSq. Note that factor.error() whitens by the covariance*/ double barcSq = 1.0; /* a factor is considered an inlier if factor.error() < barcSq. Note that factor.error() whitens by the covariance*/
double muStep = 1.4; /* multiplicative factor to reduce/increase the mu in gnc */ double muStep = 1.4; /* multiplicative factor to reduce/increase the mu in gnc */
@ -70,8 +70,8 @@ public:
Verbosity verbosity = SILENT; /* verbosity level */ Verbosity verbosity = SILENT; /* verbosity level */
std::vector<size_t> knownInliers = std::vector<size_t>(); /* slots in the factor graph corresponding to measurements that we know are inliers */ std::vector<size_t> knownInliers = std::vector<size_t>(); /* slots in the factor graph corresponding to measurements that we know are inliers */
/// Set the robust loss function to be used in GNC (chosen among the ones in RobustLossType) /// Set the robust loss function to be used in GNC (chosen among the ones in GncLossType)
void setLossType(const RobustLossType type) { void setLossType(const GncLossType type) {
lossType = type; lossType = type;
} }
/// Set the maximum number of iterations in GNC (changing the max nr of iters might lead to less accurate solutions and is not recommended) /// Set the maximum number of iterations in GNC (changing the max nr of iters might lead to less accurate solutions and is not recommended)
@ -101,8 +101,8 @@ public:
void setWeightsTol(double value) { weightsTol = value; void setWeightsTol(double value) { weightsTol = value;
} }
/// Set the verbosity level /// Set the verbosity level
void setVerbosityGNC(const Verbosity verbosity) { void setVerbosityGNC(const Verbosity value) {
verbosity = verbosity; verbosity = value;
} }
/** (Optional) Provide a vector of measurements that must be considered inliers. The enties in the vector /** (Optional) Provide a vector of measurements that must be considered inliers. The enties in the vector
* corresponds to the slots in the factor graph. For instance, if you have a nonlinear factor graph nfg, * corresponds to the slots in the factor graph. For instance, if you have a nonlinear factor graph nfg,

View File

@ -66,7 +66,7 @@ TEST(GncOptimizer, gncParamsConstructor) {
// change something at the gncParams level // change something at the gncParams level
GncParams<GaussNewtonParams> gncParams2c(gncParams2b); GncParams<GaussNewtonParams> gncParams2c(gncParams2b);
gncParams2c.setLossType(GncParams<GaussNewtonParams>::RobustLossType::GM); gncParams2c.setLossType(GncParams<GaussNewtonParams>::GncLossType::GM);
CHECK(!gncParams2c.equals(gncParams2b.baseOptimizerParams)); CHECK(!gncParams2c.equals(gncParams2b.baseOptimizerParams));
} }
@ -119,7 +119,7 @@ TEST(GncOptimizer, initializeMu) {
// testing GM mu initialization // testing GM mu initialization
GncParams<LevenbergMarquardtParams> gncParams; GncParams<LevenbergMarquardtParams> gncParams;
gncParams.setLossType( gncParams.setLossType(
GncParams<LevenbergMarquardtParams>::RobustLossType::GM); GncParams<LevenbergMarquardtParams>::GncLossType::GM);
auto gnc_gm = auto gnc_gm =
GncOptimizer<GncParams<LevenbergMarquardtParams>>(fg, initial, gncParams); GncOptimizer<GncParams<LevenbergMarquardtParams>>(fg, initial, gncParams);
// according to rmk 5 in the gnc paper: m0 = 2 rmax^2 / barcSq // according to rmk 5 in the gnc paper: m0 = 2 rmax^2 / barcSq
@ -128,7 +128,7 @@ TEST(GncOptimizer, initializeMu) {
// testing TLS mu initialization // testing TLS mu initialization
gncParams.setLossType( gncParams.setLossType(
GncParams<LevenbergMarquardtParams>::RobustLossType::TLS); GncParams<LevenbergMarquardtParams>::GncLossType::TLS);
auto gnc_tls = auto gnc_tls =
GncOptimizer<GncParams<LevenbergMarquardtParams>>(fg, initial, gncParams); GncOptimizer<GncParams<LevenbergMarquardtParams>>(fg, initial, gncParams);
// according to rmk 5 in the gnc paper: m0 = barcSq / (2 * rmax^2 - barcSq) // according to rmk 5 in the gnc paper: m0 = barcSq / (2 * rmax^2 - barcSq)
@ -147,7 +147,7 @@ TEST(GncOptimizer, updateMuGM) {
GncParams<LevenbergMarquardtParams> gncParams; GncParams<LevenbergMarquardtParams> gncParams;
gncParams.setLossType( gncParams.setLossType(
GncParams<LevenbergMarquardtParams>::RobustLossType::GM); GncParams<LevenbergMarquardtParams>::GncLossType::GM);
gncParams.setMuStep(1.4); gncParams.setMuStep(1.4);
auto gnc = auto gnc =
GncOptimizer<GncParams<LevenbergMarquardtParams>>(fg, initial, gncParams); GncOptimizer<GncParams<LevenbergMarquardtParams>>(fg, initial, gncParams);
@ -172,7 +172,7 @@ TEST(GncOptimizer, updateMuTLS) {
GncParams<LevenbergMarquardtParams> gncParams; GncParams<LevenbergMarquardtParams> gncParams;
gncParams.setMuStep(1.4); gncParams.setMuStep(1.4);
gncParams.setLossType( gncParams.setLossType(
GncParams<LevenbergMarquardtParams>::RobustLossType::TLS); GncParams<LevenbergMarquardtParams>::GncLossType::TLS);
auto gnc = auto gnc =
GncOptimizer<GncParams<LevenbergMarquardtParams>>(fg, initial, gncParams); GncOptimizer<GncParams<LevenbergMarquardtParams>>(fg, initial, gncParams);
@ -192,7 +192,7 @@ TEST(GncOptimizer, checkMuConvergence) {
{ {
GncParams<LevenbergMarquardtParams> gncParams; GncParams<LevenbergMarquardtParams> gncParams;
gncParams.setLossType( gncParams.setLossType(
GncParams<LevenbergMarquardtParams>::RobustLossType::GM); GncParams<LevenbergMarquardtParams>::GncLossType::GM);
auto gnc = auto gnc =
GncOptimizer<GncParams<LevenbergMarquardtParams>>(fg, initial, gncParams); GncOptimizer<GncParams<LevenbergMarquardtParams>>(fg, initial, gncParams);
@ -202,7 +202,7 @@ TEST(GncOptimizer, checkMuConvergence) {
{ {
GncParams<LevenbergMarquardtParams> gncParams; GncParams<LevenbergMarquardtParams> gncParams;
gncParams.setLossType( gncParams.setLossType(
GncParams<LevenbergMarquardtParams>::RobustLossType::TLS); GncParams<LevenbergMarquardtParams>::GncLossType::TLS);
auto gnc = auto gnc =
GncOptimizer<GncParams<LevenbergMarquardtParams>>(fg, initial, gncParams); GncOptimizer<GncParams<LevenbergMarquardtParams>>(fg, initial, gncParams);
@ -256,7 +256,7 @@ TEST(GncOptimizer, checkWeightsConvergence) {
{ {
GncParams<LevenbergMarquardtParams> gncParams; GncParams<LevenbergMarquardtParams> gncParams;
gncParams.setLossType( gncParams.setLossType(
GncParams<LevenbergMarquardtParams>::RobustLossType::GM); GncParams<LevenbergMarquardtParams>::GncLossType::GM);
auto gnc = auto gnc =
GncOptimizer<GncParams<LevenbergMarquardtParams>>(fg, initial, gncParams); GncOptimizer<GncParams<LevenbergMarquardtParams>>(fg, initial, gncParams);
@ -266,7 +266,7 @@ TEST(GncOptimizer, checkWeightsConvergence) {
{ {
GncParams<LevenbergMarquardtParams> gncParams; GncParams<LevenbergMarquardtParams> gncParams;
gncParams.setLossType( gncParams.setLossType(
GncParams<LevenbergMarquardtParams>::RobustLossType::TLS); GncParams<LevenbergMarquardtParams>::GncLossType::TLS);
auto gnc = auto gnc =
GncOptimizer<GncParams<LevenbergMarquardtParams>>(fg, initial, gncParams); GncOptimizer<GncParams<LevenbergMarquardtParams>>(fg, initial, gncParams);
@ -277,7 +277,7 @@ TEST(GncOptimizer, checkWeightsConvergence) {
{ {
GncParams<LevenbergMarquardtParams> gncParams; GncParams<LevenbergMarquardtParams> gncParams;
gncParams.setLossType( gncParams.setLossType(
GncParams<LevenbergMarquardtParams>::RobustLossType::TLS); GncParams<LevenbergMarquardtParams>::GncLossType::TLS);
auto gnc = auto gnc =
GncOptimizer<GncParams<LevenbergMarquardtParams>>(fg, initial, gncParams); GncOptimizer<GncParams<LevenbergMarquardtParams>>(fg, initial, gncParams);
@ -288,7 +288,7 @@ TEST(GncOptimizer, checkWeightsConvergence) {
{ {
GncParams<LevenbergMarquardtParams> gncParams; GncParams<LevenbergMarquardtParams> gncParams;
gncParams.setLossType( gncParams.setLossType(
GncParams<LevenbergMarquardtParams>::RobustLossType::TLS); GncParams<LevenbergMarquardtParams>::GncLossType::TLS);
gncParams.setWeightsTol(0.1); gncParams.setWeightsTol(0.1);
auto gnc = auto gnc =
GncOptimizer<GncParams<LevenbergMarquardtParams>>(fg, initial, gncParams); GncOptimizer<GncParams<LevenbergMarquardtParams>>(fg, initial, gncParams);
@ -311,7 +311,7 @@ TEST(GncOptimizer, checkConvergenceTLS) {
GncParams<LevenbergMarquardtParams> gncParams; GncParams<LevenbergMarquardtParams> gncParams;
gncParams.setRelativeCostTol(1e-5); gncParams.setRelativeCostTol(1e-5);
gncParams.setLossType( gncParams.setLossType(
GncParams<LevenbergMarquardtParams>::RobustLossType::TLS); GncParams<LevenbergMarquardtParams>::GncLossType::TLS);
auto gnc = auto gnc =
GncOptimizer<GncParams<LevenbergMarquardtParams>>(fg, initial, gncParams); GncOptimizer<GncParams<LevenbergMarquardtParams>>(fg, initial, gncParams);
@ -338,7 +338,7 @@ TEST(GncOptimizer, calculateWeightsGM) {
GaussNewtonParams gnParams; GaussNewtonParams gnParams;
GncParams<GaussNewtonParams> gncParams(gnParams); GncParams<GaussNewtonParams> gncParams(gnParams);
gncParams.setLossType( gncParams.setLossType(
GncParams<GaussNewtonParams>::RobustLossType::GM); GncParams<GaussNewtonParams>::GncLossType::GM);
auto gnc = GncOptimizer<GncParams<GaussNewtonParams>>(fg, initial, gncParams); auto gnc = GncOptimizer<GncParams<GaussNewtonParams>>(fg, initial, gncParams);
double mu = 1.0; double mu = 1.0;
Vector weights_actual = gnc.calculateWeights(initial, mu); Vector weights_actual = gnc.calculateWeights(initial, mu);
@ -373,7 +373,7 @@ TEST(GncOptimizer, calculateWeightsTLS) {
GaussNewtonParams gnParams; GaussNewtonParams gnParams;
GncParams<GaussNewtonParams> gncParams(gnParams); GncParams<GaussNewtonParams> gncParams(gnParams);
gncParams.setLossType( gncParams.setLossType(
GncParams<GaussNewtonParams>::RobustLossType::TLS); GncParams<GaussNewtonParams>::GncLossType::TLS);
auto gnc = GncOptimizer<GncParams<GaussNewtonParams>>(fg, initial, gncParams); auto gnc = GncOptimizer<GncParams<GaussNewtonParams>>(fg, initial, gncParams);
double mu = 1.0; double mu = 1.0;
Vector weights_actual = gnc.calculateWeights(initial, mu); Vector weights_actual = gnc.calculateWeights(initial, mu);
@ -408,7 +408,7 @@ TEST(GncOptimizer, calculateWeightsTLS2) {
GaussNewtonParams gnParams; GaussNewtonParams gnParams;
GncParams<GaussNewtonParams> gncParams(gnParams); GncParams<GaussNewtonParams> gncParams(gnParams);
gncParams.setLossType( gncParams.setLossType(
GncParams<GaussNewtonParams>::RobustLossType::TLS); GncParams<GaussNewtonParams>::GncLossType::TLS);
gncParams.setInlierCostThreshold(0.51); // if inlier threshold is slightly larger than 0.5, then measurement is inlier gncParams.setInlierCostThreshold(0.51); // if inlier threshold is slightly larger than 0.5, then measurement is inlier
auto gnc = GncOptimizer<GncParams<GaussNewtonParams>>(nfg, initial, gncParams); auto gnc = GncOptimizer<GncParams<GaussNewtonParams>>(nfg, initial, gncParams);
double mu = 1e6; double mu = 1e6;
@ -424,7 +424,7 @@ TEST(GncOptimizer, calculateWeightsTLS2) {
GaussNewtonParams gnParams; GaussNewtonParams gnParams;
GncParams<GaussNewtonParams> gncParams(gnParams); GncParams<GaussNewtonParams> gncParams(gnParams);
gncParams.setLossType( gncParams.setLossType(
GncParams<GaussNewtonParams>::RobustLossType::TLS); GncParams<GaussNewtonParams>::GncLossType::TLS);
gncParams.setInlierCostThreshold(0.49); // if inlier threshold is slightly below 0.5, then measurement is outlier gncParams.setInlierCostThreshold(0.49); // if inlier threshold is slightly below 0.5, then measurement is outlier
auto gnc = GncOptimizer<GncParams<GaussNewtonParams>>(nfg, initial, gncParams); auto gnc = GncOptimizer<GncParams<GaussNewtonParams>>(nfg, initial, gncParams);
double mu = 1e6; // very large mu recovers original TLS cost double mu = 1e6; // very large mu recovers original TLS cost
@ -440,7 +440,7 @@ TEST(GncOptimizer, calculateWeightsTLS2) {
GaussNewtonParams gnParams; GaussNewtonParams gnParams;
GncParams<GaussNewtonParams> gncParams(gnParams); GncParams<GaussNewtonParams> gncParams(gnParams);
gncParams.setLossType( gncParams.setLossType(
GncParams<GaussNewtonParams>::RobustLossType::TLS); GncParams<GaussNewtonParams>::GncLossType::TLS);
gncParams.setInlierCostThreshold(0.5); // if inlier threshold is slightly below 0.5, then measurement is outlier gncParams.setInlierCostThreshold(0.5); // if inlier threshold is slightly below 0.5, then measurement is outlier
auto gnc = GncOptimizer<GncParams<GaussNewtonParams>>(nfg, initial, gncParams); auto gnc = GncOptimizer<GncParams<GaussNewtonParams>>(nfg, initial, gncParams);
double mu = 1e6; // very large mu recovers original TLS cost double mu = 1e6; // very large mu recovers original TLS cost
@ -552,7 +552,7 @@ TEST(GncOptimizer, optimizeWithKnownInliers) {
GncParams<GaussNewtonParams> gncParams; GncParams<GaussNewtonParams> gncParams;
gncParams.setKnownInliers(knownInliers); gncParams.setKnownInliers(knownInliers);
gncParams.setLossType( gncParams.setLossType(
GncParams<GaussNewtonParams>::RobustLossType::GM); GncParams<GaussNewtonParams>::GncLossType::GM);
//gncParams.setVerbosityGNC(GncParams<GaussNewtonParams>::Verbosity::SUMMARY); //gncParams.setVerbosityGNC(GncParams<GaussNewtonParams>::Verbosity::SUMMARY);
auto gnc = GncOptimizer<GncParams<GaussNewtonParams>>(fg, initial, gncParams); auto gnc = GncOptimizer<GncParams<GaussNewtonParams>>(fg, initial, gncParams);
@ -569,7 +569,7 @@ TEST(GncOptimizer, optimizeWithKnownInliers) {
GncParams<GaussNewtonParams> gncParams; GncParams<GaussNewtonParams> gncParams;
gncParams.setKnownInliers(knownInliers); gncParams.setKnownInliers(knownInliers);
gncParams.setLossType( gncParams.setLossType(
GncParams<GaussNewtonParams>::RobustLossType::TLS); GncParams<GaussNewtonParams>::GncLossType::TLS);
// gncParams.setVerbosityGNC(GncParams<GaussNewtonParams>::Verbosity::SUMMARY); // gncParams.setVerbosityGNC(GncParams<GaussNewtonParams>::Verbosity::SUMMARY);
auto gnc = GncOptimizer<GncParams<GaussNewtonParams>>(fg, initial, gncParams); auto gnc = GncOptimizer<GncParams<GaussNewtonParams>>(fg, initial, gncParams);
@ -588,7 +588,7 @@ TEST(GncOptimizer, optimizeWithKnownInliers) {
GncParams<GaussNewtonParams> gncParams; GncParams<GaussNewtonParams> gncParams;
gncParams.setKnownInliers(knownInliers); gncParams.setKnownInliers(knownInliers);
gncParams.setLossType( gncParams.setLossType(
GncParams<GaussNewtonParams>::RobustLossType::TLS); GncParams<GaussNewtonParams>::GncLossType::TLS);
//gncParams.setVerbosityGNC(GncParams<GaussNewtonParams>::Verbosity::VALUES); //gncParams.setVerbosityGNC(GncParams<GaussNewtonParams>::Verbosity::VALUES);
gncParams.setInlierCostThreshold( 100.0 ); gncParams.setInlierCostThreshold( 100.0 );
auto gnc = GncOptimizer<GncParams<GaussNewtonParams>>(fg, initial, gncParams); auto gnc = GncOptimizer<GncParams<GaussNewtonParams>>(fg, initial, gncParams);