Creating standard group of unit tests for unordered elimination code
							parent
							
								
									73179dbabc
								
							
						
					
					
						commit
						c1d12818ae
					
				| 
						 | 
					@ -0,0 +1,95 @@
 | 
				
			||||||
 | 
					/* ----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 * GTSAM Copyright 2010, Georgia Tech Research Corporation,
 | 
				
			||||||
 | 
					 * 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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 * -------------------------------------------------------------------------- */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * @file symbolicExampleGraphs.cpp
 | 
				
			||||||
 | 
					 * @date sept 15, 2012
 | 
				
			||||||
 | 
					 * @author  Frank Dellaert
 | 
				
			||||||
 | 
					 * @author  Michael Kaess
 | 
				
			||||||
 | 
					 * @author  Viorela Ila
 | 
				
			||||||
 | 
					 * @author  Richard Roberts
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <gtsam/symbolic/SymbolicFactorGraphUnordered.h>
 | 
				
			||||||
 | 
					#include <gtsam/nonlinear/Symbol.h>
 | 
				
			||||||
 | 
					#include <boost/assign/list_of.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace gtsam {
 | 
				
			||||||
 | 
					  namespace {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const SymbolicFactorGraphUnordered simpleTestGraph1 = boost::assign::list_of
 | 
				
			||||||
 | 
					      (boost::make_shared<SymbolicFactorUnordered>(0,1))
 | 
				
			||||||
 | 
					      (boost::make_shared<SymbolicFactorUnordered>(0,2))
 | 
				
			||||||
 | 
					      (boost::make_shared<SymbolicFactorUnordered>(1,4))
 | 
				
			||||||
 | 
					      (boost::make_shared<SymbolicFactorUnordered>(2,4))
 | 
				
			||||||
 | 
					      (boost::make_shared<SymbolicFactorUnordered>(3,4));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const SymbolicBayesNetUnordered simpleTestGraph1BayesNet = boost::assign::list_of
 | 
				
			||||||
 | 
					      (boost::make_shared<SymbolicConditionalUnordered>(0,1,2))
 | 
				
			||||||
 | 
					      (boost::make_shared<SymbolicConditionalUnordered>(1,2,4))
 | 
				
			||||||
 | 
					      (boost::make_shared<SymbolicConditionalUnordered>(2,4))
 | 
				
			||||||
 | 
					      (boost::make_shared<SymbolicConditionalUnordered>(3,4))
 | 
				
			||||||
 | 
					      (boost::make_shared<SymbolicConditionalUnordered>(4));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const SymbolicFactorGraphUnordered simpleTestGraph2 = boost::assign::list_of
 | 
				
			||||||
 | 
					      (boost::make_shared<SymbolicFactorUnordered>(0,1))
 | 
				
			||||||
 | 
					      (boost::make_shared<SymbolicFactorUnordered>(0,2))
 | 
				
			||||||
 | 
					      (boost::make_shared<SymbolicFactorUnordered>(1,3))
 | 
				
			||||||
 | 
					      (boost::make_shared<SymbolicFactorUnordered>(1,4))
 | 
				
			||||||
 | 
					      (boost::make_shared<SymbolicFactorUnordered>(2,3))
 | 
				
			||||||
 | 
					      (boost::make_shared<SymbolicFactorUnordered>(4,5));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** 0 - 1 - 2 - 3 */
 | 
				
			||||||
 | 
					    const SymbolicFactorGraphUnordered simpleChain = boost::assign::list_of
 | 
				
			||||||
 | 
					      (boost::make_shared<SymbolicFactorUnordered>(0,1))
 | 
				
			||||||
 | 
					      (boost::make_shared<SymbolicFactorUnordered>(1,2))
 | 
				
			||||||
 | 
					      (boost::make_shared<SymbolicFactorUnordered>(2,3));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    SymbolicBayesTreeUnordered __simpleChainBayesTree() {
 | 
				
			||||||
 | 
					      SymbolicBayesTreeUnordered result;
 | 
				
			||||||
 | 
					      SymbolicBayesTreeCliqueUnordered::shared_ptr root =
 | 
				
			||||||
 | 
					        boost::make_shared<SymbolicBayesTreeCliqueUnordered>(
 | 
				
			||||||
 | 
					        boost::make_shared<SymbolicConditionalUnordered>(SymbolicConditionalUnordered::FromKeys(list_of(2)(3),2)));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const SymbolicBayesTreeUnordered simpleChainBayesTree = __simpleChainBayesTree();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* ************************************************************************* */
 | 
				
			||||||
 | 
					    // Keys for ASIA example from the tutorial with A and D evidence
 | 
				
			||||||
 | 
					    const Key _X_=gtsam::symbol_shorthand::X(0), _T_=gtsam::symbol_shorthand::T(0),
 | 
				
			||||||
 | 
					      _S_=gtsam::symbol_shorthand::S(0), _E_=gtsam::symbol_shorthand::E(0),
 | 
				
			||||||
 | 
					      _L_=gtsam::symbol_shorthand::L(0), _B_=gtsam::symbol_shorthand::B(0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Factor graph for Asia example
 | 
				
			||||||
 | 
					    const SymbolicFactorGraphUnordered asiaGraph = boost::assign::list_of
 | 
				
			||||||
 | 
					      (boost::make_shared<SymbolicFactorUnordered>(_T_))
 | 
				
			||||||
 | 
					      (boost::make_shared<SymbolicFactorUnordered>(_S_))
 | 
				
			||||||
 | 
					      (boost::make_shared<SymbolicFactorUnordered>(_T_, _E_, _L_))
 | 
				
			||||||
 | 
					      (boost::make_shared<SymbolicFactorUnordered>(_L_, _S_))
 | 
				
			||||||
 | 
					      (boost::make_shared<SymbolicFactorUnordered>(_S_, _B_))
 | 
				
			||||||
 | 
					      (boost::make_shared<SymbolicFactorUnordered>(_E_, _B_))
 | 
				
			||||||
 | 
					      (boost::make_shared<SymbolicFactorUnordered>(_E_, _X_));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const SymbolicBayesNetUnordered asiaBayesNet = boost::assign::list_of
 | 
				
			||||||
 | 
					      (boost::make_shared<SymbolicConditionalUnordered>(_T_, _E_, _L_))
 | 
				
			||||||
 | 
					      (boost::make_shared<SymbolicConditionalUnordered>(_X_, _E_))
 | 
				
			||||||
 | 
					      (boost::make_shared<SymbolicConditionalUnordered>(_E_, _B_, _L_))
 | 
				
			||||||
 | 
					      (boost::make_shared<SymbolicConditionalUnordered>(_S_, _B_, _L_))
 | 
				
			||||||
 | 
					      (boost::make_shared<SymbolicConditionalUnordered>(_L_, _B_))
 | 
				
			||||||
 | 
					      (boost::make_shared<SymbolicConditionalUnordered>(_B_));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* ************************************************************************* */
 | 
				
			||||||
 | 
					    const OrderingUnordered asiaOrdering = boost::assign::list_of(_X_)(_T_)(_S_)(_E_)(_L_)(_B_);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -19,6 +19,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <gtsam/symbolic/SymbolicBayesTreeUnordered.h>
 | 
					#include <gtsam/symbolic/SymbolicBayesTreeUnordered.h>
 | 
				
			||||||
#include <gtsam/nonlinear/Symbol.h>
 | 
					#include <gtsam/nonlinear/Symbol.h>
 | 
				
			||||||
 | 
					#include <gtsam/symbolic/tests/symbolicExampleGraphs.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <boost/assign/list_of.hpp>
 | 
					#include <boost/assign/list_of.hpp>
 | 
				
			||||||
#include <boost/assign/std/vector.hpp>
 | 
					#include <boost/assign/std/vector.hpp>
 | 
				
			||||||
| 
						 | 
					@ -34,7 +35,6 @@ static bool debug = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* ************************************************************************* */
 | 
					/* ************************************************************************* */
 | 
				
			||||||
// Conditionals for ASIA example from the tutorial with A and D evidence
 | 
					// Conditionals for ASIA example from the tutorial with A and D evidence
 | 
				
			||||||
static const Key _X_=X(0), _T_=T(0), _S_=S(0), _E_=E(0), _L_=L(0), _B_=B(0);
 | 
					 | 
				
			||||||
static SymbolicConditionalUnordered::shared_ptr
 | 
					static SymbolicConditionalUnordered::shared_ptr
 | 
				
			||||||
  B(new SymbolicConditionalUnordered(_B_)),
 | 
					  B(new SymbolicConditionalUnordered(_B_)),
 | 
				
			||||||
  L(new SymbolicConditionalUnordered(_L_, _B_)),
 | 
					  L(new SymbolicConditionalUnordered(_L_, _B_)),
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -67,27 +67,6 @@ public:
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* ************************************************************************* */
 | 
					 | 
				
			||||||
namespace {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  /* ************************************************************************* */
 | 
					 | 
				
			||||||
  // Keys for ASIA example from the tutorial with A and D evidence
 | 
					 | 
				
			||||||
  const Key _X_=X(0), _T_=T(0), _S_=S(0), _E_=E(0), _L_=L(0), _B_=B(0);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Factor graph for Asia example
 | 
					 | 
				
			||||||
  const SymbolicFactorGraphUnordered asiaGraph = list_of
 | 
					 | 
				
			||||||
    (boost::make_shared<SymbolicFactorUnordered>(_T_))
 | 
					 | 
				
			||||||
    (boost::make_shared<SymbolicFactorUnordered>(_S_))
 | 
					 | 
				
			||||||
    (boost::make_shared<SymbolicFactorUnordered>(_T_, _E_, _L_))
 | 
					 | 
				
			||||||
    (boost::make_shared<SymbolicFactorUnordered>(_L_, _S_))
 | 
					 | 
				
			||||||
    (boost::make_shared<SymbolicFactorUnordered>(_S_, _B_))
 | 
					 | 
				
			||||||
    (boost::make_shared<SymbolicFactorUnordered>(_E_, _B_))
 | 
					 | 
				
			||||||
    (boost::make_shared<SymbolicFactorUnordered>(_E_, _X_));
 | 
					 | 
				
			||||||
  
 | 
					 | 
				
			||||||
  /* ************************************************************************* */
 | 
					 | 
				
			||||||
  const OrderingUnordered asiaOrdering = list_of(_X_)(_T_)(_S_)(_E_)(_L_)(_B_);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* ************************************************************************* */
 | 
					/* ************************************************************************* */
 | 
				
			||||||
TEST(EliminationTree, Create)
 | 
					TEST(EliminationTree, Create)
 | 
				
			||||||
| 
						 | 
					@ -110,78 +89,6 @@ TEST(EliminationTree, Create)
 | 
				
			||||||
  CHECK(assert_equal(expected, actual));
 | 
					  CHECK(assert_equal(expected, actual));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* ************************************************************************* */
 | 
					 | 
				
			||||||
// Test to drive elimination tree development
 | 
					 | 
				
			||||||
// graph: f(0,1) f(0,2) f(1,4) f(2,4) f(3,4)
 | 
					 | 
				
			||||||
/* ************************************************************************* */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_UNSAFE(EliminationTree, eliminate )
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  // create expected Chordal bayes Net
 | 
					 | 
				
			||||||
  SymbolicBayesNetUnordered expected;
 | 
					 | 
				
			||||||
  expected.push_back(boost::make_shared<SymbolicConditionalUnordered>(0,1,2));
 | 
					 | 
				
			||||||
  expected.push_back(boost::make_shared<SymbolicConditionalUnordered>(1,2,4));
 | 
					 | 
				
			||||||
  expected.push_back(boost::make_shared<SymbolicConditionalUnordered>(2,4));
 | 
					 | 
				
			||||||
  expected.push_back(boost::make_shared<SymbolicConditionalUnordered>(3,4));
 | 
					 | 
				
			||||||
  expected.push_back(boost::make_shared<SymbolicConditionalUnordered>(4));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Create factor graph
 | 
					 | 
				
			||||||
  SymbolicFactorGraphUnordered fg;
 | 
					 | 
				
			||||||
  fg.push_factor(0, 1);
 | 
					 | 
				
			||||||
  fg.push_factor(0, 2);
 | 
					 | 
				
			||||||
  fg.push_factor(1, 4);
 | 
					 | 
				
			||||||
  fg.push_factor(2, 4);
 | 
					 | 
				
			||||||
  fg.push_factor(3, 4);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // eliminate
 | 
					 | 
				
			||||||
  OrderingUnordered order;
 | 
					 | 
				
			||||||
  order += 0,1,2,3,4;
 | 
					 | 
				
			||||||
  SymbolicBayesNetUnordered actual = *SymbolicEliminationTreeUnordered(fg,order).eliminate(EliminateSymbolicUnordered).first;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  EXPECT(assert_equal(expected,actual));
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* ************************************************************************* */
 | 
					 | 
				
			||||||
TEST(EliminationTree, eliminateAsiaExample)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  SymbolicBayesNetUnordered expected = list_of
 | 
					 | 
				
			||||||
    (boost::make_shared<SymbolicConditionalUnordered>(_T_, _E_, _L_))
 | 
					 | 
				
			||||||
    (boost::make_shared<SymbolicConditionalUnordered>(_X_, _E_))
 | 
					 | 
				
			||||||
    (boost::make_shared<SymbolicConditionalUnordered>(_E_, _B_, _L_))
 | 
					 | 
				
			||||||
    (boost::make_shared<SymbolicConditionalUnordered>(_S_, _B_, _L_))
 | 
					 | 
				
			||||||
    (boost::make_shared<SymbolicConditionalUnordered>(_L_, _B_))
 | 
					 | 
				
			||||||
    (boost::make_shared<SymbolicConditionalUnordered>(_B_));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  SymbolicBayesNetUnordered actual = *asiaGraph.eliminateSequential(
 | 
					 | 
				
			||||||
    EliminateSymbolicUnordered, asiaOrdering);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  EXPECT(assert_equal(expected, actual));
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* ************************************************************************* */
 | 
					 | 
				
			||||||
TEST(EliminationTree, disconnected_graph) {
 | 
					 | 
				
			||||||
  SymbolicFactorGraphUnordered fg;
 | 
					 | 
				
			||||||
  fg.push_factor(0, 1);
 | 
					 | 
				
			||||||
  fg.push_factor(0, 2);
 | 
					 | 
				
			||||||
  fg.push_factor(1, 2);
 | 
					 | 
				
			||||||
  fg.push_factor(3, 4);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // create expected Chordal bayes Net
 | 
					 | 
				
			||||||
  SymbolicBayesNetUnordered expected;
 | 
					 | 
				
			||||||
  expected.push_back(boost::make_shared<SymbolicConditionalUnordered>(0,1,2));
 | 
					 | 
				
			||||||
  expected.push_back(boost::make_shared<SymbolicConditionalUnordered>(1,2));
 | 
					 | 
				
			||||||
  expected.push_back(boost::make_shared<SymbolicConditionalUnordered>(2));
 | 
					 | 
				
			||||||
  expected.push_back(boost::make_shared<SymbolicConditionalUnordered>(3,4));
 | 
					 | 
				
			||||||
  expected.push_back(boost::make_shared<SymbolicConditionalUnordered>(4));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  OrderingUnordered order;
 | 
					 | 
				
			||||||
  order += 0,1,2,3,4;
 | 
					 | 
				
			||||||
  SymbolicBayesNetUnordered actual = *SymbolicEliminationTreeUnordered(fg, order)
 | 
					 | 
				
			||||||
    .eliminate(EliminateSymbolicUnordered).first;
 | 
					 | 
				
			||||||
  
 | 
					 | 
				
			||||||
  EXPECT(assert_equal(expected,actual));
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* ************************************************************************* */
 | 
					/* ************************************************************************* */
 | 
				
			||||||
int main() {
 | 
					int main() {
 | 
				
			||||||
  TestResult tr;
 | 
					  TestResult tr;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -19,43 +19,65 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <gtsam/symbolic/SymbolicFactorGraphUnordered.h>
 | 
					#include <gtsam/symbolic/SymbolicFactorGraphUnordered.h>
 | 
				
			||||||
#include <gtsam/symbolic/SymbolicBayesNetUnordered.h>
 | 
					#include <gtsam/symbolic/SymbolicBayesNetUnordered.h>
 | 
				
			||||||
#include <boost/assign/list_of.hpp>
 | 
					#include <gtsam/symbolic/tests/symbolicExampleGraphs.h>
 | 
				
			||||||
 | 
					#include <boost/assign/std/vector.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
using namespace std;
 | 
					using namespace std;
 | 
				
			||||||
using namespace gtsam;
 | 
					using namespace gtsam;
 | 
				
			||||||
using namespace boost::assign;
 | 
					using namespace boost::assign;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace {
 | 
					/* ************************************************************************* */
 | 
				
			||||||
  const SymbolicFactorGraphUnordered simpleTestGraph = list_of
 | 
					TEST(SymbolicFactorGraph, eliminateFullSequential)
 | 
				
			||||||
    (boost::make_shared<SymbolicFactorUnordered>(0,1))
 | 
					{
 | 
				
			||||||
    (boost::make_shared<SymbolicFactorUnordered>(0,2))
 | 
					  // Test with simpleTestGraph1
 | 
				
			||||||
    (boost::make_shared<SymbolicFactorUnordered>(1,3))
 | 
					  OrderingUnordered order;
 | 
				
			||||||
    (boost::make_shared<SymbolicFactorUnordered>(1,4))
 | 
					  order += 0,1,2,3,4;
 | 
				
			||||||
    (boost::make_shared<SymbolicFactorUnordered>(2,3))
 | 
					  SymbolicBayesNetUnordered actual1 = *simpleTestGraph1.eliminateSequential(EliminateSymbolicUnordered, order);
 | 
				
			||||||
    (boost::make_shared<SymbolicFactorUnordered>(4,5));
 | 
					  EXPECT(assert_equal(simpleTestGraph1BayesNet, actual1));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Test with Asia graph
 | 
				
			||||||
 | 
					  SymbolicBayesNetUnordered actual2 = *asiaGraph.eliminateSequential(
 | 
				
			||||||
 | 
					    EliminateSymbolicUnordered, asiaOrdering);
 | 
				
			||||||
 | 
					  EXPECT(assert_equal(asiaBayesNet, actual2));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* ************************************************************************* */
 | 
					/* ************************************************************************* */
 | 
				
			||||||
TEST(SymbolicFactorGraph, eliminatePartialSequential)
 | 
					TEST(SymbolicFactorGraph, eliminatePartialSequential)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  SymbolicBayesNetUnordered expectedBayesNet;
 | 
					  // Eliminate 0 and 1
 | 
				
			||||||
  expectedBayesNet.add(SymbolicConditionalUnordered::FromKeys(list_of(0)(1)(2), 1));
 | 
					  const OrderingUnordered order = list_of(0)(1);
 | 
				
			||||||
  expectedBayesNet.add(SymbolicConditionalUnordered::FromKeys(list_of(1)(2)(3)(4), 1));
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  SymbolicFactorGraphUnordered expectedSfg;
 | 
					  const SymbolicBayesNetUnordered expectedBayesNet = list_of
 | 
				
			||||||
  expectedSfg.push_factor(2,3);
 | 
					    (boost::make_shared<SymbolicConditionalUnordered>(0,1,2))
 | 
				
			||||||
  expectedSfg.push_factor(4,5);
 | 
					    (boost::make_shared<SymbolicConditionalUnordered>(1,2,3,4));
 | 
				
			||||||
  expectedSfg.push_factor(2,3,4);
 | 
					
 | 
				
			||||||
 | 
					  const SymbolicFactorGraphUnordered expectedSfg = list_of
 | 
				
			||||||
 | 
					    (boost::make_shared<SymbolicFactorUnordered>(2,3))
 | 
				
			||||||
 | 
					    (boost::make_shared<SymbolicFactorUnordered>(4,5))
 | 
				
			||||||
 | 
					    (boost::make_shared<SymbolicFactorUnordered>(2,3,4));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  SymbolicBayesNetUnordered::shared_ptr actualBayesNet;
 | 
					  SymbolicBayesNetUnordered::shared_ptr actualBayesNet;
 | 
				
			||||||
  SymbolicFactorGraphUnordered::shared_ptr actualSfg;
 | 
					  SymbolicFactorGraphUnordered::shared_ptr actualSfg;
 | 
				
			||||||
  boost::tie(actualBayesNet, actualSfg) = simpleTestGraph.eliminatePartialSequential(
 | 
					  boost::tie(actualBayesNet, actualSfg) = simpleTestGraph2.eliminatePartialSequential(
 | 
				
			||||||
    EliminateSymbolicUnordered, OrderingUnordered(list_of(0)(1)));
 | 
					    EliminateSymbolicUnordered, OrderingUnordered(list_of(0)(1)));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  EXPECT(assert_equal(expectedSfg, *actualSfg));
 | 
					  EXPECT(assert_equal(expectedSfg, *actualSfg));
 | 
				
			||||||
  EXPECT(assert_equal(expectedBayesNet, *actualBayesNet));
 | 
					  EXPECT(assert_equal(expectedBayesNet, *actualBayesNet));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ************************************************************************* */
 | 
				
			||||||
 | 
					TEST(SymbolicFactorGraph, eliminateFullMultifrontal)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  const Index x2=0, x1=1, x3=2, x4=3;
 | 
				
			||||||
 | 
					  SymbolicFactorGraphUnordered fg;
 | 
				
			||||||
 | 
					  fg.push_factor(x2,x1);
 | 
				
			||||||
 | 
					  fg.push_factor(x2,x3);
 | 
				
			||||||
 | 
					  fg.push_factor(x3,x4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  EXPECT(false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* ************************************************************************* */
 | 
					/* ************************************************************************* */
 | 
				
			||||||
TEST(SymbolicFactorGraph, eliminatePartialMultifrontal)
 | 
					TEST(SymbolicFactorGraph, eliminatePartialMultifrontal)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -64,21 +86,45 @@ TEST(SymbolicFactorGraph, eliminatePartialMultifrontal)
 | 
				
			||||||
    SymbolicConditionalUnordered::FromKeys(list_of(5)(4)(1), 2));
 | 
					    SymbolicConditionalUnordered::FromKeys(list_of(5)(4)(1), 2));
 | 
				
			||||||
  expectedBayesTree.insertRoot(boost::make_shared<SymbolicBayesTreeCliqueUnordered>(root));
 | 
					  expectedBayesTree.insertRoot(boost::make_shared<SymbolicBayesTreeCliqueUnordered>(root));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  SymbolicFactorGraphUnordered expectedFactorGraph;
 | 
					  SymbolicFactorGraphUnordered expectedFactorGraph = list_of
 | 
				
			||||||
  expectedFactorGraph.push_factor(0,1);
 | 
					    (boost::make_shared<SymbolicFactorUnordered>(0,1))
 | 
				
			||||||
  expectedFactorGraph.push_factor(0,2);
 | 
					    (boost::make_shared<SymbolicFactorUnordered>(0,2))
 | 
				
			||||||
  expectedFactorGraph.push_factor(1,3);
 | 
					    (boost::make_shared<SymbolicFactorUnordered>(1,3))
 | 
				
			||||||
  expectedFactorGraph.push_factor(2,3);
 | 
					    (boost::make_shared<SymbolicFactorUnordered>(2,3))
 | 
				
			||||||
  expectedFactorGraph.push_factor(1);
 | 
					    (boost::make_shared<SymbolicFactorUnordered>(1));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  SymbolicBayesTreeUnordered::shared_ptr actualBayesTree;
 | 
					  SymbolicBayesTreeUnordered::shared_ptr actualBayesTree;
 | 
				
			||||||
  SymbolicFactorGraphUnordered::shared_ptr actualFactorGraph;
 | 
					  SymbolicFactorGraphUnordered::shared_ptr actualFactorGraph;
 | 
				
			||||||
  boost::tie(actualBayesTree, actualFactorGraph) = simpleTestGraph.eliminatePartialMultifrontal(
 | 
					  boost::tie(actualBayesTree, actualFactorGraph) = simpleTestGraph2.eliminatePartialMultifrontal(
 | 
				
			||||||
    EliminateSymbolicUnordered, OrderingUnordered(list_of(4)(5)));
 | 
					    EliminateSymbolicUnordered, OrderingUnordered(list_of(4)(5)));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  EXPECT(assert_equal(expectedFactorGraph, *actualFactorGraph));
 | 
					  EXPECT(assert_equal(expectedFactorGraph, *actualFactorGraph));
 | 
				
			||||||
  EXPECT(assert_equal(expectedBayesTree, *actualBayesTree));
 | 
					  EXPECT(assert_equal(expectedBayesTree, *actualBayesTree));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ************************************************************************* */
 | 
				
			||||||
 | 
					TEST(SymbolicFactorGraph, eliminate_disconnected_graph) {
 | 
				
			||||||
 | 
					  SymbolicFactorGraphUnordered fg;
 | 
				
			||||||
 | 
					  fg.push_factor(0, 1);
 | 
				
			||||||
 | 
					  fg.push_factor(0, 2);
 | 
				
			||||||
 | 
					  fg.push_factor(1, 2);
 | 
				
			||||||
 | 
					  fg.push_factor(3, 4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // create expected Chordal bayes Net
 | 
				
			||||||
 | 
					  SymbolicBayesNetUnordered expected;
 | 
				
			||||||
 | 
					  expected.push_back(boost::make_shared<SymbolicConditionalUnordered>(0,1,2));
 | 
				
			||||||
 | 
					  expected.push_back(boost::make_shared<SymbolicConditionalUnordered>(1,2));
 | 
				
			||||||
 | 
					  expected.push_back(boost::make_shared<SymbolicConditionalUnordered>(2));
 | 
				
			||||||
 | 
					  expected.push_back(boost::make_shared<SymbolicConditionalUnordered>(3,4));
 | 
				
			||||||
 | 
					  expected.push_back(boost::make_shared<SymbolicConditionalUnordered>(4));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  OrderingUnordered order;
 | 
				
			||||||
 | 
					  order += 0,1,2,3,4;
 | 
				
			||||||
 | 
					  SymbolicBayesNetUnordered actual = *fg.eliminateSequential(EliminateSymbolicUnordered, order);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  EXPECT(assert_equal(expected,actual));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* ************************************************************************* */
 | 
					/* ************************************************************************* */
 | 
				
			||||||
//TEST(SymbolicFactorGraph, eliminateFrontals) {
 | 
					//TEST(SymbolicFactorGraph, eliminateFrontals) {
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -73,22 +73,6 @@ TEST( JunctionTree, constructor )
 | 
				
			||||||
 ****************************************************************************/
 | 
					 ****************************************************************************/
 | 
				
			||||||
TEST( JunctionTree, eliminate)
 | 
					TEST( JunctionTree, eliminate)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  const Index x2=0, x1=1, x3=2, x4=3;
 | 
					 | 
				
			||||||
  SymbolicFactorGraph fg;
 | 
					 | 
				
			||||||
  fg.push_factor(x2,x1);
 | 
					 | 
				
			||||||
  fg.push_factor(x2,x3);
 | 
					 | 
				
			||||||
  fg.push_factor(x3,x4);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  SymbolicJunctionTree jt(fg);
 | 
					 | 
				
			||||||
  SymbolicBayesTree::sharedClique actual = jt.eliminate(&EliminateSymbolic);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  BayesNet<IndexConditional> bn(*SymbolicSequentialSolver(fg).eliminate());
 | 
					 | 
				
			||||||
  SymbolicBayesTree expected(bn);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//  cout << "BT from JT:\n";
 | 
					 | 
				
			||||||
//  actual->printTree("");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  CHECK(assert_equal(*expected.root(), *actual));
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* ************************************************************************* */
 | 
					/* ************************************************************************* */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue