#[test]
fn test_quantize_to_q8_blocks_valid() {
let values = vec![1.0f32; 64]; let blocks = quantize_to_q8_blocks(&values).expect("test");
assert_eq!(blocks.len(), 2);
}
#[test]
fn test_quantize_to_q8_blocks_error_cov() {
let values = vec![1.0f32; 50]; let result = quantize_to_q8_blocks(&values);
assert!(result.is_err());
}
#[test]
fn test_dequantize_q8_blocks() {
let values: Vec<f32> = (0..32).map(|i| (i as f32 - 16.0) / 10.0).collect();
let blocks = quantize_to_q8_blocks(&values).expect("test");
let dequant = dequantize_q8_blocks(&blocks);
assert_eq!(dequant.len(), 32);
for (o, d) in values.iter().zip(dequant.iter()) {
assert!((o - d).abs() < 0.02);
}
}
#[test]
fn test_q8ksuperblock_quantize_into() {
let values: Vec<f32> = (0..256).map(|i| (i as f32 - 128.0) / 100.0).collect();
let mut scale: f32 = 0.0;
let mut quants = vec![0i8; 256];
Q8KSuperBlock::quantize_into(&values, &mut scale, &mut quants);
assert!(scale > 0.0);
let non_zero: usize = quants.iter().filter(|&&q| q != 0).count();
assert!(non_zero > 200);
}
#[test]
fn test_f16_to_f32_half_cov() {
let half = f16_to_f32(0x3800);
assert!((half - 0.5).abs() < 0.001);
}
#[test]
fn test_f16_to_f32_two_cov() {
let two = f16_to_f32(0x4000);
assert!((two - 2.0).abs() < 0.001);
}
#[test]
fn test_f16_to_f32_small_positive_cov() {
let small = f16_to_f32(0x0001);
assert!(small > 0.0 && small < 0.0001);
}
#[test]
fn test_dequantize_q4_0_empty_cov() {
let data: Vec<u8> = vec![];
let result = dequantize_q4_0(&data);
assert!(result.is_ok());
assert!(result.expect("quantization failed").is_empty());
}
#[test]
fn test_dequantize_q4_0_invalid_size_cov() {
let data = vec![0u8; 17]; let result = dequantize_q4_0(&data);
assert!(result.is_err());
}
#[test]
fn test_dequantize_q8_0_empty_cov() {
let data: Vec<u8> = vec![];
let result = dequantize_q8_0(&data);
assert!(result.is_ok());
assert!(result.expect("quantization failed").is_empty());
}
#[test]
fn test_dequantize_q8_0_invalid_size_cov() {
let data = vec![0u8; 33]; let result = dequantize_q8_0(&data);
assert!(result.is_err());
}
#[test]
fn test_dequantize_f16_empty_cov() {
let data: Vec<u8> = vec![];
let result = dequantize_f16(&data);
assert!(result.is_ok());
assert!(result.expect("quantization failed").is_empty());
}
#[test]
fn test_dequantize_f16_odd_size_cov() {
let data = vec![0u8; 3]; let result = dequantize_f16(&data);
assert!(result.is_err());
}
#[test]
fn test_q8_0block_quantization_error_cov() {
let values: [f32; 32] = std::array::from_fn(|i| (i as f32 - 16.0) * 0.1);
let block = Q8_0Block::quantize(&values);
let error = block.quantization_error(&values);
assert!(error < 0.1);
}
#[test]
fn test_q8_0block_relative_error_cov() {
let values: [f32; 32] = std::array::from_fn(|i| (i as f32 + 1.0) * 0.1);
let block = Q8_0Block::quantize(&values);
let rel_error = block.relative_error(&values);
assert!(rel_error < 0.1);
}
#[test]
fn test_q8ksuperblock_quantize_cov() {
let values: [f32; 256] = std::array::from_fn(|i| (i as f32 - 128.0) * 0.01);
let block = Q8KSuperBlock::quantize(&values);
assert!(block.scale > 0.0 || values.iter().all(|&v| v.abs() < 1e-6));
}
#[test]
fn test_q8ksuperblock_dequantize_cov() {
let values: [f32; 256] = std::array::from_fn(|i| (i as f32 - 128.0) * 0.01);
let block = Q8KSuperBlock::quantize(&values);
let dequant = block.dequantize();
assert_eq!(dequant.len(), 256);
for (o, d) in values.iter().zip(dequant.iter()) {
assert!((o - d).abs() < 0.05);
}
}
#[test]
fn test_interleavedq4k_num_values_cov() {
let q4k_data = vec![0u8; 144];
let interleaved = InterleavedQ4K::from_q4k(&q4k_data);
assert!(interleaved.is_ok());
let interleaved = interleaved.expect("quantization failed");
assert_eq!(interleaved.num_values(), 256);
}
#[test]
fn test_fused_q4k_dot_length_mismatch_cov() {
let q4k_data = vec![0u8; 144]; let activations = vec![1.0f32; 100]; let result = fused_q4k_dot(&q4k_data, &activations);
assert!(result.is_err());
}
#[test]
fn test_fused_q6k_dot_length_mismatch_cov() {
let q6k_data = vec![0u8; 210];
let activations = vec![1.0f32; 100]; let result = fused_q6k_dot(&q6k_data, &activations);
assert!(result.is_err());
}
#[test]
fn test_fused_q5k_dot_length_mismatch_cov() {
let q5k_data = vec![0u8; 176];
let activations = vec![1.0f32; 100]; let result = fused_q5k_dot(&q5k_data, &activations);
assert!(result.is_err());
}
#[test]
fn test_quantize_activations_q8k_into_success_cov() {
let activations: Vec<f32> = (0..256).map(|i| (i as f32 - 128.0) * 0.01).collect();
let mut scales = vec![0.0f32; 1];
let mut quants = vec![0i8; 256];
let result = quantize_activations_q8k_into(&activations, &mut scales, &mut quants);
assert!(result.is_ok());
assert!(scales[0] > 0.0);
}
#[test]
fn test_dequantize_q4_1_invalid_size_cov() {
let data = vec![0u8; 19]; let result = dequantize_q4_1(&data);
assert!(result.is_err());
}
#[test]
fn test_dequantize_q4_1_empty_cov() {
let data: Vec<u8> = vec![];
let result = dequantize_q4_1(&data);
assert!(result.is_ok());
assert!(result.expect("quantization failed").is_empty());
}
#[test]
fn test_dequantize_q5_0_invalid_size_cov() {
let data = vec![0u8; 21]; let result = dequantize_q5_0(&data);
assert!(result.is_err());
}
#[test]
fn test_dequantize_q5_0_empty_cov() {
let data: Vec<u8> = vec![];
let result = dequantize_q5_0(&data);
assert!(result.is_ok());
assert!(result.expect("quantization failed").is_empty());
}
#[test]
fn test_dequantize_q5_1_invalid_size_cov() {
let data = vec![0u8; 23]; let result = dequantize_q5_1(&data);
assert!(result.is_err());
}
#[test]
fn test_dequantize_q5_1_empty_cov() {
let data: Vec<u8> = vec![];
let result = dequantize_q5_1(&data);
assert!(result.is_ok());
assert!(result.expect("quantization failed").is_empty());
}
#[test]
fn test_fused_q4k_q8_dot_invalid_q4k_size_cov() {
let q4k_data = vec![0u8; 100]; let values: [f32; 32] = [0.0; 32];
let q8_blocks = vec![Q8_0Block::quantize(&values); 8];
let result = fused_q4k_q8_dot(&q4k_data, &q8_blocks);
assert!(result.is_err());
}
#[test]
fn test_fused_q4k_q8_dot_block_mismatch_cov() {
let q4k_data = vec![0u8; 144]; let values: [f32; 32] = [0.0; 32];
let q8_blocks = vec![Q8_0Block::quantize(&values); 4]; let result = fused_q4k_q8_dot(&q4k_data, &q8_blocks);
assert!(result.is_err());
}
#[test]
fn test_fused_q4k_q8k_dot_invalid_q4k_size_cov() {
let q4k_data = vec![0u8; 100]; let scales = vec![1.0f32; 1];
let quants = vec![0i8; 256];
let result = fused_q4k_q8k_dot(&q4k_data, &scales, &quants);
assert!(result.is_err());
}
#[test]
fn test_fused_q4k_q8k_dot_scale_too_few_cov() {
let q4k_data = vec![0u8; 288]; let scales = vec![1.0f32; 1]; let quants = vec![0i8; 512];
let result = fused_q4k_q8k_dot(&q4k_data, &scales, &quants);
assert!(result.is_err());
}
#[test]
fn test_quantize_to_q8_blocks_not_multiple_cov() {
let values = vec![1.0f32; 30]; let result = quantize_to_q8_blocks(&values);
assert!(result.is_err());
}
#[test]
fn test_quantize_to_q8_blocks_empty_cov() {
let values: Vec<f32> = vec![];
let result = quantize_to_q8_blocks(&values);
assert!(result.is_ok());
assert!(result.expect("quantization failed").is_empty());
}
#[test]
fn test_quantize_to_q8_blocks_one_block_cov() {
let values: Vec<f32> = (0..32).map(|i| i as f32 * 0.1).collect();
let result = quantize_to_q8_blocks(&values);
assert!(result.is_ok());
assert_eq!(result.expect("quantization failed").len(), 1);
}