/** * @file BayesChain * @brief Bayes Chain, the result of eliminating a factor graph * @author Frank Dellaert */ // \callgraph #pragma once #include #include #include #include "Testable.h" namespace gtsam { /** * Bayes Chain, the result of eliminating a factor graph * This is the base class for SymbolicBayesChain, DiscreteBayesChain, and GaussianBayesChain * Corresponding to what is used for the "Conditional" template argument: * a ConditionalProbabilityTable, a ConditionalGaussian, or a SymbolicConditional. */ template class BayesChain: public Testable > { protected: /** nodes keys stored in topological sort order, i.e. from parents to children */ std::list keys_; /** nodes stored on key */ typedef typename std::map > Nodes; Nodes nodes_; public: /** print */ void print(const std::string& s = "") const; /** check equality */ bool equals(const BayesChain& other, double tol = 1e-9) const; /** size is the number of nodes */ inline size_t size() const {return nodes_.size();} /** insert: use reverse topological sort (i.e. parents last) */ void insert(const std::string& key, boost::shared_ptr node); /** delete */ void erase(const std::string& key); inline boost::shared_ptr operator[](const std::string& key) const { const_iterator cg = nodes_.find(key); // get node assert( cg != nodes_.end() ); return cg->second; } /** return begin and end of the nodes. FD: breaks encapsulation? */ typedef typename Nodes::const_iterator const_iterator; const_iterator const begin() const {return nodes_.begin();} const_iterator const end() const {return nodes_.end();} private: /** Serialization function */ friend class boost::serialization::access; template void serialize(Archive & ar, const unsigned int version) { ar & BOOST_SERIALIZATION_NVP(keys_); ar & BOOST_SERIALIZATION_NVP(nodes_); } }; } /// namespace gtsam