Source code for geomfum.numerics.eig
"""Module for eigenvalue solver."""
import gsops.backend as gs
import scipy
[docs]
class ScipyEigsh:
"""Sparse eigenvalue solver using SciPy's ARPACK wrapper.
Parameters
----------
spectrum_size : int, optional
Number of eigenvalues and eigenvectors to compute (default: 6).
sigma : float, optional
Shift for shift-invert mode. If None, standard mode is used.
which : str, optional
Which eigenvalues to find: 'LM' (largest magnitude), 'SM' (smallest magnitude),
'LA' (largest algebraic), 'SA' (smallest algebraic), etc. (default: 'LM').
"""
def __init__(
self,
spectrum_size=6,
sigma=None,
which="LM",
):
self.spectrum_size = spectrum_size
self.sigma = sigma
self.which = which
def __call__(self, A, M=None):
"""Compute eigenvalues and eigenvectors.
Parameters
----------
A : array-like, sparse matrix
The matrix for which to compute eigenvalues/eigenvectors.
M : array-like, sparse matrix, optional
Mass matrix for generalized eigenvalue problem A @ v = lambda * M @ v.
Returns
-------
vals : array-like, shape=[spectrum_size]
Eigenvalues.
vecs : array-like, shape=[n, spectrum_size]
Eigenvectors.
"""
vals, vecs = scipy.sparse.linalg.eigsh(
gs.sparse.to_scipy_csc(A),
k=self.spectrum_size,
M=gs.sparse.to_scipy_dia(M),
sigma=self.sigma,
which=self.which,
)
return gs.from_numpy(vals), gs.from_numpy(vecs)