dlt/tensor/
macros.rs

1
2// filepath: /home/pkd/code/rust/dlt/src/tensor/macros.rs
3#[macro_export]
4macro_rules! assert_approx_eq {
5    ($left:expr, $right:expr) => {{
6        let left_val = $left;
7        let epsilon = Scalar::<f64,_>::EPSILON;
8        assert_approx_eq!(left_val, $right, epsilon);
9    }};
10    ($left:expr, $right:expr, $epsilon:expr) => {{
11        let left_val = $left;
12        let right_val = $right;
13        let d = left_val.dist(right_val);
14        if d > $epsilon {
15            panic!(
16                "assertion failed: `abs({:?} - {:?}) < {}`\n\
17                left: {:?}, right: {:?}, distance: {}",
18                stringify!($left),
19                stringify!($right),
20                $epsilon,
21                left_val,
22                right_val,
23                d
24            );
25        }
26    }};
27}
28
29
30// macros for math shit
31#[macro_export]
32macro_rules! cvec {
33    () => {
34        // A 0-element vector; you may also choose to panic.
35        Tensor::<dimension::Dimensionless, 1, 0, 1>::zero()
36    };
37    ($($x:expr),+ $(,)?) => {{
38        // Count the number of elements provided.
39        const N: usize = <[()]>::len(&[$(cvec!(@replace $x)),*]);
40        Tensor::<c64,dimension::Dimensionless, 1, N, 1>::new::<units::Unitless>([
41            $($x.complex()),*
42        ])
43    }};
44    (@replace $_x:expr) => { () };
45}
46
47#[macro_export]
48macro_rules! dless {
49    ($x:expr) => {
50        Tensor::<_, dimension::Dimensionless, 1, 1, 1>::new::<units::Unitless>([$x])
51    };
52}