gtsam/linear/tests/testGaussianConditional.cpp

201 lines
5.2 KiB
C++

/**
* @file testGaussianConditional.cpp
* @brief Unit tests for Conditional gaussian
* @author Christian Potthast
**/
#include <gtsam/CppUnitLite/TestHarness.h>
#include <gtsam/base/TestableAssertions.h>
#ifdef HAVE_BOOST_SERIALIZATION
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#endif //HAVE_BOOST_SERIALIZATION
//#define GTSAM_MAGIC_KEY
#include <gtsam/base/Matrix.h>
#include <gtsam/linear/GaussianConditional.h>
#include <iostream>
#include <sstream>
#include <vector>
#include <boost/assign/std/list.hpp>
using namespace gtsam;
using namespace std;
using namespace boost::assign;
static const varid_t _x_=0, _x1_=1, _l1_=2;
/* ************************************************************************* */
TEST(GaussianConditional, constructor)
{
Matrix R = Matrix_(2,2,
-12.1244, -5.1962,
0., 4.6904);
Matrix S1 = Matrix_(2,2,
-5.2786, -8.6603,
5.0254, 5.5432);
Matrix S2 = Matrix_(2,2,
-10.5573, -5.9385,
5.5737, 3.0153);
Matrix S3 = Matrix_(2,2,
-11.3820, -7.2581,
-3.0153, -3.5635);
Vector d = Vector_(2, 1.0, 2.0);
Vector s = Vector_(2, 3.0, 4.0);
list<pair<varid_t, Matrix> > terms;
terms +=
make_pair(3, S1),
make_pair(5, S2),
make_pair(7, S3);
GaussianConditional actual(1, d, R, terms, s);
GaussianConditional::const_iterator it = actual.beginFrontals();
CHECK(assert_equal(varid_t(1), *it));
CHECK(assert_equal(R, actual.get_R()));
++ it;
CHECK(it == actual.endFrontals());
it = actual.beginParents();
CHECK(assert_equal(varid_t(3), *it));
CHECK(assert_equal(S1, actual.get_S(it)));
++ it;
CHECK(assert_equal(varid_t(5), *it));
CHECK(assert_equal(S2, actual.get_S(it)));
++ it;
CHECK(assert_equal(varid_t(7), *it));
CHECK(assert_equal(S3, actual.get_S(it)));
++it;
CHECK(it == actual.endParents());
CHECK(assert_equal(d, actual.get_d()));
CHECK(assert_equal(s, actual.get_sigmas()));
}
/* ************************************************************************* */
/* unit test for equals */
/* ************************************************************************* */
TEST( GaussianConditional, equals )
{
// create a conditional gaussian node
Matrix A1(2,2);
A1(0,0) = 1 ; A1(1,0) = 2;
A1(0,1) = 3 ; A1(1,1) = 4;
Matrix A2(2,2);
A2(0,0) = 6 ; A2(1,0) = 0.2;
A2(0,1) = 8 ; A2(1,1) = 0.4;
Matrix R(2,2);
R(0,0) = 0.1 ; R(1,0) = 0.3;
R(0,1) = 0.0 ; R(1,1) = 0.34;
Vector tau(2);
tau(0) = 1.0;
tau(1) = 0.34;
Vector d(2);
d(0) = 0.2; d(1) = 0.5;
GaussianConditional
expected(_x_,d, R, _x1_, A1, _l1_, A2, tau),
actual(_x_,d, R, _x1_, A1, _l1_, A2, tau);
CHECK( expected.equals(actual) );
}
/* ************************************************************************* */
/* unit test for solve */
/* ************************************************************************* */
TEST( GaussianConditional, solve )
{
//expected solution
Vector expected(2);
expected(0) = 20-3-11 ; expected(1) = 40-7-15;
// create a conditional gaussion node
Matrix R = Matrix_(2,2, 1., 0.,
0., 1.);
Matrix A1 = Matrix_(2,2, 1., 2.,
3., 4.);
Matrix A2 = Matrix_(2,2, 5., 6.,
7., 8.);
Vector d(2);
d(0) = 20.0; d(1) = 40.0;
Vector tau = ones(2);
GaussianConditional cg(_x_,d, R, _x1_, A1, _l1_, A2, tau);
Vector sx1(2);
sx1(0) = 1.0; sx1(1) = 1.0;
Vector sl1(2);
sl1(0) = 1.0; sl1(1) = 1.0;
VectorValues solution(vector<size_t>(3, 2));
solution[_x1_] = sx1;
solution[_l1_] = sl1;
Vector result = cg.solve(solution);
CHECK(assert_equal(expected , result, 0.0001));
}
/* ************************************************************************* */
/* unit test for serialization */
/* ************************************************************************* */
#ifdef HAVE_BOOST_SERIALIZATION
TEST( GaussianConditional, serialize )
{
// create a conditional gaussion node
Matrix A1(2,2);
A1(0,0) = 1 ; A1(1,0) = 2;
A1(0,1) = 3 ; A1(1,1) = 4;
Matrix A2(2,2);
A2(0,0) = 6 ; A2(1,0) = 0.2;
A2(0,1) = 8 ; A2(1,1) = 0.4;
Matrix R(2,2);
R(0,0) = 0.1 ; R(1,0) = 0.3;
R(0,1) = 0.0 ; R(1,1) = 0.34;
Vector d(2);
d(0) = 0.2; d(1) = 0.5;
GaussianConditional cg(_x2_, d, R, _x1_, A1, _l1_, A2);
//serialize the CG
std::ostringstream in_archive_stream;
boost::archive::text_oarchive in_archive(in_archive_stream);
in_archive << cg;
std::string serialized = in_archive_stream.str();
//deserialize the CGg
std::istringstream out_archive_stream(serialized);
boost::archive::text_iarchive out_archive(out_archive_stream);
GaussianConditional output;
out_archive >> output;
//check for equality
CHECK(cg.equals(output));
}
#endif //HAVE_BOOST_SERIALIZATION
/* ************************************************************************* */
int main() { TestResult tr; return TestRegistry::runAllTests(tr);}
/* ************************************************************************* */