116 lines
3.0 KiB
C++
116 lines
3.0 KiB
C++
/*
|
|
* testConstrainedChordalBayesNet.cpp
|
|
*
|
|
* Created on: Aug 11, 2009
|
|
* Author: alexgc
|
|
*/
|
|
|
|
#include <iostream>
|
|
#include <CppUnitLite/TestHarness.h>
|
|
#include "ConstrainedChordalBayesNet.h"
|
|
#include "smallExample.h"
|
|
|
|
using namespace gtsam;
|
|
using namespace std;
|
|
|
|
TEST ( ConstrainedChordalBayesNet, basic )
|
|
{
|
|
ConstrainedChordalBayesNet ccbn = createConstrainedChordalBayesNet();
|
|
FGConfig c = createConstrainedConfig();
|
|
|
|
// get data back out
|
|
DeltaFunction::shared_ptr x0 = ccbn.get_delta("x0");
|
|
ConditionalGaussian::shared_ptr x1 = ccbn.get("x1");
|
|
|
|
Matrix R = eye(2);
|
|
Vector d = c["x1"];
|
|
double sigma = 0.1;
|
|
ConditionalGaussian::shared_ptr f1(new ConditionalGaussian(d/sigma, R/sigma));
|
|
|
|
DeltaFunction::shared_ptr f2(new DeltaFunction(c["x0"], "x0"));
|
|
|
|
CHECK(f1->equals(*x1));
|
|
CHECK(f2->equals(*x0));
|
|
}
|
|
|
|
TEST ( ConstrainedChordalBayesNet, equals )
|
|
{
|
|
// basic check
|
|
ConstrainedChordalBayesNet ccbn1 = createConstrainedChordalBayesNet();
|
|
ConstrainedChordalBayesNet ccbn2 = createConstrainedChordalBayesNet();
|
|
CHECK(ccbn1.equals(ccbn2));
|
|
|
|
// ensure deltas are compared
|
|
ConstrainedChordalBayesNet ccbn3;
|
|
FGConfig c = createConstrainedConfig();
|
|
Matrix R = eye(2);
|
|
Vector d = c["x1"];
|
|
double sigma = 0.1;
|
|
ConditionalGaussian::shared_ptr f1(new ConditionalGaussian(d/sigma, R/sigma));
|
|
ccbn3.insert("x1", f1);
|
|
|
|
CHECK(!ccbn1.equals(ccbn3));
|
|
}
|
|
|
|
TEST ( ConstrainedChordalBayesNet, copy )
|
|
{
|
|
// use copy to allow testing with old example
|
|
ChordalBayesNet cbn = createSmallChordalBayesNet();
|
|
ConstrainedChordalBayesNet actual(cbn);
|
|
|
|
ConditionalGaussian::shared_ptr x = cbn.get("x");
|
|
ConditionalGaussian::shared_ptr y = cbn.get("y");
|
|
|
|
ConstrainedChordalBayesNet expected;
|
|
expected.insert("x",x);
|
|
expected.insert("y",y);
|
|
|
|
CHECK(assert_equal(actual, expected));
|
|
}
|
|
|
|
TEST ( ConstrainedChordalBayesNet, optimize_baseline )
|
|
{
|
|
// optimize simple example
|
|
ChordalBayesNet cbn = createSmallChordalBayesNet();
|
|
ConstrainedChordalBayesNet ccbn(cbn);
|
|
boost::shared_ptr<FGConfig> actual = ccbn.optimize();
|
|
|
|
// create expected
|
|
FGConfig expected;
|
|
Vector x(1), y(1); x(0)=4.; y(0)=5.;
|
|
expected.insert("x", x);
|
|
expected.insert("y", y);
|
|
|
|
// verify
|
|
CHECK(expected.equals(*actual));
|
|
}
|
|
|
|
TEST ( ConstrainedChordalBayesNet, optimize )
|
|
{
|
|
ConstrainedChordalBayesNet ccbn = createConstrainedChordalBayesNet();
|
|
FGConfig expected = createConstrainedConfig();
|
|
|
|
// full optimization
|
|
boost::shared_ptr<FGConfig> actual1 = ccbn.optimize();
|
|
CHECK(expected.equals(*actual1));
|
|
|
|
// plug in a config
|
|
boost::shared_ptr<FGConfig> c1(new FGConfig);
|
|
c1->insert("x0", expected["x0"]);
|
|
boost::shared_ptr<FGConfig> actual2 = ccbn.optimize(c1);
|
|
CHECK(expected.equals(*actual2));
|
|
|
|
// plug in the other value
|
|
boost::shared_ptr<FGConfig> c2(new FGConfig);
|
|
c2->insert("x1", expected["x1"]);
|
|
boost::shared_ptr<FGConfig> actual3 = ccbn.optimize(c2);
|
|
CHECK(expected.equals(*actual3));
|
|
}
|
|
|
|
|
|
|
|
/* ************************************************************************* */
|
|
int main() { TestResult tr; return TestRegistry::runAllTests(tr);}
|
|
/* ************************************************************************* */
|
|
|