/* * ClusterTree-inl.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 namespace gtsam { using namespace std; /* ************************************************************************* * * Cluster * ************************************************************************* */ template ClusterTree::Cluster::Cluster(const FG& fg, const Symbol& key):FG(fg) { // push the one key as frontal frontal_.push_back(key); // the rest are separator keys... BOOST_FOREACH(const Symbol& graphKey, fg.keys()) if (graphKey != key) separator_.insert(graphKey); } /* ************************************************************************* */ template bool ClusterTree::Cluster::equals(const ClusterTree::Cluster& other) const { if (!frontal_.equals(other.frontal_)) return false; if (!separator_.equals(other.separator_)) return false; if (children_.size() != other.children_.size()) return false; typename vector::const_iterator it1 = children_.begin(); typename vector::const_iterator it2 = other.children_.begin(); for (; it1 != children_.end(); it1++, it2++) if (!(*it1)->equals(**it2)) return false; return true; } /* ************************************************************************* */ template void ClusterTree::Cluster::print(const string& indent) const { cout << indent; BOOST_FOREACH(const Symbol& key, frontal_) cout << (string) key << " "; cout << ":"; BOOST_FOREACH(const Symbol& key, separator_) cout << (string) key << " "; cout << endl; } /* ************************************************************************* */ template void ClusterTree::Cluster::printTree(const string& indent) const { print(indent); BOOST_FOREACH(const shared_ptr& child, children_) child->printTree(indent + " "); } /* ************************************************************************* * * ClusterTree * ************************************************************************* */ template bool ClusterTree::equals(const ClusterTree& other, double tol) const { if (!root_ && !other.root_) return true; if (!root_ || !other.root_) return false; return root_->equals(*other.root_); } } //namespace gtsam