10#ifndef SFM_BA_CONJUGATE_GRADIENT_HEADER
11#define SFM_BA_CONJUGATE_GRADIENT_HEADER
60 Matrix const* P =
nullptr);
76 std::size_t input_size (
void)
const;
77 std::size_t output_size (
void)
const;
115 return this->solve(A_functor, b, x, P ==
nullptr ?
nullptr : &P_functor);
124 throw std::invalid_argument(
"RHS must not be null");
128 this->status.info = CG_INVALID_INPUT;
166 for (this->status.num_iterations = 0;
167 this->status.num_iterations < this->opts.max_iterations;
168 this->status.num_iterations += 1)
172 T alpha = r_dot_r / d.
dot(Ad);
179 T new_r_dot_r = r.
dot(r);
182 if (new_r_dot_r < this->opts.tolerance)
184 this->status.info = CG_CONVERGENCE;
192 new_r_dot_r = z.
dot(r);
199 T beta = new_r_dot_r / r_dot_r;
206 r_dot_r = new_r_dot_r;
209 this->status.info = CG_MAX_ITERATIONS;
233 return A->num_cols();
240 return A->num_rows();
CGBasicMatrixFunctor(SparseMatrix< T > const &A)
std::size_t input_size(void) const
DenseVector< T > multiply(DenseVector< T > const &x) const
std::size_t output_size(void) const
virtual std::size_t output_size(void) const =0
virtual Vector multiply(Vector const &x) const =0
virtual std::size_t input_size(void) const =0
ConjugateGradient(Options const &opts)
Status solve(Matrix const &A, Vector const &b, Vector *x, Matrix const *P=nullptr)
DenseVector add(DenseVector const &rhs) const
DenseVector multiply(T const &factor) const
void fill(T const &value)
DenseVector subtract(DenseVector const &rhs) const
void resize(std::size_t size, T const &value=T(0))
std::size_t size(void) const
T dot(DenseVector const &rhs) const
Sparse matrix class in Yale format for column-major matrices.
#define SFM_BA_NAMESPACE_BEGIN
#define SFM_NAMESPACE_END
#define SFM_NAMESPACE_BEGIN
#define SFM_BA_NAMESPACE_END