31 return cg(A.
base(), b, x, tol, max_iter, backend);
37 requires LinearOperator<Op, Vector, Vector>
45 if (A.rows() != n || A.cols() != n || x.
size() != n) {
46 throw std::invalid_argument(
"Dimension mismatch in operator CG solver");
51 for (
idx i = 0; i < n; ++i) {
56 real rsold =
dot(r, r, backend);
59 for (
idx iter = 0; iter < max_iter; ++iter) {
63 const real pAp =
dot(p, Ap, backend);
64 if (std::abs(pAp) <
real(1
e-15)) {
67 const real alpha = rsold / pAp;
69 axpy(alpha, p, x, backend);
70 axpy(-alpha, Ap, r, backend);
72 const real rsnew =
dot(r, r, backend);
73 result.residual = std::sqrt(rsnew);
74 if (result.residual < tol) {
75 result.converged =
true;
91 requires SPDLinearOperator<Op, Vector, Vector>
constexpr idx size() const noexcept
const Mat & base() const noexcept
Storage and operator concepts for numerical routines.
Backend enum and default backend selection.
Dense row-major matrix templated over scalar type T.
Declared mathematical properties for stored matrices.
SolverResult cg_operator_impl(const Op &A, const Vector &b, Vector &x, real tol, idx max_iter, Backend backend)
real beta(real a, real b)
B(a, b) – beta function.
void scale(Vector &v, real alpha, Backend b=default_backend)
Compute .
BasicMatrix< real > Matrix
Double-precision dense matrix with full backend dispatch (CPU + GPU).
real dot(const Vector &x, const Vector &y, Backend b=default_backend)
Compute .
BasicVector< real > Vector
Real-valued dense vector with full backend dispatch (CPU + GPU)
void axpy(real alpha, const Vector &x, Vector &y, Backend b=default_backend)
Compute .
constexpr Backend default_backend
SolverResult cg(const Matrix &A, const Vector &b, Vector &x, real tol=1e-10, idx max_iter=1000, Backend backend=default_backend)
Common result type shared by all iterative solvers.
idx iterations
Number of iterations performed.
Dense vector storage and operations.