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/nonlinear/Symbol.h>
|
||||
#include <gtsam/symbolic/tests/symbolicExampleGraphs.h>
|
||||
|
||||
#include <boost/assign/list_of.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
|
||||
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
|
||||
B(new SymbolicConditionalUnordered(_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)
|
||||
|
@ -110,78 +89,6 @@ TEST(EliminationTree, Create)
|
|||
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() {
|
||||
TestResult tr;
|
||||
|
|
|
@ -19,43 +19,65 @@
|
|||
|
||||
#include <gtsam/symbolic/SymbolicFactorGraphUnordered.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 gtsam;
|
||||
using namespace boost::assign;
|
||||
|
||||
namespace {
|
||||
const SymbolicFactorGraphUnordered simpleTestGraph = 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));
|
||||
/* ************************************************************************* */
|
||||
TEST(SymbolicFactorGraph, eliminateFullSequential)
|
||||
{
|
||||
// Test with simpleTestGraph1
|
||||
OrderingUnordered order;
|
||||
order += 0,1,2,3,4;
|
||||
SymbolicBayesNetUnordered actual1 = *simpleTestGraph1.eliminateSequential(EliminateSymbolicUnordered, order);
|
||||
EXPECT(assert_equal(simpleTestGraph1BayesNet, actual1));
|
||||
|
||||
// Test with Asia graph
|
||||
SymbolicBayesNetUnordered actual2 = *asiaGraph.eliminateSequential(
|
||||
EliminateSymbolicUnordered, asiaOrdering);
|
||||
EXPECT(assert_equal(asiaBayesNet, actual2));
|
||||
}
|
||||
|
||||
/* ************************************************************************* */
|
||||
TEST(SymbolicFactorGraph, eliminatePartialSequential)
|
||||
{
|
||||
SymbolicBayesNetUnordered expectedBayesNet;
|
||||
expectedBayesNet.add(SymbolicConditionalUnordered::FromKeys(list_of(0)(1)(2), 1));
|
||||
expectedBayesNet.add(SymbolicConditionalUnordered::FromKeys(list_of(1)(2)(3)(4), 1));
|
||||
// Eliminate 0 and 1
|
||||
const OrderingUnordered order = list_of(0)(1);
|
||||
|
||||
SymbolicFactorGraphUnordered expectedSfg;
|
||||
expectedSfg.push_factor(2,3);
|
||||
expectedSfg.push_factor(4,5);
|
||||
expectedSfg.push_factor(2,3,4);
|
||||
const SymbolicBayesNetUnordered expectedBayesNet = list_of
|
||||
(boost::make_shared<SymbolicConditionalUnordered>(0,1,2))
|
||||
(boost::make_shared<SymbolicConditionalUnordered>(1,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;
|
||||
SymbolicFactorGraphUnordered::shared_ptr actualSfg;
|
||||
boost::tie(actualBayesNet, actualSfg) = simpleTestGraph.eliminatePartialSequential(
|
||||
boost::tie(actualBayesNet, actualSfg) = simpleTestGraph2.eliminatePartialSequential(
|
||||
EliminateSymbolicUnordered, OrderingUnordered(list_of(0)(1)));
|
||||
|
||||
EXPECT(assert_equal(expectedSfg, *actualSfg));
|
||||
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)
|
||||
{
|
||||
|
@ -64,21 +86,45 @@ TEST(SymbolicFactorGraph, eliminatePartialMultifrontal)
|
|||
SymbolicConditionalUnordered::FromKeys(list_of(5)(4)(1), 2));
|
||||
expectedBayesTree.insertRoot(boost::make_shared<SymbolicBayesTreeCliqueUnordered>(root));
|
||||
|
||||
SymbolicFactorGraphUnordered expectedFactorGraph;
|
||||
expectedFactorGraph.push_factor(0,1);
|
||||
expectedFactorGraph.push_factor(0,2);
|
||||
expectedFactorGraph.push_factor(1,3);
|
||||
expectedFactorGraph.push_factor(2,3);
|
||||
expectedFactorGraph.push_factor(1);
|
||||
SymbolicFactorGraphUnordered expectedFactorGraph = list_of
|
||||
(boost::make_shared<SymbolicFactorUnordered>(0,1))
|
||||
(boost::make_shared<SymbolicFactorUnordered>(0,2))
|
||||
(boost::make_shared<SymbolicFactorUnordered>(1,3))
|
||||
(boost::make_shared<SymbolicFactorUnordered>(2,3))
|
||||
(boost::make_shared<SymbolicFactorUnordered>(1));
|
||||
|
||||
SymbolicBayesTreeUnordered::shared_ptr actualBayesTree;
|
||||
SymbolicFactorGraphUnordered::shared_ptr actualFactorGraph;
|
||||
boost::tie(actualBayesTree, actualFactorGraph) = simpleTestGraph.eliminatePartialMultifrontal(
|
||||
boost::tie(actualBayesTree, actualFactorGraph) = simpleTestGraph2.eliminatePartialMultifrontal(
|
||||
EliminateSymbolicUnordered, OrderingUnordered(list_of(4)(5)));
|
||||
|
||||
EXPECT(assert_equal(expectedFactorGraph, *actualFactorGraph));
|
||||
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) {
|
||||
//
|
||||
|
|
|
@ -73,22 +73,6 @@ TEST( JunctionTree, constructor )
|
|||
****************************************************************************/
|
||||
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