diff --git a/.DS_Store b/.DS_Store index f434153..53c007f 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/README.md b/README.md index 6f5a640..750d7e8 100644 --- a/README.md +++ b/README.md @@ -9,11 +9,11 @@ The key idea behind SMAD is to combine various anti-pattern detection tools by c their core-metrics for each input instance and use these metrics to feed a machine-learning based classifier. First, for each anti-pattern considered in this study, we selected three state-of-the-art detection tools. These tools respectively rely on: -* **Rule Card**s: Affected entities are identified using a combination of source-code metrics designed to reflect the formal definition of the anti-patterns. +* **Rule Cards:** Affected entities are identified using a combination of source-code metrics designed to reflect the formal definition of the anti-patterns. For this category, we selected DECOR for God Class and InCode for Feature Envy detection. -* **Historical** Information: Affected entities are identified via an analysis of change history information derived from versioning systems. +* **Historical Information:** Affected entities are identified via an analysis of change history information derived from versioning systems. For this category, we used HIST for both God Class and Feature Envy detection. -* **Refactoring Opportunities**: Anti-patterns are detected by identifying the opportunities to apply their corresponding refactoring operations. +* **Refactoring Opportunities:** Anti-patterns are detected by identifying the opportunities to apply their corresponding refactoring operations. For this category, we used the refactoring operations Extract Class and Move Method provided by JDeodorant, respectively for God Class and Feature Envy detection. Then, we selected the core-metrics, i.e., metrics that reflect best the internal decision process of each tool, as input metrics for our model. diff --git a/detection_tools/.DS_Store b/detection_tools/.DS_Store index c55e323..7ea9a17 100644 Binary files a/detection_tools/.DS_Store and b/detection_tools/.DS_Store differ diff --git a/experiments/.DS_Store b/experiments/.DS_Store index 3e4d4bb..db656db 100644 Binary files a/experiments/.DS_Store and b/experiments/.DS_Store differ diff --git a/experiments/feature_envy/asci.py b/experiments/feature_envy/asci.py new file mode 100644 index 0000000..1ca98d8 --- /dev/null +++ b/experiments/feature_envy/asci.py @@ -0,0 +1,49 @@ +from context import experimentUtils, dataUtils, nnUtils, hist, incode, jdeodorant +from sklearn import tree + +import numpy as np + + +training_systems = ['xerces-2_7_0', 'lucene', 'apache-ant', 'argouml', 'android-frameworks-opt-telephony'] + +def getToolIndexes(system): + entities = dataUtils.getCandidateFeatureEnvy(system) + antipatterns = dataUtils.getAntipatterns(system, 'feature_envy') + detected = [hist.getSmells(system), jdeodorant.getSmells(system), incode.getSmells(system)] + + toolIndexes = [2 for e in entities] + for i, e in enumerate(entities): + if e in antipatterns: + for toolIdx, detected_tool in enumerate(detected): + if e in detected_tool: + toolIndexes[i] = toolIdx + + else: + for toolIdx, detected_tool in enumerate(detected): + if e not in detected_tool: + toolIndexes[i] = toolIdx + + return toolIndexes + +X = [] +Y = [] +for system in training_systems: + X += nnUtils.getInstances(system, 'feature_envy', False).tolist() + Y += getToolIndexes(system) + +clf = tree.DecisionTreeClassifier() +clf = clf.fit(X, Y) + +def getSmells(system): + instances = nnUtils.getInstances(system, 'feature_envy', False) + predictedToolIndexes = clf.predict(instances) + + entities = dataUtils.getCandidateFeatureEnvy(system) + detected = [hist.getSmells(system), jdeodorant.getSmells(system), incode.getSmells(system)] + + smells = [] + for i, e in enumerate(entities): + if e in detected[predictedToolIndexes[i]]: + smells.append(e) + + return smells \ No newline at end of file diff --git a/experiments/feature_envy/compare_approaches.py b/experiments/feature_envy/compare_approaches.py index 334aed0..6edbcba 100644 --- a/experiments/feature_envy/compare_approaches.py +++ b/experiments/feature_envy/compare_approaches.py @@ -2,11 +2,12 @@ import numpy as np -import smad_fe +import smad_fe, asci # This script is used to compare the performances of: # - The detection tools aggregated through SMAD -# - The voting technique with k in {1, 2, 3} +# - The voting technique with k=1 +# - ASCI # - SMAD # for Feature Envy detection on the three subject systems. @@ -28,13 +29,9 @@ r_v1 = [] f_v1 = [] -p_v2 = [] -r_v2 = [] -f_v2 = [] - -p_v3 = [] -r_v3 = [] -f_v3 = [] +p_asci = [] +r_asci = [] +f_asci = [] p_smad = [] r_smad = [] @@ -96,27 +93,18 @@ r_v1.append(recall_vote_1) f_v1.append(f_measure_vote_1) - # Compute vote for k = 2 - detected_vote_2 = experimentUtils.vote(tools_outputs, 2) - - precision_vote_2 = experimentUtils.precision(detected_vote_2, true) - recall_vote_2 = experimentUtils.recall(detected_vote_2, true) - f_measure_vote_2 = experimentUtils.f_measure(detected_vote_2, true) - p_v2.append(precision_vote_2) - r_v2.append(recall_vote_2) - f_v2.append(f_measure_vote_2) + # ASCI + detected_asci = asci.getSmells(system) - # Compute vote for k = 3 - detected_vote_3 = experimentUtils.vote(tools_outputs, 3) + precision_asci = experimentUtils.precision(detected_asci, true) + recall_asci = experimentUtils.recall(detected_asci, true) + f_measure_asci = experimentUtils.f_measure(detected_asci, true) - precision_vote_3 = experimentUtils.precision(detected_vote_3, true) - recall_vote_3 = experimentUtils.recall(detected_vote_3, true) - f_measure_vote_3 = experimentUtils.f_measure(detected_vote_3, true) + p_asci.append(precision_asci) + r_asci.append(recall_asci) + f_asci.append(f_measure_asci) - p_v3.append(precision_vote_3) - r_v3.append(recall_vote_3) - f_v3.append(f_measure_vote_3) # SMAD detected_smad = smad_fe.getSmells(system) @@ -141,9 +129,7 @@ print('-------------------------------------------------') print('Vote 1 |' + "{0:.3f}".format(precision_vote_1) + ' |' + "{0:.3f}".format(recall_vote_1) + ' |' + "{0:.3f}".format(f_measure_vote_1)) print('-------------------------------------------------') - print('Vote 2 |' + "{0:.3f}".format(precision_vote_2) + ' |' + "{0:.3f}".format(recall_vote_2) + ' |' + "{0:.3f}".format(f_measure_vote_2)) - print('-------------------------------------------------') - print('Vote 3 |' + "{0:.3f}".format(precision_vote_3) + ' |' + "{0:.3f}".format(recall_vote_3) + ' |' + "{0:.3f}".format(f_measure_vote_3)) + print('ASCI |' + "{0:.3f}".format(precision_asci) + ' |' + "{0:.3f}".format(recall_asci) + ' |' + "{0:.3f}".format(f_measure_asci)) print('-------------------------------------------------') print('SMAD |' + "{0:.3f}".format(precision_smad) + ' |' + "{0:.3f}".format(recall_smad) + ' |' + "{0:.3f}".format(f_measure_smad)) print('-------------------------------------------------') @@ -163,9 +149,7 @@ print('-------------------------------------------------') print('Vote 1 |' + "{0:.3f}".format(np.mean(p_v1)) + ' |' + "{0:.3f}".format(np.mean(r_v1)) + ' |' + "{0:.3f}".format(np.mean(f_v1))) print('-------------------------------------------------') -print('Vote 2 |' + "{0:.3f}".format(np.mean(p_v2)) + ' |' + "{0:.3f}".format(np.mean(r_v2)) + ' |' + "{0:.3f}".format(np.mean(f_v2))) -print('-------------------------------------------------') -print('Vote 3 |' + "{0:.3f}".format(np.mean(p_v3)) + ' |' + "{0:.3f}".format(np.mean(r_v3)) + ' |' + "{0:.3f}".format(np.mean(f_v3))) +print('ASCI |' + "{0:.3f}".format(np.mean(p_asci)) + ' |' + "{0:.3f}".format(np.mean(r_asci)) + ' |' + "{0:.3f}".format(np.mean(f_asci))) print('-------------------------------------------------') print('SMAD |' + "{0:.3f}".format(np.mean(p_smad)) + ' |' + "{0:.3f}".format(np.mean(r_smad)) + ' |' + "{0:.3f}".format(np.mean(f_smad))) print('-------------------------------------------------') diff --git a/experiments/feature_envy/parameters_calibration/context.py b/experiments/feature_envy/parameters_calibration/context.py index c83e36f..ecbf08c 100644 --- a/experiments/feature_envy/parameters_calibration/context.py +++ b/experiments/feature_envy/parameters_calibration/context.py @@ -10,8 +10,9 @@ import utils.liuUtils as liuUtils import utils.nnUtils as nnUtils -import detection_tools.feature_envy.hist as hist -import detection_tools.feature_envy.incode as incode +import detection_tools.feature_envy.hist as hist +import detection_tools.feature_envy.incode as incode +import detection_tools.feature_envy.jdeodorant as jdeodorant import experiments.feature_envy.smad_fe as smad_fe diff --git a/experiments/feature_envy/parameters_calibration/calibrate_hist.py b/experiments/feature_envy/parameters_calibration/hist.py similarity index 100% rename from experiments/feature_envy/parameters_calibration/calibrate_hist.py rename to experiments/feature_envy/parameters_calibration/hist.py diff --git a/experiments/feature_envy/parameters_calibration/calibrate_incode.py b/experiments/feature_envy/parameters_calibration/incode.py similarity index 100% rename from experiments/feature_envy/parameters_calibration/calibrate_incode.py rename to experiments/feature_envy/parameters_calibration/incode.py diff --git a/experiments/feature_envy/parameters_calibration/liu_cross_validation.py b/experiments/feature_envy/parameters_calibration/liu.py similarity index 100% rename from experiments/feature_envy/parameters_calibration/liu_cross_validation.py rename to experiments/feature_envy/parameters_calibration/liu.py diff --git a/experiments/feature_envy/parameters_calibration/smad_cross_validation.py b/experiments/feature_envy/parameters_calibration/smad.py similarity index 100% rename from experiments/feature_envy/parameters_calibration/smad_cross_validation.py rename to experiments/feature_envy/parameters_calibration/smad.py diff --git a/experiments/feature_envy/parameters_calibration/vote.py b/experiments/feature_envy/parameters_calibration/vote.py new file mode 100644 index 0000000..af26596 --- /dev/null +++ b/experiments/feature_envy/parameters_calibration/vote.py @@ -0,0 +1,21 @@ +from context import experimentUtils, dataUtils, hist, incode, jdeodorant +from sklearn import tree + +import numpy as np + +validation_systems = ['xerces-2_7_0', 'lucene', 'apache-ant', 'argouml', 'android-frameworks-opt-telephony'] + +fm_v1 = [] +fm_v2 = [] +fm_v3 = [] +for system in validation_systems: + antipatterns = dataUtils.getAntipatterns(system, 'feature_envy') + detected = [hist.getSmells(system), incode.getSmells(system), jdeodorant.getSmells(system)] + + fm_v1.append(experimentUtils.f_measure(experimentUtils.vote(detected, 1), antipatterns)) + fm_v2.append(experimentUtils.f_measure(experimentUtils.vote(detected, 2), antipatterns)) + fm_v3.append(experimentUtils.f_measure(experimentUtils.vote(detected, 3), antipatterns)) + +print('V1: ' + str(np.mean(np.array(fm_v1)))) +print('V2: ' + str(np.mean(np.array(fm_v2)))) +print('V3: ' + str(np.mean(np.array(fm_v3)))) \ No newline at end of file diff --git a/experiments/feature_envy/train_liu.py b/experiments/feature_envy/train_liu.py index 9999db7..696db3c 100644 --- a/experiments/feature_envy/train_liu.py +++ b/experiments/feature_envy/train_liu.py @@ -8,6 +8,8 @@ import os import progressbar +# Train Liu's model on instances detected by SMAD + def get_save_path(): return os.path.join(ROOT_DIR, 'neural_networks/liu_replication/trained_models/generated/network') diff --git a/experiments/god_class/asci.py b/experiments/god_class/asci.py new file mode 100644 index 0000000..59d1f39 --- /dev/null +++ b/experiments/god_class/asci.py @@ -0,0 +1,50 @@ +from context import experimentUtils, dataUtils, nnUtils, hist, decor, jdeodorant +from sklearn import tree + +import numpy as np + + +training_systems = ['xerces-2_7_0', 'lucene', 'apache-ant', 'argouml', 'android-frameworks-opt-telephony'] + +def getToolIndexes(system): + entities = dataUtils.getClasses(system) + antipatterns = dataUtils.getAntipatterns(system, 'god_class') + detected = [jdeodorant.getSmells(system), decor.getSmells(system), hist.getSmells(system)] + + toolIndexes = [2 for e in entities] + for i, e in enumerate(entities): + if e in antipatterns: + for toolIdx, detected_tool in enumerate(detected): + if e in detected_tool: + toolIndexes[i] = toolIdx + + else: + for toolIdx, detected_tool in enumerate(detected): + if e not in detected_tool: + toolIndexes[i] = toolIdx + + return toolIndexes + +X = [] +Y = [] +for system in training_systems: + X += nnUtils.getInstances(system, 'god_class', False).tolist() + Y += getToolIndexes(system) + +clf = tree.DecisionTreeClassifier() +clf = clf.fit(X, Y) + + +def getSmells(system): + instances = nnUtils.getInstances(system, 'god_class', False) + predictedToolIndexes = clf.predict(instances) + + entities = dataUtils.getClasses(system) + detected = [jdeodorant.getSmells(system), decor.getSmells(system), hist.getSmells(system)] + + smells = [] + for i, e in enumerate(entities): + if e in detected[predictedToolIndexes[i]]: + smells.append(e) + + return smells diff --git a/experiments/god_class/compare_approaches.py b/experiments/god_class/compare_approaches.py index a95faf1..402c816 100644 --- a/experiments/god_class/compare_approaches.py +++ b/experiments/god_class/compare_approaches.py @@ -2,11 +2,12 @@ import numpy as np -import smad_gc +import smad_gc, asci # This script is used to compare the performances of: # - The detection tools aggregated through SMAD -# - The voting technique with k in {1, 2, 3} +# - The voting technique with k=2 +# - ASCI # - SMAD # for God Class detection on the three subject systems. @@ -24,17 +25,13 @@ r_jd = [] f_jd = [] -p_v1 = [] -r_v1 = [] -f_v1 = [] - p_v2 = [] r_v2 = [] f_v2 = [] -p_v3 = [] -r_v3 = [] -f_v3 = [] +p_asci = [] +r_asci = [] +f_asci = [] p_smad = [] r_smad = [] @@ -82,17 +79,6 @@ tools_outputs = [detected_hist, detected_decor, detected_jdeodorant] - # Compute vote for k = 1 - detected_vote_1 = experimentUtils.vote(tools_outputs, 1) - - precision_vote_1 = experimentUtils.precision(detected_vote_1, true) - recall_vote_1 = experimentUtils.recall(detected_vote_1, true) - f_measure_vote_1 = experimentUtils.f_measure(detected_vote_1, true) - - p_v1.append(precision_vote_1) - r_v1.append(recall_vote_1) - f_v1.append(f_measure_vote_1) - # Compute vote for k = 2 detected_vote_2 = experimentUtils.vote(tools_outputs, 2) @@ -104,16 +90,18 @@ r_v2.append(recall_vote_2) f_v2.append(f_measure_vote_2) - # Compute vote for k = 3 - detected_vote_3 = experimentUtils.vote(tools_outputs, 3) - precision_vote_3 = experimentUtils.precision(detected_vote_3, true) - recall_vote_3 = experimentUtils.recall(detected_vote_3, true) - f_measure_vote_3 = experimentUtils.f_measure(detected_vote_3, true) + # ASCI + detected_asci = asci.getSmells(system) + + precision_asci = experimentUtils.precision(detected_asci, true) + recall_asci = experimentUtils.recall(detected_asci, true) + f_measure_asci = experimentUtils.f_measure(detected_asci, true) + + p_asci.append(precision_asci) + r_asci.append(recall_asci) + f_asci.append(f_measure_asci) - p_v3.append(precision_vote_3) - r_v3.append(recall_vote_3) - f_v3.append(f_measure_vote_3) # SMAD detected_smad = smad_gc.getSmells(system) @@ -138,11 +126,9 @@ print('JDeodorant |' + "{0:.3f}".format(precision_jdeodorant) + ' |' + "{0:.3f}".format(recall_jdeodorant) + ' |' + "{0:.3f}".format(f_measure_jdeodorant)) print('-------------------------------------------------') print('-------------------------------------------------') - print('Vote 1 |' + "{0:.3f}".format(precision_vote_1) + ' |' + "{0:.3f}".format(recall_vote_1) + ' |' + "{0:.3f}".format(f_measure_vote_1)) - print('-------------------------------------------------') print('Vote 2 |' + "{0:.3f}".format(precision_vote_2) + ' |' + "{0:.3f}".format(recall_vote_2) + ' |' + "{0:.3f}".format(f_measure_vote_2)) print('-------------------------------------------------') - print('Vote 3 |' + "{0:.3f}".format(precision_vote_3) + ' |' + "{0:.3f}".format(recall_vote_3) + ' |' + "{0:.3f}".format(f_measure_vote_3)) + print('ASCI |' + "{0:.3f}".format(precision_asci) + ' |' + "{0:.3f}".format(recall_asci) + ' |' + "{0:.3f}".format(f_measure_asci)) print('-------------------------------------------------') print('SMAD |' + "{0:.3f}".format(precision_smad) + ' |' + "{0:.3f}".format(recall_smad) + ' |' + "{0:.3f}".format(f_measure_smad)) print('-------------------------------------------------') @@ -160,11 +146,9 @@ print('JDeodorant |' + "{0:.3f}".format(np.mean(p_jd)) + ' |' + "{0:.3f}".format(np.mean(r_jd)) + ' |' + "{0:.3f}".format(np.mean(f_jd))) print('-------------------------------------------------') print('-------------------------------------------------') -print('Vote 1 |' + "{0:.3f}".format(np.mean(p_v1)) + ' |' + "{0:.3f}".format(np.mean(r_v1)) + ' |' + "{0:.3f}".format(np.mean(f_v1))) -print('-------------------------------------------------') print('Vote 2 |' + "{0:.3f}".format(np.mean(p_v2)) + ' |' + "{0:.3f}".format(np.mean(r_v2)) + ' |' + "{0:.3f}".format(np.mean(f_v2))) print('-------------------------------------------------') -print('Vote 3 |' + "{0:.3f}".format(np.mean(p_v3)) + ' |' + "{0:.3f}".format(np.mean(r_v3)) + ' |' + "{0:.3f}".format(np.mean(f_v3))) +print('ASCI |' + "{0:.3f}".format(np.mean(p_asci)) + ' |' + "{0:.3f}".format(np.mean(r_asci)) + ' |' + "{0:.3f}".format(np.mean(f_asci))) print('-------------------------------------------------') print('SMAD |' + "{0:.3f}".format(np.mean(p_smad)) + ' |' + "{0:.3f}".format(np.mean(r_smad)) + ' |' + "{0:.3f}".format(np.mean(f_smad))) print('-------------------------------------------------') diff --git a/experiments/god_class/parameters_calibration/context.py b/experiments/god_class/parameters_calibration/context.py index c6d103d..625a8a1 100644 --- a/experiments/god_class/parameters_calibration/context.py +++ b/experiments/god_class/parameters_calibration/context.py @@ -8,6 +8,8 @@ import utils.experimentUtils as experimentUtils import utils.nnUtils as nnUtils -import detection_tools.god_class.hist as hist +import detection_tools.god_class.hist as hist +import detection_tools.god_class.decor as decor +import detection_tools.god_class.jdeodorant as jdeodorant import neural_networks.smad.model as md \ No newline at end of file diff --git a/experiments/god_class/parameters_calibration/calibrate_hist.py b/experiments/god_class/parameters_calibration/hist.py similarity index 100% rename from experiments/god_class/parameters_calibration/calibrate_hist.py rename to experiments/god_class/parameters_calibration/hist.py diff --git a/experiments/god_class/parameters_calibration/smad_cross_validation.py b/experiments/god_class/parameters_calibration/smad.py similarity index 100% rename from experiments/god_class/parameters_calibration/smad_cross_validation.py rename to experiments/god_class/parameters_calibration/smad.py diff --git a/experiments/god_class/parameters_calibration/vote.py b/experiments/god_class/parameters_calibration/vote.py new file mode 100644 index 0000000..5fc94eb --- /dev/null +++ b/experiments/god_class/parameters_calibration/vote.py @@ -0,0 +1,21 @@ +from context import experimentUtils, dataUtils, hist, decor, jdeodorant +from sklearn import tree + +import numpy as np + +validation_systems = ['xerces-2_7_0', 'lucene', 'apache-ant', 'argouml', 'android-frameworks-opt-telephony'] + +fm_v1 = [] +fm_v2 = [] +fm_v3 = [] +for system in validation_systems: + antipatterns = dataUtils.getAntipatterns(system, 'god_class') + detected = [hist.getSmells(system), decor.getSmells(system), jdeodorant.getSmells(system)] + + fm_v1.append(experimentUtils.f_measure(experimentUtils.vote(detected, 1), antipatterns)) + fm_v2.append(experimentUtils.f_measure(experimentUtils.vote(detected, 2), antipatterns)) + fm_v3.append(experimentUtils.f_measure(experimentUtils.vote(detected, 3), antipatterns)) + +print('V1: ' + str(np.mean(np.array(fm_v1)))) +print('V2: ' + str(np.mean(np.array(fm_v2)))) +print('V3: ' + str(np.mean(np.array(fm_v3)))) \ No newline at end of file diff --git a/assets/jar/.DS_Store b/images/.DS_Store similarity index 100% rename from assets/jar/.DS_Store rename to images/.DS_Store diff --git a/images/SMAD.png b/images/SMAD.png deleted file mode 100644 index 01fc27b..0000000 Binary files a/images/SMAD.png and /dev/null differ diff --git a/assets/.DS_Store b/java/.DS_Store similarity index 100% rename from assets/.DS_Store rename to java/.DS_Store diff --git a/java/jar/.DS_Store b/java/jar/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/java/jar/.DS_Store differ diff --git a/assets/jar/DecorMetricsFileCreator.jar b/java/jar/DecorMetricsFileCreator.jar similarity index 100% rename from assets/jar/DecorMetricsFileCreator.jar rename to java/jar/DecorMetricsFileCreator.jar diff --git a/assets/jar/InCodeMetricsFileCreator.jar b/java/jar/InCodeMetricsFileCreator.jar similarity index 100% rename from assets/jar/InCodeMetricsFileCreator.jar rename to java/jar/InCodeMetricsFileCreator.jar diff --git a/assets/jar/JDMetricsFileCreator.jar b/java/jar/JDMetricsFileCreator.jar similarity index 100% rename from assets/jar/JDMetricsFileCreator.jar rename to java/jar/JDMetricsFileCreator.jar diff --git a/assets/jar/diffj-1.6.3.jar b/java/jar/diffj-1.6.3.jar similarity index 100% rename from assets/jar/diffj-1.6.3.jar rename to java/jar/diffj-1.6.3.jar diff --git a/assets/src/.DS_Store b/java/src/.DS_Store similarity index 100% rename from assets/src/.DS_Store rename to java/src/.DS_Store diff --git a/assets/src/decor/DecorMetricsFileCreator.java b/java/src/decor/DecorMetricsFileCreator.java similarity index 100% rename from assets/src/decor/DecorMetricsFileCreator.java rename to java/src/decor/DecorMetricsFileCreator.java diff --git a/assets/src/incode/ATFDFileVisitor.java b/java/src/incode/ATFDFileVisitor.java similarity index 100% rename from assets/src/incode/ATFDFileVisitor.java rename to java/src/incode/ATFDFileVisitor.java diff --git a/assets/src/incode/InCodeMetricsFileCreator.java b/java/src/incode/InCodeMetricsFileCreator.java similarity index 100% rename from assets/src/incode/InCodeMetricsFileCreator.java rename to java/src/incode/InCodeMetricsFileCreator.java diff --git a/assets/src/jdeodorant/ASTReader.java b/java/src/jdeodorant/ASTReader.java similarity index 100% rename from assets/src/jdeodorant/ASTReader.java rename to java/src/jdeodorant/ASTReader.java diff --git a/assets/src/jdeodorant/ClassVisitor.java b/java/src/jdeodorant/ClassVisitor.java similarity index 100% rename from assets/src/jdeodorant/ClassVisitor.java rename to java/src/jdeodorant/ClassVisitor.java diff --git a/assets/src/jdeodorant/FileVisitor.java b/java/src/jdeodorant/FileVisitor.java similarity index 100% rename from assets/src/jdeodorant/FileVisitor.java rename to java/src/jdeodorant/FileVisitor.java diff --git a/assets/src/jdeodorant/JDMetricsFileCreator.java b/java/src/jdeodorant/JDMetricsFileCreator.java similarity index 100% rename from assets/src/jdeodorant/JDMetricsFileCreator.java rename to java/src/jdeodorant/JDMetricsFileCreator.java diff --git a/assets/src/jdeodorant/MethodVisitor.java b/java/src/jdeodorant/MethodVisitor.java similarity index 100% rename from assets/src/jdeodorant/MethodVisitor.java rename to java/src/jdeodorant/MethodVisitor.java diff --git a/neural_networks/customLoss.py b/neural_networks/customLoss.py index 295cd09..87ea1cc 100644 --- a/neural_networks/customLoss.py +++ b/neural_networks/customLoss.py @@ -9,7 +9,7 @@ def f_measure_approx(logits, labels, gamma): Martin Jansche (2005): [Maximum Expected F-Measure Training of Logistic Regression Models] - true_positive: sum(sigmoid(gamma*logits)) for label = +1 + true_positive: sum(sigmoid(gamma*logits)) for label = +1 detected: sum(sigmoid(gamma*logits)) gamma > 0 ''' diff --git a/tests/test_experiment_utils.py b/tests/test_experiment_utils.py index c7d7bef..0532b8f 100644 --- a/tests/test_experiment_utils.py +++ b/tests/test_experiment_utils.py @@ -41,9 +41,9 @@ def test_precision(self): self.assertEqual(experimentUtils.precision(self.set_2, self.set_3), 0.0) self.assertEqual(experimentUtils.precision(self.set_3, self.set_1), 1.0) self.assertEqual(experimentUtils.precision(self.set_3, self.set_4), 0.0) - self.assertTrue(math.isnan(experimentUtils.precision(self.set_4, self.set_1))) - self.assertTrue(math.isnan(experimentUtils.precision(self.set_4, self.set_3))) - self.assertTrue(math.isnan(experimentUtils.precision(self.set_4, self.set_4))) + self.assertEqual(experimentUtils.precision(self.set_4, self.set_1), 0.0) + self.assertEqual(experimentUtils.precision(self.set_4, self.set_3), 0.0) + self.assertEqual(experimentUtils.precision(self.set_4, self.set_4), 0.0) def test_recall(self): self.assertEqual(experimentUtils.recall(self.set_1, self.set_1), 1.0) @@ -69,8 +69,8 @@ def test_f_measure(self): self.assertEqual(experimentUtils.f_measure(self.set_2, self.set_3), 0.0) self.assertEqual(experimentUtils.f_measure(self.set_3, self.set_1), 0.33333333333333337) self.assertTrue(math.isnan(experimentUtils.f_measure(self.set_3, self.set_4))) - self.assertTrue(math.isnan(experimentUtils.f_measure(self.set_4, self.set_1))) - self.assertTrue(math.isnan(experimentUtils.f_measure(self.set_4, self.set_3))) + self.assertEqual(experimentUtils.f_measure(self.set_4, self.set_1), 0.0) + self.assertEqual(experimentUtils.f_measure(self.set_4, self.set_3), 0.0) self.assertTrue(math.isnan(experimentUtils.f_measure(self.set_4, self.set_4))) def test_vote(self): diff --git a/tests/test_nn_utils.py b/tests/test_nn_utils.py index 5268542..4ec6e88 100644 --- a/tests/test_nn_utils.py +++ b/tests/test_nn_utils.py @@ -80,7 +80,7 @@ def test_get_labels_god_class(self): def test_get_Instances_god_class(self): for system in self.systems: classes = dataUtils.getClasses(system) - instances = nnUtils.getGodClassInstances(system) + instances = nnUtils.getInstances(system, 'god_class') self.assertEqual(len(classes), len(instances)) diff --git a/utils/liuUtils.py b/utils/liuUtils.py index 56b8c1d..ef2b810 100644 --- a/utils/liuUtils.py +++ b/utils/liuUtils.py @@ -104,7 +104,8 @@ def getEmbeddingMatrix(entity): if word in embeddings_index: embeddingMatrix[i] = embeddings_index[word] - return embeddingMatrix + return embeddingMatrix + def getInstances(systemName): entities = dataUtils.getCandidateFeatureEnvy(systemName) diff --git a/utils/nnUtils.py b/utils/nnUtils.py index 9a8719e..f9f0ffd 100644 --- a/utils/nnUtils.py +++ b/utils/nnUtils.py @@ -3,6 +3,7 @@ import numpy as np import tensorflow as tf +import liuUtils import dataUtils import random @@ -74,7 +75,7 @@ def getLabels(systemName, antipattern): return np.array(labels) -def getInstances(systemName, antipattern): +def getInstances(systemName, antipattern, normalized=True): assert antipattern in ['god_class', 'feature_envy'] metrics = [] @@ -99,11 +100,12 @@ def getInstances(systemName, antipattern): instances = np.array(instances).astype(float) # Batch normalization - scaler = StandardScaler() - scaler.fit(instances) - rescaledInstances = scaler.transform(instances) + if normalized: + scaler = StandardScaler() + scaler.fit(instances) + return scaler.transform(instances) - return rescaledInstances + return instances def getSystemConstants(systemName):