sparsax
JAX & PyTensor-native sparse direct solvers backed by SuiteSparse.
solve, logdet, and friends are XLA FFI custom
calls into CHOLMOD (Cholesky, for symmetric positive definite matrices) and KLU (LU,
for general non-symmetric matrices), so sparse factorizations run at full native speed
inside @jax.jit (and lax.scan / lax.fori_loop) — no Python callback overhead.
Why?
No open-source JIT framework (JAX, PyTorch, TensorFlow) exposes a sparse direct factorization
as a compilable primitive. For iterative workloads that factorize the same sparsity pattern
many times with changing values — Gibbs samplers, MCMC for Bayesian spatial econometrics,
shift-invert Krylov methods — paying the Python/SuiteSparse boundary on every iteration
dominates the runtime. sparsax moves the whole loop to C++ behind a JIT-compiled JAX
function, with the symbolic analysis (fill-reducing ordering + elimination tree) cached and
reused across calls, and the numeric factorization skipped entirely when the values haven't
changed.
Benchmarks (M-series macOS, 2D grid Laplacian, values changing every iteration): CHOLMOD via
sparsax matches a hand-written scikit-sparse Python loop per iteration and is ~2.7× faster
than scipy.sparse.linalg.splu, while running entirely inside jax.jit.
Features
- CHOLMOD —
solve,logdet,selinv(selected inverse),factor_solve,sample_gaussian,update_solve(rank-k update/downdate) for symmetric positive definiteA. - KLU —
lu_solve,lu_logdet,lu_factor/lu_solve_factorfor general non-symmetricA(e.g.A = I − ρWwith a row-standardised spatial weights matrix). - JIT /
lax.scan: the symbolic analysis is computed once and reused across iterations. vmap:jax.vmap(solve)lowers to a single native FFI call that loops over the batch in C++ (reusing the cached analysis), rather than XLA per-iteration dispatch. Composes withgrad(vmap(grad(solve))batches too).- Autodiff:
solvehas a custom reverse-mode VJP in bothAxandb;logdethas one inAxvia the selected inverse.lu_solveis differentiable inAxandb(transpose solve);lu_logdetis forward-only. Togethersolve/logdetgive the gradient of a Gaussian log-density, so a precision matrix's values can be fit by HMC/NUTS, VI, or empirical-Bayes optimization. - Factor-once primitives —
factor_solve/sample_gaussian(CHOLMOD) andlu_factor/lu_solve_factor(KLU) factorize once and serve an unbounded sequence of solves against the same factor, insidelax.fori_loopand undervmap. - Multiple right-hand sides:
bmay be(n,)or(n, n_rhs). - PyMC / PyTensor frontend (optional extra) for the same CHOLMOD core, so PyMC's default NUTS sampler can differentiate through the sparse solve and log-determinant without going through JAX/XLA.
Installation
conda env create -f environment.yml # suitesparse, jax, nanobind, cmake, ...
conda activate sparsax
pip install --no-build-isolation .
For the PyTensor / PyMC frontend:
pip install "sparsax[pytensor]"
jax.config.update("jax_enable_x64", True)is required — CHOLMOD and KLU are float64.
Quick start: CHOLMOD (symmetric positive definite A)
import jax
import jax.numpy as jnp
import numpy as np
import sparsax
jax.config.update("jax_enable_x64", True) # required: CHOLMOD is float64
# SPD matrix in COO form. Entries with Ai <= Aj are used (upper triangle);
# pass the full symmetric matrix or just its upper triangle.
Ai = np.array([0, 0, 1, 1, 1, 2, 2], dtype=np.int32)
Aj = np.array([0, 1, 0, 1, 2, 1, 2], dtype=np.int32)
Ax = jnp.array([4.0, 1.0, 1.0, 5.0, 2.0, 2.0, 6.0])
b = jnp.array([1.0, 2.0, 3.0])
x = sparsax.solve(Ai, Aj, Ax, b) # eager
ld = sparsax.logdet(Ai, Aj, Ax, n=3) # log|A| from the same factorization
z = sparsax.selinv(Ai, Aj, Ax, n=3) # (A^-1) on A's sparsity pattern
@jax.jit
def gibbs_step(Ax, b):
x = sparsax.solve(Ai, Aj, Ax, b) # full CHOLMOD speed, no callbacks
ld = sparsax.logdet(Ai, Aj, Ax, n=3) # factorization shared with solve
return x, ld
Quick start: KLU (general non-symmetric A)
import jax
import jax.numpy as jnp
import numpy as np
import sparsax
jax.config.update("jax_enable_x64", True)
# General (non-symmetric) matrix in COO form. The full matrix is used —
# no upper-triangle folding. A common case is A = I - rho * W.
n = 3
Ai = np.array([0, 0, 1, 1, 2, 2], dtype=np.int32)
Aj = np.array([0, 1, 0, 1, 1, 2], dtype=np.int32)
Ax = jnp.array([1.0, -0.2, -0.3, 1.0, -0.1, 1.0]) # I - rho W, say
b = jnp.array([1.0, 2.0, 3.0])
x = sparsax.lu_solve(Ai, Aj, Ax, b) # eager
ld = sparsax.lu_logdet(Ai, Aj, Ax, n=n) # log|det(A)| from the KLU factor
@jax.jit
def step(Ax, b):
return sparsax.lu_solve(Ai, Aj, Ax, b) # full KLU speed in JIT
KLU shares the same caching story as CHOLMOD: the sparsity pattern's fill-reducing analysis is
computed once and cached, and under jax.vmap the whole batch is solved in a single native FFI
call. lu_solve is differentiable in Ax and b (transpose solve); lu_logdet is forward-only
(the non-symmetric logdet gradient is the full selected inverse, which KLU does not expose —
use logdet for symmetric A when a gradient is needed).
How it works
solve and logdet (and their lu_* counterparts) are XLA FFI custom calls into CHOLMOD and
KLU. The extension caches symbolic analyses keyed on the sparsity pattern, so repeated calls
with the same pattern only pay for the numeric refactorization — and calls with unchanged
values skip even that, sharing one factorization between solve and logdet. There are no
handles to manage and nothing to pass through JIT boundaries; the caching is transparent.
For the "hold a numeric factor open" case — e.g. a shift-invert Krylov basis that reuses one
factorization across an unbounded sequence of solves whose RHS depends on the previous solve's
output — factor / solve_factor / logdet_factor (CHOLMOD) and lu_factor /
lu_solve_factor / lu_logdet_factor (KLU) return an opaque token carrying a strong reference
to the numeric factor, guaranteeing reuse inside lax.fori_loop without relying on a host-side
cache surviving JIT-compiled iterations.
Factor once, do everything: factor_solve / sample_gaussian
solve and logdet are separate primitives, so a Gibbs sweep that needs a posterior mean, a
correlated draw, and a log-determinant factors the same A several times — and under vmap
that is one factorization per solve per batch element. factor_solve factors A once and
serves every requested solve (each a chain of MODE_* codes) plus an optional logdet from
that single factor. Under vmap it lowers to one batched FFI call that factors once per
element, whatever the number of chains.
# Gibbs Gaussian step: posterior mean, a draw ~ N(mean, A^-1), and log|A|,
# from ONE factorization. eta = mean + P' L^-T z (since A = P' L L' P).
eta, mean, ld = sparsax.sample_gaussian(Ai, Aj, Ax, b, z, want_logdet=True)
# ...or spell it out with the general primitive:
(mean, w), ld = sparsax.factor_solve(
Ai, Aj, Ax,
[(b, sparsax.MODE_A), # A^-1 b
(z, (sparsax.MODE_LT, sparsax.MODE_PT))], # P' L^-T z (chain)
want_logdet=True)
eta = mean + w
Each rhs entry is (b, modes) where modes is one MODE_* or a sequence applied left to
right. sparsax.factorization_count() reports how many real factorizations have happened —
handy for confirming the fusion. Benchmarked Gibbs draw (mean + sample + logdet) vmapped over a
batch of different A's: 4× fewer factorizations and ~3.3–3.6× faster than issuing the
separate solve/logdet primitives. factor_solve is forward-only (no autodiff rule); use
solve/logdet when you need gradients.
The KLU analogue is lu_factor + lu_solve_factor (+ lu_logdet_factor): factorize once,
then issue an unbounded sequence of solves (and a logdet) against the same LU factor inside a
JIT-compiled loop, without re-hashing Ax or risking LRU eviction mid-sweep.
Gradients & the selected inverse
solve and logdet are the two halves of a Gaussian log-density's gradient, so a precision
matrix A(θ) with a fixed pattern and θ-dependent values can be fit by gradient-based
inference — HMC/NUTS (via numpyro/blackjax, or PyMC's JAX sampling backend), VI, or
empirical-Bayes/MAP optimization:
def neg_log_post(Ax): # up to constants
quad = b @ sparsax.solve(Ai, Aj, Ax, b) # b' A^-1 b (solve VJP)
return 0.5 * quad - 0.5 * sparsax.logdet(Ai, Aj, Ax, n) # log|A| (logdet VJP)
grad_Ax = jax.grad(neg_log_post)(Ax) # works under jit / vmap
logdet's reverse-mode rule uses that d log|A| / dA = A^{-1}, evaluated only at A's
sparsity pattern by Takahashi's selected-inversion recurrence over the Cholesky factor —
never the dense inverse. That quantity is exposed directly:
z = sparsax.selinv(Ai, Aj, Ax, n) # z[k] == (A^-1)[Ai[k], Aj[k]]
var = z[Ai == Aj] # diag(A^-1): Gaussian marginal variances
selinv shares the factorization cache, is JIT-compilable and vmap-able, and costs one
selected-inversion pass over the factor (O(nnz(L))-ish), not n solves. factor_solve /
sample_gaussian remain forward-only. lu_solve carries the analogous reverse-mode rule (a
transpose solve for the VJP); lu_logdet is not differentiable.
PyMC / PyTensor (NUTS)
The same CHOLMOD core is exposed as a PyTensor frontend for PyMC's default backend, so gradient-based samplers (NUTS) can differentiate through the sparse solve and log-determinant without going through JAX/XLA. It's an optional extra — the base package stays JAX-only:
import pytensor.tensor as pt
import sparsax.pytensor as cjpt
Ax = pt.dvector("Ax") # the precision-matrix values (θ-dependent)
# Gaussian log-density (up to constants); grad flows into Ax
logp = -0.5 * pt.dot(b, cjpt.solve(Ai, Aj, Ax, b)) + 0.5 * cjpt.logdet(Ai, Aj, Ax, n)
g = pt.grad(logp, Ax) # solve VJP + logdet (selected-inverse) VJP
cjpt.solve, cjpt.logdet, and cjpt.selinv mirror the JAX functions and carry the same
reverse-mode rules (solve in Ax/b, logdet in Ax); the pattern (Ai, Aj) is
non-differentiable data. On PyTensor ≥ 3.1 the gradient routes through Op.pullback; older
versions use grad.
Prefer the C backend, not numba. These Ops implement a pure-Python
perform(it calls the native core, which holds no GIL and does the real work — the CHOLMOD call dominates). PyTensor's C backend (FAST_RUN, the default) calls thatperformdirectly with no penalty. PyTensor's numba backend cannot JIT a Pythonperform, so it falls back to object mode and prints aUserWarningon every call — functionally correct but with per-call overhead. Keep PyMC on its default sampler (C backend) to use these Ops, and switch to the JAX frontend above if you deliberately run PyMC's JAX/numba linker.
JAX sparse (BCOO)
JAX's native sparse type is jax.experimental.sparse.BCOO, whose .indices is (nnz, 2) and
.data is (nnz,). Convenience wrappers accept one directly (CHOLMOD and KLU alike):
from jax.experimental import sparse as jsparse
A = jsparse.BCOO.fromdense(A_dense) # or build however you like
# CHOLMOD
x = sparsax.solve_bcoo(A, b)
ld = sparsax.logdet_bcoo(A)
x = sparsax.update_solve_bcoo(A, C, b) # rank-k update/downdate
# KLU
x = sparsax.lu_solve_bcoo(A, b)
ld = sparsax.lu_logdet_bcoo(A)
Metadata
Release files for sparsax 0.9.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| sparsax-0.9.0.tar.gz | 68.0 kB | Details |
Built distributions (wheels)
Total release size: 64.0 MB
Release files / sparsax-0.9.0.tar.gz
| Download URL | sparsax-0.9.0.tar.gz |
|---|---|
| Size | 68.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
6d69a19f8c84972536d933f86682c382aa5da2e3e71b850adb3bc73c3faba553
|
|
BLAKE2b-256 checksum How to use checksums |
e1915102cb487dbecba9ca27aa02612b03261e22effacdc808323ab63605cf75
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 8, 2026.
Transparency logRelease files / sparsax-0.9.0-cp313-cp313-win_amd64.whl
| Download URL | sparsax-0.9.0-cp313-cp313-win_amd64.whl |
|---|---|
| Size | 7.1 MB |
| Tags | CPython 3.13 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
223481115f4c5069cf806ce7d00a14e8648b27973dc19c69f07d20e49895a15f
|
|
BLAKE2b-256 checksum How to use checksums |
f5ca96f7d165252af4ea530b6d742ca226dfae1c4931971a6b240a9176457402
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 8, 2026.
Transparency logRelease files / sparsax-0.9.0-cp313-cp313-manylinux_2_28_x86_64.whl
| Download URL | sparsax-0.9.0-cp313-cp313-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 6.4 MB |
| Tags | CPython 3.13 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
6570331f1fa80dfdfe36d47803b032d9c1567254bb0cef94c268dbd8fce640c9
|
|
BLAKE2b-256 checksum How to use checksums |
a5308627a23933503c811a4a1723a6bc07ee949926ab0ac130af1d560e929174
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 8, 2026.
Transparency logRelease files / sparsax-0.9.0-cp313-cp313-manylinux_2_28_aarch64.whl
| Download URL | sparsax-0.9.0-cp313-cp313-manylinux_2_28_aarch64.whl |
|---|---|
| Size | 6.1 MB |
| Tags | CPython 3.13 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
de25e0feccae64320ed0cf0dd55faa3340d12f6f6cb8ae04aa5fb918359f745c
|
|
BLAKE2b-256 checksum How to use checksums |
1d6bbb0fc4700468c491a09f9fbff6c29ef74985157cff5dabc351eca5f0d8f9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 8, 2026.
Transparency logRelease files / sparsax-0.9.0-cp313-cp313-macosx_15_0_arm64.whl
| Download URL | sparsax-0.9.0-cp313-cp313-macosx_15_0_arm64.whl |
|---|---|
| Size | 1.8 MB |
| Tags | CPython 3.13 macOS 15.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
3278c74f90a4a192080a6f366fb6c7325df6bf6948bc42d3ce9647c459278210
|
|
BLAKE2b-256 checksum How to use checksums |
c4687c0341e63e640fb1dcaa174b1de0bc5bc47901b836311924d5b69fdaed4f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 8, 2026.
Transparency logRelease files / sparsax-0.9.0-cp312-cp312-win_amd64.whl
| Download URL | sparsax-0.9.0-cp312-cp312-win_amd64.whl |
|---|---|
| Size | 7.1 MB |
| Tags | CPython 3.12 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
8ffcd43afe9376ef4270bb25c6cb9d7c6baffac430ab6c5b7772f42b281169b3
|
|
BLAKE2b-256 checksum How to use checksums |
735d3ed1ea392c94e2126c7c1d0f0759004a61a9704bf26ff80b414e567f3b5f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 8, 2026.
Transparency logRelease files / sparsax-0.9.0-cp312-cp312-manylinux_2_28_x86_64.whl
| Download URL | sparsax-0.9.0-cp312-cp312-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 6.4 MB |
| Tags | CPython 3.12 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
5d9247d11736f4c01ac533f03f0a34202e21908301a0f7bd7e8892ff09a5dc59
|
|
BLAKE2b-256 checksum How to use checksums |
9e1630fc549ee29614331e0b725e0c46f7d90dffc51e3d9cc9e8fbdd278f7732
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 8, 2026.
Transparency logRelease files / sparsax-0.9.0-cp312-cp312-manylinux_2_28_aarch64.whl
| Download URL | sparsax-0.9.0-cp312-cp312-manylinux_2_28_aarch64.whl |
|---|---|
| Size | 6.1 MB |
| Tags | CPython 3.12 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
21e5392984c22cf7737d57529899b77a4f1af0e609a223532d1342d07a7bdbc3
|
|
BLAKE2b-256 checksum How to use checksums |
aba92dbc1335404f2787f81dc2a956071e10ecc0cd3d20e28f8fcd55d811f47d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 8, 2026.
Transparency logRelease files / sparsax-0.9.0-cp312-cp312-macosx_15_0_arm64.whl
| Download URL | sparsax-0.9.0-cp312-cp312-macosx_15_0_arm64.whl |
|---|---|
| Size | 1.8 MB |
| Tags | CPython 3.12 macOS 15.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
05da7727ac1590278acf5035194b693c2e2fe0ec56bb8f45e04fbac1c6f9bfd0
|
|
BLAKE2b-256 checksum How to use checksums |
f7c7de08639221b8652e848e89d6c203936a1d12964b745f83d596daf5ff8316
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 8, 2026.
Transparency logRelease files / sparsax-0.9.0-cp311-cp311-win_amd64.whl
| Download URL | sparsax-0.9.0-cp311-cp311-win_amd64.whl |
|---|---|
| Size | 7.1 MB |
| Tags | CPython 3.11 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
cb3852445c7ce99d3d309512b186121ea08138d08c63b4b62a162f89804a6075
|
|
BLAKE2b-256 checksum How to use checksums |
c1ddb508028c91cf10739c9e073736cada43d356d46a4e3147283b550a82a788
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 8, 2026.
Transparency logRelease files / sparsax-0.9.0-cp311-cp311-manylinux_2_28_x86_64.whl
| Download URL | sparsax-0.9.0-cp311-cp311-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 6.4 MB |
| Tags | CPython 3.11 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
bd8376dd86ede24c01e1c814b14dae6e8657c63a48b9b41b1f7b6480d330ab47
|
|
BLAKE2b-256 checksum How to use checksums |
6677fc61fd46d9a67cbde6651675c80dff00fdeefcd18a9e897868451668551b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 8, 2026.
Transparency logRelease files / sparsax-0.9.0-cp311-cp311-manylinux_2_28_aarch64.whl
| Download URL | sparsax-0.9.0-cp311-cp311-manylinux_2_28_aarch64.whl |
|---|---|
| Size | 6.1 MB |
| Tags | CPython 3.11 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
14d865e3ce549723dcb41e616d1ca9e37272d8c74c243c046a6c00e8b6beed82
|
|
BLAKE2b-256 checksum How to use checksums |
eb62ab47dd9e2d43cbcaf17acdc7b140b37838790c4e4aac7e64c0728fb44b46
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 8, 2026.
Transparency logRelease files / sparsax-0.9.0-cp311-cp311-macosx_15_0_arm64.whl
| Download URL | sparsax-0.9.0-cp311-cp311-macosx_15_0_arm64.whl |
|---|---|
| Size | 1.8 MB |
| Tags | CPython 3.11 macOS 15.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
cd8e78b39a6662eb8f6557f42eb798cc8ed55ef050e61b24ec48732bae5debf3
|
|
BLAKE2b-256 checksum How to use checksums |
6ea888fa25fa691450d6248efefc2dfbee5538b3818fe8dd67746b6c3b35df96
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 8, 2026.
Transparency log