| 
									
										
										
										
											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-08-22 06:23:24 +08:00
										 |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2009-11-13 00:16:32 +08:00
										 |  |  |  *  @file   testGaussianFactorGraph.cpp | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  |  *  @brief  Unit tests for Linear Factor Graph | 
					
						
							|  |  |  |  *  @author Christian Potthast | 
					
						
							|  |  |  |  **/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-31 23:24:22 +08:00
										 |  |  | #include <string.h>
 | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | #include <iostream>
 | 
					
						
							|  |  |  | using namespace std; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-06 13:43:03 +08:00
										 |  |  | #include <boost/foreach.hpp>
 | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | #include <boost/tuple/tuple.hpp>
 | 
					
						
							| 
									
										
										
										
											2009-10-31 23:24:22 +08:00
										 |  |  | #include <boost/assign/std/list.hpp> // for operator +=
 | 
					
						
							| 
									
										
										
										
											2010-05-24 16:57:22 +08:00
										 |  |  | #include <boost/assign/std/set.hpp> // for operator +=
 | 
					
						
							| 
									
										
										
										
											2009-12-27 06:48:41 +08:00
										 |  |  | #include <boost/assign/std/vector.hpp> // for operator +=
 | 
					
						
							| 
									
										
										
										
											2009-10-31 23:24:22 +08:00
										 |  |  | using namespace boost::assign; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-26 04:10:33 +08:00
										 |  |  | #include <CppUnitLite/TestHarness.h>
 | 
					
						
							| 
									
										
										
										
											2009-11-02 11:50:30 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-18 21:18:26 +08:00
										 |  |  | // Magically casts strings like "x3" to a Symbol('x',3) key, see Key.h
 | 
					
						
							| 
									
										
										
										
											2010-01-18 03:34:57 +08:00
										 |  |  | #define GTSAM_MAGIC_KEY
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-20 01:23:19 +08:00
										 |  |  | #include <gtsam/base/Matrix.h>
 | 
					
						
							|  |  |  | #include <gtsam/slam/smallExample.h>
 | 
					
						
							|  |  |  | #include <gtsam/linear/GaussianBayesNet.h>
 | 
					
						
							|  |  |  | #include <gtsam/base/numericalDerivative.h>
 | 
					
						
							|  |  |  | #include <gtsam/inference/SymbolicFactorGraph.h>
 | 
					
						
							| 
									
										
										
										
											2010-10-22 06:59:54 +08:00
										 |  |  | #include <gtsam/linear/GaussianSequentialSolver.h>
 | 
					
						
							| 
									
										
										
										
											2010-07-08 05:41:50 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | using namespace gtsam; | 
					
						
							| 
									
										
										
										
											2010-01-19 13:33:44 +08:00
										 |  |  | using namespace example; | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-27 12:39:35 +08:00
										 |  |  | double tol=1e-5; | 
					
						
							| 
									
										
										
										
											2009-10-25 07:14:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2011-05-20 21:52:08 +08:00
										 |  |  | TEST( GaussianFactorGraph, equals ) { | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  |   Ordering ordering; ordering += "x1","x2","l1"; | 
					
						
							|  |  |  |   GaussianFactorGraph fg = createGaussianFactorGraph(ordering); | 
					
						
							|  |  |  |   GaussianFactorGraph fg2 = createGaussianFactorGraph(ordering); | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  |   EXPECT(fg.equals(fg2)); | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2011-05-20 21:52:08 +08:00
										 |  |  | TEST( GaussianFactorGraph, error ) { | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  |   Ordering ordering; ordering += "x1","x2","l1"; | 
					
						
							| 
									
										
										
										
											2011-01-21 06:22:00 +08:00
										 |  |  |   FactorGraph<JacobianFactor> fg = createGaussianFactorGraph(ordering); | 
					
						
							| 
									
										
										
										
											2010-10-09 11:09:58 +08:00
										 |  |  |   VectorValues cfg = createZeroDelta(ordering); | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // note the error is the same as in testNonlinearFactorGraph as a
 | 
					
						
							|  |  |  |   // zero delta config in the linear graph is equivalent to noisy in
 | 
					
						
							|  |  |  |   // non-linear, which is really linear under the hood
 | 
					
						
							| 
									
										
										
										
											2011-01-21 06:22:00 +08:00
										 |  |  |   double actual = gaussianError(fg, cfg); | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  |   DOUBLES_EQUAL( 5.625, actual, 1e-9 ); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2009-11-10 12:36:07 +08:00
										 |  |  | /* unit test for find seperator                                              */ | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | // SL-NEEDED? TEST( GaussianFactorGraph, find_separator )
 | 
					
						
							|  |  |  | //{
 | 
					
						
							|  |  |  | //  GaussianFactorGraph fg = createGaussianFactorGraph();
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //  set<Symbol> separator = fg.find_separator("x2");
 | 
					
						
							|  |  |  | //  set<Symbol> expected;
 | 
					
						
							|  |  |  | //  expected.insert("x1");
 | 
					
						
							|  |  |  | //  expected.insert("l1");
 | 
					
						
							|  |  |  | //
 | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  | //  EXPECT(separator.size()==expected.size());
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | //  set<Symbol>::iterator it1 = separator.begin(), it2 = expected.begin();
 | 
					
						
							|  |  |  | //  for(; it1!=separator.end(); it1++, it2++)
 | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  | //    EXPECT(*it1 == *it2);
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | //}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ///* ************************************************************************* */
 | 
					
						
							|  |  |  | // SL-FIX TEST( GaussianFactorGraph, combine_factors_x1 )
 | 
					
						
							|  |  |  | //{
 | 
					
						
							|  |  |  | //  // create a small example for a linear factor graph
 | 
					
						
							|  |  |  | //  GaussianFactorGraph fg = createGaussianFactorGraph();
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //  // combine all factors
 | 
					
						
							|  |  |  | //  GaussianFactor::shared_ptr actual = removeAndCombineFactors(fg,"x1");
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //  // the expected linear factor
 | 
					
						
							|  |  |  | //  Matrix Al1 = Matrix_(6,2,
 | 
					
						
							|  |  |  | //			 0., 0.,
 | 
					
						
							|  |  |  | //			 0., 0.,
 | 
					
						
							|  |  |  | //			 0., 0.,
 | 
					
						
							|  |  |  | //			 0., 0.,
 | 
					
						
							|  |  |  | //			 5., 0.,
 | 
					
						
							|  |  |  | //			 0., 5.
 | 
					
						
							|  |  |  | //			 );
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //  Matrix Ax1 = Matrix_(6,2,
 | 
					
						
							|  |  |  | //			 10., 0.,
 | 
					
						
							|  |  |  | //			 0., 10.,
 | 
					
						
							|  |  |  | //			-10., 0.,
 | 
					
						
							|  |  |  | //			 0.,-10.,
 | 
					
						
							|  |  |  | //			-5., 0.,
 | 
					
						
							|  |  |  | //			 0.,-5.
 | 
					
						
							|  |  |  | //			 );
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //  Matrix Ax2 = Matrix_(6,2,
 | 
					
						
							|  |  |  | //			 0., 0.,
 | 
					
						
							|  |  |  | //			 0., 0.,
 | 
					
						
							|  |  |  | //			 10., 0.,
 | 
					
						
							|  |  |  | //			 0., 10.,
 | 
					
						
							|  |  |  | //			 0., 0.,
 | 
					
						
							|  |  |  | //			 0., 0.
 | 
					
						
							|  |  |  | //			 );
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //  // the expected RHS vector
 | 
					
						
							|  |  |  | //  Vector b(6);
 | 
					
						
							|  |  |  | //  b(0) = -1;
 | 
					
						
							|  |  |  | //  b(1) = -1;
 | 
					
						
							|  |  |  | //  b(2) =  2;
 | 
					
						
							|  |  |  | //  b(3) = -1;
 | 
					
						
							|  |  |  | //  b(4) =  0;
 | 
					
						
							|  |  |  | //  b(5) =  1;
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //  vector<pair<Symbol, Matrix> > meas;
 | 
					
						
							|  |  |  | //  meas.push_back(make_pair("l1", Al1));
 | 
					
						
							|  |  |  | //  meas.push_back(make_pair("x1", Ax1));
 | 
					
						
							|  |  |  | //  meas.push_back(make_pair("x2", Ax2));
 | 
					
						
							|  |  |  | //  GaussianFactor expected(meas, b, ones(6));
 | 
					
						
							|  |  |  | //  //GaussianFactor expected("l1", Al1, "x1", Ax1, "x2", Ax2, b);
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //  // check if the two factors are the same
 | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  | //  EXPECT(assert_equal(expected,*actual));
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | //}
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | ///* ************************************************************************* */
 | 
					
						
							|  |  |  | // SL-FIX TEST( GaussianFactorGraph, combine_factors_x2 )
 | 
					
						
							|  |  |  | //{
 | 
					
						
							|  |  |  | // // create a small example for a linear factor graph
 | 
					
						
							|  |  |  | //  GaussianFactorGraph fg = createGaussianFactorGraph();
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //  // combine all factors
 | 
					
						
							|  |  |  | //  GaussianFactor::shared_ptr actual = removeAndCombineFactors(fg,"x2");
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //  // the expected linear factor
 | 
					
						
							|  |  |  | //  Matrix Al1 = Matrix_(4,2,
 | 
					
						
							|  |  |  | //			 // l1
 | 
					
						
							|  |  |  | //			 0., 0.,
 | 
					
						
							|  |  |  | //			 0., 0.,
 | 
					
						
							|  |  |  | //			 5., 0.,
 | 
					
						
							|  |  |  | //			 0., 5.
 | 
					
						
							|  |  |  | //			 );
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //  Matrix Ax1 = Matrix_(4,2,
 | 
					
						
							|  |  |  | //                         // x1
 | 
					
						
							|  |  |  | //			-10., 0., // f2
 | 
					
						
							|  |  |  | //			 0.,-10., // f2
 | 
					
						
							|  |  |  | //			 0., 0., // f4
 | 
					
						
							|  |  |  | //			 0., 0.  // f4
 | 
					
						
							|  |  |  | //			 );
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //  Matrix Ax2 = Matrix_(4,2,
 | 
					
						
							|  |  |  | //			 // x2
 | 
					
						
							|  |  |  | //			 10., 0.,
 | 
					
						
							|  |  |  | //			 0., 10.,
 | 
					
						
							|  |  |  | //			-5., 0.,
 | 
					
						
							|  |  |  | //			 0.,-5.
 | 
					
						
							|  |  |  | //			 );
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //  // the expected RHS vector
 | 
					
						
							|  |  |  | //  Vector b(4);
 | 
					
						
							|  |  |  | //  b(0) =  2;
 | 
					
						
							|  |  |  | //  b(1) = -1;
 | 
					
						
							|  |  |  | //  b(2) = -1;
 | 
					
						
							|  |  |  | //  b(3) =  1.5;
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //  vector<pair<Symbol, Matrix> > meas;
 | 
					
						
							|  |  |  | //  meas.push_back(make_pair("l1", Al1));
 | 
					
						
							|  |  |  | //  meas.push_back(make_pair("x1", Ax1));
 | 
					
						
							|  |  |  | //  meas.push_back(make_pair("x2", Ax2));
 | 
					
						
							|  |  |  | //  GaussianFactor expected(meas, b, ones(4));
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //  // check if the two factors are the same
 | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  | //  EXPECT(assert_equal(expected,*actual));
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | //}
 | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-22 06:59:54 +08:00
										 |  |  | ///* ************************************************************************* */
 | 
					
						
							|  |  |  | //TEST( GaussianFactorGraph, eliminateOne_x1 )
 | 
					
						
							|  |  |  | //{
 | 
					
						
							|  |  |  | //  Ordering ordering; ordering += "x1","l1","x2";
 | 
					
						
							|  |  |  | //  GaussianFactorGraph fg = createGaussianFactorGraph(ordering);
 | 
					
						
							|  |  |  | //  GaussianConditional::shared_ptr actual = GaussianSequentialSolver::EliminateUntil(fg, 1);
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //  // create expected Conditional Gaussian
 | 
					
						
							|  |  |  | //  Matrix I = 15*eye(2), R11 = I, S12 = -0.111111*I, S13 = -0.444444*I;
 | 
					
						
							|  |  |  | //  Vector d = Vector_(2, -0.133333, -0.0222222), sigma = ones(2);
 | 
					
						
							|  |  |  | //  GaussianConditional expected(ordering["x1"],15*d,R11,ordering["l1"],S12,ordering["x2"],S13,sigma);
 | 
					
						
							|  |  |  | //
 | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  | //  EXPECT(assert_equal(expected,*actual,tol));
 | 
					
						
							| 
									
										
										
										
											2010-10-22 06:59:54 +08:00
										 |  |  | //}
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | ///* ************************************************************************* */
 | 
					
						
							|  |  |  | //TEST( GaussianFactorGraph, eliminateOne_x2 )
 | 
					
						
							|  |  |  | //{
 | 
					
						
							|  |  |  | //   Ordering ordering; ordering += "x2","l1","x1";
 | 
					
						
							|  |  |  | //  GaussianFactorGraph fg = createGaussianFactorGraph(ordering);
 | 
					
						
							|  |  |  | //  GaussianConditional::shared_ptr actual = GaussianSequentialSolver::EliminateUntil(fg, 1);
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //  // create expected Conditional Gaussian
 | 
					
						
							|  |  |  | //  double sig = 0.0894427;
 | 
					
						
							|  |  |  | //  Matrix I = eye(2)/sig, R11 = I, S12 = -0.2*I, S13 = -0.8*I;
 | 
					
						
							|  |  |  | //  Vector d = Vector_(2, 0.2, -0.14)/sig, sigma = ones(2);
 | 
					
						
							|  |  |  | //  GaussianConditional expected(ordering["x2"],d,R11,ordering["l1"],S12,ordering["x1"],S13,sigma);
 | 
					
						
							|  |  |  | //
 | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  | //  EXPECT(assert_equal(expected,*actual,tol));
 | 
					
						
							| 
									
										
										
										
											2010-10-22 06:59:54 +08:00
										 |  |  | //}
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | ///* ************************************************************************* */
 | 
					
						
							|  |  |  | //TEST( GaussianFactorGraph, eliminateOne_l1 )
 | 
					
						
							|  |  |  | //{
 | 
					
						
							|  |  |  | //  Ordering ordering; ordering += "l1","x1","x2";
 | 
					
						
							|  |  |  | //  GaussianFactorGraph fg = createGaussianFactorGraph(ordering);
 | 
					
						
							|  |  |  | //  GaussianConditional::shared_ptr actual = GaussianSequentialSolver::EliminateUntil(fg, 1);
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //  // create expected Conditional Gaussian
 | 
					
						
							|  |  |  | //  double sig = sqrt(2)/10.;
 | 
					
						
							|  |  |  | //  Matrix I = eye(2)/sig, R11 = I, S12 = -0.5*I, S13 = -0.5*I;
 | 
					
						
							|  |  |  | //  Vector d = Vector_(2, -0.1, 0.25)/sig, sigma = ones(2);
 | 
					
						
							|  |  |  | //  GaussianConditional expected(ordering["l1"],d,R11,ordering["x1"],S12,ordering["x2"],S13,sigma);
 | 
					
						
							|  |  |  | //
 | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  | //  EXPECT(assert_equal(expected,*actual,tol));
 | 
					
						
							| 
									
										
										
										
											2010-10-22 06:59:54 +08:00
										 |  |  | //}
 | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | ///* ************************************************************************* */
 | 
					
						
							|  |  |  | //TEST( GaussianFactorGraph, eliminateOne_x1_fast )
 | 
					
						
							|  |  |  | //{
 | 
					
						
							|  |  |  | //  GaussianFactorGraph fg = createGaussianFactorGraph();
 | 
					
						
							|  |  |  | //  GaussianConditional::shared_ptr actual = fg.eliminateOne("x1", false);
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //  // create expected Conditional Gaussian
 | 
					
						
							|  |  |  | //  Matrix I = 15*eye(2), R11 = I, S12 = -0.111111*I, S13 = -0.444444*I;
 | 
					
						
							|  |  |  | //  Vector d = Vector_(2, -0.133333, -0.0222222), sigma = ones(2);
 | 
					
						
							|  |  |  | //  GaussianConditional expected("x1",15*d,R11,"l1",S12,"x2",S13,sigma);
 | 
					
						
							|  |  |  | //
 | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  | //  EXPECT(assert_equal(expected,*actual,tol));
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | //}
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | ///* ************************************************************************* */
 | 
					
						
							|  |  |  | //TEST( GaussianFactorGraph, eliminateOne_x2_fast )
 | 
					
						
							|  |  |  | //{
 | 
					
						
							|  |  |  | //  GaussianFactorGraph fg = createGaussianFactorGraph();
 | 
					
						
							|  |  |  | //  GaussianConditional::shared_ptr actual = fg.eliminateOne("x2", false);
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //  // create expected Conditional Gaussian
 | 
					
						
							|  |  |  | //  double sig = 0.0894427;
 | 
					
						
							|  |  |  | //  Matrix I = eye(2)/sig, R11 = I, S12 = -0.2*I, S13 = -0.8*I;
 | 
					
						
							|  |  |  | //  Vector d = Vector_(2, 0.2, -0.14)/sig, sigma = ones(2);
 | 
					
						
							|  |  |  | //  GaussianConditional expected("x2",d,R11,"l1",S12,"x1",S13,sigma);
 | 
					
						
							|  |  |  | //
 | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  | //  EXPECT(assert_equal(expected,*actual,tol));
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | //}
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | ///* ************************************************************************* */
 | 
					
						
							|  |  |  | //TEST( GaussianFactorGraph, eliminateOne_l1_fast )
 | 
					
						
							|  |  |  | //{
 | 
					
						
							|  |  |  | //  GaussianFactorGraph fg = createGaussianFactorGraph();
 | 
					
						
							|  |  |  | //  GaussianConditional::shared_ptr actual = fg.eliminateOne("l1", false);
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //  // create expected Conditional Gaussian
 | 
					
						
							|  |  |  | //  double sig = sqrt(2)/10.;
 | 
					
						
							|  |  |  | //  Matrix I = eye(2)/sig, R11 = I, S12 = -0.5*I, S13 = -0.5*I;
 | 
					
						
							|  |  |  | //  Vector d = Vector_(2, -0.1, 0.25)/sig, sigma = ones(2);
 | 
					
						
							|  |  |  | //  GaussianConditional expected("l1",d,R11,"x1",S12,"x2",S13,sigma);
 | 
					
						
							|  |  |  | //
 | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  | //  EXPECT(assert_equal(expected,*actual,tol));
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | //}
 | 
					
						
							| 
									
										
										
										
											2010-02-01 01:49:33 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2009-11-13 00:16:32 +08:00
										 |  |  | TEST( GaussianFactorGraph, eliminateAll ) | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-01-27 12:39:35 +08:00
										 |  |  | 	// create expected Chordal bayes Net
 | 
					
						
							|  |  |  | 	Matrix I = eye(2); | 
					
						
							| 
									
										
										
										
											2009-11-12 14:09:03 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  |   Ordering ordering; | 
					
						
							|  |  |  |   ordering += "x2","l1","x1"; | 
					
						
							| 
									
										
										
										
											2010-02-01 01:49:33 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	Vector d1 = Vector_(2, -0.1,-0.1); | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | 	GaussianBayesNet expected = simpleGaussian(ordering["x1"],d1,0.1); | 
					
						
							| 
									
										
										
										
											2010-02-01 01:49:33 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	double sig1 = 0.149071; | 
					
						
							|  |  |  | 	Vector d2 = Vector_(2, 0.0, 0.2)/sig1, sigma2 = ones(2); | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | 	push_front(expected,ordering["l1"],d2, I/sig1,ordering["x1"], (-1)*I/sig1,sigma2); | 
					
						
							| 
									
										
										
										
											2010-02-01 01:49:33 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	double sig2 = 0.0894427; | 
					
						
							|  |  |  | 	Vector d3 = Vector_(2, 0.2, -0.14)/sig2, sigma3 = ones(2); | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | 	push_front(expected,ordering["x2"],d3, I/sig2,ordering["l1"], (-0.2)*I/sig2, ordering["x1"], (-0.8)*I/sig2, sigma3); | 
					
						
							| 
									
										
										
										
											2010-02-01 01:49:33 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Check one ordering
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | 	GaussianFactorGraph fg1 = createGaussianFactorGraph(ordering); | 
					
						
							| 
									
										
										
										
											2010-10-22 06:59:54 +08:00
										 |  |  | 	GaussianBayesNet actual = *GaussianSequentialSolver(fg1).eliminate(); | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  | 	EXPECT(assert_equal(expected,actual,tol)); | 
					
						
							| 
									
										
										
										
											2010-10-15 23:53:36 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-06-14 04:01:58 +08:00
										 |  |  |   GaussianBayesNet actualQR = *GaussianSequentialSolver(fg1, true).eliminate(); | 
					
						
							|  |  |  |   EXPECT(assert_equal(expected,actualQR,tol)); | 
					
						
							| 
									
										
										
										
											2010-02-01 01:49:33 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | ///* ************************************************************************* */
 | 
					
						
							|  |  |  | //TEST( GaussianFactorGraph, eliminateAll_fast )
 | 
					
						
							|  |  |  | //{
 | 
					
						
							|  |  |  | //	// create expected Chordal bayes Net
 | 
					
						
							|  |  |  | //	Matrix I = eye(2);
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //	Vector d1 = Vector_(2, -0.1,-0.1);
 | 
					
						
							|  |  |  | //	GaussianBayesNet expected = simpleGaussian("x1",d1,0.1);
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //	double sig1 = 0.149071;
 | 
					
						
							|  |  |  | //	Vector d2 = Vector_(2, 0.0, 0.2)/sig1, sigma2 = ones(2);
 | 
					
						
							|  |  |  | //	push_front(expected,"l1",d2, I/sig1,"x1", (-1)*I/sig1,sigma2);
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //	double sig2 = 0.0894427;
 | 
					
						
							|  |  |  | //	Vector d3 = Vector_(2, 0.2, -0.14)/sig2, sigma3 = ones(2);
 | 
					
						
							|  |  |  | //	push_front(expected,"x2",d3, I/sig2,"l1", (-0.2)*I/sig2, "x1", (-0.8)*I/sig2, sigma3);
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //	// Check one ordering
 | 
					
						
							|  |  |  | //	GaussianFactorGraph fg1 = createGaussianFactorGraph();
 | 
					
						
							|  |  |  | //	Ordering ordering;
 | 
					
						
							|  |  |  | //	ordering += "x2","l1","x1";
 | 
					
						
							|  |  |  | //	GaussianBayesNet actual = fg1.eliminate(ordering, false);
 | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  | //	EXPECT(assert_equal(expected,actual,tol));
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | //}
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-16 07:01:50 +08:00
										 |  |  | ///* ************************************************************************* */
 | 
					
						
							|  |  |  | //TEST( GaussianFactorGraph, add_priors )
 | 
					
						
							|  |  |  | //{
 | 
					
						
							|  |  |  | //  Ordering ordering; ordering += "l1","x1","x2";
 | 
					
						
							|  |  |  | //  GaussianFactorGraph fg = createGaussianFactorGraph(ordering);
 | 
					
						
							|  |  |  | //  GaussianFactorGraph actual = fg.add_priors(3, vector<size_t>(3,2));
 | 
					
						
							|  |  |  | //  GaussianFactorGraph expected = createGaussianFactorGraph(ordering);
 | 
					
						
							|  |  |  | //  Matrix A = eye(2);
 | 
					
						
							|  |  |  | //  Vector b = zero(2);
 | 
					
						
							|  |  |  | //  SharedDiagonal sigma = sharedSigma(2,3.0);
 | 
					
						
							| 
									
										
										
										
											2011-01-21 06:22:00 +08:00
										 |  |  | //  expected.push_back(GaussianFactor::shared_ptr(new JacobianFactor(ordering["l1"],A,b,sigma)));
 | 
					
						
							|  |  |  | //  expected.push_back(GaussianFactor::shared_ptr(new JacobianFactor(ordering["x1"],A,b,sigma)));
 | 
					
						
							|  |  |  | //  expected.push_back(GaussianFactor::shared_ptr(new JacobianFactor(ordering["x2"],A,b,sigma)));
 | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  | //  EXPECT(assert_equal(expected,actual));
 | 
					
						
							| 
									
										
										
										
											2010-11-16 07:01:50 +08:00
										 |  |  | //}
 | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2009-11-13 00:16:32 +08:00
										 |  |  | TEST( GaussianFactorGraph, copying ) | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | { | 
					
						
							|  |  |  |   // Create a graph
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  |   Ordering ordering; ordering += "x2","l1","x1"; | 
					
						
							|  |  |  |   GaussianFactorGraph actual = createGaussianFactorGraph(ordering); | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // Copy the graph !
 | 
					
						
							| 
									
										
										
										
											2009-11-13 00:16:32 +08:00
										 |  |  |   GaussianFactorGraph copy = actual; | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // now eliminate the copy
 | 
					
						
							| 
									
										
										
										
											2010-10-22 06:59:54 +08:00
										 |  |  |   GaussianBayesNet actual1 = *GaussianSequentialSolver(copy).eliminate(); | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // Create the same graph, but not by copying
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  |   GaussianFactorGraph expected = createGaussianFactorGraph(ordering); | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // and check that original is still the same graph
 | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  |   EXPECT(assert_equal(expected,actual)); | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | ///* ************************************************************************* */
 | 
					
						
							|  |  |  | // SL-FIX TEST( GaussianFactorGraph, matrix )
 | 
					
						
							|  |  |  | //{
 | 
					
						
							|  |  |  | //  // render with a given ordering
 | 
					
						
							|  |  |  | //  Ordering ord;
 | 
					
						
							|  |  |  | //  ord += "x2","l1","x1";
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //  // Create a graph
 | 
					
						
							|  |  |  | //  GaussianFactorGraph fg = createGaussianFactorGraph(ordering);
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //  Matrix A; Vector b;
 | 
					
						
							|  |  |  | //  boost::tie(A,b) = fg.matrix();
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //  Matrix A1 = Matrix_(2*4,3*2,
 | 
					
						
							|  |  |  | //		     +0.,  0.,  0.,  0., 10.,  0., // unary factor on x1 (prior)
 | 
					
						
							|  |  |  | //		     +0.,  0.,  0.,  0.,  0., 10.,
 | 
					
						
							|  |  |  | //		     10.,  0.,  0.,  0.,-10.,  0., // binary factor on x2,x1 (odometry)
 | 
					
						
							|  |  |  | //		     +0., 10.,  0.,  0.,  0.,-10.,
 | 
					
						
							|  |  |  | //		     +0.,  0.,  5.,  0., -5.,  0., // binary factor on l1,x1 (z1)
 | 
					
						
							|  |  |  | //		     +0.,  0.,  0.,  5.,  0., -5.,
 | 
					
						
							|  |  |  | //		     -5.,  0.,  5.,  0.,  0.,  0., // binary factor on x2,l1 (z2)
 | 
					
						
							|  |  |  | //		     +0., -5.,  0.,  5.,  0.,  0.
 | 
					
						
							|  |  |  | //    );
 | 
					
						
							|  |  |  | //  Vector b1 = Vector_(8,-1., -1., 2., -1., 0., 1., -1., 1.5);
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //  EQUALITY(A,A1);
 | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  | //  EXPECT(b==b1);
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | //}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ///* ************************************************************************* */
 | 
					
						
							|  |  |  | // SL-FIX TEST( GaussianFactorGraph, sizeOfA )
 | 
					
						
							|  |  |  | //{
 | 
					
						
							|  |  |  | //	// create a small linear factor graph
 | 
					
						
							|  |  |  | //	GaussianFactorGraph fg = createGaussianFactorGraph();
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //  pair<size_t, size_t> mn = fg.sizeOfA();
 | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  | //  EXPECT(8 == mn.first);
 | 
					
						
							|  |  |  | //  EXPECT(6 == mn.second);
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | //}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ///* ************************************************************************* */
 | 
					
						
							|  |  |  | //SL-FIX TEST( GaussianFactorGraph, sparse )
 | 
					
						
							|  |  |  | //{
 | 
					
						
							|  |  |  | //	// create a small linear factor graph
 | 
					
						
							|  |  |  | //	GaussianFactorGraph fg = createGaussianFactorGraph();
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //	// render with a given ordering
 | 
					
						
							|  |  |  | //	Ordering ord;
 | 
					
						
							|  |  |  | //  ord += "x2","l1","x1";
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //	Matrix ijs = fg.sparse(ord);
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //	EQUALITY(Matrix_(3, 14,
 | 
					
						
							|  |  |  | //		// f(x1)   f(x2,x1)            f(l1,x1)         f(x2,l1)
 | 
					
						
							|  |  |  | //		+1., 2.,   3.,  4.,  3.,  4.,   5.,6., 5., 6.,   7., 8., 7., 8.,
 | 
					
						
							|  |  |  | //		+5., 6.,   5.,  6.,  1.,  2.,   3.,4., 5., 6.,   3., 4., 1., 2.,
 | 
					
						
							|  |  |  | //		10.,10., -10.,-10., 10., 10.,   5.,5.,-5.,-5.,   5., 5.,-5.,-5.), ijs);
 | 
					
						
							|  |  |  | //}
 | 
					
						
							| 
									
										
										
										
											2009-11-06 13:43:03 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2009-11-13 00:16:32 +08:00
										 |  |  | TEST( GaussianFactorGraph, CONSTRUCTOR_GaussianBayesNet ) | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | { | 
					
						
							|  |  |  |   Ordering ord; | 
					
						
							| 
									
										
										
										
											2009-10-31 23:24:22 +08:00
										 |  |  |   ord += "x2","l1","x1"; | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  |   GaussianFactorGraph fg = createGaussianFactorGraph(ord); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // render with a given ordering
 | 
					
						
							| 
									
										
										
										
											2010-10-22 06:59:54 +08:00
										 |  |  |   GaussianBayesNet CBN = *GaussianSequentialSolver(fg).eliminate(); | 
					
						
							| 
									
										
										
										
											2009-11-05 12:56:59 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-13 00:16:32 +08:00
										 |  |  |   // True GaussianFactorGraph
 | 
					
						
							|  |  |  |   GaussianFactorGraph fg2(CBN); | 
					
						
							| 
									
										
										
										
											2010-10-22 06:59:54 +08:00
										 |  |  |   GaussianBayesNet CBN2 = *GaussianSequentialSolver(fg2).eliminate(); | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  |   EXPECT(assert_equal(CBN,CBN2)); | 
					
						
							| 
									
										
										
										
											2009-11-05 12:56:59 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  |   // Base FactorGraph only
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | //  FactorGraph<GaussianFactor> fg3(CBN);
 | 
					
						
							|  |  |  | //  GaussianBayesNet CBN3 = gtsam::eliminate<GaussianFactor,GaussianConditional>(fg3,ord);
 | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  | //  EXPECT(assert_equal(CBN,CBN3));
 | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2009-12-27 20:13:31 +08:00
										 |  |  | TEST( GaussianFactorGraph, getOrdering) | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  |   Ordering original; original += "l1","x1","x2"; | 
					
						
							| 
									
										
										
										
											2010-10-20 05:31:13 +08:00
										 |  |  |   FactorGraph<IndexFactor> symbolic(createGaussianFactorGraph(original)); | 
					
						
							| 
									
										
										
										
											2010-10-23 02:02:55 +08:00
										 |  |  |   Permutation perm(*Inference::PermutationCOLAMD(VariableIndex(symbolic))); | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  |   Ordering actual = original; actual.permuteWithInverse((*perm.inverse())); | 
					
						
							|  |  |  |   Ordering expected; expected += "l1","x2","x1"; | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  |   EXPECT(assert_equal(expected,actual)); | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | // SL-FIX TEST( GaussianFactorGraph, getOrdering2)
 | 
					
						
							|  |  |  | //{
 | 
					
						
							|  |  |  | //  Ordering expected;
 | 
					
						
							|  |  |  | //  expected += "l1","x1";
 | 
					
						
							|  |  |  | //  GaussianFactorGraph fg = createGaussianFactorGraph();
 | 
					
						
							|  |  |  | //  set<Symbol> interested; interested += "l1","x1";
 | 
					
						
							|  |  |  | //  Ordering actual = fg.getOrdering(interested);
 | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  | //  EXPECT(assert_equal(expected,actual));
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | //}
 | 
					
						
							| 
									
										
										
										
											2010-05-24 16:57:22 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2011-06-14 04:01:58 +08:00
										 |  |  | TEST( GaussianFactorGraph, optimize_LDL ) | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  |   // create an ordering
 | 
					
						
							|  |  |  |   Ordering ord; ord += "x2","l1","x1"; | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  |   // create a graph
 | 
					
						
							|  |  |  | 	GaussianFactorGraph fg = createGaussianFactorGraph(ord); | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// optimize the graph
 | 
					
						
							| 
									
										
										
										
											2011-06-14 04:01:58 +08:00
										 |  |  | 	VectorValues actual = *GaussianSequentialSolver(fg, false).optimize(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// verify
 | 
					
						
							|  |  |  | 	VectorValues expected = createCorrectDelta(ord); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   EXPECT(assert_equal(expected,actual)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | TEST( GaussianFactorGraph, optimize_QR ) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   // create an ordering
 | 
					
						
							|  |  |  |   Ordering ord; ord += "x2","l1","x1"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // create a graph
 | 
					
						
							|  |  |  | 	GaussianFactorGraph fg = createGaussianFactorGraph(ord); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// optimize the graph
 | 
					
						
							|  |  |  | 	VectorValues actual = *GaussianSequentialSolver(fg, true).optimize(); | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// verify
 | 
					
						
							| 
									
										
										
										
											2010-10-09 11:09:58 +08:00
										 |  |  | 	VectorValues expected = createCorrectDelta(ord); | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  |   EXPECT(assert_equal(expected,actual)); | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | ///* ************************************************************************* */
 | 
					
						
							|  |  |  | // SL-FIX TEST( GaussianFactorGraph, optimizeMultiFrontlas )
 | 
					
						
							|  |  |  | //{
 | 
					
						
							|  |  |  | //  // create an ordering
 | 
					
						
							|  |  |  | //  Ordering ord; ord += "x2","l1","x1";
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //	// create a graph
 | 
					
						
							|  |  |  | //	GaussianFactorGraph fg = createGaussianFactorGraph(ord);
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //	// optimize the graph
 | 
					
						
							| 
									
										
										
										
											2010-10-09 11:09:58 +08:00
										 |  |  | //	VectorValues actual = fg.optimizeMultiFrontals(ord);
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | //
 | 
					
						
							|  |  |  | //	// verify
 | 
					
						
							| 
									
										
										
										
											2010-10-09 11:09:58 +08:00
										 |  |  | //	VectorValues expected = createCorrectDelta();
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | //
 | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  | //  EXPECT(assert_equal(expected,actual));
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | //}
 | 
					
						
							| 
									
										
										
										
											2010-07-19 04:23:23 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2009-12-28 17:44:30 +08:00
										 |  |  | TEST( GaussianFactorGraph, combine) | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  |   // create an ordering
 | 
					
						
							|  |  |  |   Ordering ord; ord += "x2","l1","x1"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // create a test graph
 | 
					
						
							|  |  |  | 	GaussianFactorGraph fg1 = createGaussianFactorGraph(ord); | 
					
						
							| 
									
										
										
										
											2009-11-05 04:59:16 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// create another factor graph
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | 	GaussianFactorGraph fg2 = createGaussianFactorGraph(ord); | 
					
						
							| 
									
										
										
										
											2009-11-05 04:59:16 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// get sizes
 | 
					
						
							| 
									
										
										
										
											2010-05-22 01:59:26 +08:00
										 |  |  | 	size_t size1 = fg1.size(); | 
					
						
							|  |  |  | 	size_t size2 = fg2.size(); | 
					
						
							| 
									
										
										
										
											2009-11-05 04:59:16 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// combine them
 | 
					
						
							|  |  |  | 	fg1.combine(fg2); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  | 	EXPECT(size1+size2 == fg1.size()); | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2009-12-27 20:13:31 +08:00
										 |  |  | TEST( GaussianFactorGraph, combine2) | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  |   // create an ordering
 | 
					
						
							|  |  |  |   Ordering ord; ord += "x2","l1","x1"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-05 04:59:16 +08:00
										 |  |  | 	// create a test graph
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | 	GaussianFactorGraph fg1 = createGaussianFactorGraph(ord); | 
					
						
							| 
									
										
										
										
											2009-11-05 04:59:16 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// create another factor graph
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | 	GaussianFactorGraph fg2 = createGaussianFactorGraph(ord); | 
					
						
							| 
									
										
										
										
											2009-11-05 04:59:16 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// get sizes
 | 
					
						
							| 
									
										
										
										
											2010-05-22 01:59:26 +08:00
										 |  |  | 	size_t size1 = fg1.size(); | 
					
						
							|  |  |  | 	size_t size2 = fg2.size(); | 
					
						
							| 
									
										
										
										
											2009-11-05 04:59:16 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// combine them
 | 
					
						
							| 
									
										
										
										
											2009-11-13 00:16:32 +08:00
										 |  |  | 	GaussianFactorGraph fg3 = GaussianFactorGraph::combine2(fg1, fg2); | 
					
						
							| 
									
										
										
										
											2009-11-05 04:59:16 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  | 	EXPECT(size1+size2 == fg3.size()); | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2009-10-22 13:02:31 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | // print a vector of ints if needed for debugging
 | 
					
						
							|  |  |  | void print(vector<int> v) { | 
					
						
							| 
									
										
										
										
											2010-05-22 01:59:26 +08:00
										 |  |  | 	for (size_t k = 0; k < v.size(); k++) | 
					
						
							| 
									
										
										
										
											2009-10-22 13:02:31 +08:00
										 |  |  | 		cout << v[k] << " "; | 
					
						
							|  |  |  | 	cout << endl; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | ///* ************************************************************************* */
 | 
					
						
							|  |  |  | // SL-NEEDED? TEST( GaussianFactorGraph, factor_lookup)
 | 
					
						
							|  |  |  | //{
 | 
					
						
							|  |  |  | //	// create a test graph
 | 
					
						
							|  |  |  | //	GaussianFactorGraph fg = createGaussianFactorGraph();
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //	// ask for all factor indices connected to x1
 | 
					
						
							|  |  |  | //	list<size_t> x1_factors = fg.factors("x1");
 | 
					
						
							|  |  |  | //	size_t x1_indices[] = { 0, 1, 2 };
 | 
					
						
							|  |  |  | //	list<size_t> x1_expected(x1_indices, x1_indices + 3);
 | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  | //	EXPECT(x1_factors==x1_expected);
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | //
 | 
					
						
							|  |  |  | //	// ask for all factor indices connected to x2
 | 
					
						
							|  |  |  | //	list<size_t> x2_factors = fg.factors("x2");
 | 
					
						
							|  |  |  | //	size_t x2_indices[] = { 1, 3 };
 | 
					
						
							|  |  |  | //	list<size_t> x2_expected(x2_indices, x2_indices + 2);
 | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  | //	EXPECT(x2_factors==x2_expected);
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | //}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ///* ************************************************************************* */
 | 
					
						
							|  |  |  | // SL-NEEDED? TEST( GaussianFactorGraph, findAndRemoveFactors )
 | 
					
						
							|  |  |  | //{
 | 
					
						
							|  |  |  | //	// create the graph
 | 
					
						
							|  |  |  | //	GaussianFactorGraph fg = createGaussianFactorGraph();
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //  // We expect to remove these three factors: 0, 1, 2
 | 
					
						
							|  |  |  | //  GaussianFactor::shared_ptr f0 = fg[0];
 | 
					
						
							|  |  |  | //  GaussianFactor::shared_ptr f1 = fg[1];
 | 
					
						
							|  |  |  | //  GaussianFactor::shared_ptr f2 = fg[2];
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //  // call the function
 | 
					
						
							|  |  |  | //  vector<GaussianFactor::shared_ptr> factors = fg.findAndRemoveFactors("x1");
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //  // Check the factors
 | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  | //  EXPECT(f0==factors[0]);
 | 
					
						
							|  |  |  | //  EXPECT(f1==factors[1]);
 | 
					
						
							|  |  |  | //  EXPECT(f2==factors[2]);
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | //
 | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  | //  // EXPECT if the factors are deleted from the factor graph
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | //  LONGS_EQUAL(1,fg.nrFactors());
 | 
					
						
							|  |  |  | //}
 | 
					
						
							| 
									
										
										
										
											2009-10-23 08:56:40 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-27 21:34:36 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2009-11-13 00:16:32 +08:00
										 |  |  | TEST(GaussianFactorGraph, createSmoother) | 
					
						
							| 
									
										
										
										
											2009-10-27 21:34:36 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | 	GaussianFactorGraph fg1 = createSmoother(2).first; | 
					
						
							| 
									
										
										
										
											2009-10-27 21:34:36 +08:00
										 |  |  | 	LONGS_EQUAL(3,fg1.size()); | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | 	GaussianFactorGraph fg2 = createSmoother(3).first; | 
					
						
							| 
									
										
										
										
											2009-10-27 21:34:36 +08:00
										 |  |  | 	LONGS_EQUAL(5,fg2.size()); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | ///* ************************************************************************* */
 | 
					
						
							|  |  |  | // SL-NEEDED? TEST( GaussianFactorGraph, variables )
 | 
					
						
							|  |  |  | //{
 | 
					
						
							|  |  |  | //  GaussianFactorGraph fg = createGaussianFactorGraph();
 | 
					
						
							|  |  |  | //  Dimensions expected;
 | 
					
						
							|  |  |  | //  insert(expected)("l1", 2)("x1", 2)("x2", 2);
 | 
					
						
							|  |  |  | //  Dimensions actual = fg.dimensions();
 | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  | //  EXPECT(expected==actual);
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | //}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ///* ************************************************************************* */
 | 
					
						
							|  |  |  | // SL-NEEDED? TEST( GaussianFactorGraph, keys )
 | 
					
						
							|  |  |  | //{
 | 
					
						
							|  |  |  | //  GaussianFactorGraph fg = createGaussianFactorGraph();
 | 
					
						
							|  |  |  | //  Ordering expected;
 | 
					
						
							|  |  |  | //  expected += "l1","x1","x2";
 | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  | //  EXPECT(assert_equal(expected,fg.keys()));
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | //}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ///* ************************************************************************* */
 | 
					
						
							|  |  |  | // SL-NEEDED? TEST( GaussianFactorGraph, involves )
 | 
					
						
							|  |  |  | //{
 | 
					
						
							|  |  |  | //  GaussianFactorGraph fg = createGaussianFactorGraph();
 | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  | //  EXPECT(fg.involves("l1"));
 | 
					
						
							|  |  |  | //  EXPECT(fg.involves("x1"));
 | 
					
						
							|  |  |  | //  EXPECT(fg.involves("x2"));
 | 
					
						
							|  |  |  | //  EXPECT(!fg.involves("x3"));
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | //}
 | 
					
						
							| 
									
										
										
										
											2009-11-20 13:14:34 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-11 04:19:15 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2010-10-09 11:09:58 +08:00
										 |  |  | double error(const VectorValues& x) { | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  |   // create an ordering
 | 
					
						
							|  |  |  |   Ordering ord; ord += "x2","l1","x1"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	GaussianFactorGraph fg = createGaussianFactorGraph(ord); | 
					
						
							| 
									
										
										
										
											2011-01-21 06:22:00 +08:00
										 |  |  | 	return gaussianError(fg,x); | 
					
						
							| 
									
										
										
										
											2009-12-12 12:44:34 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | ///* ************************************************************************* */
 | 
					
						
							|  |  |  | // SL-NEEDED? TEST( GaussianFactorGraph, gradient )
 | 
					
						
							|  |  |  | //{
 | 
					
						
							|  |  |  | //	GaussianFactorGraph fg = createGaussianFactorGraph();
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //	// Construct expected gradient
 | 
					
						
							| 
									
										
										
										
											2010-10-09 11:09:58 +08:00
										 |  |  | //	VectorValues expected;
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | //
 | 
					
						
							|  |  |  | //  // 2*f(x) = 100*(x1+c["x1"])^2 + 100*(x2-x1-[0.2;-0.1])^2 + 25*(l1-x1-[0.0;0.2])^2 + 25*(l1-x2-[-0.2;0.3])^2
 | 
					
						
							|  |  |  | //	// worked out: df/dx1 = 100*[0.1;0.1] + 100*[0.2;-0.1]) + 25*[0.0;0.2] = [10+20;10-10+5] = [30;5]
 | 
					
						
							|  |  |  | //  expected.insert("l1",Vector_(2,  5.0,-12.5));
 | 
					
						
							|  |  |  | //  expected.insert("x1",Vector_(2, 30.0,  5.0));
 | 
					
						
							|  |  |  | //  expected.insert("x2",Vector_(2,-25.0, 17.5));
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //	// Check the gradient at delta=0
 | 
					
						
							| 
									
										
										
										
											2010-10-09 11:09:58 +08:00
										 |  |  | //  VectorValues zero = createZeroDelta();
 | 
					
						
							|  |  |  | //	VectorValues actual = fg.gradient(zero);
 | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  | //	EXPECT(assert_equal(expected,actual));
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | //
 | 
					
						
							|  |  |  | //	// Check it numerically for good measure
 | 
					
						
							| 
									
										
										
										
											2010-10-09 11:09:58 +08:00
										 |  |  | //	Vector numerical_g = numericalGradient<VectorValues>(error,zero,0.001);
 | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  | //	EXPECT(assert_equal(Vector_(6,5.0,-12.5,30.0,5.0,-25.0,17.5),numerical_g));
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | //
 | 
					
						
							|  |  |  | //	// Check the gradient at the solution (should be zero)
 | 
					
						
							|  |  |  | //	Ordering ord;
 | 
					
						
							|  |  |  | //  ord += "x2","l1","x1";
 | 
					
						
							|  |  |  | //	GaussianFactorGraph fg2 = createGaussianFactorGraph();
 | 
					
						
							| 
									
										
										
										
											2010-10-09 11:09:58 +08:00
										 |  |  | //  VectorValues solution = fg2.optimize(ord); // destructive
 | 
					
						
							|  |  |  | //	VectorValues actual2 = fg.gradient(solution);
 | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  | //	EXPECT(assert_equal(zero,actual2));
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | //}
 | 
					
						
							| 
									
										
										
										
											2009-12-11 04:19:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-27 06:48:41 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2009-12-26 23:06:54 +08:00
										 |  |  | TEST( GaussianFactorGraph, multiplication ) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  |   // create an ordering
 | 
					
						
							|  |  |  |   Ordering ord; ord += "x2","l1","x1"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-19 06:10:21 +08:00
										 |  |  | 	FactorGraph<JacobianFactor> A = createGaussianFactorGraph(ord); | 
					
						
							| 
									
										
										
										
											2010-10-09 11:09:58 +08:00
										 |  |  |   VectorValues x = createCorrectDelta(ord); | 
					
						
							| 
									
										
										
										
											2009-12-27 06:48:41 +08:00
										 |  |  |   Errors actual = A * x; | 
					
						
							|  |  |  |   Errors expected; | 
					
						
							| 
									
										
										
										
											2010-01-19 13:33:44 +08:00
										 |  |  |   expected += Vector_(2,-1.0,-1.0); | 
					
						
							|  |  |  |   expected += Vector_(2, 2.0,-1.0); | 
					
						
							|  |  |  |   expected += Vector_(2, 0.0, 1.0); | 
					
						
							|  |  |  |   expected += Vector_(2,-1.0, 1.5); | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  | 	EXPECT(assert_equal(expected,actual)); | 
					
						
							| 
									
										
										
										
											2009-12-26 23:06:54 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | ///* ************************************************************************* */
 | 
					
						
							|  |  |  | // SL-NEEDED? TEST( GaussianFactorGraph, transposeMultiplication )
 | 
					
						
							|  |  |  | //{
 | 
					
						
							|  |  |  | //  // create an ordering
 | 
					
						
							|  |  |  | //  Ordering ord; ord += "x2","l1","x1";
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //	GaussianFactorGraph A = createGaussianFactorGraph(ord);
 | 
					
						
							|  |  |  | //  Errors e;
 | 
					
						
							|  |  |  | //  e += Vector_(2, 0.0, 0.0);
 | 
					
						
							|  |  |  | //  e += Vector_(2,15.0, 0.0);
 | 
					
						
							|  |  |  | //  e += Vector_(2, 0.0,-5.0);
 | 
					
						
							|  |  |  | //  e += Vector_(2,-7.5,-5.0);
 | 
					
						
							|  |  |  | //
 | 
					
						
							| 
									
										
										
										
											2010-10-09 11:09:58 +08:00
										 |  |  | //  VectorValues expected = createZeroDelta(ord), actual = A ^ e;
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | //  expected[ord["l1"]] = Vector_(2, -37.5,-50.0);
 | 
					
						
							|  |  |  | //  expected[ord["x1"]] = Vector_(2,-150.0, 25.0);
 | 
					
						
							|  |  |  | //  expected[ord["x2"]] = Vector_(2, 187.5, 25.0);
 | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  | //	EXPECT(assert_equal(expected,actual));
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | //}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ///* ************************************************************************* */
 | 
					
						
							|  |  |  | // SL-NEEDED? TEST( GaussianFactorGraph, rhs )
 | 
					
						
							|  |  |  | //{
 | 
					
						
							|  |  |  | //  // create an ordering
 | 
					
						
							|  |  |  | //  Ordering ord; ord += "x2","l1","x1";
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //	GaussianFactorGraph Ab = createGaussianFactorGraph(ord);
 | 
					
						
							|  |  |  | //	Errors expected = createZeroDelta(ord), actual = Ab.rhs();
 | 
					
						
							|  |  |  | //  expected.push_back(Vector_(2,-1.0,-1.0));
 | 
					
						
							|  |  |  | //  expected.push_back(Vector_(2, 2.0,-1.0));
 | 
					
						
							|  |  |  | //  expected.push_back(Vector_(2, 0.0, 1.0));
 | 
					
						
							|  |  |  | //  expected.push_back(Vector_(2,-1.0, 1.5));
 | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  | //	EXPECT(assert_equal(expected,actual));
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | //}
 | 
					
						
							| 
									
										
										
										
											2009-12-29 02:46:01 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-10 05:34:20 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2010-01-05 22:14:49 +08:00
										 |  |  | // Extra test on elimination prompted by Michael's email to Frank 1/4/2010
 | 
					
						
							|  |  |  | TEST( GaussianFactorGraph, elimination ) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  |   Ordering ord; | 
					
						
							|  |  |  |   ord += "x1", "x2"; | 
					
						
							| 
									
										
										
										
											2010-01-05 22:14:49 +08:00
										 |  |  | 	// Create Gaussian Factor Graph
 | 
					
						
							|  |  |  | 	GaussianFactorGraph fg; | 
					
						
							|  |  |  | 	Matrix Ap = eye(1), An = eye(1) * -1; | 
					
						
							|  |  |  | 	Vector b = Vector_(1, 0.0); | 
					
						
							| 
									
										
										
										
											2010-02-25 02:09:15 +08:00
										 |  |  |   SharedDiagonal sigma = sharedSigma(1,2.0); | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | 	fg.add(ord["x1"], An, ord["x2"], Ap, b, sigma); | 
					
						
							|  |  |  | 	fg.add(ord["x1"], Ap, b, sigma); | 
					
						
							|  |  |  | 	fg.add(ord["x2"], Ap, b, sigma); | 
					
						
							| 
									
										
										
										
											2010-01-05 22:14:49 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Eliminate
 | 
					
						
							| 
									
										
										
										
											2010-10-22 06:59:54 +08:00
										 |  |  | 	GaussianBayesNet bayesNet = *GaussianSequentialSolver(fg).eliminate(); | 
					
						
							| 
									
										
										
										
											2010-01-05 22:14:49 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Check sigma
 | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  | 	EXPECT_DOUBLES_EQUAL(1.0,bayesNet[ord["x2"]]->get_sigmas()(0),1e-5); | 
					
						
							| 
									
										
										
										
											2010-01-05 22:14:49 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Check matrix
 | 
					
						
							|  |  |  | 	Matrix R;Vector d; | 
					
						
							|  |  |  | 	boost::tie(R,d) = matrix(bayesNet); | 
					
						
							|  |  |  | 	Matrix expected = Matrix_(2,2, | 
					
						
							|  |  |  | 			0.707107,	-0.353553, | 
					
						
							| 
									
										
										
										
											2010-01-27 12:39:35 +08:00
										 |  |  | 			0.0,	 0.612372); | 
					
						
							| 
									
										
										
										
											2010-06-30 23:57:12 +08:00
										 |  |  | 	Matrix expected2 = Matrix_(2,2, | 
					
						
							|  |  |  | 			0.707107,	-0.353553, | 
					
						
							|  |  |  | 			0.0,	 -0.612372); | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  | 	EXPECT(equal_with_abs_tol(expected, R, 1e-6) || equal_with_abs_tol(expected2, R, 1e-6)); | 
					
						
							| 
									
										
										
										
											2010-01-05 22:14:49 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2009-11-13 00:16:32 +08:00
										 |  |  | // Tests ported from ConstrainedGaussianFactorGraph
 | 
					
						
							| 
									
										
										
										
											2009-11-10 12:36:07 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2009-11-13 00:16:32 +08:00
										 |  |  | TEST( GaussianFactorGraph, constrained_simple ) | 
					
						
							| 
									
										
										
										
											2009-11-10 12:36:07 +08:00
										 |  |  | { | 
					
						
							|  |  |  | 	// get a graph with a constraint in it
 | 
					
						
							| 
									
										
										
										
											2009-11-13 00:16:32 +08:00
										 |  |  | 	GaussianFactorGraph fg = createSimpleConstraintGraph(); | 
					
						
							| 
									
										
										
										
											2009-11-10 12:36:07 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// eliminate and solve
 | 
					
						
							| 
									
										
										
										
											2010-10-22 06:59:54 +08:00
										 |  |  | 	VectorValues actual = *GaussianSequentialSolver(fg).optimize(); | 
					
						
							| 
									
										
										
										
											2009-11-10 12:36:07 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// verify
 | 
					
						
							| 
									
										
										
										
											2010-10-09 11:09:58 +08:00
										 |  |  | 	VectorValues expected = createSimpleConstraintValues(); | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  | 	EXPECT(assert_equal(expected, actual)); | 
					
						
							| 
									
										
										
										
											2009-11-10 12:36:07 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-11 22:42:09 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2009-11-13 00:16:32 +08:00
										 |  |  | TEST( GaussianFactorGraph, constrained_single ) | 
					
						
							| 
									
										
										
										
											2009-11-11 22:42:09 +08:00
										 |  |  | { | 
					
						
							|  |  |  | 	// get a graph with a constraint in it
 | 
					
						
							| 
									
										
										
										
											2009-11-13 00:16:32 +08:00
										 |  |  | 	GaussianFactorGraph fg = createSingleConstraintGraph(); | 
					
						
							| 
									
										
										
										
											2009-11-11 22:42:09 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// eliminate and solve
 | 
					
						
							| 
									
										
										
										
											2010-10-22 06:59:54 +08:00
										 |  |  | 	VectorValues actual = *GaussianSequentialSolver(fg).optimize(); | 
					
						
							| 
									
										
										
										
											2009-11-11 22:42:09 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// verify
 | 
					
						
							| 
									
										
										
										
											2010-10-09 11:09:58 +08:00
										 |  |  | 	VectorValues expected = createSingleConstraintValues(); | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  | 	EXPECT(assert_equal(expected, actual)); | 
					
						
							| 
									
										
										
										
											2009-11-11 22:42:09 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | ///* ************************************************************************* */
 | 
					
						
							|  |  |  | //SL-FIX TEST( GaussianFactorGraph, constrained_single2 )
 | 
					
						
							|  |  |  | //{
 | 
					
						
							|  |  |  | //	// get a graph with a constraint in it
 | 
					
						
							|  |  |  | //	GaussianFactorGraph fg = createSingleConstraintGraph();
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //	// eliminate and solve
 | 
					
						
							|  |  |  | //	Ordering ord;
 | 
					
						
							|  |  |  | //	ord += "y", "x";
 | 
					
						
							| 
									
										
										
										
											2010-10-09 11:09:58 +08:00
										 |  |  | //	VectorValues actual = fg.optimize(ord);
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | //
 | 
					
						
							|  |  |  | //	// verify
 | 
					
						
							| 
									
										
										
										
											2010-10-09 11:09:58 +08:00
										 |  |  | //	VectorValues expected = createSingleConstraintValues();
 | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  | //	EXPECT(assert_equal(expected, actual));
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | //}
 | 
					
						
							| 
									
										
										
										
											2009-11-11 22:42:09 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2009-11-13 00:16:32 +08:00
										 |  |  | TEST( GaussianFactorGraph, constrained_multi1 ) | 
					
						
							| 
									
										
										
										
											2009-11-11 22:42:09 +08:00
										 |  |  | { | 
					
						
							|  |  |  | 	// get a graph with a constraint in it
 | 
					
						
							| 
									
										
										
										
											2009-11-13 00:16:32 +08:00
										 |  |  | 	GaussianFactorGraph fg = createMultiConstraintGraph(); | 
					
						
							| 
									
										
										
										
											2009-11-11 22:42:09 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// eliminate and solve
 | 
					
						
							| 
									
										
										
										
											2010-10-22 06:59:54 +08:00
										 |  |  |   VectorValues actual = *GaussianSequentialSolver(fg).optimize(); | 
					
						
							| 
									
										
										
										
											2009-11-11 22:42:09 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// verify
 | 
					
						
							| 
									
										
										
										
											2010-10-09 11:09:58 +08:00
										 |  |  | 	VectorValues expected = createMultiConstraintValues(); | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  | 	EXPECT(assert_equal(expected, actual)); | 
					
						
							| 
									
										
										
										
											2009-11-11 22:42:09 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2009-11-10 05:34:20 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | ///* ************************************************************************* */
 | 
					
						
							|  |  |  | //SL-FIX TEST( GaussianFactorGraph, constrained_multi2 )
 | 
					
						
							|  |  |  | //{
 | 
					
						
							|  |  |  | //	// get a graph with a constraint in it
 | 
					
						
							|  |  |  | //	GaussianFactorGraph fg = createMultiConstraintGraph();
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //	// eliminate and solve
 | 
					
						
							|  |  |  | //	Ordering ord;
 | 
					
						
							|  |  |  | //	ord += "z", "x", "y";
 | 
					
						
							| 
									
										
										
										
											2010-10-09 11:09:58 +08:00
										 |  |  | //	VectorValues actual = fg.optimize(ord);
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | //
 | 
					
						
							|  |  |  | //	// verify
 | 
					
						
							| 
									
										
										
										
											2010-10-09 11:09:58 +08:00
										 |  |  | //	VectorValues expected = createMultiConstraintValues();
 | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  | //	EXPECT(assert_equal(expected, actual));
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | //}
 | 
					
						
							| 
									
										
										
										
											2009-11-12 03:00:39 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-14 07:59:46 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2010-01-21 02:32:48 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-23 01:36:57 +08:00
										 |  |  | SharedDiagonal model = sharedSigma(2,1); | 
					
						
							| 
									
										
										
										
											2010-01-21 02:32:48 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | // SL-FIX TEST( GaussianFactorGraph, findMinimumSpanningTree )
 | 
					
						
							|  |  |  | //{
 | 
					
						
							|  |  |  | //	GaussianFactorGraph g;
 | 
					
						
							|  |  |  | //	Matrix I = eye(2);
 | 
					
						
							|  |  |  | //	Vector b = Vector_(0, 0, 0);
 | 
					
						
							|  |  |  | //	g.add("x1", I, "x2", I, b, model);
 | 
					
						
							|  |  |  | //	g.add("x1", I, "x3", I, b, model);
 | 
					
						
							|  |  |  | //	g.add("x1", I, "x4", I, b, model);
 | 
					
						
							|  |  |  | //	g.add("x2", I, "x3", I, b, model);
 | 
					
						
							|  |  |  | //	g.add("x2", I, "x4", I, b, model);
 | 
					
						
							|  |  |  | //	g.add("x3", I, "x4", I, b, model);
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //	map<string, string> tree = g.findMinimumSpanningTree<string, GaussianFactor>();
 | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  | //	EXPECT(tree["x1"].compare("x1")==0);
 | 
					
						
							|  |  |  | //	EXPECT(tree["x2"].compare("x1")==0);
 | 
					
						
							|  |  |  | //	EXPECT(tree["x3"].compare("x1")==0);
 | 
					
						
							|  |  |  | //	EXPECT(tree["x4"].compare("x1")==0);
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | //}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ///* ************************************************************************* */
 | 
					
						
							|  |  |  | // SL-FIX TEST( GaussianFactorGraph, split )
 | 
					
						
							|  |  |  | //{
 | 
					
						
							|  |  |  | //	GaussianFactorGraph g;
 | 
					
						
							|  |  |  | //	Matrix I = eye(2);
 | 
					
						
							|  |  |  | //	Vector b = Vector_(0, 0, 0);
 | 
					
						
							|  |  |  | //	g.add("x1", I, "x2", I, b, model);
 | 
					
						
							|  |  |  | //	g.add("x1", I, "x3", I, b, model);
 | 
					
						
							|  |  |  | //	g.add("x1", I, "x4", I, b, model);
 | 
					
						
							|  |  |  | //	g.add("x2", I, "x3", I, b, model);
 | 
					
						
							|  |  |  | //	g.add("x2", I, "x4", I, b, model);
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //	PredecessorMap<string> tree;
 | 
					
						
							|  |  |  | //	tree["x1"] = "x1";
 | 
					
						
							|  |  |  | //	tree["x2"] = "x1";
 | 
					
						
							|  |  |  | //	tree["x3"] = "x1";
 | 
					
						
							|  |  |  | //	tree["x4"] = "x1";
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //	GaussianFactorGraph Ab1, Ab2;
 | 
					
						
							|  |  |  | //  g.split<string, GaussianFactor>(tree, Ab1, Ab2);
 | 
					
						
							|  |  |  | //	LONGS_EQUAL(3, Ab1.size());
 | 
					
						
							|  |  |  | //	LONGS_EQUAL(2, Ab2.size());
 | 
					
						
							|  |  |  | //}
 | 
					
						
							| 
									
										
										
										
											2010-01-09 03:07:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-13 09:29:19 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | TEST(GaussianFactorGraph, replace) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  |   Ordering ord; ord += "x1","x2","x3","x4","x5","x6"; | 
					
						
							| 
									
										
										
										
											2010-02-13 09:29:19 +08:00
										 |  |  | 	SharedDiagonal noise(sharedSigma(3, 1.0)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-21 06:22:00 +08:00
										 |  |  | 	GaussianFactorGraph::sharedFactor f1(new JacobianFactor( | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | 	    ord["x1"], eye(3,3), ord["x2"], eye(3,3), zero(3), noise)); | 
					
						
							| 
									
										
										
										
											2011-01-21 06:22:00 +08:00
										 |  |  | 	GaussianFactorGraph::sharedFactor f2(new JacobianFactor( | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | 	    ord["x2"], eye(3,3), ord["x3"], eye(3,3), zero(3), noise)); | 
					
						
							| 
									
										
										
										
											2011-01-21 06:22:00 +08:00
										 |  |  | 	GaussianFactorGraph::sharedFactor f3(new JacobianFactor( | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | 	    ord["x3"], eye(3,3), ord["x4"], eye(3,3), zero(3), noise)); | 
					
						
							| 
									
										
										
										
											2011-01-21 06:22:00 +08:00
										 |  |  | 	GaussianFactorGraph::sharedFactor f4(new JacobianFactor( | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | 	    ord["x5"], eye(3,3), ord["x6"], eye(3,3), zero(3), noise)); | 
					
						
							| 
									
										
										
										
											2010-02-13 09:29:19 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	GaussianFactorGraph actual; | 
					
						
							|  |  |  | 	actual.push_back(f1); | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | //	actual.checkGraphConsistency();
 | 
					
						
							| 
									
										
										
										
											2010-02-13 09:29:19 +08:00
										 |  |  | 	actual.push_back(f2); | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | //	actual.checkGraphConsistency();
 | 
					
						
							| 
									
										
										
										
											2010-02-13 09:29:19 +08:00
										 |  |  | 	actual.push_back(f3); | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | //	actual.checkGraphConsistency();
 | 
					
						
							| 
									
										
										
										
											2010-02-13 09:29:19 +08:00
										 |  |  | 	actual.replace(0, f4); | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | //	actual.checkGraphConsistency();
 | 
					
						
							| 
									
										
										
										
											2010-02-13 09:29:19 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	GaussianFactorGraph expected; | 
					
						
							|  |  |  | 	expected.push_back(f4); | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | //	actual.checkGraphConsistency();
 | 
					
						
							| 
									
										
										
										
											2010-02-13 09:29:19 +08:00
										 |  |  | 	expected.push_back(f2); | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | //	actual.checkGraphConsistency();
 | 
					
						
							| 
									
										
										
										
											2010-02-13 09:29:19 +08:00
										 |  |  | 	expected.push_back(f3); | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | //	actual.checkGraphConsistency();
 | 
					
						
							| 
									
										
										
										
											2010-02-13 09:29:19 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  | 	EXPECT(assert_equal(expected, actual)); | 
					
						
							| 
									
										
										
										
											2010-02-13 09:29:19 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | ///* ************************************************************************* */
 | 
					
						
							|  |  |  | //TEST ( GaussianFactorGraph, combine_matrix ) {
 | 
					
						
							|  |  |  | //	// create a small linear factor graph
 | 
					
						
							|  |  |  | //	GaussianFactorGraph fg = createGaussianFactorGraph();
 | 
					
						
							|  |  |  | //	Dimensions dimensions = fg.dimensions();
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //	// get two factors from it and insert the factors into a vector
 | 
					
						
							|  |  |  | //	vector<GaussianFactor::shared_ptr> lfg;
 | 
					
						
							|  |  |  | //	lfg.push_back(fg[4 - 1]);
 | 
					
						
							|  |  |  | //	lfg.push_back(fg[2 - 1]);
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //	// combine in a factor
 | 
					
						
							|  |  |  | //	Matrix Ab; SharedDiagonal noise;
 | 
					
						
							|  |  |  | //	Ordering order; order += "x2", "l1", "x1";
 | 
					
						
							|  |  |  | //	boost::tie(Ab, noise) = combineFactorsAndCreateMatrix(lfg, order, dimensions);
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //	// the expected augmented matrix
 | 
					
						
							|  |  |  | //	Matrix expAb = Matrix_(4, 7,
 | 
					
						
							|  |  |  | //			-5.,  0., 5., 0.,  0.,  0.,-1.0,
 | 
					
						
							|  |  |  | //			+0., -5., 0., 5.,  0.,  0., 1.5,
 | 
					
						
							|  |  |  | //			10.,  0., 0., 0.,-10.,  0., 2.0,
 | 
					
						
							|  |  |  | //			+0., 10., 0., 0.,  0.,-10.,-1.0);
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //	// expected noise model
 | 
					
						
							|  |  |  | //	SharedDiagonal expModel = noiseModel::Unit::Create(4);
 | 
					
						
							|  |  |  | //
 | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  | //	EXPECT(assert_equal(expAb, Ab));
 | 
					
						
							|  |  |  | //	EXPECT(assert_equal(*expModel, *noise));
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | //}
 | 
					
						
							| 
									
										
										
										
											2010-07-08 05:41:50 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-11 15:30:27 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  *   x2 x1 x3 b | 
					
						
							|  |  |  |  *    1  1    1       1  1  0  1 | 
					
						
							|  |  |  |  *    1    1  1  ->      1  1  1 | 
					
						
							|  |  |  |  *         1  1             1  1 | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | // SL-NEEDED? TEST ( GaussianFactorGraph, eliminateFrontals ) {
 | 
					
						
							|  |  |  | //	typedef GaussianFactorGraph::sharedFactor Factor;
 | 
					
						
							|  |  |  | //	SharedDiagonal model(Vector_(1, 0.5));
 | 
					
						
							|  |  |  | //	GaussianFactorGraph fg;
 | 
					
						
							| 
									
										
										
										
											2011-01-21 06:22:00 +08:00
										 |  |  | //	Factor factor1(new JacobianFactor("x1", Matrix_(1,1,1.), "x2", Matrix_(1,1,1.), Vector_(1,1.),  model));
 | 
					
						
							|  |  |  | //	Factor factor2(new JacobianFactor("x2", Matrix_(1,1,1.), "x3", Matrix_(1,1,1.), Vector_(1,1.),  model));
 | 
					
						
							|  |  |  | //	Factor factor3(new JacobianFactor("x3", Matrix_(1,1,1.), "x3", Matrix_(1,1,1.), Vector_(1,1.),  model));
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | //	fg.push_back(factor1);
 | 
					
						
							|  |  |  | //	fg.push_back(factor2);
 | 
					
						
							|  |  |  | //	fg.push_back(factor3);
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //	Ordering frontals; frontals += "x2", "x1";
 | 
					
						
							|  |  |  | //	GaussianBayesNet bn = fg.eliminateFrontals(frontals);
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //	GaussianBayesNet bn_expected;
 | 
					
						
							|  |  |  | //	GaussianBayesNet::sharedConditional conditional1(new GaussianConditional("x2", Vector_(1, 2.), Matrix_(1, 1, 2.),
 | 
					
						
							|  |  |  | //			"x1", Matrix_(1, 1, 1.), "x3", Matrix_(1, 1, 1.), Vector_(1, 1.)));
 | 
					
						
							|  |  |  | //	GaussianBayesNet::sharedConditional conditional2(new GaussianConditional("x1", Vector_(1, 0.), Matrix_(1, 1, -1.),
 | 
					
						
							|  |  |  | //			"x3", Matrix_(1, 1, 1.), Vector_(1, 1.)));
 | 
					
						
							|  |  |  | //	bn_expected.push_back(conditional1);
 | 
					
						
							|  |  |  | //	bn_expected.push_back(conditional2);
 | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  | //	EXPECT(assert_equal(bn_expected, bn));
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | //
 | 
					
						
							| 
									
										
										
										
											2011-01-21 06:22:00 +08:00
										 |  |  | //	GaussianFactorGraph::sharedFactor factor_expected(new JacobianFactor("x3", Matrix_(1, 1, 2.), Vector_(1, 2.), SharedDiagonal(Vector_(1, 1.))));
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | //	GaussianFactorGraph fg_expected;
 | 
					
						
							|  |  |  | //	fg_expected.push_back(factor_expected);
 | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  | //	EXPECT(assert_equal(fg_expected, fg));
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | //}
 | 
					
						
							| 
									
										
										
										
											2010-07-11 15:30:27 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | int main() { TestResult tr; return TestRegistry::runAllTests(tr);} | 
					
						
							|  |  |  | /* ************************************************************************* */ |