From 0fc7c068e524efe08593b734bc22b4ddef7243c0 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Tue, 27 Aug 2013 15:30:02 +0000 Subject: [PATCH] Added back factor graph .add functions to maintain compatibility --- gtsam.h | 1 + gtsam/inference/FactorGraph.h | 102 ++++++++++++----------------- gtsam/linear/GaussianFactorGraph.h | 4 +- 3 files changed, 46 insertions(+), 61 deletions(-) diff --git a/gtsam.h b/gtsam.h index 6ad907cd0..20b72bf7b 100644 --- a/gtsam.h +++ b/gtsam.h @@ -1522,6 +1522,7 @@ class NonlinearFactorGraph { gtsam::NonlinearFactor* at(size_t idx) const; void push_back(const gtsam::NonlinearFactorGraph& factors); void push_back(gtsam::NonlinearFactor* factor); + void add(gtsam::NonlinearFactor* factor); bool exists(size_t idx) const; // NonlinearFactorGraph diff --git a/gtsam/inference/FactorGraph.h b/gtsam/inference/FactorGraph.h index 9928c9c81..602dd26f2 100644 --- a/gtsam/inference/FactorGraph.h +++ b/gtsam/inference/FactorGraph.h @@ -180,69 +180,19 @@ namespace gtsam { bayesTree.addFactorsToGraph(*this); } - /** += syntax for push_back, e.g. graph += f1, f2, f3 */ - //template - //boost::assign::list_inserter > - // operator+=(const T& factorOrContainer) - //{ - // return boost::assign::make_list_inserter( - // boost::bind(&This::push_back, this, _1)); - //} - - /** Add a factor directly using a shared_ptr */ - template - typename boost::enable_if, - boost::assign::list_inserter > >::type - operator+=(boost::shared_ptr& factor) { - return boost::assign::make_list_inserter(RefCallPushBack(*this))(factor); - } - - /** Add a factor directly using a shared_ptr */ - boost::assign::list_inserter > - operator+=(const sharedFactor& factor) { - return boost::assign::make_list_inserter(CRefCallPushBack(*this))(factor); - } - - template - boost::assign::list_inserter > - operator+=(const FACTOR_OR_CONTAINER& factorOrContainer) { - return boost::assign::make_list_inserter(CRefCallPushBack(*this))(factorOrContainer); - } - - ///** Add a factor directly using a shared_ptr */ - //boost::assign::list_inserter > - // operator+=(const sharedFactor& factor) { - // return boost::assign::make_list_inserter(CRefCallPushBack(*this)); - //} - - ///** push back many factors as shared_ptr's in a container (factors are not copied) */ - //template - //typename boost::enable_if, - // boost::assign::list_inserter > >::type - // operator+=(const CONTAINER& container) { - // return boost::assign::make_list_inserter(CRefCallPushBack(*this)); - //} - - ///** push back a BayesTree as a collection of factors. NOTE: This should be hidden in derived - // * classes in favor of a type-specialized version that calls this templated function. */ - //template - //boost::assign::list_inserter > - // operator+=(const BayesTree& bayesTree) { - // return boost::assign::make_list_inserter(CRefCallPushBack(*this)); - //} - /** Add a factor by value, will be copy-constructed (use push_back with a shared_ptr to avoid - * the copy). */ + * the copy). */ template typename boost::enable_if >::type push_back(const DERIVEDFACTOR& factor) { - factors_.push_back(boost::make_shared(factor)); } + factors_.push_back(boost::make_shared(factor)); + } /** push back many factors with an iterator over plain factors (factors are copied) */ template typename boost::enable_if >::type push_back(ITERATOR firstFactor, ITERATOR lastFactor) { - for(ITERATOR f = firstFactor; f != lastFactor; ++f) + for (ITERATOR f = firstFactor; f != lastFactor; ++f) push_back(*f); } @@ -253,11 +203,45 @@ namespace gtsam { push_back(container.begin(), container.end()); } - //template - //boost::assign::list_inserter > - // operator*=(const FACTOR_OR_CONTAINER& factorOrContainer) { - // return boost::assign::make_list_inserter(CRefCallAddCopy(*this)); - //} + /** Add a factor directly using a shared_ptr */ + template + typename boost::enable_if, + boost::assign::list_inserter > >::type + operator+=(boost::shared_ptr factor) { + return boost::assign::make_list_inserter(RefCallPushBack(*this))(factor); + } + + /** Add a factor directly using a shared_ptr */ + boost::assign::list_inserter > + operator+=(const sharedFactor& factor) { + return boost::assign::make_list_inserter(CRefCallPushBack(*this))(factor); + } + + /** Add a factor or container of factors, including STL collections, BayesTrees, etc. */ + template + boost::assign::list_inserter > + operator+=(const FACTOR_OR_CONTAINER& factorOrContainer) { + return boost::assign::make_list_inserter(CRefCallPushBack(*this))(factorOrContainer); + } + + /** Add a factor directly using a shared_ptr */ + template + typename boost::enable_if, + boost::assign::list_inserter > >::type + add(boost::shared_ptr factor) { + push_back(factor); + } + + /** Add a factor directly using a shared_ptr */ + void add(const sharedFactor& factor) { + push_back(factor); + } + + /** Add a factor or container of factors, including STL collections, BayesTrees, etc. */ + template + void add(const FACTOR_OR_CONTAINER& factorOrContainer) { + push_back(Factor); + } /// @} /// @name Testable diff --git a/gtsam/linear/GaussianFactorGraph.h b/gtsam/linear/GaussianFactorGraph.h index 319b407ae..90320606f 100644 --- a/gtsam/linear/GaussianFactorGraph.h +++ b/gtsam/linear/GaussianFactorGraph.h @@ -96,10 +96,10 @@ namespace gtsam { /// @} /** Add a factor by value - makes a copy */ - void add(const GaussianFactor& factor) { factors_.push_back(factor.clone()); } + void add(const GaussianFactor& factor) { push_back(factor.clone()); } /** Add a factor by pointer - stores pointer without copying the factor */ - void add(const sharedFactor& factor) { factors_.push_back(factor); } + void add(const sharedFactor& factor) { push_back(factor); } /** Add a null factor */ void add(const Vector& b) {