use infrastructure_llama_cpp::sampling::LlamaSampler;
use crate::types::base_types::ModelParams;
#[must_use]
pub fn build_sampler_chain(params: &ModelParams) -> LlamaSampler {
let mut samplers: Vec<LlamaSampler> = Vec::new();
if params.temperature > 0.0 {
samplers.push(LlamaSampler::temp(params.temperature));
}
#[allow(clippy::cast_possible_truncation)]
if params.top_k > 0.0 {
let k = params.top_k.round() as i32;
samplers.push(LlamaSampler::top_k(k));
}
if params.top_p > 0.0 && params.top_p < 1.0 {
samplers.push(LlamaSampler::top_p(params.top_p, 1));
}
if (params.repeat_penalty - 1.0).abs() > f32::EPSILON {
samplers.push(LlamaSampler::penalties(
64, params.repeat_penalty, 0.0, 0.0, ));
}
let final_sampler = if params.temperature > 0.0 {
let seed = params.seed.unwrap_or(0xFFFF_FFFF);
LlamaSampler::dist(seed)
} else {
LlamaSampler::greedy()
};
samplers.push(final_sampler);
LlamaSampler::chain(samplers, false)
}