| |
| """Print the per-item status of all three games, straight from registry.json.""" |
|
|
| from __future__ import annotations |
|
|
| import json |
| import os |
|
|
| os.chdir(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) |
| R = json.load(open("registry/registry.json")) |
| GAMES = list(R["games"]) |
| MARK = { |
| "完成": "完成", |
| "未做": "未做", |
| "暂缓": "暂缓", |
| "外部执行": "外部执行", |
| "历史诊断": "历史诊断", |
| } |
|
|
|
|
| def main() -> None: |
| print("=" * 84) |
| print("PACT 实验逐项状态(三个游戏共用同一份实验块清单)") |
| print("=" * 84) |
|
|
| w = 26 |
| print(f"\n{'实验块':<{w}}" + "".join(f"{R['games'][g]['display_name']:<18}" for g in GAMES)) |
| print("-" * 84) |
| for blk in R["blocks"]: |
| row = f"{blk['name']:<{w}}" |
| for g in GAMES: |
| b = R["games"][g]["blocks"].get(blk["id"], {}) |
| row += f"{MARK.get(b.get('status'), '—'):<18}" |
| print(row) |
|
|
| for g in GAMES: |
| extra = [b for bid, b in R["games"][g]["blocks"].items() |
| if bid not in {x["id"] for x in R["blocks"]}] |
| for b in extra: |
| row = f"{b.get('title', b.get('name', '?'))[:24]:<{w}}" |
| for gg in GAMES: |
| row += f"{(b['status'] if gg == g else '—'):<18}" |
| print(row) |
|
|
| print("\n" + "=" * 84) |
| print("数据集") |
| print("=" * 84) |
| for g in GAMES: |
| d = R["games"][g]["dataset"] |
| sp = d.get("split") or {} |
| tot = sp.get("total_fights") |
| line = f" {R['games'][g]['display_name']:<15}" |
| line += f"K̄={R['games'][g]['mean_menu_size_k']:<5} 随机基线={R['games'][g]['l2_chance_follow_pct']}%" |
| if tot: |
| line += f" fight: train {tot['train']} / val {tot['val']} / test {tot['test']}" |
| print(line) |
|
|
| print("\n" + "=" * 84) |
| print("已完成实验的产物与结果") |
| print("=" * 84) |
| for g in GAMES: |
| gd = R["games"][g] |
| print(f"\n### {gd['display_name']}") |
| for bid, b in gd["blocks"].items(): |
| if b.get("status") != "完成": |
| continue |
| print(f" [{b.get('name', b.get('title'))}]") |
| for f in b.get("code", []): |
| print(f" code {f}") |
| if b.get("ckpt"): |
| c = b["ckpt"] |
| mb = (c["size_bytes"] or 0) / 2**20 |
| print(f" ckpt {c['path']} ({mb:.0f}M)") |
| for key in ("cache_train", "cache_eval"): |
| if b.get(key): |
| c = b[key] |
| tag = "" if c["exists"] else " ← 已被清除,需重建" |
| print(f" {key:<7}{c['path']}{tag}") |
| h = b.get("headline") |
| if h and h.get("distance_mae") is not None: |
| print(f" 指标 n={h['n_eval']} dist_mae={h['distance_mae']} " |
| f"angle_mae={h['angle_mae_degrees']}° angle@20={h['angle_within_20']}") |
| for view, r in (b.get("runs") or {}).items(): |
| hh = r.get("headline") or {} |
| print(f" L2 {view:<7} follow={hh.get('desc_follow_pct')}% " |
| f"({hh.get('x_chance')}× 随机) fights={hh.get('fights_covered')} {r['dir']}") |
| for a in b.get("artifacts", []): |
| print(f" 产物 {a['path']}") |
| if b.get("known_bug"): |
| print(f" ⚠️ {b['known_bug']}") |
| if b.get("finding"): |
| print(f" 结论 {b['finding']}") |
| for did, d in (gd.get("deprecated") or {}).items(): |
| print(f" [废弃] {did}") |
| print(f" {d['reason']}") |
|
|
|
|
| if __name__ == "__main__": |
| main() |
|
|