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:
Frank14f 2026-07-05 18:09:02 +08:00
parent 1835f517e9
commit 44f7687509
5 changed files with 509 additions and 159 deletions

View 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_ctlq_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|sensormean|). 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 |

View File

@ -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.

View 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
}
}
}