SPB Git

spb/wp30_uqo

Public
4.5 KB · 59 lines python
1"""Export key numbers from results/tables as LaTeX macros (paper/tables/numbers.tex) so that prose never hard-codes values."""2from __future__ import annotations3import re, pandas as pd, numpy as np, json4from pathlib import Path5from ..util import ROOT, read_json67TAB = ROOT / "results/tables"; OUT = ROOT / "paper/tables/numbers.tex"89def _key(s: str) -> str:10    s = re.sub(r"[^A-Za-z0-9]", " ", s).title().replace(" ", "")11    return re.sub(r"\d", lambda m: "ZOWHFVXSEN"[int(m.group(0))], s)   # LaTeX macro names cannot contain digits (0..9 -> unique letters)1213def main():14    lines = ["% auto-generated by wp30.analysis.numbers — do not edit"]15    def add(name, val, fmt="{:.2f}"):16        if val is None or (isinstance(val, float) and np.isnan(val)):17            lines.append(f"\\newcommand{{\\{name}}}{{--}}")18        else:19            lines.append(f"\\newcommand{{\\{name}}}{{{fmt.format(val) if not isinstance(val, str) else val}}}")20    prim = TAB / "E1_core_primary.csv"21    if prim.exists():22        t = pd.read_csv(prim)23        add("nCoreTrials", int(pd.read_csv(TAB / "E1_core_failures.csv").iloc[:, 1:].to_numpy().sum()) if (TAB / "E1_core_failures.csv").exists() else None, "{:,}")24        for _, r in t.iterrows():25            pair = {"Qwen2.5-3B-Instruct-bf16->Qwen2.5-3B-Instruct-bf16": "Qwen", "Llama-3.2-3B-Instruct-bf16->Llama-3.2-3B-Instruct-bf16": "Llama", "Qwen2.5-1.5B-Instruct-bf16->Qwen2.5-3B-Instruct-bf16": "QwenSmallToBig"}.get(r["pair"], r["pair"])26            k = _key(f"{r['family'].replace('public_', '')} {pair} {r['condition'].replace('budget_tokens=512', 'b').replace('keep_frac=0.25', 'k').replace('max_fetch_bytes=2000|max_lookups=6', 'r').replace('policy=attention', 'att').replace('codec=zstd', 'zstd')}")27            add("Q" + k, r["quality"] * 100, "{:.0f}"); add("Qlo" + k, r["q_lo"] * 100, "{:.0f}"); add("Qhi" + k, r["q_hi"] * 100, "{:.0f}")28            add("B" + k, r["payload_bytes_median"], "{:,.0f}"); add("Tcold" + k, r["cold_ms_p50"], "{:,.0f}"); add("Twarm" + k, r["warm_ms_p50"], "{:,.0f}")29        tests = pd.read_csv(TAB / "E1_core_primary_tests.csv") if (TAB / "E1_core_primary_tests.csv").exists() else None30        if tests is not None:31            for _, r in tests.iterrows():32                k = _key(r["name"].split(" ")[0])33                add("Diff" + k, r["diff"] * 100, "{:+.1f}"); add("Lo" + k, r["lo"] * 100, "{:+.1f}"); add("Hi" + k, r["hi"] * 100, "{:+.1f}"); add("P" + k, r["p_holm"], "{:.3f}"); add("N" + k, int(r["n"]), "{:d}")34    e6 = TAB / "E6_network.csv"35    if e6.exists():36        t6 = pd.read_csv(e6); t6 = t6[t6["label"] != "loopback"]37        for _, r in t6.iterrows():38            tag = _key(f"{r['method']} {'' if pd.isna(r['bits']) else int(r['bits'])} {r['codec'] if isinstance(r['codec'], str) else ''} {int(r['target_tokens'])}")39            add("Esix" + tag + "Rt", r["roundtrip_ms_p50"], "{:,.0f}"); add("Esix" + tag + "Bytes", r["bytes"] / 1e6 if not pd.isna(r["bytes"]) else None, "{:.0f}")40            add("Esix" + tag + "Send", r["send_ms_p50"], "{:,.0f}"); add("Esix" + tag + "Prefill", r["remote_prefill_p50"] if not pd.isna(r.get("remote_prefill_p50", float("nan"))) else r.get("local_prefill_p50"), "{:,.0f}")41            add("Esix" + tag + "Load", r["remote_load_ms_p50"], "{:,.0f}"); add("Esix" + tag + "Gbps", r["eff_gbps"], "{:.2f}")42    r8 = TAB / "E8_router_summary.csv"43    if r8.exists():44        for _, r in pd.read_csv(r8).iterrows():45            k = _key(f"{r['policy']} {r['access']}")46            add("Eeight" + k + "Q", r["quality"] * 100, "{:.1f}"); add("Eeight" + k + "Qlo", r["q_lo"] * 100, "{:.1f}"); add("Eeight" + k + "Qhi", r["q_hi"] * 100, "{:.1f}")47            add("Eeight" + k + "Cost", r["cost_ms"], "{:,.0f}"); add("Eeight" + k + "Fallback", r["fallback_rate"] * 100, "{:.1f}"); add("Eeight" + k + "N", int(r["n"]), "{:d}")48        for _, r in pd.read_csv(TAB / "E8_router_tests.csv").iterrows():49            k = _key(f"{r['access']} {r['metric']}")50            scale = 100 if r["metric"] == "quality" else 151            add("EeightDiff" + k, r["diff"] * scale, "{:+.1f}" if scale == 100 else "{:+,.0f}"); add("EeightLo" + k, r["lo"] * scale, "{:+.1f}" if scale == 100 else "{:+,.0f}"); add("EeightHi" + k, r["hi"] * scale, "{:+.1f}" if scale == 100 else "{:+,.0f}"); add("EeightP" + k, r["p"], "{:.3f}")52    if (ROOT / "protocol/frozen.json").exists():53        add("protocolHash", read_json(ROOT / "protocol/frozen.json")["protocol_hash"][:16], "{}")54    OUT.parent.mkdir(parents=True, exist_ok=True); OUT.write_text("\n".join(lines) + "\n")55    print(f"{len(lines)-1} macros -> {OUT}")5657if __name__ == "__main__":58    main()59
Files · d5e182fa7d7d5118aa92e61c47c40ed848da0ecf
Menu

Theme