paired floor: one composite formula and its pin; docs state the power measure #72

Merged
weksa merged 1 commit from paired-floor-pins into main 2026-11-13 03:39:17 +00:00
2 changed files with 32 additions and 12 deletions

View file

@ -2157,6 +2157,12 @@ fn score_round<M: ModelPort, E: Embedder>(
Ok(RoundOutcome::Recorded(record))
}
/// The composite of one chrF (0 to 100) and one meaning: their mean, chrF as a
/// fraction. The one formula for a split mean's [`Reading`] and a per-item score.
fn composite_of(chrf: f64, meaning: f64) -> f64 {
(chrf / 100.0 + meaning) / 2.0
}
/// One validation reading: chrF 0 to 100, meaning 0 to 1, and their composite.
#[derive(Clone, Copy, Debug, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct Reading {
@ -2177,7 +2183,7 @@ impl Reading {
Some(Self {
chrf,
meaning,
composite: (chrf / 100.0 + meaning) / 2.0,
composite: composite_of(chrf, meaning),
})
}
}
@ -2507,9 +2513,10 @@ fn floor_of(
/// unordered pairs): with three floor arms a prompted repeat reads NoGain in
/// 92% of the trials (bootstrap 95% over draws 80 to 100%), Regressed 8% and
/// Accepted 0%; a "Yes." arm and a mild degradation (one detail blurred per
/// utterance) read Regressed in 100%, and a subtler one in 75% (50 to 100%): at
/// 14 items a degradation under about three standard errors cannot be told from
/// noise. `FLOOR_Z` was chosen on that data, so the rates are in-sample.
/// utterance) read Regressed in 100% (each a single fixed draw), and a subtler
/// one in 75% (50 to 100%): at 14 items a mean composite drop near 0.04 against
/// a floor near 0.06 is flagged only some of the time. `FLOOR_Z` was chosen on
/// that data, so the rates are in-sample.
pub const FLOOR_Z: f64 = 3.0;
pub const FLOOR_ARMS_MIN: usize = 3;
@ -2540,7 +2547,7 @@ pub fn paired_floor(recorded: &[ItemScore], arms: &[Vec<ItemScore>]) -> Reading
Reading {
chrf: pooled(&|s| s.chrf),
meaning: pooled(&meaning),
composite: pooled(&|s| (s.chrf / 100.0 + meaning(s)) / 2.0),
composite: pooled(&|s| composite_of(s.chrf, meaning(s))),
}
}
@ -2949,6 +2956,9 @@ mod tests {
let two = paired_floor(&recorded, &[wobble.clone(), wobble.clone()]);
assert!((one.chrf - want).abs() < 1e-9 && (two.chrf - want).abs() < 1e-9, "{one:?} {two:?}");
assert!(one.meaning.abs() < 1e-9);
// Composite per item is (chrF / 100 + meaning) / 2: the wobble moves chrF
// by 2 and meaning by 0, so the composite wobbles by 0.01.
assert!((one.composite - FLOOR_Z * (0.01_f64 * 0.01 * 4.0 / 3.0 / 4.0).sqrt()).abs() < 1e-9, "{one:?}");
// Arms pool by the mean of their variances: one wobbling arm and one
// exact repeat give the root of half the variance.
let exact = recorded.to_vec();

View file

@ -379,19 +379,29 @@ gain past the noise of the panel's sum (the root of the languages' composite
floors squared, at least one step), Rejected(Regressed) a loss past a language's
floor, Rejected(NoGain) neither. The cycle's own floor is still the spread of two
round replicates (`floor_of`); it has no per-item scores to pair.
Calibration (`runs/distil-base`, 8 prompted draws, each its own subagent, 14
Calibration (`runs/distil-base`, 8 prompted draws by one model family on
identical prompts, no draw sharing more than 7 of 28 answers with another; 14
en-US and 14 ja-JP Validation items; every base, candidate and 3-arm floor
combination, 1120 trials from 28 unordered pairs; intervals bootstrap over
draws, each degraded arm one fixed draw): a prompted repeat reads NoGain 92%
(80 to 100), Regressed 8% (0 to 20), Accepted 0%, which with 28 pairs bounds
false-accept only to about 10%; an all-"Yes." arm reads Regressed 100%; a mild
degradation (one detail blurred per utterance) 100%; a subtler one 75% (50 to
100). At 14 items a degradation under about three standard errors (a composite
near 0.06) cannot be told from noise, and no arm known to be better exists, so
the rule's power to accept a real gain is unmeasured. `FLOOR_Z` was chosen on
this data (2.5 gives NoGain 84% and 93% on the subtler arm), so the rates are
in-sample. Without the noise term in the gain test a prompted repeat reads
Accepted in 40% of the trials.
100), whose mean composite drop (0.044) sits under the mean floor (0.060).
`FLOOR_Z` was chosen on this data (2.5 gives NoGain 84% and 93% on the subtler
arm), so the rates are in-sample. Without the noise term in the gain test a
prompted repeat reads Accepted in 40% of the trials.
Power (can the rule Accept a real gain?): the only better arm that could be
built without Test or Validation answers is a lowerer shown the Train sentences
of the corpus (no packets, no Validation or Test text) as a register guide.
Four such draws beat the prompted draws' mean composite in both languages (en-US
0.742 to 0.759 to 0.795; ja-JP 0.559 to 0.578 to 0.620), so the premise that it is
better is measured on the very Validation items the rule reads, not independent.
Against the prompted bases with 3-arm floors the rule reads it Accepted in 29%
of 1120 trials, NoGain 71%, Regressed 0%: a net gain of 0.079 against a mean
noise term of 0.079. At 14 items per language the rule is therefore a low-power
filter for a gain of this size; by 1/sqrt(n), about 35 or more items per
language would bring the noise term near 0.05 (an extrapolation, not measured).
Training pairs are Train only, at a frozen revision; the export is 12b.
## Lowerer first cut (`golf-loop-lowerer-cut`)