| 
									
										
										
										
											2009-12-28 07:15:36 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @file    ISAM-inl.h | 
					
						
							|  |  |  |  * @brief   Incremental update functionality (iSAM) for BayesTree. | 
					
						
							|  |  |  |  * @author  Michael Kaess | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <boost/foreach.hpp>
 | 
					
						
							|  |  |  | #include <boost/assign/std/list.hpp> // for operator +=
 | 
					
						
							|  |  |  | using namespace boost::assign; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-20 01:23:19 +08:00
										 |  |  | #include <gtsam/inference/Conditional.h>
 | 
					
						
							|  |  |  | #include <gtsam/inference/ISAM.h>
 | 
					
						
							|  |  |  | #include <gtsam/inference/BayesTree-inl.h>
 | 
					
						
							| 
									
										
										
										
											2009-12-28 07:15:36 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | namespace gtsam { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	using namespace std; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** Create an empty Bayes Tree */ | 
					
						
							|  |  |  | 	template<class Conditional> | 
					
						
							|  |  |  | 	ISAM<Conditional>::ISAM() : BayesTree<Conditional>() {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** Create a Bayes Tree from a Bayes Net */ | 
					
						
							|  |  |  | 	template<class Conditional> | 
					
						
							| 
									
										
										
										
											2010-01-20 12:23:35 +08:00
										 |  |  | 	ISAM<Conditional>::ISAM(const BayesNet<Conditional>& bayesNet) : | 
					
						
							|  |  |  | 	  BayesTree<Conditional>(bayesNet) {} | 
					
						
							| 
									
										
										
										
											2009-12-28 07:15:36 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/* ************************************************************************* */ | 
					
						
							|  |  |  | 	template<class Conditional> | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | 	template<class FactorGraph> | 
					
						
							|  |  |  | 	void ISAM<Conditional>::update_internal(const FactorGraph& newFactors, Cliques& orphans) { | 
					
						
							| 
									
										
										
										
											2009-12-28 07:15:36 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		// Remove the contaminated part of the Bayes tree
 | 
					
						
							| 
									
										
										
										
											2010-01-21 08:38:22 +08:00
										 |  |  | 		BayesNet<Conditional> bn; | 
					
						
							|  |  |  | 		removeTop(newFactors.keys(), bn, orphans); | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | 		FactorGraph factors(bn); | 
					
						
							| 
									
										
										
										
											2009-12-28 07:15:36 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		// add the factors themselves
 | 
					
						
							|  |  |  | 		factors.push_back(newFactors); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// eliminate into a Bayes net
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | 		typename BayesNet<Conditional>::shared_ptr bayesNet = Inference::Eliminate(factors); | 
					
						
							| 
									
										
										
										
											2009-12-28 07:15:36 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		// insert conditionals back in, straight into the topless bayesTree
 | 
					
						
							|  |  |  | 		typename BayesNet<Conditional>::const_reverse_iterator rit; | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | 		for ( rit=bayesNet->rbegin(); rit != bayesNet->rend(); ++rit ) | 
					
						
							|  |  |  | 			this->insert(*rit); | 
					
						
							| 
									
										
										
										
											2009-12-28 07:15:36 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		// add orphans to the bottom of the new tree
 | 
					
						
							|  |  |  | 		BOOST_FOREACH(sharedClique orphan, orphans) { | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | 		  this->insert(orphan); | 
					
						
							| 
									
										
										
										
											2009-12-28 07:15:36 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	template<class Conditional> | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | 	template<class FactorGraph> | 
					
						
							|  |  |  | 	void ISAM<Conditional>::update(const FactorGraph& newFactors) { | 
					
						
							| 
									
										
										
										
											2009-12-28 07:15:36 +08:00
										 |  |  | 		Cliques orphans; | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | 		this->update_internal(newFactors, orphans); | 
					
						
							| 
									
										
										
										
											2009-12-28 07:15:36 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | /// namespace gtsam
 |