use std::fmt;
use crate::backend::{Backend, Unsqueezable};
#[derive(Clone, Debug)]
pub struct MockTensor {
pub(crate) shape: Vec<usize>,
pub(crate) value: i32,
}
impl MockTensor {
pub fn new(shape: Vec<usize>, value: i32) -> Self {
Self { shape, value }
}
}
impl fmt::Display for MockTensor {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "MockTensor({:?}, {})", self.shape, self.value)
}
}
impl Backend for MockTensor {
fn shape(&self) -> Vec<usize> {
self.shape.clone()
}
fn cat(tensors: &[Self], dim: usize) -> Self {
let mut new_shape = tensors[0].shape.clone();
new_shape[dim] = tensors.iter().map(|t| t.shape[dim]).sum();
MockTensor::new(new_shape, tensors[0].value)
}
fn eq(&self, other: &Self) -> impl Backend {
MockTensor::new(self.shape.clone(), if self.value == other.value { 1 } else { 0 })
}
fn vectorize_dim(&self, dim: usize) -> Vec<Self> {
let mut result = Vec::new();
let mut new_shape = self.shape.clone();
new_shape[dim] = 1;
for _ in 0..self.shape[dim] {
result.push(MockTensor::new(new_shape.clone(), self.value));
}
result
}
fn slice(&self, dimension: usize, _seq_start_idx: usize, len: usize) -> Self {
let mut new_shape = self.shape.clone();
new_shape[dimension] = len;
MockTensor::new(new_shape, self.value)
}
fn idx_where_all_true(&self, _dim: usize) -> Vec<usize> {
if self.value == 1 {
(0..self.shape[_dim]).collect()
} else {
vec![]
}
}
fn pop(&self, dim: usize, _index: usize) -> Self {
let mut new_shape = self.shape.clone();
if new_shape[dim] > 0 {
new_shape[dim] -= 1;
}
MockTensor::new(new_shape, self.value)
}
fn repeat(&self, dim: usize, times: usize) -> Self {
let mut new_shape = self.shape.clone();
new_shape[dim] *= times;
MockTensor::new(new_shape, self.value)
}
}
impl Unsqueezable for MockTensor {
type Unsqueezed = MockTensor;
fn unsqueeze(&self, _dim: usize) -> Self::Unsqueezed {
let mut new_shape = self.shape.clone();
new_shape.insert(_dim, 1);
MockTensor::new(new_shape, self.value)
}
}