Skip to main content

snn_opt

A spiking neural network solver for constrained convex optimization.

License: Apache 2.0 Python 3.9+ Version Cite Docs


Abstract

snn_opt is a Python implementation of the spiking neural network (SNN) → convex optimization equivalence, developed as part of an ongoing research program on neuromorphic computation for classical machine-learning problems. It solves quadratic and linear programs of the form

$$ \min_{x \in \mathbb{R}^n}\ \tfrac{1}{2}, x^\top A x + b^\top x \quad\text{subject to}\quad C x + d \le 0, $$

by alternating gradient descent, which plays the role of leaky-integrate membrane drift, with discrete projection events that clamp the trajectory to the constraint boundary, the optimization analogue of an integrate-and-fire spike. The construction follows Mancoo, Boerlin and Machens (NeurIPS 2020) and is the canonical solver underlying the SNN-X research program, a series of classical machine-learning problems recast as constrained convex programs and solved by these dynamics (see Applications).

This repository is intended both as a research artifact, since every published SNN-X paper can be reproduced from the code here, and as a teaching resource for students entering the area: it ships with annotated examples, a self-contained mathematical writeup, and a benchmark suite that visualizes convergence, projection dynamics, and the solver's accuracy limits.

The problem

Given a positive semi-definite Hessian $A \in \mathbb{R}^{n\times n}$, a linear cost $b \in \mathbb{R}^n$, and $m$ linear inequality constraints stacked into $C \in \mathbb{R}^{m \times n}$ and $d \in \mathbb{R}^m$, we seek

$$ x^\star ;=; \arg\min_{x}\ \tfrac{1}{2}, x^\top A x + b^\top x \quad\text{s.t.}\quad c_i^\top x + d_i \le 0,\ i = 1,\dots,m. $$

The class subsumes box-constrained QPs (set $C = [I; -I]$), linear programs ($A = 0$), kernel-ridge subproblems, support-vector machine duals, projected-gradient flows on polytopes, and the bulk of the inner solves that arise in receding-horizon control.

The spiking idea, in one picture

The continuous-time dynamics

$$ \dot x ;=; -\nabla f(x) ;-; C^\top s(t) $$

models a population of $n$ leaky integrators driven by the gradient $\nabla f(x) = Ax + b$, with a corrective spike train $s(t)$ that fires whenever an inequality $c_i^\top x + d_i$ would otherwise become positive. Each spike applies a minimal projection that re-enters the feasible set; spike inter-arrival times encode constraint traffic. Discretized with forward Euler and an adaptive step that reaches the boundary exactly, this becomes a fast projected-gradient solver with diagnostics that double as a neural raster plot.

See docs/theory.md for the full derivation, including the eigenvalue-based step-size choice that eliminates k0 as a hyperparameter and the treatment of bound constraints as implicit facets of the same projection sweep.

Convergence and projection dynamics

Four diagnostic figures, regenerated from benchmarks/ with python benchmarks/run_all.py, give a quick visual sense of what the solver actually does. Every objective gap below is measured against an exact optimum computed by the active-set KKT solve in benchmarks/qpref.py, never against a long run of snn_opt itself; scoring the solver against its own fixed point cannot reveal a standing offset between that fixed point and the true minimiser, and on these problems there is one.

Convergence on a random 50-D QP with 30 inequalities (7 active at the optimum). The gap descends geometrically for about 1800 iterations, then the iterate settles into a period-2 limit cycle: it alternates between two points whose gaps are 3.0e-4 and 6.7e-4, which is why the two branches in panel (a) are drawn separately and why panel (b) flatlines rather than decaying. The run is jointly feasible throughout (max row distance 8.2e-7) and reports converged=False at the 4000-iteration cap: the scale-invariant KKT certificate (v0.6.0) measures the limit cycle's relative optimality defect at 8.9e-4, above the default kkt_rel_tol = 1e-4, and the value is a true floor (unchanged at 40k iterations). Loosen kkt_rel_tol, or shrink the floor itself with k0_scale, to certify on this problem. See Accuracy and tuning for where the floor comes from.

convergence

Projection-spike raster on an 8-D QP over a 16-facet polytope whose unconstrained minimiser sits well outside the feasible set. Each marker is one projection event. The network visibly searches for the active set: row 11 fires a burst around t = 4..10 and then falls silent, while rows 5, 10 and 3 are recruited at t ~= 21, 23 and 41 and fire on every step thereafter. Those three persistent rows are exactly the active set of the true optimum. This is the practical payoff of the spiking view, and the literal sense in which the solver is spiking.

spike raster

Warm-start speedup on a sequence of 30 drifting QPs, a stylized MPC workload, measured under the v0.6.0 KKT stopping criterion. From the second problem onward, warm starting cuts a 221-iteration cold solve to 101 iterations, an essentially free 2.19x, and wall time falls in step (2.03x). Iterations are the headline because they are deterministic; the wall-time panel is the median of five timed runs per problem, since a single pass picks up scheduler noise indistinguishable from signal.

warm start

Accuracy against step size, at three iteration budgets. The spiking dynamics converge to a fixed point of the discretised flow, which is offset from the exact minimiser by an amount that shrinks with the gradient step k0. Smaller k0 also means more iterations are needed to arrive, so each budget has a knee, and the knee moves left as the budget grows. The shipped default (k0_scale = 0.5) sits to the right of every knee: on this problem it leaves a gap of 6.7e-4, while k0_scale = 0.02 reaches 1.2e-5 given 80k iterations.

accuracy tuning

A closer look: trajectory and raw-vs-optimized modes

Two figures generated by the example scripts give a more concrete sense of what the dynamics look like in 2-D, where everything is easy to visualize:

2-D trajectory and projection spikes

State evolution and 2-D trajectory for examples/example1_basic_2d.py, a constrained QP whose unconstrained minimum lies outside the feasible polytope. Left: per-component value over time, with the projection events shown as a rug along the bottom. The sawtooth in each trace is the integrate-and-fire dynamic itself: drift away from the boundary, spike back onto it, repeat. Right: the trajectory in state space over objective contours, gliding down the gradient, meeting the active facet and sliding along it to the constrained optimum. This example deliberately runs projection_method='fixed', which produces many small corrections rather than one exact jump, because that is what makes the spiking behaviour visible.

raw vs optimized solver mode

Output of examples/example_raw_mode.py, comparing a fixed gradient and projection step against the defaults (auto k0 from the Lipschitz constant, exact projection to the boundary). Both reach the optimum on a problem whose constraint is active at the solution: the optimized run gets within 1e-16 of the exact objective in roughly 25 iterations, while the raw run needs the full 300 to reach 1e-15.

Installation

snn_opt requires Python 3.9+, NumPy, and SciPy. The fastest path is PyPI:

pip install snn-opt                # core, prebuilt wheel (no compiler needed)
pip install "snn-opt[examples]"    # also installs matplotlib for examples
pip install "snn-opt[dev]"         # examples + cvxpy + pytest + ruff

The PyPI distribution name is snn-opt (hyphenated, lowercase, per PEP 503); the Python import name is snn_opt. So you pip install snn-opt and then import snn_opt.

For an editable install from a checkout (development workflow):

git clone https://github.com/ahkhan03/SNN_opt.git
cd SNN_opt
pip install -e .                   # core
pip install -e ".[examples]"       # also installs matplotlib for examples
pip install -e ".[dev]"            # examples + cvxpy + pytest + ruff

For a specific commit (reproducibility for papers/collaborators):

pip install "git+https://github.com/ahkhan03/SNN_opt.git@<commit-sha>"

The package can also be run without installation: every example and test sits next to a small sys.path bootstrap that points at src/. Smoke test:

python tests/test_installation.py

Compiled C++ backend

The PyPI wheels ship a precompiled C++ kernel (snn_opt._kernel) that accelerates the inner adaptive-projection loop by roughly an order of magnitude over the pure-Python path. Opt in via the backend keyword:

result = solve_qp(A, b, C, d, x0, backend='c')        # compiled kernel (auto)
result = solve_qp(A, b, C, d, x0, backend='python')   # reference (default)

The compiled kernel comes in three numerically identical variants that differ only in how the inner matrix–vector products are threaded:

backend matvec threading
'c' auto: OpenMP multicore when the wheel was built with it, else single-thread
'c_serial' forced single-thread (SIMD only)
'c_openmp' forced OpenMP multicore (raises if the wheel was built without OpenMP)

Only the matvec is data-parallel; the Euler recurrence and the greedy projection are inherently serial (an Amdahl ceiling of roughly 2–3× on a few cores). Because per-call thread fork/join only pays off on large systems, the multicore path is automatically skipped below a work threshold, so 'c' matches the serial path on small/medium problems and only spins up threads on large ones. Multithreading honours OMP_NUM_THREADS; snn_opt._kernel.HAS_OPENMP and snn_opt._kernel.max_threads() report the build's capability.

All backends are kept in lockstep by the parity test suite (tests/test_c_backend_parity.py). The C kernel supports dense problems with projection_method='adaptive'; sparse and non-adaptive paths transparently use Python. The same kernel source is HLS-compatible and is the basis for the FPGA deployment track. When the precompiled kernel is unavailable on your platform (rare), the 'c*' backends raise a clear error and the Python backend continues to work.

Problem transforms (eigenbasis)

Orthogonal to the backend, the transform axis rewrites the problem into an equivalent one that is cheaper to solve and maps the solution back. Transforms are an explicit opt-in (SolverConfig.transform); the canonical solver stays the default, and a transform composes with any backend.

from snn_opt import solve_qp
result = solve_qp(A, b, C, d, x0, ...)  # canonical (default)

from snn_opt import SNNSolver, SolverConfig, OptimizationProblem
cfg = SolverConfig(transform='eigenbasis', backend='c')
result = SNNSolver(OptimizationProblem(A, b, C, d), cfg).solve(x0)

EigenbasisTransform (transform='eigenbasis') rotates a symmetric-PSD Hessian into its eigenbasis (A = VΛVᵀ), collapsing the dominant O(n²) A @ x gradient step into an O(n) elementwise product; the projection is unchanged because the constraint Gram is rotation-invariant. The win grows with problem size.

Since v0.5.0 the transform does accept box bounds. Per-coordinate bounds are not rotation-invariant, so they cannot stay implicit: they are materialized as explicit rotated unit-norm rows, growing m by up to 2n. The O(1) implicit-facet advantage is deliberately surrendered under a transform, which is the trade to be aware of when combining the two. See docs/api.md.

What v0.5.0 changed

v0.5.0 is a structural correctness release, and the behaviour it fixes is worth understanding before relying on results from an earlier version.

Before v0.5.0, bound constraints were enforced by a terminal clip applied after the halfspace sweep, with nothing re-projecting behind it. Composing the two is not a projection onto their intersection (the classical POCS failure), so on a problem where a bound and an interacting row are simultaneously active, the solver could stall at a point feasible for neither and report an objective that undercuts the true optimum. Bounds are now implicit unit-normal facets inside one unified projection sweep, and the terminal clip is gone.

Three result fields expose feasibility, optimality diagnostics, and projection termination on any nontrivial problem:

result.joint_feasible            # feasibility of rows AND bounds together
result.kkt_residual              # scale-invariant KKT certificate (v0.6.0)
result.projection_budget_exhausted
  • joint_feasible is the honest feasibility flag. Pre-0.5 the convergence gate looked at rows only, so a box violation could not fail it.
  • kkt_residual is the scale-invariant KKT certificate at the final point (see the next section); with the default settings, converged=True means exactly that this certificate passed, together with feasibility and the plateau criterion, at three consecutive checkpoints. The older stationarity_residual diagnostic is retained for one compatibility release but mixes units and can depend on constraint row order; prefer kkt_residual.
  • projection_budget_exhausted reports that the sweep hit its watchdog. max_projection_iters is now a safety cap (default None, auto-sized), and hitting it aborts the solve rather than being reported as convergence.

projection_method='fixed' combined with bounds now raises, because the legacy fixed-step path cannot enforce bounds correctly without the clip that was removed.

Scale-invariant convergence certification (v0.6.0)

Before v0.6.0, converged required an absolute projected-gradient norm below 1e-6. That test had two structural defects, found when an MPC user ran QPs whose gradient scale is ~1e10: (a) rescaling the objective rescales every gradient, so on large-scale problems the flag could never fire at any solution quality; and (b) the projected-gradient heuristic removes each active facet's gradient component independently, so at a constrained optimum with correlated active normals it stalls at a cross-term residue and is structurally nonzero even at the exact optimum. converged=False therefore said nothing about solution quality; solves on perfectly solvable problems ran to their iteration cap by construction.

The v0.6.0 criterion is a KKT-cone certificate: one nonnegative least-squares fit of -∇f(x) onto the cone of all unit-normalized facet normals, augmented with a complementarity row so slack facets cannot absorb the gradient, accepted when

r_kkt  <=  kkt_abs_tol + kkt_rel_tol * max(‖A x‖, ‖b‖, ‖Nᵀμ‖)

Both sides carry gradient units, so while the relative term dominates the threshold the decision is invariant under positive objective rescaling, constraint row order, row duplication, and per-row scaling: the same problem certifies identically at natural scale and at 1e10x. (The kkt_abs_tol floor deliberately takes over at near-zero gradient scales, the intentional fallback that lets a genuinely-zero problem terminate.) The fit runs host-side on every backend: the compiled kernel advances the dynamics in checkpoint-sized chunks and the same Python policy evaluates each checkpoint, so converged means one thing everywhere (the FPGA reference is unchanged and reports fixed-horizon results, which the host can certify with the same function). The cheap plateau/feasibility gates are evaluated first, so the certificate's NNLS cost is confined to near-termination checkpoints, and end-to-end overhead is negligible (see benchmarks/).

Migration: results from v0.5 remain reproducible with ConvergenceConfig(optimality_test="legacy_projected_gradient"), which preserves the old test verbatim. converged=False runs from v0.5 can legitimately become converged=True (or stop ~100x earlier) under the new criterion; nothing about the dynamics changed, only the stopping decision. The default kkt_rel_tol = 1e-4 is calibrated to the O(k0) fixed-point floor of the default step size: it certifies the quality the dynamics genuinely reach, roughly 1e-3 relative solution error on well-conditioned problems. It is a residual tolerance, not an error bound: on a nearly singular Hessian a small residual can coexist with a larger solution displacement.

KV260 reference implementation

fpga/kv260_v05/ contains the restricted fixed-horizon Kria K26 reference that was physically qualified for the SNN-MSRP study. It preserves the v0.5 unified-projection semantics, binary64 input boundary, fixed-point contract, 200 MHz build recipe, and exact compatibility ABI used by that experiment. Its README records the measured qualification surface and the unsupported cases. It is not a general FPGA backend for solve_qp.

Accuracy and tuning

The spiking dynamics converge to a fixed point of the discretised flow, not to the exact minimiser of the QP. On well-conditioned problems the two are close; they are not identical, and the difference is set by the gradient step size k0 = k0_scale / L.

Concretely, on the 50-D benchmark of Figure 1 with the shipped defaults, the solver reaches a period-2 limit cycle whose objective gap against the exact optimum alternates between 3.0e-4 and 6.7e-4, and stays there: the value is identical to ten significant figures at 20k and at 100k iterations. It is jointly feasible the whole time. So the limitation is accuracy of the fixed point, not feasibility.

What to do about it, in order of usefulness:

  1. Read kkt_residual / kkt_scale as the optimality verdict. It is the scale-invariant KKT defect of the final point, comparable across problems and objective scalings; converged=True certifies it below kkt_rel_tol. On this benchmark it reports 8.9e-4, an honest measurement of the limit cycle, which is why the run does not certify at the default 1e-4.
  2. Lower k0_scale, and raise the iteration budget with it. Figure 4 maps the trade. On that problem, 0.5 gives 6.7e-4 and 0.02 gives 1.2e-5, but only if the budget is large enough to arrive; at 5k iterations the same 0.02 setting is far worse than the default. Tune the pair, never k0_scale alone.
  3. Polish externally if you need machine precision. Once the active set is correct (and it usually is, see Figure 2), the exact optimum follows from one equality-constrained KKT solve on those rows. That is exactly what benchmarks/qpref.py does, in well under a millisecond on these sizes.

Two known limitations are worth stating plainly. Ill-conditioned or stiff QPs are the harder case: the native adaptive stepping can fail to reach tolerance and return an infeasible point, and naive Jacobi/diagonal preconditioning conflicts with the adaptive step-size rule rather than fixing it. When a run reports converged=False, read the diagnosis in order: check joint_feasible and projection_budget_exhausted first (feasibility failures and watchdog aborts are their own categories), then read kkt_residual / kkt_scale; since v0.6.0 that number is scale-invariant, so "how far from optimal" is finally a well-posed question at any problem scaling.

Quick start

import numpy as np
from snn_opt import solve_qp

# Minimize ||x||^2 subject to  x_1 + 2 x_2 <= 1  (and that's it).
A  = np.eye(2)
b  = np.zeros(2)
C  = np.array([[1.0, 2.0]])
d  = np.array([-1.0])
x0 = np.array([1.0, 1.0])

result = solve_qp(A, b, C, d, x0, max_iterations=1000)

print(result.summary())             # converged?  iterations?  spikes?
print("x* =", result.final_x)
print("f* =", result.final_objective)

For repeated solves (warm-started receding-horizon problems), construct an SNNSolver once and call .solve(x0) per problem instance; see examples/example4_warm_start.py.

Examples

All scripts live under examples/ and are runnable as plain python examples/example_name.py.

# Script Problem Highlights
1 example1_simple_2d.py 2D quadratic with two linear cuts Smallest possible runnable demo
1b example1_basic_2d.py Same problem, with trajectory plot See examples/example1_basic_2d.png
1c example1_advanced_2d.py Shifted feasible region, infeasible start Spike raster + violation plot
2 example2_3d_polytope.py 3D QP with 4 hyperplanes Multiple active constraints, vertex solution
3 example3_linear_program.py Box-constrained LP ($A=0$) LP via the same machinery
4 example4_warm_start.py Sequence of related QPs Receding-horizon / MPC pattern; spikes drop $30 \to 0$
5 example5_infeasible_recovery.py Infeasible initializations Automatic projection to feasibility
6 example6_equality_constraint.py Equality via a sandwiched band $x_1 = a$ as a tight $\pm \varepsilon$ inequality pair
7 example7_svm_dual.py SVM dual with kernel Box clipping + auto step size on a real ML task
. example_raw_mode.py Bypass auto-config Compares raw vs. optimized solver settings

Run them all in sequence:

python examples/run_all_examples.py

Documentation

Applications

The framework is currently demonstrated in:

  • Khan, Mohammed & Li (2025), Portfolio Optimization: A Neurodynamic Approach Based on Spiking Neural Networks, Biomimetics, 10(12):808. doi:10.3390/biomimetics10120808. Portfolio selection cast as a constrained QP and solved by the spiking dynamics implemented here.

Additional applications are in preparation. As they reach publication they will be added to docs/applications.md.

Citing this work

If snn_opt plays a role in your research or teaching, please cite both the software and the framework paper:

@software{khan2026snnopt,
  author  = {Khan, Ameer Hamza and Li, Shuai},
  title   = {snn\_opt: A Spiking Neural Network Solver for Constrained Convex Optimization},
  year    = {2026},
  version = {0.6.0},
  url     = {https://github.com/ahkhan03/SNN_opt},
  license = {Apache-2.0},
}

@inproceedings{mancoo2020understanding,
  author    = {Mancoo, Allan and Boerlin, Martin and Machens, Christian K.},
  title     = {Understanding Spiking Networks Through Convex Optimization},
  booktitle = {Advances in Neural Information Processing Systems (NeurIPS)},
  year      = {2020},
}

The full per-paper bibliography of the SNN-X series is maintained at docs/applications.md.

License

Apache-2.0, see LICENSE. Permissive, with an explicit patent grant; suitable for both academic and commercial reuse.

Acknowledgments

Developed at the School of Artificial Intelligence, Taizhou University.

This codebase implements the SNN-QP research program led by Prof. Shuai Li (IEEE Fellow; Faculty of Information Technology and Electrical Engineering, University of Oulu, Finland), whose work on neurodynamic optimization originated this line of inquiry. The mathematical framework follows Mancoo, Boerlin and Machens (NeurIPS 2020) and the broader projection-neural-network lineage (Hopfield–Tank, Kennedy–Chua, Xia–Wang, Liu–Wang). Pull requests, bug reports, and citations of the SNN-X papers in your own work are all warmly welcomed.

Metadata

Release files for snn-opt 0.6.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 snn-opt 0.6.0
File Size Uploaded
snn_opt-0.6.0.tar.gz 95.1 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for snn-opt 0.6.0
File
snn_opt-0.6.0-cp313-cp313-win_amd64.whl CPython 3.13 CPython 3.13 Windows x86-64 Details
snn_opt-0.6.0-cp313-cp313-manylinux_2_28_x86_64.whl CPython 3.13 CPython 3.13 Linux glibc 2.28+ x86-64 Details
snn_opt-0.6.0-cp313-cp313-manylinux_2_28_aarch64.whl CPython 3.13 CPython 3.13 Linux glibc 2.28+ ARM64 Details
snn_opt-0.6.0-cp313-cp313-macosx_11_0_arm64.whl CPython 3.13 CPython 3.13 macOS 11.0+ ARM64 Details
snn_opt-0.6.0-cp312-cp312-win_amd64.whl CPython 3.12 CPython 3.12 Windows x86-64 Details
snn_opt-0.6.0-cp312-cp312-manylinux_2_28_x86_64.whl CPython 3.12 CPython 3.12 Linux glibc 2.28+ x86-64 Details
snn_opt-0.6.0-cp312-cp312-manylinux_2_28_aarch64.whl CPython 3.12 CPython 3.12 Linux glibc 2.28+ ARM64 Details
snn_opt-0.6.0-cp312-cp312-macosx_11_0_arm64.whl CPython 3.12 CPython 3.12 macOS 11.0+ ARM64 Details
snn_opt-0.6.0-cp311-cp311-win_amd64.whl CPython 3.11 CPython 3.11 Windows x86-64 Details
snn_opt-0.6.0-cp311-cp311-manylinux_2_28_x86_64.whl CPython 3.11 CPython 3.11 Linux glibc 2.28+ x86-64 Details
snn_opt-0.6.0-cp311-cp311-manylinux_2_28_aarch64.whl CPython 3.11 CPython 3.11 Linux glibc 2.28+ ARM64 Details
snn_opt-0.6.0-cp311-cp311-macosx_11_0_arm64.whl CPython 3.11 CPython 3.11 macOS 11.0+ ARM64 Details
snn_opt-0.6.0-cp310-cp310-win_amd64.whl CPython 3.10 CPython 3.10 Windows x86-64 Details
snn_opt-0.6.0-cp310-cp310-manylinux_2_28_x86_64.whl CPython 3.10 CPython 3.10 Linux glibc 2.28+ x86-64 Details
snn_opt-0.6.0-cp310-cp310-manylinux_2_28_aarch64.whl CPython 3.10 CPython 3.10 Linux glibc 2.28+ ARM64 Details
snn_opt-0.6.0-cp310-cp310-macosx_11_0_arm64.whl CPython 3.10 CPython 3.10 macOS 11.0+ ARM64 Details
snn_opt-0.6.0-cp39-cp39-win_amd64.whl CPython 3.9 CPython 3.9 Windows x86-64 Details
snn_opt-0.6.0-cp39-cp39-manylinux_2_28_x86_64.whl CPython 3.9 CPython 3.9 Linux glibc 2.28+ x86-64 Details
snn_opt-0.6.0-cp39-cp39-manylinux_2_28_aarch64.whl CPython 3.9 CPython 3.9 Linux glibc 2.28+ ARM64 Details
snn_opt-0.6.0-cp39-cp39-macosx_11_0_arm64.whl CPython 3.9 CPython 3.9 macOS 11.0+ ARM64 Details

Total release size: 4.7 MB

Release files / snn_opt-0.6.0.tar.gz

Download URL snn_opt-0.6.0.tar.gz
Size 95.1 kB
Tags Source
SHA-256 checksum
How to use checksums
266dc3870d0cb73e7defb38201dbd6ebe8cb2a2195ea481803d0b0222ef64be7
BLAKE2b-256 checksum
How to use checksums
8cc0d6599a5d78aad2a133acea293be90fa08225843035ba5f287d4db8dba412
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 14, 2026.

Transparency log

Release files / snn_opt-0.6.0-cp313-cp313-win_amd64.whl

Download URL snn_opt-0.6.0-cp313-cp313-win_amd64.whl
Size 160.7 kB
Tags CPython 3.13 Windows x86-64
SHA-256 checksum
How to use checksums
616ca7592c1503c7876b71e4b0b50df4e56515cbc4a548ae46155f3d22be2799
BLAKE2b-256 checksum
How to use checksums
b34ffd61447d99568490654ddd87a3393ad627e12ee12fae8316c0786fe3b073
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 14, 2026.

Transparency log

Release files / snn_opt-0.6.0-cp313-cp313-manylinux_2_28_x86_64.whl

Download URL snn_opt-0.6.0-cp313-cp313-manylinux_2_28_x86_64.whl
Size 314.1 kB
Tags CPython 3.13 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
26ca56f1bf017400445d6483e8897a16e07417940c718821afa6e3feb96d4cde
BLAKE2b-256 checksum
How to use checksums
c18efedd7bd923a0f8f2fd5343d4084be0aa8cdfe6e670462e1c6bb7ead5bc00
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 14, 2026.

Transparency log

Release files / snn_opt-0.6.0-cp313-cp313-manylinux_2_28_aarch64.whl

Download URL snn_opt-0.6.0-cp313-cp313-manylinux_2_28_aarch64.whl
Size 302.0 kB
Tags CPython 3.13 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
53914572c9faaa27d97e85d7739cab9878cb028b3c471362337f6be86cf3c352
BLAKE2b-256 checksum
How to use checksums
ca7ca764739b38c24e4edc1fd774eac24cd3a93587e961ca39ac82f1dd1742f9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 14, 2026.

Transparency log

Release files / snn_opt-0.6.0-cp313-cp313-macosx_11_0_arm64.whl

Download URL snn_opt-0.6.0-cp313-cp313-macosx_11_0_arm64.whl
Size 155.1 kB
Tags CPython 3.13 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
6337bec4937cee762f6a5c5c872a81f65e89e93b5d32e30603183f8ae5857765
BLAKE2b-256 checksum
How to use checksums
cfee83e429a7cfa9b5ae7d31d90503d9ff8f3a7de6f6d39ce025a2b88abaf00a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 14, 2026.

Transparency log

Release files / snn_opt-0.6.0-cp312-cp312-win_amd64.whl

Download URL snn_opt-0.6.0-cp312-cp312-win_amd64.whl
Size 160.7 kB
Tags CPython 3.12 Windows x86-64
SHA-256 checksum
How to use checksums
d444b34f9c15bc1edd53e91b7aa4ecefe6ea1576901ea372575711f27ceafe5f
BLAKE2b-256 checksum
How to use checksums
aff556afd63cdb3d098521d7f51e982a60c79bf092b75312a3303e24db1971c2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 14, 2026.

Transparency log

Release files / snn_opt-0.6.0-cp312-cp312-manylinux_2_28_x86_64.whl

Download URL snn_opt-0.6.0-cp312-cp312-manylinux_2_28_x86_64.whl
Size 314.0 kB
Tags CPython 3.12 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
2a3a70e68bb827bcc17e613af9d8df5e9b632b60ba1afd4b11754c606faa533e
BLAKE2b-256 checksum
How to use checksums
9afcd20a0a76bedbf969647fb0b521ff41743330f6e1c7ca2900afb143825a92
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 14, 2026.

Transparency log

Release files / snn_opt-0.6.0-cp312-cp312-manylinux_2_28_aarch64.whl

Download URL snn_opt-0.6.0-cp312-cp312-manylinux_2_28_aarch64.whl
Size 302.1 kB
Tags CPython 3.12 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
01fc31536b4953debb95af1b5a8d07465f178069794f95782750ce64c4f1f127
BLAKE2b-256 checksum
How to use checksums
a47d7f22807931e601466402c3b1483bf873b56dab95e0bc7742fbe372b247d9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 14, 2026.

Transparency log

Release files / snn_opt-0.6.0-cp312-cp312-macosx_11_0_arm64.whl

Download URL snn_opt-0.6.0-cp312-cp312-macosx_11_0_arm64.whl
Size 155.0 kB
Tags CPython 3.12 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
8026d4bc85a8f6409b7efeb0eb7141acbcc2d08eaa33c273295aed1bbce300f1
BLAKE2b-256 checksum
How to use checksums
7da9713dbb434b4e4d2e154d68a3fd35906f7fb3294fd24d7e1b82ab76c5faa5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 14, 2026.

Transparency log

Release files / snn_opt-0.6.0-cp311-cp311-win_amd64.whl

Download URL snn_opt-0.6.0-cp311-cp311-win_amd64.whl
Size 158.1 kB
Tags CPython 3.11 Windows x86-64
SHA-256 checksum
How to use checksums
b45284ff2965d95cd79c05804647c44e834a8c3f9939afc9e4189a2b619571d9
BLAKE2b-256 checksum
How to use checksums
3e0e03cc82feafeeed388d514d3ee9b64b6239fac076a92a47455509ab175d3a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 14, 2026.

Transparency log

Release files / snn_opt-0.6.0-cp311-cp311-manylinux_2_28_x86_64.whl

Download URL snn_opt-0.6.0-cp311-cp311-manylinux_2_28_x86_64.whl
Size 311.5 kB
Tags CPython 3.11 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
372fa58e0d1a6eb7e948ddac3b4fecee9778cd0680afc00550191971303e3b3e
BLAKE2b-256 checksum
How to use checksums
7137a22ee949616317e7ddbe706fb77ad8ed3660d83987bde7121dd3c94f3338
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 14, 2026.

Transparency log

Release files / snn_opt-0.6.0-cp311-cp311-manylinux_2_28_aarch64.whl

Download URL snn_opt-0.6.0-cp311-cp311-manylinux_2_28_aarch64.whl
Size 300.1 kB
Tags CPython 3.11 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
bb79f1d252b0984ed54296af67c094080fb1c82bf999bb69155368f8afbf792c
BLAKE2b-256 checksum
How to use checksums
2a3eb3ca6a871306ae48d6f1bb0e898bc2b3c22a587493e7a381bdacfed551f6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 14, 2026.

Transparency log

Release files / snn_opt-0.6.0-cp311-cp311-macosx_11_0_arm64.whl

Download URL snn_opt-0.6.0-cp311-cp311-macosx_11_0_arm64.whl
Size 152.5 kB
Tags CPython 3.11 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
f6948a0dee6bfb2b78efd70946c0ce3d53dbf9e4e3e890335b3fb3981283b0df
BLAKE2b-256 checksum
How to use checksums
be02620438260f64b39dd040e9d43591b8d5e852c8d231575f423998c812af64
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 14, 2026.

Transparency log

Release files / snn_opt-0.6.0-cp310-cp310-win_amd64.whl

Download URL snn_opt-0.6.0-cp310-cp310-win_amd64.whl
Size 157.8 kB
Tags CPython 3.10 Windows x86-64
SHA-256 checksum
How to use checksums
1e9899435a81f8c9ecbf81267d5f52149896de2d577721a7d0141cdec2ffdd1b
BLAKE2b-256 checksum
How to use checksums
ed6bd0a8aac1772fc4b27da0cf14c7c2865b893fc22bebea808e9ef6277b7793
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 14, 2026.

Transparency log

Release files / snn_opt-0.6.0-cp310-cp310-manylinux_2_28_x86_64.whl

Download URL snn_opt-0.6.0-cp310-cp310-manylinux_2_28_x86_64.whl
Size 310.0 kB
Tags CPython 3.10 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
c528617da6e029da4e2bd759dc1a4fa1a3dcbd0419ceaef711d7857348d6e2cb
BLAKE2b-256 checksum
How to use checksums
a48a16e56a128fd85aa2fce1bef78a38dffced4cc773f66a5eaf566a83c32358
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 14, 2026.

Transparency log

Release files / snn_opt-0.6.0-cp310-cp310-manylinux_2_28_aarch64.whl

Download URL snn_opt-0.6.0-cp310-cp310-manylinux_2_28_aarch64.whl
Size 299.0 kB
Tags CPython 3.10 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
5389d2985290af4059fed9ef2cdb57025e5c9ff6a51981377f9cee22eccd742a
BLAKE2b-256 checksum
How to use checksums
bdf11a9d6745ca2e29e644ad2fc052eb1d7be716dca910693cf6e997bb096c99
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 14, 2026.

Transparency log

Release files / snn_opt-0.6.0-cp310-cp310-macosx_11_0_arm64.whl

Download URL snn_opt-0.6.0-cp310-cp310-macosx_11_0_arm64.whl
Size 151.3 kB
Tags CPython 3.10 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
5dec87e5013249488e4e4694e5e7992fe99860d5f7fcacf730297653644274ff
BLAKE2b-256 checksum
How to use checksums
f8c055d90bee32d6501467006c712221bd140aad45c384e1fae88c7a562e83ab
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 14, 2026.

Transparency log

Release files / snn_opt-0.6.0-cp39-cp39-win_amd64.whl

Download URL snn_opt-0.6.0-cp39-cp39-win_amd64.whl
Size 157.9 kB
Tags CPython 3.9 Windows x86-64
SHA-256 checksum
How to use checksums
4c418ef531a519b4b4ccea0bf544eb4e024a0624847678e7a98821d2fae16c2a
BLAKE2b-256 checksum
How to use checksums
470edcd57d2451246f6b636b1a1188adfa44b3db7b70003faaea2d8458f930a1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 14, 2026.

Transparency log

Release files / snn_opt-0.6.0-cp39-cp39-manylinux_2_28_x86_64.whl

Download URL snn_opt-0.6.0-cp39-cp39-manylinux_2_28_x86_64.whl
Size 310.0 kB
Tags CPython 3.9 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
7b14412f1aa5690ecccdab0ec3c0c2064325149a9e8afcd55c65d846bb19f256
BLAKE2b-256 checksum
How to use checksums
c052f796aebe1b9bef9e874c8f3a749755f2abd7e25c4dc71f74d9770de730de
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 14, 2026.

Transparency log

Release files / snn_opt-0.6.0-cp39-cp39-manylinux_2_28_aarch64.whl

Download URL snn_opt-0.6.0-cp39-cp39-manylinux_2_28_aarch64.whl
Size 299.6 kB
Tags CPython 3.9 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
f35e5a18e49297f1e56ac0a4e526aaef12ca5ffcb2edb95e399fe76a8c1b0060
BLAKE2b-256 checksum
How to use checksums
7cc516b18a309bc1ff71971e4d2ee312e7424c06a4b4a9cab9edb515f7e6c3c6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 14, 2026.

Transparency log

Release files / snn_opt-0.6.0-cp39-cp39-macosx_11_0_arm64.whl

Download URL snn_opt-0.6.0-cp39-cp39-macosx_11_0_arm64.whl
Size 151.4 kB
Tags CPython 3.9 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
862143ff6877f551e007d248815233a113e4bbfd12f47a711947e813445dbc40
BLAKE2b-256 checksum
How to use checksums
891f28ec2bb08972a7113423602c8e72d1fcbe6d3fe9439621ae54485ce974cc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 14, 2026.

Transparency log

Release history Release notifications | RSS feed

0.8.1

25 release files

This release

0.6.0 This release

21 release files

0.5.0

21 release files

0.4.0

21 release files

0.3.0

21 release files

0.2.0

21 release files

0.1.0

21 release files

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