#[test]
fn test_detect_simd_backend_returns_valid() {
let backend = detect_simd_backend();
match backend {
SimdBackend::Scalar | SimdBackend::Avx2 | SimdBackend::Sse2 | SimdBackend::Neon => {},
}
}
#[test]
fn test_apply_rope_rotation_simd_basic_coverage() {
let mut x1 = vec![1.0f32; 32];
let mut x2 = vec![1.0f32; 32];
let cos = vec![1.0f32; 32];
let sin = vec![0.0f32; 32];
apply_rope_rotation_simd(&mut x1, &mut x2, &cos, &sin);
for &v in &x1 {
assert!((v - 1.0).abs() < 1e-5);
}
}
#[test]
fn test_apply_rope_rotation_simd_with_rotation() {
let mut x1 = vec![1.0f32; 32];
let mut x2 = vec![0.0f32; 32];
let cos = vec![0.0f32; 32]; let sin = vec![1.0f32; 32]; apply_rope_rotation_simd(&mut x1, &mut x2, &cos, &sin);
assert!(x1[0].abs() < 1e-4);
assert!((x2[0] - 1.0).abs() < 1e-4);
}
#[test]
fn test_fused_swiglu_simd_various_sizes() {
for size in [16, 32, 64, 100] {
let mut gate = vec![1.0f32; size];
let up = vec![2.0f32; size];
fused_swiglu_simd(&mut gate, &up);
for &v in &gate {
assert!(v.is_finite());
}
}
}
#[test]
fn test_fused_swiglu_simd_negative_values() {
let mut gate = vec![-1.0f32; 32];
let up = vec![2.0f32; 32];
fused_swiglu_simd(&mut gate, &up);
for &v in &gate {
assert!(v.is_finite());
}
}
#[test]
fn test_softmax_simd_negative_values() {
let mut x = vec![-1.0f32, -2.0, -3.0, -4.0];
softmax_simd(&mut x);
let sum: f32 = x.iter().sum();
assert!((sum - 1.0).abs() < 1e-5);
}
#[test]
fn test_softmax_simd_large_values() {
let mut x = vec![100.0f32, 200.0, 300.0, 400.0];
softmax_simd(&mut x);
let sum: f32 = x.iter().sum();
assert!((sum - 1.0).abs() < 1e-5);
}
#[test]
fn test_softmax_simd_mixed_values() {
let mut x = vec![-10.0f32, 0.0, 10.0, 20.0];
softmax_simd(&mut x);
let sum: f32 = x.iter().sum();
assert!((sum - 1.0).abs() < 1e-5);
assert!(x[3] > x[2]);
assert!(x[2] > x[1]);
assert!(x[1] > x[0]);
}
#[test]
fn test_quantize_activations_q8_0_various_sizes() {
for size in [32, 64, 128, 256] {
let activations: Vec<f32> = (0..size).map(|i| i as f32 / 10.0).collect();
let (scales, quants) = quantize_activations_q8_0(&activations);
assert_eq!(scales.len(), size / 32);
assert_eq!(quants.len(), size);
}
}
#[test]
fn test_quantize_activations_q8_0_negative_values() {
let activations: Vec<f32> = (0..32).map(|i| -i as f32 / 10.0).collect();
let (scales, quants) = quantize_activations_q8_0(&activations);
assert_eq!(scales.len(), 1);
assert!(scales[0] > 0.0);
for &q in &quants[1..] {
assert!(q <= 0);
}
}
#[test]
fn test_fused_q4_0_q8_0_parallel_matvec_weight_error() {
let weight_data = vec![0u8; 10]; let activations = vec![1.0f32; 32];
let result = fused_q4_0_q8_0_parallel_matvec(&weight_data, &activations, 32, 2);
assert!(result.is_err());
}
#[test]
fn test_fused_q4_0_q8_0_parallel_matvec_into_weight_error() {
let weight_data = vec![0u8; 10]; let activations = vec![1.0f32; 32];
let mut output = vec![0.0f32; 2];
let result = fused_q4_0_q8_0_parallel_matvec_into(&weight_data, &activations, 32, &mut output);
assert!(result.is_err());
}
#[test]
fn test_fused_q8_0_q8_0_parallel_matvec_weight_error() {
let weight_data = vec![0u8; 10]; let activations = vec![1.0f32; 32];
let result = fused_q8_0_q8_0_parallel_matvec(&weight_data, &activations, 32, 2);
assert!(result.is_err());
}
#[test]
fn test_fused_q8_0_q8_0_parallel_matvec_into_weight_error() {
let weight_data = vec![0u8; 10]; let activations = vec![1.0f32; 32];
let mut output = vec![0.0f32; 2];
let result =
fused_q8_0_q8_0_parallel_matvec_into(&weight_data, &activations, 32, 2, &mut output);
assert!(result.is_err());
}
#[test]
fn test_dequantize_q4_k_parallel_invalid() {
let data = vec![0u8; 100]; let result = dequantize_q4_k_parallel(&data);
assert!(result.is_err());
}
#[test]
fn test_dequantize_q4_k_simd_invalid() {
let data = vec![0u8; 100];
let result = dequantize_q4_k_simd(&data);
assert!(result.is_err());
}
#[test]
fn test_dequantize_q8_0_parallel_invalid() {
let data = vec![0u8; 10]; let result = dequantize_q8_0_parallel(&data);
assert!(result.is_err());
}
#[test]
fn test_dequantize_q8_0_simd_invalid() {
let data = vec![0u8; 10];
let result = dequantize_q8_0_simd(&data);
assert!(result.is_err());
}
#[test]
fn test_q8_0_block_quantize_cov() {
let values: [f32; 32] = [1.0; 32];
let block = Q8_0Block::quantize(&values);
assert!(block.scale > 0.0);
assert_eq!(block.quants.len(), 32);
}
#[test]
fn test_q8_0_block_quantize_zeros_cov() {
let values: [f32; 32] = [0.0; 32];
let block = Q8_0Block::quantize(&values);
assert!(block.scale > 0.0);
for q in &block.quants {
assert_eq!(*q, 0);
}
}
#[test]
fn test_q8_0_block_quantize_mixed_cov() {
let mut values: [f32; 32] = [0.0; 32];
for i in 0..32 {
values[i] = (i as f32 - 16.0) * 0.1;
}
let block = Q8_0Block::quantize(&values);
assert!(block.scale > 0.0);
}
#[test]
fn test_q8_0_block_dequantize_cov() {
let values: [f32; 32] = [1.0; 32];
let block = Q8_0Block::quantize(&values);
let dequantized = block.dequantize();
assert_eq!(dequantized.len(), 32);
for v in &dequantized {
assert!((*v - 1.0).abs() < 0.1); }
}
#[test]
fn test_q8_0_block_quantization_error_cov() {
let values: [f32; 32] = [1.0; 32];
let block = Q8_0Block::quantize(&values);
let error = block.quantization_error(&values);
assert!(error < 0.1);
}
#[test]
fn test_q8_0_block_relative_error_cov() {
let values: [f32; 32] = [1.0; 32];
let block = Q8_0Block::quantize(&values);
let rel_error = block.relative_error(&values);
assert!(rel_error < 0.1);
}
#[test]
fn test_q8_0_block_relative_error_zeros_cov() {
let values: [f32; 32] = [0.0; 32];
let block = Q8_0Block::quantize(&values);
let rel_error = block.relative_error(&values);
assert_eq!(rel_error, 0.0);
}
#[test]
fn test_f16_to_f32_zero_cov() {
let result = f16_to_f32(0);
assert_eq!(result, 0.0);
}
#[test]
fn test_f16_to_f32_one_cov() {
let result = f16_to_f32(0x3C00);
assert!((result - 1.0).abs() < 1e-3);
}
#[test]
fn test_f16_to_f32_negative_cov() {
let result = f16_to_f32(0xBC00);
assert!((result + 1.0).abs() < 1e-3);
}
#[test]
fn test_dequantize_q4_0_valid_cov() {
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());
let values = result.expect("test");
assert_eq!(values.len(), 32);
}
#[test]
fn test_dequantize_q8_0_valid_cov() {
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());
let values = result.expect("test");
assert_eq!(values.len(), 32);
}
#[test]
fn test_dequantize_f16_valid_cov() {
let mut data = vec![0u8; 4];
data[0..2].copy_from_slice(&0x3C00u16.to_le_bytes()); data[2..4].copy_from_slice(&0x4000u16.to_le_bytes()); let result = dequantize_f16(&data);
assert!(result.is_ok());
let values = result.expect("test");
assert_eq!(values.len(), 2);
}
#[test]
fn test_dequantize_f16_invalid_odd_length_cov() {
let data = vec![0u8; 3]; let result = dequantize_f16(&data);
assert!(result.is_err());
}
#[test]
fn test_quantize_to_q8_blocks_valid_cov() {
let values = vec![1.0f32; 64]; let result = quantize_to_q8_blocks(&values);
assert!(result.is_ok());
let blocks = result.expect("test");
assert_eq!(blocks.len(), 2);
}
#[test]
fn test_quantize_to_q8_blocks_invalid_length_cov() {
let values = vec![1.0f32; 33]; let result = quantize_to_q8_blocks(&values);
assert!(result.is_err());
}
#[test]
fn test_dequantize_q8_blocks_cov() {
let values = vec![1.0f32; 32];
let blocks = quantize_to_q8_blocks(&values).expect("test");
let dequantized = dequantize_q8_blocks(&blocks);
assert_eq!(dequantized.len(), 32);
}
#[test]
fn test_softmax_simd_basic_cov() {
let mut x = vec![1.0f32, 2.0, 3.0];
softmax_simd(&mut x);
let sum: f32 = x.iter().sum();
assert!((sum - 1.0).abs() < 1e-5);
assert!(x[2] > x[1]);
assert!(x[1] > x[0]);
}
#[test]
fn test_softmax_simd_uniform_cov() {
let mut x = vec![1.0f32; 4];
softmax_simd(&mut x);
for v in &x {
assert!((*v - 0.25).abs() < 1e-5);
}
}
#[test]
fn test_softmax_simd_large_values_cov() {
let mut x = vec![100.0f32, 200.0, 300.0];
softmax_simd(&mut x);
for v in &x {
assert!(v.is_finite());
}
assert!((x.iter().sum::<f32>() - 1.0).abs() < 1e-5);
}
#[test]
fn test_fused_swiglu_simd_basic_cov() {
let mut gate = vec![0.0f32, 1.0, 2.0, -1.0];
let up = vec![1.0f32, 1.0, 1.0, 1.0];
fused_swiglu_simd(&mut gate, &up);
assert!(gate[0].abs() < 0.01);
assert!((gate[1] - 0.731).abs() < 0.05);
}