ndarray_linalg/
assert.rs

1//! Assertions for array
2
3use ndarray::*;
4use std::fmt::Debug;
5
6use super::norm::*;
7use super::types::*;
8
9/// check two values are close in terms of the relative tolerance
10pub fn rclose<A: Scalar>(test: A, truth: A, rtol: A::Real) {
11    let dev = (test - truth).abs() / truth.abs();
12    if dev > rtol {
13        eprintln!("==== Assetion Failed ====");
14        eprintln!("Expected = {}", truth);
15        eprintln!("Actual   = {}", test);
16        panic!("Too large deviation in relative tolerance: {}", dev);
17    }
18}
19
20/// check two values are close in terms of the absolute tolerance
21pub fn aclose<A: Scalar>(test: A, truth: A, atol: A::Real) {
22    let dev = (test - truth).abs();
23    if dev > atol {
24        eprintln!("==== Assetion Failed ====");
25        eprintln!("Expected = {}", truth);
26        eprintln!("Actual   = {}", test);
27        panic!("Too large deviation in absolute tolerance: {}", dev);
28    }
29}
30
31/// check two arrays are close in maximum norm
32pub fn close_max<A, D>(test: &ArrayRef<A, D>, truth: &ArrayRef<A, D>, atol: A::Real)
33where
34    A: Scalar + Lapack,
35    D: Dimension,
36    D::Pattern: PartialEq + Debug,
37{
38    assert_eq!(test.dim(), truth.dim());
39    let tol = (test - truth).norm_max();
40    if tol > atol {
41        eprintln!("==== Assetion Failed ====");
42        eprintln!("Expected:\n{}", truth);
43        eprintln!("Actual:\n{}", test);
44        panic!("Too large deviation in maximum norm: {} > {}", tol, atol);
45    }
46}
47
48/// check two arrays are close in L1 norm
49pub fn close_l1<A, D>(test: &ArrayRef<A, D>, truth: &ArrayRef<A, D>, rtol: A::Real)
50where
51    A: Scalar + Lapack,
52    D: Dimension,
53    D::Pattern: PartialEq + Debug,
54{
55    assert_eq!(test.dim(), truth.dim());
56    let tol = (test - truth).norm_l1() / truth.norm_l1();
57    if tol > rtol {
58        eprintln!("==== Assetion Failed ====");
59        eprintln!("Expected:\n{}", truth);
60        eprintln!("Actual:\n{}", test);
61        panic!("Too large deviation in L1-norm: {} > {}", tol, rtol);
62    }
63}
64
65/// check two arrays are close in L2 norm
66pub fn close_l2<A, D>(test: &ArrayRef<A, D>, truth: &ArrayRef<A, D>, rtol: A::Real)
67where
68    A: Scalar + Lapack,
69    D: Dimension,
70    D::Pattern: PartialEq + Debug,
71{
72    assert_eq!(test.dim(), truth.dim());
73    let tol = (test - truth).norm_l2() / truth.norm_l2();
74    if tol > rtol {
75        eprintln!("==== Assetion Failed ====");
76        eprintln!("Expected:\n{}", truth);
77        eprintln!("Actual:\n{}", test);
78        panic!("Too large deviation in L2-norm: {} > {} ", tol, rtol);
79    }
80}
81
82macro_rules! generate_assert {
83    ($assert:ident, $close:tt) => {
84        #[macro_export]
85        macro_rules! $assert {
86            ($test: expr,$truth: expr,$tol: expr) => {
87                $crate::$close($test, $truth, $tol);
88            };
89            ($test: expr,$truth: expr,$tol: expr; $comment: expr) => {
90                eprintln!($comment);
91                $crate::$close($test, $truth, $tol);
92            };
93        }
94    };
95} // generate_assert!
96
97generate_assert!(assert_rclose, rclose);
98generate_assert!(assert_aclose, aclose);
99generate_assert!(assert_close_max, close_max);
100generate_assert!(assert_close_l1, close_l1);
101generate_assert!(assert_close_l2, close_l2);