fast_distances/distances/
matching.rs1extern crate ndarray;
2
3use ndarray::ArrayView1;
4
5pub fn matching(x: &ArrayView1<f64>, y: &ArrayView1<f64>) -> f64 {
25 let mut num_not_equal = 0.0;
26
27 for i in 0..x.len() {
28 let x_true = x[i] != 0.0;
29 let y_true = y[i] != 0.0;
30 num_not_equal += if x_true != y_true { 1.0 } else { 0.0 };
31 }
32
33 num_not_equal / x.len() as f64
34}
35
36#[cfg(test)]
37mod tests {
38 use super::*;
39 use ndarray::arr1;
40
41 #[test]
42 fn test_matching_basic() {
43 let x = arr1(&[1.0, 0.0, 1.0]);
44 let y = arr1(&[1.0, 1.0, 0.0]);
45
46 let similarity = matching(&x.view(), &y.view());
47 let expected_similarity = 2.0 / 3.0; assert_eq!(similarity, expected_similarity);
49 }
50
51 #[test]
52 fn test_matching_identical_vectors() {
53 let x = arr1(&[1.0, 1.0, 1.0]);
54 let y = arr1(&[1.0, 1.0, 1.0]);
55
56 let similarity = matching(&x.view(), &y.view());
57 assert_eq!(similarity, 0.0); }
59
60 #[test]
61 fn test_matching_no_overlap() {
62 let x = arr1(&[1.0, 0.0, 0.0]);
63 let y = arr1(&[0.0, 0.0, 1.0]);
64
65 let similarity = matching(&x.view(), &y.view());
66 assert_eq!(similarity, 0.6666666666666666); }
68
69 #[test]
70 fn test_matching_empty_vectors() {
71 let x = arr1::<f64>(&[]);
72 let y = arr1::<f64>(&[]);
73
74 let similarity = matching(&x.view(), &y.view());
75 assert!(similarity.is_nan()); }
77
78 #[test]
79 fn test_matching_zero_vector() {
80 let x = arr1(&[0.0, 0.0, 0.0]);
81 let y = arr1(&[1.0, 1.0, 1.0]);
82
83 let similarity = matching(&x.view(), &y.view());
84 assert_eq!(similarity, 1.0); }
86}