From a622cc5e2742a351093e6938bdba97034a7fdcdb Mon Sep 17 00:00:00 2001 From: Claudio Maggioni Date: Sun, 24 Dec 2023 16:38:44 +0100 Subject: [PATCH] part 4 code done --- muttest.py | 78 +++++++++++++++++- .../mutation_results_fuzzer.csv | 0 {tests => out}/mutation_results_genetic.csv | 0 out/mutation_scores.png | Bin 0 -> 34179 bytes out/mutation_scores_mean.png | Bin 0 -> 35036 bytes out/stats.csv | 11 +++ requirements.txt | 5 +- 7 files changed, 90 insertions(+), 4 deletions(-) rename {fuzzer_tests => out}/mutation_results_fuzzer.csv (100%) rename {tests => out}/mutation_results_genetic.csv (100%) create mode 100644 out/mutation_scores.png create mode 100644 out/mutation_scores_mean.png create mode 100644 out/stats.csv diff --git a/muttest.py b/muttest.py index 292cf05..ec63e3a 100644 --- a/muttest.py +++ b/muttest.py @@ -1,20 +1,86 @@ +import math import os import re import subprocess import sys +from math import sqrt +from statistics import mean, variance from typing import List, Dict +import matplotlib.pyplot as plt import pandas as pd +import seaborn as sns +from scipy.stats import wilcoxon from tqdm import tqdm ROOT_DIR = os.path.dirname(__file__) IN_SOURCE_DIR = os.path.join(ROOT_DIR, "benchmark") IN_TEST_DIR = os.path.join(ROOT_DIR, "tests") IN_FUZZER_TEST_DIR = os.path.join(ROOT_DIR, "fuzzer_tests") +OUT_DIR = os.path.join(ROOT_DIR, "out") MUT_PY_PATH = os.path.join(ROOT_DIR, 'env37', 'bin', 'mut.py') REPS: int = 10 +def cohen_d(d1: List[float], d2: List[float]) -> float: + pooled_sd = sqrt(((len(d1) - 1) * variance(d1) + (len(d2) - 1) * variance(d2)) / + (len(d1) + len(d2) - 2)) + + if pooled_sd == 0: + return math.inf + + return (mean(d1) - mean(d2)) / pooled_sd + + +def effect_size(eff: float) -> str: + if eff <= 0.01: + return 'Very small' + elif eff <= 0.2: + return 'Small' + elif eff <= 0.5: + return 'Medium' + elif eff <= 0.8: + return 'Large' + elif eff <= 1.2: + return 'Very large' + else: + return 'Huge' + + +def compute_stats(df_gen: pd.DataFrame, df_fuz: pd.DataFrame, output_file: str, avg_output_file: str, stat_csv: str): + combined_df = pd.concat([df_gen, df_fuz], keys=["genetic", "fuzzer"]).reset_index() + combined_df.columns = ['source', *combined_df.columns[1:]] + del combined_df[combined_df.columns[1]] + + plt.figure(figsize=(18, 8)) + sns.set(style="whitegrid") + sns.boxplot(data=combined_df, x="file", y="score", hue="source") + plt.yticks(range(0, 101, 10)) + plt.savefig(output_file) + + plt.figure(figsize=(18, 8)) + df_avg = combined_df.groupby(['file', 'source']).mean().reset_index() + sns.set(style="whitegrid") + sns.barplot(data=df_avg, x="file", y="score", hue="source") + plt.yticks(range(0, 101, 10)) + plt.savefig(avg_output_file) + + df_avg = df_avg.pivot(index='file', columns='source', values='score').rename_axis(None, axis=1) + df_avg['cohen-d'] = [math.nan] * len(df_avg.index) + df_avg['interpretation'] = [math.nan] * len(df_avg.index) + df_avg['wilcoxon'] = [math.nan] * len(df_avg.index) + + for f in combined_df['file'].drop_duplicates(): + list_gen = df_gen.loc[(df_gen.file == f), 'score'].tolist() + list_fuz = df_fuz.loc[(df_fuz.file == f), 'score'].tolist() + + df_avg.loc[f, 'cohen-d'] = cohen_d(list_gen, list_fuz) + df_avg.loc[f, 'interpretation'] = effect_size(df_avg.loc[f, 'cohen-d']) + df_avg.loc[f, 'wilcoxon'] = wilcoxon(list_gen, list_fuz, zero_method='zsplit').pvalue + + df_avg.to_csv(stat_csv) + + def run_mutpy(test_path: str, source_path: str) -> float: output = subprocess.check_output( [sys.executable, MUT_PY_PATH, '-t', source_path, '-u', test_path]).decode('utf-8') @@ -26,7 +92,7 @@ def mutate_suite(out_file: str, in_test_dir: str, to_test: List[str]): scores: List[Dict[str, any]] = [] if os.path.isfile(out_file): # do not re-generate if file exists - return + return pd.read_csv(out_file, index_col=0) for filename in tqdm(to_test, desc=f"mut.py [{os.path.basename(out_file)}]"): source_path = os.path.join(IN_SOURCE_DIR, f"{filename}.py") @@ -38,6 +104,7 @@ def mutate_suite(out_file: str, in_test_dir: str, to_test: List[str]): df = pd.DataFrame.from_records(scores) df.to_csv(out_file) + return df def main(): @@ -45,8 +112,13 @@ def main(): to_test = [file[0] for file in files if file[1] == ".py"] to_test = [e for t in to_test for e in ([t] * REPS)] - mutate_suite(os.path.join(IN_TEST_DIR, 'mutation_results_genetic.csv'), IN_TEST_DIR, to_test) - mutate_suite(os.path.join(IN_FUZZER_TEST_DIR, 'mutation_results_fuzzer.csv'), IN_FUZZER_TEST_DIR, to_test) + df_gen = mutate_suite(os.path.join(OUT_DIR, 'mutation_results_genetic.csv'), IN_TEST_DIR, to_test) + df_fuz = mutate_suite(os.path.join(OUT_DIR, 'mutation_results_fuzzer.csv'), IN_FUZZER_TEST_DIR, to_test) + + compute_stats(df_gen, df_fuz, + os.path.join(OUT_DIR, "mutation_scores.png"), + os.path.join(OUT_DIR, "mutation_scores_mean.png"), + os.path.join(OUT_DIR, "stats.csv")) if __name__ == "__main__": diff --git a/fuzzer_tests/mutation_results_fuzzer.csv b/out/mutation_results_fuzzer.csv similarity index 100% rename from fuzzer_tests/mutation_results_fuzzer.csv rename to out/mutation_results_fuzzer.csv diff --git a/tests/mutation_results_genetic.csv b/out/mutation_results_genetic.csv similarity index 100% rename from tests/mutation_results_genetic.csv rename to out/mutation_results_genetic.csv diff --git a/out/mutation_scores.png b/out/mutation_scores.png new file mode 100644 index 0000000000000000000000000000000000000000..cc82e2ff52e70b6f4e9175b800c087108b488c5b GIT binary patch literal 34179 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 literal 0 HcmV?d00001 diff --git a/out/mutation_scores_mean.png b/out/mutation_scores_mean.png new file mode 100644 index 0000000000000000000000000000000000000000..bb8798980a21a528d99ee99a584595887ba97ac5 GIT binary patch literal 35036 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.1 +seaborn==0.12.2 +scipy==1.7.3 \ No newline at end of file