## v0.3.0 — Multi-Backend JAX/Numba Support ### Highlights This release introduces instance-level backend selection, enabling high-performance WDM transforms on both CPU (Numba) and GPU (JAX) without changing any call-site code. ### New Features - **JAX backend**: Forward (`t2w`) and inverse (`w2t`, `w2tQ`) transforms are fully JAX-compatible and embeddable in `@jax.jit` / `jax.vmap` contexts for GPU acceleration - **Numba backend**: CPU-optimized paths using `@njit(cache=True)` for filter construction and TD filter inner loops - **Instance-level backend selection**: Backend is locked at instantiation (`WDM(..., backend="jax")`) — no per-call overrides needed - **`w2tQ` transform**: Quality-weighted inverse WDM transform - **`time_delay` module**: Full implementation of delayed WDM amplitudes for coincidence analysis - **Graceful degradation**: `HAS_JAX` / `HAS_NUMBA` flags guard optional imports; informative errors raised at use-time if unavailable ### Performance - Optimized `t2w` and `w2t` implementations for both backends - Switched internal FFT from NumPy to `pyfftw` for consistency with cWB ### Bug Fixes - Fixed numerical discrepancy between backends in the forward transform output ### Documentation & Tooling - Added `docs/api_usage_guide.md` with JAX/Numba usage examples - Added `docs/wdm_package_equations.md` with derivations and equation references - Added `scripts/benchmark_t2w_w2t.py` for backend performance comparison - Expanded test suite to 20+ unit tests across `WDM` class, core wavelet functions, and TD filters ### Breaking Changes - Per-call `backend=` parameters removed. Set backend once at `WDM(...)` instantiation.