argmin/core/math/
scaledadd_vec.rs

1// Copyright 2018-2020 argmin developers
2//
3// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
4// http://apache.org/licenses/LICENSE-2.0> or the MIT license <LICENSE-MIT or
5// http://opensource.org/licenses/MIT>, at your option. This file may not be
6// copied, modified, or distributed except according to those terms.
7
8#[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}