token-sampling 0.1.0

Composable token sampling over f32 logits with caller-supplied randomness
Documentation
#[cfg(not(debug_assertions))]
use std::time::Instant;
#[cfg(not(debug_assertions))]
use std::{io, io::Write};

#[cfg(not(debug_assertions))]
use token_sampling::{ChainConfig, SamplerChain, SplitMix64};

#[cfg(not(debug_assertions))]
#[test]
fn default_chain_mean_is_below_two_milliseconds() {
    const SIZE: usize = 131_072;
    const ITERATIONS: u32 = 32;
    let mut logits = (0..SIZE)
        .map(|index| {
            let value = (index as u64)
                .wrapping_mul(2_862_933_555_777_941_757_u64)
                .wrapping_add(3_037_000_493);
            ((value >> 40) as f32 / (1_u32 << 24) as f32) * 12.0 - 6.0
        })
        .collect::<Vec<_>>();
    let mut chain = SamplerChain::llama_default(ChainConfig::default());
    let mut rng = SplitMix64::new(91);
    chain.sample(&mut logits, &[], &mut rng).unwrap();

    let start = Instant::now();
    for _ in 0..ITERATIONS {
        chain.sample(&mut logits, &[], &mut rng).unwrap();
    }
    let mean = start.elapsed().as_secs_f64() / f64::from(ITERATIONS);
    writeln!(
        io::stdout().lock(),
        "default chain mean: {:.3} ms",
        mean * 1000.0
    )
    .unwrap();
    assert!(mean < 0.002, "mean step took {:.3} ms", mean * 1000.0);
}