use super::helpers::*;
use trueno::Vector;
#[test]
fn simd_pixel_fkr_vector_ops() {
let mut rng = SimpleRng::new(11111);
let a = rng.gen_vec(10000);
let b = rng.gen_vec(10000);
let scalar_add: Vec<f32> = a.iter().zip(b.iter()).map(|(x, y)| x + y).collect();
let scalar_mul: Vec<f32> = a.iter().zip(b.iter()).map(|(x, y)| x * y).collect();
let va = Vector::from_slice(&a);
let vb = Vector::from_slice(&b);
let simd_add = va.add(&vb).expect("SIMD add failed");
let simd_mul = va.mul(&vb).expect("SIMD mul failed");
assert!(vectors_match(&scalar_add, simd_add.as_slice(), SIMD_TOLERANCE, "simd_add"));
assert!(vectors_match(&scalar_mul, simd_mul.as_slice(), SIMD_TOLERANCE, "simd_mul"));
}
#[test]
fn simd_pixel_fkr_softmax() {
let mut rng = SimpleRng::new(22222);
let x = rng.gen_vec(2048);
let scalar_result = scalar_softmax(&x);
let v = Vector::from_slice(&x);
let simd_result = v.softmax().expect("SIMD softmax failed");
assert!(vectors_match(&scalar_result, simd_result.as_slice(), SIMD_TOLERANCE, "simd_softmax"));
}
#[test]
fn simd_pixel_fkr_unaligned_17() {
let mut rng = SimpleRng::new(33333);
let a = rng.gen_vec(17);
let b = rng.gen_vec(17);
let scalar_add: Vec<f32> = a.iter().zip(b.iter()).map(|(x, y)| x + y).collect();
let va = Vector::from_slice(&a);
let vb = Vector::from_slice(&b);
let simd_add = va.add(&vb).expect("SIMD unaligned add failed");
assert!(vectors_match(&scalar_add, simd_add.as_slice(), SIMD_TOLERANCE, "simd_unaligned_17"));
}
#[test]
fn simd_pixel_fkr_remainder_255() {
let mut rng = SimpleRng::new(44444);
let a = rng.gen_vec(255);
let b = rng.gen_vec(255);
let scalar_mul: Vec<f32> = a.iter().zip(b.iter()).map(|(x, y)| x * y).collect();
let va = Vector::from_slice(&a);
let vb = Vector::from_slice(&b);
let simd_mul = va.mul(&vb).expect("SIMD remainder mul failed");
assert!(vectors_match(&scalar_mul, simd_mul.as_slice(), SIMD_TOLERANCE, "simd_remainder_255"));
}
#[test]
fn simd_pixel_fkr_relu() {
let mut rng = SimpleRng::new(55555);
let x = rng.gen_vec(10000);
let scalar_relu: Vec<f32> = x.iter().map(|v| v.max(0.0)).collect();
let v = Vector::from_slice(&x);
let simd_relu = v.relu().expect("SIMD relu failed");
assert!(vectors_match(&scalar_relu, simd_relu.as_slice(), SIMD_TOLERANCE, "simd_relu"));
}