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);
}
#[test]
fn trueno_rowmajor_q6k_matches_realizar() {
let (in_dim, out_dim) = (512usize, 8usize);
let x: Vec<f32> = (0..in_dim).map(|i| ((i as f32) * 0.019).sin() * 0.4).collect();
for seed in [7u64, 19, 101] {
let mut s = seed;
let mut w = Vec::with_capacity(out_dim * 2 * 210);
for _ in 0..out_dim * 2 {
for i in 0..210 {
s = s.wrapping_mul(6_364_136_223_846_793_005).wrapping_add(1_442_695_040_888_963_407);
w.push(match i {
208 => 0x66,
209 => 0x2E,
_ => (s >> 33) as u8,
});
}
}
let want = crate::quantize::fused_q6k_parallel_matvec(&w, &x, in_dim, out_dim)
.expect("realizar q6k");
for (name, got) in [
("scalar", trueno::backends::q6k::matmul_q6k_f32_scalar(&w, &x, out_dim, in_dim)),
("dispatch", trueno::backends::q6k::matmul_q6k_f32_dispatch(&w, &x, out_dim, in_dim)),
] {
for (r, (g, v)) in got.iter().zip(&want).enumerate() {
assert!(
(g - v).abs() <= 1e-2 * v.abs().max(1.0),
"seed {seed} {name} row {r}: trueno {g} vs realizar {v}"
);
}
}
}
}