2010-10-23 02:02:55 +08:00
|
|
|
/* ----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
* GTSAM Copyright 2010, Georgia Tech Research Corporation,
|
|
|
|
|
* Atlanta, Georgia 30332-0415
|
|
|
|
|
* All Rights Reserved
|
|
|
|
|
* Authors: Frank Dellaert, et al. (see THANKS for the full author list)
|
|
|
|
|
|
|
|
|
|
* See LICENSE for the license information
|
|
|
|
|
|
|
|
|
|
* -------------------------------------------------------------------------- */
|
|
|
|
|
|
2010-10-22 08:06:54 +08:00
|
|
|
/**
|
|
|
|
|
* @file GaussianMultifrontalSolver.cpp
|
|
|
|
|
* @brief
|
|
|
|
|
* @author Richard Roberts
|
|
|
|
|
* @created Oct 21, 2010
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#include <gtsam/linear/GaussianMultifrontalSolver.h>
|
|
|
|
|
|
|
|
|
|
#include <gtsam/inference/GenericMultifrontalSolver-inl.h>
|
|
|
|
|
|
|
|
|
|
namespace gtsam {
|
|
|
|
|
|
|
|
|
|
/* ************************************************************************* */
|
|
|
|
|
GaussianMultifrontalSolver::GaussianMultifrontalSolver(const FactorGraph<GaussianFactor>& factorGraph) :
|
2010-10-23 02:02:55 +08:00
|
|
|
Base(factorGraph) {}
|
2010-10-22 08:06:54 +08:00
|
|
|
|
2010-11-16 07:01:50 +08:00
|
|
|
/* ************************************************************************* */
|
|
|
|
|
GaussianMultifrontalSolver::GaussianMultifrontalSolver(const FactorGraph<GaussianFactor>::shared_ptr& factorGraph, const VariableIndex::shared_ptr& variableIndex) :
|
|
|
|
|
Base(factorGraph, variableIndex) {}
|
|
|
|
|
|
2010-10-23 03:47:46 +08:00
|
|
|
/* ************************************************************************* */
|
|
|
|
|
GaussianMultifrontalSolver::shared_ptr
|
2010-11-16 07:01:50 +08:00
|
|
|
GaussianMultifrontalSolver::Create(const FactorGraph<GaussianFactor>::shared_ptr& factorGraph,
|
|
|
|
|
const VariableIndex::shared_ptr& variableIndex) {
|
|
|
|
|
return shared_ptr(new GaussianMultifrontalSolver(factorGraph, variableIndex));
|
2010-10-23 03:47:46 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* ************************************************************************* */
|
2010-11-16 07:01:50 +08:00
|
|
|
void GaussianMultifrontalSolver::replaceFactors(const FactorGraph<GaussianFactor>::shared_ptr& factorGraph) {
|
|
|
|
|
Base::replaceFactors(factorGraph);
|
2010-10-23 03:47:46 +08:00
|
|
|
}
|
|
|
|
|
|
2010-10-22 08:06:54 +08:00
|
|
|
/* ************************************************************************* */
|
2010-10-23 02:02:55 +08:00
|
|
|
BayesTree<GaussianConditional>::shared_ptr GaussianMultifrontalSolver::eliminate() const {
|
2011-03-25 03:27:12 +08:00
|
|
|
return Base::eliminate(&EliminateQR);
|
2010-10-22 08:06:54 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* ************************************************************************* */
|
|
|
|
|
VectorValues::shared_ptr GaussianMultifrontalSolver::optimize() const {
|
2011-02-15 01:02:50 +08:00
|
|
|
tic(2,"optimize");
|
2011-03-25 03:27:12 +08:00
|
|
|
VectorValues::shared_ptr values(new VectorValues(junctionTree_->optimize(&EliminateQR)));
|
2011-02-15 01:02:50 +08:00
|
|
|
toc(2,"optimize");
|
|
|
|
|
return values;
|
2010-10-22 08:06:54 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* ************************************************************************* */
|
2010-10-26 06:45:45 +08:00
|
|
|
GaussianFactorGraph::shared_ptr GaussianMultifrontalSolver::jointFactorGraph(const std::vector<Index>& js) const {
|
2011-03-25 03:27:12 +08:00
|
|
|
return GaussianFactorGraph::shared_ptr(new GaussianFactorGraph(*Base::jointFactorGraph(js,&EliminateQR)));
|
2010-10-22 08:06:54 +08:00
|
|
|
}
|
|
|
|
|
|
2010-10-23 05:27:46 +08:00
|
|
|
/* ************************************************************************* */
|
2010-10-26 06:45:45 +08:00
|
|
|
GaussianFactor::shared_ptr GaussianMultifrontalSolver::marginalFactor(Index j) const {
|
2011-03-25 03:27:12 +08:00
|
|
|
return Base::marginalFactor(j,&EliminateQR);
|
2010-10-26 06:45:45 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* ************************************************************************* */
|
|
|
|
|
std::pair<Vector, Matrix> GaussianMultifrontalSolver::marginalCovariance(Index j) const {
|
2011-01-21 06:22:00 +08:00
|
|
|
FactorGraph<GaussianFactor> fg;
|
2011-03-25 03:27:12 +08:00
|
|
|
fg.push_back(Base::marginalFactor(j,&EliminateQR));
|
|
|
|
|
GaussianConditional::shared_ptr conditional = EliminateQR(fg,1).first->front();
|
2010-10-23 14:12:02 +08:00
|
|
|
Matrix R = conditional->get_R();
|
2011-05-20 21:52:08 +08:00
|
|
|
return make_pair(conditional->get_d(), (R.transpose() * R).inverse());
|
2010-10-23 05:27:46 +08:00
|
|
|
}
|
|
|
|
|
|
2010-10-22 08:06:54 +08:00
|
|
|
}
|