| 
									
										
										
										
											2009-10-28 04:23:19 +08:00
										 |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2009-11-01 03:53:20 +08:00
										 |  |  |  * @file    testSymbolicBayesNet.cpp | 
					
						
							| 
									
										
										
										
											2009-10-28 04:23:19 +08:00
										 |  |  |  * @brief   Unit tests for a symbolic Bayes chain | 
					
						
							|  |  |  |  * @author  Frank Dellaert | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-31 13:12:39 +08:00
										 |  |  | #include <boost/assign/list_inserter.hpp> // for 'insert()'
 | 
					
						
							| 
									
										
										
										
											2009-10-31 23:24:22 +08:00
										 |  |  | #include <boost/assign/std/list.hpp> // for operator +=
 | 
					
						
							| 
									
										
										
										
											2009-10-31 13:12:39 +08:00
										 |  |  | using namespace boost::assign; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-28 04:23:19 +08:00
										 |  |  | #include <CppUnitLite/TestHarness.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-18 03:34:57 +08:00
										 |  |  | #define GTSAM_MAGIC_KEY
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-02 11:50:30 +08:00
										 |  |  | #include "Ordering.h"
 | 
					
						
							| 
									
										
										
										
											2009-10-28 04:23:19 +08:00
										 |  |  | #include "smallExample.h"
 | 
					
						
							| 
									
										
										
										
											2009-11-01 03:53:20 +08:00
										 |  |  | #include "SymbolicBayesNet.h"
 | 
					
						
							| 
									
										
										
										
											2009-10-31 23:24:22 +08:00
										 |  |  | #include "SymbolicFactorGraph.h"
 | 
					
						
							| 
									
										
										
										
											2009-10-28 04:23:19 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-29 12:11:23 +08:00
										 |  |  | using namespace std; | 
					
						
							| 
									
										
										
										
											2009-10-28 04:23:19 +08:00
										 |  |  | using namespace gtsam; | 
					
						
							| 
									
										
										
										
											2010-01-19 13:33:44 +08:00
										 |  |  | using namespace example; | 
					
						
							| 
									
										
										
										
											2009-10-28 04:23:19 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-07 14:11:19 +08:00
										 |  |  | Symbol _B_('B', 0), _L_('L', 0); | 
					
						
							|  |  |  | SymbolicConditional::shared_ptr | 
					
						
							|  |  |  | 	B(new SymbolicConditional(_B_)), | 
					
						
							|  |  |  | 	L(new SymbolicConditional(_L_, _B_)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | TEST( SymbolicBayesNet, equals ) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	SymbolicBayesNet f1; | 
					
						
							|  |  |  | 	f1.push_back(B); | 
					
						
							|  |  |  | 	f1.push_back(L); | 
					
						
							|  |  |  | 	SymbolicBayesNet f2; | 
					
						
							|  |  |  | 	f2.push_back(L); | 
					
						
							|  |  |  | 	f2.push_back(B); | 
					
						
							|  |  |  | 	CHECK(f1.equals(f1)); | 
					
						
							|  |  |  | 	CHECK(!f1.equals(f2)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-29 12:11:23 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2009-11-01 03:53:20 +08:00
										 |  |  | TEST( SymbolicBayesNet, constructor ) | 
					
						
							| 
									
										
										
										
											2009-10-28 04:23:19 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-10-28 10:57:38 +08:00
										 |  |  | 	// Create manually
 | 
					
						
							| 
									
										
										
										
											2009-10-31 13:12:39 +08:00
										 |  |  | 	SymbolicConditional::shared_ptr | 
					
						
							| 
									
										
										
										
											2009-11-02 11:50:30 +08:00
										 |  |  | 		x2(new SymbolicConditional("x2","l1", "x1")), | 
					
						
							|  |  |  | 		l1(new SymbolicConditional("l1","x1")), | 
					
						
							|  |  |  | 		x1(new SymbolicConditional("x1")); | 
					
						
							| 
									
										
										
										
											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-28 10:57:38 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Create from a factor graph
 | 
					
						
							| 
									
										
										
										
											2009-11-13 00:16:32 +08:00
										 |  |  | 	GaussianFactorGraph factorGraph = createGaussianFactorGraph(); | 
					
						
							| 
									
										
										
										
											2009-10-31 23:24:22 +08:00
										 |  |  | 	SymbolicFactorGraph fg(factorGraph); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// eliminate it
 | 
					
						
							| 
									
										
										
										
											2009-10-29 12:11:23 +08:00
										 |  |  | 	Ordering ordering; | 
					
						
							| 
									
										
										
										
											2009-10-31 13:12:39 +08:00
										 |  |  | 	ordering += "x2","l1","x1"; | 
					
						
							| 
									
										
										
										
											2009-11-09 15:04:26 +08:00
										 |  |  |   SymbolicBayesNet actual = fg.eliminate(ordering); | 
					
						
							| 
									
										
										
										
											2009-10-31 13:12:39 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-09 15:04:26 +08:00
										 |  |  |   CHECK(assert_equal(expected, actual)); | 
					
						
							| 
									
										
										
										
											2009-10-28 04:23:19 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-08 10:49:18 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | TEST( SymbolicBayesNet, pop_front ) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	SymbolicConditional::shared_ptr | 
					
						
							|  |  |  | 		A(new SymbolicConditional("A","B","C")), | 
					
						
							|  |  |  | 		B(new SymbolicConditional("B","C")), | 
					
						
							|  |  |  | 		C(new SymbolicConditional("C")); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Expected after pop_front
 | 
					
						
							|  |  |  | 	SymbolicBayesNet expected; | 
					
						
							|  |  |  | 	expected.push_back(B); | 
					
						
							|  |  |  | 	expected.push_back(C); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Actual
 | 
					
						
							|  |  |  | 	SymbolicBayesNet actual; | 
					
						
							|  |  |  | 	actual.push_back(A); | 
					
						
							|  |  |  | 	actual.push_back(B); | 
					
						
							|  |  |  | 	actual.push_back(C); | 
					
						
							|  |  |  | 	actual.pop_front(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   CHECK(assert_equal(expected,actual)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-09 06:50:26 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | TEST( SymbolicBayesNet, combine ) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	SymbolicConditional::shared_ptr | 
					
						
							|  |  |  | 		A(new SymbolicConditional("A","B","C")), | 
					
						
							|  |  |  | 		B(new SymbolicConditional("B","C")), | 
					
						
							|  |  |  | 		C(new SymbolicConditional("C")); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// p(A|BC)
 | 
					
						
							|  |  |  | 	SymbolicBayesNet p_ABC; | 
					
						
							|  |  |  | 	p_ABC.push_back(A); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// P(BC)=P(B|C)P(C)
 | 
					
						
							|  |  |  | 	SymbolicBayesNet p_BC; | 
					
						
							|  |  |  | 	p_BC.push_back(B); | 
					
						
							|  |  |  | 	p_BC.push_back(C); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// P(ABC) = P(A|BC) P(BC)
 | 
					
						
							|  |  |  | 	p_ABC.push_back(p_BC); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	SymbolicBayesNet expected; | 
					
						
							|  |  |  | 	expected.push_back(A); | 
					
						
							|  |  |  | 	expected.push_back(B); | 
					
						
							|  |  |  | 	expected.push_back(C); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   CHECK(assert_equal(expected,p_ABC)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-28 04:23:19 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | int main() { | 
					
						
							|  |  |  | 	TestResult tr; | 
					
						
							|  |  |  | 	return TestRegistry::runAllTests(tr); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | /* ************************************************************************* */ |