Open
Description
I'm curious about the feasibility of extending ndarray to support mixed-precision and mixed-domain algorithms. I was thinking of syntax something like this, enabling a view to offer up f64
values despite the backing storage being f32
(for example).
let a: Array1<f64> = array![1., 2., 3.];
let b: Array1<f32> = array![4., 5., 6.];
let c = a + b.view_as::<f64>();
I'm a Rust novice and ran into some trouble (attempting to use associated_type_defaults
to avoid more disruptive changes)
pub unsafe trait RawData: Sized {
/// The array element type.
type Elem: From<Self::ElemMem>;
type ElemMem;
where ArrayBase
would have
ptr: std::ptr::NonNull<S::ElemMem>,
and the Index
implementation becomes
fn index(&self, index: I) -> &S::Elem {
debug_bounds_check!(self, index);
unsafe {
&S::Elem::from(*self.ptr.as_ptr().offset(
index
.index_checked(&self.dim, &self.strides)
.unwrap_or_else(|| array_out_of_bounds())
))
}
}
I'm curious whether
- this sort of feature to support mixed precision is of interest to include in ndarray, and
- this implementation strategy seems like a reasonable way to go about it.