29#include <Eigen/Cholesky>
30#include <Eigen/Eigenvalues>
49 for (HyperGraph::EdgeSet::iterator it = v->
edges().begin();
50 it != v->
edges().end(); ++it) {
64 for (StarSet::iterator it = stars.begin(); it != stars.end(); ++it) {
67 for (HyperGraph::EdgeSet::iterator it = s->
lowLevelEdges().begin();
70 esmap.insert(make_pair(e, s));
73 for (HyperGraph::EdgeSet::iterator it = s->
starEdges().begin();
76 esmap.insert(make_pair(e, s));
85 for (HyperGraph::EdgeSet::iterator it = v->
edges().begin();
86 it != v->
edges().end(); ++it) {
88 EdgeStarMap::iterator eit = esmap.find(e);
89 if (eit != esmap.end() && eit->second == s) eset.insert(e);
95 for (HyperGraph::EdgeSet::iterator it = v->
edges().begin();
96 it != v->
edges().end(); ++it) {
98 EdgeStarMap::iterator eit = esmap.find(e);
99 if (eit != esmap.end()) stars.insert(eit->second);
105 for (
size_t i = 0; i < e->
vertices().size(); i++) {
107 if (gauge.find(v) == gauge.end())
starsInVertex(stars, v, esmap);
116 for (StarSet::iterator it = stars.begin(); it != stars.end(); ++it) {
118 std::vector<OptimizableGraph::Vertex*> vertices(2);
125 if (v == vertices[0])
continue;
130 numEdges > minNumEdges) {
141 for (HyperGraph::EdgeSet::iterator it = eInSt.begin();
142 it != eInSt.end(); ++it) {
157 for (StarSet::iterator it = stars.begin(); it != stars.end(); ++it) {
159 for (HyperGraph::EdgeSet::iterator iit = s->
_starEdges.begin();
166 if (sset.size() > 1) {
176 std::string vertexTag,
int level,
int step,
177 int backboneIterations,
int starIterations,
178 double rejectionThreshold,
bool debug) {
183 d.
shortestPaths(gauge_, &f, std::numeric_limits<double>::max(), 1e-6,
false,
184 std::numeric_limits<double>::max() / 2);
199 stars.insert(it->second);
234 for (StarSet::iterator it = stars.begin(); it != stars.end(); ++it) {
238 if (backboneEdges.empty())
continue;
244 gauge.insert(*backboneVertices.begin());
256 std::multimap<HyperGraph::Vertex*, HyperGraph::Edge*> vemap;
257 for (HyperGraph::VertexSet::iterator bit = backboneVertices.begin();
258 bit != backboneVertices.end(); ++bit) {
260 for (HyperGraph::EdgeSet::iterator eit = v->
edges().begin();
261 eit != v->
edges().end(); ++eit) {
263 HyperGraph::EdgeSet::iterator feit = bact.
freeEdges().find(e);
265 otherEdges.insert(e);
267 for (
size_t i = 0; i < e->
vertices().size(); i++) {
270 if (backboneVertices.find(ve) == backboneVertices.end()) {
271 otherVertices.insert(ve);
272 vemap.insert(make_pair(ve, e));
283 if (solverWithHessian) {
295 cerr <<
"FATAL: failure while building linear structure" << endl;
302 cerr <<
"FATAL: hierarchical thing cannot be used with a solver that "
303 "does not support the system structure "
310 for (HyperGraph::VertexSet::iterator vit = otherVertices.begin();
311 vit != otherVertices.end(); ++vit) {
318 for (HyperGraph::EdgeSet::iterator eit = v->
edges().begin();
319 eit != v->
edges().end(); ++eit) {
321 if (otherEdges.find(e) != otherEdges.end()) s->
_lowLevelEdges.insert(e);
338 if (!starIterations || starOptResult > 0) {
348 for (HyperGraph::VertexSet::iterator vit = otherVertices.begin();
349 vit != otherVertices.end(); ++vit) {
354 for (
int i = 0; i < v->
dimension(); i++) {
357 EigenSolver<Eigen::MatrixXd> esolver;
359 VectorXcd ev = esolver.eigenvalues();
360 double emin = std::numeric_limits<double>::max();
361 double emax = -std::numeric_limits<double>::max();
362 for (
int i = 0; i < ev.size(); i++) {
363 emin = ev(i).real() > emin ? emin : ev(i).real();
364 emax = ev(i).real() < emax ? emax : ev(i).real();
367 double d = emin / emax;
370 if (d > rejectionThreshold) {
373 prunedStarVertices.insert(v);
374 for (HyperGraph::EdgeSet::iterator eit = v->
edges().begin();
375 eit != v->
edges().end(); ++eit) {
377 if (otherEdges.find(e) != otherEdges.end())
378 prunedStarEdges.insert(e);
389 std::vector<OptimizableGraph::Vertex*> vertices(2);
396 if (v == vertices[0])
continue;
409 char starLowName[100];
410 snprintf(starLowName, 99,
"star-%04d-low.g2o", starNum);
411 ofstream starLowStream(starLowName);
414 bool labelOk =
false;
415 if (!starIterations || starOptResult > 0)
419 char starHighName[100];
420 snprintf(starHighName, 99,
"star-%04d-high.g2o", starNum);
421 ofstream starHighStream(starHighName);
435 for (StarSet::iterator it = stars.begin(); it != stars.end(); ++it) {
static Factory * instance()
return the instance
const VertexContainer & vertices() const
abstract Vertex, your types must derive from that one
const EdgeSet & edges() const
returns the set of hyper-edges that are leaving/entering in this vertex
std::set< Edge * > EdgeSet
std::set< Vertex * > VertexSet
virtual double chi2() const =0
void setLevel(int l)
sets the level of the edge
A general case Vertex for optimization.
virtual const double & hessian(int i, int j) const =0
get the element from the hessian matrix
virtual double solveDirect(double lambda=0)=0
int dimension() const
dimension of the estimated state belonging to this node
const OptimizableGraph * graph() const
Base for solvers operating on the approximated Hessian, e.g., Gauss-Newton, Levenberg.
virtual void updateLinearSystem()
virtual bool buildLinearStructure()
virtual bool init(bool online=false)=0
void push(SparseOptimizer::VertexContainer &vlist)
push the estimate of a subset of the variables onto a stack
void computeActiveErrors()
int optimize(int iterations, bool online=false)
const EdgeContainer & activeEdges() const
the edges active in the current optimization
EdgeContainer::const_iterator findActiveEdge(const OptimizableGraph::Edge *e) const
virtual bool initializeOptimization(HyperGraph::EdgeSet &eset)
void pop(SparseOptimizer::VertexContainer &vlist)
pop (restore) the estimate a subset of the variables from the stack
virtual void computeInitialGuess()
OptimizationAlgorithm * solver()
void computeSimpleStars(StarSet &stars, SparseOptimizer *optimizer, EdgeLabeler *labeler, EdgeCreator *creator, OptimizableGraph::Vertex *gauge_, std::string edgeTag, std::string vertexTag, int level, int step, int backboneIterations, int starIterations, double rejectionThreshold, bool debug)
double activeVertexChi(const OptimizableGraph::Vertex *v)
size_t vertexEdgesInStar(HyperGraph::EdgeSet &eset, HyperGraph::Vertex *v, Star *s, EdgeStarMap &esmap)
void computeBorder(StarSet &stars, EdgeStarMap &hesmap)
void starsInVertex(StarSet &stars, HyperGraph::Vertex *v, EdgeStarMap &esmap)
void assignHierarchicalEdges(StarSet &stars, EdgeStarMap &esmap, EdgeLabeler *labeler, EdgeCreator *creator, SparseOptimizer *optimizer, int minNumEdges, int maxIterations)
std::set< Star * > StarSet
std::map< HyperGraph::Edge *, Star * > EdgeStarMap
void constructEdgeStarMap(EdgeStarMap &esmap, StarSet &stars, bool low)
void starsInEdge(StarSet &stars, HyperGraph::Edge *e, EdgeStarMap &esmap, HyperGraph::VertexSet &gauge)
HyperGraph::EdgeSet & freeEdges()
edges that are not yet assigned to any star
VertexStarMultimap & vertexStarMultiMap()
multimap vertex->star. Contains all the vertex assignments to all stars
void init()
initializes the visit and clears the internal structures
OptimizableGraph::Edge * createEdge(std::vector< OptimizableGraph::Vertex * > &vertices)
static void computeTree(AdjacencyMap &amap)
static void visitAdjacencyMap(AdjacencyMap &amap, TreeAction *action, bool useDistance=false)
void shortestPaths(HyperGraph::Vertex *v, HyperDijkstra::CostFunction *cost, double maxDistance=std::numeric_limits< double >::max(), double comparisonConditioner=1e-3, bool directed=false, double maxEdgeCost=std::numeric_limits< double >::max())
AdjacencyMap & adjacencyMap()
virtual void setFixed(HyperGraph::VertexSet &vset, bool fixed)
fixes/releases a set of vertices
std::vector< OptimizableGraph::Edge * > EdgeContainer
vector container for edges
virtual bool addEdge(HyperGraph::Edge *e)
bool saveSubset(std::ostream &os, HyperGraph::VertexSet &vset, int level=0)
save a subgraph to a stream. Again uses the Factory system.
bool labelStarEdges(int iterations, EdgeLabeler *labeler)
HyperGraph::EdgeSet & starFrontierEdges()
edges in the high level that lead to some node owned by a different star
HyperGraph::VertexSet _lowLevelVertices
vertices that are fixed (center of the star)
SparseOptimizer * optimizer()
returns the optimizer
HyperGraph::EdgeSet & lowLevelEdges()
low level edge set
HyperGraph::VertexSet & lowLevelVertices()
set of all vertices in the low level
HyperGraph::VertexSet _gauge
vertices that are fixed (center of the star)
HyperGraph::EdgeSet _starEdges
edges in the star
HyperGraph::EdgeSet & starEdges()
high level edge set
HyperGraph::EdgeSet _lowLevelEdges
edges in the lower level
HyperGraph::VertexSet & gauge()
set of nodes to keep fixed in the optimization