| 
									
										
										
										
											2009-10-30 11:48:32 +08:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * SymbolicFactor.h | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *  Created on: Oct 29, 2009 | 
					
						
							|  |  |  |  *      Author: Frank Dellaert | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef SYMBOLICFACTOR_H_
 | 
					
						
							|  |  |  | #define SYMBOLICFACTOR_H_
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <list>
 | 
					
						
							|  |  |  | #include <string>
 | 
					
						
							|  |  |  | #include <vector>
 | 
					
						
							|  |  |  | #include <boost/shared_ptr.hpp>
 | 
					
						
							|  |  |  | #include "Testable.h"
 | 
					
						
							| 
									
										
										
										
											2009-11-13 09:56:09 +08:00
										 |  |  | #include "Ordering.h"
 | 
					
						
							| 
									
										
										
										
											2010-01-18 03:34:57 +08:00
										 |  |  | #include "Key.h"
 | 
					
						
							| 
									
										
										
										
											2009-10-30 11:48:32 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | namespace gtsam { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	class SymbolicConditional; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** Symbolic Factor */ | 
					
						
							|  |  |  | 	class SymbolicFactor: public Testable<SymbolicFactor> { | 
					
						
							|  |  |  | 	private: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-18 03:34:57 +08:00
										 |  |  | 		std::list<Symbol> keys_; | 
					
						
							| 
									
										
										
										
											2009-10-30 11:48:32 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	public: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		typedef boost::shared_ptr<SymbolicFactor> shared_ptr; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-21 12:59:50 +08:00
										 |  |  | 		/** Construct from SymbolicConditional */ | 
					
						
							| 
									
										
										
										
											2009-11-19 01:27:27 +08:00
										 |  |  | 		SymbolicFactor(const boost::shared_ptr<SymbolicConditional>& c); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-21 12:59:50 +08:00
										 |  |  | 		/** Constructor from a list of keys */ | 
					
						
							| 
									
										
										
										
											2009-11-24 03:45:09 +08:00
										 |  |  | 		SymbolicFactor(const Ordering& keys) : | 
					
						
							| 
									
										
										
										
											2009-10-30 11:48:32 +08:00
										 |  |  | 			keys_(keys) { | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-21 12:59:50 +08:00
										 |  |  | 		/** Construct unary factor */ | 
					
						
							| 
									
										
										
										
											2010-01-18 03:34:57 +08:00
										 |  |  | 		SymbolicFactor(const Symbol& key) { | 
					
						
							| 
									
										
										
										
											2009-11-21 12:59:50 +08:00
										 |  |  | 			keys_.push_back(key); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		/** Construct binary factor */ | 
					
						
							| 
									
										
										
										
											2010-01-18 03:34:57 +08:00
										 |  |  | 		SymbolicFactor(const Symbol& key1, const Symbol& key2) { | 
					
						
							| 
									
										
										
										
											2009-11-21 12:59:50 +08:00
										 |  |  | 			keys_.push_back(key1); | 
					
						
							|  |  |  | 			keys_.push_back(key2); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		/** Construct ternary factor */ | 
					
						
							| 
									
										
										
										
											2010-01-18 03:34:57 +08:00
										 |  |  | 		SymbolicFactor(const Symbol& key1, const Symbol& key2, const Symbol& key3) { | 
					
						
							| 
									
										
										
										
											2009-11-21 12:59:50 +08:00
										 |  |  | 			keys_.push_back(key1); | 
					
						
							|  |  |  | 			keys_.push_back(key2); | 
					
						
							|  |  |  | 			keys_.push_back(key3); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-10 05:32:14 +08:00
										 |  |  | 		/** Construct 4-way factor */ | 
					
						
							|  |  |  | 		SymbolicFactor(const Symbol& key1, const Symbol& key2, const Symbol& key3, const Symbol& key4) { | 
					
						
							|  |  |  | 			keys_.push_back(key1); | 
					
						
							|  |  |  | 			keys_.push_back(key2); | 
					
						
							|  |  |  | 			keys_.push_back(key3); | 
					
						
							|  |  |  | 			keys_.push_back(key4); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-30 11:48:32 +08:00
										 |  |  | 		/**
 | 
					
						
							|  |  |  | 		 * Constructor that combines a set of factors | 
					
						
							|  |  |  | 		 * @param factors Set of factors to combine | 
					
						
							|  |  |  | 		 */ | 
					
						
							|  |  |  | 		SymbolicFactor(const std::vector<shared_ptr> & factors); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		/** print */ | 
					
						
							|  |  |  | 		void print(const std::string& s = "SymbolicFactor") const; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		/** check equality */ | 
					
						
							|  |  |  | 		bool equals(const SymbolicFactor& other, double tol = 1e-9) const; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		/**
 | 
					
						
							|  |  |  | 		 * Find all variables | 
					
						
							|  |  |  | 		 * @return The set of all variable keys | 
					
						
							|  |  |  | 		 */ | 
					
						
							| 
									
										
										
										
											2010-01-18 03:34:57 +08:00
										 |  |  | 		std::list<Symbol> keys() const { | 
					
						
							| 
									
										
										
										
											2009-10-30 11:48:32 +08:00
										 |  |  | 			return keys_; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		/**
 | 
					
						
							|  |  |  | 		 * eliminate one of the variables connected to this factor | 
					
						
							|  |  |  | 		 * @param key the key of the node to be eliminated | 
					
						
							|  |  |  | 		 * @return a new factor and a symbolic conditional on the eliminated variable | 
					
						
							|  |  |  | 		 */ | 
					
						
							|  |  |  | 		std::pair<boost::shared_ptr<SymbolicConditional>, shared_ptr> | 
					
						
							| 
									
										
										
										
											2010-01-18 03:34:57 +08:00
										 |  |  | 		eliminate(const Symbol& key) const; | 
					
						
							| 
									
										
										
										
											2009-10-30 11:48:32 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		/**
 | 
					
						
							|  |  |  | 		 * Check if empty factor | 
					
						
							|  |  |  | 		 */ | 
					
						
							|  |  |  | 		inline bool empty() const { | 
					
						
							|  |  |  | 			return keys_.empty(); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif /* SYMBOLICFACTOR_H_ */
 |