28#ifndef G2O_STRUCTURE_ONLY_SOLVER_H
29#define G2O_STRUCTURE_ONLY_SOLVER_H
57template <
int Po
intDoF>
62 virtual OptimizationAlgorithm::SolverResult
solve(
int iteration,
63 bool online =
false) {
69 OptimizationAlgorithm::SolverResult
calc(
71 int num_max_trials = 10) {
76 for (OptimizableGraph::VertexContainer::iterator it_v = vertices.begin();
77 it_v != vertices.end(); ++it_v) {
83 assert(track.size() >= 2);
86 double mu =
cst(0.01);
89 for (g2o::HyperGraph::EdgeSet::iterator it_t = track.begin();
90 it_t != track.end(); ++it_t) {
103 if (v->
fixed() ==
false) {
104 Eigen::Matrix<double, PointDoF, PointDoF, Eigen::ColMajor> H_pp;
107 for (
int i_g = 0; i_g < num_iters; ++i_g) {
112 assert(track.size() >= 1);
114 for (g2o::HyperGraph::EdgeSet::iterator it_t = track.begin();
115 it_t != track.end(); ++it_t) {
121 std::vector<bool> remember_fix_status(e->
vertices().size());
123 bool remember_fix_status[e->
vertices().size()];
125 for (
size_t k = 0; k < e->
vertices().size(); ++k) {
129 remember_fix_status[k] = otherV->
fixed();
140 for (
size_t k = 0; k < e->
vertices().size(); ++k) {
144 otherV->
setFixed(remember_fix_status[k]);
149 Eigen::Map<Eigen::Matrix<double, PointDoF, 1, Eigen::ColMajor> > b(
152 if (b.norm() < 0.001) {
159 Eigen::Matrix<double, PointDoF, PointDoF, Eigen::ColMajor> H_pp_mu =
161 H_pp_mu.diagonal().array() += mu;
163 Eigen::Matrix<double, PointDoF, PointDoF, Eigen::ColMajor> >
165 bool goodStep =
false;
166 if (chol_H_pp.isPositive()) {
167 Eigen::Matrix<double, PointDoF, 1, Eigen::ColMajor> delta_p =
170 v->
oplus(delta_p.data());
172 for (g2o::HyperGraph::EdgeSet::iterator it_t = track.begin();
173 it_t != track.end(); ++it_t) {
182 new_chi2 += e->
chi2();
185 assert(
g2o_isnan(new_chi2) ==
false &&
"Chi is NaN");
186 double rho = (chi2 - new_chi2);
208 if (trial >= num_max_trials) {
224 for (OptimizableGraph::VertexContainer::const_iterator it =
236 const std::vector<std::pair<int, int> >&) {
const VertexContainer & vertices() const
const Vertex * vertex(size_t i) const
const EdgeSet & edges() const
returns the set of hyper-edges that are leaving/entering in this vertex
std::set< Edge * > EdgeSet
provide memory workspace for computing the Jacobians
void updateSize(const HyperGraph::Edge *e, bool reset)
virtual void linearizeOplus(JacobianWorkspace &jacobianWorkspace)=0
virtual double chi2() const =0
virtual void computeError()=0
RobustKernel * robustKernel() const
if NOT NULL, error of this edge will be robustifed with the kernel
virtual void constructQuadraticForm()=0
A general case Vertex for optimization.
virtual void mapHessianMemory(double *d)=0
bool marginalized() const
true => this node is marginalized out during the optimization
virtual void clearQuadraticForm()=0
int dimension() const
dimension of the estimated state belonging to this node
virtual void discardTop()=0
bool fixed() const
true => this node is fixed during the optimization
virtual void push()=0
backup the position of the vertex to a stack
virtual double * bData()=0
return a pointer to the b vector associated with this vertex
void oplus(const double *v)
void setFixed(bool fixed)
true => this node should be considered fixed during the optimization
Generic interface for a non-linear solver operating on a graph.
const SparseOptimizer * optimizer() const
return the optimizer operating on
virtual void robustify(double squaredError, Vector3 &rho) const =0
Sparse matrix which uses blocks.
const VertexContainer & activeVertices() const
the vertices active in the current optimization
This is a solver for "structure-only" optimization".
const OptimizableGraph::VertexContainer & points() const
OptimizationAlgorithm::SolverResult calc(OptimizableGraph::VertexContainer &vertices, int num_iters, int num_max_trials=10)
virtual OptimizationAlgorithm::SolverResult solve(int iteration, bool online=false)
virtual bool computeMarginals(SparseBlockMatrix< MatrixX > &, const std::vector< std::pair< int, int > > &)
OptimizableGraph::VertexContainer _points
virtual bool updateStructure(const std::vector< HyperGraph::Vertex * > &, const HyperGraph::EdgeSet &)
OptimizableGraph::VertexContainer & points()
return the points of the optimization problem
constexpr double cst(long double v)
std::vector< OptimizableGraph::Vertex * > VertexContainer
vector container for vertices