Skip to main content

erased_clamp_into_uninit

Function erased_clamp_into_uninit 

Source
pub fn erased_clamp_into_uninit(
    dtype: KernelDType,
    ctx: &ExecContext,
    dest: &mut ErasedRawStridedUninitMut<'_>,
    x: &ErasedRawStridedPtr<'_>,
    lo: &ErasedRawStridedPtr<'_>,
    hi: &ErasedRawStridedPtr<'_>,
) -> Result<()>
Expand description

Clamp elementwise into uninitialized storage: dest[i] = minimum(hi[i], maximum(lo[i], x[i])).

maximum and minimum are ErasedZipOp::Maximum and ErasedZipOp::Minimum, so a NaN in any real operand yields NaN and lo > hi yields hi. Supported dtypes are f32, f64, i32, and i64.

§Examples

use core::mem::MaybeUninit;
use strided_kernel::{
    erased_clamp_into_uninit, ErasedRawStridedPtr, ErasedRawStridedRef,
    ErasedRawStridedUninitMut, ExecContext, KernelDType,
};

let x = [-3.0_f32, 0.5, 9.0];
let lo = [0.0_f32; 1];
let hi = [1.0_f32; 1];
let x = ErasedRawStridedRef::from_slice(&x, &[3], &[1], 0).unwrap();
// Stride-0 descriptors broadcast one bound over the output.
let lo = ErasedRawStridedRef::from_slice(&lo, &[3], &[0], 0).unwrap();
let hi = ErasedRawStridedRef::from_slice(&hi, &[3], &[0], 0).unwrap();
let mut out = [MaybeUninit::<f32>::uninit(); 3];
let mut dest = ErasedRawStridedUninitMut::from_uninit_slice(&mut out, &[3], &[1], 0).unwrap();
erased_clamp_into_uninit(
    KernelDType::F32,
    &ExecContext::serial(),
    &mut dest,
    &ErasedRawStridedPtr::from_ref(&x),
    &ErasedRawStridedPtr::from_ref(&lo),
    &ErasedRawStridedPtr::from_ref(&hi),
)
.unwrap();
// SAFETY: a successful call initializes every reachable element.
let out = unsafe { out.map(|value| value.assume_init()) };
assert_eq!(out, [0.0, 0.5, 1.0]);

§Errors

Returns a typed StridedError for dtype, shape, output-layout, or overlap contracts. Validation completes before any write.