use crate::quantize::parallel_dequant::{
apply_rope_rotation_scalar, apply_rope_rotation_simd, dequantize_q4_k_parallel,
dequantize_q4_k_simd, dequantize_q4_k_superblock, dequantize_q8_0_block,
dequantize_q8_0_parallel, dequantize_q8_0_simd,
};
use crate::quantize::types::QK_K;
fn generate_q4k_superblock_data(num_super_blocks: usize) -> Vec<u8> {
const SUPER_BLOCK_BYTES: usize = 144;
let mut data = vec![0u8; num_super_blocks * SUPER_BLOCK_BYTES];
for sb in 0..num_super_blocks {
let sb_start = sb * SUPER_BLOCK_BYTES;
data[sb_start] = 0x00;
data[sb_start + 1] = 0x3C;
data[sb_start + 2] = 0x00;
data[sb_start + 3] = 0x38;
for i in 0..12 {
data[sb_start + 4 + i] = ((sb * 7 + i * 13) % 64) as u8;
}
for i in 0..128 {
data[sb_start + 16 + i] = ((sb * 11 + i * 17) % 256) as u8;
}
}
data
}
fn generate_q8_0_block_data(num_blocks: usize) -> Vec<u8> {
const BLOCK_BYTES: usize = 34;
let mut data = vec![0u8; num_blocks * BLOCK_BYTES];
for block in 0..num_blocks {
let block_start = block * BLOCK_BYTES;
data[block_start] = 0x00;
data[block_start + 1] = 0x38;
for i in 0..32 {
data[block_start + 2 + i] = ((block * 7 + i * 5) % 256) as u8;
}
}
data
}
#[test]
fn test_dequantize_q4_k_parallel_single_superblock_p19() {
let data = generate_q4k_superblock_data(1);
let result = dequantize_q4_k_parallel(&data);
assert!(result.is_ok());
let output = result.expect("test value should be present");
assert_eq!(output.len(), QK_K);
for val in &output {
assert!(val.is_finite(), "Value should be finite: {}", val);
}
}
#[test]
fn test_dequantize_q4_k_parallel_multiple_superblocks_p19() {
let num_super_blocks = 5;
let data = generate_q4k_superblock_data(num_super_blocks);
let result = dequantize_q4_k_parallel(&data);
assert!(result.is_ok());
let output = result.expect("test value should be present");
assert_eq!(output.len(), num_super_blocks * QK_K);
for val in &output {
assert!(val.is_finite());
}
}
#[test]
fn test_dequantize_q4_k_parallel_large_input_p19() {
let num_super_blocks = 64;
let data = generate_q4k_superblock_data(num_super_blocks);
let result = dequantize_q4_k_parallel(&data);
assert!(result.is_ok());
let output = result.expect("test value should be present");
assert_eq!(output.len(), num_super_blocks * QK_K);
}
#[test]
fn test_dequantize_q4_k_parallel_invalid_size_too_small_p19() {
let data = vec![0u8; 100]; let result = dequantize_q4_k_parallel(&data);
assert!(result.is_err());
let err = result.unwrap_err();
assert!(err.to_string().contains("not a multiple"));
}
#[test]
fn test_dequantize_q4_k_parallel_invalid_size_partial_p19() {
let data = vec![0u8; 216];
let result = dequantize_q4_k_parallel(&data);
assert!(result.is_err());
}
#[test]
fn test_dequantize_q4_k_parallel_empty_input_p19() {
let data: Vec<u8> = vec![];
let result = dequantize_q4_k_parallel(&data);
assert!(result.is_ok());
assert_eq!(result.expect("test value should be present").len(), 0);
}
#[test]
fn test_dequantize_q4_k_parallel_deterministic_p19() {
let data = generate_q4k_superblock_data(4);
let result1 = dequantize_q4_k_parallel(&data).expect("test value should be present");
let result2 = dequantize_q4_k_parallel(&data).expect("test value should be present");
let result3 = dequantize_q4_k_parallel(&data).expect("test value should be present");
for i in 0..result1.len() {
assert_eq!(
result1[i], result2[i],
"Mismatch at index {} between runs 1-2",
i
);
assert_eq!(
result2[i], result3[i],
"Mismatch at index {} between runs 2-3",
i
);
}
}
#[test]
fn test_dequantize_q4_k_parallel_scale_variations_p19() {
let mut data = generate_q4k_superblock_data(2);
data[0] = 0x00;
data[1] = 0x40;
data[144] = 0x00;
data[145] = 0x34;
let result = dequantize_q4_k_parallel(&data);
assert!(result.is_ok());
let output = result.expect("test value should be present");
let sum_first: f32 = output[..QK_K].iter().map(|v| v.abs()).sum();
let sum_second: f32 = output[QK_K..].iter().map(|v| v.abs()).sum();
assert!(
sum_first > sum_second * 0.5, "Expected first super-block to have larger values"
);
}
#[test]
fn test_dequantize_q4_k_simd_single_superblock_p19() {
let data = generate_q4k_superblock_data(1);
let result = dequantize_q4_k_simd(&data);
assert!(result.is_ok());
let output = result.expect("test value should be present");
assert_eq!(output.len(), QK_K);
}
#[test]
fn test_dequantize_q4_k_simd_multiple_superblocks_p19() {
let num_super_blocks = 8;
let data = generate_q4k_superblock_data(num_super_blocks);
let result = dequantize_q4_k_simd(&data);
assert!(result.is_ok());
let output = result.expect("test value should be present");
assert_eq!(output.len(), num_super_blocks * QK_K);
}
#[test]
fn test_dequantize_q4_k_simd_parity_with_parallel_p19() {
let data = generate_q4k_superblock_data(4);
let simd_result = dequantize_q4_k_simd(&data).expect("test value should be present");
let parallel_result = dequantize_q4_k_parallel(&data).expect("test value should be present");
assert_eq!(simd_result.len(), parallel_result.len());
for i in 0..simd_result.len() {
let diff = (simd_result[i] - parallel_result[i]).abs();
assert!(
diff < 1e-6,
"SIMD/parallel mismatch at {}: simd={}, parallel={}, diff={}",
i,
simd_result[i],
parallel_result[i],
diff
);
}
}
#[test]
fn test_dequantize_q4_k_simd_large_for_avx2_path_p19() {
let num_super_blocks = 130;
let data = generate_q4k_superblock_data(num_super_blocks);
let result = dequantize_q4_k_simd(&data);
assert!(result.is_ok());
let output = result.expect("test value should be present");
assert_eq!(output.len(), num_super_blocks * QK_K);
}
#[test]
fn test_dequantize_q4_k_simd_small_for_sequential_path_p19() {
let num_super_blocks = 2;
let data = generate_q4k_superblock_data(num_super_blocks);
let result = dequantize_q4_k_simd(&data);
assert!(result.is_ok());
let output = result.expect("test value should be present");
assert_eq!(output.len(), num_super_blocks * QK_K);
}
#[test]
fn test_dequantize_q4_k_simd_invalid_size_p19() {
let data = vec![0u8; 100]; let result = dequantize_q4_k_simd(&data);
assert!(result.is_err());
}
#[test]
fn test_dequantize_q4_k_superblock_basic_p19() {
let data = generate_q4k_superblock_data(1);
let sb_data = &data[0..144];
let output = dequantize_q4_k_superblock(sb_data);
assert_eq!(output.len(), QK_K);
for val in &output {
assert!(val.is_finite());
}
}
#[test]
fn test_dequantize_q4_k_superblock_all_zeros_p19() {
let sb_data = vec![0u8; 144];
let output = dequantize_q4_k_superblock(&sb_data);
assert_eq!(output.len(), QK_K);
for val in &output {
assert_eq!(*val, 0.0);
}
}
#[test]
fn test_dequantize_q4_k_superblock_max_nibble_values_p19() {
let mut sb_data = vec![0u8; 144];
sb_data[0] = 0x00;
sb_data[1] = 0x3C;
sb_data[2] = 0x00;
sb_data[3] = 0x00;
for i in 0..12 {
sb_data[4 + i] = 1;
}
for i in 0..128 {
sb_data[16 + i] = 0xFF;
}
let output = dequantize_q4_k_superblock(&sb_data);
assert_eq!(output.len(), QK_K);
for val in &output {
assert!(val.is_finite());
}
}
#[test]
fn test_dequantize_q4_k_superblock_alternating_pattern_p19() {
let mut sb_data = vec![0u8; 144];
sb_data[0] = 0x00;
sb_data[1] = 0x3C; sb_data[2] = 0x00;
sb_data[3] = 0x38;
for i in 0..12 {
sb_data[4 + i] = 0x01;
}
for i in 0..128 {
sb_data[16 + i] = if i % 2 == 0 { 0x0F } else { 0xF0 };
}
let output = dequantize_q4_k_superblock(&sb_data);
assert_eq!(output.len(), QK_K);
}
#[test]
fn test_dequantize_q8_0_parallel_single_block_p19() {
let data = generate_q8_0_block_data(1);
let result = dequantize_q8_0_parallel(&data);
assert!(result.is_ok());
let output = result.expect("test value should be present");
assert_eq!(output.len(), 32); }
#[test]
fn test_dequantize_q8_0_parallel_multiple_blocks_p19() {
let num_blocks = 10;
let data = generate_q8_0_block_data(num_blocks);
let result = dequantize_q8_0_parallel(&data);
assert!(result.is_ok());
let output = result.expect("test value should be present");
assert_eq!(output.len(), num_blocks * 32);
}
#[test]
fn test_dequantize_q8_0_parallel_large_input_p19() {
let num_blocks = 100;
let data = generate_q8_0_block_data(num_blocks);
let result = dequantize_q8_0_parallel(&data);
assert!(result.is_ok());
let output = result.expect("test value should be present");
assert_eq!(output.len(), num_blocks * 32);
}
#[test]
fn test_dequantize_q8_0_parallel_invalid_size_p19() {
let data = vec![0u8; 50]; let result = dequantize_q8_0_parallel(&data);
assert!(result.is_err());
let err = result.unwrap_err();
assert!(err.to_string().contains("not a multiple"));
}
#[test]
fn test_dequantize_q8_0_parallel_empty_input_p19() {
let data: Vec<u8> = vec![];
let result = dequantize_q8_0_parallel(&data);
assert!(result.is_ok());
assert_eq!(result.expect("test value should be present").len(), 0);
}
#[test]
fn test_dequantize_q8_0_parallel_deterministic_p19() {
let data = generate_q8_0_block_data(8);
let result1 = dequantize_q8_0_parallel(&data).expect("test value should be present");
let result2 = dequantize_q8_0_parallel(&data).expect("test value should be present");
for i in 0..result1.len() {
assert_eq!(result1[i], result2[i], "Non-deterministic at index {}", i);
}
}
include!("dequantize_07.rs");
include!("q4k_simd.rs");