STK++ 0.9.13
STK::CG< MultFunctor, ColVector, InitFunctor > Class Template Reference

The conjugate gradient method is an algorithm for the numerical solution of particular systems of linear equations, namely those whose matrix is symmetric and positive-definite. More...

#include <STK_CG.h>

Public Types

typedef ColVector::Type Type
 

Public Member Functions

 CG ()
 Default Constructor.
 
 CG (MultFunctor const &mult, ColVector const &b, InitFunctor *const &p_init=0, Type eps=Arithmetic< Type >::epsilon())
 Constructor.
 
 CG (CG const &cg)
 Copy constructor.
 
 ~CG ()
 destructor
 
CGclone () const
 clone pattern
 
ColVector constx () const
 
Real constx (int const &i) const
 
int constiter () const
 
int constnbStart () const
 
ColVector constr () const
 
void setEps (Type const &eps)
 Set the tolerance.
 
void setB (ColVector const &b)
 Set the constant vector.
 
void setMultFunctor (MultFunctor const &mult)
 Set functor computing Ax.
 
void setInitFunctor (InitFunctor *const &p_init)
 Set functor computing x at initialization.
 
int run ()
 
String consterror () const
 get the last error message.
 

Protected Member Functions

int cg ()
 

Protected Attributes

String msg_error_
 String with the last error message.
 

Private Attributes

ColVector x_
 solution of the system
 
ColVector r_
 residuals of the system
 
Type eps_
 tolerance
 
int iter_
 number of iterations
 
int nbStart_
 number of restart_
 
MultFunctor constp_mult_
 pointer on the functor performing Ax
 
InitFunctor constp_init_
 pointer on the functor initializing x
 
ColVector constp_b_
 constant pointer on the second member of the system
 

Detailed Description

template<class MultFunctor, class ColVector, class InitFunctor = DefaultFunctor<ColVector>>
class STK::CG< MultFunctor, ColVector, InitFunctor >

The conjugate gradient method is an algorithm for the numerical solution of particular systems of linear equations, namely those whose matrix is symmetric and positive-definite.

The conjugate gradient method is an iterative method, so it can be applied to sparse systems that are too large to be handled by direct methods such as the Cholesky decomposition.

The algorithm is detailed below for solving $ \mathbf{A}\mathbf{x} = \mathbf{b} $ where A is a real, symmetric, positive-definite matrix. The input vector x can be an approximate initial solution or 0.

\[
  \begin{array}{l}
  \mathbf{r}_0 := \mathbf{b} - \mathbf{A x}_0  \\
  \mathbf{p}_0 := \mathbf{r}_0 \\
  k  := 0 \\
 \hbox{repeat} \\
\qquad \alpha_k  := \frac{\mathbf{r}_k^\mathrm{T} \mathbf{r}_k}{\mathbf{p}_k^\mathrm{T} \mathbf{A p}_k}  \, \\
\qquad \mathbf{x}_{k+1} := \mathbf{x}_k + \alpha_k \mathbf{p}_k \\
\qquad \mathbf{r}_{k+1}  := \mathbf{r}_k - \alpha_k \mathbf{A p}_k \\
\qquad \hbox{if } r_{k+1} \hbox{ is sufficiently small then exit loop} \\
\qquad \beta_k  := \frac{\mathbf{r}_{k+1}^\mathrm{T} \mathbf{r}_{k+1}}{\mathbf{r}_k^\mathrm{T} \mathbf{r}_k}  \\
\qquad \mathbf{p}_{k+1} := \mathbf{r}_{k+1} + \beta_k \mathbf{p}_k  \\
\qquad k  := k + 1  \\
\hbox{end repeat}
\end{array}
\]

The result is $ x_{k+1}$

Template Parameters
MultFunctorA functor computing the result of Ax.
InitFunctorA functor computing the initial value x.
ColVectorThe type of the containers for the vectors.

Definition at line 86 of file STK_CG.h.

Member Typedef Documentation

◆ Type

template<class MultFunctor , class ColVector , class InitFunctor = DefaultFunctor<ColVector>>
typedef ColVector::Type STK::CG< MultFunctor, ColVector, InitFunctor >::Type

Definition at line 89 of file STK_CG.h.

Constructor & Destructor Documentation

◆ CG() [1/3]

template<class MultFunctor , class ColVector , class InitFunctor = DefaultFunctor<ColVector>>
STK::CG< MultFunctor, ColVector, InitFunctor >::CG ( )
inline

Default Constructor.

Definition at line 91 of file STK_CG.h.

91: x_(), r_(), eps_(0.), iter_(0), nbStart_(0), p_mult_(0), p_init_(0), p_b_(0) {}
int nbStart_
number of restart_
Definition STK_CG.h:213
ColVector r_
residuals of the system
Definition STK_CG.h:207
Type eps_
tolerance
Definition STK_CG.h:209
MultFunctor const * p_mult_
pointer on the functor performing Ax
Definition STK_CG.h:215
ColVector const * p_b_
constant pointer on the second member of the system
Definition STK_CG.h:219
InitFunctor const * p_init_
pointer on the functor initializing x
Definition STK_CG.h:217
int iter_
number of iterations
Definition STK_CG.h:211
ColVector x_
solution of the system
Definition STK_CG.h:205

Referenced by STK::CG< MultFunctor, ColVector, InitFunctor >::clone().

◆ CG() [2/3]

template<class MultFunctor , class ColVector , class InitFunctor = DefaultFunctor<ColVector>>
STK::CG< MultFunctor, ColVector, InitFunctor >::CG ( MultFunctor const mult,
ColVector const b,
InitFunctor *const p_init = 0,
Type  eps = Arithmetic<Type>::epsilon() 
)
inline

Constructor.

Parameters
multfunctor which compute Ax with A a matrix and x a vector
bfrom Ax=b
p_initfunctor which initialize x
epstolerance

Definition at line 98 of file STK_CG.h.

102 : x_(), r_()
103 , eps_(eps), iter_(0), nbStart_(0)
104 , p_mult_(&mult)
105 , p_init_(p_init)
106 , p_b_(&b)
107 {}
Arrays::MultOp< Lhs, Rhs >::result_type mult(Lhs const &lhs, Rhs const &rhs)
convenience function for the multiplication of two matrices

◆ CG() [3/3]

template<class MultFunctor , class ColVector , class InitFunctor = DefaultFunctor<ColVector>>
STK::CG< MultFunctor, ColVector, InitFunctor >::CG ( CG< MultFunctor, ColVector, InitFunctor > const cg)
inline

Copy constructor.

The constructor to copy.

Parameters
cgthe conjugate gradient to copy

Definition at line 112 of file STK_CG.h.

113 : x_(cg.x_)
114 , r_(cg.r_)
115 , eps_(cg.eps_), iter_(cg.iter_), nbStart_(cg.nbStart_)
116 , p_mult_(cg.p_mult_)
117 , p_init_(cg.p_init_)
118 , p_b_(cg.p_b_)
119 {}
int cg()
Definition STK_CG.h:156

◆ ~CG()

template<class MultFunctor , class ColVector , class InitFunctor = DefaultFunctor<ColVector>>
STK::CG< MultFunctor, ColVector, InitFunctor >::~CG ( )
inline

destructor

Definition at line 121 of file STK_CG.h.

121{}

Member Function Documentation

◆ cg()

template<class MultFunctor , class ColVector , class InitFunctor = DefaultFunctor<ColVector>>
int STK::CG< MultFunctor, ColVector, InitFunctor >::cg ( )
inlineprotected
Returns
the number of iterations

Definition at line 156 of file STK_CG.h.

157 {
158 iter_ = 0;
159 int nbStart = 0;
160 ColVector xOld, z, p_;
161
162 // initialization
163 if(!p_init_) {x_ = *p_b_;}
164 else { x_ = (*p_init_)();}
165 while(nbStart<3)
166 {
167 int step = 0; //number of step
168 Real bnorm2 = p_b_->norm2(), alpha, beta; //
169 if (bnorm2 == 0.) bnorm2 = 1.;
170 //compute the residuals
171 r_ = *p_b_ - (*p_mult_)(x_);
172 if (r_.norm2()/bnorm2 <eps_) { break;}
173 //initialization of the conjugate direction
174 p_= r_;
175 while(1)
176 {
177 Real rnorm2 = r_.norm2();
178 //compute z=A p
179 z.move((*p_mult_)(p_));
180 //compute alpha
181 alpha = rnorm2/p_.dot(z);
182 //update x_
183 xOld.exchange(x_);
184 x_ = xOld + alpha * p_;
185 iter_++;
186 //update residuals
187 r_ = r_ - (alpha * z);
188 //compute beta
189 beta = 1/rnorm2;
190 if ((rnorm2=r_.norm2())/bnorm2 <eps_) { nbStart = 2; break;}
191 beta *= rnorm2;
192 //update p_
193 p_ = (p_ * beta) + r_;
194 step++;
195 if( step > 50 ) { break;}
196 }
197 nbStart++;
198 }
199 // return an error
200 return iter_;
201 }
int const & nbStart() const
Definition STK_CG.h:132
double Real
STK fundamental type of Real values.

References STK::CG< MultFunctor, ColVector, InitFunctor >::eps_, STK::CG< MultFunctor, ColVector, InitFunctor >::iter_, STK::CG< MultFunctor, ColVector, InitFunctor >::nbStart(), STK::CG< MultFunctor, ColVector, InitFunctor >::p_b_, STK::CG< MultFunctor, ColVector, InitFunctor >::p_init_, STK::CG< MultFunctor, ColVector, InitFunctor >::p_mult_, STK::CG< MultFunctor, ColVector, InitFunctor >::r_, and STK::CG< MultFunctor, ColVector, InitFunctor >::x_.

Referenced by STK::CG< MultFunctor, ColVector, InitFunctor >::run().

◆ clone()

template<class MultFunctor , class ColVector , class InitFunctor = DefaultFunctor<ColVector>>
CG * STK::CG< MultFunctor, ColVector, InitFunctor >::clone ( ) const
inline

clone pattern

Definition at line 123 of file STK_CG.h.

123{ return new CG(*this);}
CG()
Default Constructor.
Definition STK_CG.h:91

References STK::CG< MultFunctor, ColVector, InitFunctor >::CG().

◆ error()

template<class MultFunctor , class ColVector , class InitFunctor = DefaultFunctor<ColVector>>
String const & STK::CG< MultFunctor, ColVector, InitFunctor >::error ( ) const
inline

get the last error message.

Returns
the last error message

Definition at line 150 of file STK_CG.h.

150{ return msg_error_;}
String msg_error_
String with the last error message.
Definition STK_CG.h:154

References STK::CG< MultFunctor, ColVector, InitFunctor >::msg_error_.

◆ iter()

template<class MultFunctor , class ColVector , class InitFunctor = DefaultFunctor<ColVector>>
int const & STK::CG< MultFunctor, ColVector, InitFunctor >::iter ( ) const
inline
Returns
the number of iterations

Definition at line 130 of file STK_CG.h.

130{ return iter_;}

References STK::CG< MultFunctor, ColVector, InitFunctor >::iter_.

◆ nbStart()

template<class MultFunctor , class ColVector , class InitFunctor = DefaultFunctor<ColVector>>
int const & STK::CG< MultFunctor, ColVector, InitFunctor >::nbStart ( ) const
inline
Returns
the number of starting

Definition at line 132 of file STK_CG.h.

132{ return nbStart_;}

References STK::CG< MultFunctor, ColVector, InitFunctor >::nbStart_.

Referenced by STK::CG< MultFunctor, ColVector, InitFunctor >::cg().

◆ r()

template<class MultFunctor , class ColVector , class InitFunctor = DefaultFunctor<ColVector>>
ColVector const & STK::CG< MultFunctor, ColVector, InitFunctor >::r ( ) const
inline
Returns
the residuals b-A*x

Definition at line 134 of file STK_CG.h.

134{ return r_;}

References STK::CG< MultFunctor, ColVector, InitFunctor >::r_.

◆ run()

template<class MultFunctor , class ColVector , class InitFunctor = DefaultFunctor<ColVector>>
int STK::CG< MultFunctor, ColVector, InitFunctor >::run ( )
inline
Returns
the number of iterations or -1 if the maximal number of iteration is reached.

Definition at line 146 of file STK_CG.h.

146{ return cg();}

References STK::CG< MultFunctor, ColVector, InitFunctor >::cg().

◆ setB()

template<class MultFunctor , class ColVector , class InitFunctor = DefaultFunctor<ColVector>>
void STK::CG< MultFunctor, ColVector, InitFunctor >::setB ( ColVector const b)
inline

Set the constant vector.

Definition at line 138 of file STK_CG.h.

138{ p_b_=&b;}

References STK::CG< MultFunctor, ColVector, InitFunctor >::p_b_.

◆ setEps()

template<class MultFunctor , class ColVector , class InitFunctor = DefaultFunctor<ColVector>>
void STK::CG< MultFunctor, ColVector, InitFunctor >::setEps ( Type const eps)
inline

Set the tolerance.

Definition at line 136 of file STK_CG.h.

136{eps_ = eps;}

References STK::CG< MultFunctor, ColVector, InitFunctor >::eps_.

◆ setInitFunctor()

template<class MultFunctor , class ColVector , class InitFunctor = DefaultFunctor<ColVector>>
void STK::CG< MultFunctor, ColVector, InitFunctor >::setInitFunctor ( InitFunctor *const p_init)
inline

Set functor computing x at initialization.

Definition at line 142 of file STK_CG.h.

142{ p_init_=p_init; }

References STK::CG< MultFunctor, ColVector, InitFunctor >::p_init_.

◆ setMultFunctor()

template<class MultFunctor , class ColVector , class InitFunctor = DefaultFunctor<ColVector>>
void STK::CG< MultFunctor, ColVector, InitFunctor >::setMultFunctor ( MultFunctor const mult)
inline

Set functor computing Ax.

Definition at line 140 of file STK_CG.h.

140{ p_mult_= &mult; }

References STK::mult(), and STK::CG< MultFunctor, ColVector, InitFunctor >::p_mult_.

◆ x() [1/2]

template<class MultFunctor , class ColVector , class InitFunctor = DefaultFunctor<ColVector>>
ColVector const & STK::CG< MultFunctor, ColVector, InitFunctor >::x ( ) const
inline
Returns
the solution of the linear system Ax=b

Definition at line 126 of file STK_CG.h.

126{ return x_;}

References STK::CG< MultFunctor, ColVector, InitFunctor >::x_.

◆ x() [2/2]

template<class MultFunctor , class ColVector , class InitFunctor = DefaultFunctor<ColVector>>
Real const & STK::CG< MultFunctor, ColVector, InitFunctor >::x ( int const i) const
inline
Returns
the ith coordinate of the solution of the linear system Ax=b

Definition at line 128 of file STK_CG.h.

128{ return x_[i];}

References STK::CG< MultFunctor, ColVector, InitFunctor >::x_.

Member Data Documentation

◆ eps_

template<class MultFunctor , class ColVector , class InitFunctor = DefaultFunctor<ColVector>>
Type STK::CG< MultFunctor, ColVector, InitFunctor >::eps_
private

◆ iter_

template<class MultFunctor , class ColVector , class InitFunctor = DefaultFunctor<ColVector>>
int STK::CG< MultFunctor, ColVector, InitFunctor >::iter_
private

◆ msg_error_

template<class MultFunctor , class ColVector , class InitFunctor = DefaultFunctor<ColVector>>
String STK::CG< MultFunctor, ColVector, InitFunctor >::msg_error_
protected

String with the last error message.

Definition at line 154 of file STK_CG.h.

Referenced by STK::CG< MultFunctor, ColVector, InitFunctor >::error().

◆ nbStart_

template<class MultFunctor , class ColVector , class InitFunctor = DefaultFunctor<ColVector>>
int STK::CG< MultFunctor, ColVector, InitFunctor >::nbStart_
private

number of restart_

Definition at line 213 of file STK_CG.h.

Referenced by STK::CG< MultFunctor, ColVector, InitFunctor >::nbStart().

◆ p_b_

template<class MultFunctor , class ColVector , class InitFunctor = DefaultFunctor<ColVector>>
ColVector const* STK::CG< MultFunctor, ColVector, InitFunctor >::p_b_
private

constant pointer on the second member of the system

Definition at line 219 of file STK_CG.h.

Referenced by STK::CG< MultFunctor, ColVector, InitFunctor >::cg(), and STK::CG< MultFunctor, ColVector, InitFunctor >::setB().

◆ p_init_

template<class MultFunctor , class ColVector , class InitFunctor = DefaultFunctor<ColVector>>
InitFunctor const* STK::CG< MultFunctor, ColVector, InitFunctor >::p_init_
private

pointer on the functor initializing x

Definition at line 217 of file STK_CG.h.

Referenced by STK::CG< MultFunctor, ColVector, InitFunctor >::cg(), and STK::CG< MultFunctor, ColVector, InitFunctor >::setInitFunctor().

◆ p_mult_

template<class MultFunctor , class ColVector , class InitFunctor = DefaultFunctor<ColVector>>
MultFunctor const* STK::CG< MultFunctor, ColVector, InitFunctor >::p_mult_
private

pointer on the functor performing Ax

Definition at line 215 of file STK_CG.h.

Referenced by STK::CG< MultFunctor, ColVector, InitFunctor >::cg(), and STK::CG< MultFunctor, ColVector, InitFunctor >::setMultFunctor().

◆ r_

template<class MultFunctor , class ColVector , class InitFunctor = DefaultFunctor<ColVector>>
ColVector STK::CG< MultFunctor, ColVector, InitFunctor >::r_
private

residuals of the system

Definition at line 207 of file STK_CG.h.

Referenced by STK::CG< MultFunctor, ColVector, InitFunctor >::cg(), and STK::CG< MultFunctor, ColVector, InitFunctor >::r().

◆ x_

template<class MultFunctor , class ColVector , class InitFunctor = DefaultFunctor<ColVector>>
ColVector STK::CG< MultFunctor, ColVector, InitFunctor >::x_
private

The documentation for this class was generated from the following file: