furiosa_visa_std/
tensor_state.rs1use std::fmt::Debug;
11
12use crate::tensor::Tensor;
13use crate::vector_engine::scalar::VeScalar;
14use furiosa_mapping::M;
15
16pub trait TensorState<D: VeScalar>: Debug {
23 fn clone_tensor_as<TargetMapping: M>(&self) -> Option<Tensor<D, TargetMapping>>;
25}
26
27#[derive(Debug)]
29pub struct NoTensor;
30impl<D: VeScalar> TensorState<D> for NoTensor {
31 fn clone_tensor_as<TargetMapping: M>(&self) -> Option<Tensor<D, TargetMapping>> {
32 None
33 }
34}
35
36#[derive(Debug)]
38pub struct HasTensor<D: VeScalar, Mapping: M> {
39 data: Tensor<D, Mapping>,
40}
41
42impl<D: VeScalar, Mapping: M> HasTensor<D, Mapping> {
43 pub fn new(tensor: Tensor<D, Mapping>) -> Self {
45 Self { data: tensor }
46 }
47}
48
49impl<D: VeScalar, Mapping: M> From<Tensor<D, Mapping>> for HasTensor<D, Mapping> {
50 fn from(tensor: Tensor<D, Mapping>) -> Self {
51 Self::new(tensor)
52 }
53}
54
55impl<D: VeScalar, Mapping: M> TensorState<D> for HasTensor<D, Mapping> {
56 fn clone_tensor_as<TargetMapping: M>(&self) -> Option<Tensor<D, TargetMapping>> {
57 let cloned = self.data.clone();
58 Some(cloned.transpose::<TargetMapping>(true))
59 }
60}