use crate::gguf::OwnedQuantizedModel;
use rand::rngs::StdRng;
use rand::SeedableRng;
const LOGITS: [f32; 8] = [-9.0, -8.0, -7.0, -6.0, -5.0, 10.0, -4.0, -3.0];
const ARGMAX: u32 = 5;
#[test]
fn topk_zero_is_disabled_not_empty() {
for seed in 0..64u64 {
let mut rng = StdRng::seed_from_u64(seed);
let tok = OwnedQuantizedModel::sample_topk_seeded(&LOGITS, 0.7, 0, 1.0, &mut rng);
assert_eq!(
tok, ARGMAX,
"FALSIFY-SAMPLE-TOPK-ZERO-001: top_k=0 (llama.cpp/Ollama 'disabled') \
returned token {tok}, expected {ARGMAX}. Returning 0 means truncate(0) \
emptied the candidate set and the inverse-CDF fell through to \
probs.last().map_or(0, ..) — the '!!!!!!' garbage-output defect."
);
}
}
#[test]
fn topk_zero_matches_topk_full_vocab() {
for seed in 0..64u64 {
let mut rng_zero = StdRng::seed_from_u64(seed);
let mut rng_full = StdRng::seed_from_u64(seed);
let a = OwnedQuantizedModel::sample_topk_seeded(&LOGITS, 1.0, 0, 1.0, &mut rng_zero);
let b =
OwnedQuantizedModel::sample_topk_seeded(&LOGITS, 1.0, LOGITS.len(), 1.0, &mut rng_full);
assert_eq!(
a, b,
"FALSIFY-SAMPLE-TOPK-ZERO-001: top_k=0 must behave as 'disabled' \
(identical to top_k=vocab_len); got {a} vs {b} at seed {seed}"
);
}
}
#[test]
fn topk_larger_than_vocab_is_safe() {
let mut rng = StdRng::seed_from_u64(7);
let tok = OwnedQuantizedModel::sample_topk_seeded(&LOGITS, 0.7, 9999, 1.0, &mut rng);
assert_eq!(tok, ARGMAX, "top_k > vocab_len must clamp harmlessly");
}
#[test]
fn topk_one_is_still_greedy() {
for seed in 0..16u64 {
let mut rng = StdRng::seed_from_u64(seed);
let tok = OwnedQuantizedModel::sample_topk_seeded(&LOGITS, 1.0, 1, 1.0, &mut rng);
assert_eq!(tok, ARGMAX, "top_k=1 must always return the argmax");
}
}