/* * ClusterTree.h * Created on: July 13, 2010 * @author Kai Ni * @author Frank Dellaert * @brief: Collects factorgraph fragments defined on variable clusters, arranged in a tree */ #pragma once #include #include "Ordering.h" namespace gtsam { /** * A cluster-tree is associated with a factor graph and is defined as in Koller-Friedman: * each node k represents a subset C_k \sub X, and the tree is family preserving, in that * each factor f_i is associated with a single cluster and scope(f_i) \sub C_k. */ template class ClusterTree : public Testable > { public: // the class for subgraphs that also include the pointers to the parents and two children struct Cluster : public FG { typedef typename boost::shared_ptr shared_ptr; shared_ptr parent_; // the parent cluster std::vector children_; // the child clusters Ordering frontal_; // the frontal variables Unordered separator_; // the separator variables // empty constructor Cluster() {} // return the members const Ordering& frontal() const { return frontal_;} const Unordered& separator() const { return separator_;} const std::vector& children() { return children_; } // print the object void print(const std::string& indent) const; void printTree(const std::string& indent) const; // check equality bool equals(const Cluster& other) const; }; // typedef for shared pointers to clusters typedef typename Cluster::shared_ptr sharedCluster; protected: // Root cluster sharedCluster root_; public: // constructor ClusterTree() {} // constructor given a factor graph and the elimination ordering ClusterTree(FG& fg, const Ordering& ordering); // return the root cluster sharedCluster root() const { return root_; } // print the object void print(const std::string& str) const { std::cout << str << std::endl; if (root_.get()) root_->printTree(""); } /** check equality */ bool equals(const ClusterTree& other, double tol = 1e-9) const; }; // ClusterTree } // namespace gtsam