ComputeAsuGroups states the rule for itself - "one ASU reduction per distinct
raw hkl (not per observation)" - and the anomalous split then did a gemmi ASU
reduction and an unordered_map lookup for every one of the millions of fulls.
Both things it wants are properties of the observation's ASU GROUP rather than
of the observation: group_h/k/l is the group's SIGNED representative, so the
same reduction applied to it returns the Friedel-merged key and the hand
together. Reduce once per group into a dense accumulator indexed from there.
The hand only follows the group when the merge distinguishes the hands; a
Friedel-merged run holds both in one group and still has to ask per observation.
SigAno and the merged statistics are unchanged (2.96 over 53303 acentric pairs,
merge table byte-identical).
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>