Added EliminationTree and clique-finding unit tests using Alex's DDF test graph
parent
41ce6cdfba
commit
85bbcf6d1e
|
|
@ -78,6 +78,41 @@ TEST(SymbolicBayesTree, clear)
|
|||
CHECK(assert_equal(expected, bayesTree));
|
||||
}
|
||||
|
||||
/* ************************************************************************* */
|
||||
TEST(SymbolicJunctionTree, clique_structure)
|
||||
{
|
||||
// l1 l2
|
||||
// / | / |
|
||||
// x1 --- x2 --- x3 --- x4 --- x5
|
||||
// \ |
|
||||
// l3
|
||||
SymbolicFactorGraph graph;
|
||||
graph += SymbolicFactor(X(1), L(1));
|
||||
graph += SymbolicFactor(X(1), X(2));
|
||||
graph += SymbolicFactor(X(2), L(1));
|
||||
graph += SymbolicFactor(X(2), X(3));
|
||||
graph += SymbolicFactor(X(3), X(4));
|
||||
graph += SymbolicFactor(X(4), L(2));
|
||||
graph += SymbolicFactor(X(4), X(5));
|
||||
graph += SymbolicFactor(L(2), X(5));
|
||||
graph += SymbolicFactor(X(4), L(3));
|
||||
graph += SymbolicFactor(X(5), L(3));
|
||||
|
||||
SymbolicBayesTree expected;
|
||||
expected.insertRoot(
|
||||
MakeClique(list_of(X(3)) (X(4)), 2, list_of
|
||||
(MakeClique(list_of(L(2)) (X(5)) (X(4)), 2, list_of
|
||||
(MakeClique(list_of(L(3)) (X(4)) (X(5)), 1))))
|
||||
(MakeClique(list_of(X(2)) (X(3)), 1, list_of
|
||||
(MakeClique(list_of(L(1)) (X(1)) (X(2)), 2))))));
|
||||
|
||||
Ordering order = list_of(L(1)) (X(1)) (X(2)) (L(2)) (L(3)) (X(5)) (X(3)) (X(4));
|
||||
|
||||
SymbolicBayesTree actual = *graph.eliminateMultifrontal(order);
|
||||
|
||||
EXPECT(assert_equal(expected, actual));
|
||||
}
|
||||
|
||||
/* ************************************************************************* *
|
||||
Bayes Tree for testing conversion to a forest of orphans needed for incremental.
|
||||
A,B
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@
|
|||
|
||||
#include <vector>
|
||||
#include <boost/make_shared.hpp>
|
||||
#include <boost/assign/list_of.hpp>
|
||||
|
||||
#include <gtsam/base/TestableAssertions.h>
|
||||
#include <gtsam/symbolic/SymbolicEliminationTree.h>
|
||||
|
|
@ -30,6 +31,7 @@
|
|||
using namespace gtsam;
|
||||
using namespace gtsam::symbol_shorthand;
|
||||
using namespace std;
|
||||
using boost::assign::list_of;
|
||||
|
||||
class EliminationTreeTester {
|
||||
public:
|
||||
|
|
@ -64,8 +66,37 @@ public:
|
|||
tree.roots_.push_back(root);
|
||||
return tree;
|
||||
}
|
||||
|
||||
template<typename ROOTS>
|
||||
static SymbolicEliminationTree MakeTree(const ROOTS& roots)
|
||||
{
|
||||
SymbolicEliminationTree et;
|
||||
et.roots_.assign(roots.begin(), roots.end());
|
||||
return et;
|
||||
}
|
||||
};
|
||||
|
||||
template<typename FACTORS>
|
||||
static SymbolicEliminationTree::sharedNode MakeNode(Key key, const FACTORS& factors)
|
||||
{
|
||||
SymbolicEliminationTree::sharedNode node = boost::make_shared<SymbolicEliminationTree::Node>();
|
||||
node->key = key;
|
||||
SymbolicFactorGraph factorsAsGraph = factors;
|
||||
node->factors.assign(factorsAsGraph.begin(), factorsAsGraph.end());
|
||||
return node;
|
||||
}
|
||||
|
||||
template<typename FACTORS, typename CHILDREN>
|
||||
static SymbolicEliminationTree::sharedNode MakeNode(Key key, const FACTORS& factors, const CHILDREN& children)
|
||||
{
|
||||
SymbolicEliminationTree::sharedNode node = boost::make_shared<SymbolicEliminationTree::Node>();
|
||||
node->key = key;
|
||||
SymbolicFactorGraph factorsAsGraph = factors;
|
||||
node->factors.assign(factorsAsGraph.begin(), factorsAsGraph.end());
|
||||
node->children.assign(children.begin(), children.end());
|
||||
return node;
|
||||
}
|
||||
|
||||
|
||||
/* ************************************************************************* */
|
||||
TEST(EliminationTree, Create)
|
||||
|
|
@ -81,6 +112,43 @@ TEST(EliminationTree, Create)
|
|||
CHECK(assert_equal(expected, actual));
|
||||
}
|
||||
|
||||
/* ************************************************************************* */
|
||||
TEST(EliminationTree, Create2)
|
||||
{
|
||||
// l1 l2
|
||||
// / | / |
|
||||
// x1 --- x2 --- x3 --- x4 --- x5
|
||||
// \ |
|
||||
// l3
|
||||
SymbolicFactorGraph graph;
|
||||
graph += SymbolicFactor(X(1), L(1));
|
||||
graph += SymbolicFactor(X(1), X(2));
|
||||
graph += SymbolicFactor(X(2), L(1));
|
||||
graph += SymbolicFactor(X(2), X(3));
|
||||
graph += SymbolicFactor(X(3), X(4));
|
||||
graph += SymbolicFactor(X(4), L(2));
|
||||
graph += SymbolicFactor(X(4), X(5));
|
||||
graph += SymbolicFactor(L(2), X(5));
|
||||
graph += SymbolicFactor(X(4), L(3));
|
||||
graph += SymbolicFactor(X(5), L(3));
|
||||
|
||||
SymbolicEliminationTree expected = EliminationTreeTester::MakeTree(list_of
|
||||
(MakeNode(X(4), SymbolicFactorGraph(), list_of
|
||||
(MakeNode(X(3), list_of(SymbolicFactor(X(3), X(4))), list_of
|
||||
(MakeNode(X(2), list_of(SymbolicFactor(X(2), X(3))), list_of
|
||||
(MakeNode(X(1), list_of(SymbolicFactor(X(1), X(2))), list_of
|
||||
(MakeNode(L(1), list_of(SymbolicFactor(X(1), L(1))) (SymbolicFactor(X(2), L(1)))))))))))
|
||||
(MakeNode(X(5), list_of(SymbolicFactor(X(4), X(5))), list_of
|
||||
(MakeNode(L(2), list_of(SymbolicFactor(X(4), L(2))) (SymbolicFactor(L(2), X(5)))))
|
||||
(MakeNode(L(3), list_of(SymbolicFactor(X(4), L(3))) (SymbolicFactor(X(5), L(3))))))))));
|
||||
|
||||
Ordering order = list_of(L(1)) (X(1)) (X(2)) (L(2)) (L(3)) (X(5)) (X(3)) (X(4));
|
||||
|
||||
SymbolicEliminationTree actual(graph, order);
|
||||
|
||||
EXPECT(assert_equal(expected, actual));
|
||||
}
|
||||
|
||||
/* ************************************************************************* */
|
||||
int main() {
|
||||
TestResult tr;
|
||||
|
|
|
|||
Loading…
Reference in New Issue