gtsam  3.2.1
gtsam
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Preconditioner.h
1 /*
2  * Preconditioner.h
3  *
4  * Created on: Jun 2, 2014
5  * Author: ydjian
6  */
7 
8 #pragma once
9 
10 #include <gtsam/base/Vector.h>
11 #include <boost/shared_ptr.hpp>
12 #include <iosfwd>
13 #include <map>
14 #include <string>
15 
16 namespace gtsam {
17 
18 class GaussianFactorGraph;
19 class KeyInfo;
20 class VectorValues;
21 
22 /* parameters for the preconditioner */
23 struct GTSAM_EXPORT PreconditionerParameters {
24 
25  typedef boost::shared_ptr<PreconditionerParameters> shared_ptr;
26 
27  enum Kernel { /* Preconditioner Kernel */
28  GTSAM = 0,
29  CHOLMOD /* experimental */
30  } kernel_ ;
31 
32  enum Verbosity {
33  SILENT = 0,
34  COMPLEXITY = 1,
35  ERROR = 2
36  } verbosity_ ;
37 
38  PreconditionerParameters(): kernel_(GTSAM), verbosity_(SILENT) {}
39  PreconditionerParameters(const PreconditionerParameters &p) : kernel_(p.kernel_), verbosity_(p.verbosity_) {}
40  virtual ~PreconditionerParameters() {}
41 
42  /* general interface */
43  inline Kernel kernel() const { return kernel_; }
44  inline Verbosity verbosity() const { return verbosity_; }
45 
46  void print() const ;
47 
48  virtual void print(std::ostream &os) const ;
49 
50  static Kernel kernelTranslator(const std::string &s);
51  static Verbosity verbosityTranslator(const std::string &s);
52  static std::string kernelTranslator(Kernel k);
53  static std::string verbosityTranslator(Verbosity v);
54 
55  /* for serialization */
56  friend std::ostream& operator<<(std::ostream &os, const PreconditionerParameters &p);
57  };
58 
59 /* PCG aims to solve the problem: A x = b by reparametrizing it as
60  * S^t A S y = S^t b or M A x = M b, where A \approx S S, or A \approx M
61  * The goal of this class is to provide a general interface to all preconditioners */
62 class GTSAM_EXPORT Preconditioner {
63 public:
64  typedef boost::shared_ptr<Preconditioner> shared_ptr;
65  typedef std::vector<size_t> Dimensions;
66 
67  /* Generic Constructor and Destructor */
68  Preconditioner() {}
69  virtual ~Preconditioner() {}
70 
71  /* Computation Interfaces */
72 
73  /* implement x = S^{-1} y */
74  virtual void solve(const Vector& y, Vector &x) const = 0;
75 // virtual void solve(const VectorValues& y, VectorValues &x) const = 0;
76 
77  /* implement x = S^{-T} y */
78  virtual void transposeSolve(const Vector& y, Vector& x) const = 0;
79 // virtual void transposeSolve(const VectorValues& y, VectorValues &x) const = 0;
80 
81 // /* implement x = S^{-1} S^{-T} y */
82 // virtual void fullSolve(const Vector& y, Vector &x) const = 0;
83 // virtual void fullSolve(const VectorValues& y, VectorValues &x) const = 0;
84 
85  /* build/factorize the preconditioner */
86  virtual void build(
87  const GaussianFactorGraph &gfg,
88  const KeyInfo &info,
89  const std::map<Key,Vector> &lambda
90  ) = 0;
91 };
92 
93 /*******************************************************************************************/
96  typedef boost::shared_ptr<DummyPreconditionerParameters> shared_ptr;
98  virtual ~DummyPreconditionerParameters() {}
99 };
100 
101 /*******************************************************************************************/
102 class GTSAM_EXPORT DummyPreconditioner : public Preconditioner {
103 public:
104  typedef Preconditioner Base;
105  typedef boost::shared_ptr<DummyPreconditioner> shared_ptr;
106 
107 public:
108 
109  DummyPreconditioner() : Base() {}
110  virtual ~DummyPreconditioner() {}
111 
112  /* Computation Interfaces for raw vector */
113  virtual void solve(const Vector& y, Vector &x) const { x = y; }
114 // virtual void solve(const VectorValues& y, VectorValues& x) const { x = y; }
115 
116  virtual void transposeSolve(const Vector& y, Vector& x) const { x = y; }
117 // virtual void transposeSolve(const VectorValues& y, VectorValues& x) const { x = y; }
118 
119 // virtual void fullSolve(const Vector& y, Vector &x) const { x = y; }
120 // virtual void fullSolve(const VectorValues& y, VectorValues& x) const { x = y; }
121 
122  virtual void build(
123  const GaussianFactorGraph &gfg,
124  const KeyInfo &info,
125  const std::map<Key,Vector> &lambda
126  ) {}
127 };
128 
129 /*******************************************************************************************/
134 };
135 
136 /*******************************************************************************************/
137 class GTSAM_EXPORT BlockJacobiPreconditioner : public Preconditioner {
138 public:
139  typedef Preconditioner Base;
141  virtual ~BlockJacobiPreconditioner() ;
142 
143  /* Computation Interfaces for raw vector */
144  virtual void solve(const Vector& y, Vector &x) const;
145  virtual void transposeSolve(const Vector& y, Vector& x) const ;
146 // virtual void fullSolve(const Vector& y, Vector &x) const ;
147 
148  virtual void build(
149  const GaussianFactorGraph &gfg,
150  const KeyInfo &info,
151  const std::map<Key,Vector> &lambda
152  ) ;
153 
154 protected:
155 
156  void clean() ;
157 
158  std::vector<size_t> dims_;
159  double *buffer_;
160  size_t bufferSize_;
161  size_t nnz_;
162 };
163 
164 /*********************************************************************************************/
165 /* factory method to create preconditioners */
166 boost::shared_ptr<Preconditioner> createPreconditioner(const boost::shared_ptr<PreconditionerParameters> parameters);
167 
168 }
169 
170 
typedef and functions to augment Eigen's VectorXd
void solve(Matrix &A, Matrix &B)
solve AX=B via in-place Lu factorization and backsubstitution After calling, A contains LU...
Definition: Matrix.cpp:283
Definition: Preconditioner.h:102
void print(const Matrix &A, const string &s, ostream &stream)
print a matrix
Definition: Matrix.cpp:183
Definition: Preconditioner.h:23
Definition: Preconditioner.h:130
Definition: IterativeSolver.h:115
A Linear Factor Graph is a factor graph where all factors are Gaussian, i.e.
Definition: GaussianFactorGraph.h:65
Definition: Preconditioner.h:62
Definition: Preconditioner.h:137
Definition: Preconditioner.h:94