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) {
52 threshold = std::max(parameters_.epsilon_abs(), parameters_.epsilon() * parameters_.epsilon() * gamma);
55 if (gamma > parameters_.epsilon_abs()) Ad = Ab * d;
60 void print(
const V& x) {
61 std::cout <<
"iteration = " << k << std::endl;
64 std::cout <<
"dotg = " << gamma << std::endl;
71 double takeOptimalStep(V& x) {
73 double alpha = -
dot(d, g) /
dot(Ad, Ad);
80 bool step(
const S& Ab, V& x) {
82 if ((++k) >= ((
int)parameters_.maxIterations()))
return true;
85 double alpha = takeOptimalStep(x);
88 if (k % parameters_.reset() == 0) g = Ab.gradient(x);
90 else Ab.transposeMultiplyAdd(alpha, Ad, g);
93 double new_gamma =
dot(g, g);
95 if (parameters_.verbosity() != ConjugateGradientParameters::SILENT)
96 std::cout <<
"iteration " << k <<
": alpha = " << alpha
97 <<
", dotg = " << new_gamma
100 if (new_gamma < threshold)
return true;
105 double beta = new_gamma / gamma;
114 Ab.multiplyInPlace(d, Ad);
123 template<
class S,
class V,
class E>
128 if (parameters.verbosity() != ConjugateGradientParameters::SILENT)
129 std::cout <<
"CG: epsilon = " << parameters.epsilon()
130 <<
", maxIterations = " << parameters.maxIterations()
131 <<
", ||g0||^2 = " << state.gamma
136 if (parameters.verbosity() != ConjugateGradientParameters::SILENT)
137 std::cout <<
"||g0||^2 < threshold, exiting immediately !" << std::endl;
143 while (!state.step(Ab, x)) {}
double dot(const V1 &a, const V2 &b)
Definition: Vector.h:195
Definition: iterative-inl.h:29
Iterative methods, implementation.
V conjugateGradients(const S &Ab, V x, const ConjugateGradientParameters ¶meters, bool steepest)
Definition: iterative-inl.h:124
Implementation of Conjugate Gradient solver for a linear system.
Definition: ConjugateGradientSolver.h:29
int k
iteration
Definition: iterative-inl.h:34
bool steepest
flag to indicate we are doing steepest descent
Definition: iterative-inl.h:35
GTSAM_EXPORT void print(const Matrix &A, const std::string &s, std::ostream &stream)
Definition: chartTesting.h:28
double threshold
gamma (squared L2 norm of g) and convergence threshold
Definition: iterative-inl.h:37
V d
gradient g and search direction d for CG
Definition: iterative-inl.h:36