| 
									
										
										
										
											2010-10-14 12:54:38 +08:00
										 |  |  | /* ----------------------------------------------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  * GTSAM Copyright 2010, Georgia Tech Research Corporation,  | 
					
						
							|  |  |  |  * Atlanta, Georgia 30332-0415 | 
					
						
							|  |  |  |  * All Rights Reserved | 
					
						
							|  |  |  |  * Authors: Frank Dellaert, et al. (see THANKS for the full author list) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  * See LICENSE for the license information | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  * -------------------------------------------------------------------------- */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-31 20:56:47 +08:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * SubgraphPreconditioner.h | 
					
						
							|  |  |  |  * Created on: Dec 31, 2009 | 
					
						
							|  |  |  |  * @author: Frank Dellaert | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-13 03:19:21 +08:00
										 |  |  | #pragma once
 | 
					
						
							| 
									
										
										
										
											2009-12-31 20:56:47 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-20 01:23:19 +08:00
										 |  |  | #include <gtsam/linear/GaussianFactorGraph.h>
 | 
					
						
							|  |  |  | #include <gtsam/linear/GaussianBayesNet.h>
 | 
					
						
							| 
									
										
										
										
											2010-10-14 06:41:26 +08:00
										 |  |  | #include <gtsam/nonlinear/Ordering.h>
 | 
					
						
							| 
									
										
										
										
											2009-12-31 20:56:47 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | namespace gtsam { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/**
 | 
					
						
							|  |  |  | 	 * Subgraph conditioner class, as explained in the RSS 2010 submission. | 
					
						
							|  |  |  | 	 * Starting with a graph A*x=b, we split it in two systems A1*x=b1 and A2*x=b2 | 
					
						
							|  |  |  | 	 * We solve R1*x=c1, and make the substitution y=R1*x-c1. | 
					
						
							|  |  |  | 	 * To use the class, give the Bayes Net R1*x=c1 and Graph A2*x=b2. | 
					
						
							|  |  |  | 	 * Then solve for yhat using CG, and solve for xhat = system.x(yhat). | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	class SubgraphPreconditioner { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-19 18:46:12 +08:00
										 |  |  | 	public: | 
					
						
							|  |  |  | 		typedef boost::shared_ptr<const GaussianBayesNet> sharedBayesNet; | 
					
						
							|  |  |  | 		typedef boost::shared_ptr<const GaussianFactorGraph> sharedFG; | 
					
						
							| 
									
										
										
										
											2010-10-09 11:09:58 +08:00
										 |  |  | 		typedef boost::shared_ptr<const VectorValues> sharedValues; | 
					
						
							| 
									
										
										
										
											2010-01-19 18:46:12 +08:00
										 |  |  | 		typedef boost::shared_ptr<const Errors> sharedErrors; | 
					
						
							| 
									
										
										
										
											2009-12-31 20:56:47 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-19 18:46:12 +08:00
										 |  |  | 	private: | 
					
						
							| 
									
										
										
										
											2010-01-23 08:57:54 +08:00
										 |  |  | 		sharedFG Ab1_, Ab2_; | 
					
						
							| 
									
										
										
										
											2010-01-19 18:46:12 +08:00
										 |  |  | 		sharedBayesNet Rc1_; | 
					
						
							| 
									
										
										
										
											2010-10-09 11:09:58 +08:00
										 |  |  | 		sharedValues xbar_; | 
					
						
							| 
									
										
										
										
											2010-01-19 18:46:12 +08:00
										 |  |  | 		sharedErrors b2bar_; /** b2 - A2*xbar */ | 
					
						
							| 
									
										
										
										
											2009-12-31 20:56:47 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	public: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		/**
 | 
					
						
							|  |  |  | 		 * Constructor | 
					
						
							| 
									
										
										
										
											2010-09-21 04:49:15 +08:00
										 |  |  | 		 * @param Ab1: the Graph A1*x=b1 | 
					
						
							| 
									
										
										
										
											2009-12-31 20:56:47 +08:00
										 |  |  | 		 * @param Ab2: the Graph A2*x=b2 | 
					
						
							| 
									
										
										
										
											2010-09-21 04:49:15 +08:00
										 |  |  | 		 * @param Rc1: the Bayes Net R1*x=c1 | 
					
						
							| 
									
										
										
										
											2009-12-31 20:56:47 +08:00
										 |  |  | 		 * @param xbar: the solution to R1*x=c1 | 
					
						
							|  |  |  | 		 */ | 
					
						
							| 
									
										
										
										
											2010-10-09 11:09:58 +08:00
										 |  |  | 		SubgraphPreconditioner(sharedFG& Ab1, sharedFG& Ab2, sharedBayesNet& Rc1,	sharedValues& xbar); | 
					
						
							| 
									
										
										
										
											2010-01-23 08:57:54 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-31 20:56:47 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-19 03:29:16 +08:00
										 |  |  | 	    /**
 | 
					
						
							|  |  |  | 	     * Add zero-mean i.i.d. Gaussian prior terms to each variable | 
					
						
							|  |  |  | 	     * @param sigma Standard deviation of Gaussian | 
					
						
							|  |  |  | 	     */ | 
					
						
							| 
									
										
										
										
											2010-10-23 02:02:55 +08:00
										 |  |  | //	    SubgraphPreconditioner add_priors(double sigma) const;
 | 
					
						
							| 
									
										
										
										
											2010-10-19 03:29:16 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-31 20:56:47 +08:00
										 |  |  | 		/* x = xbar + inv(R1)*y */ | 
					
						
							| 
									
										
										
										
											2010-10-09 11:09:58 +08:00
										 |  |  | 		VectorValues x(const VectorValues& y) const; | 
					
						
							| 
									
										
										
										
											2009-12-31 20:56:47 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-09 11:09:58 +08:00
										 |  |  | 		/* A zero VectorValues with the structure of xbar */ | 
					
						
							| 
									
										
										
										
											2010-10-14 06:41:26 +08:00
										 |  |  | 		VectorValues zero() const { | 
					
						
							|  |  |  | 			VectorValues V(*xbar_) ; | 
					
						
							|  |  |  | 			V.makeZero(); | 
					
						
							|  |  |  | 			return V ; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2010-02-17 11:29:12 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-31 20:56:47 +08:00
										 |  |  | 		/* error, given y */ | 
					
						
							| 
									
										
										
										
											2010-10-09 11:09:58 +08:00
										 |  |  | 		double error(const VectorValues& y) const; | 
					
						
							| 
									
										
										
										
											2009-12-31 20:56:47 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-18 13:51:19 +08:00
										 |  |  | 		/** gradient = y + inv(R1')*A2'*(A2*inv(R1)*y-b2bar) */ | 
					
						
							| 
									
										
										
										
											2010-10-09 11:09:58 +08:00
										 |  |  | 		VectorValues gradient(const VectorValues& y) const; | 
					
						
							| 
									
										
										
										
											2009-12-31 20:56:47 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		/** Apply operator A */ | 
					
						
							| 
									
										
										
										
											2010-10-09 11:09:58 +08:00
										 |  |  | 		Errors operator*(const VectorValues& y) const; | 
					
						
							| 
									
										
										
										
											2009-12-31 20:56:47 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-31 01:31:05 +08:00
										 |  |  | 		/** Apply operator A in place: needs e allocated already */ | 
					
						
							| 
									
										
										
										
											2010-10-09 11:09:58 +08:00
										 |  |  | 		void multiplyInPlace(const VectorValues& y, Errors& e) const; | 
					
						
							| 
									
										
										
										
											2010-01-31 01:31:05 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			/** Apply operator A' */ | 
					
						
							| 
									
										
										
										
											2010-10-09 11:09:58 +08:00
										 |  |  | 		VectorValues operator^(const Errors& e) const; | 
					
						
							| 
									
										
										
										
											2010-01-11 16:32:59 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-17 11:29:12 +08:00
										 |  |  | 		/**
 | 
					
						
							|  |  |  | 		 * Add A'*e to y | 
					
						
							|  |  |  | 		 *  y += alpha*A'*[e1;e2] = [alpha*e1; alpha*inv(R1')*A2'*e2] | 
					
						
							|  |  |  | 		 */ | 
					
						
							| 
									
										
										
										
											2010-10-09 11:09:58 +08:00
										 |  |  | 		void transposeMultiplyAdd(double alpha, const Errors& e, VectorValues& y) const; | 
					
						
							| 
									
										
										
										
											2010-01-31 07:59:29 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-17 11:29:12 +08:00
										 |  |  | 		/**
 | 
					
						
							|  |  |  | 		 * Add constraint part of the error only, used in both calls above | 
					
						
							|  |  |  | 		 * y += alpha*inv(R1')*A2'*e2 | 
					
						
							|  |  |  | 		 * Takes a range indicating e2 !!!! | 
					
						
							|  |  |  | 		 */ | 
					
						
							|  |  |  | 		void transposeMultiplyAdd2(double alpha, Errors::const_iterator begin, | 
					
						
							| 
									
										
										
										
											2010-10-09 11:09:58 +08:00
										 |  |  | 				Errors::const_iterator end, VectorValues& y) const; | 
					
						
							| 
									
										
										
										
											2010-02-17 11:29:12 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			/** print the object */ | 
					
						
							| 
									
										
										
										
											2010-01-11 16:32:59 +08:00
										 |  |  | 		void print(const std::string& s = "SubgraphPreconditioner") const; | 
					
						
							| 
									
										
										
										
											2009-12-31 20:56:47 +08:00
										 |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-13 03:19:21 +08:00
										 |  |  | } // namespace gtsam
 |