Implemented fixed/dynamic mask modes
Local branch codex/mask-modes, same real Eiger9M sample and float64 precision. The local wheel is an unreleased development build; published0.7.0 remains unchanged. Dioptas was not modified.
| Workload | Intensity fps old→new | Speedup | Poisson fps old→new | Speedup |
|---|
| fixed | 227.4 → 379.3 | 1.67× | 220.1 → 288.5 | 1.31× |
| dynamic-api | 107.0 → 236.2 | 2.21× | 107.0 → 201.7 | 1.88× |
Fixed mode caches mask-compacted CSR and normalization. Dynamic mode uses geometry-only float64 CSC with four private histograms and fused normalization/variance; strict mode uses fused CSR. Mode changes release inactive execution layouts while retaining geometry weights. Both modes support mask edits and restoration.
All167 Rust unit tests,16 doctests,3 new Python mode tests and8 existing fast-math/batch tests passed. Clippy with warnings denied passed. Actual old/new Eiger arrays agree within floating-point summation roundoff; detailed numerical differences are in conclusions.json.
Protocol
- fixed: Published0.7.0 versus local dev wheel with same NumPy2.4.2, 16 readonly float64 Eiger9M frames, 2000 full-pixel-split bins, solid-angle/polarization0.965 and same static mask. Batch API8workers/1thread, shared integrator/LUT. Five >=1s warm blocks; includes result materialization. Fixed masks set once, setup excluded.
- dynamic: Published0.7.0 versus local dynamic mode, same NumPy threshold230 masks recreated each frame and set_mask plus normalization/integration. Eight processes each1Rayon thread; initializer barrier ensures all8LUT/CSC preparations finish before timing. Five >=1s blocks per error mode. Includes API output materialization and inter-process result transfer. Sources/reproduction scripts included.
- preliminary: Earlier short-batch new dynamic API samples are retained with preliminary- prefix but are not used for conclusions. The final old/new dynamic controls use a startup barrier and >=1s blocks to exclude worker startup and reduce sampling noise.
- limits: Warm compute-only frames; no HDF5 IO/decompression or mask-detection algorithms beyond threshold. One M4 Pro machine, normal concurrent host activity. Float64 in both old/new Dioptrin. No package publication or Dioptas changes.
All results/ranges · Precision checks · Source and wheel hashes · Runner
Why four histograms? · Jon per-frame rebuilding comparison