argmin_math/nalgebra_m/
zero.rs

1// Copyright 2018-2024 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
8use crate::{Allocator, ArgminZero, ArgminZeroLike};
9
10use num_traits::Zero;
11
12use nalgebra::{base::dimension::Dim, DefaultAllocator, OMatrix, Scalar};
13
14impl<N, R, C> ArgminZeroLike for OMatrix<N, R, C>
15where
16    N: Scalar + Zero + ArgminZero,
17    R: Dim,
18    C: Dim,
19    DefaultAllocator: Allocator<N, R, C>,
20{
21    #[inline]
22    fn zero_like(&self) -> OMatrix<N, R, C> {
23        Self::zeros_generic(R::from_usize(self.nrows()), C::from_usize(self.ncols()))
24    }
25}
26
27#[cfg(test)]
28mod tests {
29    use super::*;
30    use approx::assert_relative_eq;
31    use nalgebra::{DVector, Matrix2, Vector2, Vector4};
32    use paste::item;
33
34    macro_rules! make_test {
35        ($t:ty) => {
36            item! {
37                #[test]
38                fn [<test_zero_like_ $t>]() {
39                    let t: DVector<$t> = DVector::from_vec(vec![]);
40                    let a = t.zero_like();
41                    assert_eq!(t, a);
42                }
43            }
44
45            item! {
46                #[test]
47                fn [<test_zero_like_2_ $t>]() {
48                    let a = Vector4::new(42 as $t, 42 as $t, 42 as $t, 42 as $t).zero_like();
49                    for i in 0..4 {
50                        assert_relative_eq!(0 as f64, a[i] as f64, epsilon = f64::EPSILON);
51                    }
52                }
53            }
54
55            item! {
56                #[test]
57                fn [<test_2d_zero_like_ $t>]() {
58                    let t: Vector2<$t> = Vector2::zeros();
59                    let a = t.zero_like();
60                    assert_eq!(t, a);
61                }
62            }
63
64            item! {
65                #[test]
66                fn [<test_2d_zero_like_2_ $t>]() {
67                    let a = Matrix2::new(
68                      42 as $t, 42 as $t,
69                      42 as $t, 42 as $t
70                    ).zero_like();
71
72                    for i in 0..2 {
73                        for j in 0..2 {
74                            assert_relative_eq!(0 as f64, a[(i, j)] as f64, epsilon = f64::EPSILON);
75                        }
76                    }
77                }
78            }
79        };
80    }
81
82    make_test!(i8);
83    make_test!(u8);
84    make_test!(i16);
85    make_test!(u16);
86    make_test!(i32);
87    make_test!(u32);
88    make_test!(i64);
89    make_test!(u64);
90    make_test!(f32);
91    make_test!(f64);
92}