From 08c66f78d1df6f2372a9e1b1f2076319271db2fe Mon Sep 17 00:00:00 2001 From: Neea Date: Sat, 13 Jan 2024 20:29:38 -0500 Subject: [PATCH] update plots --- plot/bar.py | 36 +++++++++++------- .../__bar_acc_cpgd_ref_result_attacks.pdf | Bin 0 -> 19507 bytes 2 files changed, 23 insertions(+), 13 deletions(-) create mode 100644 ref_result/__bar_acc_cpgd_ref_result_attacks.pdf diff --git a/plot/bar.py b/plot/bar.py index 4be21d1..0d0bc2c 100644 --- a/plot/bar.py +++ b/plot/bar.py @@ -163,8 +163,12 @@ def plot_acc(input_data, plot_name, data_labels, class BarData(ResultData): - def get_acc_data(self, key_test): - nums = [BarData.fmt(r) for r in self.raw_rata if key_test(r)] + def get_acc_data( + self, key_test, key_label=None, att_label=None, + name_label=None): + nums = [BarData.fmt(r, key_label, att_label, name_label) + for r in self.raw_rata if + key_test(r)] means = np.rint(np.mean(np.array( [v for _, v in nums]), axis=0)).tolist() cats = sorted(list(set([x for ((x, _, _), _) in nums]))) @@ -191,9 +195,10 @@ def fn_pattern(self, file_ext, pattern, out_dir=None, in_dirs=None): return path.join(out_dir, f'{file_name}.{file_ext}') @staticmethod - def fmt(r, key=None, att=None): - keys = (key or BarData.cls(r), BarData.name(r), - att or BarData.attack(r)) + def fmt(r, key_label=None, att=None, cls=None): + keys = (key_label(r) if key_label else BarData.cls(r), + cls(r) if cls else BarData.name(r), + att(r) if att else BarData.attack(r)) valid = round(BarData.valid(r)) evades = round(BarData.evades(r)) - valid accurate = round(BarData.acc(r)) - evades - valid @@ -215,7 +220,7 @@ def match_bdata(x, y): assert pair is not None -def attack_plot(bdata, out_dir, plot_name, dirs=None): +def attack_plot(bdata, out_dir, plot_name, dirs=None, comparison=False): labels = ['valid', 'evasive', 'accurate', 'inaccurate'] key_test = lambda r: ResultData.attack(r) != 'CPGD' bar_inputs = [d.get_acc_data(key_test) for d in bdata] @@ -231,15 +236,19 @@ def attack_plot(bdata, out_dir, plot_name, dirs=None): print("\n".join([f"{l:<13}: {x:.2f}" for (l, x) in zip(labels, bar_inputs[-1][1])])) print("=" * 40) - else: - key_test = lambda r: ResultData.attack(r) == 'CPGD' - bar_inputs = [d.get_acc_data(key_test) for d in bdata] - for b in bar_inputs[1:]: - match_bdata(bar_inputs[0], b) + if comparison: + args = lambda x: \ + {'key_test': lambda r: ResultData.attack(r) == x, + 'key_label': lambda _: x, + 'att_label': lambda r: BarData.name(r), + 'name_label': lambda _: ' '} + bar_inputs = [ + bdata[0].get_acc_data(**args('CPGD')), + bdata[0].get_acc_data(**args('VPGD'))] name = bdata[0].plot_name( plot_name + '_cpgd', out_dir, dirs=dirs) plot_acc(bar_inputs, overall_bar=True, data_labels=labels, - plot_name=name, sort_key=(lambda x: (x[0][0], x[0][1]))) + plot_name=name, sort_key=(lambda x: x[0][1])) def perf_plot(bdata, out_dir, plot_name): @@ -264,4 +273,5 @@ def plot_bars(data_dir, out_dir=None): else: attack_plot( bdata, out_dir, 'bar_acc', - dirs='_'.join(dirs) if len(dirs) > 1 else None) + dirs='_'.join(dirs) if len(dirs) > 1 else None, + comparison='attacks' in data_dir and len(dirs) == 1) diff --git a/ref_result/__bar_acc_cpgd_ref_result_attacks.pdf b/ref_result/__bar_acc_cpgd_ref_result_attacks.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9ed70f1c022820d5f609c76266d8d62b5017b15e GIT binary patch literal 19507 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 ZRPG+8ZXUR$5+MKp86m8!(yB6${{f?<5lH|5 literal 0 HcmV?d00001