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.

WorkloadIntensity fps old→newSpeedupPoisson fps old→newSpeedup
fixed227.4 → 379.31.67×220.1 → 288.51.31×
dynamic-api107.0 → 236.22.21×107.0 → 201.71.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

All results/ranges · Precision checks · Source and wheel hashes · Runner

Why four histograms? · Jon per-frame rebuilding comparison