use super::*;
#[test]
fn ratio_one_retains_full_depth() {
let c: Vec<Vec<f32>> = vec![vec![-0.1, -2.0, -3.0]; 4];
let refs: Vec<&[f32]> = c.iter().map(|v| v.as_slice()).collect();
assert_eq!(select(&refs, 3, 32, 1.0), vec![3, 3, 3, 3]);
}
#[test]
fn zero_ratio_keeps_the_mandatory_first_draft() {
let c: Vec<Vec<f32>> = vec![vec![-0.1, -0.2, -0.3]; 4];
let refs: Vec<&[f32]> = c.iter().map(|v| v.as_slice()).collect();
assert_eq!(select(&refs, 3, 32, 0.0), vec![1, 1, 1, 1]);
}
#[test]
fn budget_spent_on_the_confident_sequence() {
let c = [vec![-0.01f32, -0.02, -0.03], vec![-3.0f32, -4.0, -5.0]];
let refs: Vec<&[f32]> = c.iter().map(|v| v.as_slice()).collect();
assert_eq!(select(&refs, 3, 32, 0.5), vec![3, 1]);
}
#[test]
fn retained_set_is_always_a_prefix() {
let c = [vec![-0.1f32, -9.0, -0.001], vec![-0.2f32, -0.2, -0.2]];
let refs: Vec<&[f32]> = c.iter().map(|v| v.as_slice()).collect();
let r = select(&refs, 3, 32, 0.5);
assert!(r[0] <= 2, "prefix product must dominate the local value");
assert!(r.iter().all(|&k| (1..=3).contains(&k)));
}
#[test]
fn row_budget_is_never_exceeded() {
let c: Vec<Vec<f32>> = vec![vec![-0.001, -0.001, -0.001]; 8];
let refs: Vec<&[f32]> = c.iter().map(|v| v.as_slice()).collect();
let r = select(&refs, 3, 24, 1.0);
let rows: usize = r.iter().map(|k| k + 1).sum();
assert!(rows <= 24, "rows={rows}");
}
#[test]
fn missing_confidences_are_never_pruned() {
let empty: Vec<f32> = Vec::new();
let c = [vec![-5.0f32, -5.0, -5.0], empty];
let refs: Vec<&[f32]> = c.iter().map(|v| v.as_slice()).collect();
assert_eq!(select(&refs, 3, 32, 0.5), vec![1, 3]);
}
#[test]
fn chunk_ranges_reproduce_the_uniform_caps() {
assert_eq!(chunk_ranges(&[4; 8]), vec![(0, 8)]);
assert_eq!(chunk_ranges(&[3; 8]), vec![(0, 8)]);
assert_eq!(chunk_ranges(&[3; 16]), vec![(0, 16)]);
assert_eq!(chunk_ranges(&[2; 16]), vec![(0, 16)]);
assert_eq!(chunk_ranges(&[2; 17]), vec![(0, 17)]);
assert_eq!(chunk_ranges(&[2; 32]), vec![(0, 32)]);
}
#[test]
fn chunk_ranges_seq_cap_derives_from_the_row_budget() {
const W: usize = metrale_model_layers::layer::VERIFY_WY_TABLE_SEQS;
assert_eq!((VERIFY_ROW_BUDGET, W), (256, 128));
assert_eq!(chunk_ranges(&[2; 128]), vec![(0, 128)]);
assert_eq!(chunk_ranges(&[2; 129]), vec![(0, W), (W, 129)]);
assert_eq!(chunk_ranges(&[3; 21]), vec![(0, 21)]);
assert_eq!(chunk_ranges(&[3; 85]), vec![(0, 85)]);
assert_eq!(chunk_ranges(&[3; 86]), vec![(0, 85), (85, 86)]);
assert_eq!(chunk_ranges(&[4; 9]), vec![(0, 9)]);
assert_eq!(chunk_ranges(&[4; 64]), vec![(0, 64)]);
assert_eq!(chunk_ranges(&[4; 80]), vec![(0, 64), (64, 80)]);
assert_eq!(chunk_ranges(&[3; 10]), vec![(0, 10)]);
assert_eq!(chunk_ranges(&[8; 32]), vec![(0, 32)]);
assert_eq!(chunk_ranges(&[8; 33]), vec![(0, 32), (32, 33)]);
}
#[test]
fn chunk_ranges_respect_the_row_budget_when_ragged() {
let ks = vec![4, 4, 4, 4, 4, 3, 3, 2, 2, 2];
for (lo, hi) in chunk_ranges(&ks) {
let rows: usize = ks[lo..hi].iter().sum();
assert!(rows <= VERIFY_ROW_BUDGET, "rows={rows}");
assert!(hi > lo);
}
}
#[test]
fn dcut_width_cap_default_is_the_measured_win_regime() {
assert_eq!(DCUT_WIDTH_CAP_DEFAULT, 8);
}
#[test]
fn canonical_assignment_preserves_the_selected_row_total() {
use metrale_model_layers::speculative::verify_key::verify_batch_order;
let c = [
vec![-0.01f32, -6.0, -7.0],
vec![-0.01f32, -0.02, -4.0],
vec![-0.01f32, -5.0, -6.0],
vec![-0.01f32, -0.02, -0.03],
];
let refs: Vec<&[f32]> = c.iter().map(|v| v.as_slice()).collect();
let retained = select(&refs, 3, VERIFY_ROW_BUDGET, 0.5);
let ks: Vec<usize> = retained.iter().map(|r| r + 1).collect();
assert!(ks.iter().any(|&k| k != ks[0]), "the case must be ragged");
let slots = [5usize, 0, 7, 2];
let (order, depths) = verify_batch_order(&slots, &ks, true);
assert_eq!(
depths.iter().sum::<usize>(),
ks.iter().sum::<usize>(),
"Σ rows must survive the re-pairing — the row budget depends on it"
);
let placed: Vec<usize> = order.iter().map(|&i| slots[i]).collect();
assert!(placed.windows(2).all(|w| w[0] < w[1]), "{placed:?}");
assert!(depths.windows(2).all(|w| w[0] >= w[1]), "{depths:?}");
assert!(depths.iter().all(|k| (2..=4).contains(k)));
assert_eq!(chunk_ranges(&depths), vec![(0, 4)]);
}
#[test]
fn ratio_snaps_to_a_bucket() {
let nearest = |raw: f32| {
*BUCKETS
.iter()
.min_by(|a, b| (*a - raw).abs().partial_cmp(&(*b - raw).abs()).unwrap())
.unwrap()
};
assert_eq!(nearest(0.6), 0.5);
assert_eq!(nearest(0.9), 1.0);
assert_eq!(nearest(0.1), 0.25);
}
#[test]
fn width_two_is_inside_the_pruning_envelope_and_is_not_uniform() {
let c = [vec![-0.01f32, -0.02, -0.03], vec![-0.01f32, -0.02, -0.40]];
let refs: Vec<&[f32]> = c.iter().map(|v| v.as_slice()).collect();
let retained = select(&refs, 3, VERIFY_ROW_BUDGET, 0.75);
assert_eq!(
retained,
vec![3, 2],
"ratio 0.75 drops exactly one position"
);
let rows: Vec<usize> = retained.iter().map(|r| r + 1).collect();
assert_ne!(rows, vec![4, 4], "the n=2 plan is NOT the uniform shape");
assert_eq!(rows.iter().sum::<usize>(), 7);
assert_eq!(chunk_ranges(&rows), vec![(0, 2)], "still a single chunk");
}
#[test]
fn below_the_gate_the_pairing_is_legacy_but_the_pruning_is_kept() {
use metrale_model_layers::speculative::verify_key::{canonical_assignment, verify_batch_order};
let c = [vec![-0.01f32, -0.02, -0.03], vec![-0.01f32, -0.02, -0.40]];
let refs: Vec<&[f32]> = c.iter().map(|v| v.as_slice()).collect();
let ks: Vec<usize> = select(&refs, 3, VERIFY_ROW_BUDGET, 0.75)
.iter()
.map(|r| r + 1)
.collect();
assert_eq!(ks, vec![4, 3]);
let slots = [5usize, 0];
assert!(!canonical_assignment(slots.len()));
let (order, depths) = verify_batch_order(&slots, &ks, canonical_assignment(slots.len()));
let paired: Vec<(usize, usize)> = order.iter().map(|&i| (slots[i], ks[i])).collect();
assert_eq!(
depths.iter().sum::<usize>(),
7,
"the row saving must survive the gate — this is not a D-Cut kill switch"
);
assert_eq!(
paired,
vec![(5, 4), (0, 3)],
"each sequence keeps the depth its confidence earned"
);
assert_eq!(depths, vec![4, 3]);
assert_eq!(chunk_ranges(&depths), vec![(0, 2)]);
let (c_order, c_depths) = verify_batch_order(&slots, &ks, true);
let c_paired: Vec<(usize, usize)> = c_order
.iter()
.zip(&c_depths)
.map(|(&i, &k)| (slots[i], k))
.collect();
assert_eq!(c_paired, vec![(0, 4), (5, 3)]);
assert_ne!(c_paired, paired);
assert_eq!(c_depths.iter().sum::<usize>(), 7);
}
#[test]
fn chunk_ranges_never_exceed_the_verify_width_bound() {
const WIDTH_CAP: usize = metrale_model_layers::layer::VERIFY_WY_TABLE_SEQS;
for rows in 2..=4usize {
for n in 2..=300usize {
let ks = vec![rows; n];
for (lo, hi) in chunk_ranges(&ks) {
assert!(
hi - lo <= WIDTH_CAP,
"rows={rows} n={n}: chunk ({lo},{hi}) is {} sequences wide, \
above the {WIDTH_CAP}-slot verify stash — can_batch_verify \
refuses it and the whole chunk serializes",
hi - lo
);
}
}
}
}
#[test]
fn ragged_chunks_also_respect_the_width_bound() {
let mut ks = vec![4usize; 4];
ks.extend(std::iter::repeat_n(2usize, 200));
for (lo, hi) in chunk_ranges(&ks) {
assert!(
hi - lo <= metrale_model_layers::layer::VERIFY_WY_TABLE_SEQS,
"ragged chunk ({lo},{hi}) is {} wide",
hi - lo
);
let r: usize = ks[lo..hi].iter().sum();
assert!(r <= VERIFY_ROW_BUDGET, "rows={r}");
assert!(hi > lo, "empty range");
}
}
fn stop_ctx(dcut: bool) -> crate::scheduler::sched_ctx::SchedCtx {
let mut ctx = crate::scheduler::sched_ctx::SchedCtx::for_test();
let mut levers = crate::scheduler::levers::SchedLevers::defaults();
levers.dcut_enabled = dcut;
ctx.levers = std::sync::Arc::new(levers);
ctx
}
fn seqs_with(confs: &[&[f32]]) -> Vec<ActiveSeq> {
confs
.iter()
.enumerate()
.map(|(i, c)| {
let (mut a, _rx) = crate::scheduler::test_support::active_seq(i, 1);
a.pending_drafts = (0..c.len() as u32).map(|d| 100 + d).collect();
a.pending_draft_conf = c.to_vec();
a
})
.collect()
}
const LN_HALF: f32 = -std::f32::consts::LN_2;
#[test]
fn the_stop_caps_each_chain_at_its_first_unconfident_draft() {
let sched = stop_ctx(false);
let mut active = seqs_with(&[
&[-0.01, -0.02, -0.03],
&[-0.01, -2.0, -0.1],
&[-3.0, -0.1, -0.1],
]);
let mut batchable = vec![0, 1, 2];
let ks = plan_with_stop(
&sched,
&mut active,
&mut batchable,
3,
4,
Some(metrale_model_layers::speculative::draft_stop::StopRule::per_position(LN_HALF)),
);
assert_eq!(ks, vec![4, 3, 2]);
assert_eq!(batchable, vec![0, 1, 2]);
let held: Vec<usize> = active.iter().map(|a| a.pending_drafts.len()).collect();
assert_eq!(held, vec![3, 2, 1], "drafts truncated to the planned depth");
}
#[test]
fn without_the_stop_or_d_cut_the_plan_is_uniform() {
let sched = stop_ctx(false);
let mut active = seqs_with(&[&[-0.01, -2.0, -0.1], &[-3.0, -0.1, -0.1]]);
let mut batchable = vec![0, 1];
let ks = plan_with_stop(&sched, &mut active, &mut batchable, 3, 4, None);
assert_eq!(ks, vec![4, 4]);
assert!(active.iter().all(|a| a.pending_drafts.len() == 3));
}
#[test]
fn the_stop_applies_above_the_d_cut_width_cap() {
let sched = stop_ctx(true);
let n = sched.levers.dcut_width_cap + 4;
let confident: &[f32] = &[-0.01, -0.01, -0.01];
let short: &[f32] = &[-0.01, -5.0, -0.01];
let confs: Vec<&[f32]> = (0..n)
.map(|i| if i % 2 == 0 { confident } else { short })
.collect();
let mut active = seqs_with(&confs);
let mut batchable: Vec<usize> = (0..n).collect();
let ks = plan_with_stop(
&sched,
&mut active,
&mut batchable,
3,
4,
Some(metrale_model_layers::speculative::draft_stop::StopRule::per_position(LN_HALF)),
);
let total: usize = ks.iter().sum();
assert_eq!(
total,
(n / 2) * 4 + (n / 2) * 3,
"half the chains stop after 2 drafts"
);
}
#[test]
fn a_short_chain_joins_at_its_own_depth_when_re_pairing_cannot_hold_it() {
let sched = stop_ctx(false);
let n = metrale_model_layers::speculative::verify_key::CANONICAL_KEY_MIN_WIDTH;
let full: &[f32] = &[-0.01, -0.01, -0.01];
let one: &[f32] = &[-0.01];
let confs: Vec<&[f32]> = (0..n).map(|i| if i == 0 { one } else { full }).collect();
let mut active = seqs_with(&confs);
let mut batchable: Vec<usize> = (0..n).collect();
let ks = plan_with_stop(
&sched,
&mut active,
&mut batchable,
3,
4,
Some(metrale_model_layers::speculative::draft_stop::StopRule::per_position(LN_HALF)),
);
for (pos, &i) in batchable.iter().enumerate() {
assert_eq!(ks[pos], active[i].pending_drafts.len() + 1);
}
assert_eq!(active[0].pending_drafts.len(), 1);
assert_eq!(ks.iter().sum::<usize>(), 2 + (n - 1) * 4);
}
#[test]
fn the_dcut_flag_wins_over_the_environment_and_snaps() {
assert_eq!(resolve_dcut_ratio(None, None), 0.75, "default");
assert_eq!(
resolve_dcut_ratio(None, Some("1.0")),
1.0,
"environment fallback"
);
assert_eq!(
resolve_dcut_ratio(Some(1.0), Some("0.25")),
1.0,
"the flag wins"
);
assert_eq!(resolve_dcut_ratio(Some(0.3), None), 0.25, "snapped");
assert_eq!(
resolve_dcut_ratio(None, Some("junk")),
0.75,
"unparseable is ignored"
);
}
#[test]
fn outcomes_stop_after_the_first_rejected_draft() {
let conf = [-0.1, -0.2, -0.3];
let got: Vec<_> = reached_outcomes(&conf, 1).collect();
assert_eq!(got, vec![(-0.1, true), (-0.2, false)]);
let none: Vec<_> = reached_outcomes(&conf, 0).collect();
assert_eq!(none, vec![(-0.1, false)]);
let all: Vec<_> = reached_outcomes(&conf, 3).collect();
assert_eq!(all, vec![(-0.1, true), (-0.2, true), (-0.3, true)]);
}