58 lines
1.5 KiB
C
58 lines
1.5 KiB
C
|
/**
|
||
|
* @file Factorization
|
||
|
* @brief Template Linear solver class that uses a Gaussian Factor Graph
|
||
|
* @author Kai Ni
|
||
|
* @author Frank Dellaert
|
||
|
*/
|
||
|
|
||
|
// $Id: GaussianFactorGraph.h,v 1.24 2009/08/14 20:48:51 acunning Exp $
|
||
|
|
||
|
#pragma once
|
||
|
|
||
|
#include <stdexcept>
|
||
|
#include "GaussianFactorGraph.h"
|
||
|
|
||
|
namespace gtsam {
|
||
|
|
||
|
class Ordering;
|
||
|
|
||
|
/**
|
||
|
* A linear system solver using factorization
|
||
|
*/
|
||
|
template <class NonlinearGraph, class Config>
|
||
|
class Factorization {
|
||
|
private:
|
||
|
boost::shared_ptr<const Ordering> ordering_;
|
||
|
bool useOldEliminate_;
|
||
|
|
||
|
public:
|
||
|
Factorization(boost::shared_ptr<const Ordering> ordering, bool old=true)
|
||
|
: ordering_(ordering), useOldEliminate_(old) {
|
||
|
if (!ordering) throw std::invalid_argument("Factorization constructor: ordering = NULL");
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* solve for the optimal displacement in the tangent space, and then solve
|
||
|
* the resulted linear system
|
||
|
*/
|
||
|
VectorConfig optimize(GaussianFactorGraph& fg) const {
|
||
|
return fg.optimize(*ordering_, useOldEliminate_);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* linearize the non-linear graph around the current config
|
||
|
*/
|
||
|
boost::shared_ptr<GaussianFactorGraph> linearize(const NonlinearGraph& g, const Config& config) const {
|
||
|
return g.linearize(config);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Does not do anything here in Factorization.
|
||
|
*/
|
||
|
boost::shared_ptr<Factorization> prepareLinear(const GaussianFactorGraph& fg) const {
|
||
|
return boost::shared_ptr<Factorization>(new Factorization(*this));
|
||
|
}
|
||
|
};
|
||
|
|
||
|
}
|