use crate::error::{Result, RullamaError};
#[allow(non_camel_case_types)]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[repr(u32)]
pub enum GgmlDtype {
F32 = 0,
F16 = 1,
Q4_0 = 2,
Q4_1 = 3,
Q5_0 = 6,
Q5_1 = 7,
Q8_0 = 8,
Q8_1 = 9,
Q2_K = 10,
Q3_K = 11,
Q4_K = 12,
Q5_K = 13,
Q6_K = 14,
Q8_K = 15,
I8 = 16,
I16 = 17,
I32 = 18,
I64 = 19,
F64 = 20,
BF16 = 30,
}
impl GgmlDtype {
pub fn from_u32(v: u32) -> Result<Self> {
Ok(match v {
0 => Self::F32, 1 => Self::F16,
2 => Self::Q4_0, 3 => Self::Q4_1,
6 => Self::Q5_0, 7 => Self::Q5_1,
8 => Self::Q8_0, 9 => Self::Q8_1,
10 => Self::Q2_K, 11 => Self::Q3_K, 12 => Self::Q4_K, 13 => Self::Q5_K,
14 => Self::Q6_K, 15 => Self::Q8_K,
16 => Self::I8, 17 => Self::I16, 18 => Self::I32, 19 => Self::I64,
20 => Self::F64, 30 => Self::BF16,
other => return Err(RullamaError::Gguf(format!("unknown ggml dtype {other}"))),
})
}
pub fn block_elems(self) -> usize {
match self {
Self::F32 | Self::F16 | Self::BF16 | Self::F64
| Self::I8 | Self::I16 | Self::I32 | Self::I64 => 1,
Self::Q4_0 | Self::Q4_1 | Self::Q5_0 | Self::Q5_1
| Self::Q8_0 | Self::Q8_1 => 32,
Self::Q2_K | Self::Q3_K | Self::Q4_K | Self::Q5_K
| Self::Q6_K | Self::Q8_K => 256,
}
}
pub fn block_bytes(self) -> usize {
match self {
Self::F32 => 4,
Self::F16 => 2,
Self::BF16 => 2,
Self::F64 => 8,
Self::I8 => 1, Self::I16 => 2, Self::I32 => 4, Self::I64 => 8,
Self::Q4_0 => 18,
Self::Q4_1 => 20,
Self::Q5_0 => 22,
Self::Q5_1 => 24,
Self::Q8_0 => 34,
Self::Q8_1 => 36,
Self::Q2_K => 84,
Self::Q3_K => 110,
Self::Q4_K => 144,
Self::Q5_K => 176,
Self::Q6_K => 210,
Self::Q8_K => 292,
}
}
}