| 
									
										
										
										
											2009-10-28 04:23:19 +08:00
										 |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2009-11-01 03:53:20 +08:00
										 |  |  |  * @file    BayesNet | 
					
						
							|  |  |  |  * @brief   Bayes network | 
					
						
							| 
									
										
										
										
											2009-10-28 04:23:19 +08:00
										 |  |  |  * @author  Frank Dellaert | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // \callgraph
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #pragma once
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-03 14:29:56 +08:00
										 |  |  | #include <list>
 | 
					
						
							| 
									
										
										
										
											2009-10-28 10:57:38 +08:00
										 |  |  | #include <boost/shared_ptr.hpp>
 | 
					
						
							| 
									
										
										
										
											2009-11-03 14:29:56 +08:00
										 |  |  | #include <boost/serialization/list.hpp>
 | 
					
						
							| 
									
										
										
										
											2009-11-02 11:50:30 +08:00
										 |  |  | #include <boost/serialization/shared_ptr.hpp>
 | 
					
						
							| 
									
										
										
										
											2009-10-28 04:23:19 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-28 10:57:38 +08:00
										 |  |  | #include "Testable.h"
 | 
					
						
							| 
									
										
										
										
											2010-01-18 03:34:57 +08:00
										 |  |  | #include "Key.h"
 | 
					
						
							| 
									
										
										
										
											2009-10-28 10:57:38 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-28 04:23:19 +08:00
										 |  |  | namespace gtsam { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-02 11:50:30 +08:00
										 |  |  | 	class Ordering; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-28 04:23:19 +08:00
										 |  |  | 	/**
 | 
					
						
							| 
									
										
										
										
											2009-11-01 03:53:20 +08:00
										 |  |  | 	 * Bayes network | 
					
						
							|  |  |  | 	 * This is the base class for SymbolicBayesNet, DiscreteBayesNet, and GaussianBayesNet | 
					
						
							|  |  |  | 	 * corresponding to what is used for the "Conditional" template argument: | 
					
						
							| 
									
										
										
										
											2009-11-13 00:41:18 +08:00
										 |  |  | 	 * a SymbolicConditional, ConditionalProbabilityTable, or a GaussianConditional | 
					
						
							| 
									
										
										
										
											2009-10-28 04:23:19 +08:00
										 |  |  | 	 */ | 
					
						
							|  |  |  | 	template<class Conditional> | 
					
						
							| 
									
										
										
										
											2009-11-01 03:53:20 +08:00
										 |  |  | 	class BayesNet: public Testable<BayesNet<Conditional> > { | 
					
						
							| 
									
										
										
										
											2009-10-28 10:57:38 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-02 11:50:30 +08:00
										 |  |  | 	public: | 
					
						
							| 
									
										
										
										
											2009-10-28 10:57:38 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-02 11:50:30 +08:00
										 |  |  | 		/** We store shared pointers to Conditional densities */ | 
					
						
							| 
									
										
										
										
											2009-11-08 03:31:39 +08:00
										 |  |  | 		typedef typename boost::shared_ptr<Conditional> sharedConditional; | 
					
						
							|  |  |  | 		typedef typename std::list<sharedConditional> Conditionals; | 
					
						
							| 
									
										
										
										
											2009-11-03 14:29:56 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-02 11:50:30 +08:00
										 |  |  | 		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_; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-28 04:23:19 +08:00
										 |  |  | 	public: | 
					
						
							| 
									
										
										
										
											2009-10-28 10:57:38 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		/** print */ | 
					
						
							|  |  |  | 		void print(const std::string& s = "") const; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		/** check equality */ | 
					
						
							| 
									
										
										
										
											2009-11-01 03:53:20 +08:00
										 |  |  | 		bool equals(const BayesNet& other, double tol = 1e-9) const; | 
					
						
							| 
									
										
										
										
											2009-10-30 11:48:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-02 13:17:44 +08:00
										 |  |  | 		/** push_back: use reverse topological sort (i.e. parents last / elimination order) */ | 
					
						
							| 
									
										
										
										
											2009-11-08 03:31:39 +08:00
										 |  |  | 		inline void push_back(const sharedConditional& conditional) { | 
					
						
							| 
									
										
										
										
											2009-11-03 14:29:56 +08:00
										 |  |  | 			conditionals_.push_back(conditional); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		/** push_front: use topological sort (i.e. parents first / reverse elimination order) */ | 
					
						
							| 
									
										
										
										
											2009-11-08 03:31:39 +08:00
										 |  |  | 		inline void push_front(const sharedConditional& conditional) { | 
					
						
							| 
									
										
										
										
											2009-11-03 14:29:56 +08:00
										 |  |  | 			conditionals_.push_front(conditional); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2009-10-30 12:54:11 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-09 06:50:26 +08:00
										 |  |  | 		// push_back an entire Bayes net */
 | 
					
						
							|  |  |  | 		void push_back(const BayesNet<Conditional> bn); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// push_front an entire Bayes net */
 | 
					
						
							|  |  |  | 		void push_front(const BayesNet<Conditional> bn); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-08 10:49:18 +08:00
										 |  |  | 		/**
 | 
					
						
							|  |  |  | 		 * 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();} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-01 00:57:36 +08:00
										 |  |  | 		/** size is the number of nodes */ | 
					
						
							| 
									
										
										
										
											2009-11-02 11:50:30 +08:00
										 |  |  | 		inline size_t size() const { | 
					
						
							|  |  |  | 			return conditionals_.size(); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2009-11-01 00:57:36 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-02 11:50:30 +08:00
										 |  |  | 		/** return keys in reverse topological sort order, i.e., elimination order */ | 
					
						
							|  |  |  | 		Ordering ordering() const; | 
					
						
							| 
									
										
										
										
											2009-11-01 00:57:36 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-03 14:29:56 +08:00
										 |  |  | 		/** SLOW O(n) random access to Conditional by key */ | 
					
						
							| 
									
										
										
										
											2010-01-18 03:34:57 +08:00
										 |  |  | 		sharedConditional operator[](const Symbol& key) const; | 
					
						
							| 
									
										
										
										
											2009-10-30 12:54:11 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-09 06:50:26 +08:00
										 |  |  | 		/** return last node in ordering */ | 
					
						
							| 
									
										
										
										
											2009-11-08 03:31:39 +08:00
										 |  |  | 		inline sharedConditional back() { return conditionals_.back(); } | 
					
						
							| 
									
										
										
										
											2009-11-05 14:29:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-02 11:50:30 +08:00
										 |  |  | 		/** return iterators. FD: breaks encapsulation? */ | 
					
						
							| 
									
										
										
										
											2009-11-05 14:29:32 +08:00
										 |  |  | 		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();} | 
					
						
							| 
									
										
										
										
											2009-10-30 12:54:11 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-10 06:59:18 +08:00
										 |  |  | 		/** saves the bayes to a text file in GraphViz format */ | 
					
						
							|  |  |  | 		void saveGraph(const std::string& s) const; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-30 12:54:11 +08:00
										 |  |  | 	private: | 
					
						
							|  |  |  | 		/** Serialization function */ | 
					
						
							|  |  |  | 		friend class boost::serialization::access; | 
					
						
							|  |  |  | 		template<class Archive> | 
					
						
							| 
									
										
										
										
											2009-11-02 11:50:30 +08:00
										 |  |  | 		void serialize(Archive & ar, const unsigned int version) { | 
					
						
							|  |  |  | 			ar & BOOST_SERIALIZATION_NVP(conditionals_); | 
					
						
							| 
									
										
										
										
											2009-10-30 12:54:11 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2009-11-09 06:50:26 +08:00
										 |  |  | 	}; // BayesNet
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-28 04:23:19 +08:00
										 |  |  | } /// namespace gtsam
 |