opensrdk_linear_algebra/tensor/sparse/operators/
neg.rs

1use crate::{sparse::SparseTensor, Number};
2use std::ops::Neg;
3
4impl<T> Neg for SparseTensor<T>
5where
6    T: Number,
7{
8    type Output = Self;
9
10    fn neg(self) -> Self::Output {
11        self * (-T::one())
12    }
13}
14
15#[cfg(test)]
16mod tests {
17    use crate::{sparse::SparseTensor, *};
18    #[test]
19    fn it_works() {
20        let mut a = SparseTensor::new(vec![3, 2, 2]);
21        a[&[0, 0, 0]] = 2.0;
22        a[&[0, 0, 1]] = 4.0;
23        a[&[1, 1, 0]] = 2.0;
24        a[&[1, 1, 1]] = 4.0;
25        a[&[2, 0, 0]] = 2.0;
26        a[&[2, 0, 1]] = 4.0;
27
28        let a = -a;
29
30        let mut b = SparseTensor::new(vec![3, 2, 2]);
31        b[&[0, 0, 0]] = -2.0;
32        b[&[0, 0, 1]] = -4.0;
33        b[&[1, 1, 0]] = -2.0;
34        b[&[1, 1, 1]] = -4.0;
35        b[&[2, 0, 0]] = -2.0;
36        b[&[2, 0, 1]] = -4.0;
37
38        assert_eq!(a[&[0, 0, 0]], b[&[0, 0, 0]]);
39        assert_eq!(a[&[0, 0, 1]], b[&[0, 0, 1]]);
40        assert_eq!(a[&[1, 1, 0]], b[&[1, 1, 0]]);
41        assert_eq!(a[&[1, 1, 1]], b[&[1, 1, 1]]);
42        assert_eq!(a[&[2, 0, 0]], b[&[2, 0, 0]]);
43        assert_eq!(a[&[2, 0, 1]], b[&[2, 0, 1]]);
44    }
45}