| 
									
										
										
										
											2010-10-14 12:54:38 +08:00
										 |  |  | /* ----------------------------------------------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  |  * GTSAM Copyright 2010, Georgia Tech Research Corporation, | 
					
						
							| 
									
										
										
										
											2010-10-14 12:54:38 +08:00
										 |  |  |  * 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 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  * -------------------------------------------------------------------------- */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-14 11:23:14 +08:00
										 |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2012-03-15 10:10:37 +08:00
										 |  |  |  * @file testGaussianJunctionTreeB.cpp | 
					
						
							| 
									
										
										
										
											2011-10-14 11:23:14 +08:00
										 |  |  |  * @date Jul 8, 2010 | 
					
						
							|  |  |  |  * @author nikai | 
					
						
							| 
									
										
										
										
											2010-07-12 15:16:31 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-06 21:44:22 +08:00
										 |  |  | #include <CppUnitLite/TestHarness.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if 0
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-10 04:15:44 +08:00
										 |  |  | #include <tests/smallExample.h>
 | 
					
						
							| 
									
										
										
										
											2012-07-24 06:43:17 +08:00
										 |  |  | #include <gtsam/slam/PriorFactor.h>
 | 
					
						
							|  |  |  | #include <gtsam/slam/BetweenFactor.h>
 | 
					
						
							|  |  |  | #include <gtsam/slam/BearingRangeFactor.h>
 | 
					
						
							|  |  |  | #include <gtsam/nonlinear/NonlinearFactorGraph.h>
 | 
					
						
							|  |  |  | #include <gtsam/nonlinear/Values.h>
 | 
					
						
							| 
									
										
										
										
											2013-08-06 06:31:33 +08:00
										 |  |  | #include <gtsam/nonlinear/Ordering.h>
 | 
					
						
							| 
									
										
										
										
											2012-06-03 03:05:38 +08:00
										 |  |  | #include <gtsam/nonlinear/Symbol.h>
 | 
					
						
							| 
									
										
										
										
											2013-08-06 06:31:33 +08:00
										 |  |  | #include <gtsam/linear/GaussianJunctionTree.h>
 | 
					
						
							|  |  |  | #include <gtsam/inference/BayesTree.h>
 | 
					
						
							| 
									
										
										
										
											2012-07-24 06:43:17 +08:00
										 |  |  | #include <gtsam/geometry/Pose2.h>
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | #include <gtsam/base/TestableAssertions.h>
 | 
					
						
							| 
									
										
										
										
											2012-06-03 03:05:38 +08:00
										 |  |  | #include <gtsam/base/debug.h>
 | 
					
						
							|  |  |  | #include <gtsam/base/cholesky.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-12 15:16:31 +08:00
										 |  |  | #include <boost/assign/list_of.hpp>
 | 
					
						
							|  |  |  | #include <boost/assign/std/list.hpp> // for operator +=
 | 
					
						
							|  |  |  | #include <boost/assign/std/set.hpp> // for operator +=
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | #include <boost/assign/std/vector.hpp>
 | 
					
						
							| 
									
										
										
										
											2010-07-12 15:16:31 +08:00
										 |  |  | using namespace boost::assign; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-03 03:05:38 +08:00
										 |  |  | #include <iostream>
 | 
					
						
							| 
									
										
										
										
											2010-07-12 15:16:31 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | using namespace std; | 
					
						
							|  |  |  | using namespace gtsam; | 
					
						
							|  |  |  | using namespace example; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-03 03:28:21 +08:00
										 |  |  | using symbol_shorthand::X; | 
					
						
							|  |  |  | using symbol_shorthand::L; | 
					
						
							| 
									
										
										
										
											2012-02-21 08:53:35 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-12 15:16:31 +08:00
										 |  |  | /* ************************************************************************* *
 | 
					
						
							|  |  |  |  Bayes tree for smoother with "nested dissection" ordering: | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |    C1     x5 x6 x4 | 
					
						
							|  |  |  |    C2      x3 x2 : x4 | 
					
						
							|  |  |  |    C3        x1 : x2 | 
					
						
							|  |  |  |    C4      x7 : x6 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | */ | 
					
						
							| 
									
										
										
										
											2012-06-30 09:44:00 +08:00
										 |  |  | TEST( GaussianJunctionTreeB, constructor2 ) | 
					
						
							| 
									
										
										
										
											2010-07-12 15:16:31 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   // create a graph
 | 
					
						
							| 
									
										
										
										
											2013-08-06 06:31:44 +08:00
										 |  |  |   Ordering ordering; ordering += X(1),X(3),X(5),X(7),X(2),X(6),X(4); | 
					
						
							|  |  |  |   GaussianFactorGraph fg = createSmoother(7, ordering).first; | 
					
						
							| 
									
										
										
										
											2010-07-12 15:16:31 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   // create an ordering
 | 
					
						
							| 
									
										
										
										
											2013-08-06 06:31:44 +08:00
										 |  |  |   GaussianJunctionTree actual(fg); | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   vector<Index> frontal1; frontal1 += ordering[X(5)], ordering[X(6)], ordering[X(4)]; | 
					
						
							|  |  |  |   vector<Index> frontal2; frontal2 += ordering[X(3)], ordering[X(2)]; | 
					
						
							|  |  |  |   vector<Index> frontal3; frontal3 += ordering[X(1)]; | 
					
						
							|  |  |  |   vector<Index> frontal4; frontal4 += ordering[X(7)]; | 
					
						
							|  |  |  |   vector<Index> sep1; | 
					
						
							|  |  |  |   vector<Index> sep2; sep2 += ordering[X(4)]; | 
					
						
							|  |  |  |   vector<Index> sep3; sep3 += ordering[X(2)]; | 
					
						
							|  |  |  |   vector<Index> sep4; sep4 += ordering[X(6)]; | 
					
						
							|  |  |  |   EXPECT(assert_equal(frontal1, actual.root()->frontal)); | 
					
						
							|  |  |  |   EXPECT(assert_equal(sep1,     actual.root()->separator)); | 
					
						
							|  |  |  |   LONGS_EQUAL(5,               actual.root()->size()); | 
					
						
							| 
									
										
										
										
											2013-08-06 06:31:44 +08:00
										 |  |  |   list<GaussianJunctionTree::sharedClique>::const_iterator child0it = actual.root()->children().begin(); | 
					
						
							|  |  |  |   list<GaussianJunctionTree::sharedClique>::const_iterator child1it = child0it; ++child1it; | 
					
						
							|  |  |  |   GaussianJunctionTree::sharedClique child0 = *child0it; | 
					
						
							|  |  |  |   GaussianJunctionTree::sharedClique child1 = *child1it; | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   EXPECT(assert_equal(frontal2, child0->frontal)); | 
					
						
							|  |  |  |   EXPECT(assert_equal(sep2,     child0->separator)); | 
					
						
							|  |  |  |   LONGS_EQUAL(4,               child0->size()); | 
					
						
							|  |  |  |   EXPECT(assert_equal(frontal3, child0->children().front()->frontal)); | 
					
						
							|  |  |  |   EXPECT(assert_equal(sep3,     child0->children().front()->separator)); | 
					
						
							|  |  |  |   LONGS_EQUAL(2,               child0->children().front()->size()); | 
					
						
							|  |  |  |   EXPECT(assert_equal(frontal4, child1->frontal)); | 
					
						
							|  |  |  |   EXPECT(assert_equal(sep4,     child1->separator)); | 
					
						
							|  |  |  |   LONGS_EQUAL(2,               child1->size()); | 
					
						
							| 
									
										
										
										
											2010-07-12 15:16:31 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-19 04:23:23 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2012-06-30 09:44:00 +08:00
										 |  |  | TEST( GaussianJunctionTreeB, optimizeMultiFrontal ) | 
					
						
							| 
									
										
										
										
											2010-07-12 15:16:31 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   // create a graph
 | 
					
						
							| 
									
										
										
										
											2013-08-06 06:31:44 +08:00
										 |  |  |   GaussianFactorGraph fg; | 
					
						
							|  |  |  |   Ordering ordering; | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  |   boost::tie(fg,ordering) = createSmoother(7); | 
					
						
							| 
									
										
										
										
											2010-07-12 15:16:31 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   // optimize the graph
 | 
					
						
							| 
									
										
										
										
											2013-08-06 06:31:44 +08:00
										 |  |  |   GaussianJunctionTree tree(fg); | 
					
						
							|  |  |  |   VectorValues actual = tree.optimize(&EliminateQR); | 
					
						
							| 
									
										
										
										
											2010-07-19 04:23:23 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   // verify
 | 
					
						
							| 
									
										
										
										
											2013-08-06 06:31:44 +08:00
										 |  |  |   VectorValues expected(vector<size_t>(7,2)); // expected solution
 | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   Vector v = Vector_(2, 0., 0.); | 
					
						
							|  |  |  |   for (int i=1; i<=7; i++) | 
					
						
							|  |  |  |     expected[ordering[X(i)]] = v; | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  |   EXPECT(assert_equal(expected,actual)); | 
					
						
							| 
									
										
										
										
											2010-07-19 04:23:23 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2012-06-30 09:44:00 +08:00
										 |  |  | TEST( GaussianJunctionTreeB, optimizeMultiFrontal2) | 
					
						
							| 
									
										
										
										
											2010-07-19 04:23:23 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   // create a graph
 | 
					
						
							|  |  |  |   example::Graph nlfg = createNonlinearFactorGraph(); | 
					
						
							|  |  |  |   Values noisy = createNoisyValues(); | 
					
						
							| 
									
										
										
										
											2013-08-06 06:31:44 +08:00
										 |  |  |   Ordering ordering; ordering += X(1),X(2),L(1); | 
					
						
							|  |  |  |   GaussianFactorGraph fg = *nlfg.linearize(noisy, ordering); | 
					
						
							| 
									
										
										
										
											2010-07-19 04:23:23 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   // optimize the graph
 | 
					
						
							| 
									
										
										
										
											2013-08-06 06:31:44 +08:00
										 |  |  |   GaussianJunctionTree tree(fg); | 
					
						
							|  |  |  |   VectorValues actual = tree.optimize(&EliminateQR); | 
					
						
							| 
									
										
										
										
											2010-07-12 15:16:31 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   // verify
 | 
					
						
							| 
									
										
										
										
											2013-08-06 06:31:44 +08:00
										 |  |  |   VectorValues expected = createCorrectDelta(ordering); // expected solution
 | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  |   EXPECT(assert_equal(expected,actual)); | 
					
						
							| 
									
										
										
										
											2010-07-12 15:16:31 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2012-06-30 09:44:00 +08:00
										 |  |  | TEST(GaussianJunctionTreeB, slamlike) { | 
					
						
							| 
									
										
										
										
											2012-02-03 00:16:46 +08:00
										 |  |  |   Values init; | 
					
						
							| 
									
										
										
										
											2012-07-24 06:43:17 +08:00
										 |  |  |   NonlinearFactorGraph newfactors; | 
					
						
							|  |  |  |   NonlinearFactorGraph fullgraph; | 
					
						
							| 
									
										
										
										
											2012-06-23 03:36:49 +08:00
										 |  |  |   SharedDiagonal odoNoise = noiseModel::Diagonal::Sigmas(Vector_(3, 0.1, 0.1, M_PI/100.0)); | 
					
						
							|  |  |  |   SharedDiagonal brNoise = noiseModel::Diagonal::Sigmas(Vector_(2, M_PI/100.0, 0.1)); | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   size_t i = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-24 06:43:17 +08:00
										 |  |  |   newfactors = NonlinearFactorGraph(); | 
					
						
							|  |  |  |   newfactors.add(PriorFactor<Pose2>(X(0), Pose2(0.0, 0.0, 0.0), odoNoise)); | 
					
						
							| 
									
										
										
										
											2012-06-03 03:28:21 +08:00
										 |  |  |   init.insert(X(0), Pose2(0.01, 0.01, 0.01)); | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  |   fullgraph.push_back(newfactors); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   for( ; i<5; ++i) { | 
					
						
							| 
									
										
										
										
											2012-07-24 06:43:17 +08:00
										 |  |  |     newfactors = NonlinearFactorGraph(); | 
					
						
							|  |  |  |     newfactors.add(BetweenFactor<Pose2>(X(i), X(i+1), Pose2(1.0, 0.0, 0.0), odoNoise)); | 
					
						
							| 
									
										
										
										
											2012-06-03 03:28:21 +08:00
										 |  |  |     init.insert(X(i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  |     fullgraph.push_back(newfactors); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-24 06:43:17 +08:00
										 |  |  |   newfactors = NonlinearFactorGraph(); | 
					
						
							|  |  |  |   newfactors.add(BetweenFactor<Pose2>(X(i), X(i+1), Pose2(1.0, 0.0, 0.0), odoNoise)); | 
					
						
							|  |  |  |   newfactors.add(BearingRangeFactor<Pose2,Point2>(X(i), L(0), Rot2::fromAngle(M_PI/4.0), 5.0, brNoise)); | 
					
						
							|  |  |  |   newfactors.add(BearingRangeFactor<Pose2,Point2>(X(i), L(1), Rot2::fromAngle(-M_PI/4.0), 5.0, brNoise)); | 
					
						
							| 
									
										
										
										
											2012-06-03 03:28:21 +08:00
										 |  |  |   init.insert(X(i+1), Pose2(1.01, 0.01, 0.01)); | 
					
						
							|  |  |  |   init.insert(L(0), Point2(5.0/sqrt(2.0), 5.0/sqrt(2.0))); | 
					
						
							|  |  |  |   init.insert(L(1), Point2(5.0/sqrt(2.0), -5.0/sqrt(2.0))); | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  |   fullgraph.push_back(newfactors); | 
					
						
							|  |  |  |   ++ i; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   for( ; i<5; ++i) { | 
					
						
							| 
									
										
										
										
											2012-07-24 06:43:17 +08:00
										 |  |  |     newfactors = NonlinearFactorGraph(); | 
					
						
							|  |  |  |     newfactors.add(BetweenFactor<Pose2>(X(i), X(i+1), Pose2(1.0, 0.0, 0.0), odoNoise)); | 
					
						
							| 
									
										
										
										
											2012-06-03 03:28:21 +08:00
										 |  |  |     init.insert(X(i+1), Pose2(double(i+1)+0.1, -0.1, 0.01)); | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  |     fullgraph.push_back(newfactors); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-24 06:43:17 +08:00
										 |  |  |   newfactors = NonlinearFactorGraph(); | 
					
						
							|  |  |  |   newfactors.add(BetweenFactor<Pose2>(X(i), X(i+1), Pose2(1.0, 0.0, 0.0), odoNoise)); | 
					
						
							|  |  |  |   newfactors.add(BearingRangeFactor<Pose2,Point2>(X(i), L(0), Rot2::fromAngle(M_PI/4.0 + M_PI/16.0), 4.5, brNoise)); | 
					
						
							|  |  |  |   newfactors.add(BearingRangeFactor<Pose2,Point2>(X(i), L(1), Rot2::fromAngle(-M_PI/4.0 + M_PI/16.0), 4.5, brNoise)); | 
					
						
							| 
									
										
										
										
											2012-06-03 03:28:21 +08:00
										 |  |  |   init.insert(X(i+1), Pose2(6.9, 0.1, 0.01)); | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  |   fullgraph.push_back(newfactors); | 
					
						
							|  |  |  |   ++ i; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Compare solutions
 | 
					
						
							| 
									
										
										
										
											2013-08-06 06:31:44 +08:00
										 |  |  |   Ordering ordering = *fullgraph.orderingCOLAMD(init); | 
					
						
							|  |  |  |   GaussianFactorGraph linearized = *fullgraph.linearize(init, ordering); | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-06 06:31:44 +08:00
										 |  |  |   GaussianJunctionTree gjt(linearized); | 
					
						
							|  |  |  |   VectorValues deltaactual = gjt.optimize(&EliminateQR); | 
					
						
							| 
									
										
										
										
											2012-02-03 00:16:46 +08:00
										 |  |  |   Values actual = init.retract(deltaactual, ordering); | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-06 06:31:44 +08:00
										 |  |  |   GaussianBayesNet gbn = *GaussianSequentialSolver(linearized).eliminate(); | 
					
						
							|  |  |  |   VectorValues delta = optimize(gbn); | 
					
						
							| 
									
										
										
										
											2012-02-03 00:16:46 +08:00
										 |  |  |   Values expected = init.retract(delta, ordering); | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-06-14 00:55:31 +08:00
										 |  |  |   EXPECT(assert_equal(expected, actual)); | 
					
						
							| 
									
										
										
										
											2011-09-23 10:50:46 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2012-06-30 09:44:00 +08:00
										 |  |  | TEST(GaussianJunctionTreeB, simpleMarginal) { | 
					
						
							| 
									
										
										
										
											2011-09-23 10:50:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-06 06:31:44 +08:00
										 |  |  |   typedef BayesTree<GaussianConditional> GaussianBayesTree; | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-23 10:50:46 +08:00
										 |  |  |   // Create a simple graph
 | 
					
						
							| 
									
										
										
										
											2012-07-24 06:43:17 +08:00
										 |  |  |   NonlinearFactorGraph fg; | 
					
						
							|  |  |  |   fg.add(PriorFactor<Pose2>(X(0), Pose2(), noiseModel::Isotropic::Sigma(3, 10.0))); | 
					
						
							|  |  |  |   fg.add(BetweenFactor<Pose2>(X(0), X(1), Pose2(1.0, 0.0, 0.0), noiseModel::Diagonal::Sigmas(Vector_(3, 10.0, 1.0, 1.0)))); | 
					
						
							| 
									
										
										
										
											2011-09-23 10:50:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-02-03 00:16:46 +08:00
										 |  |  |   Values init; | 
					
						
							| 
									
										
										
										
											2012-06-03 03:28:21 +08:00
										 |  |  |   init.insert(X(0), Pose2()); | 
					
						
							|  |  |  |   init.insert(X(1), Pose2(1.0, 0.0, 0.0)); | 
					
						
							| 
									
										
										
										
											2011-09-23 10:50:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-06 06:31:44 +08:00
										 |  |  |   Ordering ordering; | 
					
						
							| 
									
										
										
										
											2012-06-03 03:28:21 +08:00
										 |  |  |   ordering += X(1), X(0); | 
					
						
							| 
									
										
										
										
											2011-09-23 10:50:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-06 06:31:44 +08:00
										 |  |  |   GaussianFactorGraph gfg = *fg.linearize(init, ordering); | 
					
						
							| 
									
										
										
										
											2011-09-23 10:50:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // Compute marginals with both sequential and multifrontal
 | 
					
						
							|  |  |  |   Matrix expected = GaussianSequentialSolver(gfg).marginalCovariance(1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Matrix actual1 = GaussianMultifrontalSolver(gfg).marginalCovariance(1); | 
					
						
							|  |  |  |    | 
					
						
							|  |  |  |   // Compute marginal directly from marginal factor
 | 
					
						
							| 
									
										
										
										
											2013-08-06 06:31:44 +08:00
										 |  |  |   GaussianFactor::shared_ptr marginalFactor = GaussianMultifrontalSolver(gfg).marginalFactor(1); | 
					
						
							|  |  |  |   JacobianFactor::shared_ptr marginalJacobian = boost::dynamic_pointer_cast<JacobianFactor>(marginalFactor); | 
					
						
							| 
									
										
										
										
											2011-09-23 10:50:46 +08:00
										 |  |  |   Matrix actual2 = inverse(marginalJacobian->getA(marginalJacobian->begin()).transpose() * marginalJacobian->getA(marginalJacobian->begin())); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Compute marginal directly from BayesTree
 | 
					
						
							|  |  |  |   GaussianBayesTree gbt; | 
					
						
							| 
									
										
										
										
											2013-08-06 06:31:44 +08:00
										 |  |  |   gbt.insert(GaussianJunctionTree(gfg).eliminate(EliminateCholesky)); | 
					
						
							|  |  |  |   marginalFactor = gbt.marginalFactor(1, EliminateCholesky); | 
					
						
							|  |  |  |   marginalJacobian = boost::dynamic_pointer_cast<JacobianFactor>(marginalFactor); | 
					
						
							| 
									
										
										
										
											2011-09-23 10:50:46 +08:00
										 |  |  |   Matrix actual3 = inverse(marginalJacobian->getA(marginalJacobian->begin()).transpose() * marginalJacobian->getA(marginalJacobian->begin())); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   EXPECT(assert_equal(expected, actual1)); | 
					
						
							|  |  |  |   EXPECT(assert_equal(expected, actual2)); | 
					
						
							|  |  |  |   EXPECT(assert_equal(expected, actual3)); | 
					
						
							| 
									
										
										
										
											2010-10-09 06:04:47 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-06 21:44:22 +08:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-12 15:16:31 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | int main() { TestResult tr; return TestRegistry::runAllTests(tr);} | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2013-08-06 21:44:22 +08:00
										 |  |  | 
 |