simstring_rust/measures/
overlap.rs

1use 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}