/** * @file BayesNet-inl.h * @brief Bayes chain template definitions * @author Frank Dellaert */ #include #include #include #include // for += using namespace boost::assign; #include "Ordering.h" #include "BayesNet.h" #include "FactorGraph-inl.h" using namespace std; namespace gtsam { /* ************************************************************************* */ template void BayesNet::print(const string& s) const { cout << s << ":\n"; std::string key; BOOST_FOREACH(sharedConditional conditional,conditionals_) conditional->print("Node[" + conditional->key() + "]"); } /* ************************************************************************* */ template bool BayesNet::equals(const BayesNet& cbn, double tol) const { if(size() != cbn.size()) return false; return equal(conditionals_.begin(),conditionals_.end(),cbn.conditionals_.begin(),equals_star(tol)); } /* ************************************************************************* */ template void BayesNet::push_back(const BayesNet bn) { BOOST_FOREACH(sharedConditional conditional,bn.conditionals_) push_back(conditional); } /* ************************************************************************* */ template void BayesNet::push_front(const BayesNet bn) { BOOST_FOREACH(sharedConditional conditional,bn.conditionals_) push_front(conditional); } /* ************************************************************************* */ template Ordering BayesNet::ordering() const { Ordering ord; BOOST_FOREACH(sharedConditional conditional,conditionals_) ord.push_back(conditional->key()); return ord; } /* ************************************************************************* */ template typename BayesNet::sharedConditional BayesNet::operator[](const std::string& key) const { const_iterator it = find_if(conditionals_.begin(),conditionals_.end(),onKey(key)); if (it == conditionals_.end()) throw(invalid_argument( "BayesNet::operator['"+key+"']: not found")); return *it; } /* ************************************************************************* */ template BayesNet marginals(const BayesNet& bn, const Ordering& keys) { // Convert to factor graph FactorGraph factorGraph(bn); // Get the keys of all variables and remove all keys we want the marginal for Ordering ord = bn.ordering(); BOOST_FOREACH(string key, keys) ord.remove(key); // TODO: O(n*k), faster possible? // add marginal keys at end BOOST_FOREACH(string key, keys) ord.push_back(key); // eliminate to get joint BayesNet joint = _eliminate(factorGraph,ord); // remove all integrands, P(K) = \int_I P(I|K) P(K) size_t nrIntegrands = ord.size()-keys.size(); for(int i=0;i