feat(SR): complete article-grade symbolic regression evidence

Freeze the contract-audited discovery, closed-loop validation, robustness, plotting, and manuscript evidence so the SR section is reproducible and ready for paper development.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Frank14f
2026-07-21 20:06:13 +08:00
co-authored by Cursor
parent ca8ee5f238
commit eac8c0018e
1039 changed files with 292934 additions and 1496 deletions
+452
View File
@@ -0,0 +1,452 @@
# Symbolic regression of learned flow-control policies
## 1. Purpose, evidence hierarchy and scope
The deep-reinforcement-learning (DRL) controllers used for hydrodynamic cloaking and illusion are effective, but their neural-network representation does not directly expose the control mechanism. Symbolic regression (SR) is therefore used as a post hoc policy-reduction method. The fitted expressions are empirical observation-to-action surrogates on states visited by PPO; they are not governing equations and are not identified directly from the Navier--Stokes equations.
This distinction matters in closed loop. A formula can reproduce PPO actions on a recorded trajectory and still alter the state distribution after deployment, accumulate phase error, develop an action bias, or destabilize CFD. Consequently, offline regression metrics are used to discover variables and topologies, whereas finite closed-loop CFD and trajectory similarity decide whether a candidate is useful. Term deletion and coefficient scaling then assess which parts of a deployed candidate matter.
The active software has three executable stages:
1. `stage_1_infer.py` collects contract-audited PPO trajectories;
2. `stage_2_fit.py` performs symbolic discovery and fixed-topology coefficient refitting;
3. `stage_3_validate.py` deploys PPO, symbolic, constant, or uncontrolled policies in CFD.
Within Stages 2--3, model selection has five phases: per-case discovery, within-objective joint discovery, topology freezing and coefficient refit, short and standard CFD screening, and term deletion/scaling. These phases are not additional software stages.
The fitted article evidence is deliberately narrower than the complete flow-control project. It contains four periodic Kármán-street cloaking policies and three cylinder-wake illusion policies. Kármán and illusion are never pooled into one regression. The disturbance-free steady scene is used only for post-selection calibration of the Kármán law. Transient-vortex, erase, V5, and historical SINDy analyses are outside the fitted evidence considered here.
Two evidence generations must remain separate:
- the **2026-07-18 primary evidence** contains the seven training trajectories, symbolic discovery, fixed-topology refits, 40-step screening, 200-step validation, and term tests;
- the **2026-07-20 coefficient-frozen extension** contains steady calibration, per-case diagnostic refits, 400-step duration tests, CSV exports, and pointwise unseen-condition deployments.
No extension condition participated in topology selection or coefficient estimation.
## 2. Physical labels, state contract and action units
### 2.1 Reynolds-number and target-size conventions
The inlet speed is \(U_0=0.01\) in lattice units and the pinball-cylinder diameter is \(D=20\). The historical Kármán scene names use a code Reynolds label based on the reference length \(2D=40\):
\[
Re_D=\frac{U_0D}{\nu}=\frac{\texttt{re\_code}}{2}.
\]
Thus `karman_re50`, `karman_re100`, `karman_re200`, and `karman_re400` denote \(\texttt{re\_code}=50,100,200,400\), corresponding to \(Re_D=25,50,100,200\). Both conventions must be stated whenever physical Reynolds numbers are compared.
The illusion scene names `illusion_0.75L`, `illusion_1L`, and `illusion_1.5L` are legacy target-size labels. Despite the historical configuration field name `target_diameter`, its value times \(L=20\) is passed to `LegacyCelerisLab.add_cylinder` as the cylinder **radius**. The labels are retained for provenance, but they must not be described as target-cylinder diameters.
The Kármán control sampling interval is 800 lattice steps. Illusion intervals are 400, 600, and 800 steps for the 0.75L, 1L, and 1.5L labels. With the convective scale \(D/U_0=2000\) lattice steps,
\[
\Delta t_c=\frac{\mathrm{sample\ interval}}{D/U_0},
\]
so the dimensionless control intervals are 0.4 for Kármán and 0.2, 0.3, and 0.4 for the three illusion scenes.
### 2.2 Native ordering
The canonical body and action order is
\[
(\mathrm{front},\mathrm{upper},\mathrm{lower}).
\]
The six downstream sensor channels are ordered
\[
(u_U,v_U,u_C,v_C,u_L,v_L),
\]
and the six force channels are
\[
(F_{x,F},F_{y,F},F_{x,U},F_{y,U},F_{x,L},F_{y,L}).
\]
This order follows the audited LegacyCelerisLab object IDs and force slots. It is not inferred from force signs. The runtime order gate is rerun after CFD or kernel changes because a silent slot permutation would change the physical meaning of every fitted coefficient.
### 2.3 PPO normalization and SR nondimensionalization
Two different transformations must not be conflated. PPO receives a clipped normalized observation: forces are divided by `force_norm_fact`, sensor velocities are centred by `sens_deviation` and divided by `sens_norm_fact`, and the result is clipped to \([-1,1]\). Illusion appends the normalized two-component target-cylinder force. The article trajectories use frozen existing normalization rather than recomputing normalization on each rollout.
SR does not fit these clipped PPO inputs. Recorded raw lattice data are converted to physical dimensionless features:
\[
\hat u=u/U_0,\qquad \hat v=v/U_0,
\]
\[
C_d=\frac{2F_x}{\rho U_0^2D},\qquad
C_l=\frac{2F_y}{\rho U_0^2D},
\]
with \(\rho=1\). The regression target is dimensionless cylinder surface velocity
\[
\boldsymbol{\alpha}_t
=\frac{\boldsymbol{\omega}_t}{U_0}
=(\alpha_{F,t},\alpha_{U,t},\alpha_{L,t})^{\mathsf T}.
\]
A PPO-normalized command is decoded before fitting as
\[
\boldsymbol{\alpha}
=s_a\mathbf a_{\mathrm{norm}}+\mathbf b_a.
\]
The Kármán action scale and bias are \(s_a=8\) and \((0,-4,4)\); the illusion values are \(s_a=4\) and \((0,-2,2)\). Stage 1 stores the normalized command, dimensionless \(\alpha\), and lattice \(\omega=U_0\alpha\), making unit conversion auditable.
## 3. Article trajectories and causal dataset
Seven new deterministic PPO trajectories were collected:
\[
\mathcal D_K=\{\texttt{re50},\texttt{re100},\texttt{re200},\texttt{re400}\},
\]
\[
\mathcal D_I=\{0.75L,1L,1.5L\}.
\]
Each trajectory contains 200 recorded post-action states. The causal contract is
\[
x_i\longmapsto\alpha_{i+1},
\]
named `causal_post_state_to_next_action`. At state \(x_i\), action-history features may use \(\alpha_i\) and \(\alpha_{i-1}\), but never a future action. The requirement for \(\alpha_{i+1}\) removes the final state and the two-row action-history warm-up removes indices 0 and 1, leaving state indices 2--198: 197 fitted rows per trajectory.
Every trajectory is aligned and split independently before stacking. The discovery split is contiguous 60/20/20% train, validation, and blind data; temporal rows are not randomly shuffled and boundaries never cross trajectories. The blind block is not fitted during topology discovery. After a topology has been frozen, its numerical constants are refitted on all eligible aligned rows. Therefore, the blind block protects topology selection but is no longer an untouched holdout after final refitting; final scientific acceptance comes from closed-loop CFD.
The PPO model was replayed on each stored causal state using the frozen observation normalization and decoder. All seven action sequences reproduced exactly. Historical and pre-contract trajectories remain available for diagnosis but are not pooled with the article dataset.
## 4. Candidate variables and reflection symmetry
### 4.1 Feature libraries
The `raw_complete` representation contains twelve variables: six dimensionless sensor velocities and the drag/lift coefficients of the front, upper, and lower cylinders.
The `symmetry` representation contains fourteen variables:
\[
(u_s,u_a,u_c,v_s,v_a,v_c,
C_{d,F},C_{d,\mathrm{rear},s},C_{d,\mathrm{rear},a},C_{d,\mathrm{tot}},
C_{l,F},C_{l,\mathrm{rear},s},C_{l,\mathrm{rear},a},C_{l,\mathrm{tot}}).
\]
The rear and sensor coordinates use half-sums and half-differences. For example,
\[
u_s=\frac{u_U+u_L}{2},\qquad
u_a=\frac{u_U-u_L}{2},
\]
\[
C_{d,\mathrm{rear},s}=\frac{C_{d,U}+C_{d,L}}{2},\qquad
C_{d,\mathrm{rear},a}=\frac{C_{d,U}-C_{d,L}}{2},
\]
with identical conventions for \(v\) and lift. This factor of one half is part of the formula contract: omitting it would rescale the reported coefficients.
Illusion discovery compares four controlled profiles:
- `actual_only`: actual-state variables only;
- `target_only`: target \(C_d\) and \(C_l\) only;
- `actual_plus_target`: actual state plus target force coefficients;
- `actual_plus_error`: actual state plus \(C_{d,\mathrm{tot}}-C_{d,\mathrm{target}}\) and \(C_{l,\mathrm{tot}}-C_{l,\mathrm{target}}\).
The article discovery does not add trigonometric phase coordinates or a manual bias column. PySR may still create numerical constants. Cross-correlation is never used to choose a feature lag.
### 4.2 Complete reflection map
Reflection \(G\) about the centreline exchanges upper and lower positions. Streamwise velocity is even, transverse velocity is odd, drag is even, and lift is odd. Thus upper/lower sensor and force slots are exchanged with the appropriate transverse/lift sign reversal. Front drag is even and front lift is odd. Target drag is even and target lift is odd. The same map is applied to any action history.
The native action transforms as
\[
G_a(\alpha_F,\alpha_U,\alpha_L)
=(-\alpha_F,-\alpha_L,-\alpha_U).
\]
Fit augmentation and deployment architecture are separate. G augmentation adds mirrored state-action rows during fitting. The final mapped-shared deployment imposes
\[
\operatorname{odd}[h](x)=\frac{h(x)-h(Gx)}{2},
\]
\[
\alpha_F(x)=\operatorname{odd}[h_F](x),\qquad
\alpha_U(x)=h_R(x),\qquad
\alpha_L(x)=-h_R(Gx).
\]
This is a physical inductive bias imposed on the symbolic controller. It does not establish exact PPO equivariance, and symmetrization may modify as well as simplify the PPO policy. Independent three-head fits are retained only as diagnostics of PPO structure.
## 5. Discovery, refitting and safety
### 5.1 PySR discovery
The discovery grammar uses binary \(+\), \(-\), and multiplication, with `square` as the unary operator. Search is deterministic and serial, without batching. The full defaults are 30 populations, population size 33, tournament size 10, maximum expression size 15, constant complexity 2, and parsimony 0.01. The bounded article discovery configuration (`--smoke`) uses two populations, population size 16, tournament size 4, and maximum size 7. At least three deterministic seeds are run per case/profile.
Only training blocks are fitted. Up to 25 retained Pareto candidates per head are evaluated on contiguous train, validation, and blind blocks using \(R^2\), MAE, RMSE, maximum error, complexity, and used variables. Static safety is a finite-value probe over sparse points spanning observed feature ranges; because no required output interval is supplied, it is not a global action-range guarantee.
Topology selection is a manual, evidence-based scientific step. It considers recurrence across seeds and cases, held-out diagnostics, complexity, finite static evaluation, compatibility with mapped-shared deployment, and CFD viability. PySR score or \(R^2\) never automatically promotes a formula, and an average cannot hide failure in one required scene.
### 5.2 Fixed-topology refit
After selecting a recurring topology, every numerical literal is replaced by a separate optimization parameter while operators and feature occurrences remain fixed. Constants are optimized with `scipy.optimize.least_squares`. Residuals use square-root sample weights so each case has equal total mass and trajectories within a case also have equal mass. Mapped-shared refits retain G augmentation. The artifact records initial/refitted constants, optimizer status, aggregate/per-case/per-trajectory metrics, discovery-parent path and hash, dataset hashes, feature order, action units, alignment, and deployment semantics.
Offline metrics describe PPO action imitation on PPO-visited states. They cannot be ranked directly against closed-loop DTW because symbolic deployment changes the state distribution.
### 5.3 Formula and CFD safety
Formula artifacts carry separate fitted/deployment expressions and hashes. Evaluation permits only declared features and a restricted function set, rejects unsupported syntax and variables, and performs a zero-state probe when Stage 3 loads a formula pair. Static finite probing is only a pre-screen.
Closed-loop safety is decisive. The symbolic policy maintains separate online feature histories for \(x\) and \(Gx\), initialized from the scene policy action. Every action and raw CFD observation is checked for finiteness. A failure retains partial telemetry, failed-step information, hashes, and the exception instead of overwriting the run. Candidates first receive a 40-step screen, then a 200-step standard validation. The 2026-07-20 extension adds 400-step tests without changing coefficients.
### 5.4 Legacy DTW metric
The only article metric is `legacy_dtw_v1_abs_n_unclipped`, recorded under `legacy_reference_cycle_vs_last_recorded_cycle`. For Kármán, `conv_len=30`; for illusion, `conv_len=36`. Lag is selected from transverse sensor channel 1 by cross-correlating target samples `conv_len:2*conv_len` with the final controlled `conv_len` samples. The complete target sequence is circularly shifted by that lag. Absolute, normalized, unclipped DTW similarity
\[
S_j=1-\frac{d_{\mathrm{DTW}}(y^{\mathrm{target}}_j,y^{\mathrm{controlled}}_j)}{N}
\]
is then computed independently for all six sensor channels, and the reported value is their arithmetic mean. One is ideal; the metric may be negative. Lag is a metric-alignment parameter, not a physical observation or actuation delay. The scalar score compares a reference cycle with the final recorded cycle; 400-step CSV convergence files are needed to inspect its evolution over duration.
## 6. Attempt ledger and selection lessons
Broad per-case searches showed heterogeneous Kármán formulas rather than a clean two-regime partition. Joint symmetry searches repeatedly selected front rear-drag asymmetry and a rear lift-plus-constant topology. For illusion, endpoint cases selected different variable families, motivating profile-controlled joint searches instead of a hand-reduced universal library.
Two illusion front topologies remained plausible offline. Topology A combined \(C_{d,\mathrm{rear},a}\) and \(C_{l,F}\). Topology B used \(C_{d,\mathrm{rear},s}C_{l,F}-C_{l,\mathrm{tot}}\). Topology B completed 40 steps at 0.75L with similarity 0.958889 and lag 7, but both 1L and 1.5L failed with `FloatingPointError: raw observation contains non-finite values`. Its formula-pair hash is `93615f0809c76d722a9cd781e08b23e1167a2004957964807a3d661f5c98ee38`. It was rejected, and its failures were retained. This is the clearest demonstration that an offline Pareto candidate and even one successful scene cannot substitute for all-case closed-loop screening.
Older pre-force-order formulas, round-one results, SINDy paths, V5 experiments, and archived Stage 4 figures remain historical or diagnostic. They are not alternative current entrypoints and their numbers are not imported into the article evidence.
## 7. Kármán-street cloaking results
### 7.1 Joint law and offline fit
The selected fixed-topology law is
\[
\boxed{\alpha_F(x)=\operatorname{odd}\!\left[-0.381391\,C_{d,\mathrm{rear},a}\right]},
\]
\[
\boxed{\alpha_U(x)=1.307782\,C_{l,\mathrm{rear},s}-3.431209,\qquad
\alpha_L(x)=-\alpha_U(Gx)}.
\]
The formula-pair hash is `a678f2019e0da7a0e1263f0c911b377106a668a6716ba93d6efd78f58de0a3f1`; the front and rear deployment-expression hashes are `367b5b7e...d4650` and `75207940...60f7`.
Aggregate offline metrics are:
- front head: \(R^2=0.5699\), MAE 0.8872, RMSE 1.1876, maximum error 3.1129;
- rear shared head: \(R^2=0.4363\), MAE 1.6187, RMSE 2.0608, maximum error 5.6964.
The per-case contrast is scientifically informative. Front \(R^2\) is 0.2488, 0.8671, 0.6100, and 0.8893 for the four code-Re labels. Rear \(R^2\) is -0.5315, 0.5666, 0.5483, and 0.2242. Re50 therefore has poor offline rear-action imitation but excellent closed-loop similarity, whereas Re400 has a strong front offline fit and the weakest standard closed-loop score. Offline action accuracy is not the control-performance ordering.
### 7.2 Standard and duration validation
The 200-step similarities at code labels Re50, Re100, Re200, and Re400 are 0.9543, 0.9427, 0.8560, and 0.7827. The shared law is strongest at lower/intermediate conditions and degrades at Re400; it is not a universal cross-Re law.
At 400 steps, similarities are 0.952178, 0.944339, 0.863850, and 0.833365. Every telemetry channel remains finite. The Re400 limitation is therefore not delayed numerical blow-up over this tested horizon, although one 400-step realization cannot establish statistical robustness.
### 7.3 Term deletion
Forty-step deletion tests provide the following sequence over Re50/Re100/Re200/Re400:
- delete front feedback: 0.939361 / 0.912182 / 0.881434 / 0.813289;
- remove rear lift feedback but retain the constant: 0.917126 / 0.869943 / 0.825250 / 0.789535;
- remove the rear constant but retain lift feedback: 0.839344 / 0.817735 / 0.708089 / 0.647401.
Within this short ablation horizon, the supported ordering is
\[
\text{rear constant}>\text{rear lift feedback}>\text{tested front feedback}.
\]
The persistent rear counter-rotation is therefore the dominant tested controller component. Its interpretation as downstream-deficit compensation is consistent with the expected gap-flow and momentum correction, but SR alone does not observe the spatial momentum field and does not prove causality.
### 7.4 Per-case fixed-topology diagnostics
Refitting the same topology separately gives \((a,b,c)\) in \(\alpha_F=-aC_{d,\mathrm{rear},a}\), \(\alpha_U=bC_{l,\mathrm{rear},s}-c\):
- Re50: (0.5836, 0.2212, 3.5820), rear \(R^2=0.0221\);
- Re100: (0.3248, 1.3203, 4.1774), rear \(R^2=0.7131\);
- Re200: (0.5003, 1.6971, 3.4109), rear \(R^2=0.5788\);
- Re400: (0.2947, 1.0549, 2.5545), rear \(R^2=0.3285\).
The coefficients vary non-monotonically and do not support a clean low/high-Re split. These fits are offline diagnostics and were not promoted as independent closed-loop controllers.
### 7.5 Steady calibration
A disturbance-free pinball independently calibrates the order of magnitude of the rear constant. A discrete constant counter-rotation sweep \(A=0,1,\ldots,6\), with rear commands \((-A,+A)\), gives similarities 0.631830, 0.723858, 0.857286, 0.955029, 0.976376, 0.987212, and 0.978674. Thus \(A=5\) is the best **sampled** value, not a continuously optimized value.
The Kármán law in the same steady scene gives similarity 0.966494. Its final-cycle mean actions are -0.000563, -3.430589, and 3.431828 for front, upper, and lower, consistent with its analytical constant magnitude 3.431209. The fitted value is about 68.6% of the sampled \(5U_0\) optimum. This establishes scale consistency between the learned constant and useful steady compensation; it is not an equality between wake velocity deficit, momentum deficit, and cylinder surface speed.
### 7.6 Pointwise unseen-Re extension
Without coefficient retuning, 200-step deployments at code labels Re25, Re70, Re150, and Re300 give 0.988078, 0.954339, 0.907496, and 0.835758. Re70/Re150/Re300 are interpolation points within the fitted code-label range; Re25 is one low-Re extrapolation. The results show finite pointwise deployment at these sampled configurations only. There is no high-Re extrapolation above Re400, no continuous coefficient law, and no repeated-initial-condition uncertainty estimate.
## 8. Illusion results
### 8.1 Per-size discovery and selected law
Broad discovery changes systematically across legacy target-size labels. At 0.75L, \(C_{d,\mathrm{rear},a}\) and \(C_{d,\mathrm{rear},s}\) appear 15 and 10 times across audited heads. The 1L searches are mixed/transitional, led by \(C_{d,F}\) (13) and \(C_{l,\mathrm{rear},s}\) (12). At 1.5L, \(C_{l,F}\) and \(C_{l,\mathrm{rear},s}\) appear 54 and 46 times, showing a lift-contrast-dominated endpoint.
The stable joint numerical candidate is
\[
\boxed{\alpha_F(x)=\operatorname{odd}\!\left[-1.826604\,C_{d,\mathrm{rear},a}+2.064493\,C_{l,F}\right]},
\]
\[
\boxed{\alpha_U(x)=1.254440\,C_{d,\mathrm{rear},a}-1.528074\,C_{l,F},\qquad
\alpha_L(x)=-\alpha_U(Gx)}.
\]
Its formula-pair hash is `ae67ae5071065b7ee8412791ee1841011530746865528641beddb1a203c51b83`; front/rear expression hashes are `1df7c515...0487` and `485de2ca...b8e8`.
### 8.2 Offline fit versus closed-loop performance
Aggregate offline metrics are:
- front head: \(R^2=0.4851\), MAE 1.3075, RMSE 1.9726, maximum error 6.6080;
- rear shared head: \(R^2=0.3598\), MAE 1.3347, RMSE 1.5823, maximum error 5.1284.
Per-case front \(R^2\) is 0.5850, -1.7176, and 0.5054 for 0.75L, 1L, and 1.5L; rear \(R^2\) is -5.7162, -12.5115, and 0.5923. The negative values must be retained: the candidate is not a uniformly accurate PPO action surrogate.
Nevertheless, 200-step closed-loop similarities are 0.8749, 0.9217, and 0.8306. At 400 steps they are 0.854379, 0.915609, and 0.833587, with finite telemetry. Closed-loop viability despite weak offline action fit again demonstrates that the deployed controller cannot be selected by \(R^2\) alone.
### 8.3 Per-size fixed-topology diagnostics
Separate refits produce:
- 0.75L front: \(-0.2420C_{d,\mathrm{rear},a}-0.8373C_{l,F}\), \(R^2=0.8035\); rear: \(0.2486C_{d,\mathrm{rear},a}+0.0829C_{l,F}\), \(R^2=-5.4396\);
- 1L front: \(2.0438C_{d,\mathrm{rear},a}-2.2193C_{l,F}\), \(R^2=0.6060\); rear: \(0.1843C_{d,\mathrm{rear},a}-0.1588C_{l,F}\), \(R^2=-11.2480\);
- 1.5L front: \(-0.0441C_{d,\mathrm{rear},a}+2.1015C_{l,F}\), \(R^2=0.5421\); rear: \(1.5683C_{d,\mathrm{rear},a}-1.6011C_{l,F}\), \(R^2=0.5948\).
The 1.5L front is nearly pure front-lift feedback and its rear coefficients are roughly an order of magnitude larger than the poorly identified smaller-target rear fits. Sign changes and very negative smaller-target rear \(R^2\) values prevent promotion of a clean two-group coefficient mechanism. These are diagnostics of the compromise made by a shared static topology.
### 8.4 Deletion and non-uniqueness
All four one-term deletion variants completed 40 steps. For 0.75L/1L/1.5L:
- delete first front term: 0.939375 / 0.933481 / 0.885085;
- delete second front term: 0.960067 / 0.927035 / 0.836563;
- delete first rear term: 0.954488 / 0.936851 / 0.887603;
- delete second rear term: 0.954641 / 0.930454 / 0.850816.
Thirty-seven preregistered coefficient-scaling shadow variants remained finite. The \(C_{l,F}\) terms dominate action-amplitude sensitivity, while \(C_{d,\mathrm{rear},a}\) is weaker and partly replaceable. Because all one-term deletions remain stable and differences are modest over 40 steps, the four-term expression is not unique and no individual term is established as universally necessary.
Target and error variables were available but did not recur in the selected low-complexity static topology. This is negative evidence against claiming explicit target tracking; it is not proof that target information is physically irrelevant. Target phase may be aliased into PPO-visited forces, may require memory, or may enter differently across size regimes.
### 8.5 Pointwise unseen-size extension
Coefficient-frozen 200-step interpolation at 0.8L and 1.2L gives 0.884573 and 0.925530. Extrapolation at 0.5L, 0.6L, and 2L gives 0.784055, 0.821103, and 0.756880. Every sampled run completes, but degradation toward the extremes is clear. These are single pointwise realizations and do not define a universal target-size law.
The defensible illusion conclusion is therefore narrower than for Kármán: a shared symmetric numerical controller exists over the tested family, with 1.5L a structurally different boundary regime, but the present static law does not identify a unique target-dependent mechanism.
## 9. SR-to-OID/CCD handover
SR identifies actuator-side observation-to-action structure. It does not identify where the corresponding flow correction is located. The handover to OID/CCD is therefore a ranked, falsifiable target list rather than a claim that the structures have already been found.
For Kármán:
1. **Rear steady counter-rotation, strongest evidence.** OID should search for a reflection-symmetric streamwise correction generated in the rear gap and retained at the sensor station. CCD should quantify the rear-pair relation to the mean/low-frequency downstream deficit mode.
2. **Symmetric rear lift feedback, moderate evidence.** Coefficients vary from 0.22 to 1.70, so the term is a condition-dependent modulation rather than a universal gain. Seek a rear-cylinder force-correlated source and lagged downstream descendant.
3. **Rear drag asymmetry in front action, weak evidence.** Test an antisymmetric near-front structure and expect weaker downstream canonical correlation.
For illusion:
1. **Front lift, moderate evidence.** Compare front-body source structures across target-size labels and test whether descendants change wavelength or phase.
2. **Rear drag asymmetry, weak-to-moderate evidence.** Search for antisymmetric rear-gap structures, explicitly contrasting 1.5L with smaller labels.
3. **Absence of explicit target/error terms, negative evidence.** Use lagged and phase-resolved analyses because static obs--act regression can alias memory or phase into force observations.
For every element, actuator-to-source and source-to-downstream relations must be reported separately; upper/lower parity must be preserved; lag must be stated in \(D/U_0\); and spatial coincidence must not be promoted to causality without time-lagged evidence. Agreement between SR ranking and OID/CCD correlation is convergent evidence. Contradictions must be retained and used to revise the interpretation rather than forcing agreement.
## 10. Limitations and claim discipline
The analysis has the following explicit limitations.
1. There is one 200-step PPO trajectory per fitted case. PySR seed recurrence is not recurrence over independent PPO or CFD trajectories.
2. Temporal rows are correlated; 197 rows are not 197 independent flow realizations.
3. The symbolic grammar, complexity bound, population settings, and finite seed count do not establish a global symbolic optimum.
4. Exact reflection symmetry is imposed, not discovered, and may modify the original PPO.
5. The selected laws are static and instantaneous. They cannot represent explicit memory, and failure to select target variables does not show memory or target information is unnecessary.
6. All eligible rows are reused after topology freezing, so final coefficient metrics are not a fully blind estimate.
7. The standard and extension runs report one deterministic realization per condition; no repeated-initial-phase or disturbance uncertainty interval is available.
8. The DTW result depends on the selected reference/final-cycle window and lag alignment, is not a full-field metric, and cannot prove mechanism identity.
9. Generalization is pointwise over sampled Reynolds labels and target sizes. Geometry perturbations, sensor noise, actuator mismatch, altered sampling, and other disturbances are untested.
10. No preregistered scalar DTW success threshold exists. Finiteness is a hard gate, while performance language is relative and case-specific.
11. There is no transient-vortex SR evidence in the current fitted package.
12. The steady sweep does not establish a momentum-balance equality or a continuous optimum.
13. OID/CCD causal structures are future/independent evidence, not present SR results.
Accordingly, the evidence **establishes** a reproducible discovery-to-CFD workflow, the dominance of the rear constant within the tested Kármán law, secondary short-horizon value of rear lift feedback, a finite shared illusion numerical candidate, and the inadequacy of offline fit alone for controller selection. It **supports, with bounded scope**, a shared Kármán backbone over tested conditions and finite pointwise extension performance. It does **not establish** uniqueness, universality, explicit illusion target tracking, necessity of every illusion term, physical delay from DTW lag, or causal deficit compensation without field-level analysis.
## 11. Reproducibility and evidence map
### 11.1 Environments and resources
Stage 1, policy replay, and Stage 3 use conda environment `pycuda_3_10`. PySR discovery and numerical refitting use `sr_env`. CFD runs are strictly serialized on physical GPU 2. With `CUDA_VISIBLE_DEVICES=2`, scripts use logical device 0; provenance records visibility and GPU identity. Run IDs are immutable and failure telemetry is retained.
At the 2026-07-21 final-consolidation revision, the CPU contract suite is run from the repository root with:
```bash
PYTHONPATH=src conda run -n sr_env python -m pytest \
src/SR_analysis/tests tests/test_stage_3_validate.py -q
```
The expected result at the 2026-07-21 plotting-package revision is 88 passed tests. This count is revision-specific rather than a timeless scientific result.
### 11.2 Primary and extension packages
The primary evidence index is:
```text
src/SR_analysis/results/runs/article-joint-sr-final-20260718/
readable_summary.txt
evidence_manifest.json
```
The coefficient-frozen extension is indexed by:
```text
src/SR_analysis/results/runs/article2-sr-elements-20260720/
src/SR_analysis/results/runs/article2-steady-analysis-20260720/
src/SR_analysis/results/runs/article2-percase-refit-summary-20260720/
src/SR_analysis/results/runs/article2-generalization-summary-20260720/
```
Standard-duration PPO/SR/target CSVs, including wide/long tables and DTW convergence, are under `article2-timeseries-csv-20260720/`. Four-hundred-step SR/target exports are under `article2-long-timeseries-csv-20260720/`.
### 11.3 Stable identities
The archived fitting Git SHA is `ca8ee5f238ee58eaaf48027ad026c35784f76d4d`. Kármán and illusion dataset hashes are respectively
```text
dcbfdaaa48a61bd904bb540f3067760530bd69e88ce87d54110a79ecc54b79d6
50c1d9f95bd72afc14e2d06a205bf4432672224ebf7daeb442ea6c517fbd9ab7
```
Formula-pair hashes are
```text
Karman: a678f2019e0da7a0e1263f0c911b377106a668a6716ba93d6efd78f58de0a3f1
Illusion: ae67ae5071065b7ee8412791ee1841011530746865528641beddb1a203c51b83
```
Formula JSON files carry exact commands, parent hashes, feature order, expression hashes, optimizer state, environment, and offline metrics. Validation JSON files carry formula/configuration hashes, metric details, GPU identity, telemetry hash, termination, and record hash. `scene_registry.json` is not the authority for current article evidence, and integrity auditing does not automatically promote a candidate.
## 12. Final paper-level conclusion
The Kármán analysis provides the strongest mechanism-oriented SR result. A persistent rear-pair counter-rotation is the dominant tested component; rear symmetric-lift feedback gives secondary short-horizon value; the tested front correction is weak. The constant has the same physical order as independently useful steady counter-rotation, which is consistent with a wake-deficit-compensation hypothesis. Spatial momentum correction and causality remain for OID/CCD, and reduced Re400 performance prevents a universal-law claim.
The illusion analysis provides a stable shared symmetric numerical controller but not a unique target-tracking mechanism. Front-lift terms dominate action sensitivity, drag-asymmetry terms are partly replaceable, and 1.5L is a distinct boundary regime. Static target/error variables were not selected robustly, so further mechanism work should use controlled target-aware dynamic structures and independent field decomposition rather than broader unconstrained symbolic searches.
The general methodological conclusion is that SR in closed-loop flow control should be treated as hypothesis generation plus deployment testing. Formula compactness and offline fit identify candidates; CFD stability, trajectory similarity, ablation, and independent flow-field evidence determine what can be interpreted physically.
+321 -173
View File
@@ -1,210 +1,358 @@
# SR_analysis Pipeline
# Article SR pipeline
> Symbolic regression pipeline for extracting interpretable DRL control laws (obs -> act)
> from the fluidic pinball. Four independent stages: inference -> fitting -> validation -> analysis.
This is the authoritative execution and design document for `SR_analysis`. Read `README.md` first for the scientific summary and current conclusions.
## Pipeline Architecture
## 1. Method in one diagram
```
[PPO Inference] [PySR Fitting] [CFD Validation] [Analysis/Figures]
stage_1_infer.py -> stage_2_fit.py -> stage_3_validate.py -> stage_4_analyze.py
| | | |
controlled.npz formulas/*.json validations/*.json figures/*.png+pdf
target.npz FIGURE_INDEX.md
```mermaid
flowchart LR
contracts[Channel and causal contracts] --> data[PPO trajectories]
data --> perCase[Per-case broad discovery]
perCase --> joint[Within-objective joint discovery]
joint --> refit[Fixed-topology all-data refit]
refit --> safety[Static and replay safety]
safety --> shortCFD[Short serial CFD]
shortCFD --> standardCFD[200-step legacy DTW]
standardCFD --> longCFD[400-step duration check]
longCFD --> generalization[Unseen-condition CFD]
standardCFD --> steady[Steady-cloak calibration]
standardCFD --> ablation[Term deletion and scaling]
steady --> interpretation[Physical interpretation and limits]
generalization --> interpretation
ablation --> interpretation
```
## Environments
The workflow has one scientific route:
| Env | Used For | Key Packages |
|-----|----------|-------------|
| `pycuda_3_10` | Stage 1 (CFD inference), Stage 3 (CFD validation), Stage 4 (analysis) | pycuda, numpy, matplotlib, torch, stable-baselines3 |
| `sr_env` | Stage 2 (PySR symbolic regression) | pysr, numpy, sympy |
```text
stage_1_infer.py -> stage_2_fit.py -> stage_3_validate.py
```
GPU: device 2 recommended (device 0 may conflict with PyTorch).
Checks and diagnostics gate or interpret this route; they do not create a parallel pipeline.
## Key Conventions
## 1.1 Article2 extension commands
### Reynolds Number
- Code Re uses reference length 2D = 40: `Re = U0 * 40 / nu`
- Physical Re_D uses D = 20: `Re_D = Re / 2`
- Default: Re_code=100 -> Re_D=50, nu=0.004
### Action
- `controlled.npz` stores actions as **normalized [-1, +1]** (not physical omega)
- Physical omega: `omega = (action * scale + bias) * U0`
- Fitting target: **non-dimensional alpha = (omega * radius) / (surface_vel * U0)**
### Action Decoder Bias (scene-specific)
| Scene | Scale | Bias |
|-------|:-----:|------|
| Karman | 8 | [0, -4, 4] |
| Illusion | 8 | [0, -2, 2] |
| Vortex | 4 | [0, -4, 4] |
### G-Mirror Symmetry
- Correct: `[aF, aT, aB] -> [-aF, -aB, -aT]`
- v23 structure: Front no-bias, rear shared-head (alpha_B = -Top composed with G)
### Inlet
- Parabolic velocity profile (not uniform). Top/bottom walls are no-slip bounce-back.
- U0 = 0.01 at centerline (lattice units)
### Sample Interval & Validation Steps
| Scene | SI | Validation Steps (rule: >= NX/U0/SI) |
|-------|:--:|:-------------------------------------:|
| Karman | 800 | 160-200 |
| Illusion 0.75L | 400 | 320 |
| Illusion 1L | 600 | 214 |
| Illusion 1.5L | 800 | 160 |
| Vortex | 800 | 150 (transient) |
---
## Stage 1: PPO Inference Data Generation
Generates `controlled.npz` (sensors, forces, actions) and `target.npz` for all scenes.
All CFD commands remain serialized and use physical GPU 2. `--device 0` is the logical device after masking.
```bash
# Karman cloak (all trained Reynolds numbers)
for re in 50 100 200 400; do
conda run -n pycuda_3_10 python stage_1_infer.py --scene karman_re${re} --device 2
done
CUDA_VISIBLE_DEVICES=2 PYTHONPATH=src conda run -n pycuda_3_10 \
python src/SR_analysis/stage_3_validate.py --scene steady --mode constant \
--constant-alpha 0 -5 5 --device 0 --steps 200 \
--run-id article2-steady-sweep-a5-20260720
# Illusion (trained diameters)
for d in 0.75 1.0; do
conda run -n pycuda_3_10 python stage_1_infer.py --scene illusion_${d}L --device 2
done
CUDA_VISIBLE_DEVICES=2 PYTHONPATH=src conda run -n pycuda_3_10 \
python src/SR_analysis/stage_3_validate.py --group karman_re50,karman_re100,karman_re200,karman_re400 \
--mode pysr --formula-front <front.json> --formula-rear <rear.json> \
--device 0 --steps 400 --run-id article2-long-karman-20260720
# Illusion target-only (generalization diameters -- no PPO model, just target recording)
for d in 0.5 0.6 0.8 1.2 1.5 2.0; do
conda run -n pycuda_3_10 python stage_1_infer.py --scene illusion_${d}L --target-only --device 2
done
# Vortex
for v in lamb taylor; do
conda run -n pycuda_3_10 python stage_1_infer.py --scene vortex_${v} --device 2
done
CUDA_VISIBLE_DEVICES=2 PYTHONPATH=src conda run -n pycuda_3_10 \
python src/SR_analysis/stage_3_validate.py --group karman_re25,karman_re70,karman_re150,karman_re300 \
--mode pysr --formula-front <front.json> --formula-rear <rear.json> \
--device 0 --steps 200 --run-id article2-gen-karman-20260720
```
**Output per scene** (in `data/{scene_id}/{scene_name}/`):
- `controlled.npz`: actions [N,3], sensors [N,6], forces [N,6]
- `target.npz`: target signals [FIFO_LEN, 6] for Karman/Vortex; **8 columns for Illusion** = [cyl_fx,cyl_fy, s0_ux,s0_uy, s1_ux,s1_uy, s2_ux,s2_uy] — extract sensors with `target[:, 2:8]`
- `norm.json`: normalization factors
- `result.json`: similarity + reward summary
- `target_harmonics.json` (Illusion only): FFT harmonics for force reconstruction
Illusion uses the corresponding article topology-A formulas and either the three training scenes for the duration test or `--group illusion_generalization`. Generalization PySR deployment does not require a PPO normalization file; target harmonics remain frozen per scene.
---
## Stage 2: PySR Symbolic Regression Fitting
Runs PySR on `controlled.npz` data to discover interpretable control laws.
Export any Stage 1 or Stage 3 trajectory with:
```bash
# Illusion joint (0.75L + 1.0L) -- primary contribution
conda run -n sr_env python stage_2_fit.py \
--scenes illusion_0.75L,illusion_1L --mode joint --deep
# Karman cross-Re joint (re50-400)
conda run -n sr_env python stage_2_fit.py \
--scenes karman_re50,karman_re100,karman_re200,karman_re400 --mode joint --deep
# Per-scene individual fitting (optional, for comparison)
conda run -n sr_env python stage_2_fit.py --scene karman_re100 --mode per-scene --deep
conda run -n sr_env python stage_2_fit.py --scene illusion_0.75L --mode per-scene --deep
PYTHONPATH=src conda run -n pycuda_3_10 python -m SR_analysis.tools.telemetry_to_csv \
--input <trajectory.npz> --target <target.npz> --output-dir <csv-dir> \
--scene <scene> --source ppo --sample-interval <SI> --conv-len <N>
```
**Feature sets**:
| Name | Features | Dim | Used For |
|------|----------|:---:|----------|
| ILLUSION_PHASE | u_a, du_a/dt, Cl_tot, dCl_tot/dt, Cd_tot, Cd_rear, Cd_err, Cl_err, dCd_err/dt, dCl_err/dt | 10 | Illusion |
| PHYS_DADT+mu | Static + daF/dt, daB/dt, daT/dt + mu terms | 17 | Karman joint |
The exporter writes wide and long CSV files, target tables, manifests and legacy-DTW window convergence diagnostics. For Stage 3 telemetry use `--source sr`; embedded target sensors are used automatically.
**Constraints (v23)**:
- Front no-bias: alpha_F = 0 when features = 0
- Rear shared-head: alpha_B = -Top composed with G-mirror
**Output**: `results/formulas/{scene}_{channel}.json`
---
## Stage 3: CFD Closed-Loop Validation
Validates PySR formulas or PPO baselines in closed-loop CFD. This is the final arbiter.
Build the complete derived plotting package from immutable article artifacts with:
```bash
# Karman cross-Re (trained + generalization)
for re in 50 100 200 400 25 70 150 300; do
conda run -n pycuda_3_10 python stage_3_validate.py \
--scene karman_re${re} --device 2 --mode pysr \
--formula-front results/formulas/karman_joint_front.json \
--formula-top results/formulas/karman_joint_top.json
done
# Illusion trained (joint formula)
for d in 0.75 1.0; do
conda run -n pycuda_3_10 python stage_3_validate.py \
--scene illusion_${d}L --device 2 --mode pysr \
--formula-front results/formulas/illusion_joint_front.json \
--formula-top results/formulas/illusion_joint_top.json
done
# Illusion generalization (joint formula on unseen diameters)
for d in 0.5 0.6 0.8 1.2 2.0; do
conda run -n pycuda_3_10 python stage_3_validate.py \
--scene illusion_${d}L --device 2 --mode pysr \
--formula-front results/formulas/illusion_joint_front.json \
--formula-top results/formulas/illusion_joint_top.json
done
# PPO baselines
for d in 0.75 1.0 1.5; do
conda run -n pycuda_3_10 python stage_3_validate.py \
--scene illusion_${d}L --device 2 --mode ppo
done
# Vortex generalization
for v in lamb taylor; do
conda run -n pycuda_3_10 python stage_3_validate.py \
--scene vortex_${v} --device 2 --mode pysr \
--formula-front results/formulas/karman_joint_front.json \
--formula-top results/formulas/karman_joint_top.json
done
PYTHONPATH=src conda run -n sr_env python -m SR_analysis.tools.prepare_plotting_data \
--output-dir src/SR_analysis/results/runs/article2-plotting-package-<date>
```
**Output**: `results/validations/{scene_name}.json` with similarity scores.
This creates causal PPO-state predictions/residuals, feature and additive-term contributions, unified ablation/scaling summaries and steady-sweep time series. Render diagnostic PNG/PDF figures in an environment containing Matplotlib with `python -m SR_analysis.tools.plot_sr_diagnostics`. For 400-step PPO CFD, keep `--model-device cpu`; GPU 2 is reserved for the active PyCUDA context.
---
## 2. Design decisions
## Stage 4: Publication Figures
### Why fit PPO actions?
Generates all figures and the figure index. No CLI arguments needed.
The PPO policy supplies successful state-action trajectories. Fitting its dimensionless physical actions provides candidate feedback structures without rerunning symbolic search inside CFD. The fitted expression is a policy surrogate, not a NavierStokes equation.
### Why not select the highest R² formula?
A candidate changes the closed-loop state distribution after deployment. A formula can imitate PPO actions well on recorded states and still drift or become unstable in CFD. R² and Pareto complexity are therefore used to discover recurring variables and topologies; CFD stability and legacy DTW decide closed-loop value.
### Why per-case before joint?
Per-case searches reveal whether variables and topologies recur across operating conditions. Joint search begins only after broad variables have been considered, preventing a compact hand-selected library from predetermining the mechanism.
### Why freeze topology before the final coefficient fit?
Unrestricted symbolic search on all rows would use the blind data for structure selection. The workflow first selects topology from discovery runs, then refits only its numerical constants using all accepted trajectories with case-equal and trajectory-equal weighting. The refit records its parent discovery artifact.
### Why exact G deployment?
The geometry and objective are reflection-symmetric, while the legacy PPO was not trained with an equivariance constraint. The final architecture deliberately imposes physical symmetry:
\[
\alpha_F(x)=\frac{h_F(x)-h_F(Gx)}{2},\quad
\alpha_U(x)=h_R(x),\quad
\alpha_L(x)=-h_R(Gx).
\]
This is physical symmetrization, not a claim that PPO itself is exactly equivariant. Three independent heads are retained only for diagnostic structure discovery.
### Why no automatic lag search?
For Illusion, target and actual forces share a causal deployment timeline. Cross-correlation can produce a statistically useful shift without identifying a physical delay. Temporal/derivative features are introduced only after controlled static-variable comparisons show insufficiency. DTW lag is reported as part of the legacy metric, not interpreted as control delay.
### Why separate Kármán and Illusion joint fits?
They are different objectives. Kármán seeks restoration of an incident wake; Illusion seeks a non-zero target wake. Joint means shared structure within one objective, not one formula across unrelated policies.
## 3. Contracts and gates
### Physical labels
Kármán names use `re_code`, whose reference length is `2D`; report \(Re_D=\texttt{re\_code}/2\) whenever the physical Reynolds number is intended. Illusion names are legacy target-size labels. Despite the historical field name `target_diameter`, the value is passed to `LegacyCelerisLab.add_cylinder` as its `radius` argument. Rear symmetric and antisymmetric force coordinates are half-sums and half-differences, so changing that convention would rescale fitted coefficients.
A run may proceed to fitting only when all applicable gates pass.
### Physical order gate
Canonical orders:
- body/action: `front, upper, lower`
- forces: `front_fx, front_fy, upper_fx, upper_fy, lower_fx, lower_fy`
- sensors: upper, centre, lower, each with streamwise/transverse components
Run after CFD/kernel changes:
```bash
conda run -n pycuda_3_10 python stage_4_analyze.py
CUDA_VISIBLE_DEVICES=2 PYTHONPATH=src conda run -n pycuda_3_10 \
python -m SR_analysis.checks.order_contract \
--scene karman_re100 --device 0 \
--output src/SR_analysis/results/runs/<run_id>/karman_re100.json
```
**Output** (in `results/figures/`):
- `fig_illusion_degradation.png/pdf` — Main result: cross-diameter generalization
- `fig_karman_cross_re.png/pdf` — Karman cross-Re validation bars
- `fig_formula_comparison.png/pdf` — Formula structure diagram
- `fig_vortex_generalization.png/pdf` — Vortex cross-scene transfer
- `fig_action_comparison.png/pdf` — PPO action timeseries
- `fig_master_table.png/pdf` — Complete results table
- `FIGURE_INDEX.md` — Figure catalog with paper-ready captions
Repeat for `illusion_1L`. The impulse response is diagnostic; object IDs, centres and slot mapping define the contract.
---
### Temporal gate
## Canonical Formulas
The article alignment is `causal_post_state_to_next_action`. Post-state `i` predicts normalized PPO action `i+1`. Warm-up rows are removed. Each trajectory is processed independently before stacking.
| Formula File | Scene | Formula | CFD Similarity |
|-------------|-------|---------|:---:|
| `results/formulas/karman_joint_front.json` | Karman cross-Re | `daF_dt - 14.952*mu*Cl_tot` | avg 0.847 |
| `results/formulas/karman_joint_top.json` | Karman cross-Re | `3.414` (constant) | — |
| `results/formulas/illusion_joint_front.json` | Illusion joint | `Cd_tot - (Cd_err + 5.428) - (-0.00978)*(du_a_dt + u_a)` | 0.978/0.970 |
| `results/formulas/illusion_joint_top.json` | Illusion joint | `(Cd_err - (Cd_rear - Cl_err))*0.535 + 2.782` | — |
### PPO wiring gate
## Known Limitations
```bash
PYTHONPATH=src conda run -n pycuda_3_10 \
python -m SR_analysis.checks.policy_replay \
--scene <scene> \
--trajectory <run>/<objective>/<scene>/controlled.npz \
--model-device cpu \
--output <result>.json
```
- **Karman rear formula is constant** (alpha_T = 3.414): rear control information not fully utilized by the joint formula.
- **Illusion 1.5L is non-fittable**: PPO policy uses high-frequency modulation (5.6x shedding frequency) that the current feature set cannot capture.
- **daB_dt in Karman front formula** must be removed for deployment: it's a training distribution artifact (PPO trajectories have correlated front/rear actions, but rear is constant at deployment).
The seven article trajectories passed with zero action replay error.
### Artifact gate
- Existing non-empty run directories are not overwritten.
- Formula strings, formula files, telemetry and validations carry hashes.
- Integrity audit never grants scientific promotion; `promotion_eligible` defaults to false.
- Failed and incomplete validations remain rejected evidence.
## 4. Stage 1: collect article data
Environment: `pycuda_3_10`. CFD is serial on physical GPU 2. Isolate physical GPU 2 with `CUDA_VISIBLE_DEVICES=2`, then select logical device 0.
Kármán:
```bash
CUDA_VISIBLE_DEVICES=2 PYTHONPATH=src conda run -n pycuda_3_10 \
python src/SR_analysis/stage_1_infer.py \
--group karman_trained \
--run-id <karman_data_run> \
--device 0 --model-device cpu --steps 200 --norm-source existing
```
Illusion:
```bash
CUDA_VISIBLE_DEVICES=2 PYTHONPATH=src conda run -n pycuda_3_10 \
python src/SR_analysis/stage_1_infer.py \
--group illusion_trained \
--run-id <illusion_data_run> \
--device 0 --model-device cpu --steps 200 --norm-source existing
```
Outputs:
```text
data/runs/<run_id>/<objective>/<scene>/
config.json
controlled.npz
manifest.json
norm.json
result.json
target.npz
target_harmonics.json # Illusion
uncontrolled.npz # Kármán Stage 1 baseline asset
```
The article run uses 200 recorded rows per scene and 197 aligned Stage 2 rows after warm-up/causal alignment.
## 5. Stage 2A: per-case broad discovery
Environment: `sr_env`.
Use complete variable representations first:
- `raw_complete`
- `symmetry`
For Illusion, compare:
- `actual_only`
- `target_only`
- `actual_plus_target`
- `actual_plus_error`
Example diagnostic three-head discovery:
```bash
PYTHONPATH=src conda run -n sr_env \
python src/SR_analysis/stage_2_fit.py \
--scene karman_re100 --mode per-scene \
--run-id <discovery_run> \
--data-root <karman_data_run_root> \
--feature-set symmetry --feature-profile actual_only \
--deployment-architecture three_head_independent \
--fit-augmentation none \
--fit-purpose discovery \
--seed 0 --niterations 20 --smoke
```
Repeat for at least three seeds. `--smoke` in the article discovery denotes the bounded PySR population/complexity configuration; the resulting candidates are still diagnostic until CFD validation.
Up to 25 retained Pareto candidates per fitted head record:
- expression and used variables
- complexity/loss/PySR score
- contiguous train/validation/blind R², MAE, RMSE and max error
- static finite-value probing over observed feature ranges (not a global action-range guarantee)
- seed, feature set, data and trajectory provenance
The blind block is not used for fitting.
## 6. Stage 2B: within-objective joint discovery
Kármán example:
```bash
PYTHONPATH=src conda run -n sr_env \
python src/SR_analysis/stage_2_fit.py \
--scenes karman_re50,karman_re100,karman_re200,karman_re400 \
--mode joint --run-id <joint_discovery_run> \
--data-root <karman_data_run_root> \
--feature-set symmetry --feature-profile actual_only \
--deployment-architecture mapped_shared \
--fit-augmentation G --fit-purpose discovery \
--seed 0 --niterations 40 --smoke
```
Illusion uses the three trained diameters and separate profile comparisons. Joint fitting is accepted only when scene objective, feature order, action order and action conversion contracts match.
If multiple data roots are accepted, provide repeated `--data-root` arguments or comma-separated `--data-roots`. Every trajectory is constructed and split independently. Joint PySR receives explicit case-equal, trajectory-equal sample weights.
## 7. Stage 2C: fixed-topology refit
Freeze a recurring topology before using all eligible rows. Example:
```bash
PYTHONPATH=src conda run -n sr_env \
python src/SR_analysis/stage_2_fit.py \
--scenes karman_re50,karman_re100,karman_re200,karman_re400 \
--mode joint --run-id <refit_run> \
--data-root <karman_data_run_root> \
--feature-set symmetry --feature-profile actual_only \
--deployment-architecture mapped_shared --fit-augmentation G \
--fit-purpose fixed-topology-refit \
'--front-topology-expression=-0.377*Cd_rear_a' \
'--rear-topology-expression=1.0*Cl_rear_s-3.398' \
--front-discovery-parent-path <joint_front.json> \
--rear-discovery-parent-path <joint_rear_shared_upper.json>
```
Only numerical constants are optimized. Outputs report aggregate, per-case and per-trajectory errors and retain discovery-parent hashes.
## 8. Stage 3: closed-loop screening
Environment: `pycuda_3_10`, physical GPU 2, one CFD process at a time.
Short screening:
```bash
CUDA_VISIBLE_DEVICES=2 PYTHONPATH=src conda run -n pycuda_3_10 \
python src/SR_analysis/stage_3_validate.py \
--group karman_re50,karman_re100,karman_re200,karman_re400 \
--mode pysr \
--formula-front <joint_front.json> \
--formula-rear <joint_rear_shared_upper.json> \
--device 0 --steps 40 --run-id <L2_run>
```
Standard validation changes `--steps` to 200 and uses a new run ID.
The only active metric is `legacy_dtw_v1_abs_n_unclipped`, reported under `legacy_reference_cycle_vs_last_recorded_cycle`. It estimates lag from transverse sensor channel 1 between target samples `conv_len:2*conv_len` and the final controlled `conv_len` samples, circularly shifts the complete target sequence, computes absolute normalized unclipped DTW similarity independently for all six sensor channels, and reports their arithmetic mean. The lag is an alignment parameter, not a physical delay. Every validation stores per-channel values, lag, action ranges, termination, telemetry hash, formula hashes, scene config and GPU identity.
A candidate is rejected if any training case becomes non-finite or terminates early. Averages do not hide case failures.
## 9. Term necessity and coefficient robustness
`utils/formula_schema.py` deterministically decomposes top-level additive terms and creates immutable formula variants.
For each shortlisted law:
1. delete each term;
2. delete physically linked groups where necessary;
3. scale each term with the preregistered grid `0, 0.5, 0.75, 1, 1.25, 1.5`;
4. run recorded-state shadow checks for finite values and action ranges;
5. send only informative variants to short CFD.
A term is called important only when deletion causes repeatable closed-loop degradation. Scale zero must agree with deletion. The parent formula is never mutated.
## 10. Article evidence and interpretation
The current authoritative evidence chain is indexed by `results/README.md` and ends at:
```text
results/runs/article-joint-sr-final-20260718/
readable_summary.txt
evidence_manifest.json
```
Current conclusions:
- Kármán: rear constant is dominant, rear lift feedback is secondary, tested front feedback is weak; high-Re performance remains a limitation.
- Illusion: a symmetric numerical family exists, but terms are replaceable and static target/error variables do not establish explicit target tracking; 1.5L is the weakest/different regime.
The manuscript draft must preserve these distinctions and must not import older historical numbers as current evidence.
## 11. Historical and inactive material
- `results/formulas/`, `results/validations/`, `scene_registry.json`, `old/` and old docs are `historical_frozen` context.
- `round1-legacy-v2-20260716-*` is diagnostic only because it predates the final force-order contract.
- `experiments/v5/` is a separate excluded experiment.
- `archive/stage4/` and `archive/stage_docs/` are inactive publication tooling/history.
- `diagnostics/` outputs do not become mechanism claims without closed-loop validation.
## 12. Tests
Run from the repository root:
```bash
PYTHONPATH=src conda run -n sr_env python -m pytest \
src/SR_analysis/tests tests/test_stage_3_validate.py -q
```
Expected result at the 2026-07-21 plotting-package revision: `88 passed`.
+245 -72
View File
@@ -1,81 +1,254 @@
# SR_analysis: Symbolic Regression for DRL Flow Control
# SR analysis: agent entry point
Extracts interpretable control laws (obs -> act) from DRL-trained PPO policies
for the fluidic pinball using PySR symbolic regression. Validates all formulas
in CFD closed-loop and produces publication-quality figures.
This directory contains the active symbolic-regression analysis for extracting compact control laws from the legacy PPO policies of the fluidic pinball.
## Pipeline
**Start here, then read `PIPELINE.md`.** The active scientific workflow has exactly three entry points:
```
stage_1_infer.py -> stage_2_fit.py -> stage_3_validate.py -> stage_4_analyze.py
(PPO data) (PySR formula) (CFD closed-loop) (paper figures)
1. `stage_1_infer.py` — collect run-scoped PPO trajectories.
2. `stage_2_fit.py` — discover and refit symbolic structures.
3. `stage_3_validate.py` — evaluate formulas in closed-loop CFD with the legacy DTW metric.
The current article evidence is indexed in `results/README.md`. The manuscript-ready SR section is `../../docs/JFM_WYQ/SR_Draft.md`.
## Scientific question
SR is not used to maximize imitation of PPO actions. It is used to determine whether successful PPO control contains a compact, symmetric and physically interpretable feedback structure that remains effective when deployed in CFD.
The selection chain is therefore:
```text
PPO trajectories
-> broad per-case variable/topology discovery using R² and Pareto fronts
-> within-objective joint topology discovery
-> fixed-topology coefficient refit using all accepted rows
-> short and standard closed-loop CFD screening using legacy DTW
-> term-deletion and coefficient-scaling tests
-> physical interpretation and explicit limitations
```
## Quick Start
R² is a discovery diagnostic. It is not the acceptance criterion. Closed-loop stability and DTW decide whether a candidate is useful; deletion and scaling tests decide whether its terms are necessary.
## Current article scope
Two objectives are fitted separately:
- **Kármán cloaking:** `karman_re50`, `karman_re100`, `karman_re200`, `karman_re400`.
- **Illusion:** `illusion_0.75L`, `illusion_1L`, `illusion_1.5L`.
Kármán and Illusion are never pooled into one fit. The fitted evidence is limited to these seven training scenes. The coefficient-frozen 2026-07-20 extension tests additional Reynolds-number and target-size points, but those points did not participate in fitting or model selection. Vortex, V5 and historical figures remain outside the current article evidence.
Seven new 200-step PPO trajectories were collected in:
- `data/runs/article-joint-data-karman-20260718/`
- `data/runs/article-joint-data-illusion-20260718/`
All seven passed exact recorded-state policy replay. The accepted data inventory is:
- `results/runs/article-joint-data-audit-20260718/data_inventory.json`
Historical and round-one assets are retained, but are not silently pooled with the article data. The old `round1-legacy-v2-20260716-*` formulas are diagnostic only because they predate the final force-order contract.
## Non-negotiable contracts
### Native order
The canonical body, force and action order is:
```text
front, upper, lower
```
Sensors are ordered upper, centre, lower. Verify runtime binding with `checks/order_contract.py` before collecting data after any CFD change.
### Alignment
The article workflow uses:
```text
causal_post_state_to_next_action
```
Recorded post-state `i` predicts action `i+1`. Each trajectory is built independently so lag features and contiguous splits never cross trajectory boundaries.
### Action definition
Formula outputs are dimensionless cylinder surface velocities:
\[
\alpha_i = \omega_i/U_0.
\]
Normalized PPO actions are decoded with the scene action scale and bias before fitting.
### Exact reflection symmetry
The article candidate uses mapped-shared deployment:
\[
\alpha_F(x)=\frac{h_F(x)-h_F(Gx)}{2},\qquad
\alpha_U(x)=h_R(x),\qquad
\alpha_L(x)=-h_R(Gx).
\]
The front projection is exactly odd. The lower action is generated from the shared upper law. Three-head-independent fitting exists only as a PPO-structure diagnostic and is not the final physical architecture.
Fit augmentation and deployment architecture are separate choices:
- `--fit-augmentation none|G`
- `--deployment-architecture mapped_shared|three_head_independent`
Hard G symmetry is a deliberate physical symmetrization; it is not presented as a property that the legacy PPO was trained to satisfy.
### Metric
The closed-loop metric is:
```text
legacy_dtw_v1_abs_n_unclipped
```
Its exact window is named:
```text
legacy_reference_cycle_vs_last_recorded_cycle
```
There are not separate “full” and “tail” DTW algorithms. Lag is part of the legacy comparison procedure and is not interpreted as a physical observation/control delay.
## Physical labels and units
The Kármán scene names contain the historical code Reynolds label `re_code`, defined with reference length `2D`; the cylinder-diameter Reynolds number is therefore \(Re_D=\texttt{re\_code}/2\). The Illusion names `0.75L`, `1L` and `1.5L` are legacy target-size labels: the stored `target_diameter` value is passed to `LegacyCelerisLab.add_cylinder` as a radius. Paper text must not silently reinterpret these labels as physical diameters.
SR uses dimensionless velocities and force coefficients, not the clipped PPO observation. Rear symmetry coordinates are half-sums and half-differences, for example
\[
C_{d,\mathrm{rear},s}=\frac{C_{d,U}+C_{d,L}}{2},\qquad
C_{d,\mathrm{rear},a}=\frac{C_{d,U}-C_{d,L}}{2},
\]
with the same convention for rear lift.
## Feature strategy
Broad discovery starts from complete, dimensionless variable representations:
- `raw_complete`: six velocity components and six cylinder-force components.
- `symmetry`: symmetric/antisymmetric velocity and force coordinates.
- `physics_reduced`: compact diagnostics only; it is not the starting point for article discovery.
Illusion comparisons use non-overlapping profiles:
- `actual_only`
- `target_only`
- `actual_plus_target`
- `actual_plus_error`
Target/error derivatives or other temporal features are added only after static variables are shown insufficient. Cross-correlation is never used to select a lag.
## Current results
### Kármán joint candidate
\[
\alpha_F=\operatorname{odd}\!\left[-0.381391\,C_{d,\mathrm{rear},a}\right],
\]
\[
\alpha_U=1.307782\,C_{l,\mathrm{rear},s}-3.431209,
\qquad
\alpha_L=-\alpha_U(Gx).
\]
Standard 200-step legacy DTW:
- Re50: `0.9543`
- Re100: `0.9427`
- Re200: `0.8560`
- Re400: `0.7827`
Deletion tests support the ordering:
```text
rear constant > rear lift feedback > front drag-asymmetry feedback
```
This is consistent with the physical hypothesis that persistent rear counter-rotation provides the principal downstream velocity-deficit compensation. The SR evidence ranks controller terms but does not establish the spatial momentum correction or causality; those claims require OID/CCD. The law is not uniformly strong at Re400 and must not be called universal.
### Illusion joint numerical candidate
\[
\alpha_F=\operatorname{odd}\!\left[-1.826604\,C_{d,\mathrm{rear},a}+2.064493\,C_{l,F}\right],
\]
\[
\alpha_U=1.254440\,C_{d,\mathrm{rear},a}-1.528074\,C_{l,F},
\qquad
\alpha_L=-\alpha_U(Gx).
\]
Standard 200-step legacy DTW:
- 0.75L: `0.8749`
- 1.0L: `0.9217`
- 1.5L: `0.8306`
Scaling tests show that the `Cl_F` terms dominate action magnitude; the `Cd_rear,a` terms are weaker and partly replaceable. Every one-term deletion remained stable, so the current expression is not a unique mechanism law. Target/error variables were available but were not selected stably by low-complexity static joint discovery. This is a numerical joint reference, not proof of explicit target tracking.
## What can and cannot be claimed
Supported:
- A complete, reproducible discovery-to-CFD-to-ablation workflow.
- Strong Kármán evidence for dominant rear counter-rotation and secondary rear lift feedback.
- A symmetric Illusion joint family that remains finite across all three trained target-size labels.
- R² and formula appearance alone are insufficient predictors of closed-loop value.
Not supported:
- Global symbolic optimality or uniqueness.
- A universal Kármán law at Re400.
- An explicit target-tracking mechanism for Illusion.
- Necessity of every Illusion term.
- Physical delay inferred from DTW lag or cross-correlation.
- Distribution-wide or universal generalization. The Article2 extension supports only finite pointwise deployment at its explicitly sampled unseen conditions.
## Directory map
```text
SR_analysis/
├── README.md # this agent entry point
├── PIPELINE.md # exact method, commands and design decisions
├── configs.py # scene and action contracts
├── stage_1_infer.py # PPO data collection
├── stage_2_fit.py # discovery and fixed-topology refit
├── stage_3_validate.py # closed-loop CFD and legacy DTW
├── checks/ # pre-fit physical/wiring gates
├── diagnostics/ # diagnostic-only analyses
├── utils/ # feature, G, formula, data and provenance contracts
├── tests/ # SR CPU contract tests
├── results/README.md # evidence index and result status
├── tools/ # integrity audit; audit is not scientific promotion
├── experiments/v5/ # excluded experimental pipeline
└── archive/ # inactive Stage 4 and historical guides
```
`old/`, `archive/`, `experiments/v5/`, historical formula directories and old reports are context only. They are not authoritative sources for article numbers.
## Environments and resource discipline
- Stage 1, policy replay and Stage 3: `pycuda_3_10`; PPO inference defaults to CPU so physical GPU 2 remains dedicated to the PyCUDA CFD context.
- Stage 2/PySR and coefficient refit: `sr_env`.
- CFD uses physical GPU 2 and is strictly serial.
- When `CUDA_VISIBLE_DEVICES=2`, the process uses logical device `0`; provenance records both visibility and GPU UUID rather than mislabelling the physical ordinal.
- Every run ID is immutable; failed telemetry is retained.
## Verification
At the 2026-07-21 plotting-package revision, the SR contract suite contains 88 passing tests. Run from the repository root:
```bash
# Generate PPO inference data
conda run -n pycuda_3_10 python stage_1_infer.py --scene karman_re100 --device 2
# Fit symbolic formula
conda run -n sr_env python stage_2_fit.py --scenes illusion_0.75L,illusion_1L --mode joint --deep
# Validate in CFD
conda run -n pycuda_3_10 python stage_3_validate.py \
--scene illusion_1L --device 2 --mode pysr \
--formula-front results/formulas/illusion_joint_front.json \
--formula-top results/formulas/illusion_joint_top.json
# Generate figures
conda run -n pycuda_3_10 python stage_4_analyze.py
PYTHONPATH=src conda run -n sr_env python -m pytest \
src/SR_analysis/tests tests/test_stage_3_validate.py -q
```
## Directory Structure
```
SR_analysis/
stage_1_infer.py # PPO inference (all scenes)
stage_2_fit.py # PySR symbolic regression fitting
stage_3_validate.py # CFD closed-loop validation
stage_4_analyze.py # Publication figure generation
configs.py # All scene definitions (19 scenes)
scene_registry.json # Canonical results registry
utils/ # Shared library (features, CFD, fitting)
data/ # Runtime .npz data per scene
results/
formulas/ # Canonical formula JSONs
validations/ # CFD validation outputs
figures/ # Publication-quality PNG/PDF
FIGURE_INDEX.md # Figure catalog with captions
README.md # Formula + validation index
docs/
SR_analysis_report.md # Full analysis report
illusion_joint_formula_analysis.md
PIPELINE.md # Detailed reproduction guide
literature_note.md # Paper writing + literature positioning
old/ # Archived historical files
```
## Key Results
| Scene | Formula | CFD Similarity |
|-------|---------|:---:|
| Karman cross-Re (joint) | alpha_F = daF_dt - 14.95*mu*Cl_tot | avg 0.847 |
| Illusion joint (0.75L+1L) | alpha_F = Cd_tot - Cd_err - 5.43 + 0.01*(du_a_dt+u_a) | 0.978/0.970 |
| Vortex lamb (Karman formula) | Karman joint, zero retraining | 0.949 (exceeds PPO) |
## Environments
- `pycuda_3_10`: CFD + DRL model loading + visualization (stages 1, 3, 4)
- `sr_env`: PySR symbolic regression (stage 2)
- GPU: device 2 recommended
## Documentation
| File | Content |
|------|---------|
| `PIPELINE.md` | Full reproduction guide with all commands |
| `docs/SR_analysis_report.md` | Complete methodology + results + discussion |
| `results/figures/FIGURE_INDEX.md` | All figures with paper-ready captions |
| `literature_note.md` | Literature positioning + writing guidance |
| `results/README.md` | Formula + validation file index |
See `PIPELINE.md` for reproducible commands and `results/README.md` for the exact evidence chain.
+1
View File
@@ -0,0 +1 @@
"""Archived SR workflows retained for historical reference."""
@@ -0,0 +1 @@
"""Archived Stage 4 publication analysis."""
@@ -5,7 +5,7 @@ Reads scene_registry.json + results/validations/*.json and produces 6 figures
to results/figures/. Also creates FIGURE_INDEX.md.
Usage:
conda run -n pycuda_3_10 python stage_4_analyze.py
PYTHONPATH=src conda run -n pycuda_3_10 python -m SR_analysis.archive.stage4.stage_4_analyze
"""
from __future__ import annotations
@@ -20,7 +20,8 @@ matplotlib.use("Agg")
import matplotlib.pyplot as plt
from matplotlib.ticker import FuncFormatter
_REPO = Path(__file__).resolve().parents[1]
_SR_ROOT = Path(__file__).resolve().parents[2]
_REPO = _SR_ROOT.parents[1]
if str(_REPO) not in sys.path:
sys.path.insert(0, str(_REPO))
_SRC = _REPO / "src"
@@ -29,7 +30,7 @@ if str(_SRC) not in sys.path:
from SR_analysis.configs import get_scene, SCENES
SR_DIR = Path(__file__).resolve().parent
SR_DIR = _SR_ROOT
FIG_DIR = SR_DIR / "results" / "figures"
VAL_DIR = SR_DIR / "results" / "validations"
FIG_DIR.mkdir(parents=True, exist_ok=True)
@@ -549,7 +550,7 @@ All numerical values in these figures are derived from:
To regenerate all figures:
```bash
conda run -n pycuda_3_10 python stage_4_analyze.py
PYTHONPATH=src conda run -n pycuda_3_10 python -m SR_analysis.archive.stage4.stage_4_analyze
```
"""
path = FIG_DIR / "FIGURE_INDEX.md"
@@ -6,14 +6,14 @@ Analyzes PPO policies and SR formulas. Generates FFT spectra, action timeseries,
```bash
# PPO action visualization (timeseries + FFT)
conda run -n pycuda_3_10 python stage_4_analyze.py --scene illusion_1L --mode ppo-viz
PYTHONPATH=src conda run -n pycuda_3_10 python -m SR_analysis.archive.stage4.stage_4_analyze --scene illusion_1L --mode ppo-viz
# Cross-diameter degradation analysis
conda run -n pycuda_3_10 python stage_4_analyze.py \
PYTHONPATH=src conda run -n pycuda_3_10 python -m SR_analysis.archive.stage4.stage_4_analyze \
--scenes illusion_0.75L,illusion_1L,illusion_1.5L --mode degradation
# Formula comparison (coming soon)
conda run -n pycuda_3_10 python stage_4_analyze.py --scene illusion_1L --mode formula-compare
PYTHONPATH=src conda run -n pycuda_3_10 python -m SR_analysis.archive.stage4.stage_4_analyze --scene illusion_1L --mode formula-compare
```
## Modes
+1
View File
@@ -0,0 +1 @@
"""Pre-fit scientific contract checks."""
+163
View File
@@ -0,0 +1,163 @@
#!/usr/bin/env python3
"""Verify the legacy fluidic-pinball geometry/action/force channel contract."""
from __future__ import annotations
import argparse
import json
import sys
from pathlib import Path
from typing import Any, Mapping, Sequence
import numpy as np
REPO_ROOT = Path(__file__).resolve().parents[3]
SRC_ROOT = REPO_ROOT / "src"
if str(REPO_ROOT) not in sys.path:
sys.path.insert(0, str(REPO_ROOT))
if str(SRC_ROOT) not in sys.path:
sys.path.insert(0, str(SRC_ROOT))
from SR_analysis.configs import LEGACY_CFG_DIR, get_scene
from SR_analysis.utils.cfd_interface import load_legacy_configs
from SR_analysis.utils.provenance import atomic_write_json
CONTRACT_VERSION = "legacy-pinball-order-v1"
BODY_NAMES = ("front", "upper", "lower")
def expected_ledger(scene: str) -> dict[str, Any]:
cfg = get_scene(scene)
body_ids = tuple(range(int(cfg["n_objects_env"]) - 3, int(cfg["n_objects_env"])))
return {
"contract_version": CONTRACT_VERSION,
"scene": scene,
"geometry_order": [
{"name": "front", "y_offset_L": 0.0},
{"name": "upper", "y_offset_L": 0.75},
{"name": "lower", "y_offset_L": -0.75},
],
"body_object_ids": dict(zip(BODY_NAMES, body_ids)),
"sensor_layout": list(cfg["sensor_layout"]),
"force_layout": list(cfg["force_layout"]),
"action_layout": list(cfg["action_layout"]),
"ppo_decoder": {
"alpha": "normalized_action * action_scale + action_bias",
"action_scale": float(cfg["action_scale"]),
"action_bias": list(cfg["action_bias"]),
"native_slots": list(body_ids),
},
"kernel_binding": "action[id_obj] and obs[2*id_obj:2*id_obj+2] share id_obj",
}
def _centers_by_id(objects: Mapping[Any, Mapping[str, Any]]) -> list[tuple[float, float, float]]:
return [tuple(float(value) for value in objects[key]["center"]) for key in sorted(objects, key=int)]
def verify_runtime_objects(flow_field: Any, scene: str) -> dict[str, Any]:
cfg = get_scene(scene)
ledger = expected_ledger(scene)
centers = _centers_by_id(flow_field.objects)
body_ids = [ledger["body_object_ids"][name] for name in BODY_NAMES]
body_centers = [centers[index] for index in body_ids]
cy = (float(flow_field.FIELD_SHAPE[1]) - 1.0) / 2.0
l0 = 20.0
expected = [
(float(cfg["pinball_front_x"]) * l0, cy, 0.0),
(float(cfg["pinball_rear_x"]) * l0, cy + 0.75 * l0, 0.0),
(float(cfg["pinball_rear_x"]) * l0, cy - 0.75 * l0, 0.0),
]
np.testing.assert_allclose(body_centers, expected)
ledger["runtime_centers"] = {name: list(center) for name, center in zip(BODY_NAMES, body_centers)}
ledger["runtime_verified"] = True
return ledger
def impulse_commands(n_objects: int, epsilon: float) -> dict[str, np.ndarray]:
if n_objects < 3:
raise ValueError("pinball impulse test requires at least three objects")
commands: dict[str, np.ndarray] = {}
for offset, name in enumerate(BODY_NAMES, start=n_objects - 3):
command = np.zeros(n_objects, dtype=np.float32)
command[offset] = float(epsilon)
commands[name] = command
return commands
def build_runtime_environment(scene: str, device: int) -> Any:
from LegacyCelerisLab import FlowField
cfg = get_scene(scene)
cuda_cfg, field_cfg = load_legacy_configs(LEGACY_CFG_DIR)
field_cfg = field_cfg._replace(viscosity=float(cfg["nu"]))
ff = FlowField(field_cfg, cuda_cfg, device_id=device)
cy = (ff.FIELD_SHAPE[1] - 1) / 2.0
l0 = 20.0
if cfg["scene_id"] == "karman":
ff.add_cylinder((10.0 * l0, cy, 0.0), l0)
for y in (cy + 2 * l0, cy, cy - 2 * l0):
ff.add_sensor((float(cfg["sensor_x"]) * l0, y, 0.0), 5.0)
ff.add_cylinder((float(cfg["pinball_front_x"]) * l0, cy, 0.0), l0 / 2.0)
ff.add_cylinder((float(cfg["pinball_rear_x"]) * l0, cy + 0.75 * l0, 0.0), l0 / 2.0)
ff.add_cylinder((float(cfg["pinball_rear_x"]) * l0, cy - 0.75 * l0, 0.0), l0 / 2.0)
return ff
def run_impulse_test(scene: str, device: int, epsilon: float, steps: int) -> dict[str, Any]:
ff = build_runtime_environment(scene, device)
ledger = verify_runtime_objects(ff, scene)
n_objects = len(ff.objects)
zero = np.zeros(n_objects, dtype=np.float32)
warmup = int(4 * ff.FIELD_SHAPE[0] / float(get_scene(scene)["u0"]))
ff.run(warmup, zero)
ff.get_ddf()
ff.save_ddf()
responses: dict[str, Any] = {}
body_ids = ledger["body_object_ids"]
for name, command in impulse_commands(n_objects, epsilon).items():
ff.restore_ddf()
ff.apply_ddf()
ff.run(steps, command)
force_pairs = np.asarray(ff.obs, dtype=np.float64).reshape(-1, 2)
responses[name] = {
"nonzero_action_slots": np.flatnonzero(command).tolist(),
"command": float(command[body_ids[name]]),
"force_at_commanded_body": force_pairs[body_ids[name]].tolist(),
"all_body_forces": {
body: force_pairs[index].tolist() for body, index in body_ids.items()
},
}
del ff
ledger["impulse_test"] = {
"epsilon": float(epsilon),
"steps": int(steps),
"responses": responses,
"interpretation": "slot identity is exact; force magnitude is diagnostic and is not used to infer causality",
}
return ledger
def build_parser() -> argparse.ArgumentParser:
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--scene", choices=("karman_re100", "illusion_1L"), required=True)
parser.add_argument("--device", type=int, default=2)
parser.add_argument("--epsilon", type=float, default=1e-4)
parser.add_argument("--steps", type=int, default=10)
parser.add_argument("--output", type=Path)
parser.add_argument("--source-only", action="store_true")
return parser
def main(argv: Sequence[str] | None = None) -> int:
args = build_parser().parse_args(argv)
document = expected_ledger(args.scene) if args.source_only else run_impulse_test(
args.scene, args.device, args.epsilon, args.steps
)
if args.output:
atomic_write_json(args.output.resolve(), document)
print(json.dumps(document, indent=2, sort_keys=True))
return 0
if __name__ == "__main__":
raise SystemExit(main())
+91
View File
@@ -0,0 +1,91 @@
#!/usr/bin/env python3
"""Verify recorded PPO actions by replaying the policy on causal recorded states."""
from __future__ import annotations
import argparse
import json
from pathlib import Path
from typing import Any, Sequence
import numpy as np
from SR_analysis.configs import get_scene, model_path_for_scene
from SR_analysis.stage_1_infer import illusion_observation, load_existing_norm, normalize_raw_observation
from SR_analysis.utils.cfd_interface import load_ppo_model
from SR_analysis.utils.provenance import atomic_write_json, hash_file
SCHEMA_VERSION = "sr-policy-replay-parity-v1"
def replay(scene: str, trajectory: Path, *, model_device: str = "cpu") -> dict[str, Any]:
cfg = get_scene(scene)
norm, norm_path = load_existing_norm(scene, cfg)
model_path = model_path_for_scene(scene)
if model_path is None:
raise FileNotFoundError(f"no PPO model configured for {scene}")
model = load_ppo_model(model_path, device=model_device, s_dim=int(cfg["s_dim"]))
with np.load(trajectory, allow_pickle=False) as data:
sensors = np.asarray(data["sensors"], dtype=np.float64)
forces = np.asarray(data["forces"], dtype=np.float64)
actions = np.asarray(data["actions_norm" if "actions_norm" in data else "actions"], dtype=np.float64)
targets = np.asarray(data["target_forces"], dtype=np.float64) if "target_forces" in data else None
if len(actions) < 2:
raise ValueError("policy replay requires at least two recorded actions")
raw = np.column_stack((sensors, forces))
predicted = []
for index in range(1, len(actions)):
state = raw[index - 1]
if cfg["scene_id"] == "illusion":
if targets is None:
raise ValueError("Illusion policy replay requires target_forces")
observation = illusion_observation(state, norm, targets[index])
else:
observation = normalize_raw_observation(state, norm)
action, _ = model.predict(observation, deterministic=True)
predicted.append(np.asarray(action, dtype=np.float64).reshape(3))
predicted_array = np.asarray(predicted)
recorded = actions[1:]
residual = predicted_array - recorded
max_abs = np.max(np.abs(residual), axis=0)
rmse = np.sqrt(np.mean(residual**2, axis=0))
tolerance = 2e-6
return {
"schema_version": SCHEMA_VERSION,
"scene": scene,
"status": "passed" if float(np.max(max_abs)) <= tolerance else "failed",
"semantics": "recorded post-state i-1 is replayed to predict recorded normalized action i; first action is excluded because its pre-state is not stored",
"tolerance": tolerance,
"n_compared": int(len(recorded)),
"action_layout": list(cfg["action_layout"]),
"max_abs_error": max_abs.tolist(),
"rmse": rmse.tolist(),
"sources": {
"trajectory": {"path": str(trajectory), "sha256": hash_file(trajectory)},
"model": {"path": str(model_path), "sha256": hash_file(Path(model_path))},
"norm": {"path": str(norm_path), "sha256": hash_file(norm_path)},
},
"interpretation": "This checks policy observation/action wiring without requiring separately initialized CFD trajectories to be pointwise identical.",
}
def build_parser() -> argparse.ArgumentParser:
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--scene", required=True)
parser.add_argument("--trajectory", type=Path, required=True)
parser.add_argument("--model-device", default="cpu")
parser.add_argument("--output", type=Path, required=True)
return parser
def main(argv: Sequence[str] | None = None) -> int:
args = build_parser().parse_args(argv)
report = replay(args.scene, args.trajectory.resolve(), model_device=args.model_device)
atomic_write_json(args.output.resolve(), report)
print(json.dumps(report, indent=2, sort_keys=True))
return 0 if report["status"] == "passed" else 1
if __name__ == "__main__":
raise SystemExit(main())
+86 -3
View File
@@ -14,9 +14,13 @@ import os
from typing import Any, Dict, List, Optional, Tuple
# -- Root paths (resolved when configs.py is imported) -----------------------
_PROJ = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
MODEL_DIR = os.path.join(_PROJ, "..", "models")
LEGACY_CFG_DIR = os.path.join(_PROJ, "..", "configs", "legacy_configs")
SR_ANALYSIS_DIR = os.path.abspath(os.path.dirname(__file__))
SRC_DIR = os.path.dirname(SR_ANALYSIS_DIR)
PROJECT_ROOT = os.path.dirname(SRC_DIR)
# Historical private alias retained for callers that imported it.
_PROJ = PROJECT_ROOT
MODEL_DIR = os.path.join(PROJECT_ROOT, "models")
LEGACY_CFG_DIR = os.path.join(PROJECT_ROOT, "configs", "legacy_configs")
# -- Physics constants -------------------------------------------------------
U0 = 0.01 # default inlet velocity (lattice)
@@ -28,6 +32,18 @@ NY = 512
CENTER_Y = (NY - 1) / 2.0
FIFO_LEN = 150
CONV_LEN = 30 # default; per-scene conv_len overrides this (Illusion=36)
CONTROL_TIME_SCALE_STEPS = 2000 # D_CYL / U0 in lattice steps
# Native legacy order follows object insertion in the actual environments.
SENSOR_LAYOUT = ("upper_ux", "upper_uy", "center_ux", "center_uy", "lower_ux", "lower_uy")
BODY_LAYOUT = ("front", "upper", "lower")
FORCE_LAYOUT = ("front_fx", "front_fy", "upper_fx", "upper_fy", "lower_fx", "lower_fy")
ACTION_LAYOUT = BODY_LAYOUT
RAW_LAYOUT = SENSOR_LAYOUT + FORCE_LAYOUT
TARGET_SENSOR_SLICE = (0, 6)
ILLUSION_TARGET_FORCE_SLICE = (0, 2)
ILLUSION_TARGET_SENSOR_SLICE = (2, 8)
DTW_VERSION = "legacy_dtw_v1_abs_n_unclipped"
def nu_from_re(re_code: float, u0: float = U0) -> float:
@@ -35,6 +51,11 @@ def nu_from_re(re_code: float, u0: float = U0) -> float:
return u0 * D_REF / re_code
def control_dt(sample_interval: float, control_time_scale_steps: float = CONTROL_TIME_SCALE_STEPS) -> float:
"""Return nondimensional control interval, SI / (D/U0)."""
return float(sample_interval) / float(control_time_scale_steps)
# -- Scene definitions -------------------------------------------------------
# Each scene dict has fields:
@@ -115,6 +136,23 @@ SCENES["steady"] = {
"target_type": "steady",
"s_dim": 12,
"u0": U0,
"control_time_scale_steps": CONTROL_TIME_SCALE_STEPS,
"control_dt": control_dt(800),
"fifo_len": FIFO_LEN,
"conv_len": CONV_LEN,
"sensor_layout": SENSOR_LAYOUT,
"body_layout": BODY_LAYOUT,
"action_layout": ACTION_LAYOUT,
"force_layout": FORCE_LAYOUT,
"raw_layout": RAW_LAYOUT,
"raw_sensor_slice": TARGET_SENSOR_SLICE,
"raw_force_slice": (6, 12),
"target_sensor_slice": TARGET_SENSOR_SLICE,
"target_force_slice": None,
"fifo_init_action": (0.0, 0.0, 0.0),
"policy_init_action": (0.0, 0.0, 0.0),
"dtw_version": DTW_VERSION,
"dtw_lag_channel": 1,
}
# -- Illusion (cylinder imitation, 3 diameters) ----------------------------
@@ -243,6 +281,51 @@ for diam, mn, si in [
}
# -- Legacy contract completion ---------------------------------------------
def _complete_legacy_contract(cfg: dict) -> None:
"""Add explicit metadata without changing historical fields or values."""
scene_id = cfg["scene_id"]
if scene_id not in {"karman", "illusion"}:
return
cfg["re_d"] = cfg["re_code"] / 2.0
cfg["control_time_scale_steps"] = CONTROL_TIME_SCALE_STEPS
cfg["control_dt"] = control_dt(cfg["sample_interval"])
cfg["fifo_len"] = FIFO_LEN
cfg.setdefault("conv_len", CONV_LEN)
cfg["sensor_layout"] = SENSOR_LAYOUT
cfg["body_layout"] = BODY_LAYOUT
cfg["action_layout"] = ACTION_LAYOUT
cfg["force_layout"] = FORCE_LAYOUT
cfg["raw_layout"] = RAW_LAYOUT
cfg["raw_sensor_slice"] = TARGET_SENSOR_SLICE
cfg["raw_force_slice"] = (6, 12)
cfg["target_sensor_slice"] = (
ILLUSION_TARGET_SENSOR_SLICE if scene_id == "illusion" else TARGET_SENSOR_SLICE
)
cfg["target_force_slice"] = (
ILLUSION_TARGET_FORCE_SLICE if scene_id == "illusion" else None
)
cfg["fifo_init_action"] = (
(0.0, -1.0, 1.0) if scene_id == "illusion" else tuple(cfg["action_bias"])
)
cfg["policy_init_action"] = cfg["fifo_init_action"]
cfg["dtw_version"] = DTW_VERSION
cfg["dtw_lag_channel"] = 1
if scene_id == "illusion":
# Legacy add_cylinder takes radius despite the historical diameter name.
cfg["target_center_x"] = 20.0
cfg["target_center"] = (20.0, CENTER_Y / L0, 0.0)
cfg["target_radius"] = cfg["target_diameter"]
cfg["target_radius_lattice"] = cfg["target_diameter"] * L0
for _scene_cfg in SCENES.values():
_complete_legacy_contract(_scene_cfg)
# -- Utility helpers ---------------------------------------------------------
def get_scene(name: str) -> dict:
@@ -0,0 +1,109 @@
{
"action_bias": [
0.0,
-2.0,
2.0
],
"action_layout": [
"front",
"upper",
"lower"
],
"action_scale": 8.0,
"body_layout": [
"front",
"upper",
"lower"
],
"control_dt": 0.2,
"control_time_scale_steps": 2000,
"conv_len": 36,
"dtw_lag_channel": 1,
"dtw_version": "legacy_dtw_v1_abs_n_unclipped",
"fifo_init_action": [
0.0,
-1.0,
1.0
],
"fifo_len": 150,
"force_layout": [
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"has_disturbance": false,
"model_name": "d1a3o14_250525_imit_075L_2U_400S",
"mu": 0.02,
"n_objects_env": 6,
"nu": 0.004,
"obs_slice": [
0,
12
],
"pinball_front_x": 19.0,
"pinball_rear_x": 20.3,
"policy_init_action": [
0.0,
-1.0,
1.0
],
"raw_force_slice": [
6,
12
],
"raw_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy",
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"raw_sensor_slice": [
0,
6
],
"re_code": 100,
"re_d": 50.0,
"s_dim": 14,
"sample_interval": 400,
"scene_id": "illusion",
"sensor_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy"
],
"sensor_x": 30.0,
"source": "PPO_inference",
"target_center": [
20.0,
12.775,
0.0
],
"target_center_x": 20.0,
"target_diameter": 0.75,
"target_force_slice": [
0,
2
],
"target_radius": 0.75,
"target_radius_lattice": 15.0,
"target_sensor_slice": [
2,
8
],
"target_type": "periodic",
"u0": 0.01
}
@@ -0,0 +1,129 @@
{
"cfd_device": 0,
"cfd_device_logical": 0,
"cfd_gpu_name": "Tesla V100-SXM2-16GB",
"cfd_gpu_uuid": "GPU-b8c11c01-c91f-aa0b-abf6-dad35085cc76",
"command": "/home/frank14f/anaconda3/envs/pycuda_3_10/bin/python /home/frank14f/DynamisLab/src/SR_analysis/stage_1_infer.py --group illusion_trained --run-id article-joint-data-illusion-20260718 --device 0 --model-device cpu --steps 200 --norm-source existing",
"config": {
"action_bias": [
0.0,
-2.0,
2.0
],
"action_layout": [
"front",
"upper",
"lower"
],
"action_scale": 8.0,
"body_layout": [
"front",
"upper",
"lower"
],
"control_dt": 0.2,
"control_time_scale_steps": 2000,
"conv_len": 36,
"dtw_lag_channel": 1,
"dtw_version": "legacy_dtw_v1_abs_n_unclipped",
"fifo_init_action": [
0.0,
-1.0,
1.0
],
"fifo_len": 150,
"force_layout": [
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"has_disturbance": false,
"model_name": "d1a3o14_250525_imit_075L_2U_400S",
"mu": 0.02,
"n_objects_env": 6,
"nu": 0.004,
"obs_slice": [
0,
12
],
"pinball_front_x": 19.0,
"pinball_rear_x": 20.3,
"policy_init_action": [
0.0,
-1.0,
1.0
],
"raw_force_slice": [
6,
12
],
"raw_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy",
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"raw_sensor_slice": [
0,
6
],
"re_code": 100,
"re_d": 50.0,
"s_dim": 14,
"sample_interval": 400,
"scene_id": "illusion",
"sensor_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy"
],
"sensor_x": 30.0,
"source": "PPO_inference",
"target_center": [
20.0,
12.775,
0.0
],
"target_center_x": 20.0,
"target_diameter": 0.75,
"target_force_slice": [
0,
2
],
"target_radius": 0.75,
"target_radius_lattice": 15.0,
"target_sensor_slice": [
2,
8
],
"target_type": "periodic",
"u0": 0.01
},
"created_utc": "2026-07-18T09:39:32.938755+00:00",
"cuda_visible_devices": "2",
"git_sha": "ca8ee5f238ee58eaaf48027ad026c35784f76d4d",
"metric_id": "legacy_similarity_v1",
"model_device": "cpu",
"model_path": "/home/frank14f/DynamisLab/models/250525/d1a3o14_250525_imit_075L_2U_400S.zip",
"model_sha256": "1a2d9f77bd6ac44fe7ebe0fe9255e1474c97939238a0200270954fe71f719526",
"norm_source": "existing",
"output_dir": "/home/frank14f/DynamisLab/src/SR_analysis/data/runs/article-joint-data-illusion-20260718/illusion/illusion_0.75L",
"run_id": "article-joint-data-illusion-20260718",
"scene": "illusion_0.75L",
"scene_id": "illusion",
"schema_version": "sr-stage1-manifest-v2"
}
@@ -0,0 +1,24 @@
{
"action_bias": [
0.0,
-2.0,
2.0
],
"force_norm_fact": 0.013459767680615187,
"sens_deviation": [
0.9466423392295837,
-0.1479361653327942,
0.6496055126190186,
-0.06913633644580841,
0.9421071410179138,
0.08593743294477463
],
"sens_norm_fact": [
2.1083030700683594,
2.7172951698303223,
0.7220026850700378,
3.7818100452423096,
2.1336052417755127,
2.4038033485412598
]
}
@@ -0,0 +1,124 @@
{
"command": "/home/frank14f/anaconda3/envs/pycuda_3_10/bin/python /home/frank14f/DynamisLab/src/SR_analysis/stage_1_infer.py --group illusion_trained --run-id article-joint-data-illusion-20260718 --device 0 --model-device cpu --steps 200 --norm-source existing",
"config": {
"action_bias": [
0.0,
-2.0,
2.0
],
"action_layout": [
"front",
"upper",
"lower"
],
"action_scale": 8.0,
"body_layout": [
"front",
"upper",
"lower"
],
"control_dt": 0.2,
"control_time_scale_steps": 2000,
"conv_len": 36,
"dtw_lag_channel": 1,
"dtw_version": "legacy_dtw_v1_abs_n_unclipped",
"fifo_init_action": [
0.0,
-1.0,
1.0
],
"fifo_len": 150,
"force_layout": [
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"has_disturbance": false,
"model_name": "d1a3o14_250525_imit_075L_2U_400S",
"mu": 0.02,
"n_objects_env": 6,
"nu": 0.004,
"obs_slice": [
0,
12
],
"pinball_front_x": 19.0,
"pinball_rear_x": 20.3,
"policy_init_action": [
0.0,
-1.0,
1.0
],
"raw_force_slice": [
6,
12
],
"raw_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy",
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"raw_sensor_slice": [
0,
6
],
"re_code": 100,
"re_d": 50.0,
"s_dim": 14,
"sample_interval": 400,
"scene_id": "illusion",
"sensor_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy"
],
"sensor_x": 30.0,
"source": "PPO_inference",
"target_center": [
20.0,
12.775,
0.0
],
"target_center_x": 20.0,
"target_diameter": 0.75,
"target_force_slice": [
0,
2
],
"target_radius": 0.75,
"target_radius_lattice": 15.0,
"target_sensor_slice": [
2,
8
],
"target_type": "periodic",
"u0": 0.01
},
"controlled": true,
"git_sha": "ca8ee5f238ee58eaaf48027ad026c35784f76d4d",
"metric_id": "legacy_similarity_v1",
"model_path": "/home/frank14f/DynamisLab/models/250525/d1a3o14_250525_imit_075L_2U_400S.zip",
"model_sha256": "1a2d9f77bd6ac44fe7ebe0fe9255e1474c97939238a0200270954fe71f719526",
"norm_source": "existing",
"norm_source_path": "/home/frank14f/DynamisLab/src/SR_analysis/data/illusion/illusion_0.75L/norm.json",
"run_id": "article-joint-data-illusion-20260718",
"scene": "illusion_0.75L",
"schema_version": "sr-stage1-result-v2",
"similarity": 0.9780213679370245,
"target_only": false
}
@@ -0,0 +1,207 @@
{
"channel_names": [
"target_cylinder_fx",
"target_cylinder_fy",
"sensor_top_ux",
"sensor_top_uy",
"sensor_center_ux",
"sensor_center_uy",
"sensor_bottom_ux",
"sensor_bottom_uy"
],
"harmonics": [
{
"amps": [
3.9416146258902704e-05,
8.083888512803517e-06,
7.8259297225391e-06,
7.444669325137454e-06,
2.650481928433631e-06
],
"dc": 0.004288840930288037,
"freqs": [
0.06666666666666667,
0.09333333333333334,
0.08666666666666667,
0.18000000000000002,
0.08
],
"phases": [
0.7540124427379341,
-1.808706740982317,
1.1476006137783652,
1.6512590989501288,
1.0813017136850769
]
},
{
"amps": [
0.0011724241253350106,
2.705315291989001e-06,
2.5632054945621657e-06,
1.9131915711276497e-06,
1.3943678699705464e-06
],
"dc": 4.169326712144539e-07,
"freqs": [
0.03333333333333333,
0.02666666666666667,
0.04,
0.1,
0.02
],
"phases": [
-2.3577812321489438,
0.6391458229570252,
-2.265503747033405,
0.43570069935086664,
0.5243541447170742
]
},
{
"amps": [
0.2489885040388675,
0.03210098144538428,
0.030384440489745625,
0.00958367379623687,
0.005213279199801526
],
"dc": 1.0451179893811544,
"freqs": [
0.03333333333333333,
0.06666666666666667,
0.1,
0.13333333333333333,
0.16666666666666669
],
"phases": [
1.1103723558571972,
1.8423551657801926,
-3.1355535027285106,
-2.5782919322455338,
-1.2633346617424976
]
},
{
"amps": [
0.3305720031167745,
0.08539685324391007,
0.0385190706390166,
0.021865254179959034,
0.007357771642788919
],
"dc": -0.022074917741119863,
"freqs": [
0.03333333333333333,
0.06666666666666667,
0.1,
0.13333333333333333,
0.16666666666666669
],
"phases": [
-0.7133847984074813,
-0.4026908612284969,
0.8343738694616963,
1.3490248554891444,
2.2330562888870022
]
},
{
"amps": [
0.07163229134495475,
0.008434240998878524,
0.0008098102661636355,
0.0003771090075918297,
0.00035352636858903685
],
"dc": 0.9039795788129171,
"freqs": [
0.06666666666666667,
0.13333333333333333,
0.2,
0.08666666666666667,
0.09333333333333334
],
"phases": [
-1.6197193338232723,
0.45502589602091653,
-2.3033617160120254,
-0.6336257774708539,
-3.049232811380861
]
},
{
"amps": [
0.6375122846399932,
0.12728152140142718,
0.012378504391920099,
0.0015804850101977547,
0.0014716918044797723
],
"dc": -0.00022492741545041402,
"freqs": [
0.03333333333333333,
0.1,
0.16666666666666669,
0.23333333333333334,
0.02666666666666667
],
"phases": [
-0.6326179569707989,
1.336743513951696,
3.01228107257918,
2.0216300775728637,
2.6520289818367324
]
},
{
"amps": [
0.24905942483676188,
0.03187505826568132,
0.030242379554754367,
0.009569319724256058,
0.005273017386654554
],
"dc": 1.0452390058835348,
"freqs": [
0.03333333333333333,
0.06666666666666667,
0.1,
0.13333333333333333,
0.16666666666666669
],
"phases": [
-2.030970816485462,
1.8477546647859373,
0.010423750748169737,
-2.560726118782934,
1.9011052975482974
]
},
{
"amps": [
0.33080869088948045,
0.08523425024086101,
0.03856791973969837,
0.021888225016193145,
0.007347291749017247
],
"dc": 0.021862111476560434,
"freqs": [
0.03333333333333333,
0.06666666666666667,
0.1,
0.13333333333333333,
0.16666666666666669
],
"phases": [
-0.713292514035412,
2.740949082033163,
0.837418113709308,
-1.7879991149366732,
2.2429923596709345
]
}
],
"schema_version": "sr-target-harmonics-v2"
}
@@ -0,0 +1,109 @@
{
"action_bias": [
0.0,
-2.0,
2.0
],
"action_layout": [
"front",
"upper",
"lower"
],
"action_scale": 8.0,
"body_layout": [
"front",
"upper",
"lower"
],
"control_dt": 0.4,
"control_time_scale_steps": 2000,
"conv_len": 36,
"dtw_lag_channel": 1,
"dtw_version": "legacy_dtw_v1_abs_n_unclipped",
"fifo_init_action": [
0.0,
-1.0,
1.0
],
"fifo_len": 150,
"force_layout": [
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"has_disturbance": false,
"model_name": "d1a3o14_250525_imit_15L_2U",
"mu": 0.02,
"n_objects_env": 6,
"nu": 0.004,
"obs_slice": [
0,
12
],
"pinball_front_x": 19.0,
"pinball_rear_x": 20.3,
"policy_init_action": [
0.0,
-1.0,
1.0
],
"raw_force_slice": [
6,
12
],
"raw_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy",
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"raw_sensor_slice": [
0,
6
],
"re_code": 100,
"re_d": 50.0,
"s_dim": 14,
"sample_interval": 800,
"scene_id": "illusion",
"sensor_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy"
],
"sensor_x": 30.0,
"source": "PPO_inference",
"target_center": [
20.0,
12.775,
0.0
],
"target_center_x": 20.0,
"target_diameter": 1.5,
"target_force_slice": [
0,
2
],
"target_radius": 1.5,
"target_radius_lattice": 30.0,
"target_sensor_slice": [
2,
8
],
"target_type": "periodic",
"u0": 0.01
}
@@ -0,0 +1,129 @@
{
"cfd_device": 0,
"cfd_device_logical": 0,
"cfd_gpu_name": "Tesla V100-SXM2-16GB",
"cfd_gpu_uuid": "GPU-b8c11c01-c91f-aa0b-abf6-dad35085cc76",
"command": "/home/frank14f/anaconda3/envs/pycuda_3_10/bin/python /home/frank14f/DynamisLab/src/SR_analysis/stage_1_infer.py --group illusion_trained --run-id article-joint-data-illusion-20260718 --device 0 --model-device cpu --steps 200 --norm-source existing",
"config": {
"action_bias": [
0.0,
-2.0,
2.0
],
"action_layout": [
"front",
"upper",
"lower"
],
"action_scale": 8.0,
"body_layout": [
"front",
"upper",
"lower"
],
"control_dt": 0.4,
"control_time_scale_steps": 2000,
"conv_len": 36,
"dtw_lag_channel": 1,
"dtw_version": "legacy_dtw_v1_abs_n_unclipped",
"fifo_init_action": [
0.0,
-1.0,
1.0
],
"fifo_len": 150,
"force_layout": [
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"has_disturbance": false,
"model_name": "d1a3o14_250525_imit_15L_2U",
"mu": 0.02,
"n_objects_env": 6,
"nu": 0.004,
"obs_slice": [
0,
12
],
"pinball_front_x": 19.0,
"pinball_rear_x": 20.3,
"policy_init_action": [
0.0,
-1.0,
1.0
],
"raw_force_slice": [
6,
12
],
"raw_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy",
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"raw_sensor_slice": [
0,
6
],
"re_code": 100,
"re_d": 50.0,
"s_dim": 14,
"sample_interval": 800,
"scene_id": "illusion",
"sensor_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy"
],
"sensor_x": 30.0,
"source": "PPO_inference",
"target_center": [
20.0,
12.775,
0.0
],
"target_center_x": 20.0,
"target_diameter": 1.5,
"target_force_slice": [
0,
2
],
"target_radius": 1.5,
"target_radius_lattice": 30.0,
"target_sensor_slice": [
2,
8
],
"target_type": "periodic",
"u0": 0.01
},
"created_utc": "2026-07-18T09:44:10.797263+00:00",
"cuda_visible_devices": "2",
"git_sha": "ca8ee5f238ee58eaaf48027ad026c35784f76d4d",
"metric_id": "legacy_similarity_v1",
"model_device": "cpu",
"model_path": "/home/frank14f/DynamisLab/models/250525/d1a3o14_250525_imit_15L_2U.zip",
"model_sha256": "3e115a36d4365cfc70994c9307053aa44d9c3ded8c4312f636520b62862be9b6",
"norm_source": "existing",
"output_dir": "/home/frank14f/DynamisLab/src/SR_analysis/data/runs/article-joint-data-illusion-20260718/illusion/illusion_1.5L",
"run_id": "article-joint-data-illusion-20260718",
"scene": "illusion_1.5L",
"scene_id": "illusion",
"schema_version": "sr-stage1-manifest-v2"
}
@@ -0,0 +1,24 @@
{
"action_bias": [
0.0,
-2.0,
2.0
],
"force_norm_fact": 0.013502256944775581,
"sens_deviation": [
0.9501011371612549,
-0.1168946698307991,
0.6514688730239868,
0.0026063816621899605,
0.9466588497161865,
0.1172625869512558
],
"sens_norm_fact": [
2.11934757232666,
2.5621178150177,
0.7280007004737854,
3.4596621990203857,
2.1354496479034424,
2.5682904720306396
]
}
@@ -0,0 +1,124 @@
{
"command": "/home/frank14f/anaconda3/envs/pycuda_3_10/bin/python /home/frank14f/DynamisLab/src/SR_analysis/stage_1_infer.py --group illusion_trained --run-id article-joint-data-illusion-20260718 --device 0 --model-device cpu --steps 200 --norm-source existing",
"config": {
"action_bias": [
0.0,
-2.0,
2.0
],
"action_layout": [
"front",
"upper",
"lower"
],
"action_scale": 8.0,
"body_layout": [
"front",
"upper",
"lower"
],
"control_dt": 0.4,
"control_time_scale_steps": 2000,
"conv_len": 36,
"dtw_lag_channel": 1,
"dtw_version": "legacy_dtw_v1_abs_n_unclipped",
"fifo_init_action": [
0.0,
-1.0,
1.0
],
"fifo_len": 150,
"force_layout": [
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"has_disturbance": false,
"model_name": "d1a3o14_250525_imit_15L_2U",
"mu": 0.02,
"n_objects_env": 6,
"nu": 0.004,
"obs_slice": [
0,
12
],
"pinball_front_x": 19.0,
"pinball_rear_x": 20.3,
"policy_init_action": [
0.0,
-1.0,
1.0
],
"raw_force_slice": [
6,
12
],
"raw_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy",
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"raw_sensor_slice": [
0,
6
],
"re_code": 100,
"re_d": 50.0,
"s_dim": 14,
"sample_interval": 800,
"scene_id": "illusion",
"sensor_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy"
],
"sensor_x": 30.0,
"source": "PPO_inference",
"target_center": [
20.0,
12.775,
0.0
],
"target_center_x": 20.0,
"target_diameter": 1.5,
"target_force_slice": [
0,
2
],
"target_radius": 1.5,
"target_radius_lattice": 30.0,
"target_sensor_slice": [
2,
8
],
"target_type": "periodic",
"u0": 0.01
},
"controlled": true,
"git_sha": "ca8ee5f238ee58eaaf48027ad026c35784f76d4d",
"metric_id": "legacy_similarity_v1",
"model_path": "/home/frank14f/DynamisLab/models/250525/d1a3o14_250525_imit_15L_2U.zip",
"model_sha256": "3e115a36d4365cfc70994c9307053aa44d9c3ded8c4312f636520b62862be9b6",
"norm_source": "existing",
"norm_source_path": "/home/frank14f/DynamisLab/src/SR_analysis/data/illusion/illusion_1.5L/norm.json",
"run_id": "article-joint-data-illusion-20260718",
"scene": "illusion_1.5L",
"schema_version": "sr-stage1-result-v2",
"similarity": 0.9380685413642048,
"target_only": false
}
@@ -0,0 +1,207 @@
{
"channel_names": [
"target_cylinder_fx",
"target_cylinder_fy",
"sensor_top_ux",
"sensor_top_uy",
"sensor_center_ux",
"sensor_center_uy",
"sensor_bottom_ux",
"sensor_bottom_uy"
],
"harmonics": [
{
"amps": [
0.0002593145208769718,
0.00013555774253418688,
0.00013495714775771432,
6.980395318390833e-05,
5.5269861879110814e-05
],
"dc": 0.008455509891112645,
"freqs": [
0.08,
0.18000000000000002,
0.07333333333333333,
0.08666666666666667,
0.36000000000000004
],
"phases": [
1.9138979974014636,
-3.1233126897188073,
-1.236904392081521,
1.9254877121068814,
0.1298353556235514
]
},
{
"amps": [
0.004410042862580617,
0.0008893415120801246,
0.0006923634361164468,
0.0003907491851769848,
0.00037768599220085614
],
"dc": -5.815988754572269e-05,
"freqs": [
0.04,
0.03333333333333333,
0.04666666666666667,
0.05333333333333334,
0.02666666666666667
],
"phases": [
1.2524630875800902,
-1.9856661519393908,
1.331816078986651,
1.3984468632293299,
-2.108462214109479
]
},
{
"amps": [
0.39473791484702975,
0.07812373736809153,
0.06365312495666806,
0.05578793977128341,
0.04494323306664869
],
"dc": 0.9446588867902755,
"freqs": [
0.04,
0.03333333333333333,
0.04666666666666667,
0.11333333333333334,
0.12000000000000001
],
"phases": [
2.260615488419265,
-0.8537155586511778,
2.2527336748950324,
-3.063008654548352,
0.29218667131459247
]
},
{
"amps": [
0.5977098005256445,
0.14034942157637617,
0.12888913011672254,
0.08993838973022406,
0.08036452212897999
],
"dc": -0.09525545587142309,
"freqs": [
0.04,
0.03333333333333333,
0.08,
0.11333333333333334,
0.04666666666666667
],
"phases": [
0.36056127401744614,
-2.82720001369774,
1.2123976016401927,
1.1454240756697094,
0.38912274684310827
]
},
{
"amps": [
0.08326368756380634,
0.04587985149377177,
0.024756520022768454,
0.02141702906744529,
0.018444598865080177
],
"dc": 0.9157892549037934,
"freqs": [
0.08,
0.07333333333333333,
0.15333333333333335,
0.08666666666666667,
0.06666666666666667
],
"phases": [
-0.05233769791529121,
3.080770961519612,
0.8853688244086093,
-0.039849508324659125,
3.076363067151665
]
},
{
"amps": [
0.8741199230882291,
0.19550568066644888,
0.16265409257981334,
0.1336506114834541,
0.1269247384905412
],
"dc": -0.023665335749586423,
"freqs": [
0.04,
0.03333333333333333,
0.11333333333333334,
0.12000000000000001,
0.04666666666666667
],
"phases": [
0.4463654130128962,
-2.7755331237159115,
1.4718172123953857,
-1.5843887891107975,
0.5302492921976192
]
},
{
"amps": [
0.39292160700808704,
0.079540287340843,
0.0612842837491059,
0.057763809861229164,
0.044325089175110945
],
"dc": 0.934531484246254,
"freqs": [
0.04,
0.03333333333333333,
0.04666666666666667,
0.11333333333333334,
0.12000000000000001
],
"phases": [
-0.8816538413228083,
2.2919156068347846,
-0.8919232033681086,
0.005956538497457574,
-2.750984236179875
]
},
{
"amps": [
0.6087630645329644,
0.1308037498368575,
0.09692848009841636,
0.09368203821989057,
0.0771579858674427
],
"dc": 0.062215093951672316,
"freqs": [
0.04,
0.03333333333333333,
0.08,
0.04666666666666667,
0.07333333333333333
],
"phases": [
0.3681906174761973,
-2.8525744545686225,
-1.7575623630090065,
0.4606331587384596,
1.0755980567082095
]
}
],
"schema_version": "sr-target-harmonics-v2"
}
@@ -0,0 +1,109 @@
{
"action_bias": [
0.0,
-2.0,
2.0
],
"action_layout": [
"front",
"upper",
"lower"
],
"action_scale": 8.0,
"body_layout": [
"front",
"upper",
"lower"
],
"control_dt": 0.3,
"control_time_scale_steps": 2000,
"conv_len": 36,
"dtw_lag_channel": 1,
"dtw_version": "legacy_dtw_v1_abs_n_unclipped",
"fifo_init_action": [
0.0,
-1.0,
1.0
],
"fifo_len": 150,
"force_layout": [
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"has_disturbance": false,
"model_name": "d1a3o14_250525_imit_1L_2U_600S",
"mu": 0.02,
"n_objects_env": 6,
"nu": 0.004,
"obs_slice": [
0,
12
],
"pinball_front_x": 19.0,
"pinball_rear_x": 20.3,
"policy_init_action": [
0.0,
-1.0,
1.0
],
"raw_force_slice": [
6,
12
],
"raw_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy",
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"raw_sensor_slice": [
0,
6
],
"re_code": 100,
"re_d": 50.0,
"s_dim": 14,
"sample_interval": 600,
"scene_id": "illusion",
"sensor_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy"
],
"sensor_x": 30.0,
"source": "PPO_inference",
"target_center": [
20.0,
12.775,
0.0
],
"target_center_x": 20.0,
"target_diameter": 1.0,
"target_force_slice": [
0,
2
],
"target_radius": 1.0,
"target_radius_lattice": 20.0,
"target_sensor_slice": [
2,
8
],
"target_type": "periodic",
"u0": 0.01
}
@@ -0,0 +1,129 @@
{
"cfd_device": 0,
"cfd_device_logical": 0,
"cfd_gpu_name": "Tesla V100-SXM2-16GB",
"cfd_gpu_uuid": "GPU-b8c11c01-c91f-aa0b-abf6-dad35085cc76",
"command": "/home/frank14f/anaconda3/envs/pycuda_3_10/bin/python /home/frank14f/DynamisLab/src/SR_analysis/stage_1_infer.py --group illusion_trained --run-id article-joint-data-illusion-20260718 --device 0 --model-device cpu --steps 200 --norm-source existing",
"config": {
"action_bias": [
0.0,
-2.0,
2.0
],
"action_layout": [
"front",
"upper",
"lower"
],
"action_scale": 8.0,
"body_layout": [
"front",
"upper",
"lower"
],
"control_dt": 0.3,
"control_time_scale_steps": 2000,
"conv_len": 36,
"dtw_lag_channel": 1,
"dtw_version": "legacy_dtw_v1_abs_n_unclipped",
"fifo_init_action": [
0.0,
-1.0,
1.0
],
"fifo_len": 150,
"force_layout": [
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"has_disturbance": false,
"model_name": "d1a3o14_250525_imit_1L_2U_600S",
"mu": 0.02,
"n_objects_env": 6,
"nu": 0.004,
"obs_slice": [
0,
12
],
"pinball_front_x": 19.0,
"pinball_rear_x": 20.3,
"policy_init_action": [
0.0,
-1.0,
1.0
],
"raw_force_slice": [
6,
12
],
"raw_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy",
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"raw_sensor_slice": [
0,
6
],
"re_code": 100,
"re_d": 50.0,
"s_dim": 14,
"sample_interval": 600,
"scene_id": "illusion",
"sensor_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy"
],
"sensor_x": 30.0,
"source": "PPO_inference",
"target_center": [
20.0,
12.775,
0.0
],
"target_center_x": 20.0,
"target_diameter": 1.0,
"target_force_slice": [
0,
2
],
"target_radius": 1.0,
"target_radius_lattice": 20.0,
"target_sensor_slice": [
2,
8
],
"target_type": "periodic",
"u0": 0.01
},
"created_utc": "2026-07-18T09:41:50.510389+00:00",
"cuda_visible_devices": "2",
"git_sha": "ca8ee5f238ee58eaaf48027ad026c35784f76d4d",
"metric_id": "legacy_similarity_v1",
"model_device": "cpu",
"model_path": "/home/frank14f/DynamisLab/models/250525/d1a3o14_250525_imit_1L_2U_600S.zip",
"model_sha256": "570fbdb08fba1170cbab53de9ede372a9536e0bb8419dda0f0f2db20fd20583d",
"norm_source": "existing",
"output_dir": "/home/frank14f/DynamisLab/src/SR_analysis/data/runs/article-joint-data-illusion-20260718/illusion/illusion_1L",
"run_id": "article-joint-data-illusion-20260718",
"scene": "illusion_1L",
"scene_id": "illusion",
"schema_version": "sr-stage1-manifest-v2"
}
@@ -0,0 +1,24 @@
{
"action_bias": [
0.0,
-2.0,
2.0
],
"force_norm_fact": 0.01349810091778636,
"sens_deviation": [
0.9381087422370911,
-0.12299147248268127,
0.648796796798706,
-0.022100985050201416,
0.9596271514892578,
0.11032649874687195
],
"sens_norm_fact": [
2.1753337383270264,
2.5954699516296387,
0.707850456237793,
3.554702043533325,
2.0688724517822266,
2.5344114303588867
]
}
@@ -0,0 +1,124 @@
{
"command": "/home/frank14f/anaconda3/envs/pycuda_3_10/bin/python /home/frank14f/DynamisLab/src/SR_analysis/stage_1_infer.py --group illusion_trained --run-id article-joint-data-illusion-20260718 --device 0 --model-device cpu --steps 200 --norm-source existing",
"config": {
"action_bias": [
0.0,
-2.0,
2.0
],
"action_layout": [
"front",
"upper",
"lower"
],
"action_scale": 8.0,
"body_layout": [
"front",
"upper",
"lower"
],
"control_dt": 0.3,
"control_time_scale_steps": 2000,
"conv_len": 36,
"dtw_lag_channel": 1,
"dtw_version": "legacy_dtw_v1_abs_n_unclipped",
"fifo_init_action": [
0.0,
-1.0,
1.0
],
"fifo_len": 150,
"force_layout": [
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"has_disturbance": false,
"model_name": "d1a3o14_250525_imit_1L_2U_600S",
"mu": 0.02,
"n_objects_env": 6,
"nu": 0.004,
"obs_slice": [
0,
12
],
"pinball_front_x": 19.0,
"pinball_rear_x": 20.3,
"policy_init_action": [
0.0,
-1.0,
1.0
],
"raw_force_slice": [
6,
12
],
"raw_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy",
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"raw_sensor_slice": [
0,
6
],
"re_code": 100,
"re_d": 50.0,
"s_dim": 14,
"sample_interval": 600,
"scene_id": "illusion",
"sensor_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy"
],
"sensor_x": 30.0,
"source": "PPO_inference",
"target_center": [
20.0,
12.775,
0.0
],
"target_center_x": 20.0,
"target_diameter": 1.0,
"target_force_slice": [
0,
2
],
"target_radius": 1.0,
"target_radius_lattice": 20.0,
"target_sensor_slice": [
2,
8
],
"target_type": "periodic",
"u0": 0.01
},
"controlled": true,
"git_sha": "ca8ee5f238ee58eaaf48027ad026c35784f76d4d",
"metric_id": "legacy_similarity_v1",
"model_path": "/home/frank14f/DynamisLab/models/250525/d1a3o14_250525_imit_1L_2U_600S.zip",
"model_sha256": "570fbdb08fba1170cbab53de9ede372a9536e0bb8419dda0f0f2db20fd20583d",
"norm_source": "existing",
"norm_source_path": "/home/frank14f/DynamisLab/src/SR_analysis/data/illusion/illusion_1L/norm.json",
"run_id": "article-joint-data-illusion-20260718",
"scene": "illusion_1L",
"schema_version": "sr-stage1-result-v2",
"similarity": 0.9812757387688315,
"target_only": false
}
@@ -0,0 +1,207 @@
{
"channel_names": [
"target_cylinder_fx",
"target_cylinder_fy",
"sensor_top_ux",
"sensor_top_uy",
"sensor_center_ux",
"sensor_center_uy",
"sensor_bottom_ux",
"sensor_bottom_uy"
],
"harmonics": [
{
"amps": [
9.95525576232295e-05,
3.062854458070903e-05,
1.3442917277488369e-05,
1.1594195224550438e-05,
1.1332674606193098e-05
],
"dc": 0.005645080665126443,
"freqs": [
0.08,
0.13333333333333333,
0.26666666666666666,
0.08666666666666667,
0.2733333333333334
],
"phases": [
-1.3987741128960087,
-0.14617921317235077,
1.1206149864146715,
1.6305529908100604,
-1.712315261017203
]
},
{
"amps": [
0.0021059072380715986,
0.0001072786042455763,
0.00010704577345347245,
5.887771172539229e-05,
5.0190303048842245e-05
],
"dc": 1.577417790637507e-05,
"freqs": [
0.04,
0.03333333333333333,
0.04666666666666667,
0.02666666666666667,
0.05333333333333334
],
"phases": [
-0.3398328993468615,
-0.29080491774378675,
2.7566046303431384,
-0.23762089174818304,
2.714746291666295
]
},
{
"amps": [
0.3146239226288843,
0.048104490548155014,
0.02379706856237292,
0.01833765043922671,
0.013599248761509778
],
"dc": 1.0103612458705902,
"freqs": [
0.04,
0.12000000000000001,
0.08,
0.04666666666666667,
0.03333333333333333
],
"phases": [
-1.4210505997757181,
1.847793032148095,
-3.031075979923603,
1.7605437654882392,
-1.4596841582777982
]
},
{
"amps": [
0.44915320062667263,
0.10377397412301913,
0.06678149272586904,
0.038204045584297346,
0.024949908375127946
],
"dc": -0.0391404936578086,
"freqs": [
0.04,
0.08,
0.12000000000000001,
0.16,
0.04666666666666667
],
"phases": [
3.0395602606613705,
0.6607552965105951,
-0.3398422181779207,
-2.609046860476507,
-0.07363307669730089
]
},
{
"amps": [
0.07895319422377668,
0.014476546457719106,
0.00914226506193232,
0.007075297824234122,
0.004463113727851041
],
"dc": 0.9198990468184153,
"freqs": [
0.08,
0.16,
0.08666666666666667,
0.07333333333333333,
0.09333333333333334
],
"phases": [
-0.5417908626550348,
2.7150365858062173,
2.589233496651188,
-0.524009247773754,
2.5833882013669687
]
},
{
"amps": [
0.7614606041726437,
0.17577971193056693,
0.040704869372920414,
0.03727793388501702,
0.02951532233167403
],
"dc": -0.0050505975137154265,
"freqs": [
0.04,
0.12000000000000001,
0.04666666666666667,
0.03333333333333333,
0.12666666666666668
],
"phases": [
3.113587774285551,
0.04444146345124639,
-0.028405904503340355,
3.115253374153316,
-3.091502158920583
]
},
{
"amps": [
0.3145260975487943,
0.048267787638706657,
0.024221969215475172,
0.018450798636158533,
0.013537092346057293
],
"dc": 1.0102008271217346,
"freqs": [
0.04,
0.12000000000000001,
0.08,
0.04666666666666667,
0.03333333333333333
],
"phases": [
1.7229918107099456,
-1.2652997907663959,
-2.6593825064997976,
-1.4285406671392833,
1.733743280730367
]
},
{
"amps": [
0.4518235029867277,
0.09818259354399247,
0.06939518691080716,
0.03690841267867748,
0.023821009095001514
],
"dc": 0.03264622828457504,
"freqs": [
0.04,
0.08,
0.12000000000000001,
0.16,
0.03333333333333333
],
"phases": [
3.0430721485694527,
-2.4129819490293962,
-0.27109978435044924,
0.6040464416290057,
3.0821178412302936
]
}
],
"schema_version": "sr-target-harmonics-v2"
}
@@ -0,0 +1,97 @@
{
"action_bias": [
0.0,
-4.0,
4.0
],
"action_layout": [
"front",
"upper",
"lower"
],
"action_scale": 8.0,
"body_layout": [
"front",
"upper",
"lower"
],
"control_dt": 0.4,
"control_time_scale_steps": 2000,
"conv_len": 30,
"dtw_lag_channel": 1,
"dtw_version": "legacy_dtw_v1_abs_n_unclipped",
"fifo_init_action": [
0.0,
-4.0,
4.0
],
"fifo_len": 150,
"force_layout": [
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"has_disturbance": true,
"model_name": "d1a3o12_re100",
"mu": 0.02,
"n_objects_env": 7,
"nu": 0.004,
"obs_slice": [
2,
14
],
"pinball_front_x": 30.0,
"pinball_rear_x": 31.3,
"policy_init_action": [
0.0,
-4.0,
4.0
],
"raw_force_slice": [
6,
12
],
"raw_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy",
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"raw_sensor_slice": [
0,
6
],
"re_code": 100,
"re_d": 50.0,
"s_dim": 12,
"sample_interval": 800,
"scene_id": "karman",
"sensor_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy"
],
"sensor_x": 40.0,
"source": "PPO_inference",
"target_force_slice": null,
"target_sensor_slice": [
0,
6
],
"target_type": "periodic",
"u0": 0.01
}
@@ -0,0 +1,117 @@
{
"cfd_device": 0,
"cfd_device_logical": 0,
"cfd_gpu_name": "Tesla V100-SXM2-16GB",
"cfd_gpu_uuid": "GPU-b8c11c01-c91f-aa0b-abf6-dad35085cc76",
"command": "/home/frank14f/anaconda3/envs/pycuda_3_10/bin/python /home/frank14f/DynamisLab/src/SR_analysis/stage_1_infer.py --group karman_trained --run-id article-joint-data-karman-20260718 --device 0 --model-device cpu --steps 200 --norm-source existing",
"config": {
"action_bias": [
0.0,
-4.0,
4.0
],
"action_layout": [
"front",
"upper",
"lower"
],
"action_scale": 8.0,
"body_layout": [
"front",
"upper",
"lower"
],
"control_dt": 0.4,
"control_time_scale_steps": 2000,
"conv_len": 30,
"dtw_lag_channel": 1,
"dtw_version": "legacy_dtw_v1_abs_n_unclipped",
"fifo_init_action": [
0.0,
-4.0,
4.0
],
"fifo_len": 150,
"force_layout": [
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"has_disturbance": true,
"model_name": "d1a3o12_re100",
"mu": 0.02,
"n_objects_env": 7,
"nu": 0.004,
"obs_slice": [
2,
14
],
"pinball_front_x": 30.0,
"pinball_rear_x": 31.3,
"policy_init_action": [
0.0,
-4.0,
4.0
],
"raw_force_slice": [
6,
12
],
"raw_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy",
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"raw_sensor_slice": [
0,
6
],
"re_code": 100,
"re_d": 50.0,
"s_dim": 12,
"sample_interval": 800,
"scene_id": "karman",
"sensor_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy"
],
"sensor_x": 40.0,
"source": "PPO_inference",
"target_force_slice": null,
"target_sensor_slice": [
0,
6
],
"target_type": "periodic",
"u0": 0.01
},
"created_utc": "2026-07-18T09:30:46.602689+00:00",
"cuda_visible_devices": "2",
"git_sha": "ca8ee5f238ee58eaaf48027ad026c35784f76d4d",
"metric_id": "legacy_similarity_v1",
"model_device": "cpu",
"model_path": "/home/frank14f/DynamisLab/models/old/d1a3o12_re100.zip",
"model_sha256": "148240c1dcb8b11d8e5a0a9e991f6874c4e799c9744707bf0fb32a8efeb0468d",
"norm_source": "existing",
"output_dir": "/home/frank14f/DynamisLab/src/SR_analysis/data/runs/article-joint-data-karman-20260718/karman/karman_re100",
"run_id": "article-joint-data-karman-20260718",
"scene": "karman_re100",
"scene_id": "karman",
"schema_version": "sr-stage1-manifest-v2"
}
@@ -0,0 +1,24 @@
{
"action_bias": [
0.0,
-4.0,
4.0
],
"force_norm_fact": 0.019199129194021225,
"sens_deviation": [
0.8231719732284546,
-0.12661591172218323,
0.24832786619663239,
-0.01064519677311182,
0.7844515442848206,
0.1161285787820816
],
"sens_norm_fact": [
3.3014419078826904,
3.2062995433807373,
1.8544995784759521,
3.4928226470947266,
3.1099960803985596,
2.815072774887085
]
}
@@ -0,0 +1,112 @@
{
"avg_reward_last100": 0.18115064725939095,
"command": "/home/frank14f/anaconda3/envs/pycuda_3_10/bin/python /home/frank14f/DynamisLab/src/SR_analysis/stage_1_infer.py --group karman_trained --run-id article-joint-data-karman-20260718 --device 0 --model-device cpu --steps 200 --norm-source existing",
"config": {
"action_bias": [
0.0,
-4.0,
4.0
],
"action_layout": [
"front",
"upper",
"lower"
],
"action_scale": 8.0,
"body_layout": [
"front",
"upper",
"lower"
],
"control_dt": 0.4,
"control_time_scale_steps": 2000,
"conv_len": 30,
"dtw_lag_channel": 1,
"dtw_version": "legacy_dtw_v1_abs_n_unclipped",
"fifo_init_action": [
0.0,
-4.0,
4.0
],
"fifo_len": 150,
"force_layout": [
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"has_disturbance": true,
"model_name": "d1a3o12_re100",
"mu": 0.02,
"n_objects_env": 7,
"nu": 0.004,
"obs_slice": [
2,
14
],
"pinball_front_x": 30.0,
"pinball_rear_x": 31.3,
"policy_init_action": [
0.0,
-4.0,
4.0
],
"raw_force_slice": [
6,
12
],
"raw_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy",
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"raw_sensor_slice": [
0,
6
],
"re_code": 100,
"re_d": 50.0,
"s_dim": 12,
"sample_interval": 800,
"scene_id": "karman",
"sensor_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy"
],
"sensor_x": 40.0,
"source": "PPO_inference",
"target_force_slice": null,
"target_sensor_slice": [
0,
6
],
"target_type": "periodic",
"u0": 0.01
},
"controlled": true,
"git_sha": "ca8ee5f238ee58eaaf48027ad026c35784f76d4d",
"metric_id": "legacy_similarity_v1",
"model_path": "/home/frank14f/DynamisLab/models/old/d1a3o12_re100.zip",
"model_sha256": "148240c1dcb8b11d8e5a0a9e991f6874c4e799c9744707bf0fb32a8efeb0468d",
"norm_source": "existing",
"norm_source_path": "/home/frank14f/DynamisLab/src/SR_analysis/data/karman/karman_re100/norm.json",
"run_id": "article-joint-data-karman-20260718",
"scene": "karman_re100",
"schema_version": "sr-stage1-result-v2",
"similarity": 0.9525476844593262
}
@@ -0,0 +1,97 @@
{
"action_bias": [
0.0,
-4.0,
4.0
],
"action_layout": [
"front",
"upper",
"lower"
],
"action_scale": 8.0,
"body_layout": [
"front",
"upper",
"lower"
],
"control_dt": 0.4,
"control_time_scale_steps": 2000,
"conv_len": 30,
"dtw_lag_channel": 1,
"dtw_version": "legacy_dtw_v1_abs_n_unclipped",
"fifo_init_action": [
0.0,
-4.0,
4.0
],
"fifo_len": 150,
"force_layout": [
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"has_disturbance": true,
"model_name": "d1a3o12_re200",
"mu": 0.01,
"n_objects_env": 7,
"nu": 0.002,
"obs_slice": [
2,
14
],
"pinball_front_x": 30.0,
"pinball_rear_x": 31.3,
"policy_init_action": [
0.0,
-4.0,
4.0
],
"raw_force_slice": [
6,
12
],
"raw_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy",
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"raw_sensor_slice": [
0,
6
],
"re_code": 200,
"re_d": 100.0,
"s_dim": 12,
"sample_interval": 800,
"scene_id": "karman",
"sensor_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy"
],
"sensor_x": 40.0,
"source": "PPO_inference",
"target_force_slice": null,
"target_sensor_slice": [
0,
6
],
"target_type": "periodic",
"u0": 0.01
}
@@ -0,0 +1,117 @@
{
"cfd_device": 0,
"cfd_device_logical": 0,
"cfd_gpu_name": "Tesla V100-SXM2-16GB",
"cfd_gpu_uuid": "GPU-b8c11c01-c91f-aa0b-abf6-dad35085cc76",
"command": "/home/frank14f/anaconda3/envs/pycuda_3_10/bin/python /home/frank14f/DynamisLab/src/SR_analysis/stage_1_infer.py --group karman_trained --run-id article-joint-data-karman-20260718 --device 0 --model-device cpu --steps 200 --norm-source existing",
"config": {
"action_bias": [
0.0,
-4.0,
4.0
],
"action_layout": [
"front",
"upper",
"lower"
],
"action_scale": 8.0,
"body_layout": [
"front",
"upper",
"lower"
],
"control_dt": 0.4,
"control_time_scale_steps": 2000,
"conv_len": 30,
"dtw_lag_channel": 1,
"dtw_version": "legacy_dtw_v1_abs_n_unclipped",
"fifo_init_action": [
0.0,
-4.0,
4.0
],
"fifo_len": 150,
"force_layout": [
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"has_disturbance": true,
"model_name": "d1a3o12_re200",
"mu": 0.01,
"n_objects_env": 7,
"nu": 0.002,
"obs_slice": [
2,
14
],
"pinball_front_x": 30.0,
"pinball_rear_x": 31.3,
"policy_init_action": [
0.0,
-4.0,
4.0
],
"raw_force_slice": [
6,
12
],
"raw_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy",
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"raw_sensor_slice": [
0,
6
],
"re_code": 200,
"re_d": 100.0,
"s_dim": 12,
"sample_interval": 800,
"scene_id": "karman",
"sensor_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy"
],
"sensor_x": 40.0,
"source": "PPO_inference",
"target_force_slice": null,
"target_sensor_slice": [
0,
6
],
"target_type": "periodic",
"u0": 0.01
},
"created_utc": "2026-07-18T09:33:41.006848+00:00",
"cuda_visible_devices": "2",
"git_sha": "ca8ee5f238ee58eaaf48027ad026c35784f76d4d",
"metric_id": "legacy_similarity_v1",
"model_device": "cpu",
"model_path": "/home/frank14f/DynamisLab/models/old/d1a3o12_re200.zip",
"model_sha256": "62ceb682fbfcff1119e049d306d3ac05144b780f166c2835d7d01ca719ffad11",
"norm_source": "existing",
"output_dir": "/home/frank14f/DynamisLab/src/SR_analysis/data/runs/article-joint-data-karman-20260718/karman/karman_re200",
"run_id": "article-joint-data-karman-20260718",
"scene": "karman_re200",
"scene_id": "karman",
"schema_version": "sr-stage1-manifest-v2"
}
@@ -0,0 +1,24 @@
{
"action_bias": [
0.0,
-4.0,
4.0
],
"force_norm_fact": 0.02405486349016428,
"sens_deviation": [
0.761349618434906,
-0.10393908619880676,
-0.0060332342982292175,
-0.01062991376966238,
0.7603892087936401,
0.08925710618495941
],
"sens_norm_fact": [
2.458379030227661,
2.4950430393218994,
0.986889123916626,
2.259662389755249,
2.737121820449829,
2.521576404571533
]
}
@@ -0,0 +1,112 @@
{
"avg_reward_last100": 0.11295380363625826,
"command": "/home/frank14f/anaconda3/envs/pycuda_3_10/bin/python /home/frank14f/DynamisLab/src/SR_analysis/stage_1_infer.py --group karman_trained --run-id article-joint-data-karman-20260718 --device 0 --model-device cpu --steps 200 --norm-source existing",
"config": {
"action_bias": [
0.0,
-4.0,
4.0
],
"action_layout": [
"front",
"upper",
"lower"
],
"action_scale": 8.0,
"body_layout": [
"front",
"upper",
"lower"
],
"control_dt": 0.4,
"control_time_scale_steps": 2000,
"conv_len": 30,
"dtw_lag_channel": 1,
"dtw_version": "legacy_dtw_v1_abs_n_unclipped",
"fifo_init_action": [
0.0,
-4.0,
4.0
],
"fifo_len": 150,
"force_layout": [
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"has_disturbance": true,
"model_name": "d1a3o12_re200",
"mu": 0.01,
"n_objects_env": 7,
"nu": 0.002,
"obs_slice": [
2,
14
],
"pinball_front_x": 30.0,
"pinball_rear_x": 31.3,
"policy_init_action": [
0.0,
-4.0,
4.0
],
"raw_force_slice": [
6,
12
],
"raw_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy",
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"raw_sensor_slice": [
0,
6
],
"re_code": 200,
"re_d": 100.0,
"s_dim": 12,
"sample_interval": 800,
"scene_id": "karman",
"sensor_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy"
],
"sensor_x": 40.0,
"source": "PPO_inference",
"target_force_slice": null,
"target_sensor_slice": [
0,
6
],
"target_type": "periodic",
"u0": 0.01
},
"controlled": true,
"git_sha": "ca8ee5f238ee58eaaf48027ad026c35784f76d4d",
"metric_id": "legacy_similarity_v1",
"model_path": "/home/frank14f/DynamisLab/models/old/d1a3o12_re200.zip",
"model_sha256": "62ceb682fbfcff1119e049d306d3ac05144b780f166c2835d7d01ca719ffad11",
"norm_source": "existing",
"norm_source_path": "/home/frank14f/DynamisLab/src/SR_analysis/data/karman/karman_re200/norm.json",
"run_id": "article-joint-data-karman-20260718",
"scene": "karman_re200",
"schema_version": "sr-stage1-result-v2",
"similarity": 0.9019246985126909
}
@@ -0,0 +1,97 @@
{
"action_bias": [
0.0,
-4.0,
4.0
],
"action_layout": [
"front",
"upper",
"lower"
],
"action_scale": 8.0,
"body_layout": [
"front",
"upper",
"lower"
],
"control_dt": 0.4,
"control_time_scale_steps": 2000,
"conv_len": 30,
"dtw_lag_channel": 1,
"dtw_version": "legacy_dtw_v1_abs_n_unclipped",
"fifo_init_action": [
0.0,
-4.0,
4.0
],
"fifo_len": 150,
"force_layout": [
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"has_disturbance": true,
"model_name": "d1a3o12_re400",
"mu": 0.005,
"n_objects_env": 7,
"nu": 0.001,
"obs_slice": [
2,
14
],
"pinball_front_x": 30.0,
"pinball_rear_x": 31.3,
"policy_init_action": [
0.0,
-4.0,
4.0
],
"raw_force_slice": [
6,
12
],
"raw_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy",
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"raw_sensor_slice": [
0,
6
],
"re_code": 400,
"re_d": 200.0,
"s_dim": 12,
"sample_interval": 800,
"scene_id": "karman",
"sensor_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy"
],
"sensor_x": 40.0,
"source": "PPO_inference",
"target_force_slice": null,
"target_sensor_slice": [
0,
6
],
"target_type": "periodic",
"u0": 0.01
}
@@ -0,0 +1,117 @@
{
"cfd_device": 0,
"cfd_device_logical": 0,
"cfd_gpu_name": "Tesla V100-SXM2-16GB",
"cfd_gpu_uuid": "GPU-b8c11c01-c91f-aa0b-abf6-dad35085cc76",
"command": "/home/frank14f/anaconda3/envs/pycuda_3_10/bin/python /home/frank14f/DynamisLab/src/SR_analysis/stage_1_infer.py --group karman_trained --run-id article-joint-data-karman-20260718 --device 0 --model-device cpu --steps 200 --norm-source existing",
"config": {
"action_bias": [
0.0,
-4.0,
4.0
],
"action_layout": [
"front",
"upper",
"lower"
],
"action_scale": 8.0,
"body_layout": [
"front",
"upper",
"lower"
],
"control_dt": 0.4,
"control_time_scale_steps": 2000,
"conv_len": 30,
"dtw_lag_channel": 1,
"dtw_version": "legacy_dtw_v1_abs_n_unclipped",
"fifo_init_action": [
0.0,
-4.0,
4.0
],
"fifo_len": 150,
"force_layout": [
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"has_disturbance": true,
"model_name": "d1a3o12_re400",
"mu": 0.005,
"n_objects_env": 7,
"nu": 0.001,
"obs_slice": [
2,
14
],
"pinball_front_x": 30.0,
"pinball_rear_x": 31.3,
"policy_init_action": [
0.0,
-4.0,
4.0
],
"raw_force_slice": [
6,
12
],
"raw_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy",
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"raw_sensor_slice": [
0,
6
],
"re_code": 400,
"re_d": 200.0,
"s_dim": 12,
"sample_interval": 800,
"scene_id": "karman",
"sensor_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy"
],
"sensor_x": 40.0,
"source": "PPO_inference",
"target_force_slice": null,
"target_sensor_slice": [
0,
6
],
"target_type": "periodic",
"u0": 0.01
},
"created_utc": "2026-07-18T09:36:34.723694+00:00",
"cuda_visible_devices": "2",
"git_sha": "ca8ee5f238ee58eaaf48027ad026c35784f76d4d",
"metric_id": "legacy_similarity_v1",
"model_device": "cpu",
"model_path": "/home/frank14f/DynamisLab/models/old/d1a3o12_re400.zip",
"model_sha256": "e251240ed1179290345f0331f7e014abb74429ec517039fe5836f5f070352617",
"norm_source": "existing",
"output_dir": "/home/frank14f/DynamisLab/src/SR_analysis/data/runs/article-joint-data-karman-20260718/karman/karman_re400",
"run_id": "article-joint-data-karman-20260718",
"scene": "karman_re400",
"scene_id": "karman",
"schema_version": "sr-stage1-manifest-v2"
}
@@ -0,0 +1,24 @@
{
"action_bias": [
0.0,
-4.0,
4.0
],
"force_norm_fact": 0.030264523811638355,
"sens_deviation": [
0.8747888207435608,
-0.024021463468670845,
0.5912007689476013,
0.017280835658311844,
0.9475194215774536,
0.07682034373283386
],
"sens_norm_fact": [
5.08115291595459,
5.131664276123047,
3.3446834087371826,
5.320921897888184,
4.4046711921691895,
5.202882766723633
]
}
@@ -0,0 +1,112 @@
{
"avg_reward_last100": 0.03504574790598314,
"command": "/home/frank14f/anaconda3/envs/pycuda_3_10/bin/python /home/frank14f/DynamisLab/src/SR_analysis/stage_1_infer.py --group karman_trained --run-id article-joint-data-karman-20260718 --device 0 --model-device cpu --steps 200 --norm-source existing",
"config": {
"action_bias": [
0.0,
-4.0,
4.0
],
"action_layout": [
"front",
"upper",
"lower"
],
"action_scale": 8.0,
"body_layout": [
"front",
"upper",
"lower"
],
"control_dt": 0.4,
"control_time_scale_steps": 2000,
"conv_len": 30,
"dtw_lag_channel": 1,
"dtw_version": "legacy_dtw_v1_abs_n_unclipped",
"fifo_init_action": [
0.0,
-4.0,
4.0
],
"fifo_len": 150,
"force_layout": [
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"has_disturbance": true,
"model_name": "d1a3o12_re400",
"mu": 0.005,
"n_objects_env": 7,
"nu": 0.001,
"obs_slice": [
2,
14
],
"pinball_front_x": 30.0,
"pinball_rear_x": 31.3,
"policy_init_action": [
0.0,
-4.0,
4.0
],
"raw_force_slice": [
6,
12
],
"raw_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy",
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"raw_sensor_slice": [
0,
6
],
"re_code": 400,
"re_d": 200.0,
"s_dim": 12,
"sample_interval": 800,
"scene_id": "karman",
"sensor_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy"
],
"sensor_x": 40.0,
"source": "PPO_inference",
"target_force_slice": null,
"target_sensor_slice": [
0,
6
],
"target_type": "periodic",
"u0": 0.01
},
"controlled": true,
"git_sha": "ca8ee5f238ee58eaaf48027ad026c35784f76d4d",
"metric_id": "legacy_similarity_v1",
"model_path": "/home/frank14f/DynamisLab/models/old/d1a3o12_re400.zip",
"model_sha256": "e251240ed1179290345f0331f7e014abb74429ec517039fe5836f5f070352617",
"norm_source": "existing",
"norm_source_path": "/home/frank14f/DynamisLab/src/SR_analysis/data/karman/karman_re400/norm.json",
"run_id": "article-joint-data-karman-20260718",
"scene": "karman_re400",
"schema_version": "sr-stage1-result-v2",
"similarity": 0.7772853368207708
}
@@ -0,0 +1,97 @@
{
"action_bias": [
0.0,
-4.0,
4.0
],
"action_layout": [
"front",
"upper",
"lower"
],
"action_scale": 8.0,
"body_layout": [
"front",
"upper",
"lower"
],
"control_dt": 0.4,
"control_time_scale_steps": 2000,
"conv_len": 30,
"dtw_lag_channel": 1,
"dtw_version": "legacy_dtw_v1_abs_n_unclipped",
"fifo_init_action": [
0.0,
-4.0,
4.0
],
"fifo_len": 150,
"force_layout": [
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"has_disturbance": true,
"model_name": "d1a3o12_re50",
"mu": 0.04,
"n_objects_env": 7,
"nu": 0.008,
"obs_slice": [
2,
14
],
"pinball_front_x": 30.0,
"pinball_rear_x": 31.3,
"policy_init_action": [
0.0,
-4.0,
4.0
],
"raw_force_slice": [
6,
12
],
"raw_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy",
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"raw_sensor_slice": [
0,
6
],
"re_code": 50,
"re_d": 25.0,
"s_dim": 12,
"sample_interval": 800,
"scene_id": "karman",
"sensor_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy"
],
"sensor_x": 40.0,
"source": "PPO_inference",
"target_force_slice": null,
"target_sensor_slice": [
0,
6
],
"target_type": "periodic",
"u0": 0.01
}
@@ -0,0 +1,117 @@
{
"cfd_device": 0,
"cfd_device_logical": 0,
"cfd_gpu_name": "Tesla V100-SXM2-16GB",
"cfd_gpu_uuid": "GPU-b8c11c01-c91f-aa0b-abf6-dad35085cc76",
"command": "/home/frank14f/anaconda3/envs/pycuda_3_10/bin/python /home/frank14f/DynamisLab/src/SR_analysis/stage_1_infer.py --group karman_trained --run-id article-joint-data-karman-20260718 --device 0 --model-device cpu --steps 200 --norm-source existing",
"config": {
"action_bias": [
0.0,
-4.0,
4.0
],
"action_layout": [
"front",
"upper",
"lower"
],
"action_scale": 8.0,
"body_layout": [
"front",
"upper",
"lower"
],
"control_dt": 0.4,
"control_time_scale_steps": 2000,
"conv_len": 30,
"dtw_lag_channel": 1,
"dtw_version": "legacy_dtw_v1_abs_n_unclipped",
"fifo_init_action": [
0.0,
-4.0,
4.0
],
"fifo_len": 150,
"force_layout": [
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"has_disturbance": true,
"model_name": "d1a3o12_re50",
"mu": 0.04,
"n_objects_env": 7,
"nu": 0.008,
"obs_slice": [
2,
14
],
"pinball_front_x": 30.0,
"pinball_rear_x": 31.3,
"policy_init_action": [
0.0,
-4.0,
4.0
],
"raw_force_slice": [
6,
12
],
"raw_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy",
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"raw_sensor_slice": [
0,
6
],
"re_code": 50,
"re_d": 25.0,
"s_dim": 12,
"sample_interval": 800,
"scene_id": "karman",
"sensor_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy"
],
"sensor_x": 40.0,
"source": "PPO_inference",
"target_force_slice": null,
"target_sensor_slice": [
0,
6
],
"target_type": "periodic",
"u0": 0.01
},
"created_utc": "2026-07-18T09:27:42.439484+00:00",
"cuda_visible_devices": "2",
"git_sha": "ca8ee5f238ee58eaaf48027ad026c35784f76d4d",
"metric_id": "legacy_similarity_v1",
"model_device": "cpu",
"model_path": "/home/frank14f/DynamisLab/models/old/d1a3o12_re50.zip",
"model_sha256": "dfd2163b0bf89115303015b010aa5ad5fe95b8f4bd81176a356714a1984445f4",
"norm_source": "existing",
"output_dir": "/home/frank14f/DynamisLab/src/SR_analysis/data/runs/article-joint-data-karman-20260718/karman/karman_re50",
"run_id": "article-joint-data-karman-20260718",
"scene": "karman_re50",
"scene_id": "karman",
"schema_version": "sr-stage1-manifest-v2"
}
@@ -0,0 +1,24 @@
{
"action_bias": [
0.0,
-4.0,
4.0
],
"force_norm_fact": 0.015911692287772894,
"sens_deviation": [
0.6078279614448547,
-0.04162348061800003,
0.07135022431612015,
-0.0008823801181279123,
0.6027681827545166,
0.0418982058763504
],
"sens_norm_fact": [
0.789494514465332,
1.1795930862426758,
0.18662318587303162,
1.1806247234344482,
0.8472481369972229,
1.2091511487960815
]
}
@@ -0,0 +1,112 @@
{
"avg_reward_last100": 0.19516606600816055,
"command": "/home/frank14f/anaconda3/envs/pycuda_3_10/bin/python /home/frank14f/DynamisLab/src/SR_analysis/stage_1_infer.py --group karman_trained --run-id article-joint-data-karman-20260718 --device 0 --model-device cpu --steps 200 --norm-source existing",
"config": {
"action_bias": [
0.0,
-4.0,
4.0
],
"action_layout": [
"front",
"upper",
"lower"
],
"action_scale": 8.0,
"body_layout": [
"front",
"upper",
"lower"
],
"control_dt": 0.4,
"control_time_scale_steps": 2000,
"conv_len": 30,
"dtw_lag_channel": 1,
"dtw_version": "legacy_dtw_v1_abs_n_unclipped",
"fifo_init_action": [
0.0,
-4.0,
4.0
],
"fifo_len": 150,
"force_layout": [
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"has_disturbance": true,
"model_name": "d1a3o12_re50",
"mu": 0.04,
"n_objects_env": 7,
"nu": 0.008,
"obs_slice": [
2,
14
],
"pinball_front_x": 30.0,
"pinball_rear_x": 31.3,
"policy_init_action": [
0.0,
-4.0,
4.0
],
"raw_force_slice": [
6,
12
],
"raw_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy",
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"raw_sensor_slice": [
0,
6
],
"re_code": 50,
"re_d": 25.0,
"s_dim": 12,
"sample_interval": 800,
"scene_id": "karman",
"sensor_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy"
],
"sensor_x": 40.0,
"source": "PPO_inference",
"target_force_slice": null,
"target_sensor_slice": [
0,
6
],
"target_type": "periodic",
"u0": 0.01
},
"controlled": true,
"git_sha": "ca8ee5f238ee58eaaf48027ad026c35784f76d4d",
"metric_id": "legacy_similarity_v1",
"model_path": "/home/frank14f/DynamisLab/models/old/d1a3o12_re50.zip",
"model_sha256": "dfd2163b0bf89115303015b010aa5ad5fe95b8f4bd81176a356714a1984445f4",
"norm_source": "existing",
"norm_source_path": "/home/frank14f/DynamisLab/src/SR_analysis/data/karman/karman_re50/norm.json",
"run_id": "article-joint-data-karman-20260718",
"scene": "karman_re50",
"schema_version": "sr-stage1-result-v2",
"similarity": 0.9560975831726358
}
@@ -0,0 +1,97 @@
{
"action_bias": [
0.0,
-4.0,
4.0
],
"action_layout": [
"front",
"upper",
"lower"
],
"action_scale": 8.0,
"body_layout": [
"front",
"upper",
"lower"
],
"control_dt": 0.4,
"control_time_scale_steps": 2000,
"conv_len": 30,
"dtw_lag_channel": 1,
"dtw_version": "legacy_dtw_v1_abs_n_unclipped",
"fifo_init_action": [
0.0,
-4.0,
4.0
],
"fifo_len": 150,
"force_layout": [
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"has_disturbance": true,
"model_name": "d1a3o12_re100",
"mu": 0.02,
"n_objects_env": 7,
"nu": 0.004,
"obs_slice": [
2,
14
],
"pinball_front_x": 30.0,
"pinball_rear_x": 31.3,
"policy_init_action": [
0.0,
-4.0,
4.0
],
"raw_force_slice": [
6,
12
],
"raw_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy",
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"raw_sensor_slice": [
0,
6
],
"re_code": 100,
"re_d": 50.0,
"s_dim": 12,
"sample_interval": 800,
"scene_id": "karman",
"sensor_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy"
],
"sensor_x": 40.0,
"source": "PPO_inference",
"target_force_slice": null,
"target_sensor_slice": [
0,
6
],
"target_type": "periodic",
"u0": 0.01
}
@@ -0,0 +1,111 @@
{
"command": "/home/frank14f/anaconda3/envs/pycuda_3_10/bin/python /home/frank14f/DynamisLab/src/SR_analysis/stage_1_infer.py --group karman_trained --run-id round1-legacy-20260716 --norm-source existing --device 2 --steps 200",
"config": {
"action_bias": [
0.0,
-4.0,
4.0
],
"action_layout": [
"front",
"upper",
"lower"
],
"action_scale": 8.0,
"body_layout": [
"front",
"upper",
"lower"
],
"control_dt": 0.4,
"control_time_scale_steps": 2000,
"conv_len": 30,
"dtw_lag_channel": 1,
"dtw_version": "legacy_dtw_v1_abs_n_unclipped",
"fifo_init_action": [
0.0,
-4.0,
4.0
],
"fifo_len": 150,
"force_layout": [
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"has_disturbance": true,
"model_name": "d1a3o12_re100",
"mu": 0.02,
"n_objects_env": 7,
"nu": 0.004,
"obs_slice": [
2,
14
],
"pinball_front_x": 30.0,
"pinball_rear_x": 31.3,
"policy_init_action": [
0.0,
-4.0,
4.0
],
"raw_force_slice": [
6,
12
],
"raw_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy",
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"raw_sensor_slice": [
0,
6
],
"re_code": 100,
"re_d": 50.0,
"s_dim": 12,
"sample_interval": 800,
"scene_id": "karman",
"sensor_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy"
],
"sensor_x": 40.0,
"source": "PPO_inference",
"target_force_slice": null,
"target_sensor_slice": [
0,
6
],
"target_type": "periodic",
"u0": 0.01
},
"created_utc": "2026-07-16T15:33:13.359477+00:00",
"git_sha": "ca8ee5f238ee58eaaf48027ad026c35784f76d4d",
"metric_id": "legacy_similarity_v1",
"model_path": "/home/frank14f/DynamisLab/models/old/d1a3o12_re100.zip",
"model_sha256": "148240c1dcb8b11d8e5a0a9e991f6874c4e799c9744707bf0fb32a8efeb0468d",
"norm_source": "existing",
"output_dir": "/home/frank14f/DynamisLab/src/SR_analysis/data/runs/round1-legacy-20260716/karman/karman_re100",
"run_id": "round1-legacy-20260716",
"scene": "karman_re100",
"scene_id": "karman",
"schema_version": "sr-stage1-manifest-v2"
}
@@ -0,0 +1,24 @@
{
"action_bias": [
0.0,
-4.0,
4.0
],
"force_norm_fact": 0.019199129194021225,
"sens_deviation": [
0.8231719732284546,
-0.12661591172218323,
0.24832786619663239,
-0.01064519677311182,
0.7844515442848206,
0.1161285787820816
],
"sens_norm_fact": [
3.3014419078826904,
3.2062995433807373,
1.8544995784759521,
3.4928226470947266,
3.1099960803985596,
2.815072774887085
]
}
@@ -0,0 +1,97 @@
{
"action_bias": [
0.0,
-4.0,
4.0
],
"action_layout": [
"front",
"upper",
"lower"
],
"action_scale": 8.0,
"body_layout": [
"front",
"upper",
"lower"
],
"control_dt": 0.4,
"control_time_scale_steps": 2000,
"conv_len": 30,
"dtw_lag_channel": 1,
"dtw_version": "legacy_dtw_v1_abs_n_unclipped",
"fifo_init_action": [
0.0,
-4.0,
4.0
],
"fifo_len": 150,
"force_layout": [
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"has_disturbance": true,
"model_name": "d1a3o12_re50",
"mu": 0.04,
"n_objects_env": 7,
"nu": 0.008,
"obs_slice": [
2,
14
],
"pinball_front_x": 30.0,
"pinball_rear_x": 31.3,
"policy_init_action": [
0.0,
-4.0,
4.0
],
"raw_force_slice": [
6,
12
],
"raw_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy",
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"raw_sensor_slice": [
0,
6
],
"re_code": 50,
"re_d": 25.0,
"s_dim": 12,
"sample_interval": 800,
"scene_id": "karman",
"sensor_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy"
],
"sensor_x": 40.0,
"source": "PPO_inference",
"target_force_slice": null,
"target_sensor_slice": [
0,
6
],
"target_type": "periodic",
"u0": 0.01
}
@@ -0,0 +1,111 @@
{
"command": "/home/frank14f/anaconda3/envs/pycuda_3_10/bin/python /home/frank14f/DynamisLab/src/SR_analysis/stage_1_infer.py --group karman_trained --run-id round1-legacy-20260716 --norm-source existing --device 2 --steps 200",
"config": {
"action_bias": [
0.0,
-4.0,
4.0
],
"action_layout": [
"front",
"upper",
"lower"
],
"action_scale": 8.0,
"body_layout": [
"front",
"upper",
"lower"
],
"control_dt": 0.4,
"control_time_scale_steps": 2000,
"conv_len": 30,
"dtw_lag_channel": 1,
"dtw_version": "legacy_dtw_v1_abs_n_unclipped",
"fifo_init_action": [
0.0,
-4.0,
4.0
],
"fifo_len": 150,
"force_layout": [
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"has_disturbance": true,
"model_name": "d1a3o12_re50",
"mu": 0.04,
"n_objects_env": 7,
"nu": 0.008,
"obs_slice": [
2,
14
],
"pinball_front_x": 30.0,
"pinball_rear_x": 31.3,
"policy_init_action": [
0.0,
-4.0,
4.0
],
"raw_force_slice": [
6,
12
],
"raw_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy",
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"raw_sensor_slice": [
0,
6
],
"re_code": 50,
"re_d": 25.0,
"s_dim": 12,
"sample_interval": 800,
"scene_id": "karman",
"sensor_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy"
],
"sensor_x": 40.0,
"source": "PPO_inference",
"target_force_slice": null,
"target_sensor_slice": [
0,
6
],
"target_type": "periodic",
"u0": 0.01
},
"created_utc": "2026-07-16T15:30:00.174858+00:00",
"git_sha": "ca8ee5f238ee58eaaf48027ad026c35784f76d4d",
"metric_id": "legacy_similarity_v1",
"model_path": "/home/frank14f/DynamisLab/models/old/d1a3o12_re50.zip",
"model_sha256": "dfd2163b0bf89115303015b010aa5ad5fe95b8f4bd81176a356714a1984445f4",
"norm_source": "existing",
"output_dir": "/home/frank14f/DynamisLab/src/SR_analysis/data/runs/round1-legacy-20260716/karman/karman_re50",
"run_id": "round1-legacy-20260716",
"scene": "karman_re50",
"scene_id": "karman",
"schema_version": "sr-stage1-manifest-v2"
}
@@ -0,0 +1,24 @@
{
"action_bias": [
0.0,
-4.0,
4.0
],
"force_norm_fact": 0.015911692287772894,
"sens_deviation": [
0.6078279614448547,
-0.04162348061800003,
0.07135022431612015,
-0.0008823801181279123,
0.6027681827545166,
0.0418982058763504
],
"sens_norm_fact": [
0.789494514465332,
1.1795930862426758,
0.18662318587303162,
1.1806247234344482,
0.8472481369972229,
1.2091511487960815
]
}
@@ -0,0 +1,112 @@
{
"avg_reward_last100": 0.19782328174062683,
"command": "/home/frank14f/anaconda3/envs/pycuda_3_10/bin/python /home/frank14f/DynamisLab/src/SR_analysis/stage_1_infer.py --group karman_trained --run-id round1-legacy-20260716 --norm-source existing --device 2 --steps 200",
"config": {
"action_bias": [
0.0,
-4.0,
4.0
],
"action_layout": [
"front",
"upper",
"lower"
],
"action_scale": 8.0,
"body_layout": [
"front",
"upper",
"lower"
],
"control_dt": 0.4,
"control_time_scale_steps": 2000,
"conv_len": 30,
"dtw_lag_channel": 1,
"dtw_version": "legacy_dtw_v1_abs_n_unclipped",
"fifo_init_action": [
0.0,
-4.0,
4.0
],
"fifo_len": 150,
"force_layout": [
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"has_disturbance": true,
"model_name": "d1a3o12_re50",
"mu": 0.04,
"n_objects_env": 7,
"nu": 0.008,
"obs_slice": [
2,
14
],
"pinball_front_x": 30.0,
"pinball_rear_x": 31.3,
"policy_init_action": [
0.0,
-4.0,
4.0
],
"raw_force_slice": [
6,
12
],
"raw_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy",
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"raw_sensor_slice": [
0,
6
],
"re_code": 50,
"re_d": 25.0,
"s_dim": 12,
"sample_interval": 800,
"scene_id": "karman",
"sensor_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy"
],
"sensor_x": 40.0,
"source": "PPO_inference",
"target_force_slice": null,
"target_sensor_slice": [
0,
6
],
"target_type": "periodic",
"u0": 0.01
},
"controlled": true,
"git_sha": "ca8ee5f238ee58eaaf48027ad026c35784f76d4d",
"metric_id": "legacy_similarity_v1",
"model_path": "/home/frank14f/DynamisLab/models/old/d1a3o12_re50.zip",
"model_sha256": "dfd2163b0bf89115303015b010aa5ad5fe95b8f4bd81176a356714a1984445f4",
"norm_source": "existing",
"norm_source_path": "/home/frank14f/DynamisLab/src/SR_analysis/data/karman/karman_re50/norm.json",
"run_id": "round1-legacy-20260716",
"scene": "karman_re50",
"schema_version": "sr-stage1-result-v2",
"similarity": 0.9538252232596278
}
@@ -0,0 +1,109 @@
{
"action_bias": [
0.0,
-2.0,
2.0
],
"action_layout": [
"front",
"upper",
"lower"
],
"action_scale": 8.0,
"body_layout": [
"front",
"upper",
"lower"
],
"control_dt": 0.2,
"control_time_scale_steps": 2000,
"conv_len": 36,
"dtw_lag_channel": 1,
"dtw_version": "legacy_dtw_v1_abs_n_unclipped",
"fifo_init_action": [
0.0,
-1.0,
1.0
],
"fifo_len": 150,
"force_layout": [
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"has_disturbance": false,
"model_name": "d1a3o14_250525_imit_075L_2U_400S",
"mu": 0.02,
"n_objects_env": 6,
"nu": 0.004,
"obs_slice": [
0,
12
],
"pinball_front_x": 19.0,
"pinball_rear_x": 20.3,
"policy_init_action": [
0.0,
-1.0,
1.0
],
"raw_force_slice": [
6,
12
],
"raw_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy",
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"raw_sensor_slice": [
0,
6
],
"re_code": 100,
"re_d": 50.0,
"s_dim": 14,
"sample_interval": 400,
"scene_id": "illusion",
"sensor_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy"
],
"sensor_x": 30.0,
"source": "PPO_inference",
"target_center": [
20.0,
12.775,
0.0
],
"target_center_x": 20.0,
"target_diameter": 0.75,
"target_force_slice": [
0,
2
],
"target_radius": 0.75,
"target_radius_lattice": 15.0,
"target_sensor_slice": [
2,
8
],
"target_type": "periodic",
"u0": 0.01
}
@@ -0,0 +1,125 @@
{
"cfd_device": 2,
"command": "/home/frank14f/anaconda3/envs/pycuda_3_10/bin/python /home/frank14f/DynamisLab/src/SR_analysis/stage_1_infer.py --scene illusion_0.75L --run-id round1-legacy-v2-20260716 --norm-source existing --model-device cpu --device 2 --steps 200",
"config": {
"action_bias": [
0.0,
-2.0,
2.0
],
"action_layout": [
"front",
"upper",
"lower"
],
"action_scale": 8.0,
"body_layout": [
"front",
"upper",
"lower"
],
"control_dt": 0.2,
"control_time_scale_steps": 2000,
"conv_len": 36,
"dtw_lag_channel": 1,
"dtw_version": "legacy_dtw_v1_abs_n_unclipped",
"fifo_init_action": [
0.0,
-1.0,
1.0
],
"fifo_len": 150,
"force_layout": [
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"has_disturbance": false,
"model_name": "d1a3o14_250525_imit_075L_2U_400S",
"mu": 0.02,
"n_objects_env": 6,
"nu": 0.004,
"obs_slice": [
0,
12
],
"pinball_front_x": 19.0,
"pinball_rear_x": 20.3,
"policy_init_action": [
0.0,
-1.0,
1.0
],
"raw_force_slice": [
6,
12
],
"raw_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy",
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"raw_sensor_slice": [
0,
6
],
"re_code": 100,
"re_d": 50.0,
"s_dim": 14,
"sample_interval": 400,
"scene_id": "illusion",
"sensor_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy"
],
"sensor_x": 30.0,
"source": "PPO_inference",
"target_center": [
20.0,
12.775,
0.0
],
"target_center_x": 20.0,
"target_diameter": 0.75,
"target_force_slice": [
0,
2
],
"target_radius": 0.75,
"target_radius_lattice": 15.0,
"target_sensor_slice": [
2,
8
],
"target_type": "periodic",
"u0": 0.01
},
"created_utc": "2026-07-16T16:39:59.246257+00:00",
"git_sha": "ca8ee5f238ee58eaaf48027ad026c35784f76d4d",
"metric_id": "legacy_similarity_v1",
"model_device": "cpu",
"model_path": "/home/frank14f/DynamisLab/models/250525/d1a3o14_250525_imit_075L_2U_400S.zip",
"model_sha256": "1a2d9f77bd6ac44fe7ebe0fe9255e1474c97939238a0200270954fe71f719526",
"norm_source": "existing",
"output_dir": "/home/frank14f/DynamisLab/src/SR_analysis/data/runs/round1-legacy-v2-20260716/illusion/illusion_0.75L",
"run_id": "round1-legacy-v2-20260716",
"scene": "illusion_0.75L",
"scene_id": "illusion",
"schema_version": "sr-stage1-manifest-v2"
}
@@ -0,0 +1,24 @@
{
"action_bias": [
0.0,
-2.0,
2.0
],
"force_norm_fact": 0.013459767680615187,
"sens_deviation": [
0.9466423392295837,
-0.1479361653327942,
0.6496055126190186,
-0.06913633644580841,
0.9421071410179138,
0.08593743294477463
],
"sens_norm_fact": [
2.1083030700683594,
2.7172951698303223,
0.7220026850700378,
3.7818100452423096,
2.1336052417755127,
2.4038033485412598
]
}
@@ -0,0 +1,124 @@
{
"command": "/home/frank14f/anaconda3/envs/pycuda_3_10/bin/python /home/frank14f/DynamisLab/src/SR_analysis/stage_1_infer.py --scene illusion_0.75L --run-id round1-legacy-v2-20260716 --norm-source existing --model-device cpu --device 2 --steps 200",
"config": {
"action_bias": [
0.0,
-2.0,
2.0
],
"action_layout": [
"front",
"upper",
"lower"
],
"action_scale": 8.0,
"body_layout": [
"front",
"upper",
"lower"
],
"control_dt": 0.2,
"control_time_scale_steps": 2000,
"conv_len": 36,
"dtw_lag_channel": 1,
"dtw_version": "legacy_dtw_v1_abs_n_unclipped",
"fifo_init_action": [
0.0,
-1.0,
1.0
],
"fifo_len": 150,
"force_layout": [
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"has_disturbance": false,
"model_name": "d1a3o14_250525_imit_075L_2U_400S",
"mu": 0.02,
"n_objects_env": 6,
"nu": 0.004,
"obs_slice": [
0,
12
],
"pinball_front_x": 19.0,
"pinball_rear_x": 20.3,
"policy_init_action": [
0.0,
-1.0,
1.0
],
"raw_force_slice": [
6,
12
],
"raw_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy",
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"raw_sensor_slice": [
0,
6
],
"re_code": 100,
"re_d": 50.0,
"s_dim": 14,
"sample_interval": 400,
"scene_id": "illusion",
"sensor_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy"
],
"sensor_x": 30.0,
"source": "PPO_inference",
"target_center": [
20.0,
12.775,
0.0
],
"target_center_x": 20.0,
"target_diameter": 0.75,
"target_force_slice": [
0,
2
],
"target_radius": 0.75,
"target_radius_lattice": 15.0,
"target_sensor_slice": [
2,
8
],
"target_type": "periodic",
"u0": 0.01
},
"controlled": true,
"git_sha": "ca8ee5f238ee58eaaf48027ad026c35784f76d4d",
"metric_id": "legacy_similarity_v1",
"model_path": "/home/frank14f/DynamisLab/models/250525/d1a3o14_250525_imit_075L_2U_400S.zip",
"model_sha256": "1a2d9f77bd6ac44fe7ebe0fe9255e1474c97939238a0200270954fe71f719526",
"norm_source": "existing",
"norm_source_path": "/home/frank14f/DynamisLab/src/SR_analysis/data/illusion/illusion_0.75L/norm.json",
"run_id": "round1-legacy-v2-20260716",
"scene": "illusion_0.75L",
"schema_version": "sr-stage1-result-v2",
"similarity": 0.9781681831464758,
"target_only": false
}
@@ -0,0 +1,207 @@
{
"channel_names": [
"target_cylinder_fx",
"target_cylinder_fy",
"sensor_top_ux",
"sensor_top_uy",
"sensor_center_ux",
"sensor_center_uy",
"sensor_bottom_ux",
"sensor_bottom_uy"
],
"harmonics": [
{
"amps": [
3.8455211793365706e-05,
8.275450949679295e-06,
8.079411468771617e-06,
7.703868459170013e-06,
3.4893412287373916e-06
],
"dc": 0.004289336018264294,
"freqs": [
0.06666666666666667,
0.08666666666666667,
0.09333333333333334,
0.18000000000000002,
0.1
],
"phases": [
-0.09027229604986224,
1.1771545263254184,
-1.7735084849793448,
1.6978693131794365,
-1.7975434944250634
]
},
{
"amps": [
0.0011723440153265285,
2.8622262322820926e-06,
2.3151027134545353e-06,
2.1242075647001297e-06,
1.604450387313593e-06
],
"dc": -4.7423382056877015e-07,
"freqs": [
0.03333333333333333,
0.02666666666666667,
0.04,
0.1,
0.02
],
"phases": [
0.3530080939318378,
-2.8379714810098675,
0.39873349113082845,
2.3378598414739864,
-2.9400347939224174
]
},
{
"amps": [
0.24895820326360354,
0.03191204254867192,
0.030453305064819785,
0.009513250962316023,
0.005321433970164499
],
"dc": 1.0453963434696198,
"freqs": [
0.03333333333333333,
0.06666666666666667,
0.1,
0.13333333333333333,
0.16666666666666669
],
"phases": [
-2.4618486314327845,
0.9863940246906102,
-1.287471815531323,
1.9953239608863989,
-0.25503064326534286
]
},
{
"amps": [
0.33085045262917817,
0.08517004748666594,
0.038583915719320745,
0.021846336418179752,
0.00737888145588223
],
"dc": -0.021879322317739328,
"freqs": [
0.03333333333333333,
0.06666666666666667,
0.1,
0.13333333333333333,
0.16666666666666669
],
"phases": [
1.9976521164367769,
-1.262943768730912,
2.687620932707098,
-0.3686931534340266,
-3.05728661831384
]
},
{
"amps": [
0.0716083026905364,
0.00846750552489408,
0.0007813395036211814,
0.00042612893328348897,
0.0003674080876422995
],
"dc": 0.9041156069437662,
"freqs": [
0.06666666666666667,
0.13333333333333333,
0.2,
0.060000000000000005,
0.09333333333333334
],
"phases": [
-2.482222589272965,
-1.265378160509392,
1.411428578816568,
0.5675569819554193,
3.131072391856925
]
},
{
"amps": [
0.6376527910791839,
0.12734248975352097,
0.012382558510752689,
0.001647010727150886,
0.0014319508559823516
],
"dc": 0.00017987216512362162,
"freqs": [
0.03333333333333333,
0.1,
0.16666666666666669,
0.23333333333333334,
0.02666666666666667
],
"phases": [
2.078229108474305,
-3.097292180022822,
-2.2903972319166037,
2.1628352810611506,
-0.9135680435394102
]
},
{
"amps": [
0.24900638497594532,
0.0320362542669637,
0.03024473777928113,
0.009611121032916274,
0.005279091558057458
],
"dc": 1.0451870659987132,
"freqs": [
0.03333333333333333,
0.06666666666666667,
0.1,
0.13333333333333333,
0.16666666666666669
],
"phases": [
0.6798900741813563,
0.9863702478090999,
1.8653507401881053,
1.9902477027500673,
2.8614320188386118
]
},
{
"amps": [
0.3306929095087968,
0.08548418983500956,
0.03861379218924948,
0.02194624227154387,
0.0074365715362979265
],
"dc": 0.021999197993427515,
"freqs": [
0.03333333333333333,
0.06666666666666667,
0.1,
0.13333333333333333,
0.16666666666666669
],
"phases": [
1.9975600909207532,
1.8782427755946722,
2.6838143318810674,
2.7664213671107905,
-3.0717431383539835
]
}
],
"schema_version": "sr-target-harmonics-v2"
}
@@ -0,0 +1,109 @@
{
"action_bias": [
0.0,
-2.0,
2.0
],
"action_layout": [
"front",
"upper",
"lower"
],
"action_scale": 8.0,
"body_layout": [
"front",
"upper",
"lower"
],
"control_dt": 0.3,
"control_time_scale_steps": 2000,
"conv_len": 36,
"dtw_lag_channel": 1,
"dtw_version": "legacy_dtw_v1_abs_n_unclipped",
"fifo_init_action": [
0.0,
-1.0,
1.0
],
"fifo_len": 150,
"force_layout": [
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"has_disturbance": false,
"model_name": "d1a3o14_250525_imit_1L_2U_600S",
"mu": 0.02,
"n_objects_env": 6,
"nu": 0.004,
"obs_slice": [
0,
12
],
"pinball_front_x": 19.0,
"pinball_rear_x": 20.3,
"policy_init_action": [
0.0,
-1.0,
1.0
],
"raw_force_slice": [
6,
12
],
"raw_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy",
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"raw_sensor_slice": [
0,
6
],
"re_code": 100,
"re_d": 50.0,
"s_dim": 14,
"sample_interval": 600,
"scene_id": "illusion",
"sensor_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy"
],
"sensor_x": 30.0,
"source": "PPO_inference",
"target_center": [
20.0,
12.775,
0.0
],
"target_center_x": 20.0,
"target_diameter": 1.0,
"target_force_slice": [
0,
2
],
"target_radius": 1.0,
"target_radius_lattice": 20.0,
"target_sensor_slice": [
2,
8
],
"target_type": "periodic",
"u0": 0.01
}
@@ -0,0 +1,125 @@
{
"cfd_device": 2,
"command": "/home/frank14f/anaconda3/envs/pycuda_3_10/bin/python /home/frank14f/DynamisLab/src/SR_analysis/stage_1_infer.py --scene illusion_1L --run-id round1-legacy-v2-20260716 --norm-source existing --model-device cpu --device 2 --steps 200",
"config": {
"action_bias": [
0.0,
-2.0,
2.0
],
"action_layout": [
"front",
"upper",
"lower"
],
"action_scale": 8.0,
"body_layout": [
"front",
"upper",
"lower"
],
"control_dt": 0.3,
"control_time_scale_steps": 2000,
"conv_len": 36,
"dtw_lag_channel": 1,
"dtw_version": "legacy_dtw_v1_abs_n_unclipped",
"fifo_init_action": [
0.0,
-1.0,
1.0
],
"fifo_len": 150,
"force_layout": [
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"has_disturbance": false,
"model_name": "d1a3o14_250525_imit_1L_2U_600S",
"mu": 0.02,
"n_objects_env": 6,
"nu": 0.004,
"obs_slice": [
0,
12
],
"pinball_front_x": 19.0,
"pinball_rear_x": 20.3,
"policy_init_action": [
0.0,
-1.0,
1.0
],
"raw_force_slice": [
6,
12
],
"raw_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy",
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"raw_sensor_slice": [
0,
6
],
"re_code": 100,
"re_d": 50.0,
"s_dim": 14,
"sample_interval": 600,
"scene_id": "illusion",
"sensor_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy"
],
"sensor_x": 30.0,
"source": "PPO_inference",
"target_center": [
20.0,
12.775,
0.0
],
"target_center_x": 20.0,
"target_diameter": 1.0,
"target_force_slice": [
0,
2
],
"target_radius": 1.0,
"target_radius_lattice": 20.0,
"target_sensor_slice": [
2,
8
],
"target_type": "periodic",
"u0": 0.01
},
"created_utc": "2026-07-16T16:14:04.823052+00:00",
"git_sha": "ca8ee5f238ee58eaaf48027ad026c35784f76d4d",
"metric_id": "legacy_similarity_v1",
"model_device": "cpu",
"model_path": "/home/frank14f/DynamisLab/models/250525/d1a3o14_250525_imit_1L_2U_600S.zip",
"model_sha256": "570fbdb08fba1170cbab53de9ede372a9536e0bb8419dda0f0f2db20fd20583d",
"norm_source": "existing",
"output_dir": "/home/frank14f/DynamisLab/src/SR_analysis/data/runs/round1-legacy-v2-20260716/illusion/illusion_1L",
"run_id": "round1-legacy-v2-20260716",
"scene": "illusion_1L",
"scene_id": "illusion",
"schema_version": "sr-stage1-manifest-v2"
}
@@ -0,0 +1,24 @@
{
"action_bias": [
0.0,
-2.0,
2.0
],
"force_norm_fact": 0.01349810091778636,
"sens_deviation": [
0.9381087422370911,
-0.12299147248268127,
0.648796796798706,
-0.022100985050201416,
0.9596271514892578,
0.11032649874687195
],
"sens_norm_fact": [
2.1753337383270264,
2.5954699516296387,
0.707850456237793,
3.554702043533325,
2.0688724517822266,
2.5344114303588867
]
}
@@ -0,0 +1,124 @@
{
"command": "/home/frank14f/anaconda3/envs/pycuda_3_10/bin/python /home/frank14f/DynamisLab/src/SR_analysis/stage_1_infer.py --scene illusion_1L --run-id round1-legacy-v2-20260716 --norm-source existing --model-device cpu --device 2 --steps 200",
"config": {
"action_bias": [
0.0,
-2.0,
2.0
],
"action_layout": [
"front",
"upper",
"lower"
],
"action_scale": 8.0,
"body_layout": [
"front",
"upper",
"lower"
],
"control_dt": 0.3,
"control_time_scale_steps": 2000,
"conv_len": 36,
"dtw_lag_channel": 1,
"dtw_version": "legacy_dtw_v1_abs_n_unclipped",
"fifo_init_action": [
0.0,
-1.0,
1.0
],
"fifo_len": 150,
"force_layout": [
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"has_disturbance": false,
"model_name": "d1a3o14_250525_imit_1L_2U_600S",
"mu": 0.02,
"n_objects_env": 6,
"nu": 0.004,
"obs_slice": [
0,
12
],
"pinball_front_x": 19.0,
"pinball_rear_x": 20.3,
"policy_init_action": [
0.0,
-1.0,
1.0
],
"raw_force_slice": [
6,
12
],
"raw_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy",
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"raw_sensor_slice": [
0,
6
],
"re_code": 100,
"re_d": 50.0,
"s_dim": 14,
"sample_interval": 600,
"scene_id": "illusion",
"sensor_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy"
],
"sensor_x": 30.0,
"source": "PPO_inference",
"target_center": [
20.0,
12.775,
0.0
],
"target_center_x": 20.0,
"target_diameter": 1.0,
"target_force_slice": [
0,
2
],
"target_radius": 1.0,
"target_radius_lattice": 20.0,
"target_sensor_slice": [
2,
8
],
"target_type": "periodic",
"u0": 0.01
},
"controlled": true,
"git_sha": "ca8ee5f238ee58eaaf48027ad026c35784f76d4d",
"metric_id": "legacy_similarity_v1",
"model_path": "/home/frank14f/DynamisLab/models/250525/d1a3o14_250525_imit_1L_2U_600S.zip",
"model_sha256": "570fbdb08fba1170cbab53de9ede372a9536e0bb8419dda0f0f2db20fd20583d",
"norm_source": "existing",
"norm_source_path": "/home/frank14f/DynamisLab/src/SR_analysis/data/illusion/illusion_1L/norm.json",
"run_id": "round1-legacy-v2-20260716",
"scene": "illusion_1L",
"schema_version": "sr-stage1-result-v2",
"similarity": 0.9712801660298956,
"target_only": false
}
@@ -0,0 +1,207 @@
{
"channel_names": [
"target_cylinder_fx",
"target_cylinder_fy",
"sensor_top_ux",
"sensor_top_uy",
"sensor_center_ux",
"sensor_center_uy",
"sensor_bottom_ux",
"sensor_bottom_uy"
],
"harmonics": [
{
"amps": [
0.00010205708255214146,
3.0248093490965592e-05,
1.3150227020475523e-05,
1.1607369515791603e-05,
1.1036696588396827e-05
],
"dc": 0.005646450578545531,
"freqs": [
0.08,
0.13333333333333333,
0.26666666666666666,
0.2733333333333334,
0.07333333333333333
],
"phases": [
-0.10231600311226928,
-0.1972446247801372,
1.1108103260960227,
-1.6776896410003184,
-0.09560354412318577
]
},
{
"amps": [
0.002109026801983347,
0.00011012509884861676,
0.0001043715603670594,
6.192627653273236e-05,
4.746673018624633e-05
],
"dc": 1.715375133547544e-05,
"freqs": [
0.04,
0.03333333333333333,
0.04666666666666667,
0.02666666666666667,
0.05333333333333334
],
"phases": [
0.3082920945848423,
0.2571952650069411,
-2.783781997604738,
0.20836688401808104,
-2.7312639011375293
]
},
{
"amps": [
0.3155440457066763,
0.04652979024570437,
0.021784389674249973,
0.017486323042208485,
0.014453075152406385
],
"dc": 1.0117336698373158,
"freqs": [
0.04,
0.12000000000000001,
0.08,
0.04666666666666667,
0.03333333333333333
],
"phases": [
-0.766062272072484,
-2.520484135313382,
-1.676937530529786,
2.3813121650836684,
-0.7457378774674286
]
},
{
"amps": [
0.4500898765242194,
0.10334445143259781,
0.06606956446349073,
0.03843800022276183,
0.024089669153800685
],
"dc": -0.03956304603954777,
"freqs": [
0.04,
0.08,
0.12000000000000001,
0.16,
0.04666666666666667
],
"phases": [
-2.5961945770466985,
1.9634892656764606,
1.6057708007102416,
-0.035110790445565206,
0.685401354792863
]
},
{
"amps": [
0.07928524671005938,
0.01416057863436279,
0.008822679738690276,
0.0073944904893691555,
0.004274967427879971
],
"dc": 0.9201729357242584,
"freqs": [
0.08,
0.16,
0.08666666666666667,
0.07333333333333333,
0.09333333333333334
],
"phases": [
0.7545049238438057,
-0.9806295046785551,
-2.3116737608204234,
0.6756930987832405,
-2.21374206436862
]
},
{
"amps": [
0.7624573312055939,
0.1752999739049753,
0.03981102820306488,
0.03817959962818357,
0.030035340442593258
],
"dc": -0.005461694399515788,
"freqs": [
0.04,
0.12000000000000001,
0.04666666666666667,
0.03333333333333333,
0.12666666666666668
],
"phases": [
-2.5223017431056736,
1.9905492746244613,
0.7323723101143929,
-2.6324440393725337,
-1.0602928926817423
]
},
{
"amps": [
0.3153989439537227,
0.04648743847198824,
0.025715081115708482,
0.01769277774751535,
0.014536837024573751
],
"dc": 1.009100293715795,
"freqs": [
0.04,
0.12000000000000001,
0.08,
0.04666666666666667,
0.03333333333333333
],
"phases": [
2.377859545359567,
0.6504773051217484,
-1.4310032291911887,
-0.7934055658540536,
2.4219628545287097
]
},
{
"amps": [
0.4510401036131541,
0.09796160643556902,
0.0700978398942289,
0.036773708690719546,
0.02297123045471385
],
"dc": 0.03311382582876831,
"freqs": [
0.04,
0.08,
0.12000000000000001,
0.16,
0.03333333333333333
],
"phases": [
-2.592195908805058,
-1.1095158360930863,
1.6657355074615787,
-3.107414747343894,
-2.6551572803892065
]
}
],
"schema_version": "sr-target-harmonics-v2"
}
@@ -0,0 +1,97 @@
{
"action_bias": [
0.0,
-4.0,
4.0
],
"action_layout": [
"front",
"upper",
"lower"
],
"action_scale": 8.0,
"body_layout": [
"front",
"upper",
"lower"
],
"control_dt": 0.4,
"control_time_scale_steps": 2000,
"conv_len": 30,
"dtw_lag_channel": 1,
"dtw_version": "legacy_dtw_v1_abs_n_unclipped",
"fifo_init_action": [
0.0,
-4.0,
4.0
],
"fifo_len": 150,
"force_layout": [
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"has_disturbance": true,
"model_name": "d1a3o12_re100",
"mu": 0.02,
"n_objects_env": 7,
"nu": 0.004,
"obs_slice": [
2,
14
],
"pinball_front_x": 30.0,
"pinball_rear_x": 31.3,
"policy_init_action": [
0.0,
-4.0,
4.0
],
"raw_force_slice": [
6,
12
],
"raw_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy",
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"raw_sensor_slice": [
0,
6
],
"re_code": 100,
"re_d": 50.0,
"s_dim": 12,
"sample_interval": 800,
"scene_id": "karman",
"sensor_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy"
],
"sensor_x": 40.0,
"source": "PPO_inference",
"target_force_slice": null,
"target_sensor_slice": [
0,
6
],
"target_type": "periodic",
"u0": 0.01
}
@@ -0,0 +1,113 @@
{
"cfd_device": 2,
"command": "/home/frank14f/anaconda3/envs/pycuda_3_10/bin/python /home/frank14f/DynamisLab/src/SR_analysis/stage_1_infer.py --group karman_trained --run-id round1-legacy-v2-20260716 --norm-source existing --model-device cpu --device 2 --steps 200",
"config": {
"action_bias": [
0.0,
-4.0,
4.0
],
"action_layout": [
"front",
"upper",
"lower"
],
"action_scale": 8.0,
"body_layout": [
"front",
"upper",
"lower"
],
"control_dt": 0.4,
"control_time_scale_steps": 2000,
"conv_len": 30,
"dtw_lag_channel": 1,
"dtw_version": "legacy_dtw_v1_abs_n_unclipped",
"fifo_init_action": [
0.0,
-4.0,
4.0
],
"fifo_len": 150,
"force_layout": [
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"has_disturbance": true,
"model_name": "d1a3o12_re100",
"mu": 0.02,
"n_objects_env": 7,
"nu": 0.004,
"obs_slice": [
2,
14
],
"pinball_front_x": 30.0,
"pinball_rear_x": 31.3,
"policy_init_action": [
0.0,
-4.0,
4.0
],
"raw_force_slice": [
6,
12
],
"raw_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy",
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"raw_sensor_slice": [
0,
6
],
"re_code": 100,
"re_d": 50.0,
"s_dim": 12,
"sample_interval": 800,
"scene_id": "karman",
"sensor_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy"
],
"sensor_x": 40.0,
"source": "PPO_inference",
"target_force_slice": null,
"target_sensor_slice": [
0,
6
],
"target_type": "periodic",
"u0": 0.01
},
"created_utc": "2026-07-16T15:56:10.558872+00:00",
"git_sha": "ca8ee5f238ee58eaaf48027ad026c35784f76d4d",
"metric_id": "legacy_similarity_v1",
"model_device": "cpu",
"model_path": "/home/frank14f/DynamisLab/models/old/d1a3o12_re100.zip",
"model_sha256": "148240c1dcb8b11d8e5a0a9e991f6874c4e799c9744707bf0fb32a8efeb0468d",
"norm_source": "existing",
"output_dir": "/home/frank14f/DynamisLab/src/SR_analysis/data/runs/round1-legacy-v2-20260716/karman/karman_re100",
"run_id": "round1-legacy-v2-20260716",
"scene": "karman_re100",
"scene_id": "karman",
"schema_version": "sr-stage1-manifest-v2"
}
@@ -0,0 +1,24 @@
{
"action_bias": [
0.0,
-4.0,
4.0
],
"force_norm_fact": 0.019199129194021225,
"sens_deviation": [
0.8231719732284546,
-0.12661591172218323,
0.24832786619663239,
-0.01064519677311182,
0.7844515442848206,
0.1161285787820816
],
"sens_norm_fact": [
3.3014419078826904,
3.2062995433807373,
1.8544995784759521,
3.4928226470947266,
3.1099960803985596,
2.815072774887085
]
}
@@ -0,0 +1,112 @@
{
"avg_reward_last100": 0.1855554806645312,
"command": "/home/frank14f/anaconda3/envs/pycuda_3_10/bin/python /home/frank14f/DynamisLab/src/SR_analysis/stage_1_infer.py --group karman_trained --run-id round1-legacy-v2-20260716 --norm-source existing --model-device cpu --device 2 --steps 200",
"config": {
"action_bias": [
0.0,
-4.0,
4.0
],
"action_layout": [
"front",
"upper",
"lower"
],
"action_scale": 8.0,
"body_layout": [
"front",
"upper",
"lower"
],
"control_dt": 0.4,
"control_time_scale_steps": 2000,
"conv_len": 30,
"dtw_lag_channel": 1,
"dtw_version": "legacy_dtw_v1_abs_n_unclipped",
"fifo_init_action": [
0.0,
-4.0,
4.0
],
"fifo_len": 150,
"force_layout": [
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"has_disturbance": true,
"model_name": "d1a3o12_re100",
"mu": 0.02,
"n_objects_env": 7,
"nu": 0.004,
"obs_slice": [
2,
14
],
"pinball_front_x": 30.0,
"pinball_rear_x": 31.3,
"policy_init_action": [
0.0,
-4.0,
4.0
],
"raw_force_slice": [
6,
12
],
"raw_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy",
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"raw_sensor_slice": [
0,
6
],
"re_code": 100,
"re_d": 50.0,
"s_dim": 12,
"sample_interval": 800,
"scene_id": "karman",
"sensor_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy"
],
"sensor_x": 40.0,
"source": "PPO_inference",
"target_force_slice": null,
"target_sensor_slice": [
0,
6
],
"target_type": "periodic",
"u0": 0.01
},
"controlled": true,
"git_sha": "ca8ee5f238ee58eaaf48027ad026c35784f76d4d",
"metric_id": "legacy_similarity_v1",
"model_path": "/home/frank14f/DynamisLab/models/old/d1a3o12_re100.zip",
"model_sha256": "148240c1dcb8b11d8e5a0a9e991f6874c4e799c9744707bf0fb32a8efeb0468d",
"norm_source": "existing",
"norm_source_path": "/home/frank14f/DynamisLab/src/SR_analysis/data/karman/karman_re100/norm.json",
"run_id": "round1-legacy-v2-20260716",
"scene": "karman_re100",
"schema_version": "sr-stage1-result-v2",
"similarity": 0.9454895479138941
}
@@ -0,0 +1,97 @@
{
"action_bias": [
0.0,
-4.0,
4.0
],
"action_layout": [
"front",
"upper",
"lower"
],
"action_scale": 8.0,
"body_layout": [
"front",
"upper",
"lower"
],
"control_dt": 0.4,
"control_time_scale_steps": 2000,
"conv_len": 30,
"dtw_lag_channel": 1,
"dtw_version": "legacy_dtw_v1_abs_n_unclipped",
"fifo_init_action": [
0.0,
-4.0,
4.0
],
"fifo_len": 150,
"force_layout": [
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"has_disturbance": true,
"model_name": "d1a3o12_re200",
"mu": 0.01,
"n_objects_env": 7,
"nu": 0.002,
"obs_slice": [
2,
14
],
"pinball_front_x": 30.0,
"pinball_rear_x": 31.3,
"policy_init_action": [
0.0,
-4.0,
4.0
],
"raw_force_slice": [
6,
12
],
"raw_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy",
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"raw_sensor_slice": [
0,
6
],
"re_code": 200,
"re_d": 100.0,
"s_dim": 12,
"sample_interval": 800,
"scene_id": "karman",
"sensor_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy"
],
"sensor_x": 40.0,
"source": "PPO_inference",
"target_force_slice": null,
"target_sensor_slice": [
0,
6
],
"target_type": "periodic",
"u0": 0.01
}
@@ -0,0 +1,113 @@
{
"cfd_device": 2,
"command": "/home/frank14f/anaconda3/envs/pycuda_3_10/bin/python /home/frank14f/DynamisLab/src/SR_analysis/stage_1_infer.py --group karman_trained --run-id round1-legacy-v2-20260716 --norm-source existing --model-device cpu --device 2 --steps 200",
"config": {
"action_bias": [
0.0,
-4.0,
4.0
],
"action_layout": [
"front",
"upper",
"lower"
],
"action_scale": 8.0,
"body_layout": [
"front",
"upper",
"lower"
],
"control_dt": 0.4,
"control_time_scale_steps": 2000,
"conv_len": 30,
"dtw_lag_channel": 1,
"dtw_version": "legacy_dtw_v1_abs_n_unclipped",
"fifo_init_action": [
0.0,
-4.0,
4.0
],
"fifo_len": 150,
"force_layout": [
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"has_disturbance": true,
"model_name": "d1a3o12_re200",
"mu": 0.01,
"n_objects_env": 7,
"nu": 0.002,
"obs_slice": [
2,
14
],
"pinball_front_x": 30.0,
"pinball_rear_x": 31.3,
"policy_init_action": [
0.0,
-4.0,
4.0
],
"raw_force_slice": [
6,
12
],
"raw_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy",
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"raw_sensor_slice": [
0,
6
],
"re_code": 200,
"re_d": 100.0,
"s_dim": 12,
"sample_interval": 800,
"scene_id": "karman",
"sensor_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy"
],
"sensor_x": 40.0,
"source": "PPO_inference",
"target_force_slice": null,
"target_sensor_slice": [
0,
6
],
"target_type": "periodic",
"u0": 0.01
},
"created_utc": "2026-07-16T15:59:17.195761+00:00",
"git_sha": "ca8ee5f238ee58eaaf48027ad026c35784f76d4d",
"metric_id": "legacy_similarity_v1",
"model_device": "cpu",
"model_path": "/home/frank14f/DynamisLab/models/old/d1a3o12_re200.zip",
"model_sha256": "62ceb682fbfcff1119e049d306d3ac05144b780f166c2835d7d01ca719ffad11",
"norm_source": "existing",
"output_dir": "/home/frank14f/DynamisLab/src/SR_analysis/data/runs/round1-legacy-v2-20260716/karman/karman_re200",
"run_id": "round1-legacy-v2-20260716",
"scene": "karman_re200",
"scene_id": "karman",
"schema_version": "sr-stage1-manifest-v2"
}
@@ -0,0 +1,24 @@
{
"action_bias": [
0.0,
-4.0,
4.0
],
"force_norm_fact": 0.02405486349016428,
"sens_deviation": [
0.761349618434906,
-0.10393908619880676,
-0.0060332342982292175,
-0.01062991376966238,
0.7603892087936401,
0.08925710618495941
],
"sens_norm_fact": [
2.458379030227661,
2.4950430393218994,
0.986889123916626,
2.259662389755249,
2.737121820449829,
2.521576404571533
]
}
@@ -0,0 +1,112 @@
{
"avg_reward_last100": 0.11469697644647159,
"command": "/home/frank14f/anaconda3/envs/pycuda_3_10/bin/python /home/frank14f/DynamisLab/src/SR_analysis/stage_1_infer.py --group karman_trained --run-id round1-legacy-v2-20260716 --norm-source existing --model-device cpu --device 2 --steps 200",
"config": {
"action_bias": [
0.0,
-4.0,
4.0
],
"action_layout": [
"front",
"upper",
"lower"
],
"action_scale": 8.0,
"body_layout": [
"front",
"upper",
"lower"
],
"control_dt": 0.4,
"control_time_scale_steps": 2000,
"conv_len": 30,
"dtw_lag_channel": 1,
"dtw_version": "legacy_dtw_v1_abs_n_unclipped",
"fifo_init_action": [
0.0,
-4.0,
4.0
],
"fifo_len": 150,
"force_layout": [
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"has_disturbance": true,
"model_name": "d1a3o12_re200",
"mu": 0.01,
"n_objects_env": 7,
"nu": 0.002,
"obs_slice": [
2,
14
],
"pinball_front_x": 30.0,
"pinball_rear_x": 31.3,
"policy_init_action": [
0.0,
-4.0,
4.0
],
"raw_force_slice": [
6,
12
],
"raw_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy",
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"raw_sensor_slice": [
0,
6
],
"re_code": 200,
"re_d": 100.0,
"s_dim": 12,
"sample_interval": 800,
"scene_id": "karman",
"sensor_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy"
],
"sensor_x": 40.0,
"source": "PPO_inference",
"target_force_slice": null,
"target_sensor_slice": [
0,
6
],
"target_type": "periodic",
"u0": 0.01
},
"controlled": true,
"git_sha": "ca8ee5f238ee58eaaf48027ad026c35784f76d4d",
"metric_id": "legacy_similarity_v1",
"model_path": "/home/frank14f/DynamisLab/models/old/d1a3o12_re200.zip",
"model_sha256": "62ceb682fbfcff1119e049d306d3ac05144b780f166c2835d7d01ca719ffad11",
"norm_source": "existing",
"norm_source_path": "/home/frank14f/DynamisLab/src/SR_analysis/data/karman/karman_re200/norm.json",
"run_id": "round1-legacy-v2-20260716",
"scene": "karman_re200",
"schema_version": "sr-stage1-result-v2",
"similarity": 0.904306268518687
}
@@ -0,0 +1,97 @@
{
"action_bias": [
0.0,
-4.0,
4.0
],
"action_layout": [
"front",
"upper",
"lower"
],
"action_scale": 8.0,
"body_layout": [
"front",
"upper",
"lower"
],
"control_dt": 0.4,
"control_time_scale_steps": 2000,
"conv_len": 30,
"dtw_lag_channel": 1,
"dtw_version": "legacy_dtw_v1_abs_n_unclipped",
"fifo_init_action": [
0.0,
-4.0,
4.0
],
"fifo_len": 150,
"force_layout": [
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"has_disturbance": true,
"model_name": "d1a3o12_re400",
"mu": 0.005,
"n_objects_env": 7,
"nu": 0.001,
"obs_slice": [
2,
14
],
"pinball_front_x": 30.0,
"pinball_rear_x": 31.3,
"policy_init_action": [
0.0,
-4.0,
4.0
],
"raw_force_slice": [
6,
12
],
"raw_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy",
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"raw_sensor_slice": [
0,
6
],
"re_code": 400,
"re_d": 200.0,
"s_dim": 12,
"sample_interval": 800,
"scene_id": "karman",
"sensor_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy"
],
"sensor_x": 40.0,
"source": "PPO_inference",
"target_force_slice": null,
"target_sensor_slice": [
0,
6
],
"target_type": "periodic",
"u0": 0.01
}
@@ -0,0 +1,113 @@
{
"cfd_device": 2,
"command": "/home/frank14f/anaconda3/envs/pycuda_3_10/bin/python /home/frank14f/DynamisLab/src/SR_analysis/stage_1_infer.py --group karman_trained --run-id round1-legacy-v2-20260716 --norm-source existing --model-device cpu --device 2 --steps 200",
"config": {
"action_bias": [
0.0,
-4.0,
4.0
],
"action_layout": [
"front",
"upper",
"lower"
],
"action_scale": 8.0,
"body_layout": [
"front",
"upper",
"lower"
],
"control_dt": 0.4,
"control_time_scale_steps": 2000,
"conv_len": 30,
"dtw_lag_channel": 1,
"dtw_version": "legacy_dtw_v1_abs_n_unclipped",
"fifo_init_action": [
0.0,
-4.0,
4.0
],
"fifo_len": 150,
"force_layout": [
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"has_disturbance": true,
"model_name": "d1a3o12_re400",
"mu": 0.005,
"n_objects_env": 7,
"nu": 0.001,
"obs_slice": [
2,
14
],
"pinball_front_x": 30.0,
"pinball_rear_x": 31.3,
"policy_init_action": [
0.0,
-4.0,
4.0
],
"raw_force_slice": [
6,
12
],
"raw_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy",
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"raw_sensor_slice": [
0,
6
],
"re_code": 400,
"re_d": 200.0,
"s_dim": 12,
"sample_interval": 800,
"scene_id": "karman",
"sensor_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy"
],
"sensor_x": 40.0,
"source": "PPO_inference",
"target_force_slice": null,
"target_sensor_slice": [
0,
6
],
"target_type": "periodic",
"u0": 0.01
},
"created_utc": "2026-07-16T16:02:22.388480+00:00",
"git_sha": "ca8ee5f238ee58eaaf48027ad026c35784f76d4d",
"metric_id": "legacy_similarity_v1",
"model_device": "cpu",
"model_path": "/home/frank14f/DynamisLab/models/old/d1a3o12_re400.zip",
"model_sha256": "e251240ed1179290345f0331f7e014abb74429ec517039fe5836f5f070352617",
"norm_source": "existing",
"output_dir": "/home/frank14f/DynamisLab/src/SR_analysis/data/runs/round1-legacy-v2-20260716/karman/karman_re400",
"run_id": "round1-legacy-v2-20260716",
"scene": "karman_re400",
"scene_id": "karman",
"schema_version": "sr-stage1-manifest-v2"
}
@@ -0,0 +1,24 @@
{
"action_bias": [
0.0,
-4.0,
4.0
],
"force_norm_fact": 0.030264523811638355,
"sens_deviation": [
0.8747888207435608,
-0.024021463468670845,
0.5912007689476013,
0.017280835658311844,
0.9475194215774536,
0.07682034373283386
],
"sens_norm_fact": [
5.08115291595459,
5.131664276123047,
3.3446834087371826,
5.320921897888184,
4.4046711921691895,
5.202882766723633
]
}
@@ -0,0 +1,112 @@
{
"avg_reward_last100": 0.03748913974167962,
"command": "/home/frank14f/anaconda3/envs/pycuda_3_10/bin/python /home/frank14f/DynamisLab/src/SR_analysis/stage_1_infer.py --group karman_trained --run-id round1-legacy-v2-20260716 --norm-source existing --model-device cpu --device 2 --steps 200",
"config": {
"action_bias": [
0.0,
-4.0,
4.0
],
"action_layout": [
"front",
"upper",
"lower"
],
"action_scale": 8.0,
"body_layout": [
"front",
"upper",
"lower"
],
"control_dt": 0.4,
"control_time_scale_steps": 2000,
"conv_len": 30,
"dtw_lag_channel": 1,
"dtw_version": "legacy_dtw_v1_abs_n_unclipped",
"fifo_init_action": [
0.0,
-4.0,
4.0
],
"fifo_len": 150,
"force_layout": [
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"has_disturbance": true,
"model_name": "d1a3o12_re400",
"mu": 0.005,
"n_objects_env": 7,
"nu": 0.001,
"obs_slice": [
2,
14
],
"pinball_front_x": 30.0,
"pinball_rear_x": 31.3,
"policy_init_action": [
0.0,
-4.0,
4.0
],
"raw_force_slice": [
6,
12
],
"raw_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy",
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"raw_sensor_slice": [
0,
6
],
"re_code": 400,
"re_d": 200.0,
"s_dim": 12,
"sample_interval": 800,
"scene_id": "karman",
"sensor_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy"
],
"sensor_x": 40.0,
"source": "PPO_inference",
"target_force_slice": null,
"target_sensor_slice": [
0,
6
],
"target_type": "periodic",
"u0": 0.01
},
"controlled": true,
"git_sha": "ca8ee5f238ee58eaaf48027ad026c35784f76d4d",
"metric_id": "legacy_similarity_v1",
"model_path": "/home/frank14f/DynamisLab/models/old/d1a3o12_re400.zip",
"model_sha256": "e251240ed1179290345f0331f7e014abb74429ec517039fe5836f5f070352617",
"norm_source": "existing",
"norm_source_path": "/home/frank14f/DynamisLab/src/SR_analysis/data/karman/karman_re400/norm.json",
"run_id": "round1-legacy-v2-20260716",
"scene": "karman_re400",
"schema_version": "sr-stage1-result-v2",
"similarity": 0.7817098527577602
}
@@ -0,0 +1,97 @@
{
"action_bias": [
0.0,
-4.0,
4.0
],
"action_layout": [
"front",
"upper",
"lower"
],
"action_scale": 8.0,
"body_layout": [
"front",
"upper",
"lower"
],
"control_dt": 0.4,
"control_time_scale_steps": 2000,
"conv_len": 30,
"dtw_lag_channel": 1,
"dtw_version": "legacy_dtw_v1_abs_n_unclipped",
"fifo_init_action": [
0.0,
-4.0,
4.0
],
"fifo_len": 150,
"force_layout": [
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"has_disturbance": true,
"model_name": "d1a3o12_re50",
"mu": 0.04,
"n_objects_env": 7,
"nu": 0.008,
"obs_slice": [
2,
14
],
"pinball_front_x": 30.0,
"pinball_rear_x": 31.3,
"policy_init_action": [
0.0,
-4.0,
4.0
],
"raw_force_slice": [
6,
12
],
"raw_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy",
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"raw_sensor_slice": [
0,
6
],
"re_code": 50,
"re_d": 25.0,
"s_dim": 12,
"sample_interval": 800,
"scene_id": "karman",
"sensor_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy"
],
"sensor_x": 40.0,
"source": "PPO_inference",
"target_force_slice": null,
"target_sensor_slice": [
0,
6
],
"target_type": "periodic",
"u0": 0.01
}
@@ -0,0 +1,113 @@
{
"cfd_device": 2,
"command": "/home/frank14f/anaconda3/envs/pycuda_3_10/bin/python /home/frank14f/DynamisLab/src/SR_analysis/stage_1_infer.py --group karman_trained --run-id round1-legacy-v2-20260716 --norm-source existing --model-device cpu --device 2 --steps 200",
"config": {
"action_bias": [
0.0,
-4.0,
4.0
],
"action_layout": [
"front",
"upper",
"lower"
],
"action_scale": 8.0,
"body_layout": [
"front",
"upper",
"lower"
],
"control_dt": 0.4,
"control_time_scale_steps": 2000,
"conv_len": 30,
"dtw_lag_channel": 1,
"dtw_version": "legacy_dtw_v1_abs_n_unclipped",
"fifo_init_action": [
0.0,
-4.0,
4.0
],
"fifo_len": 150,
"force_layout": [
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"has_disturbance": true,
"model_name": "d1a3o12_re50",
"mu": 0.04,
"n_objects_env": 7,
"nu": 0.008,
"obs_slice": [
2,
14
],
"pinball_front_x": 30.0,
"pinball_rear_x": 31.3,
"policy_init_action": [
0.0,
-4.0,
4.0
],
"raw_force_slice": [
6,
12
],
"raw_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy",
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"raw_sensor_slice": [
0,
6
],
"re_code": 50,
"re_d": 25.0,
"s_dim": 12,
"sample_interval": 800,
"scene_id": "karman",
"sensor_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy"
],
"sensor_x": 40.0,
"source": "PPO_inference",
"target_force_slice": null,
"target_sensor_slice": [
0,
6
],
"target_type": "periodic",
"u0": 0.01
},
"created_utc": "2026-07-16T15:52:57.057404+00:00",
"git_sha": "ca8ee5f238ee58eaaf48027ad026c35784f76d4d",
"metric_id": "legacy_similarity_v1",
"model_device": "cpu",
"model_path": "/home/frank14f/DynamisLab/models/old/d1a3o12_re50.zip",
"model_sha256": "dfd2163b0bf89115303015b010aa5ad5fe95b8f4bd81176a356714a1984445f4",
"norm_source": "existing",
"output_dir": "/home/frank14f/DynamisLab/src/SR_analysis/data/runs/round1-legacy-v2-20260716/karman/karman_re50",
"run_id": "round1-legacy-v2-20260716",
"scene": "karman_re50",
"scene_id": "karman",
"schema_version": "sr-stage1-manifest-v2"
}
@@ -0,0 +1,24 @@
{
"action_bias": [
0.0,
-4.0,
4.0
],
"force_norm_fact": 0.015911692287772894,
"sens_deviation": [
0.6078279614448547,
-0.04162348061800003,
0.07135022431612015,
-0.0008823801181279123,
0.6027681827545166,
0.0418982058763504
],
"sens_norm_fact": [
0.789494514465332,
1.1795930862426758,
0.18662318587303162,
1.1806247234344482,
0.8472481369972229,
1.2091511487960815
]
}
@@ -0,0 +1,112 @@
{
"avg_reward_last100": 0.19767691502014098,
"command": "/home/frank14f/anaconda3/envs/pycuda_3_10/bin/python /home/frank14f/DynamisLab/src/SR_analysis/stage_1_infer.py --group karman_trained --run-id round1-legacy-v2-20260716 --norm-source existing --model-device cpu --device 2 --steps 200",
"config": {
"action_bias": [
0.0,
-4.0,
4.0
],
"action_layout": [
"front",
"upper",
"lower"
],
"action_scale": 8.0,
"body_layout": [
"front",
"upper",
"lower"
],
"control_dt": 0.4,
"control_time_scale_steps": 2000,
"conv_len": 30,
"dtw_lag_channel": 1,
"dtw_version": "legacy_dtw_v1_abs_n_unclipped",
"fifo_init_action": [
0.0,
-4.0,
4.0
],
"fifo_len": 150,
"force_layout": [
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"has_disturbance": true,
"model_name": "d1a3o12_re50",
"mu": 0.04,
"n_objects_env": 7,
"nu": 0.008,
"obs_slice": [
2,
14
],
"pinball_front_x": 30.0,
"pinball_rear_x": 31.3,
"policy_init_action": [
0.0,
-4.0,
4.0
],
"raw_force_slice": [
6,
12
],
"raw_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy",
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"raw_sensor_slice": [
0,
6
],
"re_code": 50,
"re_d": 25.0,
"s_dim": 12,
"sample_interval": 800,
"scene_id": "karman",
"sensor_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy"
],
"sensor_x": 40.0,
"source": "PPO_inference",
"target_force_slice": null,
"target_sensor_slice": [
0,
6
],
"target_type": "periodic",
"u0": 0.01
},
"controlled": true,
"git_sha": "ca8ee5f238ee58eaaf48027ad026c35784f76d4d",
"metric_id": "legacy_similarity_v1",
"model_path": "/home/frank14f/DynamisLab/models/old/d1a3o12_re50.zip",
"model_sha256": "dfd2163b0bf89115303015b010aa5ad5fe95b8f4bd81176a356714a1984445f4",
"norm_source": "existing",
"norm_source_path": "/home/frank14f/DynamisLab/src/SR_analysis/data/karman/karman_re50/norm.json",
"run_id": "round1-legacy-v2-20260716",
"scene": "karman_re50",
"schema_version": "sr-stage1-result-v2",
"similarity": 0.953781367331976
}
@@ -0,0 +1,109 @@
{
"action_bias": [
0.0,
-2.0,
2.0
],
"action_layout": [
"front",
"upper",
"lower"
],
"action_scale": 8.0,
"body_layout": [
"front",
"upper",
"lower"
],
"control_dt": 0.3,
"control_time_scale_steps": 2000,
"conv_len": 36,
"dtw_lag_channel": 1,
"dtw_version": "legacy_dtw_v1_abs_n_unclipped",
"fifo_init_action": [
0.0,
-1.0,
1.0
],
"fifo_len": 150,
"force_layout": [
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"has_disturbance": false,
"model_name": "d1a3o14_250525_imit_1L_2U_600S",
"mu": 0.02,
"n_objects_env": 6,
"nu": 0.004,
"obs_slice": [
0,
12
],
"pinball_front_x": 19.0,
"pinball_rear_x": 20.3,
"policy_init_action": [
0.0,
-1.0,
1.0
],
"raw_force_slice": [
6,
12
],
"raw_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy",
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"raw_sensor_slice": [
0,
6
],
"re_code": 100,
"re_d": 50.0,
"s_dim": 14,
"sample_interval": 600,
"scene_id": "illusion",
"sensor_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy"
],
"sensor_x": 30.0,
"source": "PPO_inference",
"target_center": [
20.0,
12.775,
0.0
],
"target_center_x": 20.0,
"target_diameter": 1.0,
"target_force_slice": [
0,
2
],
"target_radius": 1.0,
"target_radius_lattice": 20.0,
"target_sensor_slice": [
2,
8
],
"target_type": "periodic",
"u0": 0.01
}
@@ -0,0 +1,125 @@
{
"cfd_device": 2,
"command": "/home/frank14f/anaconda3/envs/pycuda_3_10/bin/python /home/frank14f/DynamisLab/src/SR_analysis/stage_1_infer.py --scene illusion_1L --run-id trusted-baseline-illusion-1L-20260717 --device 2 --model-device cpu --steps 200 --norm-source existing",
"config": {
"action_bias": [
0.0,
-2.0,
2.0
],
"action_layout": [
"front",
"upper",
"lower"
],
"action_scale": 8.0,
"body_layout": [
"front",
"upper",
"lower"
],
"control_dt": 0.3,
"control_time_scale_steps": 2000,
"conv_len": 36,
"dtw_lag_channel": 1,
"dtw_version": "legacy_dtw_v1_abs_n_unclipped",
"fifo_init_action": [
0.0,
-1.0,
1.0
],
"fifo_len": 150,
"force_layout": [
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"has_disturbance": false,
"model_name": "d1a3o14_250525_imit_1L_2U_600S",
"mu": 0.02,
"n_objects_env": 6,
"nu": 0.004,
"obs_slice": [
0,
12
],
"pinball_front_x": 19.0,
"pinball_rear_x": 20.3,
"policy_init_action": [
0.0,
-1.0,
1.0
],
"raw_force_slice": [
6,
12
],
"raw_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy",
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"raw_sensor_slice": [
0,
6
],
"re_code": 100,
"re_d": 50.0,
"s_dim": 14,
"sample_interval": 600,
"scene_id": "illusion",
"sensor_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy"
],
"sensor_x": 30.0,
"source": "PPO_inference",
"target_center": [
20.0,
12.775,
0.0
],
"target_center_x": 20.0,
"target_diameter": 1.0,
"target_force_slice": [
0,
2
],
"target_radius": 1.0,
"target_radius_lattice": 20.0,
"target_sensor_slice": [
2,
8
],
"target_type": "periodic",
"u0": 0.01
},
"created_utc": "2026-07-17T14:30:20.061623+00:00",
"git_sha": "ca8ee5f238ee58eaaf48027ad026c35784f76d4d",
"metric_id": "legacy_similarity_v1",
"model_device": "cpu",
"model_path": "/home/frank14f/DynamisLab/models/250525/d1a3o14_250525_imit_1L_2U_600S.zip",
"model_sha256": "570fbdb08fba1170cbab53de9ede372a9536e0bb8419dda0f0f2db20fd20583d",
"norm_source": "existing",
"output_dir": "/home/frank14f/DynamisLab/src/SR_analysis/data/runs/trusted-baseline-illusion-1L-20260717/illusion/illusion_1L",
"run_id": "trusted-baseline-illusion-1L-20260717",
"scene": "illusion_1L",
"scene_id": "illusion",
"schema_version": "sr-stage1-manifest-v2"
}
@@ -0,0 +1,24 @@
{
"action_bias": [
0.0,
-2.0,
2.0
],
"force_norm_fact": 0.01349810091778636,
"sens_deviation": [
0.9381087422370911,
-0.12299147248268127,
0.648796796798706,
-0.022100985050201416,
0.9596271514892578,
0.11032649874687195
],
"sens_norm_fact": [
2.1753337383270264,
2.5954699516296387,
0.707850456237793,
3.554702043533325,
2.0688724517822266,
2.5344114303588867
]
}
@@ -0,0 +1,124 @@
{
"command": "/home/frank14f/anaconda3/envs/pycuda_3_10/bin/python /home/frank14f/DynamisLab/src/SR_analysis/stage_1_infer.py --scene illusion_1L --run-id trusted-baseline-illusion-1L-20260717 --device 2 --model-device cpu --steps 200 --norm-source existing",
"config": {
"action_bias": [
0.0,
-2.0,
2.0
],
"action_layout": [
"front",
"upper",
"lower"
],
"action_scale": 8.0,
"body_layout": [
"front",
"upper",
"lower"
],
"control_dt": 0.3,
"control_time_scale_steps": 2000,
"conv_len": 36,
"dtw_lag_channel": 1,
"dtw_version": "legacy_dtw_v1_abs_n_unclipped",
"fifo_init_action": [
0.0,
-1.0,
1.0
],
"fifo_len": 150,
"force_layout": [
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"has_disturbance": false,
"model_name": "d1a3o14_250525_imit_1L_2U_600S",
"mu": 0.02,
"n_objects_env": 6,
"nu": 0.004,
"obs_slice": [
0,
12
],
"pinball_front_x": 19.0,
"pinball_rear_x": 20.3,
"policy_init_action": [
0.0,
-1.0,
1.0
],
"raw_force_slice": [
6,
12
],
"raw_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy",
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"raw_sensor_slice": [
0,
6
],
"re_code": 100,
"re_d": 50.0,
"s_dim": 14,
"sample_interval": 600,
"scene_id": "illusion",
"sensor_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy"
],
"sensor_x": 30.0,
"source": "PPO_inference",
"target_center": [
20.0,
12.775,
0.0
],
"target_center_x": 20.0,
"target_diameter": 1.0,
"target_force_slice": [
0,
2
],
"target_radius": 1.0,
"target_radius_lattice": 20.0,
"target_sensor_slice": [
2,
8
],
"target_type": "periodic",
"u0": 0.01
},
"controlled": true,
"git_sha": "ca8ee5f238ee58eaaf48027ad026c35784f76d4d",
"metric_id": "legacy_similarity_v1",
"model_path": "/home/frank14f/DynamisLab/models/250525/d1a3o14_250525_imit_1L_2U_600S.zip",
"model_sha256": "570fbdb08fba1170cbab53de9ede372a9536e0bb8419dda0f0f2db20fd20583d",
"norm_source": "existing",
"norm_source_path": "/home/frank14f/DynamisLab/src/SR_analysis/data/illusion/illusion_1L/norm.json",
"run_id": "trusted-baseline-illusion-1L-20260717",
"scene": "illusion_1L",
"schema_version": "sr-stage1-result-v2",
"similarity": 0.9720213095199681,
"target_only": false
}
@@ -0,0 +1,207 @@
{
"channel_names": [
"target_cylinder_fx",
"target_cylinder_fy",
"sensor_top_ux",
"sensor_top_uy",
"sensor_center_ux",
"sensor_center_uy",
"sensor_bottom_ux",
"sensor_bottom_uy"
],
"harmonics": [
{
"amps": [
0.00010196774356419014,
3.032701814051478e-05,
1.3228762280839473e-05,
1.1673375144869918e-05,
1.0964842249249103e-05
],
"dc": 0.0056462297185013695,
"freqs": [
0.08,
0.13333333333333333,
0.26666666666666666,
0.2733333333333334,
0.07333333333333333
],
"phases": [
0.03921127148867175,
-0.20521784776001037,
1.117788657118904,
-1.6465117556376254,
0.02795306706095781
]
},
{
"amps": [
0.002108351623232651,
0.00010962462789660424,
0.00010476229400614519,
6.123869990851442e-05,
4.802141065079675e-05
],
"dc": 1.7033609062006387e-05,
"freqs": [
0.04,
0.03333333333333333,
0.04666666666666667,
0.02666666666666667,
0.05333333333333334
],
"phases": [
0.37869413350756936,
0.3173332115115616,
-2.7014492558727667,
0.2534779505164423,
-2.643156573058147
]
},
{
"amps": [
0.31570653803276794,
0.046163244835151995,
0.02162658867400612,
0.0172669656623398,
0.01476969869324928
],
"dc": 1.011843715508779,
"freqs": [
0.04,
0.12000000000000001,
0.08,
0.04666666666666667,
0.03333333333333333
],
"phases": [
-0.6947432521717131,
-2.3064024401768686,
-1.5240254680520227,
2.451591762128242,
-0.6745235757730336
]
},
{
"amps": [
0.45013711146880914,
0.10336157533147983,
0.06600727530922762,
0.03830901014633774,
0.024015733278508953
],
"dc": -0.03963665588370835,
"freqs": [
0.04,
0.08,
0.12000000000000001,
0.16,
0.04666666666666667
],
"phases": [
-2.525913116723188,
2.104892743012555,
1.8181122471584426,
0.24481879148524657,
0.7715937550294908
]
},
{
"amps": [
0.07926809296790842,
0.014154811211794916,
0.008844410543414708,
0.0073552671239413584,
0.004181543938695215
],
"dc": 0.9201145060857137,
"freqs": [
0.08,
0.16,
0.08666666666666667,
0.07333333333333333,
0.09333333333333334
],
"phases": [
0.895994021819374,
-0.695178280624656,
-2.159387993799781,
0.8108673559556853,
-2.06819012077892
]
},
{
"amps": [
0.7625183846891965,
0.1752750324845121,
0.039706341470235294,
0.03827810670972904,
0.03001636791934177
],
"dc": -0.0055768885601234315,
"freqs": [
0.04,
0.12000000000000001,
0.04666666666666667,
0.03333333333333333,
0.12666666666666668
],
"phases": [
-2.4520050717676893,
2.202338653276725,
0.8177172306739968,
-2.574816071319194,
-0.8402515143535457
]
},
{
"amps": [
0.31558575520571946,
0.0462242484755283,
0.02569259450931368,
0.017517897942108,
0.01466179958491772
],
"dc": 1.0089127842585246,
"freqs": [
0.04,
0.12000000000000001,
0.08,
0.04666666666666667,
0.03333333333333333
],
"phases": [
2.4486066229372128,
0.8621504700214153,
-1.3026311952152456,
-0.724446974046741,
2.4986185998985477
]
},
{
"amps": [
0.4508230973881,
0.0979933577610358,
0.07014096184533862,
0.036576312657725214,
0.022942349526841748
],
"dc": 0.0331866528155903,
"freqs": [
0.04,
0.08,
0.12000000000000001,
0.16,
0.04666666666666667
],
"phases": [
-2.5216190520635173,
-0.9665070933349191,
1.8736886903806256,
-2.8287826555595905,
0.6641213742709987
]
}
],
"schema_version": "sr-target-harmonics-v2"
}
@@ -0,0 +1,97 @@
{
"action_bias": [
0.0,
-4.0,
4.0
],
"action_layout": [
"front",
"upper",
"lower"
],
"action_scale": 8.0,
"body_layout": [
"front",
"upper",
"lower"
],
"control_dt": 0.4,
"control_time_scale_steps": 2000,
"conv_len": 30,
"dtw_lag_channel": 1,
"dtw_version": "legacy_dtw_v1_abs_n_unclipped",
"fifo_init_action": [
0.0,
-4.0,
4.0
],
"fifo_len": 150,
"force_layout": [
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"has_disturbance": true,
"model_name": "d1a3o12_re100",
"mu": 0.02,
"n_objects_env": 7,
"nu": 0.004,
"obs_slice": [
2,
14
],
"pinball_front_x": 30.0,
"pinball_rear_x": 31.3,
"policy_init_action": [
0.0,
-4.0,
4.0
],
"raw_force_slice": [
6,
12
],
"raw_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy",
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"raw_sensor_slice": [
0,
6
],
"re_code": 100,
"re_d": 50.0,
"s_dim": 12,
"sample_interval": 800,
"scene_id": "karman",
"sensor_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy"
],
"sensor_x": 40.0,
"source": "PPO_inference",
"target_force_slice": null,
"target_sensor_slice": [
0,
6
],
"target_type": "periodic",
"u0": 0.01
}
@@ -0,0 +1,113 @@
{
"cfd_device": 2,
"command": "/home/frank14f/anaconda3/envs/pycuda_3_10/bin/python /home/frank14f/DynamisLab/src/SR_analysis/stage_1_infer.py --scene karman_re100 --run-id trusted-baseline-karman-re100-20260717 --device 2 --model-device cpu --steps 200 --norm-source existing",
"config": {
"action_bias": [
0.0,
-4.0,
4.0
],
"action_layout": [
"front",
"upper",
"lower"
],
"action_scale": 8.0,
"body_layout": [
"front",
"upper",
"lower"
],
"control_dt": 0.4,
"control_time_scale_steps": 2000,
"conv_len": 30,
"dtw_lag_channel": 1,
"dtw_version": "legacy_dtw_v1_abs_n_unclipped",
"fifo_init_action": [
0.0,
-4.0,
4.0
],
"fifo_len": 150,
"force_layout": [
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"has_disturbance": true,
"model_name": "d1a3o12_re100",
"mu": 0.02,
"n_objects_env": 7,
"nu": 0.004,
"obs_slice": [
2,
14
],
"pinball_front_x": 30.0,
"pinball_rear_x": 31.3,
"policy_init_action": [
0.0,
-4.0,
4.0
],
"raw_force_slice": [
6,
12
],
"raw_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy",
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"raw_sensor_slice": [
0,
6
],
"re_code": 100,
"re_d": 50.0,
"s_dim": 12,
"sample_interval": 800,
"scene_id": "karman",
"sensor_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy"
],
"sensor_x": 40.0,
"source": "PPO_inference",
"target_force_slice": null,
"target_sensor_slice": [
0,
6
],
"target_type": "periodic",
"u0": 0.01
},
"created_utc": "2026-07-17T14:26:25.026331+00:00",
"git_sha": "ca8ee5f238ee58eaaf48027ad026c35784f76d4d",
"metric_id": "legacy_similarity_v1",
"model_device": "cpu",
"model_path": "/home/frank14f/DynamisLab/models/old/d1a3o12_re100.zip",
"model_sha256": "148240c1dcb8b11d8e5a0a9e991f6874c4e799c9744707bf0fb32a8efeb0468d",
"norm_source": "existing",
"output_dir": "/home/frank14f/DynamisLab/src/SR_analysis/data/runs/trusted-baseline-karman-re100-20260717/karman/karman_re100",
"run_id": "trusted-baseline-karman-re100-20260717",
"scene": "karman_re100",
"scene_id": "karman",
"schema_version": "sr-stage1-manifest-v2"
}
@@ -0,0 +1,24 @@
{
"action_bias": [
0.0,
-4.0,
4.0
],
"force_norm_fact": 0.019199129194021225,
"sens_deviation": [
0.8231719732284546,
-0.12661591172218323,
0.24832786619663239,
-0.01064519677311182,
0.7844515442848206,
0.1161285787820816
],
"sens_norm_fact": [
3.3014419078826904,
3.2062995433807373,
1.8544995784759521,
3.4928226470947266,
3.1099960803985596,
2.815072774887085
]
}
@@ -0,0 +1,112 @@
{
"avg_reward_last100": 0.18065288270204463,
"command": "/home/frank14f/anaconda3/envs/pycuda_3_10/bin/python /home/frank14f/DynamisLab/src/SR_analysis/stage_1_infer.py --scene karman_re100 --run-id trusted-baseline-karman-re100-20260717 --device 2 --model-device cpu --steps 200 --norm-source existing",
"config": {
"action_bias": [
0.0,
-4.0,
4.0
],
"action_layout": [
"front",
"upper",
"lower"
],
"action_scale": 8.0,
"body_layout": [
"front",
"upper",
"lower"
],
"control_dt": 0.4,
"control_time_scale_steps": 2000,
"conv_len": 30,
"dtw_lag_channel": 1,
"dtw_version": "legacy_dtw_v1_abs_n_unclipped",
"fifo_init_action": [
0.0,
-4.0,
4.0
],
"fifo_len": 150,
"force_layout": [
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"has_disturbance": true,
"model_name": "d1a3o12_re100",
"mu": 0.02,
"n_objects_env": 7,
"nu": 0.004,
"obs_slice": [
2,
14
],
"pinball_front_x": 30.0,
"pinball_rear_x": 31.3,
"policy_init_action": [
0.0,
-4.0,
4.0
],
"raw_force_slice": [
6,
12
],
"raw_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy",
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"raw_sensor_slice": [
0,
6
],
"re_code": 100,
"re_d": 50.0,
"s_dim": 12,
"sample_interval": 800,
"scene_id": "karman",
"sensor_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy"
],
"sensor_x": 40.0,
"source": "PPO_inference",
"target_force_slice": null,
"target_sensor_slice": [
0,
6
],
"target_type": "periodic",
"u0": 0.01
},
"controlled": true,
"git_sha": "ca8ee5f238ee58eaaf48027ad026c35784f76d4d",
"metric_id": "legacy_similarity_v1",
"model_path": "/home/frank14f/DynamisLab/models/old/d1a3o12_re100.zip",
"model_sha256": "148240c1dcb8b11d8e5a0a9e991f6874c4e799c9744707bf0fb32a8efeb0468d",
"norm_source": "existing",
"norm_source_path": "/home/frank14f/DynamisLab/src/SR_analysis/data/karman/karman_re100/norm.json",
"run_id": "trusted-baseline-karman-re100-20260717",
"scene": "karman_re100",
"schema_version": "sr-stage1-result-v2",
"similarity": 0.9533619948248897
}
@@ -0,0 +1,109 @@
{
"action_bias": [
0.0,
-2.0,
2.0
],
"action_layout": [
"front",
"upper",
"lower"
],
"action_scale": 8.0,
"body_layout": [
"front",
"upper",
"lower"
],
"control_dt": 0.3,
"control_time_scale_steps": 2000,
"conv_len": 36,
"dtw_lag_channel": 1,
"dtw_version": "legacy_dtw_v1_abs_n_unclipped",
"fifo_init_action": [
0.0,
-1.0,
1.0
],
"fifo_len": 150,
"force_layout": [
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"has_disturbance": false,
"model_name": "d1a3o14_250525_imit_1L_2U_600S",
"mu": 0.02,
"n_objects_env": 6,
"nu": 0.004,
"obs_slice": [
0,
12
],
"pinball_front_x": 19.0,
"pinball_rear_x": 20.3,
"policy_init_action": [
0.0,
-1.0,
1.0
],
"raw_force_slice": [
6,
12
],
"raw_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy",
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"raw_sensor_slice": [
0,
6
],
"re_code": 100,
"re_d": 50.0,
"s_dim": 14,
"sample_interval": 600,
"scene_id": "illusion",
"sensor_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy"
],
"sensor_x": 30.0,
"source": "PPO_inference",
"target_center": [
20.0,
12.775,
0.0
],
"target_center_x": 20.0,
"target_diameter": 1.0,
"target_force_slice": [
0,
2
],
"target_radius": 1.0,
"target_radius_lattice": 20.0,
"target_sensor_slice": [
2,
8
],
"target_type": "periodic",
"u0": 0.01
}
@@ -0,0 +1,125 @@
{
"cfd_device": 2,
"command": "/home/frank14f/anaconda3/envs/pycuda_3_10/bin/python /home/frank14f/DynamisLab/src/SR_analysis/stage_1_infer.py --scene illusion_1L --run-id trusted-parity-stage1-illusion-20260717 --device 2 --model-device cpu --steps 40 --norm-source existing",
"config": {
"action_bias": [
0.0,
-2.0,
2.0
],
"action_layout": [
"front",
"upper",
"lower"
],
"action_scale": 8.0,
"body_layout": [
"front",
"upper",
"lower"
],
"control_dt": 0.3,
"control_time_scale_steps": 2000,
"conv_len": 36,
"dtw_lag_channel": 1,
"dtw_version": "legacy_dtw_v1_abs_n_unclipped",
"fifo_init_action": [
0.0,
-1.0,
1.0
],
"fifo_len": 150,
"force_layout": [
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"has_disturbance": false,
"model_name": "d1a3o14_250525_imit_1L_2U_600S",
"mu": 0.02,
"n_objects_env": 6,
"nu": 0.004,
"obs_slice": [
0,
12
],
"pinball_front_x": 19.0,
"pinball_rear_x": 20.3,
"policy_init_action": [
0.0,
-1.0,
1.0
],
"raw_force_slice": [
6,
12
],
"raw_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy",
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"raw_sensor_slice": [
0,
6
],
"re_code": 100,
"re_d": 50.0,
"s_dim": 14,
"sample_interval": 600,
"scene_id": "illusion",
"sensor_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy"
],
"sensor_x": 30.0,
"source": "PPO_inference",
"target_center": [
20.0,
12.775,
0.0
],
"target_center_x": 20.0,
"target_diameter": 1.0,
"target_force_slice": [
0,
2
],
"target_radius": 1.0,
"target_radius_lattice": 20.0,
"target_sensor_slice": [
2,
8
],
"target_type": "periodic",
"u0": 0.01
},
"created_utc": "2026-07-17T14:13:57.682595+00:00",
"git_sha": "ca8ee5f238ee58eaaf48027ad026c35784f76d4d",
"metric_id": "legacy_similarity_v1",
"model_device": "cpu",
"model_path": "/home/frank14f/DynamisLab/models/250525/d1a3o14_250525_imit_1L_2U_600S.zip",
"model_sha256": "570fbdb08fba1170cbab53de9ede372a9536e0bb8419dda0f0f2db20fd20583d",
"norm_source": "existing",
"output_dir": "/home/frank14f/DynamisLab/src/SR_analysis/data/runs/trusted-parity-stage1-illusion-20260717/illusion/illusion_1L",
"run_id": "trusted-parity-stage1-illusion-20260717",
"scene": "illusion_1L",
"scene_id": "illusion",
"schema_version": "sr-stage1-manifest-v2"
}
@@ -0,0 +1,24 @@
{
"action_bias": [
0.0,
-2.0,
2.0
],
"force_norm_fact": 0.01349810091778636,
"sens_deviation": [
0.9381087422370911,
-0.12299147248268127,
0.648796796798706,
-0.022100985050201416,
0.9596271514892578,
0.11032649874687195
],
"sens_norm_fact": [
2.1753337383270264,
2.5954699516296387,
0.707850456237793,
3.554702043533325,
2.0688724517822266,
2.5344114303588867
]
}
@@ -0,0 +1,124 @@
{
"command": "/home/frank14f/anaconda3/envs/pycuda_3_10/bin/python /home/frank14f/DynamisLab/src/SR_analysis/stage_1_infer.py --scene illusion_1L --run-id trusted-parity-stage1-illusion-20260717 --device 2 --model-device cpu --steps 40 --norm-source existing",
"config": {
"action_bias": [
0.0,
-2.0,
2.0
],
"action_layout": [
"front",
"upper",
"lower"
],
"action_scale": 8.0,
"body_layout": [
"front",
"upper",
"lower"
],
"control_dt": 0.3,
"control_time_scale_steps": 2000,
"conv_len": 36,
"dtw_lag_channel": 1,
"dtw_version": "legacy_dtw_v1_abs_n_unclipped",
"fifo_init_action": [
0.0,
-1.0,
1.0
],
"fifo_len": 150,
"force_layout": [
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"has_disturbance": false,
"model_name": "d1a3o14_250525_imit_1L_2U_600S",
"mu": 0.02,
"n_objects_env": 6,
"nu": 0.004,
"obs_slice": [
0,
12
],
"pinball_front_x": 19.0,
"pinball_rear_x": 20.3,
"policy_init_action": [
0.0,
-1.0,
1.0
],
"raw_force_slice": [
6,
12
],
"raw_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy",
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"raw_sensor_slice": [
0,
6
],
"re_code": 100,
"re_d": 50.0,
"s_dim": 14,
"sample_interval": 600,
"scene_id": "illusion",
"sensor_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy"
],
"sensor_x": 30.0,
"source": "PPO_inference",
"target_center": [
20.0,
12.775,
0.0
],
"target_center_x": 20.0,
"target_diameter": 1.0,
"target_force_slice": [
0,
2
],
"target_radius": 1.0,
"target_radius_lattice": 20.0,
"target_sensor_slice": [
2,
8
],
"target_type": "periodic",
"u0": 0.01
},
"controlled": true,
"git_sha": "ca8ee5f238ee58eaaf48027ad026c35784f76d4d",
"metric_id": "legacy_similarity_v1",
"model_path": "/home/frank14f/DynamisLab/models/250525/d1a3o14_250525_imit_1L_2U_600S.zip",
"model_sha256": "570fbdb08fba1170cbab53de9ede372a9536e0bb8419dda0f0f2db20fd20583d",
"norm_source": "existing",
"norm_source_path": "/home/frank14f/DynamisLab/src/SR_analysis/data/illusion/illusion_1L/norm.json",
"run_id": "trusted-parity-stage1-illusion-20260717",
"scene": "illusion_1L",
"schema_version": "sr-stage1-result-v2",
"similarity": 0.9439514846437507,
"target_only": false
}
@@ -0,0 +1,207 @@
{
"channel_names": [
"target_cylinder_fx",
"target_cylinder_fy",
"sensor_top_ux",
"sensor_top_uy",
"sensor_center_ux",
"sensor_center_uy",
"sensor_bottom_ux",
"sensor_bottom_uy"
],
"harmonics": [
{
"amps": [
9.896524272324539e-05,
3.270217010752068e-05,
1.3227312277965475e-05,
1.2543848981281935e-05,
1.1587945089095987e-05
],
"dc": 0.005646179253235459,
"freqs": [
0.08,
0.13333333333333333,
0.26666666666666666,
0.08666666666666667,
0.2733333333333334
],
"phases": [
1.6521698259783169,
-0.2194277854570294,
1.0577465313978591,
-1.3370367889098733,
-1.6226727170998827
]
},
{
"amps": [
0.002096128010984951,
0.00011596305538626617,
9.643768836790472e-05,
5.838634255822089e-05,
4.6525265661515145e-05
],
"dc": -7.480152538240266e-06,
"freqs": [
0.04,
0.04666666666666667,
0.03333333333333333,
0.05333333333333334,
0.02666666666666667
],
"phases": [
-1.9489917996678838,
1.2632774854166908,
-2.035393858435223,
1.3244218313587275,
-2.1432460008395715
]
},
{
"amps": [
0.3176871363824446,
0.04616894933493302,
0.024168858643944226,
0.01680346091456866,
0.015422194312928307
],
"dc": 1.007818570137024,
"freqs": [
0.04,
0.12000000000000001,
0.08,
0.03333333333333333,
0.04666666666666667
],
"phases": [
-3.0224428062709814,
-2.9487512179549316,
0.2282638168672656,
-3.0310722454581676,
0.1252777551444909
]
},
{
"amps": [
0.4476750318510778,
0.10310320287245037,
0.06564826578823499,
0.037341700503247185,
0.026079817048927274
],
"dc": -0.036230880088793736,
"freqs": [
0.04,
0.08,
0.12000000000000001,
0.16,
0.04666666666666667
],
"phases": [
1.4386667184552577,
-2.4797874123184793,
1.1395690268136565,
-2.6389547409332357,
-1.7295856930453837
]
},
{
"amps": [
0.07932461031001699,
0.013153282488351407,
0.008790908001969843,
0.007511912073189613,
0.00410096312687044
],
"dc": 0.919138089021047,
"freqs": [
0.08,
0.16,
0.08666666666666667,
0.07333333333333333,
0.16666666666666669
],
"phases": [
2.539462585331961,
2.604864348660965,
-0.654460615742855,
2.589552669530259,
-0.5650832440467509
]
},
{
"amps": [
0.7597455574742427,
0.16954562722942987,
0.04161616263670536,
0.03513609233486273,
0.03471969830763307
],
"dc": 0.0015289543693264326,
"freqs": [
0.04,
0.12000000000000001,
0.04666666666666667,
0.12666666666666668,
0.03333333333333333
],
"phases": [
1.50705513402573,
1.5030892775788058,
-1.564639488745293,
-1.538221973154802,
1.4281983790782813
]
},
{
"amps": [
0.3193730467488092,
0.046643000483885505,
0.023902549697790296,
0.018351904772743278,
0.013724588911044297
],
"dc": 1.0139576609929402,
"freqs": [
0.04,
0.12000000000000001,
0.08,
0.03333333333333333,
0.04666666666666667
],
"phases": [
0.11830773170808705,
0.18705442139226408,
0.22195349082173735,
0.09392190234217508,
-2.9953365615890957
]
},
{
"amps": [
0.4500198774613176,
0.1021275817018489,
0.06508205088037668,
0.03709764322583649,
0.023727545093224195
],
"dc": 0.03883644153053562,
"freqs": [
0.04,
0.08,
0.12000000000000001,
0.16,
0.04666666666666667
],
"phases": [
1.4270222590490442,
0.5863701483399966,
1.1146787610401374,
0.3225195172689922,
-1.4937154896098552
]
}
],
"schema_version": "sr-target-harmonics-v2"
}
@@ -0,0 +1,97 @@
{
"action_bias": [
0.0,
-4.0,
4.0
],
"action_layout": [
"front",
"upper",
"lower"
],
"action_scale": 8.0,
"body_layout": [
"front",
"upper",
"lower"
],
"control_dt": 0.4,
"control_time_scale_steps": 2000,
"conv_len": 30,
"dtw_lag_channel": 1,
"dtw_version": "legacy_dtw_v1_abs_n_unclipped",
"fifo_init_action": [
0.0,
-4.0,
4.0
],
"fifo_len": 150,
"force_layout": [
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"has_disturbance": true,
"model_name": "d1a3o12_re100",
"mu": 0.02,
"n_objects_env": 7,
"nu": 0.004,
"obs_slice": [
2,
14
],
"pinball_front_x": 30.0,
"pinball_rear_x": 31.3,
"policy_init_action": [
0.0,
-4.0,
4.0
],
"raw_force_slice": [
6,
12
],
"raw_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy",
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"raw_sensor_slice": [
0,
6
],
"re_code": 100,
"re_d": 50.0,
"s_dim": 12,
"sample_interval": 800,
"scene_id": "karman",
"sensor_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy"
],
"sensor_x": 40.0,
"source": "PPO_inference",
"target_force_slice": null,
"target_sensor_slice": [
0,
6
],
"target_type": "periodic",
"u0": 0.01
}
@@ -0,0 +1,113 @@
{
"cfd_device": 2,
"command": "/home/frank14f/anaconda3/envs/pycuda_3_10/bin/python /home/frank14f/DynamisLab/src/SR_analysis/stage_1_infer.py --scene karman_re100 --run-id trusted-parity-stage1-karman-20260717 --device 2 --model-device cpu --steps 40 --norm-source existing",
"config": {
"action_bias": [
0.0,
-4.0,
4.0
],
"action_layout": [
"front",
"upper",
"lower"
],
"action_scale": 8.0,
"body_layout": [
"front",
"upper",
"lower"
],
"control_dt": 0.4,
"control_time_scale_steps": 2000,
"conv_len": 30,
"dtw_lag_channel": 1,
"dtw_version": "legacy_dtw_v1_abs_n_unclipped",
"fifo_init_action": [
0.0,
-4.0,
4.0
],
"fifo_len": 150,
"force_layout": [
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"has_disturbance": true,
"model_name": "d1a3o12_re100",
"mu": 0.02,
"n_objects_env": 7,
"nu": 0.004,
"obs_slice": [
2,
14
],
"pinball_front_x": 30.0,
"pinball_rear_x": 31.3,
"policy_init_action": [
0.0,
-4.0,
4.0
],
"raw_force_slice": [
6,
12
],
"raw_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy",
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"raw_sensor_slice": [
0,
6
],
"re_code": 100,
"re_d": 50.0,
"s_dim": 12,
"sample_interval": 800,
"scene_id": "karman",
"sensor_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy"
],
"sensor_x": 40.0,
"source": "PPO_inference",
"target_force_slice": null,
"target_sensor_slice": [
0,
6
],
"target_type": "periodic",
"u0": 0.01
},
"created_utc": "2026-07-17T14:03:52.744099+00:00",
"git_sha": "ca8ee5f238ee58eaaf48027ad026c35784f76d4d",
"metric_id": "legacy_similarity_v1",
"model_device": "cpu",
"model_path": "/home/frank14f/DynamisLab/models/old/d1a3o12_re100.zip",
"model_sha256": "148240c1dcb8b11d8e5a0a9e991f6874c4e799c9744707bf0fb32a8efeb0468d",
"norm_source": "existing",
"output_dir": "/home/frank14f/DynamisLab/src/SR_analysis/data/runs/trusted-parity-stage1-karman-20260717/karman/karman_re100",
"run_id": "trusted-parity-stage1-karman-20260717",
"scene": "karman_re100",
"scene_id": "karman",
"schema_version": "sr-stage1-manifest-v2"
}
@@ -0,0 +1,24 @@
{
"action_bias": [
0.0,
-4.0,
4.0
],
"force_norm_fact": 0.019199129194021225,
"sens_deviation": [
0.8231719732284546,
-0.12661591172218323,
0.24832786619663239,
-0.01064519677311182,
0.7844515442848206,
0.1161285787820816
],
"sens_norm_fact": [
3.3014419078826904,
3.2062995433807373,
1.8544995784759521,
3.4928226470947266,
3.1099960803985596,
2.815072774887085
]
}
@@ -0,0 +1,112 @@
{
"avg_reward_last100": 0.1122341498708183,
"command": "/home/frank14f/anaconda3/envs/pycuda_3_10/bin/python /home/frank14f/DynamisLab/src/SR_analysis/stage_1_infer.py --scene karman_re100 --run-id trusted-parity-stage1-karman-20260717 --device 2 --model-device cpu --steps 40 --norm-source existing",
"config": {
"action_bias": [
0.0,
-4.0,
4.0
],
"action_layout": [
"front",
"upper",
"lower"
],
"action_scale": 8.0,
"body_layout": [
"front",
"upper",
"lower"
],
"control_dt": 0.4,
"control_time_scale_steps": 2000,
"conv_len": 30,
"dtw_lag_channel": 1,
"dtw_version": "legacy_dtw_v1_abs_n_unclipped",
"fifo_init_action": [
0.0,
-4.0,
4.0
],
"fifo_len": 150,
"force_layout": [
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"has_disturbance": true,
"model_name": "d1a3o12_re100",
"mu": 0.02,
"n_objects_env": 7,
"nu": 0.004,
"obs_slice": [
2,
14
],
"pinball_front_x": 30.0,
"pinball_rear_x": 31.3,
"policy_init_action": [
0.0,
-4.0,
4.0
],
"raw_force_slice": [
6,
12
],
"raw_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy",
"front_fx",
"front_fy",
"upper_fx",
"upper_fy",
"lower_fx",
"lower_fy"
],
"raw_sensor_slice": [
0,
6
],
"re_code": 100,
"re_d": 50.0,
"s_dim": 12,
"sample_interval": 800,
"scene_id": "karman",
"sensor_layout": [
"upper_ux",
"upper_uy",
"center_ux",
"center_uy",
"lower_ux",
"lower_uy"
],
"sensor_x": 40.0,
"source": "PPO_inference",
"target_force_slice": null,
"target_sensor_slice": [
0,
6
],
"target_type": "periodic",
"u0": 0.01
},
"controlled": true,
"git_sha": "ca8ee5f238ee58eaaf48027ad026c35784f76d4d",
"metric_id": "legacy_similarity_v1",
"model_path": "/home/frank14f/DynamisLab/models/old/d1a3o12_re100.zip",
"model_sha256": "148240c1dcb8b11d8e5a0a9e991f6874c4e799c9744707bf0fb32a8efeb0468d",
"norm_source": "existing",
"norm_source_path": "/home/frank14f/DynamisLab/src/SR_analysis/data/karman/karman_re100/norm.json",
"run_id": "trusted-parity-stage1-karman-20260717",
"scene": "karman_re100",
"schema_version": "sr-stage1-result-v2",
"similarity": 0.9193018703204062
}
@@ -0,0 +1,23 @@
{
"case_name": "ill_075L_sc",
"scene_type": "illusion",
"seed": 43,
"SI": 400,
"conv_len": 36,
"action_scale": 12.0,
"action_bias": [
0.0,
0.0,
0.0
],
"u0": 0.01,
"l0": 20.0,
"s_dim": 14,
"obs_slice": [
0,
12
],
"n_objects": 6,
"dtw_sim_v5": 0.807,
"target_diam": 0.75
}
@@ -0,0 +1,24 @@
{
"force_norm_fact": 0.0027,
"sens_deviation": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
],
"sens_norm_fact": [
0.93,
0.93,
0.93,
0.93,
0.93,
0.93
],
"action_bias": [
0.0,
0.0,
0.0
]
}
@@ -0,0 +1,194 @@
[
{
"dc": 0.6880434715747833,
"amps": [
0.20458854492288428,
0.029587454617069717,
0.023086505618233506,
0.015887573451687485,
0.015224800527538423
],
"freqs": [
0.04666666666666667,
0.09333333333333334,
0.14,
0.04,
0.05333333333333334
],
"phases": [
0.8052693464963836,
0.8585544263338698,
1.5640671931988963,
0.6910392906444525,
-2.216224115427546
]
},
{
"dc": -0.03409056488269319,
"amps": [
0.28250401992411595,
0.0839014032107188,
0.023194630910947703,
0.0224081212732497,
0.019443415576586083
],
"freqs": [
0.04666666666666667,
0.09333333333333334,
0.05333333333333334,
0.14,
0.04
],
"phases": [
-1.1822505843673459,
-1.6295483036248934,
2.0225321750676226,
-1.3294886137563726,
-1.2266528328867428
]
},
{
"dc": 0.5679984021186829,
"amps": [
0.0709233637307587,
0.012005284914812347,
0.009957602905498198,
0.007673219000155801,
0.005642999478245448
],
"freqs": [
0.09333333333333334,
0.1,
0.08666666666666667,
0.18666666666666668,
0.08
],
"phases": [
-2.9098548394911363,
0.2444772386755709,
-2.923760907258934,
-2.3476370568341025,
-2.9384376175358975
]
},
{
"dc": 0.002600441810985406,
"amps": [
0.4577146477003557,
0.07132710651328872,
0.03879305754033502,
0.031533998376329836,
0.023207703607031185
],
"freqs": [
0.04666666666666667,
0.14,
0.05333333333333334,
0.04,
0.14666666666666667
],
"phases": [
-1.0453955275913698,
0.023733604405332853,
2.027674250857449,
-0.9668436080107814,
2.9974194919092074
]
},
{
"dc": 0.6843333508570989,
"amps": [
0.2027868050587619,
0.03224986194391876,
0.023683399224590198,
0.017188052917190243,
0.014195586293361808
],
"freqs": [
0.04666666666666667,
0.09333333333333334,
0.14,
0.05333333333333334,
0.04
],
"phases": [
-2.332747687836994,
0.901723727828658,
-1.5698392646942605,
0.8720854157784957,
-2.4095136755460116
]
},
{
"dc": 0.03538458936226865,
"amps": [
0.28056052556752703,
0.08980764376406389,
0.025910222962895864,
0.025769124827608153,
0.018025383425213076
],
"freqs": [
0.04666666666666667,
0.09333333333333334,
0.14,
0.05333333333333334,
0.04
],
"phases": [
-1.1738666976140295,
1.5542442005746904,
-1.3251908712196567,
1.914224046821627,
-1.1116570339811487
]
},
{
"dc": 0.002806983096525073,
"amps": [
1.863819876324592e-05,
3.4708330705432185e-06,
2.39060217225783e-06,
1.6423800325272625e-06,
1.214928267259123e-06
],
"freqs": [
0.09333333333333334,
0.1,
0.08666666666666667,
0.10666666666666667,
0.08
],
"phases": [
1.6786485599243235,
-1.430910501668555,
1.6430924473318198,
-1.4004219000745928,
1.6107600770410602
]
},
{
"dc": 3.3828392588475254e-06,
"amps": [
0.0006693090637555961,
5.748734281187716e-05,
4.546729268385329e-05,
2.861502365890377e-05,
2.252313774853955e-05
],
"freqs": [
0.04666666666666667,
0.05333333333333334,
0.04,
0.060000000000000005,
0.03333333333333333
],
"phases": [
1.2285674314114634,
-1.837985680644138,
1.1401638162714627,
-1.7728251272357027,
1.033861654550007
]
}
]
@@ -0,0 +1,23 @@
{
"case_name": "ill_15L_sc",
"scene_type": "illusion",
"seed": 43,
"SI": 800,
"conv_len": 36,
"action_scale": 12.0,
"action_bias": [
0.0,
0.0,
0.0
],
"u0": 0.01,
"l0": 20.0,
"s_dim": 14,
"obs_slice": [
0,
12
],
"n_objects": 6,
"dtw_sim_v5": 0.906,
"target_diam": 1.5
}

Some files were not shown because too many files have changed in this diff Show More