use crate::quantize::fused_q5k_q6k::{
fused_q4k_q8_dot, fused_q5k_dot, fused_q5k_dot_simd, fused_q6k_dot, fused_q6k_dot_simd,
};
use crate::quantize::types::Q8_0Block;
#[test]
fn test_fused_q6k_dot_bad_data_length() {
let data = vec![0u8; 100];
let activations = vec![1.0f32; 256];
let result = fused_q6k_dot(&data, &activations);
assert!(result.is_err());
let err = result.unwrap_err().to_string();
assert!(
err.contains("not a multiple") || err.contains("super-block"),
"Expected super-block error, got: {}",
err
);
}
#[test]
fn test_fused_q6k_dot_activation_mismatch() {
let data = vec![0u8; 210]; let activations = vec![1.0f32; 128]; let result = fused_q6k_dot(&data, &activations);
assert!(result.is_err());
let err = result.unwrap_err().to_string();
assert!(
err.contains("doesn't match") || err.contains("Activation"),
"Expected activation mismatch error, got: {}",
err
);
}
#[test]
fn test_fused_q6k_dot_zero_data() {
let data = vec![0u8; 210]; let activations = vec![1.0f32; 256];
let result = fused_q6k_dot(&data, &activations);
assert!(result.is_ok());
assert_eq!(result.expect("test value should be present"), 0.0);
}
#[test]
fn test_fused_q6k_dot_empty() {
let data: Vec<u8> = vec![];
let activations: Vec<f32> = vec![];
let result = fused_q6k_dot(&data, &activations);
assert!(result.is_ok());
assert_eq!(result.expect("test value should be present"), 0.0);
}
#[test]
fn test_fused_q6k_dot_nonzero() {
let mut data = vec![0u8; 210];
data[208..210].copy_from_slice(&0x3C00u16.to_le_bytes());
for i in 0..16 {
data[192 + i] = 1;
}
for i in 0..128 {
data[i] = 0x33; }
let activations = vec![1.0f32; 256];
let result = fused_q6k_dot(&data, &activations);
assert!(result.is_ok());
}
#[test]
fn test_fused_q6k_dot_two_superblocks() {
let data = vec![0u8; 210 * 2]; let activations = vec![1.0f32; 512]; let result = fused_q6k_dot(&data, &activations);
assert!(result.is_ok());
assert_eq!(result.expect("test value should be present"), 0.0); }
#[test]
fn test_fused_q6k_dot_simd_matches_scalar() {
let mut data = vec![0u8; 210];
data[208..210].copy_from_slice(&0x3C00u16.to_le_bytes()); for i in 0..16 {
data[192 + i] = 2; }
for i in 0..128 {
data[i] = 0x44;
}
let activations: Vec<f32> = (0..256).map(|i| (i as f32) / 256.0).collect();
let scalar_result = fused_q6k_dot(&data, &activations).expect("test value should be present");
let simd_result = fused_q6k_dot_simd(&data, &activations).expect("test value should be present");
assert!(
(scalar_result - simd_result).abs() < 1.0,
"Scalar={}, SIMD={}, diff={}",
scalar_result,
simd_result,
(scalar_result - simd_result).abs()
);
}
#[test]
fn test_fused_q6k_dot_simd_error_propagation() {
let data = vec![0u8; 100]; let activations = vec![1.0f32; 256];
let result = fused_q6k_dot_simd(&data, &activations);
assert!(result.is_err());
}
#[test]
fn test_fused_q5k_dot_bad_data_length() {
let data = vec![0u8; 100]; let activations = vec![1.0f32; 256];
let result = fused_q5k_dot(&data, &activations);
assert!(result.is_err());
let err = result.unwrap_err().to_string();
assert!(
err.contains("not a multiple") || err.contains("super-block"),
"Expected super-block error, got: {}",
err
);
}
#[test]
fn test_fused_q5k_dot_activation_mismatch() {
let data = vec![0u8; 176]; let activations = vec![1.0f32; 128]; let result = fused_q5k_dot(&data, &activations);
assert!(result.is_err());
let err = result.unwrap_err().to_string();
assert!(
err.contains("doesn't match") || err.contains("Activation"),
"Expected activation mismatch error, got: {}",
err
);
}
#[test]
fn test_fused_q5k_dot_zero_data() {
let data = vec![0u8; 176]; let activations = vec![1.0f32; 256];
let result = fused_q5k_dot(&data, &activations);
assert!(result.is_ok());
assert_eq!(result.expect("test value should be present"), 0.0);
}
#[test]
fn test_fused_q5k_dot_empty() {
let data: Vec<u8> = vec![];
let activations: Vec<f32> = vec![];
let result = fused_q5k_dot(&data, &activations);
assert!(result.is_ok());
assert_eq!(result.expect("test value should be present"), 0.0);
}
#[test]
fn test_fused_q5k_dot_nonzero() {
let mut data = vec![0u8; 176];
data[0..2].copy_from_slice(&0x3C00u16.to_le_bytes());
data[2..4].copy_from_slice(&0x0000u16.to_le_bytes());
for i in 0..12 {
data[4 + i] = 0x11; }
for i in 0..128 {
data[48 + i] = 0x55;
}
let activations = vec![1.0f32; 256];
let result = fused_q5k_dot(&data, &activations);
assert!(result.is_ok());
}
#[test]
fn test_fused_q5k_dot_two_superblocks() {
let data = vec![0u8; 176 * 2];
let activations = vec![1.0f32; 512];
let result = fused_q5k_dot(&data, &activations);
assert!(result.is_ok());
assert_eq!(result.expect("test value should be present"), 0.0);
}
#[test]
fn test_fused_q5k_dot_simd_delegates() {
let data = vec![0u8; 176];
let activations = vec![1.0f32; 256];
let scalar = fused_q5k_dot(&data, &activations).expect("test value should be present");
let simd = fused_q5k_dot_simd(&data, &activations).expect("test value should be present");
assert_eq!(scalar, simd);
}
#[test]
fn test_fused_q5k_dot_simd_error_propagation() {
let data = vec![0u8; 100]; let activations = vec![1.0f32; 256];
let result = fused_q5k_dot_simd(&data, &activations);
assert!(result.is_err());
}
#[test]
fn test_fused_q4k_q8_dot_bad_q4k_length() {
let data = vec![0u8; 100]; let q8_blocks: Vec<Q8_0Block> = vec![];
let result = fused_q4k_q8_dot(&data, &q8_blocks);
assert!(result.is_err());
}
#[test]
fn test_fused_q4k_q8_dot_q8_block_mismatch() {
let data = vec![0u8; 144]; let q8_blocks = vec![
Q8_0Block {
scale: 0.0,
quants: [0i8; 32]
};
4
]; let result = fused_q4k_q8_dot(&data, &q8_blocks);
assert!(result.is_err());
let err = result.unwrap_err().to_string();
assert!(
err.contains("doesn't match") || err.contains("block count"),
"Expected block count error, got: {}",
err
);
}
#[test]
fn test_fused_q4k_q8_dot_zeros() {
let data = vec![0u8; 144];
let q8_blocks = vec![
Q8_0Block {
scale: 0.0,
quants: [0i8; 32]
};
8
];
let result = fused_q4k_q8_dot(&data, &q8_blocks);
assert!(result.is_ok());
assert_eq!(result.expect("test value should be present"), 0.0);
}
#[test]
fn test_fused_q4k_q8_dot_empty() {
let data: Vec<u8> = vec![];
let q8_blocks: Vec<Q8_0Block> = vec![];
let result = fused_q4k_q8_dot(&data, &q8_blocks);
assert!(result.is_ok());
assert_eq!(result.expect("test value should be present"), 0.0);
}
#[test]
fn test_fused_q4k_q8_dot_nonzero() {
let mut data = vec![0u8; 144];
data[0..2].copy_from_slice(&0x3C00u16.to_le_bytes());
for i in 0..12 {
data[4 + i] = 0x11;
}
for i in 0..128 {
data[16 + i] = 0x55;
}
let mut q8_blocks = Vec::new();
for _ in 0..8 {
q8_blocks.push(Q8_0Block {
scale: 0.1,
quants: [10i8; 32],
});
}
let result = fused_q4k_q8_dot(&data, &q8_blocks);
assert!(result.is_ok());
}
#[test]
fn test_fused_q4k_q8_dot_two_superblocks() {
let data = vec![0u8; 144 * 2];
let q8_blocks = vec![
Q8_0Block {
scale: 0.0,
quants: [0i8; 32]
};
16
];
let result = fused_q4k_q8_dot(&data, &q8_blocks);
assert!(result.is_ok());
assert_eq!(result.expect("test value should be present"), 0.0);
}