TLS wip
parent
af069ab4b2
commit
47775a7a4f
|
@ -119,6 +119,9 @@ public:
|
|||
case GM:
|
||||
std::cout << "lossType: Geman McClure" << "\n";
|
||||
break;
|
||||
case TLS:
|
||||
std::cout << "lossType: Truncated Least-squares" << "\n";
|
||||
break;
|
||||
default:
|
||||
throw std::runtime_error("GncParams::print: unknown loss type.");
|
||||
}
|
||||
|
@ -193,6 +196,18 @@ public:
|
|||
GaussNewtonOptimizer baseOptimizer(nfg_, state_);
|
||||
Values result = baseOptimizer.optimize();
|
||||
double mu = initializeMu();
|
||||
|
||||
// handle the degenerate case for TLS cost that corresponds to small
|
||||
// maximum residual error at initialization
|
||||
if (mu <= 0 && params_.lossType == GncParameters::TLS) {
|
||||
if (params_.verbosityGNC >= GncParameters::VerbosityGNC::SUMMARY) {
|
||||
std::cout << "GNC Optimizer stopped because maximum residual at "
|
||||
"initialization is small." << std::endl;
|
||||
result.print("result\n");
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
for (size_t iter = 0; iter < params_.maxIterations; iter++) {
|
||||
|
||||
// display info
|
||||
|
@ -238,6 +253,11 @@ public:
|
|||
switch (params_.lossType) {
|
||||
case GncParameters::GM:
|
||||
return 2 * rmax_sq / params_.barcSq; // initial mu
|
||||
case GncParameters::TLS:
|
||||
// initialize mu to the value specified in Remark 5 in GNC paper
|
||||
// degenerate case: residual is close to zero so mu approximately equals
|
||||
// to -1
|
||||
return params_.barcSq / (2 * rmax_sq - params_.barcSq);
|
||||
default:
|
||||
throw std::runtime_error(
|
||||
"GncOptimizer::initializeMu: called with unknown loss type.");
|
||||
|
@ -249,6 +269,9 @@ public:
|
|||
switch (params_.lossType) {
|
||||
case GncParameters::GM:
|
||||
return std::max(1.0, mu / params_.muStep); // reduce mu, but saturate at 1
|
||||
case GncParameters::TLS:
|
||||
// increases mu at each iteration
|
||||
return mu * params_.muStep;
|
||||
default:
|
||||
throw std::runtime_error(
|
||||
"GncOptimizer::updateMu: called with unknown loss type.");
|
||||
|
@ -260,6 +283,7 @@ public:
|
|||
switch (params_.lossType) {
|
||||
case GncParameters::GM:
|
||||
return std::fabs(mu - 1.0) < 1e-9; // mu=1 recovers the original GM function
|
||||
// TODO: Add TLS
|
||||
default:
|
||||
throw std::runtime_error(
|
||||
"GncOptimizer::checkMuConvergence: called with unknown loss type.");
|
||||
|
@ -317,6 +341,7 @@ public:
|
|||
}
|
||||
}
|
||||
return weights;
|
||||
// TODO: Add TLS
|
||||
default:
|
||||
throw std::runtime_error(
|
||||
"GncOptimizer::calculateWeights: called with unknown loss type.");
|
||||
|
|
Loading…
Reference in New Issue