#[test]
fn test_dequantize_q5_1_single_block() {
let mut data = Vec::new();
data.extend_from_slice(&0x3C00_u16.to_le_bytes());
data.extend_from_slice(&0x0000_u16.to_le_bytes());
data.extend_from_slice(&[0x00; 4]);
data.extend_from_slice(&[0x00; 16]);
let result = dequantize_q5_1(&data).expect("test");
assert_eq!(result.len(), 32);
for v in &result {
assert!((v - 0.0).abs() < 1e-3);
}
}
#[test]
fn test_dequantize_q5_1_with_min() {
let mut data = Vec::new();
data.extend_from_slice(&0x0000_u16.to_le_bytes());
data.extend_from_slice(&0x4000_u16.to_le_bytes());
data.extend_from_slice(&[0x00; 4]);
data.extend_from_slice(&[0x00; 16]);
let result = dequantize_q5_1(&data).expect("test");
assert_eq!(result.len(), 32);
for v in &result {
assert!((v - 2.0).abs() < 1e-3);
}
}
#[test]
fn test_dequantize_q5_1_with_high_bits() {
let mut data = Vec::new();
data.extend_from_slice(&0x3C00_u16.to_le_bytes());
data.extend_from_slice(&0x0000_u16.to_le_bytes());
data.extend_from_slice(&[0xFF; 4]);
data.extend_from_slice(&[0x00; 16]);
let result = dequantize_q5_1(&data).expect("test");
assert_eq!(result.len(), 32);
for v in &result {
assert!((v - 16.0).abs() < 1e-3);
}
}
#[test]
fn test_dequantize_q5_1_invalid_length() {
let data = vec![0u8; 23]; let result = dequantize_q5_1(&data);
assert!(result.is_err());
}
#[test]
fn test_dequantize_q5_1_multiple_blocks() {
let mut data = Vec::new();
data.extend_from_slice(&0x3C00_u16.to_le_bytes()); data.extend_from_slice(&0x0000_u16.to_le_bytes()); data.extend_from_slice(&[0x00; 4]);
data.extend_from_slice(&[0x00; 16]);
data.extend_from_slice(&0x4000_u16.to_le_bytes()); data.extend_from_slice(&0x3C00_u16.to_le_bytes()); data.extend_from_slice(&[0x00; 4]);
data.extend_from_slice(&[0x00; 16]);
let result = dequantize_q5_1(&data).expect("test");
assert_eq!(result.len(), 64); }
#[test]
fn test_dequantize_q4_k_parallel_matches_scalar() {
let mut data = vec![0u8; 288];
data[0..2].copy_from_slice(&0x3C00_u16.to_le_bytes()); data[2..4].copy_from_slice(&0x0000_u16.to_le_bytes());
data[144..146].copy_from_slice(&0x4000_u16.to_le_bytes()); data[146..148].copy_from_slice(&0x3800_u16.to_le_bytes());
let scalar = dequantize_q4_k(&data).expect("test");
let parallel = dequantize_q4_k_parallel(&data).expect("test");
assert_eq!(scalar.len(), parallel.len());
for (s, p) in scalar.iter().zip(parallel.iter()) {
assert!((s - p).abs() < 1e-5, "Mismatch: scalar={s}, parallel={p}");
}
}
#[test]
fn test_dequantize_q4_k_simd_matches_scalar() {
let mut data = vec![0u8; 144];
data[0..2].copy_from_slice(&0x3E00_u16.to_le_bytes()); data[2..4].copy_from_slice(&0x3400_u16.to_le_bytes());
for (idx, byte) in data[16..144].iter_mut().enumerate() {
*byte = (idx % 16) as u8 | ((idx % 8) << 4) as u8;
}
let scalar = dequantize_q4_k(&data).expect("test");
let simd = dequantize_q4_k_simd(&data).expect("test");
assert_eq!(scalar.len(), simd.len());
assert_eq!(simd.len(), 256);
for (i, (s, p)) in scalar.iter().zip(simd.iter()).enumerate() {
assert!(
(s - p).abs() < 1e-4,
"Mismatch at index {i}: scalar={s}, simd={p}"
);
}
}
#[test]
fn test_dequantize_q4_k_parallel_invalid_length() {
let data = vec![0u8; 143]; let result = dequantize_q4_k_parallel(&data);
assert!(result.is_err());
}
#[test]
fn test_dequantize_q4_k_simd_invalid_length() {
let data = vec![0u8; 145]; let result = dequantize_q4_k_simd(&data);
assert!(result.is_err());
}