use core::marker::PhantomData;
use crate::{Float, Tensor, kind::Numeric, ops::BridgeTensor};
mod execution;
#[derive(Clone, Debug)]
pub struct EinsumOperand<K: Numeric = Float> {
primitive: BridgeTensor,
kind: PhantomData<K>,
}
impl<const D: usize, K: Numeric> From<Tensor<D, K>> for EinsumOperand<K> {
fn from(tensor: Tensor<D, K>) -> Self {
Self {
primitive: tensor.primitive,
kind: PhantomData,
}
}
}
impl<const D: usize, K: Numeric> From<&Tensor<D, K>> for EinsumOperand<K> {
fn from(tensor: &Tensor<D, K>) -> Self {
tensor.clone().into()
}
}
impl<const D: usize, K: Numeric> Tensor<D, K> {
pub fn einsum(equation: &str, operands: impl IntoIterator<Item = EinsumOperand<K>>) -> Self {
let equation =
burn_einsum::parse(equation).unwrap_or_else(|error| panic!("einsum: {error}"));
execution::execute(&equation.plan(), operands)
}
}
#[doc(hidden)]
pub mod __einsum {
pub use super::execution::{
alignment_shape, axes, broadcast_contract, can_contract_early, can_matmul, contract_early,
matmul_shapes, prepare, validate_broadcast,
};
pub use burn_einsum::Axis;
}