waveformrs for Python
Python bindings of the Rust crate waveformrs (the parent directory; see its
CHANGELOG.md and report/), gravitational-wave models that
reproduce LALSimulation 6.2.0 to rounding: TaylorF2, IMRPhenomD, IMRPhenomXAS,
IMRPhenomXHM, IMRPhenomXP, IMRPhenomXPHM and IMRPhenomXPNR in the frequency
domain, the binary-neutron-star models IMRPhenomD_NRTidalv2,
IMRPhenomXAS_NRTidalv2/v3 and IMRPhenomXP_NRTidalv2/v3, and NRSur7dq4 in the
time domain, named as in LALSimulation.
The bindings use PyO3 and rust-numpy. Every function releases the GIL while it computes and returns numpy arrays; the batch functions spread many binaries over threads and write straight into numpy-owned memory.
Installation
Wheels for Linux and macOS, for CPython 3.10 and later and free-threaded CPython 3.14 and later, are on PyPI:
pip install waveformrs
To build from source, from this directory (python/), in the environment where the package should
go (a virtualenv or an activated conda environment; for an environment that
is not activated, set CONDA_PREFIX to it):
pip install maturin # >= 1.14.1
maturin develop --release # build and install in editable mode
maturin build --release builds a wheel into target/wheels/ instead, and
pip install . builds and installs one in a step. The package needs CPython
3.10 or later. The extension is built against Python's stable ABI (abi3),
so one wheel serves CPython 3.10 and later on a platform.
Free-threaded CPython (3.14t and later) is supported: the extension declares
that it does not need the GIL, so importing it leaves the GIL disabled, and
waveforms can be computed from several threads at once. Free-threaded 3.15
and later share one wheel per platform (the free-threaded stable ABI,
abi3t); 3.14t has a wheel of its own. (PyO3 0.30 does not support
free-threaded 3.13.)
For this repository's development environment:
cd python
CONDA_PREFIX=/Users/colmtalbot/mambaforge/envs/waveformrs \
/Users/colmtalbot/mambaforge/envs/waveformrs/bin/maturin develop --release
Usage
import numpy as np
import waveformrs as wf
wf.approximants()
# ['TaylorF2', 'IMRPhenomD', 'IMRPhenomXAS', 'IMRPhenomXHM', 'IMRPhenomXP',
# 'IMRPhenomXPHM', 'IMRPhenomXPNR', 'NRSur7dq4', 'IMRPhenomD_NRTidalv2',
# 'IMRPhenomXAS_NRTidalv2', 'IMRPhenomXAS_NRTidalv3', 'IMRPhenomXP_NRTidalv2',
# 'IMRPhenomXP_NRTidalv3']
binary = dict(
mass_1=36.0, # solar masses
mass_2=29.0,
spin_1=(0.4, 0.2, 0.3), # dimensionless (x, y, z) at f_ref, L along z
spin_2=(-0.2, 0.3, -0.1),
luminosity_distance=500.0, # Mpc
inclination=0.7, # rad
phi_ref=1.2, # orbital reference phase, rad
f_ref=20.0, # Hz (0: LAL's default of the model)
)
# SimInspiralChooseFDWaveformSequence
frequencies = np.linspace(20.0, 1024.0, 8033)
hplus, hcross = wf.polarizations("IMRPhenomXPHM", frequencies, **binary, precession_version=223)
The binary is given by keyword arguments with the names of the Rust Binary:
mass_1 and mass_2 are required; the spins default to zero, the distance
to 1 Mpc, the angles and f_ref to zero. f_ref = 0 selects LAL's default
reference frequency of each model (the first frequency for the IMRPhenom
models, coalescence for TaylorF2).
Options
The settings of LAL's LALDict are WaveformOptions, given as keyword
arguments of any waveform function or as an object (options=); keywords
override the object.
| option | meaning | default |
|---|---|---|
precession_version |
Euler angles of IMRPhenomXP/XPHM, LAL's PhenomXPrecVersion: 102 ("NNLO"), 223 ("MSA"), 320 ("SpinTaylor") |
320 |
mode_array |
LAL's ModeArray: [(l, m), ...], or None for all modes |
None |
version_fallback |
whether IMRPhenomXP/XPHM/XPNR may change the precession version as LAL does; False raises PrecessionVersionUnavailableError instead |
True |
lambda_1, lambda_2 |
LAL's lambda1, lambda2: the dimensionless tidal deformabilities of the bodies of mass_1 and mass_2, for the NRTidal approximants (the others reject non-zero values) |
0.0 |
options = wf.WaveformOptions(precession_version="MSA", mode_array=[(2, 2), (3, 3)])
hp, hc = wf.polarizations("IMRPhenomXPHM", frequencies, **binary, options=options)
hp, hc = wf.polarizations("IMRPhenomXPHM", frequencies, **binary, options=options, version_fallback=False)
wf.WaveformOptions.lalsimulation_defaults() # LAL 6.2.0 with an empty LALDict: MSA angles
options.replace(mode_array=None) # a changed copy
options.as_dict() # {'precession_version': 223, ...}
Note that the default precession version is the crate's (SpinTaylor, 320),
not LAL 6.2.0's (MSA, 223), and that LAL's multibanding is not implemented:
the models reproduce LAL with PhenomXHMThresholdMband = PhenomXPHMThresholdMband = 0.
Frequency grids
For many waveforms on the same frequencies, a FrequencyGrid precomputes the
powers of the frequency that the models need. The grid paths agree with
polarizations to about 1e-13 relative rather than bit for bit.
grid = wf.FrequencyGrid.uniform(20.0, 1024.0, 0.125) # or wf.FrequencyGrid(frequencies)
aligned = dict(binary, spin_1=(0.0, 0.0, 0.3), spin_2=(0.0, 0.0, -0.1)) # XAS takes aligned spins only
hp, hc = wf.polarizations_on_grid("IMRPhenomXAS", grid, **aligned)
grid.frequencies, len(grid)
Modes
modes returns the modes h_lm without the spherical harmonics at +f and
-f, in the conventions of SimInspiralChooseFDModes, and choose_fd_modes
reproduces SimInspiralChooseFDModes itself (IMRPhenomXHM, IMRPhenomXPHM,
IMRPhenomXPNR) on its uniform grid. Both return a FrequencyModes, laid out
as LAL's SphHarmFrequencySeries: each mode on the two-sided frequencies
-f[::-1], f (with f = 0 once).
two_sided, hlm = wf.modes("IMRPhenomXHM", np.linspace(20.0, 512.0, 1000), mass_1=30.0, mass_2=20.0)
hlm[2, -2] # h_{2,-2} on the frequencies two_sided
result = wf.choose_fd_modes("IMRPhenomXPHM", 0.25, 20.0, 1024.0, **binary)
result.frequencies, result.modes, result.theta, result.phi, result.polarization_angle
hp, hc = result.polarizations() # summed with the spherical harmonics (edit result.modes to leave modes out)
Time domain and conversions
NRSur7dq4 needs its data file NRSur7dq4_v1.0.h5 (zenodo.org/records/14999310):
set NRSUR7DQ4_DATA to the file or LAL_DATA_PATH to its directory before
the first call (wf.nrsur7dq4_data_file() shows what is found).
# SimInspiralChooseTDWaveform (also for the frequency-domain models but TaylorF2,
# through XLALSimInspiralTDFromFD as in LAL)
h = wf.td_polarizations("NRSur7dq4", 1 / 4096, 20.0, **binary)
hplus, hcross = h
h.epoch, h.delta_t, h.times # first sample (s, relative to the peak), sampling, sample times
modes = wf.td_modes("NRSur7dq4", 1 / 4096, 20.0, **binary) # SimInspiralChooseTDModes
times, hlm = modes
# SimInspiralTD and SimInspiralFD: conditioned waveforms of any approximant
td = wf.simulate_td("IMRPhenomXPHM", 1 / 4096, 20.0, **binary)
fd = wf.simulate_fd("NRSur7dq4", 0.0, 20.0, 2048.0, **binary) # delta_f = 0: automatic
fd.hplus, fd.frequencies, fd.delta_f, fd.epoch
td_polarizations keeps an NRSur7dq4 workspace per thread: repeated calls
allocate nothing, and calls that change only the inclination, phase, distance
or sampling skip the surrogate evaluation.
Batches
batch_polarizations evaluates many binaries on one grid and returns
(n_binaries, n_frequencies) arrays. The binaries are a dict of arrays (or
scalars, broadcast), a numpy structured array, a pandas DataFrame or an
(n, 12) table (wf.parameter_table); the spins are (n, 3) arrays or their
components spin_1x, spin_1y, ... The results do not depend on threads
(0 for all cores) and each row equals the single polarizations_on_grid
call (exact=True: the single polarizations call) bit for bit.
n = 1000
rng = np.random.default_rng(1)
parameters = dict(
mass_1=rng.uniform(20, 50, n),
mass_2=rng.uniform(10, 20, n),
spin_1=rng.uniform(-0.5, 0.5, (n, 3)),
spin_2=rng.uniform(-0.5, 0.5, (n, 3)),
luminosity_distance=400.0,
inclination=rng.uniform(0, np.pi, n),
phi_ref=0.0,
f_ref=20.0,
)
result = wf.batch_polarizations("IMRPhenomXPHM", grid, parameters, threads=8)
hplus, hcross = result # complex128, (1000, 8033)
result.ok # False for the binaries that failed (their rows are zero)
result.errors # {index: exception}
wf.batch_polarizations("IMRPhenomXPHM", grid, parameters, strict=True) # raise the first error
# NRSur7dq4 (or any approximant) in the time domain: one workspace per thread
heavy = dict(parameters, mass_1=rng.uniform(50, 70, n), mass_2=rng.uniform(25, 35, n))
td = wf.batch_td_polarizations("NRSur7dq4", 1 / 4096, 20.0, heavy, threads=8)
td[0].hplus, td[0].epoch, td.ok, td.errors # td[i] is None where td.ok[i] is False
Python threads also run in parallel, since the GIL is released:
from concurrent.futures import ThreadPoolExecutor
with ThreadPoolExecutor(4) as pool:
waveforms = list(pool.map(lambda m: wf.polarizations("IMRPhenomXHM", frequencies, mass_1=m, mass_2=20.0),
np.linspace(20, 60, 100)))
Errors
The crate's errors are raised as subclasses of waveformrs.WaveformError
(in waveformrs.exceptions) that also derive from the matching built-in
exception:
| exception | built-in base | raised for |
|---|---|---|
InvalidParameterError |
ValueError |
parameters LAL rejects (masses, spins, frequencies, in-plane spins for an aligned-spin model, mode arrays, sampling) |
UnsupportedError |
ValueError |
requests the approximant does not support (a mode array for a (2,2) model, ChooseFDModes for IMRPhenomD, ...) |
UnknownApproximantError |
ValueError |
names that are not approximants (case-sensitive, as LAL) |
ModelError |
RuntimeError |
failures of the model (SpinTaylor or PNR angles, NRSur7dq4) |
PrecessionVersionUnavailableError |
RuntimeError (via ModelError) |
version_fallback=False and the requested angles cannot be used |
DataFileError, DataFileNotFoundError |
OSError, FileNotFoundError |
the NRSur7dq4 data |
Missing or unknown keyword arguments raise TypeError.
Reference
| function | LALSimulation | returns |
|---|---|---|
polarizations(approximant, frequencies, **binary) |
SimInspiralChooseFDWaveformSequence |
(hplus, hcross) |
polarizations_on_grid(approximant, grid, **binary) |
(fast grid paths) | (hplus, hcross) |
modes(approximant, frequencies, **binary) |
conventions of SimInspiralChooseFDModes |
FrequencyModes |
choose_fd_modes(approximant, delta_f, f_min, f_max, **binary) |
SimInspiralChooseFDModes |
FrequencyModes |
td_polarizations(approximant, delta_t, f_min, **binary) |
SimInspiralChooseTDWaveform |
TimeSeriesPolarizations |
td_modes(approximant, delta_t, f_min, **binary) |
SimInspiralChooseTDModes (NRSur7dq4) |
TimeSeriesModes |
simulate_td(approximant, delta_t, f_min, **binary) |
SimInspiralTD |
TimeSeriesPolarizations |
simulate_fd(approximant, delta_f, f_min, f_max, **binary) |
SimInspiralFD |
FrequencySeriesPolarizations |
batch_polarizations(approximant, grid, parameters, threads=1, strict=False, exact=False) |
BatchPolarizations |
|
batch_td_polarizations(approximant, delta_t, f_min, parameters, threads=1, strict=False) |
BatchTimeSeries |
The result classes unpack like tuples of their main arrays (hplus, hcross = ..., frequencies, modes = ..., times, modes = ...) and keep the sampling
metadata as attributes. Docstrings and the type stub _waveformrs.pyi give
the details.
Tests
The tests compare with lalsimulation's Python API (python-lalsimulation 6.2.0), at the crate's tolerances: a relative error (max |difference| / max |LAL|) of 1e-10 for TaylorF2 and IMRPhenomD and 1e-9 for the IMRPhenomX models, and a mismatch of 1e-12, on macOS arm64; elsewhere the crate's cross-build tolerances. They also check that batches do not depend on the number of threads and equal the single calls, the exceptions, and that the GIL is released.
cd python
OMP_NUM_THREADS=1 NRSUR7DQ4_DATA=/path/to/NRSur7dq4_v1.0.h5 python -m pytest tests
The NRSur7dq4 tests are skipped without the data (found through
NRSUR7DQ4_DATA, LAL_DATA_PATH or ../lal_data/); the comparisons with LAL
are skipped without lalsimulation. LAL runs with OMP_NUM_THREADS=1 (the tests
set it), since the OpenMP loop of IMRPhenomXP races in the MSA and PNR angles.
Benchmark
benchmarks/benchmark.py compares the Python-level call overhead and the
throughput with lalsimulation's Python API, single-threaded and batched:
OMP_NUM_THREADS=1 NRSUR7DQ4_DATA=... LAL_DATA_PATH=... python benchmarks/benchmark.py [--quick] [--json out.json]
Indicative results (Apple M2 Ultra, 24 cores, with other jobs running; lalsimulation 6.2.0 single-threaded with multibanding off; median of 7 runs):
| call overhead, 4 frequencies | waveformrs | lalsimulation |
|---|---|---|
| TaylorF2 | 1.9 µs | 2.7 µs |
| IMRPhenomD | 2.3 µs | 45 µs |
| IMRPhenomXAS | 2.9 µs | 6.6 µs |
| one waveform, 8033 frequencies, one thread | polarizations |
polarizations_on_grid |
lalsimulation | speed-up |
|---|---|---|---|---|
| TaylorF2 | 154 µs | 52 µs | 335 µs | 2.2× |
| IMRPhenomD | 193 µs | 117 µs | 500 µs | 2.6× |
| IMRPhenomXAS | 257 µs | 141 µs | 471 µs | 1.8× |
| IMRPhenomXHM | 1.46 ms | 1.03 ms | 2.50 ms | 1.7× |
| IMRPhenomXP (320) | 1.12 ms | 0.72 ms | 3.12 ms | 2.8× |
| IMRPhenomXPHM (102) | 3.68 ms | 1.25 ms | 7.90 ms | 2.1× |
| IMRPhenomXPHM (223) | 9.13 ms | 3.90 ms | 15.7 ms | 1.7× |
| IMRPhenomXPHM (320) | 4.83 ms | 2.46 ms | 11.1 ms | 2.3× |
| NRSur7dq4 (time domain, 4096 Hz from 20 Hz) | 1.00 ms | – | 5.67 ms | 5.7× |
| batch of 64, waveforms per second | lalsimulation loop | 1 thread | 4 threads | 8 threads | 24 threads |
|---|---|---|---|---|---|
| IMRPhenomXAS | 2,034 | 6,491 | 18,235 | 25,111 | 32,823 |
| IMRPhenomXHM | 401 | 939 | 3,220 | 6,174 | 10,612 |
| IMRPhenomXPHM (223) | 64 | 265 | 938 | 1,837 | 3,582 |
| IMRPhenomXPHM (320) | 88 | 406 | 1,444 | 2,776 | 5,094 |
| NRSur7dq4 (time domain) | 170 | 994 | 3,645 | 6,790 | 13,100 |
The speed-ups are those of the Rust models (see the crate's report); the Python layer adds about 2 µs per call. A batch on one thread is faster than single calls because it uses the grid paths.
Layout
Cargo.toml: the extension cratewaveformrs-python(library_waveformrs), depending on the crate withwaveformrs = { path = ".." }(the root is not a workspace), PyO3 0.30 withabi3-py310andabi3t-py315, and numpy 0.30, built withlto = "fat"as the crate recommends.src/: the bindings (lib.rsfunctions andFrequencyGrid,params.rskeyword arguments andWaveformOptions,batch.rs,results.rs,errors.rs,models.rs).python/waveformrs/: the Python package (__init__.py, the exceptions, the batch helpers, the stub_waveformrs.pyiandpy.typed); maturin puts the extension modulewaveformrs/_waveformrs*.sonext to them.tests/,benchmarks/.
A new option of the crate's WaveformOptions is bound by an arm of
apply_option and an entry of option_items in src/params.rs (plus a
getter and a line of the stub).
Metadata
Release files for waveformrs 0.2.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 | Provenance | |
|---|---|---|---|---|
| waveformrs-0.2.0.tar.gz | 607.2 kB | With provenance | Details |
Built distributions (wheels)
Total release size: 16.3 MB
Release files / waveformrs-0.2.0.tar.gz
| Download URL | waveformrs-0.2.0.tar.gz |
|---|---|
| Size | 607.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
a7818e52539e09596d15ea5e74d4678d12c7daee386dff5906e077433acccbd7
|
|
BLAKE2b-256 checksum How to use checksums |
6e84e9470aa0176658834d9ddf5c1ca4092b890402011268555b1d7c47ad4855
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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 22, 2026.
Transparency logRelease files / waveformrs-0.2.0-cp315-abi3.abi3t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | waveformrs-0.2.0-cp315-abi3.abi3t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 1.5 MB |
| Tags | CPython 3.15 Linux glibc 2.17+ x86-64 abi3 abi3t |
|
SHA-256 checksum How to use checksums |
2858849c03d30694a52c479298cadfddfd15ecaa55c4f0edc965f3f15fc18fab
|
|
BLAKE2b-256 checksum How to use checksums |
5925216d0fbec28ae49db0836d8bc7e007bff73ae5303d3de17a73f08ace2bfe
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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 22, 2026.
Transparency logRelease files / waveformrs-0.2.0-cp315-abi3.abi3t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | waveformrs-0.2.0-cp315-abi3.abi3t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 1.2 MB |
| Tags | CPython 3.15 Linux glibc 2.17+ ARM64 abi3 abi3t |
|
SHA-256 checksum How to use checksums |
5e7e10d4a1d254e96a7b77a851f1179fbaa012c7b2b1defefccd4c2e44575298
|
|
BLAKE2b-256 checksum How to use checksums |
0b7b4245e2aa23cfc9f6c355ae727f692c15622411a3f13cd1f71f4aad985c89
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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 22, 2026.
Transparency logRelease files / waveformrs-0.2.0-cp315-abi3.abi3t-macosx_11_0_arm64.whl
| Download URL | waveformrs-0.2.0-cp315-abi3.abi3t-macosx_11_0_arm64.whl |
|---|---|
| Size | 1.2 MB |
| Tags | CPython 3.15 abi3 abi3t macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
d728322d21c1f687346209d112265ae94353fcb28aa56890a4a8df11def511ca
|
|
BLAKE2b-256 checksum How to use checksums |
ae475b995e5820c142a66de80950cca21f38a0c228b22b38484806f083026fb5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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 22, 2026.
Transparency logRelease files / waveformrs-0.2.0-cp315-abi3.abi3t-macosx_10_12_x86_64.whl
| Download URL | waveformrs-0.2.0-cp315-abi3.abi3t-macosx_10_12_x86_64.whl |
|---|---|
| Size | 1.4 MB |
| Tags | CPython 3.15 abi3 abi3t macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
679c1f0a4431a8166a2e9e7801337f35cf3a59dd33e284c2273fcf91e1e7d113
|
|
BLAKE2b-256 checksum How to use checksums |
69e3bbe41820e43dda06ebc72f57c978130d69cc253d61f2c992d1a11e6c3038
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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 22, 2026.
Transparency logRelease files / waveformrs-0.2.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | waveformrs-0.2.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 1.4 MB |
| Tags | CPython 3.14 CPython 3.14 free-threading Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
d68d894cdb686b2ccd5ff76c66bf83ad85cf01927e4cdf6c05548caa56a281b9
|
|
BLAKE2b-256 checksum How to use checksums |
89be064e56e05ae83ab62a9b67bad7c5a00863d075d33b40fc6c8f5647a0a3ca
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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 22, 2026.
Transparency logRelease files / waveformrs-0.2.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | waveformrs-0.2.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 1.2 MB |
| Tags | CPython 3.14 CPython 3.14 free-threading Linux glibc 2.17+ ARM64 |
|
SHA-256 checksum How to use checksums |
af8d49cd875d43c3e5edfbb12011ce740762a2d001fd9fbc72db07bdaac53f7e
|
|
BLAKE2b-256 checksum How to use checksums |
0db85d7ef5c8431e9306ed13e282073ce15de75386869974b31dd1cc7634592b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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 22, 2026.
Transparency logRelease files / waveformrs-0.2.0-cp314-cp314t-macosx_11_0_arm64.whl
| Download URL | waveformrs-0.2.0-cp314-cp314t-macosx_11_0_arm64.whl |
|---|---|
| Size | 1.2 MB |
| Tags | CPython 3.14 CPython 3.14 free-threading macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
ac1dfdbcf59e146f187a8edbf9393289b7a3c9b4b132879663eccdb5ace84303
|
|
BLAKE2b-256 checksum How to use checksums |
19b3d7579d3555b4201bec191c14d8ad274227e92f4bb799163ceb7a055ea214
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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 22, 2026.
Transparency logRelease files / waveformrs-0.2.0-cp314-cp314t-macosx_10_12_x86_64.whl
| Download URL | waveformrs-0.2.0-cp314-cp314t-macosx_10_12_x86_64.whl |
|---|---|
| Size | 1.4 MB |
| Tags | CPython 3.14 CPython 3.14 free-threading macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
0977d95ece4b9018f887a8c35fa367f9c089c99b68670a6071a0d055955ae1c7
|
|
BLAKE2b-256 checksum How to use checksums |
f069b448f61668d788809d85510d74a9caa1b08878e94624adf3f64518ed0a84
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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 22, 2026.
Transparency logRelease files / waveformrs-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | waveformrs-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 1.4 MB |
| Tags | CPython 3.10 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
662b2f7763aa75e59b8ab10b4c07fa7d49f69b9832683a0b450a3e65f089351e
|
|
BLAKE2b-256 checksum How to use checksums |
41b4304ccdc34060ca93e6706211cf1ecfa45818d3960583993ac39d2a9207f6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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 22, 2026.
Transparency logRelease files / waveformrs-0.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | waveformrs-0.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 1.2 MB |
| Tags | CPython 3.10 Linux glibc 2.17+ ARM64 |
|
SHA-256 checksum How to use checksums |
27b6f141fe962c6cc592c480afd987a2f71af60f41be0117bac4f642329c252b
|
|
BLAKE2b-256 checksum How to use checksums |
d065c46412e5c2a216e271f663c7f9ef2616329910b2d713a61f0752d3905408
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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 22, 2026.
Transparency logRelease files / waveformrs-0.2.0-cp310-cp310-macosx_11_0_arm64.whl
| Download URL | waveformrs-0.2.0-cp310-cp310-macosx_11_0_arm64.whl |
|---|---|
| Size | 1.2 MB |
| Tags | CPython 3.10 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
4b6b5354cae5076fca03d9667d15d639241884807ebc25510445d07511d16bc6
|
|
BLAKE2b-256 checksum How to use checksums |
3c749a54cc7690cee192e965975c23751a8e0331ec2498c044d030c88480e729
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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 22, 2026.
Transparency logRelease files / waveformrs-0.2.0-cp310-cp310-macosx_10_12_x86_64.whl
| Download URL | waveformrs-0.2.0-cp310-cp310-macosx_10_12_x86_64.whl |
|---|---|
| Size | 1.4 MB |
| Tags | CPython 3.10 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
67b433a5e86a42ce34bba45c8358890283d94a0f60e4e90cc89451943cc68319
|
|
BLAKE2b-256 checksum How to use checksums |
05f61fdbc71595b21c9a91633a465a9e4a59b3057490e96ce60d15e77018c0b3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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 22, 2026.
Transparency logSecurity for waveformrs 0.2.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 13 files in this release have been uploaded with provenance metadata.
Attestation for waveformrs-0.2.0.tar.gz
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 22, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.