ChowLiuTree.h
Go to the documentation of this file.
00001 
00029 #pragma once
00030 
00031 #include <string>
00032 #include <vector>
00033 #include <list>
00034 #include <map>
00035 #include <sstream>
00036 #include <Eigen/Dense>
00037 
00038 #include "Node.h"
00039 
00040 
00041 namespace isam {
00042 
00043 
00049 class ChowLiuTreeInfo {
00050 
00051 private:
00052 
00053   const Eigen::MatrixXd& _L;
00054   const std::vector<Node *>& _nodes;
00055 
00056 public:
00057 
00063   ChowLiuTreeInfo (const Eigen::MatrixXd& L, const std::vector<Node *>& nodes)
00064       : _L(L), _nodes(nodes) { }
00065 
00066   //const std::vector<Node *>& nodes() {return _nodes;}
00067   int num_nodes() {return _nodes.size();}
00068 
00073   Eigen::MatrixXd marginal(int id);
00074 
00079   Eigen::MatrixXd joint(int ida, int idb); // a, b
00080 
00085   Eigen::MatrixXd conditional(int ida, int idb);
00086 
00087 };
00088 
00094 class ChowLiuTreeNode {
00095 
00096 public:
00097   
00098   int id;
00099   int pid;
00100   std::vector<int> cids;
00101   Eigen::MatrixXd marginal;     // marginal information
00102   Eigen::MatrixXd conditional;  // conditional information with parrent
00103   Eigen::MatrixXd joint;        // joint information with parrent
00104   
00105   bool is_root () { return (pid == -1) ? true : false; }
00106   bool is_leaf () { return (cids.size() == 0) ? true : false; }
00107 
00108 };
00109 
00110 class MI {
00111   
00112 public:
00113   int id1;
00114   int id2;
00115   double mi;
00116 
00117   MI (int id1_, int id2_, double mi_)
00118     : id1(id1_), id2(id2_), mi(mi_){
00119   }
00120 
00121 };
00122 
00123 
00124 
00130 class ChowLiuTree {
00131 
00132   ChowLiuTreeInfo _clt_info;
00133   std::list<MI> _edges;
00134 
00135   void _calc_edges();
00136   double _calc_mi(int ida, int idb);
00137   void _max_span_tree();
00138   void _build_tree_rec(int id, int pid);
00139 
00140 public:
00141 
00142   // the resulting chow-liu tree
00143   std::map<int, ChowLiuTreeNode> tree;
00144 
00145   ChowLiuTree (const Eigen::MatrixXd &L, const std::vector<Node *>& nodes);
00146   
00147 };
00148 
00149 
00150 } // namespace isam


demo_lidar
Author(s): Ji Zhang
autogenerated on Sun Mar 1 2015 11:30:50