-
Notifications
You must be signed in to change notification settings - Fork 3
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
add experiments directory + compare_approaches
- Loading branch information
1 parent
ae3f6bd
commit 5760c7c
Showing
20 changed files
with
181 additions
and
37 deletions.
There are no files selected for viewing
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
Binary file not shown.
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
from __future__ import division | ||
|
||
|
||
def recall(detected, true): | ||
truePositive = [entity for entity in detected if entity in true] | ||
|
||
if len(true) == 0: | ||
return float('nan') | ||
|
||
return len(truePositive) / len(true) | ||
|
||
def precision(detected, true): | ||
truePositive = [entity for entity in detected if entity in true] | ||
|
||
if len(detected) == 0: | ||
return float('nan') | ||
|
||
return len(truePositive) / len(detected) | ||
|
||
def f_measure(detected, true, alpha=0.5): | ||
pre = precision(detected, true) | ||
rec = recall(detected, true) | ||
|
||
if ((pre == 0) & (rec == 0)): | ||
return 0.0 | ||
|
||
return pre*rec/(alpha*rec + (1-alpha)*pre) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
from context import dataUtils, evaluate, hist, incode, jdeodorant | ||
|
||
|
||
# This script is used to compare the performances of various feature envy detection approaches | ||
# on the systems considered in this study. | ||
|
||
parameters = {'hist': 2.0, 'incode': (3.0, 3.0, 3.0)} | ||
|
||
systems = [ | ||
'android-frameworks-opt-telephony', | ||
'android-platform-support', | ||
'apache-ant', | ||
'apache-tomcat', | ||
'lucene', | ||
'argouml', | ||
'jedit', | ||
'xerces-2_7_0' | ||
] | ||
|
||
|
||
for system in systems: | ||
# Get occurrences manually detected on the considered system | ||
true = dataUtils.getLabels(system, 'feature_envy') | ||
|
||
# Compute performances for HIST | ||
detected_hist = hist.getSmells(system, parameters['hist']) | ||
|
||
precision_hist = evaluate.precision(detected_hist, true) | ||
recall_hist = evaluate.recall(detected_hist, true) | ||
f_measure_hist = evaluate.f_measure(detected_hist, true) | ||
|
||
# Compute performances for InCode | ||
detected_incode = incode.getSmells(system, *parameters['incode']) | ||
|
||
precision_incode = evaluate.precision(detected_incode, true) | ||
recall_incode = evaluate.recall(detected_incode, true) | ||
f_measure_incode = evaluate.f_measure(detected_incode, true) | ||
|
||
# Compute performances for JDeodorant | ||
detected_jdeodorant = jdeodorant.getSmells(system) | ||
|
||
precision_jdeodorant = evaluate.precision(detected_jdeodorant, true) | ||
recall_jdeodorant = evaluate.recall(detected_jdeodorant, true) | ||
f_measure_jdeodorant = evaluate.f_measure(detected_jdeodorant, true) | ||
|
||
|
||
# Output results | ||
print(' |precision |recall |f_measure') | ||
print('-------------------------------------------------') | ||
print('HIST |' + "{0:.3f}".format(precision_hist) + ' |' + "{0:.3f}".format(recall_hist) + ' |' + "{0:.3f}".format(f_measure_hist)) | ||
print('-------------------------------------------------') | ||
print('InCode |' + "{0:.3f}".format(precision_incode) + ' |' + "{0:.3f}".format(recall_incode) + ' |' + "{0:.3f}".format(f_measure_incode)) | ||
print('-------------------------------------------------') | ||
print('JDeodorant |' + "{0:.3f}".format(precision_jdeodorant) + ' |' + "{0:.3f}".format(recall_jdeodorant) + ' |' + "{0:.3f}".format(f_measure_jdeodorant)) | ||
print('\n\n') | ||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
import os | ||
import sys | ||
|
||
ROOT_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), '../..')) | ||
sys.path.insert(0, ROOT_DIR) | ||
|
||
import utils.dataUtils as dataUtils | ||
import experiments.evaluate as evaluate | ||
|
||
import detection_tools.replication.feature_envy.hist as hist | ||
import detection_tools.replication.feature_envy.incode as incode | ||
import detection_tools.replication.feature_envy.jdeodorant as jdeodorant |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,65 @@ | ||
from context import evaluate | ||
|
||
import math | ||
import unittest | ||
|
||
class TestDecorGCCM(unittest.TestCase): | ||
def setUp(self): | ||
self.set_1 = ['a','b','c','d', 'e'] | ||
self.set_2 = ['b','e', 'f', 'g'] | ||
self.set_3 = ['c'] | ||
self.set_4 = [] | ||
|
||
def tearDown(self): | ||
del self.set_1 | ||
del self.set_2 | ||
del self.set_3 | ||
del self.set_4 | ||
|
||
|
||
def test_precision(self): | ||
self.assertEqual(evaluate.precision(self.set_1, self.set_1), 1.0) | ||
self.assertEqual(evaluate.precision(self.set_1, self.set_2), 0.4) | ||
self.assertEqual(evaluate.precision(self.set_1, self.set_3), 0.2) | ||
self.assertEqual(evaluate.precision(self.set_1, self.set_4), 0.0) | ||
self.assertEqual(evaluate.precision(self.set_2, self.set_1), 0.5) | ||
self.assertEqual(evaluate.precision(self.set_2, self.set_2), 1.0) | ||
self.assertEqual(evaluate.precision(self.set_2, self.set_3), 0.0) | ||
self.assertEqual(evaluate.precision(self.set_3, self.set_1), 1.0) | ||
self.assertEqual(evaluate.precision(self.set_3, self.set_4), 0.0) | ||
self.assertTrue(math.isnan(evaluate.precision(self.set_4, self.set_1))) | ||
self.assertTrue(math.isnan(evaluate.precision(self.set_4, self.set_3))) | ||
self.assertTrue(math.isnan(evaluate.precision(self.set_4, self.set_4))) | ||
|
||
def test_recall(self): | ||
self.assertEqual(evaluate.recall(self.set_1, self.set_1), 1.0) | ||
self.assertEqual(evaluate.recall(self.set_1, self.set_2), 0.5) | ||
self.assertEqual(evaluate.recall(self.set_1, self.set_3), 1.0) | ||
self.assertTrue(math.isnan(evaluate.recall(self.set_1, self.set_4))) | ||
self.assertEqual(evaluate.recall(self.set_2, self.set_1), 0.4) | ||
self.assertEqual(evaluate.recall(self.set_2, self.set_2), 1.0) | ||
self.assertEqual(evaluate.recall(self.set_2, self.set_3), 0.0) | ||
self.assertEqual(evaluate.recall(self.set_3, self.set_1), 0.2) | ||
self.assertTrue(math.isnan(evaluate.recall(self.set_3, self.set_4))) | ||
self.assertEqual(evaluate.recall(self.set_4, self.set_1), 0.0) | ||
self.assertEqual(evaluate.recall(self.set_4, self.set_3), 0.0) | ||
self.assertTrue(math.isnan(evaluate.recall(self.set_4, self.set_4))) | ||
|
||
def test_f_measure(self): | ||
self.assertEqual(evaluate.f_measure(self.set_1, self.set_1), 1.0) | ||
self.assertEqual(evaluate.f_measure(self.set_1, self.set_2), 0.4444444444444445) | ||
self.assertEqual(evaluate.f_measure(self.set_1, self.set_3), 0.33333333333333337) | ||
self.assertTrue(math.isnan(evaluate.f_measure(self.set_1, self.set_4))) | ||
self.assertEqual(evaluate.f_measure(self.set_2, self.set_1), 0.4444444444444445) | ||
self.assertEqual(evaluate.f_measure(self.set_2, self.set_2), 1.0) | ||
self.assertEqual(evaluate.f_measure(self.set_2, self.set_3), 0.0) | ||
self.assertEqual(evaluate.f_measure(self.set_3, self.set_1), 0.33333333333333337) | ||
self.assertTrue(math.isnan(evaluate.f_measure(self.set_3, self.set_4))) | ||
self.assertTrue(math.isnan(evaluate.f_measure(self.set_4, self.set_1))) | ||
self.assertTrue(math.isnan(evaluate.f_measure(self.set_4, self.set_3))) | ||
self.assertTrue(math.isnan(evaluate.f_measure(self.set_4, self.set_4))) | ||
|
||
|
||
|
||
if __name__ == '__main__': | ||
unittest.main() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters