| 
									
										
										
										
											2009-10-30 11:48:32 +08:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * SymbolicFactor.cpp | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *  Created on: Oct 29, 2009 | 
					
						
							|  |  |  |  *      Author: Frank Dellaert | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <map>
 | 
					
						
							|  |  |  | #include <iostream>
 | 
					
						
							|  |  |  | #include <boost/foreach.hpp>
 | 
					
						
							|  |  |  | #include <boost/tuple/tuple.hpp>
 | 
					
						
							|  |  |  | #include "SymbolicConditional.h"
 | 
					
						
							|  |  |  | #include "SymbolicFactor.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | using namespace std; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // trick from some reading group
 | 
					
						
							|  |  |  | #define FOREACH_PAIR( KEY, VAL, COL) BOOST_FOREACH (boost::tie(KEY,VAL),COL)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace gtsam { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-19 01:27:27 +08:00
										 |  |  | 	/* ************************************************************************* */ | 
					
						
							|  |  |  | 	SymbolicFactor::SymbolicFactor(const boost::shared_ptr<SymbolicConditional>& c) { | 
					
						
							|  |  |  | 		// initialize keys_ with parents
 | 
					
						
							|  |  |  | 		keys_ = c->parents(); | 
					
						
							|  |  |  | 		// add key on which conditional is defined
 | 
					
						
							|  |  |  | 		keys_.push_back(c->key()); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-30 11:48:32 +08:00
										 |  |  | 	/* ************************************************************************* */ | 
					
						
							|  |  |  | 	SymbolicFactor::SymbolicFactor(const vector<shared_ptr> & factors) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// store keys in a map to make them unique (set is not portable)
 | 
					
						
							| 
									
										
										
										
											2010-01-18 03:34:57 +08:00
										 |  |  | 		map<Symbol, Symbol> map; | 
					
						
							| 
									
										
										
										
											2009-10-30 11:48:32 +08:00
										 |  |  | 		BOOST_FOREACH(shared_ptr factor, factors) | 
					
						
							| 
									
										
										
										
											2010-01-18 03:34:57 +08:00
										 |  |  | 			BOOST_FOREACH(const Symbol& key, factor->keys()) | 
					
						
							| 
									
										
										
										
											2009-10-30 11:48:32 +08:00
										 |  |  | 				map.insert(make_pair(key,key)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// create the unique keys
 | 
					
						
							| 
									
										
										
										
											2010-01-18 03:34:57 +08:00
										 |  |  | 		Symbol key,val; | 
					
						
							| 
									
										
										
										
											2009-10-30 11:48:32 +08:00
										 |  |  | 		FOREACH_PAIR(key, val, map) | 
					
						
							|  |  |  | 			keys_.push_back(key); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* ************************************************************************* */ | 
					
						
							|  |  |  | 	void SymbolicFactor::print(const string& s) const { | 
					
						
							|  |  |  | 		cout << s << " "; | 
					
						
							| 
									
										
										
										
											2010-01-18 03:34:57 +08:00
										 |  |  | 		BOOST_FOREACH(const Symbol& key, keys_) cout << " " << (string)key; | 
					
						
							| 
									
										
										
										
											2009-10-30 11:48:32 +08:00
										 |  |  | 		cout << endl; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* ************************************************************************* */ | 
					
						
							|  |  |  | 	bool SymbolicFactor::equals(const SymbolicFactor& other, double tol) const { | 
					
						
							|  |  |  | 		return keys_ == other.keys_; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* ************************************************************************* */ | 
					
						
							|  |  |  | 	pair<SymbolicConditional::shared_ptr, SymbolicFactor::shared_ptr> | 
					
						
							| 
									
										
										
										
											2010-01-18 03:34:57 +08:00
										 |  |  | 	SymbolicFactor::eliminate(const Symbol& key) const | 
					
						
							| 
									
										
										
										
											2009-10-30 11:48:32 +08:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 		// get keys from input factor
 | 
					
						
							| 
									
										
										
										
											2010-01-18 03:34:57 +08:00
										 |  |  | 		list<Symbol> separator; | 
					
						
							|  |  |  | 		BOOST_FOREACH(const Symbol& j,keys_) | 
					
						
							| 
									
										
										
										
											2009-10-30 11:48:32 +08:00
										 |  |  | 			if (j!=key) separator.push_back(j); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// start empty remaining factor to be returned
 | 
					
						
							|  |  |  | 	  boost::shared_ptr<SymbolicFactor> lf(new SymbolicFactor(separator)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	  // create SymbolicConditional on separator
 | 
					
						
							| 
									
										
										
										
											2009-11-02 11:50:30 +08:00
										 |  |  | 	  SymbolicConditional::shared_ptr cg (new SymbolicConditional(key,separator)); | 
					
						
							| 
									
										
										
										
											2009-10-30 11:48:32 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	  return make_pair(cg,lf); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* ************************************************************************* */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |