mathru/algebra/linear/vector/add/
native.rs

1use crate::algebra::{
2    abstr::{Field, Scalar},
3    linear::vector::Vector,
4};
5use std::ops::Add;
6
7impl<T> Add<Self> for Vector<T>
8where
9    T: Field + Scalar,
10{
11    type Output = Vector<T>;
12
13    /// Adds two vectors
14    ///
15    /// # Example
16    ///
17    /// ```
18    /// use mathru::algebra::linear::vector::Vector;
19    ///
20    /// let a: Vector<f64> = Vector::new_column(vec![1.0, 2.0, 3.0, 4.0]);
21    /// let b: Vector<f64> = Vector::new_column(vec![3.0, -4.0, 5.0, 4.0]);
22    /// let res_ref: Vector<f64> = Vector::new_column(vec![4.0, -2.0, 8.0, 8.0]);
23    ///
24    /// assert_eq!(res_ref, a + b)
25    /// ```
26    fn add(self, rhs: Self) -> Self::Output {
27        Vector {
28            data: self.data.add(rhs.data),
29        }
30    }
31}
32
33//c = a + b, a,b,c E T^m
34impl<'a, T> Add<&'a Vector<T>> for &Vector<T>
35where
36    T: Field + Scalar,
37{
38    type Output = Vector<T>;
39
40    /// Adds two vectors
41    ///
42    /// # Example
43    ///
44    /// ```
45    /// use mathru::algebra::linear::vector::Vector;
46    ///
47    /// let a: Vector<f64> = Vector::new_column(vec![1.0, 2.0, 3.0, 4.0]);
48    /// let b: Vector<f64> = Vector::new_column(vec![3.0, -4.0, 5.0, 4.0]);
49    /// let res_ref: Vector<f64> = Vector::new_column(vec![4.0, -2.0, 8.0, 8.0]);
50    ///
51    /// assert_eq!(res_ref, &a + &b)
52    /// ```
53    fn add(self, rhs: &'a Vector<T>) -> Self::Output {
54        Vector {
55            data: (&self.data).add(&rhs.data),
56        }
57    }
58}
59
60// c = a + b, a,b,c E T^m
61impl<'a, 'b, T> Add<&'b Vector<T>> for &'a mut Vector<T>
62where
63    T: Field + Scalar,
64{
65    type Output = &'a mut Vector<T>;
66
67    /// Adds two vectors
68    ///
69    /// # Example
70    ///
71    /// ```
72    /// use mathru::algebra::linear::vector::Vector;
73    ///
74    /// let mut a: Vector<f64> = Vector::new_column(vec![1.0, 2.0, 3.0, 4.0]);
75    /// let b: Vector<f64> = Vector::new_column(vec![3.0, -4.0, 5.0, 4.0]);
76    /// let res_ref: Vector<f64> = Vector::new_column(vec![4.0, -2.0, 8.0, 8.0]);
77    ///
78    /// assert_eq!(res_ref, *(&mut a + &b))
79    /// ```
80    fn add(self, rhs: &'b Vector<T>) -> Self::Output {
81        let _ = &mut self.data + &rhs.data;
82        self
83    }
84}
85
86impl<T> Add<T> for Vector<T>
87where
88    T: Field + Scalar,
89{
90    type Output = Vector<T>;
91
92    /// Adds a scalar to the vector
93    ///
94    /// # Example
95    ///
96    /// ```
97    /// use mathru::algebra::linear::vector::Vector;
98    ///
99    /// let a: Vector<f64> = Vector::new_column(vec![1.0, 2.0, 3.0, 4.0]);
100    /// let res_ref: Vector<f64> = Vector::new_column(vec![-4.0, -3.0, -2.0, -1.0]);
101    ///
102    /// assert_eq!(res_ref, a + -5.0)
103    /// ```
104    fn add(mut self, rhs: T) -> Self::Output {
105        let _ = &mut self.data + &rhs;
106        self
107    }
108}
109
110impl<'a, T> Add<&'a T> for &Vector<T>
111where
112    T: Field + Scalar,
113{
114    type Output = Vector<T>;
115
116    /// Adds a scalar to the vector
117    ///
118    /// # Example
119    ///
120    /// ```
121    /// use mathru::algebra::linear::vector::Vector;
122    ///
123    /// let mut a: Vector<f64> = Vector::new_column(vec![1.0, 2.0, 3.0, 4.0]);
124    /// let res_ref: Vector<f64> = Vector::new_column(vec![-4.0, -3.0, -2.0, -1.0]);
125    ///
126    /// assert_eq!(res_ref, &a + &-5.0)
127    /// ```
128    fn add(self, rhs: &'a T) -> Self::Output {
129        let mut res: Vector<T> = self.clone();
130        let _ = &mut res + rhs;
131        res
132    }
133}
134
135impl<'a, T> Add<&'a T> for &mut Vector<T>
136where
137    T: Field + Scalar,
138{
139    type Output = Self;
140
141    /// Adds a scalar to the vector
142    ///
143    /// # Example
144    ///
145    /// ```
146    /// use mathru::algebra::linear::vector::Vector;
147    ///
148    /// let mut a: Vector<f64> = Vector::new_column(vec![1.0, 2.0, 3.0, 4.0]);
149    /// let res_ref: Vector<f64> = Vector::new_column(vec![-4.0, -3.0, -2.0, -1.0]);
150    ///
151    /// assert_eq!(res_ref, *(&mut a + &-5.0))
152    /// ```
153    fn add(self, rhs: &'a T) -> Self::Output {
154        let _ = &mut self.data + rhs;
155        self
156    }
157}