DynamisLab/docs/HANDOVER_SR_ANALYSIS.md
Frank14f 8e62716ce4 SR Analysis: Phase-state SINDy + ablation study + documentation
Core changes:
- New phase-state features (PHASE_STATE_KEYS, ILLUSION_PHASE_KEYS) with obs dynamics
- Derivative and absolute output modes (output_mode="deriv"|"absolute")
- predict_v23_deriv() with integration support for closed-loop
- Offline multi-step rollout evaluator (eval_rollout.py)

Key results:
- Illusion 0.75L/1L: phase-state+error-state+abs achieves 0.974/0.958 closed-loop
  with zero action history features — proving the new route works
- Karman re100: phase-state+abs reaches 0.699 (vs 0.901 with action history)
- 1.5L confirmed as bang-bang regime (R2=0.12 for linear SINDy)
- Feature ablation: 6-dim phase-state outperforms 16-dim full-lag in closed-loop

Documentation:
- docs/SR_analysis_results.md: comprehensive analysis report
- docs/HANDOVER_SR_ANALYSIS.md: handover notes for next coder
- 6 figures in docs/figures/SR_analysis/
- Updated README.md, sindy_sr_notes.md, sindy_sr_knowledge.md
- Updated configs.py with generalization scenes

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-22 16:55:03 +08:00

4.0 KiB
Raw Blame History

SR Analysis Pipeline — Handover Notes (2026-06-15)

交接人 → 接手人

当前管线状态

模块 状态 说明
Illusion 0.75L + 1L phase-state + abs 已验证 闭环 0.974 / 0.958,无动作历史,可进 PySR
Illusion 1.5L 边界 case bang-bang 机制,线性 SINDy 不适用
Karman phase-state + abs 0.699 优于 deriv 模式,但低于旧 v23 的 0.901
Karman old v23 (a_lag) 0.901 保留作基线对照
Karman 泛化测试 已完成 Re70/150/300/25 约 0.54-0.60
PySR 符号回归 有 shell 需要修复 run_pysr.py 后重新跑
Vortex 偏移扩展 未做 低优先级

核心文件改动2026-06-14~15

文件 改动类型
utils/feature_builder.py 新增 PHASE_STATE_KEYS, ILLUSION_PHASE_KEYS, KARMAN_EXPANDED_KEYS, obs dynamics, error-state, mu_Cl_tot
utils/sindy_fitter.py 新增 compute_action_deriv, get_feature_matrix_deriv(output_mode)
sindy/run_all_v2.py 新增 --deriv, --phase, --karman-expand, --karman-mu, --output-mode, --augment-level CLI
validate/run_closed_loop.py 新增 predict_v23_deriv, mode="abs", load_sindy_coefs返回mode
validate/run_closed_loop_illusion.py 修改 支持 predict_v23_deriv, 自动检测模式
validate/eval_rollout.py 新文件 离线多步 rollout 评估
scripts/plot_sr_results.py 新文件 结果可视化图表
docs/SR_analysis_results.md 新文件 完整分析报告
docs/figures/SR_analysis/fig*.png 新文件 6 张图表

关键设计决策(接手前必读)

  1. phase-state 特征 = u_a, du_a/dt, Cl_tot, dCl_tot/dt, Cd_tot, Cd_rear (6维)
  2. ILLUSION_PHASE_KEYS = phase-state + Cd_err, Cl_err, dCd_err/dt, dCl_err/dt (10维)
  3. 绝对动作输出 output_mode="absolute" 优于导数 "deriv",无积分累积
  4. v23 结构始终默认front no-bias, rear shared-head
  5. 时间一阶导统一除以 dt_c = SAMPLE_INTERVAL/2000,跨场景可比较
  6. controlled.npz 中新加了 target_forces 字段illusion 场景必须有
  7. FIFO bias ≠ DRL action bias1U vs 2U 不要混淆

常用命令速查

# 拟合 + 验证 Illusion phase-state + absolute (完整流程)
conda run -n pycuda_3_10 python src/SR_analysis/sindy/run_all_v2.py \
    --scenes illusion_0.75L,illusion_1L --deriv --phase --output-mode absolute
conda run -n pycuda_3_10 python src/SR_analysis/validate/run_closed_loop_illusion.py \
    --scene illusion_0.75L --device 0 --steps 320 \
    --sindy-results src/SR_analysis/sindy/illusion/sindy_results_deriv.json

# 拟合 + 验证 Karman phase-state + absolute
conda run -n pycuda_3_10 python src/SR_analysis/sindy/run_all_v2.py \
    --scenes karman_re100 --deriv --phase --output-mode absolute
conda run -n pycuda_3_10 python src/SR_analysis/validate/run_closed_loop.py \
    --scene karman_re100 --device 0 --steps 200 --mode abs \
    --sindy-results src/SR_analysis/sindy/karman/sindy_results_deriv.json

# 离线 rollout 评估
python3 src/SR_analysis/validate/eval_rollout.py \
    --sindy-results src/SR_analysis/sindy/karman/sindy_results_deriv.json \
    --scene karman_re100

# PySR (需要先修复滞后的 bug)
conda run -n sr_env python src/SR_analysis/sindy/run_pysr.py --scene illusion_1L

# 画图
python3 scripts/plot_sr_results.py

目前最适合推进的方向

  1. Illusion PySR 符号回归0.75L + 1L separate → 公式比较)
  2. Karman 状态补强(配合 CCD/OID 分析找出缺失的状态量,再回 SR
  3. Karman 跨 Re 联合(在 phase-state + mu 基础上做跨 Re 联合拟合 + 泛化)

注意重新运行 run_pysr.py

当前 run_pysr.py 有路径/导入问题,接手后需先确认:

  • env_srsr_env 环境内的 PySR 可用性
  • whitelist 特征与 controlled.npz 中的字段匹配(特别是 illusion 的 target_forces
  • 滞后构造正确(a_prev[1:] = actions_phys[:-1]