//! Implement conversion traits for tensors use crate::{Device, Error, Tensor, WithDType}; use half::{bf16, f16}; use std::convert::TryFrom; impl TryFrom<&Tensor> for Vec { type Error = Error; fn try_from(tensor: &Tensor) -> Result { tensor.to_vec1::() } } impl TryFrom<&Tensor> for Vec> { type Error = Error; fn try_from(tensor: &Tensor) -> Result { tensor.to_vec2::() } } impl TryFrom<&Tensor> for Vec>> { type Error = Error; fn try_from(tensor: &Tensor) -> Result { tensor.to_vec3::() } } impl TryFrom for Vec { type Error = Error; fn try_from(tensor: Tensor) -> Result { Vec::::try_from(&tensor) } } impl TryFrom for Vec> { type Error = Error; fn try_from(tensor: Tensor) -> Result { Vec::>::try_from(&tensor) } } impl TryFrom for Vec>> { type Error = Error; fn try_from(tensor: Tensor) -> Result { Vec::>>::try_from(&tensor) } } impl TryFrom<&[T]> for Tensor { type Error = Error; fn try_from(v: &[T]) -> Result { Tensor::from_slice(v, v.len(), &Device::Cpu) } } impl TryFrom> for Tensor { type Error = Error; fn try_from(v: Vec) -> Result { let len = v.len(); Tensor::from_vec(v, len, &Device::Cpu) } } macro_rules! from_tensor { ($typ:ident) => { impl TryFrom<&Tensor> for $typ { type Error = Error; fn try_from(tensor: &Tensor) -> Result { tensor.to_scalar::<$typ>() } } impl TryFrom for $typ { type Error = Error; fn try_from(tensor: Tensor) -> Result { $typ::try_from(&tensor) } } impl TryFrom<$typ> for Tensor { type Error = Error; fn try_from(v: $typ) -> Result { Tensor::new(v, &Device::Cpu) } } }; } from_tensor!(f64); from_tensor!(f32); from_tensor!(f16); from_tensor!(bf16); from_tensor!(u32); from_tensor!(u8);