/** * @file BayesTree * @brief Bayes Tree is a tree of cliques of a Bayes Chain * @author Frank Dellaert */ // \callgraph #pragma once #include #include #include #include #include #include "Testable.h" #include "BayesNet.h" namespace gtsam { /** * Bayes tree * Templated on the Conditional class, the type of node in the underlying Bayes chain. * This could be a ConditionalProbabilityTable, a ConditionalGaussian, or a SymbolicConditional */ template class BayesTree: public Testable > { public: typedef boost::shared_ptr conditional_ptr; private: /** A Node in the tree is an incomplete Bayes net: the variables * in the Bayes net are the frontal nodes, and the variables conditioned * on is the separator. We also have pointers up and down the tree. */ struct Node : public BayesNet { typedef boost::shared_ptr shared_ptr; shared_ptr parent_; std::list separator_; /** separator keys */ std::list children_; //* Constructor */ Node(const boost::shared_ptr& conditional); /** The size *includes* the separator */ size_t size() const { return this->conditionals_.size() + separator_.size(); } /** print this node */ void print(const std::string& s="Bayes tree node") const; /** print this node and entire subtree below it*/ void printTree(const std::string& indent) const; }; /** Map from keys to Node */ typedef boost::shared_ptr node_ptr; typedef std::map Nodes; Nodes nodes_; /** Roor clique */ node_ptr root_; /** add a clique */ node_ptr addClique(const conditional_ptr& conditional, node_ptr parent_clique=node_ptr()); public: /** Create an empty Bayes Tree */ BayesTree(); /** Create a Bayes Tree from a Bayes Net */ BayesTree(const BayesNet& bayesNet); /** Destructor */ virtual ~BayesTree() {} /** print */ void print(const std::string& s = "") const; /** check equality */ bool equals(const BayesTree& other, double tol = 1e-9) const; /** insert a new conditional */ void insert(const boost::shared_ptr& conditional); /** number of cliques */ inline size_t size() const { return nodes_.size();} /** return root clique */ boost::shared_ptr > root() const {return root_;} /** return marginal on any variable */ template boost::shared_ptr marginal(const std::string& key) const; }; // BayesTree } /// namespace gtsam