121 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C++
		
	
	
			
		
		
	
	
			121 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C++
		
	
	
| /* ----------------------------------------------------------------------------
 | |
| 
 | |
|  * 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
 | |
| 
 | |
|  * -------------------------------------------------------------------------- */
 | |
| 
 | |
| /**
 | |
|  * @file    GaussianBayesNet.h
 | |
|  * @brief   Chordal Bayes Net, the result of eliminating a factor graph
 | |
|  * @brief   GaussianBayesNet
 | |
|  * @author  Frank Dellaert
 | |
|  */
 | |
| 
 | |
| // \callgraph
 | |
| 
 | |
| #pragma once
 | |
| 
 | |
| #include <gtsam/base/types.h>
 | |
| #include <gtsam/linear/GaussianConditional.h>
 | |
| #include <gtsam/inference/BayesNet.h>
 | |
| 
 | |
| namespace gtsam {
 | |
| 
 | |
| 	/** A Bayes net made from linear-Gaussian densities */
 | |
| 	typedef BayesNet<GaussianConditional> GaussianBayesNet;
 | |
| 
 | |
| 	/** Create a scalar Gaussian */
 | |
| 	GaussianBayesNet scalarGaussian(Index key, double mu=0.0, double sigma=1.0);
 | |
| 
 | |
| 	/** Create a simple Gaussian on a single multivariate variable */
 | |
| 	GaussianBayesNet simpleGaussian(Index key, const Vector& mu, double sigma=1.0);
 | |
| 
 | |
| 	/**
 | |
| 	 * Add a conditional node with one parent
 | |
| 	 * |Rx+Sy-d|
 | |
| 	 */
 | |
| 	void push_front(GaussianBayesNet& bn, Index key, Vector d, Matrix R,
 | |
| 			Index name1, Matrix S, Vector sigmas);
 | |
| 
 | |
| 	/**
 | |
| 	 * Add a conditional node with two parents
 | |
| 	 * |Rx+Sy+Tz-d|
 | |
| 	 */
 | |
| 	void push_front(GaussianBayesNet& bn, Index key, Vector d, Matrix R,
 | |
| 			Index name1, Matrix S, Index name2, Matrix T, Vector sigmas);
 | |
| 
 | |
| 	/**
 | |
| 	 * Allocate a VectorValues for the variables in a BayesNet
 | |
| 	 */
 | |
| 	boost::shared_ptr<VectorValues> allocateVectorValues(const GaussianBayesNet& bn);
 | |
| 
 | |
| 	/**
 | |
| 	 * Solve the GaussianBayesNet, i.e. return \f$ x = R^{-1}*d \f$, computed by
 | |
| 	 * back-substitution.
 | |
| 	 */
 | |
| 	VectorValues optimize(const GaussianBayesNet& bn);
 | |
| 
 | |
|   /**
 | |
|    * Solve the GaussianBayesNet, i.e. return \f$ x = R^{-1}*d \f$, computed by
 | |
|    * back-substitution, writes the solution \f$ x \f$ into a pre-allocated
 | |
|    * VectorValues.  You can use allocateVectorValues(const GaussianBayesNet&)
 | |
|    * allocate it.  See also optimize(const GaussianBayesNet&), which does not
 | |
|    * require pre-allocation.
 | |
|    */
 | |
|   void optimizeInPlace(const GaussianBayesNet& bn, VectorValues& x);
 | |
| 
 | |
| 	/**
 | |
| 	 * Transpose Backsubstitute
 | |
| 	 * gy=inv(L)*gx by solving L*gy=gx.
 | |
| 	 * gy=inv(R'*inv(Sigma))*gx
 | |
| 	 * gz'*R'=gx', gy = gz.*sigmas
 | |
| 	 */
 | |
| 	VectorValues backSubstituteTranspose(const GaussianBayesNet& bn, const VectorValues& gx);
 | |
| 
 | |
| 	/**
 | |
| 	 * Return (dense) upper-triangular matrix representation
 | |
| 	 * NOTE: if this is the result of elimination with LDL, the matrix will
 | |
| 	 * not necessarily be upper triangular due to column permutations
 | |
| 	 */
 | |
| 	std::pair<Matrix, Vector> matrix(const GaussianBayesNet&);
 | |
| 
 | |
|   /**
 | |
|    * Computes the determinant of a GassianBayesNet
 | |
|    * A GaussianBayesNet is an upper triangular matrix and for an upper triangular matrix
 | |
|    * determinant is the product of the diagonal elements. Instead of actually multiplying
 | |
|    * we add the logarithms of the diagonal elements and take the exponent at the end
 | |
|    * because this is more numerically stable.
 | |
|    * @param bayesNet The input GaussianBayesNet
 | |
|    * @return The determinant
 | |
|    */
 | |
|   double determinant(const GaussianBayesNet& bayesNet);
 | |
| 
 | |
|   /**
 | |
|    * Compute the gradient of the energy function,
 | |
|    * \f$ \nabla_{x=x_0} \left\Vert \Sigma^{-1} R x - d \right\Vert^2 \f$,
 | |
|    * centered around \f$ x = x_0 \f$.
 | |
|    * The gradient is \f$ R^T(Rx-d) \f$.
 | |
|    * @param bayesNet The Gaussian Bayes net $(R,d)$
 | |
|    * @param x0 The center about which to compute the gradient
 | |
|    * @return The gradient as a VectorValues
 | |
|    */
 | |
|   VectorValues gradient(const GaussianBayesNet& bayesNet, const VectorValues& x0);
 | |
| 
 | |
|   /**
 | |
|    * Compute the gradient of the energy function,
 | |
|    * \f$ \nabla_{x=0} \left\Vert \Sigma^{-1} R x - d \right\Vert^2 \f$,
 | |
|    * centered around zero.
 | |
|    * The gradient about zero is \f$ -R^T d \f$.  See also gradient(const GaussianBayesNet&, const VectorValues&).
 | |
|    * @param bayesNet The Gaussian Bayes net $(R,d)$
 | |
|    * @param [output] g A VectorValues to store the gradient, which must be preallocated, see allocateVectorValues
 | |
|    * @return The gradient as a VectorValues
 | |
|    */
 | |
|   void gradientAtZero(const GaussianBayesNet& bayesNet, VectorValues& g);
 | |
| 
 | |
| } /// namespace gtsam
 |