11ff3b62e2
At pad 40 the old path materialised a ~9 GB padded spectrum per row,
which collapsed the chunk planner to one worker and one rfft call with
workers=1 — synthesis ran single-threaded, ~1 hour per angle on real
files.
The padded spectrum is never materialised now. Each block of 512
waveforms gets a coarse rfft at next_fast_len(2*spf); every coarse bin
within 0.7 of its row's max (plus the DC-adjacent window, which coarse
DC suppression would otherwise blind) is refined onto the exact n_fft
grid by a small complex gemm. The selected bin is bit-identical to the
full padded argmax — enforced by test_zoom_identity, a 25-seed fuzz
test over adversarial spectra, and a clean golden-hash diff against the
pre-rewrite baseline across pads {1,2,4,8,40}, masked/unmasked, bg
on/off, int8/int16, and both backends.
Blocks fan out over a persistent thread pool; pyFFTW runs through
per-thread FFTW_MEASURE builder plans with wisdom persisted to
~/.cache/sras-viewer, and threadpoolctl clamps BLAS under the pool.
compute_rf_image(exact=True) (or SRAS_FFT_EXACT=1) keeps the reference
padded path for audits.
tools/bench_fft.py measures: pad 40, 16 cores, 8192x2500 synthetic —
exact serial 717 wf/s -> zoom pool 25100 wf/s (35x, pyFFTW backend;
19x scipy), every variant verified equal to the reference.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
38 lines
883 B
TOML
38 lines
883 B
TOML
[build-system]
|
|
requires = ["setuptools>=68"]
|
|
build-backend = "setuptools.build_meta"
|
|
|
|
[project]
|
|
name = "sras-viewer"
|
|
version = "0.1.0"
|
|
description = "Viewer and processing tools for SRAS .sras scan files"
|
|
requires-python = ">=3.12"
|
|
dependencies = [
|
|
"PyQt6==6.10.2",
|
|
"numpy==2.4.1",
|
|
"matplotlib==3.10.8",
|
|
"scipy==1.18.0",
|
|
# Angle alignment only: masked FFT phase correlation (skimage.registration).
|
|
"scikit-image==0.26.0",
|
|
# Faster rfft backend; the viewer falls back to scipy.fft without it.
|
|
"pyFFTW==0.15.1",
|
|
# Clamps BLAS threading under the FFT worker pool.
|
|
"threadpoolctl==3.6.0",
|
|
]
|
|
|
|
[project.optional-dependencies]
|
|
dev = ["pytest"]
|
|
|
|
[tool.setuptools]
|
|
py-modules = [
|
|
"sras_format",
|
|
"sras_compute",
|
|
"sras_workers",
|
|
"sras_viewer",
|
|
"sras_average",
|
|
"sras_edit_scans",
|
|
]
|
|
|
|
[tool.pytest.ini_options]
|
|
testpaths = ["tests"]
|