/** * @file BayesNet * @brief Bayes network * @author Frank Dellaert */ // \callgraph #pragma once #include #include #include #include #include "Testable.h" #include "Key.h" namespace gtsam { class Ordering; /** * Bayes network * This is the base class for SymbolicBayesNet, DiscreteBayesNet, and GaussianBayesNet * corresponding to what is used for the "Conditional" template argument: * a SymbolicConditional, ConditionalProbabilityTable, or a GaussianConditional */ template class BayesNet: public Testable > { public: /** We store shared pointers to Conditional densities */ typedef typename boost::shared_ptr sharedConditional; typedef typename std::list Conditionals; typedef typename Conditionals::const_iterator const_iterator; typedef typename Conditionals::const_reverse_iterator const_reverse_iterator; protected: /** * Conditional densities are stored in reverse topological sort order (i.e., leaves first, * parents last), which corresponds to the elimination ordering if so obtained, * and is consistent with the column (block) ordering of an upper triangular matrix. */ Conditionals conditionals_; public: /** print */ void print(const std::string& s = "") const; /** check equality */ bool equals(const BayesNet& other, double tol = 1e-9) const; /** push_back: use reverse topological sort (i.e. parents last / elimination order) */ inline void push_back(const sharedConditional& conditional) { conditionals_.push_back(conditional); } /** push_front: use topological sort (i.e. parents first / reverse elimination order) */ inline void push_front(const sharedConditional& conditional) { conditionals_.push_front(conditional); } // push_back an entire Bayes net */ void push_back(const BayesNet bn); // push_front an entire Bayes net */ void push_front(const BayesNet bn); /** * pop_front: remove node at the bottom, used in marginalization * For example P(ABC)=P(A|BC)P(B|C)P(C) becomes P(BC)=P(B|C)P(C) */ inline void pop_front() {conditionals_.pop_front();} /** size is the number of nodes */ inline size_t size() const { return conditionals_.size(); } /** return keys in reverse topological sort order, i.e., elimination order */ Ordering ordering() const; /** SLOW O(n) random access to Conditional by key */ sharedConditional operator[](const Symbol& key) const; /** return last node in ordering */ inline sharedConditional back() { return conditionals_.back(); } /** return iterators. FD: breaks encapsulation? */ inline const_iterator const begin() const {return conditionals_.begin();} inline const_iterator const end() const {return conditionals_.end();} inline const_reverse_iterator const rbegin() const {return conditionals_.rbegin();} inline const_reverse_iterator const rend() const {return conditionals_.rend();} /** saves the bayes to a text file in GraphViz format */ void saveGraph(const std::string& s) const; private: /** Serialization function */ friend class boost::serialization::access; template void serialize(Archive & ar, const unsigned int version) { ar & BOOST_SERIALIZATION_NVP(conditionals_); } }; // BayesNet } /// namespace gtsam