Compatible Libraries
====================
A list of Python libraries, beyond just `numpy `_ and `pandas `_, providing
mathematical algorithms that are compatible with grapp's :py:class:`LinearOperator` interface.
scipy
-----
Many of the functions in the `scipy.sparse.linalg `_ module
are compatible with ``LinearOperator``. Of particular note are:
* The conjugate gradient method `scipy.sparse.linalg.cg `_
* Least squares solver `scipy.sparse.linalg.lsqr `_
* Eigenvalue decomposition via `scipy.sparse.linalg.eigs `_
* The preconditioned eigensolver `scipy.sparse.linalg.lobpcg `_
PyLops
------
`PyLops `_ is a library focused on matrix-free methods, primarily focused on signal processing, but with some general purpose methods as well.
The grapp ``LinearOperator`` classes are compatible with PyLops. Of particular note are:
* The HutchPP estimator for the trace of a matrix, `pylops.utils.estimators.trace_hutchpp `_
* Combining multiple ``LinearOperator`` via `pylops.HStack `_, `pylops.VStack `_, and `pylops.BlockDiag `_
* Kronecker product of ``LinearOperator`` via `pylops.Kronecker `_
* Various optimization solvers with forced sparsity, such as `pylops.optimization.cls_sparsity.FISTA `_
spgl1
-----
`spgl1 `_ is a regularized least-squares solver (e.g., LASSO) that is compatible with ``LinearOperator``.