orx_v/dim/index_card/
equality.rs

1use crate::dim::Dim;
2use core::fmt::Debug;
3use core::fmt::Display;
4
5/// Result of an [`equality`] check of two vectors of the same dimension.
6///
7/// The result can be
8/// * [`Equality::Equal`] iff the cardinality of the structures as
9///   well as all values at corresponding positions are equal.
10/// * [`Equality::UnequalCard`] if cardinalities do not agree at at least one
11///   level.
12/// * [`Equality::UnequalValue`] if any of the values are different.
13///
14/// [`equality`]: crate::NVec::equality
15#[derive(PartialEq, Eq, Clone, Copy)]
16pub enum Equality<D: Dim> {
17    /// Cardinality of the structures as well as all values at corresponding positions are equal.
18    Equal,
19    /// Cardinalities do not agree at at least one level.
20    /// The tuple `(idx, card1, card2)` represents the following:
21    /// * `idx` is the place the inequality in cardinalities are observed;
22    /// * `card1` and `card2` are the unequal cardinalities at the given `idx` in the first and
23    ///   second vectors, respectively.
24    UnequalCard(D::CardIdx, usize, usize),
25    /// Values of at least one of the element is different.
26    /// The `(idx)` represents the index where the value inequality is observed.
27    UnequalValue(D::Idx),
28}
29
30impl<D: Dim> Debug for Equality<D> {
31    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
32        match self {
33            Self::Equal => write!(f, "Equal"),
34            Self::UnequalCard(idx, x, y) => {
35                write!(
36                    f,
37                    "UnequalCard {{ idx: {:?}, lhs.card({:?}): {:?}, rhs.card({:?}): {:?} }}",
38                    idx, idx, x, idx, y
39                )
40            }
41            Self::UnequalValue(idx) => {
42                write!(f, "UnequalValue {{ idx: {:?} }}", idx)
43            }
44        }
45    }
46}
47
48impl<D: Dim> Display for Equality<D> {
49    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
50        write!(f, "{:?}", self)
51    }
52}
53
54// #[cfg(test)]
55// mod tests {
56//     use crate::{dim::Equality, IdxLeqD0, IdxLeqD1, IdxLeqD2, IdxLeqD3, NVec, NVecCoreSealed};
57//     use alloc::vec;
58
59//     #[test]
60//     fn eq_d1() {
61//         let v1 = vec![1, 2, 3];
62//         let v2 = vec![1, 2, 3];
63
64//         assert_eq!(v1.equality(&v2), Equality::Equal);
65//         assert_eq!(v2.equality(&v1), Equality::Equal);
66//     }
67
68//     #[test]
69//     fn eq_d2() {
70//         let v1 = vec![vec![1, 2], vec![1, 2, 3]];
71//         let v2 = vec![vec![1, 2], vec![1, 2, 3]];
72
73//         assert_eq!(v1.equality(&v2), Equality::Equal);
74//     }
75
76//     #[test]
77//     fn eq_d3() {
78//         let v1 = vec![vec![vec![1], vec![1, 2]], vec![vec![1, 2, 3]]];
79//         let v2 = vec![vec![vec![1], vec![1, 2]], vec![vec![1, 2, 3]]];
80
81//         assert_eq!(v1.equality(&v2), Equality::Equal);
82//     }
83
84//     #[test]
85//     fn eq_d4() {
86//         let v1 = vec![
87//             vec![
88//                 vec![vec![1, 2, 3, 4]],
89//                 vec![vec![1, 2], vec![1, 2, 3, 4, 5]],
90//             ],
91//             vec![vec![vec![], vec![1, 2], vec![1, 2, 3]]],
92//         ];
93//         let v2 = vec![
94//             vec![
95//                 vec![vec![1, 2, 3, 4]],
96//                 vec![vec![1, 2], vec![1, 2, 3, 4, 5]],
97//             ],
98//             vec![vec![vec![], vec![1, 2], vec![1, 2, 3]]],
99//         ];
100
101//         assert_eq!(v1.equality(&v2), Equality::Equal);
102//     }
103
104//     #[test]
105//     fn ineq_card_d1() {
106//         let v1 = vec![1, 2, 3];
107//         let v2 = vec![1, 2, 3, 4];
108
109//         assert_eq!(
110//             v1.equality(&v2),
111//             Equality::UnequalCard(IdxLeqD0::IdxD0([]), 3, 4)
112//         );
113//     }
114
115//     #[test]
116//     fn ineq_card_d2() {
117//         let v1 = vec![vec![1, 2], vec![1, 2, 3, 4]];
118//         let v2 = vec![vec![1, 2], vec![1, 2, 3]];
119
120//         assert_eq!(
121//             v1.equality(&v2),
122//             Equality::UnequalCard(IdxLeqD1::IdxD1([1]), 4, 3)
123//         );
124//     }
125
126//     #[test]
127//     fn ineq_card_d3() {
128//         let v1 = vec![vec![vec![1], vec![1, 2]], vec![vec![1, 2, 3]]];
129//         let v2 = vec![vec![vec![1], vec![1, 2]], vec![vec![1, 2, 3]], vec![]];
130
131//         assert_eq!(
132//             v1.equality(&v2),
133//             Equality::UnequalCard(IdxLeqD2::IdxD0([]), 2, 3)
134//         );
135//     }
136
137//     #[test]
138//     fn ineq_card_d4() {
139//         let v1 = vec![
140//             vec![
141//                 vec![vec![1, 2, 3, 4]],
142//                 vec![vec![1, 2], vec![1, 2, 3, 4, 5]],
143//             ],
144//             vec![vec![vec![], vec![1, 2], vec![1, 2, 3]]],
145//         ];
146//         let v2 = vec![
147//             vec![
148//                 vec![vec![1, 2, 3, 4]],
149//                 vec![vec![1, 2], vec![1, 2, 3, 4, 5]],
150//             ],
151//             vec![vec![], vec![vec![], vec![1, 2], vec![1, 2, 3]]],
152//         ];
153
154//         assert_eq!(
155//             v1.equality(&v2),
156//             Equality::UnequalCard(IdxLeqD3::IdxD1([1]), 1, 2)
157//         );
158//     }
159
160//     #[test]
161//     fn ineq_val_d1() {
162//         let v1 = vec![1, 2, 3];
163//         let v2 = vec![1, 22, 3];
164
165//         assert_eq!(v1.equality(&v2), Equality::UnequalValue([1]));
166//     }
167
168//     #[test]
169//     fn ineq_val_d2() {
170//         let v1 = vec![vec![1, 2], vec![1, 2, 3]];
171//         let v2 = vec![vec![1, 2], vec![1, 42, 3]];
172
173//         assert_eq!(v1.equality(&v2), Equality::UnequalValue([1, 1]));
174//     }
175
176//     #[test]
177//     fn ineq_val_d3() {
178//         let v1 = vec![vec![vec![1], vec![1, 2]], vec![vec![1, 2, 3]]];
179//         let v2 = vec![vec![vec![1], vec![1, 2]], vec![vec![42, 2, 3]]];
180
181//         assert_eq!(v1.equality(&v2), Equality::UnequalValue([1, 0, 0]));
182//     }
183
184//     #[test]
185//     fn ineq_val_d4() {
186//         let v1 = vec![
187//             vec![
188//                 vec![vec![1, 2, 3, 4]],
189//                 vec![vec![1, 2], vec![1, 2, 3, 4, 5]],
190//             ],
191//             vec![vec![vec![], vec![1, 2], vec![1, 2, 3]]],
192//         ];
193//         let v2 = vec![
194//             vec![
195//                 vec![vec![1, 2, 3, 4]],
196//                 vec![vec![1, 2], vec![1, 2, 42, 4, 5]],
197//             ],
198//             vec![vec![vec![], vec![1, 2], vec![1, 2, 3]]],
199//         ];
200
201//         assert_eq!(v1.equality(&v2), Equality::UnequalValue([0, 1, 1, 2]));
202//     }
203// }