1#[cfg(test)]
9mod tests {
10 use crate::core::math::ArgminScaledAdd;
11 use paste::item;
12
13 macro_rules! make_test {
14 ($t:ty) => {
15 item! {
16 #[test]
17 fn [<test_scaledadd_vec_ $t>]() {
18 let a = vec![1 as $t, 2 as $t, 3 as $t];
19 let b = 2 as $t;
20 let c = vec![4 as $t, 5 as $t, 6 as $t];
21 let res = a.scaled_add(&b, &c);
22 let target = vec![9 as $t, 12 as $t, 15 as $t];
23 for i in 0..3 {
24 assert!((((res[i] - target[i]) as f64).abs()) < std::f64::EPSILON);
25 }
26 }
27 }
28
29 item! {
30 #[test]
31 #[should_panic]
32 fn [<test_scaledadd_vec_panic_1_ $t>]() {
33 let a = vec![1 as $t, 2 as $t, 3 as $t];
34 let b = 2 as $t;
35 let c = vec![4 as $t, 5 as $t];
36 a.scaled_add(&b, &c);
37 }
38 }
39
40 item! {
41 #[test]
42 #[should_panic]
43 fn [<test_scaledadd_vec_panic_2_ $t>]() {
44 let a = vec![1 as $t, 2 as $t];
45 let b = 2 as $t;
46 let c = vec![4 as $t, 5 as $t, 6 as $t];
47 a.scaled_add(&b, &c);
48 }
49 }
50
51 item! {
52 #[test]
53 fn [<test_scaledadd_vec_vec_ $t>]() {
54 let a = vec![1 as $t, 2 as $t, 3 as $t];
55 let b = vec![3 as $t, 2 as $t, 1 as $t];
56 let c = vec![4 as $t, 5 as $t, 6 as $t];
57 let res = a.scaled_add(&b, &c);
58 let target = vec![13 as $t, 12 as $t, 9 as $t];
59 for i in 0..3 {
60 assert!((((res[i] - target[i]) as f64).abs()) < std::f64::EPSILON);
61 }
62 }
63 }
64
65 item! {
66 #[test]
67 #[should_panic]
68 fn [<test_scaledadd_vec_vec_panic_1_ $t>]() {
69 let a = vec![1 as $t, 2 as $t];
70 let b = vec![3 as $t, 2 as $t, 1 as $t];
71 let c = vec![4 as $t, 5 as $t, 6 as $t];
72 a.scaled_add(&b, &c);
73 }
74 }
75
76 item! {
77 #[test]
78 #[should_panic]
79 fn [<test_scaledadd_vec_vec_panic_2_ $t>]() {
80 let a = vec![1 as $t, 2 as $t, 3 as $t];
81 let b = vec![3 as $t, 2 as $t];
82 let c = vec![4 as $t, 5 as $t, 6 as $t];
83 a.scaled_add(&b, &c);
84 }
85 }
86
87 item! {
88 #[test]
89 #[should_panic]
90 fn [<test_scaledadd_vec_vec_panic_3_ $t>]() {
91 let a = vec![1 as $t, 2 as $t, 3 as $t];
92 let b = vec![3 as $t, 2 as $t, 1 as $t];
93 let c = vec![4 as $t, 5 as $t];
94 a.scaled_add(&b, &c);
95 }
96 }
97
98 item! {
99 #[test]
100 fn [<test_scaledadd_mat_mat_ $t>]() {
101 let a = vec![
102 vec![1 as $t, 2 as $t],
103 vec![3 as $t, 4 as $t],
104 ];
105 let b = vec![
106 vec![4 as $t, 3 as $t],
107 vec![2 as $t, 1 as $t],
108 ];
109 let c = vec![
110 vec![1 as $t, 2 as $t],
111 vec![2 as $t, 1 as $t],
112 ];
113 let res = a.scaled_add(&b, &c);
114 let target = vec![
115 vec![5 as $t, 8 as $t],
116 vec![7 as $t, 5 as $t],
117 ];
118 for i in 0..2 {
119 for j in 0..2 {
120 assert!((((res[i][j] - target[i][j]) as f64).abs()) < std::f64::EPSILON);
121 }
122 }
123 }
124 }
125
126 item! {
127 #[test]
128 #[should_panic]
129 fn [<test_scaledadd_mat_mat_panic_1_ $t>]() {
130 let a = vec![
131 vec![1 as $t],
132 vec![3 as $t, 4 as $t],
133 ];
134 let b = vec![
135 vec![4 as $t, 3 as $t],
136 vec![2 as $t, 1 as $t],
137 ];
138 let c = vec![
139 vec![1 as $t, 2 as $t],
140 vec![2 as $t, 1 as $t],
141 ];
142 a.scaled_add(&b, &c);
143 }
144 }
145
146 item! {
147 #[test]
148 #[should_panic]
149 fn [<test_scaledadd_mat_mat_panic_2_ $t>]() {
150 let a = vec![
151 vec![1 as $t, 2 as $t],
152 vec![3 as $t, 4 as $t],
153 ];
154 let b = vec![
155 vec![4 as $t, 3 as $t],
156 vec![1 as $t],
157 ];
158 let c = vec![
159 vec![1 as $t, 2 as $t],
160 vec![2 as $t, 1 as $t],
161 ];
162 a.scaled_add(&b, &c);
163 }
164 }
165
166 item! {
167 #[test]
168 #[should_panic]
169 fn [<test_scaledadd_mat_mat_panic_3_ $t>]() {
170 let a = vec![
171 vec![1 as $t, 2 as $t],
172 vec![3 as $t, 4 as $t],
173 ];
174 let b = vec![
175 vec![4 as $t, 3 as $t],
176 vec![2 as $t, 1 as $t],
177 ];
178 let c = vec![
179 vec![1 as $t],
180 vec![2 as $t, 1 as $t],
181 ];
182 a.scaled_add(&b, &c);
183 }
184 }
185
186 item! {
187 #[test]
188 #[should_panic]
189 fn [<test_scaledadd_mat_mat_panic_4_ $t>]() {
190 let a = vec![
191 vec![1 as $t, 2 as $t],
192 ];
193 let b = vec![
194 vec![4 as $t, 3 as $t],
195 vec![2 as $t, 1 as $t],
196 ];
197 let c = vec![
198 vec![1 as $t, 2 as $t],
199 vec![2 as $t, 1 as $t],
200 ];
201 a.scaled_add(&b, &c);
202
203 }
204 }
205
206 item! {
207 #[test]
208 #[should_panic]
209 fn [<test_scaledadd_mat_mat_panic_5_ $t>]() {
210 let a = vec![
211 vec![1 as $t, 2 as $t],
212 vec![3 as $t, 4 as $t],
213 ];
214 let b = vec![
215 vec![4 as $t, 3 as $t],
216 ];
217 let c = vec![
218 vec![1 as $t, 2 as $t],
219 vec![2 as $t, 1 as $t],
220 ];
221 a.scaled_add(&b, &c);
222 }
223 }
224
225 item! {
226 #[test]
227 #[should_panic]
228 fn [<test_scaledadd_mat_mat_panic_6_ $t>]() {
229 let a = vec![
230 vec![1 as $t, 2 as $t],
231 vec![3 as $t, 4 as $t],
232 ];
233 let b = vec![
234 vec![4 as $t, 3 as $t],
235 vec![2 as $t, 1 as $t],
236 ];
237 let c = vec![
238 vec![2 as $t, 1 as $t],
239 ];
240 a.scaled_add(&b, &c);
241 }
242 }
243
244 item! {
245 #[test]
246 fn [<test_scaledadd_mat_scalar_ $t>]() {
247 let a = vec![
248 vec![1 as $t, 2 as $t],
249 vec![3 as $t, 4 as $t],
250 ];
251 let b = 2 as $t;
252 let c = vec![
253 vec![1 as $t, 2 as $t],
254 vec![2 as $t, 1 as $t],
255 ];
256 let res = a.scaled_add(&b, &c);
257 let target = vec![
258 vec![3 as $t, 6 as $t],
259 vec![7 as $t, 6 as $t],
260 ];
261 for i in 0..2 {
262 for j in 0..2 {
263 assert!((((res[i][j] - target[i][j]) as f64).abs()) < std::f64::EPSILON);
264 }
265 }
266 }
267 }
268 };
269 }
270
271 make_test!(isize);
272 make_test!(usize);
273 make_test!(i8);
274 make_test!(u8);
275 make_test!(i16);
276 make_test!(u16);
277 make_test!(i32);
278 make_test!(u32);
279 make_test!(i64);
280 make_test!(u64);
281 make_test!(f32);
282 make_test!(f64);
283}