107 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C++
		
	
	
			
		
		
	
	
			107 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C++
		
	
	
| /*
 | |
|  * testGaussianJunctionTree.cpp
 | |
|  *
 | |
|  *   Created on: Jul 8, 2010
 | |
|  *       Author: nikai
 | |
|  *  Description:
 | |
|  */
 | |
| 
 | |
| #include <iostream>
 | |
| #include <gtsam/CppUnitLite/TestHarness.h>
 | |
| 
 | |
| #include <boost/assign/list_of.hpp>
 | |
| #include <boost/assign/std/list.hpp> // for operator +=
 | |
| #include <boost/assign/std/set.hpp> // for operator +=
 | |
| using namespace boost::assign;
 | |
| 
 | |
| #define GTSAM_MAGIC_KEY
 | |
| 
 | |
| #include <gtsam/inference/Ordering.h>
 | |
| #include <gtsam/linear/GaussianJunctionTree.h>
 | |
| #include <gtsam/slam/smallExample.h>
 | |
| 
 | |
| using namespace std;
 | |
| using namespace gtsam;
 | |
| using namespace example;
 | |
| 
 | |
| /* ************************************************************************* *
 | |
|  Bayes tree for smoother with "nested dissection" ordering:
 | |
| 	 C1		 x5 x6 x4
 | |
| 	 C2		  x3 x2 : x4
 | |
| 	 C3		    x1 : x2
 | |
| 	 C4		  x7 : x6
 | |
| /* ************************************************************************* */
 | |
| TEST( GaussianJunctionTree, constructor2 )
 | |
| {
 | |
| 	// create a graph
 | |
| 	GaussianFactorGraph fg = createSmoother(7);
 | |
| 
 | |
| 	// create an ordering
 | |
| 	Ordering ordering; ordering += "x1","x3","x5","x7","x2","x6","x4";
 | |
| 	GaussianJunctionTree actual(fg, ordering);
 | |
| 
 | |
| 	Ordering frontal1; frontal1 += "x5", "x6", "x4";
 | |
| 	Ordering frontal2; frontal2 += "x3", "x2";
 | |
| 	Ordering frontal3; frontal3 += "x1";
 | |
| 	Ordering frontal4; frontal4 += "x7";
 | |
| 	Unordered sep1;
 | |
| 	Unordered sep2; sep2 += "x4";
 | |
| 	Unordered sep3; sep3 += "x2";
 | |
| 	Unordered sep4; sep4 += "x6";
 | |
| 	CHECK(assert_equal(frontal1, actual.root()->frontal_));
 | |
| 	CHECK(assert_equal(sep1,     actual.root()->separator_));
 | |
| 	LONGS_EQUAL(5,               actual.root()->size());
 | |
| 	CHECK(assert_equal(frontal2, actual.root()->children_[0]->frontal_));
 | |
| 	CHECK(assert_equal(sep2,     actual.root()->children_[0]->separator_));
 | |
| 	LONGS_EQUAL(4,               actual.root()->children_[0]->size());
 | |
| 	CHECK(assert_equal(frontal3, actual.root()->children_[0]->children_[0]->frontal_));
 | |
| 	CHECK(assert_equal(sep3,     actual.root()->children_[0]->children_[0]->separator_));
 | |
| 	LONGS_EQUAL(2,               actual.root()->children_[0]->children_[0]->size());
 | |
| 	CHECK(assert_equal(frontal4, actual.root()->children_[1]->frontal_));
 | |
| 	CHECK(assert_equal(sep4,     actual.root()->children_[1]->separator_));
 | |
| 	LONGS_EQUAL(2,               actual.root()->children_[1]->size());
 | |
| }
 | |
| 
 | |
| /* ************************************************************************* */
 | |
| TEST( GaussianJunctionTree, optimizeMultiFrontal )
 | |
| {
 | |
| 	// create a graph
 | |
| 	GaussianFactorGraph fg = createSmoother(7);
 | |
| 
 | |
| 	// create an ordering
 | |
| 	Ordering ordering; ordering += "x1","x3","x5","x7","x2","x6","x4";
 | |
| 
 | |
| 	// optimize the graph
 | |
| 	GaussianJunctionTree tree(fg, ordering);
 | |
| 	VectorConfig actual = tree.optimize();
 | |
| 
 | |
| 	// verify
 | |
| 	VectorConfig expected; // expected solution
 | |
| 	Vector v = Vector_(2, 0., 0.);
 | |
| 	for (int i=1; i<=7; i++)
 | |
| 		expected.insert(symbol('x', i), v);
 | |
|   CHECK(assert_equal(expected,actual));
 | |
| }
 | |
| 
 | |
| /* ************************************************************************* */
 | |
| TEST( GaussianJunctionTree, optimizeMultiFrontal2)
 | |
| {
 | |
| 	// create a graph
 | |
| 	Graph nlfg = createNonlinearFactorGraph();
 | |
| 	Config noisy = createNoisyConfig();
 | |
| 	GaussianFactorGraph fg = *nlfg.linearize(noisy);
 | |
| 
 | |
| 	// optimize the graph
 | |
| 	Ordering ordering; ordering += "x1","x2","l1";
 | |
| 	GaussianJunctionTree tree(fg, ordering);
 | |
| 	VectorConfig actual = tree.optimize();
 | |
| 
 | |
| 	// verify
 | |
| 	VectorConfig expected = createCorrectDelta(); // expected solution
 | |
|   CHECK(assert_equal(expected,actual));
 | |
| }
 | |
| 
 | |
| /* ************************************************************************* */
 | |
| int main() { TestResult tr; return TestRegistry::runAllTests(tr);}
 | |
| /* ************************************************************************* */
 |