65 lines
1.6 KiB
C++
65 lines
1.6 KiB
C++
/*
|
|
* SubgraphPreconditioner.h
|
|
* Created on: Dec 31, 2009
|
|
* @author: Frank Dellaert
|
|
*/
|
|
|
|
#ifndef SUBGRAPHPRECONDITIONER_H_
|
|
#define SUBGRAPHPRECONDITIONER_H_
|
|
|
|
#include "GaussianFactorGraph.h"
|
|
#include "GaussianBayesNet.h"
|
|
|
|
namespace gtsam {
|
|
|
|
/**
|
|
* Subgraph conditioner class, as explained in the RSS 2010 submission.
|
|
* Starting with a graph A*x=b, we split it in two systems A1*x=b1 and A2*x=b2
|
|
* We solve R1*x=c1, and make the substitution y=R1*x-c1.
|
|
* To use the class, give the Bayes Net R1*x=c1 and Graph A2*x=b2.
|
|
* Then solve for yhat using CG, and solve for xhat = system.x(yhat).
|
|
*/
|
|
class SubgraphPreconditioner {
|
|
|
|
private:
|
|
|
|
const GaussianBayesNet& Rc1_;
|
|
|
|
const GaussianFactorGraph& Ab2_;
|
|
const VectorConfig& xbar_;
|
|
const Errors b2bar_; /** b2 - A2*xbar */
|
|
|
|
public:
|
|
|
|
/**
|
|
* Constructor
|
|
* @param Rc1: the Bayes Net R1*x=c1
|
|
* @param Ab2: the Graph A2*x=b2
|
|
* @param xbar: the solution to R1*x=c1
|
|
*/
|
|
SubgraphPreconditioner(const GaussianBayesNet& Rc1,
|
|
const GaussianFactorGraph& Ab2, const VectorConfig& xbar);
|
|
|
|
/* x = xbar + inv(R1)*y */
|
|
VectorConfig x(const VectorConfig& y) const;
|
|
|
|
/* error, given y */
|
|
double error(const VectorConfig& y) const;
|
|
|
|
/** gradient */
|
|
VectorConfig gradient(const VectorConfig& y) const;
|
|
|
|
/** Apply operator A */
|
|
Errors operator*(const VectorConfig& y) const;
|
|
|
|
/** Apply operator A' */
|
|
VectorConfig operator^(const Errors& e) const;
|
|
|
|
/** print the object */
|
|
void print(const std::string& s = "SubgraphPreconditioner") const;
|
|
};
|
|
|
|
} // nsamespace gtsam
|
|
|
|
#endif /* SUBGRAPHPRECONDITIONER_H_ */
|