anhtld commited on
Commit
13efc81
·
verified ·
1 Parent(s): 14bc84d

Auto-sync: 2026-06-28 13:38:23 (part 2)

Browse files
results/paper_analysis.json ADDED
@@ -0,0 +1,791 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "generated_utc": "2026-06-28T17:38:38+00:00",
3
+ "mechanism_gap": {
4
+ "best_clean_vs_direct_same_ckpt": 0.06724637681159418,
5
+ "best_clean_vs_h16": 0.05275362318840582,
6
+ "same_state_full_vs_no_expert": 0.12347826086956515,
7
+ "same_state_no_expert_vs_best_clean": 0.21971014492753632,
8
+ "same_state_no_expert_vs_h16": 0.27246376811594214
9
+ },
10
+ "methods": {
11
+ "best_clean_residual_k2": {
12
+ "ci95_success": 0.040145061606012736,
13
+ "label": "K2 residual transport, safe + margin 0.20",
14
+ "mean_action_mse_to_best": 0.3984417730505052,
15
+ "mean_progress": 0.5670320824102237,
16
+ "mean_success": 0.3501449275362319,
17
+ "num_completed": 3,
18
+ "per_task_success": {
19
+ "LiftPegUpright-v1": {
20
+ "mean_num_groups": 102.0,
21
+ "mean_success": 0.26340865087329823,
22
+ "std_success": 0.06057881385012102
23
+ },
24
+ "PickCube-v1": {
25
+ "mean_num_groups": 196.66666666666666,
26
+ "mean_success": 0.3225911568302873,
27
+ "std_success": 0.029955807435728066
28
+ },
29
+ "PullCube-v1": {
30
+ "mean_num_groups": 81.0,
31
+ "mean_success": 0.21334270018480547,
32
+ "std_success": 0.03862357075869046
33
+ },
34
+ "PushCube-v1": {
35
+ "mean_num_groups": 102.0,
36
+ "mean_success": 0.7478514959028968,
37
+ "std_success": 0.07707721123855243
38
+ },
39
+ "StackCube-v1": {
40
+ "mean_num_groups": 93.33333333333333,
41
+ "mean_success": 0.18057498057498056,
42
+ "std_success": 0.044823450143885134
43
+ }
44
+ },
45
+ "seed_action_mse_to_best": {
46
+ "0": 0.38253434254990326,
47
+ "1": 0.3923974754207808,
48
+ "2": 0.4203935011808315
49
+ },
50
+ "seed_progress": {
51
+ "0": 0.5547752405812397,
52
+ "1": 0.5637077170092126,
53
+ "2": 0.5826132896402186
54
+ },
55
+ "seed_success": {
56
+ "0": 0.3426086956521739,
57
+ "1": 0.3391304347826087,
58
+ "2": 0.36869565217391304
59
+ },
60
+ "selected_candidate_type_counts": {
61
+ "retrieval_residual_policy_residual": 1610,
62
+ "retrieval_residual_residual_no_op": 84,
63
+ "retrieval_residual_residual_wrong_gripper": 31
64
+ },
65
+ "selected_residual_scale_counts": {},
66
+ "selected_type_outcomes": {
67
+ "retrieval_residual_policy_residual": {
68
+ "count": 1610.0,
69
+ "mean_progress": 0.5620848575190935,
70
+ "success_rate": 0.3453416149068323
71
+ },
72
+ "retrieval_residual_residual_no_op": {
73
+ "count": 84.0,
74
+ "mean_progress": 0.6583140224129671,
75
+ "success_rate": 0.4166666666666667
76
+ },
77
+ "retrieval_residual_residual_wrong_gripper": {
78
+ "count": 31.0,
79
+ "mean_progress": 0.5766239893292228,
80
+ "success_rate": 0.41935483870967744
81
+ }
82
+ },
83
+ "source": "results/h16_policy_ckpt_near_miss_policy_bc5_bestpt_retrieval_residual_knn2_scale0p40_safe_types_margin0p20_summary.json",
84
+ "std_success": 0.016159257814221867
85
+ },
86
+ "gaussian_field": {
87
+ "best_config": "k32_sigma0.35",
88
+ "ci95_success": 0.03242840579710147,
89
+ "label": "Gaussian field search",
90
+ "mean_action_mse_to_best": 0.41566191710828654,
91
+ "mean_progress": 0.5343561867265489,
92
+ "mean_success": 0.2910144927536232,
93
+ "num_completed": 3,
94
+ "per_task_success": {
95
+ "LiftPegUpright-v1": {
96
+ "mean_num_groups": 102.0,
97
+ "mean_success": 0.2242410592099261,
98
+ "std_success": 0.021337673409952483
99
+ },
100
+ "PickCube-v1": {
101
+ "mean_num_groups": 196.66666666666666,
102
+ "mean_success": 0.205857347161695,
103
+ "std_success": 0.02323219995097751
104
+ },
105
+ "PullCube-v1": {
106
+ "mean_num_groups": 81.0,
107
+ "mean_success": 0.18976481608060555,
108
+ "std_success": 0.056985676016897836
109
+ },
110
+ "PushCube-v1": {
111
+ "mean_num_groups": 102.0,
112
+ "mean_success": 0.7240118778985432,
113
+ "std_success": 0.08854264670468585
114
+ },
115
+ "StackCube-v1": {
116
+ "mean_num_groups": 93.33333333333333,
117
+ "mean_success": 0.1442927442927443,
118
+ "std_success": 0.06254861803217816
119
+ }
120
+ },
121
+ "seed_action_mse_to_best": {
122
+ "0": 0.3982355571473422,
123
+ "1": 0.4134289959891011,
124
+ "2": 0.43532119818841636
125
+ },
126
+ "seed_progress": {
127
+ "0": 0.523629953644198,
128
+ "1": 0.5489098613255697,
129
+ "2": 0.5305287452098792
130
+ },
131
+ "seed_success": {
132
+ "0": 0.2782608695652174,
133
+ "1": 0.30434782608695654,
134
+ "2": 0.29043478260869565
135
+ },
136
+ "selected_candidate_type_counts": {
137
+ "field_selected": 1725
138
+ },
139
+ "selected_residual_scale_counts": {},
140
+ "selected_type_outcomes": {
141
+ "field_selected": {
142
+ "count": 1725.0,
143
+ "mean_progress": 0.5343561867265489,
144
+ "success_rate": 0.2910144927536232
145
+ }
146
+ },
147
+ "source": "results/h16_field_sweep_summary.json",
148
+ "std_success": 0.01305313652080894
149
+ },
150
+ "h16_policy_canonical": {
151
+ "ci95_success": 0.032619725485313895,
152
+ "label": "Direct h=16 policy, canonical rollout",
153
+ "mean_action_mse_to_best": 0.39868307013577525,
154
+ "mean_progress": 0.5443993710955061,
155
+ "mean_success": 0.29739130434782607,
156
+ "num_completed": 3,
157
+ "per_task_success": {
158
+ "LiftPegUpright-v1": {
159
+ "mean_num_groups": 102.0,
160
+ "mean_success": 0.23062733783413925,
161
+ "std_success": 0.022553378573476553
162
+ },
163
+ "PickCube-v1": {
164
+ "mean_num_groups": 196.66666666666666,
165
+ "mean_success": 0.205857347161695,
166
+ "std_success": 0.02323219995097751
167
+ },
168
+ "PullCube-v1": {
169
+ "mean_num_groups": 81.0,
170
+ "mean_success": 0.19785448469658995,
171
+ "std_success": 0.060076299188250165
172
+ },
173
+ "PushCube-v1": {
174
+ "mean_num_groups": 102.0,
175
+ "mean_success": 0.7505571718758995,
176
+ "std_success": 0.08230105593270941
177
+ },
178
+ "StackCube-v1": {
179
+ "mean_num_groups": 93.33333333333333,
180
+ "mean_success": 0.14096644096644095,
181
+ "std_success": 0.05389485806900829
182
+ }
183
+ },
184
+ "seed_action_mse_to_best": {
185
+ "0": 0.38102538562825194,
186
+ "1": 0.3963353596538629,
187
+ "2": 0.4186884651252109
188
+ },
189
+ "seed_progress": {
190
+ "0": 0.5311609336215517,
191
+ "1": 0.5577803822104698,
192
+ "2": 0.5442567974544964
193
+ },
194
+ "seed_success": {
195
+ "0": 0.28347826086956524,
196
+ "1": 0.3095652173913043,
197
+ "2": 0.2991304347826087
198
+ },
199
+ "selected_candidate_type_counts": {
200
+ "policy_continuous": 1725
201
+ },
202
+ "selected_residual_scale_counts": {},
203
+ "selected_type_outcomes": {
204
+ "policy_continuous": {
205
+ "count": 1725.0,
206
+ "mean_progress": 0.544399371095506,
207
+ "success_rate": 0.29739130434782607
208
+ }
209
+ },
210
+ "source": "/scratch/knguy52/dovla/experiments/dovla_h16_rollout_runs/seed_*/online_rollout.json",
211
+ "std_success": 0.01313014684394911
212
+ },
213
+ "near_miss_policy_bc5": {
214
+ "ci95_success": 0.019955942028985537,
215
+ "label": "Near-miss proposal policy, direct",
216
+ "mean_action_mse_to_best": 0.3943580119071555,
217
+ "mean_progress": 0.5199238422948863,
218
+ "mean_success": 0.2828985507246377,
219
+ "num_completed": 3,
220
+ "per_task_success": {
221
+ "LiftPegUpright-v1": {
222
+ "mean_num_groups": 102.0,
223
+ "mean_success": 0.246534113371651,
224
+ "std_success": 0.03109492306125915
225
+ },
226
+ "PickCube-v1": {
227
+ "mean_num_groups": 196.66666666666666,
228
+ "mean_success": 0.18615010191097148,
229
+ "std_success": 0.04054046058455721
230
+ },
231
+ "PullCube-v1": {
232
+ "mean_num_groups": 81.0,
233
+ "mean_success": 0.14173818384344702,
234
+ "std_success": 0.07763680512318745
235
+ },
236
+ "PushCube-v1": {
237
+ "mean_num_groups": 102.0,
238
+ "mean_success": 0.6353647728200077,
239
+ "std_success": 0.0750496464623429
240
+ },
241
+ "StackCube-v1": {
242
+ "mean_num_groups": 93.33333333333333,
243
+ "mean_success": 0.2624042624042624,
244
+ "std_success": 0.05357661572836266
245
+ }
246
+ },
247
+ "seed_action_mse_to_best": {
248
+ "0": 0.3831931037115662,
249
+ "1": 0.3916490852298296,
250
+ "2": 0.4082318467800708
251
+ },
252
+ "seed_progress": {
253
+ "0": 0.5299277274051438,
254
+ "1": 0.5173212753750208,
255
+ "2": 0.5125225241044942
256
+ },
257
+ "seed_success": {
258
+ "0": 0.2782608695652174,
259
+ "1": 0.2921739130434783,
260
+ "2": 0.2782608695652174
261
+ },
262
+ "selected_candidate_type_counts": {
263
+ "policy_continuous": 1725
264
+ },
265
+ "selected_residual_scale_counts": {},
266
+ "selected_type_outcomes": {
267
+ "policy_continuous": {
268
+ "count": 1725.0,
269
+ "mean_progress": 0.5199238422948862,
270
+ "success_rate": 0.28289855072463765
271
+ }
272
+ },
273
+ "source": "results/h16_policy_ckpt_near_miss_policy_bc5_summary.json",
274
+ "std_success": 0.008032699397420892
275
+ },
276
+ "residual_k4_consensus": {
277
+ "ci95_success": 0.04490086956521744,
278
+ "label": "K4 mean-by-type tangent consensus",
279
+ "mean_action_mse_to_best": 0.3951832763526751,
280
+ "mean_progress": 0.5664916701836668,
281
+ "mean_success": 0.34956521739130436,
282
+ "num_completed": 3,
283
+ "per_task_success": {
284
+ "LiftPegUpright-v1": {
285
+ "mean_num_groups": 102.0,
286
+ "mean_success": 0.26340865087329823,
287
+ "std_success": 0.06057881385012102
288
+ },
289
+ "PickCube-v1": {
290
+ "mean_num_groups": 196.66666666666666,
291
+ "mean_success": 0.32271924934968416,
292
+ "std_success": 0.02563840631968968
293
+ },
294
+ "PullCube-v1": {
295
+ "mean_num_groups": 81.0,
296
+ "mean_success": 0.21710336447178555,
297
+ "std_success": 0.028486855778825676
298
+ },
299
+ "PushCube-v1": {
300
+ "mean_num_groups": 102.0,
301
+ "mean_success": 0.7382993906061106,
302
+ "std_success": 0.07739498258812846
303
+ },
304
+ "StackCube-v1": {
305
+ "mean_num_groups": 93.33333333333333,
306
+ "mean_success": 0.1842786842786843,
307
+ "std_success": 0.0420986975433789
308
+ }
309
+ },
310
+ "seed_action_mse_to_best": {
311
+ "0": 0.3816084327896976,
312
+ "1": 0.38771247025741185,
313
+ "2": 0.41622892601091577
314
+ },
315
+ "seed_progress": {
316
+ "0": 0.550848600073596,
317
+ "1": 0.5633281786707433,
318
+ "2": 0.5852982318066611
319
+ },
320
+ "seed_success": {
321
+ "0": 0.3391304347826087,
322
+ "1": 0.3391304347826087,
323
+ "2": 0.37043478260869567
324
+ },
325
+ "selected_candidate_type_counts": {
326
+ "retrieval_residual_policy_residual": 1666,
327
+ "retrieval_residual_residual_no_op": 35,
328
+ "retrieval_residual_residual_wrong_gripper": 24
329
+ },
330
+ "selected_residual_scale_counts": {},
331
+ "selected_type_outcomes": {
332
+ "retrieval_residual_policy_residual": {
333
+ "count": 1666.0,
334
+ "mean_progress": 0.5619538651180497,
335
+ "success_rate": 0.3427370948379352
336
+ },
337
+ "retrieval_residual_residual_no_op": {
338
+ "count": 35.0,
339
+ "mean_progress": 0.7849920756050519,
340
+ "success_rate": 0.6285714285714286
341
+ },
342
+ "retrieval_residual_residual_wrong_gripper": {
343
+ "count": 24.0,
344
+ "mean_progress": 0.5628445472490663,
345
+ "success_rate": 0.4166666666666667
346
+ }
347
+ },
348
+ "source": "results/h16_policy_ckpt_near_miss_policy_bc5_bestpt_retrieval_residual_k4s040_safe_margin0p20_mean_by_type_summary.json",
349
+ "std_success": 0.018073573644196997
350
+ },
351
+ "same_state_full": {
352
+ "ci95_success": 0.0885808391099616,
353
+ "label": "Same-state lattice, full",
354
+ "mean_action_mse_to_best": 0.4375445205177369,
355
+ "mean_progress": 0.8108624100247802,
356
+ "mean_success": 0.6933333333333334,
357
+ "num_completed": 3,
358
+ "per_task_success": {
359
+ "LiftPegUpright-v1": {
360
+ "mean_num_groups": 102.0,
361
+ "mean_success": 0.7319153640685664,
362
+ "std_success": 0.009244868116419832
363
+ },
364
+ "PickCube-v1": {
365
+ "mean_num_groups": 196.66666666666666,
366
+ "mean_success": 0.8418873799308582,
367
+ "std_success": 0.06029163337598174
368
+ },
369
+ "PullCube-v1": {
370
+ "mean_num_groups": 81.0,
371
+ "mean_success": 0.2241133135869978,
372
+ "std_success": 0.05014441905467882
373
+ },
374
+ "PushCube-v1": {
375
+ "mean_num_groups": 102.0,
376
+ "mean_success": 0.8192156765992872,
377
+ "std_success": 0.0284217046535236
378
+ },
379
+ "StackCube-v1": {
380
+ "mean_num_groups": 93.33333333333333,
381
+ "mean_success": 0.6082510082510082,
382
+ "std_success": 0.06356803112780139
383
+ }
384
+ },
385
+ "seed_action_mse_to_best": {
386
+ "0": 0.414993303792207,
387
+ "1": 0.41892785357189893,
388
+ "2": 0.47871240418910493
389
+ },
390
+ "seed_progress": {
391
+ "0": 0.792444871255885,
392
+ "1": 0.8205086112848442,
393
+ "2": 0.8196337475336116
394
+ },
395
+ "seed_success": {
396
+ "0": 0.6521739130434783,
397
+ "1": 0.7147826086956521,
398
+ "2": 0.7130434782608696
399
+ },
400
+ "selected_candidate_type_counts": {
401
+ "lattice_expert": 977,
402
+ "lattice_near_miss": 348,
403
+ "lattice_no_op": 177,
404
+ "lattice_random_negative": 138,
405
+ "lattice_wrong_direction": 30,
406
+ "lattice_wrong_gripper": 55
407
+ },
408
+ "selected_residual_scale_counts": {},
409
+ "selected_type_outcomes": {
410
+ "lattice_expert": {
411
+ "count": 977.0,
412
+ "mean_progress": 0.9339633623143789,
413
+ "success_rate": 0.8444216990788127
414
+ },
415
+ "lattice_near_miss": {
416
+ "count": 348.0,
417
+ "mean_progress": 0.8058800027416698,
418
+ "success_rate": 0.6436781609195402
419
+ },
420
+ "lattice_no_op": {
421
+ "count": 177.0,
422
+ "mean_progress": 0.6444597694665025,
423
+ "success_rate": 0.4745762711864407
424
+ },
425
+ "lattice_random_negative": {
426
+ "count": 138.0,
427
+ "mean_progress": 0.29152617198617564,
428
+ "success_rate": 0.14492753623188406
429
+ },
430
+ "lattice_wrong_direction": {
431
+ "count": 30.0,
432
+ "mean_progress": 0.5927432135989269,
433
+ "success_rate": 0.4666666666666667
434
+ },
435
+ "lattice_wrong_gripper": {
436
+ "count": 55.0,
437
+ "mean_progress": 0.6132168003611944,
438
+ "success_rate": 0.5272727272727272
439
+ }
440
+ },
441
+ "source": "results/h16_lattice_summary.json",
442
+ "std_success": 0.035655708555783816
443
+ },
444
+ "same_state_near_miss": {
445
+ "ci95_success": 0.08178741440600439,
446
+ "label": "Same-state lattice, near-miss only",
447
+ "mean_action_mse_to_best": 0.34738104417867804,
448
+ "mean_progress": 0.7515200069436928,
449
+ "mean_success": 0.5594202898550724,
450
+ "num_completed": 3,
451
+ "per_task_success": {
452
+ "LiftPegUpright-v1": {
453
+ "mean_num_groups": 102.0,
454
+ "mean_success": 0.6289923744792142,
455
+ "std_success": 0.0538077190869994
456
+ },
457
+ "PickCube-v1": {
458
+ "mean_num_groups": 196.66666666666666,
459
+ "mean_success": 0.5813155242503069,
460
+ "std_success": 0.05906115334855372
461
+ },
462
+ "PullCube-v1": {
463
+ "mean_num_groups": 81.0,
464
+ "mean_success": 0.150226576542366,
465
+ "std_success": 0.043012136508133576
466
+ },
467
+ "PushCube-v1": {
468
+ "mean_num_groups": 102.0,
469
+ "mean_success": 0.8253741417845063,
470
+ "std_success": 0.04067409265225504
471
+ },
472
+ "StackCube-v1": {
473
+ "mean_num_groups": 93.33333333333333,
474
+ "mean_success": 0.504107004107004,
475
+ "std_success": 0.021606778206277356
476
+ }
477
+ },
478
+ "seed_action_mse_to_best": {
479
+ "0": 0.33686841549711183,
480
+ "1": 0.338796136389365,
481
+ "2": 0.36647858064955746
482
+ },
483
+ "seed_progress": {
484
+ "0": 0.7402807480075242,
485
+ "1": 0.7557949085549815,
486
+ "2": 0.7584843642685725
487
+ },
488
+ "seed_success": {
489
+ "0": 0.5217391304347826,
490
+ "1": 0.5826086956521739,
491
+ "2": 0.5739130434782609
492
+ },
493
+ "selected_candidate_type_counts": {
494
+ "lattice_near_miss": 1725
495
+ },
496
+ "selected_residual_scale_counts": {},
497
+ "selected_type_outcomes": {
498
+ "lattice_near_miss": {
499
+ "count": 1725.0,
500
+ "mean_progress": 0.7515200069436927,
501
+ "success_rate": 0.5594202898550724
502
+ }
503
+ },
504
+ "source": "results/h16_lattice_near_miss_only_v2_summary.json",
505
+ "std_success": 0.032921207801740716
506
+ },
507
+ "same_state_no_expert": {
508
+ "ci95_success": 0.11474666666666679,
509
+ "label": "Same-state lattice, no expert",
510
+ "mean_action_mse_to_best": 0.45901029001275234,
511
+ "mean_progress": 0.7501174603224449,
512
+ "mean_success": 0.5698550724637682,
513
+ "num_completed": 3,
514
+ "per_task_success": {
515
+ "LiftPegUpright-v1": {
516
+ "mean_num_groups": 102.0,
517
+ "mean_success": 0.617157168344332,
518
+ "std_success": 0.03559446921051549
519
+ },
520
+ "PickCube-v1": {
521
+ "mean_num_groups": 196.66666666666666,
522
+ "mean_success": 0.6214788633266894,
523
+ "std_success": 0.10345152045609288
524
+ },
525
+ "PullCube-v1": {
526
+ "mean_num_groups": 81.0,
527
+ "mean_success": 0.1984797853218906,
528
+ "std_success": 0.049441545131695956
529
+ },
530
+ "PushCube-v1": {
531
+ "mean_num_groups": 102.0,
532
+ "mean_success": 0.8010429852645989,
533
+ "std_success": 0.018497036403234836
534
+ },
535
+ "StackCube-v1": {
536
+ "mean_num_groups": 93.33333333333333,
537
+ "mean_success": 0.4825174825174825,
538
+ "std_success": 0.04949074107006737
539
+ }
540
+ },
541
+ "seed_action_mse_to_best": {
542
+ "0": 0.4291479373977864,
543
+ "1": 0.44271026729079693,
544
+ "2": 0.5051726653496735
545
+ },
546
+ "seed_progress": {
547
+ "0": 0.7308024795159049,
548
+ "1": 0.756582982868928,
549
+ "2": 0.7629669185825017
550
+ },
551
+ "seed_success": {
552
+ "0": 0.5165217391304348,
553
+ "1": 0.5965217391304348,
554
+ "2": 0.5965217391304348
555
+ },
556
+ "selected_candidate_type_counts": {
557
+ "lattice_near_miss": 1263,
558
+ "lattice_no_op": 222,
559
+ "lattice_random_negative": 144,
560
+ "lattice_wrong_direction": 34,
561
+ "lattice_wrong_gripper": 62
562
+ },
563
+ "selected_residual_scale_counts": {},
564
+ "selected_type_outcomes": {
565
+ "lattice_near_miss": {
566
+ "count": 1263.0,
567
+ "mean_progress": 0.824350294011836,
568
+ "success_rate": 0.6318289786223278
569
+ },
570
+ "lattice_no_op": {
571
+ "count": 222.0,
572
+ "mean_progress": 0.6904902144729554,
573
+ "success_rate": 0.5225225225225225
574
+ },
575
+ "lattice_random_negative": {
576
+ "count": 144.0,
577
+ "mean_progress": 0.28417760477815235,
578
+ "success_rate": 0.1388888888888889
579
+ },
580
+ "lattice_wrong_direction": {
581
+ "count": 34.0,
582
+ "mean_progress": 0.5852376738672748,
583
+ "success_rate": 0.47058823529411764
584
+ },
585
+ "lattice_wrong_gripper": {
586
+ "count": 62.0,
587
+ "mean_progress": 0.6240276468827599,
588
+ "success_rate": 0.532258064516129
589
+ }
590
+ },
591
+ "source": "results/h16_lattice_no_expert_summary.json",
592
+ "std_success": 0.046188021535170105
593
+ },
594
+ "same_state_policy_baseline": {
595
+ "ci95_success": 0.12189879370089796,
596
+ "label": "Same-state no-expert + policy candidate",
597
+ "mean_action_mse_to_best": 0.43814348461106417,
598
+ "mean_progress": 0.631166610757726,
599
+ "mean_success": 0.40695652173913044,
600
+ "num_completed": 3,
601
+ "per_task_success": {
602
+ "LiftPegUpright-v1": {
603
+ "mean_num_groups": 102.0,
604
+ "mean_success": 0.3079640315664629,
605
+ "std_success": 0.04002483097272376
606
+ },
607
+ "PickCube-v1": {
608
+ "mean_num_groups": 196.66666666666666,
609
+ "mean_success": 0.3750668614799049,
610
+ "std_success": 0.05362858173802174
611
+ },
612
+ "PullCube-v1": {
613
+ "mean_num_groups": 81.0,
614
+ "mean_success": 0.21089845826687928,
615
+ "std_success": 0.048311495828015846
616
+ },
617
+ "PushCube-v1": {
618
+ "mean_num_groups": 102.0,
619
+ "mean_success": 0.749962517815899,
620
+ "std_success": 0.08915824474967014
621
+ },
622
+ "StackCube-v1": {
623
+ "mean_num_groups": 93.33333333333333,
624
+ "mean_success": 0.37118067118067116,
625
+ "std_success": 0.04773148081461797
626
+ }
627
+ },
628
+ "seed_action_mse_to_best": {
629
+ "0": 0.4125794651391714,
630
+ "1": 0.42664123004302384,
631
+ "2": 0.4752097586509974
632
+ },
633
+ "seed_progress": {
634
+ "0": 0.6054906688468612,
635
+ "1": 0.6635976886036603,
636
+ "2": 0.624411474822656
637
+ },
638
+ "seed_success": {
639
+ "0": 0.3617391304347826,
640
+ "1": 0.4591304347826087,
641
+ "2": 0.4
642
+ },
643
+ "selected_candidate_type_counts": {
644
+ "lattice_near_miss": 448,
645
+ "lattice_no_op": 119,
646
+ "lattice_random_negative": 75,
647
+ "lattice_wrong_direction": 16,
648
+ "lattice_wrong_gripper": 45,
649
+ "policy_continuous": 1022
650
+ },
651
+ "selected_residual_scale_counts": {},
652
+ "selected_type_outcomes": {
653
+ "lattice_near_miss": {
654
+ "count": 448.0,
655
+ "mean_progress": 0.8320851847196796,
656
+ "success_rate": 0.640625
657
+ },
658
+ "lattice_no_op": {
659
+ "count": 119.0,
660
+ "mean_progress": 0.7418963548516025,
661
+ "success_rate": 0.5966386554621849
662
+ },
663
+ "lattice_random_negative": {
664
+ "count": 75.0,
665
+ "mean_progress": 0.3766690089305242,
666
+ "success_rate": 0.25333333333333335
667
+ },
668
+ "lattice_wrong_direction": {
669
+ "count": 16.0,
670
+ "mean_progress": 0.6197442151606083,
671
+ "success_rate": 0.5
672
+ },
673
+ "lattice_wrong_gripper": {
674
+ "count": 45.0,
675
+ "mean_progress": 0.6137187815995679,
676
+ "success_rate": 0.5111111111111111
677
+ },
678
+ "policy_continuous": {
679
+ "count": 1022.0,
680
+ "mean_progress": 0.5498230394236597,
681
+ "success_rate": 0.2876712328767123
682
+ }
683
+ },
684
+ "source": "results/h16_lattice_no_expert_policy_baseline_margin000_summary.json",
685
+ "std_success": 0.04906690775535958
686
+ }
687
+ },
688
+ "paired_deltas": {
689
+ "best_clean - canonical_h16": {
690
+ "ci95_delta": 0.051546144179697446,
691
+ "left": "best_clean_residual_k2",
692
+ "mean_delta": 0.052753623188405784,
693
+ "right": "h16_policy_canonical",
694
+ "seed_deltas": {
695
+ "0": 0.059130434782608654,
696
+ "1": 0.029565217391304355,
697
+ "2": 0.06956521739130433
698
+ },
699
+ "seeds": [
700
+ 0,
701
+ 1,
702
+ 2
703
+ ],
704
+ "std_delta": 0.020748440774693643
705
+ },
706
+ "best_clean - direct_same_ckpt": {
707
+ "ci95_delta": 0.054366209142189946,
708
+ "left": "best_clean_residual_k2",
709
+ "mean_delta": 0.06724637681159418,
710
+ "right": "near_miss_policy_bc5",
711
+ "seed_deltas": {
712
+ "0": 0.0643478260869565,
713
+ "1": 0.0469565217391304,
714
+ "2": 0.09043478260869564
715
+ },
716
+ "seeds": [
717
+ 0,
718
+ 1,
719
+ 2
720
+ ],
721
+ "std_delta": 0.021883578073248564
722
+ },
723
+ "full_lattice - no_expert_lattice": {
724
+ "ci95_delta": 0.02628111194117426,
725
+ "left": "same_state_full",
726
+ "mean_delta": 0.12347826086956519,
727
+ "right": "same_state_no_expert",
728
+ "seed_deltas": {
729
+ "0": 0.13565217391304352,
730
+ "1": 0.11826086956521731,
731
+ "2": 0.11652173913043473
732
+ },
733
+ "seeds": [
734
+ 0,
735
+ 1,
736
+ 2
737
+ ],
738
+ "std_delta": 0.010578717443996964
739
+ },
740
+ "no_expert_lattice - canonical_h16": {
741
+ "ci95_delta": 0.08579749715341586,
742
+ "left": "same_state_no_expert",
743
+ "mean_delta": 0.27246376811594203,
744
+ "right": "h16_policy_canonical",
745
+ "seed_deltas": {
746
+ "0": 0.23304347826086952,
747
+ "1": 0.2869565217391305,
748
+ "2": 0.2973913043478261
749
+ },
750
+ "seeds": [
751
+ 0,
752
+ 1,
753
+ 2
754
+ ],
755
+ "std_delta": 0.034535353063435366
756
+ },
757
+ "policy_candidate_lattice - no_expert_lattice": {
758
+ "ci95_delta": 0.07549705023149442,
759
+ "left": "same_state_policy_baseline",
760
+ "mean_delta": -0.1628985507246377,
761
+ "right": "same_state_no_expert",
762
+ "seed_deltas": {
763
+ "0": -0.15478260869565214,
764
+ "1": -0.13739130434782615,
765
+ "2": -0.1965217391304348
766
+ },
767
+ "seeds": [
768
+ 0,
769
+ 1,
770
+ 2
771
+ ],
772
+ "std_delta": 0.030389199819318615
773
+ }
774
+ },
775
+ "per_task_deltas": {
776
+ "best_clean_vs_h16": {
777
+ "LiftPegUpright-v1": 0.03278131303915899,
778
+ "PickCube-v1": 0.11673380966859229,
779
+ "PullCube-v1": 0.015488215488215523,
780
+ "PushCube-v1": -0.0027056759730027524,
781
+ "StackCube-v1": 0.039608539608539606
782
+ },
783
+ "no_expert_vs_best_clean": {
784
+ "LiftPegUpright-v1": 0.35374851747103375,
785
+ "PickCube-v1": 0.2988877064964022,
786
+ "PullCube-v1": -0.014862914862914883,
787
+ "PushCube-v1": 0.05319148936170215,
788
+ "StackCube-v1": 0.30194250194250194
789
+ }
790
+ }
791
+ }
results/paper_analysis.md ADDED
@@ -0,0 +1,76 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Paper Analysis
2
+
3
+ Generated: `2026-06-28T17:38:38+00:00`
4
+
5
+ ## Main Seed Statistics
6
+
7
+ | key | method | n | success | 95% CI | progress | action MSE | gain vs canonical h16 |
8
+ |---|---|---:|---:|---:|---:|---:|---:|
9
+ | h16_policy_canonical | Direct h=16 policy, canonical rollout | 3 | 29.74% +/- 1.31 | +/- 3.26 | 54.44% | 0.399 | +0.00 pp |
10
+ | gaussian_field | Gaussian field search | 3 | 29.10% +/- 1.31 | +/- 3.24 | 53.44% | 0.416 | -0.64 pp |
11
+ | near_miss_policy_bc5 | Near-miss proposal policy, direct | 3 | 28.29% +/- 0.80 | +/- 2.00 | 51.99% | 0.394 | -1.45 pp |
12
+ | best_clean_residual_k2 | K2 residual transport, safe + margin 0.20 | 3 | 35.01% +/- 1.62 | +/- 4.01 | 56.70% | 0.398 | +5.28 pp |
13
+ | residual_k4_consensus | K4 mean-by-type tangent consensus | 3 | 34.96% +/- 1.81 | +/- 4.49 | 56.65% | 0.395 | +5.22 pp |
14
+ | same_state_near_miss | Same-state lattice, near-miss only | 3 | 55.94% +/- 3.29 | +/- 8.18 | 75.15% | 0.347 | +26.20 pp |
15
+ | same_state_no_expert | Same-state lattice, no expert | 3 | 56.99% +/- 4.62 | +/- 11.47 | 75.01% | 0.459 | +27.25 pp |
16
+ | same_state_policy_baseline | Same-state no-expert + policy candidate | 3 | 40.70% +/- 4.91 | +/- 12.19 | 63.12% | 0.438 | +10.96 pp |
17
+ | same_state_full | Same-state lattice, full | 3 | 69.33% +/- 3.57 | +/- 8.86 | 81.09% | 0.438 | +39.59 pp |
18
+
19
+ ## Paired Seed Deltas
20
+
21
+ | comparison | seeds | mean delta | 95% CI | seed deltas |
22
+ |---|---:|---:|---:|---|
23
+ | best_clean - canonical_h16 | 3 | +5.28 pp | +/- 5.15 | 0:+5.91, 1:+2.96, 2:+6.96 |
24
+ | best_clean - direct_same_ckpt | 3 | +6.72 pp | +/- 5.44 | 0:+6.43, 1:+4.70, 2:+9.04 |
25
+ | no_expert_lattice - canonical_h16 | 3 | +27.25 pp | +/- 8.58 | 0:+23.30, 1:+28.70, 2:+29.74 |
26
+ | full_lattice - no_expert_lattice | 3 | +12.35 pp | +/- 2.63 | 0:+13.57, 1:+11.83, 2:+11.65 |
27
+ | policy_candidate_lattice - no_expert_lattice | 3 | -16.29 pp | +/- 7.55 | 0:-15.48, 1:-13.74, 2:-19.65 |
28
+
29
+ ## Per-Task Mean Success
30
+
31
+ | task | h16 policy | best clean | near-miss lattice | no-expert lattice | full lattice | clean-h16 delta | noexpert-clean gap |
32
+ |---|---:|---:|---:|---:|---:|---:|---:|
33
+ | LiftPegUpright-v1 | 23.06% | 26.34% | 62.90% | 61.72% | 73.19% | +3.28 pp | +35.37 pp |
34
+ | PickCube-v1 | 20.59% | 32.26% | 58.13% | 62.15% | 84.19% | +11.67 pp | +29.89 pp |
35
+ | PullCube-v1 | 19.79% | 21.33% | 15.02% | 19.85% | 22.41% | +1.55 pp | -1.49 pp |
36
+ | PushCube-v1 | 75.06% | 74.79% | 82.54% | 80.10% | 81.92% | -0.27 pp | +5.32 pp |
37
+ | StackCube-v1 | 14.10% | 18.06% | 50.41% | 48.25% | 60.83% | +3.96 pp | +30.19 pp |
38
+
39
+ ## Mechanism Gap
40
+
41
+ - Best clean residual transport improves over canonical h16 by +5.28 pp.
42
+ - Same-state no-expert lattice improves over canonical h16 by +27.25 pp.
43
+ - Remaining clean-to-same-state proposal gap is +21.97 pp.
44
+ - Full lattice adds expert proposals and reaches 69.33%, a +12.35 pp gain over no-expert.
45
+
46
+ ## Selection Histograms
47
+
48
+ - `same_state_near_miss`: lattice_near_miss=1725 (100.0%)
49
+ - `same_state_no_expert`: lattice_near_miss=1263 (73.2%), lattice_no_op=222 (12.9%), lattice_random_negative=144 (8.3%), lattice_wrong_gripper=62 (3.6%), lattice_wrong_direction=34 (2.0%)
50
+ - `same_state_policy_baseline`: policy_continuous=1022 (59.2%), lattice_near_miss=448 (26.0%), lattice_no_op=119 (6.9%), lattice_random_negative=75 (4.3%), lattice_wrong_gripper=45 (2.6%), lattice_wrong_direction=16 (0.9%)
51
+ - `same_state_full`: lattice_expert=977 (56.6%), lattice_near_miss=348 (20.2%), lattice_no_op=177 (10.3%), lattice_random_negative=138 (8.0%), lattice_wrong_gripper=55 (3.2%), lattice_wrong_direction=30 (1.7%)
52
+ - `best_clean_residual_k2`: retrieval_residual_policy_residual=1610 (93.3%), retrieval_residual_residual_no_op=84 (4.9%), retrieval_residual_residual_wrong_gripper=31 (1.8%)
53
+
54
+ ## Selected-Type Outcomes
55
+
56
+ These rows are measured from raw rollout rows. In residual retrieval, `policy_residual` is the zero-residual action, i.e. abstaining to the current policy mean.
57
+
58
+ | method | selected type | count | success | progress |
59
+ |---|---|---:|---:|---:|
60
+ | best_clean_residual_k2 | retrieval_residual_policy_residual | 1610 | 34.53% | 56.21% |
61
+ | best_clean_residual_k2 | retrieval_residual_residual_no_op | 84 | 41.67% | 65.83% |
62
+ | best_clean_residual_k2 | retrieval_residual_residual_wrong_gripper | 31 | 41.94% | 57.66% |
63
+ | residual_k4_consensus | retrieval_residual_policy_residual | 1666 | 34.27% | 56.20% |
64
+ | residual_k4_consensus | retrieval_residual_residual_no_op | 35 | 62.86% | 78.50% |
65
+ | residual_k4_consensus | retrieval_residual_residual_wrong_gripper | 24 | 41.67% | 56.28% |
66
+ | same_state_no_expert | lattice_near_miss | 1263 | 63.18% | 82.44% |
67
+ | same_state_no_expert | lattice_no_op | 222 | 52.25% | 69.05% |
68
+ | same_state_no_expert | lattice_random_negative | 144 | 13.89% | 28.42% |
69
+ | same_state_no_expert | lattice_wrong_gripper | 62 | 53.23% | 62.40% |
70
+ | same_state_no_expert | lattice_wrong_direction | 34 | 47.06% | 58.52% |
71
+ | same_state_policy_baseline | policy_continuous | 1022 | 28.77% | 54.98% |
72
+ | same_state_policy_baseline | lattice_near_miss | 448 | 64.06% | 83.21% |
73
+ | same_state_policy_baseline | lattice_no_op | 119 | 59.66% | 74.19% |
74
+ | same_state_policy_baseline | lattice_random_negative | 75 | 25.33% | 37.67% |
75
+ | same_state_policy_baseline | lattice_wrong_gripper | 45 | 51.11% | 61.37% |
76
+ | same_state_policy_baseline | lattice_wrong_direction | 16 | 50.00% | 61.97% |
results/paper_core_results.md CHANGED
@@ -3,6 +3,12 @@
3
  All rows use 3 seeds and 575 validation groups per seed unless noted. The direct policy
4
  baseline is the h=16 rank-checkpoint online rollout (`29.74%`).
5
 
 
 
 
 
 
 
6
  | Method | Uses same-state proposals | Uses expert proposal | Success | Gain vs policy | Interpretation |
7
  |---|---:|---:|---:|---:|---|
8
  | Direct h=16 policy | No | No | 29.74% | -- | BC policy cannot exploit high oracle ceiling |
 
3
  All rows use 3 seeds and 575 validation groups per seed unless noted. The direct policy
4
  baseline is the h=16 rank-checkpoint online rollout (`29.74%`).
5
 
6
+ For paired seed deltas, per-task gaps, and selection histograms, regenerate and
7
+ read `paper_analysis.md` with `python3 scripts/build_paper_analysis.py`. Current
8
+ paired analysis: best clean K2 residual transport is `+5.28 pp` over canonical
9
+ h=16, same-state no-expert lattice is `+27.25 pp`, and the remaining
10
+ clean-to-same-state proposal gap is `+21.97 pp`.
11
+
12
  | Method | Uses same-state proposals | Uses expert proposal | Success | Gain vs policy | Interpretation |
13
  |---|---:|---:|---:|---:|---|
14
  | Direct h=16 policy | No | No | 29.74% | -- | BC policy cannot exploit high oracle ceiling |
results/paper_story_memo.md CHANGED
@@ -26,7 +26,9 @@ when queried on proposal geometry that matches those local counterfactuals.
26
  | All-split field-teacher distillation does not fix checkpointing/coverage | allmap direct is 28.00%; field-guided best is 26.49% despite 100% target coverage | Negative diagnostic |
27
  | Residual family consistency improves clean transport | policy/no-op/wrong-gripper typed residuals reach 33.74%, above raw 33.33% | Supported as diagnostic |
28
  | Counterfactual advantage abstention improves clean transport | requiring field advantage over the zero-residual policy raises typed residual transport to 34.84%, and K2 retrieval reaches 35.01% | Current best clean result |
 
29
  | Tangent consensus is close but does not beat raw K2 residuals | K4 mean-by-type residual consensus reaches 34.96%, just below the 35.01% K2 raw residual row | Near-tie diagnostic |
 
30
  | Policy fallback is not the same-state mechanism | adding a policy baseline candidate to the no-expert same-state lattice drops 56.99% to 40.70% even with margin 0.00 | Negative diagnostic |
31
  | Z-score retrieval metric does not help | z-score rows reach 32.23-32.81%, below raw retrieval | Negative diagnostic |
32
  | Train-split residual family reliability does not recover the typed mask | after fixing threshold pass-through, scale-0.35 thresholds 0.10/0.25 reach 33.33%/33.28%, below typed safe residuals | Negative diagnostic |
@@ -89,7 +91,7 @@ test-time search. The cleaner novelty is:
89
 
90
  ## Job Status
91
 
92
- Last checked: `2026-06-28 17:28 UTC`. Ray-search jobs are queued, pending on
93
  GPU priority.
94
 
95
  - `14858328`-`14858333`: completed train-split `field_selected_noexpert_bc5`;
@@ -144,7 +146,9 @@ GPU priority.
144
  - `14868993`/`14868995`/`14868997`/`14868999`: pending counterfactual tangent
145
  ray-search rollouts for K1/K2/K4 safe residual retrieval with scale grids.
146
  Summary jobs `14868994`/`14868996`/`14868998`/`14869000` and table rebuild
147
- `14869605` are dependency-gated on those rollouts.
 
 
148
  - `14869627`: completed CPU Apptainer smoke for the new residual scale-grid
149
  selector. It selected index `3` on a two-residual/two-scale toy case and
150
  returned the expected action `0.20`, validating the candidate expansion and
@@ -166,6 +170,8 @@ GPU priority.
166
  result.
167
  - Use K2 typed safe residual transport with advantage abstention (35.01%) only as the current best clean
168
  deployment diagnostic, not as a SOTA claim.
 
 
169
  - Treat z-score retrieval, repaired train-family reliability priors, Gaussian hybrids,
170
  field optimization, field-teacher/tangent distillation, policy-relative anchoring, tangent consensus,
171
  and same-state policy-baseline fallback as negative or near-tie diagnostics
 
26
  | All-split field-teacher distillation does not fix checkpointing/coverage | allmap direct is 28.00%; field-guided best is 26.49% despite 100% target coverage | Negative diagnostic |
27
  | Residual family consistency improves clean transport | policy/no-op/wrong-gripper typed residuals reach 33.74%, above raw 33.33% | Supported as diagnostic |
28
  | Counterfactual advantage abstention improves clean transport | requiring field advantage over the zero-residual policy raises typed residual transport to 34.84%, and K2 retrieval reaches 35.01% | Current best clean result |
29
+ | Clean residual transport behaves like sparse intervention | `paper_analysis.md` shows K2 residual retrieval abstains to zero-residual policy on 93.3% of states, while selected nonzero no-op/wrong-gripper residuals succeed at ~41.7-41.9% vs 34.5% for abstention | Stronger clean-mechanism framing |
30
  | Tangent consensus is close but does not beat raw K2 residuals | K4 mean-by-type residual consensus reaches 34.96%, just below the 35.01% K2 raw residual row | Near-tie diagnostic |
31
+ | The proposal gap is now quantified | `paper_analysis.md` reports best clean +5.28 pp over canonical h16, same-state no-expert +27.25 pp, leaving a +21.97 pp clean-to-same-state gap | Core paper tension |
32
  | Policy fallback is not the same-state mechanism | adding a policy baseline candidate to the no-expert same-state lattice drops 56.99% to 40.70% even with margin 0.00 | Negative diagnostic |
33
  | Z-score retrieval metric does not help | z-score rows reach 32.23-32.81%, below raw retrieval | Negative diagnostic |
34
  | Train-split residual family reliability does not recover the typed mask | after fixing threshold pass-through, scale-0.35 thresholds 0.10/0.25 reach 33.33%/33.28%, below typed safe residuals | Negative diagnostic |
 
91
 
92
  ## Job Status
93
 
94
+ Last checked: `2026-06-28 17:36 UTC`. Ray-search jobs are queued, pending on
95
  GPU priority.
96
 
97
  - `14858328`-`14858333`: completed train-split `field_selected_noexpert_bc5`;
 
146
  - `14868993`/`14868995`/`14868997`/`14868999`: pending counterfactual tangent
147
  ray-search rollouts for K1/K2/K4 safe residual retrieval with scale grids.
148
  Summary jobs `14868994`/`14868996`/`14868998`/`14869000` and table rebuild
149
+ `14869605` are dependency-gated on those rollouts. Updated rebuild job
150
+ `14869860` is also dependency-gated and will regenerate both paper table and
151
+ paired analysis outputs with the current script.
152
  - `14869627`: completed CPU Apptainer smoke for the new residual scale-grid
153
  selector. It selected index `3` on a two-residual/two-scale toy case and
154
  returned the expected action `0.20`, validating the candidate expansion and
 
170
  result.
171
  - Use K2 typed safe residual transport with advantage abstention (35.01%) only as the current best clean
172
  deployment diagnostic, not as a SOTA claim.
173
+ - Use `results/paper_analysis.md` for paired seed deltas, per-task gaps, and
174
+ selection histograms when writing reviewer-facing tables.
175
  - Treat z-score retrieval, repaired train-family reliability priors, Gaussian hybrids,
176
  field optimization, field-teacher/tangent distillation, policy-relative anchoring, tangent consensus,
177
  and same-state policy-baseline fallback as negative or near-tie diagnostics
scripts/build_paper_analysis.py ADDED
@@ -0,0 +1,488 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python
2
+ from __future__ import annotations
3
+
4
+ import json
5
+ import math
6
+ from collections import Counter
7
+ from dataclasses import dataclass
8
+ from datetime import datetime, timezone
9
+ from pathlib import Path
10
+ from typing import Any
11
+
12
+
13
+ RESULTS_DIR = Path("results")
14
+ OUT_JSON = RESULTS_DIR / "paper_analysis.json"
15
+ OUT_MD = RESULTS_DIR / "paper_analysis.md"
16
+ CANONICAL_H16_ROLLOUT = Path("/scratch/knguy52/dovla/experiments/dovla_h16_rollout_runs")
17
+
18
+
19
+ @dataclass(frozen=True)
20
+ class MethodSpec:
21
+ key: str
22
+ label: str
23
+ summary_path: str | None = None
24
+ raw_rollout_glob: str | None = None
25
+ summary_mode: str = "standard"
26
+
27
+
28
+ METHODS = [
29
+ MethodSpec(
30
+ key="h16_policy_canonical",
31
+ label="Direct h=16 policy, canonical rollout",
32
+ raw_rollout_glob=str(CANONICAL_H16_ROLLOUT / "seed_*/online_rollout.json"),
33
+ ),
34
+ MethodSpec(
35
+ key="gaussian_field",
36
+ label="Gaussian field search",
37
+ summary_path="h16_field_sweep_summary.json",
38
+ summary_mode="field_sweep_best",
39
+ ),
40
+ MethodSpec(
41
+ key="near_miss_policy_bc5",
42
+ label="Near-miss proposal policy, direct",
43
+ summary_path="h16_policy_ckpt_near_miss_policy_bc5_summary.json",
44
+ ),
45
+ MethodSpec(
46
+ key="best_clean_residual_k2",
47
+ label="K2 residual transport, safe + margin 0.20",
48
+ summary_path=(
49
+ "h16_policy_ckpt_near_miss_policy_bc5_bestpt_retrieval_residual_"
50
+ "knn2_scale0p40_safe_types_margin0p20_summary.json"
51
+ ),
52
+ ),
53
+ MethodSpec(
54
+ key="residual_k4_consensus",
55
+ label="K4 mean-by-type tangent consensus",
56
+ summary_path=(
57
+ "h16_policy_ckpt_near_miss_policy_bc5_bestpt_retrieval_residual_"
58
+ "k4s040_safe_margin0p20_mean_by_type_summary.json"
59
+ ),
60
+ ),
61
+ MethodSpec(
62
+ key="same_state_near_miss",
63
+ label="Same-state lattice, near-miss only",
64
+ summary_path="h16_lattice_near_miss_only_v2_summary.json",
65
+ ),
66
+ MethodSpec(
67
+ key="same_state_no_expert",
68
+ label="Same-state lattice, no expert",
69
+ summary_path="h16_lattice_no_expert_summary.json",
70
+ ),
71
+ MethodSpec(
72
+ key="same_state_policy_baseline",
73
+ label="Same-state no-expert + policy candidate",
74
+ summary_path="h16_lattice_no_expert_policy_baseline_margin000_summary.json",
75
+ ),
76
+ MethodSpec(
77
+ key="same_state_full",
78
+ label="Same-state lattice, full",
79
+ summary_path="h16_lattice_summary.json",
80
+ ),
81
+ ]
82
+
83
+
84
+ def _load_json(path: Path) -> dict[str, Any]:
85
+ with path.open("r", encoding="utf-8") as handle:
86
+ return json.load(handle)
87
+
88
+
89
+ def _mean(values: list[float]) -> float:
90
+ return sum(values) / len(values) if values else float("nan")
91
+
92
+
93
+ def _sample_std(values: list[float]) -> float:
94
+ if len(values) <= 1:
95
+ return 0.0
96
+ mean = _mean(values)
97
+ return math.sqrt(sum((value - mean) ** 2 for value in values) / (len(values) - 1))
98
+
99
+
100
+ def _ci95(values: list[float]) -> float:
101
+ if len(values) <= 1:
102
+ return 0.0
103
+ t_crit = {
104
+ 1: 12.706,
105
+ 2: 4.303,
106
+ 3: 3.182,
107
+ 4: 2.776,
108
+ 5: 2.571,
109
+ 6: 2.447,
110
+ 7: 2.365,
111
+ 8: 2.306,
112
+ 9: 2.262,
113
+ 10: 2.228,
114
+ }.get(len(values) - 1, 1.96)
115
+ return t_crit * _sample_std(values) / math.sqrt(len(values))
116
+
117
+
118
+ def _success(row: dict[str, Any]) -> float:
119
+ return float(row["policy_rollout_success_rate"])
120
+
121
+
122
+ def _progress(row: dict[str, Any]) -> float:
123
+ return float(row.get("policy_rollout_progress", float("nan")))
124
+
125
+
126
+ def _action_mse(row: dict[str, Any]) -> float:
127
+ return float(row.get("action_mse_to_best", float("nan")))
128
+
129
+
130
+ def _seed(row: dict[str, Any], fallback: int) -> int:
131
+ return int(row.get("seed", fallback))
132
+
133
+
134
+ def _standard_summary(path: Path) -> dict[str, Any]:
135
+ data = _load_json(path)
136
+ rows = list(data.get("rows", []))
137
+ return _normalize_summary(data, rows, source=str(path))
138
+
139
+
140
+ def _field_sweep_best(path: Path) -> dict[str, Any]:
141
+ data = _load_json(path)
142
+ best_config = data.get("best", {}).get("config")
143
+ rows = [row for row in data.get("rows", []) if row.get("config") == best_config]
144
+ normalized = _normalize_summary(data.get("best", data), rows, source=str(path))
145
+ normalized["best_config"] = best_config
146
+ return normalized
147
+
148
+
149
+ def _raw_rollout_summary(pattern: str) -> dict[str, Any]:
150
+ rows = []
151
+ for index, path in enumerate(sorted(Path().glob(pattern) if not pattern.startswith("/") else Path("/").glob(pattern[1:]))):
152
+ row = _load_json(path)
153
+ row = dict(row)
154
+ row["path"] = str(path)
155
+ row["seed"] = _seed(row, index)
156
+ rows.append(row)
157
+ return _normalize_summary({}, rows, source=pattern)
158
+
159
+
160
+ def _normalize_summary(data: dict[str, Any], rows: list[dict[str, Any]], *, source: str) -> dict[str, Any]:
161
+ successes = [_success(row) for row in rows]
162
+ progress = [_progress(row) for row in rows]
163
+ action_mse = [_action_mse(row) for row in rows]
164
+ selected_counts = Counter()
165
+ selected_counts.update(data.get("selected_candidate_type_counts", {}))
166
+ selected_scale_counts = Counter()
167
+ selected_scale_counts.update(data.get("selected_residual_scale_counts", {}))
168
+ expected_count = sum(int(row.get("num_groups", 0)) for row in rows)
169
+ has_top_level_selected_counts = (
170
+ bool(selected_counts) and sum(int(value) for value in selected_counts.values()) == expected_count
171
+ )
172
+ has_top_level_scale_counts = (
173
+ bool(selected_scale_counts)
174
+ and sum(int(value) for value in selected_scale_counts.values()) == expected_count
175
+ )
176
+ if not has_top_level_selected_counts:
177
+ selected_counts = Counter()
178
+ if not has_top_level_scale_counts:
179
+ selected_scale_counts = Counter()
180
+ if not has_top_level_selected_counts or not has_top_level_scale_counts:
181
+ for row in rows:
182
+ path = row.get("path")
183
+ if not path:
184
+ continue
185
+ raw_path = Path(str(path))
186
+ if not raw_path.exists():
187
+ continue
188
+ raw = _load_json(raw_path)
189
+ if not has_top_level_selected_counts:
190
+ selected_counts.update(raw.get("selected_candidate_type_counts", {}))
191
+ if not has_top_level_scale_counts:
192
+ selected_scale_counts.update(raw.get("selected_residual_scale_counts", {}))
193
+ return {
194
+ "source": source,
195
+ "num_completed": len(rows),
196
+ "mean_success": _mean(successes),
197
+ "std_success": _sample_std(successes),
198
+ "ci95_success": _ci95(successes),
199
+ "mean_progress": _mean(progress),
200
+ "mean_action_mse_to_best": _mean(action_mse),
201
+ "seed_success": {_seed(row, index): _success(row) for index, row in enumerate(rows)},
202
+ "seed_progress": {_seed(row, index): _progress(row) for index, row in enumerate(rows)},
203
+ "seed_action_mse_to_best": {_seed(row, index): _action_mse(row) for index, row in enumerate(rows)},
204
+ "per_task_success": _per_task(rows),
205
+ "selected_candidate_type_counts": dict(selected_counts),
206
+ "selected_residual_scale_counts": dict(selected_scale_counts),
207
+ "selected_type_outcomes": _selected_type_outcomes(rows),
208
+ }
209
+
210
+
211
+ def _per_task(rows: list[dict[str, Any]]) -> dict[str, dict[str, float]]:
212
+ task_values: dict[str, list[float]] = {}
213
+ task_counts: dict[str, list[int]] = {}
214
+ for row in rows:
215
+ for task, metrics in row.get("per_task", {}).items():
216
+ task_values.setdefault(task, []).append(float(metrics["policy_rollout_success_rate"]))
217
+ task_counts.setdefault(task, []).append(int(metrics.get("num_groups", 0)))
218
+ return {
219
+ task: {
220
+ "mean_success": _mean(values),
221
+ "std_success": _sample_std(values),
222
+ "mean_num_groups": _mean([float(value) for value in task_counts.get(task, [])]),
223
+ }
224
+ for task, values in sorted(task_values.items())
225
+ }
226
+
227
+
228
+ def _selected_type_outcomes(rows: list[dict[str, Any]]) -> dict[str, dict[str, float]]:
229
+ grouped: dict[str, dict[str, float]] = {}
230
+ for row in rows:
231
+ path = row.get("path")
232
+ if not path:
233
+ continue
234
+ raw_path = Path(str(path))
235
+ if not raw_path.exists():
236
+ continue
237
+ raw = _load_json(raw_path)
238
+ for item in raw.get("rows", []):
239
+ candidate_type = str(item.get("nearest_candidate_type") or "unknown")
240
+ stats = grouped.setdefault(
241
+ candidate_type,
242
+ {"count": 0.0, "success_sum": 0.0, "progress_sum": 0.0},
243
+ )
244
+ stats["count"] += 1.0
245
+ stats["success_sum"] += 1.0 if item.get("success") else 0.0
246
+ stats["progress_sum"] += float(item.get("progress", 0.0))
247
+ return {
248
+ candidate_type: {
249
+ "count": values["count"],
250
+ "success_rate": values["success_sum"] / values["count"] if values["count"] else float("nan"),
251
+ "mean_progress": values["progress_sum"] / values["count"] if values["count"] else float("nan"),
252
+ }
253
+ for candidate_type, values in sorted(
254
+ grouped.items(),
255
+ key=lambda item: (-item[1]["count"], item[0]),
256
+ )
257
+ }
258
+
259
+
260
+ def _load_methods() -> dict[str, dict[str, Any]]:
261
+ methods: dict[str, dict[str, Any]] = {}
262
+ for spec in METHODS:
263
+ if spec.summary_path:
264
+ path = RESULTS_DIR / spec.summary_path
265
+ if not path.exists():
266
+ methods[spec.key] = {"missing": True, "source": str(path), "label": spec.label}
267
+ continue
268
+ if spec.summary_mode == "field_sweep_best":
269
+ method = _field_sweep_best(path)
270
+ else:
271
+ method = _standard_summary(path)
272
+ elif spec.raw_rollout_glob:
273
+ method = _raw_rollout_summary(spec.raw_rollout_glob)
274
+ else:
275
+ method = {"missing": True, "source": "", "label": spec.label}
276
+ method["label"] = spec.label
277
+ methods[spec.key] = method
278
+ return methods
279
+
280
+
281
+ def _paired_delta(
282
+ methods: dict[str, dict[str, Any]],
283
+ left: str,
284
+ right: str,
285
+ ) -> dict[str, Any]:
286
+ left_values = methods[left].get("seed_success", {})
287
+ right_values = methods[right].get("seed_success", {})
288
+ seeds = sorted(set(left_values) & set(right_values))
289
+ deltas = [float(left_values[seed]) - float(right_values[seed]) for seed in seeds]
290
+ return {
291
+ "left": left,
292
+ "right": right,
293
+ "seeds": seeds,
294
+ "mean_delta": _mean(deltas),
295
+ "std_delta": _sample_std(deltas),
296
+ "ci95_delta": _ci95(deltas),
297
+ "seed_deltas": {seed: delta for seed, delta in zip(seeds, deltas)},
298
+ }
299
+
300
+
301
+ def _per_task_delta(
302
+ methods: dict[str, dict[str, Any]],
303
+ left: str,
304
+ right: str,
305
+ ) -> dict[str, float]:
306
+ left_tasks = methods[left].get("per_task_success", {})
307
+ right_tasks = methods[right].get("per_task_success", {})
308
+ return {
309
+ task: float(left_tasks[task]["mean_success"]) - float(right_tasks[task]["mean_success"])
310
+ for task in sorted(set(left_tasks) & set(right_tasks))
311
+ }
312
+
313
+
314
+ def _pct(value: float) -> str:
315
+ if math.isnan(value):
316
+ return "n/a"
317
+ return f"{value * 100:.2f}%"
318
+
319
+
320
+ def _pp(value: float) -> str:
321
+ if math.isnan(value):
322
+ return "n/a"
323
+ return f"{value * 100:+.2f} pp"
324
+
325
+
326
+ def _render_markdown(report: dict[str, Any]) -> str:
327
+ methods = report["methods"]
328
+ lines = [
329
+ "# Paper Analysis",
330
+ "",
331
+ f"Generated: `{report['generated_utc']}`",
332
+ "",
333
+ "## Main Seed Statistics",
334
+ "",
335
+ "| key | method | n | success | 95% CI | progress | action MSE | gain vs canonical h16 |",
336
+ "|---|---|---:|---:|---:|---:|---:|---:|",
337
+ ]
338
+ baseline = methods["h16_policy_canonical"]["mean_success"]
339
+ for key in [spec.key for spec in METHODS]:
340
+ method = methods[key]
341
+ if method.get("missing"):
342
+ lines.append(f"| {key} | {method['label']} | 0 | missing | missing | missing | missing | missing |")
343
+ continue
344
+ lines.append(
345
+ "| {key} | {label} | {n} | {success} +/- {std} | {ci} | {progress} | {mse:.3f} | {gain} |".format(
346
+ key=key,
347
+ label=method["label"],
348
+ n=method["num_completed"],
349
+ success=_pct(method["mean_success"]),
350
+ std=f"{method['std_success'] * 100:.2f}",
351
+ ci=f"+/- {method['ci95_success'] * 100:.2f}",
352
+ progress=_pct(method["mean_progress"]),
353
+ mse=method["mean_action_mse_to_best"],
354
+ gain=_pp(method["mean_success"] - baseline),
355
+ )
356
+ )
357
+ lines.extend(
358
+ [
359
+ "",
360
+ "## Paired Seed Deltas",
361
+ "",
362
+ "| comparison | seeds | mean delta | 95% CI | seed deltas |",
363
+ "|---|---:|---:|---:|---|",
364
+ ]
365
+ )
366
+ for name, delta in report["paired_deltas"].items():
367
+ seed_deltas = ", ".join(
368
+ f"{seed}:{value * 100:+.2f}" for seed, value in delta["seed_deltas"].items()
369
+ )
370
+ lines.append(
371
+ f"| {name} | {len(delta['seeds'])} | {_pp(delta['mean_delta'])} | +/- {delta['ci95_delta'] * 100:.2f} | {seed_deltas} |"
372
+ )
373
+ lines.extend(
374
+ [
375
+ "",
376
+ "## Per-Task Mean Success",
377
+ "",
378
+ "| task | h16 policy | best clean | near-miss lattice | no-expert lattice | full lattice | clean-h16 delta | noexpert-clean gap |",
379
+ "|---|---:|---:|---:|---:|---:|---:|---:|",
380
+ ]
381
+ )
382
+ tasks = sorted(methods["h16_policy_canonical"].get("per_task_success", {}))
383
+ for task in tasks:
384
+ h16 = methods["h16_policy_canonical"]["per_task_success"][task]["mean_success"]
385
+ clean = methods["best_clean_residual_k2"]["per_task_success"][task]["mean_success"]
386
+ near = methods["same_state_near_miss"]["per_task_success"][task]["mean_success"]
387
+ noexpert = methods["same_state_no_expert"]["per_task_success"][task]["mean_success"]
388
+ full = methods["same_state_full"]["per_task_success"][task]["mean_success"]
389
+ lines.append(
390
+ f"| {task} | {_pct(h16)} | {_pct(clean)} | {_pct(near)} | {_pct(noexpert)} | {_pct(full)} | {_pp(clean - h16)} | {_pp(noexpert - clean)} |"
391
+ )
392
+ gap = report["mechanism_gap"]
393
+ lines.extend(
394
+ [
395
+ "",
396
+ "## Mechanism Gap",
397
+ "",
398
+ f"- Best clean residual transport improves over canonical h16 by {_pp(gap['best_clean_vs_h16'])}.",
399
+ f"- Same-state no-expert lattice improves over canonical h16 by {_pp(gap['same_state_no_expert_vs_h16'])}.",
400
+ f"- Remaining clean-to-same-state proposal gap is {_pp(gap['same_state_no_expert_vs_best_clean'])}.",
401
+ f"- Full lattice adds expert proposals and reaches {_pct(methods['same_state_full']['mean_success'])}, a {_pp(gap['same_state_full_vs_no_expert'])} gain over no-expert.",
402
+ "",
403
+ "## Selection Histograms",
404
+ "",
405
+ ]
406
+ )
407
+ for key in ["same_state_near_miss", "same_state_no_expert", "same_state_policy_baseline", "same_state_full", "best_clean_residual_k2"]:
408
+ counts = methods[key].get("selected_candidate_type_counts", {})
409
+ if counts:
410
+ total = sum(int(value) for value in counts.values())
411
+ summary = ", ".join(
412
+ f"{name}={count} ({count / total * 100:.1f}%)"
413
+ for name, count in sorted(counts.items(), key=lambda item: (-int(item[1]), item[0]))
414
+ )
415
+ else:
416
+ summary = "not recorded"
417
+ lines.append(f"- `{key}`: {summary}")
418
+ scale_counts = methods["best_clean_residual_k2"].get("selected_residual_scale_counts", {})
419
+ if scale_counts:
420
+ lines.append(f"- `best_clean_residual_k2` residual scale counts: {scale_counts}")
421
+ lines.extend(
422
+ [
423
+ "",
424
+ "## Selected-Type Outcomes",
425
+ "",
426
+ "These rows are measured from raw rollout rows. In residual retrieval, `policy_residual` is the zero-residual action, i.e. abstaining to the current policy mean.",
427
+ "",
428
+ "| method | selected type | count | success | progress |",
429
+ "|---|---|---:|---:|---:|",
430
+ ]
431
+ )
432
+ for key in ["best_clean_residual_k2", "residual_k4_consensus", "same_state_no_expert", "same_state_policy_baseline"]:
433
+ for candidate_type, values in methods[key].get("selected_type_outcomes", {}).items():
434
+ lines.append(
435
+ f"| {key} | {candidate_type} | {int(values['count'])} | {_pct(values['success_rate'])} | {_pct(values['mean_progress'])} |"
436
+ )
437
+ return "\n".join(lines) + "\n"
438
+
439
+
440
+ def build_report() -> dict[str, Any]:
441
+ methods = _load_methods()
442
+ paired_deltas = {
443
+ "best_clean - canonical_h16": _paired_delta(methods, "best_clean_residual_k2", "h16_policy_canonical"),
444
+ "best_clean - direct_same_ckpt": _paired_delta(methods, "best_clean_residual_k2", "near_miss_policy_bc5"),
445
+ "no_expert_lattice - canonical_h16": _paired_delta(methods, "same_state_no_expert", "h16_policy_canonical"),
446
+ "full_lattice - no_expert_lattice": _paired_delta(methods, "same_state_full", "same_state_no_expert"),
447
+ "policy_candidate_lattice - no_expert_lattice": _paired_delta(
448
+ methods,
449
+ "same_state_policy_baseline",
450
+ "same_state_no_expert",
451
+ ),
452
+ }
453
+ mechanism_gap = {
454
+ "best_clean_vs_h16": methods["best_clean_residual_k2"]["mean_success"]
455
+ - methods["h16_policy_canonical"]["mean_success"],
456
+ "best_clean_vs_direct_same_ckpt": methods["best_clean_residual_k2"]["mean_success"]
457
+ - methods["near_miss_policy_bc5"]["mean_success"],
458
+ "same_state_no_expert_vs_h16": methods["same_state_no_expert"]["mean_success"]
459
+ - methods["h16_policy_canonical"]["mean_success"],
460
+ "same_state_no_expert_vs_best_clean": methods["same_state_no_expert"]["mean_success"]
461
+ - methods["best_clean_residual_k2"]["mean_success"],
462
+ "same_state_full_vs_no_expert": methods["same_state_full"]["mean_success"]
463
+ - methods["same_state_no_expert"]["mean_success"],
464
+ }
465
+ return {
466
+ "generated_utc": datetime.now(timezone.utc).isoformat(timespec="seconds"),
467
+ "methods": methods,
468
+ "paired_deltas": paired_deltas,
469
+ "per_task_deltas": {
470
+ "best_clean_vs_h16": _per_task_delta(methods, "best_clean_residual_k2", "h16_policy_canonical"),
471
+ "no_expert_vs_best_clean": _per_task_delta(methods, "same_state_no_expert", "best_clean_residual_k2"),
472
+ },
473
+ "mechanism_gap": mechanism_gap,
474
+ }
475
+
476
+
477
+ def main() -> int:
478
+ RESULTS_DIR.mkdir(parents=True, exist_ok=True)
479
+ report = build_report()
480
+ OUT_JSON.write_text(json.dumps(report, indent=2, sort_keys=True), encoding="utf-8")
481
+ OUT_MD.write_text(_render_markdown(report), encoding="utf-8")
482
+ print(f"Wrote {OUT_JSON}")
483
+ print(f"Wrote {OUT_MD}")
484
+ return 0
485
+
486
+
487
+ if __name__ == "__main__":
488
+ raise SystemExit(main())
scripts/slurm/build_paper_table_status.sbatch CHANGED
@@ -16,3 +16,4 @@ cd "$PROJECT_DIR"
16
  mkdir -p outputs/hpc/logs results
17
 
18
  "$PYTHON" scripts/build_paper_table_status.py
 
 
16
  mkdir -p outputs/hpc/logs results
17
 
18
  "$PYTHON" scripts/build_paper_table_status.py
19
+ "$PYTHON" scripts/build_paper_analysis.py