| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @file    NonlinearFactorGraph.h | 
					
						
							|  |  |  |  * @brief   Factor Graph Constsiting of non-linear factors | 
					
						
							|  |  |  |  * @author  Frank Dellaert | 
					
						
							|  |  |  |  * @author  Carlos Nieto | 
					
						
							|  |  |  |  * @author  Christian Potthast | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // \callgraph
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #pragma once
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-08 08:40:17 +08:00
										 |  |  | #include <math.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-20 01:23:19 +08:00
										 |  |  | #include <gtsam/nonlinear/NonlinearFactor.h>
 | 
					
						
							|  |  |  | #include <gtsam/linear/GaussianFactorGraph.h>
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | #include <gtsam/inference/SymbolicFactorGraph.h>
 | 
					
						
							|  |  |  | #include <gtsam/nonlinear/Ordering.h>
 | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | namespace gtsam { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/**
 | 
					
						
							| 
									
										
										
										
											2010-10-09 11:09:58 +08:00
										 |  |  | 	 * A non-linear factor graph is templated on a values structure, but the factor type | 
					
						
							|  |  |  | 	 * is fixed as a NonlinearFactor. The values structures are typically (in SAM) more general | 
					
						
							| 
									
										
										
										
											2009-10-07 02:25:04 +08:00
										 |  |  | 	 * than just vectors, e.g., Rot3 or Pose3, which are objects in non-linear manifolds. | 
					
						
							|  |  |  | 	 * Linearizing the non-linear factor graph creates a linear factor graph on the  | 
					
						
							|  |  |  | 	 * tangent vector space at the linearization point. Because the tangent space is a true | 
					
						
							| 
									
										
										
										
											2010-10-09 11:09:58 +08:00
										 |  |  | 	 * vector space, the config type will be an VectorValues in that linearized factor graph. | 
					
						
							| 
									
										
										
										
											2009-10-29 12:11:23 +08:00
										 |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2010-10-09 11:09:58 +08:00
										 |  |  | 	template<class Values> | 
					
						
							|  |  |  | 	class NonlinearFactorGraph: public FactorGraph<NonlinearFactor<Values> > { | 
					
						
							| 
									
										
										
										
											2009-10-07 02:25:04 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	public: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-09 11:09:58 +08:00
										 |  |  | 	  typedef FactorGraph<NonlinearFactor<Values> > Base; | 
					
						
							|  |  |  | 		typedef typename boost::shared_ptr<NonlinearFactor<Values> > sharedFactor; | 
					
						
							| 
									
										
										
										
											2010-03-12 05:40:56 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  |     /** print just calls base class */ | 
					
						
							|  |  |  |     void print(const std::string& str = "NonlinearFactorGraph: ") const; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-29 12:11:23 +08:00
										 |  |  | 		/** unnormalized error */ | 
					
						
							| 
									
										
										
										
											2010-10-09 11:09:58 +08:00
										 |  |  | 		double error(const Values& c) const; | 
					
						
							| 
									
										
										
										
											2009-10-29 12:11:23 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-18 14:55:24 +08:00
										 |  |  | 		/** all individual errors */ | 
					
						
							| 
									
										
										
										
											2010-10-09 11:09:58 +08:00
										 |  |  | 		Vector unwhitenedError(const Values& c) const; | 
					
						
							| 
									
										
										
										
											2009-12-18 14:55:24 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-29 12:11:23 +08:00
										 |  |  | 		/** Unnormalized probability. O(n) */ | 
					
						
							| 
									
										
										
										
											2010-10-09 11:09:58 +08:00
										 |  |  | 		double probPrime(const Values& c) const { | 
					
						
							| 
									
										
										
										
											2009-10-29 12:11:23 +08:00
										 |  |  | 			return exp(-0.5 * error(c)); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-16 09:16:59 +08:00
										 |  |  | 		template<class F> | 
					
						
							|  |  |  | 		void add(const F& factor) { | 
					
						
							|  |  |  | 			push_back(boost::shared_ptr<F>(new F(factor))); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | 		/**
 | 
					
						
							|  |  |  | 		 * Create a symbolic factor graph using an existing ordering | 
					
						
							|  |  |  | 		 */ | 
					
						
							| 
									
										
										
										
											2010-10-09 11:09:58 +08:00
										 |  |  | 		SymbolicFactorGraph::shared_ptr symbolic(const Values& config, const Ordering& ordering) const; | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		/**
 | 
					
						
							|  |  |  | 		 * Create a symbolic factor graph and initial variable ordering that can | 
					
						
							|  |  |  | 		 * be used for graph operations like determining a fill-reducing ordering. | 
					
						
							|  |  |  | 		 * The graph and ordering should be permuted after such a fill-reducing | 
					
						
							|  |  |  | 		 * ordering is found. | 
					
						
							|  |  |  | 		 */ | 
					
						
							|  |  |  | 		std::pair<SymbolicFactorGraph::shared_ptr, Ordering::shared_ptr> | 
					
						
							| 
									
										
										
										
											2010-10-09 11:09:58 +08:00
										 |  |  | 		symbolic(const Values& config) const; | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							|  |  |  |      * Compute a fill-reducing ordering using COLAMD.  This returns the | 
					
						
							|  |  |  |      * ordering and a VariableIndex, which can later be re-used to save | 
					
						
							|  |  |  |      * computation. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  | 		std::pair<Ordering::shared_ptr, GaussianVariableIndex<>::shared_ptr> | 
					
						
							| 
									
										
										
										
											2010-10-09 11:09:58 +08:00
										 |  |  | 		orderingCOLAMD(const Values& config) const; | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-07 02:25:04 +08:00
										 |  |  | 		/**
 | 
					
						
							|  |  |  | 		 * linearize a nonlinear factor graph | 
					
						
							|  |  |  | 		 */ | 
					
						
							| 
									
										
										
										
											2009-12-18 14:55:24 +08:00
										 |  |  | 		boost::shared_ptr<GaussianFactorGraph> | 
					
						
							| 
									
										
										
										
											2010-10-09 11:09:58 +08:00
										 |  |  | 				linearize(const Values& config, const Ordering& ordering) const; | 
					
						
							| 
									
										
										
										
											2009-12-12 05:34:08 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-07 02:25:04 +08:00
										 |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } // namespace
 |