#include #include #include #include #include "BayesianNetwork.h" #include "BayesianNode.h" BayesianNetwork::BayesianNetwork (void) { } BayesianNetwork::~BayesianNetwork (void) { for (unsigned int i = 0; i < nodes_.size(); i++) { delete nodes_[i]; } for (unsigned int i = 0; i < dists_.size(); i++) { delete dists_[i]; } } void BayesianNetwork::addNode (string varName, vector parents, int evidence, int distId) { for (unsigned int i = 0; i < dists_.size(); i++) { if (dists_[i]->id == distId) { BayesianNode* node = new BayesianNode (varName, parents, dists_[i], evidence); nodes_.push_back (node); break; } } } void BayesianNetwork::addNode (string varName, vector parents, double* params, int nParams, vector domain) { Distribution* dist = new Distribution (params, nParams, domain); BayesianNode* node = new BayesianNode (varName, parents, dist); dists_.push_back (dist); nodes_.push_back (node); } BayesianNode* BayesianNetwork::getNode (string varName) const { for (unsigned int i = 0; i < nodes_.size(); i++) { if (nodes_[i]->getVariableName() == varName) { return nodes_[i]; } } return 0; } void BayesianNetwork::addDistribution (int distId, double* params, int nParams, vector domain) { dists_.push_back (new Distribution (distId, params, nParams, domain)); } vector BayesianNetwork::getNodes (void) const { return nodes_; } vector BayesianNetwork::getRootNodes (void) const { vector roots; for (unsigned int i = 0; i < nodes_.size(); i++) { if (nodes_[i]->isRoot()) { roots.push_back (nodes_[i]); } } return roots; } vector BayesianNetwork::getLeafNodes (void) const { vector leafs; for (unsigned int i = 0; i < nodes_.size(); i++) { if (nodes_[i]->isLeaf()) { leafs.push_back (nodes_[i]); } } return leafs; } bool BayesianNetwork::isPolyTree (void) const { return !containsCycle(); } void BayesianNetwork::printNetwork (void) const { for (unsigned int i = 0; i < nodes_.size(); i++) { cout << *nodes_[i]; } } bool BayesianNetwork::containsCycle (void) const { vector visited (nodes_.size()); for (unsigned int v = 0; v < nodes_.size(); v++) { visited[v] = false; } for (unsigned int v = 0; v < nodes_.size(); v++) { if (!visited[v]) { if (containsCycle (v, -1, visited)) { return true; } } } return false; } bool BayesianNetwork::containsCycle (int v, int predecessor, vector& visited) const { visited[v] = true; vector adjs = getAdjacentVertexes (v); for (unsigned int i = 0; i < adjs.size(); i++) { int w = adjs[i]; if (!visited[w]) { if (containsCycle (w, v, visited)) { return true; } } else if (visited[w] && w != predecessor) { return true; } } return false; // no cycle detected in this component } int BayesianNetwork::getIndexOf (const BayesianNode* node) const { for (unsigned int i = 0; i < nodes_.size(); i++) { if (node == nodes_[i]) { return i; } } return -1; } vector BayesianNetwork::getAdjacentVertexes (int v) const { vector adjs; vector parents = nodes_[v]->getParents(); vector childs = nodes_[v]->getChilds(); for (unsigned int i = 0; i < parents.size(); i++) { adjs.push_back (getIndexOf (parents[i])); } for (unsigned int i = 0; i < childs.size(); i++) { adjs.push_back (getIndexOf (childs[i])); } return adjs; }