98 lines
3.2 KiB
C++
98 lines
3.2 KiB
C++
/*
|
|
* testGaussianJunctionTree.cpp
|
|
*
|
|
* Created on: Jul 8, 2010
|
|
* @author Kai Ni
|
|
*/
|
|
|
|
#include <iostream>
|
|
#include <gtsam/CppUnitLite/TestHarness.h>
|
|
|
|
#include <boost/assign/list_of.hpp>
|
|
#include <boost/assign/std/list.hpp> // for operator +=
|
|
#include <boost/assign/std/set.hpp> // for operator +=
|
|
using namespace boost::assign;
|
|
|
|
#include <gtsam/linear/GaussianJunctionTree.h>
|
|
#include <gtsam/inference/BayesTree-inl.h>
|
|
|
|
using namespace std;
|
|
using namespace gtsam;
|
|
|
|
static const Index x2=0, x1=1, x3=2, x4=3;
|
|
|
|
GaussianFactorGraph createChain() {
|
|
|
|
typedef GaussianFactorGraph::sharedFactor Factor;
|
|
SharedDiagonal model(Vector_(1, 0.5));
|
|
Factor factor1(new GaussianFactor(x2, Matrix_(1,1,1.), x1, Matrix_(1,1,1.), Vector_(1,1.), model));
|
|
Factor factor2(new GaussianFactor(x2, Matrix_(1,1,1.), x3, Matrix_(1,1,1.), Vector_(1,1.), model));
|
|
Factor factor3(new GaussianFactor(x3, Matrix_(1,1,1.), x4, Matrix_(1,1,1.), Vector_(1,1.), model));
|
|
Factor factor4(new GaussianFactor(x4, Matrix_(1,1,1.), Vector_(1,1.), model));
|
|
|
|
GaussianFactorGraph fg;
|
|
fg.push_back(factor1);
|
|
fg.push_back(factor2);
|
|
fg.push_back(factor3);
|
|
fg.push_back(factor4);
|
|
|
|
return fg;
|
|
}
|
|
|
|
/* ************************************************************************* */
|
|
/**
|
|
* x1 - x2 - x3 - x4
|
|
* x3 x4
|
|
* x2 x1 : x3
|
|
*
|
|
* x2 x1 x3 x4 b
|
|
* 1 1 1
|
|
* 1 1 1
|
|
* 1 1 1
|
|
* 1 1
|
|
*
|
|
* 1 0 0 1
|
|
*/
|
|
TEST( GaussianJunctionTree, eliminate )
|
|
{
|
|
GaussianFactorGraph fg = createChain();
|
|
GaussianJunctionTree junctionTree(fg);
|
|
BayesTree<GaussianConditional>::sharedClique rootClique = junctionTree.eliminate();
|
|
|
|
typedef BayesTree<GaussianConditional>::sharedConditional sharedConditional;
|
|
Matrix two = Matrix_(1,1,2.);
|
|
Matrix one = Matrix_(1,1,1.);
|
|
BayesTree<GaussianConditional> bayesTree_expected;
|
|
bayesTree_expected.insert(sharedConditional(new GaussianConditional(x4, Vector_(1,2.), two, Vector_(1,1.))));
|
|
bayesTree_expected.insert(sharedConditional(new GaussianConditional(x3, Vector_(1,2.), two, x4, two, Vector_(1,1.))));
|
|
bayesTree_expected.insert(sharedConditional(new GaussianConditional(x1, Vector_(1,0.), one*(-1), x3, one, Vector_(1,1.))));
|
|
bayesTree_expected.insert(sharedConditional(new GaussianConditional(x2, Vector_(1,2.), two, x1, one, x3, one, Vector_(1,1.))));
|
|
CHECK(assert_equal(*bayesTree_expected.root(), *rootClique));
|
|
CHECK(assert_equal(*(bayesTree_expected.root()->children().front()), *(rootClique->children().front())));
|
|
|
|
}
|
|
|
|
/* ************************************************************************* */
|
|
TEST( GaussianJunctionTree, optimizeMultiFrontal )
|
|
{
|
|
GaussianFactorGraph fg = createChain();
|
|
GaussianJunctionTree tree(fg);
|
|
|
|
VectorValues actual = tree.optimize();
|
|
VectorValues expected(vector<size_t>(4,1));
|
|
expected[x1] = Vector_(1, 0.);
|
|
expected[x2] = Vector_(1, 1.);
|
|
expected[x3] = Vector_(1, 0.);
|
|
expected[x4] = Vector_(1, 1.);
|
|
CHECK(assert_equal(expected,actual));
|
|
}
|
|
|
|
/* ************************************************************************* */
|
|
TEST(GaussianJunctionTree, complexExample) {
|
|
|
|
}
|
|
|
|
/* ************************************************************************* */
|
|
int main() { TestResult tr; return TestRegistry::runAllTests(tr);}
|
|
/* ************************************************************************* */
|