| 
									
										
										
										
											2009-10-29 13:39:13 +08:00
										 |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2009-11-01 03:53:20 +08:00
										 |  |  |  * @file    testSymbolicFactorGraph.cpp | 
					
						
							|  |  |  |  * @brief   Unit tests for a symbolic Factor Graph | 
					
						
							| 
									
										
										
										
											2009-10-29 13:39:13 +08:00
										 |  |  |  * @author  Frank Dellaert | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-31 23:24:22 +08:00
										 |  |  | #include <boost/assign/std/list.hpp> // for operator +=
 | 
					
						
							|  |  |  | using namespace boost::assign; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-29 13:39:13 +08:00
										 |  |  | #include <CppUnitLite/TestHarness.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-02 11:50:30 +08:00
										 |  |  | #include "Ordering.h"
 | 
					
						
							| 
									
										
										
										
											2009-10-29 13:39:13 +08:00
										 |  |  | #include "smallExample.h"
 | 
					
						
							|  |  |  | #include "SymbolicFactorGraph.h"
 | 
					
						
							| 
									
										
										
										
											2009-11-01 03:53:20 +08:00
										 |  |  | #include "SymbolicBayesNet.h"
 | 
					
						
							| 
									
										
										
										
											2009-11-19 01:27:27 +08:00
										 |  |  | #include "FactorGraph-inl.h"
 | 
					
						
							| 
									
										
										
										
											2009-10-29 13:39:13 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | using namespace std; | 
					
						
							|  |  |  | using namespace gtsam; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | TEST( SymbolicFactorGraph, symbolicFactorGraph ) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	// construct expected symbolic graph
 | 
					
						
							|  |  |  | 	SymbolicFactorGraph expected; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-31 23:24:22 +08:00
										 |  |  | 	list<string> f1_keys; f1_keys += "x1"; | 
					
						
							| 
									
										
										
										
											2009-10-29 13:39:13 +08:00
										 |  |  | 	SymbolicFactor::shared_ptr f1(new SymbolicFactor(f1_keys)); | 
					
						
							|  |  |  | 	expected.push_back(f1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	list<string> f2_keys; f2_keys.push_back("x1"); f2_keys.push_back("x2"); | 
					
						
							|  |  |  | 	SymbolicFactor::shared_ptr f2(new SymbolicFactor(f2_keys)); | 
					
						
							|  |  |  | 	expected.push_back(f2); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	list<string> f3_keys; f3_keys.push_back("l1"); f3_keys.push_back("x1"); | 
					
						
							|  |  |  | 	SymbolicFactor::shared_ptr f3(new SymbolicFactor(f3_keys)); | 
					
						
							|  |  |  | 	expected.push_back(f3); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	list<string> f4_keys; f4_keys.push_back("l1"); f4_keys.push_back("x2"); | 
					
						
							|  |  |  | 	SymbolicFactor::shared_ptr f4(new SymbolicFactor(f4_keys)); | 
					
						
							|  |  |  | 	expected.push_back(f4); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// construct it from the factor graph graph
 | 
					
						
							| 
									
										
										
										
											2009-11-13 00:16:32 +08:00
										 |  |  | 	GaussianFactorGraph factorGraph = createGaussianFactorGraph(); | 
					
						
							| 
									
										
										
										
											2009-10-29 13:39:13 +08:00
										 |  |  | 	SymbolicFactorGraph actual(factorGraph); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	CHECK(assert_equal(expected, actual)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | TEST( SymbolicFactorGraph, findAndRemoveFactors ) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	// construct it from the factor graph graph
 | 
					
						
							| 
									
										
										
										
											2009-11-13 00:16:32 +08:00
										 |  |  | 	GaussianFactorGraph factorGraph = createGaussianFactorGraph(); | 
					
						
							| 
									
										
										
										
											2009-10-29 13:39:13 +08:00
										 |  |  | 	SymbolicFactorGraph actual(factorGraph); | 
					
						
							|  |  |  |   SymbolicFactor::shared_ptr f1 = actual[0]; | 
					
						
							|  |  |  |   SymbolicFactor::shared_ptr f3 = actual[2]; | 
					
						
							|  |  |  | 	actual.findAndRemoveFactors("x2"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// construct expected graph after find_factors_and_remove
 | 
					
						
							|  |  |  | 	SymbolicFactorGraph expected; | 
					
						
							|  |  |  | 	SymbolicFactor::shared_ptr null; | 
					
						
							|  |  |  | 	expected.push_back(f1); | 
					
						
							|  |  |  | 	expected.push_back(null); | 
					
						
							|  |  |  | 	expected.push_back(f3); | 
					
						
							|  |  |  | 	expected.push_back(null); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	CHECK(assert_equal(expected, actual)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | TEST( SymbolicFactorGraph, factors) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	// create a test graph
 | 
					
						
							| 
									
										
										
										
											2009-11-13 00:16:32 +08:00
										 |  |  | 	GaussianFactorGraph factorGraph = createGaussianFactorGraph(); | 
					
						
							| 
									
										
										
										
											2009-10-29 13:39:13 +08:00
										 |  |  | 	SymbolicFactorGraph fg(factorGraph); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// ask for all factor indices connected to x1
 | 
					
						
							|  |  |  | 	list<int> x1_factors = fg.factors("x1"); | 
					
						
							|  |  |  | 	int x1_indices[] = { 0, 1, 2 }; | 
					
						
							|  |  |  | 	list<int> x1_expected(x1_indices, x1_indices + 3); | 
					
						
							|  |  |  | 	CHECK(x1_factors==x1_expected); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// ask for all factor indices connected to x2
 | 
					
						
							|  |  |  | 	list<int> x2_factors = fg.factors("x2"); | 
					
						
							|  |  |  | 	int x2_indices[] = { 1, 3 }; | 
					
						
							|  |  |  | 	list<int> x2_expected(x2_indices, x2_indices + 2); | 
					
						
							|  |  |  | 	CHECK(x2_factors==x2_expected); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2009-11-19 01:27:27 +08:00
										 |  |  | TEST( SymbolicFactorGraph, removeAndCombineFactors ) | 
					
						
							| 
									
										
										
										
											2009-10-29 13:39:13 +08:00
										 |  |  | { | 
					
						
							|  |  |  | 	// create a test graph
 | 
					
						
							| 
									
										
										
										
											2009-11-13 00:16:32 +08:00
										 |  |  | 	GaussianFactorGraph factorGraph = createGaussianFactorGraph(); | 
					
						
							| 
									
										
										
										
											2009-10-29 13:39:13 +08:00
										 |  |  | 	SymbolicFactorGraph fg(factorGraph); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // combine all factors connected to x1
 | 
					
						
							| 
									
										
										
										
											2009-11-11 13:12:45 +08:00
										 |  |  |   SymbolicFactor::shared_ptr actual = removeAndCombineFactors(fg,"x1"); | 
					
						
							| 
									
										
										
										
											2009-10-29 13:39:13 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	list<string> keys; keys.push_back("l1"); keys.push_back("x1"); keys.push_back("x2"); | 
					
						
							|  |  |  |   SymbolicFactor expected(keys); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // check if the two factors are the same
 | 
					
						
							|  |  |  |   CHECK(assert_equal(expected,*actual)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-29 22:34:34 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2009-11-19 01:27:27 +08:00
										 |  |  | TEST( SymbolicFactorGraph, eliminateOne ) | 
					
						
							| 
									
										
										
										
											2009-10-29 22:34:34 +08:00
										 |  |  | { | 
					
						
							|  |  |  | 	// create a test graph
 | 
					
						
							| 
									
										
										
										
											2009-11-13 00:16:32 +08:00
										 |  |  | 	GaussianFactorGraph factorGraph = createGaussianFactorGraph(); | 
					
						
							| 
									
										
										
										
											2009-10-29 22:34:34 +08:00
										 |  |  | 	SymbolicFactorGraph fg(factorGraph); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// eliminate
 | 
					
						
							| 
									
										
										
										
											2009-11-08 05:03:30 +08:00
										 |  |  | 	SymbolicConditional::shared_ptr actual = fg.eliminateOne("x1"); | 
					
						
							| 
									
										
										
										
											2009-10-29 22:34:34 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // create expected symbolic Conditional
 | 
					
						
							| 
									
										
										
										
											2009-11-02 11:50:30 +08:00
										 |  |  |   SymbolicConditional expected("x1","l1","x2"); | 
					
						
							| 
									
										
										
										
											2009-10-29 22:34:34 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   CHECK(assert_equal(expected,*actual)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-30 11:48:32 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2009-11-13 00:16:32 +08:00
										 |  |  | TEST( GaussianFactorGraph, eliminate ) | 
					
						
							| 
									
										
										
										
											2009-10-30 11:48:32 +08:00
										 |  |  | { | 
					
						
							|  |  |  |   // create expected Chordal bayes Net
 | 
					
						
							| 
									
										
										
										
											2009-11-02 11:50:30 +08:00
										 |  |  |   SymbolicConditional::shared_ptr x2(new SymbolicConditional("x2", "l1", "x1")); | 
					
						
							|  |  |  |   SymbolicConditional::shared_ptr l1(new SymbolicConditional("l1", "x1")); | 
					
						
							|  |  |  |   SymbolicConditional::shared_ptr x1(new SymbolicConditional("x1")); | 
					
						
							| 
									
										
										
										
											2009-10-30 11:48:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-01 03:53:20 +08:00
										 |  |  |   SymbolicBayesNet expected; | 
					
						
							| 
									
										
										
										
											2009-11-02 13:17:44 +08:00
										 |  |  |   expected.push_back(x2); | 
					
						
							|  |  |  |   expected.push_back(l1); | 
					
						
							|  |  |  |   expected.push_back(x1); | 
					
						
							| 
									
										
										
										
											2009-10-30 11:48:32 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // create a test graph
 | 
					
						
							| 
									
										
										
										
											2009-11-13 00:16:32 +08:00
										 |  |  | 	GaussianFactorGraph factorGraph = createGaussianFactorGraph(); | 
					
						
							| 
									
										
										
										
											2009-10-30 11:48:32 +08:00
										 |  |  | 	SymbolicFactorGraph fg(factorGraph); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// eliminate it
 | 
					
						
							|  |  |  | 	Ordering ordering; | 
					
						
							| 
									
										
										
										
											2009-10-31 23:24:22 +08:00
										 |  |  | 	ordering += "x2","l1","x1"; | 
					
						
							| 
									
										
										
										
											2009-11-09 15:04:26 +08:00
										 |  |  |   SymbolicBayesNet actual = fg.eliminate(ordering); | 
					
						
							| 
									
										
										
										
											2009-10-30 11:48:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-09 15:04:26 +08:00
										 |  |  |   CHECK(assert_equal(expected,actual)); | 
					
						
							| 
									
										
										
										
											2009-10-30 11:48:32 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-19 01:27:27 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | TEST( SymbolicFactorGraph, constructFromBayesNet ) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	// create expected factor graph
 | 
					
						
							|  |  |  | 	FactorGraph<SymbolicFactor> expected; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	list<string> f1_keys; f1_keys += "l1","x1","x2"; | 
					
						
							|  |  |  | 	SymbolicFactor::shared_ptr f1(new SymbolicFactor(f1_keys)); | 
					
						
							|  |  |  | 	expected.push_back(f1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	list<string> f2_keys; f2_keys += "x1","l1"; | 
					
						
							|  |  |  | 	SymbolicFactor::shared_ptr f2(new SymbolicFactor(f2_keys)); | 
					
						
							|  |  |  | 	expected.push_back(f2); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	list<string> f3_keys; f3_keys += "x1"; | 
					
						
							|  |  |  | 	SymbolicFactor::shared_ptr f3(new SymbolicFactor(f3_keys)); | 
					
						
							|  |  |  | 	expected.push_back(f3); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // create Bayes Net
 | 
					
						
							|  |  |  |   SymbolicConditional::shared_ptr x2(new SymbolicConditional("x2", "l1", "x1")); | 
					
						
							|  |  |  |   SymbolicConditional::shared_ptr l1(new SymbolicConditional("l1", "x1")); | 
					
						
							|  |  |  |   SymbolicConditional::shared_ptr x1(new SymbolicConditional("x1")); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   SymbolicBayesNet bayesNet; | 
					
						
							|  |  |  |   bayesNet.push_back(x2); | 
					
						
							|  |  |  |   bayesNet.push_back(l1); | 
					
						
							|  |  |  |   bayesNet.push_back(x1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // create actual factor graph from a Bayes Net
 | 
					
						
							|  |  |  | 	FactorGraph<SymbolicFactor> actual(bayesNet); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   CHECK(assert_equal(expected,actual)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-19 14:34:07 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | TEST( SymbolicFactorGraph, push_back ) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	// Create two factor graphs and expected combined graph
 | 
					
						
							|  |  |  | 	SymbolicFactorGraph fg1, fg2, expected; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	list<string> f1_keys; f1_keys += "x1"; | 
					
						
							|  |  |  | 	SymbolicFactor::shared_ptr f1(new SymbolicFactor(f1_keys)); | 
					
						
							|  |  |  | 	fg1.push_back(f1); | 
					
						
							|  |  |  | 	expected.push_back(f1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	list<string> f2_keys; f2_keys.push_back("x1"); f2_keys.push_back("x2"); | 
					
						
							|  |  |  | 	SymbolicFactor::shared_ptr f2(new SymbolicFactor(f2_keys)); | 
					
						
							|  |  |  | 	fg1.push_back(f2); | 
					
						
							|  |  |  | 	expected.push_back(f2); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	list<string> f3_keys; f3_keys.push_back("l1"); f3_keys.push_back("x1"); | 
					
						
							|  |  |  | 	SymbolicFactor::shared_ptr f3(new SymbolicFactor(f3_keys)); | 
					
						
							|  |  |  | 	fg2.push_back(f3); | 
					
						
							|  |  |  | 	expected.push_back(f3); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	list<string> f4_keys; f4_keys.push_back("l1"); f4_keys.push_back("x2"); | 
					
						
							|  |  |  | 	SymbolicFactor::shared_ptr f4(new SymbolicFactor(f4_keys)); | 
					
						
							|  |  |  | 	fg2.push_back(f4); | 
					
						
							|  |  |  | 	expected.push_back(f4); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// combine
 | 
					
						
							|  |  |  | 	SymbolicFactorGraph actual = combine(fg1,fg2); | 
					
						
							|  |  |  | 	CHECK(assert_equal(expected, actual)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// combine using push_back
 | 
					
						
							|  |  |  | 	fg1.push_back(fg2); | 
					
						
							|  |  |  | 	CHECK(assert_equal(expected, fg1)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-29 13:39:13 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | int main() { | 
					
						
							|  |  |  | 	TestResult tr; | 
					
						
							|  |  |  | 	return TestRegistry::runAllTests(tr); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | /* ************************************************************************* */ |