cmgraph — Conley Morse Graph
High-performance C++20 + pybind11 package that computes cell maps, Morse graphs, and homological Conley indices for discrete-time dynamical systems, from either a continuous map (given as an outer-enclosure box map) or a sampled dataset.
The compiled core (cmgraph._core) carries the whole pipeline —
outer-approximation cell map ⟶ strongly connected components ⟶ Morse decomposition +
partial order ⟶ (on demand) cubical relative homology and the Leray-reduced index map. The
Python surface is a thin, ergonomic layer over it. Cells are exposed as stable keys
(Python ints) that survive refinement.
Install
pip install . # core (no plotting dependencies)
pip install ".[viz]" # + matplotlib and graphviz for cmgraph.plot
import cmgraphneeds no third-party runtime dependency.numpyis used for numeric outputs when it is importable and is otherwise optional (outputs fall back to nested Python lists; cell keys are always Python ints).- Plotting backends (
matplotlib,graphviz) are the optionalvizextra:import cmgraphandimport cmgraph.plotboth succeed without them, and each plot function raises a clearpip install cmgraph[viz]hint only when called without its backend. - Build stack:
scikit-build-core+ CMake +pybind11, C++20 (GCC 11+, Clang 13+), Python 3.10+. The package version is single-sourced frompyproject.toml.
Quickstart — Leslie 2D end to end
import math
import cmgraph as cm
TH1 = TH2 = 20.0; PHI = 0.1; P = 0.7
_up = lambda v: math.nextafter(v, math.inf)
_dn = lambda v: math.nextafter(v, -math.inf)
def leslie_box(box):
"""Outward-rounded interval enclosure of the 2D Leslie map (a genuine outer bound)."""
(xlo, xhi), (ylo, yhi) = box
ulo = _dn(_dn(TH1 * xlo) + _dn(TH2 * ylo)); uhi = _up(_up(TH1 * xhi) + _up(TH2 * yhi))
slo = _dn(xlo + ylo); shi = _up(xhi + yhi)
elo = _dn(math.exp(_dn(-PHI * shi))); ehi = _up(math.exp(_up(-PHI * slo)))
prods = [ulo * elo, ulo * ehi, uhi * elo, uhi * ehi]
return [[_dn(min(prods)), _up(max(prods))], [_dn(P * xlo), _up(P * xhi)]]
model = cm.Model(
bounds=[[-0.001, 90.0], [-0.001, 70.0]],
map=cm.BoxMap(leslie_box, batched=False),
grid=cm.Grid(size=[128, 128]),
)
mg = model.morse_graph() # fast path: Morse graph, no homology
print(mg.summary()) # node count, per-node cell counts, partial order
mg.morse_sets() # per-node cell KEYS (stable across refinement)
Refine, inspect, retain state
Refinement mutates the engine in place and keeps the cached image box of every cell that already exists — only newly created cells trigger a map evaluation. The per-round report's f-evaluation count proves it:
report = mg.refine(subdivisions=1, region="morse_sets") # subdivide + recompute in place
# For a box map (BoxMap), every new leaf is evaluated exactly once and no old cell is
# re-evaluated, so the per-round f-evaluation count equals the number of new leaves:
assert report["f_evaluations"] == report["new_leaves"] # unchanged cells are not re-evaluated
For a dataset map (BoxMapData), children that fall in an empty region are classified
NO_DATA and are not counted as evaluations, so the identity above becomes
f_evaluations == new_leaves - (NO_DATA children); the retention guarantee (old cells are
never re-evaluated) is unchanged.
Conley index on demand
A Morse set typically does not isolate at a coarse resolution, so conley_index raises a
recoverable cm.IndexPairInvalid (refine the offending set and retry). Guard the call:
try:
ci = mg.conley_index(node=0) # RCF of the Leray-reduced f* over Z/5
ci = mg.conley_index(node=0, want_homology=True) # + relative homology H_*(P1, P0)
ci = mg.conley_index(node=0, coefficients="Z") # arithmetic over Q, integer homology
except cm.IndexPairInvalid:
... # node 0 does not isolate at this resolution — refine it first
The full refine-to-isolate loop that drives a Morse set to a valid index pair and computes
a genuine degree-1 Conley index lives in
examples/conley_index.py.
Rigor contract
The library's own arithmetic is rigorous: every conversion from a floating-point image box to integer cells rounds outward, so the computed cell map is a genuine outer approximation of the true dynamics.
- B1 — the box handed to your map is the cell's real box widened outward (directed
rounding + k-ulp margin), so
f(box_true(c)) ⊆ f(box_given(c)). - B2 — your enclosure box is converted to the union of every cell it meets under
outward, closed-cube rounding, so
enclosure ⊆ |F(c)|.
What the library cannot verify is your map itself. The rigor of the result therefore rests on the path you choose:
cm.BoxMap(f)— rigorous ifffis a true outer enclosure.fmust map a box to a box that contains the image of every point in it:f(box) ⊇ image(box). The examples build these by interval arithmetic with outward rounding and each documents why the bound holds. (A libm caveat: bounding a transcendental likeexpby a fixed outward ulp widening assumes the platform libm is accurate to ≤ 1 ulp — true on glibc ≥ 2.28 and the macOS system libm; a looser libm needs more ulps.)cm.BoxMap(point_map, padding=[...])— non-rigorous. A convenience that samples a point map at cell corners and inflates by a fixed padding. It is an outer approximation only if the padding dominates the map's sub-cell variation (this is not checked).cm.BoxMapData(X, Y, padding=...)— non-rigorous unless dominated. Builds a cell map from sampled transitionsx_i → y_i: the image of a cell is the convex hull of the images of the samples in it, inflated bypadding. It is an outer approximation only if the padding (or a suppliedlipschitz=...bound, which makes each image a ball around every sample) dominates the sub-cell variation.
Rigor propagates: given a valid box map, the cell map, Morse decomposition, and Conley indices all carry the outer-approximation guarantees of the combinatorial-dynamics literature.
API tour
| Object / call | Role |
|---|---|
cm.Model(bounds, map, grid, threads=0) |
Binds a bounding box, a map spec, and a grid spec into the compute–inspect–refine engine. .size, .dimension, .bounds, .cells_under(key). threads: cell-map-build worker count (0 = all cores, default; 1 = serial) — results are bit-identical for any value; env CMGRAPH_NUM_THREADS overrides the auto default. |
cm.BoxMap(f, batched=True) |
A box→box outer enclosure (or BoxMap(point_map, padding=[...]) for the non-rigorous point-map path). |
cm.BoxMapData(X, Y, padding=..., lipschitz=..., borrow_rings=0) |
A dataset cell map from sampled transitions; empty-cell policy is NO_DATA by default (borrow_rings=0) or ring-budgeted collar borrowing (borrow_rings ≥ 1, requires a Lipschitz bound). |
cm.Grid(size=[...]) / cm.Grid(subdivisions=k) |
Grid shape spec — anisotropic per-dimension sizes, or k uniform binary subdivisions. |
model.morse_graph(conley_index=False) |
Compute the Morse graph (GIL released). Returns a MorseGraph handle. |
mg.summary() / mg.morse_sets() / mg.cells(n) / mg.node_boxes(n) / mg.node_stats(n) |
Inspection: node/cell counts, per-node cell keys, per-node cell boxes, stats. |
mg.order_pairs() / mg.reaches(p, q) |
The Morse-graph partial order (reachability on the condensation). |
mg.refine(subdivisions= / to_level= / size=, region=, eval=, collar=, recompute=) |
Refine + recompute in place. region: None (whole grid), "morse_sets", "invariant_set", mg.morse_set(i) / mg.connections(i, j) handles, or an iterable of cell keys. to_level is idempotent. recompute=False batches rounds; settle with mg.recompute(). |
mg.conley_index(node, coefficients=None, want_homology=False, want_full_index_map=False) |
The homological Conley index of a node, on demand (see below). Raises cm.IndexPairInvalid when the node does not isolate. |
mg.spurious(node, budget=, certify=) |
The spurious-set protocol: refine a node until its recurrence vanishes (spurious) or a budget is spent. |
plot.morse_graph(mg, path=...) / plot.morse_sets(mg, dims=(0,1), path=...) |
Optional viz: Graphviz DOT and matplotlib (headless Agg) with shared node colours. |
Conley-index output form
conley_index returns, per homology degree, the rational canonical form of the Leray
reduction of the induced index map f*, computed over a field. The default field is
𝔽₅ (coefficients=None); pass coefficients="Z/p", ("Z/p", p), or an int prime p
for another prime, or coefficients="Z" for arithmetic over ℚ with integer relative
homology (torsion reported). want_homology=True adds H_*(P1, P0); want_full_index_map
adds the full (unreduced) f* matrices. The RCF over any prime presents the shift-
equivalence class of f* (Franks–Richeson 2000) canonically and index-pair-independently.
Practical scale and dimension limits
- Dimension: typical
d = 2–4; supported tod = 8, hard capd = 16. The Morse-graph pipeline is viable to the cap; collar-based index pairs and cubical homology are practically confined tod ≲ 8–10by the3^dclosure factors. - Cells: up to ~10⁸ leaves; use the implicit edge mode at large scale (edges dominate
memory). Keys pack into 128 bits at these depths (
Key128), narrower grids useuint64.
Performance & parallelism
The cell-map build parallelizes deterministically (Model(threads=...), default all
cores): map evaluation over cells for C++ analytic oracles, plus CSR coverage assembly for
any map. Results are bit-identical to serial for any thread count. Measured cell-map-
build speedup ≥ 3× at 8 threads on a 6-physical-core Intel Mac (Leslie 2D/3D, ~10⁶ cells);
Python-callback maps evaluate serially under the GIL (batch them; a C++ oracle is the hot
path). Reproduce with python scripts/benchmark.py. Full numbers, latencies, memory-per-
cell vs design §4, and the honest (d, depth, N) envelope:
docs/performance.md.
Examples
All scripts are standalone, headless, and deterministic (python examples/<name>.py;
outputs go to $CMGRAPH_EXAMPLE_OUTDIR, default a temp dir):
| Script | Shows |
|---|---|
leslie_2d.py |
2D Leslie map: rigorous box map, Morse graph + plots |
leslie_3d.py |
3D Leslie map: Morse sets projected + a 3D view |
henon.py |
Hénon map: coarse recurrent set merging attractor + exterior saddle |
leslie_dataset.py |
dataset-driven (BoxMapData) vs the analytic map |
interactive_refinement.py |
compute → inspect → refine, state retention via the f-counter |
skip_conley.py |
the skip-homology fast path vs eager index |
conley_index.py |
a genuine degree-1 Conley index of the Hénon saddle |
Documentation
docs/index.md— documentation entry point.- Design records (the theory reference):
docs/design/01-data-structures.md,02-engine.md,03-index-pair-isolation.md,04-conley-index-map.md. docs/annotations.md— the A1–A10 structural-annotation audit map.docs/performance.md— measured parallel speedup, latencies, and the memory/scale envelope (reproduce withscripts/benchmark.py).
Test
pytest tests/ # Python + example integration tests
C++ unit tests run through CTest from a -DCMGRAPH_BUILD_TESTS=ON CMake build.
Persistence (planned)
Saving and loading the full computed state (grid keys, image caches, Morse graph) is a planned future feature, not shipped in this version. The design does not preclude it: the flat-array data structures (design 01 §2.2 / §6) are laid out so a versioned save/load can be added without changing the core. For now, re-run the pipeline from the model spec.
License
MIT — see LICENSE.
Metadata
Release files for cmgraph 0.0.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| cmgraph-0.0.1.tar.gz | 486.8 kB | Details |
Built distributions (wheels)
Total release size: 7.2 MB
Release files / cmgraph-0.0.1.tar.gz
| Download URL | cmgraph-0.0.1.tar.gz |
|---|---|
| Size | 486.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
64fcbb38ca81355de7cf86fc179a86f93cac5af8b609b0a4e43b9c2336b4020f
|
|
BLAKE2b-256 checksum How to use checksums |
99d58e061aa60965ec6bb750fddcb6848693be3185691c11002e693b1edec9d5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jul 14, 2026.
Transparency logRelease files / cmgraph-0.0.1-cp313-cp313-win_amd64.whl
| Download URL | cmgraph-0.0.1-cp313-cp313-win_amd64.whl |
|---|---|
| Size | 393.0 kB |
| Tags | CPython 3.13 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
16266ca32747b3143557f9408dc69eb2c980795d4ab43508082b6b823ca7bdb7
|
|
BLAKE2b-256 checksum How to use checksums |
6368f196017f97edc025e7a83073082b0c6faea119c4d4c08e245dab74ded3ac
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jul 14, 2026.
Transparency logRelease files / cmgraph-0.0.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | cmgraph-0.0.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 449.2 kB |
| Tags | CPython 3.13 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
6f1e76a4c16fdda7ec6daec3f5cbc72cde1fb8aaf38ecb3a2374046eebcaeb9b
|
|
BLAKE2b-256 checksum How to use checksums |
aa3b5c098ea5729408db763daa1b8cda66c52868ea7fe93d6035a6a3e98fead9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jul 14, 2026.
Transparency logRelease files / cmgraph-0.0.1-cp313-cp313-macosx_11_0_arm64.whl
| Download URL | cmgraph-0.0.1-cp313-cp313-macosx_11_0_arm64.whl |
|---|---|
| Size | 394.6 kB |
| Tags | CPython 3.13 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
b00b99a2b9a688f836d361b618a514e1110364b35b7728169cceae6998e288d4
|
|
BLAKE2b-256 checksum How to use checksums |
a8ed48932b360b08b54e299dc93e92fdedfc00f21747a9937677a340000528ef
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jul 14, 2026.
Transparency logRelease files / cmgraph-0.0.1-cp313-cp313-macosx_10_13_x86_64.whl
| Download URL | cmgraph-0.0.1-cp313-cp313-macosx_10_13_x86_64.whl |
|---|---|
| Size | 435.0 kB |
| Tags | CPython 3.13 macOS 10.13+ x86-64 |
|
SHA-256 checksum How to use checksums |
83cf2b2d594cf247b6011fc23c2dd1229ddeac5b786e4b3ef2d9346f419c3cb9
|
|
BLAKE2b-256 checksum How to use checksums |
62239f70a72e850d9768d49af215fe3e70f5a9a8e452ade9ac39ad97d3fdb2d1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jul 14, 2026.
Transparency logRelease files / cmgraph-0.0.1-cp312-cp312-win_amd64.whl
| Download URL | cmgraph-0.0.1-cp312-cp312-win_amd64.whl |
|---|---|
| Size | 392.9 kB |
| Tags | CPython 3.12 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
2595266921011be3ffd0ae0ed6c23e9b3b5be58ea3d82fb984c2c426f177592a
|
|
BLAKE2b-256 checksum How to use checksums |
988ba250c3252b009b0564ca8dad55b9b11021fc57b5eacc5941d08bd535ce94
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jul 14, 2026.
Transparency logRelease files / cmgraph-0.0.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | cmgraph-0.0.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 449.1 kB |
| Tags | CPython 3.12 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
e4dc377e37422edbc14bacdda4b08a2eb2bb29eb7cc46ecf35cab4ee48b26c7e
|
|
BLAKE2b-256 checksum How to use checksums |
10861c950f76a8ecae03360ddc368cdb29da9fccfb036ed2b0dc7976b33f0be1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jul 14, 2026.
Transparency logRelease files / cmgraph-0.0.1-cp312-cp312-macosx_11_0_arm64.whl
| Download URL | cmgraph-0.0.1-cp312-cp312-macosx_11_0_arm64.whl |
|---|---|
| Size | 394.6 kB |
| Tags | CPython 3.12 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
9d0ea15a29513336f5fcc0d471999a30e6fd4fad0190b6a637209a04be174a52
|
|
BLAKE2b-256 checksum How to use checksums |
79f281f8e16f7d041aad515dd26ad2a075aa25a5d40b240b272b79fa9cbf4bfb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jul 14, 2026.
Transparency logRelease files / cmgraph-0.0.1-cp312-cp312-macosx_10_13_x86_64.whl
| Download URL | cmgraph-0.0.1-cp312-cp312-macosx_10_13_x86_64.whl |
|---|---|
| Size | 435.0 kB |
| Tags | CPython 3.12 macOS 10.13+ x86-64 |
|
SHA-256 checksum How to use checksums |
c9dca6114b7a103a1c180c3e7ba529b8b454ac1e77f901c3832568a847963de2
|
|
BLAKE2b-256 checksum How to use checksums |
133930c6f37e0a1c0785a6449601b462ac91e432bf7dba59768291ca0bdf37b6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jul 14, 2026.
Transparency logRelease files / cmgraph-0.0.1-cp311-cp311-win_amd64.whl
| Download URL | cmgraph-0.0.1-cp311-cp311-win_amd64.whl |
|---|---|
| Size | 389.9 kB |
| Tags | CPython 3.11 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
2612dcc9285c9e004a9656d46f34bd49ae1f9c8093fcc860abeb4d4fbd8b4631
|
|
BLAKE2b-256 checksum How to use checksums |
bd70d54510576a65d741ef1d9be82422c1ed728abe0ccd250e45e9229babe3f3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jul 14, 2026.
Transparency logRelease files / cmgraph-0.0.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | cmgraph-0.0.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 450.0 kB |
| Tags | CPython 3.11 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
87ee03e35e99e41ade23d10ce19b23f3429309bec9fdd8370a8cbfee4774bb39
|
|
BLAKE2b-256 checksum How to use checksums |
f207c0e7e2cf216c4f7e68dc306574a9ae1de95e03d9bb3e7521b9f3400fc3ce
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jul 14, 2026.
Transparency logRelease files / cmgraph-0.0.1-cp311-cp311-macosx_11_0_arm64.whl
| Download URL | cmgraph-0.0.1-cp311-cp311-macosx_11_0_arm64.whl |
|---|---|
| Size | 392.5 kB |
| Tags | CPython 3.11 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
adf4e3a45c0c8ff1341265b277aaaad0c708f6f7fa67b547f9fad88f1d315d8d
|
|
BLAKE2b-256 checksum How to use checksums |
f60e431e75be255efd0d1f45cddc74fdb2fbe6ce51e790eb29d2d195f4d94015
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jul 14, 2026.
Transparency logRelease files / cmgraph-0.0.1-cp311-cp311-macosx_10_9_x86_64.whl
| Download URL | cmgraph-0.0.1-cp311-cp311-macosx_10_9_x86_64.whl |
|---|---|
| Size | 431.8 kB |
| Tags | CPython 3.11 macOS 10.9+ x86-64 |
|
SHA-256 checksum How to use checksums |
7dc173e11d8056c23bf6980c1d266b4bd77f1728ee73a1bfc93cdcef060ae92c
|
|
BLAKE2b-256 checksum How to use checksums |
b31a3a70d1b645182ab22fbf361d57abcedcf9b3c71927954145e227b1276bbb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jul 14, 2026.
Transparency logRelease files / cmgraph-0.0.1-cp310-cp310-win_amd64.whl
| Download URL | cmgraph-0.0.1-cp310-cp310-win_amd64.whl |
|---|---|
| Size | 388.6 kB |
| Tags | CPython 3.10 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
f69b08457d7ae0388491c10d7c1e5c13a84d47dd81f01c8053c06e41871a94c2
|
|
BLAKE2b-256 checksum How to use checksums |
9da233e4c698c4a48fe2ce2b858d9d9a955ce8c25768950ace4c741db49b45b5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jul 14, 2026.
Transparency logRelease files / cmgraph-0.0.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | cmgraph-0.0.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 449.8 kB |
| Tags | CPython 3.10 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
d36bb09600ee7b547983843007ee3f90b69ae25869968fa3ff8cd995b9f862eb
|
|
BLAKE2b-256 checksum How to use checksums |
0944318dda700c7fb8ad7c273bf0aa470baaa1751ccafe32c72b3252d761adae
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jul 14, 2026.
Transparency logRelease files / cmgraph-0.0.1-cp310-cp310-macosx_11_0_arm64.whl
| Download URL | cmgraph-0.0.1-cp310-cp310-macosx_11_0_arm64.whl |
|---|---|
| Size | 390.5 kB |
| Tags | CPython 3.10 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
6f00e62d6cbbedaaa273d8316e0704c8818e94fcde651029ab2299abd5a2356a
|
|
BLAKE2b-256 checksum How to use checksums |
b33bcf44285a60f01dfdd6373baaa28bf20270f31d85ea568a4725ab5db30480
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jul 14, 2026.
Transparency logRelease files / cmgraph-0.0.1-cp310-cp310-macosx_10_9_x86_64.whl
| Download URL | cmgraph-0.0.1-cp310-cp310-macosx_10_9_x86_64.whl |
|---|---|
| Size | 430.6 kB |
| Tags | CPython 3.10 macOS 10.9+ x86-64 |
|
SHA-256 checksum How to use checksums |
5bc4b6168c0d29e06a94f930f2abba684db1eb29273c3afafefe1fe8f4880a8f
|
|
BLAKE2b-256 checksum How to use checksums |
a9a244313ecf479c4d063544496dccc7397c6a902e9d060f1c95e45dc63c4254
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jul 14, 2026.
Transparency log