/** * @file BayesNet-inl.h * @brief Bayes net template definitions * @author Frank Dellaert */ #pragma once #include #include #include #include #include #include #include #include // for += using namespace boost::assign; #include //#include "FactorGraph-inl.h" #include "Conditional.h" using namespace std; namespace gtsam { /* ************************************************************************* */ template void BayesNet::print(const string& s) const { cout << s << ":\n"; BOOST_REVERSE_FOREACH(sharedConditional conditional,conditionals_) conditional->print((boost::format("Node[%1%]") % conditional->key()).str()); } /* ************************************************************************* */ 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::permuteWithInverse(const Permutation& inversePermutation) { BOOST_FOREACH(sharedConditional conditional, conditionals_) { conditional->permuteWithInverse(inversePermutation); } } /* ************************************************************************* */ template bool BayesNet::permuteSeparatorWithInverse(const Permutation& inversePermutation) { bool separatorChanged = false; BOOST_FOREACH(sharedConditional conditional, conditionals_) { if(conditional->permuteSeparatorWithInverse(inversePermutation)) separatorChanged = true; } return separatorChanged; } /* ************************************************************************* */ 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 list BayesNet::ordering() const { list ord; BOOST_FOREACH(sharedConditional conditional,conditionals_) ord.push_back(conditional->key()); return ord; } /* ************************************************************************* */ template void BayesNet::saveGraph(const std::string &s) const { ofstream of(s.c_str()); of<< "digraph G{\n"; BOOST_FOREACH(const_sharedConditional conditional,conditionals_) { Index child = conditional->key(); BOOST_FOREACH(Index parent, conditional->parents()) { of << parent << "->" << child << endl; } } of<<"}"; of.close(); } /* ************************************************************************* */ template typename BayesNet::sharedConditional BayesNet::operator[](Index key) const { const_iterator it = find_if(conditionals_.begin(), conditionals_.end(), boost::lambda::bind(&Conditional::key, *boost::lambda::_1) == key); if (it == conditionals_.end()) throw(invalid_argument((boost::format( "BayesNet::operator['%1%']: not found") % key).str())); return *it; } /* ************************************************************************* */ } // namespace gtsam