- RigidBodyGPU gather: AxisBrickBound undercounted by one where a box wraps
past a partial last brick (n = 17: points 15, 16, 0 fall in bricks 1, 2, 0);
the bound is now +2, and axis_bricks reports an overflow that Density()
turns into a failure (-> CPU fallback) instead of dropping a brick.
Exhaustive host test over n <= 64.
- RigidBodyTargetGPU::Residuals tests for an empty zone before launching
Fcalc/Fmask (a 0-block grid).
- The pool engine is held by an RAII lease, returned if the constructor throws.
- The engine's stream is a CudaStream member (priority argument added), so it
is not leaked when an allocation in the constructor throws.
- FitSolvent's "five or fewer strong reflections" case throws its own type,
and only that is caught for the host scale.
- Hot pixels: the per-pixel counters are 16-bit, so the pre-scan sample is
clamped to 65535 frames; no rings -> no 0-block sector/ring launches.
- PostRefine commit gate: fewer than two held-out positions refuse with
their own reason; an excitation family of fewer than two values no longer
refuses (its SE was NaN). No set of the r6-pooled battery reaches either
case (smallest joint fit: ~2400 events, all SEs finite).
- Tests: ModelScaleGPU uploads on the fits' stream and accepts a near-tie's
neighbouring grid point at the CPU winner's R; [gpu] rigid-body cases SKIP
when the card is busy rather than fail.
- THIRD_PARTY_NOTICES: bitshuffle h-perf copyright holder is Kal Conley.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01D1G8gJVAy6gp1K5Dz3NE5C