80 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C++
		
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C++
		
	
	
/*
 | 
						|
 * 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 <boost/foreach.hpp>
 | 
						|
 | 
						|
#include "ClusterTree.h"
 | 
						|
 | 
						|
namespace gtsam {
 | 
						|
 | 
						|
	using namespace std;
 | 
						|
 | 
						|
	/* ************************************************************************* *
 | 
						|
	 * Cluster
 | 
						|
	 * ************************************************************************* */
 | 
						|
	template<class FG>
 | 
						|
	ClusterTree<FG>::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<class FG>
 | 
						|
	bool ClusterTree<FG>::Cluster::equals(const ClusterTree<FG>::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<shared_ptr>::const_iterator it1 = children_.begin();
 | 
						|
		typename vector<shared_ptr>::const_iterator it2 = other.children_.begin();
 | 
						|
		for (; it1 != children_.end(); it1++, it2++)
 | 
						|
			if (!(*it1)->equals(**it2)) return false;
 | 
						|
 | 
						|
		return true;
 | 
						|
	}
 | 
						|
 | 
						|
	/* ************************************************************************* */
 | 
						|
	template<class FG>
 | 
						|
	void ClusterTree<FG>::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<class FG>
 | 
						|
	void ClusterTree<FG>::Cluster::printTree(const string& indent) const {
 | 
						|
		print(indent);
 | 
						|
		BOOST_FOREACH(const shared_ptr& child, children_)
 | 
						|
						child->printTree(indent + "  ");
 | 
						|
	}
 | 
						|
 | 
						|
	/* ************************************************************************* *
 | 
						|
	 * ClusterTree
 | 
						|
	 * ************************************************************************* */
 | 
						|
	template<class FG>
 | 
						|
	bool ClusterTree<FG>::equals(const ClusterTree<FG>& other, double tol) const {
 | 
						|
		if (!root_ && !other.root_) return true;
 | 
						|
		if (!root_ || !other.root_) return false;
 | 
						|
		return root_->equals(*other.root_);
 | 
						|
	}
 | 
						|
 | 
						|
} //namespace gtsam
 |