conspire/math/tensor/rank_2/vec/
mod.rs

1use crate::math::{TensorArray, TensorRank2, tensor::vec::TensorVector};
2
3#[cfg(test)]
4use crate::math::{Tensor, TensorRank0, tensor::test::ErrorTensor};
5
6pub type TensorRank2Vec<const D: usize, const I: usize, const J: usize> =
7    TensorVector<TensorRank2<D, I, J>>;
8
9impl<const D: usize, const I: usize, const J: usize> TensorRank2Vec<D, I, J> {
10    pub fn zero(len: usize) -> Self {
11        (0..len).map(|_| TensorRank2::zero()).collect()
12    }
13}
14
15#[cfg(test)]
16impl<const D: usize, const I: usize, const J: usize> ErrorTensor for TensorRank2Vec<D, I, J> {
17    fn error_fd(&self, comparator: &Self, epsilon: TensorRank0) -> Option<(bool, usize)> {
18        let error_count = self
19            .iter()
20            .zip(comparator.iter())
21            .map(|(self_a, comparator_a)| {
22                self_a
23                    .iter()
24                    .zip(comparator_a.iter())
25                    .map(|(self_a_i, comparator_a_i)| {
26                        self_a_i
27                            .iter()
28                            .zip(comparator_a_i.iter())
29                            .filter(|&(&self_a_ij, &comparator_a_ij)| {
30                                (self_a_ij / comparator_a_ij - 1.0).abs() >= epsilon
31                                    && (self_a_ij.abs() >= epsilon
32                                        || comparator_a_ij.abs() >= epsilon)
33                            })
34                            .count()
35                    })
36                    .sum::<usize>()
37            })
38            .sum();
39        if error_count > 0 {
40            Some((true, error_count))
41        } else {
42            None
43        }
44    }
45}