## 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.