Added a static nonlinear optimization function that uses default ordering and thresholds and returns an updated config.
parent
cf2b3db5a6
commit
d6157ab828
|
@ -269,6 +269,6 @@ namespace gtsam {
|
||||||
verbosity, maxIterations-1, lambdaFactor, lambdaMode);
|
verbosity, maxIterations-1, lambdaFactor, lambdaMode);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -178,6 +178,29 @@ namespace gtsam {
|
||||||
verbosityLevel verbosity = SILENT, int maxIterations = 100,
|
verbosityLevel verbosity = SILENT, int maxIterations = 100,
|
||||||
double lambdaFactor = 10, LambdaMode lambdaMode = BOUNDED) const;
|
double lambdaFactor = 10, LambdaMode lambdaMode = BOUNDED) const;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Static interface to LM optimization using default ordering and thresholds
|
||||||
|
* @param graph Nonlinear factor graph to optimize
|
||||||
|
* @param config Initial config
|
||||||
|
* @param verbosity Integer specifying how much output to provide
|
||||||
|
* @return an optimized configuration
|
||||||
|
*/
|
||||||
|
static shared_config optimizeLM(shared_graph graph, shared_config config,
|
||||||
|
verbosityLevel verbosity = SILENT) {
|
||||||
|
boost::shared_ptr<gtsam::Ordering> ord(new gtsam::Ordering(graph->getOrdering()));
|
||||||
|
double relativeThreshold = 1e-5, absoluteThreshold = 1e-5;
|
||||||
|
|
||||||
|
// initial optimization state is the same in both cases tested
|
||||||
|
shared_solver solver(new NonlinearOptimizer::solver(ord));
|
||||||
|
NonlinearOptimizer optimizer(graph, config, solver);
|
||||||
|
|
||||||
|
// Levenberg-Marquardt
|
||||||
|
NonlinearOptimizer result = optimizer.levenbergMarquardt(relativeThreshold,
|
||||||
|
absoluteThreshold, verbosity);
|
||||||
|
return result.config();
|
||||||
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -174,6 +174,26 @@ TEST( NonlinearOptimizer, optimize )
|
||||||
DOUBLES_EQUAL(0,fg->error(*(actual2.config())),tol);
|
DOUBLES_EQUAL(0,fg->error(*(actual2.config())),tol);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ************************************************************************* */
|
||||||
|
TEST( NonlinearOptimizer, SimpleOptimizer )
|
||||||
|
{
|
||||||
|
shared_ptr<example::Graph> fg(new example::Graph(
|
||||||
|
example::createReallyNonlinearFactorGraph()));
|
||||||
|
|
||||||
|
// test error at minimum
|
||||||
|
Point2 xstar(0,0);
|
||||||
|
example::Config cstar;
|
||||||
|
cstar.insert(simulated2D::PoseKey(1), xstar);
|
||||||
|
|
||||||
|
// test error at initial = [(1-cos(3))^2 + (sin(3))^2]*50 =
|
||||||
|
Point2 x0(3,3);
|
||||||
|
boost::shared_ptr<example::Config> c0(new example::Config);
|
||||||
|
c0->insert(simulated2D::PoseKey(1), x0);
|
||||||
|
|
||||||
|
Optimizer::shared_config actual = Optimizer::optimizeLM(fg, c0);
|
||||||
|
DOUBLES_EQUAL(0,fg->error(*actual),tol);
|
||||||
|
}
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
TEST( NonlinearOptimizer, Factorization )
|
TEST( NonlinearOptimizer, Factorization )
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue