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.