aad/overload/scalar/
sub.rs

1#[macro_export(local_inner_macros)]
2macro_rules! impl_scalar_sub_inner {
3    ($scalar:ty, $one:expr, $zero:expr) => {
4        #[inline]
5        fn sub(self, rhs: $scalar) -> Self::Output {
6            let value = &self.value - rhs;
7            match &self.index {
8                Some((i, tape)) => Variable {
9                    index: {
10                        let mut operations = tape.operations.borrow_mut();
11                        let count = operations.len();
12                        operations.push(OperationRecord([(*i, $one), (usize::MAX, $zero)]));
13                        Some((count, tape))
14                    },
15                    value,
16                },
17                None => Variable { index: None, value },
18            }
19        }
20    };
21}
22
23#[macro_export(local_inner_macros)]
24macro_rules! impl_scalar_sub {
25    ($scalar:ty) => {
26        impl<'a> Sub<$scalar> for &Variable<'a, $scalar>
27        where
28            for<'b> &'b $scalar: Sub<$scalar, Output = $scalar>,
29        {
30            type Output = Variable<'a, $scalar>;
31            impl_scalar_sub_inner!($scalar, <$scalar>::one(), <$scalar>::zero());
32        }
33
34        impl<'a, 'b> Sub<$scalar> for &Variable<'a, Variable<'b, $scalar>>
35        where
36            for<'c> &'c $scalar: Sub<$scalar, Output = $scalar>,
37        {
38            type Output = Variable<'a, Variable<'b, $scalar>>;
39            impl_scalar_sub_inner!($scalar, Variable::one(), Variable::zero());
40        }
41
42        impl<'a> Sub<&Variable<'a, $scalar>> for $scalar
43        where
44            for<'b> &'b $scalar: Sub<$scalar, Output = $scalar>,
45            for<'b> &'b Variable<'a, $scalar>: Neg<Output = Variable<'a, $scalar>>,
46        {
47            type Output = Variable<'a, $scalar>;
48
49            #[inline]
50            fn sub(self, rhs: &Variable<'a, $scalar>) -> Self::Output {
51                -(rhs - self)
52            }
53        }
54
55        impl<'a, 'b> Sub<&Variable<'a, Variable<'b, $scalar>>> for $scalar
56        where
57            for<'c> &'c Variable<'a, $scalar>: Sub<$scalar, Output = Variable<'a, $scalar>>,
58        {
59            type Output = Variable<'a, Variable<'b, $scalar>>;
60
61            #[inline]
62            fn sub(self, rhs: &Variable<'a, Variable<'b, $scalar>>) -> Self::Output {
63                rhs - self
64            }
65        }
66
67        impl<'a> Sub<&Variable<'a, $scalar>> for &$scalar
68        where
69            for<'b> &'b $scalar: Sub<$scalar, Output = $scalar>,
70            for<'b> &'b Variable<'a, $scalar>: Neg<Output = Variable<'a, $scalar>>,
71        {
72            type Output = Variable<'a, $scalar>;
73
74            #[inline]
75            fn sub(self, rhs: &Variable<'a, $scalar>) -> Self::Output {
76                -(rhs - *self)
77            }
78        }
79
80        impl<'a, 'b> Sub<&Variable<'a, Variable<'b, $scalar>>> for &$scalar
81        where
82            for<'c> &'c Variable<'a, $scalar>: Sub<$scalar, Output = Variable<'a, $scalar>>,
83        {
84            type Output = Variable<'a, Variable<'b, $scalar>>;
85
86            #[inline]
87            fn sub(self, rhs: &Variable<'a, Variable<'b, $scalar>>) -> Self::Output {
88                rhs - *self
89            }
90        }
91    };
92}