Skip to main content

Continuous Integration codecov

sparsax

JAX & PyTensor -native sparse Cholesky via CHOLMOD. Solves with symmetric positive definite sparse matrices 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 sparse Cholesky as a compilable primitive; klujax covers sparse LU, which is ~2× slower than Cholesky for SPD systems.
  • The target workload is Gibbs samplers (e.g. Bayesian spatial econometrics), where an SPD precision matrix is solved thousands of times with the same sparsity pattern but changing values, inside a JIT-compiled loop.
  • Benchmarks (M-series macOS, 2D grid Laplacian, values changing every iteration): 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.

How it works

solve and logdet are XLA FFI custom calls into CHOLMOD. The extension caches symbolic analyses (fill-reducing ordering + elimination tree) 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.

Installation

conda env create -f environment.yml   # suitesparse, jax, nanobind, cmake, ...
conda activate sparsax
pip install --no-build-isolation .

Quick start

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

@jax.jit                                      # ...or fully JIT-compiled
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

Features:

  • jit / lax.scan: the symbolic analysis is computed once and reused across iterations.
  • Autodiff: solve has a custom VJP (reverse-mode) in both Ax and b; logdet has one in Ax (via the selected inverse — see below). Together they give the gradient of a Gaussian log-density, so the precision matrix's values can be fit by gradient-based inference (HMC/NUTS, empirical Bayes).
  • 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 with grad (vmap(grad(solve)) batches too). Map over Ax, b, or both.
  • Multiple right-hand sides: b may be (n,) or (n, n_rhs).
  • Factor-part solves: mode=sparsax.MODE_LT etc. expose CHOLMOD's solve systems (P' L L' P = A). Sampling y ~ N(0, A^{-1}): y = solve(..., solve(..., z, mode=MODE_LT), mode=MODE_PT).
  • Not positive definite → runtime exception (the factor is always a true LL').

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.

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 (e.g. 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.

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:

pip install "sparsax[pytensor]"
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.

Use 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 that perform directly with no penalty. PyTensor's numba backend cannot JIT a Python perform, so it falls back to object mode and prints a UserWarning on every call — functionally correct but with per-call overhead. Prefer the C backend:

import pytensor

pytensor.config.mode = "FAST_RUN"     # C backend (default); avoids numba object mode
# For PyMC, this is the default; if you sample through the numba/JAX linker
# instead, drive NUTS via the JAX frontend (numpyro/blackjax) rather than these Ops.

Concretely: 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:

from jax.experimental import sparse as jsparse
A = jsparse.BCOO.fromdense(A_dense)         # or build however you like

x  = sparsax.solve_bcoo(A, b)            # == solve(A.indices[:,0], A.indices[:,1], A.data, b)
ld = sparsax.logdet_bcoo(A)
x  = sparsax.update_solve_bcoo(A, c, b)  # rank-k update, as below

The analysis-reuse speedup is unaffected: the pattern cache keys on the concrete index values (exactly a BCOO's .indices), so a stable pattern across jit/vmap calls keeps hitting the cache. A full-symmetric BCOO works directly (only the upper triangle is read), and unsorted/duplicate entries are handled. Only a plain 2D BCOO (n_batch=0, n_dense=0) is supported.

Rank-k update / downdate

update_solve solves (A ± C C') x = b by applying CHOLMOD's cholmod_updown to a working copy of A's cached factor, instead of refactoring the modified matrix from scratch. A is factored once; each call is O(k · path) where path is the elimination-tree path touched by C's nonzeros.

# Add an observation (rank-1, sparse update column) and re-solve, cheaply:
x = sparsax.update_solve(Ai, Aj, Ax, c, b)                 # (A + c c') x = b
x = sparsax.update_solve(Ai, Aj, Ax, c, b, downdate=True)  # (A - c c') x = b
x, ld = sparsax.update_solve(Ai, Aj, Ax, C, b, return_logdet=True)  # C is (n, k)

When it pays off: the update column(s) C must be sparse (a few nonzeros — e.g. one data point and its neighbors). On the grid-Laplacian benchmark a rank-1 sparse update is ~3× faster than a full factorize+solve. A dense C walks the whole tree and is slower than refactoring — use plain solve on the reassembled matrix in that case. The base cached factor is never mutated, so update_solve is a pure function (works under jit; not differentiable).

Options

sparsax.set_options(supernodal="simplicial")  # or "auto" (default), "supernodal"
sparsax.clear_cache()                         # free cached factorizations

For very sparse matrices (e.g. planar/grid graphs), "simplicial" often gives faster triangular solves; "supernodal" (BLAS-based) wins on denser problems. "auto" lets CHOLMOD choose based on the matrix.

Status / roadmap

  • solve (all CHOLMOD solve modes), logdet, symbolic + numeric caching, custom VJP, multi-RHS, tests, benchmarks
  • Native batching: jax.vmap(solve) → one FFI call looping over the batch in C++
  • cholmod_updown rank-k update/downdate (update_solve)
  • Cache the simplicial LDL' base factor for updown (rebuilt only on refactor), so the LL'→LDL' conversion is paid once per base change, not once per call
  • factor_solve / sample_gaussian: factor once, serve many solve chains + logdet from one factor; fuses under vmap to one factorization per batch element
  • Differentiable logdet (reverse-mode in Ax) and the selinv selected inverse (Takahashi recurrence over the factor); pairs with solve's VJP for full Gaussian log-density gradients
  • PyTensor frontend (sparsax.pytensor, optional extra) with matching autodiff, for PyMC's default backend / NUTS — a second frontend over the same CHOLMOD core
  • float32 (CHOLMOD 5 single precision) and int64 indices
  • Autodiff rule for factor_solve (currently forward-only)
  • Wheels / conda-forge packaging

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

sparsax-0.7.0.tar.gz (54.8 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

sparsax-0.7.0-cp313-cp313-win_amd64.whl (7.0 MB view details)

Uploaded CPython 3.13Windows x86-64

sparsax-0.7.0-cp313-cp313-manylinux_2_28_x86_64.whl (6.3 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64

sparsax-0.7.0-cp313-cp313-manylinux_2_28_aarch64.whl (6.0 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ ARM64

sparsax-0.7.0-cp313-cp313-macosx_15_0_arm64.whl (1.8 MB view details)

Uploaded CPython 3.13macOS 15.0+ ARM64

sparsax-0.7.0-cp312-cp312-win_amd64.whl (7.0 MB view details)

Uploaded CPython 3.12Windows x86-64

sparsax-0.7.0-cp312-cp312-manylinux_2_28_x86_64.whl (6.3 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64

sparsax-0.7.0-cp312-cp312-manylinux_2_28_aarch64.whl (6.0 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ ARM64

sparsax-0.7.0-cp312-cp312-macosx_15_0_arm64.whl (1.8 MB view details)

Uploaded CPython 3.12macOS 15.0+ ARM64

sparsax-0.7.0-cp311-cp311-win_amd64.whl (7.0 MB view details)

Uploaded CPython 3.11Windows x86-64

sparsax-0.7.0-cp311-cp311-manylinux_2_28_x86_64.whl (6.4 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64

sparsax-0.7.0-cp311-cp311-manylinux_2_28_aarch64.whl (6.0 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ ARM64

sparsax-0.7.0-cp311-cp311-macosx_15_0_arm64.whl (1.8 MB view details)

Uploaded CPython 3.11macOS 15.0+ ARM64

File details

Details for the file sparsax-0.7.0.tar.gz.

File metadata

  • Download URL: sparsax-0.7.0.tar.gz
  • Upload date:
  • Size: 54.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for sparsax-0.7.0.tar.gz
Algorithm Hash digest
SHA256 f932423142e134d9e26f6392eb1bd352d2991c08f9714587415add1bd697f0e5
MD5 1dfeaf60eb564b9c14fcbecd6bb3d905
BLAKE2b-256 cfdd533876d9127b3bdd44ed104b83dd6149e5b8afd628c040b93d808633c668

See more details on using hashes here.

Provenance

The following attestation bundles were made for sparsax-0.7.0.tar.gz:

Publisher: build-wheels.yml on knaaptime/sparsax

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sparsax-0.7.0-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: sparsax-0.7.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 7.0 MB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for sparsax-0.7.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 329f70ae966b7a2c2efe8dadee327c4bea0c8f6307b355b4e5c32de566989528
MD5 fb1a66e3a5b0ccdbebb59661453ae00a
BLAKE2b-256 83a96494ee52999b5292753cadf47bb1d1b40b188c57f48cb751185fbf0c0601

See more details on using hashes here.

Provenance

The following attestation bundles were made for sparsax-0.7.0-cp313-cp313-win_amd64.whl:

Publisher: build-wheels.yml on knaaptime/sparsax

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sparsax-0.7.0-cp313-cp313-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for sparsax-0.7.0-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 01d2b8348e59e2f69e357b97c9edbd81ad2fd1450e2d4d1349f8d35bc2116c88
MD5 e04c4f95611196083d50245e44449ef4
BLAKE2b-256 d389ab2aab5af0d82fc46a834d7b1900dd274642d73151eab5536ae0a27017d2

See more details on using hashes here.

Provenance

The following attestation bundles were made for sparsax-0.7.0-cp313-cp313-manylinux_2_28_x86_64.whl:

Publisher: build-wheels.yml on knaaptime/sparsax

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sparsax-0.7.0-cp313-cp313-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for sparsax-0.7.0-cp313-cp313-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 1eb269a5481f3cd23c945c8ccb71273f337b8c5f0639f399ac1c9fb34ced617e
MD5 2c94ecdb42774b33588e3a7a79f60d0c
BLAKE2b-256 5341dd50b10cbd803f3eb39e322fdb5c5c66c6fbee73c849755f594e73de1698

See more details on using hashes here.

Provenance

The following attestation bundles were made for sparsax-0.7.0-cp313-cp313-manylinux_2_28_aarch64.whl:

Publisher: build-wheels.yml on knaaptime/sparsax

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sparsax-0.7.0-cp313-cp313-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for sparsax-0.7.0-cp313-cp313-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 4770e00c8861c90ceb77111597cb41656d097460c40af70cccdb5a84426c0db3
MD5 0fb5054b1e242a3b203b13a97fccd77c
BLAKE2b-256 bcad99b92c3e8beb31dd86efac74b74e1df31044209740b376c141b0e41dcced

See more details on using hashes here.

Provenance

The following attestation bundles were made for sparsax-0.7.0-cp313-cp313-macosx_15_0_arm64.whl:

Publisher: build-wheels.yml on knaaptime/sparsax

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sparsax-0.7.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: sparsax-0.7.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 7.0 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for sparsax-0.7.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 3a88eb1f89ad63f5816ee7054676670d8b4c2b40840f58a4132f6d0f9e2337f0
MD5 d5f172873285a8eaae83d3d550160482
BLAKE2b-256 5c9f6f34937eaadf15f97bf93eb2f321421b7d245769f284ec7319d41adb796c

See more details on using hashes here.

Provenance

The following attestation bundles were made for sparsax-0.7.0-cp312-cp312-win_amd64.whl:

Publisher: build-wheels.yml on knaaptime/sparsax

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sparsax-0.7.0-cp312-cp312-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for sparsax-0.7.0-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c291c0e2e94ca6b5be79b133fa58158c323c549a55b62ddf782951b4d4c54645
MD5 adca93de5e4ddc7375ebab7162363c49
BLAKE2b-256 ee80ccccf478ac7d672f89f6fcc7c6414fa149666cff596d42bef31bc59ee0e3

See more details on using hashes here.

Provenance

The following attestation bundles were made for sparsax-0.7.0-cp312-cp312-manylinux_2_28_x86_64.whl:

Publisher: build-wheels.yml on knaaptime/sparsax

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sparsax-0.7.0-cp312-cp312-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for sparsax-0.7.0-cp312-cp312-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 3aaf9f40e499509f26b3b1c1d1dbcd76ebe13b19d58e19ba4a456f2062839b75
MD5 33421c9f6fcd52927acfc59407082182
BLAKE2b-256 74e4ae3b78ca03168fd0ed0d820ea30aea35b30791a865710192c890186c8fe7

See more details on using hashes here.

Provenance

The following attestation bundles were made for sparsax-0.7.0-cp312-cp312-manylinux_2_28_aarch64.whl:

Publisher: build-wheels.yml on knaaptime/sparsax

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sparsax-0.7.0-cp312-cp312-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for sparsax-0.7.0-cp312-cp312-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 105a306e76cdd9c41a00031fd3401ef0bfffb9d8b0380482ceb9fb019525a710
MD5 84f737283a2ee94c79ef75e7d8fd2db2
BLAKE2b-256 ff5fd2fea8ecf8cc83bfd2395ee43bd018872703c3cbca920bd7b1e551c9fa98

See more details on using hashes here.

Provenance

The following attestation bundles were made for sparsax-0.7.0-cp312-cp312-macosx_15_0_arm64.whl:

Publisher: build-wheels.yml on knaaptime/sparsax

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sparsax-0.7.0-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: sparsax-0.7.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 7.0 MB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for sparsax-0.7.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 23f8d7073d743039e8ea55f2dcff6db92129f147bcf4b6712414976c4788dc0a
MD5 2b9c03acb35beb1662b7f918db1f3a4d
BLAKE2b-256 f607280c447e97daaa6816712669625f11ff33c153fa9029eb5bcabff3f71f5a

See more details on using hashes here.

Provenance

The following attestation bundles were made for sparsax-0.7.0-cp311-cp311-win_amd64.whl:

Publisher: build-wheels.yml on knaaptime/sparsax

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sparsax-0.7.0-cp311-cp311-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for sparsax-0.7.0-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 a43c66aacb8bad67c85335d0f9cc8474422062fc683e9c74a301eb2c261a464d
MD5 8ce2a6bfb9a15ac846b1cc0c33a615a1
BLAKE2b-256 a07228153e56cd5f906f024442a892caf6871820f749d4e1dc784c6ec7b16f71

See more details on using hashes here.

Provenance

The following attestation bundles were made for sparsax-0.7.0-cp311-cp311-manylinux_2_28_x86_64.whl:

Publisher: build-wheels.yml on knaaptime/sparsax

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sparsax-0.7.0-cp311-cp311-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for sparsax-0.7.0-cp311-cp311-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 9e083887d8b740f6025f5f6f9af0f11858c25bcdc3a12a4e371c2c942d020651
MD5 0fbe013d5ce6e01eb4de1735fef778f5
BLAKE2b-256 1c8d4eeb7c590b35fde1f4e92116ad5603a94d7307c4d0a65d9706ecaac85ed2

See more details on using hashes here.

Provenance

The following attestation bundles were made for sparsax-0.7.0-cp311-cp311-manylinux_2_28_aarch64.whl:

Publisher: build-wheels.yml on knaaptime/sparsax

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sparsax-0.7.0-cp311-cp311-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for sparsax-0.7.0-cp311-cp311-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 dc5fc5d569022e4a7919e10f3993877eeaa92873dd895d95a0d2112f19ad1d9b
MD5 2abe0bfcac44942b5cd1c0f72bb84bed
BLAKE2b-256 ef6bd3bf2b1d1b703a7542a9f614fe374580107102764bcfe06ecf5e9449d787

See more details on using hashes here.

Provenance

The following attestation bundles were made for sparsax-0.7.0-cp311-cp311-macosx_15_0_arm64.whl:

Publisher: build-wheels.yml on knaaptime/sparsax

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page