use cpueinsum::Exec;
use tenferro_tensor::{Tensor, TensorRead};
use crate::buffer_pool::BufferPool;
#[doc(hidden)]
pub fn with_materialized_tensor_read<R>(
exec: &mut Exec<'_>,
buffers: &mut BufferPool,
op: &'static str,
input: TensorRead<'_>,
operation: impl FnOnce(&Tensor, &mut BufferPool, &mut Exec<'_>) -> tenferro_tensor::Result<R>,
) -> tenferro_tensor::Result<R> {
match input {
TensorRead::Tensor(tensor) => operation(tensor, buffers, exec),
TensorRead::View(view) => {
let materialized =
crate::materialize_tensor_read(buffers, op, TensorRead::View(view), exec.token())?;
let result = operation(&materialized, buffers, exec);
crate::backend::reclaim_tensor(buffers, materialized);
result
}
}
}
#[doc(hidden)]
pub fn reshape_tensor(
exec: &mut Exec<'_>,
buffers: &mut BufferPool,
input: &Tensor,
shape: &[usize],
) -> tenferro_tensor::Result<Tensor> {
if crate::structural::reshape_uses_pool(input, &exec.token())? {
return crate::structural::reshape_read_with_pool(
buffers,
TensorRead::from_tensor(input),
shape,
exec.token(),
);
}
crate::structural::reshape(input, shape)
}