Skip to main content

conspire/math/tensor/rank_0/list_2d/
mod.rs

1use crate::math::{Tensor, TensorRank0, assert::FiniteDifference};
2use crate::math::{TensorList, TensorRank0List};
3
4/// A list of lists of rank-0 tensors (scalars).
5pub type TensorRank0List2D<const N: usize> = TensorList<TensorRank0List<N>, N>;
6
7impl<const N: usize> FiniteDifference for TensorRank0List2D<N> {
8    fn error_fd(&self, comparator: &Self, epsilon: TensorRank0) -> Option<(bool, usize)> {
9        let error_count = self
10            .iter()
11            .zip(comparator.iter())
12            .map(|(self_i, comparator_i)| {
13                self_i
14                    .iter()
15                    .zip(comparator_i.iter())
16                    .filter(|&(&self_ij, &comparator_ij)| {
17                        (self_ij / comparator_ij - 1.0).abs() >= epsilon
18                            && (self_ij.abs() >= epsilon || comparator_ij.abs() >= epsilon)
19                    })
20                    .count()
21            })
22            .sum();
23        if error_count > 0 {
24            Some((true, error_count))
25        } else {
26            None
27        }
28    }
29}