use crate::SmeltError;
pub trait Tensor: Clone {
fn shape(&self) -> &[usize];
fn zeros(shape: Vec<usize>) -> Self;
}
pub trait TensorOps<T>:
TensorMatmul<T>
+ TensorMatmulT<T>
+ TensorAdd<T>
+ TensorMul<T>
+ TensorNormalize<T>
+ TensorSelect<T>
+ TensorGelu<T>
+ TensorTanh<T>
+ TensorSoftmax<T>
{
}
pub trait TensorMatmul<T> {
fn matmul(a: &T, b: &T, c: &mut T) -> Result<(), SmeltError>;
}
pub trait TensorMatmulT<T> {
fn matmul_t(a: &T, b: &T, c: &mut T) -> Result<(), SmeltError>;
}
pub trait TensorAdd<T> {
fn add(a: &T, b: &mut T) -> Result<(), SmeltError>;
}
pub trait TensorMul<T> {
fn mul(a: &T, b: &mut T) -> Result<(), SmeltError>;
}
pub trait TensorNormalize<T> {
fn normalize(x: &mut T, epsilon: f32) -> Result<(), SmeltError>;
}
pub trait TensorSelect<T> {
fn select(x: &[usize], weight: &T, out: &mut T) -> Result<(), SmeltError>;
}
pub trait TensorGelu<T> {
fn gelu(x: &mut T) -> Result<(), SmeltError>;
}
pub trait TensorTanh<T> {
fn tanh(x: &mut T) -> Result<(), SmeltError>;
}
pub trait TensorSoftmax<T> {
fn softmax(x: &mut T) -> Result<(), SmeltError>;
}