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
00067 int num_nodes() {return _nodes.size();}
00068
00073 Eigen::MatrixXd marginal(int id);
00074
00079 Eigen::MatrixXd joint(int ida, int idb);
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;
00102 Eigen::MatrixXd conditional;
00103 Eigen::MatrixXd joint;
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
00143 std::map<int, ChowLiuTreeNode> tree;
00144
00145 ChowLiuTree (const Eigen::MatrixXd &L, const std::vector<Node *>& nodes);
00146
00147 };
00148
00149
00150 }