#[test]
fn test_simd_matmul_identity() {
let input = vec![1.0, 2.0, 3.0];
let identity = vec![
1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, ];
let output = simd_matmul(&input, &identity, 3, 3);
assert_eq!(output, vec![1.0, 2.0, 3.0]);
}
#[test]
fn test_simd_matmul_projection() {
let input = vec![1.0, 2.0, 3.0];
let weight = vec![
1.0, 1.0, 1.0, 1.0, 0.0, -1.0, ];
let output = simd_matmul(&input, &weight, 3, 2);
assert_eq!(output.len(), 2);
assert!((output[0] - 6.0).abs() < 1e-5); assert!((output[1] - (-2.0)).abs() < 1e-5); }
#[test]
fn test_simd_matmul_expansion() {
let input = vec![1.0, 2.0];
let weight = vec![
1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, -1.0, ];
let output = simd_matmul(&input, &weight, 2, 4);
assert_eq!(output.len(), 4);
assert!((output[0] - 1.0).abs() < 1e-5);
assert!((output[1] - 2.0).abs() < 1e-5);
assert!((output[2] - 3.0).abs() < 1e-5);
assert!((output[3] - (-1.0)).abs() < 1e-5);
}
#[test]
fn test_simd_matmul_large_tiled() {
let in_dim = 128;
let out_dim = 256;
let input: Vec<f32> = (0..in_dim).map(|i| i as f32).collect();
let mut weight = vec![0.0; out_dim * in_dim];
for i in 0..out_dim.min(in_dim) {
weight[i * in_dim + i] = 1.0;
}
let output = simd_matmul(&input, &weight, in_dim, out_dim);
assert_eq!(output.len(), out_dim);
for i in 0..in_dim {
assert!((output[i] - i as f32).abs() < 1e-5);
}
for i in in_dim..out_dim {
assert!((output[i]).abs() < 1e-5);
}
}
#[test]
fn test_simd_matmul_empty() {
let input: Vec<f32> = vec![];
let weight: Vec<f32> = vec![];
let output = simd_matmul(&input, &weight, 0, 0);
assert!(output.is_empty());
}
#[test]
fn test_simd_dot_basic() {
let a = vec![1.0, 2.0, 3.0];
let b = vec![4.0, 5.0, 6.0];
let result = simd_dot(&a, &b);
assert!((result - 32.0).abs() < 1e-5); }
#[test]
fn test_simd_dot_orthogonal() {
let a = vec![1.0, 0.0];
let b = vec![0.0, 1.0];
let result = simd_dot(&a, &b);
assert!((result).abs() < 1e-5);
}
#[test]
fn test_simd_dot_self() {
let a = vec![3.0, 4.0];
let result = simd_dot(&a, &a);
assert!((result - 25.0).abs() < 1e-5); }
#[test]
fn test_simd_dot_negative() {
let a = vec![1.0, -1.0];
let b = vec![-1.0, 1.0];
let result = simd_dot(&a, &b);
assert!((result - (-2.0)).abs() < 1e-5);
}
#[test]
fn test_simd_dot_large() {
let n = 1024;
let a: Vec<f32> = vec![1.0; n];
let b: Vec<f32> = vec![1.0; n];
let result = simd_dot(&a, &b);
assert!((result - n as f32).abs() < 1e-3);
}
#[test]
fn test_simd_add_basic() {
let mut a = vec![1.0, 2.0, 3.0];
let b = vec![4.0, 5.0, 6.0];
simd_add(&mut a, &b);
assert_eq!(a, vec![5.0, 7.0, 9.0]);
}
#[test]
fn test_simd_add_zeros() {
let mut a = vec![1.0, 2.0, 3.0];
let b = vec![0.0, 0.0, 0.0];
simd_add(&mut a, &b);
assert_eq!(a, vec![1.0, 2.0, 3.0]);
}
#[test]
fn test_simd_add_negative() {
let mut a = vec![1.0, 2.0, 3.0];
let b = vec![-1.0, -2.0, -3.0];
simd_add(&mut a, &b);
assert_eq!(a, vec![0.0, 0.0, 0.0]);
}
#[test]
fn test_simd_mul_basic() {
let mut a = vec![1.0, 2.0, 3.0];
let b = vec![4.0, 5.0, 6.0];
simd_mul(&mut a, &b);
assert_eq!(a, vec![4.0, 10.0, 18.0]);
}
#[test]
fn test_simd_mul_ones() {
let mut a = vec![1.0, 2.0, 3.0];
let b = vec![1.0, 1.0, 1.0];
simd_mul(&mut a, &b);
assert_eq!(a, vec![1.0, 2.0, 3.0]);
}
#[test]
fn test_simd_mul_zeros() {
let mut a = vec![1.0, 2.0, 3.0];
let b = vec![0.0, 0.0, 0.0];
simd_mul(&mut a, &b);
assert_eq!(a, vec![0.0, 0.0, 0.0]);
}
#[test]
fn test_simd_mul_negative() {
let mut a = vec![2.0, 3.0];
let b = vec![-1.0, -2.0];
simd_mul(&mut a, &b);
assert_eq!(a, vec![-2.0, -6.0]);
}
#[test]
fn test_simd_silu_zero() {
let mut data = vec![0.0];
simd_silu(&mut data);
assert!((data[0]).abs() < 1e-5); }
#[test]
fn test_simd_silu_positive() {
let mut data = vec![1.0];
simd_silu(&mut data);
assert!((data[0] - 0.7311).abs() < 0.01);
}
#[test]
fn test_simd_silu_negative() {
let mut data = vec![-1.0];
simd_silu(&mut data);
assert!((data[0] - (-0.2689)).abs() < 0.01);
}
#[test]
fn test_simd_silu_large_positive() {
let mut data = vec![10.0];
simd_silu(&mut data);
assert!((data[0] - 10.0).abs() < 0.01);
}
#[test]
fn test_simd_silu_large_negative() {
let mut data = vec![-10.0];
simd_silu(&mut data);
assert!((data[0]).abs() < 0.01);
}
#[test]
fn test_simd_silu_batch() {
let mut data = vec![0.0, 1.0, -1.0, 2.0, -2.0];
simd_silu(&mut data);
assert!((data[0]).abs() < 1e-5);
assert!(data[1] > 0.0);
assert!(data[2] < 0.0);
assert!(data[3] > data[1]); }
#[test]
fn test_simd_gelu_zero() {
let mut data = vec![0.0];
simd_gelu(&mut data);
assert!((data[0]).abs() < 1e-5); }
#[test]
fn test_simd_gelu_positive() {
let mut data = vec![1.0];
simd_gelu(&mut data);
assert!((data[0] - 0.841).abs() < 0.01);
}
#[test]
fn test_simd_gelu_negative() {
let mut data = vec![-1.0];
simd_gelu(&mut data);
assert!((data[0] - (-0.159)).abs() < 0.01);
}
#[test]
fn test_simd_gelu_large_positive() {
let mut data = vec![3.0];
simd_gelu(&mut data);
assert!((data[0] - 3.0).abs() < 0.01);
}
#[test]
fn test_simd_gelu_large_negative() {
let mut data = vec![-3.0];
simd_gelu(&mut data);
assert!((data[0]).abs() < 0.01);
}
#[test]
fn test_simd_gelu_symmetry_breaking() {
let mut pos = vec![1.0];
let mut neg = vec![-1.0];
simd_gelu(&mut pos);
simd_gelu(&mut neg);
assert!((pos[0] + neg[0]).abs() > 0.1); }
#[test]
fn test_simd_softmax_sums_to_one() {
let mut data = vec![1.0, 2.0, 3.0];
simd_softmax(&mut data);
let sum: f32 = data.iter().sum();
assert!((sum - 1.0).abs() < 1e-5);
}
#[test]
fn test_simd_softmax_preserves_order() {
let mut data = vec![1.0, 2.0, 3.0];
simd_softmax(&mut data);
assert!(data[2] > data[1]);
assert!(data[1] > data[0]);
}
#[test]
fn test_simd_softmax_uniform() {
let mut data = vec![1.0, 1.0, 1.0];
simd_softmax(&mut data);
for &x in &data {
assert!((x - 1.0 / 3.0).abs() < 1e-5);
}
}
#[test]
fn test_simd_softmax_empty() {
let mut data: Vec<f32> = vec![];
simd_softmax(&mut data);
assert!(data.is_empty());
}
#[test]
fn test_simd_softmax_single() {
let mut data = vec![5.0];
simd_softmax(&mut data);
assert!((data[0] - 1.0).abs() < 1e-5);
}
#[test]
fn test_simd_softmax_numerical_stability() {
let mut data = vec![1000.0, 1001.0, 1002.0];
simd_softmax(&mut data);
let sum: f32 = data.iter().sum();
assert!((sum - 1.0).abs() < 1e-5);
assert!(data.iter().all(|&x| x.is_finite()));
}
#[test]
fn test_simd_softmax_negative() {
let mut data = vec![-1.0, -2.0, -3.0];
simd_softmax(&mut data);
let sum: f32 = data.iter().sum();
assert!((sum - 1.0).abs() < 1e-5);
assert!(data[0] > data[1]);
assert!(data[1] > data[2]);
}
#[test]
fn test_simd_softmax_temperature_effect() {
let mut narrow = vec![1.0, 2.0, 3.0];
let mut wide = vec![1.0, 10.0, 100.0];
simd_softmax(&mut narrow);
simd_softmax(&mut wide);
assert!(wide[2] > narrow[2]);
}
#[test]
fn test_matmul_then_activation() {
let input = vec![1.0, 2.0];
let weight = vec![
1.0, 1.0, -1.0, 1.0, ];
let mut output = simd_matmul(&input, &weight, 2, 2);
assert!((output[0] - 3.0).abs() < 1e-5);
assert!((output[1] - 1.0).abs() < 1e-5);
simd_gelu(&mut output);
assert!((output[0] - 3.0).abs() < 0.01);
assert!((output[1] - 0.841).abs() < 0.01);
}
#[test]
fn test_residual_connection() {
let input = vec![1.0, 2.0, 3.0];
let weight = vec![
0.1, 0.0, 0.0, 0.0, 0.1, 0.0, 0.0, 0.0, 0.1, ];
let proj = simd_matmul(&input, &weight, 3, 3);
let mut residual = input.clone();
simd_add(&mut residual, &proj);
assert!((residual[0] - 1.1).abs() < 1e-5);
assert!((residual[1] - 2.2).abs() < 1e-5);
assert!((residual[2] - 3.3).abs() < 1e-5);
}
#[test]
fn test_gated_activation() {
let mut gate = vec![0.0, 1.0, 2.0];
let up = vec![1.0, 2.0, 3.0];
simd_silu(&mut gate);
simd_mul(&mut gate, &up);
assert!((gate[0]).abs() < 1e-5);
assert!((gate[1] - 1.46).abs() < 0.05);
}
#[test]
fn test_simd_bf16_to_f32_empty() {
let result = simd_bf16_to_f32(&[]);
assert!(result.is_empty());
}
#[test]
fn test_simd_bf16_to_f32_single() {
let bf16_bytes = half::bf16::from_f32(1.0).to_le_bytes();
let result = simd_bf16_to_f32(&bf16_bytes);
assert_eq!(result.len(), 1);
assert!((result[0] - 1.0).abs() < 1e-6);
}