use crate::error::RealizarError;
use crate::quantize::{
dequantize_q4_0, dequantize_q4_1, dequantize_q5_0, dequantize_q5_1, dequantize_q8_0,
quantize_activations_q8k_into, BLOCK_SIZE, QK_K,
};
#[test]
fn test_q8k_into_valid_single_superblock() {
let activations = vec![1.0f32; 256];
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_q8k_into_valid_multiple_superblocks() {
let activations = vec![0.5f32; 512];
let mut scales = vec![0.0f32; 2];
let mut quants = vec![0i8; 512];
let result = quantize_activations_q8k_into(&activations, &mut scales, &mut quants);
assert!(result.is_ok());
}
#[test]
fn test_q8k_into_error_not_multiple_of_256() {
let activations = vec![1.0f32; 100]; let mut scales = vec![0.0f32; 1];
let mut quants = vec![0i8; 100];
let result = quantize_activations_q8k_into(&activations, &mut scales, &mut quants);
assert!(result.is_err());
match result {
Err(RealizarError::FormatError { reason }) => {
assert!(reason.contains("multiple of 256"));
},
_ => panic!("Expected FormatError"),
}
}
#[test]
fn test_q8k_into_error_scales_too_small() {
let activations = vec![1.0f32; 512]; let mut scales = vec![0.0f32; 1]; let mut quants = vec![0i8; 512];
let result = quantize_activations_q8k_into(&activations, &mut scales, &mut quants);
assert!(result.is_err());
match result {
Err(RealizarError::InvalidShape { reason }) => {
assert!(reason.contains("Scales buffer too small"));
},
_ => panic!("Expected InvalidShape"),
}
}
#[test]
fn test_q8k_into_error_quants_too_small() {
let activations = vec![1.0f32; 256];
let mut scales = vec![0.0f32; 1];
let mut quants = vec![0i8; 100];
let result = quantize_activations_q8k_into(&activations, &mut scales, &mut quants);
assert!(result.is_err());
match result {
Err(RealizarError::InvalidShape { reason }) => {
assert!(reason.contains("Quants buffer too small"));
},
_ => panic!("Expected InvalidShape"),
}
}
#[test]
fn test_q8k_into_empty_input() {
let activations: Vec<f32> = vec![];
let mut scales: Vec<f32> = vec![];
let mut quants: Vec<i8> = vec![];
let result = quantize_activations_q8k_into(&activations, &mut scales, &mut quants);
assert!(result.is_ok());
}
#[test]
fn test_q8k_into_varied_values() {
let mut activations = vec![0.0f32; 256];
for i in 0..256 {
activations[i] = (i as f32 - 128.0) / 128.0; }
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());
let unique: std::collections::HashSet<i8> = quants.iter().copied().collect();
assert!(unique.len() > 1);
}
#[test]
fn test_dequant_q4_0_single_block() {
let mut data = vec![0u8; 18];
data[0..2].copy_from_slice(&0x3C00u16.to_le_bytes());
let result = dequantize_q4_0(&data);
assert!(result.is_ok());
assert_eq!(result.expect("test value should be present").len(), 32);
}
#[test]
fn test_dequant_q4_0_multiple_blocks() {
let num_blocks = 4;
let data = vec![0u8; num_blocks * 18];
let result = dequantize_q4_0(&data);
assert!(result.is_ok());
assert_eq!(result.expect("test value should be present").len(), num_blocks * 32);
}
#[test]
fn test_dequant_q4_0_empty() {
let data: Vec<u8> = vec![];
let result = dequantize_q4_0(&data);
assert!(result.is_ok());
assert!(result.expect("test value should be present").is_empty());
}
#[test]
fn test_dequant_q8_0_single_block() {
let mut data = vec![0u8; 34];
data[0..2].copy_from_slice(&0x3C00u16.to_le_bytes());
let result = dequantize_q8_0(&data);
assert!(result.is_ok());
assert_eq!(result.expect("test value should be present").len(), 32);
}
#[test]
fn test_dequant_q8_0_multiple_blocks() {
let num_blocks = 4;
let data = vec![0u8; num_blocks * 34];
let result = dequantize_q8_0(&data);
assert!(result.is_ok());
assert_eq!(result.expect("test value should be present").len(), num_blocks * 32);
}
#[test]
fn test_dequant_q8_0_nonzero_quants() {
let mut data = vec![0u8; 34];
data[0..2].copy_from_slice(&0x3C00u16.to_le_bytes());
for i in 2..34 {
data[i] = ((i - 2) % 256) as u8;
}
let result = dequantize_q8_0(&data);
assert!(result.is_ok());
let values = result.expect("test value should be present");
assert!(values.iter().any(|&v| v != 0.0));
}
#[test]
fn test_dequant_q4_1_single_block() {
let mut data = vec![0u8; 20];
data[0..2].copy_from_slice(&0x3C00u16.to_le_bytes());
data[2..4].copy_from_slice(&0x0000u16.to_le_bytes());
let result = dequantize_q4_1(&data);
assert!(result.is_ok());
assert_eq!(result.expect("test value should be present").len(), 32);
}
#[test]
fn test_dequant_q4_1_multiple_blocks() {
let num_blocks = 3;
let data = vec![0u8; num_blocks * 20];
let result = dequantize_q4_1(&data);
assert!(result.is_ok());
assert_eq!(result.expect("test value should be present").len(), num_blocks * 32);
}
#[test]
fn test_dequant_q5_0_single_block() {
let mut data = vec![0u8; 22];
data[0..2].copy_from_slice(&0x3C00u16.to_le_bytes());
let result = dequantize_q5_0(&data);
assert!(result.is_ok());
assert_eq!(result.expect("test value should be present").len(), 32);
}
#[test]
fn test_dequant_q5_0_multiple_blocks() {
let num_blocks = 2;
let data = vec![0u8; num_blocks * 22];
let result = dequantize_q5_0(&data);
assert!(result.is_ok());
assert_eq!(result.expect("test value should be present").len(), num_blocks * 32);
}
#[test]
fn test_dequant_q5_1_single_block() {
let mut data = vec![0u8; 24];
data[0..2].copy_from_slice(&0x3C00u16.to_le_bytes());
data[2..4].copy_from_slice(&0x0000u16.to_le_bytes());
let result = dequantize_q5_1(&data);
assert!(result.is_ok());
assert_eq!(result.expect("test value should be present").len(), 32);
}
#[test]
fn test_dequant_q5_1_multiple_blocks() {
let num_blocks = 2;
let data = vec![0u8; num_blocks * 24];
let result = dequantize_q5_1(&data);
assert!(result.is_ok());
assert_eq!(result.expect("test value should be present").len(), num_blocks * 32);
}
#[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_dequant_q4_0_large() {
let data = vec![0u8; 100 * 18];
let result = dequantize_q4_0(&data);
assert!(result.is_ok());
assert_eq!(result.expect("test value should be present").len(), 3200);
}
#[test]
fn test_dequant_q8_0_all_positive_quants() {
let mut data = vec![0u8; 34];
data[0..2].copy_from_slice(&0x211Eu16.to_le_bytes());
for i in 2..34 {
data[i] = 127;
}
let result = dequantize_q8_0(&data);
assert!(result.is_ok());
let values = result.expect("test value should be present");
assert!(values.iter().all(|&v| v > 0.0));
}
#[test]
fn test_dequant_q8_0_all_negative_quants() {
let mut data = vec![0u8; 34];
data[0..2].copy_from_slice(&0x211Eu16.to_le_bytes());
for i in 2..34 {
data[i] = 128; }
let result = dequantize_q8_0(&data);
assert!(result.is_ok());
let values = result.expect("test value should be present");
assert!(values.iter().all(|&v| v < 0.0));
}
#[test]
fn test_q8k_into_large_values() {
let mut activations = vec![0.0f32; 256];
for i in 0..256 {
activations[i] = (i as f32) * 100.0; }
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] > 10.0);
}
#[test]
fn test_q8k_into_negative_values() {
let activations = vec![-1.0f32; 256];
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!(quants.iter().all(|&q| q < 0));
}