/* * 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 template ClusterTree::Cluster::Cluster(const FG& fg, Index key, Iterator firstSeparator, Iterator lastSeparator) : FG(fg), frontal(1, key), separator(firstSeparator, lastSeparator) {} /* ************************************************************************* */ template template ClusterTree::Cluster::Cluster( const FG& fg, FrontalIt firstFrontal, FrontalIt lastFrontal, SeparatorIt firstSeparator, SeparatorIt lastSeparator) : FG(fg), frontal(firstFrontal, lastFrontal), separator(firstSeparator, lastSeparator) {} /* ************************************************************************* */ template template ClusterTree::Cluster::Cluster( FrontalIt firstFrontal, FrontalIt lastFrontal, SeparatorIt firstSeparator, SeparatorIt lastSeparator) : frontal(firstFrontal, lastFrontal), separator(firstSeparator, lastSeparator) {} /* ************************************************************************* */ template void ClusterTree::Cluster::addChild(typename ClusterTree::Cluster::shared_ptr child) { children_.push_back(child); } /* ************************************************************************* */ template bool ClusterTree::Cluster::equals(const ClusterTree::Cluster& other) const { if (frontal != other.frontal) return false; if (separator != other.separator) return false; if (children_.size() != other.children_.size()) return false; typename list::const_iterator it1 = children_.begin(); typename list::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 Index key, frontal) cout << key << " "; cout << ": "; BOOST_FOREACH(const Index key, separator) cout << 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