| 
									
										
										
										
											2009-10-28 04:23:19 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @file    testBayesTree.cpp | 
					
						
							|  |  |  |  * @brief   Unit tests for Bayes Tree | 
					
						
							|  |  |  |  * @author  Frank Dellaert | 
					
						
							| 
									
										
										
										
											2009-11-23 07:35:13 +08:00
										 |  |  |  * @author  Michael Kaess | 
					
						
							|  |  |  |  * @author  Viorela Ila | 
					
						
							| 
									
										
										
										
											2009-10-28 04:23:19 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-31 23:24:22 +08:00
										 |  |  | #include <boost/assign/std/list.hpp> // for operator +=
 | 
					
						
							|  |  |  | using namespace boost::assign; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-28 04:23:19 +08:00
										 |  |  | #include <CppUnitLite/TestHarness.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-01 03:53:20 +08:00
										 |  |  | #include "SymbolicBayesNet.h"
 | 
					
						
							| 
									
										
										
										
											2009-11-21 11:38:13 +08:00
										 |  |  | #include "SymbolicFactorGraph.h"
 | 
					
						
							| 
									
										
										
										
											2009-11-02 11:50:30 +08:00
										 |  |  | #include "Ordering.h"
 | 
					
						
							| 
									
										
										
										
											2009-10-30 21:03:38 +08:00
										 |  |  | #include "BayesTree-inl.h"
 | 
					
						
							| 
									
										
										
										
											2009-11-02 11:50:30 +08:00
										 |  |  | #include "smallExample.h"
 | 
					
						
							| 
									
										
										
										
											2009-10-28 04:23:19 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | using namespace gtsam; | 
					
						
							| 
									
										
										
										
											2009-10-31 13:12:39 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-13 02:33:14 +08:00
										 |  |  | typedef BayesTree<SymbolicConditional> SymbolicBayesTree; | 
					
						
							| 
									
										
										
										
											2009-12-10 03:39:25 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-24 04:11:10 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | // SLAM example from RSS sqrtSAM paper
 | 
					
						
							|  |  |  | SymbolicConditional::shared_ptr x3(new SymbolicConditional("x3")), | 
					
						
							|  |  |  | 		x2(new SymbolicConditional("x2","x3")), | 
					
						
							|  |  |  | 		x1(new SymbolicConditional("x1","x2","x3")), | 
					
						
							|  |  |  | 		l1(new SymbolicConditional("l1","x1","x2")), | 
					
						
							|  |  |  | 		l2(new SymbolicConditional("l2","x1","x3")); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Bayes Tree for sqrtSAM example
 | 
					
						
							| 
									
										
										
										
											2009-12-28 07:15:36 +08:00
										 |  |  | SymbolicBayesTree createSlamSymbolicBayesTree(){ | 
					
						
							| 
									
										
										
										
											2009-11-24 04:11:10 +08:00
										 |  |  | 	// Create using insert
 | 
					
						
							| 
									
										
										
										
											2009-12-28 07:15:36 +08:00
										 |  |  | 	SymbolicBayesTree bayesTree_slam; | 
					
						
							| 
									
										
										
										
											2009-11-24 04:11:10 +08:00
										 |  |  | 	bayesTree_slam.insert(x3); | 
					
						
							|  |  |  | 	bayesTree_slam.insert(x2); | 
					
						
							|  |  |  | 	bayesTree_slam.insert(x1); | 
					
						
							|  |  |  | 	bayesTree_slam.insert(l2); | 
					
						
							|  |  |  | 	bayesTree_slam.insert(l1); | 
					
						
							|  |  |  | 	return bayesTree_slam; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-08 01:24:05 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-31 13:12:39 +08:00
										 |  |  | // Conditionals for ASIA example from the tutorial with A and D evidence
 | 
					
						
							| 
									
										
										
										
											2009-11-23 02:12:29 +08:00
										 |  |  | SymbolicConditional::shared_ptr | 
					
						
							|  |  |  | 	B(new SymbolicConditional("B")), | 
					
						
							|  |  |  | 	L(new SymbolicConditional("L", "B")), | 
					
						
							|  |  |  | 	E(new SymbolicConditional("E", "B", "L")), | 
					
						
							|  |  |  | 	S(new SymbolicConditional("S", "L", "B")), | 
					
						
							|  |  |  | 	T(new SymbolicConditional("T", "E", "L")), | 
					
						
							|  |  |  | 	X(new SymbolicConditional("X", "E")); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Bayes Tree for Asia example
 | 
					
						
							| 
									
										
										
										
											2009-12-28 07:15:36 +08:00
										 |  |  | SymbolicBayesTree createAsiaSymbolicBayesTree() { | 
					
						
							|  |  |  | 	SymbolicBayesTree bayesTree; | 
					
						
							| 
									
										
										
										
											2009-11-23 02:12:29 +08:00
										 |  |  | 	bayesTree.insert(B); | 
					
						
							|  |  |  | 	bayesTree.insert(L); | 
					
						
							|  |  |  | 	bayesTree.insert(E); | 
					
						
							|  |  |  | 	bayesTree.insert(S); | 
					
						
							|  |  |  | 	bayesTree.insert(T); | 
					
						
							|  |  |  | 	bayesTree.insert(X); | 
					
						
							|  |  |  | 	return bayesTree; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2009-10-31 13:12:39 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | TEST( BayesTree, Front ) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2009-11-04 11:22:29 +08:00
										 |  |  | 	SymbolicBayesNet f1; | 
					
						
							| 
									
										
										
										
											2009-11-02 13:17:44 +08:00
										 |  |  | 	f1.push_back(B); | 
					
						
							|  |  |  | 	f1.push_back(L); | 
					
						
							| 
									
										
										
										
											2009-11-04 11:22:29 +08:00
										 |  |  | 	SymbolicBayesNet f2; | 
					
						
							| 
									
										
										
										
											2009-11-02 13:17:44 +08:00
										 |  |  | 	f2.push_back(L); | 
					
						
							|  |  |  | 	f2.push_back(B); | 
					
						
							| 
									
										
										
										
											2009-10-31 13:12:39 +08:00
										 |  |  | 	CHECK(f1.equals(f1)); | 
					
						
							|  |  |  | 	CHECK(!f1.equals(f2)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2009-10-31 22:12:41 +08:00
										 |  |  | TEST( BayesTree, constructor ) | 
					
						
							| 
									
										
										
										
											2009-10-31 13:12:39 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-10-31 22:12:41 +08:00
										 |  |  | 	// Create using insert
 | 
					
						
							| 
									
										
										
										
											2009-11-23 02:12:29 +08:00
										 |  |  | 	SymbolicBayesTree bayesTree = createAsiaSymbolicBayesTree(); | 
					
						
							| 
									
										
										
										
											2009-10-31 13:12:39 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-31 22:12:41 +08:00
										 |  |  | 	// Check Size
 | 
					
						
							| 
									
										
										
										
											2009-11-19 02:05:12 +08:00
										 |  |  | 	LONGS_EQUAL(4,bayesTree.size()); | 
					
						
							| 
									
										
										
										
											2009-10-31 13:12:39 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Check root
 | 
					
						
							| 
									
										
										
										
											2009-11-02 13:17:44 +08:00
										 |  |  | 	BayesNet<SymbolicConditional> expected_root; | 
					
						
							|  |  |  | 	expected_root.push_back(E); | 
					
						
							| 
									
										
										
										
											2009-11-03 14:29:56 +08:00
										 |  |  | 	expected_root.push_back(L); | 
					
						
							|  |  |  | 	expected_root.push_back(B); | 
					
						
							| 
									
										
										
										
											2009-11-13 02:33:14 +08:00
										 |  |  | 	boost::shared_ptr<SymbolicBayesNet> actual_root = bayesTree.root(); | 
					
						
							| 
									
										
										
										
											2009-11-05 13:29:47 +08:00
										 |  |  | 	CHECK(assert_equal(expected_root,*actual_root)); | 
					
						
							| 
									
										
										
										
											2009-10-28 04:23:19 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-31 22:12:41 +08:00
										 |  |  | 	// Create from symbolic Bayes chain in which we want to discover cliques
 | 
					
						
							| 
									
										
										
										
											2009-11-01 03:53:20 +08:00
										 |  |  | 	SymbolicBayesNet ASIA; | 
					
						
							| 
									
										
										
										
											2009-11-02 13:17:44 +08:00
										 |  |  | 	ASIA.push_back(X); | 
					
						
							|  |  |  | 	ASIA.push_back(T); | 
					
						
							|  |  |  | 	ASIA.push_back(S); | 
					
						
							|  |  |  | 	ASIA.push_back(E); | 
					
						
							|  |  |  | 	ASIA.push_back(L); | 
					
						
							|  |  |  | 	ASIA.push_back(B); | 
					
						
							| 
									
										
										
										
											2009-11-13 02:33:14 +08:00
										 |  |  | 	SymbolicBayesTree bayesTree2(ASIA); | 
					
						
							| 
									
										
										
										
											2009-10-31 13:12:39 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-31 22:12:41 +08:00
										 |  |  | 	// Check whether the same
 | 
					
						
							| 
									
										
										
										
											2009-11-01 00:57:36 +08:00
										 |  |  | 	CHECK(assert_equal(bayesTree,bayesTree2)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-21 11:38:13 +08:00
										 |  |  | /* ************************************************************************* *
 | 
					
						
							| 
									
										
										
										
											2009-11-21 12:59:50 +08:00
										 |  |  | Bayes Tree for testing conversion to a forest of orphans needed for incremental. | 
					
						
							| 
									
										
										
										
											2009-11-21 11:38:13 +08:00
										 |  |  |        A,B | 
					
						
							|  |  |  |    C|A    E|B | 
					
						
							|  |  |  |    D|C    F|E | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | TEST( BayesTree, removePath ) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2009-11-21 12:59:50 +08:00
										 |  |  | 	SymbolicConditional::shared_ptr | 
					
						
							|  |  |  | 			A(new SymbolicConditional("A")), | 
					
						
							| 
									
										
										
										
											2009-11-21 11:38:13 +08:00
										 |  |  | 			B(new SymbolicConditional("B", "A")), | 
					
						
							|  |  |  | 			C(new SymbolicConditional("C", "A")), | 
					
						
							|  |  |  | 			D(new SymbolicConditional("D", "C")), | 
					
						
							|  |  |  | 			E(new SymbolicConditional("E", "B")), | 
					
						
							|  |  |  | 			F(new SymbolicConditional("F", "E")); | 
					
						
							| 
									
										
										
										
											2009-12-28 07:15:36 +08:00
										 |  |  | 	SymbolicBayesTree bayesTree; | 
					
						
							| 
									
										
										
										
											2009-11-21 11:38:13 +08:00
										 |  |  | 	bayesTree.insert(A); | 
					
						
							|  |  |  | 	bayesTree.insert(B); | 
					
						
							|  |  |  | 	bayesTree.insert(C); | 
					
						
							|  |  |  | 	bayesTree.insert(D); | 
					
						
							|  |  |  | 	bayesTree.insert(E); | 
					
						
							|  |  |  | 	bayesTree.insert(F); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-21 12:59:50 +08:00
										 |  |  | 	// remove C, expected outcome: factor graph with ABC,
 | 
					
						
							|  |  |  | 	// Bayes Tree now contains two orphan trees: D|C and E|B,F|E
 | 
					
						
							| 
									
										
										
										
											2009-11-21 11:38:13 +08:00
										 |  |  | 	SymbolicFactorGraph expected; | 
					
						
							| 
									
										
										
										
											2009-11-21 12:59:50 +08:00
										 |  |  | 	expected.push_factor("A","B"); | 
					
						
							|  |  |  | 	expected.push_factor("A"); | 
					
						
							| 
									
										
										
										
											2009-11-21 14:14:53 +08:00
										 |  |  | 	expected.push_factor("A","C"); | 
					
						
							| 
									
										
										
										
											2009-12-28 07:15:36 +08:00
										 |  |  | 	SymbolicBayesTree::Cliques expectedOrphans; | 
					
						
							| 
									
										
										
										
											2009-11-23 01:40:24 +08:00
										 |  |  |   expectedOrphans += bayesTree["D"], bayesTree["E"]; | 
					
						
							| 
									
										
										
										
											2009-11-23 00:04:51 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	FactorGraph<SymbolicFactor> factors; | 
					
						
							| 
									
										
										
										
											2009-12-28 07:15:36 +08:00
										 |  |  | 	SymbolicBayesTree::Cliques orphans; | 
					
						
							| 
									
										
										
										
											2009-11-23 00:04:51 +08:00
										 |  |  | 	boost::tie(factors,orphans) = bayesTree.removePath<SymbolicFactor>(bayesTree["C"]); | 
					
						
							|  |  |  |   CHECK(assert_equal((FactorGraph<SymbolicFactor>)expected, factors)); | 
					
						
							| 
									
										
										
										
											2009-11-23 01:40:24 +08:00
										 |  |  |   CHECK(assert_equal(expectedOrphans, orphans)); | 
					
						
							| 
									
										
										
										
											2009-11-21 11:38:13 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // remove E: factor graph with EB; E|B removed from second orphan tree
 | 
					
						
							| 
									
										
										
										
											2009-11-23 01:40:24 +08:00
										 |  |  | 	SymbolicFactorGraph expected2; | 
					
						
							|  |  |  |   expected2.push_factor("B","E"); | 
					
						
							| 
									
										
										
										
											2009-12-28 07:15:36 +08:00
										 |  |  |   SymbolicBayesTree::Cliques expectedOrphans2; | 
					
						
							| 
									
										
										
										
											2009-11-23 01:40:24 +08:00
										 |  |  |   expectedOrphans2 += bayesTree["F"]; | 
					
						
							| 
									
										
										
										
											2009-11-21 12:59:50 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-23 00:04:51 +08:00
										 |  |  |   boost::tie(factors,orphans) = bayesTree.removePath<SymbolicFactor>(bayesTree["E"]); | 
					
						
							| 
									
										
										
										
											2009-11-23 01:40:24 +08:00
										 |  |  |   CHECK(assert_equal((FactorGraph<SymbolicFactor>)expected2, factors)); | 
					
						
							|  |  |  |   CHECK(assert_equal(expectedOrphans2, orphans)); | 
					
						
							| 
									
										
										
										
											2009-11-21 11:38:13 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-23 02:06:28 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | TEST( BayesTree, removePath2 ) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2009-12-28 07:15:36 +08:00
										 |  |  | 	SymbolicBayesTree bayesTree = createAsiaSymbolicBayesTree(); | 
					
						
							| 
									
										
										
										
											2009-11-23 02:06:28 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-23 02:22:17 +08:00
										 |  |  | 	// Call remove-path with clique B
 | 
					
						
							| 
									
										
										
										
											2009-11-23 02:06:28 +08:00
										 |  |  | 	FactorGraph<SymbolicFactor> factors; | 
					
						
							| 
									
										
										
										
											2009-12-28 07:15:36 +08:00
										 |  |  | 	SymbolicBayesTree::Cliques orphans; | 
					
						
							| 
									
										
										
										
											2009-11-23 02:06:28 +08:00
										 |  |  |   boost::tie(factors,orphans) = bayesTree.removePath<SymbolicFactor>(bayesTree["B"]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Check expected outcome
 | 
					
						
							|  |  |  | 	SymbolicFactorGraph expected; | 
					
						
							|  |  |  | 	expected.push_factor("B","L","E"); | 
					
						
							|  |  |  | 	expected.push_factor("B","L"); | 
					
						
							|  |  |  | 	expected.push_factor("B"); | 
					
						
							|  |  |  |   CHECK(assert_equal((FactorGraph<SymbolicFactor>)expected, factors)); | 
					
						
							| 
									
										
										
										
											2009-12-28 07:15:36 +08:00
										 |  |  | 	SymbolicBayesTree::Cliques expectedOrphans; | 
					
						
							| 
									
										
										
										
											2009-11-23 02:06:28 +08:00
										 |  |  |   expectedOrphans += bayesTree["S"], bayesTree["T"], bayesTree["X"]; | 
					
						
							|  |  |  |   CHECK(assert_equal(expectedOrphans, orphans)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | TEST( BayesTree, removePath3 ) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2009-12-28 07:15:36 +08:00
										 |  |  | 	SymbolicBayesTree bayesTree = createAsiaSymbolicBayesTree(); | 
					
						
							| 
									
										
										
										
											2009-11-23 02:06:28 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Call remove-path with clique S
 | 
					
						
							|  |  |  | 	FactorGraph<SymbolicFactor> factors; | 
					
						
							| 
									
										
										
										
											2009-12-28 07:15:36 +08:00
										 |  |  | 	SymbolicBayesTree::Cliques orphans; | 
					
						
							| 
									
										
										
										
											2009-11-23 02:06:28 +08:00
										 |  |  |   boost::tie(factors,orphans) = bayesTree.removePath<SymbolicFactor>(bayesTree["S"]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Check expected outcome
 | 
					
						
							|  |  |  | 	SymbolicFactorGraph expected; | 
					
						
							|  |  |  | 	expected.push_factor("B","L","E"); | 
					
						
							|  |  |  | 	expected.push_factor("B","L"); | 
					
						
							|  |  |  | 	expected.push_factor("B"); | 
					
						
							|  |  |  | 	expected.push_factor("L","B","S"); | 
					
						
							|  |  |  |   CHECK(assert_equal((FactorGraph<SymbolicFactor>)expected, factors)); | 
					
						
							| 
									
										
										
										
											2009-12-28 07:15:36 +08:00
										 |  |  | 	SymbolicBayesTree::Cliques expectedOrphans; | 
					
						
							| 
									
										
										
										
											2009-11-23 02:06:28 +08:00
										 |  |  |   expectedOrphans += bayesTree["T"], bayesTree["X"]; | 
					
						
							|  |  |  |   CHECK(assert_equal(expectedOrphans, orphans)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-23 01:34:59 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2009-12-28 07:15:36 +08:00
										 |  |  | TEST( BayesTree, removeTop ) | 
					
						
							| 
									
										
										
										
											2009-11-23 01:34:59 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-12-28 07:15:36 +08:00
										 |  |  | 	SymbolicBayesTree bayesTree = createAsiaSymbolicBayesTree(); | 
					
						
							| 
									
										
										
										
											2009-11-23 01:34:59 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// create a new factor to be inserted
 | 
					
						
							| 
									
										
										
										
											2009-11-23 06:59:56 +08:00
										 |  |  | 	boost::shared_ptr<SymbolicFactor> newFactor(new SymbolicFactor("B","S")); | 
					
						
							| 
									
										
										
										
											2009-11-23 01:34:59 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Remove the contaminated part of the Bayes tree
 | 
					
						
							|  |  |  | 	FactorGraph<SymbolicFactor> factors; | 
					
						
							| 
									
										
										
										
											2009-12-28 07:15:36 +08:00
										 |  |  | 	SymbolicBayesTree::Cliques orphans; | 
					
						
							| 
									
										
										
										
											2009-11-23 08:02:06 +08:00
										 |  |  | 	bayesTree.removeTop<SymbolicFactor>(newFactor, factors, orphans); | 
					
						
							| 
									
										
										
										
											2009-11-23 01:34:59 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Check expected outcome
 | 
					
						
							|  |  |  | 	SymbolicFactorGraph expected; | 
					
						
							|  |  |  | 	expected.push_factor("B","L","E"); | 
					
						
							|  |  |  | 	expected.push_factor("B","L"); | 
					
						
							|  |  |  | 	expected.push_factor("B"); | 
					
						
							| 
									
										
										
										
											2009-11-23 02:06:28 +08:00
										 |  |  | 	expected.push_factor("L","B","S"); | 
					
						
							| 
									
										
										
										
											2009-11-23 01:34:59 +08:00
										 |  |  |   CHECK(assert_equal((FactorGraph<SymbolicFactor>)expected, factors)); | 
					
						
							| 
									
										
										
										
											2009-12-28 07:15:36 +08:00
										 |  |  | 	SymbolicBayesTree::Cliques expectedOrphans; | 
					
						
							| 
									
										
										
										
											2009-11-23 02:06:28 +08:00
										 |  |  |   expectedOrphans += bayesTree["T"], bayesTree["X"]; | 
					
						
							| 
									
										
										
										
											2009-11-23 02:22:17 +08:00
										 |  |  |   CHECK(assert_equal(expectedOrphans, orphans)); | 
					
						
							| 
									
										
										
										
											2009-11-23 06:59:56 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // Try removeTop again with a factor that should not change a thing
 | 
					
						
							|  |  |  | 	boost::shared_ptr<SymbolicFactor> newFactor2(new SymbolicFactor("B")); | 
					
						
							| 
									
										
										
										
											2009-11-23 08:02:06 +08:00
										 |  |  | 	FactorGraph<SymbolicFactor> factors2; | 
					
						
							| 
									
										
										
										
											2009-12-28 07:15:36 +08:00
										 |  |  | 	SymbolicBayesTree::Cliques orphans2; | 
					
						
							| 
									
										
										
										
											2009-11-23 08:02:06 +08:00
										 |  |  | 	bayesTree.removeTop<SymbolicFactor>(newFactor2, factors2, orphans2); | 
					
						
							| 
									
										
										
										
											2009-11-23 06:59:56 +08:00
										 |  |  | 	SymbolicFactorGraph expected2; | 
					
						
							| 
									
										
										
										
											2009-11-23 08:02:06 +08:00
										 |  |  |   CHECK(assert_equal((FactorGraph<SymbolicFactor>)expected2, factors2)); | 
					
						
							| 
									
										
										
										
											2009-12-28 07:15:36 +08:00
										 |  |  | 	SymbolicBayesTree::Cliques expectedOrphans2; | 
					
						
							| 
									
										
										
										
											2009-11-23 08:02:06 +08:00
										 |  |  |   CHECK(assert_equal(expectedOrphans2, orphans2)); | 
					
						
							| 
									
										
										
										
											2009-11-23 01:34:59 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-23 07:35:13 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2009-12-28 07:15:36 +08:00
										 |  |  | TEST( BayesTree, removeTop2 ) | 
					
						
							| 
									
										
										
										
											2009-11-23 07:35:13 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-12-28 07:15:36 +08:00
										 |  |  | 	SymbolicBayesTree bayesTree = createAsiaSymbolicBayesTree(); | 
					
						
							| 
									
										
										
										
											2009-11-23 07:35:13 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-23 07:50:01 +08:00
										 |  |  | 	// create two factors to be inserted
 | 
					
						
							|  |  |  | 	SymbolicFactorGraph newFactors; | 
					
						
							|  |  |  | 	newFactors.push_factor("B"); | 
					
						
							|  |  |  | 	newFactors.push_factor("S"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Remove the contaminated part of the Bayes tree
 | 
					
						
							|  |  |  | 	FactorGraph<SymbolicFactor> factors; | 
					
						
							| 
									
										
										
										
											2009-12-28 07:15:36 +08:00
										 |  |  | 	SymbolicBayesTree::Cliques orphans; | 
					
						
							| 
									
										
										
										
											2009-11-23 07:50:01 +08:00
										 |  |  | 	boost::tie(factors,orphans) = bayesTree.removeTop<SymbolicFactor>(newFactors); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Check expected outcome
 | 
					
						
							|  |  |  | 	SymbolicFactorGraph expected; | 
					
						
							|  |  |  | 	expected.push_factor("B","L","E"); | 
					
						
							|  |  |  | 	expected.push_factor("B","L"); | 
					
						
							|  |  |  | 	expected.push_factor("B"); | 
					
						
							|  |  |  | 	expected.push_factor("L","B","S"); | 
					
						
							|  |  |  |   CHECK(assert_equal((FactorGraph<SymbolicFactor>)expected, factors)); | 
					
						
							| 
									
										
										
										
											2009-12-28 07:15:36 +08:00
										 |  |  | 	SymbolicBayesTree::Cliques expectedOrphans; | 
					
						
							| 
									
										
										
										
											2009-11-23 07:50:01 +08:00
										 |  |  |   expectedOrphans += bayesTree["T"], bayesTree["X"]; | 
					
						
							| 
									
										
										
										
											2009-11-23 09:16:58 +08:00
										 |  |  | 	CHECK(assert_equal(expectedOrphans, orphans)); | 
					
						
							| 
									
										
										
										
											2009-11-23 07:50:01 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-28 04:23:19 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | int main() { | 
					
						
							|  |  |  | 	TestResult tr; | 
					
						
							|  |  |  | 	return TestRegistry::runAllTests(tr); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | /* ************************************************************************* */ |