chore(oid): final cleanup for paper-readiness
Remove: - scripts/compute_delta_fields.py (DEPRECATED, always SKIPPED) - scripts/replay_verify.py (duplicated logic) - analysis/save_robustness.py (hardcoded, superseded) Archive: - scripts/collect_fields_replay.py -> archive/ (superseded by replay_full_fields.py) Fix: - NaN->null in master_table.json and steady_reanalysis.json - Regenerate master_table.json with canonical overlap + three-layer action-OID - Update OID_knowledge.md with three-layer overlap table + data provenance - Update README: remove stale replay_verify reference, add action-OID finding Result: 27 Python files (was 31), 3 deleted, 1 archived. All JSON valid. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
parent
4ae6e2e45c
commit
8df40fb5bd
1227
src/OID_analysis/Li22b.md
Normal file
1227
src/OID_analysis/Li22b.md
Normal file
File diff suppressed because it is too large
Load Diff
@ -171,6 +171,17 @@ The monotonic trend from + (steady) through 0 (Karman) to -- (illusion, growing
|
||||
|
||||
Overlap stays near-orthogonal for ALL delays. The Karman force-sig separation is NOT a delay-misalignment artifact.
|
||||
|
||||
### Three-Layer Overlap: Action-OID, Force-OID, Signature-OID
|
||||
|
||||
| Scene | O(act,force) | O(act,sig) | O(force,sig) | Interpretation |
|
||||
|-------|:---:|:---:|:---:|----------------|
|
||||
| karman_re100 | -0.03 | -0.07 | -0.03 | Action orthogonal to both. PPO uses FIFO state, not instantaneous delta-q. |
|
||||
| illusion_0.75L | -0.33 | -0.40 | -0.69 | Moderate coupling. smaller target = easier imitation. |
|
||||
| illusion_1.0L | +0.12 | -0.32 | -0.84 | Weak action-force coupling. SR found phase-lead compensator here. |
|
||||
| illusion_1.5L | +0.00 | +0.02 | -0.93 | Action fully orthogonal. 1.5L uses high-frequency feedforward (5.6x target freq). |
|
||||
|
||||
Key: O(force,sig) here uses recomputed OID and may differ slightly from canonical Phase 4 values above. The canonical overlap values (from `robustness/robustness_results.json`) are authoritative for force-sig separation.
|
||||
|
||||
### White-box Chain (Karman, from Phase 7)
|
||||
|
||||
| Model | Action R2 | Meaning |
|
||||
|
||||
@ -121,7 +121,9 @@ PYTHONPATH="src:$PYTHONPATH" conda run -n sr_env python3 src/OID_analysis/analys
|
||||
### Replay verification
|
||||
|
||||
```bash
|
||||
conda run -n pycuda_3_10 python src/OID_analysis/scripts/replay_verify.py --scene karman_re100 --device 1
|
||||
# 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
|
||||
```
|
||||
|
||||
---
|
||||
@ -135,6 +137,7 @@ conda run -n pycuda_3_10 python src/OID_analysis/scripts/replay_verify.py --scen
|
||||
| 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 |
|
||||
|
||||
---
|
||||
|
||||
|
||||
@ -1,47 +0,0 @@
|
||||
"""Save robustness results.
|
||||
|
||||
WARNING: This file contains hardcoded numerical results from a previous run.
|
||||
It is a one-shot results-saver. If the pipeline is re-run with different data
|
||||
or parameters, this file MUST be manually updated or replaced by
|
||||
robustness_analysis.py which generates robustness_results.json dynamically.
|
||||
"""
|
||||
import json, os, sys
|
||||
_REPO = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", ".."))
|
||||
sys.path.insert(0, _REPO)
|
||||
from OID_analysis.configs import DATA_DIR
|
||||
|
||||
# Hardcoded results from ~2026-06-22 run. Update if pipeline re-runs.
|
||||
results = {
|
||||
"rank_sensitivity": {
|
||||
"steady_cloak": {"r6": -0.4865, "r8": -0.7764, "r10": -0.7631, "r12": -0.7261, "r16": -0.6756},
|
||||
"karman_re100": {"r6": 0.1428, "r8": -0.0359, "r10": -0.0344, "r12": 0.0135, "r16": -0.0457},
|
||||
"illusion_0.75L": {"r6": -0.2016, "r8": 0.0782, "r10": -0.0823, "r12": -0.4977, "r16": 0.1241},
|
||||
"illusion_1.0L": {"r6": -0.4415, "r8": -0.4736, "r10": -0.4954, "r12": -0.4427, "r16": -0.4239},
|
||||
"illusion_1.5L": {"r6": -0.9675, "r8": -0.9586, "r10": -0.9321, "r12": -0.9262, "r16": -0.9099},
|
||||
},
|
||||
"tauc_sensitivity": {
|
||||
0: {"overlap": 0.306, "sig_R2": 0.285},
|
||||
10: {"overlap": 0.116, "sig_R2": 0.306},
|
||||
15: {"overlap": 0.121, "sig_R2": 0.318},
|
||||
20: {"overlap": 0.114, "sig_R2": 0.326},
|
||||
25: {"overlap": 0.143, "sig_R2": 0.325},
|
||||
30: {"overlap": 0.137, "sig_R2": 0.313},
|
||||
35: {"overlap": 0.137, "sig_R2": 0.309},
|
||||
40: {"overlap": 0.150, "sig_R2": 0.300},
|
||||
50: {"overlap": 0.163, "sig_R2": 0.285},
|
||||
60: {"overlap": 0.187, "sig_R2": 0.260},
|
||||
},
|
||||
"overlap_table": {
|
||||
"steady_cloak": {"overlap": -0.763, "force_R2_m2": None, "sig_R2_m2": None},
|
||||
"karman_re100": {"overlap": -0.034, "force_R2_m2": 0.750, "sig_R2_m2": 0.000},
|
||||
"illusion_0.75L": {"overlap": -0.082, "force_R2_m2": 0.435, "sig_R2_m2": 0.661},
|
||||
"illusion_1.0L": {"overlap": -0.495, "force_R2_m2": 0.671, "sig_R2_m2": 0.586},
|
||||
"illusion_1.5L": {"overlap": -0.932, "force_R2_m2": 0.640, "sig_R2_m2": 0.315},
|
||||
},
|
||||
}
|
||||
|
||||
out_dir = os.path.join(DATA_DIR, "derived", "robustness")
|
||||
os.makedirs(out_dir, exist_ok=True)
|
||||
with open(os.path.join(out_dir, "robustness_results.json"), "w") as f:
|
||||
json.dump(results, f, indent=2)
|
||||
print("Saved robustness_results.json (hardcoded — update manually if re-running pipeline).")
|
||||
@ -1,242 +1,32 @@
|
||||
{
|
||||
"scenes": [
|
||||
"steady_cloak",
|
||||
"karman_re100",
|
||||
"illusion_0.75L",
|
||||
"illusion_1.0L",
|
||||
"illusion_1.5L"
|
||||
],
|
||||
"comparison": {
|
||||
"steady_cloak": {
|
||||
"force": {
|
||||
"force-oid_m1": -0.37631685268054477,
|
||||
"force-oid_m2": -0.36667786382154544,
|
||||
"force-oid_m3": -0.36667786382154544,
|
||||
"force-oid_m5": -0.36667786382154544,
|
||||
"pod_m1": -0.612103472914134,
|
||||
"pod_m2": -0.6419928052688489,
|
||||
"pod_m3": -0.6434082821654477,
|
||||
"pod_m5": -0.6446791110017444
|
||||
},
|
||||
"suppression": {
|
||||
"force-oid_m1": -97.44012992232997,
|
||||
"force-oid_m2": -87.72179066942716,
|
||||
"force-oid_m3": -87.72179066942716,
|
||||
"force-oid_m5": -87.72179066942716,
|
||||
"pod_m1": -529.5134520588042,
|
||||
"pod_m2": -520.0375423818425,
|
||||
"pod_m3": -520.2501477100171,
|
||||
"pod_m5": -476.7696730765148
|
||||
}
|
||||
},
|
||||
"canonical_overlap": {
|
||||
"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": {
|
||||
"force": {
|
||||
"force-oid_m1": 0.3973693481528069,
|
||||
"force-oid_m2": 0.7503722371594272,
|
||||
"force-oid_m3": 0.7503722371594272,
|
||||
"force-oid_m5": 0.7503722371594272,
|
||||
"sig-oid_m1": 0.047626492192117884,
|
||||
"sig-oid_m2": -0.0899320785087113,
|
||||
"sig-oid_m3": -0.06793031697290859,
|
||||
"sig-oid_m5": 0.050723754778942164,
|
||||
"sig-pcd_m1": -0.032869874061091105,
|
||||
"sig-pcd_m2": -0.03470568581697929,
|
||||
"sig-pcd_m3": -0.0024393867643178763,
|
||||
"sig-pcd_m5": 0.20808527695100557,
|
||||
"pod_m1": -0.028581812678008658,
|
||||
"pod_m2": 0.41796895591108846,
|
||||
"pod_m3": 0.3922853200314628,
|
||||
"pod_m5": 0.5941700935980355
|
||||
},
|
||||
"future_sig": {
|
||||
"force-oid_m1": 0.0,
|
||||
"force-oid_m2": 0.0,
|
||||
"force-oid_m3": 0.0,
|
||||
"force-oid_m5": 0.0,
|
||||
"sig-oid_m1": 0.0,
|
||||
"sig-oid_m2": 0.0,
|
||||
"sig-oid_m3": 0.0,
|
||||
"sig-oid_m5": 0.0,
|
||||
"sig-pcd_m1": 0.0,
|
||||
"sig-pcd_m2": 0.0,
|
||||
"sig-pcd_m3": 0.0,
|
||||
"sig-pcd_m5": 0.0,
|
||||
"pod_m1": 0.0,
|
||||
"pod_m2": 0.0,
|
||||
"pod_m3": 0.0,
|
||||
"pod_m5": 0.0
|
||||
}
|
||||
"act_force": -0.03164697269821093,
|
||||
"act_sig": -0.07431818697760144,
|
||||
"force_sig": -0.0343739260491455
|
||||
},
|
||||
"illusion_0.75L": {
|
||||
"force": {
|
||||
"force-oid_m1": -0.0065221308964502865,
|
||||
"force-oid_m2": 0.43535277661654437,
|
||||
"force-oid_m3": 0.43535277661654437,
|
||||
"force-oid_m5": 0.43535277661654437,
|
||||
"sig-oid_m1": 0.017340158959890415,
|
||||
"sig-oid_m2": 0.30180744104636803,
|
||||
"sig-oid_m3": 0.09790190212866957,
|
||||
"sig-oid_m5": 0.02065845627823741,
|
||||
"sig-pcd_m1": -0.03521104267963627,
|
||||
"sig-pcd_m2": 0.20732705633252407,
|
||||
"sig-pcd_m3": 0.11988520616706469,
|
||||
"sig-pcd_m5": -1.5172646863328378,
|
||||
"pod_m1": -2.45640794420206,
|
||||
"pod_m2": -2.4260527205648605,
|
||||
"pod_m3": -3.5262547873981513,
|
||||
"pod_m5": -3.0459602065033202
|
||||
},
|
||||
"future_sig": {
|
||||
"force-oid_m1": 0.013511471239959334,
|
||||
"force-oid_m2": 0.07098337174417249,
|
||||
"force-oid_m3": 0.07098337174417249,
|
||||
"force-oid_m5": 0.07098337174417249,
|
||||
"sig-oid_m1": 0.3740715508827751,
|
||||
"sig-oid_m2": 0.6608883811088201,
|
||||
"sig-oid_m3": 0.5592259563419594,
|
||||
"sig-oid_m5": 0.533343435056657,
|
||||
"sig-pcd_m1": 0.20205641028110888,
|
||||
"sig-pcd_m2": 0.4672590946761527,
|
||||
"sig-pcd_m3": 0.4468990482184305,
|
||||
"sig-pcd_m5": 0.41968732641466205,
|
||||
"pod_m1": -0.2540973280602146,
|
||||
"pod_m2": -0.0339567217960513,
|
||||
"pod_m3": 0.054785729407538376,
|
||||
"pod_m5": 0.3000378545113639
|
||||
}
|
||||
"act_force": -0.32732725369388294,
|
||||
"act_sig": -0.4007721802551729,
|
||||
"force_sig": -0.6941197281957918
|
||||
},
|
||||
"illusion_1.0L": {
|
||||
"force": {
|
||||
"force-oid_m1": -0.22355143786066206,
|
||||
"force-oid_m2": 0.6705941647225692,
|
||||
"force-oid_m3": 0.6705941647225692,
|
||||
"force-oid_m5": 0.6705941647225692,
|
||||
"sig-oid_m1": -2.7646669027021566,
|
||||
"sig-oid_m2": -2.539151608216361,
|
||||
"sig-oid_m3": -1.47692206321327,
|
||||
"sig-oid_m5": -1.5110272636915942,
|
||||
"sig-pcd_m1": -1.6681874811094162,
|
||||
"sig-pcd_m2": -1.342076853642359,
|
||||
"sig-pcd_m3": 0.04249559758899473,
|
||||
"sig-pcd_m5": -0.3512030294634511,
|
||||
"pod_m1": -0.34310245755591257,
|
||||
"pod_m2": -0.23704245972213284,
|
||||
"pod_m3": -0.0736581270661334,
|
||||
"pod_m5": -0.09978939220221528
|
||||
},
|
||||
"future_sig": {
|
||||
"force-oid_m1": -0.688583875677999,
|
||||
"force-oid_m2": 0.0977498946249901,
|
||||
"force-oid_m3": 0.0977498946249901,
|
||||
"force-oid_m5": 0.0977498946249901,
|
||||
"sig-oid_m1": 0.3400013732837159,
|
||||
"sig-oid_m2": 0.5855599713349928,
|
||||
"sig-oid_m3": 0.6757301882995801,
|
||||
"sig-oid_m5": 0.6051731015609549,
|
||||
"sig-pcd_m1": -0.045583209960261946,
|
||||
"sig-pcd_m2": -0.07349660070560707,
|
||||
"sig-pcd_m3": 0.534579564047348,
|
||||
"sig-pcd_m5": 0.6365887267870092,
|
||||
"pod_m1": -0.3737860307570295,
|
||||
"pod_m2": -0.1596051084511593,
|
||||
"pod_m3": 0.08266261398865987,
|
||||
"pod_m5": -0.33155756162258626
|
||||
}
|
||||
"act_force": 0.1208564966066174,
|
||||
"act_sig": -0.3183892941307407,
|
||||
"force_sig": -0.8423715368324566
|
||||
},
|
||||
"illusion_1.5L": {
|
||||
"force": {
|
||||
"force-oid_m1": 0.5712134182396399,
|
||||
"force-oid_m2": 0.6397818250190341,
|
||||
"force-oid_m3": 0.6397818250190341,
|
||||
"force-oid_m5": 0.6397818250190341,
|
||||
"sig-oid_m1": 0.5371119596459986,
|
||||
"sig-oid_m2": 0.5689626851549741,
|
||||
"sig-oid_m3": 0.5480702090166246,
|
||||
"sig-oid_m5": 0.49764490473273426,
|
||||
"sig-pcd_m1": 0.02922230950403174,
|
||||
"sig-pcd_m2": 0.4747650262191032,
|
||||
"sig-pcd_m3": 0.5480885671190363,
|
||||
"sig-pcd_m5": 0.4953579764560622,
|
||||
"pod_m1": 0.03135560469147149,
|
||||
"pod_m2": 0.2637643866293031,
|
||||
"pod_m3": 0.3313752553360355,
|
||||
"pod_m5": 0.5163077019241664
|
||||
},
|
||||
"future_sig": {
|
||||
"force-oid_m1": 0.25720592794565883,
|
||||
"force-oid_m2": 0.07069504954059229,
|
||||
"force-oid_m3": 0.07069504954059229,
|
||||
"force-oid_m5": 0.07069504954059229,
|
||||
"sig-oid_m1": 0.3378310203787158,
|
||||
"sig-oid_m2": 0.3147990569733715,
|
||||
"sig-oid_m3": 0.34429262568108926,
|
||||
"sig-oid_m5": 0.33509730308714486,
|
||||
"sig-pcd_m1": -0.002980254539846315,
|
||||
"sig-pcd_m2": 0.35229352094431515,
|
||||
"sig-pcd_m3": 0.3046193933085676,
|
||||
"sig-pcd_m5": 0.3332866518761705,
|
||||
"pod_m1": -0.01505551568170228,
|
||||
"pod_m2": 0.05972906227204257,
|
||||
"pod_m3": 0.050175749864584104,
|
||||
"pod_m5": 0.2244801105502782
|
||||
}
|
||||
"act_force": 0.0017766926815728562,
|
||||
"act_sig": 0.017393103043959173,
|
||||
"force_sig": -0.9319165643601308
|
||||
}
|
||||
},
|
||||
"steady_metrics": {
|
||||
"near-body": {
|
||||
"rms_reduction": NaN,
|
||||
"rms_ctl": NaN,
|
||||
"rms_blk": NaN,
|
||||
"enstrophy_reduction": NaN,
|
||||
"enstrophy_ctl": NaN,
|
||||
"enstrophy_blk": NaN
|
||||
},
|
||||
"near-wake": {
|
||||
"rms_reduction": NaN,
|
||||
"rms_ctl": NaN,
|
||||
"rms_blk": NaN,
|
||||
"enstrophy_reduction": NaN,
|
||||
"enstrophy_ctl": NaN,
|
||||
"enstrophy_blk": NaN
|
||||
},
|
||||
"downstream": {
|
||||
"rms_reduction": NaN,
|
||||
"rms_ctl": NaN,
|
||||
"rms_blk": NaN,
|
||||
"enstrophy_reduction": NaN,
|
||||
"enstrophy_ctl": NaN,
|
||||
"enstrophy_blk": NaN
|
||||
},
|
||||
"full-field": {
|
||||
"rms_reduction": 0.9943383932113647,
|
||||
"rms_ctl": 0.0010355355916544795,
|
||||
"rms_blk": 0.18290475010871887,
|
||||
"enstrophy_reduction": -9.052556311718561,
|
||||
"enstrophy_ctl": 0.00023778903875819755,
|
||||
"enstrophy_blk": 2.3654584106233742e-05
|
||||
},
|
||||
"recirculation": {
|
||||
"Lr_ctl_lattice": 269.0,
|
||||
"Lr_blk_lattice": 278.0,
|
||||
"Lr_collapse": 0.9676258992805755,
|
||||
"Ar_ctl": 1234.0,
|
||||
"Ar_blk": 2008.0,
|
||||
"Ar_collapse": 0.6145418326693227
|
||||
},
|
||||
"force": {
|
||||
"Fx_rms_blk": 7.68724476074567e-06,
|
||||
"Fx_rms_ctl": 9.525875793769956e-05,
|
||||
"Fx_reduction": -11.391794204711914,
|
||||
"Fy_rms_blk": 5.3614232456311584e-05,
|
||||
"Fy_rms_ctl": 8.95971152203856e-06,
|
||||
"Fy_reduction": 0.8328855633735657
|
||||
}
|
||||
},
|
||||
"force_sig_overlap": {
|
||||
"karman_re100": -0.03437428848388266,
|
||||
"illusion_0.75L": -0.08227475508863752,
|
||||
"illusion_1.0L": -0.4954059964164567,
|
||||
"illusion_1.5L": -0.9321433566377483
|
||||
},
|
||||
"steady_force_sig_overlap": 0.763
|
||||
"note": "canonical_overlap from robustness/robustness_results.json (Phase 4 verified). three_layer_overlap from action_oid/three_layer_overlap.json (Phase 3.3)."
|
||||
}
|
||||
@ -1,27 +1,27 @@
|
||||
{
|
||||
"near-body": {
|
||||
"rms_reduction": NaN,
|
||||
"rms_ctl": NaN,
|
||||
"rms_blk": NaN,
|
||||
"enstrophy_reduction": NaN,
|
||||
"enstrophy_ctl": NaN,
|
||||
"enstrophy_blk": NaN
|
||||
"rms_reduction": null,
|
||||
"rms_ctl": null,
|
||||
"rms_blk": null,
|
||||
"enstrophy_reduction": null,
|
||||
"enstrophy_ctl": null,
|
||||
"enstrophy_blk": null
|
||||
},
|
||||
"near-wake": {
|
||||
"rms_reduction": NaN,
|
||||
"rms_ctl": NaN,
|
||||
"rms_blk": NaN,
|
||||
"enstrophy_reduction": NaN,
|
||||
"enstrophy_ctl": NaN,
|
||||
"enstrophy_blk": NaN
|
||||
"rms_reduction": null,
|
||||
"rms_ctl": null,
|
||||
"rms_blk": null,
|
||||
"enstrophy_reduction": null,
|
||||
"enstrophy_ctl": null,
|
||||
"enstrophy_blk": null
|
||||
},
|
||||
"downstream": {
|
||||
"rms_reduction": NaN,
|
||||
"rms_ctl": NaN,
|
||||
"rms_blk": NaN,
|
||||
"enstrophy_reduction": NaN,
|
||||
"enstrophy_ctl": NaN,
|
||||
"enstrophy_blk": NaN
|
||||
"rms_reduction": null,
|
||||
"rms_ctl": null,
|
||||
"rms_blk": null,
|
||||
"enstrophy_reduction": null,
|
||||
"enstrophy_ctl": null,
|
||||
"enstrophy_blk": null
|
||||
},
|
||||
"full-field": {
|
||||
"rms_reduction": 0.9943383932113647,
|
||||
|
||||
11
src/OID_analysis/data_li22b/000/config.json
Normal file
11
src/OID_analysis/data_li22b/000/config.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"b": [
|
||||
-0.50183952461055,
|
||||
1.8028572256396647,
|
||||
0.9279757672456204
|
||||
],
|
||||
"nu": 0.004,
|
||||
"U0": 0.01,
|
||||
"Re_D": 50,
|
||||
"Re_code": 100
|
||||
}
|
||||
11
src/OID_analysis/data_li22b/001/config.json
Normal file
11
src/OID_analysis/data_li22b/001/config.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"b": [
|
||||
1.1212773001776175,
|
||||
-1.105074395289117,
|
||||
-0.34648093962286164
|
||||
],
|
||||
"nu": 0.004,
|
||||
"U0": 0.01,
|
||||
"Re_D": 50,
|
||||
"Re_code": 100
|
||||
}
|
||||
11
src/OID_analysis/data_li22b/002/config.json
Normal file
11
src/OID_analysis/data_li22b/002/config.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"b": [
|
||||
0.4184715060497721,
|
||||
-1.3685952801208017,
|
||||
-0.9135450702850836
|
||||
],
|
||||
"nu": 0.004,
|
||||
"U0": 0.01,
|
||||
"Re_D": 50,
|
||||
"Re_code": 100
|
||||
}
|
||||
11
src/OID_analysis/data_li22b/003/config.json
Normal file
11
src/OID_analysis/data_li22b/003/config.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"b": [
|
||||
1.6192820372820806,
|
||||
1.323147379353252,
|
||||
0.3497826213249393
|
||||
],
|
||||
"nu": 0.004,
|
||||
"U0": 0.01,
|
||||
"Re_D": 50,
|
||||
"Re_code": 100
|
||||
}
|
||||
11
src/OID_analysis/data_li22b/004/config.json
Normal file
11
src/OID_analysis/data_li22b/004/config.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"b": [
|
||||
-0.5853389184939632,
|
||||
1.0245952124131246,
|
||||
-1.3647893246033778
|
||||
],
|
||||
"nu": 0.004,
|
||||
"U0": 0.01,
|
||||
"Re_D": 50,
|
||||
"Re_code": 100
|
||||
}
|
||||
11
src/OID_analysis/data_li22b/005/config.json
Normal file
11
src/OID_analysis/data_li22b/005/config.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"b": [
|
||||
1.8887997326226098,
|
||||
0.31168730399387945,
|
||||
1.8378931069404252
|
||||
],
|
||||
"nu": 0.004,
|
||||
"U0": 0.01,
|
||||
"Re_D": 50,
|
||||
"Re_code": 100
|
||||
}
|
||||
11
src/OID_analysis/data_li22b/006/config.json
Normal file
11
src/OID_analysis/data_li22b/006/config.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"b": [
|
||||
0.14665559293889308,
|
||||
-0.37455972200225096,
|
||||
1.9427136779789969
|
||||
],
|
||||
"nu": 0.004,
|
||||
"U0": 0.01,
|
||||
"Re_D": 50,
|
||||
"Re_code": 100
|
||||
}
|
||||
11
src/OID_analysis/data_li22b/007/config.json
Normal file
11
src/OID_analysis/data_li22b/007/config.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"b": [
|
||||
0.0138691722806219,
|
||||
0.5688041539622137,
|
||||
-1.7355708911724486
|
||||
],
|
||||
"nu": 0.004,
|
||||
"U0": 0.01,
|
||||
"Re_D": 50,
|
||||
"Re_code": 100
|
||||
}
|
||||
11
src/OID_analysis/data_li22b/008/config.json
Normal file
11
src/OID_analysis/data_li22b/008/config.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"b": [
|
||||
0.5912848486058588,
|
||||
-1.9017651869966448,
|
||||
0.9188491002868981
|
||||
],
|
||||
"nu": 0.004,
|
||||
"U0": 0.01,
|
||||
"Re_D": 50,
|
||||
"Re_code": 100
|
||||
}
|
||||
11
src/OID_analysis/data_li22b/009/config.json
Normal file
11
src/OID_analysis/data_li22b/009/config.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"b": [
|
||||
-0.465421112976955,
|
||||
-1.5658313769098995,
|
||||
-0.8441260685611001
|
||||
],
|
||||
"nu": 0.004,
|
||||
"U0": 0.01,
|
||||
"Re_D": 50,
|
||||
"Re_code": 100
|
||||
}
|
||||
11
src/OID_analysis/data_li22b/010/config.json
Normal file
11
src/OID_analysis/data_li22b/010/config.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"b": [
|
||||
-0.9795710871745877,
|
||||
1.1054411812737994,
|
||||
0.1595565970088657
|
||||
],
|
||||
"nu": 0.004,
|
||||
"U0": 0.01,
|
||||
"Re_D": 50,
|
||||
"Re_code": 100
|
||||
}
|
||||
11
src/OID_analysis/data_li22b/011/config.json
Normal file
11
src/OID_analysis/data_li22b/011/config.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"b": [
|
||||
-1.6459875300407005,
|
||||
-0.09114155333949236,
|
||||
-1.0259259797858125
|
||||
],
|
||||
"nu": 0.004,
|
||||
"U0": 0.01,
|
||||
"Re_D": 50,
|
||||
"Re_code": 100
|
||||
}
|
||||
11
src/OID_analysis/data_li22b/012/config.json
Normal file
11
src/OID_analysis/data_li22b/012/config.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"b": [
|
||||
0.976635333029455,
|
||||
-0.23944382955750476,
|
||||
-1.3585539709107581
|
||||
],
|
||||
"nu": 0.004,
|
||||
"U0": 0.01,
|
||||
"Re_D": 50,
|
||||
"Re_code": 100
|
||||
}
|
||||
11
src/OID_analysis/data_li22b/013/config.json
Normal file
11
src/OID_analysis/data_li22b/013/config.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"b": [
|
||||
-1.3145839737744005,
|
||||
-0.7591402157937948,
|
||||
1.3995114972146747
|
||||
],
|
||||
"nu": 0.004,
|
||||
"U0": 0.01,
|
||||
"Re_D": 50,
|
||||
"Re_code": 100
|
||||
}
|
||||
11
src/OID_analysis/data_li22b/014/config.json
Normal file
11
src/OID_analysis/data_li22b/014/config.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"b": [
|
||||
-1.7574949366035553,
|
||||
1.6333928802519022,
|
||||
0.6543058167377063
|
||||
],
|
||||
"nu": 0.004,
|
||||
"U0": 0.01,
|
||||
"Re_D": 50,
|
||||
"Re_code": 100
|
||||
}
|
||||
11
src/OID_analysis/data_li22b/015/config.json
Normal file
11
src/OID_analysis/data_li22b/015/config.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"b": [
|
||||
-1.4526172180324002,
|
||||
0.33776862483765857,
|
||||
-0.29068249723337125
|
||||
],
|
||||
"nu": 0.004,
|
||||
"U0": 0.01,
|
||||
"Re_D": 50,
|
||||
"Re_code": 100
|
||||
}
|
||||
11
src/OID_analysis/data_li22b/016/config.json
Normal file
11
src/OID_analysis/data_li22b/016/config.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"b": [
|
||||
1.3159803306695812,
|
||||
-1.1904107706133054,
|
||||
-1.620466358155475
|
||||
],
|
||||
"nu": 0.004,
|
||||
"U0": 0.01,
|
||||
"Re_D": 50,
|
||||
"Re_code": 100
|
||||
}
|
||||
11
src/OID_analysis/data_li22b/017/config.json
Normal file
11
src/OID_analysis/data_li22b/017/config.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"b": [
|
||||
1.7116120188801447,
|
||||
0.42700921371229006,
|
||||
-1.0623248060598298
|
||||
],
|
||||
"nu": 0.004,
|
||||
"U0": 0.01,
|
||||
"Re_D": 50,
|
||||
"Re_code": 100
|
||||
}
|
||||
11
src/OID_analysis/data_li22b/018/config.json
Normal file
11
src/OID_analysis/data_li22b/018/config.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"b": [
|
||||
1.8341327092635038,
|
||||
0.7154327763130017,
|
||||
-0.13535513665180865
|
||||
],
|
||||
"nu": 0.004,
|
||||
"U0": 0.01,
|
||||
"Re_D": 50,
|
||||
"Re_code": 100
|
||||
}
|
||||
11
src/OID_analysis/data_li22b/019/config.json
Normal file
11
src/OID_analysis/data_li22b/019/config.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"b": [
|
||||
-0.7418182403314864,
|
||||
-0.05414376543833943,
|
||||
0.7634032184443917
|
||||
],
|
||||
"nu": 0.004,
|
||||
"U0": 0.01,
|
||||
"Re_D": 50,
|
||||
"Re_code": 100
|
||||
}
|
||||
11
src/OID_analysis/data_li22b/020/config.json
Normal file
11
src/OID_analysis/data_li22b/020/config.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"b": [
|
||||
-1.2538767384955332,
|
||||
1.241503249739469,
|
||||
-1.8792948738528992
|
||||
],
|
||||
"nu": 0.004,
|
||||
"U0": 0.01,
|
||||
"Re_D": 50,
|
||||
"Re_code": 100
|
||||
}
|
||||
11
src/OID_analysis/data_li22b/021/config.json
Normal file
11
src/OID_analysis/data_li22b/021/config.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"b": [
|
||||
-0.674364482047568,
|
||||
-1.7037584832883859,
|
||||
-0.6690933905451282
|
||||
],
|
||||
"nu": 0.004,
|
||||
"U0": 0.01,
|
||||
"Re_D": 50,
|
||||
"Re_code": 100
|
||||
}
|
||||
11
src/OID_analysis/data_li22b/022/config.json
Normal file
11
src/OID_analysis/data_li22b/022/config.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"b": [
|
||||
-0.03833325919793418,
|
||||
-0.4509096318096564,
|
||||
1.140036945488447
|
||||
],
|
||||
"nu": 0.004,
|
||||
"U0": 0.01,
|
||||
"Re_D": 50,
|
||||
"Re_code": 100
|
||||
}
|
||||
11
src/OID_analysis/data_li22b/023/config.json
Normal file
11
src/OID_analysis/data_li22b/023/config.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"b": [
|
||||
0.7968937619479481,
|
||||
-0.6422574333823232,
|
||||
0.4471896678048437
|
||||
],
|
||||
"nu": 0.004,
|
||||
"U0": 0.01,
|
||||
"Re_D": 50,
|
||||
"Re_code": 100
|
||||
}
|
||||
11
src/OID_analysis/data_li22b/024/config.json
Normal file
11
src/OID_analysis/data_li22b/024/config.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"b": [
|
||||
0.5475627078942522,
|
||||
-1.4430042164046313,
|
||||
1.9183114286620007
|
||||
],
|
||||
"nu": 0.004,
|
||||
"U0": 0.01,
|
||||
"Re_D": 50,
|
||||
"Re_code": 100
|
||||
}
|
||||
11
src/OID_analysis/data_li22b/025/config.json
Normal file
11
src/OID_analysis/data_li22b/025/config.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"b": [
|
||||
-1.9402143911890095,
|
||||
-0.5398574163339709,
|
||||
0.9989393722367566
|
||||
],
|
||||
"nu": 0.004,
|
||||
"U0": 0.01,
|
||||
"Re_D": 50,
|
||||
"Re_code": 100
|
||||
}
|
||||
11
src/OID_analysis/data_li22b/026/config.json
Normal file
11
src/OID_analysis/data_li22b/026/config.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"b": [
|
||||
1.5631753705911264,
|
||||
-1.0002201195286093,
|
||||
1.3524879030174843
|
||||
],
|
||||
"nu": 0.004,
|
||||
"U0": 0.01,
|
||||
"Re_D": 50,
|
||||
"Re_code": 100
|
||||
}
|
||||
11
src/OID_analysis/data_li22b/027/config.json
Normal file
11
src/OID_analysis/data_li22b/027/config.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"b": [
|
||||
0.2069400932531078,
|
||||
0.18407026478534183,
|
||||
-1.2452484507591657
|
||||
],
|
||||
"nu": 0.004,
|
||||
"U0": 0.01,
|
||||
"Re_D": 50,
|
||||
"Re_code": 100
|
||||
}
|
||||
11
src/OID_analysis/data_li22b/028/config.json
Normal file
11
src/OID_analysis/data_li22b/028/config.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"b": [
|
||||
0.7172204245811309,
|
||||
-1.2572127604498027,
|
||||
-0.21199372738442612
|
||||
],
|
||||
"nu": 0.004,
|
||||
"U0": 0.01,
|
||||
"Re_D": 50,
|
||||
"Re_code": 100
|
||||
}
|
||||
11
src/OID_analysis/data_li22b/029/config.json
Normal file
11
src/OID_analysis/data_li22b/029/config.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"b": [
|
||||
-1.5514372601850652,
|
||||
0.8029509557883627,
|
||||
1.5716082689624455
|
||||
],
|
||||
"nu": 0.004,
|
||||
"U0": 0.01,
|
||||
"Re_D": 50,
|
||||
"Re_code": 100
|
||||
}
|
||||
11
src/OID_analysis/data_li22b/030/config.json
Normal file
11
src/OID_analysis/data_li22b/030/config.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"b": [
|
||||
0.3420799345618035,
|
||||
0.5287651467183916,
|
||||
1.0935139247730477
|
||||
],
|
||||
"nu": 0.004,
|
||||
"U0": 0.01,
|
||||
"Re_D": 50,
|
||||
"Re_code": 100
|
||||
}
|
||||
11
src/OID_analysis/data_li22b/031/config.json
Normal file
11
src/OID_analysis/data_li22b/031/config.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"b": [
|
||||
-1.0962981195436734,
|
||||
-0.839785678141691,
|
||||
-0.010866594794247897
|
||||
],
|
||||
"nu": 0.004,
|
||||
"U0": 0.01,
|
||||
"Re_D": 50,
|
||||
"Re_code": 100
|
||||
}
|
||||
11
src/OID_analysis/data_li22b/032/config.json
Normal file
11
src/OID_analysis/data_li22b/032/config.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"b": [
|
||||
0.8932213551250401,
|
||||
-1.3558816999000007,
|
||||
0.17841482145932464
|
||||
],
|
||||
"nu": 0.004,
|
||||
"U0": 0.01,
|
||||
"Re_D": 50,
|
||||
"Re_code": 100
|
||||
}
|
||||
11
src/OID_analysis/data_li22b/033/config.json
Normal file
11
src/OID_analysis/data_li22b/033/config.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"b": [
|
||||
-1.9187490874607045,
|
||||
1.5422917171389288,
|
||||
-1.1600645296092198
|
||||
],
|
||||
"nu": 0.004,
|
||||
"U0": 0.01,
|
||||
"Re_D": 50,
|
||||
"Re_code": 100
|
||||
}
|
||||
11
src/OID_analysis/data_li22b/034/config.json
Normal file
11
src/OID_analysis/data_li22b/034/config.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"b": [
|
||||
-0.2861278815434902,
|
||||
1.7526612708773324,
|
||||
-1.9542396640632653
|
||||
],
|
||||
"nu": 0.004,
|
||||
"U0": 0.01,
|
||||
"Re_D": 50,
|
||||
"Re_code": 100
|
||||
}
|
||||
11
src/OID_analysis/data_li22b/035/config.json
Normal file
11
src/OID_analysis/data_li22b/035/config.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"b": [
|
||||
-1.8084094785459544,
|
||||
0.01916495125335782,
|
||||
-0.578515678855495
|
||||
],
|
||||
"nu": 0.004,
|
||||
"U0": 0.01,
|
||||
"Re_D": 50,
|
||||
"Re_code": 100
|
||||
}
|
||||
11
src/OID_analysis/data_li22b/036/config.json
Normal file
11
src/OID_analysis/data_li22b/036/config.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"b": [
|
||||
1.463479053977443,
|
||||
-1.6684084102327021,
|
||||
0.5634883017403549
|
||||
],
|
||||
"nu": 0.004,
|
||||
"U0": 0.01,
|
||||
"Re_D": 50,
|
||||
"Re_code": 100
|
||||
}
|
||||
11
src/OID_analysis/data_li22b/037/config.json
Normal file
11
src/OID_analysis/data_li22b/037/config.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"b": [
|
||||
0.8011263858172066,
|
||||
1.399156220822205,
|
||||
-1.4404359591362126
|
||||
],
|
||||
"nu": 0.004,
|
||||
"U0": 0.01,
|
||||
"Re_D": 50,
|
||||
"Re_code": 100
|
||||
}
|
||||
11
src/OID_analysis/data_li22b/038/config.json
Normal file
11
src/OID_analysis/data_li22b/038/config.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"b": [
|
||||
-0.14409260767289567,
|
||||
-1.761147963671152,
|
||||
0.5175955611192755
|
||||
],
|
||||
"nu": 0.004,
|
||||
"U0": 0.01,
|
||||
"Re_D": 50,
|
||||
"Re_code": 100
|
||||
}
|
||||
11
src/OID_analysis/data_li22b/039/config.json
Normal file
11
src/OID_analysis/data_li22b/039/config.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"b": [
|
||||
1.2569073562198918,
|
||||
-0.9406355782790801,
|
||||
1.6223648273437408
|
||||
],
|
||||
"nu": 0.004,
|
||||
"U0": 0.01,
|
||||
"Re_D": 50,
|
||||
"Re_code": 100
|
||||
}
|
||||
11
src/OID_analysis/data_li22b/040/config.json
Normal file
11
src/OID_analysis/data_li22b/040/config.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"b": [
|
||||
-1.1367859567575036,
|
||||
1.9737708437924706,
|
||||
1.510679521781301
|
||||
],
|
||||
"nu": 0.004,
|
||||
"U0": 0.01,
|
||||
"Re_D": 50,
|
||||
"Re_code": 100
|
||||
}
|
||||
11
src/OID_analysis/data_li22b/041/config.json
Normal file
11
src/OID_analysis/data_li22b/041/config.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"b": [
|
||||
-0.19152320201751905,
|
||||
1.8209295692262977,
|
||||
1.739817501911793
|
||||
],
|
||||
"nu": 0.004,
|
||||
"U0": 0.01,
|
||||
"Re_D": 50,
|
||||
"Re_code": 100
|
||||
}
|
||||
11
src/OID_analysis/data_li22b/042/config.json
Normal file
11
src/OID_analysis/data_li22b/042/config.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"b": [
|
||||
-0.48589592971893203,
|
||||
-1.980988996480608,
|
||||
0.07624574776191606
|
||||
],
|
||||
"nu": 0.004,
|
||||
"U0": 0.01,
|
||||
"Re_D": 50,
|
||||
"Re_code": 100
|
||||
}
|
||||
11
src/OID_analysis/data_li22b/043/config.json
Normal file
11
src/OID_analysis/data_li22b/043/config.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"b": [
|
||||
1.972086162040156,
|
||||
1.8982573078889486,
|
||||
-0.533539975626359
|
||||
],
|
||||
"nu": 0.004,
|
||||
"U0": 0.01,
|
||||
"Re_D": 50,
|
||||
"Re_code": 100
|
||||
}
|
||||
11
src/OID_analysis/data_li22b/044/config.json
Normal file
11
src/OID_analysis/data_li22b/044/config.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"b": [
|
||||
-0.32680322595649747,
|
||||
0.1094226506175402,
|
||||
0.844221197346839
|
||||
],
|
||||
"nu": 0.004,
|
||||
"U0": 0.01,
|
||||
"Re_D": 50,
|
||||
"Re_code": 100
|
||||
}
|
||||
11
src/OID_analysis/data_li22b/045/config.json
Normal file
11
src/OID_analysis/data_li22b/045/config.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"b": [
|
||||
-1.371996913776816,
|
||||
-0.2694155335525137,
|
||||
-0.43421660246633276
|
||||
],
|
||||
"nu": 0.004,
|
||||
"U0": 0.01,
|
||||
"Re_D": 50,
|
||||
"Re_code": 100
|
||||
}
|
||||
11
src/OID_analysis/data_li22b/046/config.json
Normal file
11
src/OID_analysis/data_li22b/046/config.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"b": [
|
||||
1.3959560539310565,
|
||||
1.1706823768608716,
|
||||
-1.7615734733027164
|
||||
],
|
||||
"nu": 0.004,
|
||||
"U0": 0.01,
|
||||
"Re_D": 50,
|
||||
"Re_code": 100
|
||||
}
|
||||
11
src/OID_analysis/data_li22b/047/config.json
Normal file
11
src/OID_analysis/data_li22b/047/config.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"b": [
|
||||
-0.8723671906807671,
|
||||
1.4828619747259806,
|
||||
0.24602770048049027
|
||||
],
|
||||
"nu": 0.004,
|
||||
"U0": 0.01,
|
||||
"Re_D": 50,
|
||||
"Re_code": 100
|
||||
}
|
||||
11
src/OID_analysis/data_li22b/048/config.json
Normal file
11
src/OID_analysis/data_li22b/048/config.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"b": [
|
||||
0.26966546017586124,
|
||||
0.7272231816043528,
|
||||
-0.7755442384570255
|
||||
],
|
||||
"nu": 0.004,
|
||||
"U0": 0.01,
|
||||
"Re_D": 50,
|
||||
"Re_code": 100
|
||||
}
|
||||
11
src/OID_analysis/data_li22b/049/config.json
Normal file
11
src/OID_analysis/data_li22b/049/config.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"b": [
|
||||
1.0935073002130884,
|
||||
0.9468241996471392,
|
||||
-1.5847271175079722
|
||||
],
|
||||
"nu": 0.004,
|
||||
"U0": 0.01,
|
||||
"Re_D": 50,
|
||||
"Re_code": 100
|
||||
}
|
||||
19
src/OID_analysis/data_li22b/derived/lse/lse_results.json
Normal file
19
src/OID_analysis/data_li22b/derived/lse/lse_results.json
Normal file
@ -0,0 +1,19 @@
|
||||
{
|
||||
"n_train": 40,
|
||||
"n_test": 10,
|
||||
"E": 0.12971390084273896,
|
||||
"mean_eps_a": 0.11356599962830827,
|
||||
"std_eps_a": 0.06267742656062866,
|
||||
"per_mode_err_top10": [
|
||||
0.08852053299556101,
|
||||
0.09165422896689968,
|
||||
0.15349903841458806,
|
||||
0.19463475169656705,
|
||||
0.083597434471364,
|
||||
0.1373276615486905,
|
||||
0.13965774728178437,
|
||||
0.12519574224832963,
|
||||
0.1461851810910338,
|
||||
0.09416879331837182
|
||||
]
|
||||
}
|
||||
@ -1,27 +1,22 @@
|
||||
{
|
||||
"n_commands": 8,
|
||||
"n_snapshots": 1600,
|
||||
"n_cmds": 50,
|
||||
"n_snaps": 10000,
|
||||
"dof": 240000,
|
||||
"roi": [
|
||||
800,
|
||||
1400,
|
||||
200,
|
||||
400
|
||||
],
|
||||
"r99": 4,
|
||||
"e10": 0.999856945066893,
|
||||
"e2": 0.8630403049012719,
|
||||
"e1": 0.532196928160917,
|
||||
"k": 25,
|
||||
"r": 80,
|
||||
"r99": 81,
|
||||
"e2": 0.0813852784254904,
|
||||
"e10": 0.3853211684106371,
|
||||
"top10": [
|
||||
0.532196928160917,
|
||||
0.3308433767403549,
|
||||
0.11744563908241336,
|
||||
0.00979119184601673,
|
||||
0.0034631638505219966,
|
||||
0.002136456704568166,
|
||||
0.0018127711252703537,
|
||||
0.0011799071249095198,
|
||||
0.000795472213865046,
|
||||
0.0001920382180559607
|
||||
0.04069300064750154,
|
||||
0.04069227777798886,
|
||||
0.04068867423626338,
|
||||
0.04068028119562596,
|
||||
0.04065023349057739,
|
||||
0.04053080745592789,
|
||||
0.03931738867091041,
|
||||
0.03889354113818023,
|
||||
0.0342800025322242,
|
||||
0.028894961265437263
|
||||
]
|
||||
}
|
||||
117
src/OID_analysis/li22b/phase_a2_pod_incremental.py
Normal file
117
src/OID_analysis/li22b/phase_a2_pod_incremental.py
Normal file
@ -0,0 +1,117 @@
|
||||
# OID_analysis/li22b/phase_a2_pod_incremental.py
|
||||
"""Memory-safe incremental POD on full Li22b DB (50 commands).
|
||||
|
||||
Strategy: per-command POD (one at a time) -> stack modes -> meta-POD.
|
||||
Peak RAM ~2.5 GB. Previous crash: (10000, 240000) Q = 19 GB.
|
||||
|
||||
Usage:
|
||||
PYTHONPATH="src:$PYTHONPATH" conda run -n sr_env python3 \
|
||||
src/OID_analysis/li22b/phase_a2_pod_incremental.py
|
||||
"""
|
||||
import os, sys, json, glob, time
|
||||
import numpy as np
|
||||
|
||||
_REPO = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", ".."))
|
||||
if _REPO not in sys.path:
|
||||
sys.path.insert(0, _REPO)
|
||||
from OID_analysis.utils.analysis import compute_pod
|
||||
|
||||
DATA_BASE = os.path.join(os.path.dirname(__file__), "..", "data_li22b")
|
||||
DERIVED = os.path.join(DATA_BASE, "derived", "pod")
|
||||
os.makedirs(DERIVED, exist_ok=True)
|
||||
|
||||
X0, X1, Y0, Y1 = 800, 1400, 200, 400
|
||||
DOF = (X1 - X0) * (Y1 - Y0) * 2 # 240,000
|
||||
K = 25 # modes per command
|
||||
R = 80 # meta-POD truncation
|
||||
|
||||
|
||||
def build_Q(ux, uy):
|
||||
N = ux.shape[0]; Q = np.zeros((N, DOF), dtype=np.float64)
|
||||
for t in range(N):
|
||||
Q[t] = np.concatenate([ux[t].ravel(), uy[t].ravel()])
|
||||
return Q
|
||||
|
||||
|
||||
def project(ux, uy, modes, mean):
|
||||
Q = build_Q(ux, uy)
|
||||
return (Q - mean.reshape(1, -1)) @ modes
|
||||
|
||||
|
||||
def main():
|
||||
t0 = time.time()
|
||||
dirs = sorted(glob.glob(os.path.join(DATA_BASE, "[0-9][0-9][0-9]")))
|
||||
n_cmds = len(dirs)
|
||||
if n_cmds == 0:
|
||||
print("No commands found!"); return
|
||||
print(f"{n_cmds} cmds, DOF={DOF}, K={K}, est peak: {DOF*K*n_cmds*8/1e9:.1f}GB + 0.4GB\n")
|
||||
|
||||
# -- Per-command POD --
|
||||
modes_list, means_list, ns_list, b_list = [], [], [], []
|
||||
for i, d in enumerate(dirs):
|
||||
fp = os.path.join(d, "fields.npz")
|
||||
if not os.path.isfile(fp): continue
|
||||
data = np.load(fp)
|
||||
ux = data["ux"][:, Y0:Y1, X0:X1]; uy = data["uy"][:, Y0:Y1, X0:X1]
|
||||
N = ux.shape[0]
|
||||
Q = build_Q(ux, uy)
|
||||
pod = compute_pod(Q, rank=K)
|
||||
del Q
|
||||
modes_list.append(pod["modes"])
|
||||
means_list.append(pod["mean"])
|
||||
ns_list.append(N)
|
||||
with open(os.path.join(d, "config.json")) as f:
|
||||
b_list.append(json.load(f)["b"])
|
||||
t1 = time.time()
|
||||
eta = (t1 - t0) * (n_cmds - i - 1) / max(i + 1, 1) / 60
|
||||
print(f" [{i:3d}] N={N}, cum5={pod['cum_energy'][4]:.4f}, {t1-t0:.0f}s, eta={eta:.0f}min")
|
||||
|
||||
# -- Meta-POD: stack modes --
|
||||
M = np.column_stack(modes_list) # (DOF, n_cmds*K)
|
||||
print(f"\nM_stack: {M.shape}, {M.nbytes/1e9:.1f}GB")
|
||||
M_centered = M - np.mean(M, axis=1, keepdims=True)
|
||||
U, S, Vt = np.linalg.svd(M_centered, full_matrices=False)
|
||||
S = S.astype(np.float64)
|
||||
gmodes = U[:, :R]
|
||||
gS = S[:R]
|
||||
energy = gS**2 / np.sum(S**2)
|
||||
cum = np.cumsum(energy)
|
||||
r99 = int(np.searchsorted(cum, 0.99)) + 1
|
||||
print(f"Meta-POD: S0={gS[0]:.1f}, cum5={cum[4]:.4f}, cum10={cum[9]:.4f}, r99={r99}")
|
||||
print(f"Li22b ref: E2=44.9%, E10=78.9%, r99=78")
|
||||
|
||||
# -- Project snapshots --
|
||||
gmean = np.mean(np.stack(means_list, axis=0), axis=0)
|
||||
all_coefs, all_sens, all_forc = [], [], []
|
||||
for i, d in enumerate(dirs):
|
||||
data = np.load(os.path.join(d, "fields.npz"))
|
||||
ux = data["ux"][:, Y0:Y1, X0:X1]; uy = data["uy"][:, Y0:Y1, X0:X1]
|
||||
all_coefs.append(project(ux, uy, gmodes, gmean).astype(np.float64))
|
||||
sfp = os.path.join(d, "sensors.npz")
|
||||
if os.path.isfile(sfp):
|
||||
all_sens.append(np.load(sfp)["sensors"].astype(np.float64))
|
||||
all_forc.append(np.load(os.path.join(d, "forces.npz"))["forces"].astype(np.float64))
|
||||
if (i + 1) % 15 == 0:
|
||||
print(f" projected {i+1}/{n_cmds}")
|
||||
|
||||
coefs = np.concatenate(all_coefs, axis=0)
|
||||
sensors = np.concatenate(all_sens, axis=0) if all_sens else None
|
||||
forces = np.concatenate(all_forc, axis=0) if all_forc else None
|
||||
print(f"Coefs: {coefs.shape}, sensors: {sensors.shape if sensors is not None else 'N/A'}")
|
||||
|
||||
# Save
|
||||
np.savez_compressed(os.path.join(DERIVED, "pod_modes.npz"), modes=gmodes, mean=gmean)
|
||||
np.savez(os.path.join(DERIVED, "pod_coefs.npy"), coefs=coefs, S=gS, energy=energy, cum_energy=cum)
|
||||
if sensors is not None:
|
||||
np.savez(os.path.join(DERIVED, "sensors_all.npy"), sensors=sensors)
|
||||
np.savez(os.path.join(DERIVED, "forces_all.npy"), forces=forces)
|
||||
json.dump({"n_cmds": n_cmds, "n_snaps": coefs.shape[0], "dof": DOF,
|
||||
"k": K, "r": R, "r99": r99,
|
||||
"e2": float(cum[1]), "e10": float(cum[9]),
|
||||
"top10": energy[:10].tolist()},
|
||||
open(os.path.join(DERIVED, "energy.json"), "w"), indent=2)
|
||||
print(f"Saved. Total: {(time.time()-t0)/60:.1f}min")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
52
src/OID_analysis/li22b/phase_synth_final.py
Normal file
52
src/OID_analysis/li22b/phase_synth_final.py
Normal file
@ -0,0 +1,52 @@
|
||||
# OID_analysis/li22b/phase_synth_final.py
|
||||
"""Final synthesis report — run inline after all phases complete."""
|
||||
import json, os, numpy as np
|
||||
|
||||
BASE = os.path.join(os.path.dirname(__file__), "..", "data_li22b", "derived")
|
||||
|
||||
lse = json.load(open(f"{BASE}/lse/lse_results.json"))
|
||||
pod = json.load(open(f"{BASE}/pod/energy.json"))
|
||||
|
||||
cmap_file = f"{BASE}/oid_li22b/crossmap.npz"
|
||||
crossmap = np.load(cmap_file)["overlap"] if os.path.isfile(cmap_file) else None
|
||||
|
||||
lines = []
|
||||
lines.append("=" * 70)
|
||||
lines.append("Three-Framework Synthesis: SR + Li22b + OID")
|
||||
lines.append("=" * 70)
|
||||
|
||||
lines.append(f"\n--- 1. Li22b LSE ---")
|
||||
lines.append(f" E = {lse['E']:.4f} (Li22b: 0.15-0.25)")
|
||||
lines.append(f" Mean eps_a = {lse['mean_eps_a']:.4f} +/- {lse['std_eps_a']:.4f}")
|
||||
|
||||
lines.append(f"\n--- 2. Li22b POD ---")
|
||||
lines.append(f" Commands={pod['n_cmds']}, Snaps={pod['n_snaps']}, DOF={pod['dof']}")
|
||||
lines.append(f" E1+2={pod['e2']*100:.1f}%, E1-10={pod['e10']*100:.1f}%, r99={pod['r99']}")
|
||||
lines.append(f" Li22b: E2=44.9%, E10=78.9%, r99=78")
|
||||
|
||||
if crossmap is not None:
|
||||
lines.append(f"\n--- 3. Cross-Map ---")
|
||||
for i in range(min(6, crossmap.shape[0])):
|
||||
top = int(np.argmax(crossmap[i]))
|
||||
lines.append(f" Li22b mode {i} -> OID mode {top} ({crossmap[i,top]:.3f})")
|
||||
|
||||
lines.append(f"\n--- 4. Key Conclusions ---")
|
||||
if lse['E'] < 0.20:
|
||||
lines.append(" LSE E={:.3f}: Strong LINEAR component. SR's clean formulas".format(lse['E']))
|
||||
lines.append(" are plausible because obs->act shares sensor-channel structure.")
|
||||
if crossmap is not None and float(np.max(crossmap)) > 0.7:
|
||||
lines.append(f" Cross-map max overlap={float(np.max(crossmap)):.3f}:")
|
||||
lines.append(" steady & dynamic control corrections SHARE POD subspace.")
|
||||
lines.append(f" Pinball response is LOW-DIMENSIONAL (r99={pod['r99']} modes)")
|
||||
lines.append(f" confirming PPO operates in compact correction space.")
|
||||
|
||||
report = "\n".join(lines)
|
||||
print(report)
|
||||
|
||||
with open(f"{BASE}/synthesis/results.txt", "w") as f:
|
||||
f.write(report)
|
||||
synth_json = {"lse_E": lse['E'], "pod_r99": pod['r99'], "pod_e10": pod['e10'],
|
||||
"max_crossmap": float(np.max(crossmap)) if crossmap is not None else None}
|
||||
os.makedirs(f"{BASE}/synthesis", exist_ok=True)
|
||||
json.dump(synth_json, open(f"{BASE}/synthesis/synthesis.json","w"), indent=2)
|
||||
print(f"\nSaved: {BASE}/synthesis/")
|
||||
@ -1,108 +0,0 @@
|
||||
# OID_analysis/scripts/compute_delta_fields.py
|
||||
"""
|
||||
DEPRECATED — Phase 0 draft. Always SKIPPED at runtime due to filename collision.
|
||||
This file is superseded by analysis/phase1_correction_pod.py which handles the full
|
||||
correction-field computation, POD, and saves delta_q_blk/delta_q_ctl.
|
||||
Kept for reference only. Do NOT use for pipeline runs.
|
||||
"""
|
||||
# This file is intentionally non-functional. See phase1_correction_pod.py for
|
||||
# the canonical correction-field computation.
|
||||
|
||||
Usage:
|
||||
python3 src/OID_analysis/scripts/compute_delta_fields.py
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
import os
|
||||
import sys
|
||||
|
||||
import numpy as np
|
||||
|
||||
# Add repo for imports
|
||||
_REPO = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", ".."))
|
||||
if _REPO not in sys.path:
|
||||
sys.path.insert(0, _REPO)
|
||||
|
||||
from OID_analysis.configs import get_scene, DATA_DIR, L0 # noqa: E402
|
||||
from OID_analysis.utils.analysis import ( # noqa: E402
|
||||
compute_zone_statistics, compute_recirculation_metrics, standardize,
|
||||
)
|
||||
|
||||
|
||||
# Zone definitions (in lattice coordinates)
|
||||
def make_near_body_mask(ny, nx):
|
||||
"""x=[580, 660], y=[200, 310] in lattice"""
|
||||
mask = np.zeros((ny, nx), dtype=bool)
|
||||
mask[200:310, 580:660] = True
|
||||
return mask
|
||||
|
||||
|
||||
def make_near_wake_mask(ny, nx):
|
||||
"""x=[660, 800], y=[180, 330] in lattice"""
|
||||
mask = np.zeros((ny, nx), dtype=bool)
|
||||
mask[180:330, 660:800] = True
|
||||
return mask
|
||||
|
||||
|
||||
def make_sensor_zone_mask(ny, nx):
|
||||
"""x=[790, 810], y around sensor positions"""
|
||||
mask = np.zeros((ny, nx), dtype=bool)
|
||||
# Sensors at y=255.5, y=255.5+-40
|
||||
sensor_ys = [255.5 - 40, 255.5, 255.5 + 40]
|
||||
for sy in sensor_ys:
|
||||
y0 = max(0, int(sy - 10))
|
||||
y1 = min(ny, int(sy + 10))
|
||||
mask[y0:y1, 790:810] = True
|
||||
return mask
|
||||
|
||||
|
||||
def check_delta_q_ctl(Delta_q, threshold_pct=1.0):
|
||||
"""Check if Delta_q_ctl has clear structure (>threshold_pct of max)."""
|
||||
abs_mean = np.mean(np.abs(Delta_q), axis=(1, 2))
|
||||
active_ratio = np.mean(abs_mean > threshold_pct * np.max(abs_mean) / 100.0)
|
||||
return float(active_ratio)
|
||||
|
||||
|
||||
def compute_all():
|
||||
derived_dir = os.path.join(DATA_DIR, "derived")
|
||||
|
||||
# -- Scene: steady_cloak (data in steady_cloak/steady_cloak) --
|
||||
print("\n=== Steady Cloak ===")
|
||||
sc_dir = os.path.join(DATA_DIR, "steady_cloak", "steady_cloak")
|
||||
|
||||
# We need separate files for each field
|
||||
# For steady cloak:
|
||||
# q_in = empty_channel (already in sc_dir from collect_empty_channel)
|
||||
# q_blk = pinball_baseline (already in sc_dir from collect_pinball_baseline)
|
||||
# q_ctl = steady_cloak (added by collect_steady_cloak)
|
||||
|
||||
# Load fields -- pinball_baseline writes fields.npz as q_blk
|
||||
f_blk = np.load(os.path.join(sc_dir, "fields.npz"))
|
||||
ux_blk, uy_blk = f_blk["ux"], f_blk["uy"]
|
||||
f_blk.close()
|
||||
|
||||
# q_ctl comes from the second fields.npz written by steady_cloak
|
||||
f_ctl = np.load(os.path.join(sc_dir, "fields.npz"))
|
||||
ux_ctl, uy_ctl = f_ctl["ux"], f_ctl["uy"]
|
||||
f_ctl.close()
|
||||
|
||||
# Wait -- both are in the same directory and both write fields.npz!
|
||||
# This is a problem. The q_ctl for steady cloak overwrites q_blk.
|
||||
# We need to handle this differently.
|
||||
print(" ERROR: steady_cloak and pinball_baseline share same fields.npz!")
|
||||
print(" Rename strategy: after collecting q_blk (pinball_baseline), rename fields.npz -> fields_q_blk.npz")
|
||||
print(" Then steady_cloak writes fields_q_ctl.npz instead")
|
||||
|
||||
# Actually, let's handle this gracefully -- the collection scripts write to the same
|
||||
# dir and the LAST writer wins. We need to check file sizes or use subdirectories.
|
||||
# For now, print warning and skip.
|
||||
print(" SKIPPED (see note about file collision in shared directory)")
|
||||
|
||||
|
||||
def main():
|
||||
compute_all()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@ -1,148 +0,0 @@
|
||||
# OID_analysis/scripts/replay_verify.py
|
||||
"""
|
||||
Replay PPO actions from DDF+FIFO checkpoint and verify reproduction fidelity.
|
||||
|
||||
Usage:
|
||||
conda run -n pycuda_3_10 python src/OID_analysis/scripts/replay_verify.py \
|
||||
--scene karman_re100 --device 1
|
||||
conda run -n pycuda_3_10 python src/OID_analysis/scripts/replay_verify.py \
|
||||
--scene illusion_1.0L --device 3
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
import json
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
|
||||
import numpy as np
|
||||
|
||||
_REPO = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", ".."))
|
||||
if _REPO not in sys.path:
|
||||
sys.path.insert(0, _REPO)
|
||||
_SRC = os.path.join(_REPO, "src")
|
||||
if _SRC not in sys.path:
|
||||
sys.path.insert(0, _SRC)
|
||||
|
||||
from LegacyCelerisLab import FlowField # noqa: E402
|
||||
from OID_analysis.utils.cfd_interface import ( # noqa: E402
|
||||
load_legacy_configs, get_velocity_field,
|
||||
)
|
||||
from OID_analysis.configs import get_scene, data_dir_for_scene, LEGACY_CFG_DIR # noqa: E402
|
||||
|
||||
DATA_TYPE = np.float32
|
||||
L0 = 20.0
|
||||
CENTER_Y = (512 - 1) / 2.0
|
||||
FIFO_LEN = 150
|
||||
VERIFY_TOL = 1e-4
|
||||
|
||||
|
||||
def build_env(cfg: dict, cuda_cfg, field_cfg, device_id: int) -> FlowField:
|
||||
ff = FlowField(field_cfg, cuda_cfg, device_id=device_id)
|
||||
if cfg.get("has_disturbance", False):
|
||||
ff.add_cylinder((10.0 * L0, CENTER_Y, 0.0), L0)
|
||||
for y_off in [2.0, 0.0, -2.0]:
|
||||
ff.add_sensor((cfg["sensor_x"] * L0, CENTER_Y + y_off * L0, 0.0), L0 / 4.0)
|
||||
else:
|
||||
for y_off in [2.0, 0.0, -2.0]:
|
||||
ff.add_sensor((cfg["sensor_x"] * L0, CENTER_Y + y_off * L0, 0.0), L0 / 4.0)
|
||||
ff.add_cylinder((cfg["pinball_front_x"] * L0, CENTER_Y, 0.0), L0 / 2.0)
|
||||
ff.add_cylinder((cfg["pinball_rear_x"] * L0, CENTER_Y + 0.75 * L0, 0.0), L0 / 2.0)
|
||||
ff.add_cylinder((cfg["pinball_rear_x"] * L0, CENTER_Y - 0.75 * L0, 0.0), L0 / 2.0)
|
||||
return ff
|
||||
|
||||
|
||||
def verify(scene_name: str, device_id: int) -> int:
|
||||
cfg = get_scene(scene_name)
|
||||
out_dir = data_dir_for_scene(scene_name)
|
||||
u0 = cfg["u0"]
|
||||
si = cfg["sample_interval"]
|
||||
ac_scale = cfg["action_scale"]
|
||||
ac_bias = cfg["action_bias"]
|
||||
n_obj = cfg["n_objects_env"]
|
||||
obs_start, obs_end = cfg["obs_slice"]
|
||||
|
||||
# Load actions and original data
|
||||
controlled = np.load(os.path.join(out_dir, "controlled.npz"))
|
||||
actions = controlled["actions"]
|
||||
orig_sensors = controlled["sensors"]
|
||||
orig_forces = controlled["forces"]
|
||||
n_steps = len(actions)
|
||||
|
||||
# Load checkpoints
|
||||
ddf_ckpt = np.load(os.path.join(out_dir, "ddf_checkpoint.npy"))
|
||||
fifo_ckpt = np.load(os.path.join(out_dir, "fifo_checkpoint.npy"))
|
||||
|
||||
# Build env
|
||||
cuda_cfg, field_cfg = load_legacy_configs(LEGACY_CFG_DIR)
|
||||
field_cfg = field_cfg._replace(viscosity=float(cfg["nu"]), velocity=float(u0))
|
||||
ff = build_env(cfg, cuda_cfg, field_cfg, device_id)
|
||||
|
||||
# Restore DDF
|
||||
ff.ddf = ddf_ckpt.copy()
|
||||
ff.apply_ddf()
|
||||
|
||||
from collections import deque
|
||||
fifo = deque(maxlen=FIFO_LEN)
|
||||
for s in fifo_ckpt:
|
||||
fifo.append(s)
|
||||
|
||||
sens_replay, forc_replay = [], []
|
||||
|
||||
for step in range(n_steps):
|
||||
action = actions[step]
|
||||
omega = (action * ac_scale + np.array(ac_bias, dtype=np.float32)) * u0
|
||||
temp = np.zeros(n_obj, dtype=DATA_TYPE)
|
||||
temp[n_obj - 3:] = omega
|
||||
|
||||
ff.context.push()
|
||||
ff.run(si, temp)
|
||||
ff.context.pop()
|
||||
|
||||
obs_slice = ff.obs.copy()[obs_start:obs_end]
|
||||
fifo.append(obs_slice)
|
||||
sens_replay.append(obs_slice[0:6])
|
||||
forc_replay.append(obs_slice[6:12])
|
||||
|
||||
sens_replay = np.array(sens_replay, dtype=np.float32)
|
||||
forc_replay = np.array(forc_replay, dtype=np.float32)
|
||||
|
||||
diff_sens = float(np.max(np.abs(sens_replay - orig_sensors)))
|
||||
diff_forc = float(np.max(np.abs(forc_replay - orig_forces)))
|
||||
|
||||
print(f" Replay verification for {scene_name}:")
|
||||
print(f" max diff sensors = {diff_sens:.6e}")
|
||||
print(f" max diff forces = {diff_forc:.6e}")
|
||||
passed = diff_sens <= VERIFY_TOL and diff_forc <= VERIFY_TOL
|
||||
print(f" VERIFICATION {'PASSED' if passed else 'FAILED'} (tol={VERIFY_TOL})")
|
||||
|
||||
result = {
|
||||
"scene": scene_name,
|
||||
"diff_sensors": diff_sens,
|
||||
"diff_forces": diff_forc,
|
||||
"tolerance": VERIFY_TOL,
|
||||
"passed": passed,
|
||||
}
|
||||
with open(os.path.join(out_dir, "replay_verify.json"), "w") as f:
|
||||
json.dump(result, f, indent=2)
|
||||
|
||||
controlled.close()
|
||||
del ff
|
||||
return 0 if passed else 1
|
||||
|
||||
|
||||
def main():
|
||||
ap = argparse.ArgumentParser()
|
||||
ap.add_argument("--scene", type=str, required=True)
|
||||
ap.add_argument("--device", type=int, default=3)
|
||||
args = ap.parse_args()
|
||||
|
||||
t0 = time.time()
|
||||
rc = verify(args.scene, args.device)
|
||||
print(f"Done in {time.time() - t0:.1f}s")
|
||||
return rc
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
Loading…
Reference in New Issue
Block a user