#![allow(
clippy::cast_possible_truncation,
clippy::cast_possible_wrap,
clippy::cast_sign_loss
)]
use crate::{Key, Segment, pgm::consts::ZERO_SLOPE_THRESHOLD};
#[inline]
pub fn predict(seg: &Segment<impl Key>, key_f64: f64) -> usize {
if seg.slope.abs() < ZERO_SLOPE_THRESHOLD {
seg.start_idx
} else {
let pos = seg.slope.mul_add(key_f64, seg.intercept) + 0.5;
let pos_i = pos as isize;
let lo = seg.start_idx as isize;
let hi = (seg.end_idx - 1) as isize;
if pos_i < lo {
lo as usize
} else if pos_i > hi {
hi as usize
} else {
pos_i as usize
}
}
}