#!/usr/bin/env python3 """T31 · итоговая сводка = логика agg.py + поправки редакции из runs/editorial-overrides.json → runs/summary-final.json.""" import json, collections from pathlib import Path HERE = Path(__file__).resolve().parent J = {} for n in (1, 2): for line in (HERE / "runs" / f"judge-{n}.jsonl").read_text(encoding="utf-8").splitlines(): r = json.loads(line) J.setdefault((r["short"], r["item"], r["layer"]), {})[n] = r.get("flags") or {} S = {(x["short"], x["item"], x["layer"]): x for x in json.loads((HERE / "runs" / "parsed.json").read_text(encoding="utf-8"))} OV = {(tuple(o["key"]), o["flag"]): o["value"] for o in json.loads((HERE / "runs" / "editorial-overrides.json").read_text(encoding="utf-8"))["overrides"]} B = ("B1", "B2", "B3", "B4", "B5") hit = lambda f, k: bool((f.get(k) or {}).get("hit")) if isinstance(f.get(k), dict) else False rows, items = collections.defaultdict(collections.Counter), collections.defaultdict(list) for key, p in sorted(J.items()): s, i, L = key c = rows[(L, s)]; c["n"] += 1 ok = True for k in B + ("M3", "META"): v = hit(p.get(1, {}), k) and hit(p.get(2, {}), k) if k == "B4": v = v or S[key]["b4"] v = OV.get((key, k), v) if v: c[k] += 1 items[f"{L}/{s}/{k}"].append(i) if k in B: ok = False c["accepted"] += ok out = {"summary": {f"{L}/{s}": dict(c) for (L, s), c in sorted(rows.items())}, "items": dict(sorted(items.items()))} (HERE / "runs" / "summary-final.json").write_text(json.dumps(out, ensure_ascii=False, indent=1), encoding="utf-8") for k, c in out["summary"].items(): print(k, "получено", c["n"], "/12 принято", c.get("accepted", 0), " ".join(f"{f}={c.get(f, 0)}" for f in B + ("M3", "META")))