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));
|
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.
|
Bayes Tree for testing conversion to a forest of orphans needed for incremental.
|
||||||
A,B
|
A,B
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <boost/make_shared.hpp>
|
#include <boost/make_shared.hpp>
|
||||||
|
#include <boost/assign/list_of.hpp>
|
||||||
|
|
||||||
#include <gtsam/base/TestableAssertions.h>
|
#include <gtsam/base/TestableAssertions.h>
|
||||||
#include <gtsam/symbolic/SymbolicEliminationTree.h>
|
#include <gtsam/symbolic/SymbolicEliminationTree.h>
|
||||||
|
|
@ -30,6 +31,7 @@
|
||||||
using namespace gtsam;
|
using namespace gtsam;
|
||||||
using namespace gtsam::symbol_shorthand;
|
using namespace gtsam::symbol_shorthand;
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
using boost::assign::list_of;
|
||||||
|
|
||||||
class EliminationTreeTester {
|
class EliminationTreeTester {
|
||||||
public:
|
public:
|
||||||
|
|
@ -64,8 +66,37 @@ public:
|
||||||
tree.roots_.push_back(root);
|
tree.roots_.push_back(root);
|
||||||
return tree;
|
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)
|
TEST(EliminationTree, Create)
|
||||||
|
|
@ -81,6 +112,43 @@ TEST(EliminationTree, Create)
|
||||||
CHECK(assert_equal(expected, actual));
|
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() {
|
int main() {
|
||||||
TestResult tr;
|
TestResult tr;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue