#[test]
fn test_extract_scale_min_all_blocks_max_values() {
let scales: [u8; 12] = [
0b11_111111, 0b11_111111, 0b11_111111, 0b11_111111, 0b11_111111, 0b11_111111, 0b11_111111, 0b11_111111, 0b1111_1111, 0b1111_1111, 0b1111_1111, 0b1111_1111, ];
for i in 0..4 {
let (s, m) = extract_scale_min(&scales, i);
assert_eq!(s, 63.0, "Block {} scale should be 63", i);
assert_eq!(m, 63.0, "Block {} min should be 63", i);
}
for i in 4..8 {
let (s, m) = extract_scale_min(&scales, i);
assert_eq!(s, 63.0, "Block {} scale should be 63", i);
assert_eq!(m, 63.0, "Block {} min should be 63", i);
}
}
#[test]
fn test_interleaved_q4k_scales_and_dmin_extraction() {
let mut data = vec![0u8; 144];
data[0..2].copy_from_slice(&0x3800u16.to_le_bytes());
data[2..4].copy_from_slice(&0x3400u16.to_le_bytes());
for i in 4..16 {
data[i] = (i - 4) as u8;
}
let interleaved = InterleavedQ4K::from_q4k(&data).expect("test value should be present");
assert!((interleaved.d[0] - 0.5).abs() < 1e-3);
assert!((interleaved.dmin[0] - 0.25).abs() < 1e-3);
for (i, &s) in interleaved.scales.iter().enumerate() {
assert_eq!(s, i as u8);
}
}
#[test]
fn test_interleaved_q4k_qs_copy() {
let mut data = vec![0u8; 144];
data[0..2].copy_from_slice(&0x3C00u16.to_le_bytes());
for i in 16..144 {
data[i] = ((i - 16) % 256) as u8;
}
let interleaved = InterleavedQ4K::from_q4k(&data).expect("test value should be present");
for (i, &q) in interleaved.qs.iter().enumerate() {
assert_eq!(q, (i % 256) as u8);
}
}
#[test]
fn test_interleaved_q4k_dot_with_all_max_nibbles() {
let mut data = vec![0u8; 144];
data[0..2].copy_from_slice(&0x3C00u16.to_le_bytes()); data[2..4].copy_from_slice(&0x0000u16.to_le_bytes());
for i in 4..16 {
data[i] = 1;
}
for i in 16..144 {
data[i] = 0xFF;
}
let interleaved = InterleavedQ4K::from_q4k(&data).expect("test value should be present");
let activations = vec![1.0f32; 256];
let result = interleaved.dot(&activations).expect("dot should work");
assert!(result.is_finite(), "Result should be finite: {}", result);
assert!(result > 0.0, "Result should be positive with max nibbles");
}
#[test]
fn test_interleaved_q4k_dot_with_zero_d() {
let mut data = vec![0u8; 144];
data[0..2].copy_from_slice(&0x0000u16.to_le_bytes());
data[2..4].copy_from_slice(&0x0000u16.to_le_bytes());
let interleaved = InterleavedQ4K::from_q4k(&data).expect("test value should be present");
let activations = vec![1.0f32; 256];
let result = interleaved.dot(&activations).expect("dot should work");
assert_eq!(result, 0.0, "Zero d should give zero result");
}
#[test]
fn test_interleaved_q4k_dot_three_superblocks() {
let mut data = vec![0u8; 144 * 3];
data[0..2].copy_from_slice(&0x3C00u16.to_le_bytes());
data[144..146].copy_from_slice(&0x4000u16.to_le_bytes());
data[288..290].copy_from_slice(&0x3800u16.to_le_bytes());
let interleaved = InterleavedQ4K::from_q4k(&data).expect("test value should be present");
assert_eq!(interleaved.num_super_blocks, 3);
assert_eq!(interleaved.num_values(), 768);
let activations = vec![0.1f32; 768];
let result = interleaved.dot(&activations).expect("dot should work");
assert!(result.is_finite());
}
#[test]
fn test_fused_q4_0_q8_0_dot_simd_exactly_256_elements() {
let in_dim = 256;
let num_blocks = 8;
let mut q4_data = vec![0u8; num_blocks * 18];
for block in 0..num_blocks {
let start = block * 18;
q4_data[start..start + 2].copy_from_slice(&0x3C00u16.to_le_bytes());
for i in 2..18 {
q4_data[start + i] = 0x44; }
}
let q8_scales = vec![1.0f32; num_blocks];
let q8_quants = vec![1i8; in_dim];
let result = fused_q4_0_q8_0_dot_simd(&q4_data, &q8_scales, &q8_quants, in_dim);
assert!(result.is_finite());
}
#[test]
fn test_fused_q4_0_q8_0_dot_simd_exactly_128_elements() {
let in_dim = 128;
let num_blocks = 4;
let mut q4_data = vec![0u8; num_blocks * 18];
for block in 0..num_blocks {
let start = block * 18;
q4_data[start..start + 2].copy_from_slice(&0x3C00u16.to_le_bytes());
}
let q8_scales = vec![1.0f32; num_blocks];
let q8_quants = vec![1i8; in_dim];
let result = fused_q4_0_q8_0_dot_simd(&q4_data, &q8_scales, &q8_quants, in_dim);
assert!(result.is_finite());
}
#[test]
fn test_fused_q4_0_q8_0_dot_simd_5_blocks() {
let in_dim = 160;
let num_blocks = 5;
let mut q4_data = vec![0u8; num_blocks * 18];
for block in 0..num_blocks {
let start = block * 18;
q4_data[start..start + 2].copy_from_slice(&0x3C00u16.to_le_bytes());
for i in 2..18 {
q4_data[start + i] = 0x55;
}
}
let q8_scales = vec![1.0f32; num_blocks];
let q8_quants = vec![2i8; in_dim];
let result = fused_q4_0_q8_0_dot_simd(&q4_data, &q8_scales, &q8_quants, in_dim);
assert!(result.is_finite());
}
#[test]
fn test_fused_q4_0_q8_0_dot_simd_9_blocks() {
let in_dim = 288;
let num_blocks = 9;
let mut q4_data = vec![0u8; num_blocks * 18];
for block in 0..num_blocks {
let start = block * 18;
q4_data[start..start + 2].copy_from_slice(&0x3C00u16.to_le_bytes());
}
let q8_scales = vec![1.0f32; num_blocks];
let q8_quants = vec![1i8; in_dim];
let result = fused_q4_0_q8_0_dot_simd(&q4_data, &q8_scales, &q8_quants, in_dim);
assert!(result.is_finite());
}
#[test]
fn test_block_size_constant() {
assert_eq!(BLOCK_SIZE, 32);
}
#[test]
fn test_qk_k_constant() {
assert_eq!(QK_K, 256);
}
#[test]
fn test_q8_0block_quantize_with_zero_block() {
let values = [0.0f32; 32];
let block = Q8_0Block::quantize(&values);
assert!((block.scale - 1.0 / 127.0).abs() < 1e-10);
for q in &block.quants {
assert_eq!(*q, 0);
}
}
#[test]
fn test_q8_0block_quantize_negative_dominant() {
let mut values = [0.0f32; 32];
values[0] = -100.0;
let block = Q8_0Block::quantize(&values);
assert!((block.scale - 100.0 / 127.0).abs() < 1e-3);
assert_eq!(block.quants[0], -127);
}
#[test]
fn test_q8_0block_debug() {
let values = [1.0f32; 32];
let block = Q8_0Block::quantize(&values);
let debug_str = format!("{:?}", block);
assert!(debug_str.contains("Q8_0Block"));
assert!(debug_str.contains("scale"));
assert!(debug_str.contains("quants"));
}
#[test]
fn test_q8_0block_clone() {
let values = [5.0f32; 32];
let block = Q8_0Block::quantize(&values);
let cloned = block.clone();
assert_eq!(block.scale, cloned.scale);
assert_eq!(block.quants, cloned.quants);
}
#[test]
fn test_fused_q8_0_q8_0_dot_scalar_boundary_in_dim() {
let mut q8_weight_data = vec![0u8; 34];
q8_weight_data[0..2].copy_from_slice(&0x3C00u16.to_le_bytes()); for i in 2..34 {
q8_weight_data[i] = 10u8;
}
let q8_act_scales = vec![1.0f32];
let q8_act_quants = vec![5i8; 32];
let result = fused_q8_0_q8_0_dot_scalar(&q8_weight_data, &q8_act_scales, &q8_act_quants, 20);
assert!(result.is_finite());
}
#[test]
fn test_fused_q8_0_q8_0_dot_scalar_exact_block() {
let mut q8_weight_data = vec![0u8; 34];
q8_weight_data[0..2].copy_from_slice(&0x3C00u16.to_le_bytes());
for i in 2..34 {
q8_weight_data[i] = 1u8;
}
let q8_act_scales = vec![1.0f32];
let q8_act_quants = vec![1i8; 32];
let result = fused_q8_0_q8_0_dot_scalar(&q8_weight_data, &q8_act_scales, &q8_act_quants, 32);
assert!((result - 32.0).abs() < 1.0);
}
#[test]
fn test_fused_q4_0_q8_0_parallel_matvec_above_threshold() {
let in_dim = 32;
let out_dim = 2048;
let bytes_per_row = 18;
let mut weight_data = vec![0u8; out_dim * bytes_per_row];
for row in 0..out_dim {
let start = row * bytes_per_row;
weight_data[start..start + 2].copy_from_slice(&0x3C00u16.to_le_bytes());
}
let activations = vec![0.01f32; in_dim];
let result = fused_q4_0_q8_0_parallel_matvec(&weight_data, &activations, in_dim, out_dim);
assert!(result.is_ok());
let output = result.expect("test value should be present");
assert_eq!(output.len(), out_dim);
for v in &output {
assert!(v.is_finite());
}
}
#[test]
fn test_fused_q8_0_q8_0_parallel_matvec_large() {
let in_dim = 32;
let out_dim = 1024;
let bytes_per_row = 34;
let mut weight_data = vec![0u8; out_dim * bytes_per_row];
for row in 0..out_dim {
let start = row * bytes_per_row;
weight_data[start..start + 2].copy_from_slice(&0x3C00u16.to_le_bytes());
}
let activations = vec![0.1f32; in_dim];
let result = fused_q8_0_q8_0_parallel_matvec(&weight_data, &activations, in_dim, out_dim);
assert!(result.is_ok());
let output = result.expect("test value should be present");
assert_eq!(output.len(), out_dim);
}