75 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C++
		
	
	
			
		
		
	
	
			75 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C++
		
	
	
| /*
 | |
|  * 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 <boost/shared_ptr.hpp>
 | |
| #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 FG>
 | |
| 	class ClusterTree : public Testable<ClusterTree<FG> > {
 | |
| 
 | |
| 	protected:
 | |
| 
 | |
| 		// the class for subgraphs that also include the pointers to the parents and two children
 | |
| 		struct Cluster : public FG {
 | |
| 
 | |
| 			typedef typename boost::shared_ptr<Cluster> shared_ptr;
 | |
| 
 | |
| 			Ordering frontal_;                   // the frontal variables
 | |
| 			Unordered separator_;                // the separator variables
 | |
| 			shared_ptr parent_;                  // the parent cluster
 | |
| 			std::vector<shared_ptr> children_;   // the child clusters
 | |
| 
 | |
| 			// Construct empty clique
 | |
| 			Cluster() {}
 | |
| 
 | |
| 			/* Create a node with a single frontal variable */
 | |
| 			Cluster(const FG& fg, const Symbol& key);
 | |
| 
 | |
| 			// 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;
 | |
| 
 | |
| 		// Root cluster
 | |
| 		sharedCluster root_;
 | |
| 
 | |
| 	public:
 | |
| 		// constructor of empty tree
 | |
| 		ClusterTree() {}
 | |
| 
 | |
| 		// 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<FG>& other, double tol = 1e-9) const;
 | |
| 
 | |
| 	}; // ClusterTree
 | |
| 
 | |
| } // namespace gtsam
 |