BIG CHANGE: I got rid of the BayesChain/ChordalBayesNet classes and we now simply have a BayesNet class. It will just happen to be chordal when it is the result of an elimination. This will simplify a lot of things.

The main renaming that happened is

BayesChain -> BayesNet
ChordalBayesNet -> GaussianBayesNet == BayesNet<ConditionalGaussian>
SymbolicBayesChain -> SymbolicBayesNet == BayesNet<SymbolicConditional>
release/4.3a0
Frank Dellaert 2009-10-31 19:53:20 +00:00
parent 921cb0a8fc
commit 943b692a6b
24 changed files with 118 additions and 118 deletions

View File

@ -1,5 +1,5 @@
/** /**
* @file BayesChain-inl.h * @file BayesNet-inl.h
* @brief Bayes chain template definitions * @brief Bayes chain template definitions
* @author Frank Dellaert * @author Frank Dellaert
*/ */
@ -8,7 +8,7 @@
#include <boost/foreach.hpp> #include <boost/foreach.hpp>
#include <boost/tuple/tuple.hpp> #include <boost/tuple/tuple.hpp>
#include "BayesChain.h" #include "BayesNet.h"
using namespace std; using namespace std;
@ -19,7 +19,7 @@ namespace gtsam {
/* ************************************************************************* */ /* ************************************************************************* */
template<class Conditional> template<class Conditional>
void BayesChain<Conditional>::print(const string& s) const { void BayesNet<Conditional>::print(const string& s) const {
cout << s << ":\n"; cout << s << ":\n";
BOOST_FOREACH(string key, keys_) { BOOST_FOREACH(string key, keys_) {
const_iterator it = nodes_.find(key); const_iterator it = nodes_.find(key);
@ -29,7 +29,7 @@ namespace gtsam {
/* ************************************************************************* */ /* ************************************************************************* */
template<class Conditional> template<class Conditional>
bool BayesChain<Conditional>::equals(const BayesChain& cbn, double tol) const { bool BayesNet<Conditional>::equals(const BayesNet& cbn, double tol) const {
if(size() != cbn.size()) return false; if(size() != cbn.size()) return false;
if(keys_ != cbn.keys_) return false; if(keys_ != cbn.keys_) return false;
string key; string key;
@ -44,7 +44,7 @@ namespace gtsam {
/* ************************************************************************* */ /* ************************************************************************* */
template<class Conditional> template<class Conditional>
void BayesChain<Conditional>::insert void BayesNet<Conditional>::insert
(const string& key, boost::shared_ptr<Conditional> node) { (const string& key, boost::shared_ptr<Conditional> node) {
keys_.push_front(key); keys_.push_front(key);
nodes_.insert(make_pair(key,node)); nodes_.insert(make_pair(key,node));
@ -52,7 +52,7 @@ namespace gtsam {
/* ************************************************************************* */ /* ************************************************************************* */
template<class Conditional> template<class Conditional>
void BayesChain<Conditional>::erase(const string& key) { void BayesNet<Conditional>::erase(const string& key) {
list<string>::iterator it; list<string>::iterator it;
for (it=keys_.begin(); it != keys_.end(); ++it){ for (it=keys_.begin(); it != keys_.end(); ++it){
if( strcmp(key.c_str(), (*it).c_str()) == 0 ) if( strcmp(key.c_str(), (*it).c_str()) == 0 )

View File

@ -1,6 +1,6 @@
/** /**
* @file BayesChain * @file BayesNet
* @brief Bayes Chain, the result of eliminating a factor graph * @brief Bayes network
* @author Frank Dellaert * @author Frank Dellaert
*/ */
@ -17,13 +17,13 @@
namespace gtsam { namespace gtsam {
/** /**
* Bayes Chain, the result of eliminating a factor graph * Bayes network
* This is the base class for SymbolicBayesChain, DiscreteBayesChain, and GaussianBayesChain * This is the base class for SymbolicBayesNet, DiscreteBayesNet, and GaussianBayesNet
* Corresponding to what is used for the "Conditional" template argument: * corresponding to what is used for the "Conditional" template argument:
* a ConditionalProbabilityTable, a ConditionalGaussian, or a SymbolicConditional. * a SymbolicConditional, ConditionalProbabilityTable, or a ConditionalGaussian
*/ */
template<class Conditional> template<class Conditional>
class BayesChain: public Testable<BayesChain<Conditional> > { class BayesNet: public Testable<BayesNet<Conditional> > {
protected: protected:
/** nodes keys stored in topological sort order, i.e. from parents to children */ /** nodes keys stored in topological sort order, i.e. from parents to children */
@ -39,7 +39,7 @@ namespace gtsam {
void print(const std::string& s = "") const; void print(const std::string& s = "") const;
/** check equality */ /** check equality */
bool equals(const BayesChain& other, double tol = 1e-9) const; bool equals(const BayesNet& other, double tol = 1e-9) const;
/** insert: use reverse topological sort (i.e. parents last) */ /** insert: use reverse topological sort (i.e. parents last) */
void insert(const std::string& key, boost::shared_ptr<Conditional> node); void insert(const std::string& key, boost::shared_ptr<Conditional> node);

View File

@ -53,7 +53,7 @@ namespace gtsam {
/* ************************************************************************* */ /* ************************************************************************* */
// TODO: traversal is O(n*log(n)) but could be O(n) with better bayesChain // TODO: traversal is O(n*log(n)) but could be O(n) with better bayesChain
template<class Conditional> template<class Conditional>
BayesTree<Conditional>::BayesTree(BayesChain<Conditional>& bayesChain, bool verbose) { BayesTree<Conditional>::BayesTree(BayesNet<Conditional>& bayesChain, bool verbose) {
list<string> reverseOrdering = bayesChain.keys(); list<string> reverseOrdering = bayesChain.keys();
BOOST_FOREACH(string key, reverseOrdering) BOOST_FOREACH(string key, reverseOrdering)
insert(key,bayesChain[key],verbose); insert(key,bayesChain[key],verbose);

View File

@ -14,7 +14,7 @@
#include <boost/serialization/map.hpp> #include <boost/serialization/map.hpp>
#include <boost/serialization/list.hpp> #include <boost/serialization/list.hpp>
#include "Testable.h" #include "Testable.h"
#include "BayesChain.h" #include "BayesNet.h"
namespace gtsam { namespace gtsam {
@ -88,8 +88,8 @@ namespace gtsam {
/** Create an empty Bayes Tree */ /** Create an empty Bayes Tree */
BayesTree(); BayesTree();
/** Create a Bayes Tree from a SymbolicBayesChain */ /** Create a Bayes Tree from a SymbolicBayesNet */
BayesTree(BayesChain<Conditional>& bayesChain, bool verbose=false); BayesTree(BayesNet<Conditional>& bayesChain, bool verbose=false);
/** Destructor */ /** Destructor */
virtual ~BayesTree() {} virtual ~BayesTree() {}

View File

@ -69,8 +69,8 @@ bool ConstrainedLinearFactorGraph::equals(const LinearFactorGraph& fg, double to
} }
/* ************************************************************************* */ /* ************************************************************************* */
ChordalBayesNet::shared_ptr ConstrainedLinearFactorGraph::eliminate(const Ordering& ordering) { GaussianBayesNet::shared_ptr ConstrainedLinearFactorGraph::eliminate(const Ordering& ordering) {
ChordalBayesNet::shared_ptr cbn (new ChordalBayesNet()); GaussianBayesNet::shared_ptr cbn (new GaussianBayesNet());
BOOST_FOREACH(string key, ordering) { BOOST_FOREACH(string key, ordering) {
// constraints take higher priority in elimination, so check if // constraints take higher priority in elimination, so check if
@ -219,7 +219,7 @@ void ConstrainedLinearFactorGraph::update_constraints(const std::string& key,
/* ************************************************************************* */ /* ************************************************************************* */
VectorConfig ConstrainedLinearFactorGraph::optimize(const Ordering& ordering) { VectorConfig ConstrainedLinearFactorGraph::optimize(const Ordering& ordering) {
ChordalBayesNet::shared_ptr cbn = eliminate(ordering); GaussianBayesNet::shared_ptr cbn = eliminate(ordering);
boost::shared_ptr<VectorConfig> newConfig = cbn->optimize(); boost::shared_ptr<VectorConfig> newConfig = cbn->optimize();
return *newConfig; return *newConfig;
} }

View File

@ -9,7 +9,7 @@
#define CONSTRAINEDLINEARFACTORGRAPH_H_ #define CONSTRAINEDLINEARFACTORGRAPH_H_
#include "LinearFactorGraph.h" #include "LinearFactorGraph.h"
#include "ChordalBayesNet.h" #include "GaussianBayesNet.h"
#include "LinearConstraint.h" #include "LinearConstraint.h"
namespace gtsam { namespace gtsam {
@ -80,7 +80,7 @@ public:
* gaussian, with a different solving procedure. * gaussian, with a different solving procedure.
* @param ordering is the order to eliminate the variables * @param ordering is the order to eliminate the variables
*/ */
ChordalBayesNet::shared_ptr eliminate(const Ordering& ordering); GaussianBayesNet::shared_ptr eliminate(const Ordering& ordering);
/** /**
* Picks one of the contraints in a set of constraints to eliminate * Picks one of the contraints in a set of constraints to eliminate

View File

@ -1,5 +1,5 @@
/** /**
* @file ChordalBayesNet.cpp * @file GaussianBayesNet.cpp
* @brief Chordal Bayes Net, the result of eliminating a factor graph * @brief Chordal Bayes Net, the result of eliminating a factor graph
* @author Frank Dellaert * @author Frank Dellaert
*/ */
@ -8,21 +8,21 @@
#include <boost/foreach.hpp> #include <boost/foreach.hpp>
#include <boost/tuple/tuple.hpp> #include <boost/tuple/tuple.hpp>
#include "ChordalBayesNet.h" #include "GaussianBayesNet.h"
#include "VectorConfig.h" #include "VectorConfig.h"
using namespace std; using namespace std;
using namespace gtsam; using namespace gtsam;
// Explicitly instantiate so we don't have to include everywhere // Explicitly instantiate so we don't have to include everywhere
#include "BayesChain-inl.h" #include "BayesNet-inl.h"
template class BayesChain<ConditionalGaussian>; template class BayesNet<ConditionalGaussian>;
// trick from some reading group // trick from some reading group
#define FOREACH_PAIR( KEY, VAL, COL) BOOST_FOREACH (boost::tie(KEY,VAL),COL) #define FOREACH_PAIR( KEY, VAL, COL) BOOST_FOREACH (boost::tie(KEY,VAL),COL)
/* ************************************************************************* */ /* ************************************************************************* */
boost::shared_ptr<VectorConfig> ChordalBayesNet::optimize() const boost::shared_ptr<VectorConfig> GaussianBayesNet::optimize() const
{ {
boost::shared_ptr<VectorConfig> result(new VectorConfig); boost::shared_ptr<VectorConfig> result(new VectorConfig);
@ -37,7 +37,7 @@ boost::shared_ptr<VectorConfig> ChordalBayesNet::optimize() const
} }
/* ************************************************************************* */ /* ************************************************************************* */
pair<Matrix,Vector> ChordalBayesNet::matrix() const { pair<Matrix,Vector> GaussianBayesNet::matrix() const {
// add the dimensions of all variables to get matrix dimension // add the dimensions of all variables to get matrix dimension
// and at the same time create a mapping from keys to indices // and at the same time create a mapping from keys to indices

View File

@ -1,7 +1,7 @@
/** /**
* @file ChordalBayesNet.h * @file GaussianBayesNet.h
* @brief Chordal Bayes Net, the result of eliminating a factor graph * @brief Chordal Bayes Net, the result of eliminating a factor graph
* @brief ChordalBayesNet * @brief GaussianBayesNet
* @author Frank Dellaert * @author Frank Dellaert
*/ */
@ -12,25 +12,25 @@
#include <list> #include <list>
#include "ConditionalGaussian.h" #include "ConditionalGaussian.h"
#include "BayesChain.h" #include "BayesNet.h"
namespace gtsam { namespace gtsam {
/** Chordal Bayes Net, the result of eliminating a factor graph */ /** Chordal Bayes Net, the result of eliminating a factor graph */
class ChordalBayesNet : public BayesChain<ConditionalGaussian> class GaussianBayesNet : public BayesNet<ConditionalGaussian>
{ {
public: public:
typedef boost::shared_ptr<ChordalBayesNet> shared_ptr; typedef boost::shared_ptr<GaussianBayesNet> shared_ptr;
/** Construct an empty net */ /** Construct an empty net */
ChordalBayesNet() {} GaussianBayesNet() {}
/** Copy Constructor */ /** Copy Constructor */
// ChordalBayesNet(const ChordalBayesNet& cbn_in) : // GaussianBayesNet(const GaussianBayesNet& cbn_in) :
// keys_(cbn_in.keys_), nodes_(cbn_in.nodes_) {} // keys_(cbn_in.keys_), nodes_(cbn_in.nodes_) {}
/** Destructor */ /** Destructor */
virtual ~ChordalBayesNet() {} virtual ~GaussianBayesNet() {}
/** /**
* optimize, i.e. return x = inv(R)*d * optimize, i.e. return x = inv(R)*d

View File

@ -12,7 +12,7 @@
#include <colamd/colamd.h> #include <colamd/colamd.h>
#include "ChordalBayesNet.h" #include "GaussianBayesNet.h"
#include "FactorGraph-inl.h" #include "FactorGraph-inl.h"
#include "LinearFactorGraph.h" #include "LinearFactorGraph.h"
@ -23,16 +23,16 @@ using namespace gtsam;
template class FactorGraph<LinearFactor>; template class FactorGraph<LinearFactor>;
/* ************************************************************************* */ /* ************************************************************************* */
LinearFactorGraph::LinearFactorGraph(const ChordalBayesNet& CBN) LinearFactorGraph::LinearFactorGraph(const GaussianBayesNet& CBN)
{ {
setCBN(CBN); setCBN(CBN);
} }
/* ************************************************************************* */ /* ************************************************************************* */
void LinearFactorGraph::setCBN(const ChordalBayesNet& CBN) void LinearFactorGraph::setCBN(const GaussianBayesNet& CBN)
{ {
clear(); clear();
ChordalBayesNet::const_iterator it = CBN.begin(); GaussianBayesNet::const_iterator it = CBN.begin();
for(; it != CBN.end(); it++) { for(; it != CBN.end(); it++) {
LinearFactor::shared_ptr lf(new LinearFactor(it->first, it->second)); LinearFactor::shared_ptr lf(new LinearFactor(it->first, it->second));
push_back(lf); push_back(lf);
@ -55,10 +55,10 @@ set<string> LinearFactorGraph::find_separator(const string& key) const
// eliminate factor graph using the given (not necessarily complete) // eliminate factor graph using the given (not necessarily complete)
// ordering, yielding a chordal Bayes net and partially eliminated FG // ordering, yielding a chordal Bayes net and partially eliminated FG
/* ************************************************************************* */ /* ************************************************************************* */
ChordalBayesNet::shared_ptr GaussianBayesNet::shared_ptr
LinearFactorGraph::eliminate_partially(const Ordering& ordering) LinearFactorGraph::eliminate_partially(const Ordering& ordering)
{ {
ChordalBayesNet::shared_ptr chordalBayesNet (new ChordalBayesNet()); // empty GaussianBayesNet::shared_ptr chordalBayesNet (new GaussianBayesNet()); // empty
BOOST_FOREACH(string key, ordering) { BOOST_FOREACH(string key, ordering) {
ConditionalGaussian::shared_ptr cg = eliminateOne<ConditionalGaussian>(key); ConditionalGaussian::shared_ptr cg = eliminateOne<ConditionalGaussian>(key);
@ -71,10 +71,10 @@ LinearFactorGraph::eliminate_partially(const Ordering& ordering)
/* ************************************************************************* */ /* ************************************************************************* */
/** eliminate factor graph in the given order, yielding a chordal Bayes net */ /** eliminate factor graph in the given order, yielding a chordal Bayes net */
/* ************************************************************************* */ /* ************************************************************************* */
ChordalBayesNet::shared_ptr GaussianBayesNet::shared_ptr
LinearFactorGraph::eliminate(const Ordering& ordering) LinearFactorGraph::eliminate(const Ordering& ordering)
{ {
ChordalBayesNet::shared_ptr chordalBayesNet = eliminate_partially(ordering); GaussianBayesNet::shared_ptr chordalBayesNet = eliminate_partially(ordering);
return chordalBayesNet; return chordalBayesNet;
} }
@ -84,7 +84,7 @@ LinearFactorGraph::eliminate(const Ordering& ordering)
VectorConfig LinearFactorGraph::optimize(const Ordering& ordering) VectorConfig LinearFactorGraph::optimize(const Ordering& ordering)
{ {
// eliminate all nodes in the given ordering -> chordal Bayes net // eliminate all nodes in the given ordering -> chordal Bayes net
ChordalBayesNet::shared_ptr chordalBayesNet = eliminate(ordering); GaussianBayesNet::shared_ptr chordalBayesNet = eliminate(ordering);
// calculate new configuration (using backsubstitution) // calculate new configuration (using backsubstitution)
boost::shared_ptr<VectorConfig> newConfig = chordalBayesNet->optimize(); boost::shared_ptr<VectorConfig> newConfig = chordalBayesNet->optimize();

View File

@ -17,7 +17,7 @@
#include "LinearFactor.h" #include "LinearFactor.h"
#include "VectorConfig.h" #include "VectorConfig.h"
#include "FactorGraph.h" #include "FactorGraph.h"
#include "ChordalBayesNet.h" #include "GaussianBayesNet.h"
namespace gtsam { namespace gtsam {
@ -38,7 +38,7 @@ namespace gtsam {
/** /**
* Constructor that receives a Chordal Bayes Net and returns a LinearFactorGraph * Constructor that receives a Chordal Bayes Net and returns a LinearFactorGraph
*/ */
LinearFactorGraph(const ChordalBayesNet& CBN); LinearFactorGraph(const GaussianBayesNet& CBN);
/** unnormalized error */ /** unnormalized error */
double error(const VectorConfig& c) const { double error(const VectorConfig& c) const {
@ -59,7 +59,7 @@ namespace gtsam {
* given a chordal bayes net, sets the linear factor graph identical to that CBN * given a chordal bayes net, sets the linear factor graph identical to that CBN
* FD: imperative !! * FD: imperative !!
*/ */
void setCBN(const ChordalBayesNet& CBN); void setCBN(const GaussianBayesNet& CBN);
/** /**
* find the separator, i.e. all the nodes that have at least one * find the separator, i.e. all the nodes that have at least one
@ -71,13 +71,13 @@ namespace gtsam {
* eliminate factor graph in place(!) in the given order, yielding * eliminate factor graph in place(!) in the given order, yielding
* a chordal Bayes net * a chordal Bayes net
*/ */
boost::shared_ptr<ChordalBayesNet> eliminate(const Ordering& ordering); boost::shared_ptr<GaussianBayesNet> eliminate(const Ordering& ordering);
/** /**
* Same as eliminate but allows for passing an incomplete ordering * Same as eliminate but allows for passing an incomplete ordering
* that does not completely eliminate the graph * that does not completely eliminate the graph
*/ */
boost::shared_ptr<ChordalBayesNet> eliminate_partially(const Ordering& ordering); boost::shared_ptr<GaussianBayesNet> eliminate_partially(const Ordering& ordering);
/** /**
* optimize a linear factor graph * optimize a linear factor graph

View File

@ -86,20 +86,20 @@ timeLinearFactor: LDFLAGS += -L.libs -lgtsam
# graphs # graphs
sources += SymbolicFactorGraph.cpp LinearFactorGraph.cpp sources += SymbolicFactorGraph.cpp LinearFactorGraph.cpp
sources += SymbolicBayesChain.cpp ChordalBayesNet.cpp sources += SymbolicBayesNet.cpp GaussianBayesNet.cpp
sources += ConstrainedNonlinearFactorGraph.cpp ConstrainedLinearFactorGraph.cpp sources += ConstrainedNonlinearFactorGraph.cpp ConstrainedLinearFactorGraph.cpp
check_PROGRAMS += testFactorgraph testSymbolicFactorGraph check_PROGRAMS += testFactorgraph testSymbolicFactorGraph
check_PROGRAMS += testLinearFactorGraph testNonlinearFactorGraph check_PROGRAMS += testLinearFactorGraph testNonlinearFactorGraph
check_PROGRAMS += testChordalBayesNet testNonlinearOptimizer check_PROGRAMS += testGaussianBayesNet testNonlinearOptimizer
check_PROGRAMS += testSymbolicBayesChain testBayesTree check_PROGRAMS += testSymbolicBayesNet testBayesTree
check_PROGRAMS += testConstrainedNonlinearFactorGraph testConstrainedLinearFactorGraph check_PROGRAMS += testConstrainedNonlinearFactorGraph testConstrainedLinearFactorGraph
testFactorgraph_SOURCES = testFactorgraph.cpp testFactorgraph_SOURCES = testFactorgraph.cpp
testSymbolicFactorGraph_SOURCES = $(example) testSymbolicFactorGraph.cpp testSymbolicFactorGraph_SOURCES = $(example) testSymbolicFactorGraph.cpp
testLinearFactorGraph_SOURCES = $(example) testLinearFactorGraph.cpp testLinearFactorGraph_SOURCES = $(example) testLinearFactorGraph.cpp
testNonlinearFactorGraph_SOURCES = $(example) testNonlinearFactorGraph.cpp testNonlinearFactorGraph_SOURCES = $(example) testNonlinearFactorGraph.cpp
testNonlinearOptimizer_SOURCES = $(example) testNonlinearOptimizer.cpp testNonlinearOptimizer_SOURCES = $(example) testNonlinearOptimizer.cpp
testSymbolicBayesChain_SOURCES = $(example) testSymbolicBayesChain.cpp testSymbolicBayesNet_SOURCES = $(example) testSymbolicBayesNet.cpp
testChordalBayesNet_SOURCES = $(example) testChordalBayesNet.cpp testGaussianBayesNet_SOURCES = $(example) testGaussianBayesNet.cpp
testBayesTree_SOURCES = $(example) testBayesTree.cpp testBayesTree_SOURCES = $(example) testBayesTree.cpp
testConstrainedNonlinearFactorGraph_SOURCES = $(example) testConstrainedNonlinearFactorGraph.cpp testConstrainedNonlinearFactorGraph_SOURCES = $(example) testConstrainedNonlinearFactorGraph.cpp
testConstrainedLinearFactorGraph_SOURCES = $(example) testConstrainedLinearFactorGraph.cpp testConstrainedLinearFactorGraph_SOURCES = $(example) testConstrainedLinearFactorGraph.cpp
@ -109,8 +109,8 @@ testSymbolicFactorGraph_LDADD = libgtsam.la
testLinearFactorGraph_LDADD = libgtsam.la testLinearFactorGraph_LDADD = libgtsam.la
testNonlinearFactorGraph_LDADD = libgtsam.la testNonlinearFactorGraph_LDADD = libgtsam.la
testNonlinearOptimizer_LDADD = libgtsam.la testNonlinearOptimizer_LDADD = libgtsam.la
testSymbolicBayesChain_LDADD = libgtsam.la testSymbolicBayesNet_LDADD = libgtsam.la
testChordalBayesNet_LDADD = libgtsam.la testGaussianBayesNet_LDADD = libgtsam.la
testBayesTree_LDADD = libgtsam.la testBayesTree_LDADD = libgtsam.la
testConstrainedNonlinearFactorGraph_LDADD = libgtsam.la testConstrainedNonlinearFactorGraph_LDADD = libgtsam.la
testConstrainedLinearFactorGraph_LDADD = libgtsam.la testConstrainedLinearFactorGraph_LDADD = libgtsam.la
@ -168,7 +168,7 @@ headers += $(sources:.cpp=.h)
headers += FactorGraph.h FactorGraph-inl.h headers += FactorGraph.h FactorGraph-inl.h
headers += NonlinearFactorGraph.h NonlinearFactorGraph-inl.h headers += NonlinearFactorGraph.h NonlinearFactorGraph-inl.h
headers += NonlinearOptimizer.h NonlinearOptimizer-inl.h headers += NonlinearOptimizer.h NonlinearOptimizer-inl.h
headers += BayesChain.h BayesChain-inl.h BayesTree.h BayesTree-inl.h headers += BayesNet.h BayesNet-inl.h BayesTree.h BayesTree-inl.h
# create both dynamic and static libraries # create both dynamic and static libraries
AM_CXXFLAGS = -I$(boost) -fPIC AM_CXXFLAGS = -I$(boost) -fPIC

View File

@ -1,5 +1,5 @@
/** /**
* @file SymbolicBayesChain.cpp * @file SymbolicBayesNet.cpp
* @brief Chordal Bayes Net, the result of eliminating a factor graph * @brief Chordal Bayes Net, the result of eliminating a factor graph
* @author Frank Dellaert * @author Frank Dellaert
*/ */
@ -10,15 +10,15 @@
// trick from some reading group // trick from some reading group
#define FOREACH_PAIR( KEY, VAL, COL) BOOST_FOREACH (boost::tie(KEY,VAL),COL) #define FOREACH_PAIR( KEY, VAL, COL) BOOST_FOREACH (boost::tie(KEY,VAL),COL)
#include "SymbolicBayesChain.h" #include "SymbolicBayesNet.h"
#include "BayesChain-inl.h" #include "BayesNet-inl.h"
using namespace std; using namespace std;
namespace gtsam { namespace gtsam {
// Explicitly instantiate so we don't have to include everywhere // Explicitly instantiate so we don't have to include everywhere
template class BayesChain<SymbolicConditional>; template class BayesNet<SymbolicConditional>;
/* ************************************************************************* */ /* ************************************************************************* */

View File

@ -1,5 +1,5 @@
/** /**
* @file SymbolicBayesChain.h * @file SymbolicBayesNet.h
* @brief Symbolic Chordal Bayes Net, the result of eliminating a factor graph * @brief Symbolic Chordal Bayes Net, the result of eliminating a factor graph
* @author Frank Dellaert * @author Frank Dellaert
*/ */
@ -13,7 +13,7 @@
#include <boost/serialization/list.hpp> #include <boost/serialization/list.hpp>
#include "Testable.h" #include "Testable.h"
#include "BayesChain.h" #include "BayesNet.h"
#include "FactorGraph.h" #include "FactorGraph.h"
#include "SymbolicConditional.h" #include "SymbolicConditional.h"
@ -24,19 +24,19 @@ namespace gtsam {
/** /**
* Symbolic Bayes Chain, the (symbolic) result of eliminating a factor graph * Symbolic Bayes Chain, the (symbolic) result of eliminating a factor graph
*/ */
class SymbolicBayesChain: public BayesChain<SymbolicConditional> { class SymbolicBayesNet: public BayesNet<SymbolicConditional> {
public: public:
/** convenience typename for a shared pointer to this class */ /** convenience typename for a shared pointer to this class */
typedef boost::shared_ptr<SymbolicBayesChain> shared_ptr; typedef boost::shared_ptr<SymbolicBayesNet> shared_ptr;
/** /**
* Empty constructor * Empty constructor
*/ */
SymbolicBayesChain() {} SymbolicBayesNet() {}
/** Destructor */ /** Destructor */
virtual ~SymbolicBayesChain() { virtual ~SymbolicBayesNet() {
} }
}; };

View File

@ -9,7 +9,7 @@
#include "Ordering.h" #include "Ordering.h"
#include "FactorGraph-inl.h" #include "FactorGraph-inl.h"
#include "SymbolicFactorGraph.h" #include "SymbolicFactorGraph.h"
#include "SymbolicBayesChain.h" #include "SymbolicBayesNet.h"
using namespace std; using namespace std;
@ -19,10 +19,10 @@ namespace gtsam {
template class FactorGraph<SymbolicFactor>; template class FactorGraph<SymbolicFactor>;
/* ************************************************************************* */ /* ************************************************************************* */
SymbolicBayesChain::shared_ptr SymbolicBayesNet::shared_ptr
SymbolicFactorGraph::eliminate(const Ordering& ordering) SymbolicFactorGraph::eliminate(const Ordering& ordering)
{ {
SymbolicBayesChain::shared_ptr bayesChain (new SymbolicBayesChain()); SymbolicBayesNet::shared_ptr bayesChain (new SymbolicBayesNet());
BOOST_FOREACH(string key, ordering) { BOOST_FOREACH(string key, ordering) {
SymbolicConditional::shared_ptr conditional = eliminateOne<SymbolicConditional>(key); SymbolicConditional::shared_ptr conditional = eliminateOne<SymbolicConditional>(key);

View File

@ -15,7 +15,7 @@
namespace gtsam { namespace gtsam {
class SymbolicBayesChain; class SymbolicBayesNet;
/** Symbolic Factor Graph */ /** Symbolic Factor Graph */
class SymbolicFactorGraph: public FactorGraph<SymbolicFactor> { class SymbolicFactorGraph: public FactorGraph<SymbolicFactor> {
@ -44,7 +44,7 @@ namespace gtsam {
* eliminate factor graph in place(!) in the given order, yielding * eliminate factor graph in place(!) in the given order, yielding
* a chordal Bayes net * a chordal Bayes net
*/ */
boost::shared_ptr<SymbolicBayesChain> eliminate(const Ordering& ordering); boost::shared_ptr<SymbolicBayesNet> eliminate(const Ordering& ordering);
}; };

View File

@ -66,13 +66,13 @@ class Ordering {
void print() const; void print() const;
}; };
class ChordalBayesNet { class GaussianBayesNet {
ChordalBayesNet(); GaussianBayesNet();
void insert(string name, ConditionalGaussian* node); void insert(string name, ConditionalGaussian* node);
ConditionalGaussian* get(string name); ConditionalGaussian* get(string name);
VectorConfig* optimize(); VectorConfig* optimize();
void print() const; void print() const;
bool equals(const ChordalBayesNet& cbn) const; bool equals(const GaussianBayesNet& cbn) const;
pair<Matrix,Vector> matrix() const; pair<Matrix,Vector> matrix() const;
}; };
@ -89,7 +89,7 @@ class LinearFactorGraph {
VectorConfig optimize(const Ordering& ordering); VectorConfig optimize(const Ordering& ordering);
LinearFactor* combine_factors(string key); LinearFactor* combine_factors(string key);
ConditionalGaussian* eliminate_one(string key); ConditionalGaussian* eliminate_one(string key);
ChordalBayesNet* eliminate(const Ordering& ordering); GaussianBayesNet* eliminate(const Ordering& ordering);
pair<Matrix,Vector> matrix(const Ordering& ordering) const; pair<Matrix,Vector> matrix(const Ordering& ordering) const;
}; };

View File

@ -191,7 +191,7 @@ LinearFactorGraph createLinearFactorGraph()
* 1 1 9 * 1 1 9
* 1 5 * 1 5
*/ */
ChordalBayesNet createSmallChordalBayesNet() GaussianBayesNet createSmallGaussianBayesNet()
{ {
Matrix R11 = Matrix_(1,1,1.0), S12 = Matrix_(1,1,1.0); Matrix R11 = Matrix_(1,1,1.0), S12 = Matrix_(1,1,1.0);
Matrix R22 = Matrix_(1,1,1.0); Matrix R22 = Matrix_(1,1,1.0);
@ -202,7 +202,7 @@ ChordalBayesNet createSmallChordalBayesNet()
ConditionalGaussian::shared_ptr ConditionalGaussian::shared_ptr
x(new ConditionalGaussian(d1,R11,"y",S12)), x(new ConditionalGaussian(d1,R11,"y",S12)),
y(new ConditionalGaussian(d2,R22)); y(new ConditionalGaussian(d2,R22));
ChordalBayesNet cbn; GaussianBayesNet cbn;
cbn.insert("x",x); cbn.insert("x",x);
cbn.insert("y",y); cbn.insert("y",y);
@ -428,9 +428,9 @@ ConstrainedLinearFactorGraph createMultiConstraintGraph() {
//} //}
/* ************************************************************************* */ /* ************************************************************************* */
//ConstrainedChordalBayesNet createConstrainedChordalBayesNet() //ConstrainedGaussianBayesNet createConstrainedGaussianBayesNet()
//{ //{
// ConstrainedChordalBayesNet cbn; // ConstrainedGaussianBayesNet cbn;
// VectorConfig c = createConstrainedConfig(); // VectorConfig c = createConstrainedConfig();
// //
// // add regular conditional gaussian - no parent // // add regular conditional gaussian - no parent

View File

@ -56,7 +56,7 @@ namespace gtsam {
/** /**
* create small Chordal Bayes Net x <- y * create small Chordal Bayes Net x <- y
*/ */
ChordalBayesNet createSmallChordalBayesNet(); GaussianBayesNet createSmallGaussianBayesNet();
/** /**
* Create really non-linear factor graph (cos/sin) * Create really non-linear factor graph (cos/sin)

View File

@ -10,7 +10,7 @@ using namespace boost::assign;
#include <CppUnitLite/TestHarness.h> #include <CppUnitLite/TestHarness.h>
#include "SymbolicBayesChain.h" #include "SymbolicBayesNet.h"
#include "BayesTree-inl.h" #include "BayesTree-inl.h"
#include "SmallExample.h" #include "SmallExample.h"
@ -56,7 +56,7 @@ TEST( BayesTree, constructor )
CHECK(assert_equal(expected_root,actual_root)); CHECK(assert_equal(expected_root,actual_root));
// Create from symbolic Bayes chain in which we want to discover cliques // Create from symbolic Bayes chain in which we want to discover cliques
SymbolicBayesChain ASIA; SymbolicBayesNet ASIA;
ASIA.insert("X", X); ASIA.insert("X", X);
ASIA.insert("T", T); ASIA.insert("T", T);
ASIA.insert("S", S); ASIA.insert("S", S);
@ -87,7 +87,7 @@ TEST( BayesTree, smoother )
ordering.push_back(symbol('x', t)); ordering.push_back(symbol('x', t));
// eliminate using the "natural" ordering // eliminate using the "natural" ordering
ChordalBayesNet::shared_ptr chordalBayesNet = smoother.eliminate(ordering); GaussianBayesNet::shared_ptr chordalBayesNet = smoother.eliminate(ordering);
// Create the Bayes tree // Create the Bayes tree
BayesTree<ConditionalGaussian> bayesTree(*chordalBayesNet,false); BayesTree<ConditionalGaussian> bayesTree(*chordalBayesNet,false);
@ -109,7 +109,7 @@ TEST( BayesTree, balanced_smoother )
ordering += "x1","x3","x5","x7","x2","x6","x4"; ordering += "x1","x3","x5","x7","x2","x6","x4";
// eliminate using a "nested dissection" ordering // eliminate using a "nested dissection" ordering
ChordalBayesNet::shared_ptr chordalBayesNet = smoother.eliminate(ordering); GaussianBayesNet::shared_ptr chordalBayesNet = smoother.eliminate(ordering);
// Create the Bayes tree // Create the Bayes tree
BayesTree<ConditionalGaussian> bayesTree(*chordalBayesNet,false); BayesTree<ConditionalGaussian> bayesTree(*chordalBayesNet,false);

View File

@ -25,7 +25,7 @@ TEST( ConstrainedLinearFactorGraph, elimination1 )
// eliminate x // eliminate x
Ordering ord; Ordering ord;
ord.push_back("x"); ord.push_back("x");
ChordalBayesNet::shared_ptr cbn = fg.eliminate(ord); GaussianBayesNet::shared_ptr cbn = fg.eliminate(ord);
// verify result of elimination // verify result of elimination
// CBN of size 1, as we only eliminated X now // CBN of size 1, as we only eliminated X now
@ -399,10 +399,10 @@ TEST( ConstrainedLinearFactorGraph, optimize_multi_constraint )
// ord1.push_back("x0"); // ord1.push_back("x0");
// ord1.push_back("x1"); // ord1.push_back("x1");
// //
// ConstrainedChordalBayesNet::shared_ptr actual = fg.eliminate(ord1); // ConstrainedGaussianBayesNet::shared_ptr actual = fg.eliminate(ord1);
// //
// // create an expected bayes net // // create an expected bayes net
// ConstrainedChordalBayesNet::shared_ptr expected(new ConstrainedChordalBayesNet); // ConstrainedGaussianBayesNet::shared_ptr expected(new ConstrainedGaussianBayesNet);
// //
// ConstrainedConditionalGaussian::shared_ptr d(new ConstrainedConditionalGaussian);//(c["x0"], "x0")); // ConstrainedConditionalGaussian::shared_ptr d(new ConstrainedConditionalGaussian);//(c["x0"], "x0"));
// expected->insert_df("x0", d); // expected->insert_df("x0", d);

View File

@ -1,6 +1,6 @@
/** /**
* @file testChordalBayesNet.cpp * @file testGaussianBayesNet.cpp
* @brief Unit tests for ChordalBayesNet * @brief Unit tests for GaussianBayesNet
* @author Frank Dellaert * @author Frank Dellaert
*/ */
@ -17,13 +17,13 @@
#include <boost/archive/text_iarchive.hpp> #include <boost/archive/text_iarchive.hpp>
#endif //HAVE_BOOST_SERIALIZATION #endif //HAVE_BOOST_SERIALIZATION
#include "ChordalBayesNet.h" #include "GaussianBayesNet.h"
#include "smallExample.h" #include "smallExample.h"
using namespace gtsam; using namespace gtsam;
/* ************************************************************************* */ /* ************************************************************************* */
TEST( ChordalBayesNet, constructor ) TEST( GaussianBayesNet, constructor )
{ {
// small Bayes Net x <- y // small Bayes Net x <- y
// x y d // x y d
@ -38,16 +38,16 @@ TEST( ChordalBayesNet, constructor )
ConditionalGaussian x(d1,R11,"y",S12), y(d2,R22); ConditionalGaussian x(d1,R11,"y",S12), y(d2,R22);
// check small example which uses constructor // check small example which uses constructor
ChordalBayesNet cbn = createSmallChordalBayesNet(); GaussianBayesNet cbn = createSmallGaussianBayesNet();
CHECK( x.equals(*cbn["x"]) ); CHECK( x.equals(*cbn["x"]) );
CHECK( y.equals(*cbn["y"]) ); CHECK( y.equals(*cbn["y"]) );
} }
/* ************************************************************************* */ /* ************************************************************************* */
TEST( ChordalBayesNet, matrix ) TEST( GaussianBayesNet, matrix )
{ {
// Create a test graph // Create a test graph
ChordalBayesNet cbn = createSmallChordalBayesNet(); GaussianBayesNet cbn = createSmallGaussianBayesNet();
Matrix R; Vector d; Matrix R; Vector d;
boost::tie(R,d) = cbn.matrix(); // find matrix and RHS boost::tie(R,d) = cbn.matrix(); // find matrix and RHS
@ -63,10 +63,10 @@ TEST( ChordalBayesNet, matrix )
} }
/* ************************************************************************* */ /* ************************************************************************* */
TEST( ChordalBayesNet, optimize ) TEST( GaussianBayesNet, optimize )
{ {
// optimize small Bayes Net // optimize small Bayes Net
ChordalBayesNet cbn = createSmallChordalBayesNet(); GaussianBayesNet cbn = createSmallGaussianBayesNet();
boost::shared_ptr<VectorConfig> actual = cbn.optimize(); boost::shared_ptr<VectorConfig> actual = cbn.optimize();
VectorConfig expected; VectorConfig expected;
@ -80,10 +80,10 @@ TEST( ChordalBayesNet, optimize )
/* ************************************************************************* */ /* ************************************************************************* */
#ifdef HAVE_BOOST_SERIALIZATION #ifdef HAVE_BOOST_SERIALIZATION
TEST( ChordalBayesNet, serialize ) TEST( GaussianBayesNet, serialize )
{ {
// //create a starting CBN // //create a starting CBN
// ChordalBayesNet cbn = createSmallChordalBayesNet(); // GaussianBayesNet cbn = createSmallGaussianBayesNet();
// //
// //serialize the CBN // //serialize the CBN
// std::ostringstream in_archive_stream; // std::ostringstream in_archive_stream;
@ -117,7 +117,7 @@ TEST( ChordalBayesNet, serialize )
// //deserialize the CBN // //deserialize the CBN
// std::istringstream out_archive_stream(clean); // std::istringstream out_archive_stream(clean);
// boost::archive::text_iarchive out_archive(out_archive_stream); // boost::archive::text_iarchive out_archive(out_archive_stream);
// ChordalBayesNet output; // GaussianBayesNet output;
// out_archive >> output; // out_archive >> output;
// CHECK(cbn.equals(output)); // CHECK(cbn.equals(output));
} }

View File

@ -272,7 +272,7 @@ TEST( LinearFactorGraph, eliminateAll )
Vector d3(2); d3(0) = 2.23607; d3(1) = -1.56525; Vector d3(2); d3(0) = 2.23607; d3(1) = -1.56525;
ConditionalGaussian::shared_ptr cg3(new ConditionalGaussian(d3, R3, "l1", A21, "x1", A22)); ConditionalGaussian::shared_ptr cg3(new ConditionalGaussian(d3, R3, "l1", A21, "x1", A22));
ChordalBayesNet expected; GaussianBayesNet expected;
expected.insert("x2", cg3); expected.insert("x2", cg3);
expected.insert("l1", cg2); expected.insert("l1", cg2);
expected.insert("x1", cg1); expected.insert("x1", cg1);
@ -281,7 +281,7 @@ TEST( LinearFactorGraph, eliminateAll )
LinearFactorGraph fg1 = createLinearFactorGraph(); LinearFactorGraph fg1 = createLinearFactorGraph();
Ordering ord1; Ordering ord1;
ord1 += "x2","l1","x1"; ord1 += "x2","l1","x1";
ChordalBayesNet::shared_ptr actual = fg1.eliminate(ord1); GaussianBayesNet::shared_ptr actual = fg1.eliminate(ord1);
CHECK(assert_equal(expected,*actual,tol)); CHECK(assert_equal(expected,*actual,tol));
} }
@ -311,7 +311,7 @@ TEST( LinearFactorGraph, copying )
// now eliminate the copy // now eliminate the copy
Ordering ord1; Ordering ord1;
ord1 += "x2","l1","x1"; ord1 += "x2","l1","x1";
ChordalBayesNet::shared_ptr actual1 = copy.eliminate(ord1); GaussianBayesNet::shared_ptr actual1 = copy.eliminate(ord1);
// Create the same graph, but not by copying // Create the same graph, but not by copying
LinearFactorGraph expected = createLinearFactorGraph(); LinearFactorGraph expected = createLinearFactorGraph();
@ -350,7 +350,7 @@ TEST( LinearFactorGraph, matrix )
} }
/* ************************************************************************* */ /* ************************************************************************* */
TEST( LinearFactorGraph, CONSTRUCTOR_ChordalBayesNet ) TEST( LinearFactorGraph, CONSTRUCTOR_GaussianBayesNet )
{ {
LinearFactorGraph fg = createLinearFactorGraph(); LinearFactorGraph fg = createLinearFactorGraph();
@ -358,9 +358,9 @@ TEST( LinearFactorGraph, CONSTRUCTOR_ChordalBayesNet )
// render with a given ordering // render with a given ordering
Ordering ord; Ordering ord;
ord += "x2","l1","x1"; ord += "x2","l1","x1";
ChordalBayesNet::shared_ptr CBN = fg.eliminate(ord); GaussianBayesNet::shared_ptr CBN = fg.eliminate(ord);
LinearFactorGraph fg2(*CBN); LinearFactorGraph fg2(*CBN);
ChordalBayesNet::shared_ptr CBN2 = fg2.eliminate(ord); GaussianBayesNet::shared_ptr CBN2 = fg2.eliminate(ord);
CHECK(CBN->equals(*CBN2)); CHECK(CBN->equals(*CBN2));
} }

View File

@ -1,5 +1,5 @@
/** /**
* @file testSymbolicBayesChain.cpp * @file testSymbolicBayesNet.cpp
* @brief Unit tests for a symbolic Bayes chain * @brief Unit tests for a symbolic Bayes chain
* @author Frank Dellaert * @author Frank Dellaert
*/ */
@ -11,21 +11,21 @@ using namespace boost::assign;
#include <CppUnitLite/TestHarness.h> #include <CppUnitLite/TestHarness.h>
#include "smallExample.h" #include "smallExample.h"
#include "SymbolicBayesChain.h" #include "SymbolicBayesNet.h"
#include "SymbolicFactorGraph.h" #include "SymbolicFactorGraph.h"
using namespace std; using namespace std;
using namespace gtsam; using namespace gtsam;
/* ************************************************************************* */ /* ************************************************************************* */
TEST( SymbolicBayesChain, constructor ) TEST( SymbolicBayesNet, constructor )
{ {
// Create manually // Create manually
SymbolicConditional::shared_ptr SymbolicConditional::shared_ptr
x2(new SymbolicConditional("l1", "x1")), x2(new SymbolicConditional("l1", "x1")),
l1(new SymbolicConditional("x1")), l1(new SymbolicConditional("x1")),
x1(new SymbolicConditional()); x1(new SymbolicConditional());
SymbolicBayesChain expected; SymbolicBayesNet expected;
expected.insert("x2",x2); expected.insert("x2",x2);
expected.insert("l1",l1); expected.insert("l1",l1);
expected.insert("x1",x1); expected.insert("x1",x1);
@ -37,7 +37,7 @@ TEST( SymbolicBayesChain, constructor )
// eliminate it // eliminate it
Ordering ordering; Ordering ordering;
ordering += "x2","l1","x1"; ordering += "x2","l1","x1";
SymbolicBayesChain::shared_ptr actual = fg.eliminate(ordering); SymbolicBayesNet::shared_ptr actual = fg.eliminate(ordering);
CHECK(assert_equal(expected, *actual)); CHECK(assert_equal(expected, *actual));
} }

View File

@ -1,6 +1,6 @@
/** /**
* @file testSymbolicBayesChain.cpp * @file testSymbolicFactorGraph.cpp
* @brief Unit tests for a symbolic Bayes chain * @brief Unit tests for a symbolic Factor Graph
* @author Frank Dellaert * @author Frank Dellaert
*/ */
@ -11,7 +11,7 @@ using namespace boost::assign;
#include "smallExample.h" #include "smallExample.h"
#include "SymbolicFactorGraph.h" #include "SymbolicFactorGraph.h"
#include "SymbolicBayesChain.h" #include "SymbolicBayesNet.h"
using namespace std; using namespace std;
using namespace gtsam; using namespace gtsam;
@ -127,7 +127,7 @@ TEST( LinearFactorGraph, eliminate )
SymbolicConditional::shared_ptr l1(new SymbolicConditional("x1")); SymbolicConditional::shared_ptr l1(new SymbolicConditional("x1"));
SymbolicConditional::shared_ptr x1(new SymbolicConditional()); SymbolicConditional::shared_ptr x1(new SymbolicConditional());
SymbolicBayesChain expected; SymbolicBayesNet expected;
expected.insert("x2", x2); expected.insert("x2", x2);
expected.insert("l1", l1); expected.insert("l1", l1);
expected.insert("x1", x1); expected.insert("x1", x1);
@ -139,7 +139,7 @@ TEST( LinearFactorGraph, eliminate )
// eliminate it // eliminate it
Ordering ordering; Ordering ordering;
ordering += "x2","l1","x1"; ordering += "x2","l1","x1";
SymbolicBayesChain::shared_ptr actual = fg.eliminate(ordering); SymbolicBayesNet::shared_ptr actual = fg.eliminate(ordering);
CHECK(assert_equal(expected,*actual)); CHECK(assert_equal(expected,*actual));
} }