tensorite_math_tensor 0.2.2

Tensorite Math Tensor | Tensor Implementation
Documentation
pub mod tensor;
pub mod vec;

pub use tensor::*;
pub use vec::*;

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn add() {
        let shape = [2, 2];
        let data1 = vec![1, 2, 3, 4];
        let data2 = vec![5, 6, 7, 8];
        let t1 = Tensor::<i32, 2>::new_vec(&data1);
        let t2 = Tensor::<i32, 2>::new_vec(&data2);

        // Addition
        let t_add = (t1.clone() + t2.clone()).reshape(shape);
        assert_eq!(t_add, Tensor::new(vec![6, 8, 10, 12], shape));
    }

    #[test]
    fn broadcast() {
        let shape = [2, 2];
        let data1 = vec![1, 2, 3, 4];
        let data2 = vec![5];
        let t1 = Tensor::<i32, 2>::new_vec(&data1);
        println!("T1: {:?}", t1);
        let t2 = Tensor::<i32, 2>::new_vec(&data2).broadcast(&t1).unwrap();
        println!("T2: {:?}", t2);

        // Addition
        let t_add = (t1.clone() + t2.clone()).reshape(shape);
        assert_eq!(t_add, Tensor::new(vec![6, 7, 8, 9], shape));
    }

    #[test]
    fn broadcast_inplace() {
        let shape = [2, 2];
        let data1 = vec![1, 2, 3, 4];
        let data2 = vec![5];
        let t1 = Tensor::<i32, 2>::new_vec(&data1);
        println!("T1: {:?}", t1);
        let mut t2 = Tensor::<i32, 2>::new_vec(&data2);
        t2.broadcast_inplace([4]);
        println!("T2: {:?}", t2);

        // Addition
        let t_add = (t1.clone() + t2.clone()).reshape(shape);
        assert_eq!(t_add, Tensor::new(vec![6, 7, 8, 9], shape));
    }

    #[test]
    fn div() {
        let shape = [2, 2];
        let data1 = vec![1.0, 2.0, 3.5, 4.0];
        let data2 = vec![5.0, 4.0, 7.0, 8.0];
        let t1 = Tensor::new(data1, shape);
        let t2 = Tensor::new(data2, shape);

        // Element-wise division
        let t_div = t1.clone() / t2.clone();
        assert_eq!(t_div, Tensor::new(vec![0.2, 0.5, 0.5, 0.5], shape));
    }

    #[test]
    fn dot() {
        let shape = [4];
        let data1 = vec![1, 2, 3, 4];
        let data2 = vec![5, 6, 7, 8];
        let v1 = Tensor::new(data1, shape);
        let v2 = Tensor::new(data2, shape);

        // Dot product (for 1D tensors/vectors)
        let dp = v1.dot(&v2);
        assert_eq!(dp, 70);
    }

    #[test]
    fn mul() {
        let shape = [2, 2];
        let data1 = vec![1, 2, 3, 4];
        let data2 = vec![5, 6, 7, 8];
        let t1 = Tensor::new(data1, shape);
        let t2 = Tensor::new(data2, shape);

        // Element-wise multiplication
        let t_mul = t1.clone() * t2.clone();
        assert_eq!(t_mul, Tensor::new(vec![5, 12, 21, 32], shape));
    }

    #[test]
    fn new() {
        let shape = [2, 2];
        let data = vec![1, 2, 3, 4];
        let tensor = Tensor::new(data, shape);
        assert_eq!(tensor.shape(), &[2, 2]);
        assert_eq!(tensor.data, &[1, 2, 3, 4]);
    }

    #[test]
    fn sub() {
        let shape = [2, 2];
        let data1 = vec![1, 2, 3, 4];
        let data2 = vec![5, 6, 7, 8];
        let t1 = Tensor::new(data1, shape);
        let t2 = Tensor::new(data2, shape);

        // Element-wise subtraction
        let t_sub = t1.clone() - t2.clone();
        assert_eq!(t_sub, Tensor::new(vec![-4, -4, -4, -4], shape));
    }

    #[test]
    fn vec_dot() {
        let v1 = vec![1, 2, 3, 4];
        let v2 = vec![5, 6, 7, 8];

        // Dot product (for 1D tensors/vectors)
        let dp = v1.dot(&v2);
        assert_eq!(dp, 70);
    }
}