nwgrad
High-performance C++ sequence alignment library with gradient computation for substitution matrix optimization — exposed to Python via nanobind.
nwgrad implements Needleman-Wunsch (global) and Smith-Waterman (local) alignment with both linear and affine gap penalties. Its primary novel feature is computing the gradient of the alignment score with respect to substitution matrix entries, enabling substitution matrix optimization in gradient-based ML pipelines.
Features
- Global (NW) and local (SW) alignment — shared template core, selected at compile time
- Linear and affine gap models — single gap penalty or gap-open + gap-extend
- Hard subgradient — substitution-pair counts along the optimal traceback
- Soft (differentiable) gradient — forward-backward in log-space; log-partition function and expected substitution counts
- Multithreaded batch processing — lock-free work dispatch, per-thread gradient accumulation
- Guide-banded DP — cheap re-alignment under a new matrix around a cached alignment path
- float32 by default, float64 on request — the plain names (
SeqPair,nw_score, …) run the Viterbi DP in float32;SeqPairDouble,nw_score_double, … run it in float64 (see Precision) - Linear-space alignment — Hirschberg (Myers-Miller) traceback is the default for affine global alignment, so long pairs no longer need O(m×n) tables
- Runtime ISA dispatch — one binary carries SSE2 / AVX2 / AVX-512 (x86) or NEON (ARM) kernels and picks the best one at load; every level is bit-exact with the scalar kernel
- Zero-copy Python interface — nanobind buffer protocol; no unnecessary array copies
Installation
pip install nwgrad
Or from source:
git clone https://github.com/michalsta/nwgrad
cd nwgrad
pip install .
Prebuilt wheels cover CPython 3.10–3.14 on Linux x86_64 / aarch64 and macOS arm64.
Anywhere else pip builds from source, which needs a C++20 compiler with libstdc++'s
<experimental/simd>: GCC 11+, or Clang 13+ built against libstdc++. Apple's
system clang (libc++) and MSVC lack that header — on macOS use Homebrew gcc;
Windows is not supported.
Quick Start
import numpy as np
import nwgrad
# Predefined matrices ship as ready-to-use SubstMatrix objects (they carry
# their own alphabet, so you never have to specify the symbol order yourself):
from nwgrad.matrices import BLOSUM62 # SubstMatrix, NCBI 23-symbol alphabet
print(BLOSUM62.alphabet) # 'ARNDCQEGHILKMFPSTWYVBZX'
# Or build one from your own (N, N) array. A SubstMatrix always pairs a matrix
# with the alphabet that indexes its rows/columns:
dna_mat = nwgrad.SubstMatrix(np.eye(4) * 2 - 1, alphabet="ACGT")
Single pair — SeqPair
SeqPair takes an AlignParams object that bundles the substitution matrix
with gap penalties. Pass a SubstMatrix directly — its alphabet travels with
it, so amino acids map to matrix cells unambiguously:
params = nwgrad.AlignParams(BLOSUM62,
gap_open_a=11.0, gap_extend_a=1.0,
gap_open_b=11.0, gap_extend_b=1.0)
sp = nwgrad.SeqPair(
"PLEASANTLY", "MEANLY", params,
gap_model="affine", # "linear" | "affine"
mode="global", # "global" | "local"
grad_mode="hard", # "hard" | "soft" | "none"
)
# Align, then read the score and a printable alignment:
score, grad = sp.score_and_grad() # one call: allocates DP, aligns, computes grad
print(score)
print(sp.formatted()) # PLEASANTLY / match line / -MEAN---LY
print(sp.aligned()) # ('PLEASANTLY', '-MEAN---LY')
# `grad` is an AlignParams; inspect it as a dict:
g = grad.to_dict()
print(g["matrix"].shape, g["gap_open_a"], g["gap_extend_b"])
align_full() (the DP) and compute_grad() (reading the gradient off the
cached DP tables) are exposed separately so you can re-align many times and only
pay for the gradient when you need it; score_and_grad() above just fuses the
common case. The hard gradient is a subgradient read from the Viterbi path; the
soft gradient (grad_mode="soft") is the exact gradient of the log-partition
function via forward–backward.
After updating the matrix, realign_banded() re-scores the pair cheaply around the existing alignment path:
new_params = nwgrad.AlignParams(new_subst_matrix,
gap_open_a=11.0, gap_extend_a=1.0,
gap_open_b=11.0, gap_extend_b=1.0)
sp.set_params(new_params)
sp.realign_banded(bandwidth=20)
sp.compute_grad()
Batch — SeqPairBatch
from nwgrad.matrices import BLOSUM62
params = nwgrad.AlignParams(BLOSUM62,
gap_open_a=11.0, gap_extend_a=1.0,
gap_open_b=11.0, gap_extend_b=1.0)
pairs = [
nwgrad.SeqPair(a, b, params,
gap_model="affine", mode="global", grad_mode="soft")
for a, b in zip(seqs_a, seqs_b)
]
batch = nwgrad.SeqPairBatch(n_threads=8)
for sp in pairs:
batch.add(sp)
# Align all pairs in parallel; score and grad are cached on each SeqPair
total_log_z = batch.score_and_grad()
# Sum gradients across all pairs → AlignParams
grad = batch.compute_grad()
# Or weight each pair's gradient, e.g. by a per-pair loss derivative computed
# from the scores. Reads the cached gradients; no alignment is run.
scores = batch.scores() # float64 array, pair order
grad = batch.weighted_grad(weights) # sum_i weights[i] * grad_i
# Update matrix and re-run with banded DP around the existing paths
new_params = nwgrad.AlignParams(new_subst_matrix,
gap_open_a=11.0, gap_extend_a=1.0,
gap_open_b=11.0, gap_extend_b=1.0)
batch.set_params(new_params)
total_log_z = batch.score_and_grad(bandwidth=20)
grad = batch.compute_grad()
SeqPair objects are constructed once and reused across optimization iterations. Only the AlignParams changes; the sequence data and, when applicable, the alignment path are preserved.
API Reference
Alphabet
nwgrad.Alphabet.get(symbols: str) -> Alphabet
The character↔index mapping that a matrix, its gradients, and its sequences all share. Alphabets are interned: Alphabet.get("ACGT") is nwgrad.DNA, so two matrices are compatible exactly when their alphabets are the same object.
Named alphabets:
| Constant | Symbols | N |
|---|---|---|
nwgrad.DNA |
ACGT |
4 |
nwgrad.DNA_N |
ACGTN |
5 |
nwgrad.RNA |
ACGU |
4 |
nwgrad.RNA_N |
ACGUN |
5 |
nwgrad.PROTEIN |
the canonical 20 | 20 |
nwgrad.PROTEIN_X |
+ X (unknown) |
21 |
nwgrad.PROTEIN_UO |
+ U (selenocysteine), O (pyrrolysine) |
22 |
nwgrad.PROTEIN_UOX |
+ U, O, X |
23 |
nwgrad.NCBI_PROTEIN |
ARNDCQEGHILKMFPSTWYVBZX |
23 |
nwgrad.IUPAC_DNA |
ATGCSWRYKMBVHDN |
15 |
Extensions append at the end, so the canonical 20 keep indices 0–19 and a 20×20 matrix in that order embeds as the top-left block of any extended one.
The matrices in nwgrad.matrices use a different ordering. BLOSUM, PAM and VTML are all in NCBI column order (NCBI_PROTEIN), and NUC44 is in IUPAC order (IUPAC_DNA). These are not extensions of PROTEIN / DNA — BLOSUM62 does not embed in PROTEIN_X. Combining a matrix over one alphabet with a gradient over another raises, rather than silently misreading the columns.
An Alphabet governs legality and ordering only — scoring is entirely the matrix's job, including for X and N.
For anything not listed, build your own: nwgrad.Alphabet.get("ACGTRYSWKM").
| Member | Description |
|---|---|
symbols |
The symbol string, in index order |
size, len(a) |
Number of symbols N |
index_of(c) |
Index of c, or -1 if absent |
contains(c) |
Whether c is in the alphabet |
encode(s) |
Validate and encode to indices; raises ValueError on any foreign character |
decode(indices) |
Inverse of encode |
SubstMatrix
nwgrad.SubstMatrix(matrix: np.ndarray, alphabet: str = "ACDEFGHIKLMNPQRSTVWY")
Constructs a substitution matrix from an (N, N) float64 numpy array where N = len(alphabet). The default alphabet is the 20 canonical amino acids (ACDEFGHIKLMNPQRSTVWY). Any square matrix with a matching alphabet is accepted — including DNA ("ACGT"), extended amino acids, or any other symbol set. The alphabet is given as a string; if you are holding an Alphabet object, pass its .symbols.
Stored as a dense N × N block indexed by alphabet position — 16 doubles for DNA. Sequences are validated and encoded to indices once, at the boundary, so the DP inner loop is a single O(1) lookup and never touches a character. Asymmetric matrices are fully supported.
Characters outside the alphabet raise ValueError; they are not silently scored as zero. Case is significant — 'd' is not 'D', so soft-masked FASTA must be upper-cased by the caller.
| Member | Description |
|---|---|
score(a, b) |
Substitution score for single characters a, b |
to_matrix() |
Export as (N, N) float64 numpy array in alphabet order |
size |
Alphabet size N |
alphabet |
The alphabet string (length N) |
Predefined matrices are available from nwgrad.matrices as ready-to-use
SubstMatrix objects (each already carrying the correct alphabet):
BLOSUM45/50/62/80/90, PAM30/70/250, VTML40/80/160/200, and NUC44 (DNA).
from nwgrad.matrices import BLOSUM62
BLOSUM62.alphabet # 'ARNDCQEGHILKMFPSTWYVBZX'
BLOSUM62.to_matrix() # (23, 23) float64 array
AlignParams
nwgrad.AlignParams(matrix, gap_open_a=0.0, gap_extend_a=0.0,
gap_open_b=0.0, gap_extend_b=0.0)
# or, from a raw array + explicit alphabet:
nwgrad.AlignParams(array, alphabet="ACDEFGHIKLMNPQRSTVWY", gap_open_a=0.0, ...)
Bundles a substitution matrix with (possibly asymmetric) gap penalties. The
first form takes a SubstMatrix directly and is preferred — the alphabet
travels with the matrix, so there is no risk of mismatching the symbol order.
Suffix _a penalties apply to gaps in sequence A, _b to gaps in sequence B.
| Member | Description |
|---|---|
matrix |
The SubstMatrix (read/write) |
gap_open_a / gap_extend_a / gap_open_b / gap_extend_b |
Gap penalties (read/write) |
to_dict() |
Return {"matrix": (N,N) array, "alphabet": str, "gap_open_a": …, …} |
+ - * |
Element-wise arithmetic over all fields (for gradient-descent updates) |
AlignParams is also the gradient type returned by SeqPair.grad /
compute_grad(); to_dict() is the easy way to inspect a computed gradient.
Sign convention. Every field of a gradient — the matrix entries and the four gap fields — is the derivative of the score with respect to that field. The score subtracts gap penalties, so a gradient's gap fields come out non-positive while its matrix fields come out non-negative. That is what lets one update rule move the whole struct in the ascent direction:
params = params + lr * grad # element-wise over matrix and all four gap fields
SeqPair
nwgrad.SeqPair(
seq_a, seq_b, params, # params: AlignParams
gap_model="affine", # "linear" | "affine"
mode="global", # "global" | "local"
grad_mode="hard", # "hard" | "soft" | "none"
kernel="auto", # Viterbi backend, see "Kernel selection"
traceback="auto", # see "Traceback modes"
)
Persistent sequence-pair object. Sequences and alignment mode are fixed at
construction; the alignment parameters can be swapped cheaply via set_params().
The pair holds its AlignParams alive automatically, so you don't need to keep
a separate reference to it.
Methods:
| Method | Description |
|---|---|
alloc_dp() |
Pre-allocate own DP tables (needed before align_full() / realign_banded(); not needed if using SeqPairBatch.score_and_grad()). |
align_full() |
Full DP alignment. Sets score and guide_j; clears grad. |
realign_banded(bandwidth) |
Banded DP around the current path. Requires prior align_full(). Sets score; clears grad. |
compute_grad() |
Compute and cache the gradient from the current alignment. Requires align_full() or realign_banded() to have been called first. |
score_and_grad() |
Convenience: alloc_dp() + align_full() + compute_grad() in one call. Returns (score, grad). |
aligned() |
Return the alignment as a pair of gapped strings (seq_a, seq_b). Requires the DP tables (call before drop_dp()). |
formatted(width=60) |
Pretty-printed alignment block (seq A / match line / seq B), wrapped at width columns (0 = no wrap). |
set_params(params) |
Swap alignment parameters. Clears score and grad; preserves guide_j. |
drop_dp() |
Free O(m×n) DP table memory. Cached score, grad, and guide_j survive (but aligned() / compute_grad() then need a re-align). |
Properties:
| Property | Type | Description |
|---|---|---|
score |
float | None |
Alignment score (or log Z for soft), or None if not computed |
grad |
AlignParams | None |
Gradient, or None if not computed |
guide_j |
list[int] | None |
Alignment path (length m+1), or None if not computed |
seq_a, seq_b |
str |
The fixed sequences |
path_valid |
bool |
guide_j is usable as a banding guide |
score_valid |
bool |
score matches current matrix and path |
grad_valid |
bool |
grad is populated |
dp_valid |
bool |
DP tables are in memory (compute_grad() is callable) |
traceback |
str |
The traceback mode this pair resolved to (never "auto") |
hb_cutoff |
int |
Hirschberg base-case size in rows (settable; default 512) |
Gradient modes:
grad_mode |
score |
grad |
|---|---|---|
"hard" |
Viterbi alignment score | Substitution-pair counts (integer-valued subgradient) |
"soft" |
Log-partition function log Z |
Expected substitution counts (true gradient of log Z) |
"none" |
Viterbi alignment score | compute_grad() throws |
SeqPairBatch
nwgrad.SeqPairBatch(n_threads=0, traceback="auto")
n_threads=0 (default) uses the number of physical cores (falling back to
hardware_concurrency where that cannot be determined): the DP is stall-bound, so
SMT siblings contend and the logical count measured up to 1.44× slower. add() keeps each SeqPair (and, transitively, its AlignParams) alive for the lifetime of the batch.
Methods:
| Method | Returns | Description |
|---|---|---|
add(seq_pair) |
— | Append a SeqPair |
add_many(seqs_a, seqs_b, params, gap_model="affine", mode="global", grad_mode="hard", kernel="auto") |
— | Build N SeqPairs in C++ and append them — much faster than N add() calls. The pairs take the batch's traceback and hb_cutoff. |
set_params(params) |
— | Call set_params() on all pairs |
score_and_grad(bandwidth=0) |
float (sum of scores) |
Full-pipeline parallel alignment. Uses per-thread DP buffers (pair-owned tables are never allocated). If bandwidth > 0, runs a full DP for the guide path then a banded DP. Results are cached on each SeqPair. |
compute_grad() |
AlignParams |
Sum cached per-pair gradients. No DP work if all grad_valid are already true. |
scores() |
numpy.ndarray (float64) |
The cached per-pair scores, in pair order. Runs no DP; raises if any pair has no valid score. |
weighted_grad(weights) |
AlignParams |
sum_i weights[i] * grad_i over the cached per-pair gradients. weights is a 1-D numeric array with one entry per pair. Runs no DP; raises if any pair has no valid gradient. Summed in pair order, so the result does not depend on n_threads. |
align_full() |
float (sum of scores) |
Full DP on all pairs in parallel using pair-owned buffers. Call alloc_dp() first. |
realign_banded(bandwidth) |
float (sum of scores) |
Banded DP on all pairs in parallel using pair-owned buffers. |
banded_grad(bandwidth) |
float (sum of scores) |
Banded re-align + gradient around each pair's cached path, using per-thread buffers. Run score_and_grad() once to establish the paths, then set_params() + banded_grad(bw) after each update. |
alloc_dp() |
— | Pre-allocate pair-owned DP tables in parallel. |
drop_dp() |
— | Free pair-owned DP tables in parallel. |
The batch is also a sequence: len(batch) is the number of pairs and batch[i]
returns the i-th SeqPair (negative indices allowed), so per-pair results can be
read back without keeping a separate list.
Properties:
| Property | Type | Description |
|---|---|---|
n_threads |
int |
Thread count |
traceback |
str |
The batch's traceback mode as given ("auto" resolves per pair) |
hb_cutoff |
int |
Hirschberg base-case size applied by add_many() (default 512) |
schedule |
str |
"dynamic" (default; atomic counter) or "sorted" (length-sorted equal-work chunks — bounds peak DP memory). Results are identical either way. |
Typical optimization loop:
from nwgrad.matrices import BLOSUM62
# Learnable matrix starts from BLOSUM62; keep its alphabet to stay consistent.
alphabet = BLOSUM62.alphabet
mat_array = BLOSUM62.to_matrix()
# Build pairs once
params = nwgrad.AlignParams(nwgrad.SubstMatrix(mat_array, alphabet),
gap_open_a=11.0, gap_extend_a=1.0,
gap_open_b=11.0, gap_extend_b=1.0)
batch = nwgrad.SeqPairBatch(n_threads=8)
for a, b in zip(seqs_a, seqs_b):
batch.add(nwgrad.SeqPair(a, b, params,
gap_model="affine", mode="global", grad_mode="soft"))
for step in range(n_steps):
total_log_z = batch.score_and_grad(bandwidth=bw if step > 0 else 0)
grad = batch.compute_grad()
mat_array += lr * grad.matrix.to_matrix() # both in `alphabet` order
params = nwgrad.AlignParams(nwgrad.SubstMatrix(mat_array, alphabet),
gap_open_a=11.0, gap_extend_a=1.0,
gap_open_b=11.0, gap_extend_b=1.0)
batch.set_params(params)
BatchAligner
Stateless batch alignment: constructs a fresh DP buffer per call and does not preserve alignment paths across calls. Simpler API when you do not need to reuse paths for banded re-alignment.
nwgrad.BatchAligner(
params, # AlignParams — matrix and gap penalties together
band=0, # 0 = full DP; >0 = banded half-width
gap_model="affine", # "linear" | "affine"
mode="global", # "global" | "local"
grad_mode="hard", # "hard" | "soft" | "none"
n_threads=1,
kernel="auto", # Viterbi backend, see "Kernel selection"
)
.align(sequences_a, sequences_b, aligned_a=[], aligned_b=[]) -> BatchResult
Aligns each pair (sequences_a[i], sequences_b[i]). aligned_a / aligned_b, if
given, are gapped alignment strings (one per pair) used as banding guides.
BatchResult
| Attribute | Type | Description |
|---|---|---|
scores |
np.ndarray[N] float64 |
Score (or log-partition for soft) per pair |
grad |
AlignParams |
Gradient summed over all pairs |
Single-pair convenience functions
Stateless functions that create and destroy their DP tables on every call. Useful for one-off alignments; prefer SeqPair / SeqPairBatch for loops over many pairs or iterative optimization.
All twelve share the same signature — the gap penalties live in the AlignParams,
not in the argument list, so the linear and affine variants differ only in which of
its gap fields they read:
f(seq_a, seq_b, params, band=0, aligned_a="", aligned_b="", kernel="auto")
Each also exists with a _double suffix (nw_score_double, nw_affine_grad_double,
…) that runs the DP in float64 — see Precision.
band > 0 (or a non-empty aligned_a / aligned_b guide pair) runs a banded DP
instead of the full one. The sequences are plain str and are validated and
encoded against params's alphabet on the way in.
Score only — return float:
| Function | Gap model | Alignment |
|---|---|---|
nw_score |
Linear | Global (NW) |
sw_score |
Linear | Local (SW) |
nw_score_affine |
Affine | Global (NW) |
sw_score_affine |
Affine | Local (SW) |
Hard gradient — return (score: float, grad: AlignParams):
| Function | Gap model | Alignment |
|---|---|---|
nw_grad |
Linear | Global |
sw_grad |
Linear | Local |
nw_affine_grad |
Affine | Global |
sw_affine_grad |
Affine | Local |
Soft gradient — return (log_z: float, grad: AlignParams):
| Function | Gap model | Alignment |
|---|---|---|
nw_soft_grad |
Linear | Global |
sw_soft_grad |
Linear | Local |
nw_affine_soft_grad |
Affine | Global |
sw_affine_soft_grad |
Affine | Local |
(Note the naming is irregular: the affine score functions suffix _affine, while
the affine gradient functions infix it.)
score, grad = nwgrad.nw_affine_grad("PLEASANTLY", "MEANLY", params)
Precision
The plain names — SeqPair, SeqPairBatch, BatchAligner and the twelve
convenience functions — run the Viterbi DP in float32. The *Double classes
(SeqPairDouble, SeqPairBatchDouble, BatchAlignerDouble) and _double
functions run it in float64. Inputs and outputs are float64 either way
(AlignParams, scores, gradients); only the DP arithmetic differs. Over 400
protein pairs measured against a float64 reference, float32 scores deviated by up
to 8.4e-3 (mean 1.6e-3). The soft-gradient (forward-backward) path is float64 in both,
so the _double soft functions are identical to the plain ones.
The two precisions also have different traceback defaults (next section), so a float32 result and a float64 result are not bit-comparable even where the arithmetic would agree.
Traceback modes
SeqPair and SeqPairBatch take traceback=, fixed at construction. It decides
what the DP retains in order to recover the alignment path:
traceback |
Memory | Notes |
|---|---|---|
"pointers" |
3 B/cell | Records a predecessor byte per cell per state. |
"scores" |
12 B/cell | Keeps the score tables and re-derives the path. Bit-identical to "pointers", slower; for table introspection. |
"hirschberg" |
O(m+n) | Linear-space divide-and-conquer. Pairs no longer than hb_cutoff (default 512) never split and are bit-exact with "pointers"; longer pairs get an optimal path, but where alignments tie it may be a different optimal path (a different valid subgradient). Affine + full DP only (global or local). |
"hirschberg_pmax" |
O(m+n) | As "hirschberg", with the gap carry computed as a closed-form prefix max: 1.5–3.9× faster on related sequences. The only mode that can return a slightly suboptimal path — measured worst case 4.9e-4 at float32, below float32's own error. Bit-identical across ISA levels. |
"auto" (default) |
— | Affine + global + full DP: "hirschberg_pmax" at float32, "hirschberg" at float64. Everything else: "pointers". |
Asking explicitly for a Hirschberg mode on a linear-gap or banded problem raises;
"auto" falls back to "pointers" there instead. Local alignment supports
Hirschberg but "auto" keeps "pointers" for it, because local Hirschberg wins on
memory, not speed: select traceback="hirschberg" explicitly for very long local
pairs (e.g. >10k residues), where the pointer tables would not fit.
Kernel selection
kernel= picks the Viterbi backend: "auto" (default — the strongest SIMD level
the CPU runs), "scalar_fallback", or a named level: "sse2", "avx2", "avx512"
(x86) or "neon" (ARM). Every level is bit-exact with "scalar_fallback"
(same tables, paths and gradients), so this is purely a speed knob. An unknown
name, or a level this CPU cannot run, raises. It affects the Viterbi (hard / none)
path only; the linear gap model has no SIMD kernel, so any choice is a no-op there.
Module-level controls: nwgrad.simd_isa() reports the active level,
nwgrad.available_isa_levels() lists what this CPU runs, and
nwgrad.set_isa_level(name) (for testing; not thread-safe while work is in flight)
or the NWGRAD_ISA environment variable force the level that "auto" dispatches to. nwgrad.compiled_with() names the compiler the extension was built
with.
Gap penalty conventions
For linear gap model, a gap of length k costs gap_extend * k.
For affine gap model, a gap of length k costs gap_open + gap_extend * k.
This matches BioPython's convention where open is charged once per gap regardless of length.
Performance notes
- With
traceback="pointers", a hard-gradient alignment keeps 3 bytes per DP cell;"scores"keeps 12. The default for affine global alignment is Hirschberg, which keeps O(m+n) — so the per-thread buffer described below applies to the pointer modes and to the Hirschberg base case (≤hb_cutoffrows). SeqPairBatch.score_and_grad()allocates oneDpBufferper thread (sized to the largest sequence pair in the batch) and reuses it across all assigned pairs. Pair-owned DP tables are never allocated, keeping peak memory atn_threads × max(m×n)rather thanN × max(m×n).- Work is distributed via a shared
std::atomiccounter — no per-task mutex, no work-stealing queue. - Gradient accumulation is per-thread; a single mutex is taken once at join to merge partial gradients.
C++ header-only library
The C++ implementation is header-only (src/nwgrad/cpp/nwgrad/). To use it directly from C++:
python -m nwgrad --include
# prints: /path/to/nwgrad/cpp
Add that path to your include path and #include "nwgrad/aligner.hpp" etc.
Building from source
pip install scikit-build-core nanobind
pip install -e ".[dev]"
pytest tests/Python/
Python package builds compile only the extension. Direct CMake builds enable the
C++ tests and benchmarks by default; use -DNWGRAD_BUILD_TESTS=OFF and
-DNWGRAD_BUILD_BENCHMARKS=OFF to disable them.
C++ unit tests (requires CMake). The extension target does find_package(nanobind),
so even a tests-only configure needs nanobind discoverable:
cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug \
-Dnanobind_DIR="$(python -m nanobind --cmake_dir)"
cmake --build build
ctest --test-dir build
-DNWGRAD_SANITIZE=ON builds the C++ tests with AddressSanitizer and
UndefinedBehaviorSanitizer (-fno-sanitize-recover=all, so the first violation
fails the run rather than printing and carrying on). CI runs this under both GCC
and Clang.
License
MIT — see LICENSE.
Metadata
Release files for nwgrad 0.5.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 | |
|---|---|---|---|
| nwgrad-0.5.0.tar.gz | 140.3 kB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| nwgrad-0.5.0-cp315-cp315t-musllinux_1_2_x86_64.whl | CPython 3.15 | CPython 3.15 free-threading | Linux musl 1.2+ x86-64 | Details |
| nwgrad-0.5.0-cp315-cp315t-musllinux_1_2_aarch64.whl | CPython 3.15 | CPython 3.15 free-threading | Linux musl 1.2+ ARM64 | Details |
| nwgrad-0.5.0-cp315-cp315t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl | CPython 3.15 | CPython 3.15 free-threading | Linux glibc 2.28+ x86-64, Linux glibc 2.27+ x86-64 | Details |
| nwgrad-0.5.0-cp315-cp315t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl | CPython 3.15 | CPython 3.15 free-threading | Linux glibc 2.26+ ARM64, Linux glibc 2.28+ ARM64 | Details |
| nwgrad-0.5.0-cp315-cp315t-macosx_11_0_arm64.whl | CPython 3.15 | CPython 3.15 free-threading | macOS 11.0+ ARM64 | Details |
| nwgrad-0.5.0-cp315-cp315-musllinux_1_2_x86_64.whl | CPython 3.15 | CPython 3.15 | Linux musl 1.2+ x86-64 | Details |
| nwgrad-0.5.0-cp315-cp315-musllinux_1_2_aarch64.whl | CPython 3.15 | CPython 3.15 | Linux musl 1.2+ ARM64 | Details |
| nwgrad-0.5.0-cp315-cp315-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl | CPython 3.15 | CPython 3.15 | Linux glibc 2.27+ x86-64, Linux glibc 2.28+ x86-64 | Details |
| nwgrad-0.5.0-cp315-cp315-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl | CPython 3.15 | CPython 3.15 | Linux glibc 2.28+ ARM64, Linux glibc 2.26+ ARM64 | Details |
| nwgrad-0.5.0-cp315-cp315-macosx_11_0_arm64.whl | CPython 3.15 | CPython 3.15 | macOS 11.0+ ARM64 | Details |
| nwgrad-0.5.0-cp314-cp314t-musllinux_1_2_x86_64.whl | CPython 3.14 | CPython 3.14 free-threading | Linux musl 1.2+ x86-64 | Details |
| nwgrad-0.5.0-cp314-cp314t-musllinux_1_2_aarch64.whl | CPython 3.14 | CPython 3.14 free-threading | Linux musl 1.2+ ARM64 | Details |
| nwgrad-0.5.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl | CPython 3.14 | CPython 3.14 free-threading | Linux glibc 2.28+ x86-64, Linux glibc 2.27+ x86-64 | Details |
| nwgrad-0.5.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl | CPython 3.14 | CPython 3.14 free-threading | Linux glibc 2.26+ ARM64, Linux glibc 2.28+ ARM64 | Details |
| nwgrad-0.5.0-cp314-cp314t-macosx_11_0_arm64.whl | CPython 3.14 | CPython 3.14 free-threading | macOS 11.0+ ARM64 | Details |
| nwgrad-0.5.0-cp314-cp314-musllinux_1_2_x86_64.whl | CPython 3.14 | CPython 3.14 | Linux musl 1.2+ x86-64 | Details |
| nwgrad-0.5.0-cp314-cp314-musllinux_1_2_aarch64.whl | CPython 3.14 | CPython 3.14 | Linux musl 1.2+ ARM64 | Details |
| nwgrad-0.5.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl | CPython 3.14 | CPython 3.14 | Linux glibc 2.28+ x86-64, Linux glibc 2.27+ x86-64 | Details |
| nwgrad-0.5.0-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl | CPython 3.14 | CPython 3.14 | Linux glibc 2.26+ ARM64, Linux glibc 2.28+ ARM64 | Details |
| nwgrad-0.5.0-cp314-cp314-macosx_11_0_arm64.whl | CPython 3.14 | CPython 3.14 | macOS 11.0+ ARM64 | Details |
| nwgrad-0.5.0-cp313-cp313-musllinux_1_2_x86_64.whl | CPython 3.13 | CPython 3.13 | Linux musl 1.2+ x86-64 | Details |
| nwgrad-0.5.0-cp313-cp313-musllinux_1_2_aarch64.whl | CPython 3.13 | CPython 3.13 | Linux musl 1.2+ ARM64 | Details |
| nwgrad-0.5.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl | CPython 3.13 | CPython 3.13 | Linux glibc 2.27+ x86-64, Linux glibc 2.28+ x86-64 | Details |
| nwgrad-0.5.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl | CPython 3.13 | CPython 3.13 | Linux glibc 2.26+ ARM64, Linux glibc 2.28+ ARM64 | Details |
| nwgrad-0.5.0-cp313-cp313-macosx_11_0_arm64.whl | CPython 3.13 | CPython 3.13 | macOS 11.0+ ARM64 | Details |
| nwgrad-0.5.0-cp312-cp312-musllinux_1_2_x86_64.whl | CPython 3.12 | CPython 3.12 | Linux musl 1.2+ x86-64 | Details |
| nwgrad-0.5.0-cp312-cp312-musllinux_1_2_aarch64.whl | CPython 3.12 | CPython 3.12 | Linux musl 1.2+ ARM64 | Details |
| nwgrad-0.5.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl | CPython 3.12 | CPython 3.12 | Linux glibc 2.27+ x86-64, Linux glibc 2.28+ x86-64 | Details |
| nwgrad-0.5.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl | CPython 3.12 | CPython 3.12 | Linux glibc 2.26+ ARM64, Linux glibc 2.28+ ARM64 | Details |
| nwgrad-0.5.0-cp312-cp312-macosx_11_0_arm64.whl | CPython 3.12 | CPython 3.12 | macOS 11.0+ ARM64 | Details |
| nwgrad-0.5.0-cp311-cp311-musllinux_1_2_x86_64.whl | CPython 3.11 | CPython 3.11 | Linux musl 1.2+ x86-64 | Details |
| nwgrad-0.5.0-cp311-cp311-musllinux_1_2_aarch64.whl | CPython 3.11 | CPython 3.11 | Linux musl 1.2+ ARM64 | Details |
| nwgrad-0.5.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl | CPython 3.11 | CPython 3.11 | Linux glibc 2.28+ x86-64, Linux glibc 2.27+ x86-64 | Details |
| nwgrad-0.5.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl | CPython 3.11 | CPython 3.11 | Linux glibc 2.26+ ARM64, Linux glibc 2.28+ ARM64 | Details |
| nwgrad-0.5.0-cp311-cp311-macosx_11_0_arm64.whl | CPython 3.11 | CPython 3.11 | macOS 11.0+ ARM64 | Details |
| nwgrad-0.5.0-cp310-cp310-musllinux_1_2_x86_64.whl | CPython 3.10 | CPython 3.10 | Linux musl 1.2+ x86-64 | Details |
| nwgrad-0.5.0-cp310-cp310-musllinux_1_2_aarch64.whl | CPython 3.10 | CPython 3.10 | Linux musl 1.2+ ARM64 | Details |
| nwgrad-0.5.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl | CPython 3.10 | CPython 3.10 | Linux glibc 2.28+ x86-64, Linux glibc 2.27+ x86-64 | Details |
| nwgrad-0.5.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl | CPython 3.10 | CPython 3.10 | Linux glibc 2.26+ ARM64, Linux glibc 2.28+ ARM64 | Details |
| nwgrad-0.5.0-cp310-cp310-macosx_11_0_arm64.whl | CPython 3.10 | CPython 3.10 | macOS 11.0+ ARM64 | Details |
Total release size: 34.6 MB
Release files / nwgrad-0.5.0.tar.gz
| Download URL | nwgrad-0.5.0.tar.gz |
|---|---|
| Size | 140.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
82993a7c9ce98318d7c8a8c41869da88148c1689f43c578a6c54c4172e1e2187
|
|
BLAKE2b-256 checksum How to use checksums |
3d90a40d4fdb808367325e4402b8849d806da1d33e9c4c0603c6e08714b92302
|
| 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 1, 2026.
Transparency logRelease files / nwgrad-0.5.0-cp315-cp315t-musllinux_1_2_x86_64.whl
| Download URL | nwgrad-0.5.0-cp315-cp315t-musllinux_1_2_x86_64.whl |
|---|---|
| Size | 1.2 MB |
| Tags | CPython 3.15 CPython 3.15 free-threading Linux musl 1.2+ x86-64 |
|
SHA-256 checksum How to use checksums |
e5b53a9618b88f08b8939bca069e9bed95656368e14494554c8c7bf2d39717ed
|
|
BLAKE2b-256 checksum How to use checksums |
d5043bfd71d1ecff88e8acc01085e7c5fd92de2eba660a456787b25de816ad66
|
| 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 1, 2026.
Transparency logRelease files / nwgrad-0.5.0-cp315-cp315t-musllinux_1_2_aarch64.whl
| Download URL | nwgrad-0.5.0-cp315-cp315t-musllinux_1_2_aarch64.whl |
|---|---|
| Size | 1.0 MB |
| Tags | CPython 3.15 CPython 3.15 free-threading Linux musl 1.2+ ARM64 |
|
SHA-256 checksum How to use checksums |
4ed11c2a61d7450d5a524e2b8d5419f1ee677c359ada47d10770482296c95829
|
|
BLAKE2b-256 checksum How to use checksums |
e2bb8e6655f63e66f08a0c7f3d0d663ef9c498164cc168fda1c871a794814f44
|
| 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 1, 2026.
Transparency logRelease files / nwgrad-0.5.0-cp315-cp315t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | nwgrad-0.5.0-cp315-cp315t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 773.2 kB |
| Tags | CPython 3.15 CPython 3.15 free-threading Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
5be9e0f02b85ef71188e634107c7f38371415b244912eb524ef456b3c18b2988
|
|
BLAKE2b-256 checksum How to use checksums |
07e603f8690d718cf3ad849e1caaa6e10bcfbaff4f87ba4b15bed8cd28264d71
|
| 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 1, 2026.
Transparency logRelease files / nwgrad-0.5.0-cp315-cp315t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
| Download URL | nwgrad-0.5.0-cp315-cp315t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 589.3 kB |
| Tags | CPython 3.15 CPython 3.15 free-threading Linux glibc 2.26+ ARM64 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
e6461da34abf92e42525d5f43b1f9e38883987bd5ffcfd023518df6d30642186
|
|
BLAKE2b-256 checksum How to use checksums |
2715b644a1ab384be7e16346833ade51eb36965aa73f5ed065d44a679f1c95f0
|
| 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 1, 2026.
Transparency logRelease files / nwgrad-0.5.0-cp315-cp315t-macosx_11_0_arm64.whl
| Download URL | nwgrad-0.5.0-cp315-cp315t-macosx_11_0_arm64.whl |
|---|---|
| Size | 705.9 kB |
| Tags | CPython 3.15 CPython 3.15 free-threading macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
6604e27dc1424c7cb449bb843ebaa4cc318c625048b96ae7d93a308a363be300
|
|
BLAKE2b-256 checksum How to use checksums |
3117eed3582d6e5324d1f3179333c51ba24d1cc034a622060dd2ba04446d381d
|
| 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 1, 2026.
Transparency logRelease files / nwgrad-0.5.0-cp315-cp315-musllinux_1_2_x86_64.whl
| Download URL | nwgrad-0.5.0-cp315-cp315-musllinux_1_2_x86_64.whl |
|---|---|
| Size | 1.2 MB |
| Tags | CPython 3.15 Linux musl 1.2+ x86-64 |
|
SHA-256 checksum How to use checksums |
689cfba24ae753e8242f951fe0a59f7fae2d4da9b4daf76feef9bba772577bfb
|
|
BLAKE2b-256 checksum How to use checksums |
ef0b15f5917294fe54710bed7ff642c7cb1ec5594a42e5ccd83bee328042a18a
|
| 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 1, 2026.
Transparency logRelease files / nwgrad-0.5.0-cp315-cp315-musllinux_1_2_aarch64.whl
| Download URL | nwgrad-0.5.0-cp315-cp315-musllinux_1_2_aarch64.whl |
|---|---|
| Size | 1.0 MB |
| Tags | CPython 3.15 Linux musl 1.2+ ARM64 |
|
SHA-256 checksum How to use checksums |
27f3633aba8283d56c53b7373d238ef7b512a2bbf503e482ef4af3a999490c99
|
|
BLAKE2b-256 checksum How to use checksums |
cfc5e92d1ba43f29d0edc7f503757c86ba3432509c9fd746d7c8cecee594e83f
|
| 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 1, 2026.
Transparency logRelease files / nwgrad-0.5.0-cp315-cp315-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | nwgrad-0.5.0-cp315-cp315-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 771.2 kB |
| Tags | CPython 3.15 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
7f42b74764fd7f2eba599c3805c9952ddf63701542b3d89e7a79411d5b0cca89
|
|
BLAKE2b-256 checksum How to use checksums |
0ea7201119fb32ae7474b4580f51df0343f864d9ca5cfaca0b64aa2e0cdd9166
|
| 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 1, 2026.
Transparency logRelease files / nwgrad-0.5.0-cp315-cp315-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
| Download URL | nwgrad-0.5.0-cp315-cp315-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 586.5 kB |
| Tags | CPython 3.15 Linux glibc 2.26+ ARM64 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
68c749286a5049587be64fd2a7b177aa7037136aeb032c64f745471a0ba8d6e1
|
|
BLAKE2b-256 checksum How to use checksums |
051b2282a3843167c6c4e1380e1002756cc4776bb9adbf7addda72b9cd04aaef
|
| 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 1, 2026.
Transparency logRelease files / nwgrad-0.5.0-cp315-cp315-macosx_11_0_arm64.whl
| Download URL | nwgrad-0.5.0-cp315-cp315-macosx_11_0_arm64.whl |
|---|---|
| Size | 703.7 kB |
| Tags | CPython 3.15 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
dc8306030c8fcc6d228016419297062f3178fd603c955cc1dc639f7302c92f21
|
|
BLAKE2b-256 checksum How to use checksums |
25394baa8e585c12dcc6eaa66d7ca427875a9c26095d6edb48590b7d85b68fd6
|
| 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 1, 2026.
Transparency logRelease files / nwgrad-0.5.0-cp314-cp314t-musllinux_1_2_x86_64.whl
| Download URL | nwgrad-0.5.0-cp314-cp314t-musllinux_1_2_x86_64.whl |
|---|---|
| Size | 1.2 MB |
| Tags | CPython 3.14 CPython 3.14 free-threading Linux musl 1.2+ x86-64 |
|
SHA-256 checksum How to use checksums |
4f6da65d23d7b2a34aafe526bc6f0c0dca87907783e74965b914aad2053dc184
|
|
BLAKE2b-256 checksum How to use checksums |
2c71f0286a65bf56f8938d7e7e53ad94267e92c0028eecbd53fbff31c80136c3
|
| 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 1, 2026.
Transparency logRelease files / nwgrad-0.5.0-cp314-cp314t-musllinux_1_2_aarch64.whl
| Download URL | nwgrad-0.5.0-cp314-cp314t-musllinux_1_2_aarch64.whl |
|---|---|
| Size | 1.0 MB |
| Tags | CPython 3.14 CPython 3.14 free-threading Linux musl 1.2+ ARM64 |
|
SHA-256 checksum How to use checksums |
851a30a7c9869d95c03574326ffcdeb765b04719799367f259fc5ccd7b3a1a70
|
|
BLAKE2b-256 checksum How to use checksums |
13c5fb5b6787960eedc94b571da25a84a7ebdf69bd3ef1491bdf13ed77b4c1e5
|
| 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 1, 2026.
Transparency logRelease files / nwgrad-0.5.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | nwgrad-0.5.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 772.9 kB |
| Tags | CPython 3.14 CPython 3.14 free-threading Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
6e64bd460814fd258489cd4c35ff79dc3cf379e4acb8f50676ca535b31235aa0
|
|
BLAKE2b-256 checksum How to use checksums |
88eafc1acdaa779840b189ed53bd5a89341ccf482f1dc6b1d8f816ae3923662a
|
| 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 1, 2026.
Transparency logRelease files / nwgrad-0.5.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
| Download URL | nwgrad-0.5.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 589.1 kB |
| Tags | CPython 3.14 CPython 3.14 free-threading Linux glibc 2.26+ ARM64 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
294054a1ebe9d3f5d1eb349c4be0a8d36f0f81576dc0e8a2e64cd1b5ada0159b
|
|
BLAKE2b-256 checksum How to use checksums |
66883d26d57d056090b3c09440e996eaa59314223c48753580d88afe3d2713d5
|
| 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 1, 2026.
Transparency logRelease files / nwgrad-0.5.0-cp314-cp314t-macosx_11_0_arm64.whl
| Download URL | nwgrad-0.5.0-cp314-cp314t-macosx_11_0_arm64.whl |
|---|---|
| Size | 705.7 kB |
| Tags | CPython 3.14 CPython 3.14 free-threading macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
266ae896029f34c33f1c2fb2d29fd3e7ba3cde1d648b7d3c89dfee77727d4f23
|
|
BLAKE2b-256 checksum How to use checksums |
5c113ee2d84a3a575ea7215ed8bf7275da50ebfc1ed8e2b2783f00d637f5fabf
|
| 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 1, 2026.
Transparency logRelease files / nwgrad-0.5.0-cp314-cp314-musllinux_1_2_x86_64.whl
| Download URL | nwgrad-0.5.0-cp314-cp314-musllinux_1_2_x86_64.whl |
|---|---|
| Size | 1.2 MB |
| Tags | CPython 3.14 Linux musl 1.2+ x86-64 |
|
SHA-256 checksum How to use checksums |
6a0db5e818b793261d30261b237e68e9528e67e6bda4983affbaec84637db8d5
|
|
BLAKE2b-256 checksum How to use checksums |
b1db7a3130497a869211867d2a1220c8f4e4f0fc08555edb09a16e506c7f3cc4
|
| 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 1, 2026.
Transparency logRelease files / nwgrad-0.5.0-cp314-cp314-musllinux_1_2_aarch64.whl
| Download URL | nwgrad-0.5.0-cp314-cp314-musllinux_1_2_aarch64.whl |
|---|---|
| Size | 1.0 MB |
| Tags | CPython 3.14 Linux musl 1.2+ ARM64 |
|
SHA-256 checksum How to use checksums |
75420a4a165305f9512310d420fccc9c4b9d47913a65b207cc03e72cd158db3a
|
|
BLAKE2b-256 checksum How to use checksums |
ca9a4eaab57a012c2e62d11a8495d45014782c867a9a5721ce6cb2c7cc816dab
|
| 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 1, 2026.
Transparency logRelease files / nwgrad-0.5.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | nwgrad-0.5.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 771.0 kB |
| Tags | CPython 3.14 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
7dfffc4864c6389738d717fe28cb2bf421ca4ade97b8aff50953d585dd3beba3
|
|
BLAKE2b-256 checksum How to use checksums |
2ded194da25d4e06faceb8065980a24a0476e283f990d600bf4941c63ca752a5
|
| 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 1, 2026.
Transparency logRelease files / nwgrad-0.5.0-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
| Download URL | nwgrad-0.5.0-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 586.4 kB |
| Tags | CPython 3.14 Linux glibc 2.26+ ARM64 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
c9957ae090d85538b9f28afefc1075760482ba65686802de0464ce7684df8d61
|
|
BLAKE2b-256 checksum How to use checksums |
c92c1b5b037f63d1bd07481f19e7da3ed561599b37d3146ec57073f31c6825cc
|
| 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 1, 2026.
Transparency logRelease files / nwgrad-0.5.0-cp314-cp314-macosx_11_0_arm64.whl
| Download URL | nwgrad-0.5.0-cp314-cp314-macosx_11_0_arm64.whl |
|---|---|
| Size | 703.5 kB |
| Tags | CPython 3.14 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
89ae67d26bf3872ef8f5169f9376b3665c428008fa3df232a67b8f62e34c5d3e
|
|
BLAKE2b-256 checksum How to use checksums |
db5b2f06d5435060f2e15b17b7fcec179f987d05d1ec8665e022f162dd260167
|
| 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 1, 2026.
Transparency logRelease files / nwgrad-0.5.0-cp313-cp313-musllinux_1_2_x86_64.whl
| Download URL | nwgrad-0.5.0-cp313-cp313-musllinux_1_2_x86_64.whl |
|---|---|
| Size | 1.2 MB |
| Tags | CPython 3.13 Linux musl 1.2+ x86-64 |
|
SHA-256 checksum How to use checksums |
7888a11f3149161cb083e5ad0bfed9b813b38c776f1fbe132f6c9d71c96f7235
|
|
BLAKE2b-256 checksum How to use checksums |
0ad65bf14b7427d36eec7736712b9195f5e2c19275d1d38d468e2bcff051874d
|
| 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 1, 2026.
Transparency logRelease files / nwgrad-0.5.0-cp313-cp313-musllinux_1_2_aarch64.whl
| Download URL | nwgrad-0.5.0-cp313-cp313-musllinux_1_2_aarch64.whl |
|---|---|
| Size | 1.0 MB |
| Tags | CPython 3.13 Linux musl 1.2+ ARM64 |
|
SHA-256 checksum How to use checksums |
b50b50aee49392f903a445d87bed71a2271213d2629e2aac361340f7c6391590
|
|
BLAKE2b-256 checksum How to use checksums |
7e1452fa30a59d54ffcf1b215d29ac93f4b976ef5b2c9eac93c55a1846d342f8
|
| 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 1, 2026.
Transparency logRelease files / nwgrad-0.5.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | nwgrad-0.5.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 770.7 kB |
| Tags | CPython 3.13 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
16127fde63d505bdd94307a23d69df73408cbaec314e8bc48339e7cc7a61482e
|
|
BLAKE2b-256 checksum How to use checksums |
1df31e48127cf5a61d603438a7b5e36937b97c8422081b12b7f3bb27538ff91a
|
| 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 1, 2026.
Transparency logRelease files / nwgrad-0.5.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
| Download URL | nwgrad-0.5.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 586.2 kB |
| Tags | CPython 3.13 Linux glibc 2.26+ ARM64 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
cca34c73316cfebf6b62dd70d80d9928521a731ef671a019139ea541f68b11e8
|
|
BLAKE2b-256 checksum How to use checksums |
4d37c387f078f16fb80bc487d583f720700a509290f4b091a765455c9fac8f72
|
| 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 1, 2026.
Transparency logRelease files / nwgrad-0.5.0-cp313-cp313-macosx_11_0_arm64.whl
| Download URL | nwgrad-0.5.0-cp313-cp313-macosx_11_0_arm64.whl |
|---|---|
| Size | 703.4 kB |
| Tags | CPython 3.13 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
f735805769e4c396180623421ab69d818aec697fe7218718eafa51a09889309f
|
|
BLAKE2b-256 checksum How to use checksums |
978d316908814d302ea9f88ba5b80e703bb4ef31238fd755526b7eb13443b039
|
| 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 1, 2026.
Transparency logRelease files / nwgrad-0.5.0-cp312-cp312-musllinux_1_2_x86_64.whl
| Download URL | nwgrad-0.5.0-cp312-cp312-musllinux_1_2_x86_64.whl |
|---|---|
| Size | 1.2 MB |
| Tags | CPython 3.12 Linux musl 1.2+ x86-64 |
|
SHA-256 checksum How to use checksums |
1b9e13bb2a195c41e8241cb7009af0f79e449d4a9ccbc1e38037f2e5fc4ae758
|
|
BLAKE2b-256 checksum How to use checksums |
f79157bd756d10b023dc94557e37267d08da21d3d815af93da3efd1b7fc8b814
|
| 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 1, 2026.
Transparency logRelease files / nwgrad-0.5.0-cp312-cp312-musllinux_1_2_aarch64.whl
| Download URL | nwgrad-0.5.0-cp312-cp312-musllinux_1_2_aarch64.whl |
|---|---|
| Size | 1.0 MB |
| Tags | CPython 3.12 Linux musl 1.2+ ARM64 |
|
SHA-256 checksum How to use checksums |
8e1786b63d9ca5855e41b4d47af5b253f7fa9509d68b54df88eb615e8f362bc8
|
|
BLAKE2b-256 checksum How to use checksums |
5786164d8d0ccfc2ec7a56ad6d6d9e3fb4cb25c68c9ee91389893264b9c74003
|
| 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 1, 2026.
Transparency logRelease files / nwgrad-0.5.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | nwgrad-0.5.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 770.8 kB |
| Tags | CPython 3.12 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
0987bd374a9442f55df629709b892ef5e8f92936fd608b823beabaebb8831a94
|
|
BLAKE2b-256 checksum How to use checksums |
1d19cd4decac986b8606fb49d9f102ea298d5fa294ce5a96d0dbf82845524c43
|
| 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 1, 2026.
Transparency logRelease files / nwgrad-0.5.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
| Download URL | nwgrad-0.5.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 586.2 kB |
| Tags | CPython 3.12 Linux glibc 2.26+ ARM64 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
8fae6bf038ee7a2eb4523957bb23ecf7a2f8f37a98520f032918560cecc19dd1
|
|
BLAKE2b-256 checksum How to use checksums |
391ff3700733b6c514b640a9039dc67bafded1f14c9c099bcb9266a004d1a89b
|
| 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 1, 2026.
Transparency logRelease files / nwgrad-0.5.0-cp312-cp312-macosx_11_0_arm64.whl
| Download URL | nwgrad-0.5.0-cp312-cp312-macosx_11_0_arm64.whl |
|---|---|
| Size | 703.4 kB |
| Tags | CPython 3.12 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
659b6021c3c73b85fe51688b051110c40b859a0f4c8a54c1bb8d0ab5d9109372
|
|
BLAKE2b-256 checksum How to use checksums |
a3ecd5c3f1dd7a9e2c73d680306fbcef3a44b111034ad5c01b188fec0113106c
|
| 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 1, 2026.
Transparency logRelease files / nwgrad-0.5.0-cp311-cp311-musllinux_1_2_x86_64.whl
| Download URL | nwgrad-0.5.0-cp311-cp311-musllinux_1_2_x86_64.whl |
|---|---|
| Size | 1.2 MB |
| Tags | CPython 3.11 Linux musl 1.2+ x86-64 |
|
SHA-256 checksum How to use checksums |
39f3253d9bd38de795f60b3bb807efbbe469f83e20e047180f9c97a256209f9a
|
|
BLAKE2b-256 checksum How to use checksums |
c517b9984bee82a751d354918c014af4402c10d19e7db955183d8829a5d9134d
|
| 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 1, 2026.
Transparency logRelease files / nwgrad-0.5.0-cp311-cp311-musllinux_1_2_aarch64.whl
| Download URL | nwgrad-0.5.0-cp311-cp311-musllinux_1_2_aarch64.whl |
|---|---|
| Size | 1.0 MB |
| Tags | CPython 3.11 Linux musl 1.2+ ARM64 |
|
SHA-256 checksum How to use checksums |
f83b2ff879e63edb827bd79a7a184ba3dfa92bf62b46af127619a09aa8199f92
|
|
BLAKE2b-256 checksum How to use checksums |
64f03bd21214e540de016e8e5c4d10b5fbe49425cc804ecd5fc7e0a9a1e3df40
|
| 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 1, 2026.
Transparency logRelease files / nwgrad-0.5.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | nwgrad-0.5.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 773.2 kB |
| Tags | CPython 3.11 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
aa81aa73bdcd669296a049f49568b3d0d8665f2addf4384c68d603b66218f7d4
|
|
BLAKE2b-256 checksum How to use checksums |
da7afcb2a91237965764d861ac45a39cb135adc7f82e044ded886cef1e24f80a
|
| 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 1, 2026.
Transparency logRelease files / nwgrad-0.5.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
| Download URL | nwgrad-0.5.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 588.1 kB |
| Tags | CPython 3.11 Linux glibc 2.26+ ARM64 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
1b04fc33f36352e164d4644abf806347f00476c32bbc6eb822db4d9515fca746
|
|
BLAKE2b-256 checksum How to use checksums |
cc5ab98789f5a40f05c3d11c4228c429230386240557d219e7c5f4afd31505a2
|
| 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 1, 2026.
Transparency logRelease files / nwgrad-0.5.0-cp311-cp311-macosx_11_0_arm64.whl
| Download URL | nwgrad-0.5.0-cp311-cp311-macosx_11_0_arm64.whl |
|---|---|
| Size | 703.5 kB |
| Tags | CPython 3.11 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
6d675f08c62136efbbeae3d6366b6f25a63cd57d44903ac103366218e2694838
|
|
BLAKE2b-256 checksum How to use checksums |
969fac76ebed9af426cacc6140a5137099ec84af28f2a45b9e5fcdc8893df597
|
| 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 1, 2026.
Transparency logRelease files / nwgrad-0.5.0-cp310-cp310-musllinux_1_2_x86_64.whl
| Download URL | nwgrad-0.5.0-cp310-cp310-musllinux_1_2_x86_64.whl |
|---|---|
| Size | 1.2 MB |
| Tags | CPython 3.10 Linux musl 1.2+ x86-64 |
|
SHA-256 checksum How to use checksums |
b87e664f25a3377203d5dd27381b32baff6f5c951feab22c815a1ec21c83f7d6
|
|
BLAKE2b-256 checksum How to use checksums |
f8fefdf78fa40ca8c63313984aa682960a767c8667660f184136c9b1195128d1
|
| 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 1, 2026.
Transparency logRelease files / nwgrad-0.5.0-cp310-cp310-musllinux_1_2_aarch64.whl
| Download URL | nwgrad-0.5.0-cp310-cp310-musllinux_1_2_aarch64.whl |
|---|---|
| Size | 1.0 MB |
| Tags | CPython 3.10 Linux musl 1.2+ ARM64 |
|
SHA-256 checksum How to use checksums |
220cfe777007fc16957d2c6ad3178ace220da50622747f3b9ae75e2e06b00779
|
|
BLAKE2b-256 checksum How to use checksums |
734e1bc4c6116dd0c50638f18d2b511fd678faf219f20ebef004fa609b32f651
|
| 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 1, 2026.
Transparency logRelease files / nwgrad-0.5.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | nwgrad-0.5.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 773.6 kB |
| Tags | CPython 3.10 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
0ff90e067b2ffa2687af77fefd71b35801275a16a9ff7c36eff35ee4f6888bd9
|
|
BLAKE2b-256 checksum How to use checksums |
3f072ea30cb0c5a825d0640384079dda745884642e42b5294241f6eee196200b
|
| 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 1, 2026.
Transparency logRelease files / nwgrad-0.5.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
| Download URL | nwgrad-0.5.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 588.6 kB |
| Tags | CPython 3.10 Linux glibc 2.26+ ARM64 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
01c53ba91e7e2b4998b90fb372f2ddcf3592a9d467116e06c6511bcd5794b5fa
|
|
BLAKE2b-256 checksum How to use checksums |
2d42f2e2cf67da29fb84d0f18c49030a81cbfa84b9ab5632f5978293ca964811
|
| 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 1, 2026.
Transparency logRelease files / nwgrad-0.5.0-cp310-cp310-macosx_11_0_arm64.whl
| Download URL | nwgrad-0.5.0-cp310-cp310-macosx_11_0_arm64.whl |
|---|---|
| Size | 703.9 kB |
| Tags | CPython 3.10 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
762758b39d6d6f7647574ad551fd82f95d52d7969d7ccb73dd1b7841f1a02c3c
|
|
BLAKE2b-256 checksum How to use checksums |
393e5dfc22c1296a756f0d640453179ec2e165527b287378f470883bde3483b6
|
| 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 1, 2026.
Transparency log