/** * @file ISAM2-inl.h * @brief Incremental update functionality (ISAM2) for BayesTree. * @author Michael Kaess */ #include #include // for operator += using namespace boost::assign; #include "NonlinearFactorGraph.h" #include "GaussianFactor.h" #include "VectorConfig.h" #include "Conditional.h" #include "BayesTree-inl.h" #include "ISAM2.h" namespace gtsam { using namespace std; /** Create an empty Bayes Tree */ template ISAM2::ISAM2() : BayesTree() {} /** Create a Bayes Tree from a Bayes Net */ template ISAM2::ISAM2(const BayesNet& bayesNet) : BayesTree(bayesNet) {} /* ************************************************************************* */ template void ISAM2::update_internal(const NonlinearFactorGraph& newFactorsXXX, const Config& config, Cliques& orphans) { config_ = config; // todo FactorGraph newFactors = newFactorsXXX.linearize(config); // todo: just for testing // Remove the contaminated part of the Bayes tree FactorGraph factors; boost::tie(factors, orphans) = this->removeTop(newFactors); // add the factors themselves factors.push_back(newFactors); // create an ordering for the new and contaminated factors Ordering ordering; if (true) { ordering = factors.getOrdering(); } else { list keys = factors.keys(); keys.sort(); // todo: correct sorting order? ordering = keys; } // eliminate into a Bayes net BayesNet bayesNet = eliminate(factors,ordering); // insert conditionals back in, straight into the topless bayesTree typename BayesNet::const_reverse_iterator rit; for ( rit=bayesNet.rbegin(); rit != bayesNet.rend(); ++rit ) this->insert(*rit); int count = 0; // add orphans to the bottom of the new tree BOOST_FOREACH(sharedClique orphan, orphans) { string key = orphan->separator_.front(); sharedClique parent = (*this)[key]; parent->children_ += orphan; orphan->parent_ = parent; // set new parent! } } template void ISAM2::update(const NonlinearFactorGraph& newFactors, const Config& config) { Cliques orphans; this->update_internal(newFactors, config, orphans); } /* ************************************************************************* */ } /// namespace gtsam