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