69 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C++
		
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C++
		
	
	
/*
 | 
						|
 * BayesNetPreconditioner.h
 | 
						|
 * Created on: Dec 31, 2009
 | 
						|
 * @Author: Frank Dellaert
 | 
						|
 */
 | 
						|
 | 
						|
#ifndef BAYESNETPRECONDITIONER_H_
 | 
						|
#define BAYESNETPRECONDITIONER_H_
 | 
						|
 | 
						|
#include "GaussianFactorGraph.h"
 | 
						|
#include "GaussianBayesNet.h"
 | 
						|
 | 
						|
namespace gtsam {
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Upper-triangular preconditioner R for the system |A*x-b|^2
 | 
						|
	 * The new system will be |A*inv(R)*y-b|^2, i.e., R*x=y
 | 
						|
	 * This class can solve for x=inv(R)*y by back-substituting R*x=y
 | 
						|
	 * and also apply the chain rule gy=inv(R')*gx by solving R'*gy=gx.
 | 
						|
	 * This is not used currently, just to debug operators below
 | 
						|
	 */
 | 
						|
	class BayesNetPreconditioner {
 | 
						|
 | 
						|
		// The original system
 | 
						|
		const GaussianFactorGraph& Ab_;
 | 
						|
 | 
						|
		// The preconditioner
 | 
						|
		const GaussianBayesNet& Rd_;
 | 
						|
 | 
						|
	public:
 | 
						|
 | 
						|
		/** Constructor */
 | 
						|
		BayesNetPreconditioner(const GaussianFactorGraph& Ab,
 | 
						|
				const GaussianBayesNet& Rd);
 | 
						|
 | 
						|
		// R*x = y by solving x=inv(R)*y
 | 
						|
		VectorConfig backSubstitute(const VectorConfig& y) const;
 | 
						|
 | 
						|
		// gy=inv(L)*gx by solving L*gy=gx.
 | 
						|
		VectorConfig backSubstituteTranspose(const VectorConfig& gx) const;
 | 
						|
 | 
						|
		/* x = inv(R)*y */
 | 
						|
		inline VectorConfig x(const VectorConfig& y) const {
 | 
						|
			return backSubstitute(y);
 | 
						|
		}
 | 
						|
 | 
						|
		/* error, given y */
 | 
						|
		double error(const VectorConfig& y) const;
 | 
						|
 | 
						|
		/** gradient */
 | 
						|
		VectorConfig gradient(const VectorConfig& y) const;
 | 
						|
 | 
						|
		/** Apply operator A */
 | 
						|
		Errors operator*(const VectorConfig& y) const;
 | 
						|
 | 
						|
		/** In-place version that overwrites e */
 | 
						|
		void multiplyInPlace(const VectorConfig& y, Errors& e) const;
 | 
						|
 | 
						|
		/** Apply operator A' */
 | 
						|
		VectorConfig operator^(const Errors& e) const;
 | 
						|
 | 
						|
		/** BLAS level 2 equivalent y += alpha*inv(R')*A'*e */
 | 
						|
		void transposeMultiplyAdd(double alpha, const Errors& e, VectorConfig& y) const;
 | 
						|
	};
 | 
						|
 | 
						|
} // namespace gtsam
 | 
						|
 | 
						|
#endif /* BAYESNETPRECONDITIONER_H_ */
 |