1use ndarray::*;
4use std::fmt::Debug;
5
6use super::norm::*;
7use super::types::*;
8
9pub 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
20pub 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
31pub 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
48pub 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
65pub 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!(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);