Auto-sync: 2026-06-28 13:38:23 (part 2)
Browse files- results/paper_analysis.json +791 -0
- results/paper_analysis.md +76 -0
- results/paper_core_results.md +6 -0
- results/paper_story_memo.md +8 -2
- scripts/build_paper_analysis.py +488 -0
- scripts/slurm/build_paper_table_status.sbatch +1 -0
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:
|
| 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
|