#![no_std]
#![forbid(unsafe_code)]
#[inline]
pub fn relu_q15(x: i16) -> i16 {
if x < 0 { 0 } else { x }
}
#[inline]
pub fn relu_slice_q15(data: &mut [i16]) {
for val in data.iter_mut() {
*val = relu_q15(*val);
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_relu_min_is_zero() {
assert_eq!(relu_q15(i16::MIN), 0);
}
#[test]
fn test_relu_minus_one_is_zero() {
assert_eq!(relu_q15(-1), 0);
}
#[test]
fn test_relu_zero_is_zero() {
assert_eq!(relu_q15(0), 0);
}
#[test]
fn test_relu_one_is_one() {
assert_eq!(relu_q15(1), 1);
}
#[test]
fn test_relu_max_is_identity() {
assert_eq!(relu_q15(i16::MAX), i16::MAX);
}
#[test]
fn test_relu_negative_half() {
assert_eq!(relu_q15(-16384), 0);
}
#[test]
fn test_relu_positive_half() {
assert_eq!(relu_q15(16384), 16384);
}
#[test]
fn test_relu_negative_quarter() {
assert_eq!(relu_q15(-8192), 0);
}
#[test]
fn test_relu_positive_quarter() {
assert_eq!(relu_q15(8192), 8192);
}
#[test]
fn test_relu_idempotent_positive() {
for x in [1i16, 100, 8192, 16384, 32767] {
assert_eq!(relu_q15(relu_q15(x)), relu_q15(x));
}
}
#[test]
fn test_relu_idempotent_zero() {
assert_eq!(relu_q15(relu_q15(0)), relu_q15(0));
}
#[test]
fn test_relu_output_never_negative() {
for x in [i16::MIN, -16384, -8192, -1, 0, 1, 8192, 16384, i16::MAX] {
assert!(relu_q15(x) >= 0, "relu_q15({}) doit être >= 0", x);
}
}
#[test]
fn test_relu_output_never_exceeds_input_positive() {
for x in [0i16, 1, 8192, 16384, 32767] {
assert_eq!(relu_q15(x), x, "relu_q15({}) doit être == {}", x, x);
}
}
#[test]
fn test_slice_empty() {
let mut empty: [i16; 0] = [];
relu_slice_q15(&mut empty); }
#[test]
fn test_slice_single_negative() {
let mut data = [-1i16];
relu_slice_q15(&mut data);
assert_eq!(data, [0]);
}
#[test]
fn test_slice_single_zero() {
let mut data = [0i16];
relu_slice_q15(&mut data);
assert_eq!(data, [0]);
}
#[test]
fn test_slice_single_positive() {
let mut data = [16384i16];
relu_slice_q15(&mut data);
assert_eq!(data, [16384]);
}
#[test]
fn test_slice_mixed() {
let mut data = [-32768i16, -1, 0, 1, 32767];
relu_slice_q15(&mut data);
assert_eq!(data, [0, 0, 0, 1, 32767]);
}
#[test]
fn test_slice_all_negative() {
let mut data = [-32768i16, -16384, -8192, -1];
relu_slice_q15(&mut data);
assert_eq!(data, [0, 0, 0, 0]);
}
#[test]
fn test_slice_all_positive() {
let mut data = [1i16, 8192, 16384, 32767];
relu_slice_q15(&mut data);
assert_eq!(data, [1, 8192, 16384, 32767]);
}
#[test]
fn test_slice_all_zero() {
let mut data = [0i16; 8];
relu_slice_q15(&mut data);
assert_eq!(data, [0i16; 8]);
}
#[test]
fn test_slice_idempotent() {
let mut data1 = [-32768i16, -100, 0, 100, 32767];
let mut data2 = data1;
relu_slice_q15(&mut data1);
relu_slice_q15(&mut data1); relu_slice_q15(&mut data2); assert_eq!(data1, data2);
}
#[test]
fn test_slice_boundary_values() {
let mut data = [i16::MIN, i16::MAX];
relu_slice_q15(&mut data);
assert_eq!(data, [0, i16::MAX]);
}
}