39 const idx n = A.rows();
41 throw std::invalid_argument(
"lanczos: operator must be square");
43 if (k == 0 || k > n) {
44 throw std::invalid_argument(
"lanczos: k must satisfy 0 < k <= n");
48 max_steps = std::min(3 * k, n);
50 max_steps = std::min(max_steps, n);
52 Matrix V(n, max_steps, 0.0);
53 Vector alpha(max_steps, 0.0);
56 for (
idx i = 0; i < n; ++i) {
57 V(i, 0) = (i == 0) ? 1.0 : 0.0;
62 for (
idx j = 0; j < max_steps; ++j) {
64 for (
idx i = 0; i < n; ++i) {
76 for (
idx i = 0; i < n; ++i) {
77 w[i] -=
beta[j - 1] * V(i, j - 1);
84 if (b <
real(1
e-12)) {
90 if (j + 1 < max_steps) {
91 for (
idx i = 0; i < n; ++i) {
92 V(i, j + 1) = w[i] / b;
99 for (
idx j = 0; j < m; ++j) {
102 T(j, j + 1) =
beta[j];
103 T(j + 1, j) =
beta[j];
108 const idx nret = std::min(k, m);
110 Matrix ritz_vecs(n, nret, 0.0);
111 for (
idx i = 0; i < nret; ++i) {
112 const idx ti = m - nret + i;
113 for (
idx j = 0; j < m; ++j) {
115 for (
idx r = 0; r < n; ++r) {
116 ritz_vecs(r, i) += coeff * V(r, j);
122 for (
idx i = 0; i < nret; ++i) {
123 ritz_vals[i] = teig.
values[m - nret + i];
126 bool all_converged =
true;
127 for (
idx i = 0; i < nret; ++i) {
129 for (
idx r = 0; r < n; ++r) {
130 u[r] = ritz_vecs(r, i);
137 const real lam = ritz_vals[i];
138 for (
idx r = 0; r < n; ++r) {
139 const real d = Au[r] - lam * u[r];
142 if (std::sqrt(res) > tol) {
143 all_converged =
false;
148 return {ritz_vals, ritz_vecs, steps, all_converged};
155 requires SymmetricLinearOperator<Op, Vector, Vector>
170LanczosResult
lanczos(
const SparseMatrix& A,
Compile-time contract for the matrix-free product y = A*x.
Storage and operator concepts for numerical routines.
Backend enum and default backend selection.
Full symmetric eigendecomposition via cyclic Jacobi sweeps.
Dense row-major matrix templated over scalar type T.
LanczosResult lanczos_operator_impl(const Op &A, idx k, real tol, idx max_steps, Backend backend)
real mgs_orthogonalize(const std::vector< Vector > &basis, Vector &v, std::vector< real > &h, idx k)
Modified Gram-Schmidt against basis[0..k-1].
LanczosResult lanczos(const Op &A, idx k, real tol=1e-10, idx max_steps=0, Backend backend=Backend::seq)
Operator Lanczos for a declared symmetric adapter.
real beta(real a, real b)
B(a, b) – beta function.
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 .
void axpy(real alpha, const Vector &x, Vector &y, Backend b=default_backend)
Compute .
EigenResult eig_sym(const Matrix &A, real tol=1e-12, idx max_sweeps=100, Backend backend=lapack_backend)
Compressed Sparse Row (CSR) matrix and operations.
Symmetric eigendecomposition .
Subspace construction and orthogonalization kernels.
Dense vector storage and operations.