diff --git a/gtsam/linear/PCGSolver.cpp b/gtsam/linear/PCGSolver.cpp index 5ec6fa67b..320c3e535 100644 --- a/gtsam/linear/PCGSolver.cpp +++ b/gtsam/linear/PCGSolver.cpp @@ -40,7 +40,7 @@ void PCGSolverParameters::print(ostream &os) const { /*****************************************************************************/ PCGSolver::PCGSolver(const PCGSolverParameters &p) { parameters_ = p; - preconditioner_ = createPreconditioner(p.preconditioner_); + preconditioner_ = createPreconditioner(p.preconditioner()); } void PCGSolverParameters::setPreconditionerParams(const std::shared_ptr preconditioner) { diff --git a/gtsam/linear/PCGSolver.h b/gtsam/linear/PCGSolver.h index 5ed2c7c6d..35f6bdacb 100644 --- a/gtsam/linear/PCGSolver.h +++ b/gtsam/linear/PCGSolver.h @@ -34,26 +34,30 @@ struct PreconditionerParameters; * Parameters for PCG */ struct GTSAM_EXPORT PCGSolverParameters: public ConjugateGradientParameters { -public: + public: typedef ConjugateGradientParameters Base; typedef std::shared_ptr shared_ptr; - PCGSolverParameters() { - } +protected: + std::shared_ptr preconditioner_; + +public: + PCGSolverParameters() {} + + PCGSolverParameters( + const std::shared_ptr &preconditioner) + : preconditioner_(preconditioner) {} void print(std::ostream &os) const override; - /* interface to preconditioner parameters */ - inline const PreconditionerParameters& preconditioner() const { - return *preconditioner_; + const std::shared_ptr preconditioner() const { + return preconditioner_; } - // needed for python wrapper + void setPreconditionerParams( + const std::shared_ptr preconditioner); + void print(const std::string &s) const; - - std::shared_ptr preconditioner_; - - void setPreconditionerParams(const std::shared_ptr preconditioner); }; /** diff --git a/gtsam/sfm/ShonanAveraging.cpp b/gtsam/sfm/ShonanAveraging.cpp index 7c8b07f37..830f1c719 100644 --- a/gtsam/sfm/ShonanAveraging.cpp +++ b/gtsam/sfm/ShonanAveraging.cpp @@ -67,20 +67,15 @@ ShonanAveragingParameters::ShonanAveragingParameters( builderParameters.augmentationWeight = SubgraphBuilderParameters::SKELETON; builderParameters.augmentationFactor = 0.0; - auto pcg = std::make_shared(); - // Choose optimization method if (method == "SUBGRAPH") { lm.iterativeParams = std::make_shared(builderParameters); } else if (method == "SGPC") { - pcg->preconditioner_ = - std::make_shared(builderParameters); - lm.iterativeParams = pcg; + lm.iterativeParams = std::make_shared( + std::make_shared(builderParameters)); } else if (method == "JACOBI") { - pcg->preconditioner_ = - std::make_shared(); - lm.iterativeParams = pcg; + lm.iterativeParams = std::make_shared(std::make_shared()); } else if (method == "QR") { lm.setLinearSolverType("MULTIFRONTAL_QR"); } else if (method == "CHOLESKY") {