pub mod array;
pub mod views;
#[cfg(feature = "alloc")]
pub mod dynamic;
pub trait TensorOps<T> {
fn shape(&self) -> &[usize];
fn data(&self) -> &[T];
fn data_mut(&mut self) -> &mut [T];
fn index_offset(&self, idx: &[usize]) -> Option<usize> {
if idx.len() != self.shape().len() {
return None;
}
let mut stride = 1;
let mut flat_index = 0;
for (&i, &dim) in idx.iter().rev().zip(self.shape().iter().rev()) {
if i >= dim {
return None; }
flat_index += i * stride;
stride *= dim;
}
Some(flat_index)
}
}
pub trait ConstTensorOps<T, const N: usize, const D: usize>: TensorOps<T> {
fn shape_array(&self) -> &[usize; D];
fn data_array(&self) -> &[T; N];
fn data_mut_array(&mut self) -> &mut [T; N];
}
pub const MAX_STATIC_RANK: usize = 12;