606d94a8

By: ValentinHirschi <valentin.hirschi@gmail.com>

cuts: break bubble-reference score ties deterministically

The generic bubble cut picks one of eight rational null references r by
score (min of (|k.r|/|k|)^2 and the uncut-line plane ratios) and kept the
first candidate unless another one was strictly greater at working
precision. Symmetric kinematics tie references exactly: the four-photon
top boxes lie in the x-z plane, so references related by y -> -y score
alike (four of them tie on the {D0, D3} double cut). Round-off then
picked among the tied references, differently at different precisions.

The reference fixes e2 and hence how the bubble residue splits between
the B1/B11 tensor masters, its explicit mu^2 rational term, and the A0
terms of the tadpoles that subtract it. Only their sum is reference
independent, so the finite part stayed right while lane 3 (generic
polarizations) of four-photon/top-box-1.json and top-box-2.json moved
1375.2-1373.5i between cut_constructible_finite and rational at 23 of
the 51 working precisions from 64 to 264 bits (68, 80, 88, 92, 100, 104,
116, 128, 140, 148, ...). Forcing each tied reference at 400 bits gives
the same finite part to 22 digits but cut-constructible real parts of
526.6, 531.2, 127.6 or 1901.8: the split is a function of the reference.

Like Ninja's fixed reference, take the lowest-index candidate whose
score lies within the existing conditioning tolerance 2^-(p/2) of the
best. After the change all 51 precisions, double-float and the 400-bit
run agree on every lane and component (lane 3 cut-constructible
5.266197681893e2-5.895520448139e2i), and binary64 agrees within its
accuracy.

Tests: a provider check that the selected reference of the tied double
cut is the 400-bit one in f64, double-float and 14 Float precisions
(failed at 68 bits before), and a CLI regression of lane 3 of both
fixtures at 100, 116 and 140 bits against 400-bit values (failed by
1375.2 before).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
GitHub
configure