File size: 2,577 Bytes
1ea7ba6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
"""

Assemble the within-source architecture + augmentation tables.



Kills two objections at once:

  * "you cherry-picked a weak backbone"  -> within-source is >=99% across ResNet-50,

    EfficientNet-B4, ViT and our fusion; the classical SVM baseline (~32%) shows the

    task is non-trivial.

  * "the numbers are just accuracy"      -> macro-F1 reported alongside top-1.



Reads existing outputs/baseline_comparison.json + outputs/ablation_results.json.

Pure assembly (no GPU, no re-eval). Writes markdown + LaTeX.

"""
import json
from pathlib import Path

ROOT = Path("/mnt/d/SpiceNet") if Path("/mnt/d/SpiceNet").exists() else Path("D:/SpiceNet")
OUT_MD = ROOT / "outputs" / "backbone_baseline_table.md"
OUT_TEX = ROOT / "outputs" / "backbone_baseline_table.tex"


def _load(name):
    p = ROOT / "outputs" / name
    return json.load(open(p)) if p.exists() else None


def main():
    base = _load("baseline_comparison.json")
    abl = _load("ablation_results.json")

    md = ["# Within-source robustness tables (assembled)\n",
          "## Architecture comparison (within-source, full Spice_Spectrum test)\n",
          "| Model | Top-1 | Top-5 | Macro-F1 |", "|---|---|---|---|"]
    tex = [r"\begin{tabular}{lccc}", r"\hline",
           r"Model & Top-1 & Top-5 & Macro-F1 \\", r"\hline"]
    if base:
        for b in base["baselines"]:
            t1 = f"{b['top1']*100:.2f}"
            t5 = f"{b['top5']*100:.2f}" if b.get("top5") is not None else "--"
            fm = f"{b['f1_macro']*100:.2f}" if b.get("f1_macro") is not None else "--"
            md.append(f"| {b['model']} | {t1} | {t5} | {fm} |")
            tex.append(f"{b['model']} & {t1} & {t5} & {fm} \\\\")
    tex += [r"\hline", r"\end{tabular}"]

    if abl and "A3" in abl:
        md += ["\n## Augmentation ablation (within-source)\n",
               "| Augmentation | Top-1 | Macro-F1 |", "|---|---|---|"]
        for a in abl["A3"]:
            md.append(f"| {a['name']} | {a['top1_accuracy']*100:.2f} | {a['f1_macro']*100:.2f} |")

    md.append("\n> Note: these are WITHIN-source metrics (they justify the model choice "
              "and show the task is non-trivial). The cross-source collapse is reported "
              "separately in the shortcut matrix — augmentation does not close it.")

    OUT_MD.write_text("\n".join(md), encoding="utf-8")
    OUT_TEX.write_text("\n".join(tex), encoding="utf-8")
    print(f"saved -> {OUT_MD}\nsaved -> {OUT_TEX}")
    print("\n".join(md[:12]))


if __name__ == "__main__":
    main()