feat(reproduce): legacy-test framework + fixed-inlet reproduce pipeline

- Track A (legacy_test): systematic validation scripts for all trained PPO
  models using LegacyCelerisLab. Each test script rebuilds the exact legacy
  CFD environment, runs deterministic inference, and compares against
  SR_analysis reference data using DTW-based comparison. Verified: Karman
  re100/re50/re200, Vortex lamb/taylor all pass (DTW > 0.95).

- Track B (reproduce): Phase 2 open-loop CFD validation + Phase 3 DRL
  inference using the legacy-compatible config (regularized inlet with
  neq_damp=1.0, matching the legacy NBB formula). The inlet scheme fix
  improves new-CFD Karman DTW from 0.916 to 0.943.

- Fixes: action_wrapper sign convention docstring, model inventory
  duplicate entries and missing models, stale config paths in legacy
  run_all_cases.py/run_illusion_vortex.py, illusion label formatting

- Add READMEs and run-all shell scripts for both tracks
- Add .gitignore entries for runtime output directories

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Frank14f
2026-07-12 23:09:53 +08:00
co-authored by Cursor
parent 4360bb2047
commit f2f88c2442
33 changed files with 3814 additions and 271 deletions
@@ -119,8 +119,10 @@ for re_code, name in [(50, "re50"), (200, "re200"), (400, "re400")]:
})
# -- Illusion (three target diameters) ---------------------------------------
# Inference geometry (matching uni_test): target at x=31*L0, sensors at x=40*L0
# Pinball uses standard geometry (front x=30, rear x=31.3, sensors x=40)
# NOTE: The positions below (sensors at 40*L0, pinball at 30/31.3*L0) are the
# "unified" inference geometry used by CCD_analysis. The actual training
# geometry (legacy_env_imit.py) used sensors at 30*L0 and pinball at 19/20.3*L0.
# phase3_reproduce.py and legacy_test scripts use the TRAINING positions.
def _illusion_base() -> Dict[str, Any]:
return {
"scene_id": "illusion",
@@ -164,7 +166,7 @@ illusion_entries = [
"model": "d1a3o14_250525_imit_1L_2U_600S",
"model_subdir": "250525",
"target_diameter": 1.0 * L0, # 20
"sample_interval": 800, # uni_test used 800 for inference
"sample_interval": 600,
}),
("illusion_15L", {
"model": "d1a3o14_250525_imit_15L_2U",