diff --git a/src/OID_analysis/PIPELINE.md b/src/OID_analysis/PIPELINE.md new file mode 100644 index 0000000..83acc99 --- /dev/null +++ b/src/OID_analysis/PIPELINE.md @@ -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 --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 | diff --git a/src/OID_analysis/README.md b/src/OID_analysis/README.md index 5fd6d45..ffbb186 100644 --- a/src/OID_analysis/README.md +++ b/src/OID_analysis/README.md @@ -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:** -- `OID_knowledge.md` -- confirmed facts, hard rules, critical caveats, **current results** -- `OID_notes.md` -- execution plan, task tracking, handover notes -- This file (README.md) -- engineering entry point, how to run +```bash +# Read first: PIPELINE.md pipeline overview, scene table, conventions +# Deep dive: OID_knowledge.md rules, results table, bug history +# Tasks: OID_notes.md open items, handover +# Conclusions: Final_Conclusions.md six key questions answered -**Critical reading order for new agent:** -1. `docs/OID_analysis_results.md` -- full project report (start here) -2. README.md (this file) -- understand scope and how to run -3. `OID_knowledge.md` -- know the rules, the results, and pitfalls -4. `OID_notes.md` -- understand what's left to do +# Run (from repo root): +PYTHONPATH="src:$PYTHONPATH" conda run -n sr_env python3 \ + src/OID_analysis/analysis/run_full_analysis.py --scene karman_re100 --force +``` ---- - -## 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 +## File Map ``` src/OID_analysis/ - configs.py # Unified scene metadata (12 scene definitions) - utils/ - cfd_interface.py # Re-exports CCD's proven CFD interface - analysis.py # CPU-only: POD, OID, PCD, zone statistics, comparison - scripts/ - collect_*.py # Data collection scripts (GPU, pycuda_3_10) - replay_*.py # Field replay + verification - compute_delta_fields.py # Phase 0 draft - analysis/ - phase*.py # Analysis scripts Phases 1-7 (CPU, sr_env) - robustness_analysis.py # Rank/tau_c/window/zone robustness - steady_reanalysis.py # Steady cloak suppression metrics - compile_master_table.py # Cross-scene comparison - make_figures.py # Generate 7 figures - run_full_analysis.py # Batch pipeline runner - data/ - configs/legacy/ # Legacy CFD configs (symlinked) - steady_cloak/ # Baseline + controlled fields - karman_cloak/ # Baseline + controlled fields - illusion/ # PPO controlled fields - target_cylinder/ # Reference targets - derived/ # All analysis results + figures - OID_knowledge.md # Knowledge base - OID_notes.md # Task tracking - Final_Conclusions.md # Six-question conclusions - Sch12.md # OID reference paper - -docs/ - OID_analysis_results.md # Full project report (7 figures, 292 lines) +├── PIPELINE.md ← START HERE — overview, scene table, conventions +├── OID_knowledge.md hard rules, full results, bugs +├── OID_notes.md task tracking, open items +├── Final_Conclusions.md six key questions answered +├── scene_registry.json machine-readable scene index + canonical values +├── configs.py single source of truth: 13 scene definitions +│ +├── utils/ core library (CPU, no GPU dependency) +│ ├── analysis.py POD, force-OID, sig-OID, PCD, zone stats +│ └── cfd_interface.py re-exports from CCD_analysis +│ +├── scripts/ GPU data collection (pycuda_3_10 env) +│ ├── collect_empty_channel.py / collect_pinball_baseline.py +│ ├── collect_karman_blk.py / collect_disturbance_only.py +│ ├── collect_controlled.py / collect_steady_cloak.py +│ ├── collect_illusion_qblk.py / collect_target_cylinder.py +│ ├── collect_all_data.py batch orchestrator +│ └── replay_full_fields.py full-field PPO replay +│ +├── analysis/ CPU analysis pipeline (sr_env) +│ ├── phase1_correction_pod.py → phase7_whitebox.py (7 phases) +│ ├── robustness_analysis.py / steady_reanalysis.py +│ ├── compile_master_table.py / make_figures.py +│ └── run_full_analysis.py batch runner +│ +├── data/ raw collected data (NOT committed) +│ ├── steady_cloak/ q_in, q_blk, q_ctl +│ ├── karman_cloak/ q_in, q_blk, q_ctl +│ ├── 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 -# Steady group: -conda run -n pycuda_3_10 python src/OID_analysis/scripts/collect_empty_channel.py --device 3 --steps 200 -conda run -n pycuda_3_10 python src/OID_analysis/scripts/collect_pinball_baseline.py --device 3 --steps 500 -conda run -n pycuda_3_10 python src/OID_analysis/scripts/collect_steady_cloak.py --device 3 --steps 500 --omega-rear 5.1 - -# Karman group: -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/` +1. OID operates on **Δq_ctl = q_ctl − q_blk**, not raw q_ctl. +2. **force-OID and sig-OID reported separately** — divergence is a mechanism result. +3. **Illusion q_blk uses separate geometry** (pinball_x=19/20.3, sensor_x=30). +4. Fields stored at **full 1280×512**; ROI mask applied only at analysis stage. +5. GPU: Karman on device 1, steady/illusion on device 3. +6. Conda: `pycuda_3_10` for GPU, `sr_env` for CPU analysis. +7. "2U" in model name = S_DIM=14, NOT 2× velocity. diff --git a/src/OID_analysis/Li22b.md b/src/OID_analysis/papers/Li22b.md similarity index 100% rename from src/OID_analysis/Li22b.md rename to src/OID_analysis/papers/Li22b.md diff --git a/src/OID_analysis/Sch12.md b/src/OID_analysis/papers/Sch12.md similarity index 100% rename from src/OID_analysis/Sch12.md rename to src/OID_analysis/papers/Sch12.md diff --git a/src/OID_analysis/scene_registry.json b/src/OID_analysis/scene_registry.json new file mode 100644 index 0000000..ff755bc --- /dev/null +++ b/src/OID_analysis/scene_registry.json @@ -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 + } + } +} \ No newline at end of file