Spaces:
Sleeping
Sleeping
from pylatex import Document, Section, Subsection, Tabular, MultiColumn,\ | |
MultiRow, NoEscape | |
from pylatex.math import Math | |
from collections import OrderedDict | |
import copy | |
import numpy as np | |
from modelguidedattacks.results import build_full_results_dict | |
def result_to_str(result, long=False): | |
if result is None or np.isinf(result) or np.isnan(result): | |
return "-" | |
elif long: | |
return f"{result:.4f}" | |
else: | |
return f"{result:.2f}" | |
""" | |
results top level will be keyed by K | |
next level will be binary search steps | |
next level will be keyed by iterations | |
next level will be keyed by method | |
""" | |
only_mean = False | |
model_name = "resnet50" | |
results = build_full_results_dict(model_name) | |
model_to_tex = { | |
"resnet50": "Resnet-50", | |
"densenet121": "Densenet121", | |
"deit_small": "DeiT-S", | |
"vit_base": "ViT$_{B}$" | |
} | |
# Preprocess all results and select bests | |
for top_k, bs_dict in results.items(): | |
for num_bs, iter_dict in bs_dict.items(): | |
for num_iter, method_dict in iter_dict.items(): | |
metric_bests = {} | |
metrics_compared = {} | |
for method_name, method_results in method_dict.items(): | |
for metric_name, metric_value in method_results.items(): | |
reduction_func = max if "ASR" in metric_name else min | |
if metric_name not in metric_bests: | |
metric_bests[metric_name] = 0. if reduction_func is max else np.Infinity | |
metrics_compared[metric_name] = 0 | |
if metric_value is not None: | |
metric_bests[metric_name] = reduction_func(metric_bests[metric_name], metric_value) | |
metrics_compared[metric_name] += 1 | |
for method_name, method_results in method_dict.items(): | |
for metric_name, metric_value in method_results.items(): | |
method_results[metric_name] = result_to_str(metric_value, "inf" in metric_name or "ASR" in metric_name) | |
if metric_value is not None and np.allclose(metric_value, metric_bests[metric_name]) \ | |
and metrics_compared[metric_name] > 1: | |
method_results[metric_name] = rf"\textbf{{ {method_results[metric_name]} }}" | |
method_tex = { | |
"cwk": r"CW^K", | |
"ad": r"AD", | |
"cvxproj": r"\textbf{QuadAttac$K$}" | |
} | |
doc = Document("multirow") | |
protocol_cols = 1 | |
attack_method_cols = 1 | |
best_cols = 4 | |
mean_cols = 4 | |
worst_cols = 4 | |
if only_mean: | |
col_widths = [protocol_cols, attack_method_cols, mean_cols] | |
else: | |
col_widths = [protocol_cols, attack_method_cols, best_cols, mean_cols, worst_cols] | |
total_cols = sum(col_widths) | |
tabular_string = "|" | |
for w in col_widths: | |
tabular_string += "l" * w + "|" | |
table1 = Tabular(tabular_string) | |
table1.add_hline() | |
table1.add_row((MultiColumn(total_cols, align='|c|', data=NoEscape(model_to_tex[model_name])),)) | |
table1.add_hline() | |
if only_mean: | |
table1.add_row(( | |
MultiRow(2, data="Protocol"), | |
MultiRow(2, data="Attack Method"), | |
MultiColumn(mean_cols, align="|c|", data="Mean"), | |
)) | |
else: | |
table1.add_row(( | |
MultiRow(2, data="Protocol"), | |
MultiRow(2, data="Attack Method"), | |
MultiColumn(best_cols, align="|c|", data="Best"), | |
MultiColumn(mean_cols, align="|c|", data="Mean"), | |
MultiColumn(worst_cols, align="|c|", data="Worst"), | |
)) | |
table1.add_hline(start=protocol_cols + attack_method_cols + 1) | |
num_result_colums = 1 if only_mean else 3 | |
table1.add_row("", | |
"", | |
*(NoEscape(r"ASR$\uparrow$"), | |
NoEscape(r"$\ell_1 \downarrow$"), | |
NoEscape(r"$\ell_2 \downarrow$"), | |
NoEscape(r"$\ell_{\infty} \downarrow$"))*num_result_colums | |
) | |
table1.add_hline() | |
for top_k, bs_dict in results.items(): | |
total_results = 0 | |
# Count total results | |
for _, iter_dict in bs_dict.items(): | |
for num_iter, method_dict in iter_dict.items(): | |
total_results += len(method_dict) | |
top_k_latex_obj = MultiRow(total_results, data=f"Top-{top_k}") | |
shown_topk_obj = False | |
for bs_steps, iter_dict in bs_dict.items(): | |
for num_iter, method_dict in iter_dict.items(): | |
for method_name, method_results in method_dict.items(): | |
first_obj = top_k_latex_obj if not shown_topk_obj else "" | |
shown_topk_obj = True | |
row_results = [] | |
reduction_names = ["mean"] if only_mean else ["best", "mean", "worst"] | |
for reduction in reduction_names: | |
for metric in ["ASR", "L1", "L2", "L_inf"]: | |
result_key = f"{metric}_{reduction}" | |
long_result = "inf" in metric | |
row_results.append( | |
NoEscape(method_results[result_key]) | |
) | |
table1.add_row( | |
first_obj, | |
NoEscape("$" + method_tex[method_name] + | |
f"_{{{bs_steps}x{num_iter}}}$"), | |
*row_results | |
) | |
table1.add_hline(start=protocol_cols + 1) | |
table1.add_hline() | |
# doc.append(table1) | |
print(table1.dumps()) |