use space::{Knn, KnnFromBatch, LinearKnn, Metric, Neighbor}; #[derive(Default)] struct Hamming; impl Metric for Hamming { type Unit = u8; fn distance(&self, &a: &u8, &b: &u8) -> Self::Unit { (a ^ b).count_ones() as u8 } } #[test] fn test_linear_knn() { let data = vec![ (0b1010_1010, 12), (0b1111_1111, 13), (0b0000_0000, 14), (0b1111_0000, 16), (0b0000_1111, 10), ]; let search: LinearKnn = KnnFromBatch::from_batch(data.iter()); assert_eq!( &search.knn(&0b0101_0000, 3), &[ ( Neighbor { index: 2, distance: 2 }, &data[2].0, &data[2].1 ), ( Neighbor { index: 3, distance: 2 }, &data[3].0, &data[3].1 ), ( Neighbor { index: 0, distance: 6 }, &data[0].0, &data[0].1 ) ] ); }