Skip to main content

canns-lib

CI PyPI version License PyPI - Python Version

DOI arXiv

PyPI Downloads Ask DeepWiki

High-performance computational acceleration library for CANNs (Continuous Attractor Neural Networks), providing optimized Rust implementations for computationally intensive tasks in neuroscience and topological data analysis.

Overview

canns-lib is a modular library designed to provide high-performance computational backends for the CANNS Python package. It currently includes the Ripser module for topological data analysis, with plans for additional modules covering approximate nearest neighbors, dynamics computation, and other performance-critical operations.

Modules

🔬 Ripser - Topological Data Analysis

High-performance implementation of the Ripser algorithm for computing Vietoris-Rips persistence barcodes. Drop-in replacement for ripser.py with identical output (verified at the level of bar counts and per- dimension birth/death values on dense and sparse inputs).

Performance vs ripser.py (v0.9.0)

Measured by benchmarks/ripser/harness/comprehensive_benchmark.py --fast (24 dense point-cloud tests, n ∈ {50, 100, 150, 300}, maxdim ∈ {1, 2}, categories: circle, sphere, torus, random, clusters, grid, swiss_roll, moons, circles). Cross-validated on macOS arm64 and Linux x86_64 (16-core A100 server, RAYON_NUM_THREADS=16).

Platform maxdim=1 maxdim=2 overall median
Linux x86_64 / 16 cores 0.97× 1.58× 1.30×
macOS arm64 (single benchmark) 0.63× 1.10× 0.79×

Headline Linux maxdim=2 result: peak 1.91× on torus n=300. Per-dimension persistence values match ripser.py exactly on both platforms (counts_match=True | birth/death values match=True).

Performance vs ripser.py (v0.8.0 baseline, before this release)

Same harness, same matrices:

Platform v0.8.0 maxdim=1 v0.8.0 maxdim=2 v0.8.0 overall v0.9.0 deltas
Linux x86_64 / 16 cores 0.97× 1.03× 1.03× maxdim=2 +0.55×
macOS arm64 (single benchmark) 0.51× 0.98× 0.70× overall +0.09×, maxdim=2 +0.12×

Shuffle null models with explicit parameters

canns_lib.ripser.shuffle_null_model independently circular-shifts each feature column, computes distances between rows, and runs Ripser. Its metric and persistence options are explicit:

from canns_lib.ripser import ripser, shuffle_null_model

# X has shape (timepoints, features).
real = ripser(X, metric="cosine", maxdim=2, coeff=47)
null = shuffle_null_model(
    X,
    num_shuffles=100,
    metric="cosine",
    maxdim=2,
    coeff=47,
    seed=17,
)

This generic feature-space null does not perform the complete ASA analysis. The companion CANNs PR #103 keeps activity selection, standardization, PCA, density selection and graph construction in CANNs, configured through TDAConfig and rerun each round. Do not substitute a shuffle of an already processed point cloud for that full workflow. Independent column shifts also do not define a valid null for a precomputed distance matrix, so distance_matrix=True is rejected.

Explicit shifts support exact replay; generate_offsets exposes the same offset generation for application workflows. max_workers=1 is the default, with bounded thread concurrency available. Failed rounds raise with replay information instead of contributing zero or disappearing from the null.

The default result is a per-dimension list of maximum finite lifetimes. return_details=True also returns shifts, essential-class counts and complete diagrams. Finite maxima alone do not test essential classes.

The previous private _ripser_core.shuffle_null_model computed a different neuron-distance null and has been removed; calls now raise a migration error. Its timing ratios against the full ASA workflow were not measurements of the same analysis and are no longer presented as acceleration results. Downstream ASA callers must use the coordinated CANNs update.

The public Rust fuzzy_union kernel can be used within that pipeline to build an owned dense float64 adjacency matrix without fixing its scientific parameters. See the shuffle API, migration and kernel guide for contracts, memory costs and examples. The generic shuffle API alone does not establish agreement with the ASA workflow or any paper.

Features

  • Algorithmic improvements: Row-by-row edge generation, cleared coboundary enumeration
  • Memory optimization: Structure-of-Arrays reduction matrix, k-major binomial coefficient table, packed (index, coefficient) EntryT (24 → 16 bytes), GAT-based static-dispatch cofacet enumeration with inline simplex-vertex stack array
  • Parallel processing: Multi-threading with Rayon (enabled by default)
  • Full Compatibility: Drop-in replacement for ripser.py with identical API
  • Multiple Metrics: Support for Euclidean, Manhattan, Cosine, and custom distance metrics
  • Sparse Matrices: Efficient handling of sparse distance matrices
  • Cocycle Computation: Optional computation of representative cocycles
  • Configurable feature-space shuffle: explicit metric and persistence parameters, reproducible per-feature shifts, bounded concurrency and explicit failures; optional Rust fuzzy_union for dense adjacency construction (API guide)

Two experimental paths are kept under env-flag opt-in only: CANNS_RIPSER_USE_LOCKFREE=1 and CANNS_RIPSER_APPARENT=1. Both are correctness-fixed and match ripser.py outputs but are currently net- slower than sequential on this codebase.

🧭 Spatial Navigation (RatInABox parity)

Accelerated reimplementation of RatInABox environments and agents with PyO3/ Rust. Supports solid and periodic boundaries, arbitrary polygons, holes, and thigmotaxis wall-following.

Performance Snapshot

The spatial backend delivers ~700× runtime speedups vs. the pure-Python reference when integrating long trajectories. Benchmarked with benchmarks/spatial/step_scaling_benchmark.py (dt=0.02, repeats=1).

Steps RatInABox Runtime canns-lib Runtime Speedup
10² 0.020 s <0.001 s 477×
10³ 0.190 s <0.001 s 713×
10⁴ 1.928 s 0.003 s 732×
10⁵ 19.481 s 0.027 s 718×
10⁶ 192.775 s 0.266 s 726×

Spatial Runtime Scaling

Spatial Speedup Scaling

Plots and CSV summaries are emitted to benchmarks/spatial/outputs/.

Highlights

  • Full parity with RatInABox API (Environment, Agent, trajectory import/export)
  • Polygon & hole support with adaptive projection and wall vectors
  • Parity comparison tools in example/trajectory_comparison.py
  • Visualization utilities: drop-in replacements for RatInABox's plotting helpers (trajectory, heatmaps, histograms)
  • Benchmark scripts for long-step drift and speedup under benchmarks/spatial/

Visualization Helpers

from canns_lib import spatial

env = spatial.Environment(dimensionality="2D", boundary_conditions="solid")
agent = spatial.Agent(env, rng_seed=2025)

for _ in range(2_000):
    agent.update(dt=0.02)

# Trajectory with RatInABox-style colour fading and agent marker
agent.plot_trajectory(color="changing", colorbar=True)

# Other helpers mirror RatInABox naming
agent.plot_position_heatmap()
agent.plot_histogram_of_speeds()
agent.plot_histogram_of_rotational_velocities()

See example/spatial_plotting_demo.py for a full script that produces the trajectory, heatmap, and histogram figures showcased above.

Drift Velocity Control

Guide agent movement toward target directions while maintaining natural stochastic motion (matches RatInABox API):

# Basic drift usage
agent.update(
    dt=0.02,
    drift_velocity=[0.05, 0.02],  # Target velocity vector
    drift_to_random_strength_ratio=5.0  # Drift strength relative to random motion
)

Parameters:

  • drift_velocity: Target velocity vector (must match environment dimensionality)
  • drift_to_random_strength_ratio: Controls balance between drift and randomness
    • 0.0 = pure random motion (no drift)
    • 1.0 = equal weighting (default)
    • > 1.0 = stronger drift toward target

Use cases: Goal-directed navigation, reinforcement learning, biased exploration.

See example/drift_velocity_demo.py for detailed examples with visualizations.

🚀 Coming Soon

  • Dynamics: High-performance dynamics computation for neural networks
  • And more...

Installation

pip install canns-lib

From Source

git clone https://github.com/Routhleck/canns-lib.git
cd canns-lib
pip install maturin
maturin develop --release

Quick Start

Using the Ripser Module

import numpy as np
from canns_lib.ripser import ripser

# Generate sample data
data = np.random.rand(100, 3)

# Compute persistence diagrams
result = ripser(data, maxdim=2)
diagrams = result['dgms']

print(f"H0: {len(diagrams[0])} features")
print(f"H1: {len(diagrams[1])} features")
print(f"H2: {len(diagrams[2])} features")

Advanced Options

# High-performance computation with progress tracking
result = ripser(
    data,
    maxdim=2,
    thresh=1.0,                    # Distance threshold
    coeff=2,                       # Coefficient field Z/2Z
    do_cocycles=True,              # Compute representative cycles
    verbose=True,                  # Detailed output
    progress_bar=True,             # Show progress
    progress_update_interval=1.0   # Update every second
)

# Access results
diagrams = result['dgms']          # Persistence diagrams
cocycles = result['cocycles']      # Representative cocycles
num_edges = result['num_edges']    # Number of edges in complex

Sparse Matrix Support

from scipy import sparse

# Create sparse distance matrix
row = [0, 1, 2]
col = [1, 2, 0]
data = [1.0, 1.5, 2.0]
sparse_dm = sparse.coo_matrix((data, (row, col)), shape=(3, 3))

# Compute with sparse matrix (automatically detected)
result = ripser(sparse_dm, distance_matrix=True, maxdim=1)

Compatibility

The ripser module maintains 100% API compatibility with ripser.py:

# These work identically
import ripser as original_ripser
from canns_lib.ripser import ripser

result1 = original_ripser.ripser(data, maxdim=2)
result2 = ripser(data, maxdim=2)

# Results are numerically identical
assert np.allclose(result1['dgms'][0], result2['dgms'][0])

Development

Building from Source

# Prerequisites
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
pip install maturin

# Build and install
git clone https://github.com/Routhleck/canns-lib.git
cd canns-lib
maturin develop --release --features parallel

# Run tests
python -m pytest tests/ -v

Optional build features

All of these are off by default, so the released wheel and pip install -e . are unchanged unless you ask for them.

Feature What it does How to turn it on
parallel Rayon-parallel reduction and assembly. On by default. --features parallel
hugepage MADV_HUGEPAGE on allocations of 2 MB or more. Linux only, and it is what maturin enables for the release wheels: the pivot map at dim=2 is a single ~13 GB allocation whose insert cost is dominated by page faults and TLB misses rather than by hashing. Worth about 1.24x end to end on a real 1200x1200 ASA workload. --features hugepage
gpu An opt-in GPU apparent-pair pre-pass. The kernels in kernel/ are compiled by nvcc when a CUDA toolkit is present and fall back to NVRTC, or to the CPU, when it is not -- so the build never requires a toolkit. On an A100 the pre-pass over 2.9e8 columns takes 0.093 s on the GPU against 12.0-15.5 s on the CPU. --features gpu
binary-heap Restores std::collections::BinaryHeap as the reduction's working column heap, instead of the hand-rolled CoboundaryHeap (a classic top-down sift-down with an early exit, which is what ripser++'s std::priority_queue does). The two are pinned to the same pop order by a unit test. --features binary-heap
legacy-auto-sparse Restores the pre-2026-10-20 auto-sparse condition, in which the sparse distance matrix was used whenever the threshold was below the maximum finite distance, without requiring the matrix to actually contain a missing pair. This one exists for the ablation table and is not a supported configuration: the unit tests pin the fixed behaviour and fail with this feature on. --features legacy-auto-sparse

mimalloc (opt-in, and off by default because mimalloc 0.1.43 segfaults on macOS Darwin 26) and the timing/counter probes (apparent-stats, gpu-phase-stats, walk-probe) are documented in Cargo.toml, where each one says what it measures and what it costs.

The published wheels are CPU-only

The gpu feature is not in the release build. [tool.maturin] sets features = ["parallel", "hugepage", "extension-module"], so a wheel installed from PyPI contains no CUDA code at all: the apparent-pair pre-pass runs on the CPU, and the barcode is identical either way. The GPU pre-pass is an opt-in build, not a download.

To get it, build the extension yourself:

# keep `extension-module` in the list: it is what makes PyO3 produce a
# cdylib for Python instead of a binary linked against libpython
maturin develop --release --features parallel,hugepage,extension-module,gpu

A CUDA toolkit is not required to build it. build.rs compiles kernel/ripser_kernels.cu with nvcc into a cubin and embeds it when a toolkit is on PATH; without one the build still succeeds and the driver JIT-compiles the same kernel file through NVRTC at run time. If there is no usable device, or the driver refuses the kernel, the run falls back to the CPU pre-pass — the library never requires a GPU to be correct, and the barcode does not change.

To see which path a run actually took, set CANNS_RIPSER_STATS=1 and read the gpu_err field of the STATS line on stderr: empty means the GPU pre-pass ran, and anything else is the reason it did not. A silent CPU fallback is otherwise indistinguishable from "the GPU was never tried".

CANNS_RIPSER_STATS=1 python -c "
from canns_lib.ripser import ripser
ripser(data, maxdim=2)
" 2>&1 | grep -o 'gpu_err=\"[^\"]*\"'

The library uses device 0. CUDA_VISIBLE_DEVICES remaps which physical device that is, which is what you want on a host where another job holds the other device:

CUDA_VISIBLE_DEVICES=1 python -c "from canns_lib.ripser import ripser; ..."

The benchmark harness in benchmarks/ripser/ has the same knob under the name CANNS_BENCH_GPU (it sets CUDA_VISIBLE_DEVICES for the child process), and it records the device in every row of every table it writes.

Running Benchmarks

cd benchmarks
python compare_ripser.py --n-points 100 --maxdim 2 --trials 5

benchmarks/ripser/ also carries the head-to-head harness against ripser++, the standard-suite runner, the scale scan and the load characterisation of the grid-cell corpus. Each table is produced by a runner, and every row records the number of cores used by processes that are not ours while that row was measured, so a table measured on a busy host can be told apart from one that was not. The tables themselves are not in the repository -- the grid-cell corpus they draw on has an unsettled licence -- and they are kept in the experiment record next to the analysis that turns them into numbers.

Technical Details

Ripser Module Architecture

  • Dual API paths: High-performance versions and full-featured versions with progress tracking
  • Memory optimization: Structure-of-Arrays layout, intelligent buffer reuse
  • Sparse matrix support: Efficient handling via neighbor intersection algorithms
  • Progress tracking: Built-in progress bars using tqdm when available
  • Parallel processing: Multi-threading with Rayon

Algorithmic Optimizations

  • Dense edge enumeration: O(n²) row-by-row generation vs O(n³) vertex decoding
  • Sparse queries: O(log k) binary search vs O(k) linear scan
  • Cache-friendly data structures: SoA matrix layout, k-major binomial tables
  • Packed simplex entries: (index, coefficient) packed into one 64-bit word, halving DiameterEntryT size from 24 → 16 bytes

License

Licensed under the Apache License, Version 2.0. See LICENSE for details.

Citation

If you use canns-lib in your research, please cite the toolkit paper (which describes both canns and canns-lib):

@misc{he2026canns,
  title        = {CANNs: A Toolkit for Research on Continuous Attractor Neural Networks},
  author       = {He, Sichao and
                  Tuerhong, Aiersi and
                  She, Shangjun and
                  Chu, Tianhao and
                  Wu, Yuling and
                  Zuo, Junfeng and
                  Wu, Si},
  year         = 2026,
  eprint       = {2606.27783},
  archivePrefix = {arXiv},
  primaryClass  = {q-bio.NC},
  doi          = {10.48550/arXiv.2606.27783},
  url          = {https://arxiv.org/abs/2606.27783}
}

Plain text:

He, S., Tuerhong, A., She, S., Chu, T., Wu, Y., Zuo, J., & Wu, S. (2026). CANNs: A Toolkit for Research on Continuous Attractor Neural Networks. arXiv:2606.27783. https://arxiv.org/abs/2606.27783

If you want to cite this Rust backend specifically, you can additionally reference the Zenodo archive:

@software{canns_lib,
  title={canns-lib: High-Performance Computational Acceleration Library for CANNS},
  author={He, Sichao},
  url={https://github.com/Routhleck/canns-lib},
  year={2025}
}

Acknowledgments

Ripser Module

  • Ulrich Bauer: Original Ripser algorithm and C++ implementation
  • Christopher Tralie & Nathaniel Saul: ripser.py Python implementation
  • Rust community: Amazing ecosystem of high-performance libraries
  • Ripser: Original C++ implementation
  • ripser.py: Python bindings for Ripser
  • CANNS: Continuous Attractor Neural Networks
  • scikit-tda: Topological Data Analysis in Python

Metadata

Release files for canns-lib 0.12.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for canns-lib 0.12.0
File Size Uploaded Provenance Actions
canns_lib-0.12.0.tar.gz 518.7 kB Without provenance Details for canns_lib-0.12.0.tar.gz

Built distributions (wheels)

Table of built distributions (wheels) for canns-lib 0.12.0
File Actions
canns_lib-0.12.0-cp314-cp314-win_amd64.whl CPython 3.14 CPython 3.14 Windows x86-64 Details for canns_lib-0.12.0-cp314-cp314-win_amd64.whl
canns_lib-0.12.0-cp314-cp314-musllinux_1_2_x86_64.whl CPython 3.14 CPython 3.14 Linux musl 1.2+ x86-64 Details for canns_lib-0.12.0-cp314-cp314-musllinux_1_2_x86_64.whl
canns_lib-0.12.0-cp314-cp314-musllinux_1_2_aarch64.whl CPython 3.14 CPython 3.14 Linux musl 1.2+ ARM64 Details for canns_lib-0.12.0-cp314-cp314-musllinux_1_2_aarch64.whl
canns_lib-0.12.0-cp314-cp314-manylinux_2_28_x86_64.whl CPython 3.14 CPython 3.14 Linux glibc 2.28+ x86-64 Details for canns_lib-0.12.0-cp314-cp314-manylinux_2_28_x86_64.whl
canns_lib-0.12.0-cp314-cp314-manylinux_2_28_aarch64.whl CPython 3.14 CPython 3.14 Linux glibc 2.28+ ARM64 Details for canns_lib-0.12.0-cp314-cp314-manylinux_2_28_aarch64.whl
canns_lib-0.12.0-cp314-cp314-macosx_11_0_arm64.whl CPython 3.14 CPython 3.14 macOS 11.0+ ARM64 Details for canns_lib-0.12.0-cp314-cp314-macosx_11_0_arm64.whl
canns_lib-0.12.0-cp314-cp314-macosx_10_15_x86_64.whl CPython 3.14 CPython 3.14 macOS 10.15+ x86-64 Details for canns_lib-0.12.0-cp314-cp314-macosx_10_15_x86_64.whl
canns_lib-0.12.0-cp313-cp313-win_amd64.whl CPython 3.13 CPython 3.13 Windows x86-64 Details for canns_lib-0.12.0-cp313-cp313-win_amd64.whl
canns_lib-0.12.0-cp313-cp313-musllinux_1_2_x86_64.whl CPython 3.13 CPython 3.13 Linux musl 1.2+ x86-64 Details for canns_lib-0.12.0-cp313-cp313-musllinux_1_2_x86_64.whl
canns_lib-0.12.0-cp313-cp313-musllinux_1_2_aarch64.whl CPython 3.13 CPython 3.13 Linux musl 1.2+ ARM64 Details for canns_lib-0.12.0-cp313-cp313-musllinux_1_2_aarch64.whl
canns_lib-0.12.0-cp313-cp313-manylinux_2_28_x86_64.whl CPython 3.13 CPython 3.13 Linux glibc 2.28+ x86-64 Details for canns_lib-0.12.0-cp313-cp313-manylinux_2_28_x86_64.whl
canns_lib-0.12.0-cp313-cp313-manylinux_2_28_aarch64.whl CPython 3.13 CPython 3.13 Linux glibc 2.28+ ARM64 Details for canns_lib-0.12.0-cp313-cp313-manylinux_2_28_aarch64.whl
canns_lib-0.12.0-cp313-cp313-macosx_11_0_arm64.whl CPython 3.13 CPython 3.13 macOS 11.0+ ARM64 Details for canns_lib-0.12.0-cp313-cp313-macosx_11_0_arm64.whl
canns_lib-0.12.0-cp313-cp313-macosx_10_13_x86_64.whl CPython 3.13 CPython 3.13 macOS 10.13+ x86-64 Details for canns_lib-0.12.0-cp313-cp313-macosx_10_13_x86_64.whl
canns_lib-0.12.0-cp312-cp312-win_amd64.whl CPython 3.12 CPython 3.12 Windows x86-64 Details for canns_lib-0.12.0-cp312-cp312-win_amd64.whl
canns_lib-0.12.0-cp312-cp312-musllinux_1_2_x86_64.whl CPython 3.12 CPython 3.12 Linux musl 1.2+ x86-64 Details for canns_lib-0.12.0-cp312-cp312-musllinux_1_2_x86_64.whl
canns_lib-0.12.0-cp312-cp312-musllinux_1_2_aarch64.whl CPython 3.12 CPython 3.12 Linux musl 1.2+ ARM64 Details for canns_lib-0.12.0-cp312-cp312-musllinux_1_2_aarch64.whl
canns_lib-0.12.0-cp312-cp312-manylinux_2_28_x86_64.whl CPython 3.12 CPython 3.12 Linux glibc 2.28+ x86-64 Details for canns_lib-0.12.0-cp312-cp312-manylinux_2_28_x86_64.whl
canns_lib-0.12.0-cp312-cp312-manylinux_2_28_aarch64.whl CPython 3.12 CPython 3.12 Linux glibc 2.28+ ARM64 Details for canns_lib-0.12.0-cp312-cp312-manylinux_2_28_aarch64.whl
canns_lib-0.12.0-cp312-cp312-macosx_11_0_arm64.whl CPython 3.12 CPython 3.12 macOS 11.0+ ARM64 Details for canns_lib-0.12.0-cp312-cp312-macosx_11_0_arm64.whl
canns_lib-0.12.0-cp312-cp312-macosx_10_13_x86_64.whl CPython 3.12 CPython 3.12 macOS 10.13+ x86-64 Details for canns_lib-0.12.0-cp312-cp312-macosx_10_13_x86_64.whl
canns_lib-0.12.0-cp311-cp311-win_amd64.whl CPython 3.11 CPython 3.11 Windows x86-64 Details for canns_lib-0.12.0-cp311-cp311-win_amd64.whl
canns_lib-0.12.0-cp311-cp311-musllinux_1_2_x86_64.whl CPython 3.11 CPython 3.11 Linux musl 1.2+ x86-64 Details for canns_lib-0.12.0-cp311-cp311-musllinux_1_2_x86_64.whl
canns_lib-0.12.0-cp311-cp311-musllinux_1_2_aarch64.whl CPython 3.11 CPython 3.11 Linux musl 1.2+ ARM64 Details for canns_lib-0.12.0-cp311-cp311-musllinux_1_2_aarch64.whl
canns_lib-0.12.0-cp311-cp311-manylinux_2_28_x86_64.whl CPython 3.11 CPython 3.11 Linux glibc 2.28+ x86-64 Details for canns_lib-0.12.0-cp311-cp311-manylinux_2_28_x86_64.whl
canns_lib-0.12.0-cp311-cp311-manylinux_2_28_aarch64.whl CPython 3.11 CPython 3.11 Linux glibc 2.28+ ARM64 Details for canns_lib-0.12.0-cp311-cp311-manylinux_2_28_aarch64.whl
canns_lib-0.12.0-cp311-cp311-macosx_11_0_arm64.whl CPython 3.11 CPython 3.11 macOS 11.0+ ARM64 Details for canns_lib-0.12.0-cp311-cp311-macosx_11_0_arm64.whl
canns_lib-0.12.0-cp311-cp311-macosx_10_12_x86_64.whl CPython 3.11 CPython 3.11 macOS 10.12+ x86-64 Details for canns_lib-0.12.0-cp311-cp311-macosx_10_12_x86_64.whl

Total release size: 14.4 MB

Release files / canns_lib-0.12.0.tar.gz

Download URL canns_lib-0.12.0.tar.gz
Size 518.7 kB
Tags Source
SHA-256 checksum
How to use checksums
0a07df0b4a7da75d98950fe03e2695508a537c4abb7fedd420ac056c394c4457
BLAKE2b-256 checksum
How to use checksums
5ac52b91dbf292dc8c852ab64e727d1c79afa7c5afa8ed89fe4e0166f377efd1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / canns_lib-0.12.0-cp314-cp314-win_amd64.whl

Download URL canns_lib-0.12.0-cp314-cp314-win_amd64.whl
Size 415.7 kB
Tags CPython 3.14 Windows x86-64
SHA-256 checksum
How to use checksums
2c712c429f36917ea10e0ae646b1270b3109fb71f9257becd4b665b251f2559e
BLAKE2b-256 checksum
How to use checksums
11e2553b5651a125f405183ea9e4bc1f20e1fd1c28842a2fc8edf4db06671517
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / canns_lib-0.12.0-cp314-cp314-musllinux_1_2_x86_64.whl

Download URL canns_lib-0.12.0-cp314-cp314-musllinux_1_2_x86_64.whl
Size 603.6 kB
Tags CPython 3.14 Linux musl 1.2+ x86-64
SHA-256 checksum
How to use checksums
334ec90af7fbfbd1e66a4c8e7aa3ebfedfc9e69d9bd2c7e3fb058d3567679242
BLAKE2b-256 checksum
How to use checksums
bf976334926cb0f80582ba0c2695388d2f857de173e7e99e11aabb5f80ce7696
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / canns_lib-0.12.0-cp314-cp314-musllinux_1_2_aarch64.whl

Download URL canns_lib-0.12.0-cp314-cp314-musllinux_1_2_aarch64.whl
Size 536.6 kB
Tags CPython 3.14 Linux musl 1.2+ ARM64
SHA-256 checksum
How to use checksums
fb6833740323bcd7abdd8132699f8bf14086029d75381b43d2ae2a98acbe7754
BLAKE2b-256 checksum
How to use checksums
b994aa7c3b8f52069f8b22a86530bcfea026aac5a067b515c76ef37b0ce6ae2a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / canns_lib-0.12.0-cp314-cp314-manylinux_2_28_x86_64.whl

Download URL canns_lib-0.12.0-cp314-cp314-manylinux_2_28_x86_64.whl
Size 522.1 kB
Tags CPython 3.14 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
19003301bf1f1a6ad2f46505f65ba6b3d50ed7956a9c7ce74d4fe8347bc09527
BLAKE2b-256 checksum
How to use checksums
46dd98f3c6aeb0351b81dae772128c42eb2aec5f763fdf50f453f8689fe93bba
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / canns_lib-0.12.0-cp314-cp314-manylinux_2_28_aarch64.whl

Download URL canns_lib-0.12.0-cp314-cp314-manylinux_2_28_aarch64.whl
Size 470.6 kB
Tags CPython 3.14 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
f6fde019f36c79b87a729d6606c102ac6d37ca53219517a12b32fd6fa5ede284
BLAKE2b-256 checksum
How to use checksums
dd1cda4d13215b9f056ec077f7b51aa10e179ddf5f44f4e17aa66c151ed1f0a5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / canns_lib-0.12.0-cp314-cp314-macosx_11_0_arm64.whl

Download URL canns_lib-0.12.0-cp314-cp314-macosx_11_0_arm64.whl
Size 427.9 kB
Tags CPython 3.14 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
440cad9a236a42e5dea687038d25eb10a590f5e885ac35c042e3079f475657a4
BLAKE2b-256 checksum
How to use checksums
fe0d9dd3e79d19d7e134686f4c918c917a87b1588375c7776d228ebbf3872a01
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / canns_lib-0.12.0-cp314-cp314-macosx_10_15_x86_64.whl

Download URL canns_lib-0.12.0-cp314-cp314-macosx_10_15_x86_64.whl
Size 484.9 kB
Tags CPython 3.14 macOS 10.15+ x86-64
SHA-256 checksum
How to use checksums
79d4d2ab40b9266f1324afa1cf44708b35a495b91c60fe975ef9a5c93ec7a636
BLAKE2b-256 checksum
How to use checksums
38767fec929fd8c5508c60c029d2c4f3a8b108f36cdca5fba33a420d5b2b0543
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / canns_lib-0.12.0-cp313-cp313-win_amd64.whl

Download URL canns_lib-0.12.0-cp313-cp313-win_amd64.whl
Size 416.8 kB
Tags CPython 3.13 Windows x86-64
SHA-256 checksum
How to use checksums
8539f7eb8dff4bc9dbada73465b9d75441c7c0918b4631e7447df17d5779e048
BLAKE2b-256 checksum
How to use checksums
4038a6a7a828de39577a0abc86eb21664f8797c1b8570cf8d1311ff3aca5e39d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / canns_lib-0.12.0-cp313-cp313-musllinux_1_2_x86_64.whl

Download URL canns_lib-0.12.0-cp313-cp313-musllinux_1_2_x86_64.whl
Size 603.7 kB
Tags CPython 3.13 Linux musl 1.2+ x86-64
SHA-256 checksum
How to use checksums
3cdf7218773cc2f85f7d021f037bda5af6032fbe24841036ba30a87536f1ec0b
BLAKE2b-256 checksum
How to use checksums
c189b55e1fea2f2e5b781ac4037073b42b677e1023346b74cf892278f7ea904e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / canns_lib-0.12.0-cp313-cp313-musllinux_1_2_aarch64.whl

Download URL canns_lib-0.12.0-cp313-cp313-musllinux_1_2_aarch64.whl
Size 537.0 kB
Tags CPython 3.13 Linux musl 1.2+ ARM64
SHA-256 checksum
How to use checksums
11ce38ee78b793bda517c12eb089b485524b028cb39270eaec0629071547c090
BLAKE2b-256 checksum
How to use checksums
765f3de95928158bcf0350912fba2221aeab8b270711d66a7dbe69cdb881ad33
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / canns_lib-0.12.0-cp313-cp313-manylinux_2_28_x86_64.whl

Download URL canns_lib-0.12.0-cp313-cp313-manylinux_2_28_x86_64.whl
Size 522.1 kB
Tags CPython 3.13 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
85809427858757b380f25e509c23adca59d086487abe34f874c348022206377c
BLAKE2b-256 checksum
How to use checksums
0f2672787061a35532d6c00db9e8e80ed3a9d9400ef17e285decb5eb70f12f21
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / canns_lib-0.12.0-cp313-cp313-manylinux_2_28_aarch64.whl

Download URL canns_lib-0.12.0-cp313-cp313-manylinux_2_28_aarch64.whl
Size 471.1 kB
Tags CPython 3.13 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
c996121b195ddfc9bba6707dfc0661e3fa4b0d8bc9adba9c954bcacb8168db0d
BLAKE2b-256 checksum
How to use checksums
0f56c44c4bebc2d97fd62239b30dc0a079c289a454388e85b0bd5949140cae93
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / canns_lib-0.12.0-cp313-cp313-macosx_11_0_arm64.whl

Download URL canns_lib-0.12.0-cp313-cp313-macosx_11_0_arm64.whl
Size 427.6 kB
Tags CPython 3.13 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
b7daa664e254addcba448b7015b95482ff22d3ad77f264ce526ed75ca0637d4c
BLAKE2b-256 checksum
How to use checksums
605ad7f741a60244fdadc2f5fc4d8187beb2f50feaaffe141145c3b6a197f8df
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / canns_lib-0.12.0-cp313-cp313-macosx_10_13_x86_64.whl

Download URL canns_lib-0.12.0-cp313-cp313-macosx_10_13_x86_64.whl
Size 485.0 kB
Tags CPython 3.13 macOS 10.13+ x86-64
SHA-256 checksum
How to use checksums
042469de965a86f8d742ae16a6a0d3ca8ee706a22516629859ec8130e98a3e43
BLAKE2b-256 checksum
How to use checksums
6619b6d7d39d91e6b328d92527229aee3bc63885517ae1214ff8e218ea4231c5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / canns_lib-0.12.0-cp312-cp312-win_amd64.whl

Download URL canns_lib-0.12.0-cp312-cp312-win_amd64.whl
Size 416.2 kB
Tags CPython 3.12 Windows x86-64
SHA-256 checksum
How to use checksums
4f90a0ace686eb6b877e2927b275635972473a9124e4d7f1df164390579c5bbf
BLAKE2b-256 checksum
How to use checksums
d1604914a927149e80a1a8fb1b55d0708612b087028616d9b4a631d12e34cf7a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / canns_lib-0.12.0-cp312-cp312-musllinux_1_2_x86_64.whl

Download URL canns_lib-0.12.0-cp312-cp312-musllinux_1_2_x86_64.whl
Size 603.1 kB
Tags CPython 3.12 Linux musl 1.2+ x86-64
SHA-256 checksum
How to use checksums
f7b2ec12963b3fc8d46bf29a02c53e3c429d5d995f43c1935b16ef14e269d4cd
BLAKE2b-256 checksum
How to use checksums
e5cf9f37b3d0b8d2cf2fb970018cb0435fae3a9da0147f2bf9cbb05999acefb2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / canns_lib-0.12.0-cp312-cp312-musllinux_1_2_aarch64.whl

Download URL canns_lib-0.12.0-cp312-cp312-musllinux_1_2_aarch64.whl
Size 539.6 kB
Tags CPython 3.12 Linux musl 1.2+ ARM64
SHA-256 checksum
How to use checksums
cd00092d823f1461a858fc928197fb3e19f0ab1f7a32b66d046d05f897616676
BLAKE2b-256 checksum
How to use checksums
39518108c9c1df4cb6b8f5088773eda0b50c791fcfe988d076e83e07c5d0b04a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / canns_lib-0.12.0-cp312-cp312-manylinux_2_28_x86_64.whl

Download URL canns_lib-0.12.0-cp312-cp312-manylinux_2_28_x86_64.whl
Size 521.6 kB
Tags CPython 3.12 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
bf18dc361504a31997777a8dfd0a1cd2de74b25dbed7e646d6f5ea380ef6e1ac
BLAKE2b-256 checksum
How to use checksums
0df6242a4bbd2e8c92be7c5e83b0c4a342fec9dfb74b1f18e3ef34b3292b0e12
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / canns_lib-0.12.0-cp312-cp312-manylinux_2_28_aarch64.whl

Download URL canns_lib-0.12.0-cp312-cp312-manylinux_2_28_aarch64.whl
Size 473.6 kB
Tags CPython 3.12 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
b413bb6a47dcc11bf0cd2fdbb2241c2ae428e8d278c5f8ddc7c9ea16d7a7acf9
BLAKE2b-256 checksum
How to use checksums
e65420b00f09ab2e8adc864a4794c19a4de85b11b1ebbc53c096db889b1c2a9f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / canns_lib-0.12.0-cp312-cp312-macosx_11_0_arm64.whl

Download URL canns_lib-0.12.0-cp312-cp312-macosx_11_0_arm64.whl
Size 427.5 kB
Tags CPython 3.12 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
d9bbeb01d89a6b50d52be92d0190ad2285b0d2fbf3c4296c53373ffae96cb2d7
BLAKE2b-256 checksum
How to use checksums
6ef02cb222605feced81e54a4d21390f631dc2a366f08a135740e19d9106a821
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / canns_lib-0.12.0-cp312-cp312-macosx_10_13_x86_64.whl

Download URL canns_lib-0.12.0-cp312-cp312-macosx_10_13_x86_64.whl
Size 485.1 kB
Tags CPython 3.12 macOS 10.13+ x86-64
SHA-256 checksum
How to use checksums
7ec537d9674a2444fbd24c582e70e5f261adc942fe90d79ff518772be7968a93
BLAKE2b-256 checksum
How to use checksums
ff8de161f9386c7837dcb34b50835a1d26197b8c02feb8ec71bb5ccd529211f1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / canns_lib-0.12.0-cp311-cp311-win_amd64.whl

Download URL canns_lib-0.12.0-cp311-cp311-win_amd64.whl
Size 415.8 kB
Tags CPython 3.11 Windows x86-64
SHA-256 checksum
How to use checksums
62364363e833044def3e1781f8e6a2c6685f465708a470a4fb70f08e4da1f623
BLAKE2b-256 checksum
How to use checksums
eed12e74e5b358dc2751da770a98d9068c0f08fc3a9cdf7d67cb84741141fdb3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / canns_lib-0.12.0-cp311-cp311-musllinux_1_2_x86_64.whl

Download URL canns_lib-0.12.0-cp311-cp311-musllinux_1_2_x86_64.whl
Size 603.6 kB
Tags CPython 3.11 Linux musl 1.2+ x86-64
SHA-256 checksum
How to use checksums
ab119159d7016b40771d62903952762610b1e7549208b32abadf815f6b73ca41
BLAKE2b-256 checksum
How to use checksums
0fa1f3c5cbfa602289d7624a58d53af67c47dda318473a1868d2f4f777d147d7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / canns_lib-0.12.0-cp311-cp311-musllinux_1_2_aarch64.whl

Download URL canns_lib-0.12.0-cp311-cp311-musllinux_1_2_aarch64.whl
Size 537.3 kB
Tags CPython 3.11 Linux musl 1.2+ ARM64
SHA-256 checksum
How to use checksums
1b8b3537b0e965e9212278baf03fe9419b82659026f9bfabc3bc197b04b9594a
BLAKE2b-256 checksum
How to use checksums
b918651ad6e68c5db77c49374e1cbf4feb5b00b4de61f221d8269b3d97a6dab2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / canns_lib-0.12.0-cp311-cp311-manylinux_2_28_x86_64.whl

Download URL canns_lib-0.12.0-cp311-cp311-manylinux_2_28_x86_64.whl
Size 522.1 kB
Tags CPython 3.11 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
6b5c1353ee79eca0807bf34c6bd61ac27255c169270b84108c4df5838e5189ed
BLAKE2b-256 checksum
How to use checksums
c810601051c169c5fdd0762dfa3efd38034d719f3ea044c462625222f1eb3477
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / canns_lib-0.12.0-cp311-cp311-manylinux_2_28_aarch64.whl

Download URL canns_lib-0.12.0-cp311-cp311-manylinux_2_28_aarch64.whl
Size 471.0 kB
Tags CPython 3.11 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
076c57579de5c75353020a8e2a80d6104d9e599e9e4691cb05c5472b6771ab42
BLAKE2b-256 checksum
How to use checksums
4e267963636a553b9a6bccda427cc0030daa0dd51dc67f1386f3599fd1831ecc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / canns_lib-0.12.0-cp311-cp311-macosx_11_0_arm64.whl

Download URL canns_lib-0.12.0-cp311-cp311-macosx_11_0_arm64.whl
Size 430.3 kB
Tags CPython 3.11 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
e5df0f9c06e7ddf0a900cc30a757af9710250e076e990a18e40b2569e36f62df
BLAKE2b-256 checksum
How to use checksums
50319db3717958ef11ccc881b0fb7c0ac241d294d6ec7c09f0c0f691b95bccfa
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / canns_lib-0.12.0-cp311-cp311-macosx_10_12_x86_64.whl

Download URL canns_lib-0.12.0-cp311-cp311-macosx_10_12_x86_64.whl
Size 488.6 kB
Tags CPython 3.11 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
a9ff7ae863ea0c4e95f605d9fab6c034d7de14d806b8b82a0c65717066fdef9a
BLAKE2b-256 checksum
How to use checksums
c90dac3384e1844bf3887c99b376ee1ba8a8aee34be0b02ac8e4300fbda7f2a9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Security for canns-lib 0.12.0

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.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page