use std::sync::Arc;
use crate::error::Result;
use crate::gguf::{
GgufReader, dequant_row_to_f32, dequant_row_to_f32_async, dequant_tensor_to_f32,
dequant_tensor_to_f32_async,
};
#[derive(Clone)]
pub struct Weights {
reader: Arc<GgufReader>,
}
impl Weights {
pub fn new(reader: Arc<GgufReader>) -> Self {
Self { reader }
}
pub fn reader(&self) -> &GgufReader {
&self.reader
}
pub fn reader_arc(&self) -> Arc<GgufReader> {
self.reader.clone()
}
pub fn load(&self, name: &str) -> Result<Vec<f32>> {
dequant_tensor_to_f32(&self.reader, name)
}
pub fn load_row(&self, name: &str, row_idx: usize) -> Result<Vec<f32>> {
dequant_row_to_f32(&self.reader, name, row_idx)
}
pub fn load_opt(&self, name: &str) -> Result<Option<Vec<f32>>> {
match self.reader.tensor(name) {
Ok(_) => self.load(name).map(Some),
Err(_) => Ok(None),
}
}
pub async fn load_async(&self, name: &str) -> Result<Vec<f32>> {
dequant_tensor_to_f32_async(&self.reader, name).await
}
pub async fn load_row_async(&self, name: &str, row_idx: usize) -> Result<Vec<f32>> {
dequant_row_to_f32_async(&self.reader, name, row_idx).await
}
pub async fn load_opt_async(&self, name: &str) -> Result<Option<Vec<f32>>> {
match self.reader.tensor(name) {
Ok(_) => self.load_async(name).await.map(Some),
Err(_) => Ok(None),
}
}
}