use core::num::NonZeroU16;
use half::f16;
use super::{
alloc::reserve_exact,
config::HIDDEN_SIZE,
error::{AllocationSite, Result},
vision::VisionBudget,
};
use crate::MultiArray;
pub(crate) const AUDIO_ROWS: usize = 250;
#[derive(Debug)]
pub struct AudioTokens {
array: MultiArray,
valid: NonZeroU16,
}
impl AudioTokens {
pub(crate) fn new(array: MultiArray, valid: NonZeroU16) -> Self {
debug_assert_eq!(array.shape(), [1, AUDIO_ROWS, HIDDEN_SIZE]);
debug_assert!(usize::from(valid.get()) <= AUDIO_ROWS);
Self { array, valid }
}
#[inline]
pub const fn valid(&self) -> NonZeroU16 {
self.valid
}
pub(crate) fn rows_into(&self, out: &mut Vec<f16>) -> Result<()> {
rows_into(&self.array, self.valid, out)
}
}
#[derive(Debug)]
pub struct ImageTokens {
array: MultiArray,
budget: VisionBudget,
valid: NonZeroU16,
}
impl ImageTokens {
pub(crate) fn new(array: MultiArray, budget: VisionBudget, valid: NonZeroU16) -> Self {
debug_assert_eq!(array.shape(), [1, budget.tokens(), HIDDEN_SIZE]);
debug_assert!(usize::from(valid.get()) <= budget.tokens());
Self {
array,
budget,
valid,
}
}
#[inline]
pub const fn budget(&self) -> VisionBudget {
self.budget
}
#[inline]
pub const fn valid(&self) -> NonZeroU16 {
self.valid
}
pub(crate) fn rows_into(&self, out: &mut Vec<f16>) -> Result<()> {
rows_into(&self.array, self.valid, out)
}
}
fn rows_into(array: &MultiArray, valid: NonZeroU16, out: &mut Vec<f16>) -> Result<()> {
let count = array.count();
out.clear();
reserve_exact(out, count, AllocationSite::GatherRows)?;
out.resize(count, f16::ZERO);
array.copy_into(out)?;
out.truncate((usize::from(valid.get()) * HIDDEN_SIZE).min(count));
Ok(())
}
#[cfg(test)]
mod tests;