use super::super::*;
#[test]
fn test_f16_to_f32_nan() {
let nan_val = f16_to_f32(0x7C01);
assert!(nan_val.is_nan(), "0x7C01 should be NaN");
}
#[test]
fn test_f16_to_f32_negative_normal() {
let val = f16_to_f32(0xC000);
assert!((val - (-2.0)).abs() < 1e-3, "Expected -2.0, got {}", val);
}
#[test]
fn test_f16_to_f32_smallest_normal() {
let val = f16_to_f32(0x0400);
assert!(val > 0.0 && val < 0.001, "Expected small normal, got {}", val);
}
#[test]
fn test_f16_to_f32_largest_normal() {
let val = f16_to_f32(0x7BFF);
assert!((val - 65504.0).abs() < 100.0, "Expected ~65504, got {}", val);
}
#[test]
fn test_f16_to_f32_negative_subnormal() {
let val = f16_to_f32(0x8001);
assert!(val < 0.0 && val > -1e-4, "Expected small negative, got {}", val);
}
#[test]
fn test_parse_q4k_header_all_zeros() {
let block = vec![0u8; 144];
let (d, dmin, scales, mins) = parse_q4k_header(&block);
assert_eq!(d, 0.0);
assert_eq!(dmin, 0.0);
assert_eq!(scales, [0u8; 8]);
assert_eq!(mins, [0u8; 8]);
}
#[test]
fn test_parse_q4k_header_max_values() {
let mut block = vec![0xFFu8; 144];
block[0] = 0xFF;
block[1] = 0x7B; block[2] = 0xFF;
block[3] = 0x7B; let (d, dmin, scales, mins) = parse_q4k_header(&block);
assert!(d.is_finite(), "d should be finite");
assert!(dmin.is_finite(), "dmin should be finite");
for i in 0..8 {
assert!(scales[i] > 0 || mins[i] > 0 || i >= 4);
}
}
#[test]
fn test_dequantize_q4k_multi_block() {
let num_elements = 512; let mut data = Vec::new();
for _ in 0..2 {
data.extend_from_slice(&[0x00, 0x3C]); data.extend_from_slice(&[0x00, 0x00]); data.extend_from_slice(&[0x01u8; 12]); data.extend_from_slice(&[0x77u8; 128]); }
let result = dequantize_q4k_to_f32(&data, num_elements);
assert_eq!(result.len(), num_elements);
for val in &result {
assert!(val.is_finite());
}
}
#[test]
#[allow(deprecated)]
fn test_colmajor_sparse_input() {
let in_dim = 256;
let out_dim = 2;
let mut q4k_data = Vec::new();
for _ in 0..out_dim {
q4k_data.extend_from_slice(&[0x00, 0x3C]); q4k_data.extend_from_slice(&[0x00, 0x00]); q4k_data.extend_from_slice(&[0x01u8; 12]); q4k_data.extend_from_slice(&[0x55u8; 128]); }
let mut input = vec![0.0f32; in_dim];
input[0] = 1.0;
let output = matmul_q4k_f32_colmajor(&q4k_data, &input, out_dim, in_dim);
assert_eq!(output.len(), out_dim);
assert!(output[0].is_finite());
}
#[test]
fn test_matmul_q4k_f32_optimized_remainder() {
let in_dim = 256;
let out_dim = 1;
let mut q4k_data = Vec::new();
q4k_data.extend_from_slice(&[0x00, 0x3C]); q4k_data.extend_from_slice(&[0x00, 0x00]); q4k_data.extend_from_slice(&[0x01u8; 12]); for i in 0..128 {
q4k_data.push(((i % 16) | (((i + 1) % 16) << 4)) as u8);
}
let input = vec![1.0f32; in_dim];
let scalar = matmul_q4k_f32_scalar(&q4k_data, &input, out_dim, in_dim);
let optimized = matmul_q4k_f32(&q4k_data, &input, out_dim, in_dim);
let diff = (scalar[0] - optimized[0]).abs();
assert!(diff < 1e-3, "Scalar {} vs optimized {}, diff={}", scalar[0], optimized[0], diff);
}