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}