conspire/math/tensor/rank_2/vec/
mod.rs1use crate::math::{TensorArray, TensorRank2, tensor::vec::TensorVector};
2
3use crate::math::{Tensor, TensorRank0, assert::FiniteDifference};
4
5pub 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
15impl<const D: usize, const I: usize, const J: usize> FiniteDifference for TensorRank2Vec<D, I, J> {
16 fn error_fd(&self, comparator: &Self, epsilon: TensorRank0) -> Option<(bool, usize)> {
17 let error_count = self
18 .iter()
19 .zip(comparator.iter())
20 .map(|(self_a, comparator_a)| {
21 self_a
22 .iter()
23 .zip(comparator_a.iter())
24 .map(|(self_a_i, comparator_a_i)| {
25 self_a_i
26 .iter()
27 .zip(comparator_a_i.iter())
28 .filter(|&(&self_a_ij, &comparator_a_ij)| {
29 (self_a_ij / comparator_a_ij - 1.0).abs() >= epsilon
30 && (self_a_ij.abs() >= epsilon
31 || comparator_a_ij.abs() >= epsilon)
32 })
33 .count()
34 })
35 .sum::<usize>()
36 })
37 .sum();
38 if error_count > 0 {
39 Some((true, error_count))
40 } else {
41 None
42 }
43 }
44}