aljabr — Implicit linear operators
aljabr is a small Python library providing an interface for implicit linear
operators: linear maps defined by forward and adjoint callables rather than
an explicit matrix. It is useful when an explicit matrix representation is not
adequate — for instance when the dimension is large, when a more efficient
algorithm exists, or when the operator is naturally expressed as a function.
A typical example is the Discrete Fourier Transform, which is a linear operator
available through fft and ifft functions. aljabr lets you treat it — and
compose it with others — as if it were a matrix.
The foundation is the LinOp type. Everything else — concrete operators,
utilities, algebraic composition — is built on top of it and optional. I made
this library for my own use.
Key differences from similar tools
vs. scipy.sparse.linalg.LinearOperator — input and output arrays can have
any shape, not just vectors. A 2D FFT operator maps an image to an image. Shapes
are fixed at construction: a DFT on a 512² image is a different object than
one on a 256² image. This is intentional.
vs. PyLops — aljabr is deliberately minimal. It does not provide solvers or
choose algorithms for you. There is no x = A / y. It stays out of your way,
offering only readability and convenience.
Features
- Abstract base class
LinOpwithforward(A·x) andadjoint(Aᴴ·y) - Algebraic composition:
A + B,A - B,A @ B,scalar * A,A.H,A.S - Array-API compatible — works with NumPy, PyTorch, JAX, and others via array-api-compat
- Compatible with
scipy.sparse.linalg.LinearOperator— can also be passed directly as argument - Concrete operators:
Identity,Diag,DFT,RealDFT,Conv,DirectConv,CircConv,FreqFilter,Diff,Sampling,Slice, wavelet, … - Utilities:
dottest,fwadjtest,is_sym,is_pos_def,cond, …
Installation
# with poetry (or uv)
poetry add aljabr
# with pip
pip install aljabr
Optional dependencies:
poetry add aljabr[wavelet] # PyWavelets — required for DWT, Analysis2, Synthesis2
poetry add aljabr[scipy] # SciPy — required for DirectConv and fcond
Quick example
import numpy as np
import aljabr
# Wrap the FFT as a linear operator
F = aljabr.DFT(shape=(256, 256), ndim=2)
x = np.random.randn(256, 256)
y = F.forward(x) # F·x
# or
y = F * x
# or
y = F(x)
z = F.adjoint(y) # Fᴴ·y
# or
z = y * F # (= Fʰ·yᵗ)
# Algebraic composition
A = aljabr.Diff(axis=0, ishape=(256, 256))
B = A.H @ A # AᴴA as a Symmetric operator
# Validate with the dot test
from aljabr import dottest
assert dottest(A, num=5)
Documentation
Status
Pre-Alpha. The API may change. Feedback welcome: francois.orieux@universite-paris-saclay.fr
License
MIT — see LICENSE.
Metadata
Release files for aljabr 0.5.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| aljabr-0.5.2.tar.gz | 18.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| aljabr-0.5.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 39.5 kB
Release files / aljabr-0.5.2.tar.gz
| Download URL | aljabr-0.5.2.tar.gz |
|---|---|
| Size | 18.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f49bb45c2750ce05753a29155d81886fd8c836ad4c13097c82ec7072c5cbd1ae
|
|
BLAKE2b-256 checksum How to use checksums |
0cbd666c113386d06a2e12ee7caf304daa2a54be5761b2cccd6112a30644fdd6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.14 {"installer":{"name":"uv","version":"0.11.14","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / aljabr-0.5.2-py3-none-any.whl
| Download URL | aljabr-0.5.2-py3-none-any.whl |
|---|---|
| Size | 21.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
7ae74fc17e3d6a6d1f02d85ad1f521fabe39b0c750ed887ba7e0b7a9aaccfb7b
|
|
BLAKE2b-256 checksum How to use checksums |
66ea24034c79c99c726c9b79e8dd459ef23d88fcd122bc0b8da0a0f6967a6697
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.14 {"installer":{"name":"uv","version":"0.11.14","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|