#[test]
fn test_f16_to_f32_zero() {
assert!((f16_to_f32(0x0000) - 0.0).abs() < 0.0001);
assert!((f16_to_f32(0x8000) - (-0.0)).abs() < 0.0001);
}
#[test]
fn test_f16_to_f32_one() {
assert!((f16_to_f32(0x3C00) - 1.0).abs() < 0.0001);
assert!((f16_to_f32(0xBC00) - (-1.0)).abs() < 0.0001);
}
#[test]
fn test_f16_to_f32_half() {
assert!((f16_to_f32(0x3800) - 0.5).abs() < 0.0001);
}
#[test]
fn test_f16_to_f32_two() {
assert!((f16_to_f32(0x4000) - 2.0).abs() < 0.0001);
}
#[test]
fn test_f16_to_f32_infinity() {
assert!(f16_to_f32(0x7C00).is_infinite());
assert!(f16_to_f32(0x7C00) > 0.0);
assert!(f16_to_f32(0xFC00).is_infinite());
assert!(f16_to_f32(0xFC00) < 0.0);
}
#[test]
fn test_f16_to_f32_nan() {
assert!(f16_to_f32(0x7C01).is_nan());
assert!(f16_to_f32(0x7FFF).is_nan());
}
#[test]
fn test_f16_to_f32_subnormal() {
let result = f16_to_f32(0x0001);
assert!(result > 0.0);
assert!(result < 0.001); }
#[test]
fn test_extract_scale_min_apr_first_four_blocks() {
let scales = [10, 20, 30, 40, 5, 15, 25, 35, 0, 0, 0, 0];
let (s, m) = extract_scale_min_apr(&scales, 0);
assert!((s - 10.0).abs() < 0.001);
assert!((m - 5.0).abs() < 0.001);
let (s, m) = extract_scale_min_apr(&scales, 1);
assert!((s - 20.0).abs() < 0.001);
assert!((m - 15.0).abs() < 0.001);
let (s, m) = extract_scale_min_apr(&scales, 3);
assert!((s - 40.0).abs() < 0.001);
assert!((m - 35.0).abs() < 0.001);
}
#[test]
fn test_extract_scale_min_apr_last_four_blocks() {
let scales = [0, 0, 0, 0, 0, 0, 0, 0, 0x12, 0x34, 0x56, 0x78];
let (s, m) = extract_scale_min_apr(&scales, 4);
assert!((s - 2.0).abs() < 0.001);
assert!((m - 1.0).abs() < 0.001);
}
#[test]
fn test_dequantize_q4_k_apr_empty() {
let data: Vec<u8> = vec![];
let result = dequantize_q4_k_apr(&data, 0);
assert!(result.is_empty());
}
#[test]
fn test_dequantize_q4_k_apr_insufficient_data() {
let data: Vec<u8> = vec![0; 10]; let result = dequantize_q4_k_apr(&data, 256);
assert_eq!(result.len(), 256);
assert!(result.iter().all(|&x| x == 0.0));
}
#[test]
fn test_dequantize_q4_k_apr_zeros() {
let data = vec![0u8; 144];
let result = dequantize_q4_k_apr(&data, 256);
assert_eq!(result.len(), 256);
assert!(result.iter().all(|&x| x == 0.0));
}
#[test]
fn test_dequantize_q4_k_apr_truncation() {
let data = vec![0u8; 144];
let result = dequantize_q4_k_apr(&data, 100);
assert_eq!(result.len(), 100);
}
#[test]
fn test_dequantize_q6_k_apr_empty() {
let data: Vec<u8> = vec![];
let result = dequantize_q6_k_apr(&data, 0);
assert!(result.is_empty());
}
#[test]
fn test_dequantize_q6_k_apr_insufficient_data() {
let data: Vec<u8> = vec![0; 100]; let result = dequantize_q6_k_apr(&data, 256);
assert_eq!(result.len(), 256);
assert!(result.iter().all(|&x| x == 0.0));
}
#[test]
fn test_dequantize_q6_k_apr_zeros() {
let data = vec![0u8; 210];
let result = dequantize_q6_k_apr(&data, 256);
assert_eq!(result.len(), 256);
assert!(result.iter().all(|&x| x == 0.0));
}
#[test]
fn test_dequantize_q6_k_apr_truncation() {
let data = vec![0u8; 210];
let result = dequantize_q6_k_apr(&data, 100);
assert_eq!(result.len(), 100);
}
#[test]
fn test_dequantize_q6_k_apr_multiple_blocks() {
let data = vec![0u8; 420];
let result = dequantize_q6_k_apr(&data, 512);
assert_eq!(result.len(), 512);
}
#[test]
fn test_dequantize_q8_0_apr_zeros() {
let data = vec![0u8; 34];
let result = dequantize_q8_0_apr(&data, 32);
assert_eq!(result.len(), 32);
assert!(result.iter().all(|&x| x == 0.0));
}
#[test]
fn test_dequantize_q8_0_apr_single_block() {
let mut data = vec![0u8; 34];
data[0] = 0x00; data[1] = 0x3C; for i in 2..34 {
data[i] = 1;
}
let result = dequantize_q8_0_apr(&data, 32);
assert_eq!(result.len(), 32);
for &v in &result {
assert!((v - 1.0).abs() < 0.01, "expected ~1.0, got {v}");
}
}
#[test]
fn test_dequantize_q8_0_apr_negative_quants() {
let mut data = vec![0u8; 34];
data[0] = 0x00;
data[1] = 0x3C; for i in 2..34 {
data[i] = 0xFF;
}
let result = dequantize_q8_0_apr(&data, 32);
assert_eq!(result.len(), 32);
for &v in &result {
assert!((v - (-1.0)).abs() < 0.01, "expected ~-1.0, got {v}");
}
}
#[test]
fn test_dequantize_q8_0_apr_truncation() {
let data = vec![0u8; 34];
let result = dequantize_q8_0_apr(&data, 16);
assert_eq!(result.len(), 16);
}
#[test]
fn test_dequantize_q8_0_apr_multiple_blocks() {
let data = vec![0u8; 68];
let result = dequantize_q8_0_apr(&data, 64);
assert_eq!(result.len(), 64);
}
#[test]
fn test_dequantize_q8_0_apr_insufficient_data() {
let data = vec![0u8; 10];
let result = dequantize_q8_0_apr(&data, 32);
assert_eq!(result.len(), 32);
assert!(result.iter().all(|&x| x == 0.0));
}
#[test]
fn test_dequantize_apr_q8_native_zeros() {
let data = vec![0u8; 36];
let result = dequantize_apr_q8_native(&data, 32);
assert_eq!(result.len(), 32);
assert!(result.iter().all(|&x| x == 0.0));
}
#[test]
fn test_dequantize_apr_q8_native_unit_scale() {
let mut data = Vec::with_capacity(36);
data.extend_from_slice(&1.0f32.to_le_bytes()); for _ in 0..32 {
data.push(1); }
let result = dequantize_apr_q8_native(&data, 32);
assert_eq!(result.len(), 32);
for &v in &result {
assert!((v - 1.0).abs() < 0.001, "expected ~1.0, got {v}");
}
}
#[test]
fn test_dequantize_apr_q8_native_negative_quants() {
let mut data = Vec::with_capacity(36);
data.extend_from_slice(&2.0f32.to_le_bytes());
for _ in 0..32 {
data.push(0xFF); }
let result = dequantize_apr_q8_native(&data, 32);
assert_eq!(result.len(), 32);
for &v in &result {
assert!((v - (-2.0)).abs() < 0.001, "expected ~-2.0, got {v}");
}
}
#[test]
fn test_dequantize_apr_q8_native_insufficient_data() {
let data = vec![0u8; 2];
let result = dequantize_apr_q8_native(&data, 32);
assert_eq!(result.len(), 32);
assert!(result.iter().all(|&x| x == 0.0));
}
#[test]
fn test_dequantize_apr_q8_native_partial_data() {
let mut data = Vec::with_capacity(14);
data.extend_from_slice(&1.0f32.to_le_bytes());
for i in 0..10 {
data.push(i + 1); }
let result = dequantize_apr_q8_native(&data, 32);
assert_eq!(result.len(), 32);
for i in 0..10 {
let expected = (i + 1) as f32;
assert!(
(result[i] - expected).abs() < 0.001,
"result[{i}] = {}, expected {expected}",
result[i]
);
}
for i in 10..32 {
assert!(
result[i] == 0.0,
"result[{i}] = {}, expected 0.0",
result[i]
);
}
}
#[test]
fn test_dequantize_apr_q8_native_roundtrip() {
let original: Vec<f32> = vec![0.5, -0.3, 1.0, -1.0, 0.0];
let max_abs = original.iter().map(|v| v.abs()).fold(0.0f32, f32::max);
let scale = max_abs / 127.0;
let mut data = Vec::new();
data.extend_from_slice(&scale.to_le_bytes());
for &v in &original {
let q = (v / scale).round().clamp(-127.0, 127.0) as i8;
data.push(q as u8);
}
let result = dequantize_apr_q8_native(&data, 5);
assert_eq!(result.len(), 5);
for (i, (&orig, &deq)) in original.iter().zip(result.iter()).enumerate() {
assert!(
(orig - deq).abs() < 0.02,
"element {i}: orig={orig}, deq={deq}"
);
}
}
#[test]
fn test_dequantize_apr_q4_native_zeros() {
let data = vec![0u8; 18];
let result = dequantize_apr_q4_native(&data, 32);
assert_eq!(result.len(), 32);
assert!(result.iter().all(|&x| x == 0.0));
}
#[test]
fn test_dequantize_apr_q4_native_unit_scale_nibble_8() {
let mut data = vec![0u8; 18];
data[0] = 0x00;
data[1] = 0x3C; for i in 2..18 {
data[i] = 0x88; }
let result = dequantize_apr_q4_native(&data, 32);
assert_eq!(result.len(), 32);
for &v in &result {
assert!((v - 0.0).abs() < 0.001, "expected ~0.0, got {v}");
}
}
#[test]
fn test_dequantize_apr_q4_native_known_values() {
let mut data = vec![0u8; 18];
data[0] = 0x00;
data[1] = 0x3C; data[2] = 0x0F; let result = dequantize_apr_q4_native(&data, 2);
assert_eq!(result.len(), 2);
assert!((result[0] - 7.0).abs() < 0.01, "expected 7.0, got {}", result[0]);
assert!((result[1] - (-8.0)).abs() < 0.01, "expected -8.0, got {}", result[1]);
}
#[test]
fn test_dequantize_apr_q4_native_insufficient_data() {
let data: Vec<u8> = vec![];
let result = dequantize_apr_q4_native(&data, 32);
assert_eq!(result.len(), 32);
assert!(result.iter().all(|&x| x == 0.0));
}
#[test]
fn test_dequantize_apr_q4_native_multiple_blocks() {
let data = vec![0u8; 36];
let result = dequantize_apr_q4_native(&data, 64);
assert_eq!(result.len(), 64);
}
#[test]
fn test_dequantize_apr_q4_native_truncation() {
let data = vec![0u8; 18];
let result = dequantize_apr_q4_native(&data, 10);
assert_eq!(result.len(), 10);
}