import json,sys,ast,collections def P(v): if isinstance(v,dict): return v try: return ast.literal_eval(v) except: return {} rows=[json.loads(l) for l in open(sys.argv[1])] G=collections.defaultdict(list); FO=collections.defaultdict(list); R25=collections.defaultdict(list) def gauss(sc): k=(sc.get("kernels") or {}).get("gaussian") if isinstance(k,dict): return k.get("metric_score", k.get("mean_metric_score")) return sc.get("metric_score") for r in rows: sc=P(r["score"]); m=P(r["meta"]); sp=m.get("split","?") g=gauss(sc) if g is not None: G[sp].append(g); G["overall"].append(g) fo=sc.get("format_ok", sc.get("format_reward")) if fo is not None: ok=(fo>=0.6) if isinstance(fo,(int,float)) else bool(fo) FO[sp].append(ok); FO["overall"].append(ok) tol=sc.get("tolerance") or {} r25=tol.get("rel25", tol.get("rel25_rate")) if r25 is not None: R25[sp].append(bool(r25)); R25["overall"].append(bool(r25)) print(" split n gaussian fmt_ok rel25") for sp in ["overall","univar","bivar","multivar"]: b=G.get(sp,[]) if not b: continue f=FO.get(sp,[]); rr=R25.get(sp,[]) fa=sum(f)/len(f) if f else float('nan'); ra=sum(rr)/len(rr) if rr else float('nan') print(f" {sp:9s} {len(b):4d} {sum(b)/len(b):.4f} {fa:.3f} {ra:.4f}")