ruPRIM-host 0.1.23

ruPRIM CPU tensor primitives, reductions, indexing and SIMD kernels.
Documentation
use ruda_core::tensor::{DType, host::HostTensor, element::Scalar};
use half::{bf16, f16};
use num_traits::ToPrimitive;

pub fn float_mask_where(
    tensor: HostTensor,
    mask: HostTensor,
    value: HostTensor,
) -> HostTensor {
    match tensor.dtype() {
        DType::F32 => crate::mask::mask_where_f32(tensor, mask, value),
        DType::F64 => crate::mask::mask_where_f64(tensor, mask, value),
        DType::F16 => crate::mask::mask_where_f16(tensor, mask, value),
        DType::BF16 => crate::mask::mask_where_bf16(tensor, mask, value),
        dtype => panic!("float_mask_where: unsupported dtype {:?}", dtype),
    }
}

pub fn float_mask_fill(
    tensor: HostTensor,
    mask: HostTensor,
    value: Scalar,
) -> HostTensor {
    match tensor.dtype() {
        DType::F32 => crate::mask::mask_fill_f32(tensor, mask, value.to_f32().unwrap()),
        DType::F64 => crate::mask::mask_fill_f64(tensor, mask, value.to_f64().unwrap()),
        DType::F16 => crate::mask::mask_fill_f16(
            tensor,
            mask,
            f16::from_f64(value.to_f64().unwrap()),
        ),
        DType::BF16 => crate::mask::mask_fill_bf16(
            tensor,
            mask,
            bf16::from_f64(value.to_f64().unwrap()),
        ),
        dtype => panic!("float_mask_fill: unsupported dtype {:?}", dtype),
    }
}

pub fn int_mask_where(
    tensor: HostTensor,
    mask: HostTensor,
    value: HostTensor,
) -> HostTensor {
    debug_assert_eq!(
        tensor.dtype(),
        value.dtype(),
        "int_mask_where: dtype mismatch"
    );
    match tensor.dtype() {
        DType::I64 => crate::mask::mask_where::<i64>(tensor, mask, value),
        DType::I32 => crate::mask::mask_where::<i32>(tensor, mask, value),
        DType::I16 => crate::mask::mask_where::<i16>(tensor, mask, value),
        DType::I8 => crate::mask::mask_where::<i8>(tensor, mask, value),
        DType::U64 => crate::mask::mask_where::<u64>(tensor, mask, value),
        DType::U32 => crate::mask::mask_where::<u32>(tensor, mask, value),
        DType::U16 => crate::mask::mask_where::<u16>(tensor, mask, value),
        DType::U8 => crate::mask::mask_where::<u8>(tensor, mask, value),
        dt => panic!("int_mask_where: unsupported dtype {:?}", dt),
    }
}

pub fn int_mask_fill(
    tensor: HostTensor,
    mask: HostTensor,
    value: Scalar,
) -> HostTensor {
    match tensor.dtype() {
        DType::I64 => crate::mask::mask_fill(tensor, mask, value.to_i64().unwrap()),
        DType::I32 => crate::mask::mask_fill(tensor, mask, value.to_i64().unwrap() as i32),
        DType::I16 => crate::mask::mask_fill(tensor, mask, value.to_i64().unwrap() as i16),
        DType::I8 => crate::mask::mask_fill(tensor, mask, value.to_i64().unwrap() as i8),
        DType::U64 => crate::mask::mask_fill(tensor, mask, value.to_u64().unwrap()),
        DType::U32 => crate::mask::mask_fill(tensor, mask, value.to_u64().unwrap() as u32),
        DType::U16 => crate::mask::mask_fill(tensor, mask, value.to_u64().unwrap() as u16),
        DType::U8 => crate::mask::mask_fill(tensor, mask, value.to_u64().unwrap() as u8),
        dt => panic!("int_mask_fill: unsupported dtype {:?}", dt),
    }
}