Skip to content

Commit 73dd406

Browse files
authored
Merge pull request #137 from Pennycook/code-divergence
Fix definition and implementation of divergence
2 parents 4c607ca + f00c943 commit 73dd406

File tree

4 files changed

+51
-2
lines changed

4 files changed

+51
-2
lines changed

codebasin/report.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ def divergence(setmap):
7777
npairs += 1
7878

7979
if npairs == 0:
80-
return 0
80+
return float("nan")
8181
return d / float(npairs)
8282

8383

docs/source/specialization.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ pairwise distances:
5757

5858
.. math::
5959
CD(a, p, H) = \binom{|H|}{2}^{-1}
60-
\sum_{\{i, j\} \in H \times H} {d_{i, j}(a, p)}
60+
\sum_{\{i, j\} \in \binom{H}{2}} {d_{i, j}(a, p)}
6161
6262
where :math:`d_{i, j}(a, p)` represents the distance between the source
6363
code required by platforms :math:`i` and :math:`j` for application

tests/metrics/__init__.py

Whitespace-only changes.

tests/metrics/test_divergence.py

+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
# Copyright (C) 2019-2024 Intel Corporation
2+
# SPDX-License-Identifier: BSD-3-Clause
3+
4+
import logging
5+
import math
6+
import unittest
7+
import warnings
8+
9+
from codebasin.report import divergence
10+
11+
12+
class TestDivergence(unittest.TestCase):
13+
"""
14+
Test computation of code divergence.
15+
"""
16+
17+
def setUp(self):
18+
logging.disable()
19+
warnings.simplefilter("ignore", ResourceWarning)
20+
21+
def test_divergence(self):
22+
"""Check divergence computation for simple setmap."""
23+
setmap = {
24+
frozenset(["A"]): 1,
25+
frozenset(["B"]): 2,
26+
frozenset(["A", "B"]): 3,
27+
frozenset([]): 4,
28+
}
29+
intersection = 3
30+
union = 1 + 2 + 3
31+
32+
expected_divergence = intersection / union
33+
self.assertEqual(divergence(setmap), expected_divergence)
34+
35+
def test_null_divergence(self):
36+
"""Check divergence computation for null cases."""
37+
setmap = {
38+
frozenset(""): 0,
39+
}
40+
self.assertTrue(math.isnan(divergence(setmap)))
41+
42+
setmap = {
43+
frozenset("A"): 1,
44+
}
45+
self.assertTrue(math.isnan(divergence(setmap)))
46+
47+
48+
if __name__ == "__main__":
49+
unittest.main()

0 commit comments

Comments
 (0)