tract-linalg 0.23.7

Tiny, no-nonsense, self contained, TensorFlow and ONNX inference
Documentation
use tract_data::internal::f16;

routine_by_scalar_rust!(generic;
    f32,
    SMulByScalar4,
    4,
    4,
    fn run(x: &mut [f32], s: f32) {
        debug_assert!(x.len() % Self::nr() == 0);
        debug_assert!(x.as_ptr() as usize % Self::alignment_bytes() == 0);
        x.iter_mut().for_each(|px| *px *= s)
    },
    op(Mul),
    bin,
    param(MulByScalar)
);

routine_by_scalar_rust!(generic;
    f32,
    SAddByScalar4,
    4,
    4,
    fn run(x: &mut [f32], s: f32) {
        debug_assert!(x.len() % Self::nr() == 0);
        debug_assert!(x.as_ptr() as usize % Self::alignment_bytes() == 0);
        x.iter_mut().for_each(|px| *px += s)
    },
    op(Add),
    bin
);

routine_by_scalar_rust!(generic;
    f32,
    SSubByScalar4,
    4,
    4,
    fn run(x: &mut [f32], s: f32) {
        debug_assert!(x.len() % Self::nr() == 0);
        debug_assert!(x.as_ptr() as usize % Self::alignment_bytes() == 0);
        x.iter_mut().for_each(|px| *px -= s)
    },
    op(Sub),
    bin
);

routine_by_scalar_rust!(generic;
    f32,
    SSubFByScalar4,
    4,
    4,
    fn run(x: &mut [f32], s: f32) {
        debug_assert!(x.len() % Self::nr() == 0);
        debug_assert!(x.as_ptr() as usize % Self::alignment_bytes() == 0);
        x.iter_mut().for_each(|px| *px = s - *px)
    },
    op(SubF),
    bin
);

routine_by_scalar_rust!(generic;
    f32,
    SMinByScalar4,
    4,
    4,
    fn run(x: &mut [f32], s: f32) {
        debug_assert!(x.len() % Self::nr() == 0);
        debug_assert!(x.as_ptr() as usize % Self::alignment_bytes() == 0);
        x.iter_mut().for_each(|px| *px = px.min(s))
    },
    op(Min),
    bin
);

routine_by_scalar_rust!(generic;
    f32,
    SMaxByScalar4,
    4,
    4,
    fn run(x: &mut [f32], s: f32) {
        debug_assert!(x.len() % Self::nr() == 0);
        debug_assert!(x.as_ptr() as usize % Self::alignment_bytes() == 0);
        x.iter_mut().for_each(|px| *px = px.max(s))
    },
    op(Max),
    bin
);

routine_by_scalar_rust!(generic;
    f16,
    HMulByScalar8,
    8,
    8,
    fn run(x: &mut [f16], s: f16) {
        debug_assert!(x.len() % Self::nr() == 0);
        debug_assert!(x.as_ptr() as usize % Self::alignment_bytes() == 0);
        x.iter_mut().for_each(|px| *px *= s)
    },
    op(Mul),
    param(MulByScalar)
);