snn_opt
A spiking neural network solver for constrained convex optimization.
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.
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.
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.
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.
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:
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.
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 issnn_opt. So youpip install snn-optand thenimport 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_feasibleis the honest feasibility flag. Pre-0.5 the convergence gate looked at rows only, so a box violation could not fail it.kkt_residualis the scale-invariant KKT certificate at the final point (see the next section); with the default settings,converged=Truemeans exactly that this certificate passed, together with feasibility and the plateau criterion, at three consecutive checkpoints. The olderstationarity_residualdiagnostic is retained for one compatibility release but mixes units and can depend on constraint row order; preferkkt_residual.projection_budget_exhaustedreports that the sweep hit its watchdog.max_projection_itersis now a safety cap (defaultNone, 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:
- Read
kkt_residual / kkt_scaleas the optimality verdict. It is the scale-invariant KKT defect of the final point, comparable across problems and objective scalings;converged=Truecertifies it belowkkt_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. - 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, neverk0_scalealone. - 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.pydoes, 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
docs/theory.md: derivation of the SNN/convex-optimization equivalence, step-size analysis, projection geometry, convergence criteria.docs/applications.md: catalogue of the published work that uses this solver.docs/api.md: hand-curated API reference.benchmarks/README.md: what each figure shows and how to regenerate it.- https://snn.ahkhan.me: companion site, designed for a broader audience (students, curious researchers).
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)
| File | Size | Uploaded | |
|---|---|---|---|
| snn_opt-0.7.0.tar.gz | 161.1 kB | Details |
Built distributions (wheels)
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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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