pub const WEIGHT_SCALE: i32 = 64;
pub const ACTIVATION_SCALE: i32 = 256;
pub const OUTPUT_SCALE: i32 = 16;
#[inline]
pub fn clipped_relu(val: i16, max: i16) -> i16 {
val.max(0).min(max)
}
#[inline]
pub fn screlu_f32(val: f32, max: f32) -> f32 {
let clamped = val.max(0.0).min(max);
clamped * clamped
}
#[inline]
pub fn screlu_grad_f32(val: f32, max: f32) -> f32 {
if val > 0.0 && val < max {
2.0 * val
} else {
0.0
}
}
#[inline]
pub fn crelu_grad_f32(val: f32, max: f32) -> f32 {
if val > 0.0 && val < max {
1.0
} else {
0.0
}
}
#[inline]
pub fn saturate_i16(val: i32) -> i16 {
val.clamp(i16::MIN as i32, i16::MAX as i32) as i16
}