refactor(oid): lightweight reorganization — PIPELINE.md, scene_registry.json, move papers
- Move Sch12.md, Li22b.md → papers/ (reference papers, not code docs) - Add PIPELINE.md — pipeline overview, scene table, conventions, quick commands - Add scene_registry.json — machine-readable index (from configs.py + master_table.json) - Rewrite README.md — lean entry point with file map + core results table Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
parent
1835f517e9
commit
44f7687509
132
src/OID_analysis/PIPELINE.md
Normal file
132
src/OID_analysis/PIPELINE.md
Normal file
@ -0,0 +1,132 @@
|
|||||||
|
# OID Analysis Pipeline
|
||||||
|
|
||||||
|
Observable-Inferred Decomposition (Schlegel et al. 2012) applied to correction fields of DRL-controlled fluidic pinball flows. Identifies which flow structures best predict forces and downstream sensor signatures, across 5 control tasks: steady cloak, Karman cloak, illusion at 0.75L/1.0L/1.5L target diameters.
|
||||||
|
|
||||||
|
## Pipeline Overview
|
||||||
|
|
||||||
|
```
|
||||||
|
Raw fields (GPU, pycuda_3_10) Analysis (CPU, sr_env)
|
||||||
|
═══════════════════════════════ ════════════════════════
|
||||||
|
|
||||||
|
scripts/collect_*.py analysis/phase*.py
|
||||||
|
│ │
|
||||||
|
├── empty_channel ─── q_in ─────────┐ │
|
||||||
|
├── pinball_baseline ─ q_blk ───────┤ │
|
||||||
|
└── controlled ─────── q_ctl ───────┤ │
|
||||||
|
▼ ▼
|
||||||
|
┌─────────────────────────────┐
|
||||||
|
│ Phase 1: Δq_ctl = q_ctl−q_blk│
|
||||||
|
│ → correction-field POD │
|
||||||
|
│ → rank sensitivity (6-16) │
|
||||||
|
└─────────────┬───────────────┘
|
||||||
|
▼
|
||||||
|
┌─────────────────────────────┐
|
||||||
|
│ Phase 2: observable Y build │
|
||||||
|
│ force_total, sensor_error, │
|
||||||
|
│ sensor_error_delayed │
|
||||||
|
└─────────────┬───────────────┘
|
||||||
|
▼
|
||||||
|
┌──────────────────────┴──────────────────────┐
|
||||||
|
▼ ▼
|
||||||
|
┌──────────────────────┐ ┌──────────────────────┐
|
||||||
|
│ Phase 3: Force-OID │ │ Phase 4: Signature-OID│
|
||||||
|
│ Y = force_total │ │ Y = delayed sensor err│
|
||||||
|
│ SVD(C_AY) → U_f │ │ SVD(C_AY) → U_s │
|
||||||
|
└──────────┬───────────┘ └──────────┬───────────┘
|
||||||
|
│ │
|
||||||
|
└──────────────┬───────────────────────────┘
|
||||||
|
▼
|
||||||
|
┌──────────────────────────┐
|
||||||
|
│ Phase 5: Steady OID │
|
||||||
|
│ (suppression / mean-wake) │
|
||||||
|
└──────────────┬───────────┘
|
||||||
|
▼
|
||||||
|
┌──────────────────────────┐
|
||||||
|
│ Phase 6: POD vs OID vs PCD│
|
||||||
|
│ 70/30 R² comparison │
|
||||||
|
└──────────────┬───────────┘
|
||||||
|
▼
|
||||||
|
┌──────────────────────────┐
|
||||||
|
│ Phase 7: White-box chain │
|
||||||
|
│ obs→act / OID→act / ... │
|
||||||
|
└──────────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
## Scene Table
|
||||||
|
|
||||||
|
| Scene Key | Inflow | Controlled | Dist Cyl? | Sensors | Pinball X | SI | S_DIM |
|
||||||
|
|-----------|--------|-----------|:---:|--------|-----------|:---:|:---:|
|
||||||
|
| steady_cloak | Parabolic | Open-loop const ±5.1U0 | No | x=40 | 30/31.3 | 800 | 12 |
|
||||||
|
| karman_re100 | Parabolic + vor-tex street | PPO d1a3o12_re100 | Yes | x=40 | 30/31.3 | 800 | 12 |
|
||||||
|
| illusion_0.75L | Parabolic | PPO d1a3o14_075L_2U_400S | No | x=30 | 19/20.3 | 400 | 14 |
|
||||||
|
| illusion_1.0L | Parabolic | PPO d1a3o14_1L_2U_600S | No | x=30 | 19/20.3 | 600 | 14 |
|
||||||
|
| illusion_1.5L | Parabolic | PPO d1a3o14_15L_2U | No | x=30 | 19/20.3 | 800 | 14 |
|
||||||
|
|
||||||
|
Action biases: cloak [0,−4,4], illusion [0,−2,2]. Action scale: 8 for all.
|
||||||
|
|
||||||
|
## Quick Commands
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Full collection (GPU, ~1-2 hours per scene group)
|
||||||
|
conda run -n pycuda_3_10 python src/OID_analysis/scripts/collect_all_data.py
|
||||||
|
|
||||||
|
# Full analysis for one scene (CPU, ~5 min)
|
||||||
|
PYTHONPATH="src:$PYTHONPATH" conda run -n sr_env python3 \
|
||||||
|
src/OID_analysis/analysis/run_full_analysis.py --scene karman_re100
|
||||||
|
|
||||||
|
# Robustness + figures
|
||||||
|
PYTHONPATH="src:$PYTHONPATH" conda run -n sr_env python3 \
|
||||||
|
src/OID_analysis/analysis/robustness_analysis.py
|
||||||
|
PYTHONPATH="src:$PYTHONPATH" conda run -n sr_env python3 \
|
||||||
|
src/OID_analysis/analysis/make_figures.py
|
||||||
|
```
|
||||||
|
|
||||||
|
## Key Conventions
|
||||||
|
|
||||||
|
| Convention | Rule |
|
||||||
|
|-----------|------|
|
||||||
|
| Re definition | Code Re uses 2D reference (=40). Physical Re_D = Re_code/2. Default: Re_code=100 → Re_D=50. |
|
||||||
|
| OID object | Always `Δq_ctl = q_ctl − q_blk`, NOT raw `q_ctl`. |
|
||||||
|
| Field storage | Full 1280×512 resolution. ROI mask applied ONLY at analysis stage (POD). |
|
||||||
|
| force-OID vs sig-OID | Reported separately. Their divergence is a mechanism result, not a failure. |
|
||||||
|
| Illusion q_blk | Uses separate geometry (pinball_x=19/20.3, sensor_x=30), NOT cloak q_blk. |
|
||||||
|
| Norm | Data-driven (force_norm_fact = 6·max|forces|, sens_norm = 5·max|sensor−mean|). Model-specific. |
|
||||||
|
| GPU | Karman on device 1, steady/illusion on device 3. Fresh context per scene. |
|
||||||
|
| Environment split | `pycuda_3_10` for GPU collection, `sr_env` for CPU analysis. |
|
||||||
|
|
||||||
|
## Where Results Live
|
||||||
|
|
||||||
|
```
|
||||||
|
data/derived/
|
||||||
|
├── pod/{scene}/ Phase 1: POD modes + coefficients
|
||||||
|
├── observables/{scene}/ Phase 2: Y matrices
|
||||||
|
├── oid/force/{scene}/ Phase 3: force-OID (U, S, z, modes)
|
||||||
|
├── oid/signature/{scene}/ Phase 4: sig-OID (delayed + current)
|
||||||
|
├── oid/pcd/{scene}/ Phase 4b: sig-PCD (whitened)
|
||||||
|
├── comparison/{scene}.json Phase 6: POD-vs-OID R² tables
|
||||||
|
├── whitebox/{scene}.json Phase 7: action prediction R²
|
||||||
|
├── robustness/ Rank/tau_c/window sensitivity
|
||||||
|
├── master/master_table.json Cross-scene canonical values
|
||||||
|
└── figures/ All 7 figures (PNG)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Adding a New Scene
|
||||||
|
|
||||||
|
1. Register in `configs.py`: add scene dict with physics, geometry, control params
|
||||||
|
2. Collect fields: write GPU script (or use generic `collect_controlled.py` for PPO)
|
||||||
|
3. Run pipeline: `run_full_analysis.py --scene <new_scene> --force`
|
||||||
|
4. Update `master_table.json` with new overlap/R² values
|
||||||
|
5. Regenerate figures: `make_figures.py`
|
||||||
|
|
||||||
|
## Companion Documents
|
||||||
|
|
||||||
|
| File | Role |
|
||||||
|
|------|------|
|
||||||
|
| `OID_knowledge.md` | Hard rules, confirmed facts, full results table, bug history |
|
||||||
|
| `OID_notes.md` | Task tracking, open items, handover notes |
|
||||||
|
| `Final_Conclusions.md` | Six key questions answered |
|
||||||
|
| `README.md` | Entry point — scope, file map, pitfalls |
|
||||||
|
| `papers/Sch12.md` | Schlegel et al. (2012) — OID original paper |
|
||||||
|
| `papers/Li22b.md` | Li et al. (2022) — pinball state estimation paper |
|
||||||
|
| `docs/sch12_code_mapping.md` | Sch12 formula → code traceability |
|
||||||
|
| `docs/OID_analysis_results.md` | External report — methods, 7 figures, all results |
|
||||||
@ -1,173 +1,85 @@
|
|||||||
# OID_analysis: Observable-Inferred Decomposition for Fluidic Pinball Control
|
# OID_analysis — Observable-Inferred Decomposition for Fluidic Pinball
|
||||||
|
|
||||||
## What this directory does
|
Identifies which correction-field structures the DRL controller modulates, ranked by cross-correlation with force and signature observables (not by POD energy).
|
||||||
|
|
||||||
This directory implements an **OID (Observable-Inferred Decomposition)** pipeline for analyzing which flow structures the DRL controller actually modulates in the fluidic pinball experiments. OID ranks modes by cross-correlation with a chosen observable (force, sensor error), rather than by fluctuation energy (POD).
|
## Quick Start
|
||||||
|
|
||||||
**The three companion documents:**
|
```bash
|
||||||
- `OID_knowledge.md` -- confirmed facts, hard rules, critical caveats, **current results**
|
# Read first: PIPELINE.md pipeline overview, scene table, conventions
|
||||||
- `OID_notes.md` -- execution plan, task tracking, handover notes
|
# Deep dive: OID_knowledge.md rules, results table, bug history
|
||||||
- This file (README.md) -- engineering entry point, how to run
|
# Tasks: OID_notes.md open items, handover
|
||||||
|
# Conclusions: Final_Conclusions.md six key questions answered
|
||||||
|
|
||||||
**Critical reading order for new agent:**
|
# Run (from repo root):
|
||||||
1. `docs/OID_analysis_results.md` -- full project report (start here)
|
PYTHONPATH="src:$PYTHONPATH" conda run -n sr_env python3 \
|
||||||
2. README.md (this file) -- understand scope and how to run
|
src/OID_analysis/analysis/run_full_analysis.py --scene karman_re100 --force
|
||||||
3. `OID_knowledge.md` -- know the rules, the results, and pitfalls
|
```
|
||||||
4. `OID_notes.md` -- understand what's left to do
|
|
||||||
|
|
||||||
---
|
## File Map
|
||||||
|
|
||||||
## Current scope (as of 2026-06-28)
|
|
||||||
|
|
||||||
**All 5 scenes analyzed end-to-end:**
|
|
||||||
|
|
||||||
| Scene | Type | Source | Status |
|
|
||||||
|-------|------|--------|--------|
|
|
||||||
| steady_cloak | Open-loop constant rotation (rear=+-5.1U0) | Collected | Full Phases 1-7 |
|
|
||||||
| karman_re100 | PPO (d1a3o12_re100) | Replayed from CCD | Full Phases 1-7 |
|
|
||||||
| illusion_0.75L | PPO (d1a3o14_075L_2U_400S) | Replayed from CCD | Full Phases 1-7 |
|
|
||||||
| illusion_1.0L | PPO (d1a3o14_1L_2U_600S) | Replayed from CCD | Full Phases 1-7 |
|
|
||||||
| illusion_1.5L | PPO (d1a3o14_15L_2U) | Replayed from CCD | Full Phases 1-7 |
|
|
||||||
|
|
||||||
**Fixed scope notes (inherited from SR/CCD):**
|
|
||||||
- All illusion models use **u0=0.01, nu=0.004** (standard defaults from config_flowfield.json)
|
|
||||||
- "2U" in model name means **S_DIM=14** (2 extra target force observations), NOT 2x velocity
|
|
||||||
- SAMPLE_INTERVAL depends on target diameter: 0.75L=400, 1.0L=600, 1.5L=800
|
|
||||||
- Illusion q_blk was collected **separately** from cloak-position q_blk (different geometry)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Directory structure
|
|
||||||
|
|
||||||
```
|
```
|
||||||
src/OID_analysis/
|
src/OID_analysis/
|
||||||
configs.py # Unified scene metadata (12 scene definitions)
|
├── PIPELINE.md ← START HERE — overview, scene table, conventions
|
||||||
utils/
|
├── OID_knowledge.md hard rules, full results, bugs
|
||||||
cfd_interface.py # Re-exports CCD's proven CFD interface
|
├── OID_notes.md task tracking, open items
|
||||||
analysis.py # CPU-only: POD, OID, PCD, zone statistics, comparison
|
├── Final_Conclusions.md six key questions answered
|
||||||
scripts/
|
├── scene_registry.json machine-readable scene index + canonical values
|
||||||
collect_*.py # Data collection scripts (GPU, pycuda_3_10)
|
├── configs.py single source of truth: 13 scene definitions
|
||||||
replay_*.py # Field replay + verification
|
│
|
||||||
compute_delta_fields.py # Phase 0 draft
|
├── utils/ core library (CPU, no GPU dependency)
|
||||||
analysis/
|
│ ├── analysis.py POD, force-OID, sig-OID, PCD, zone stats
|
||||||
phase*.py # Analysis scripts Phases 1-7 (CPU, sr_env)
|
│ └── cfd_interface.py re-exports from CCD_analysis
|
||||||
robustness_analysis.py # Rank/tau_c/window/zone robustness
|
│
|
||||||
steady_reanalysis.py # Steady cloak suppression metrics
|
├── scripts/ GPU data collection (pycuda_3_10 env)
|
||||||
compile_master_table.py # Cross-scene comparison
|
│ ├── collect_empty_channel.py / collect_pinball_baseline.py
|
||||||
make_figures.py # Generate 7 figures
|
│ ├── collect_karman_blk.py / collect_disturbance_only.py
|
||||||
run_full_analysis.py # Batch pipeline runner
|
│ ├── collect_controlled.py / collect_steady_cloak.py
|
||||||
data/
|
│ ├── collect_illusion_qblk.py / collect_target_cylinder.py
|
||||||
configs/legacy/ # Legacy CFD configs (symlinked)
|
│ ├── collect_all_data.py batch orchestrator
|
||||||
steady_cloak/ # Baseline + controlled fields
|
│ └── replay_full_fields.py full-field PPO replay
|
||||||
karman_cloak/ # Baseline + controlled fields
|
│
|
||||||
illusion/ # PPO controlled fields
|
├── analysis/ CPU analysis pipeline (sr_env)
|
||||||
target_cylinder/ # Reference targets
|
│ ├── phase1_correction_pod.py → phase7_whitebox.py (7 phases)
|
||||||
derived/ # All analysis results + figures
|
│ ├── robustness_analysis.py / steady_reanalysis.py
|
||||||
OID_knowledge.md # Knowledge base
|
│ ├── compile_master_table.py / make_figures.py
|
||||||
OID_notes.md # Task tracking
|
│ └── run_full_analysis.py batch runner
|
||||||
Final_Conclusions.md # Six-question conclusions
|
│
|
||||||
Sch12.md # OID reference paper
|
├── data/ raw collected data (NOT committed)
|
||||||
|
│ ├── steady_cloak/ q_in, q_blk, q_ctl
|
||||||
docs/
|
│ ├── karman_cloak/ q_in, q_blk, q_ctl
|
||||||
OID_analysis_results.md # Full project report (7 figures, 292 lines)
|
│ ├── illusion/ q_ctl (3 diameters)
|
||||||
|
│ ├── target_cylinder/ reference targets
|
||||||
|
│ └── derived/ all computed results + 7 figures
|
||||||
|
│
|
||||||
|
├── papers/ reference papers
|
||||||
|
│ ├── Sch12.md OID original paper
|
||||||
|
│ └── Li22b.md pinball state estimation paper
|
||||||
|
├── docs/
|
||||||
|
│ └── sch12_code_mapping.md Sch12 formula → code traceability
|
||||||
|
├── tests/ unit tests (7/7 pass)
|
||||||
|
└── archive/ deprecated files
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
## Core Results (one table)
|
||||||
|
|
||||||
## How to run
|
| Finding | Key Value | Confidence |
|
||||||
|
|---------|-----------|------------|
|
||||||
|
| Force-sig monotonic separation | +0.763 → -0.034 → -0.082 → -0.495 → -0.932 | High |
|
||||||
|
| OID beats POD (force prediction) | R²=0.44-0.75 (OID) vs -2.4~0.42 (POD) | High |
|
||||||
|
| OID beats POD (sig prediction) | R²=0.32-0.66 (OID) vs -0.16~0.06 (POD) | High |
|
||||||
|
| Action orthogonal to force+sig | |overlap|<0.33 across all scenes | Confirmed |
|
||||||
|
| Steady cloak RMS reduction | 99.4% | High |
|
||||||
|
| Li22b cross-map | modes 0-5 diagonal 0.81-0.98 | Verified |
|
||||||
|
| SR validation | OID z1 ↔ Cl_tot r=-0.82 | Verified |
|
||||||
|
|
||||||
All commands from repo root (`/home/frank14f/DynamisLab`).
|
Full numbers: `data/derived/master/master_table.json` · `scene_registry.json`
|
||||||
|
|
||||||
### Data collection (GPU, pycuda_3_10)
|
## Pitfalls
|
||||||
|
|
||||||
```bash
|
1. OID operates on **Δq_ctl = q_ctl − q_blk**, not raw q_ctl.
|
||||||
# Steady group:
|
2. **force-OID and sig-OID reported separately** — divergence is a mechanism result.
|
||||||
conda run -n pycuda_3_10 python src/OID_analysis/scripts/collect_empty_channel.py --device 3 --steps 200
|
3. **Illusion q_blk uses separate geometry** (pinball_x=19/20.3, sensor_x=30).
|
||||||
conda run -n pycuda_3_10 python src/OID_analysis/scripts/collect_pinball_baseline.py --device 3 --steps 500
|
4. Fields stored at **full 1280×512**; ROI mask applied only at analysis stage.
|
||||||
conda run -n pycuda_3_10 python src/OID_analysis/scripts/collect_steady_cloak.py --device 3 --steps 500 --omega-rear 5.1
|
5. GPU: Karman on device 1, steady/illusion on device 3.
|
||||||
|
6. Conda: `pycuda_3_10` for GPU, `sr_env` for CPU analysis.
|
||||||
# Karman group:
|
7. "2U" in model name = S_DIM=14, NOT 2× velocity.
|
||||||
conda run -n pycuda_3_10 python src/OID_analysis/scripts/collect_disturbance_only.py --device 1 --steps 500
|
|
||||||
conda run -n pycuda_3_10 python src/OID_analysis/scripts/collect_karman_blk.py --device 1 --steps 500
|
|
||||||
|
|
||||||
# Illusion q_blk (important: separate geometry from cloak):
|
|
||||||
conda run -n pycuda_3_10 python src/OID_analysis/scripts/collect_illusion_qblk.py --device 3 --steps 500
|
|
||||||
|
|
||||||
# PPO field replay (from CCD checkpoints):
|
|
||||||
conda run -n pycuda_3_10 python src/OID_analysis/scripts/replay_full_fields.py --scene karman_re100 --device 1
|
|
||||||
conda run -n pycuda_3_10 python src/OID_analysis/scripts/replay_full_fields.py --scene illusion_1.0L --device 3
|
|
||||||
|
|
||||||
# Target cylinders:
|
|
||||||
conda run -n pycuda_3_10 python src/OID_analysis/scripts/collect_target_cylinder.py --diameter 1.0 --device 3 --steps 500
|
|
||||||
```
|
|
||||||
|
|
||||||
### Analysis (CPU only, sr_env)
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Full pipeline for one scene:
|
|
||||||
cd /home/frank14f/DynamisLab
|
|
||||||
PYTHONPATH="src:$PYTHONPATH" conda run -n sr_env python3 src/OID_analysis/analysis/run_full_analysis.py --scene karman_re100
|
|
||||||
|
|
||||||
# Robustness analysis:
|
|
||||||
PYTHONPATH="src:$PYTHONPATH" conda run -n sr_env python3 src/OID_analysis/analysis/robustness_analysis.py
|
|
||||||
|
|
||||||
# Generate figures:
|
|
||||||
PYTHONPATH="src:$PYTHONPATH" conda run -n pycuda_3_10 python3 src/OID_analysis/analysis/make_figures.py
|
|
||||||
|
|
||||||
# Cross-scene table:
|
|
||||||
PYTHONPATH="src:$PYTHONPATH" conda run -n sr_env python3 src/OID_analysis/analysis/compile_master_table.py
|
|
||||||
```
|
|
||||||
|
|
||||||
### Replay verification
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Replay verification is now integrated into collect_fields_replay.py (archived) and replay_full_fields.py
|
|
||||||
# Use replay_full_fields.py for full-field (uncropped) replay with new CelerisLab
|
|
||||||
conda run -n pycuda_3_10 python src/OID_analysis/scripts/replay_full_fields.py --scene karman_re100 --device 2
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Key results
|
|
||||||
|
|
||||||
| Finding | Evidence | Confidence |
|
|
||||||
|---------|----------|------------|
|
|
||||||
| Force-sig structures systematically separate across tasks | Monotonic trend: +0.763 -> -0.034 -> -0.082 -> -0.495 -> -0.932 | High (rank-stable for 4/5 scenes) |
|
|
||||||
| OID beats POD for force prediction | OID R2=0.435-0.750 vs POD R2=-2.4 to 0.418 | High |
|
|
||||||
| OID beats POD for signature prediction | OID R2=0.315-0.661 vs POD R2=-0.16 to 0.06 | High |
|
|
||||||
| OID coordinates != control state | force-OID->act R2=0.225 vs obs->act R2=0.956 | Confirmed (expected design) |
|
|
||||||
| Steady cloak suppresses 99.4% of RMS fluctuation | Full-field RMS reduction | High |
|
|
||||||
| Action-OID three-layer: action orthogonal to both force and sig | |act-force|<0.33, |act-sig|<0.40 across all scenes | High — confirms Li22b insight that b must be explicit input |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Common pitfalls (read these before making changes)
|
|
||||||
|
|
||||||
1. **Always use model name as single source of truth.** "2U" = S_DIM=14, NOT 2x velocity. u0 is ALWAYS 0.01.
|
|
||||||
2. **NEVER use nu_from_re() for illusion models.** Only valid for standard S_DIM=12 cases.
|
|
||||||
3. **Distinguish action_bias from preset_action.** They are DIFFERENT. action_bias is for DRL scaling; preset_action is for FIFO warmup.
|
|
||||||
4. **context.push()/pop() around every run() call.** Mandatory for multi-step loops.
|
|
||||||
5. **Fresh GPU per PPO scene.** GPU state contamination degrades similarity. Minimum 4NX/U0 steps separation between scenes on the same GPU.
|
|
||||||
6. **No field cropping.** All fields must be full 1280x512 resolution.
|
|
||||||
7. **Three-field decomposition is MANDATORY.** OID operates on Delta-q_ctl = q_ctl - q_blk, NOT on raw q_ctl.
|
|
||||||
8. **OID identifies directions within the chosen POD subspace.** It CANNOT recover structures truncated by POD rank reduction.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Delivered files (non-data)
|
|
||||||
|
|
||||||
These files should be committed to the repository:
|
|
||||||
|
|
||||||
**Code (src/OID_analysis/):**
|
|
||||||
- `configs.py`, `utils/cfd_interface.py`, `utils/analysis.py`
|
|
||||||
- `scripts/` (11 collection + 3 replay scripts)
|
|
||||||
- `analysis/` (7 phase scripts + robustness + figures + batch runner)
|
|
||||||
- `OID_knowledge.md`, `OID_notes.md`, `Final_Conclusions.md`
|
|
||||||
|
|
||||||
**Report (docs/):**
|
|
||||||
- `docs/OID_analysis_results.md`
|
|
||||||
|
|
||||||
**Large data files (NOT committed -- see .gitignore):**
|
|
||||||
- All `.npz` in `data/`
|
|
||||||
- All `.npy` in `data/derived/`
|
|
||||||
- All `.png` in `data/derived/figures/`
|
|
||||||
|
|||||||
306
src/OID_analysis/scene_registry.json
Normal file
306
src/OID_analysis/scene_registry.json
Normal file
@ -0,0 +1,306 @@
|
|||||||
|
{
|
||||||
|
"scenes": {
|
||||||
|
"empty_channel": {
|
||||||
|
"scene_id": "empty_channel",
|
||||||
|
"re_code": 100,
|
||||||
|
"has_disturbance": false,
|
||||||
|
"sample_interval": 800,
|
||||||
|
"source": "open_loop",
|
||||||
|
"n_objects_env": 3,
|
||||||
|
"s_dim": 12,
|
||||||
|
"a_dim": 3,
|
||||||
|
"sensor_x": 40.0,
|
||||||
|
"pinball_front_x": 30.0,
|
||||||
|
"pinball_rear_x": 31.3,
|
||||||
|
"action_scale": 8.0,
|
||||||
|
"action_bias": [
|
||||||
|
0.0,
|
||||||
|
-4.0,
|
||||||
|
4.0
|
||||||
|
],
|
||||||
|
"u0": 0.01,
|
||||||
|
"target_type": "steady"
|
||||||
|
},
|
||||||
|
"pinball_baseline": {
|
||||||
|
"scene_id": "pinball_baseline",
|
||||||
|
"re_code": 100,
|
||||||
|
"has_disturbance": false,
|
||||||
|
"sample_interval": 800,
|
||||||
|
"source": "open_loop",
|
||||||
|
"n_objects_env": 6,
|
||||||
|
"s_dim": 12,
|
||||||
|
"a_dim": 3,
|
||||||
|
"sensor_x": 40.0,
|
||||||
|
"pinball_front_x": 30.0,
|
||||||
|
"pinball_rear_x": 31.3,
|
||||||
|
"action_scale": 8.0,
|
||||||
|
"action_bias": [
|
||||||
|
0.0,
|
||||||
|
-4.0,
|
||||||
|
4.0
|
||||||
|
],
|
||||||
|
"u0": 0.01,
|
||||||
|
"target_type": "periodic"
|
||||||
|
},
|
||||||
|
"pinball_baseline_illusion": {
|
||||||
|
"scene_id": "pinball_baseline_illusion",
|
||||||
|
"re_code": 100,
|
||||||
|
"has_disturbance": false,
|
||||||
|
"sample_interval": 800,
|
||||||
|
"source": "open_loop",
|
||||||
|
"n_objects_env": 6,
|
||||||
|
"s_dim": 12,
|
||||||
|
"a_dim": 3,
|
||||||
|
"sensor_x": 30.0,
|
||||||
|
"pinball_front_x": 19.0,
|
||||||
|
"pinball_rear_x": 20.3,
|
||||||
|
"action_scale": 8.0,
|
||||||
|
"action_bias": [
|
||||||
|
0.0,
|
||||||
|
-2.0,
|
||||||
|
2.0
|
||||||
|
],
|
||||||
|
"u0": 0.01,
|
||||||
|
"target_type": "periodic"
|
||||||
|
},
|
||||||
|
"disturbance_only": {
|
||||||
|
"scene_id": "disturbance_only",
|
||||||
|
"re_code": 100,
|
||||||
|
"has_disturbance": true,
|
||||||
|
"sample_interval": 800,
|
||||||
|
"source": "open_loop",
|
||||||
|
"n_objects_env": 4,
|
||||||
|
"s_dim": 12,
|
||||||
|
"a_dim": 3,
|
||||||
|
"sensor_x": 40.0,
|
||||||
|
"pinball_front_x": 30.0,
|
||||||
|
"pinball_rear_x": 31.3,
|
||||||
|
"action_scale": 8.0,
|
||||||
|
"action_bias": [
|
||||||
|
0.0,
|
||||||
|
-4.0,
|
||||||
|
4.0
|
||||||
|
],
|
||||||
|
"u0": 0.01,
|
||||||
|
"target_type": "periodic"
|
||||||
|
},
|
||||||
|
"karman_blk": {
|
||||||
|
"scene_id": "karman_blk",
|
||||||
|
"re_code": 100,
|
||||||
|
"has_disturbance": true,
|
||||||
|
"sample_interval": 800,
|
||||||
|
"source": "open_loop",
|
||||||
|
"n_objects_env": 7,
|
||||||
|
"s_dim": 12,
|
||||||
|
"a_dim": 3,
|
||||||
|
"sensor_x": 40.0,
|
||||||
|
"pinball_front_x": 30.0,
|
||||||
|
"pinball_rear_x": 31.3,
|
||||||
|
"action_scale": 8.0,
|
||||||
|
"action_bias": [
|
||||||
|
0.0,
|
||||||
|
-4.0,
|
||||||
|
4.0
|
||||||
|
],
|
||||||
|
"u0": 0.01,
|
||||||
|
"target_type": "periodic"
|
||||||
|
},
|
||||||
|
"steady_cloak": {
|
||||||
|
"scene_id": "steady_cloak",
|
||||||
|
"re_code": 100,
|
||||||
|
"has_disturbance": false,
|
||||||
|
"sample_interval": 800,
|
||||||
|
"source": "open_loop",
|
||||||
|
"n_objects_env": 6,
|
||||||
|
"s_dim": 12,
|
||||||
|
"a_dim": 3,
|
||||||
|
"sensor_x": 40.0,
|
||||||
|
"pinball_front_x": 30.0,
|
||||||
|
"pinball_rear_x": 31.3,
|
||||||
|
"action_scale": 8.0,
|
||||||
|
"action_bias": [
|
||||||
|
0.0,
|
||||||
|
-4.0,
|
||||||
|
4.0
|
||||||
|
],
|
||||||
|
"u0": 0.01,
|
||||||
|
"target_type": "steady"
|
||||||
|
},
|
||||||
|
"karman_re100": {
|
||||||
|
"scene_id": "karman",
|
||||||
|
"re_code": 100,
|
||||||
|
"has_disturbance": true,
|
||||||
|
"sample_interval": 800,
|
||||||
|
"source": "PPO_inference",
|
||||||
|
"n_objects_env": 7,
|
||||||
|
"s_dim": 12,
|
||||||
|
"a_dim": 3,
|
||||||
|
"sensor_x": 40.0,
|
||||||
|
"pinball_front_x": 30.0,
|
||||||
|
"pinball_rear_x": 31.3,
|
||||||
|
"action_scale": 8.0,
|
||||||
|
"action_bias": [
|
||||||
|
0.0,
|
||||||
|
-4.0,
|
||||||
|
4.0
|
||||||
|
],
|
||||||
|
"u0": 0.01,
|
||||||
|
"target_type": "periodic"
|
||||||
|
},
|
||||||
|
"illusion_0.75L": {
|
||||||
|
"scene_id": "illusion",
|
||||||
|
"re_code": 100,
|
||||||
|
"has_disturbance": false,
|
||||||
|
"sample_interval": 400,
|
||||||
|
"source": "PPO_inference",
|
||||||
|
"n_objects_env": 6,
|
||||||
|
"s_dim": 14,
|
||||||
|
"a_dim": 3,
|
||||||
|
"sensor_x": 30.0,
|
||||||
|
"pinball_front_x": 19.0,
|
||||||
|
"pinball_rear_x": 20.3,
|
||||||
|
"action_scale": 8.0,
|
||||||
|
"action_bias": [
|
||||||
|
0.0,
|
||||||
|
-2.0,
|
||||||
|
2.0
|
||||||
|
],
|
||||||
|
"u0": 0.01,
|
||||||
|
"target_type": "periodic"
|
||||||
|
},
|
||||||
|
"illusion_1.0L": {
|
||||||
|
"scene_id": "illusion",
|
||||||
|
"re_code": 100,
|
||||||
|
"has_disturbance": false,
|
||||||
|
"sample_interval": 600,
|
||||||
|
"source": "PPO_inference",
|
||||||
|
"n_objects_env": 6,
|
||||||
|
"s_dim": 14,
|
||||||
|
"a_dim": 3,
|
||||||
|
"sensor_x": 30.0,
|
||||||
|
"pinball_front_x": 19.0,
|
||||||
|
"pinball_rear_x": 20.3,
|
||||||
|
"action_scale": 8.0,
|
||||||
|
"action_bias": [
|
||||||
|
0.0,
|
||||||
|
-2.0,
|
||||||
|
2.0
|
||||||
|
],
|
||||||
|
"u0": 0.01,
|
||||||
|
"target_type": "periodic"
|
||||||
|
},
|
||||||
|
"illusion_1.5L": {
|
||||||
|
"scene_id": "illusion",
|
||||||
|
"re_code": 100,
|
||||||
|
"has_disturbance": false,
|
||||||
|
"sample_interval": 800,
|
||||||
|
"source": "PPO_inference",
|
||||||
|
"n_objects_env": 6,
|
||||||
|
"s_dim": 14,
|
||||||
|
"a_dim": 3,
|
||||||
|
"sensor_x": 30.0,
|
||||||
|
"pinball_front_x": 19.0,
|
||||||
|
"pinball_rear_x": 20.3,
|
||||||
|
"action_scale": 8.0,
|
||||||
|
"action_bias": [
|
||||||
|
0.0,
|
||||||
|
-2.0,
|
||||||
|
2.0
|
||||||
|
],
|
||||||
|
"u0": 0.01,
|
||||||
|
"target_type": "periodic"
|
||||||
|
},
|
||||||
|
"target_cylinder_0.75L": {
|
||||||
|
"scene_id": "target_cylinder",
|
||||||
|
"re_code": 100,
|
||||||
|
"has_disturbance": false,
|
||||||
|
"sample_interval": 400,
|
||||||
|
"source": "open_loop",
|
||||||
|
"n_objects_env": 4,
|
||||||
|
"s_dim": 12,
|
||||||
|
"a_dim": 3,
|
||||||
|
"sensor_x": 30.0,
|
||||||
|
"pinball_front_x": 30.0,
|
||||||
|
"pinball_rear_x": 31.3,
|
||||||
|
"action_scale": 8.0,
|
||||||
|
"action_bias": [
|
||||||
|
0.0,
|
||||||
|
-4.0,
|
||||||
|
4.0
|
||||||
|
],
|
||||||
|
"u0": 0.01,
|
||||||
|
"target_type": "periodic"
|
||||||
|
},
|
||||||
|
"target_cylinder_1.0L": {
|
||||||
|
"scene_id": "target_cylinder",
|
||||||
|
"re_code": 100,
|
||||||
|
"has_disturbance": false,
|
||||||
|
"sample_interval": 600,
|
||||||
|
"source": "open_loop",
|
||||||
|
"n_objects_env": 4,
|
||||||
|
"s_dim": 12,
|
||||||
|
"a_dim": 3,
|
||||||
|
"sensor_x": 30.0,
|
||||||
|
"pinball_front_x": 30.0,
|
||||||
|
"pinball_rear_x": 31.3,
|
||||||
|
"action_scale": 8.0,
|
||||||
|
"action_bias": [
|
||||||
|
0.0,
|
||||||
|
-4.0,
|
||||||
|
4.0
|
||||||
|
],
|
||||||
|
"u0": 0.01,
|
||||||
|
"target_type": "periodic"
|
||||||
|
},
|
||||||
|
"target_cylinder_1.5L": {
|
||||||
|
"scene_id": "target_cylinder",
|
||||||
|
"re_code": 100,
|
||||||
|
"has_disturbance": false,
|
||||||
|
"sample_interval": 800,
|
||||||
|
"source": "open_loop",
|
||||||
|
"n_objects_env": 4,
|
||||||
|
"s_dim": 12,
|
||||||
|
"a_dim": 3,
|
||||||
|
"sensor_x": 30.0,
|
||||||
|
"pinball_front_x": 30.0,
|
||||||
|
"pinball_rear_x": 31.3,
|
||||||
|
"action_scale": 8.0,
|
||||||
|
"action_bias": [
|
||||||
|
0.0,
|
||||||
|
-4.0,
|
||||||
|
4.0
|
||||||
|
],
|
||||||
|
"u0": 0.01,
|
||||||
|
"target_type": "periodic"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"canonical_results": {
|
||||||
|
"steady_cloak": 0.763,
|
||||||
|
"karman_re100": -0.034,
|
||||||
|
"illusion_0.75L": -0.082,
|
||||||
|
"illusion_1.0L": -0.495,
|
||||||
|
"illusion_1.5L": -0.932
|
||||||
|
},
|
||||||
|
"three_layer_overlap": {
|
||||||
|
"karman_re100": {
|
||||||
|
"act_force": -0.03164697269821093,
|
||||||
|
"act_sig": -0.07431818697760144,
|
||||||
|
"force_sig": -0.0343739260491455
|
||||||
|
},
|
||||||
|
"illusion_0.75L": {
|
||||||
|
"act_force": -0.32732725369388294,
|
||||||
|
"act_sig": -0.4007721802551729,
|
||||||
|
"force_sig": -0.6941197281957918
|
||||||
|
},
|
||||||
|
"illusion_1.0L": {
|
||||||
|
"act_force": 0.1208564966066174,
|
||||||
|
"act_sig": -0.3183892941307407,
|
||||||
|
"force_sig": -0.8423715368324566
|
||||||
|
},
|
||||||
|
"illusion_1.5L": {
|
||||||
|
"act_force": 0.0017766926815728562,
|
||||||
|
"act_sig": 0.017393103043959173,
|
||||||
|
"force_sig": -0.9319165643601308
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user