use crate::bytes::Bytes;
use crate::tensor::{DType, Shape};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct TensorData {
pub bytes: Bytes,
#[serde(with = "shape_inner")]
pub shape: Shape,
pub dtype: DType,
}
mod shape_inner {
use crate::tensor::SmallVec;
use super::*;
pub fn serialize<S: serde::Serializer>(
shape: &Shape,
serializer: S,
) -> Result<S::Ok, S::Error> {
shape.as_slice().serialize(serializer)
}
pub fn deserialize<'de, D: serde::Deserializer<'de>>(
deserializer: D,
) -> Result<Shape, D::Error> {
let dims = SmallVec::<[usize; _]>::deserialize(deserializer)?;
Ok(Shape::new_raw(dims))
}
}
impl TensorData {
pub fn rank(&self) -> usize {
self.shape.len()
}
pub fn num_elements(&self) -> usize {
Self::numel(&self.shape)
}
pub(super) fn numel(shape: &[usize]) -> usize {
shape.iter().product()
}
}