Skip to main content

Continuous Integration codecov

cholgraph

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 cholgraph
pip install --no-build-isolation .

Quick start

import jax
import jax.numpy as jnp
import numpy as np
import cholgraph

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 = cholgraph.solve(Ai, Aj, Ax, b)          # eager
ld = cholgraph.logdet(Ai, Aj, Ax, n=3)      # log|A| from the same factorization

@jax.jit                                      # ...or fully JIT-compiled
def gibbs_step(Ax, b):
    x = cholgraph.solve(Ai, Aj, Ax, b)      # full CHOLMOD speed, no callbacks
    ld = cholgraph.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=cholgraph.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 = cholgraph.sample_gaussian(Ai, Aj, Ax, b, z, want_logdet=True)

# ...or spell it out with the general primitive:
(mean, w), ld = cholgraph.factor_solve(
    Ai, Aj, Ax,
    [(b, cholgraph.MODE_A),                          # A^-1 b
     (z, (cholgraph.MODE_LT, cholgraph.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. cholgraph.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 @ cholgraph.solve(Ai, Aj, Ax, b)         # b' A^-1 b   (solve VJP)
    return 0.5 * quad - 0.5 * cholgraph.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 = cholgraph.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 "cholgraph[pytensor]"
import pytensor.tensor as pt
import cholgraph.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  = cholgraph.solve_bcoo(A, b)            # == solve(A.indices[:,0], A.indices[:,1], A.data, b)
ld = cholgraph.logdet_bcoo(A)
x  = cholgraph.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 = cholgraph.update_solve(Ai, Aj, Ax, c, b)                 # (A + c c') x = b
x = cholgraph.update_solve(Ai, Aj, Ax, c, b, downdate=True)  # (A - c c') x = b
x, ld = cholgraph.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

cholgraph.set_options(supernodal="simplicial")  # or "auto" (default), "supernodal"
cholgraph.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 (cholgraph.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

cholgraph-0.6.0.tar.gz (42.3 kB view details)

Uploaded Source

Built Distributions

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

cholgraph-0.6.0-cp313-cp313-win_amd64.whl (6.9 MB view details)

Uploaded CPython 3.13Windows x86-64

cholgraph-0.6.0-cp313-cp313-manylinux_2_28_x86_64.whl (6.2 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64

cholgraph-0.6.0-cp313-cp313-manylinux_2_28_aarch64.whl (5.9 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ ARM64

cholgraph-0.6.0-cp313-cp313-macosx_15_0_arm64.whl (1.7 MB view details)

Uploaded CPython 3.13macOS 15.0+ ARM64

cholgraph-0.6.0-cp312-cp312-win_amd64.whl (6.9 MB view details)

Uploaded CPython 3.12Windows x86-64

cholgraph-0.6.0-cp312-cp312-manylinux_2_28_x86_64.whl (6.2 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64

cholgraph-0.6.0-cp312-cp312-manylinux_2_28_aarch64.whl (5.9 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ ARM64

cholgraph-0.6.0-cp312-cp312-macosx_15_0_arm64.whl (1.7 MB view details)

Uploaded CPython 3.12macOS 15.0+ ARM64

cholgraph-0.6.0-cp311-cp311-win_amd64.whl (6.9 MB view details)

Uploaded CPython 3.11Windows x86-64

cholgraph-0.6.0-cp311-cp311-manylinux_2_28_x86_64.whl (6.2 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64

cholgraph-0.6.0-cp311-cp311-manylinux_2_28_aarch64.whl (5.9 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ ARM64

cholgraph-0.6.0-cp311-cp311-macosx_15_0_arm64.whl (1.7 MB view details)

Uploaded CPython 3.11macOS 15.0+ ARM64

File details

Details for the file cholgraph-0.6.0.tar.gz.

File metadata

  • Download URL: cholgraph-0.6.0.tar.gz
  • Upload date:
  • Size: 42.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for cholgraph-0.6.0.tar.gz
Algorithm Hash digest
SHA256 cb45e02d44f621db763108e15bfedcf6daaa70f08bef32772338bb2cebdcfefd
MD5 68dae5ac87f2c08c93fa5688afb305c4
BLAKE2b-256 c11dee35133316e982838678066784d48e6901e918b160c401a7c7ec098fb45b

See more details on using hashes here.

Provenance

The following attestation bundles were made for cholgraph-0.6.0.tar.gz:

Publisher: build-wheels.yml on knaaptime/cholgraph

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

File details

Details for the file cholgraph-0.6.0-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: cholgraph-0.6.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 6.9 MB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for cholgraph-0.6.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 198c43adc10f698c7a3fd2ffd61073f5891f024e82927702927b81c04e395852
MD5 9ee2848e780a56260f0e32665408fd01
BLAKE2b-256 a273cb3a0ba3e880f48508cdd2cecf83bba38a31a7be0cef1b84b91b14a588a0

See more details on using hashes here.

Provenance

The following attestation bundles were made for cholgraph-0.6.0-cp313-cp313-win_amd64.whl:

Publisher: build-wheels.yml on knaaptime/cholgraph

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

File details

Details for the file cholgraph-0.6.0-cp313-cp313-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for cholgraph-0.6.0-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 014dc9746711928e5f22cc01dfe5d1eaf6cfeb8f2ec82834707103e9b337b3eb
MD5 ae25417723c7c01bed627fc76172afc1
BLAKE2b-256 ab9c0858fb0ba5eb5b4645a1060a12246d95b8de9c867d8e17d975060901197a

See more details on using hashes here.

Provenance

The following attestation bundles were made for cholgraph-0.6.0-cp313-cp313-manylinux_2_28_x86_64.whl:

Publisher: build-wheels.yml on knaaptime/cholgraph

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

File details

Details for the file cholgraph-0.6.0-cp313-cp313-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for cholgraph-0.6.0-cp313-cp313-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 23700ecd7ff3ee659e1161917833d316cfa592001953fa8f8d4087b56d980723
MD5 789f3fba0393ef6e5fcea9b1b96759ea
BLAKE2b-256 caca2ec938536176a9a21b32e6f36a890bb8534e3e99d883304ec31f71389f22

See more details on using hashes here.

Provenance

The following attestation bundles were made for cholgraph-0.6.0-cp313-cp313-manylinux_2_28_aarch64.whl:

Publisher: build-wheels.yml on knaaptime/cholgraph

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

File details

Details for the file cholgraph-0.6.0-cp313-cp313-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for cholgraph-0.6.0-cp313-cp313-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 1c18fe314670926c2b83be6be85d7508d0e074c89140c0bc0b6cc3a9601788cc
MD5 25a2963b19745f916c821c0a0cb6d38a
BLAKE2b-256 3fd812196d4f174b790f1571928893bd102981af475c53ba489189cadedcac9e

See more details on using hashes here.

Provenance

The following attestation bundles were made for cholgraph-0.6.0-cp313-cp313-macosx_15_0_arm64.whl:

Publisher: build-wheels.yml on knaaptime/cholgraph

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

File details

Details for the file cholgraph-0.6.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: cholgraph-0.6.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 6.9 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for cholgraph-0.6.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 50f67d7cfbf307b7235864b7db88b97f1e031a64ade7a21b07d801db763a6837
MD5 b4d2c094ce0a8f11a2a02dca5465d912
BLAKE2b-256 9aee45ec8e4ec0e3b75a1661b9cfc8838a2b25b49320173fa8aa6c0b06f0e623

See more details on using hashes here.

Provenance

The following attestation bundles were made for cholgraph-0.6.0-cp312-cp312-win_amd64.whl:

Publisher: build-wheels.yml on knaaptime/cholgraph

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

File details

Details for the file cholgraph-0.6.0-cp312-cp312-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for cholgraph-0.6.0-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 a7f07aa30b80acad37d117c592eb156b6d5d12b7e0d66a66c29a9bd716634652
MD5 e5dc965eed681fd6eb0ba21c661ac02a
BLAKE2b-256 61d6ada68cc5bd1c82fab14770726953d2fd14749b50cfdf62a1cc17f45c8d5a

See more details on using hashes here.

Provenance

The following attestation bundles were made for cholgraph-0.6.0-cp312-cp312-manylinux_2_28_x86_64.whl:

Publisher: build-wheels.yml on knaaptime/cholgraph

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

File details

Details for the file cholgraph-0.6.0-cp312-cp312-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for cholgraph-0.6.0-cp312-cp312-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 90dc277111556d779479fd8d5032d0dd8902951f15dfc1680bc9bc69dd10b5d3
MD5 157f753cef23ad04d83f87f9fc35257a
BLAKE2b-256 8a12baf652b4cfbfbe23ffc09142fc9bec2c43c001a40549569f2915d579b37f

See more details on using hashes here.

Provenance

The following attestation bundles were made for cholgraph-0.6.0-cp312-cp312-manylinux_2_28_aarch64.whl:

Publisher: build-wheels.yml on knaaptime/cholgraph

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

File details

Details for the file cholgraph-0.6.0-cp312-cp312-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for cholgraph-0.6.0-cp312-cp312-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 b8c28844adb7a0f56f315a7949668da232e81ef6e0a3297ac68f0c8fad2a493a
MD5 71e452327c31ecae3a9b94f0915ef90b
BLAKE2b-256 b6c463f4eb8886079bcdbf09bbe2ac6397317dbdae38c126a91f19011125553e

See more details on using hashes here.

Provenance

The following attestation bundles were made for cholgraph-0.6.0-cp312-cp312-macosx_15_0_arm64.whl:

Publisher: build-wheels.yml on knaaptime/cholgraph

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

File details

Details for the file cholgraph-0.6.0-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: cholgraph-0.6.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 6.9 MB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for cholgraph-0.6.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 dd261afb4575c7b5d2e15da124529f6ab389052579d9aeb1b07c8f084a716dcb
MD5 4e1eb15bc4ddb50446ca3d7114792acb
BLAKE2b-256 1240e51b32497a63f60b791ca84bd7cfaa5967ad04368ea483412cb9c70ea02a

See more details on using hashes here.

Provenance

The following attestation bundles were made for cholgraph-0.6.0-cp311-cp311-win_amd64.whl:

Publisher: build-wheels.yml on knaaptime/cholgraph

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

File details

Details for the file cholgraph-0.6.0-cp311-cp311-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for cholgraph-0.6.0-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e69b1a1c2812625071221f1b284b9a5d4f2962980083982629e664e128739f12
MD5 b926a007185e3e45b63d622e191d8e0e
BLAKE2b-256 d10dcdf7cef7169e4f94d5ad6cb50e4f10d9380ca84d438b3199987f8ce54aea

See more details on using hashes here.

Provenance

The following attestation bundles were made for cholgraph-0.6.0-cp311-cp311-manylinux_2_28_x86_64.whl:

Publisher: build-wheels.yml on knaaptime/cholgraph

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

File details

Details for the file cholgraph-0.6.0-cp311-cp311-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for cholgraph-0.6.0-cp311-cp311-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 bc3b4307347ef95b93956418b5c123c0449cf2ef3aa59ffeb1ffdc1b3f8d874e
MD5 e3086279c908413555c5fa1ef058d1d0
BLAKE2b-256 3ecd6c1dc962542557f5fb1f32882fc8ffd80520bab9cb3388a30502d76ddbf0

See more details on using hashes here.

Provenance

The following attestation bundles were made for cholgraph-0.6.0-cp311-cp311-manylinux_2_28_aarch64.whl:

Publisher: build-wheels.yml on knaaptime/cholgraph

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

File details

Details for the file cholgraph-0.6.0-cp311-cp311-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for cholgraph-0.6.0-cp311-cp311-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 09ac97e52abe2a8583d96d7b042f01622dd6194c3d4d36f8a34587fc1c815cfe
MD5 04ed84931e2572aba922b90c7697cfcc
BLAKE2b-256 efd19c3f09c080201cf35b2d25d4dc01b3a05782e9336b9abe1bf4673915c562

See more details on using hashes here.

Provenance

The following attestation bundles were made for cholgraph-0.6.0-cp311-cp311-macosx_15_0_arm64.whl:

Publisher: build-wheels.yml on knaaptime/cholgraph

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

Release history Release notifications | RSS feed

This release

0.6.0 This release

13 files

Supported by

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