From 1edcdb6f80a27ef5e8acb0cbc07ce1d9767d78e6 Mon Sep 17 00:00:00 2001 From: Frank Dellaert Date: Wed, 18 Nov 2009 17:27:27 +0000 Subject: [PATCH] added SymbolicFactor constructor that takes a SymbolicConditional --- cpp/SymbolicFactor.cpp | 8 +++++++ cpp/SymbolicFactor.h | 5 +++++ cpp/testSymbolicFactorGraph.cpp | 40 +++++++++++++++++++++++++++++++-- 3 files changed, 51 insertions(+), 2 deletions(-) diff --git a/cpp/SymbolicFactor.cpp b/cpp/SymbolicFactor.cpp index 63ed9bc31..4bda97df7 100644 --- a/cpp/SymbolicFactor.cpp +++ b/cpp/SymbolicFactor.cpp @@ -19,6 +19,14 @@ using namespace std; namespace gtsam { + /* ************************************************************************* */ + SymbolicFactor::SymbolicFactor(const boost::shared_ptr& c) { + // initialize keys_ with parents + keys_ = c->parents(); + // add key on which conditional is defined + keys_.push_back(c->key()); + } + /* ************************************************************************* */ SymbolicFactor::SymbolicFactor(const vector & factors) { diff --git a/cpp/SymbolicFactor.h b/cpp/SymbolicFactor.h index 9c0ba9a9a..0f71af289 100644 --- a/cpp/SymbolicFactor.h +++ b/cpp/SymbolicFactor.h @@ -29,6 +29,11 @@ namespace gtsam { typedef boost::shared_ptr shared_ptr; + /** + * Construct from SymbolicConditional + */ + SymbolicFactor(const boost::shared_ptr& c); + /** * Constructor from a list of keys */ diff --git a/cpp/testSymbolicFactorGraph.cpp b/cpp/testSymbolicFactorGraph.cpp index 1f95fce12..82953d3e2 100644 --- a/cpp/testSymbolicFactorGraph.cpp +++ b/cpp/testSymbolicFactorGraph.cpp @@ -13,6 +13,7 @@ using namespace boost::assign; #include "smallExample.h" #include "SymbolicFactorGraph.h" #include "SymbolicBayesNet.h" +#include "FactorGraph-inl.h" using namespace std; using namespace gtsam; @@ -87,7 +88,7 @@ TEST( SymbolicFactorGraph, factors) } /* ************************************************************************* */ -TEST( GaussianFactorGraph, removeAndCombineFactors ) +TEST( SymbolicFactorGraph, removeAndCombineFactors ) { // create a test graph GaussianFactorGraph factorGraph = createGaussianFactorGraph(); @@ -104,7 +105,7 @@ TEST( GaussianFactorGraph, removeAndCombineFactors ) } /* ************************************************************************* */ -TEST( GaussianFactorGraph, eliminateOne ) +TEST( SymbolicFactorGraph, eliminateOne ) { // create a test graph GaussianFactorGraph factorGraph = createGaussianFactorGraph(); @@ -144,6 +145,41 @@ TEST( GaussianFactorGraph, eliminate ) CHECK(assert_equal(expected,actual)); } +/* ************************************************************************* */ +TEST( SymbolicFactorGraph, constructFromBayesNet ) +{ + // create expected factor graph + FactorGraph expected; + + list f1_keys; f1_keys += "l1","x1","x2"; + SymbolicFactor::shared_ptr f1(new SymbolicFactor(f1_keys)); + expected.push_back(f1); + + list f2_keys; f2_keys += "x1","l1"; + SymbolicFactor::shared_ptr f2(new SymbolicFactor(f2_keys)); + expected.push_back(f2); + + list f3_keys; f3_keys += "x1"; + SymbolicFactor::shared_ptr f3(new SymbolicFactor(f3_keys)); + expected.push_back(f3); + + + // create Bayes Net + SymbolicConditional::shared_ptr x2(new SymbolicConditional("x2", "l1", "x1")); + SymbolicConditional::shared_ptr l1(new SymbolicConditional("l1", "x1")); + SymbolicConditional::shared_ptr x1(new SymbolicConditional("x1")); + + SymbolicBayesNet bayesNet; + bayesNet.push_back(x2); + bayesNet.push_back(l1); + bayesNet.push_back(x1); + + // create actual factor graph from a Bayes Net + FactorGraph actual(bayesNet); + + CHECK(assert_equal(expected,actual)); +} + /* ************************************************************************* */ int main() { TestResult tr;