118 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C++
		
	
	
			
		
		
	
	
			118 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C++
		
	
	
/* ----------------------------------------------------------------------------
 | 
						|
 | 
						|
 * GTSAM Copyright 2010, Georgia Tech Research Corporation, 
 | 
						|
 * Atlanta, Georgia 30332-0415
 | 
						|
 * All Rights Reserved
 | 
						|
 * Authors: Frank Dellaert, et al. (see THANKS for the full author list)
 | 
						|
 | 
						|
 * See LICENSE for the license information
 | 
						|
 | 
						|
 * -------------------------------------------------------------------------- */
 | 
						|
 | 
						|
/*
 | 
						|
 * 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 <gtsam/base/types.h>
 | 
						|
#include <gtsam/base/Testable.h>
 | 
						|
 | 
						|
#include <boost/shared_ptr.hpp>
 | 
						|
#include <boost/weak_ptr.hpp>
 | 
						|
 | 
						|
#include <list>
 | 
						|
#include <vector>
 | 
						|
#include <iostream>
 | 
						|
 | 
						|
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
 | 
						|
		class Cluster : public FG {
 | 
						|
		public:
 | 
						|
			typedef typename boost::shared_ptr<Cluster> shared_ptr;
 | 
						|
			typedef typename boost::weak_ptr<Cluster> weak_ptr;
 | 
						|
 | 
						|
      const std::vector<Index> frontal;                   // the frontal variables
 | 
						|
      const std::vector<Index> separator;                // the separator variables
 | 
						|
 | 
						|
		protected:
 | 
						|
 | 
						|
			weak_ptr parent_;                      // the parent cluster
 | 
						|
			std::list<shared_ptr> children_;     // the child clusters
 | 
						|
			const typename FG::sharedFactor eliminated_; // the eliminated factor to pass on to the parent
 | 
						|
 | 
						|
		public:
 | 
						|
 | 
						|
			// Construct empty clique
 | 
						|
			Cluster() {}
 | 
						|
 | 
						|
			/* Create a node with a single frontal variable */
 | 
						|
			template<typename Iterator>
 | 
						|
			Cluster(const FG& fg, Index key, Iterator firstSeparator, Iterator lastSeparator);
 | 
						|
 | 
						|
      /* Create a node with several frontal variables */
 | 
						|
      template<typename FRONTALIT, typename SEPARATORIT>
 | 
						|
      Cluster(const FG& fg, FRONTALIT firstFrontal, FRONTALIT lastFrontal, SEPARATORIT firstSeparator, SEPARATORIT lastSeparator);
 | 
						|
 | 
						|
      /* Create a node with several frontal variables */
 | 
						|
      template<typename FRONTALIT, typename SEPARATORIT>
 | 
						|
      Cluster(FRONTALIT firstFrontal, FRONTALIT lastFrontal, SEPARATORIT firstSeparator, SEPARATORIT lastSeparator);
 | 
						|
 | 
						|
			// 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;
 | 
						|
 | 
						|
			// get or set the parent
 | 
						|
			weak_ptr& parent() { return parent_; }
 | 
						|
 | 
						|
			// get a reference to the children
 | 
						|
			const std::list<shared_ptr>& children() const { return children_; }
 | 
						|
 | 
						|
			// add a child
 | 
						|
			void addChild(shared_ptr child);
 | 
						|
		};
 | 
						|
 | 
						|
		// 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_) root_->printTree("");
 | 
						|
		}
 | 
						|
 | 
						|
		/** check equality */
 | 
						|
		bool equals(const ClusterTree<FG>& other, double tol = 1e-9) const;
 | 
						|
 | 
						|
	}; // ClusterTree
 | 
						|
 | 
						|
} // namespace gtsam
 |