src/expected_mi.cpp:85-88 — Pk = pow(2, log2P) at kmin underflows to 0 in double precision for large balanced partitions (P(K=0) ≈ 2^-1197 at N=1200), and if (Pk > 0.0) combined with the multiplicative recurrence means it never recovers for the rest of the sum.
Reproduced by the opus verifier: balanced expected_mi(c(N/2,N/2), c(N/2,N/2)) gives 1.45e-3 at N=500, 7.22e-4 at N=1000, then exactly 0 at N=1100/1200/2000.
Consequence: ClusteringConcordance(normalize = TRUE) on a >1000-taxon tree reports uncorrected mutual information while claiming chance-correction, silently changing what the statistic measures at exactly the scale (large modern phylogenomic matrices) where the correction matters most.
Fix: work in log space throughout (avoid materializing Pk as a linear-scale double), or start the recurrence at the distribution's mode rather than kmin.
Filed by /red-team area 14 (opus finder, 2026-08-05), confirmed by opus verifier with live repro.
src/expected_mi.cpp:85-88—Pk = pow(2, log2P)atkminunderflows to 0 in double precision for large balanced partitions (P(K=0) ≈ 2^-1197 at N=1200), andif (Pk > 0.0)combined with the multiplicative recurrence means it never recovers for the rest of the sum.Reproduced by the opus verifier: balanced
expected_mi(c(N/2,N/2), c(N/2,N/2))gives 1.45e-3 at N=500, 7.22e-4 at N=1000, then exactly 0 at N=1100/1200/2000.Consequence:
ClusteringConcordance(normalize = TRUE)on a >1000-taxon tree reports uncorrected mutual information while claiming chance-correction, silently changing what the statistic measures at exactly the scale (large modern phylogenomic matrices) where the correction matters most.Fix: work in log space throughout (avoid materializing
Pkas a linear-scale double), or start the recurrence at the distribution's mode rather thankmin.Filed by /red-team area 14 (opus finder, 2026-08-05), confirmed by opus verifier with live repro.