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, Keemink 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' and up to 4096 constraint rows (the Gram precompute cap); sparse inputs, other projection methods, and larger constraint sets are rejected with a clear error rather than silently falling back, so select backend='python' for those. 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; warm starts eliminate the projection events (see Figure 3 for the quantitative benchmark)
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 Implicit box facets + 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.7.0},
  url     = {https://github.com/ahkhan03/SNN_opt},
  license = {Apache-2.0},
}

@inproceedings{mancoo2020understanding,
  author    = {Mancoo, Allan and Keemink, Sander 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, Keemink 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.7.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.7.0
File Size Uploaded
snn_opt-0.7.0.tar.gz 161.1 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for snn-opt 0.7.0
File
snn_opt-0.7.0-cp313-cp313-win_amd64.whl CPython 3.13 CPython 3.13 Windows x86-64 Details
snn_opt-0.7.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.7.0-cp313-cp313-manylinux_2_28_aarch64.whl CPython 3.13 CPython 3.13 Linux glibc 2.28+ ARM64 Details
snn_opt-0.7.0-cp313-cp313-macosx_11_0_arm64.whl CPython 3.13 CPython 3.13 macOS 11.0+ ARM64 Details
snn_opt-0.7.0-cp312-cp312-win_amd64.whl CPython 3.12 CPython 3.12 Windows x86-64 Details
snn_opt-0.7.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.7.0-cp312-cp312-manylinux_2_28_aarch64.whl CPython 3.12 CPython 3.12 Linux glibc 2.28+ ARM64 Details
snn_opt-0.7.0-cp312-cp312-macosx_11_0_arm64.whl CPython 3.12 CPython 3.12 macOS 11.0+ ARM64 Details
snn_opt-0.7.0-cp311-cp311-win_amd64.whl CPython 3.11 CPython 3.11 Windows x86-64 Details
snn_opt-0.7.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.7.0-cp311-cp311-manylinux_2_28_aarch64.whl CPython 3.11 CPython 3.11 Linux glibc 2.28+ ARM64 Details
snn_opt-0.7.0-cp311-cp311-macosx_11_0_arm64.whl CPython 3.11 CPython 3.11 macOS 11.0+ ARM64 Details
snn_opt-0.7.0-cp310-cp310-win_amd64.whl CPython 3.10 CPython 3.10 Windows x86-64 Details
snn_opt-0.7.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.7.0-cp310-cp310-manylinux_2_28_aarch64.whl CPython 3.10 CPython 3.10 Linux glibc 2.28+ ARM64 Details
snn_opt-0.7.0-cp310-cp310-macosx_11_0_arm64.whl CPython 3.10 CPython 3.10 macOS 11.0+ ARM64 Details
snn_opt-0.7.0-cp39-cp39-win_amd64.whl CPython 3.9 CPython 3.9 Windows x86-64 Details
snn_opt-0.7.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.7.0-cp39-cp39-manylinux_2_28_aarch64.whl CPython 3.9 CPython 3.9 Linux glibc 2.28+ ARM64 Details
snn_opt-0.7.0-cp39-cp39-macosx_11_0_arm64.whl CPython 3.9 CPython 3.9 macOS 11.0+ ARM64 Details

Total release size: 6.9 MB

Release files / snn_opt-0.7.0.tar.gz

Download URL snn_opt-0.7.0.tar.gz
Size 161.1 kB
Tags Source
SHA-256 checksum
How to use checksums
b0540ecb9878555812366aa64df6c847ce50c19eb106b47daa10a8d775dc21c1
BLAKE2b-256 checksum
How to use checksums
432696018955d555bd95d8769278f538b545b3fb7c980e9e4c9d230b29292954
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 Oct 7, 2026.

Transparency log

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

Download URL snn_opt-0.7.0-cp313-cp313-win_amd64.whl
Size 248.0 kB
Tags CPython 3.13 Windows x86-64
SHA-256 checksum
How to use checksums
039150f24da6e636d2ab58f6375cc0c39fd987d24b51b286d8892f97d8cc97e6
BLAKE2b-256 checksum
How to use checksums
31dbf6208eb20beff978b811bfbf5a197e11054942e88b35012e77774fd3820f
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 Oct 7, 2026.

Transparency log

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

Download URL snn_opt-0.7.0-cp313-cp313-manylinux_2_28_x86_64.whl
Size 442.2 kB
Tags CPython 3.13 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
73a02551246b4f852eaaf8c711e72edab11c38322db35cfe53c7c9d8e0d4a3f1
BLAKE2b-256 checksum
How to use checksums
421ce58265c64773b13151f7a84cd2d38ff53115fe7994caedd0de2008cbb65e
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 Oct 7, 2026.

Transparency log

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

Download URL snn_opt-0.7.0-cp313-cp313-manylinux_2_28_aarch64.whl
Size 410.7 kB
Tags CPython 3.13 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
1a552d9a67f70bcdfe33a7ada7a761674b55d2bacea7579c0fe5690fae7317ba
BLAKE2b-256 checksum
How to use checksums
7f0f6314af093073f993ad143e678af7861779ffa3eebb88b1ede4f88213014d
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 Oct 7, 2026.

Transparency log

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

Download URL snn_opt-0.7.0-cp313-cp313-macosx_11_0_arm64.whl
Size 247.9 kB
Tags CPython 3.13 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
0b1c6ea8d3027d8e8c455b22fcd32d377400a73134c5eab667feecbf8652ed60
BLAKE2b-256 checksum
How to use checksums
2234d5c0882544276aeef5575a534d18f5a497111d1ff783e30e741261ba4e1d
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 Oct 7, 2026.

Transparency log

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

Download URL snn_opt-0.7.0-cp312-cp312-win_amd64.whl
Size 248.0 kB
Tags CPython 3.12 Windows x86-64
SHA-256 checksum
How to use checksums
d8e230a2696254534c86acbb7b20514d4814003758b89bb24d31e3518730acbb
BLAKE2b-256 checksum
How to use checksums
d5b496837fe99808a3e355d0a25acfac26bfbe58f0928a58fa995834d1baafb5
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 Oct 7, 2026.

Transparency log

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

Download URL snn_opt-0.7.0-cp312-cp312-manylinux_2_28_x86_64.whl
Size 442.2 kB
Tags CPython 3.12 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
9d9638056133ab78fed191e092076647233f81c46f0088f287fc24105b752e25
BLAKE2b-256 checksum
How to use checksums
b75286d945ceb3735f261e01fe3541b66fc86ace1d1cb26fd4a99b078231b268
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 Oct 7, 2026.

Transparency log

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

Download URL snn_opt-0.7.0-cp312-cp312-manylinux_2_28_aarch64.whl
Size 410.7 kB
Tags CPython 3.12 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
79ad7220694303e6c9facff12c470a41c759b29bb83cc87b7b1d3eee5d54fe53
BLAKE2b-256 checksum
How to use checksums
3dd5598b97aae39d6e7e4ba8cd389c9a8f9b0be477dc35c20655640050d2604d
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 Oct 7, 2026.

Transparency log

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

Download URL snn_opt-0.7.0-cp312-cp312-macosx_11_0_arm64.whl
Size 247.8 kB
Tags CPython 3.12 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
d73a2c2c786b264d6148b1a2aed49a55a80b771a6c37ed89550c7f7b8182e0e6
BLAKE2b-256 checksum
How to use checksums
4790fb2da27fb3361ccf8488ba09e3cb8e29a509d0b860202405c4f5439c9405
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 Oct 7, 2026.

Transparency log

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

Download URL snn_opt-0.7.0-cp311-cp311-win_amd64.whl
Size 245.1 kB
Tags CPython 3.11 Windows x86-64
SHA-256 checksum
How to use checksums
93d9d367784c8383d439d720b491ca257791d43493079723a1fe20150d023eab
BLAKE2b-256 checksum
How to use checksums
067e711475956d37939ee61b30c5227bd5c751188dffae0b8c6e62e8387ce7bb
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 Oct 7, 2026.

Transparency log

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

Download URL snn_opt-0.7.0-cp311-cp311-manylinux_2_28_x86_64.whl
Size 438.9 kB
Tags CPython 3.11 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
19f6c51957a3a036947566af1e944d878c433e3aa0e63927ae4d582db6af96ef
BLAKE2b-256 checksum
How to use checksums
e10cddc53cdef69360f88d45cce4ba00ebd0fb2f75a2c753d04fd8c9b5871c33
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 Oct 7, 2026.

Transparency log

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

Download URL snn_opt-0.7.0-cp311-cp311-manylinux_2_28_aarch64.whl
Size 409.1 kB
Tags CPython 3.11 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
16c335284cff5ecc1af8baad495ccd4e0a1e2fe81c7b3f9e8f8e66677d6900a1
BLAKE2b-256 checksum
How to use checksums
094e6bc95104516526f48073a0e79a9a442776f121c9dd0d6b6c307c9a529499
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 Oct 7, 2026.

Transparency log

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

Download URL snn_opt-0.7.0-cp311-cp311-macosx_11_0_arm64.whl
Size 244.7 kB
Tags CPython 3.11 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
998e11c4660c2b02049c9159309a4d773c69fbf5e42e0a59fa1f4220af15fe58
BLAKE2b-256 checksum
How to use checksums
c0ff83c3da345c175af5069a693e8a52d5dc90c4386cec6dcf70a90bd76d4b2a
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 Oct 7, 2026.

Transparency log

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

Download URL snn_opt-0.7.0-cp310-cp310-win_amd64.whl
Size 244.5 kB
Tags CPython 3.10 Windows x86-64
SHA-256 checksum
How to use checksums
0587d1ffbbe99088fe21b23eb0a90f97417579c58b90b266150b658e06aabbbb
BLAKE2b-256 checksum
How to use checksums
a76c4f108706580042fcdee0c3eaddaaca5fa557b825ce9049bcfc52c82905f6
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 Oct 7, 2026.

Transparency log

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

Download URL snn_opt-0.7.0-cp310-cp310-manylinux_2_28_x86_64.whl
Size 437.7 kB
Tags CPython 3.10 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
c06c6b2cd25b3fa13ebec7833135e156802f5f7eee75f83a5d46fa99681e6e75
BLAKE2b-256 checksum
How to use checksums
c2a91c7a350e94d204cc40bbc74ff6ddfd398ef69c44c6bd1e365a4dc4d02ca6
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 Oct 7, 2026.

Transparency log

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

Download URL snn_opt-0.7.0-cp310-cp310-manylinux_2_28_aarch64.whl
Size 408.3 kB
Tags CPython 3.10 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
532cea513d05dd3f0d3078ab3f32ae446b6c19f26a388e96ee0b4b662d3e3a28
BLAKE2b-256 checksum
How to use checksums
0bd27adbabdde7d9e5778c7b6e75a5c771f1b7f960777d04fc8364e439e0f625
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 Oct 7, 2026.

Transparency log

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

Download URL snn_opt-0.7.0-cp310-cp310-macosx_11_0_arm64.whl
Size 243.5 kB
Tags CPython 3.10 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
c919a8a829ba0b84bed69ed9a2bcda1f10634e3b6a9e9e8c996d423a1496ee44
BLAKE2b-256 checksum
How to use checksums
70ca4b672db11d22ccdc103b0cf6066bdb65c6483b9a22c679ae45c53059ce5a
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 Oct 7, 2026.

Transparency log

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

Download URL snn_opt-0.7.0-cp39-cp39-win_amd64.whl
Size 244.7 kB
Tags CPython 3.9 Windows x86-64
SHA-256 checksum
How to use checksums
e12e23c3079e7806c420808bb025c368656a96bd2a4e2fbcc82bb850e2ee50ca
BLAKE2b-256 checksum
How to use checksums
429d5b5c6051ac6f586e67b1cb82e5af93d17512f57e15b64368dfc63097f27b
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 Oct 7, 2026.

Transparency log

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

Download URL snn_opt-0.7.0-cp39-cp39-manylinux_2_28_x86_64.whl
Size 437.8 kB
Tags CPython 3.9 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
e0012dcf06fbc5dc3608e9fb7abe76bb0ff84536cbba188c262a52d3ac812da0
BLAKE2b-256 checksum
How to use checksums
5443548f737546cfc908cb69f635b42d36f018a0e81ce38a31134f0e70ded42f
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 Oct 7, 2026.

Transparency log

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

Download URL snn_opt-0.7.0-cp39-cp39-manylinux_2_28_aarch64.whl
Size 408.7 kB
Tags CPython 3.9 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
4f7383693ae8c82975dae4bfaa53de76ee8b3e3504abf9df69137f19f9b98af5
BLAKE2b-256 checksum
How to use checksums
cfb792d20b31e8d102bf3f5cdaf28bbc7ade20e0f206059c1dcc304d1349abf7
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 Oct 7, 2026.

Transparency log

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

Download URL snn_opt-0.7.0-cp39-cp39-macosx_11_0_arm64.whl
Size 243.6 kB
Tags CPython 3.9 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
3ed7f4cdf3ec81b3c7f266621be2fe1345d4394761624a1e2478dcdee88a452b
BLAKE2b-256 checksum
How to use checksums
5039fbce77b0f3286a927c288be23d9c7886d58ea732f1664d1a8ed220f2bd75
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 Oct 7, 2026.

Transparency log

Release history Release notifications | RSS feed

0.8.1

25 release files

This release

0.7.0 This release

21 release files

0.6.0

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