import csv import json from pathlib import Path ROOT=Path(__file__).resolve().parent variants=['human','codegen_success','mix_h50_c50'] rows=[]; summaries=[] for variant in variants: vr=[] for i in range(301,321): p=ROOT/'results'/variant/'json'/f'turning_on_radio_{i}_0.json' if not p.exists():continue r=json.loads(p.read_text()) vr.append(dict(variant=variant,instance_id=i,success=bool(r['success']),q_score=r['q_score']['final'],steps=r['steps'])) rows.extend(vr) summaries.append(dict(variant=variant,completed=len(vr),successes=sum(r['success'] for r in vr),success_rate=sum(r['success'] for r in vr)/len(vr) if vr else None,mean_q_score=sum(r['q_score'] for r in vr)/len(vr) if vr else None,mean_steps=sum(r['steps'] for r in vr)/len(vr) if vr else None)) for name,values in [('per_instance',rows),('summary',summaries)]: (ROOT/f'{name}.json').write_text(json.dumps(values,indent=2)+'\n') if values: with (ROOT/f'{name}.csv').open('w') as f: w=csv.DictWriter(f,fieldnames=list(values[0]));w.writeheader();w.writerows(values) lines=['# Task 00: turning_on_radio — 三模型测试集对比','', '仅在 eai 本机运行。2026 public_test 全部 20 个实例(301–320),每模型每实例 1 次,共 60 次。', '', '相同 seed=0(每次环境和策略 reset 重置),官方默认超时 1.5×2149.64 = 3224 步,224×224 RGB,30 Hz,R1Pro。每模型加载自己的 checkpoint normalization。', '', '| 模型 | 完成数 | 成功数 | 成功率 | 平均 q-score | 平均步数 |','|---|---:|---:|---:|---:|---:|'] for r in summaries: lines.append(f"| {r['variant']} | {r['completed']}/20 | {r['successes']} | {r['success_rate']:.1%} | {r['mean_q_score']:.4f} | {r['mean_steps']:.1f} |" if r['completed'] else f"| {r['variant']} | 0/20 | — | — | — | — |") lines+=['','| 实例 | Human | Codegen success | Mix 50:50 |','|---|---|---|---|'] lookup={(r['variant'],r['instance_id']):r for r in rows} for i in range(301,321): values=[] for v in variants: r=lookup.get((v,i));values.append(('成功' if r['success'] else '失败')+f";q={r['q_score']:.3f};{r['steps']}步" if r else '未完成') lines.append('| '+str(i)+' | '+' | '.join(values)+' |') lines+=['','## 配对比较(仅计两模型均已完成的实例)','','| 比较 | 共同完成 | 前者成功、后者失败 | 后者成功、前者失败 | 同时成功 | 同时失败 |','|---|---:|---:|---:|---:|---:|'] for a,b in [('human','codegen_success'),('human','mix_h50_c50'),('codegen_success','mix_h50_c50')]: both=[(lookup[(a,i)]['success'],lookup[(b,i)]['success']) for i in range(301,321) if (a,i) in lookup and (b,i) in lookup] lines.append(f"| {a} / {b} | {len(both)} | {sum(x and not y for x,y in both)} | {sum(y and not x for x,y in both)} | {sum(x and y for x,y in both)} | {sum(not x and not y for x,y in both)} |") lines+=['','平均步数包含超时的失败回合。官方 max_steps=3224 的终止检查会产生 3225 个记录步数。','','结果适用于本次单 seed 的 20 个公开测试实例,不把训练损失当作成功率。推理使用归档的 100-task no-DA3 模型及本地适配,全部 checkpoint 参数严格检查,不允许丢弃多余参数。完整原始训练环境及 Gemma 源码未在本机找到,RGB 路径使用上游 Gemma,因此本结果属于兼容推理实现下的对比,不宣称原始环境的逐位复现。固定的相关 inpainting 线性系统在 CPU 求解并验证残差,以绕过本机 cuSolver 错误。详见 [protocol.json](protocol.json) 和 [runtime_adapter.patch](runtime_adapter.patch)。',''] (ROOT/'comparison.md').write_text('\n'.join(lines)) print(json.dumps(summaries,indent=2))