28 template<
class S,
class V,
class E>
32 const Parameters ¶meters_;
42 CGState(
const S& Ab,
const V& x,
const Parameters ¶meters,
bool steep):
43 parameters_(parameters),
k(0),
steepest(steep) {
53 std::max(parameters_.epsilon_abs,
54 parameters_.epsilon_rel * parameters_.epsilon_rel * gamma);
57 if (gamma > parameters_.epsilon_abs) Ad = Ab *
d;
62 void print(
const V& x) {
63 std::cout <<
"iteration = " <<
k << std::endl;
66 std::cout <<
"dotg = " << gamma << std::endl;
73 double takeOptimalStep(V& x) {
75 double alpha = -
dot(
d, g) /
dot(Ad, Ad);
82 bool step(
const S& Ab, V& x) {
84 if ((++
k) >= ((
int)parameters_.maxIterations))
return true;
87 double alpha = takeOptimalStep(x);
90 if (
k % parameters_.reset == 0) g = Ab.gradient(x);
92 else Ab.transposeMultiplyAdd(alpha, Ad, g);
95 double new_gamma =
dot(g, g);
97 if (parameters_.verbosity() != ConjugateGradientParameters::SILENT)
98 std::cout <<
"iteration " <<
k <<
": alpha = " << alpha
99 <<
", dotg = " << new_gamma
107 double beta = new_gamma / gamma;
116 Ab.multiplyInPlace(
d, Ad);
125 template<
class S,
class V,
class E>
130 if (parameters.verbosity() != ConjugateGradientParameters::SILENT)
131 std::cout <<
"CG: epsilon = " << parameters.
epsilon_rel
133 <<
", ||g0||^2 = " << state.gamma
134 <<
", threshold = " << state.
threshold << std::endl;
137 if (parameters.verbosity() != ConjugateGradientParameters::SILENT)
138 std::cout <<
"||g0||^2 < threshold, exiting immediately !" << std::endl;
144 while (!state.step(Ab, x)) {}
Iterative methods, implementation.
Implementation of Conjugate Gradient solver for a linear system.
Global functions in a separate testing namespace.
Definition chartTesting.h:28
void print(const Matrix &A, const string &s, ostream &stream)
print without optional string, must specify cout yourself
Definition Matrix.cpp:143
V conjugateGradients(const S &Ab, V x, const ConjugateGradientParameters ¶meters, bool steepest)
Method of conjugate gradients (CG) template "System" class S needs gradient(S,v), e=S*v,...
Definition iterative-inl.h:126
double dot(const V1 &a, const V2 &b)
Dot product.
Definition Vector.h:191
Parameters for the Conjugate Gradient method.
Definition ConjugateGradientSolver.h:36
size_t maxIterations
maximum number of cg iterations
Definition ConjugateGradientSolver.h:41
double epsilon_rel
threshold for relative error decrease
Definition ConjugateGradientSolver.h:43
Definition iterative-inl.h:29
bool steepest
flag to indicate we are doing steepest descent
Definition iterative-inl.h:35
double threshold
gamma (squared L2 norm of g) and convergence threshold
Definition iterative-inl.h:37
int k
iteration
Definition iterative-inl.h:34
V d
gradient g and search direction d for CG
Definition iterative-inl.h:36