simstring_rust/measures/
overlap.rs1use super::{compute_intersection_size, Measure};
2use crate::database::Database;
3use lasso::Spur;
4use std::cmp;
5
6#[derive(Default, Clone, Copy)]
7pub struct Overlap;
8
9impl Measure for Overlap {
10 fn min_feature_size(&self, _query_size: usize, _alpha: f64) -> usize {
11 1
12 }
13
14 fn max_feature_size(&self, _query_size: usize, _alpha: f64, db: &dyn Database) -> usize {
15 db.max_feature_len()
16 }
17
18 fn minimum_common_feature_count(&self, query_size: usize, y_size: usize, alpha: f64) -> usize {
19 (alpha * cmp::min(query_size, y_size) as f64).ceil() as usize
20 }
21
22 fn similarity(&self, x: &[Spur], y: &[Spur]) -> f64 {
23 if x.is_empty() && y.is_empty() {
24 return 1.0;
25 }
26 if x.is_empty() || y.is_empty() {
27 return 0.0;
28 }
29
30 let intersection_size = compute_intersection_size(x, y);
31 let denominator = cmp::min(x.len(), y.len()) as f64;
32
33 if denominator == 0.0 {
34 0.0
35 } else {
36 intersection_size as f64 / denominator
37 }
38 }
39}