37 const idx n = A.rows();
39 throw std::invalid_argument(
"lanczos: operator must be square");
41 if (k == 0 || k > n) {
42 throw std::invalid_argument(
"lanczos: k must satisfy 0 < k <= n");
46 max_steps = std::min(3 * k, n);
48 max_steps = std::min(max_steps, n);
50 Matrix V(n, max_steps, 0.0);
51 Vector alpha(max_steps, 0.0);
54 for (
idx i = 0; i < n; ++i) {
55 V(i, 0) = (i == 0) ? 1.0 : 0.0;
60 for (
idx j = 0; j < max_steps; ++j) {
62 for (
idx i = 0; i < n; ++i) {
74 for (
idx i = 0; i < n; ++i) {
75 w[i] -=
beta[j - 1] * V(i, j - 1);
82 if (b <
real(1
e-12)) {
88 if (j + 1 < max_steps) {
89 for (
idx i = 0; i < n; ++i) {
90 V(i, j + 1) = w[i] / b;
97 for (
idx j = 0; j < m; ++j) {
100 T(j, j + 1) =
beta[j];
101 T(j + 1, j) =
beta[j];
106 const idx nret = std::min(k, m);
108 Matrix ritz_vecs(n, nret, 0.0);
109 for (
idx i = 0; i < nret; ++i) {
110 const idx ti = m - nret + i;
111 for (
idx j = 0; j < m; ++j) {
113 for (
idx r = 0; r < n; ++r) {
114 ritz_vecs(r, i) += coeff * V(r, j);
120 for (
idx i = 0; i < nret; ++i) {
121 ritz_vals[i] = teig.
values[m - nret + i];
124 bool all_converged =
true;
125 for (
idx i = 0; i < nret; ++i) {
127 for (
idx r = 0; r < n; ++r) {
128 u[r] = ritz_vecs(r, i);
135 const real lam = ritz_vals[i];
136 for (
idx r = 0; r < n; ++r) {
137 const real d = Au[r] - lam * u[r];
140 if (std::sqrt(res) > tol) {
141 all_converged =
false;
146 return {ritz_vals, ritz_vecs, steps, all_converged};
155LanczosResult
lanczos(
const SparseMatrix& A,
Compile-time contract for y = A*x.
Backend enum and default backend selection.
Full symmetric eigendecomposition via cyclic Jacobi sweeps.
Compressed Sparse Row (CSR) matrix and operations.
Dense row-major matrix templated over scalar type T.
real mgs_orthogonalize(const std::vector< Vector > &basis, Vector &v, std::vector< real > &h, idx k)
Modified Gram-Schmidt against basis[0..k-1].
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 .
LanczosResult lanczos(const Op &A, idx k, real tol=1e-10, idx max_steps=0, Backend backend=Backend::seq)
Operator Lanczos for any symmetric adapter.
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)
Umbrella include for operator concepts and adapters.
Symmetric eigendecomposition .
Subspace construction and orthogonalization kernels.
Dense vector storage and operations.