diff --git a/docs/experiment_round49_gate20.json b/docs/experiment_round49_gate20.json new file mode 100644 index 0000000..0d3f3f1 --- /dev/null +++ b/docs/experiment_round49_gate20.json @@ -0,0 +1,110 @@ +{ + "config": { + "ckpt": "ml/runs/base_dag2_dag1/best.pt", + "samples": "ml/data/samples", + "tasks": null, + "split": "val", + "n": 256, + "K": 8, + "commit": 2, + "fb": 2.2, + "ki": 0.0, + "fb_scale": 0.0, + "fb_near": 0.2, + "fb_fallback": 0.0, + "kdecay": 0.9, + "kimax": 0.5, + "fb_every": 1, + "safety_try": 0, + "sel_w": 0.1, + "dls_safety": 1, + "fb_clear": 0.0, + "fb_cmin": 0.3, + "sub_refresh": 0, + "fb_block_gain": 0.5, + "dump": "ml/runs/round49_gate20_rows.json", + "out": "docs/experiment_round49_gate20.json", + "trace": null, + "select": "pre", + "replan": "empty", + "safety": 1, + "partial": 1, + "inc_cap": 1, + "gap_margin": 0.0, + "cert_batch": 1, + "steps": 1, + "z_scale": 1.0, + "len_w": 0.0, + "tie": 0, + "pre_h": 0, + "pre_near": 20.0, + "backoff": 0, + "max_sec": null, + "seed": 0, + "dls": "analytic", + "device": "cuda" + }, + "batch_size": 256, + "batch_seed_rule": "same seed per batch", + "checkpoint_sha256": "f7f686fd8ee92fb6948fbcc4ee954636065ad87bb54f661c4f8f575bc16c2ce1", + "tasks_sha256": "249bd93457825cda98c59e64d9a096d3473c69aeb3553de1dea6d9e56be71772", + "kin_fp": "2ebcbf17", + "act_scale": 1.0, + "metrics": { + "n": 256, + "n_ref": 256, + "success": 0.53515625, + "collision_free_success": 0.53515625, + "time_ok_1p3": 0.328125, + "collision_rate": 0.0, + "collision_steps_mean": 0.0, + "travel_ratio_median": 2.5145769119262695, + "time_mean_s": 2.3382482528686523, + "brakes_mean": 19.63671875, + "start_fail": 0.0, + "goal_ratio_2s": 0.17014972865581512, + "err_fail_med": 182.09060668945312, + "err_success_med": 0.2248138189315796, + "dls_share": 0.63671875, + "time_budget": "teacher×2(≥3 s)", + "speed_ratio_p50": 1.0000016689300537, + "speed_ratio_p95": 1.0000101327896118, + "speed_ratio_max": 1.0000101327896118, + "over_vmax_rate": 0.0, + "accel_ratio_p95": 1.0000016689300537, + "accel_ratio_max": 1.0000101327896118, + "reverse_p50": 0.24203822016716003, + "reverse_mean": 0.24321714043617249, + "reverse_moving_p50": 0.2936508059501648, + "moving_share_p50": 0.9595959782600403, + "brake_rate_mean": 0.10070113092660904, + "brake_rate_p50": 0.0051282052882015705, + "brake_rate_p90": 0.35384616255760193, + "stuck_share": 0.2421875, + "n_plans_mean": 195.0, + "success_reachable": 0.5637860298156738, + "by_cat": { + "A": [ + 128, + 94 + ], + "B": [ + 74, + 21 + ], + "C": [ + 32, + 14 + ], + "D": [ + 13, + 0 + ], + "Dr": [ + 9, + 8 + ] + } + }, + "simulation_wall_s": 285.5599780000048 +} diff --git a/docs/experiment_round49_gate5.json b/docs/experiment_round49_gate5.json new file mode 100644 index 0000000..10cbb01 --- /dev/null +++ b/docs/experiment_round49_gate5.json @@ -0,0 +1,110 @@ +{ + "config": { + "ckpt": "ml/runs/base_dag2_dag1/best.pt", + "samples": "ml/data/samples", + "tasks": null, + "split": "val", + "n": 256, + "K": 8, + "commit": 2, + "fb": 2.2, + "ki": 0.0, + "fb_scale": 0.0, + "fb_near": 0.2, + "fb_fallback": 0.0, + "kdecay": 0.9, + "kimax": 0.5, + "fb_every": 1, + "safety_try": 0, + "sel_w": 0.1, + "dls_safety": 1, + "fb_clear": 0.0, + "fb_cmin": 0.3, + "sub_refresh": 0, + "fb_block_gain": 0.5, + "dump": "ml/runs/round49_gate5_rows.json", + "out": "docs/experiment_round49_gate5.json", + "trace": null, + "select": "pre", + "replan": "empty", + "safety": 1, + "partial": 1, + "inc_cap": 1, + "gap_margin": 0.0, + "cert_batch": 1, + "steps": 1, + "z_scale": 1.0, + "len_w": 0.0, + "tie": 0, + "pre_h": 0, + "pre_near": 5.0, + "backoff": 0, + "max_sec": null, + "seed": 0, + "dls": "analytic", + "device": "cuda" + }, + "batch_size": 256, + "batch_seed_rule": "same seed per batch", + "checkpoint_sha256": "f7f686fd8ee92fb6948fbcc4ee954636065ad87bb54f661c4f8f575bc16c2ce1", + "tasks_sha256": "249bd93457825cda98c59e64d9a096d3473c69aeb3553de1dea6d9e56be71772", + "kin_fp": "2ebcbf17", + "act_scale": 1.0, + "metrics": { + "n": 256, + "n_ref": 256, + "success": 0.546875, + "collision_free_success": 0.546875, + "time_ok_1p3": 0.33203125, + "collision_rate": 0.0, + "collision_steps_mean": 0.0, + "travel_ratio_median": 2.4217512607574463, + "time_mean_s": 2.3379998207092285, + "brakes_mean": 19.83984375, + "start_fail": 0.0, + "goal_ratio_2s": 0.17014972865581512, + "err_fail_med": 185.13986206054688, + "err_success_med": 0.3768002390861511, + "dls_share": 0.63671875, + "time_budget": "teacher×2(≥3 s)", + "speed_ratio_p50": 1.0000016689300537, + "speed_ratio_p95": 1.0000101327896118, + "speed_ratio_max": 1.0000101327896118, + "over_vmax_rate": 0.0, + "accel_ratio_p95": 1.0000016689300537, + "accel_ratio_max": 1.0000101327896118, + "reverse_p50": 0.23239436745643616, + "reverse_mean": 0.23485617339611053, + "reverse_moving_p50": 0.28134557604789734, + "moving_share_p50": 0.9583333134651184, + "brake_rate_mean": 0.10174278169870377, + "brake_rate_p50": 0.0051282052882015705, + "brake_rate_p90": 0.35384616255760193, + "stuck_share": 0.24609375, + "n_plans_mean": 195.0, + "success_reachable": 0.5761317014694214, + "by_cat": { + "A": [ + 128, + 96 + ], + "B": [ + 74, + 22 + ], + "C": [ + 32, + 14 + ], + "D": [ + 13, + 0 + ], + "Dr": [ + 9, + 8 + ] + } + }, + "simulation_wall_s": 332.8420308999921 +} diff --git a/docs/探索日志.md b/docs/探索日志.md index 41b3b59..b9584eb 100644 --- a/docs/探索日志.md +++ b/docs/探索日志.md @@ -113,6 +113,30 @@ - **对 `backoff` 的预期与判据**:全拒意味着"连第 1 步的端点或中点已经穿进障碍",缩步能不能救取决于**穿得有多深**(穿 0.1 mm 救得回,穿 3 mm 救不回)。这个数转储里没记(只记被选中那条),所以直接由 `backoff_mean`/`reject_all_mean` 来量: `reject_all_mean ≈ 原全拒次数`(=backoff_mean+brakes_mean,与轮次 33 cap 的 19.55 可比),`backoff_mean/(backoff_mean+brakes_mean)` 就是"缩步能救回的比例"。这是补跑(#22)要读的第一个数。 +## 轮次 49:#31 门控地平线成立——终端段盖到 20 mm 时,时限收益与精度代价被解耦(预注册判据由该臂满足) + +- **假设(由轮次 48 的四点曲线给出,不是拍脑袋)**:时限收益来自"打分地平线 = 执行地平线",精度代价来自"近终段没有终端代价"。两件事若真能分开,就应该存在一个终端段长度,使得短前瞻的时限收益基本不损、而末态误差回到控制水平。 +- **做法**:`select=pre --pre_near `——当前误差 ≤ 阈值时打分改用**整条地平线**末端,远端仍用提交窗口点。多一次 `goal_err(B×K 点)` 只在门控口径下发生。 +- **四列对照(全部 seed=0、同配方同批;控制=`round45_tie0`,pre=`round46_pre256`)**: + + | 读数 | 控制 h=16 | `pre` h=2 | 门控 5 mm | 门控 20 mm | + |---|---|---|---|---| + | 到达 | 0.5234 | 0.5430 | **0.5469** | 0.5352 | + | 时限内(≤1.3×老师) | 0.2656 | **0.3320** | **0.3320** | 0.3281 | + | 2 s 误差比 | 0.2792 | 0.1702 | 0.1702 | 0.1702 | + | 到达题末态误差中位 | 0.2175 | 0.4151 | 0.3768 | **0.2248** | + | 行程比中位 | 2.6158 | 2.4449 | **2.4218** | 2.5146 | + | 刹停/题 | 19.55 | 19.84 | 19.84 | 19.64 | + | 执行碰撞 / 超 VMAX | 0 / 0 | 0 / 0 | **0 / 0** | **0 / 0** | + | `n_plans_mean` | 195.0 | 195.0 | 195.0 | 195.0 | + +- **逐题配对(vs 控制)**:到达 门控5 赢 16 丢 10(净 +6,p=0.327)、门控20 赢 13 丢 10(净 +3,p=0.678)、`pre` 净 +5(p=0.424)⇒ **到达率在这条轴上任何一点都没跨过显著**。到达题组内的末态误差符号检验才是分界:`pre` 82 差/42 好 **p=4.2e−4**、门控 5 mm 79/45 **p=0.0029**(仍显著变差)、门控 20 mm 67/57 **p=0.42 ⇒ 与控制不可分**。 +- **预注册判据的落点**(规则在看到数据前写在 `ml/runs/_r49_gate.sh`):成立 = `err_success_med` 回到接近控制(≈0.22 mm) 且 `time_ok ≥ 0.31`。**门控 20 mm 两条都满足**(0.2248、0.3281)⇒ 假设成立。门控 5 mm 只满足时限一半都不到(0.3768 仍显著差)⇒ 不成立。 +- **5→20 mm 的分级响应是机理证据,不是调参**:终端段太窄(5 mm ≈ 最后一两步)只回收 20% 的精度差,20 mm(≈ 最后 3–5 步)才回收全部。⇒ 病名的正确写法是**"终端代价的作用区间不够长"**,而不是"缺终端代价"。这也说明 `pre` 的精度损失不是"打分变笨"的随机副作用,而是近终段路径选择被 2 步口径主导的直接后果。 +- **两条臂各自的代价(不许只报好的那半)**:门控 20 mm 把 A 类到达打到 **94/128**(控制 96、门控5 也是 96),换来精度归零;门控 5 mm 到达最高 0.5469 且行程比最好(2.4218),但末态误差仍显著变差。⇒ **不存在同时占优的阈值**,本轮只证明"可解耦",不证明"已找到最优点"。 +- **口径纪律**:不改为默认。§9.2 的"时限内"最好读数现在是 **0.3320(pre h=2 / 门控5)**,"到达"最好读数是 **0.5469(门控5)**——两者都还没显著超过控制,所以验收栏仍写控制的 0.5234/0.2656,另注可选口径。 +- **下一步(唯一还没做的关键检验)**:门控 20 mm 在 seed=1 复现(控制臂 `round47_ep_s1` 已在盘 ⇒ 只需一条臂)。若 p=0.42 那个"与控制不可分"变成"显著变差",本轮结论降级为"阈值恰好躲过一次复现"。 + ## 轮次 48:#30 打分地平线四点曲线——进度收益是剂量-反应关系,而精度代价只集中在 h≤4;h=8 是个坏点 - **设计**:`select=pre` 加 `--pre_h`(0=commit_n)。同 seed=0、同配方(`K=8/commit_n=2/fb=2.2/inc_cap=1/cert_batch=1`),只改打分取 `fut` 的第几步。h=2 与 h=16 两点已在盘(轮次 46 / 45,且控制臂已证跨窗口逐位复现),本轮补 **h=4、h=8**。