use crate::tier::{Codec, StorageTier};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct WeightEntry {
pub name: String,
pub shape: Vec<usize>,
pub scheme: String,
#[serde(default = "default_layout")]
pub layout: String,
pub shard: String,
pub offset: u64,
pub length: u64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub raw_length: Option<u64>,
#[serde(default)]
pub tier: StorageTier,
#[serde(default)]
pub codec: Codec,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub rank: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub checksum: Option<String>,
}
fn default_layout() -> String {
"row_major".into()
}
impl WeightEntry {
pub fn is_mmapable(&self) -> bool {
self.tier == StorageTier::Hot && self.codec == Codec::None
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Default)]
pub struct WeightsIndex {
pub tensors: Vec<WeightEntry>,
}
impl WeightsIndex {
pub fn get(&self, name: &str) -> Option<&WeightEntry> {
self.tensors.iter().find(|t| t.name == name)
}
pub fn names(&self) -> impl Iterator<Item = &str> {
self.tensors.iter().map(|t| t.name.as_str())
}
}