76 lines
2.5 KiB
C++
76 lines
2.5 KiB
C++
/**
|
|
* GaussianJunctionTree.cpp
|
|
* Created on: Jul 12, 2010
|
|
* @author Kai Ni
|
|
* @author Frank Dellaert
|
|
* @brief: the Gaussian junction tree
|
|
*/
|
|
|
|
#include <gtsam/inference/ClusterTree-inl.h>
|
|
#include <gtsam/inference/JunctionTree-inl.h>
|
|
#include <gtsam/linear/GaussianJunctionTree.h>
|
|
|
|
#include <vector>
|
|
|
|
#include <boost/foreach.hpp>
|
|
|
|
namespace gtsam {
|
|
|
|
// explicit template instantiation
|
|
template class JunctionTree<GaussianFactorGraph>;
|
|
|
|
using namespace std;
|
|
|
|
/* ************************************************************************* */
|
|
/**
|
|
* GaussianJunctionTree
|
|
*/
|
|
void GaussianJunctionTree::btreeBackSubstitute(const boost::shared_ptr<const BayesTree::Clique>& current, VectorValues& config) const {
|
|
// solve the bayes net in the current node
|
|
GaussianBayesNet::const_reverse_iterator it = current->rbegin();
|
|
for (; it!=current->rend(); ++it) {
|
|
Vector x = (*it)->solve(config); // Solve for that variable
|
|
config[(*it)->key()] = x; // store result in partial solution
|
|
}
|
|
|
|
// solve the bayes nets in the child nodes
|
|
BOOST_FOREACH(const BayesTree::sharedClique& child, current->children()) {
|
|
btreeBackSubstitute(child, config);
|
|
}
|
|
}
|
|
|
|
/* ************************************************************************* */
|
|
void countDims(const boost::shared_ptr<const BayesTree<GaussianConditional>::Clique>& clique, vector<size_t>& dims) {
|
|
BOOST_FOREACH(const boost::shared_ptr<const GaussianConditional>& cond, *clique) {
|
|
// There should be no two conditionals on the same variable
|
|
assert(dims[cond->key()] == 0);
|
|
dims[cond->key()] = cond->dim();
|
|
}
|
|
BOOST_FOREACH(const boost::shared_ptr<const BayesTree<GaussianConditional>::Clique>& child, clique->children()) {
|
|
countDims(child, dims);
|
|
}
|
|
}
|
|
|
|
/* ************************************************************************* */
|
|
VectorValues GaussianJunctionTree::optimize() const {
|
|
tic("GJT optimize 1: eliminate");
|
|
// eliminate from leaves to the root
|
|
boost::shared_ptr<const BayesTree::Clique> rootClique(this->eliminate());
|
|
toc("GJT optimize 1: eliminate");
|
|
|
|
// Allocate solution vector
|
|
tic("GJT optimize 2: allocate VectorValues");
|
|
vector<size_t> dims(rootClique->back()->key() + 1, 0);
|
|
countDims(rootClique, dims);
|
|
VectorValues result(dims);
|
|
toc("GJT optimize 2: allocate VectorValues");
|
|
|
|
// back-substitution
|
|
tic("GJT optimize 3: back-substitute");
|
|
btreeBackSubstitute(rootClique, result);
|
|
toc("GJT optimize 3: back-substitute");
|
|
return result;
|
|
}
|
|
|
|
} //namespace gtsam
|