Formatting only
# Conflicts: # gtsam/nonlinear/NonlinearOptimizer.cpp # tests/testPCGSolver.cpprelease/4.3a0
parent
c66b227410
commit
3d42e4e76a
|
@ -183,21 +183,21 @@ void BlockJacobiPreconditioner::clean() {
|
|||
}
|
||||
|
||||
/***************************************************************************************/
|
||||
boost::shared_ptr<Preconditioner> createPreconditioner(const boost::shared_ptr<PreconditionerParameters> parameters) {
|
||||
|
||||
if ( DummyPreconditionerParameters::shared_ptr dummy = boost::dynamic_pointer_cast<DummyPreconditionerParameters>(parameters) ) {
|
||||
boost::shared_ptr<Preconditioner> createPreconditioner(
|
||||
const boost::shared_ptr<PreconditionerParameters> params) {
|
||||
using boost::dynamic_pointer_cast;
|
||||
if (dynamic_pointer_cast<DummyPreconditionerParameters>(params)) {
|
||||
return boost::make_shared<DummyPreconditioner>();
|
||||
}
|
||||
else if ( BlockJacobiPreconditionerParameters::shared_ptr blockJacobi = boost::dynamic_pointer_cast<BlockJacobiPreconditionerParameters>(parameters) ) {
|
||||
} else if (dynamic_pointer_cast<BlockJacobiPreconditionerParameters>(
|
||||
params)) {
|
||||
return boost::make_shared<BlockJacobiPreconditioner>();
|
||||
}
|
||||
else if ( SubgraphPreconditionerParameters::shared_ptr subgraph = boost::dynamic_pointer_cast<SubgraphPreconditionerParameters>(parameters) ) {
|
||||
} else if (auto subgraph =
|
||||
dynamic_pointer_cast<SubgraphPreconditionerParameters>(
|
||||
params)) {
|
||||
return boost::make_shared<SubgraphPreconditioner>(*subgraph);
|
||||
}
|
||||
|
||||
throw invalid_argument("createPreconditioner: unexpected preconditioner parameter type");
|
||||
throw invalid_argument(
|
||||
"createPreconditioner: unexpected preconditioner parameter type");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
} // namespace gtsam
|
||||
|
|
|
@ -147,13 +147,15 @@ VectorValues NonlinearOptimizer::solve(const GaussianFactorGraph& gfg,
|
|||
} else if (params.isIterative()) {
|
||||
// Conjugate Gradient -> needs params.iterativeParams
|
||||
if (!params.iterativeParams)
|
||||
throw std::runtime_error("NonlinearOptimizer::solve: cg parameter has to be assigned ...");
|
||||
throw std::runtime_error(
|
||||
"NonlinearOptimizer::solve: cg parameter has to be assigned ...");
|
||||
|
||||
if (boost::shared_ptr<PCGSolverParameters> pcg =
|
||||
boost::dynamic_pointer_cast<PCGSolverParameters>(params.iterativeParams)) {
|
||||
if (auto pcg = boost::dynamic_pointer_cast<PCGSolverParameters>(
|
||||
params.iterativeParams)) {
|
||||
delta = PCGSolver(*pcg).optimize(gfg);
|
||||
} else if (boost::shared_ptr<SubgraphSolverParameters> spcg =
|
||||
boost::dynamic_pointer_cast<SubgraphSolverParameters>(params.iterativeParams)) {
|
||||
} else if (auto spcg =
|
||||
boost::dynamic_pointer_cast<SubgraphSolverParameters>(
|
||||
params.iterativeParams)) {
|
||||
if (!params.ordering)
|
||||
throw std::runtime_error("SubgraphSolver needs an ordering");
|
||||
delta = SubgraphSolver(gfg, *spcg, *params.ordering).optimize();
|
||||
|
|
|
@ -493,23 +493,24 @@ TEST(NonlinearOptimizer, disconnected_graph) {
|
|||
/* ************************************************************************* */
|
||||
#include <gtsam/linear/iterative.h>
|
||||
|
||||
class IterativeLM: public LevenbergMarquardtOptimizer {
|
||||
|
||||
class IterativeLM : public LevenbergMarquardtOptimizer {
|
||||
/// Solver specific parameters
|
||||
ConjugateGradientParameters cgParams_;
|
||||
Values initial_;
|
||||
|
||||
public:
|
||||
public:
|
||||
/// Constructor
|
||||
IterativeLM(const NonlinearFactorGraph& graph, const Values& initialValues,
|
||||
const ConjugateGradientParameters &p,
|
||||
const LevenbergMarquardtParams& params = LevenbergMarquardtParams::LegacyDefaults()) :
|
||||
LevenbergMarquardtOptimizer(graph, initialValues, params), cgParams_(p), initial_(initialValues) {
|
||||
}
|
||||
const ConjugateGradientParameters& p,
|
||||
const LevenbergMarquardtParams& params =
|
||||
LevenbergMarquardtParams::LegacyDefaults())
|
||||
: LevenbergMarquardtOptimizer(graph, initialValues, params),
|
||||
cgParams_(p),
|
||||
initial_(initialValues) {}
|
||||
|
||||
/// Solve that uses conjugate gradient
|
||||
virtual VectorValues solve(const GaussianFactorGraph &gfg,
|
||||
const NonlinearOptimizerParams& params) const {
|
||||
virtual VectorValues solve(const GaussianFactorGraph& gfg,
|
||||
const NonlinearOptimizerParams& params) const {
|
||||
VectorValues zeros = initial_.zeroVectors();
|
||||
return conjugateGradientDescent(gfg, zeros, cgParams_);
|
||||
}
|
||||
|
@ -518,19 +519,20 @@ public:
|
|||
/* ************************************************************************* */
|
||||
TEST(NonlinearOptimizer, subclass_solver) {
|
||||
Values expected;
|
||||
expected.insert(X(1), Pose2(0.,0.,0.));
|
||||
expected.insert(X(2), Pose2(1.5,0.,0.));
|
||||
expected.insert(X(3), Pose2(3.0,0.,0.));
|
||||
expected.insert(X(1), Pose2(0., 0., 0.));
|
||||
expected.insert(X(2), Pose2(1.5, 0., 0.));
|
||||
expected.insert(X(3), Pose2(3.0, 0., 0.));
|
||||
|
||||
Values init;
|
||||
init.insert(X(1), Pose2(0.,0.,0.));
|
||||
init.insert(X(2), Pose2(0.,0.,0.));
|
||||
init.insert(X(3), Pose2(0.,0.,0.));
|
||||
init.insert(X(1), Pose2(0., 0., 0.));
|
||||
init.insert(X(2), Pose2(0., 0., 0.));
|
||||
init.insert(X(3), Pose2(0., 0., 0.));
|
||||
|
||||
NonlinearFactorGraph graph;
|
||||
graph.addPrior(X(1), Pose2(0.,0.,0.), noiseModel::Isotropic::Sigma(3,1));
|
||||
graph += BetweenFactor<Pose2>(X(1),X(2), Pose2(1.5,0.,0.), noiseModel::Isotropic::Sigma(3,1));
|
||||
graph.addPrior(X(3), Pose2(3.,0.,0.), noiseModel::Isotropic::Sigma(3,1));
|
||||
graph.addPrior(X(1), Pose2(0., 0., 0.), noiseModel::Isotropic::Sigma(3, 1));
|
||||
graph += BetweenFactor<Pose2>(X(1), X(2), Pose2(1.5, 0., 0.),
|
||||
noiseModel::Isotropic::Sigma(3, 1));
|
||||
graph.addPrior(X(3), Pose2(3., 0., 0.), noiseModel::Isotropic::Sigma(3, 1));
|
||||
|
||||
ConjugateGradientParameters p;
|
||||
Values actual = IterativeLM(graph, init, p).optimize();
|
||||
|
|
|
@ -126,65 +126,63 @@ TEST( GaussianFactorGraphSystem, multiply_getb)
|
|||
|
||||
/* ************************************************************************* */
|
||||
// Test Dummy Preconditioner
|
||||
TEST( PCGSolver, dummy )
|
||||
{
|
||||
LevenbergMarquardtParams paramsPCG;
|
||||
paramsPCG.linearSolverType = LevenbergMarquardtParams::Iterative;
|
||||
PCGSolverParameters::shared_ptr pcg = boost::make_shared<PCGSolverParameters>();
|
||||
TEST(PCGSolver, dummy) {
|
||||
LevenbergMarquardtParams params;
|
||||
params.linearSolverType = LevenbergMarquardtParams::Iterative;
|
||||
auto pcg = boost::make_shared<PCGSolverParameters>();
|
||||
pcg->preconditioner_ = boost::make_shared<DummyPreconditionerParameters>();
|
||||
paramsPCG.iterativeParams = pcg;
|
||||
params.iterativeParams = pcg;
|
||||
|
||||
NonlinearFactorGraph fg = example::createReallyNonlinearFactorGraph();
|
||||
|
||||
Point2 x0(10,10);
|
||||
Point2 x0(10, 10);
|
||||
Values c0;
|
||||
c0.insert(X(1), x0);
|
||||
|
||||
Values actualPCG = LevenbergMarquardtOptimizer(fg, c0, paramsPCG).optimize();
|
||||
Values actualPCG = LevenbergMarquardtOptimizer(fg, c0, params).optimize();
|
||||
|
||||
DOUBLES_EQUAL(0,fg.error(actualPCG),tol);
|
||||
DOUBLES_EQUAL(0, fg.error(actualPCG), tol);
|
||||
}
|
||||
|
||||
/* ************************************************************************* */
|
||||
// Test Block-Jacobi Precondioner
|
||||
TEST( PCGSolver, blockjacobi )
|
||||
{
|
||||
LevenbergMarquardtParams paramsPCG;
|
||||
paramsPCG.linearSolverType = LevenbergMarquardtParams::Iterative;
|
||||
PCGSolverParameters::shared_ptr pcg = boost::make_shared<PCGSolverParameters>();
|
||||
pcg->preconditioner_ = boost::make_shared<BlockJacobiPreconditionerParameters>();
|
||||
paramsPCG.iterativeParams = pcg;
|
||||
TEST(PCGSolver, blockjacobi) {
|
||||
LevenbergMarquardtParams params;
|
||||
params.linearSolverType = LevenbergMarquardtParams::Iterative;
|
||||
auto pcg = boost::make_shared<PCGSolverParameters>();
|
||||
pcg->preconditioner_ =
|
||||
boost::make_shared<BlockJacobiPreconditionerParameters>();
|
||||
params.iterativeParams = pcg;
|
||||
|
||||
NonlinearFactorGraph fg = example::createReallyNonlinearFactorGraph();
|
||||
|
||||
Point2 x0(10,10);
|
||||
Point2 x0(10, 10);
|
||||
Values c0;
|
||||
c0.insert(X(1), x0);
|
||||
|
||||
Values actualPCG = LevenbergMarquardtOptimizer(fg, c0, paramsPCG).optimize();
|
||||
Values actualPCG = LevenbergMarquardtOptimizer(fg, c0, params).optimize();
|
||||
|
||||
DOUBLES_EQUAL(0,fg.error(actualPCG),tol);
|
||||
DOUBLES_EQUAL(0, fg.error(actualPCG), tol);
|
||||
}
|
||||
|
||||
/* ************************************************************************* */
|
||||
// Test Incremental Subgraph PCG Solver
|
||||
TEST( PCGSolver, subgraph )
|
||||
{
|
||||
LevenbergMarquardtParams paramsPCG;
|
||||
paramsPCG.linearSolverType = LevenbergMarquardtParams::Iterative;
|
||||
PCGSolverParameters::shared_ptr pcg = boost::make_shared<PCGSolverParameters>();
|
||||
TEST(PCGSolver, subgraph) {
|
||||
LevenbergMarquardtParams params;
|
||||
params.linearSolverType = LevenbergMarquardtParams::Iterative;
|
||||
auto pcg = boost::make_shared<PCGSolverParameters>();
|
||||
pcg->preconditioner_ = boost::make_shared<SubgraphPreconditionerParameters>();
|
||||
paramsPCG.iterativeParams = pcg;
|
||||
params.iterativeParams = pcg;
|
||||
|
||||
NonlinearFactorGraph fg = example::createReallyNonlinearFactorGraph();
|
||||
|
||||
Point2 x0(10,10);
|
||||
Point2 x0(10, 10);
|
||||
Values c0;
|
||||
c0.insert(X(1), x0);
|
||||
|
||||
Values actualPCG = LevenbergMarquardtOptimizer(fg, c0, paramsPCG).optimize();
|
||||
Values actualPCG = LevenbergMarquardtOptimizer(fg, c0, params).optimize();
|
||||
|
||||
DOUBLES_EQUAL(0,fg.error(actualPCG),tol);
|
||||
DOUBLES_EQUAL(0, fg.error(actualPCG), tol);
|
||||
}
|
||||
|
||||
/* ************************************************************************* */
|
||||
|
|
Loading…
Reference in New Issue