diff --git a/src/gleam_community/maths/metrics.gleam b/src/gleam_community/maths/metrics.gleam index cd9bfa6..4c45285 100644 --- a/src/gleam_community/maths/metrics.gleam +++ b/src/gleam_community/maths/metrics.gleam @@ -49,6 +49,7 @@ import gleam/list import gleam/pair import gleam/set import gleam/float +import gleam/int ///
/// @@ -676,3 +677,37 @@ pub fn tversky_index( } } } + +///
+/// +/// Spot a typo? Open an issue! +/// +///
+/// +/// +///
+/// Example: +/// +/// import gleeunit/should +/// import gleam_community/maths/metrics +/// +/// pub fn example () { +/// } +///
+/// +///
+/// +/// Back to top ↑ +/// +///
+/// +pub fn overlap_coefficient(aset: set.Set(a), bset: set.Set(a)) -> Float { + let intersection: Float = + set.intersection(aset, bset) + |> set.size() + |> conversion.int_to_float() + let minsize: Float = + piecewise.minimum(set.size(aset), set.size(bset), int.compare) + |> conversion.int_to_float() + intersection /. minsize +} diff --git a/test/gleam_community/maths/metrics_test.gleam b/test/gleam_community/maths/metrics_test.gleam index cbd8d5e..2cb5ef1 100644 --- a/test/gleam_community/maths/metrics_test.gleam +++ b/test/gleam_community/maths/metrics_test.gleam @@ -234,3 +234,25 @@ pub fn example_jaccard_index_test() { metrics.jaccard_index(set_e, set_f) |> should.equal(1.0 /. 7.0) } + +pub fn example_overlap_coefficient_test() { + metrics.overlap_coefficient(set.from_list([]), set.from_list([])) + |> should.equal(0.0) + + let set_a: set.Set(Int) = set.from_list([0, 1, 2, 5, 6, 8, 9]) + let set_b: set.Set(Int) = set.from_list([0, 2, 3, 4, 5, 7, 9]) + metrics.overlap_coefficient(set_a, set_b) + |> should.equal(4.0 /. 7.0) + + let set_c: set.Set(Int) = set.from_list([0, 1, 2, 3, 4, 5]) + let set_d: set.Set(Int) = set.from_list([6, 7, 8, 9, 10]) + metrics.overlap_coefficient(set_c, set_d) + |> should.equal(0.0 /. 5.0) + + let set_e: set.Set(String) = + set.from_list(["cat", "dog", "hippo", "monkey", "rhino"]) + let set_f: set.Set(String) = + set.from_list(["monkey", "rhino", "ostrich", "salmon"]) + metrics.overlap_coefficient(set_e, set_f) + |> should.equal(2.0 /. 4.0) +}