Auto-sync from Server A at 2026-06-01 11:26:06

This commit is contained in:
vvvvonly 2026-06-01 11:26:08 +08:00
parent 377b645008
commit 2c09f91cfa
84 changed files with 3445 additions and 171 deletions

138
README.md
View File

@ -44,8 +44,8 @@ afem/
- **入射波**: 沿 -x 方向的平面波 `u_inc = exp(i·k·x)`
- **散射体**: 圆形介质柱ε_r 随机采样),位置和半径可配
- **边界条件**: SBC (Sommerfeld) `∂u/∂n = i·k·u`
- **域**: 可配矩形域,初始网格密度自适应 + domain area 线性缩放:`N_init = N_base × (k/k_ref)^k_exponent × domain_area`。k_ref 和 k_exponent 均可通过 helmholtz config 配置(默认 k_exponent=1.5, k_ref=6.0),保证不同域尺寸下每单位面积单元数一致
- 可配 exponent^2 = P1 Helmholtz 理论最优 (污染误差 ∝ k²)^1.5 = 工程折中。建议 N_base 配合 exponent 调整,使 N_init 约为 COMSOL 目标 (λ/10√ε_r) 的 30-50%,为 RL agent 留出充分细化空间
- **域**: 可配矩形域,初始网格密度自适应 + domain area 线性缩放:`N_init = N_base × (k/k_ref)^k_exponent × domain_area`。k_ref 和 k_exponent 均可通过 helmholtz config 配置(默认 k_exponent=2.0, k_ref=6.0),保证不同域尺寸下每单位面积单元数一致
- 可配 exponent^2 = P1 Helmholtz 理论最优 (污染误差 ∝ k²)。建议 N_base 配合 exponent 调整,使 N_init 约为 COMSOL 目标 (λ/10√ε_r) 的 30-50%,为 RL agent 留出充分细化空间
- **介质区前渐近区边缘约束**: 介质内 λ_d = 2π/(k√ε_r) 更短,强制迭代细化至 h ≤ λ_d/N默认 N=1.5helmholtz.pre_asymptotic_N 可配)。约 1.5 点/波长,刚好跨过渐近区门槛,赋予初始网格基本相位解析能力但不过度消耗物理预算,为 RL agent 留出充分的选择性细化空间
- **后验误差**: 残差型 indicatorAinsworth & Oden 风格),含单元内部残差 + 梯度跳变 + SBC 边界残差
@ -54,7 +54,7 @@ afem/
| 概念 | 对应实体 |
|------|---------|
| **智能体** | 每个三角形网格单元 |
| **状态** | GNN 节点特征(几何 + PDE 残差 + 复数场分解 + 物理参数,节点 12 维 + 边 1 维) |
| **状态** | GNN 节点特征(几何 + PDE 残差 + 振幅 + 相位方向 + 物理参数,节点 13 维 + 边 1 维) |
| **动作** | 1 维连续标量 x_i → score = -x_i 排序,在物理预算内 top-k 选细化单元x 越小优先级越高) |
| **奖励** | 局部子单元 η 的 log-ratio 改善spatial: sum 聚合 / spatial_max: max 聚合)+ α 衰减全局 η log-ratio shaping |
| **终止** | 达到最大步数或超过最大单元数 |
@ -68,10 +68,12 @@ afem/
```
图观测 → MessagePassingBase → MLP → 动作分布 / value 标量
├─ nn.Linear嵌入
├─ MessagePassingStack2 层消息传递inner 残差 + LayerNorm
│ └─ MessagePassingStep × N
│ ├─ EdgeModule: MLP([src | dst | edge_attr])
│ └─ NodeModule: MLP([node | scatter(入边)])
├─ MessagePassingStack2 层消息传递 + GVN 全局广播inner 残差 + LayerNorm
│ ├─ MessagePassingStep × N
│ │ ├─ EdgeModule: MLP([src | dst | edge_attr])
│ │ └─ NodeModule: MLP([node | scatter(入边)])
│ └─ GlobalVirtualNode (GVN): η_K 加权注意力池化 → 注意力门控广播
│ h_V = Σ(η_v/Ση)·h_vα_v = σ(W_att[h_v || h_V])h_v ← h_v + α_v ⊙ W_V·h_V
└─ 输出: 节点隐向量
```
@ -101,31 +103,32 @@ afem/
## 输入特征
### 节点特征12 维)
### 节点特征13 维)
| 维度 | 来源 | 名称 | 说明 |
|------|------|------|------|
| 1 | cfg | `volume` | 无量纲单元面积volume / λ² |
| 3 | cfg | `internal_residual` / `gradient_jump` / `sbc_residual` | PDE 残差三分量(无量纲化,经 log₁₀ 压缩):<br>`(h_K/k_local)·√V·|r|` / `√(½Σ h_e·\|jump\|²/k_local)` / `(h_bnd/k_local)·\|SBC\|` |
| 3 | cfg | `internal_residual` / `gradient_jump` / `sbc_residual` | PDE 残差三分量(真空波数 k 归一化,经 log₁₀ 压缩):<br>`(h_K/k)·√V·|r|` / `√(½Σ h_e·\|jump\|²/k)` / `(h_bnd/k)·\|SBC\|` |
| 1 | cfg | `element_penalty` | 单元惩罚系数 λ |
| 1 | cfg | `timestep` | 当前 rollout 步数 |
| 1 | cfg | `wave_number` | Helmholtz 波数 k |
| 1 | cfg | `k_local_sqrt_vol` | k × √体积(局域波数 × 特征长度) |
| 1 | cfg | `k_local_sqrt_vol` | k × √(ε_r) × √(V)(局域波数 × 特征长度) |
| 1 | cfg | `is_sbc_boundary` | 是否与 SBC 吸收边界相邻 (0/1) |
| 1 | cfg | `dist_to_interface` | 到介质圆柱边界的带符号距离,无量纲化后经 sign·ln(1+|d|) 压缩:`sign(d)·ln(1+|(dist-radius)/λ|)` — 近场近似线性保留分辨力,远场对数压缩避免 OOD与残差 log₁₀ 风格一致 |
| 1 | fix | `epsilon_r` | 单元中点相对介电常数(圆柱内 = εᵣ,外 = 1.0 |
| 1 | fix | `total_solution_magnitude` | 散射场复数解的振幅 |
| 1 | fix | `total_solution_magnitude` | 散射场振幅 \|u_scat\|per-element 均值) |
| 1 | fix | `cos_phase` | Re(u) / (\|u\| + 1e-8),相位方向余弦,∈ [1, 1],无分支切割 |
| 1 | fix | `sin_phase` | Im(u) / (\|u\| + 1e-8),相位方向正弦,与 cos 联合编码相位 |
> - **cfg**: 由 `element_features` 配置控制
> - **fix**: 始终启用Helmholtz 复数场分解,硬编码)
> - **fix**: 始终启用Helmholtz 振幅 + 相位方向,硬编码)
>
> GNN 输入用 `_compute_residual_components`k_local 无量纲log₁₀ 压缩。Reward 用逐单元 η_K`_eta_indicator`),与 GNN 特征公式一致但不经 log 压缩。
> GNN 输入用 `_compute_residual_components`真空波数 k 归一log₁₀ 压缩。Reward 用逐单元 η_K`_eta_indicator`),与 GNN 特征公式一致但不经 log 压缩。SBC 边界条件保留 `k_local`
### 边特征1 维)
| 维度 | 名称 | 说明 |
|------|------|------|
| 1 | `euclidean_distance` | 相邻单元中点欧几里得距离 / λ(无量纲边特征) |
| 1 | `phase_distance` | 相邻单元中点相位距离 = d × √(k_local_src·k_local_dst) / 2π — 介质内短波长自然放大,赋予 GNN k 不变性 |
---
@ -144,7 +147,7 @@ main.py --mode train/test/viz
└─ [train] → ppo.PPOTrainer.fit_iteration() 循环
├─ collect_rollouts() # 256 步 rollout
│ └─ buffer.compute_returns_and_advantage()
│ └─ 单路 GAE # 逐 agent 时序差分scatter_add 处理网格细化),奖励含势函数塑形项
│ └─ 单路 GAE # 逐 agent 时序差分scatter_add 处理网格细化)
│ └─ Return / value 归一化
└─ train_step() # 多 epoch PPO 更新
├─ policy_loss() # Clipped PPO
@ -186,7 +189,7 @@ it | loss ev agents reward x<0 elig sel time
|------|------|---------|
| `x<0` | `mean(x_i < 0)`,负值动作比例(纯诊断) | 越负的单元优先级越高 |
| `elig` | 通过双过滤器的候选占比 | 排除数值退化 + 低误差的单元 |
| `mask` | 被 Dörfler-P95 掩码 (η<0.05·η_P95) 滤掉的占比 | 因场景而异非固定比例 |
| `mask` | 被 Reverse Dörfler 剔除的噪声尾部占比(累积能量 <1% 总误差的底部单元 | 因场景而异非固定比例 |
| `sel` | 实际选中的细化单元数 | 每步最多 N_current // 4 |
| `n_budget` | 全局物理预算(每 episode 固定) | k=30 → ~1800 |
@ -226,24 +229,25 @@ python src/main.py --mode viz --checkpoint checkpoints/model_final.pt --k-test 3
对 P1 三角单元 K三项残差分量为
$$r_{\text{int}} = \frac{h_K}{k_{local}} \sqrt{V_K} \cdot \left| k^2\varepsilon_r u + k^2(\varepsilon_r-1)u_{inc} \right|_K \tag{1}$$
$$r_{\text{int}} = \frac{h_K}{k} \sqrt{V_K} \cdot \left| k^2\varepsilon_r u + k^2(\varepsilon_r-1)u_{inc} \right|_K \tag{1}$$
$$r_{\text{jump}} = \sqrt{\frac{1}{2}\sum_{e\in\partial K} \frac{h_e}{k_{local}} \cdot \left| [[\nabla u \cdot n]] \right|^2_e} \tag{2}$$
$$r_{\text{jump}} = \sqrt{\frac{1}{2}\sum_{e\in\partial K} \frac{h_e}{k} \cdot \left| [[\nabla u \cdot n]] \right|^2_e} \tag{2}$$
$$r_{\text{sbc}} = \frac{h_{bnd}}{k_{local}} \cdot \left| \frac{\partial u}{\partial n} - ik_{local}u \right| \tag{3}$$
$$r_{\text{sbc}} = \frac{h_{bnd}}{k} \cdot \left| \frac{\partial u}{\partial n} - ik_{local}u \right| \tag{3}$$
**逐单元误差指示子**
$$\eta_K = \sqrt{r_{\text{int}}^2 + r_{\text{jump}}^2 + r_{\text{sbc}}^2}$$
量纲分析($k_{local} \sim [L]^{-1}$$h_e \sim [L]$$|\text{jump}|^2 \sim [L]^{-2}$
三项均严格无量纲:$h_e/k_{local} \cdot |\text{jump}|^2 \sim [L]^2 \cdot [L]^{-2} = 1$。
细化后 $h_e$ 缩小直接降低跳变项,为 RL agent 提供可感知的正向 reward 信号。
量纲分析($k \sim [L]^{-1}$$h_e \sim [L]$$|\text{jump}|^2 \sim [L]^{-2}$
三项均严格无量纲:$h_e/k \cdot |\text{jump}|^2 \sim [L]^2 \cdot [L]^{-2} = 1$。
SBC 边界条件仍用 $k_{local}$(物理正确),仅归一化因子改用 $k$。
介质内残差不再被 $\sqrt{\varepsilon_r}$ 压低Agent 获得正确的介质内/外优先级信号。
`η_K` 的计算(`_compute_residual_indicator`)与 GNN 输入特征(`_compute_residual_components`)公式完全一致,特征仅多一层 log₁₀ 压缩。关键验证点:
- 内部残差P1 元 ∇²u_h ≡ 0仅含反应项 `k²ε_r·u + k²(ε_r-1)·u_inc`除以 `k_local` 后跨介质公平可比
- 梯度跳变:`(h_e/k_local)·|jump|²`,½ 分配给相邻左右单元;$h_e$ 保留边积分路径,细化后自然衰减
- SBC 项在 η_K² 中为 `(h_bnd²/k_local²)·|B|²`,分量 `r_sbc = (h_bnd/k_local)·|B|`
- 内部残差P1 元 ∇²u_h ≡ 0仅含反应项 `k²ε_r·u + k²(ε_r-1)·u_inc`真空波数 k 归一化
- 梯度跳变:`(h_e/k)·|jump|²`,½ 分配给相邻左右单元;$h_e$ 保留边积分路径,细化后自然衰减
- SBC 项归一化用 k物理条件保留 k_local`(h_bnd²/k²)·|∂u/∂n i·k_local·u|²`
### 连续尺寸场策略score-based + 物理预算约束 + 动作掩码)
@ -258,7 +262,7 @@ N_phys = ⌈ Σ |K_i| / A_budget_i ⌉ // 全局物理预算k=30 真
remaining = N_budget N_current
V_min_safeguard = 1e-10 × domain_area // 纯数值底线(防止 FEM 求解器退化)
eligible: area > V_min_safeguard AND η_K ≥ 0.05·η_P95 // 数值底线 + Dörfler-P95
eligible: area > V_min_safeguard AND η_K ∈ Reverse Dörfler 保留集 // 数值底线 + 能量尾部淘汰 (ε_noise=0.01, ≥20% floor)
num = min(|eligible|, N_current//4, remaining//3)
selected = top-k by score = -x_i → 1-to-4 切分
```
@ -266,9 +270,9 @@ selected = top-k by score = -x_i → 1-to-4 切分
- score = -x_ix 越小 ⇒ 优先级越高(纯排序,不设正负门槛)
- 不再使用 `0.25·A_budget` 启发式面积地板RL 应自主学会"细化到多细",而非被人类经验 (12 点/波长) 限制。仅保留数值底线 V_min_safeguard = 1e-10 × domain_area 防止浮点精度问题。
- per-step cap 从固定 200 改为自适应 `N_current // 4`随网格规模缩放但增速更缓避免大网格时单步消耗过多预算。rho_min 从 3.0 提升到 5.0,赋予更多预算余量。
- **sel=0 提前终止**:当 agent 选中 0 个单元细化(预算耗尽或 Dörfler 屏蔽所有候选)时 episode 自动结束,不再浪费 FEM 求解
- **k_exponent 可配**:初始网格缩放指数可通过 `helmholtz.k_exponent` 配置(默认 1.5),² 为 P1 Helmholtz 理论最优
- **动作掩码 (Dörfler-P95)**η_K < 0.05·η_P95 的单元移出候选池P95 锚定物理误差尺度免疫远场噪声稀释 median/mean 不同确保只有误差达标的区域消耗细化预算
- **sel=0 提前终止**:当 agent 选中 0 个单元细化(预算耗尽或 Reverse Dörfler 屏蔽所有候选)时 episode 自动结束,不再浪费 FEM 求解
- **k_exponent 可配**:初始网格缩放指数可通过 `helmholtz.k_exponent` 配置(默认 2.0),² 为 P1 Helmholtz 理论最优;对 k=30 的 $N_{init}$ 为 k=6 的 25×
- **动作掩码 (Reverse Dörfler)**:按 η_K 升序排列,剔除累积平方误差贡献 < ε_noise·Ση² 的底部单元数值噪声/已收敛区)。基于能量分布而非密度分位数在重尾和均匀误差分布下均自适应保留率不低于 20% 确保 Agent 始终有充分的选择空间
### 奖励计算
@ -303,10 +307,12 @@ score = -x // x 越小 ⇒ 优先级越
remaining = N_budget N_old
max_by_budget = max(0, remaining // 3)
// 数值底线 + Dörfler-P95 掩码
// 数值底线 + Reverse Dörfler 能量尾部淘汰
V_min_safeguard = 1e-10 × domain_area // 纯数值安全底线,防止 FEM 退化
η_p95 = percentile(η_old, 95)
eligible = {i | V_old[i] > V_min_safeguard AND η_old_i ≥ 0.05·η_p95}
η_sq = η_old²; total_energy = Σ η_sq
k_dorfler = searchsorted(cumsum(sort_asc(η_sq)), ε_noise·total_energy) // ε_noise=0.01
k = min(k_dorfler, N max(1, N//5)) // ≥20% floor
eligible = {i | V_old[i] > V_min_safeguard AND i ∈ sort_asc_idx[k:] }
num = min(|eligible|, N_old//3, max_by_budget)
elements_to_refine = top-k of eligible by score
@ -320,42 +326,32 @@ M_new[j] ∈ {0,…,N_old-1} // 子→父映射
||u_h_new|| ← 新解 L₂ 范数
```
**Step 3 — 局部奖励**(动态截断 ε_dynamic
**Step 3 — 因果奖励**(零和预算审查
ε_dynamic = max(0.01 × η_P95, 1e-6) // P95 锚定,免疫远场噪声稀释
ε_dynamic = max(0.05 × mean(η_new), 1e-6) // 自适应钳制,切断远场低 η 区 reward hacking
spatial: r_local_i = log(η_old_i + ε_dynamic) log( √(Σ_{j: M_new[j]=i} η_new_j²) + ε_dynamic )
spatial_max: r_local_i = log(η_old_i + ε_dynamic) log( max_{j: M_new[j]=i} η_new_j + ε_dynamic )
```
ε_dynamic = max(0.01 × η_P95, 1e-6)
> **L₂ 聚合保证 r_local ≥ 0**: 对 1-to-4 切分:
> ```
> Σ η_child² = int²/4 + jump² + sbc² ≤ η_parent² = int² + jump² + sbc²
> → r_local = ½[log(η_parent²) log(Σ η_child²)] ≥ 0
> ```
> - 纯 int 主导: r_local = log(2) ≈ 0.69(强正奖励)
> - 纯 jump/sbc 主导: r_local = 0中性不惩罚不奖励
> - **永远不会惩罚细化**——与 L₁ sum 不同L₂ 天然避免了对 jump/sbc 主导区的结构性负偏置。
// Refined parents: r_local + zero-sum bonus penalty
if i ∈ refined_parents:
r_i = log(η_old + ε) log(√(Σ η_child²) + ε) // r_local ≥ 0 (L₂ 聚合)
+ 0.3 × (η_old / μ 1.0) // zero-sum bonus (Σ = 0)
0.06 // action penalty
**Step 4 — 动作惩罚**
// Unrefined parents: causal isolation
else:
r_i = 0
```
penalty_i = λ · (n_i 1) // λ = 0.06
+ (λ_limit / N_old) · 𝟙[达到最大单元数上限] // λ_limit = 10000
> **零和奖金**:α·(η/μ1) 全场求和为零。细化高于均值的单元得正奖金,低于均值的倒扣。
> 这是 Dörfler 准则的 RL 对偶Agent 必须选出误差超过全均水平的单元。
> **因果隔离**:未细化单元 r ≡ 0。零和奖金本身足够强介质内 +0.51)、
> 不再需要忽视惩罚的推力,排序机制自动淘汰不划算的单元。
> **L₂ 聚合**:√(Σ η_child²) ≤ η_parent 天然成立r_local ≥ 0 永不惩罚细化。
r_local_i ← r_local_i penalty_i
```
**Step 4 — 全局误差(仅诊断)**
**Step 5 — 全局势函数塑形**(仅发给被细化的父单元)
global_bonus = α·[log(E_old) log(E_new)]α = 0.5
```
E_global = √(Σ_K η_K²) / ||u_h||_{L₂(Ω)}
global_bonus = α · [ log(E_global_old) log(E_global_new) ] // α = 0.2
r_i = r_local_i penalty_i + global_bonus · 𝟙[i 被细化] // 未细化的单元 reward ≈ 0
```
> 全局改进信号只分配给实际参与细化的单元,避免被未细化单元稀释。
不注入 Actor reward。Helmholtz 污染误差可使 E_new > E_old 在正确细化后发生,
注入 global_bonus 导致因果断裂。Actor 仅优化 Step 3 的 per-element reward。
---
@ -378,19 +374,21 @@ r_i = r_local_i penalty_i + global_bonus · 𝟙[i 被细化]
| 组件 | 聚合 | 作用 |
|------|------|------|
| 局部项 `log(η_old / √(Σ η_child²))` | scatter_add子→父求平方和再开方 | L₂ 聚合保证 r_local ≥ 0不惩罚任何细化int 主导区获强正奖励 (≈+0.69),纯 jump/sbc 区中性 |
| 动作惩罚 `λ(n_i1)` λ=0.02 | per-parent | 轻微抑制网格膨胀1-to-4 切分扣 0.06,仅占 r_local 的 ~16% |
| 元素上限惩罚 | 达到 20000 上限时触发 | 极端情况兜底λ_limit / N_old ≈ 0.05~0.5 per agent |
| 全局项 `α·ΔlogE` α=0.2 | 仅细化父单元 | L₂ 无量纲全局误差下降趋势,只发给实际参与细化的单元,避免被未细化单元稀释 |
| 局部项 `log(η_old / √(Σ η_child²))` | scatter_add仅 refined parents | L₂ 保证 r_local ≥ 0int 主导 +0.69 |
| 零和奖金 `0.3×(η/μ1)` | 仅 refined parents | Σ=0高于 μ 得正奖,低于 μ 倒扣 (Dörfler 准则的 RL 对偶) |
| 动作惩罚 `λ=0.06` | per-refined-parent | 轻微抑制网格膨胀1-to-4 扣 0.06 |
| 因果隔离 `r=0` | unrefined parents | 零和奖金足够强,不需额外推力 |
| 全局项 `α·ΔlogE` α=0.5 | 仅诊断 | 不注入 Actor避免污染误差因果断裂 |
---
## PPO 关键细节
- **单路 GAE**: 势函数塑形后的奖励已包含全局改进信号,`scatter_add` 将细化后的子单元值聚合回父单元,单路 GAE 即可
- **单路 GAE**: r_local 自身已闭合因果(细化单元的局部误差改善),不需要势函数塑形。`scatter_add` 将细化后的子单元值聚合回父单元,单路 GAE 即可
- **奖励归一化**: rollout 内 reward 做 z-score 归一化std < 1e-8 则跳过
- **Value clipping**: 默认 clip_range=0.2
- **梯度裁剪**: max_grad_norm=0.5
- **log_std clamp**: 每步 `optimizer.step()` 后将 `log_std` clamp 到 `[-4.0, -1.0]`std ∈ [0.018, 0.368]<br>
初始化 `-2.0` (std≈0.135),避免 `continuous_sizing_field` 有效范围 [-3, 3] 内噪声过大
- **熵正则**: `entropy_coefficient=0.001`,防止 log_std 过早收敛
- **log_std clamp**: 每步 `optimizer.step()` 后将 `log_std` clamp 到 `[-3.0, -1.0]`σ ∈ [0.05, 0.37]<br>
初始化 `-2.0` (σ≈0.135),放宽下限防止策略过早确定化
- **熵正则**: `entropy_coefficient=0.005`,施加有意义的探索压力防止 x<0 崩塌
- **epochs_per_iteration**: 3减少对同一 rollout 的过拟合

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -142,6 +142,10 @@ class FEMProblemWrapper:
def plot_boundary(self):
return self._plot_boundary
@property
def last_solve_timing(self) -> Optional[Dict[str, float]]:
return getattr(self.fem_problem, "_last_solve_timing", None)
# ---- 额外的 plotly 渲染图层 ----
def additional_plots(self) -> Dict:
return self.fem_problem.additional_plots_from_mesh(self._mesh)

View File

@ -1,4 +1,5 @@
import copy
import time
from typing import Any, Dict, List, Optional, Union
import numpy as np
@ -71,7 +72,7 @@ class HelmholtzProblem:
boundary = domain_cfg.get("boundary", [0, 0, 1, 1])
domain_area = (boundary[2] - boundary[0]) * (boundary[3] - boundary[1])
k_ref = helmholtz_config.get("k_ref", 6.0)
k_exponent = helmholtz_config.get("k_exponent", 1.5)
k_exponent = helmholtz_config.get("k_exponent", 2.0)
base_elements = domain_cfg.get("initial_num_elements", 400)
scaled_elements = int(base_elements * (self._k / k_ref) ** k_exponent * domain_area)
domain_cfg["initial_num_elements"] = max(scaled_elements, int(base_elements * domain_area))
@ -104,8 +105,13 @@ class HelmholtzProblem:
return Basis(mesh, ElementTriP1())
def calculate_solution(self, basis: Basis, cache: bool = False) -> np.ndarray:
_t = {}
_t0 = time.perf_counter()
K = asm(self._bilin_form, basis)
_t1 = time.perf_counter()
f = asm(self._lin_form_real, basis) + 1j * asm(self._lin_form_imag, basis)
_t2 = time.perf_counter()
boundary_facets = basis.mesh.boundary_facets()
facet_basis = FacetBasis(basis.mesh, basis.elem, facets=boundary_facets)
@ -115,8 +121,18 @@ class HelmholtzProblem:
return u * v
M_boundary = asm(boundary_mass, facet_basis)
_t3 = time.perf_counter()
K_total = K.astype(np.complex128) - 1j * self._k * M_boundary
u_scat = solve(K_total, f)
_t4 = time.perf_counter()
_t["assemble_K"] = _t1 - _t0
_t["assemble_f"] = _t2 - _t1
_t["assemble_boundary"] = _t3 - _t2
_t["solve"] = _t4 - _t3
_t["total"] = _t4 - _t0
_t["n_dof"] = int(basis.mesh.p.shape[1])
self._last_solve_timing = _t
return u_scat
@ -262,20 +278,20 @@ def _compute_residual_indicator(
"""
基于残差的逐单元后验误差估计 无量纲化版本
引入局部波数 k_local = kε_r 消除纯几何尺度 h 带来的特征偏差
使误差指示子反映"相位分辨率残差"而非"网格粗疏程度"
使用真空波数 k₀ 归一化 k_local使误差指示子反映"绝对物理误差"
而非"相对局部波长的分辨率"介质内短波ε_r>1的残差在 k_local 下被
压低 ε_r 改用 k₀ 后介质内 η 自然放大Agent 获得正确优先级
P1 单元三项:
1. r_int = (h_K/k_local)·V_K · |k²ε_r·u_h + (ε_r-1)·u_inc|
2. r_jump = (½ Σ_{eK} (h_e/k_local)·|[[u_h·n]]|²)
3. r_sbc = (h_bnd/k_local)·|u/n - i·k_local·u|
1. r_int = (h_K/k)·V_K · |k²ε_r·u_h + (ε_r-1)·u_inc|
2. r_jump = (½ Σ_{eK} (h_e/k)·|[[u_h·n]]|²)
3. r_sbc = (h_bnd/k)·|u/n - i·k_local·u| (SBC 条件仍用 k_local)
Returns:
eta_elements: shape (num_elements,) 的逐单元误差指标
"""
n_elements = mesh.t.shape[1]
eps_r = np.asarray(eps_r)
k_local = k * np.sqrt(np.maximum(eps_r, 1.0))
# ── 1. 单元几何量 ──
i0, i1, i2 = mesh.t[0], mesh.t[1], mesh.t[2]
@ -307,7 +323,7 @@ def _compute_residual_indicator(
f_mid = (k**2) * (eps_r - 1.0) * u_inc_mid
r_mid = f_mid + (k**2) * eps_r * u_mid
cell_residual_sq = (h_K**2) * element_areas * np.abs(r_mid) ** 2 / (k_local ** 2)
cell_residual_sq = (h_K**2) * element_areas * np.abs(r_mid) ** 2 / (k ** 2)
cell_residual_sq[element_areas < 1e-15] = 0.0
# ── 4. 内部边梯度跳变 ──
@ -327,8 +343,8 @@ def _compute_residual_indicator(
jump_val_sq = jump_val ** 2
jump_residual_sq = np.zeros(n_elements)
np.add.at(jump_residual_sq, elem_left, 0.5 * h_e * jump_val_sq / k_local[elem_left])
np.add.at(jump_residual_sq, elem_right, 0.5 * h_e * jump_val_sq / k_local[elem_right])
np.add.at(jump_residual_sq, elem_left, 0.5 * h_e * jump_val_sq / k)
np.add.at(jump_residual_sq, elem_right, 0.5 * h_e * jump_val_sq / k)
# ── 5. 合并 ──
eta_sq = cell_residual_sq + jump_residual_sq
@ -356,7 +372,7 @@ def _compute_residual_indicator(
+ u_h[mesh.facets[1, boundary_facets_idx]]
) / 2.0
sbc_residual = du_dn - 1j * k_local * u_edge_mean
sbc_residual_sq = (h_bnd ** 2) * np.abs(sbc_residual) ** 2 / (k_local ** 2)
sbc_residual_sq = (h_bnd ** 2) * np.abs(sbc_residual) ** 2 / (k ** 2)
np.add.at(eta_sq, bnd_elem, sbc_residual_sq)
eta_sq = np.maximum(eta_sq, 0.0)
@ -373,13 +389,13 @@ def _compute_residual_components(
"""
计算逐单元的三项 PDE 物理残差分离版无量纲化
引入 k_local = kε_r 消除几何尺度偏差使 GNN 跨介质公平感知"相位分辨率残差"
保留源项信息(ε_r-1)·u_inc确保极粗网格下介质内部巨大物理激励仍可被网络捕捉
使用真空波数 k₀ 归一化 介质内短波残差不再被 k_local 压低GNN 获得
正确的介质内/外优先级信号
P1 单元返回:
internal_residual: (h_K/k_local)·V_i · |k²ε_r·u + (ε_r-1)·u_inc|
gradient_jump: (½ Σ_{eK_i} (h_e/k_local)·|[[u·n]]|²)
sbc_residual: (h_bnd/k_local)·|u/n - i·k_local·u|
internal_residual: (h_K/k)·V_i · |k²ε_r·u + (ε_r-1)·u_inc|
gradient_jump: (½ Σ_{eK_i} (h_e/k)·|[[u·n]]|²)
sbc_residual: (h_bnd/k)·|u/n - i·k_local·u| (SBC 条件仍用 k_local)
element_areas: 单元面积
is_sbc_boundary: 该单元是否与 SBC 边界相邻 (0/1)
@ -388,7 +404,6 @@ def _compute_residual_components(
"""
n_elements = mesh.t.shape[1]
eps_r = np.asarray(eps_r)
k_local = k * np.sqrt(np.maximum(eps_r, 1.0))
# ── 1. 单元几何量 ──
i0, i1, i2 = mesh.t[0], mesh.t[1], mesh.t[2]
@ -421,7 +436,7 @@ def _compute_residual_components(
u_inc_mid = np.exp(1j * k * x_mid)
f_mid = (k**2) * (eps_r - 1.0) * u_inc_mid
r_mid = f_mid + (k**2) * eps_r * u_mid
internal_residual = (h_K / k_local) * np.sqrt(element_areas) * np.abs(r_mid)
internal_residual = (h_K / k) * np.sqrt(element_areas) * np.abs(r_mid)
internal_residual[element_areas < 1e-15] = 0.0
# ── 4. 内部边梯度跳变 (逐单元) ──
@ -441,8 +456,8 @@ def _compute_residual_components(
gradient_jump = np.zeros(n_elements, dtype=np.float64)
jump_sq_per_edge = jump_val ** 2
np.add.at(gradient_jump, elem_left, 0.5 * h_e * jump_sq_per_edge / k_local[elem_left])
np.add.at(gradient_jump, elem_right, 0.5 * h_e * jump_sq_per_edge / k_local[elem_right])
np.add.at(gradient_jump, elem_left, 0.5 * h_e * jump_sq_per_edge / k)
np.add.at(gradient_jump, elem_right, 0.5 * h_e * jump_sq_per_edge / k)
gradient_jump = np.sqrt(gradient_jump)
# ── 5. SBC 边界残差 + 边界标记 ──
@ -470,7 +485,7 @@ def _compute_residual_components(
+ u_h[mesh.facets[1, boundary_facets_idx]]
) / 2.0
sbc_val = np.abs(du_dn - 1j * k_local * u_edge_mean)
np.add.at(sbc_residual, bnd_elem, (h_bnd / k_local) * sbc_val)
np.add.at(sbc_residual, bnd_elem, (h_bnd / k) * sbc_val)
is_sbc_boundary[bnd_elem] = 1.0
# ── 对数预处理:压缩跨数量级动态范围(仅 GNN 特征需要)──

View File

@ -166,8 +166,11 @@ class MeshRefinement(gym.Env):
feats["dist_to_interface"] = lambda: self._dist_to_interface
# Complex field decomposition (always present for Helmholtz)
# amplitude + phase direction (cos/sin ∈ [1,1]), ε=1e-8 at |u|→0 nodes
feats["epsilon_r"] = lambda: self._epsilon_r_elements
feats["total_solution_magnitude"] = lambda: np.abs(self._complex_solution_mean)
feats["cos_phase"] = lambda: np.real(self._complex_solution_mean) / (np.abs(self._complex_solution_mean) + 1e-8)
feats["sin_phase"] = lambda: np.imag(self._complex_solution_mean) / (np.abs(self._complex_solution_mean) + 1e-8)
return feats
def reset(self) -> Data:
@ -218,6 +221,8 @@ class MeshRefinement(gym.Env):
self._reward = 0
self._cumulative_return = 0
self._diag_selected_count = -1 # 防止跨 episode 残留触发 is_terminal
self._diag_dorfler_tail_ratio = 0.0
self._diag_dorfler_floor_active = False
# reset internal state that tracks statistics over the episode
self._previous_error_per_element = self.error_per_element
@ -344,6 +349,8 @@ class MeshRefinement(gym.Env):
"eligible_ratio": getattr(self, "_diag_eligible_ratio", 0.0),
"masked_ratio": getattr(self, "_diag_masked_ratio", 0.0),
"selected_count": getattr(self, "_diag_selected_count", 0),
"dorfler_tail_ratio": getattr(self, "_diag_dorfler_tail_ratio", 0.0),
"dorfler_floor_active": float(getattr(self, "_diag_dorfler_floor_active", False)),
"n_budget": self._n_budget,
}
)
@ -528,8 +535,9 @@ class MeshRefinement(gym.Env):
# 物理预算 N_budget: Σ area_K / A_budget其中
# A_budget = ½(λ_local/6)²,对应每局部波长方向 ~6 个尺度点
#
# 动作掩码 (Dörfler-P95): η_K < 0.05·η_P95 的单元移出候选池,
# P95 锚定物理误差尺度,免疫远场噪声稀释,强制预算投入误差主导区
# 动作掩码 (Reverse Dörfler): 按 η_K 升序排列,剔除累积平方误差
# 贡献 < ε_noise·Ση² 的底部单元(数值噪声/已收敛区),保留 ≥20%
# 的单元确保 Agent 始终有充分的选择空间
# ================================================================
x = action.flatten()
@ -542,6 +550,8 @@ class MeshRefinement(gym.Env):
if max_parents_by_budget <= 0:
self._diag_eligible_ratio = 0.0
self._diag_selected_count = 0
self._diag_dorfler_tail_ratio = 0.0
self._diag_dorfler_floor_active = False
return np.array([], dtype=np.int64)
# 动态计算每单元预算面积(仅用于 N_budget 全局资源上限)
@ -559,13 +569,31 @@ class MeshRefinement(gym.Env):
# Filter 1: numerical safeguard only — no physics heuristic
area_eligible = np.where(self.element_volumes > V_min_safeguard)[0]
# Filter 2: Dörfler-style action mask — exclude elements below 5% of η_P95
# P95 anchors the threshold to physically meaningful error scale,
# immune to far-field noise dilution (unlike median or mean).
# η_K < 0.05·η_P95 → not worth the refinement budget.
# Filter 2: Reverse Dörfler — eliminate the noise tail, not select the elite.
# Sort η_K ascending; remove the smallest elements whose cumulative η²
# contributes < ε_noise of total error energy. These are numerically
# converged or noise — not worth the agent's attention.
# A 20% floor on the eligible ratio guarantees the agent meaningful
# choices even in heavy-tailed distributions where energy is concentrated.
eta_current = self._eta_indicator
eta_p95 = np.percentile(eta_current, 95)
error_eligible = np.where(eta_current >= 0.05 * eta_p95)[0]
eta_sq = eta_current ** 2
total_energy = np.sum(eta_sq)
if total_energy > 0:
idx_asc = np.argsort(eta_current) # ascending
cumsum_asc = np.cumsum(eta_sq[idx_asc])
eps_noise = 0.01 # bottom 1% of energy = noise tail
k_dorfler = int(np.searchsorted(cumsum_asc, eps_noise * total_energy))
self._diag_dorfler_tail_ratio = float(k_dorfler) / max(self._num_elements, 1)
# floor: keep at least 20% of elements for RL agent choice
min_keep = max(1, self._num_elements // 5)
k = min(k_dorfler, self._num_elements - min_keep)
self._diag_dorfler_floor_active = k < k_dorfler
error_eligible = idx_asc[k:]
else:
self._diag_dorfler_tail_ratio = 0.0
self._diag_dorfler_floor_active = False
error_eligible = np.arange(self._num_elements)
eligible = np.intersect1d(area_eligible, error_eligible)
@ -687,6 +715,7 @@ class MeshRefinement(gym.Env):
graph_dict = graph_dict | self._get_graph_edges()
observation_graph = Data(**graph_dict)
observation_graph.eta = torch.tensor(self._eta_indicator, dtype=torch.float32)
return observation_graph
@ -755,8 +784,16 @@ class MeshRefinement(gym.Env):
- self._element_midpoints[src_nodes],
axis=1,
)
lam = 2.0 * np.pi / self._wave_number
edge_features[:, edge_feature_position] = euclidean_distances / lam
# Phase distance: physical edge length in local wavelengths.
# k_local = k·√ε_r adapts to the medium — two elements are "farther
# apart" in phase inside high-ε regions where the wave oscillates
# faster. This gives the GNN a k-invariant metric for generalisation.
k_local_src = self._wave_number * np.sqrt(np.maximum(
self._epsilon_r_elements[src_nodes], 1.0))
k_local_dst = self._wave_number * np.sqrt(np.maximum(
self._epsilon_r_elements[dest_nodes], 1.0))
k_edge = np.sqrt(k_local_src * k_local_dst) # geometric mean
edge_features[:, edge_feature_position] = euclidean_distances * k_edge / (2.0 * np.pi)
edge_feature_position += 1
edge_index = torch.tensor(np.vstack((src_nodes, dest_nodes))).long()
edge_attr = torch.tensor(edge_features, dtype=torch.float32)
@ -895,8 +932,30 @@ class MeshRefinement(gym.Env):
reward_per_agent = self.project_to_scalar(reward_per_agent_and_dim)
# apply action/element penalty
# ── Causal isolation + bounded signals ──
# r_local: clipped to [1, +1] — prevents pollution-error inversions
# (±4.6) from hijacking the Critic's value estimate.
# r_bonus: 0.5·tanh(η/μ 1) — linear near μ (preserves Dörfler),
# saturates at ±0.5 for extreme η, bounded and safe.
# Unrefined parents: r = 0 (causal isolation).
unique_old, counts = np.unique(self.agent_mapping, return_counts=True)
refined_mask = np.zeros(len(reward_per_agent), dtype=bool)
refined_mask[unique_old[counts > 1]] = True
# Clip r_local to prevent outlier-driven value collapse
reward_per_agent = np.clip(reward_per_agent, -1.0, 1.0)
# Bounded state bonus: tanh preserves Dörfler near μ, caps at extreme η
eta_raw = self._previous_eta_indicator
mu_eta = float(np.mean(eta_raw))
reward_per_agent[refined_mask] += 0.5 * np.tanh(
eta_raw[refined_mask] / (mu_eta + 1e-8) - 1.0
)
# Unrefined: clean zero (causal isolation)
reward_per_agent[~refined_mask] = 0.0
# apply action/element penalty (refined parents only)
element_penalty = np.zeros(len(reward_per_agent), dtype=reward_per_agent.dtype)
element_penalty[unique_old] = self._element_penalty_lambda * (counts - 1)
element_limit_penalty = (
@ -908,7 +967,12 @@ class MeshRefinement(gym.Env):
reward_per_agent - element_penalty - element_limit_penalty
)
# ── Potential-based shaping: only refined parents get the global bonus ──
# ── Global error change (diagnostic only, NOT injected into Actor reward) ──
# Removing global_bonus from per-element reward eliminates the broken causal
# chain: Helmholtz pollution error can make E_new > E_old even when the
# selected elements were the right choice, punishing agents for physics
# they didn't cause. Actor optimises r_local only; Critic captures global
# effects through value estimation.
l2_old = self._previous_solution_l2_norm
l2_new = self._compute_solution_l2_norm()
eta_l2_old = float(np.sqrt(np.sum(old_eta ** 2)))
@ -917,8 +981,7 @@ class MeshRefinement(gym.Env):
E_old = eta_l2_old / max(l2_old, eps_l2)
E_new = eta_l2_new / max(l2_new, eps_l2)
global_bonus = self._global_reward_alpha * float(np.log(E_old + eps_l2) - np.log(E_new + eps_l2))
refined_parents = unique_old[counts > 1]
reward_per_agent[refined_parents] += global_bonus
# global_bonus intentionally NOT added to reward_per_agent — see above.
self._reward_per_agent = reward_per_agent
self._cumulative_reward_per_agent = (
@ -1087,7 +1150,7 @@ class MeshRefinement(gym.Env):
@property
def is_terminal(self) -> bool:
# Agent selected nothing to refine — budget exhausted or
# Doerfler mask filtered everything. Episode converged naturally.
# Reverse Dörfler mask filtered everything. Episode converged naturally.
# -1 = not yet evaluated (reset state), 0 = nothing selected this step.
sc = getattr(self, "_diag_selected_count", -1)
if sc == 0:

8
git.txt Normal file
View File

@ -0,0 +1,8 @@
linux服务器scp -r dxw@222.20.97.222:/public/home/dxw/Codes/afem/* ./
本机git init
git branch -M main
git add .
git commit -m "first commit"
git remote set-url origin http://duxiaowei@222.20.97.33:3000/duxiaowei/afem.git
git remote -v仅确认状态使用
git push -u origin main

418
logs/before.out Normal file
View File

@ -0,0 +1,418 @@
Starting training at Thu 28 May 13:25:52 CST 2026
Running on node: node06
[Device] cuda
[Env] node_feats=12 edge_feats=1 act_dim=1
[Model] params=76,099
1/401 | loss=0.8482 ev=0.001 agents=84 avg_r=-1.5801 sum_r=-404.50 x<0=0.09 elig=0.59 dorfler_tail=0.08 floor=0 sel=35 n_ref=0 r_loc=0.000 8.5s
2/401 | loss=1.0257 ev=0.010 agents=48 avg_r=-2.2743 sum_r=-582.23 x<0=0.07 elig=0.60 dorfler_tail=0.07 floor=0 sel=39 n_ref=0 r_loc=0.000 8.3s
3/401 | loss=0.6731 ev=0.019 agents=156 avg_r=-2.3457 sum_r=-600.50 x<0=0.07 elig=0.58 dorfler_tail=0.09 floor=0 sel=35 n_ref=0 r_loc=0.000 7.8s
4/401 | loss=1.1435 ev=0.036 agents=246 avg_r=-3.6846 sum_r=-943.26 x<0=0.05 elig=0.59 dorfler_tail=0.07 floor=0 sel=36 n_ref=0 r_loc=0.000 7.9s
5/401 | loss=0.6883 ev=0.056 agents=158 avg_r=-1.2686 sum_r=-324.77 x<0=0.05 elig=0.58 dorfler_tail=0.09 floor=0 sel=37 n_ref=0 r_loc=0.000 8.2s
6/401 | loss=0.9416 ev=0.095 agents=142 avg_r=-0.0596 sum_r=-15.24 x<0=0.04 elig=0.59 dorfler_tail=0.07 floor=0 sel=36 n_ref=0 r_loc=0.000 8.2s
7/401 | loss=0.7991 ev=0.105 agents=164 avg_r=-1.2996 sum_r=-332.70 x<0=0.03 elig=0.59 dorfler_tail=0.08 floor=0 sel=36 n_ref=0 r_loc=0.000 8.0s
8/401 | loss=0.7861 ev=0.117 agents=133 avg_r=-0.4898 sum_r=-125.39 x<0=0.02 elig=0.59 dorfler_tail=0.08 floor=0 sel=36 n_ref=0 r_loc=0.000 7.9s
9/401 | loss=0.7722 ev=0.141 agents=141 avg_r=-0.1621 sum_r=-41.50 x<0=0.02 elig=0.59 dorfler_tail=0.08 floor=0 sel=40 n_ref=0 r_loc=0.000 8.3s
10/401 | loss=1.0415 ev=0.134 agents=87 avg_r=-2.4506 sum_r=-627.35 x<0=0.02 elig=0.60 dorfler_tail=0.07 floor=0 sel=33 n_ref=0 r_loc=0.000 7.5s
11/401 | loss=0.6847 ev=0.166 agents=138 avg_r=-0.4086 sum_r=-104.60 x<0=0.01 elig=0.59 dorfler_tail=0.08 floor=0 sel=37 n_ref=0 r_loc=0.000 8.0s
12/401 | loss=0.6900 ev=0.146 agents=144 avg_r=1.5718 sum_r=402.39 x<0=0.01 elig=0.59 dorfler_tail=0.08 floor=0 sel=35 n_ref=0 r_loc=0.000 7.8s
13/401 | loss=0.9037 ev=0.191 agents=158 avg_r=-1.9889 sum_r=-509.15 x<0=0.01 elig=0.60 dorfler_tail=0.07 floor=0 sel=35 n_ref=0 r_loc=0.000 7.8s
14/401 | loss=0.7577 ev=0.175 agents=175 avg_r=-1.0029 sum_r=-256.74 x<0=0.01 elig=0.59 dorfler_tail=0.08 floor=0 sel=36 n_ref=0 r_loc=0.000 7.8s
15/401 | loss=0.6942 ev=0.208 agents=78 avg_r=-0.8006 sum_r=-204.95 x<0=0.01 elig=0.60 dorfler_tail=0.07 floor=0 sel=35 n_ref=0 r_loc=0.000 7.9s
16/401 | loss=0.8176 ev=0.205 agents=219 avg_r=1.1625 sum_r=297.59 x<0=0.01 elig=0.59 dorfler_tail=0.08 floor=0 sel=37 n_ref=0 r_loc=0.000 7.9s
17/401 | loss=0.5844 ev=0.178 agents=66 avg_r=-0.4453 sum_r=-114.01 x<0=0.00 elig=0.59 dorfler_tail=0.08 floor=0 sel=35 n_ref=0 r_loc=0.000 7.8s
18/401 | loss=0.9272 ev=0.198 agents=244 avg_r=-2.4742 sum_r=-633.40 x<0=0.01 elig=0.60 dorfler_tail=0.07 floor=0 sel=35 n_ref=0 r_loc=0.000 7.8s
19/401 | loss=0.6133 ev=0.215 agents=34 avg_r=-1.0759 sum_r=-275.42 x<0=0.01 elig=0.59 dorfler_tail=0.08 floor=0 sel=33 n_ref=0 r_loc=0.000 7.6s
20/401 | loss=0.7286 ev=0.260 agents=86 avg_r=2.3332 sum_r=597.30 x<0=0.01 elig=0.60 dorfler_tail=0.07 floor=0 sel=37 n_ref=0 r_loc=0.000 7.9s
21/401 | loss=0.6750 ev=0.250 agents=102 avg_r=-0.5468 sum_r=-139.98 x<0=0.01 elig=0.59 dorfler_tail=0.08 floor=0 sel=36 n_ref=0 r_loc=0.000 7.8s
22/401 | loss=0.6968 ev=0.188 agents=133 avg_r=-0.2165 sum_r=-55.43 x<0=0.01 elig=0.60 dorfler_tail=0.07 floor=0 sel=35 n_ref=0 r_loc=0.000 7.6s
23/401 | loss=0.6547 ev=0.251 agents=142 avg_r=0.7932 sum_r=203.07 x<0=0.01 elig=0.60 dorfler_tail=0.07 floor=0 sel=34 n_ref=0 r_loc=0.000 7.6s
24/401 | loss=0.7206 ev=0.221 agents=82 avg_r=-0.2919 sum_r=-74.74 x<0=0.01 elig=0.60 dorfler_tail=0.07 floor=0 sel=35 n_ref=0 r_loc=0.000 7.7s
25/401 | loss=0.6633 ev=0.305 agents=235 avg_r=1.9655 sum_r=503.16 x<0=0.01 elig=0.60 dorfler_tail=0.07 floor=0 sel=37 n_ref=0 r_loc=0.000 7.8s
26/401 | loss=0.7285 ev=0.215 agents=235 avg_r=-0.9946 sum_r=-254.60 x<0=0.00 elig=0.60 dorfler_tail=0.07 floor=0 sel=33 n_ref=0 r_loc=0.000 7.4s
27/401 | loss=0.6501 ev=0.264 agents=75 avg_r=-1.4324 sum_r=-366.69 x<0=0.01 elig=0.60 dorfler_tail=0.07 floor=0 sel=35 n_ref=0 r_loc=0.000 7.6s
28/401 | loss=0.5842 ev=0.262 agents=34 avg_r=0.2413 sum_r=61.77 x<0=0.01 elig=0.59 dorfler_tail=0.08 floor=0 sel=36 n_ref=0 r_loc=0.000 7.7s
29/401 | loss=0.7681 ev=0.295 agents=133 avg_r=0.3315 sum_r=84.86 x<0=0.01 elig=0.60 dorfler_tail=0.07 floor=0 sel=33 n_ref=0 r_loc=0.000 7.9s
30/401 | loss=0.8179 ev=0.292 agents=133 avg_r=0.4571 sum_r=117.01 x<0=0.01 elig=0.60 dorfler_tail=0.07 floor=0 sel=37 n_ref=0 r_loc=0.000 8.3s
31/401 | loss=0.6542 ev=0.232 agents=131 avg_r=1.6268 sum_r=416.47 x<0=0.01 elig=0.60 dorfler_tail=0.07 floor=0 sel=33 n_ref=0 r_loc=0.000 7.7s
32/401 | loss=0.5766 ev=0.204 agents=195 avg_r=-0.2509 sum_r=-64.23 x<0=0.02 elig=0.59 dorfler_tail=0.07 floor=0 sel=34 n_ref=0 r_loc=0.000 7.7s
33/401 | loss=0.6403 ev=0.237 agents=48 avg_r=3.0437 sum_r=779.18 x<0=0.02 elig=0.60 dorfler_tail=0.07 floor=0 sel=34 n_ref=0 r_loc=0.000 7.6s
34/401 | loss=0.7453 ev=0.291 agents=66 avg_r=-0.5863 sum_r=-150.09 x<0=0.01 elig=0.60 dorfler_tail=0.07 floor=0 sel=34 n_ref=0 r_loc=0.000 7.6s
35/401 | loss=0.6467 ev=0.303 agents=138 avg_r=1.6192 sum_r=414.51 x<0=0.02 elig=0.60 dorfler_tail=0.07 floor=0 sel=34 n_ref=0 r_loc=0.000 7.7s
36/401 | loss=0.6302 ev=0.289 agents=64 avg_r=1.1951 sum_r=305.96 x<0=0.01 elig=0.60 dorfler_tail=0.07 floor=0 sel=35 n_ref=0 r_loc=0.000 7.7s
37/401 | loss=0.7351 ev=0.301 agents=34 avg_r=-0.3947 sum_r=-101.03 x<0=0.01 elig=0.60 dorfler_tail=0.06 floor=0 sel=33 n_ref=0 r_loc=0.000 7.6s
38/401 | loss=0.6007 ev=0.312 agents=246 avg_r=0.4709 sum_r=120.55 x<0=0.01 elig=0.60 dorfler_tail=0.07 floor=0 sel=34 n_ref=0 r_loc=0.000 7.6s
39/401 | loss=0.6316 ev=0.318 agents=138 avg_r=1.0463 sum_r=267.85 x<0=0.01 elig=0.60 dorfler_tail=0.07 floor=0 sel=34 n_ref=0 r_loc=0.000 7.6s
40/401 | loss=0.6016 ev=0.143 agents=34 avg_r=1.0658 sum_r=272.85 x<0=0.01 elig=0.60 dorfler_tail=0.07 floor=0 sel=31 n_ref=0 r_loc=0.000 7.3s
41/401 | loss=0.7033 ev=0.306 agents=60 avg_r=3.5062 sum_r=897.59 x<0=0.01 elig=0.60 dorfler_tail=0.06 floor=0 sel=37 n_ref=0 r_loc=0.000 7.8s
42/401 | loss=0.5702 ev=0.268 agents=175 avg_r=-0.2759 sum_r=-70.64 x<0=0.01 elig=0.60 dorfler_tail=0.07 floor=0 sel=33 n_ref=0 r_loc=0.000 7.5s
43/401 | loss=0.5907 ev=0.324 agents=247 avg_r=0.7705 sum_r=197.25 x<0=0.01 elig=0.60 dorfler_tail=0.07 floor=0 sel=33 n_ref=0 r_loc=0.000 7.5s
44/401 | loss=0.6398 ev=0.306 agents=48 avg_r=1.4337 sum_r=367.03 x<0=0.01 elig=0.60 dorfler_tail=0.07 floor=0 sel=34 n_ref=0 r_loc=0.000 7.6s
45/401 | loss=0.6173 ev=0.266 agents=34 avg_r=0.4788 sum_r=122.56 x<0=0.00 elig=0.60 dorfler_tail=0.07 floor=0 sel=35 n_ref=0 r_loc=0.000 7.7s
46/401 | loss=0.5942 ev=0.262 agents=244 avg_r=0.2944 sum_r=75.38 x<0=0.01 elig=0.60 dorfler_tail=0.06 floor=0 sel=32 n_ref=0 r_loc=0.000 7.5s
47/401 | loss=0.6930 ev=0.312 agents=86 avg_r=2.0645 sum_r=528.51 x<0=0.01 elig=0.60 dorfler_tail=0.07 floor=0 sel=35 n_ref=0 r_loc=0.000 7.8s
48/401 | loss=0.6166 ev=0.265 agents=242 avg_r=-1.3247 sum_r=-339.13 x<0=0.01 elig=0.60 dorfler_tail=0.07 floor=0 sel=33 n_ref=0 r_loc=0.000 7.5s
49/401 | loss=0.6950 ev=0.281 agents=76 avg_r=0.5565 sum_r=142.46 x<0=0.01 elig=0.60 dorfler_tail=0.07 floor=0 sel=32 n_ref=0 r_loc=0.000 7.4s
50/401 | loss=0.5718 ev=0.306 agents=280 avg_r=1.5020 sum_r=384.52 x<0=0.01 elig=0.60 dorfler_tail=0.07 floor=0 sel=33 n_ref=0 r_loc=0.000 7.5s
[Checkpoint] saved → checkpoints/model_iter0050.pt
51/401 | loss=0.5765 ev=0.337 agents=48 avg_r=1.0395 sum_r=266.11 x<0=0.01 elig=0.60 dorfler_tail=0.07 floor=0 sel=32 n_ref=0 r_loc=0.000 7.4s
52/401 | loss=0.7324 ev=0.326 agents=34 avg_r=-0.5879 sum_r=-150.50 x<0=0.01 elig=0.60 dorfler_tail=0.07 floor=0 sel=34 n_ref=0 r_loc=0.000 8.1s
53/401 | loss=0.6879 ev=0.195 agents=133 avg_r=0.2283 sum_r=58.44 x<0=0.01 elig=0.60 dorfler_tail=0.07 floor=0 sel=35 n_ref=0 r_loc=0.000 7.9s
54/401 | loss=0.5093 ev=0.354 agents=34 avg_r=3.4100 sum_r=872.97 x<0=0.01 elig=0.60 dorfler_tail=0.07 floor=0 sel=32 n_ref=0 r_loc=0.000 7.6s
55/401 | loss=0.5717 ev=0.241 agents=76 avg_r=0.1396 sum_r=35.73 x<0=0.01 elig=0.60 dorfler_tail=0.07 floor=0 sel=32 n_ref=0 r_loc=0.000 7.5s
56/401 | loss=0.6966 ev=0.329 agents=55 avg_r=1.8220 sum_r=466.43 x<0=0.02 elig=0.60 dorfler_tail=0.07 floor=0 sel=35 n_ref=0 r_loc=0.000 7.7s
57/401 | loss=0.6618 ev=0.271 agents=53 avg_r=0.1718 sum_r=43.99 x<0=0.01 elig=0.60 dorfler_tail=0.07 floor=0 sel=33 n_ref=0 r_loc=0.000 7.4s
58/401 | loss=0.7686 ev=0.308 agents=34 avg_r=-0.3162 sum_r=-80.94 x<0=0.02 elig=0.60 dorfler_tail=0.07 floor=0 sel=33 n_ref=0 r_loc=0.000 7.5s
59/401 | loss=0.6369 ev=0.282 agents=34 avg_r=1.1943 sum_r=305.74 x<0=0.02 elig=0.60 dorfler_tail=0.07 floor=0 sel=35 n_ref=0 r_loc=0.000 7.7s
60/401 | loss=0.5711 ev=0.316 agents=78 avg_r=0.4311 sum_r=110.36 x<0=0.02 elig=0.60 dorfler_tail=0.07 floor=0 sel=32 n_ref=0 r_loc=0.000 7.5s
61/401 | loss=0.6055 ev=0.243 agents=141 avg_r=0.7018 sum_r=179.65 x<0=0.02 elig=0.60 dorfler_tail=0.07 floor=0 sel=34 n_ref=0 r_loc=0.000 7.6s
62/401 | loss=0.5890 ev=0.320 agents=161 avg_r=2.4707 sum_r=632.49 x<0=0.02 elig=0.60 dorfler_tail=0.07 floor=0 sel=33 n_ref=0 r_loc=0.000 7.4s
63/401 | loss=0.7483 ev=0.299 agents=94 avg_r=-0.1036 sum_r=-26.52 x<0=0.02 elig=0.61 dorfler_tail=0.06 floor=0 sel=33 n_ref=0 r_loc=0.000 7.5s
64/401 | loss=0.5846 ev=0.308 agents=142 avg_r=2.2134 sum_r=566.62 x<0=0.03 elig=0.60 dorfler_tail=0.07 floor=0 sel=34 n_ref=0 r_loc=0.000 7.6s
65/401 | loss=0.6235 ev=0.310 agents=34 avg_r=0.3583 sum_r=91.72 x<0=0.03 elig=0.60 dorfler_tail=0.07 floor=0 sel=33 n_ref=0 r_loc=0.000 7.5s
66/401 | loss=0.7279 ev=0.340 agents=242 avg_r=0.8842 sum_r=226.36 x<0=0.03 elig=0.61 dorfler_tail=0.06 floor=0 sel=33 n_ref=0 r_loc=0.000 7.4s
67/401 | loss=0.6277 ev=0.276 agents=66 avg_r=-0.6905 sum_r=-176.76 x<0=0.04 elig=0.60 dorfler_tail=0.07 floor=0 sel=33 n_ref=0 r_loc=0.000 7.4s
68/401 | loss=0.4957 ev=0.312 agents=155 avg_r=1.7990 sum_r=460.54 x<0=0.03 elig=0.60 dorfler_tail=0.07 floor=0 sel=32 n_ref=0 r_loc=0.000 7.4s
69/401 | loss=0.6134 ev=0.315 agents=193 avg_r=0.1199 sum_r=30.69 x<0=0.03 elig=0.60 dorfler_tail=0.07 floor=0 sel=33 n_ref=0 r_loc=0.000 7.4s
70/401 | loss=0.6138 ev=0.320 agents=55 avg_r=-0.0142 sum_r=-3.63 x<0=0.04 elig=0.60 dorfler_tail=0.07 floor=0 sel=34 n_ref=0 r_loc=0.000 7.5s
71/401 | loss=0.7342 ev=0.334 agents=123 avg_r=1.7634 sum_r=451.42 x<0=0.05 elig=0.61 dorfler_tail=0.06 floor=0 sel=33 n_ref=0 r_loc=0.000 7.4s
72/401 | loss=0.6063 ev=0.314 agents=75 avg_r=0.6803 sum_r=174.15 x<0=0.06 elig=0.60 dorfler_tail=0.07 floor=0 sel=33 n_ref=0 r_loc=0.000 7.4s
73/401 | loss=0.5994 ev=0.304 agents=66 avg_r=0.3545 sum_r=90.76 x<0=0.06 elig=0.60 dorfler_tail=0.07 floor=0 sel=34 n_ref=0 r_loc=0.000 7.5s
74/401 | loss=0.6456 ev=0.337 agents=155 avg_r=0.7796 sum_r=199.57 x<0=0.06 elig=0.60 dorfler_tail=0.07 floor=0 sel=33 n_ref=0 r_loc=0.000 7.4s
75/401 | loss=0.7205 ev=0.282 agents=34 avg_r=-1.2208 sum_r=-312.52 x<0=0.05 elig=0.60 dorfler_tail=0.06 floor=0 sel=33 n_ref=0 r_loc=0.000 7.5s
76/401 | loss=0.6423 ev=0.301 agents=133 avg_r=-0.0014 sum_r=-0.35 x<0=0.05 elig=0.60 dorfler_tail=0.07 floor=0 sel=33 n_ref=0 r_loc=0.000 8.1s
77/401 | loss=0.5801 ev=0.316 agents=34 avg_r=0.9398 sum_r=240.59 x<0=0.06 elig=0.60 dorfler_tail=0.07 floor=0 sel=33 n_ref=0 r_loc=0.000 7.6s
78/401 | loss=0.8439 ev=0.291 agents=161 avg_r=0.5240 sum_r=134.15 x<0=0.07 elig=0.60 dorfler_tail=0.06 floor=0 sel=32 n_ref=0 r_loc=0.000 7.4s
79/401 | loss=0.5819 ev=0.342 agents=224 avg_r=0.4114 sum_r=105.33 x<0=0.07 elig=0.60 dorfler_tail=0.07 floor=0 sel=34 n_ref=0 r_loc=0.000 7.6s
80/401 | loss=0.6512 ev=0.300 agents=193 avg_r=-1.0909 sum_r=-279.28 x<0=0.08 elig=0.60 dorfler_tail=0.07 floor=0 sel=33 n_ref=0 r_loc=0.000 7.4s
81/401 | loss=0.7695 ev=0.337 agents=87 avg_r=1.4936 sum_r=382.37 x<0=0.10 elig=0.61 dorfler_tail=0.06 floor=0 sel=33 n_ref=0 r_loc=0.000 7.4s
82/401 | loss=0.4945 ev=0.261 agents=103 avg_r=0.7102 sum_r=181.81 x<0=0.09 elig=0.60 dorfler_tail=0.07 floor=0 sel=30 n_ref=0 r_loc=0.000 7.2s
83/401 | loss=0.6859 ev=0.345 agents=34 avg_r=1.0995 sum_r=281.47 x<0=0.16 elig=0.60 dorfler_tail=0.07 floor=0 sel=35 n_ref=0 r_loc=0.000 7.6s
84/401 | loss=0.6656 ev=0.273 agents=111 avg_r=2.1667 sum_r=554.67 x<0=0.18 elig=0.60 dorfler_tail=0.07 floor=0 sel=36 n_ref=0 r_loc=0.000 7.6s
85/401 | loss=0.6877 ev=0.281 agents=85 avg_r=-1.2801 sum_r=-327.71 x<0=0.17 elig=0.60 dorfler_tail=0.06 floor=0 sel=30 n_ref=0 r_loc=0.000 7.1s
86/401 | loss=0.6557 ev=0.299 agents=174 avg_r=1.0104 sum_r=258.67 x<0=0.18 elig=0.60 dorfler_tail=0.07 floor=0 sel=32 n_ref=0 r_loc=0.000 7.3s
87/401 | loss=0.6198 ev=0.312 agents=158 avg_r=0.2309 sum_r=59.11 x<0=0.17 elig=0.60 dorfler_tail=0.07 floor=0 sel=33 n_ref=0 r_loc=0.000 7.4s
88/401 | loss=0.6287 ev=0.358 agents=48 avg_r=1.5747 sum_r=403.13 x<0=0.17 elig=0.61 dorfler_tail=0.06 floor=0 sel=31 n_ref=0 r_loc=0.000 7.2s
89/401 | loss=0.6695 ev=0.294 agents=34 avg_r=1.2450 sum_r=318.72 x<0=0.20 elig=0.60 dorfler_tail=0.07 floor=0 sel=36 n_ref=0 r_loc=0.000 7.7s
90/401 | loss=0.6368 ev=0.292 agents=34 avg_r=-1.0354 sum_r=-265.05 x<0=0.20 elig=0.60 dorfler_tail=0.07 floor=0 sel=31 n_ref=0 r_loc=0.000 7.1s
91/401 | loss=0.5655 ev=0.267 agents=542 avg_r=1.3067 sum_r=334.51 x<0=0.23 elig=0.60 dorfler_tail=0.07 floor=0 sel=35 n_ref=0 r_loc=0.000 7.6s
92/401 | loss=0.7495 ev=0.331 agents=584 avg_r=-0.3680 sum_r=-94.22 x<0=0.23 elig=0.61 dorfler_tail=0.06 floor=0 sel=33 n_ref=0 r_loc=0.000 7.3s
93/401 | loss=0.6225 ev=0.292 agents=343 avg_r=-1.3500 sum_r=-345.59 x<0=0.24 elig=0.61 dorfler_tail=0.07 floor=0 sel=33 n_ref=0 r_loc=0.000 7.3s
94/401 | loss=0.6050 ev=0.324 agents=360 avg_r=1.3880 sum_r=355.33 x<0=0.24 elig=0.60 dorfler_tail=0.07 floor=0 sel=34 n_ref=0 r_loc=0.000 7.4s
95/401 | loss=0.6482 ev=0.322 agents=142 avg_r=-0.5954 sum_r=-152.42 x<0=0.22 elig=0.61 dorfler_tail=0.06 floor=0 sel=32 n_ref=0 r_loc=0.000 7.2s
96/401 | loss=0.5924 ev=0.338 agents=258 avg_r=0.4584 sum_r=117.36 x<0=0.23 elig=0.60 dorfler_tail=0.07 floor=0 sel=36 n_ref=0 r_loc=0.000 7.6s
97/401 | loss=0.6026 ev=0.267 agents=133 avg_r=-0.5686 sum_r=-145.57 x<0=0.24 elig=0.60 dorfler_tail=0.07 floor=0 sel=30 n_ref=0 r_loc=0.000 7.0s
98/401 | loss=0.7563 ev=0.356 agents=665 avg_r=-0.4694 sum_r=-120.17 x<0=0.24 elig=0.61 dorfler_tail=0.06 floor=0 sel=33 n_ref=0 r_loc=0.000 7.3s
99/401 | loss=0.5980 ev=0.296 agents=899 avg_r=1.6428 sum_r=420.56 x<0=0.25 elig=0.60 dorfler_tail=0.07 floor=0 sel=34 n_ref=0 r_loc=0.000 7.7s
100/401 | loss=0.6262 ev=0.318 agents=34 avg_r=-1.1789 sum_r=-301.80 x<0=0.25 elig=0.60 dorfler_tail=0.07 floor=0 sel=32 n_ref=0 r_loc=0.000 7.7s
[Checkpoint] saved → checkpoints/model_iter0100.pt
101/401 | loss=0.6111 ev=0.312 agents=87 avg_r=-1.0703 sum_r=-274.00 x<0=0.26 elig=0.61 dorfler_tail=0.07 floor=0 sel=33 n_ref=0 r_loc=0.000 7.5s
102/401 | loss=0.6306 ev=0.317 agents=1082 avg_r=2.7796 sum_r=711.58 x<0=0.26 elig=0.60 dorfler_tail=0.07 floor=0 sel=34 n_ref=0 r_loc=0.000 7.5s
103/401 | loss=0.8435 ev=0.283 agents=491 avg_r=-1.3251 sum_r=-339.23 x<0=0.26 elig=0.61 dorfler_tail=0.06 floor=0 sel=34 n_ref=0 r_loc=0.000 7.4s
104/401 | loss=0.6451 ev=0.303 agents=161 avg_r=-2.2744 sum_r=-582.24 x<0=0.26 elig=0.61 dorfler_tail=0.07 floor=0 sel=33 n_ref=0 r_loc=0.000 7.4s
105/401 | loss=0.6049 ev=0.339 agents=826 avg_r=2.9649 sum_r=759.02 x<0=0.27 elig=0.60 dorfler_tail=0.07 floor=0 sel=34 n_ref=0 r_loc=0.000 7.5s
106/401 | loss=0.6847 ev=0.265 agents=294 avg_r=-3.5720 sum_r=-914.44 x<0=0.27 elig=0.61 dorfler_tail=0.07 floor=0 sel=31 n_ref=0 r_loc=0.000 7.2s
107/401 | loss=0.6118 ev=0.322 agents=188 avg_r=0.9259 sum_r=237.02 x<0=0.27 elig=0.60 dorfler_tail=0.07 floor=0 sel=33 n_ref=0 r_loc=0.000 7.4s
108/401 | loss=0.6254 ev=0.318 agents=349 avg_r=-0.1577 sum_r=-40.38 x<0=0.28 elig=0.60 dorfler_tail=0.07 floor=0 sel=34 n_ref=0 r_loc=0.000 7.5s
109/401 | loss=0.6404 ev=0.344 agents=73 avg_r=0.0348 sum_r=8.91 x<0=0.28 elig=0.60 dorfler_tail=0.07 floor=0 sel=32 n_ref=0 r_loc=0.000 7.3s
110/401 | loss=0.5885 ev=0.342 agents=158 avg_r=0.2726 sum_r=69.79 x<0=0.28 elig=0.60 dorfler_tail=0.07 floor=0 sel=32 n_ref=0 r_loc=0.000 7.2s
111/401 | loss=0.5346 ev=0.361 agents=242 avg_r=0.6142 sum_r=157.23 x<0=0.29 elig=0.60 dorfler_tail=0.07 floor=0 sel=35 n_ref=0 r_loc=0.000 7.5s
112/401 | loss=0.7332 ev=0.326 agents=174 avg_r=-0.6867 sum_r=-175.79 x<0=0.28 elig=0.60 dorfler_tail=0.06 floor=0 sel=33 n_ref=0 r_loc=0.000 7.3s
113/401 | loss=0.6006 ev=0.370 agents=224 avg_r=0.9889 sum_r=253.17 x<0=0.28 elig=0.60 dorfler_tail=0.07 floor=0 sel=33 n_ref=0 r_loc=0.000 7.4s
114/401 | loss=0.6385 ev=0.329 agents=219 avg_r=-0.5056 sum_r=-129.44 x<0=0.27 elig=0.60 dorfler_tail=0.06 floor=0 sel=33 n_ref=0 r_loc=0.000 7.3s
115/401 | loss=0.6192 ev=0.354 agents=34 avg_r=0.2074 sum_r=53.10 x<0=0.27 elig=0.60 dorfler_tail=0.06 floor=0 sel=33 n_ref=0 r_loc=0.000 7.3s
116/401 | loss=0.5917 ev=0.337 agents=48 avg_r=1.4759 sum_r=377.84 x<0=0.28 elig=0.60 dorfler_tail=0.06 floor=0 sel=32 n_ref=0 r_loc=0.000 7.2s
117/401 | loss=0.7783 ev=0.327 agents=34 avg_r=-1.4926 sum_r=-382.10 x<0=0.27 elig=0.60 dorfler_tail=0.06 floor=0 sel=32 n_ref=0 r_loc=0.000 7.2s
118/401 | loss=0.6173 ev=0.311 agents=174 avg_r=0.8320 sum_r=212.99 x<0=0.29 elig=0.60 dorfler_tail=0.07 floor=0 sel=36 n_ref=0 r_loc=0.000 7.6s
119/401 | loss=0.5288 ev=0.320 agents=131 avg_r=-0.1760 sum_r=-45.05 x<0=0.28 elig=0.61 dorfler_tail=0.06 floor=0 sel=31 n_ref=0 r_loc=0.000 7.1s
120/401 | loss=0.7693 ev=0.368 agents=223 avg_r=-0.4147 sum_r=-106.15 x<0=0.27 elig=0.61 dorfler_tail=0.06 floor=0 sel=31 n_ref=0 r_loc=0.000 7.3s
121/401 | loss=0.6487 ev=0.256 agents=131 avg_r=1.0145 sum_r=259.72 x<0=0.28 elig=0.60 dorfler_tail=0.07 floor=0 sel=33 n_ref=0 r_loc=0.000 7.3s
122/401 | loss=0.6790 ev=0.367 agents=34 avg_r=-1.4039 sum_r=-359.39 x<0=0.26 elig=0.61 dorfler_tail=0.06 floor=0 sel=33 n_ref=0 r_loc=0.000 7.8s
123/401 | loss=0.5770 ev=0.275 agents=252 avg_r=3.0782 sum_r=788.02 x<0=0.25 elig=0.60 dorfler_tail=0.07 floor=0 sel=33 n_ref=0 r_loc=0.000 7.7s
124/401 | loss=0.7664 ev=0.367 agents=403 avg_r=-1.8521 sum_r=-474.14 x<0=0.24 elig=0.61 dorfler_tail=0.06 floor=0 sel=31 n_ref=0 r_loc=0.000 7.4s
125/401 | loss=0.5949 ev=0.260 agents=620 avg_r=-0.5130 sum_r=-131.34 x<0=0.25 elig=0.60 dorfler_tail=0.07 floor=0 sel=32 n_ref=0 r_loc=0.000 7.5s
126/401 | loss=0.6167 ev=0.382 agents=1119 avg_r=0.2129 sum_r=54.51 x<0=0.22 elig=0.61 dorfler_tail=0.06 floor=0 sel=31 n_ref=0 r_loc=0.000 7.3s
127/401 | loss=0.5372 ev=0.346 agents=1267 avg_r=1.6754 sum_r=428.90 x<0=0.24 elig=0.60 dorfler_tail=0.07 floor=0 sel=33 n_ref=0 r_loc=0.000 7.4s
128/401 | loss=0.7640 ev=0.335 agents=273 avg_r=0.4446 sum_r=113.82 x<0=0.23 elig=0.61 dorfler_tail=0.06 floor=0 sel=31 n_ref=0 r_loc=0.000 7.3s
129/401 | loss=0.5504 ev=0.270 agents=1254 avg_r=-0.8846 sum_r=-226.47 x<0=0.24 elig=0.60 dorfler_tail=0.07 floor=0 sel=32 n_ref=0 r_loc=0.000 7.3s
130/401 | loss=0.5687 ev=0.387 agents=111 avg_r=0.7564 sum_r=193.63 x<0=0.22 elig=0.61 dorfler_tail=0.06 floor=0 sel=32 n_ref=0 r_loc=0.000 7.3s
131/401 | loss=0.7015 ev=0.301 agents=34 avg_r=-1.3658 sum_r=-349.63 x<0=0.22 elig=0.60 dorfler_tail=0.06 floor=0 sel=34 n_ref=0 r_loc=0.000 7.5s
132/401 | loss=0.6005 ev=0.384 agents=204 avg_r=2.4500 sum_r=627.21 x<0=0.21 elig=0.61 dorfler_tail=0.06 floor=0 sel=31 n_ref=0 r_loc=0.000 7.2s
133/401 | loss=0.5434 ev=0.325 agents=526 avg_r=0.8884 sum_r=227.42 x<0=0.21 elig=0.61 dorfler_tail=0.06 floor=0 sel=31 n_ref=0 r_loc=0.000 7.2s
134/401 | loss=0.5892 ev=0.354 agents=34 avg_r=-0.7723 sum_r=-197.70 x<0=0.21 elig=0.60 dorfler_tail=0.06 floor=0 sel=32 n_ref=0 r_loc=0.000 7.2s
135/401 | loss=0.5742 ev=0.352 agents=190 avg_r=0.4945 sum_r=126.58 x<0=0.22 elig=0.61 dorfler_tail=0.07 floor=0 sel=32 n_ref=0 r_loc=0.000 7.3s
136/401 | loss=0.5433 ev=0.369 agents=82 avg_r=1.3959 sum_r=357.34 x<0=0.22 elig=0.61 dorfler_tail=0.07 floor=0 sel=32 n_ref=0 r_loc=0.000 7.2s
137/401 | loss=0.6962 ev=0.361 agents=419 avg_r=1.1219 sum_r=287.20 x<0=0.21 elig=0.61 dorfler_tail=0.06 floor=0 sel=33 n_ref=0 r_loc=0.000 7.4s
138/401 | loss=0.5333 ev=0.347 agents=320 avg_r=-0.8777 sum_r=-224.69 x<0=0.20 elig=0.61 dorfler_tail=0.06 floor=0 sel=30 n_ref=0 r_loc=0.000 7.1s
139/401 | loss=0.6291 ev=0.393 agents=89 avg_r=-2.0054 sum_r=-513.38 x<0=0.21 elig=0.61 dorfler_tail=0.06 floor=0 sel=32 n_ref=0 r_loc=0.000 7.2s
140/401 | loss=0.5229 ev=0.277 agents=556 avg_r=1.0066 sum_r=257.69 x<0=0.20 elig=0.60 dorfler_tail=0.07 floor=0 sel=31 n_ref=0 r_loc=0.000 7.1s
141/401 | loss=0.7257 ev=0.369 agents=301 avg_r=1.0365 sum_r=265.35 x<0=0.21 elig=0.61 dorfler_tail=0.06 floor=0 sel=33 n_ref=0 r_loc=0.000 7.4s
142/401 | loss=0.5885 ev=0.356 agents=344 avg_r=0.2587 sum_r=66.23 x<0=0.21 elig=0.61 dorfler_tail=0.06 floor=0 sel=32 n_ref=0 r_loc=0.000 7.2s
143/401 | loss=0.6219 ev=0.407 agents=66 avg_r=-0.0013 sum_r=-0.34 x<0=0.21 elig=0.61 dorfler_tail=0.06 floor=0 sel=33 n_ref=0 r_loc=0.000 7.2s
144/401 | loss=0.6111 ev=0.349 agents=429 avg_r=0.7761 sum_r=198.68 x<0=0.23 elig=0.61 dorfler_tail=0.07 floor=0 sel=33 n_ref=0 r_loc=0.000 7.6s
145/401 | loss=0.4913 ev=0.237 agents=34 avg_r=-1.9325 sum_r=-494.72 x<0=0.20 elig=0.60 dorfler_tail=0.07 floor=0 sel=29 n_ref=0 r_loc=0.000 6.9s
146/401 | loss=0.6959 ev=0.388 agents=151 avg_r=0.5241 sum_r=134.16 x<0=0.23 elig=0.61 dorfler_tail=0.07 floor=0 sel=34 n_ref=0 r_loc=0.000 7.4s
147/401 | loss=0.5916 ev=0.367 agents=226 avg_r=1.0964 sum_r=280.67 x<0=0.21 elig=0.61 dorfler_tail=0.06 floor=0 sel=31 n_ref=0 r_loc=0.000 7.7s
148/401 | loss=0.6063 ev=0.321 agents=549 avg_r=-1.3176 sum_r=-337.29 x<0=0.22 elig=0.60 dorfler_tail=0.06 floor=0 sel=31 n_ref=0 r_loc=0.000 7.4s
149/401 | loss=0.5880 ev=0.369 agents=144 avg_r=-0.5012 sum_r=-128.32 x<0=0.23 elig=0.61 dorfler_tail=0.07 floor=0 sel=32 n_ref=0 r_loc=0.000 7.5s
150/401 | loss=0.7330 ev=0.336 agents=93 avg_r=-0.9342 sum_r=-239.16 x<0=0.20 elig=0.62 dorfler_tail=0.06 floor=0 sel=28 n_ref=0 r_loc=0.000 7.1s
[Checkpoint] saved → checkpoints/model_iter0150.pt
151/401 | loss=0.5344 ev=0.326 agents=232 avg_r=0.5301 sum_r=135.71 x<0=0.23 elig=0.60 dorfler_tail=0.07 floor=0 sel=34 n_ref=0 r_loc=0.000 7.5s
152/401 | loss=0.4994 ev=0.361 agents=76 avg_r=1.3224 sum_r=338.52 x<0=0.22 elig=0.61 dorfler_tail=0.06 floor=0 sel=31 n_ref=0 r_loc=0.000 7.2s
153/401 | loss=0.7887 ev=0.381 agents=165 avg_r=-1.4365 sum_r=-367.74 x<0=0.22 elig=0.61 dorfler_tail=0.06 floor=0 sel=32 n_ref=0 r_loc=0.000 7.3s
154/401 | loss=0.5708 ev=0.353 agents=227 avg_r=0.6867 sum_r=175.79 x<0=0.22 elig=0.61 dorfler_tail=0.07 floor=0 sel=34 n_ref=0 r_loc=0.000 7.5s
155/401 | loss=0.5476 ev=0.372 agents=184 avg_r=-0.1764 sum_r=-45.17 x<0=0.20 elig=0.60 dorfler_tail=0.06 floor=0 sel=30 n_ref=0 r_loc=0.000 7.1s
156/401 | loss=0.5947 ev=0.350 agents=296 avg_r=-0.1529 sum_r=-39.15 x<0=0.21 elig=0.61 dorfler_tail=0.07 floor=0 sel=32 n_ref=0 r_loc=0.000 7.3s
157/401 | loss=0.5219 ev=0.399 agents=66 avg_r=0.6051 sum_r=154.90 x<0=0.21 elig=0.60 dorfler_tail=0.06 floor=0 sel=33 n_ref=0 r_loc=0.000 7.3s
158/401 | loss=0.6396 ev=0.393 agents=34 avg_r=0.4283 sum_r=109.63 x<0=0.19 elig=0.61 dorfler_tail=0.06 floor=0 sel=29 n_ref=0 r_loc=0.000 7.1s
159/401 | loss=0.5693 ev=0.382 agents=805 avg_r=1.2933 sum_r=331.08 x<0=0.21 elig=0.60 dorfler_tail=0.06 floor=0 sel=34 n_ref=0 r_loc=0.000 7.4s
160/401 | loss=0.5833 ev=0.338 agents=84 avg_r=-1.8923 sum_r=-484.43 x<0=0.21 elig=0.61 dorfler_tail=0.06 floor=0 sel=30 n_ref=0 r_loc=0.000 7.1s
161/401 | loss=0.5746 ev=0.340 agents=549 avg_r=-0.2881 sum_r=-73.75 x<0=0.23 elig=0.60 dorfler_tail=0.07 floor=0 sel=34 n_ref=0 r_loc=0.000 7.4s
162/401 | loss=0.6617 ev=0.402 agents=144 avg_r=-0.0799 sum_r=-20.45 x<0=0.22 elig=0.61 dorfler_tail=0.06 floor=0 sel=31 n_ref=0 r_loc=0.000 7.2s
163/401 | loss=0.5360 ev=0.314 agents=87 avg_r=0.4493 sum_r=115.02 x<0=0.24 elig=0.60 dorfler_tail=0.07 floor=0 sel=33 n_ref=0 r_loc=0.000 7.4s
164/401 | loss=0.5845 ev=0.329 agents=1107 avg_r=-1.3259 sum_r=-339.43 x<0=0.22 elig=0.61 dorfler_tail=0.06 floor=0 sel=30 n_ref=0 r_loc=0.000 7.1s
165/401 | loss=0.5861 ev=0.369 agents=340 avg_r=-1.7656 sum_r=-452.00 x<0=0.24 elig=0.61 dorfler_tail=0.07 floor=0 sel=31 n_ref=0 r_loc=0.000 7.2s
166/401 | loss=0.5568 ev=0.429 agents=142 avg_r=2.4693 sum_r=632.13 x<0=0.26 elig=0.61 dorfler_tail=0.06 floor=0 sel=32 n_ref=0 r_loc=0.000 7.4s
167/401 | loss=0.6408 ev=0.325 agents=235 avg_r=-1.4679 sum_r=-375.77 x<0=0.26 elig=0.61 dorfler_tail=0.07 floor=0 sel=32 n_ref=0 r_loc=0.000 7.4s
168/401 | loss=0.5684 ev=0.360 agents=81 avg_r=-0.1609 sum_r=-41.19 x<0=0.26 elig=0.61 dorfler_tail=0.06 floor=0 sel=32 n_ref=0 r_loc=0.000 7.2s
169/401 | loss=0.6655 ev=0.398 agents=1068 avg_r=-0.0692 sum_r=-17.71 x<0=0.25 elig=0.61 dorfler_tail=0.06 floor=0 sel=31 n_ref=0 r_loc=0.000 7.6s
170/401 | loss=0.5322 ev=0.278 agents=219 avg_r=-0.4841 sum_r=-123.92 x<0=0.25 elig=0.62 dorfler_tail=0.07 floor=0 sel=31 n_ref=0 r_loc=0.000 7.8s
171/401 | loss=0.5651 ev=0.348 agents=175 avg_r=-0.9866 sum_r=-252.57 x<0=0.26 elig=0.61 dorfler_tail=0.07 floor=0 sel=30 n_ref=0 r_loc=0.000 7.3s
172/401 | loss=0.6972 ev=0.365 agents=200 avg_r=-1.4787 sum_r=-378.56 x<0=0.26 elig=0.61 dorfler_tail=0.07 floor=0 sel=32 n_ref=0 r_loc=0.000 7.5s
173/401 | loss=0.5219 ev=0.333 agents=75 avg_r=0.9503 sum_r=243.28 x<0=0.25 elig=0.61 dorfler_tail=0.07 floor=0 sel=30 n_ref=0 r_loc=0.000 7.2s
174/401 | loss=0.7200 ev=0.356 agents=198 avg_r=-1.1237 sum_r=-287.66 x<0=0.27 elig=0.61 dorfler_tail=0.06 floor=0 sel=34 n_ref=0 r_loc=0.000 7.7s
175/401 | loss=0.5611 ev=0.380 agents=518 avg_r=0.1212 sum_r=31.02 x<0=0.26 elig=0.61 dorfler_tail=0.07 floor=0 sel=31 n_ref=0 r_loc=0.000 7.2s
176/401 | loss=0.6726 ev=0.400 agents=100 avg_r=0.6386 sum_r=163.47 x<0=0.25 elig=0.61 dorfler_tail=0.06 floor=0 sel=32 n_ref=0 r_loc=0.000 7.4s
177/401 | loss=0.4632 ev=0.317 agents=526 avg_r=0.1369 sum_r=35.05 x<0=0.25 elig=0.60 dorfler_tail=0.07 floor=0 sel=31 n_ref=0 r_loc=0.000 7.2s
178/401 | loss=0.6494 ev=0.344 agents=220 avg_r=-2.4843 sum_r=-635.98 x<0=0.24 elig=0.61 dorfler_tail=0.07 floor=0 sel=32 n_ref=0 r_loc=0.000 7.3s
179/401 | loss=0.5324 ev=0.361 agents=726 avg_r=-0.2240 sum_r=-57.34 x<0=0.25 elig=0.61 dorfler_tail=0.06 floor=0 sel=33 n_ref=0 r_loc=0.000 7.3s
180/401 | loss=0.6761 ev=0.413 agents=34 avg_r=-0.8163 sum_r=-208.97 x<0=0.23 elig=0.61 dorfler_tail=0.06 floor=0 sel=31 n_ref=0 r_loc=0.000 7.2s
181/401 | loss=0.5574 ev=0.348 agents=60 avg_r=-0.3088 sum_r=-79.05 x<0=0.23 elig=0.61 dorfler_tail=0.06 floor=0 sel=31 n_ref=0 r_loc=0.000 7.2s
182/401 | loss=0.5345 ev=0.374 agents=972 avg_r=-0.4068 sum_r=-104.14 x<0=0.24 elig=0.60 dorfler_tail=0.07 floor=0 sel=33 n_ref=0 r_loc=0.000 7.4s
183/401 | loss=0.5651 ev=0.371 agents=100 avg_r=0.0724 sum_r=18.54 x<0=0.22 elig=0.61 dorfler_tail=0.07 floor=0 sel=30 n_ref=0 r_loc=0.000 7.2s
184/401 | loss=0.7592 ev=0.345 agents=72 avg_r=-1.9106 sum_r=-489.12 x<0=0.21 elig=0.61 dorfler_tail=0.06 floor=0 sel=31 n_ref=0 r_loc=0.000 7.2s
185/401 | loss=0.5137 ev=0.370 agents=436 avg_r=1.2368 sum_r=316.62 x<0=0.22 elig=0.60 dorfler_tail=0.07 floor=0 sel=32 n_ref=0 r_loc=0.000 7.4s
186/401 | loss=0.5665 ev=0.383 agents=133 avg_r=-1.6560 sum_r=-423.93 x<0=0.21 elig=0.61 dorfler_tail=0.06 floor=0 sel=32 n_ref=0 r_loc=0.000 7.2s
187/401 | loss=0.5679 ev=0.411 agents=34 avg_r=-0.2303 sum_r=-58.95 x<0=0.21 elig=0.60 dorfler_tail=0.06 floor=0 sel=31 n_ref=0 r_loc=0.000 7.1s
188/401 | loss=0.5255 ev=0.342 agents=140 avg_r=0.6738 sum_r=172.49 x<0=0.22 elig=0.61 dorfler_tail=0.07 floor=0 sel=32 n_ref=0 r_loc=0.000 7.3s
189/401 | loss=0.5645 ev=0.376 agents=898 avg_r=0.3043 sum_r=77.89 x<0=0.21 elig=0.60 dorfler_tail=0.06 floor=0 sel=32 n_ref=0 r_loc=0.000 7.3s
190/401 | loss=0.5262 ev=0.374 agents=434 avg_r=0.1856 sum_r=47.52 x<0=0.22 elig=0.60 dorfler_tail=0.07 floor=0 sel=31 n_ref=0 r_loc=0.000 7.2s
191/401 | loss=0.5633 ev=0.367 agents=429 avg_r=0.6451 sum_r=165.14 x<0=0.21 elig=0.61 dorfler_tail=0.06 floor=0 sel=32 n_ref=0 r_loc=0.000 7.2s
192/401 | loss=0.7072 ev=0.389 agents=406 avg_r=-2.2003 sum_r=-563.27 x<0=0.22 elig=0.61 dorfler_tail=0.06 floor=0 sel=33 n_ref=0 r_loc=0.000 7.8s
193/401 | loss=0.5323 ev=0.409 agents=337 avg_r=1.1695 sum_r=299.39 x<0=0.21 elig=0.61 dorfler_tail=0.07 floor=0 sel=31 n_ref=0 r_loc=0.000 7.6s
194/401 | loss=0.6203 ev=0.342 agents=156 avg_r=-1.8071 sum_r=-462.63 x<0=0.22 elig=0.61 dorfler_tail=0.06 floor=0 sel=30 n_ref=0 r_loc=0.000 7.3s
195/401 | loss=0.5161 ev=0.402 agents=85 avg_r=-0.4427 sum_r=-113.34 x<0=0.21 elig=0.61 dorfler_tail=0.06 floor=0 sel=31 n_ref=0 r_loc=0.000 7.3s
196/401 | loss=0.6093 ev=0.379 agents=379 avg_r=-0.8613 sum_r=-220.49 x<0=0.21 elig=0.61 dorfler_tail=0.06 floor=0 sel=32 n_ref=0 r_loc=0.000 7.3s
197/401 | loss=0.6390 ev=0.417 agents=176 avg_r=-0.0713 sum_r=-18.26 x<0=0.22 elig=0.61 dorfler_tail=0.07 floor=0 sel=33 n_ref=0 r_loc=0.000 7.3s
198/401 | loss=0.5660 ev=0.373 agents=387 avg_r=-1.3506 sum_r=-345.76 x<0=0.22 elig=0.61 dorfler_tail=0.06 floor=0 sel=31 n_ref=0 r_loc=0.000 7.2s
199/401 | loss=0.4968 ev=0.332 agents=139 avg_r=-0.6881 sum_r=-176.16 x<0=0.23 elig=0.61 dorfler_tail=0.06 floor=0 sel=31 n_ref=0 r_loc=0.000 7.2s
200/401 | loss=0.5646 ev=0.403 agents=539 avg_r=1.6537 sum_r=423.34 x<0=0.24 elig=0.60 dorfler_tail=0.07 floor=0 sel=35 n_ref=0 r_loc=0.000 7.5s
[Checkpoint] saved → checkpoints/model_iter0200.pt
201/401 | loss=0.5881 ev=0.359 agents=158 avg_r=-0.6809 sum_r=-174.32 x<0=0.22 elig=0.61 dorfler_tail=0.06 floor=0 sel=30 n_ref=0 r_loc=0.000 7.1s
202/401 | loss=0.5527 ev=0.373 agents=86 avg_r=0.5753 sum_r=147.28 x<0=0.23 elig=0.61 dorfler_tail=0.07 floor=0 sel=32 n_ref=0 r_loc=0.000 7.3s
203/401 | loss=0.6413 ev=0.392 agents=824 avg_r=0.1860 sum_r=47.62 x<0=0.22 elig=0.61 dorfler_tail=0.06 floor=0 sel=32 n_ref=0 r_loc=0.000 7.3s
204/401 | loss=0.5117 ev=0.341 agents=198 avg_r=-0.4617 sum_r=-118.20 x<0=0.22 elig=0.60 dorfler_tail=0.07 floor=0 sel=32 n_ref=0 r_loc=0.000 7.3s
205/401 | loss=0.6845 ev=0.402 agents=53 avg_r=-2.0145 sum_r=-515.71 x<0=0.23 elig=0.61 dorfler_tail=0.06 floor=0 sel=33 n_ref=0 r_loc=0.000 7.3s
206/401 | loss=0.4670 ev=0.339 agents=133 avg_r=0.5982 sum_r=153.13 x<0=0.21 elig=0.61 dorfler_tail=0.07 floor=0 sel=29 n_ref=0 r_loc=0.000 7.0s
207/401 | loss=0.5664 ev=0.369 agents=1222 avg_r=0.9834 sum_r=251.75 x<0=0.23 elig=0.60 dorfler_tail=0.07 floor=0 sel=34 n_ref=0 r_loc=0.000 7.4s
208/401 | loss=0.6963 ev=0.385 agents=80 avg_r=-2.0704 sum_r=-530.03 x<0=0.19 elig=0.61 dorfler_tail=0.06 floor=0 sel=30 n_ref=0 r_loc=0.000 7.1s
209/401 | loss=0.5655 ev=0.367 agents=563 avg_r=1.0998 sum_r=281.55 x<0=0.21 elig=0.60 dorfler_tail=0.07 floor=0 sel=32 n_ref=0 r_loc=0.000 7.3s
210/401 | loss=0.5638 ev=0.385 agents=736 avg_r=-0.6709 sum_r=-171.76 x<0=0.19 elig=0.61 dorfler_tail=0.07 floor=0 sel=32 n_ref=0 r_loc=0.000 7.3s
211/401 | loss=0.4561 ev=0.421 agents=1554 avg_r=0.3749 sum_r=95.98 x<0=0.19 elig=0.60 dorfler_tail=0.07 floor=0 sel=32 n_ref=0 r_loc=0.000 7.2s
212/401 | loss=0.7065 ev=0.398 agents=34 avg_r=0.3088 sum_r=79.06 x<0=0.21 elig=0.61 dorfler_tail=0.06 floor=0 sel=32 n_ref=0 r_loc=0.000 7.2s
213/401 | loss=0.5221 ev=0.311 agents=34 avg_r=-3.9111 sum_r=-1001.24 x<0=0.21 elig=0.60 dorfler_tail=0.07 floor=0 sel=31 n_ref=0 r_loc=0.000 7.1s
214/401 | loss=0.6268 ev=0.406 agents=207 avg_r=0.6081 sum_r=155.67 x<0=0.20 elig=0.61 dorfler_tail=0.06 floor=0 sel=31 n_ref=0 r_loc=0.000 7.1s
215/401 | loss=0.6910 ev=0.417 agents=161 avg_r=-0.4418 sum_r=-113.09 x<0=0.21 elig=0.61 dorfler_tail=0.06 floor=0 sel=31 n_ref=0 r_loc=0.000 7.6s
216/401 | loss=0.5559 ev=0.355 agents=300 avg_r=-0.1959 sum_r=-50.14 x<0=0.22 elig=0.61 dorfler_tail=0.06 floor=0 sel=32 n_ref=0 r_loc=0.000 7.5s
217/401 | loss=0.5544 ev=0.384 agents=133 avg_r=-2.2292 sum_r=-570.67 x<0=0.20 elig=0.60 dorfler_tail=0.06 floor=0 sel=30 n_ref=0 r_loc=0.000 7.1s
218/401 | loss=0.5503 ev=0.386 agents=1380 avg_r=0.2610 sum_r=66.83 x<0=0.22 elig=0.61 dorfler_tail=0.07 floor=0 sel=36 n_ref=0 r_loc=0.000 7.7s
219/401 | loss=0.5591 ev=0.380 agents=441 avg_r=-1.7828 sum_r=-456.41 x<0=0.19 elig=0.61 dorfler_tail=0.07 floor=0 sel=29 n_ref=0 r_loc=0.000 7.0s
220/401 | loss=0.6269 ev=0.447 agents=337 avg_r=0.6625 sum_r=169.59 x<0=0.21 elig=0.61 dorfler_tail=0.06 floor=0 sel=32 n_ref=0 r_loc=0.000 7.3s
221/401 | loss=0.5442 ev=0.337 agents=48 avg_r=0.6702 sum_r=171.58 x<0=0.22 elig=0.60 dorfler_tail=0.07 floor=0 sel=32 n_ref=0 r_loc=0.000 7.2s
222/401 | loss=0.5796 ev=0.373 agents=209 avg_r=-0.7158 sum_r=-183.25 x<0=0.22 elig=0.61 dorfler_tail=0.07 floor=0 sel=32 n_ref=0 r_loc=0.000 7.3s
223/401 | loss=0.5371 ev=0.400 agents=328 avg_r=-0.1674 sum_r=-42.86 x<0=0.21 elig=0.61 dorfler_tail=0.07 floor=0 sel=30 n_ref=0 r_loc=0.000 7.0s
224/401 | loss=0.6295 ev=0.416 agents=121 avg_r=-0.6457 sum_r=-165.30 x<0=0.22 elig=0.61 dorfler_tail=0.06 floor=0 sel=31 n_ref=0 r_loc=0.000 7.2s
225/401 | loss=0.4862 ev=0.367 agents=244 avg_r=1.1177 sum_r=286.12 x<0=0.23 elig=0.60 dorfler_tail=0.07 floor=0 sel=33 n_ref=0 r_loc=0.000 7.3s
226/401 | loss=0.5710 ev=0.360 agents=175 avg_r=-0.2754 sum_r=-70.49 x<0=0.23 elig=0.61 dorfler_tail=0.07 floor=0 sel=32 n_ref=0 r_loc=0.000 7.3s
227/401 | loss=0.5945 ev=0.353 agents=34 avg_r=-3.3050 sum_r=-846.07 x<0=0.21 elig=0.61 dorfler_tail=0.06 floor=0 sel=31 n_ref=0 r_loc=0.000 7.2s
228/401 | loss=0.6549 ev=0.416 agents=159 avg_r=-0.3421 sum_r=-87.59 x<0=0.21 elig=0.61 dorfler_tail=0.06 floor=0 sel=32 n_ref=0 r_loc=0.000 7.2s
229/401 | loss=0.5569 ev=0.402 agents=142 avg_r=0.4867 sum_r=124.59 x<0=0.20 elig=0.61 dorfler_tail=0.07 floor=0 sel=32 n_ref=0 r_loc=0.000 7.3s
230/401 | loss=0.6834 ev=0.416 agents=432 avg_r=-1.3377 sum_r=-342.44 x<0=0.22 elig=0.61 dorfler_tail=0.06 floor=0 sel=33 n_ref=0 r_loc=0.000 7.3s
231/401 | loss=0.5048 ev=0.346 agents=299 avg_r=-0.3187 sum_r=-81.60 x<0=0.22 elig=0.61 dorfler_tail=0.07 floor=0 sel=30 n_ref=0 r_loc=0.000 7.1s
232/401 | loss=0.7049 ev=0.413 agents=78 avg_r=-0.6128 sum_r=-156.89 x<0=0.22 elig=0.61 dorfler_tail=0.06 floor=0 sel=33 n_ref=0 r_loc=0.000 7.3s
233/401 | loss=0.4813 ev=0.343 agents=36 avg_r=0.3085 sum_r=78.97 x<0=0.21 elig=0.61 dorfler_tail=0.07 floor=0 sel=29 n_ref=0 r_loc=0.000 6.9s
234/401 | loss=0.5862 ev=0.354 agents=333 avg_r=1.7158 sum_r=439.25 x<0=0.25 elig=0.61 dorfler_tail=0.07 floor=0 sel=34 n_ref=0 r_loc=0.000 7.5s
235/401 | loss=0.6787 ev=0.397 agents=34 avg_r=-1.9337 sum_r=-495.01 x<0=0.24 elig=0.61 dorfler_tail=0.06 floor=0 sel=32 n_ref=0 r_loc=0.000 7.2s
236/401 | loss=0.5569 ev=0.399 agents=193 avg_r=-0.9097 sum_r=-232.89 x<0=0.23 elig=0.61 dorfler_tail=0.07 floor=0 sel=32 n_ref=0 r_loc=0.000 7.3s
237/401 | loss=0.5414 ev=0.393 agents=103 avg_r=-1.4208 sum_r=-363.73 x<0=0.25 elig=0.61 dorfler_tail=0.06 floor=0 sel=31 n_ref=0 r_loc=0.000 7.1s
238/401 | loss=0.5549 ev=0.372 agents=48 avg_r=-1.0300 sum_r=-263.67 x<0=0.26 elig=0.61 dorfler_tail=0.07 floor=0 sel=33 n_ref=0 r_loc=0.000 7.5s
239/401 | loss=0.6030 ev=0.435 agents=896 avg_r=-0.1038 sum_r=-26.56 x<0=0.24 elig=0.61 dorfler_tail=0.06 floor=0 sel=31 n_ref=0 r_loc=0.000 7.5s
240/401 | loss=0.5383 ev=0.320 agents=48 avg_r=0.5485 sum_r=140.41 x<0=0.26 elig=0.61 dorfler_tail=0.07 floor=0 sel=32 n_ref=0 r_loc=0.000 7.4s
241/401 | loss=0.6044 ev=0.427 agents=370 avg_r=-0.7533 sum_r=-192.84 x<0=0.26 elig=0.61 dorfler_tail=0.06 floor=0 sel=33 n_ref=0 r_loc=0.000 7.7s
242/401 | loss=0.5599 ev=0.372 agents=236 avg_r=-1.5351 sum_r=-392.98 x<0=0.26 elig=0.61 dorfler_tail=0.07 floor=0 sel=30 n_ref=0 r_loc=0.000 7.1s
243/401 | loss=0.5583 ev=0.395 agents=153 avg_r=-1.1731 sum_r=-300.30 x<0=0.28 elig=0.61 dorfler_tail=0.06 floor=0 sel=31 n_ref=0 r_loc=0.000 7.3s
244/401 | loss=0.5860 ev=0.384 agents=1091 avg_r=-1.3456 sum_r=-344.48 x<0=0.27 elig=0.61 dorfler_tail=0.06 floor=0 sel=32 n_ref=0 r_loc=0.000 7.3s
245/401 | loss=0.5337 ev=0.377 agents=1349 avg_r=2.2382 sum_r=572.98 x<0=0.28 elig=0.61 dorfler_tail=0.07 floor=0 sel=32 n_ref=0 r_loc=0.000 7.4s
246/401 | loss=0.6395 ev=0.356 agents=851 avg_r=-3.1663 sum_r=-810.58 x<0=0.27 elig=0.61 dorfler_tail=0.07 floor=0 sel=31 n_ref=0 r_loc=0.000 7.2s
247/401 | loss=0.5909 ev=0.428 agents=671 avg_r=3.1579 sum_r=808.42 x<0=0.27 elig=0.61 dorfler_tail=0.06 floor=0 sel=34 n_ref=0 r_loc=0.000 7.5s
248/401 | loss=0.5679 ev=0.362 agents=219 avg_r=-4.4722 sum_r=-1144.88 x<0=0.27 elig=0.61 dorfler_tail=0.06 floor=0 sel=31 n_ref=0 r_loc=0.000 7.0s
249/401 | loss=0.4965 ev=0.384 agents=112 avg_r=-1.7098 sum_r=-437.70 x<0=0.28 elig=0.61 dorfler_tail=0.07 floor=0 sel=32 n_ref=0 r_loc=0.000 7.3s
250/401 | loss=0.5453 ev=0.411 agents=185 avg_r=0.6639 sum_r=169.96 x<0=0.26 elig=0.61 dorfler_tail=0.06 floor=0 sel=30 n_ref=0 r_loc=0.000 7.1s
[Checkpoint] saved → checkpoints/model_iter0250.pt
251/401 | loss=0.6922 ev=0.377 agents=488 avg_r=-1.7138 sum_r=-438.73 x<0=0.27 elig=0.61 dorfler_tail=0.06 floor=0 sel=32 n_ref=0 r_loc=0.000 7.2s
252/401 | loss=0.5444 ev=0.395 agents=193 avg_r=0.3247 sum_r=83.11 x<0=0.28 elig=0.61 dorfler_tail=0.07 floor=0 sel=34 n_ref=0 r_loc=0.000 7.4s
253/401 | loss=0.5359 ev=0.388 agents=159 avg_r=-1.5650 sum_r=-400.65 x<0=0.27 elig=0.61 dorfler_tail=0.06 floor=0 sel=30 n_ref=0 r_loc=0.000 7.1s
254/401 | loss=0.5134 ev=0.401 agents=217 avg_r=-0.0328 sum_r=-8.39 x<0=0.27 elig=0.61 dorfler_tail=0.06 floor=0 sel=33 n_ref=0 r_loc=0.000 7.4s
255/401 | loss=0.5651 ev=0.395 agents=428 avg_r=0.4327 sum_r=110.77 x<0=0.26 elig=0.61 dorfler_tail=0.06 floor=0 sel=31 n_ref=0 r_loc=0.000 7.2s
256/401 | loss=0.5563 ev=0.385 agents=497 avg_r=-0.7435 sum_r=-190.33 x<0=0.27 elig=0.61 dorfler_tail=0.07 floor=0 sel=32 n_ref=0 r_loc=0.000 7.2s
257/401 | loss=0.6860 ev=0.371 agents=34 avg_r=-0.7764 sum_r=-198.75 x<0=0.26 elig=0.61 dorfler_tail=0.06 floor=0 sel=32 n_ref=0 r_loc=0.000 7.2s
258/401 | loss=0.5434 ev=0.422 agents=1102 avg_r=-0.7016 sum_r=-179.60 x<0=0.27 elig=0.60 dorfler_tail=0.07 floor=0 sel=31 n_ref=0 r_loc=0.000 7.1s
259/401 | loss=0.5401 ev=0.403 agents=526 avg_r=-0.7190 sum_r=-184.06 x<0=0.28 elig=0.61 dorfler_tail=0.06 floor=0 sel=35 n_ref=0 r_loc=0.000 7.5s
260/401 | loss=0.5250 ev=0.369 agents=128 avg_r=-0.4536 sum_r=-116.13 x<0=0.26 elig=0.61 dorfler_tail=0.06 floor=0 sel=30 n_ref=0 r_loc=0.000 7.0s
261/401 | loss=0.5151 ev=0.353 agents=293 avg_r=-0.9870 sum_r=-252.66 x<0=0.25 elig=0.61 dorfler_tail=0.07 floor=0 sel=31 n_ref=0 r_loc=0.000 7.5s
262/401 | loss=0.6481 ev=0.430 agents=305 avg_r=-0.2456 sum_r=-62.88 x<0=0.26 elig=0.61 dorfler_tail=0.06 floor=0 sel=32 n_ref=0 r_loc=0.000 7.6s
263/401 | loss=0.5681 ev=0.403 agents=224 avg_r=0.3445 sum_r=88.20 x<0=0.26 elig=0.61 dorfler_tail=0.06 floor=0 sel=32 n_ref=0 r_loc=0.000 7.4s
264/401 | loss=0.5175 ev=0.407 agents=112 avg_r=-0.2865 sum_r=-73.34 x<0=0.26 elig=0.60 dorfler_tail=0.07 floor=0 sel=31 n_ref=0 r_loc=0.000 7.2s
265/401 | loss=0.6772 ev=0.411 agents=379 avg_r=-2.6835 sum_r=-686.99 x<0=0.25 elig=0.61 dorfler_tail=0.06 floor=0 sel=33 n_ref=0 r_loc=0.000 7.4s
266/401 | loss=0.5117 ev=0.337 agents=529 avg_r=1.9509 sum_r=499.44 x<0=0.25 elig=0.61 dorfler_tail=0.07 floor=0 sel=32 n_ref=0 r_loc=0.000 7.3s
267/401 | loss=0.6832 ev=0.418 agents=34 avg_r=-2.7091 sum_r=-693.54 x<0=0.26 elig=0.61 dorfler_tail=0.06 floor=0 sel=30 n_ref=0 r_loc=0.000 7.2s
268/401 | loss=0.5119 ev=0.416 agents=381 avg_r=-0.6775 sum_r=-173.45 x<0=0.26 elig=0.61 dorfler_tail=0.06 floor=0 sel=33 n_ref=0 r_loc=0.000 7.4s
269/401 | loss=0.6067 ev=0.360 agents=331 avg_r=-0.4300 sum_r=-110.08 x<0=0.26 elig=0.61 dorfler_tail=0.06 floor=0 sel=31 n_ref=0 r_loc=0.000 7.3s
270/401 | loss=0.5958 ev=0.361 agents=431 avg_r=-2.7872 sum_r=-713.53 x<0=0.26 elig=0.61 dorfler_tail=0.06 floor=0 sel=30 n_ref=0 r_loc=0.000 7.0s
271/401 | loss=0.5430 ev=0.468 agents=250 avg_r=2.4127 sum_r=617.66 x<0=0.27 elig=0.61 dorfler_tail=0.06 floor=0 sel=32 n_ref=0 r_loc=0.000 7.3s
272/401 | loss=0.5570 ev=0.396 agents=195 avg_r=-3.9342 sum_r=-1007.15 x<0=0.26 elig=0.61 dorfler_tail=0.07 floor=0 sel=31 n_ref=0 r_loc=0.000 7.2s
273/401 | loss=0.5044 ev=0.347 agents=689 avg_r=-1.4386 sum_r=-368.28 x<0=0.27 elig=0.60 dorfler_tail=0.07 floor=0 sel=33 n_ref=0 r_loc=0.000 7.4s
274/401 | loss=0.6166 ev=0.441 agents=235 avg_r=0.2971 sum_r=76.05 x<0=0.27 elig=0.61 dorfler_tail=0.06 floor=0 sel=32 n_ref=0 r_loc=0.000 7.3s
275/401 | loss=0.5763 ev=0.349 agents=245 avg_r=-1.4691 sum_r=-376.08 x<0=0.26 elig=0.61 dorfler_tail=0.06 floor=0 sel=31 n_ref=0 r_loc=0.000 7.2s
276/401 | loss=0.5384 ev=0.407 agents=275 avg_r=-1.0088 sum_r=-258.25 x<0=0.26 elig=0.61 dorfler_tail=0.06 floor=0 sel=31 n_ref=0 r_loc=0.000 7.2s
277/401 | loss=0.6362 ev=0.424 agents=244 avg_r=0.3209 sum_r=82.14 x<0=0.26 elig=0.61 dorfler_tail=0.06 floor=0 sel=31 n_ref=0 r_loc=0.000 7.2s
278/401 | loss=0.5336 ev=0.314 agents=100 avg_r=-2.8569 sum_r=-731.36 x<0=0.25 elig=0.61 dorfler_tail=0.07 floor=0 sel=29 n_ref=0 r_loc=0.000 7.1s
279/401 | loss=0.6352 ev=0.424 agents=280 avg_r=0.4295 sum_r=109.95 x<0=0.27 elig=0.61 dorfler_tail=0.07 floor=0 sel=34 n_ref=0 r_loc=0.000 7.5s
280/401 | loss=0.5223 ev=0.365 agents=280 avg_r=1.8529 sum_r=474.35 x<0=0.25 elig=0.61 dorfler_tail=0.07 floor=0 sel=30 n_ref=0 r_loc=0.000 7.1s
281/401 | loss=0.6468 ev=0.442 agents=84 avg_r=-2.3205 sum_r=-594.05 x<0=0.28 elig=0.61 dorfler_tail=0.06 floor=0 sel=34 n_ref=0 r_loc=0.000 7.3s
282/401 | loss=0.6596 ev=0.413 agents=472 avg_r=-0.4806 sum_r=-123.04 x<0=0.26 elig=0.61 dorfler_tail=0.06 floor=0 sel=31 n_ref=0 r_loc=0.000 7.2s
283/401 | loss=0.4776 ev=0.352 agents=72 avg_r=-1.7717 sum_r=-453.56 x<0=0.27 elig=0.60 dorfler_tail=0.07 floor=0 sel=32 n_ref=0 r_loc=0.000 7.2s
284/401 | loss=0.6458 ev=0.423 agents=159 avg_r=0.2598 sum_r=66.52 x<0=0.26 elig=0.61 dorfler_tail=0.06 floor=0 sel=32 n_ref=0 r_loc=0.000 7.7s
285/401 | loss=0.6260 ev=0.352 agents=215 avg_r=-0.5077 sum_r=-129.98 x<0=0.27 elig=0.61 dorfler_tail=0.06 floor=0 sel=34 n_ref=0 r_loc=0.000 7.8s
286/401 | loss=0.4547 ev=0.354 agents=259 avg_r=0.6267 sum_r=160.43 x<0=0.26 elig=0.60 dorfler_tail=0.07 floor=0 sel=29 n_ref=0 r_loc=0.000 7.1s
287/401 | loss=0.5419 ev=0.376 agents=452 avg_r=-2.1155 sum_r=-541.58 x<0=0.26 elig=0.61 dorfler_tail=0.06 floor=0 sel=30 n_ref=0 r_loc=0.000 7.1s
288/401 | loss=0.6451 ev=0.428 agents=1442 avg_r=-0.0228 sum_r=-5.83 x<0=0.27 elig=0.61 dorfler_tail=0.07 floor=0 sel=34 n_ref=0 r_loc=0.000 7.5s
289/401 | loss=0.5450 ev=0.397 agents=137 avg_r=1.1484 sum_r=293.99 x<0=0.26 elig=0.61 dorfler_tail=0.06 floor=0 sel=33 n_ref=0 r_loc=0.000 7.4s
290/401 | loss=0.5728 ev=0.385 agents=686 avg_r=-3.4156 sum_r=-874.40 x<0=0.25 elig=0.61 dorfler_tail=0.06 floor=0 sel=30 n_ref=0 r_loc=0.000 7.1s
291/401 | loss=0.5499 ev=0.405 agents=514 avg_r=1.9201 sum_r=491.55 x<0=0.25 elig=0.61 dorfler_tail=0.06 floor=0 sel=32 n_ref=0 r_loc=0.000 7.3s
292/401 | loss=0.5678 ev=0.381 agents=244 avg_r=-1.8899 sum_r=-483.81 x<0=0.27 elig=0.60 dorfler_tail=0.07 floor=0 sel=32 n_ref=0 r_loc=0.000 7.3s
293/401 | loss=0.6316 ev=0.441 agents=224 avg_r=-2.8545 sum_r=-730.75 x<0=0.26 elig=0.61 dorfler_tail=0.06 floor=0 sel=30 n_ref=0 r_loc=0.000 7.1s
294/401 | loss=0.5186 ev=0.350 agents=100 avg_r=1.1642 sum_r=298.03 x<0=0.25 elig=0.61 dorfler_tail=0.07 floor=0 sel=33 n_ref=0 r_loc=0.000 7.4s
295/401 | loss=0.6109 ev=0.428 agents=78 avg_r=-1.6792 sum_r=-429.87 x<0=0.25 elig=0.61 dorfler_tail=0.06 floor=0 sel=31 n_ref=0 r_loc=0.000 7.2s
296/401 | loss=0.5862 ev=0.366 agents=76 avg_r=-1.0895 sum_r=-278.91 x<0=0.25 elig=0.61 dorfler_tail=0.06 floor=0 sel=30 n_ref=0 r_loc=0.000 7.2s
297/401 | loss=0.6333 ev=0.441 agents=139 avg_r=-2.3314 sum_r=-596.85 x<0=0.27 elig=0.61 dorfler_tail=0.06 floor=0 sel=34 n_ref=0 r_loc=0.000 7.4s
298/401 | loss=0.5617 ev=0.398 agents=240 avg_r=-1.6337 sum_r=-418.24 x<0=0.25 elig=0.61 dorfler_tail=0.07 floor=0 sel=30 n_ref=0 r_loc=0.000 7.1s
299/401 | loss=0.4948 ev=0.320 agents=34 avg_r=0.1841 sum_r=47.12 x<0=0.25 elig=0.61 dorfler_tail=0.07 floor=0 sel=32 n_ref=0 r_loc=0.000 7.3s
300/401 | loss=0.6482 ev=0.447 agents=413 avg_r=-1.1234 sum_r=-287.59 x<0=0.26 elig=0.61 dorfler_tail=0.06 floor=0 sel=32 n_ref=0 r_loc=0.000 7.3s
[Checkpoint] saved → checkpoints/model_iter0300.pt
301/401 | loss=0.6045 ev=0.323 agents=556 avg_r=-0.8391 sum_r=-214.80 x<0=0.25 elig=0.61 dorfler_tail=0.07 floor=0 sel=31 n_ref=0 r_loc=0.000 7.2s
302/401 | loss=0.5194 ev=0.405 agents=207 avg_r=-1.0090 sum_r=-258.30 x<0=0.25 elig=0.61 dorfler_tail=0.06 floor=0 sel=32 n_ref=0 r_loc=0.000 7.2s
303/401 | loss=0.5433 ev=0.412 agents=135 avg_r=-1.4167 sum_r=-362.67 x<0=0.25 elig=0.61 dorfler_tail=0.07 floor=0 sel=32 n_ref=0 r_loc=0.000 7.4s
304/401 | loss=0.5904 ev=0.305 agents=372 avg_r=-4.1354 sum_r=-1058.66 x<0=0.24 elig=0.61 dorfler_tail=0.06 floor=0 sel=30 n_ref=0 r_loc=0.000 7.0s
305/401 | loss=0.6260 ev=0.441 agents=34 avg_r=-0.5323 sum_r=-136.27 x<0=0.24 elig=0.61 dorfler_tail=0.06 floor=0 sel=31 n_ref=0 r_loc=0.000 7.1s
306/401 | loss=0.4904 ev=0.349 agents=165 avg_r=0.4701 sum_r=120.35 x<0=0.26 elig=0.61 dorfler_tail=0.07 floor=0 sel=33 n_ref=0 r_loc=0.000 7.3s
307/401 | loss=0.6882 ev=0.399 agents=1312 avg_r=0.4548 sum_r=116.43 x<0=0.24 elig=0.61 dorfler_tail=0.06 floor=0 sel=31 n_ref=0 r_loc=0.000 7.2s
308/401 | loss=0.5244 ev=0.424 agents=887 avg_r=-1.4608 sum_r=-373.98 x<0=0.25 elig=0.61 dorfler_tail=0.07 floor=0 sel=32 n_ref=0 r_loc=0.000 7.8s
309/401 | loss=0.5516 ev=0.405 agents=34 avg_r=-0.1411 sum_r=-36.12 x<0=0.25 elig=0.61 dorfler_tail=0.07 floor=0 sel=32 n_ref=0 r_loc=0.000 7.5s
310/401 | loss=0.4932 ev=0.373 agents=141 avg_r=-2.8948 sum_r=-741.06 x<0=0.25 elig=0.61 dorfler_tail=0.06 floor=0 sel=30 n_ref=0 r_loc=0.000 7.2s
311/401 | loss=0.5420 ev=0.388 agents=1335 avg_r=0.3463 sum_r=88.64 x<0=0.24 elig=0.61 dorfler_tail=0.06 floor=0 sel=32 n_ref=0 r_loc=0.000 7.5s
312/401 | loss=0.6290 ev=0.472 agents=36 avg_r=-1.9370 sum_r=-495.88 x<0=0.25 elig=0.61 dorfler_tail=0.06 floor=0 sel=31 n_ref=0 r_loc=0.000 7.2s
313/401 | loss=0.5851 ev=0.350 agents=810 avg_r=-1.9614 sum_r=-502.11 x<0=0.25 elig=0.61 dorfler_tail=0.07 floor=0 sel=31 n_ref=0 r_loc=0.000 7.2s
314/401 | loss=0.5564 ev=0.400 agents=79 avg_r=-1.1821 sum_r=-302.61 x<0=0.24 elig=0.61 dorfler_tail=0.07 floor=0 sel=31 n_ref=0 r_loc=0.000 7.3s
315/401 | loss=0.5560 ev=0.395 agents=195 avg_r=-1.6661 sum_r=-426.52 x<0=0.25 elig=0.61 dorfler_tail=0.07 floor=0 sel=32 n_ref=0 r_loc=0.000 7.4s
316/401 | loss=0.5173 ev=0.373 agents=223 avg_r=-1.4246 sum_r=-364.69 x<0=0.23 elig=0.61 dorfler_tail=0.06 floor=0 sel=30 n_ref=0 r_loc=0.000 7.0s
317/401 | loss=0.5820 ev=0.378 agents=90 avg_r=-1.8654 sum_r=-477.54 x<0=0.24 elig=0.61 dorfler_tail=0.06 floor=0 sel=30 n_ref=0 r_loc=0.000 7.1s
318/401 | loss=0.5921 ev=0.454 agents=470 avg_r=1.8024 sum_r=461.43 x<0=0.26 elig=0.61 dorfler_tail=0.06 floor=0 sel=33 n_ref=0 r_loc=0.000 7.5s
319/401 | loss=0.5236 ev=0.425 agents=123 avg_r=-2.1968 sum_r=-562.39 x<0=0.24 elig=0.61 dorfler_tail=0.07 floor=0 sel=32 n_ref=0 r_loc=0.000 7.4s
320/401 | loss=0.5607 ev=0.371 agents=312 avg_r=-1.6211 sum_r=-415.01 x<0=0.24 elig=0.61 dorfler_tail=0.06 floor=0 sel=31 n_ref=0 r_loc=0.000 7.3s
321/401 | loss=0.5437 ev=0.416 agents=1566 avg_r=-0.8026 sum_r=-205.46 x<0=0.24 elig=0.61 dorfler_tail=0.07 floor=0 sel=31 n_ref=0 r_loc=0.000 7.3s
322/401 | loss=0.5501 ev=0.391 agents=209 avg_r=-0.7605 sum_r=-194.70 x<0=0.25 elig=0.62 dorfler_tail=0.06 floor=0 sel=30 n_ref=0 r_loc=0.000 7.3s
323/401 | loss=0.6514 ev=0.438 agents=188 avg_r=-1.3562 sum_r=-347.19 x<0=0.25 elig=0.62 dorfler_tail=0.06 floor=0 sel=33 n_ref=0 r_loc=0.000 7.5s
324/401 | loss=0.5607 ev=0.362 agents=156 avg_r=-2.3552 sum_r=-602.93 x<0=0.26 elig=0.61 dorfler_tail=0.07 floor=0 sel=32 n_ref=0 r_loc=0.000 7.4s
325/401 | loss=0.4888 ev=0.377 agents=319 avg_r=-1.3467 sum_r=-344.77 x<0=0.23 elig=0.62 dorfler_tail=0.06 floor=0 sel=30 n_ref=0 r_loc=0.000 7.2s
326/401 | loss=0.6876 ev=0.394 agents=349 avg_r=-1.9759 sum_r=-505.83 x<0=0.26 elig=0.62 dorfler_tail=0.06 floor=0 sel=31 n_ref=0 r_loc=0.000 7.2s
327/401 | loss=0.6569 ev=0.451 agents=34 avg_r=-1.8179 sum_r=-465.39 x<0=0.24 elig=0.62 dorfler_tail=0.06 floor=0 sel=32 n_ref=0 r_loc=0.000 7.3s
328/401 | loss=0.5126 ev=0.281 agents=152 avg_r=-0.5285 sum_r=-135.29 x<0=0.24 elig=0.61 dorfler_tail=0.07 floor=0 sel=29 n_ref=0 r_loc=0.000 7.1s
329/401 | loss=0.5931 ev=0.450 agents=981 avg_r=-0.2140 sum_r=-54.78 x<0=0.25 elig=0.62 dorfler_tail=0.06 floor=0 sel=32 n_ref=0 r_loc=0.000 7.4s
330/401 | loss=0.5123 ev=0.339 agents=155 avg_r=-1.5693 sum_r=-401.74 x<0=0.24 elig=0.62 dorfler_tail=0.07 floor=0 sel=29 n_ref=0 r_loc=0.000 7.1s
331/401 | loss=0.6416 ev=0.403 agents=34 avg_r=-1.7765 sum_r=-454.79 x<0=0.25 elig=0.62 dorfler_tail=0.06 floor=0 sel=33 n_ref=0 r_loc=0.000 7.7s
332/401 | loss=0.5404 ev=0.403 agents=156 avg_r=-1.6670 sum_r=-426.76 x<0=0.24 elig=0.61 dorfler_tail=0.07 floor=0 sel=31 n_ref=0 r_loc=0.000 7.8s
333/401 | loss=0.6274 ev=0.441 agents=89 avg_r=-1.2332 sum_r=-315.70 x<0=0.25 elig=0.62 dorfler_tail=0.06 floor=0 sel=33 n_ref=0 r_loc=0.000 7.7s
334/401 | loss=0.5735 ev=0.352 agents=62 avg_r=-1.9856 sum_r=-508.33 x<0=0.22 elig=0.62 dorfler_tail=0.06 floor=0 sel=29 n_ref=0 r_loc=0.000 7.3s
335/401 | loss=0.4917 ev=0.352 agents=526 avg_r=0.7029 sum_r=179.95 x<0=0.26 elig=0.61 dorfler_tail=0.07 floor=0 sel=33 n_ref=0 r_loc=0.000 7.6s
336/401 | loss=0.5990 ev=0.340 agents=132 avg_r=-3.0811 sum_r=-788.76 x<0=0.23 elig=0.62 dorfler_tail=0.06 floor=0 sel=29 n_ref=0 r_loc=0.000 7.1s
337/401 | loss=0.5901 ev=0.462 agents=84 avg_r=-1.6743 sum_r=-428.62 x<0=0.25 elig=0.62 dorfler_tail=0.06 floor=0 sel=32 n_ref=0 r_loc=0.000 7.4s
338/401 | loss=0.5888 ev=0.395 agents=72 avg_r=-1.8019 sum_r=-461.30 x<0=0.24 elig=0.62 dorfler_tail=0.06 floor=0 sel=31 n_ref=0 r_loc=0.000 7.5s
339/401 | loss=0.5367 ev=0.414 agents=144 avg_r=-0.9111 sum_r=-233.24 x<0=0.25 elig=0.61 dorfler_tail=0.07 floor=0 sel=31 n_ref=0 r_loc=0.000 7.4s
340/401 | loss=0.5691 ev=0.331 agents=175 avg_r=-4.5466 sum_r=-1163.92 x<0=0.26 elig=0.62 dorfler_tail=0.06 floor=0 sel=30 n_ref=0 r_loc=0.000 7.1s
341/401 | loss=0.6337 ev=0.447 agents=91 avg_r=-0.5287 sum_r=-135.34 x<0=0.25 elig=0.62 dorfler_tail=0.06 floor=0 sel=33 n_ref=0 r_loc=0.000 7.6s
342/401 | loss=0.5585 ev=0.361 agents=139 avg_r=1.2346 sum_r=316.07 x<0=0.25 elig=0.62 dorfler_tail=0.07 floor=0 sel=31 n_ref=0 r_loc=0.000 7.4s
343/401 | loss=0.5099 ev=0.408 agents=60 avg_r=-2.0503 sum_r=-524.87 x<0=0.25 elig=0.62 dorfler_tail=0.06 floor=0 sel=31 n_ref=0 r_loc=0.000 7.3s
344/401 | loss=0.5666 ev=0.390 agents=36 avg_r=-1.7931 sum_r=-459.04 x<0=0.24 elig=0.62 dorfler_tail=0.06 floor=0 sel=32 n_ref=0 r_loc=0.000 7.5s
345/401 | loss=0.5461 ev=0.404 agents=383 avg_r=-3.6997 sum_r=-947.13 x<0=0.24 elig=0.62 dorfler_tail=0.07 floor=0 sel=30 n_ref=0 r_loc=0.000 7.3s
346/401 | loss=0.7290 ev=0.376 agents=142 avg_r=0.2659 sum_r=68.08 x<0=0.26 elig=0.62 dorfler_tail=0.06 floor=0 sel=32 n_ref=0 r_loc=0.000 7.4s
347/401 | loss=0.4937 ev=0.428 agents=217 avg_r=-1.5564 sum_r=-398.43 x<0=0.24 elig=0.61 dorfler_tail=0.07 floor=0 sel=31 n_ref=0 r_loc=0.000 7.3s
348/401 | loss=0.5818 ev=0.337 agents=72 avg_r=-1.5159 sum_r=-388.07 x<0=0.26 elig=0.62 dorfler_tail=0.06 floor=0 sel=30 n_ref=0 r_loc=0.000 7.2s
349/401 | loss=0.5557 ev=0.396 agents=238 avg_r=-1.6126 sum_r=-412.83 x<0=0.25 elig=0.61 dorfler_tail=0.07 floor=0 sel=32 n_ref=0 r_loc=0.000 7.5s
350/401 | loss=0.5531 ev=0.390 agents=34 avg_r=-0.3411 sum_r=-87.32 x<0=0.26 elig=0.61 dorfler_tail=0.07 floor=0 sel=33 n_ref=0 r_loc=0.000 7.5s
[Checkpoint] saved → checkpoints/model_iter0350.pt
351/401 | loss=0.5428 ev=0.398 agents=682 avg_r=-0.0545 sum_r=-13.96 x<0=0.25 elig=0.61 dorfler_tail=0.07 floor=0 sel=30 n_ref=0 r_loc=0.000 7.2s
352/401 | loss=0.5971 ev=0.375 agents=1161 avg_r=-4.0630 sum_r=-1040.14 x<0=0.24 elig=0.62 dorfler_tail=0.07 floor=0 sel=31 n_ref=0 r_loc=0.000 7.4s
353/401 | loss=0.6607 ev=0.414 agents=212 avg_r=-1.9949 sum_r=-510.68 x<0=0.24 elig=0.62 dorfler_tail=0.06 floor=0 sel=30 n_ref=0 r_loc=0.000 7.1s
354/401 | loss=0.5486 ev=0.378 agents=83 avg_r=-0.9611 sum_r=-246.04 x<0=0.24 elig=0.62 dorfler_tail=0.06 floor=0 sel=30 n_ref=0 r_loc=0.000 7.3s
355/401 | loss=0.5905 ev=0.379 agents=1077 avg_r=-2.1700 sum_r=-555.53 x<0=0.26 elig=0.62 dorfler_tail=0.07 floor=0 sel=33 n_ref=0 r_loc=0.000 8.0s
356/401 | loss=0.5469 ev=0.389 agents=140 avg_r=-1.3158 sum_r=-336.85 x<0=0.26 elig=0.61 dorfler_tail=0.07 floor=0 sel=31 n_ref=0 r_loc=0.000 7.6s
357/401 | loss=0.5095 ev=0.397 agents=764 avg_r=-0.0966 sum_r=-24.72 x<0=0.24 elig=0.61 dorfler_tail=0.07 floor=0 sel=32 n_ref=0 r_loc=0.000 7.7s
358/401 | loss=0.5770 ev=0.395 agents=125 avg_r=-2.5987 sum_r=-665.27 x<0=0.25 elig=0.61 dorfler_tail=0.07 floor=0 sel=30 n_ref=0 r_loc=0.000 7.4s
359/401 | loss=0.6685 ev=0.406 agents=103 avg_r=-3.2896 sum_r=-842.13 x<0=0.23 elig=0.63 dorfler_tail=0.06 floor=0 sel=29 n_ref=0 r_loc=0.000 7.2s
360/401 | loss=0.5382 ev=0.408 agents=537 avg_r=0.4558 sum_r=116.70 x<0=0.25 elig=0.61 dorfler_tail=0.07 floor=0 sel=34 n_ref=0 r_loc=0.000 7.7s
361/401 | loss=0.5846 ev=0.384 agents=245 avg_r=-1.1329 sum_r=-290.03 x<0=0.24 elig=0.62 dorfler_tail=0.06 floor=0 sel=30 n_ref=0 r_loc=0.000 7.3s
362/401 | loss=0.5318 ev=0.404 agents=194 avg_r=-1.1031 sum_r=-282.39 x<0=0.25 elig=0.61 dorfler_tail=0.06 floor=0 sel=31 n_ref=0 r_loc=0.000 7.3s
363/401 | loss=0.6778 ev=0.410 agents=155 avg_r=-3.5161 sum_r=-900.13 x<0=0.25 elig=0.63 dorfler_tail=0.07 floor=0 sel=33 n_ref=0 r_loc=0.000 7.8s
364/401 | loss=0.5592 ev=0.387 agents=720 avg_r=-3.1739 sum_r=-812.52 x<0=0.25 elig=0.61 dorfler_tail=0.06 floor=0 sel=29 n_ref=0 r_loc=0.000 7.2s
365/401 | loss=0.5257 ev=0.340 agents=195 avg_r=1.4110 sum_r=361.21 x<0=0.24 elig=0.61 dorfler_tail=0.07 floor=0 sel=33 n_ref=0 r_loc=0.000 7.5s
366/401 | loss=0.7202 ev=0.381 agents=64 avg_r=-3.0263 sum_r=-774.72 x<0=0.24 elig=0.62 dorfler_tail=0.06 floor=0 sel=30 n_ref=0 r_loc=0.000 7.2s
367/401 | loss=0.5865 ev=0.393 agents=584 avg_r=-2.2033 sum_r=-564.05 x<0=0.24 elig=0.62 dorfler_tail=0.07 floor=0 sel=31 n_ref=0 r_loc=0.000 7.4s
368/401 | loss=0.5074 ev=0.411 agents=78 avg_r=-2.5681 sum_r=-657.44 x<0=0.25 elig=0.62 dorfler_tail=0.07 floor=0 sel=32 n_ref=0 r_loc=0.000 7.4s
369/401 | loss=0.5519 ev=0.377 agents=183 avg_r=0.4932 sum_r=126.27 x<0=0.25 elig=0.62 dorfler_tail=0.07 floor=0 sel=31 n_ref=0 r_loc=0.000 7.4s
370/401 | loss=0.5265 ev=0.397 agents=183 avg_r=-1.9064 sum_r=-488.03 x<0=0.24 elig=0.62 dorfler_tail=0.06 floor=0 sel=32 n_ref=0 r_loc=0.000 7.4s
371/401 | loss=0.6248 ev=0.468 agents=325 avg_r=-1.4349 sum_r=-367.34 x<0=0.23 elig=0.62 dorfler_tail=0.06 floor=0 sel=32 n_ref=0 r_loc=0.000 7.5s
372/401 | loss=0.6210 ev=0.368 agents=195 avg_r=-2.1573 sum_r=-552.26 x<0=0.24 elig=0.62 dorfler_tail=0.07 floor=0 sel=31 n_ref=0 r_loc=0.000 7.3s
373/401 | loss=0.5398 ev=0.381 agents=1257 avg_r=0.1999 sum_r=51.16 x<0=0.24 elig=0.61 dorfler_tail=0.07 floor=0 sel=33 n_ref=0 r_loc=0.000 7.5s
374/401 | loss=0.7041 ev=0.437 agents=140 avg_r=-2.6638 sum_r=-681.93 x<0=0.24 elig=0.63 dorfler_tail=0.06 floor=0 sel=28 n_ref=0 r_loc=0.000 7.0s
375/401 | loss=0.5560 ev=0.344 agents=1153 avg_r=-4.6746 sum_r=-1196.70 x<0=0.26 elig=0.62 dorfler_tail=0.06 floor=0 sel=33 n_ref=0 r_loc=0.000 7.6s
376/401 | loss=0.5135 ev=0.402 agents=145 avg_r=0.4112 sum_r=105.26 x<0=0.24 elig=0.62 dorfler_tail=0.06 floor=0 sel=29 n_ref=0 r_loc=0.000 7.1s
377/401 | loss=0.5797 ev=0.389 agents=476 avg_r=-1.3227 sum_r=-338.62 x<0=0.26 elig=0.62 dorfler_tail=0.07 floor=0 sel=33 n_ref=0 r_loc=0.000 7.6s
378/401 | loss=0.5229 ev=0.401 agents=80 avg_r=-1.8801 sum_r=-481.30 x<0=0.25 elig=0.62 dorfler_tail=0.06 floor=0 sel=30 n_ref=0 r_loc=0.000 7.3s
379/401 | loss=0.5683 ev=0.371 agents=94 avg_r=-2.1285 sum_r=-544.89 x<0=0.25 elig=0.62 dorfler_tail=0.06 floor=0 sel=33 n_ref=0 r_loc=0.000 8.0s
380/401 | loss=0.5654 ev=0.402 agents=196 avg_r=-2.9217 sum_r=-747.96 x<0=0.25 elig=0.62 dorfler_tail=0.07 floor=0 sel=30 n_ref=0 r_loc=0.000 7.6s
381/401 | loss=0.6029 ev=0.422 agents=76 avg_r=0.8416 sum_r=215.45 x<0=0.25 elig=0.63 dorfler_tail=0.06 floor=0 sel=30 n_ref=0 r_loc=0.000 7.6s
382/401 | loss=0.5868 ev=0.403 agents=202 avg_r=-3.3551 sum_r=-858.92 x<0=0.24 elig=0.62 dorfler_tail=0.07 floor=0 sel=33 n_ref=0 r_loc=0.000 7.8s
383/401 | loss=0.5493 ev=0.371 agents=759 avg_r=-1.1757 sum_r=-300.97 x<0=0.25 elig=0.62 dorfler_tail=0.07 floor=0 sel=30 n_ref=0 r_loc=0.000 7.4s
384/401 | loss=0.5628 ev=0.398 agents=286 avg_r=-2.6977 sum_r=-690.62 x<0=0.25 elig=0.62 dorfler_tail=0.07 floor=0 sel=31 n_ref=0 r_loc=0.000 7.5s
385/401 | loss=0.5984 ev=0.329 agents=79 avg_r=-0.9978 sum_r=-255.44 x<0=0.25 elig=0.62 dorfler_tail=0.06 floor=0 sel=30 n_ref=0 r_loc=0.000 7.4s
386/401 | loss=0.6295 ev=0.474 agents=112 avg_r=-2.3561 sum_r=-603.16 x<0=0.25 elig=0.63 dorfler_tail=0.06 floor=0 sel=32 n_ref=0 r_loc=0.000 7.6s
387/401 | loss=0.5699 ev=0.372 agents=747 avg_r=-2.0223 sum_r=-517.72 x<0=0.25 elig=0.61 dorfler_tail=0.07 floor=0 sel=31 n_ref=0 r_loc=0.000 7.4s
388/401 | loss=0.5713 ev=0.367 agents=74 avg_r=-2.6122 sum_r=-668.71 x<0=0.23 elig=0.63 dorfler_tail=0.06 floor=0 sel=30 n_ref=0 r_loc=0.000 7.4s
389/401 | loss=0.5408 ev=0.380 agents=34 avg_r=-0.7515 sum_r=-192.39 x<0=0.24 elig=0.62 dorfler_tail=0.07 floor=0 sel=32 n_ref=0 r_loc=0.000 7.5s
390/401 | loss=0.5509 ev=0.404 agents=185 avg_r=-1.0922 sum_r=-279.60 x<0=0.24 elig=0.62 dorfler_tail=0.07 floor=0 sel=31 n_ref=0 r_loc=0.000 7.5s
391/401 | loss=0.7629 ev=0.392 agents=1114 avg_r=-2.8317 sum_r=-724.91 x<0=0.24 elig=0.62 dorfler_tail=0.06 floor=0 sel=30 n_ref=0 r_loc=0.000 7.2s
392/401 | loss=0.5248 ev=0.384 agents=204 avg_r=0.4260 sum_r=109.06 x<0=0.24 elig=0.62 dorfler_tail=0.07 floor=0 sel=33 n_ref=0 r_loc=0.000 7.7s
393/401 | loss=0.5672 ev=0.383 agents=84 avg_r=-1.4752 sum_r=-377.66 x<0=0.25 elig=0.62 dorfler_tail=0.07 floor=0 sel=30 n_ref=0 r_loc=0.000 7.3s
394/401 | loss=0.5358 ev=0.420 agents=136 avg_r=-2.7112 sum_r=-694.07 x<0=0.24 elig=0.62 dorfler_tail=0.07 floor=0 sel=32 n_ref=0 r_loc=0.000 7.5s
395/401 | loss=0.5721 ev=0.385 agents=123 avg_r=-0.5855 sum_r=-149.88 x<0=0.25 elig=0.62 dorfler_tail=0.07 floor=0 sel=32 n_ref=0 r_loc=0.000 7.5s
396/401 | loss=0.6814 ev=0.430 agents=769 avg_r=-2.4388 sum_r=-624.33 x<0=0.25 elig=0.62 dorfler_tail=0.06 floor=0 sel=30 n_ref=0 r_loc=0.000 7.3s
397/401 | loss=0.4945 ev=0.420 agents=196 avg_r=-1.5640 sum_r=-400.38 x<0=0.24 elig=0.62 dorfler_tail=0.07 floor=0 sel=32 n_ref=0 r_loc=0.000 7.6s
398/401 | loss=0.5281 ev=0.308 agents=179 avg_r=-1.0618 sum_r=-271.83 x<0=0.24 elig=0.62 dorfler_tail=0.07 floor=0 sel=30 n_ref=0 r_loc=0.000 7.2s
399/401 | loss=0.7013 ev=0.408 agents=177 avg_r=-3.2987 sum_r=-844.47 x<0=0.24 elig=0.62 dorfler_tail=0.06 floor=0 sel=30 n_ref=0 r_loc=0.000 7.4s
400/401 | loss=0.5656 ev=0.374 agents=1732 avg_r=-1.8509 sum_r=-473.83 x<0=0.24 elig=0.62 dorfler_tail=0.06 floor=0 sel=31 n_ref=0 r_loc=0.000 7.3s
[Checkpoint] saved → checkpoints/model_iter0400.pt
401/401 | loss=0.5597 ev=0.432 agents=220 avg_r=-2.2646 sum_r=-579.72 x<0=0.24 elig=0.62 dorfler_tail=0.06 floor=0 sel=31 n_ref=0 r_loc=0.000 7.4s
[Checkpoint] saved → checkpoints/model_iter0401.pt
[Checkpoint] saved → checkpoints/model_final.pt
[Train] done, total time 2975.5s
Training finished at Thu 28 May 14:15:44 CST 2026

178
logs/stop150.out Normal file
View File

@ -0,0 +1,178 @@
Starting training at Fri 29 May 14:36:05 CST 2026
Running on node: node06
[Device] cuda
[Env] node_feats=14 edge_feats=1 act_dim=1
[Model] params=92,804
1/401 | loss=1.2593 ev=-0.005 agents=109 avg_r=-0.4716 sum_r=-120.74 x<0=0.69 elig=0.58 dorfler_tail=0.09 floor=0 sel=35 8.7s
2/401 | loss=1.1660 ev=0.023 agents=193 avg_r=1.8712 sum_r=479.03 x<0=0.62 elig=0.58 dorfler_tail=0.08 floor=0 sel=32 7.8s
3/401 | loss=1.1102 ev=0.044 agents=39 avg_r=-1.2724 sum_r=-325.74 x<0=0.60 elig=0.59 dorfler_tail=0.08 floor=0 sel=32 7.8s
4/401 | loss=1.1780 ev=0.065 agents=34 avg_r=2.1552 sum_r=551.73 x<0=0.61 elig=0.58 dorfler_tail=0.09 floor=0 sel=35 8.3s
5/401 | loss=1.1065 ev=0.091 agents=88 avg_r=-1.4642 sum_r=-374.83 x<0=0.52 elig=0.59 dorfler_tail=0.08 floor=0 sel=32 8.0s
6/401 | loss=1.2564 ev=0.098 agents=36 avg_r=1.5516 sum_r=397.20 x<0=0.49 elig=0.59 dorfler_tail=0.08 floor=0 sel=32 7.8s
7/401 | loss=1.0063 ev=0.172 agents=34 avg_r=0.8841 sum_r=226.33 x<0=0.47 elig=0.58 dorfler_tail=0.09 floor=0 sel=35 8.1s
8/401 | loss=1.3696 ev=0.168 agents=133 avg_r=0.6858 sum_r=175.58 x<0=0.44 elig=0.59 dorfler_tail=0.08 floor=0 sel=33 7.9s
9/401 | loss=1.1844 ev=0.215 agents=79 avg_r=0.2644 sum_r=67.68 x<0=0.45 elig=0.59 dorfler_tail=0.08 floor=0 sel=31 7.7s
10/401 | loss=1.0413 ev=0.216 agents=82 avg_r=-1.0025 sum_r=-256.64 x<0=0.42 elig=0.59 dorfler_tail=0.08 floor=0 sel=34 8.0s
11/401 | loss=1.2795 ev=0.256 agents=60 avg_r=2.6849 sum_r=687.34 x<0=0.39 elig=0.59 dorfler_tail=0.08 floor=0 sel=31 7.8s
12/401 | loss=0.8503 ev=0.306 agents=48 avg_r=0.5254 sum_r=134.49 x<0=0.40 elig=0.59 dorfler_tail=0.08 floor=0 sel=33 7.9s
13/401 | loss=0.8283 ev=0.322 agents=88 avg_r=0.9044 sum_r=231.52 x<0=0.42 elig=0.58 dorfler_tail=0.08 floor=0 sel=33 7.9s
14/401 | loss=0.8950 ev=0.298 agents=40 avg_r=0.4961 sum_r=127.00 x<0=0.39 elig=0.59 dorfler_tail=0.08 floor=0 sel=33 7.9s
15/401 | loss=0.8561 ev=0.342 agents=101 avg_r=0.5456 sum_r=139.67 x<0=0.41 elig=0.58 dorfler_tail=0.08 floor=0 sel=34 8.0s
16/401 | loss=1.1581 ev=0.283 agents=34 avg_r=-1.9177 sum_r=-490.92 x<0=0.33 elig=0.59 dorfler_tail=0.08 floor=0 sel=29 7.5s
17/401 | loss=0.8868 ev=0.364 agents=132 avg_r=3.2843 sum_r=840.77 x<0=0.33 elig=0.59 dorfler_tail=0.08 floor=0 sel=33 8.0s
18/401 | loss=0.8571 ev=0.349 agents=34 avg_r=1.1258 sum_r=288.21 x<0=0.30 elig=0.58 dorfler_tail=0.08 floor=0 sel=32 7.9s
19/401 | loss=0.7991 ev=0.374 agents=201 avg_r=-0.2317 sum_r=-59.32 x<0=0.28 elig=0.59 dorfler_tail=0.08 floor=0 sel=35 8.1s
20/401 | loss=0.8149 ev=0.386 agents=120 avg_r=1.5704 sum_r=402.02 x<0=0.21 elig=0.59 dorfler_tail=0.08 floor=0 sel=31 7.7s
21/401 | loss=0.8764 ev=0.357 agents=78 avg_r=0.5421 sum_r=138.78 x<0=0.22 elig=0.59 dorfler_tail=0.08 floor=0 sel=32 7.7s
22/401 | loss=0.7788 ev=0.367 agents=44 avg_r=0.6768 sum_r=173.27 x<0=0.17 elig=0.59 dorfler_tail=0.08 floor=0 sel=32 7.7s
23/401 | loss=0.7429 ev=0.382 agents=36 avg_r=0.6276 sum_r=160.68 x<0=0.16 elig=0.59 dorfler_tail=0.08 floor=0 sel=32 7.8s
24/401 | loss=0.8267 ev=0.404 agents=175 avg_r=3.4114 sum_r=873.33 x<0=0.13 elig=0.59 dorfler_tail=0.08 floor=0 sel=33 7.9s
25/401 | loss=0.7211 ev=0.390 agents=34 avg_r=0.2581 sum_r=66.07 x<0=0.12 elig=0.59 dorfler_tail=0.08 floor=0 sel=29 7.4s
26/401 | loss=0.9829 ev=0.350 agents=34 avg_r=-0.0098 sum_r=-2.50 x<0=0.13 elig=0.59 dorfler_tail=0.08 floor=0 sel=34 8.0s
27/401 | loss=0.7973 ev=0.356 agents=176 avg_r=0.8028 sum_r=205.51 x<0=0.12 elig=0.59 dorfler_tail=0.08 floor=0 sel=31 8.1s
28/401 | loss=0.7603 ev=0.414 agents=219 avg_r=0.7955 sum_r=203.65 x<0=0.10 elig=0.59 dorfler_tail=0.08 floor=0 sel=32 8.1s
29/401 | loss=0.7585 ev=0.375 agents=44 avg_r=1.5867 sum_r=406.19 x<0=0.09 elig=0.59 dorfler_tail=0.08 floor=0 sel=32 8.0s
30/401 | loss=0.6940 ev=0.425 agents=133 avg_r=2.4328 sum_r=622.81 x<0=0.09 elig=0.59 dorfler_tail=0.08 floor=0 sel=30 7.6s
31/401 | loss=0.9083 ev=0.370 agents=44 avg_r=2.5351 sum_r=648.99 x<0=0.13 elig=0.59 dorfler_tail=0.08 floor=0 sel=32 7.8s
32/401 | loss=1.0825 ev=0.356 agents=34 avg_r=0.0954 sum_r=24.43 x<0=0.16 elig=0.59 dorfler_tail=0.08 floor=0 sel=33 8.0s
33/401 | loss=0.6799 ev=0.430 agents=752 avg_r=2.1090 sum_r=539.90 x<0=0.15 elig=0.59 dorfler_tail=0.07 floor=0 sel=31 7.7s
34/401 | loss=1.0309 ev=0.325 agents=132 avg_r=-0.3870 sum_r=-99.07 x<0=0.14 elig=0.60 dorfler_tail=0.07 floor=0 sel=31 7.6s
35/401 | loss=0.7810 ev=0.385 agents=60 avg_r=2.1370 sum_r=547.06 x<0=0.10 elig=0.59 dorfler_tail=0.08 floor=0 sel=31 7.5s
36/401 | loss=0.7733 ev=0.381 agents=139 avg_r=0.5555 sum_r=142.22 x<0=0.09 elig=0.59 dorfler_tail=0.08 floor=0 sel=29 7.4s
37/401 | loss=0.7242 ev=0.386 agents=752 avg_r=1.7036 sum_r=436.12 x<0=0.10 elig=0.59 dorfler_tail=0.07 floor=0 sel=31 7.5s
38/401 | loss=0.7454 ev=0.402 agents=34 avg_r=1.7798 sum_r=455.64 x<0=0.09 elig=0.59 dorfler_tail=0.07 floor=0 sel=31 7.5s
39/401 | loss=0.6106 ev=0.445 agents=87 avg_r=2.2153 sum_r=567.13 x<0=0.06 elig=0.60 dorfler_tail=0.08 floor=0 sel=30 7.5s
40/401 | loss=0.8085 ev=0.381 agents=88 avg_r=2.2893 sum_r=586.06 x<0=0.06 elig=0.59 dorfler_tail=0.08 floor=0 sel=33 7.7s
41/401 | loss=0.6706 ev=0.419 agents=301 avg_r=1.4149 sum_r=362.21 x<0=0.05 elig=0.59 dorfler_tail=0.07 floor=0 sel=29 7.2s
42/401 | loss=0.6504 ev=0.440 agents=1563 avg_r=2.3614 sum_r=604.52 x<0=0.06 elig=0.59 dorfler_tail=0.07 floor=0 sel=31 7.5s
43/401 | loss=0.6548 ev=0.389 agents=905 avg_r=2.1166 sum_r=541.85 x<0=0.05 elig=0.59 dorfler_tail=0.08 floor=0 sel=30 7.5s
44/401 | loss=0.6763 ev=0.392 agents=603 avg_r=2.1965 sum_r=562.30 x<0=0.05 elig=0.60 dorfler_tail=0.08 floor=0 sel=31 7.6s
45/401 | loss=0.6371 ev=0.417 agents=321 avg_r=1.2079 sum_r=309.23 x<0=0.04 elig=0.59 dorfler_tail=0.07 floor=0 sel=29 7.3s
46/401 | loss=0.7580 ev=0.419 agents=64 avg_r=2.3964 sum_r=613.47 x<0=0.05 elig=0.59 dorfler_tail=0.07 floor=0 sel=31 7.6s
47/401 | loss=0.8826 ev=0.357 agents=648 avg_r=1.9237 sum_r=492.46 x<0=0.07 elig=0.60 dorfler_tail=0.08 floor=0 sel=30 7.4s
48/401 | loss=0.7618 ev=0.374 agents=72 avg_r=1.9302 sum_r=494.14 x<0=0.04 elig=0.59 dorfler_tail=0.07 floor=0 sel=31 7.4s
49/401 | loss=1.0496 ev=0.349 agents=1113 avg_r=1.6100 sum_r=412.15 x<0=0.05 elig=0.59 dorfler_tail=0.07 floor=0 sel=31 8.0s
50/401 | loss=1.0966 ev=0.355 agents=207 avg_r=0.2694 sum_r=68.96 x<0=0.04 elig=0.59 dorfler_tail=0.07 floor=0 sel=30 7.7s
[Checkpoint] saved → checkpoints/model_iter0050.pt
51/401 | loss=0.7497 ev=0.362 agents=88 avg_r=2.4859 sum_r=636.39 x<0=0.04 elig=0.59 dorfler_tail=0.07 floor=0 sel=30 7.6s
52/401 | loss=0.7117 ev=0.376 agents=34 avg_r=1.3932 sum_r=356.65 x<0=0.04 elig=0.60 dorfler_tail=0.07 floor=0 sel=29 7.5s
53/401 | loss=0.8732 ev=0.428 agents=482 avg_r=2.5241 sum_r=646.16 x<0=0.05 elig=0.60 dorfler_tail=0.07 floor=0 sel=30 7.5s
54/401 | loss=0.7275 ev=0.414 agents=797 avg_r=2.5614 sum_r=655.71 x<0=0.03 elig=0.60 dorfler_tail=0.07 floor=0 sel=31 7.6s
55/401 | loss=1.0015 ev=0.267 agents=238 avg_r=1.7553 sum_r=449.35 x<0=0.03 elig=0.60 dorfler_tail=0.07 floor=0 sel=31 7.7s
56/401 | loss=0.9532 ev=0.328 agents=78 avg_r=1.6596 sum_r=424.86 x<0=0.04 elig=0.61 dorfler_tail=0.07 floor=0 sel=27 7.3s
57/401 | loss=0.9659 ev=0.392 agents=180 avg_r=0.1315 sum_r=33.67 x<0=0.04 elig=0.60 dorfler_tail=0.07 floor=0 sel=30 7.6s
58/401 | loss=0.5575 ev=0.479 agents=1467 avg_r=3.9607 sum_r=1013.94 x<0=0.04 elig=0.59 dorfler_tail=0.08 floor=0 sel=31 7.6s
59/401 | loss=0.6323 ev=0.412 agents=257 avg_r=1.1701 sum_r=299.54 x<0=0.03 elig=0.60 dorfler_tail=0.07 floor=0 sel=30 7.6s
60/401 | loss=0.7717 ev=0.429 agents=278 avg_r=1.1557 sum_r=295.85 x<0=0.04 elig=0.60 dorfler_tail=0.08 floor=0 sel=28 7.3s
61/401 | loss=0.6149 ev=0.436 agents=162 avg_r=2.4661 sum_r=631.33 x<0=0.03 elig=0.60 dorfler_tail=0.07 floor=0 sel=29 7.5s
62/401 | loss=0.5705 ev=0.410 agents=269 avg_r=3.6565 sum_r=936.06 x<0=0.03 elig=0.59 dorfler_tail=0.08 floor=0 sel=32 7.6s
63/401 | loss=0.7479 ev=0.391 agents=34 avg_r=1.1095 sum_r=284.04 x<0=0.02 elig=0.60 dorfler_tail=0.07 floor=0 sel=29 7.3s
64/401 | loss=0.9662 ev=0.418 agents=149 avg_r=1.0548 sum_r=270.02 x<0=0.02 elig=0.60 dorfler_tail=0.07 floor=0 sel=30 7.4s
65/401 | loss=0.8020 ev=0.379 agents=139 avg_r=2.3568 sum_r=603.34 x<0=0.01 elig=0.60 dorfler_tail=0.07 floor=0 sel=29 7.3s
66/401 | loss=0.9130 ev=0.401 agents=140 avg_r=0.8920 sum_r=228.35 x<0=0.01 elig=0.60 dorfler_tail=0.07 floor=0 sel=30 7.5s
67/401 | loss=0.6314 ev=0.411 agents=82 avg_r=2.2832 sum_r=584.50 x<0=0.01 elig=0.60 dorfler_tail=0.07 floor=0 sel=30 7.4s
68/401 | loss=0.8747 ev=0.437 agents=258 avg_r=0.8502 sum_r=217.65 x<0=0.01 elig=0.60 dorfler_tail=0.08 floor=0 sel=30 7.6s
69/401 | loss=0.7156 ev=0.397 agents=649 avg_r=2.6260 sum_r=672.26 x<0=0.01 elig=0.60 dorfler_tail=0.07 floor=0 sel=29 7.3s
70/401 | loss=0.7031 ev=0.427 agents=520 avg_r=2.5518 sum_r=653.26 x<0=0.01 elig=0.60 dorfler_tail=0.07 floor=0 sel=30 7.4s
71/401 | loss=0.6538 ev=0.393 agents=412 avg_r=2.4192 sum_r=619.32 x<0=0.01 elig=0.60 dorfler_tail=0.07 floor=0 sel=31 7.6s
72/401 | loss=0.6831 ev=0.418 agents=84 avg_r=2.0187 sum_r=516.80 x<0=0.01 elig=0.61 dorfler_tail=0.07 floor=0 sel=28 7.8s
73/401 | loss=0.7298 ev=0.426 agents=438 avg_r=2.5987 sum_r=665.26 x<0=0.00 elig=0.60 dorfler_tail=0.07 floor=0 sel=30 7.7s
74/401 | loss=0.6047 ev=0.470 agents=301 avg_r=3.4593 sum_r=885.58 x<0=0.00 elig=0.60 dorfler_tail=0.07 floor=0 sel=29 7.6s
75/401 | loss=0.6847 ev=0.412 agents=515 avg_r=0.6582 sum_r=168.49 x<0=0.00 elig=0.60 dorfler_tail=0.07 floor=0 sel=29 7.4s
76/401 | loss=0.9368 ev=0.393 agents=503 avg_r=2.7642 sum_r=707.63 x<0=0.00 elig=0.60 dorfler_tail=0.07 floor=0 sel=30 7.7s
77/401 | loss=0.9459 ev=0.432 agents=261 avg_r=1.2000 sum_r=307.20 x<0=0.01 elig=0.60 dorfler_tail=0.07 floor=0 sel=28 7.3s
78/401 | loss=0.7438 ev=0.411 agents=221 avg_r=2.1195 sum_r=542.58 x<0=0.00 elig=0.61 dorfler_tail=0.07 floor=0 sel=30 7.6s
79/401 | loss=0.7466 ev=0.450 agents=232 avg_r=4.4824 sum_r=1147.50 x<0=0.01 elig=0.60 dorfler_tail=0.08 floor=0 sel=32 7.7s
80/401 | loss=1.1380 ev=0.460 agents=814 avg_r=0.3357 sum_r=85.95 x<0=0.01 elig=0.61 dorfler_tail=0.07 floor=0 sel=27 7.2s
81/401 | loss=0.8259 ev=0.394 agents=568 avg_r=1.8428 sum_r=471.75 x<0=0.00 elig=0.60 dorfler_tail=0.07 floor=0 sel=29 7.3s
82/401 | loss=0.5936 ev=0.436 agents=237 avg_r=3.5513 sum_r=909.14 x<0=0.00 elig=0.60 dorfler_tail=0.07 floor=0 sel=29 7.5s
83/401 | loss=0.6978 ev=0.432 agents=389 avg_r=2.7072 sum_r=693.05 x<0=0.00 elig=0.61 dorfler_tail=0.07 floor=0 sel=28 7.5s
84/401 | loss=0.8955 ev=0.404 agents=80 avg_r=3.3064 sum_r=846.43 x<0=0.00 elig=0.61 dorfler_tail=0.07 floor=0 sel=31 7.8s
85/401 | loss=0.8506 ev=0.432 agents=34 avg_r=0.2730 sum_r=69.89 x<0=0.00 elig=0.61 dorfler_tail=0.07 floor=0 sel=24 6.9s
86/401 | loss=0.7781 ev=0.412 agents=391 avg_r=3.9846 sum_r=1020.05 x<0=0.01 elig=0.62 dorfler_tail=0.07 floor=0 sel=30 7.9s
87/401 | loss=0.8894 ev=0.397 agents=418 avg_r=2.6888 sum_r=688.32 x<0=0.00 elig=0.62 dorfler_tail=0.07 floor=0 sel=28 7.5s
88/401 | loss=1.0689 ev=0.411 agents=80 avg_r=3.0347 sum_r=776.89 x<0=0.01 elig=0.62 dorfler_tail=0.07 floor=0 sel=28 7.6s
89/401 | loss=0.8925 ev=0.358 agents=862 avg_r=2.9356 sum_r=751.50 x<0=0.01 elig=0.62 dorfler_tail=0.07 floor=0 sel=29 7.8s
90/401 | loss=0.7441 ev=0.464 agents=549 avg_r=4.5978 sum_r=1177.04 x<0=0.01 elig=0.62 dorfler_tail=0.07 floor=0 sel=28 7.6s
91/401 | loss=1.1180 ev=0.386 agents=101 avg_r=2.1914 sum_r=560.99 x<0=0.00 elig=0.62 dorfler_tail=0.07 floor=0 sel=29 7.6s
92/401 | loss=0.9271 ev=0.439 agents=60 avg_r=3.2678 sum_r=836.57 x<0=0.00 elig=0.63 dorfler_tail=0.07 floor=0 sel=27 7.5s
93/401 | loss=0.9531 ev=0.437 agents=291 avg_r=3.1621 sum_r=809.49 x<0=0.00 elig=0.63 dorfler_tail=0.07 floor=0 sel=28 7.6s
94/401 | loss=0.8870 ev=0.439 agents=101 avg_r=3.1353 sum_r=802.65 x<0=0.00 elig=0.63 dorfler_tail=0.07 floor=0 sel=28 8.0s
95/401 | loss=0.9440 ev=0.434 agents=34 avg_r=5.3761 sum_r=1376.27 x<0=0.01 elig=0.63 dorfler_tail=0.07 floor=0 sel=30 8.4s
96/401 | loss=1.1221 ev=0.381 agents=62 avg_r=2.8338 sum_r=725.45 x<0=0.00 elig=0.63 dorfler_tail=0.07 floor=0 sel=28 7.9s
97/401 | loss=0.9903 ev=0.452 agents=180 avg_r=4.0017 sum_r=1024.43 x<0=0.00 elig=0.63 dorfler_tail=0.07 floor=0 sel=28 7.9s
98/401 | loss=1.0881 ev=0.436 agents=419 avg_r=4.6007 sum_r=1177.77 x<0=0.01 elig=0.63 dorfler_tail=0.07 floor=0 sel=29 7.9s
99/401 | loss=0.8982 ev=0.432 agents=85 avg_r=2.9775 sum_r=762.24 x<0=0.01 elig=0.63 dorfler_tail=0.07 floor=0 sel=28 7.8s
100/401 | loss=1.0656 ev=0.359 agents=691 avg_r=3.0152 sum_r=771.89 x<0=0.01 elig=0.63 dorfler_tail=0.07 floor=0 sel=28 7.7s
[Checkpoint] saved → checkpoints/model_iter0100.pt
101/401 | loss=0.8757 ev=0.449 agents=147 avg_r=4.0589 sum_r=1039.07 x<0=0.00 elig=0.62 dorfler_tail=0.08 floor=0 sel=29 7.7s
102/401 | loss=0.9537 ev=0.441 agents=802 avg_r=4.1671 sum_r=1066.79 x<0=0.00 elig=0.62 dorfler_tail=0.07 floor=0 sel=29 7.7s
103/401 | loss=1.1348 ev=0.457 agents=120 avg_r=4.9407 sum_r=1264.81 x<0=0.00 elig=0.62 dorfler_tail=0.07 floor=0 sel=29 7.9s
104/401 | loss=1.0887 ev=0.415 agents=48 avg_r=3.7664 sum_r=964.21 x<0=0.01 elig=0.63 dorfler_tail=0.07 floor=0 sel=29 7.8s
105/401 | loss=0.7257 ev=0.441 agents=245 avg_r=1.1230 sum_r=287.49 x<0=0.00 elig=0.62 dorfler_tail=0.07 floor=0 sel=26 7.5s
106/401 | loss=0.9558 ev=0.429 agents=193 avg_r=3.9291 sum_r=1005.86 x<0=0.00 elig=0.63 dorfler_tail=0.07 floor=0 sel=28 7.7s
107/401 | loss=1.1960 ev=0.461 agents=140 avg_r=3.8453 sum_r=984.40 x<0=0.01 elig=0.63 dorfler_tail=0.07 floor=0 sel=29 8.0s
108/401 | loss=1.0023 ev=0.425 agents=34 avg_r=3.5098 sum_r=898.50 x<0=0.00 elig=0.63 dorfler_tail=0.07 floor=0 sel=26 7.5s
109/401 | loss=1.0553 ev=0.437 agents=155 avg_r=4.4515 sum_r=1139.58 x<0=0.00 elig=0.63 dorfler_tail=0.07 floor=0 sel=29 7.8s
110/401 | loss=0.8946 ev=0.458 agents=317 avg_r=2.2184 sum_r=567.91 x<0=0.00 elig=0.62 dorfler_tail=0.07 floor=0 sel=28 7.6s
111/401 | loss=0.8399 ev=0.475 agents=322 avg_r=3.8648 sum_r=989.39 x<0=0.00 elig=0.63 dorfler_tail=0.07 floor=0 sel=28 7.6s
112/401 | loss=0.8203 ev=0.450 agents=661 avg_r=4.3269 sum_r=1107.69 x<0=0.01 elig=0.63 dorfler_tail=0.07 floor=0 sel=29 7.9s
113/401 | loss=1.2963 ev=0.414 agents=88 avg_r=4.9068 sum_r=1256.15 x<0=0.01 elig=0.63 dorfler_tail=0.07 floor=0 sel=30 8.0s
114/401 | loss=0.8770 ev=0.434 agents=96 avg_r=2.3554 sum_r=602.99 x<0=0.00 elig=0.64 dorfler_tail=0.06 floor=0 sel=25 7.3s
115/401 | loss=1.0023 ev=0.462 agents=1043 avg_r=4.6932 sum_r=1201.45 x<0=0.01 elig=0.64 dorfler_tail=0.07 floor=0 sel=29 7.7s
116/401 | loss=0.9185 ev=0.471 agents=574 avg_r=4.3713 sum_r=1119.05 x<0=0.00 elig=0.64 dorfler_tail=0.07 floor=0 sel=28 7.7s
117/401 | loss=0.9487 ev=0.445 agents=461 avg_r=3.4812 sum_r=891.18 x<0=0.00 elig=0.63 dorfler_tail=0.07 floor=0 sel=29 7.8s
118/401 | loss=1.1328 ev=0.459 agents=186 avg_r=4.4079 sum_r=1128.43 x<0=0.00 elig=0.63 dorfler_tail=0.07 floor=0 sel=27 8.2s
119/401 | loss=0.8739 ev=0.454 agents=659 avg_r=3.6846 sum_r=943.26 x<0=0.00 elig=0.63 dorfler_tail=0.07 floor=0 sel=28 8.0s
120/401 | loss=0.8952 ev=0.490 agents=78 avg_r=4.0254 sum_r=1030.50 x<0=0.00 elig=0.63 dorfler_tail=0.07 floor=0 sel=29 8.0s
121/401 | loss=1.1642 ev=0.444 agents=180 avg_r=5.1341 sum_r=1314.33 x<0=0.00 elig=0.63 dorfler_tail=0.07 floor=0 sel=29 8.0s
122/401 | loss=1.0194 ev=0.449 agents=1241 avg_r=3.6450 sum_r=933.12 x<0=0.00 elig=0.63 dorfler_tail=0.07 floor=0 sel=27 7.7s
123/401 | loss=0.9362 ev=0.425 agents=227 avg_r=3.2675 sum_r=836.47 x<0=0.00 elig=0.64 dorfler_tail=0.07 floor=0 sel=28 7.8s
124/401 | loss=1.0467 ev=0.420 agents=34 avg_r=4.8397 sum_r=1238.97 x<0=0.00 elig=0.64 dorfler_tail=0.07 floor=0 sel=29 7.9s
125/401 | loss=0.9613 ev=0.467 agents=592 avg_r=5.1937 sum_r=1329.58 x<0=0.00 elig=0.64 dorfler_tail=0.07 floor=0 sel=30 8.0s
126/401 | loss=0.9090 ev=0.439 agents=44 avg_r=4.2965 sum_r=1099.89 x<0=0.00 elig=0.64 dorfler_tail=0.07 floor=0 sel=27 7.6s
127/401 | loss=1.0189 ev=0.451 agents=184 avg_r=4.2159 sum_r=1079.27 x<0=0.00 elig=0.63 dorfler_tail=0.07 floor=0 sel=31 8.0s
128/401 | loss=1.1045 ev=0.459 agents=808 avg_r=2.0674 sum_r=529.25 x<0=0.00 elig=0.63 dorfler_tail=0.07 floor=0 sel=26 7.3s
129/401 | loss=1.0547 ev=0.487 agents=705 avg_r=2.0413 sum_r=522.57 x<0=0.00 elig=0.63 dorfler_tail=0.07 floor=0 sel=28 7.6s
130/401 | loss=0.8997 ev=0.489 agents=119 avg_r=5.8658 sum_r=1501.65 x<0=0.00 elig=0.64 dorfler_tail=0.07 floor=0 sel=30 7.9s
131/401 | loss=1.1464 ev=0.463 agents=514 avg_r=5.3146 sum_r=1360.55 x<0=0.00 elig=0.64 dorfler_tail=0.07 floor=0 sel=30 8.0s
132/401 | loss=0.9049 ev=0.468 agents=176 avg_r=3.2288 sum_r=826.57 x<0=0.00 elig=0.64 dorfler_tail=0.07 floor=0 sel=25 7.3s
133/401 | loss=0.9787 ev=0.465 agents=1140 avg_r=3.8684 sum_r=990.30 x<0=0.00 elig=0.65 dorfler_tail=0.07 floor=0 sel=28 7.8s
134/401 | loss=0.9619 ev=0.454 agents=44 avg_r=3.6363 sum_r=930.90 x<0=0.00 elig=0.64 dorfler_tail=0.07 floor=0 sel=29 7.7s
135/401 | loss=1.1247 ev=0.476 agents=71 avg_r=6.3209 sum_r=1618.16 x<0=0.00 elig=0.63 dorfler_tail=0.07 floor=0 sel=29 7.8s
136/401 | loss=0.9569 ev=0.428 agents=637 avg_r=2.3333 sum_r=597.34 x<0=0.00 elig=0.63 dorfler_tail=0.07 floor=0 sel=26 7.4s
137/401 | loss=1.3365 ev=0.372 agents=132 avg_r=3.3031 sum_r=845.59 x<0=0.00 elig=0.63 dorfler_tail=0.07 floor=0 sel=30 7.8s
138/401 | loss=1.0446 ev=0.487 agents=197 avg_r=4.3467 sum_r=1112.75 x<0=0.00 elig=0.63 dorfler_tail=0.07 floor=0 sel=28 7.6s
139/401 | loss=0.9965 ev=0.493 agents=1239 avg_r=3.0278 sum_r=775.11 x<0=0.00 elig=0.64 dorfler_tail=0.07 floor=0 sel=29 7.9s
140/401 | loss=0.8756 ev=0.491 agents=34 avg_r=4.0575 sum_r=1038.73 x<0=0.00 elig=0.64 dorfler_tail=0.07 floor=0 sel=26 7.8s
141/401 | loss=1.0863 ev=0.455 agents=202 avg_r=4.4626 sum_r=1142.43 x<0=0.00 elig=0.64 dorfler_tail=0.07 floor=0 sel=28 8.2s
142/401 | loss=0.8633 ev=0.492 agents=599 avg_r=3.6977 sum_r=946.60 x<0=0.00 elig=0.63 dorfler_tail=0.07 floor=0 sel=27 7.7s
143/401 | loss=1.2714 ev=0.450 agents=83 avg_r=3.4606 sum_r=885.91 x<0=0.00 elig=0.63 dorfler_tail=0.07 floor=0 sel=27 7.8s
144/401 | loss=0.8689 ev=0.480 agents=212 avg_r=5.9020 sum_r=1510.92 x<0=0.00 elig=0.64 dorfler_tail=0.07 floor=0 sel=31 8.2s
145/401 | loss=0.8527 ev=0.457 agents=466 avg_r=3.3779 sum_r=864.73 x<0=0.00 elig=0.64 dorfler_tail=0.07 floor=0 sel=28 7.7s
146/401 | loss=1.0791 ev=0.436 agents=41 avg_r=3.9742 sum_r=1017.40 x<0=0.00 elig=0.64 dorfler_tail=0.07 floor=0 sel=27 7.6s
147/401 | loss=1.0243 ev=0.483 agents=201 avg_r=4.0608 sum_r=1039.56 x<0=0.00 elig=0.64 dorfler_tail=0.07 floor=0 sel=27 7.7s
148/401 | loss=0.8642 ev=0.439 agents=169 avg_r=5.0525 sum_r=1293.44 x<0=0.00 elig=0.64 dorfler_tail=0.07 floor=0 sel=29 7.9s
149/401 | loss=1.2060 ev=0.492 agents=1118 avg_r=3.4406 sum_r=880.81 x<0=0.00 elig=0.64 dorfler_tail=0.07 floor=0 sel=28 7.8s
150/401 | loss=0.8956 ev=0.491 agents=139 avg_r=4.4020 sum_r=1126.90 x<0=0.00 elig=0.63 dorfler_tail=0.07 floor=0 sel=28 7.7s
[Checkpoint] saved → checkpoints/model_iter0150.pt
151/401 | loss=0.8862 ev=0.439 agents=36 avg_r=3.6186 sum_r=926.35 x<0=0.00 elig=0.64 dorfler_tail=0.07 floor=0 sel=26 7.4s
152/401 | loss=1.1976 ev=0.436 agents=374 avg_r=5.2749 sum_r=1350.39 x<0=0.00 elig=0.64 dorfler_tail=0.07 floor=0 sel=30 8.0s
153/401 | loss=0.7750 ev=0.453 agents=203 avg_r=3.3719 sum_r=863.21 x<0=0.00 elig=0.64 dorfler_tail=0.07 floor=0 sel=26 7.5s
154/401 | loss=1.1222 ev=0.448 agents=498 avg_r=5.2013 sum_r=1331.52 x<0=0.00 elig=0.64 dorfler_tail=0.07 floor=0 sel=29 7.8s
155/401 | loss=0.8401 ev=0.498 agents=174 avg_r=4.3179 sum_r=1105.39 x<0=0.00 elig=0.64 dorfler_tail=0.07 floor=0 sel=27 7.5s
156/401 | loss=1.1951 ev=0.475 agents=144 avg_r=4.7607 sum_r=1218.73 x<0=0.00 elig=0.64 dorfler_tail=0.07 floor=0 sel=29 7.9s
157/401 | loss=1.0364 ev=0.488 agents=233 avg_r=4.6508 sum_r=1190.61 x<0=0.00 elig=0.64 dorfler_tail=0.07 floor=0 sel=29 7.9s
158/401 | loss=1.1938 ev=0.437 agents=40 avg_r=4.8137 sum_r=1232.31 x<0=0.00 elig=0.65 dorfler_tail=0.07 floor=0 sel=28 7.7s
159/401 | loss=0.7339 ev=0.442 agents=401 avg_r=2.6907 sum_r=688.82 x<0=0.00 elig=0.64 dorfler_tail=0.06 floor=0 sel=27 7.5s
160/401 | loss=0.9124 ev=0.494 agents=377 avg_r=5.1447 sum_r=1317.04 x<0=0.00 elig=0.65 dorfler_tail=0.07 floor=0 sel=27 7.7s
161/401 | loss=1.1279 ev=0.482 agents=34 avg_r=5.6036 sum_r=1434.53 x<0=0.00 elig=0.64 dorfler_tail=0.07 floor=0 sel=30 8.0s
162/401 | loss=0.9648 ev=0.472 agents=725 avg_r=4.8624 sum_r=1244.77 x<0=0.00 elig=0.65 dorfler_tail=0.07 floor=0 sel=29 7.8s
163/401 | loss=0.8031 ev=0.507 agents=276 avg_r=2.6097 sum_r=668.09 x<0=0.00 elig=0.64 dorfler_tail=0.06 floor=0 sel=23 7.6s
164/401 | loss=1.3767 ev=0.402 agents=177 avg_r=5.0539 sum_r=1293.81 x<0=0.00 elig=0.64 dorfler_tail=0.07 floor=0 sel=31 8.4s
165/401 | loss=0.9780 ev=0.513 agents=158 avg_r=4.9213 sum_r=1259.84 x<0=0.00 elig=0.64 dorfler_tail=0.07 floor=0 sel=29 8.0s
166/401 | loss=0.9135 ev=0.480 agents=397 avg_r=3.7623 sum_r=963.14 x<0=0.00 elig=0.65 dorfler_tail=0.07 floor=0 sel=27 7.8s
167/401 | loss=1.1074 ev=0.503 agents=193 avg_r=5.2436 sum_r=1342.35 x<0=0.00 elig=0.64 dorfler_tail=0.07 floor=0 sel=30 8.0s
168/401 | loss=1.1870 ev=0.476 agents=1235 avg_r=3.8139 sum_r=976.35 x<0=0.00 elig=0.65 dorfler_tail=0.07 floor=0 sel=27 7.6s
169/401 | loss=1.2314 ev=0.459 agents=476 avg_r=2.9524 sum_r=755.82 x<0=0.00 elig=0.65 dorfler_tail=0.07 floor=0 sel=29 7.9s
slurmstepd: error: *** JOB 4533 ON node06 CANCELLED AT 2026-05-29T14:58:13 ***

418
logs/train_4534.out Normal file
View File

@ -0,0 +1,418 @@
Starting training at Fri 29 May 14:58:18 CST 2026
Running on node: node06
[Device] cuda
[Env] node_feats=14 edge_feats=1 act_dim=1
[Model] params=92,804
1/401 | loss=1.4128 ev=-0.004 agents=109 avg_r=-2.9617 sum_r=-758.20 x<0=0.69 elig=0.58 dorfler_tail=0.09 floor=0 sel=35 8.6s
2/401 | loss=1.3206 ev=0.021 agents=193 avg_r=-0.3258 sum_r=-83.41 x<0=0.62 elig=0.58 dorfler_tail=0.08 floor=0 sel=32 7.8s
3/401 | loss=1.2607 ev=0.053 agents=39 avg_r=-3.3286 sum_r=-852.13 x<0=0.56 elig=0.59 dorfler_tail=0.08 floor=0 sel=32 7.7s
4/401 | loss=1.3325 ev=0.075 agents=34 avg_r=0.7804 sum_r=199.78 x<0=0.52 elig=0.58 dorfler_tail=0.09 floor=0 sel=35 8.2s
5/401 | loss=1.2579 ev=0.094 agents=88 avg_r=-3.0086 sum_r=-770.19 x<0=0.43 elig=0.59 dorfler_tail=0.08 floor=0 sel=32 8.0s
6/401 | loss=1.2490 ev=0.117 agents=36 avg_r=-0.7408 sum_r=-189.63 x<0=0.40 elig=0.59 dorfler_tail=0.08 floor=0 sel=32 7.7s
7/401 | loss=1.1303 ev=0.172 agents=34 avg_r=-0.5650 sum_r=-144.65 x<0=0.35 elig=0.58 dorfler_tail=0.08 floor=0 sel=35 8.0s
8/401 | loss=1.1519 ev=0.223 agents=133 avg_r=-0.3562 sum_r=-91.18 x<0=0.29 elig=0.59 dorfler_tail=0.08 floor=0 sel=33 7.8s
9/401 | loss=1.0561 ev=0.265 agents=79 avg_r=0.0758 sum_r=19.41 x<0=0.28 elig=0.59 dorfler_tail=0.08 floor=0 sel=31 7.6s
10/401 | loss=1.0494 ev=0.258 agents=82 avg_r=-2.5148 sum_r=-643.78 x<0=0.34 elig=0.59 dorfler_tail=0.08 floor=0 sel=34 7.8s
11/401 | loss=1.0812 ev=0.302 agents=60 avg_r=2.1651 sum_r=554.27 x<0=0.30 elig=0.59 dorfler_tail=0.08 floor=0 sel=31 7.6s
12/401 | loss=0.9418 ev=0.317 agents=48 avg_r=1.0822 sum_r=277.04 x<0=0.28 elig=0.59 dorfler_tail=0.08 floor=0 sel=33 7.7s
13/401 | loss=0.9202 ev=0.317 agents=88 avg_r=0.3357 sum_r=85.94 x<0=0.33 elig=0.59 dorfler_tail=0.08 floor=0 sel=33 7.8s
14/401 | loss=0.9721 ev=0.318 agents=40 avg_r=0.2343 sum_r=59.99 x<0=0.28 elig=0.59 dorfler_tail=0.08 floor=0 sel=32 7.7s
15/401 | loss=0.9063 ev=0.352 agents=101 avg_r=0.5217 sum_r=133.55 x<0=0.25 elig=0.59 dorfler_tail=0.08 floor=0 sel=33 7.8s
16/401 | loss=1.0478 ev=0.353 agents=34 avg_r=-1.6244 sum_r=-415.85 x<0=0.21 elig=0.59 dorfler_tail=0.08 floor=0 sel=29 7.4s
17/401 | loss=0.9633 ev=0.345 agents=132 avg_r=2.7550 sum_r=705.27 x<0=0.24 elig=0.59 dorfler_tail=0.08 floor=0 sel=33 7.8s
18/401 | loss=0.9338 ev=0.365 agents=34 avg_r=0.5794 sum_r=148.32 x<0=0.30 elig=0.58 dorfler_tail=0.08 floor=0 sel=32 7.7s
19/401 | loss=0.8862 ev=0.393 agents=201 avg_r=0.2777 sum_r=71.08 x<0=0.27 elig=0.59 dorfler_tail=0.08 floor=0 sel=34 7.9s
20/401 | loss=0.8669 ev=0.394 agents=120 avg_r=0.4671 sum_r=119.58 x<0=0.19 elig=0.59 dorfler_tail=0.08 floor=0 sel=31 7.6s
21/401 | loss=0.9409 ev=0.369 agents=78 avg_r=0.5001 sum_r=128.03 x<0=0.17 elig=0.59 dorfler_tail=0.08 floor=0 sel=31 7.6s
22/401 | loss=0.8863 ev=0.373 agents=44 avg_r=-0.1458 sum_r=-37.33 x<0=0.19 elig=0.59 dorfler_tail=0.08 floor=0 sel=32 7.6s
23/401 | loss=0.8574 ev=0.378 agents=36 avg_r=0.1385 sum_r=35.46 x<0=0.18 elig=0.59 dorfler_tail=0.08 floor=0 sel=32 7.6s
24/401 | loss=0.8286 ev=0.432 agents=175 avg_r=3.1860 sum_r=815.61 x<0=0.16 elig=0.59 dorfler_tail=0.08 floor=0 sel=33 7.7s
25/401 | loss=0.9002 ev=0.363 agents=34 avg_r=-0.0388 sum_r=-9.93 x<0=0.14 elig=0.59 dorfler_tail=0.08 floor=0 sel=28 7.2s
26/401 | loss=0.8252 ev=0.385 agents=34 avg_r=-0.2623 sum_r=-67.15 x<0=0.12 elig=0.58 dorfler_tail=0.08 floor=0 sel=34 7.8s
27/401 | loss=0.8039 ev=0.408 agents=176 avg_r=0.3361 sum_r=86.04 x<0=0.11 elig=0.59 dorfler_tail=0.08 floor=0 sel=31 7.9s
28/401 | loss=0.8841 ev=0.404 agents=219 avg_r=-0.2521 sum_r=-64.55 x<0=0.10 elig=0.59 dorfler_tail=0.08 floor=0 sel=32 8.1s
29/401 | loss=0.8608 ev=0.345 agents=44 avg_r=1.4892 sum_r=381.24 x<0=0.10 elig=0.59 dorfler_tail=0.08 floor=0 sel=32 7.9s
30/401 | loss=0.7754 ev=0.444 agents=133 avg_r=1.3507 sum_r=345.79 x<0=0.09 elig=0.59 dorfler_tail=0.08 floor=0 sel=30 7.5s
31/401 | loss=0.8501 ev=0.406 agents=44 avg_r=1.3255 sum_r=339.33 x<0=0.09 elig=0.59 dorfler_tail=0.08 floor=0 sel=32 7.7s
32/401 | loss=0.8750 ev=0.418 agents=34 avg_r=0.3083 sum_r=78.94 x<0=0.06 elig=0.59 dorfler_tail=0.08 floor=0 sel=33 7.7s
33/401 | loss=0.7966 ev=0.438 agents=745 avg_r=2.5903 sum_r=663.13 x<0=0.06 elig=0.59 dorfler_tail=0.08 floor=0 sel=31 7.5s
34/401 | loss=0.8724 ev=0.418 agents=132 avg_r=0.1713 sum_r=43.85 x<0=0.06 elig=0.59 dorfler_tail=0.07 floor=0 sel=31 7.5s
35/401 | loss=0.7984 ev=0.436 agents=60 avg_r=1.5414 sum_r=394.60 x<0=0.05 elig=0.59 dorfler_tail=0.08 floor=0 sel=31 7.6s
36/401 | loss=0.8868 ev=0.401 agents=139 avg_r=0.2042 sum_r=52.28 x<0=0.04 elig=0.59 dorfler_tail=0.08 floor=0 sel=30 7.4s
37/401 | loss=0.9037 ev=0.426 agents=228 avg_r=0.5137 sum_r=131.52 x<0=0.04 elig=0.59 dorfler_tail=0.08 floor=0 sel=31 7.5s
38/401 | loss=0.9280 ev=0.353 agents=34 avg_r=1.7908 sum_r=458.45 x<0=0.05 elig=0.59 dorfler_tail=0.07 floor=0 sel=31 7.5s
39/401 | loss=0.7340 ev=0.438 agents=194 avg_r=1.8975 sum_r=485.76 x<0=0.05 elig=0.59 dorfler_tail=0.08 floor=0 sel=31 7.4s
40/401 | loss=0.8670 ev=0.364 agents=228 avg_r=2.4297 sum_r=621.99 x<0=0.07 elig=0.59 dorfler_tail=0.08 floor=0 sel=33 7.7s
41/401 | loss=0.8306 ev=0.403 agents=199 avg_r=1.3996 sum_r=358.30 x<0=0.06 elig=0.59 dorfler_tail=0.07 floor=0 sel=29 7.3s
42/401 | loss=0.7935 ev=0.456 agents=40 avg_r=2.2913 sum_r=586.59 x<0=0.06 elig=0.59 dorfler_tail=0.07 floor=0 sel=31 7.5s
43/401 | loss=0.7569 ev=0.425 agents=34 avg_r=1.5674 sum_r=401.25 x<0=0.05 elig=0.59 dorfler_tail=0.08 floor=0 sel=31 7.5s
44/401 | loss=0.8324 ev=0.425 agents=193 avg_r=1.5056 sum_r=385.44 x<0=0.07 elig=0.59 dorfler_tail=0.08 floor=0 sel=32 7.5s
45/401 | loss=0.8032 ev=0.458 agents=230 avg_r=1.1388 sum_r=291.54 x<0=0.06 elig=0.59 dorfler_tail=0.07 floor=0 sel=29 7.3s
46/401 | loss=0.8043 ev=0.436 agents=34 avg_r=2.3922 sum_r=612.39 x<0=0.07 elig=0.59 dorfler_tail=0.08 floor=0 sel=31 7.5s
47/401 | loss=0.7410 ev=0.443 agents=120 avg_r=3.2861 sum_r=841.24 x<0=0.08 elig=0.59 dorfler_tail=0.08 floor=0 sel=31 7.4s
48/401 | loss=0.8324 ev=0.403 agents=34 avg_r=0.2820 sum_r=72.19 x<0=0.05 elig=0.59 dorfler_tail=0.08 floor=0 sel=31 7.5s
49/401 | loss=0.7722 ev=0.461 agents=118 avg_r=3.1596 sum_r=808.87 x<0=0.06 elig=0.59 dorfler_tail=0.08 floor=0 sel=32 8.0s
50/401 | loss=0.7615 ev=0.445 agents=203 avg_r=1.2732 sum_r=325.95 x<0=0.03 elig=0.59 dorfler_tail=0.07 floor=0 sel=30 7.7s
[Checkpoint] saved → checkpoints/model_iter0050.pt
51/401 | loss=0.7829 ev=0.428 agents=1574 avg_r=1.8165 sum_r=465.03 x<0=0.02 elig=0.59 dorfler_tail=0.08 floor=0 sel=31 7.7s
52/401 | loss=0.7954 ev=0.432 agents=278 avg_r=2.1507 sum_r=550.57 x<0=0.02 elig=0.59 dorfler_tail=0.08 floor=0 sel=31 7.5s
53/401 | loss=0.6962 ev=0.449 agents=133 avg_r=2.0534 sum_r=525.66 x<0=0.02 elig=0.59 dorfler_tail=0.07 floor=0 sel=29 7.4s
54/401 | loss=0.7625 ev=0.454 agents=231 avg_r=1.5343 sum_r=392.79 x<0=0.02 elig=0.59 dorfler_tail=0.08 floor=0 sel=31 7.5s
55/401 | loss=0.7736 ev=0.414 agents=97 avg_r=1.6580 sum_r=424.46 x<0=0.02 elig=0.59 dorfler_tail=0.08 floor=0 sel=32 7.6s
56/401 | loss=0.8158 ev=0.454 agents=108 avg_r=1.4593 sum_r=373.59 x<0=0.03 elig=0.60 dorfler_tail=0.07 floor=0 sel=28 7.3s
57/401 | loss=0.8160 ev=0.384 agents=140 avg_r=1.2522 sum_r=320.57 x<0=0.04 elig=0.59 dorfler_tail=0.08 floor=0 sel=31 7.5s
58/401 | loss=0.7392 ev=0.444 agents=534 avg_r=3.1169 sum_r=797.93 x<0=0.04 elig=0.59 dorfler_tail=0.08 floor=0 sel=31 7.6s
59/401 | loss=0.7812 ev=0.401 agents=112 avg_r=1.2579 sum_r=322.03 x<0=0.03 elig=0.60 dorfler_tail=0.07 floor=0 sel=29 7.3s
60/401 | loss=0.7958 ev=0.444 agents=64 avg_r=0.6857 sum_r=175.55 x<0=0.02 elig=0.59 dorfler_tail=0.08 floor=0 sel=31 7.5s
61/401 | loss=0.7650 ev=0.447 agents=303 avg_r=2.2103 sum_r=565.84 x<0=0.02 elig=0.60 dorfler_tail=0.07 floor=0 sel=29 7.4s
62/401 | loss=0.7742 ev=0.476 agents=82 avg_r=1.9037 sum_r=487.34 x<0=0.02 elig=0.59 dorfler_tail=0.08 floor=0 sel=33 7.7s
63/401 | loss=0.8447 ev=0.351 agents=66 avg_r=1.7917 sum_r=458.68 x<0=0.02 elig=0.60 dorfler_tail=0.07 floor=0 sel=30 7.4s
64/401 | loss=0.7786 ev=0.394 agents=93 avg_r=1.5619 sum_r=399.83 x<0=0.02 elig=0.60 dorfler_tail=0.08 floor=0 sel=31 7.5s
65/401 | loss=0.7889 ev=0.429 agents=93 avg_r=3.1505 sum_r=806.54 x<0=0.03 elig=0.60 dorfler_tail=0.08 floor=0 sel=30 7.3s
66/401 | loss=0.7486 ev=0.411 agents=82 avg_r=3.4632 sum_r=886.58 x<0=0.03 elig=0.60 dorfler_tail=0.07 floor=0 sel=31 7.5s
67/401 | loss=0.8361 ev=0.387 agents=89 avg_r=2.5091 sum_r=642.33 x<0=0.04 elig=0.60 dorfler_tail=0.07 floor=0 sel=30 7.4s
68/401 | loss=0.8049 ev=0.455 agents=1246 avg_r=1.6280 sum_r=416.76 x<0=0.02 elig=0.59 dorfler_tail=0.08 floor=0 sel=31 7.6s
69/401 | loss=0.7406 ev=0.469 agents=169 avg_r=3.0316 sum_r=776.10 x<0=0.02 elig=0.60 dorfler_tail=0.07 floor=0 sel=29 7.3s
70/401 | loss=0.7916 ev=0.431 agents=666 avg_r=1.2786 sum_r=327.33 x<0=0.02 elig=0.60 dorfler_tail=0.07 floor=0 sel=30 7.4s
71/401 | loss=0.7455 ev=0.448 agents=219 avg_r=1.7504 sum_r=448.09 x<0=0.02 elig=0.60 dorfler_tail=0.07 floor=0 sel=28 7.4s
72/401 | loss=0.7722 ev=0.408 agents=255 avg_r=3.3442 sum_r=856.10 x<0=0.03 elig=0.60 dorfler_tail=0.07 floor=0 sel=31 8.0s
73/401 | loss=0.7531 ev=0.422 agents=334 avg_r=2.3709 sum_r=606.95 x<0=0.02 elig=0.60 dorfler_tail=0.07 floor=0 sel=30 7.5s
74/401 | loss=0.7534 ev=0.445 agents=34 avg_r=4.3503 sum_r=1113.68 x<0=0.03 elig=0.60 dorfler_tail=0.07 floor=0 sel=29 7.6s
75/401 | loss=0.8434 ev=0.401 agents=144 avg_r=0.4869 sum_r=124.64 x<0=0.03 elig=0.60 dorfler_tail=0.07 floor=0 sel=30 7.5s
76/401 | loss=0.8142 ev=0.417 agents=728 avg_r=3.7060 sum_r=948.74 x<0=0.04 elig=0.60 dorfler_tail=0.07 floor=0 sel=31 7.6s
77/401 | loss=0.8339 ev=0.382 agents=607 avg_r=3.4045 sum_r=871.55 x<0=0.04 elig=0.61 dorfler_tail=0.08 floor=0 sel=29 7.6s
78/401 | loss=0.9084 ev=0.413 agents=483 avg_r=1.5291 sum_r=391.46 x<0=0.05 elig=0.61 dorfler_tail=0.07 floor=0 sel=30 7.5s
79/401 | loss=0.8091 ev=0.434 agents=241 avg_r=5.4058 sum_r=1383.89 x<0=0.07 elig=0.61 dorfler_tail=0.08 floor=0 sel=33 8.1s
80/401 | loss=0.8532 ev=0.444 agents=299 avg_r=3.2896 sum_r=842.13 x<0=0.06 elig=0.63 dorfler_tail=0.07 floor=0 sel=26 7.3s
81/401 | loss=0.9505 ev=0.414 agents=812 avg_r=2.3540 sum_r=602.61 x<0=0.06 elig=0.61 dorfler_tail=0.07 floor=0 sel=30 7.6s
82/401 | loss=0.8656 ev=0.370 agents=557 avg_r=1.9931 sum_r=510.22 x<0=0.06 elig=0.62 dorfler_tail=0.07 floor=0 sel=27 7.4s
83/401 | loss=0.8751 ev=0.454 agents=34 avg_r=4.0672 sum_r=1041.20 x<0=0.07 elig=0.61 dorfler_tail=0.08 floor=0 sel=30 7.7s
84/401 | loss=1.0631 ev=0.385 agents=527 avg_r=2.2599 sum_r=578.52 x<0=0.06 elig=0.62 dorfler_tail=0.07 floor=0 sel=29 7.6s
85/401 | loss=0.8861 ev=0.371 agents=110 avg_r=2.5793 sum_r=660.29 x<0=0.06 elig=0.61 dorfler_tail=0.07 floor=0 sel=26 7.2s
86/401 | loss=1.0104 ev=0.399 agents=692 avg_r=3.1834 sum_r=814.94 x<0=0.07 elig=0.61 dorfler_tail=0.08 floor=0 sel=31 7.9s
87/401 | loss=1.0484 ev=0.337 agents=265 avg_r=3.8907 sum_r=996.02 x<0=0.11 elig=0.63 dorfler_tail=0.07 floor=0 sel=29 7.9s
88/401 | loss=0.9365 ev=0.374 agents=1076 avg_r=3.6280 sum_r=928.78 x<0=0.10 elig=0.62 dorfler_tail=0.07 floor=0 sel=29 7.7s
89/401 | loss=1.0322 ev=0.379 agents=738 avg_r=3.2173 sum_r=823.64 x<0=0.09 elig=0.62 dorfler_tail=0.07 floor=0 sel=28 7.6s
90/401 | loss=1.0024 ev=0.440 agents=814 avg_r=4.1741 sum_r=1068.56 x<0=0.14 elig=0.62 dorfler_tail=0.07 floor=0 sel=29 7.7s
91/401 | loss=1.0702 ev=0.415 agents=103 avg_r=2.9575 sum_r=757.12 x<0=0.11 elig=0.62 dorfler_tail=0.08 floor=0 sel=29 7.8s
92/401 | loss=1.0768 ev=0.393 agents=222 avg_r=2.3631 sum_r=604.95 x<0=0.09 elig=0.62 dorfler_tail=0.07 floor=0 sel=28 7.6s
93/401 | loss=0.8536 ev=0.446 agents=817 avg_r=2.8966 sum_r=741.53 x<0=0.10 elig=0.62 dorfler_tail=0.07 floor=0 sel=28 7.5s
94/401 | loss=1.0326 ev=0.381 agents=263 avg_r=3.2866 sum_r=841.36 x<0=0.11 elig=0.62 dorfler_tail=0.07 floor=0 sel=28 7.9s
95/401 | loss=0.9661 ev=0.438 agents=457 avg_r=4.7830 sum_r=1224.46 x<0=0.14 elig=0.62 dorfler_tail=0.08 floor=0 sel=32 8.7s
96/401 | loss=1.0307 ev=0.410 agents=146 avg_r=1.6996 sum_r=435.09 x<0=0.12 elig=0.62 dorfler_tail=0.07 floor=0 sel=28 7.6s
97/401 | loss=1.0506 ev=0.374 agents=1822 avg_r=4.6356 sum_r=1186.73 x<0=0.13 elig=0.62 dorfler_tail=0.07 floor=0 sel=28 8.0s
98/401 | loss=1.0002 ev=0.431 agents=247 avg_r=3.5428 sum_r=906.95 x<0=0.13 elig=0.63 dorfler_tail=0.07 floor=0 sel=27 7.6s
99/401 | loss=0.9919 ev=0.429 agents=438 avg_r=2.5796 sum_r=660.39 x<0=0.15 elig=0.63 dorfler_tail=0.07 floor=0 sel=28 7.7s
100/401 | loss=1.1839 ev=0.424 agents=80 avg_r=2.8253 sum_r=723.27 x<0=0.12 elig=0.62 dorfler_tail=0.07 floor=0 sel=29 7.7s
[Checkpoint] saved → checkpoints/model_iter0100.pt
101/401 | loss=1.0950 ev=0.459 agents=897 avg_r=3.8530 sum_r=986.37 x<0=0.18 elig=0.63 dorfler_tail=0.08 floor=0 sel=28 7.8s
102/401 | loss=1.0915 ev=0.416 agents=82 avg_r=4.4633 sum_r=1142.59 x<0=0.13 elig=0.62 dorfler_tail=0.07 floor=0 sel=29 7.7s
103/401 | loss=0.9961 ev=0.445 agents=228 avg_r=5.0288 sum_r=1287.37 x<0=0.16 elig=0.63 dorfler_tail=0.07 floor=0 sel=29 7.8s
104/401 | loss=1.0334 ev=0.390 agents=42 avg_r=4.6071 sum_r=1179.43 x<0=0.17 elig=0.63 dorfler_tail=0.07 floor=0 sel=27 7.6s
105/401 | loss=1.0714 ev=0.429 agents=375 avg_r=2.9595 sum_r=757.64 x<0=0.14 elig=0.62 dorfler_tail=0.07 floor=0 sel=29 7.6s
106/401 | loss=1.0984 ev=0.407 agents=34 avg_r=4.7091 sum_r=1205.54 x<0=0.16 elig=0.63 dorfler_tail=0.07 floor=0 sel=29 7.7s
107/401 | loss=1.0159 ev=0.444 agents=66 avg_r=5.0649 sum_r=1296.62 x<0=0.16 elig=0.63 dorfler_tail=0.07 floor=0 sel=30 7.9s
108/401 | loss=1.0474 ev=0.424 agents=92 avg_r=3.6964 sum_r=946.27 x<0=0.14 elig=0.63 dorfler_tail=0.07 floor=0 sel=26 7.4s
109/401 | loss=1.0957 ev=0.424 agents=225 avg_r=4.3635 sum_r=1117.06 x<0=0.15 elig=0.62 dorfler_tail=0.07 floor=0 sel=30 7.9s
110/401 | loss=1.0859 ev=0.396 agents=182 avg_r=2.8480 sum_r=729.08 x<0=0.15 elig=0.63 dorfler_tail=0.07 floor=0 sel=29 7.6s
111/401 | loss=0.9448 ev=0.422 agents=171 avg_r=4.1148 sum_r=1053.38 x<0=0.13 elig=0.63 dorfler_tail=0.07 floor=0 sel=28 7.5s
112/401 | loss=1.0549 ev=0.444 agents=175 avg_r=4.9807 sum_r=1275.05 x<0=0.15 elig=0.63 dorfler_tail=0.07 floor=0 sel=30 7.8s
113/401 | loss=1.0457 ev=0.431 agents=132 avg_r=4.3526 sum_r=1114.27 x<0=0.13 elig=0.63 dorfler_tail=0.07 floor=0 sel=31 8.0s
114/401 | loss=0.9811 ev=0.431 agents=219 avg_r=1.9930 sum_r=510.21 x<0=0.11 elig=0.63 dorfler_tail=0.07 floor=0 sel=26 7.2s
115/401 | loss=1.0557 ev=0.400 agents=39 avg_r=4.7748 sum_r=1222.35 x<0=0.17 elig=0.63 dorfler_tail=0.07 floor=0 sel=28 7.7s
116/401 | loss=1.1500 ev=0.432 agents=504 avg_r=4.6241 sum_r=1183.76 x<0=0.17 elig=0.63 dorfler_tail=0.07 floor=0 sel=28 7.6s
117/401 | loss=1.0410 ev=0.412 agents=39 avg_r=3.2529 sum_r=832.73 x<0=0.15 elig=0.63 dorfler_tail=0.07 floor=0 sel=29 7.6s
118/401 | loss=1.0850 ev=0.452 agents=333 avg_r=4.1276 sum_r=1056.66 x<0=0.16 elig=0.62 dorfler_tail=0.07 floor=0 sel=29 8.3s
119/401 | loss=1.0983 ev=0.418 agents=261 avg_r=4.2111 sum_r=1078.04 x<0=0.16 elig=0.63 dorfler_tail=0.07 floor=0 sel=28 7.9s
120/401 | loss=1.1755 ev=0.452 agents=201 avg_r=5.2366 sum_r=1340.57 x<0=0.17 elig=0.63 dorfler_tail=0.07 floor=0 sel=29 7.9s
121/401 | loss=1.2066 ev=0.441 agents=101 avg_r=4.9395 sum_r=1264.51 x<0=0.17 elig=0.63 dorfler_tail=0.07 floor=0 sel=29 8.0s
122/401 | loss=1.1325 ev=0.462 agents=411 avg_r=3.0792 sum_r=788.29 x<0=0.21 elig=0.63 dorfler_tail=0.07 floor=0 sel=28 7.6s
123/401 | loss=1.0326 ev=0.444 agents=625 avg_r=4.2090 sum_r=1077.51 x<0=0.17 elig=0.63 dorfler_tail=0.07 floor=0 sel=29 7.6s
124/401 | loss=1.1518 ev=0.423 agents=157 avg_r=4.9204 sum_r=1259.61 x<0=0.19 elig=0.64 dorfler_tail=0.07 floor=0 sel=29 7.8s
125/401 | loss=1.1643 ev=0.456 agents=77 avg_r=5.4202 sum_r=1387.57 x<0=0.17 elig=0.63 dorfler_tail=0.07 floor=0 sel=29 7.8s
126/401 | loss=1.1922 ev=0.445 agents=112 avg_r=4.2411 sum_r=1085.71 x<0=0.17 elig=0.64 dorfler_tail=0.07 floor=0 sel=27 7.5s
127/401 | loss=1.3675 ev=0.408 agents=118 avg_r=5.1671 sum_r=1322.77 x<0=0.17 elig=0.64 dorfler_tail=0.08 floor=0 sel=31 7.9s
128/401 | loss=1.0731 ev=0.426 agents=341 avg_r=4.4974 sum_r=1151.33 x<0=0.15 elig=0.64 dorfler_tail=0.07 floor=0 sel=25 7.3s
129/401 | loss=1.2627 ev=0.413 agents=143 avg_r=2.6131 sum_r=668.96 x<0=0.14 elig=0.64 dorfler_tail=0.07 floor=0 sel=27 7.5s
130/401 | loss=1.2541 ev=0.396 agents=919 avg_r=5.7318 sum_r=1467.35 x<0=0.18 elig=0.64 dorfler_tail=0.07 floor=0 sel=29 7.8s
131/401 | loss=1.1595 ev=0.459 agents=568 avg_r=5.8106 sum_r=1487.51 x<0=0.14 elig=0.64 dorfler_tail=0.07 floor=0 sel=31 7.9s
132/401 | loss=1.0261 ev=0.464 agents=159 avg_r=3.7017 sum_r=947.63 x<0=0.15 elig=0.64 dorfler_tail=0.07 floor=0 sel=27 7.4s
133/401 | loss=1.1509 ev=0.457 agents=180 avg_r=4.5674 sum_r=1169.27 x<0=0.13 elig=0.63 dorfler_tail=0.07 floor=0 sel=28 7.6s
134/401 | loss=1.2367 ev=0.399 agents=34 avg_r=3.3756 sum_r=864.15 x<0=0.12 elig=0.64 dorfler_tail=0.07 floor=0 sel=29 7.7s
135/401 | loss=1.2713 ev=0.472 agents=42 avg_r=6.9697 sum_r=1784.24 x<0=0.11 elig=0.64 dorfler_tail=0.07 floor=0 sel=29 7.8s
136/401 | loss=1.1949 ev=0.393 agents=252 avg_r=2.6102 sum_r=668.20 x<0=0.11 elig=0.63 dorfler_tail=0.07 floor=0 sel=27 7.3s
137/401 | loss=1.1157 ev=0.439 agents=1066 avg_r=5.3136 sum_r=1360.29 x<0=0.09 elig=0.63 dorfler_tail=0.07 floor=0 sel=31 7.9s
138/401 | loss=1.0746 ev=0.449 agents=214 avg_r=4.6555 sum_r=1191.80 x<0=0.12 elig=0.63 dorfler_tail=0.07 floor=0 sel=29 7.6s
139/401 | loss=1.1177 ev=0.460 agents=1208 avg_r=3.3845 sum_r=866.43 x<0=0.08 elig=0.63 dorfler_tail=0.07 floor=0 sel=31 7.9s
140/401 | loss=1.1579 ev=0.498 agents=74 avg_r=3.9158 sum_r=1002.45 x<0=0.10 elig=0.63 dorfler_tail=0.07 floor=0 sel=27 7.6s
141/401 | loss=1.1397 ev=0.452 agents=227 avg_r=4.6873 sum_r=1199.94 x<0=0.11 elig=0.64 dorfler_tail=0.07 floor=0 sel=29 8.1s
142/401 | loss=1.0311 ev=0.451 agents=272 avg_r=4.3273 sum_r=1107.79 x<0=0.09 elig=0.63 dorfler_tail=0.07 floor=0 sel=27 7.6s
143/401 | loss=1.2372 ev=0.429 agents=586 avg_r=3.5519 sum_r=909.28 x<0=0.07 elig=0.63 dorfler_tail=0.07 floor=0 sel=27 7.8s
144/401 | loss=1.1732 ev=0.431 agents=137 avg_r=5.6718 sum_r=1451.99 x<0=0.10 elig=0.64 dorfler_tail=0.07 floor=0 sel=31 8.1s
145/401 | loss=1.1318 ev=0.423 agents=1531 avg_r=3.6947 sum_r=945.84 x<0=0.07 elig=0.63 dorfler_tail=0.07 floor=0 sel=30 7.8s
146/401 | loss=1.2082 ev=0.371 agents=468 avg_r=2.9619 sum_r=758.24 x<0=0.08 elig=0.63 dorfler_tail=0.07 floor=0 sel=26 7.3s
147/401 | loss=1.0488 ev=0.490 agents=34 avg_r=4.6683 sum_r=1195.08 x<0=0.09 elig=0.63 dorfler_tail=0.07 floor=0 sel=29 7.8s
148/401 | loss=1.0228 ev=0.425 agents=199 avg_r=3.9396 sum_r=1008.54 x<0=0.10 elig=0.63 dorfler_tail=0.07 floor=0 sel=30 7.6s
149/401 | loss=1.1164 ev=0.460 agents=34 avg_r=5.2988 sum_r=1356.48 x<0=0.11 elig=0.63 dorfler_tail=0.08 floor=0 sel=29 7.8s
150/401 | loss=1.2006 ev=0.420 agents=224 avg_r=4.6276 sum_r=1184.65 x<0=0.14 elig=0.63 dorfler_tail=0.07 floor=0 sel=28 7.6s
[Checkpoint] saved → checkpoints/model_iter0150.pt
151/401 | loss=1.1592 ev=0.461 agents=219 avg_r=3.2275 sum_r=826.23 x<0=0.14 elig=0.64 dorfler_tail=0.07 floor=0 sel=26 7.3s
152/401 | loss=1.1567 ev=0.491 agents=66 avg_r=5.4326 sum_r=1390.76 x<0=0.13 elig=0.64 dorfler_tail=0.07 floor=0 sel=32 8.1s
153/401 | loss=1.0849 ev=0.410 agents=44 avg_r=3.2665 sum_r=836.23 x<0=0.13 elig=0.63 dorfler_tail=0.07 floor=0 sel=25 7.2s
154/401 | loss=1.2139 ev=0.451 agents=144 avg_r=5.5749 sum_r=1427.18 x<0=0.13 elig=0.64 dorfler_tail=0.07 floor=0 sel=30 7.8s
155/401 | loss=1.2641 ev=0.374 agents=72 avg_r=3.8995 sum_r=998.28 x<0=0.08 elig=0.63 dorfler_tail=0.07 floor=0 sel=29 7.7s
156/401 | loss=1.1181 ev=0.448 agents=305 avg_r=4.0441 sum_r=1035.29 x<0=0.08 elig=0.63 dorfler_tail=0.07 floor=0 sel=28 7.4s
157/401 | loss=1.1287 ev=0.426 agents=193 avg_r=5.2623 sum_r=1347.16 x<0=0.09 elig=0.63 dorfler_tail=0.08 floor=0 sel=31 7.9s
158/401 | loss=1.0094 ev=0.439 agents=112 avg_r=3.9313 sum_r=1006.42 x<0=0.10 elig=0.64 dorfler_tail=0.07 floor=0 sel=27 7.5s
159/401 | loss=1.2058 ev=0.424 agents=208 avg_r=4.5753 sum_r=1171.28 x<0=0.10 elig=0.63 dorfler_tail=0.07 floor=0 sel=29 7.7s
160/401 | loss=1.0749 ev=0.436 agents=272 avg_r=4.3559 sum_r=1115.11 x<0=0.10 elig=0.63 dorfler_tail=0.07 floor=0 sel=28 7.6s
161/401 | loss=1.2113 ev=0.476 agents=157 avg_r=5.9866 sum_r=1532.58 x<0=0.09 elig=0.63 dorfler_tail=0.07 floor=0 sel=30 7.9s
162/401 | loss=1.2021 ev=0.410 agents=178 avg_r=2.3998 sum_r=614.36 x<0=0.07 elig=0.63 dorfler_tail=0.07 floor=0 sel=27 7.5s
163/401 | loss=1.2304 ev=0.489 agents=1031 avg_r=4.5909 sum_r=1175.26 x<0=0.08 elig=0.63 dorfler_tail=0.07 floor=0 sel=31 8.3s
164/401 | loss=1.1285 ev=0.477 agents=932 avg_r=4.0162 sum_r=1028.14 x<0=0.07 elig=0.63 dorfler_tail=0.07 floor=0 sel=29 7.9s
165/401 | loss=1.2368 ev=0.421 agents=222 avg_r=5.6582 sum_r=1448.51 x<0=0.08 elig=0.64 dorfler_tail=0.07 floor=0 sel=29 7.9s
166/401 | loss=1.1362 ev=0.451 agents=41 avg_r=4.6464 sum_r=1189.47 x<0=0.05 elig=0.63 dorfler_tail=0.07 floor=0 sel=29 7.7s
167/401 | loss=1.1229 ev=0.462 agents=562 avg_r=4.0773 sum_r=1043.78 x<0=0.06 elig=0.63 dorfler_tail=0.07 floor=0 sel=30 7.8s
168/401 | loss=1.1106 ev=0.454 agents=92 avg_r=3.3590 sum_r=859.91 x<0=0.06 elig=0.63 dorfler_tail=0.07 floor=0 sel=27 7.5s
169/401 | loss=1.1281 ev=0.476 agents=280 avg_r=4.4418 sum_r=1137.09 x<0=0.06 elig=0.63 dorfler_tail=0.07 floor=0 sel=30 7.8s
170/401 | loss=1.1614 ev=0.480 agents=89 avg_r=5.0368 sum_r=1289.41 x<0=0.07 elig=0.64 dorfler_tail=0.07 floor=0 sel=28 7.7s
171/401 | loss=1.1519 ev=0.472 agents=798 avg_r=4.8366 sum_r=1238.17 x<0=0.07 elig=0.65 dorfler_tail=0.07 floor=0 sel=28 7.7s
172/401 | loss=1.1491 ev=0.486 agents=1228 avg_r=3.9325 sum_r=1006.73 x<0=0.06 elig=0.63 dorfler_tail=0.07 floor=0 sel=28 7.5s
173/401 | loss=1.1892 ev=0.433 agents=34 avg_r=5.7898 sum_r=1482.19 x<0=0.07 elig=0.64 dorfler_tail=0.07 floor=0 sel=31 7.9s
174/401 | loss=1.2609 ev=0.441 agents=34 avg_r=4.9001 sum_r=1254.42 x<0=0.09 elig=0.64 dorfler_tail=0.07 floor=0 sel=28 7.5s
175/401 | loss=1.0890 ev=0.490 agents=302 avg_r=4.3919 sum_r=1124.32 x<0=0.09 elig=0.64 dorfler_tail=0.07 floor=0 sel=28 7.4s
176/401 | loss=1.2669 ev=0.509 agents=413 avg_r=5.4385 sum_r=1392.26 x<0=0.08 elig=0.64 dorfler_tail=0.07 floor=0 sel=29 7.7s
177/401 | loss=1.1942 ev=0.431 agents=34 avg_r=5.7676 sum_r=1476.51 x<0=0.05 elig=0.63 dorfler_tail=0.07 floor=0 sel=31 7.9s
178/401 | loss=1.2717 ev=0.397 agents=708 avg_r=3.3482 sum_r=857.14 x<0=0.05 elig=0.63 dorfler_tail=0.07 floor=0 sel=27 7.3s
179/401 | loss=1.2435 ev=0.422 agents=132 avg_r=4.4943 sum_r=1150.54 x<0=0.05 elig=0.64 dorfler_tail=0.07 floor=0 sel=27 7.6s
180/401 | loss=1.2206 ev=0.416 agents=1685 avg_r=6.0635 sum_r=1552.26 x<0=0.05 elig=0.63 dorfler_tail=0.07 floor=0 sel=31 7.8s
181/401 | loss=1.2401 ev=0.426 agents=74 avg_r=4.4630 sum_r=1142.54 x<0=0.03 elig=0.64 dorfler_tail=0.07 floor=0 sel=28 7.6s
182/401 | loss=1.1143 ev=0.503 agents=101 avg_r=5.8115 sum_r=1487.76 x<0=0.05 elig=0.64 dorfler_tail=0.07 floor=0 sel=27 7.5s
183/401 | loss=1.1343 ev=0.482 agents=1198 avg_r=4.8445 sum_r=1240.20 x<0=0.05 elig=0.64 dorfler_tail=0.07 floor=0 sel=31 7.9s
184/401 | loss=1.1171 ev=0.467 agents=146 avg_r=3.7889 sum_r=969.97 x<0=0.05 elig=0.63 dorfler_tail=0.07 floor=0 sel=27 7.4s
185/401 | loss=1.1019 ev=0.453 agents=55 avg_r=3.1546 sum_r=807.57 x<0=0.04 elig=0.64 dorfler_tail=0.07 floor=0 sel=26 7.3s
186/401 | loss=1.2893 ev=0.487 agents=241 avg_r=7.1095 sum_r=1820.03 x<0=0.05 elig=0.64 dorfler_tail=0.07 floor=0 sel=30 7.8s
187/401 | loss=1.2431 ev=0.484 agents=1392 avg_r=4.2931 sum_r=1099.02 x<0=0.03 elig=0.64 dorfler_tail=0.07 floor=0 sel=30 8.2s
188/401 | loss=1.2041 ev=0.489 agents=371 avg_r=4.5463 sum_r=1163.85 x<0=0.03 elig=0.63 dorfler_tail=0.07 floor=0 sel=30 8.0s
189/401 | loss=1.1026 ev=0.500 agents=84 avg_r=5.3215 sum_r=1362.30 x<0=0.04 elig=0.64 dorfler_tail=0.07 floor=0 sel=29 7.8s
190/401 | loss=1.1617 ev=0.490 agents=1313 avg_r=3.7937 sum_r=971.19 x<0=0.04 elig=0.64 dorfler_tail=0.07 floor=0 sel=27 7.6s
191/401 | loss=1.2295 ev=0.445 agents=92 avg_r=5.4176 sum_r=1386.91 x<0=0.04 elig=0.64 dorfler_tail=0.07 floor=0 sel=28 7.7s
192/401 | loss=1.1866 ev=0.459 agents=101 avg_r=4.6249 sum_r=1183.98 x<0=0.03 elig=0.64 dorfler_tail=0.07 floor=0 sel=30 7.8s
193/401 | loss=1.1729 ev=0.450 agents=85 avg_r=4.5923 sum_r=1175.63 x<0=0.03 elig=0.64 dorfler_tail=0.07 floor=0 sel=29 7.6s
194/401 | loss=1.1481 ev=0.475 agents=144 avg_r=3.5323 sum_r=904.26 x<0=0.03 elig=0.64 dorfler_tail=0.07 floor=0 sel=29 7.7s
195/401 | loss=1.0329 ev=0.503 agents=452 avg_r=5.7863 sum_r=1481.30 x<0=0.02 elig=0.64 dorfler_tail=0.07 floor=0 sel=27 7.5s
196/401 | loss=1.1833 ev=0.481 agents=80 avg_r=5.2709 sum_r=1349.34 x<0=0.04 elig=0.64 dorfler_tail=0.07 floor=0 sel=30 7.7s
197/401 | loss=1.0276 ev=0.526 agents=345 avg_r=4.4862 sum_r=1148.48 x<0=0.04 elig=0.64 dorfler_tail=0.07 floor=0 sel=27 7.4s
198/401 | loss=1.1872 ev=0.502 agents=112 avg_r=4.0325 sum_r=1032.33 x<0=0.04 elig=0.64 dorfler_tail=0.07 floor=0 sel=31 7.8s
199/401 | loss=1.1178 ev=0.506 agents=55 avg_r=5.9643 sum_r=1526.87 x<0=0.04 elig=0.64 dorfler_tail=0.07 floor=0 sel=30 7.8s
200/401 | loss=1.1306 ev=0.477 agents=383 avg_r=3.5642 sum_r=912.45 x<0=0.03 elig=0.64 dorfler_tail=0.07 floor=0 sel=28 7.5s
[Checkpoint] saved → checkpoints/model_iter0200.pt
201/401 | loss=1.2014 ev=0.489 agents=358 avg_r=4.1907 sum_r=1072.82 x<0=0.04 elig=0.64 dorfler_tail=0.07 floor=0 sel=28 7.6s
202/401 | loss=1.0706 ev=0.486 agents=1012 avg_r=6.4612 sum_r=1654.08 x<0=0.03 elig=0.64 dorfler_tail=0.07 floor=0 sel=31 7.9s
203/401 | loss=1.1745 ev=0.434 agents=112 avg_r=4.4139 sum_r=1129.95 x<0=0.03 elig=0.64 dorfler_tail=0.07 floor=0 sel=29 7.7s
204/401 | loss=1.1475 ev=0.441 agents=66 avg_r=2.0276 sum_r=519.07 x<0=0.03 elig=0.63 dorfler_tail=0.07 floor=0 sel=27 7.3s
205/401 | loss=1.2463 ev=0.448 agents=608 avg_r=4.3842 sum_r=1122.34 x<0=0.02 elig=0.64 dorfler_tail=0.07 floor=0 sel=29 7.7s
206/401 | loss=1.0930 ev=0.507 agents=199 avg_r=3.6852 sum_r=943.42 x<0=0.04 elig=0.63 dorfler_tail=0.07 floor=0 sel=28 7.4s
207/401 | loss=1.0337 ev=0.492 agents=78 avg_r=5.9192 sum_r=1515.31 x<0=0.04 elig=0.63 dorfler_tail=0.08 floor=0 sel=31 7.9s
208/401 | loss=1.0812 ev=0.511 agents=239 avg_r=2.7268 sum_r=698.05 x<0=0.03 elig=0.64 dorfler_tail=0.07 floor=0 sel=28 7.5s
209/401 | loss=1.1193 ev=0.488 agents=290 avg_r=4.8390 sum_r=1238.78 x<0=0.03 elig=0.63 dorfler_tail=0.08 floor=0 sel=31 8.3s
210/401 | loss=1.0216 ev=0.512 agents=560 avg_r=4.4400 sum_r=1136.65 x<0=0.04 elig=0.64 dorfler_tail=0.07 floor=0 sel=27 7.8s
211/401 | loss=1.1425 ev=0.489 agents=82 avg_r=4.0555 sum_r=1038.20 x<0=0.04 elig=0.63 dorfler_tail=0.08 floor=0 sel=30 8.0s
212/401 | loss=1.0860 ev=0.510 agents=159 avg_r=3.0865 sum_r=790.16 x<0=0.02 elig=0.63 dorfler_tail=0.07 floor=0 sel=30 7.9s
213/401 | loss=1.1143 ev=0.461 agents=466 avg_r=4.2296 sum_r=1082.79 x<0=0.04 elig=0.63 dorfler_tail=0.07 floor=0 sel=29 7.7s
214/401 | loss=1.1696 ev=0.455 agents=594 avg_r=3.4831 sum_r=891.68 x<0=0.03 elig=0.63 dorfler_tail=0.07 floor=0 sel=30 7.9s
215/401 | loss=0.9946 ev=0.541 agents=34 avg_r=4.5702 sum_r=1169.98 x<0=0.05 elig=0.62 dorfler_tail=0.08 floor=0 sel=28 7.7s
216/401 | loss=0.9747 ev=0.476 agents=118 avg_r=1.9068 sum_r=488.14 x<0=0.03 elig=0.63 dorfler_tail=0.07 floor=0 sel=27 7.4s
217/401 | loss=1.0586 ev=0.485 agents=463 avg_r=4.5953 sum_r=1176.40 x<0=0.03 elig=0.63 dorfler_tail=0.08 floor=0 sel=32 8.0s
218/401 | loss=0.9961 ev=0.517 agents=782 avg_r=4.2842 sum_r=1096.75 x<0=0.02 elig=0.62 dorfler_tail=0.08 floor=0 sel=31 7.8s
219/401 | loss=0.9959 ev=0.509 agents=455 avg_r=3.9179 sum_r=1002.98 x<0=0.03 elig=0.62 dorfler_tail=0.07 floor=0 sel=27 7.4s
220/401 | loss=1.0537 ev=0.484 agents=104 avg_r=3.2154 sum_r=823.14 x<0=0.02 elig=0.63 dorfler_tail=0.07 floor=0 sel=32 8.0s
221/401 | loss=1.0243 ev=0.528 agents=367 avg_r=3.3715 sum_r=863.11 x<0=0.03 elig=0.62 dorfler_tail=0.08 floor=0 sel=28 7.4s
222/401 | loss=1.0120 ev=0.533 agents=244 avg_r=3.1987 sum_r=818.87 x<0=0.02 elig=0.63 dorfler_tail=0.07 floor=0 sel=30 7.8s
223/401 | loss=1.0247 ev=0.525 agents=544 avg_r=4.3206 sum_r=1106.08 x<0=0.02 elig=0.62 dorfler_tail=0.07 floor=0 sel=29 7.5s
224/401 | loss=1.1590 ev=0.478 agents=86 avg_r=4.5344 sum_r=1160.79 x<0=0.04 elig=0.64 dorfler_tail=0.07 floor=0 sel=29 7.7s
225/401 | loss=1.2170 ev=0.509 agents=154 avg_r=2.9427 sum_r=753.34 x<0=0.02 elig=0.64 dorfler_tail=0.07 floor=0 sel=28 7.5s
226/401 | loss=1.0551 ev=0.507 agents=688 avg_r=4.8525 sum_r=1242.24 x<0=0.02 elig=0.63 dorfler_tail=0.07 floor=0 sel=29 7.6s
227/401 | loss=1.0929 ev=0.495 agents=1389 avg_r=3.4812 sum_r=891.19 x<0=0.03 elig=0.64 dorfler_tail=0.07 floor=0 sel=28 7.5s
228/401 | loss=1.0829 ev=0.484 agents=552 avg_r=4.0013 sum_r=1024.33 x<0=0.02 elig=0.62 dorfler_tail=0.08 floor=0 sel=32 7.8s
229/401 | loss=1.0821 ev=0.543 agents=537 avg_r=4.6780 sum_r=1197.58 x<0=0.03 elig=0.64 dorfler_tail=0.07 floor=0 sel=27 7.4s
230/401 | loss=1.0237 ev=0.517 agents=245 avg_r=4.9465 sum_r=1266.29 x<0=0.02 elig=0.63 dorfler_tail=0.08 floor=0 sel=30 7.8s
231/401 | loss=0.9584 ev=0.520 agents=80 avg_r=3.6329 sum_r=930.02 x<0=0.03 elig=0.63 dorfler_tail=0.07 floor=0 sel=28 7.5s
232/401 | loss=1.0787 ev=0.525 agents=34 avg_r=3.9045 sum_r=999.56 x<0=0.02 elig=0.63 dorfler_tail=0.07 floor=0 sel=30 7.9s
233/401 | loss=0.9447 ev=0.450 agents=78 avg_r=1.3955 sum_r=357.24 x<0=0.02 elig=0.62 dorfler_tail=0.07 floor=0 sel=26 7.9s
234/401 | loss=0.9411 ev=0.544 agents=1678 avg_r=4.2359 sum_r=1084.38 x<0=0.02 elig=0.62 dorfler_tail=0.08 floor=0 sel=33 8.5s
235/401 | loss=1.0497 ev=0.498 agents=1671 avg_r=2.7100 sum_r=693.76 x<0=0.02 elig=0.62 dorfler_tail=0.07 floor=0 sel=27 7.6s
236/401 | loss=1.0309 ev=0.519 agents=34 avg_r=5.2648 sum_r=1347.78 x<0=0.02 elig=0.63 dorfler_tail=0.08 floor=0 sel=32 8.2s
237/401 | loss=1.0213 ev=0.455 agents=89 avg_r=2.4790 sum_r=634.62 x<0=0.03 elig=0.63 dorfler_tail=0.07 floor=0 sel=26 7.2s
238/401 | loss=0.9939 ev=0.543 agents=197 avg_r=4.4294 sum_r=1133.92 x<0=0.03 elig=0.62 dorfler_tail=0.08 floor=0 sel=31 8.0s
239/401 | loss=0.9712 ev=0.480 agents=764 avg_r=1.1436 sum_r=292.76 x<0=0.02 elig=0.62 dorfler_tail=0.08 floor=0 sel=30 7.6s
240/401 | loss=1.0520 ev=0.520 agents=98 avg_r=3.5913 sum_r=919.36 x<0=0.02 elig=0.63 dorfler_tail=0.08 floor=0 sel=29 7.7s
241/401 | loss=1.0733 ev=0.529 agents=242 avg_r=3.8688 sum_r=990.40 x<0=0.03 elig=0.63 dorfler_tail=0.07 floor=0 sel=30 7.9s
242/401 | loss=0.9550 ev=0.471 agents=334 avg_r=1.7380 sum_r=444.92 x<0=0.03 elig=0.62 dorfler_tail=0.08 floor=0 sel=28 7.4s
243/401 | loss=1.0333 ev=0.485 agents=219 avg_r=2.4626 sum_r=630.44 x<0=0.04 elig=0.62 dorfler_tail=0.08 floor=0 sel=30 7.7s
244/401 | loss=0.9276 ev=0.522 agents=34 avg_r=3.0563 sum_r=782.41 x<0=0.04 elig=0.62 dorfler_tail=0.07 floor=0 sel=29 7.7s
245/401 | loss=0.9300 ev=0.556 agents=707 avg_r=3.2084 sum_r=821.35 x<0=0.04 elig=0.62 dorfler_tail=0.08 floor=0 sel=31 7.8s
246/401 | loss=0.9332 ev=0.523 agents=90 avg_r=2.4516 sum_r=627.62 x<0=0.03 elig=0.62 dorfler_tail=0.07 floor=0 sel=29 7.6s
247/401 | loss=0.8789 ev=0.527 agents=34 avg_r=2.0551 sum_r=526.11 x<0=0.04 elig=0.62 dorfler_tail=0.08 floor=0 sel=29 7.7s
248/401 | loss=0.9587 ev=0.532 agents=81 avg_r=3.7530 sum_r=960.77 x<0=0.04 elig=0.61 dorfler_tail=0.08 floor=0 sel=29 7.6s
249/401 | loss=0.9774 ev=0.505 agents=431 avg_r=2.2023 sum_r=563.78 x<0=0.03 elig=0.61 dorfler_tail=0.08 floor=0 sel=31 7.8s
250/401 | loss=0.9413 ev=0.535 agents=299 avg_r=3.2959 sum_r=843.75 x<0=0.04 elig=0.62 dorfler_tail=0.08 floor=0 sel=30 7.9s
[Checkpoint] saved → checkpoints/model_iter0250.pt
251/401 | loss=0.8520 ev=0.529 agents=179 avg_r=1.5290 sum_r=391.43 x<0=0.03 elig=0.61 dorfler_tail=0.08 floor=0 sel=28 7.4s
252/401 | loss=0.9216 ev=0.545 agents=1237 avg_r=3.0161 sum_r=772.13 x<0=0.04 elig=0.62 dorfler_tail=0.07 floor=0 sel=30 7.7s
253/401 | loss=0.9574 ev=0.523 agents=34 avg_r=2.6567 sum_r=680.11 x<0=0.05 elig=0.62 dorfler_tail=0.08 floor=0 sel=29 7.6s
254/401 | loss=0.8550 ev=0.545 agents=438 avg_r=3.3394 sum_r=854.87 x<0=0.04 elig=0.62 dorfler_tail=0.08 floor=0 sel=30 7.7s
255/401 | loss=0.9844 ev=0.498 agents=1420 avg_r=2.4418 sum_r=625.11 x<0=0.06 elig=0.61 dorfler_tail=0.07 floor=0 sel=29 7.9s
256/401 | loss=0.9256 ev=0.573 agents=571 avg_r=5.8027 sum_r=1485.49 x<0=0.05 elig=0.62 dorfler_tail=0.08 floor=0 sel=31 8.5s
257/401 | loss=0.9898 ev=0.483 agents=95 avg_r=1.5702 sum_r=401.96 x<0=0.04 elig=0.62 dorfler_tail=0.08 floor=0 sel=29 7.7s
258/401 | loss=0.9519 ev=0.534 agents=199 avg_r=2.4135 sum_r=617.85 x<0=0.05 elig=0.62 dorfler_tail=0.08 floor=0 sel=28 7.7s
259/401 | loss=0.8724 ev=0.542 agents=235 avg_r=4.1436 sum_r=1060.77 x<0=0.04 elig=0.62 dorfler_tail=0.08 floor=0 sel=31 8.0s
260/401 | loss=0.9030 ev=0.547 agents=306 avg_r=3.4969 sum_r=895.20 x<0=0.03 elig=0.62 dorfler_tail=0.08 floor=0 sel=30 8.0s
261/401 | loss=0.8940 ev=0.553 agents=278 avg_r=1.2701 sum_r=325.14 x<0=0.03 elig=0.62 dorfler_tail=0.08 floor=0 sel=29 7.7s
262/401 | loss=0.9520 ev=0.522 agents=247 avg_r=2.2571 sum_r=577.81 x<0=0.05 elig=0.62 dorfler_tail=0.07 floor=0 sel=26 7.2s
263/401 | loss=0.9901 ev=0.538 agents=34 avg_r=3.7187 sum_r=952.00 x<0=0.05 elig=0.62 dorfler_tail=0.08 floor=0 sel=31 7.9s
264/401 | loss=0.8780 ev=0.551 agents=210 avg_r=2.6562 sum_r=680.00 x<0=0.03 elig=0.62 dorfler_tail=0.08 floor=0 sel=30 7.8s
265/401 | loss=0.9646 ev=0.551 agents=1333 avg_r=2.6470 sum_r=677.63 x<0=0.07 elig=0.63 dorfler_tail=0.08 floor=0 sel=26 7.3s
266/401 | loss=0.8954 ev=0.553 agents=1474 avg_r=4.4314 sum_r=1134.44 x<0=0.05 elig=0.62 dorfler_tail=0.08 floor=0 sel=34 8.4s
267/401 | loss=0.9252 ev=0.547 agents=219 avg_r=1.3921 sum_r=356.39 x<0=0.07 elig=0.62 dorfler_tail=0.08 floor=0 sel=28 7.5s
268/401 | loss=0.9428 ev=0.529 agents=448 avg_r=2.0273 sum_r=518.98 x<0=0.08 elig=0.62 dorfler_tail=0.08 floor=0 sel=28 7.5s
269/401 | loss=1.0055 ev=0.512 agents=119 avg_r=3.3292 sum_r=852.28 x<0=0.06 elig=0.61 dorfler_tail=0.08 floor=0 sel=30 7.7s
270/401 | loss=0.8147 ev=0.546 agents=713 avg_r=2.1123 sum_r=540.76 x<0=0.08 elig=0.62 dorfler_tail=0.08 floor=0 sel=27 7.5s
271/401 | loss=0.8906 ev=0.516 agents=283 avg_r=1.6996 sum_r=435.11 x<0=0.10 elig=0.61 dorfler_tail=0.08 floor=0 sel=30 7.6s
272/401 | loss=0.8740 ev=0.539 agents=615 avg_r=2.0937 sum_r=536.00 x<0=0.09 elig=0.61 dorfler_tail=0.08 floor=0 sel=29 7.6s
273/401 | loss=0.8926 ev=0.534 agents=148 avg_r=3.3738 sum_r=863.69 x<0=0.06 elig=0.62 dorfler_tail=0.08 floor=0 sel=31 8.0s
274/401 | loss=0.9262 ev=0.517 agents=1373 avg_r=1.4594 sum_r=373.60 x<0=0.10 elig=0.61 dorfler_tail=0.08 floor=0 sel=27 7.4s
275/401 | loss=0.8819 ev=0.544 agents=534 avg_r=3.1571 sum_r=808.21 x<0=0.06 elig=0.62 dorfler_tail=0.08 floor=0 sel=30 7.7s
276/401 | loss=0.9410 ev=0.555 agents=197 avg_r=1.4638 sum_r=374.73 x<0=0.06 elig=0.62 dorfler_tail=0.08 floor=0 sel=29 7.6s
277/401 | loss=0.9281 ev=0.544 agents=461 avg_r=3.8103 sum_r=975.44 x<0=0.06 elig=0.62 dorfler_tail=0.08 floor=0 sel=30 8.2s
278/401 | loss=0.9413 ev=0.482 agents=132 avg_r=0.8562 sum_r=219.19 x<0=0.07 elig=0.61 dorfler_tail=0.08 floor=0 sel=27 7.6s
279/401 | loss=1.0616 ev=0.511 agents=387 avg_r=2.8525 sum_r=730.25 x<0=0.04 elig=0.62 dorfler_tail=0.08 floor=0 sel=32 8.2s
280/401 | loss=0.8064 ev=0.565 agents=34 avg_r=2.3635 sum_r=605.05 x<0=0.08 elig=0.61 dorfler_tail=0.08 floor=0 sel=30 8.0s
281/401 | loss=0.9595 ev=0.516 agents=42 avg_r=1.2882 sum_r=329.77 x<0=0.08 elig=0.61 dorfler_tail=0.08 floor=0 sel=28 7.7s
282/401 | loss=0.8745 ev=0.544 agents=212 avg_r=2.6701 sum_r=683.56 x<0=0.08 elig=0.62 dorfler_tail=0.08 floor=0 sel=30 7.8s
283/401 | loss=0.8034 ev=0.556 agents=700 avg_r=1.2154 sum_r=311.15 x<0=0.09 elig=0.61 dorfler_tail=0.08 floor=0 sel=28 7.6s
284/401 | loss=0.9041 ev=0.526 agents=165 avg_r=3.3568 sum_r=859.33 x<0=0.09 elig=0.61 dorfler_tail=0.08 floor=0 sel=31 7.9s
285/401 | loss=0.8815 ev=0.556 agents=92 avg_r=3.1372 sum_r=803.13 x<0=0.10 elig=0.61 dorfler_tail=0.08 floor=0 sel=29 7.7s
286/401 | loss=0.8307 ev=0.536 agents=118 avg_r=1.5978 sum_r=409.03 x<0=0.06 elig=0.61 dorfler_tail=0.08 floor=0 sel=28 7.6s
287/401 | loss=0.8403 ev=0.562 agents=423 avg_r=2.7292 sum_r=698.68 x<0=0.10 elig=0.62 dorfler_tail=0.08 floor=0 sel=29 7.8s
288/401 | loss=0.9074 ev=0.520 agents=169 avg_r=3.6068 sum_r=923.33 x<0=0.07 elig=0.62 dorfler_tail=0.08 floor=0 sel=32 7.9s
289/401 | loss=0.9122 ev=0.561 agents=206 avg_r=2.3035 sum_r=589.70 x<0=0.07 elig=0.62 dorfler_tail=0.08 floor=0 sel=29 7.6s
290/401 | loss=0.9271 ev=0.523 agents=472 avg_r=1.9889 sum_r=509.16 x<0=0.12 elig=0.61 dorfler_tail=0.08 floor=0 sel=28 7.5s
291/401 | loss=0.8706 ev=0.563 agents=811 avg_r=2.7751 sum_r=710.43 x<0=0.10 elig=0.61 dorfler_tail=0.08 floor=0 sel=30 7.8s
292/401 | loss=0.9530 ev=0.524 agents=80 avg_r=2.5786 sum_r=660.13 x<0=0.11 elig=0.62 dorfler_tail=0.08 floor=0 sel=27 7.4s
293/401 | loss=0.8116 ev=0.540 agents=154 avg_r=0.2428 sum_r=62.17 x<0=0.11 elig=0.61 dorfler_tail=0.07 floor=0 sel=28 7.3s
294/401 | loss=0.9140 ev=0.518 agents=175 avg_r=2.3269 sum_r=595.68 x<0=0.09 elig=0.61 dorfler_tail=0.08 floor=0 sel=30 7.8s
295/401 | loss=0.8169 ev=0.527 agents=220 avg_r=3.0412 sum_r=778.55 x<0=0.10 elig=0.60 dorfler_tail=0.08 floor=0 sel=29 7.6s
296/401 | loss=0.8810 ev=0.542 agents=1189 avg_r=2.2746 sum_r=582.29 x<0=0.14 elig=0.62 dorfler_tail=0.08 floor=0 sel=29 7.7s
297/401 | loss=0.8664 ev=0.514 agents=120 avg_r=2.9741 sum_r=761.37 x<0=0.11 elig=0.61 dorfler_tail=0.08 floor=0 sel=29 7.6s
298/401 | loss=0.7806 ev=0.525 agents=399 avg_r=1.6251 sum_r=416.02 x<0=0.11 elig=0.60 dorfler_tail=0.09 floor=0 sel=32 7.6s
299/401 | loss=0.7862 ev=0.541 agents=253 avg_r=0.9686 sum_r=247.97 x<0=0.16 elig=0.61 dorfler_tail=0.08 floor=0 sel=27 7.2s
300/401 | loss=0.8033 ev=0.530 agents=400 avg_r=1.6370 sum_r=419.07 x<0=0.10 elig=0.60 dorfler_tail=0.09 floor=0 sel=34 8.1s
[Checkpoint] saved → checkpoints/model_iter0300.pt
301/401 | loss=0.6913 ev=0.558 agents=86 avg_r=2.2967 sum_r=587.97 x<0=0.17 elig=0.61 dorfler_tail=0.08 floor=0 sel=27 7.8s
302/401 | loss=0.8170 ev=0.548 agents=581 avg_r=0.8235 sum_r=210.82 x<0=0.15 elig=0.60 dorfler_tail=0.08 floor=0 sel=30 7.8s
303/401 | loss=0.6984 ev=0.563 agents=1661 avg_r=-0.4295 sum_r=-109.96 x<0=0.16 elig=0.60 dorfler_tail=0.08 floor=0 sel=29 7.6s
304/401 | loss=0.7311 ev=0.548 agents=224 avg_r=0.8700 sum_r=222.71 x<0=0.14 elig=0.60 dorfler_tail=0.08 floor=0 sel=30 7.7s
305/401 | loss=0.7374 ev=0.523 agents=36 avg_r=1.8769 sum_r=480.49 x<0=0.18 elig=0.60 dorfler_tail=0.08 floor=0 sel=28 7.4s
306/401 | loss=0.7575 ev=0.528 agents=34 avg_r=0.2656 sum_r=67.99 x<0=0.12 elig=0.60 dorfler_tail=0.09 floor=0 sel=32 7.8s
307/401 | loss=0.7143 ev=0.558 agents=383 avg_r=1.9704 sum_r=504.43 x<0=0.15 elig=0.60 dorfler_tail=0.08 floor=0 sel=33 7.7s
308/401 | loss=0.6706 ev=0.578 agents=354 avg_r=1.0502 sum_r=268.85 x<0=0.16 elig=0.60 dorfler_tail=0.08 floor=0 sel=28 7.3s
309/401 | loss=0.7886 ev=0.535 agents=658 avg_r=0.7953 sum_r=203.59 x<0=0.16 elig=0.60 dorfler_tail=0.08 floor=0 sel=29 7.6s
310/401 | loss=0.7315 ev=0.544 agents=101 avg_r=2.9009 sum_r=742.62 x<0=0.15 elig=0.60 dorfler_tail=0.08 floor=0 sel=29 7.6s
311/401 | loss=0.8253 ev=0.511 agents=133 avg_r=-0.0058 sum_r=-1.49 x<0=0.14 elig=0.61 dorfler_tail=0.08 floor=0 sel=30 7.6s
312/401 | loss=0.7325 ev=0.559 agents=710 avg_r=1.4958 sum_r=382.94 x<0=0.17 elig=0.60 dorfler_tail=0.08 floor=0 sel=28 7.3s
313/401 | loss=0.7200 ev=0.561 agents=815 avg_r=2.1457 sum_r=549.29 x<0=0.14 elig=0.60 dorfler_tail=0.08 floor=0 sel=31 7.8s
314/401 | loss=0.7983 ev=0.533 agents=112 avg_r=2.3176 sum_r=593.31 x<0=0.19 elig=0.60 dorfler_tail=0.08 floor=0 sel=31 7.6s
315/401 | loss=0.7438 ev=0.549 agents=1189 avg_r=0.7720 sum_r=197.64 x<0=0.14 elig=0.60 dorfler_tail=0.08 floor=0 sel=29 7.4s
316/401 | loss=0.7035 ev=0.572 agents=255 avg_r=1.6356 sum_r=418.72 x<0=0.14 elig=0.60 dorfler_tail=0.08 floor=0 sel=29 7.4s
317/401 | loss=0.7101 ev=0.532 agents=34 avg_r=3.0508 sum_r=781.01 x<0=0.14 elig=0.61 dorfler_tail=0.07 floor=0 sel=29 7.6s
318/401 | loss=0.8912 ev=0.501 agents=355 avg_r=1.0975 sum_r=280.95 x<0=0.19 elig=0.60 dorfler_tail=0.08 floor=0 sel=30 7.5s
319/401 | loss=0.7239 ev=0.544 agents=248 avg_r=1.5235 sum_r=390.01 x<0=0.15 elig=0.60 dorfler_tail=0.08 floor=0 sel=30 7.5s
320/401 | loss=0.7092 ev=0.565 agents=925 avg_r=1.4157 sum_r=362.42 x<0=0.16 elig=0.60 dorfler_tail=0.08 floor=0 sel=29 7.4s
321/401 | loss=0.7461 ev=0.514 agents=311 avg_r=0.2240 sum_r=57.35 x<0=0.14 elig=0.61 dorfler_tail=0.08 floor=0 sel=28 7.2s
322/401 | loss=0.7413 ev=0.558 agents=963 avg_r=2.1983 sum_r=562.76 x<0=0.15 elig=0.60 dorfler_tail=0.08 floor=0 sel=31 7.7s
323/401 | loss=0.7404 ev=0.539 agents=564 avg_r=-0.1535 sum_r=-39.29 x<0=0.14 elig=0.60 dorfler_tail=0.08 floor=0 sel=28 7.6s
324/401 | loss=0.7739 ev=0.520 agents=377 avg_r=2.4348 sum_r=623.30 x<0=0.17 elig=0.60 dorfler_tail=0.08 floor=0 sel=31 7.9s
325/401 | loss=0.7664 ev=0.514 agents=92 avg_r=-0.3153 sum_r=-80.72 x<0=0.16 elig=0.60 dorfler_tail=0.08 floor=0 sel=29 7.6s
326/401 | loss=0.6448 ev=0.571 agents=1442 avg_r=2.9909 sum_r=765.66 x<0=0.17 elig=0.60 dorfler_tail=0.08 floor=0 sel=31 7.7s
327/401 | loss=0.7037 ev=0.571 agents=1470 avg_r=1.2222 sum_r=312.89 x<0=0.13 elig=0.59 dorfler_tail=0.09 floor=0 sel=28 7.4s
328/401 | loss=0.6932 ev=0.561 agents=301 avg_r=0.1858 sum_r=47.56 x<0=0.18 elig=0.61 dorfler_tail=0.08 floor=0 sel=27 7.3s
329/401 | loss=0.7244 ev=0.546 agents=72 avg_r=0.3477 sum_r=89.02 x<0=0.17 elig=0.60 dorfler_tail=0.08 floor=0 sel=30 7.5s
330/401 | loss=0.7251 ev=0.550 agents=415 avg_r=1.7594 sum_r=450.41 x<0=0.15 elig=0.60 dorfler_tail=0.08 floor=0 sel=30 7.5s
331/401 | loss=0.6579 ev=0.571 agents=1310 avg_r=0.9986 sum_r=255.65 x<0=0.15 elig=0.60 dorfler_tail=0.08 floor=0 sel=30 7.6s
332/401 | loss=0.6545 ev=0.573 agents=221 avg_r=0.5318 sum_r=136.14 x<0=0.18 elig=0.59 dorfler_tail=0.08 floor=0 sel=30 7.4s
333/401 | loss=0.6258 ev=0.555 agents=112 avg_r=2.1892 sum_r=560.44 x<0=0.14 elig=0.60 dorfler_tail=0.08 floor=0 sel=30 7.5s
334/401 | loss=0.6942 ev=0.558 agents=97 avg_r=-0.7035 sum_r=-180.09 x<0=0.13 elig=0.59 dorfler_tail=0.08 floor=0 sel=27 7.1s
335/401 | loss=0.7479 ev=0.497 agents=761 avg_r=1.5436 sum_r=395.16 x<0=0.13 elig=0.60 dorfler_tail=0.08 floor=0 sel=29 7.4s
336/401 | loss=0.6501 ev=0.602 agents=34 avg_r=1.0316 sum_r=264.09 x<0=0.14 elig=0.59 dorfler_tail=0.08 floor=0 sel=30 7.3s
337/401 | loss=0.6053 ev=0.583 agents=428 avg_r=-0.0724 sum_r=-18.53 x<0=0.13 elig=0.59 dorfler_tail=0.08 floor=0 sel=31 7.4s
338/401 | loss=0.6485 ev=0.555 agents=34 avg_r=1.4593 sum_r=373.58 x<0=0.10 elig=0.59 dorfler_tail=0.08 floor=0 sel=31 7.4s
339/401 | loss=0.6234 ev=0.577 agents=615 avg_r=2.0301 sum_r=519.70 x<0=0.17 elig=0.60 dorfler_tail=0.08 floor=0 sel=28 7.2s
340/401 | loss=0.6056 ev=0.551 agents=234 avg_r=-0.4751 sum_r=-121.63 x<0=0.19 elig=0.59 dorfler_tail=0.08 floor=0 sel=29 7.2s
341/401 | loss=0.5780 ev=0.592 agents=186 avg_r=1.5097 sum_r=386.49 x<0=0.12 elig=0.60 dorfler_tail=0.08 floor=0 sel=31 7.4s
342/401 | loss=0.6112 ev=0.590 agents=241 avg_r=1.3269 sum_r=339.69 x<0=0.16 elig=0.59 dorfler_tail=0.08 floor=0 sel=29 7.3s
343/401 | loss=0.7043 ev=0.532 agents=44 avg_r=1.0479 sum_r=268.27 x<0=0.14 elig=0.59 dorfler_tail=0.08 floor=0 sel=31 7.4s
344/401 | loss=0.6269 ev=0.553 agents=308 avg_r=1.5500 sum_r=396.81 x<0=0.15 elig=0.59 dorfler_tail=0.08 floor=0 sel=30 7.3s
345/401 | loss=0.5842 ev=0.580 agents=704 avg_r=2.1546 sum_r=551.57 x<0=0.12 elig=0.59 dorfler_tail=0.08 floor=0 sel=29 7.6s
346/401 | loss=0.6299 ev=0.570 agents=41 avg_r=0.7011 sum_r=179.49 x<0=0.16 elig=0.59 dorfler_tail=0.08 floor=0 sel=33 8.0s
347/401 | loss=0.6316 ev=0.571 agents=278 avg_r=1.6173 sum_r=414.03 x<0=0.15 elig=0.59 dorfler_tail=0.08 floor=0 sel=28 7.3s
348/401 | loss=0.6115 ev=0.573 agents=34 avg_r=0.1809 sum_r=46.32 x<0=0.17 elig=0.59 dorfler_tail=0.08 floor=0 sel=29 7.4s
349/401 | loss=0.6532 ev=0.557 agents=242 avg_r=0.8962 sum_r=229.43 x<0=0.12 elig=0.59 dorfler_tail=0.08 floor=0 sel=31 7.5s
350/401 | loss=0.6516 ev=0.582 agents=44 avg_r=1.0303 sum_r=263.76 x<0=0.15 elig=0.59 dorfler_tail=0.08 floor=0 sel=31 7.6s
[Checkpoint] saved → checkpoints/model_iter0350.pt
351/401 | loss=0.6227 ev=0.554 agents=201 avg_r=0.7558 sum_r=193.50 x<0=0.15 elig=0.59 dorfler_tail=0.08 floor=0 sel=30 7.3s
352/401 | loss=0.5750 ev=0.605 agents=34 avg_r=0.5050 sum_r=129.29 x<0=0.14 elig=0.58 dorfler_tail=0.08 floor=0 sel=30 7.4s
353/401 | loss=0.6413 ev=0.544 agents=457 avg_r=0.2005 sum_r=51.32 x<0=0.17 elig=0.60 dorfler_tail=0.07 floor=0 sel=26 6.9s
354/401 | loss=0.6211 ev=0.589 agents=120 avg_r=2.0601 sum_r=527.38 x<0=0.12 elig=0.59 dorfler_tail=0.08 floor=0 sel=33 7.6s
355/401 | loss=0.6174 ev=0.574 agents=34 avg_r=1.1792 sum_r=301.88 x<0=0.15 elig=0.59 dorfler_tail=0.08 floor=0 sel=30 7.3s
356/401 | loss=0.6271 ev=0.563 agents=267 avg_r=0.9035 sum_r=231.30 x<0=0.15 elig=0.59 dorfler_tail=0.08 floor=0 sel=31 7.4s
357/401 | loss=0.6969 ev=0.569 agents=34 avg_r=-0.5932 sum_r=-151.87 x<0=0.14 elig=0.59 dorfler_tail=0.08 floor=0 sel=31 7.4s
358/401 | loss=0.6315 ev=0.543 agents=34 avg_r=0.1535 sum_r=39.30 x<0=0.15 elig=0.59 dorfler_tail=0.08 floor=0 sel=31 7.4s
359/401 | loss=0.5787 ev=0.598 agents=64 avg_r=-0.8402 sum_r=-215.10 x<0=0.10 elig=0.59 dorfler_tail=0.08 floor=0 sel=30 7.3s
360/401 | loss=0.6417 ev=0.555 agents=174 avg_r=0.4168 sum_r=106.70 x<0=0.19 elig=0.59 dorfler_tail=0.08 floor=0 sel=31 7.4s
361/401 | loss=0.6239 ev=0.563 agents=210 avg_r=0.3188 sum_r=81.61 x<0=0.13 elig=0.59 dorfler_tail=0.08 floor=0 sel=29 7.2s
362/401 | loss=0.5985 ev=0.578 agents=1136 avg_r=0.0481 sum_r=12.32 x<0=0.15 elig=0.59 dorfler_tail=0.08 floor=0 sel=30 7.3s
363/401 | loss=0.5902 ev=0.569 agents=34 avg_r=-0.3036 sum_r=-77.73 x<0=0.15 elig=0.59 dorfler_tail=0.08 floor=0 sel=31 7.4s
364/401 | loss=0.6606 ev=0.567 agents=147 avg_r=-1.4026 sum_r=-359.07 x<0=0.14 elig=0.59 dorfler_tail=0.08 floor=0 sel=30 7.3s
365/401 | loss=0.6312 ev=0.553 agents=150 avg_r=0.4739 sum_r=121.33 x<0=0.13 elig=0.59 dorfler_tail=0.08 floor=0 sel=32 7.6s
366/401 | loss=0.6945 ev=0.551 agents=219 avg_r=-1.1566 sum_r=-296.08 x<0=0.14 elig=0.59 dorfler_tail=0.07 floor=0 sel=27 7.0s
367/401 | loss=0.5808 ev=0.596 agents=85 avg_r=1.6020 sum_r=410.10 x<0=0.13 elig=0.58 dorfler_tail=0.09 floor=0 sel=32 7.7s
368/401 | loss=0.6056 ev=0.568 agents=762 avg_r=-1.3623 sum_r=-348.74 x<0=0.12 elig=0.59 dorfler_tail=0.08 floor=0 sel=30 7.7s
369/401 | loss=0.6481 ev=0.558 agents=177 avg_r=-0.9408 sum_r=-240.85 x<0=0.17 elig=0.59 dorfler_tail=0.08 floor=0 sel=31 7.7s
370/401 | loss=0.6171 ev=0.589 agents=1015 avg_r=-0.9711 sum_r=-248.60 x<0=0.14 elig=0.59 dorfler_tail=0.08 floor=0 sel=30 7.5s
371/401 | loss=0.6382 ev=0.581 agents=97 avg_r=-0.9976 sum_r=-255.40 x<0=0.15 elig=0.59 dorfler_tail=0.08 floor=0 sel=30 7.5s
372/401 | loss=0.6350 ev=0.563 agents=553 avg_r=-2.2484 sum_r=-575.58 x<0=0.14 elig=0.59 dorfler_tail=0.08 floor=0 sel=31 7.5s
373/401 | loss=0.6417 ev=0.550 agents=83 avg_r=-1.2092 sum_r=-309.56 x<0=0.17 elig=0.59 dorfler_tail=0.09 floor=0 sel=30 7.4s
374/401 | loss=0.5959 ev=0.596 agents=72 avg_r=-2.0364 sum_r=-521.32 x<0=0.13 elig=0.58 dorfler_tail=0.09 floor=0 sel=34 7.8s
375/401 | loss=0.5694 ev=0.598 agents=154 avg_r=-0.1396 sum_r=-35.75 x<0=0.17 elig=0.59 dorfler_tail=0.08 floor=0 sel=28 7.3s
376/401 | loss=0.6582 ev=0.562 agents=141 avg_r=-3.1031 sum_r=-794.39 x<0=0.17 elig=0.59 dorfler_tail=0.08 floor=0 sel=30 7.4s
377/401 | loss=0.5972 ev=0.597 agents=1262 avg_r=-1.6131 sum_r=-412.95 x<0=0.15 elig=0.58 dorfler_tail=0.09 floor=0 sel=31 7.5s
378/401 | loss=0.6511 ev=0.595 agents=509 avg_r=-3.4710 sum_r=-888.58 x<0=0.18 elig=0.59 dorfler_tail=0.08 floor=0 sel=30 7.3s
379/401 | loss=0.6209 ev=0.573 agents=36 avg_r=-2.1022 sum_r=-538.17 x<0=0.14 elig=0.59 dorfler_tail=0.08 floor=0 sel=32 7.6s
380/401 | loss=0.5629 ev=0.624 agents=600 avg_r=-1.5907 sum_r=-407.23 x<0=0.14 elig=0.58 dorfler_tail=0.09 floor=0 sel=30 7.4s
381/401 | loss=0.6222 ev=0.572 agents=200 avg_r=-1.0094 sum_r=-258.41 x<0=0.13 elig=0.59 dorfler_tail=0.08 floor=0 sel=31 7.4s
382/401 | loss=0.6545 ev=0.550 agents=388 avg_r=-3.5082 sum_r=-898.10 x<0=0.23 elig=0.60 dorfler_tail=0.08 floor=0 sel=28 7.2s
383/401 | loss=0.5294 ev=0.636 agents=85 avg_r=-0.4136 sum_r=-105.88 x<0=0.12 elig=0.58 dorfler_tail=0.09 floor=0 sel=32 7.5s
384/401 | loss=0.5944 ev=0.579 agents=453 avg_r=-2.0541 sum_r=-525.84 x<0=0.18 elig=0.59 dorfler_tail=0.08 floor=0 sel=30 7.4s
385/401 | loss=0.6282 ev=0.578 agents=171 avg_r=-1.6239 sum_r=-415.72 x<0=0.17 elig=0.59 dorfler_tail=0.08 floor=0 sel=30 7.3s
386/401 | loss=0.6290 ev=0.570 agents=561 avg_r=-1.0137 sum_r=-259.51 x<0=0.15 elig=0.59 dorfler_tail=0.08 floor=0 sel=30 7.4s
387/401 | loss=0.5582 ev=0.611 agents=404 avg_r=-0.5416 sum_r=-138.65 x<0=0.14 elig=0.59 dorfler_tail=0.09 floor=0 sel=31 7.4s
388/401 | loss=0.5969 ev=0.559 agents=154 avg_r=-5.0462 sum_r=-1291.82 x<0=0.17 elig=0.59 dorfler_tail=0.08 floor=0 sel=28 7.2s
389/401 | loss=0.6544 ev=0.548 agents=278 avg_r=-1.2462 sum_r=-319.03 x<0=0.18 elig=0.59 dorfler_tail=0.08 floor=0 sel=31 7.4s
390/401 | loss=0.6538 ev=0.587 agents=856 avg_r=-1.0032 sum_r=-256.82 x<0=0.17 elig=0.58 dorfler_tail=0.08 floor=0 sel=31 7.9s
391/401 | loss=0.5737 ev=0.593 agents=101 avg_r=-2.4208 sum_r=-619.72 x<0=0.15 elig=0.58 dorfler_tail=0.08 floor=0 sel=31 8.0s
392/401 | loss=0.5898 ev=0.601 agents=101 avg_r=-1.4010 sum_r=-358.67 x<0=0.19 elig=0.59 dorfler_tail=0.08 floor=0 sel=29 7.5s
393/401 | loss=0.5977 ev=0.587 agents=219 avg_r=-2.3206 sum_r=-594.07 x<0=0.11 elig=0.58 dorfler_tail=0.09 floor=0 sel=31 7.7s
394/401 | loss=0.5978 ev=0.583 agents=832 avg_r=-2.7761 sum_r=-710.69 x<0=0.19 elig=0.59 dorfler_tail=0.08 floor=0 sel=32 7.8s
395/401 | loss=0.5630 ev=0.607 agents=118 avg_r=-2.8482 sum_r=-729.14 x<0=0.15 elig=0.58 dorfler_tail=0.08 floor=0 sel=30 7.5s
396/401 | loss=0.6266 ev=0.557 agents=980 avg_r=-1.5726 sum_r=-402.60 x<0=0.20 elig=0.58 dorfler_tail=0.08 floor=0 sel=30 7.4s
397/401 | loss=0.5852 ev=0.599 agents=55 avg_r=-4.5732 sum_r=-1170.75 x<0=0.18 elig=0.59 dorfler_tail=0.08 floor=0 sel=31 7.5s
398/401 | loss=0.6173 ev=0.583 agents=604 avg_r=-1.0687 sum_r=-273.59 x<0=0.16 elig=0.58 dorfler_tail=0.09 floor=0 sel=30 7.4s
399/401 | loss=0.5544 ev=0.622 agents=278 avg_r=-2.7659 sum_r=-708.06 x<0=0.18 elig=0.58 dorfler_tail=0.08 floor=0 sel=30 7.4s
400/401 | loss=0.6305 ev=0.572 agents=400 avg_r=-2.0476 sum_r=-524.18 x<0=0.20 elig=0.59 dorfler_tail=0.08 floor=0 sel=30 7.4s
[Checkpoint] saved → checkpoints/model_iter0400.pt
401/401 | loss=0.6506 ev=0.589 agents=230 avg_r=0.0894 sum_r=22.90 x<0=0.13 elig=0.59 dorfler_tail=0.08 floor=0 sel=31 7.4s
[Checkpoint] saved → checkpoints/model_iter0401.pt
[Checkpoint] saved → checkpoints/model_final.pt
[Train] done, total time 3065.4s
Training finished at Fri 29 May 15:49:40 CST 2026

418
logs/train_4537.out Normal file
View File

@ -0,0 +1,418 @@
Starting training at Sat 30 May 15:16:09 CST 2026
Running on node: node06
[Device] cuda
[Env] node_feats=13 edge_feats=1 act_dim=1
[Model] params=92,740
1/401 | loss=1.4016 ev=-0.007 agents=109 avg_r=-3.9659 sum_r=-1015.28 x<0=0.79 elig=0.58 dorfler_tail=0.09 floor=0 sel=35 8.7s
2/401 | loss=1.2826 ev=0.030 agents=193 avg_r=-2.0419 sum_r=-522.72 x<0=0.80 elig=0.58 dorfler_tail=0.08 floor=0 sel=32 7.9s
3/401 | loss=1.2362 ev=0.058 agents=39 avg_r=-4.8186 sum_r=-1233.57 x<0=0.80 elig=0.59 dorfler_tail=0.08 floor=0 sel=32 7.8s
4/401 | loss=1.2801 ev=0.101 agents=34 avg_r=-0.7326 sum_r=-187.54 x<0=0.77 elig=0.58 dorfler_tail=0.09 floor=0 sel=35 8.3s
5/401 | loss=1.1594 ev=0.132 agents=88 avg_r=-3.2420 sum_r=-829.95 x<0=0.74 elig=0.59 dorfler_tail=0.08 floor=0 sel=32 8.0s
6/401 | loss=1.1517 ev=0.181 agents=36 avg_r=-1.5350 sum_r=-392.96 x<0=0.70 elig=0.59 dorfler_tail=0.08 floor=0 sel=32 7.9s
7/401 | loss=1.0153 ev=0.253 agents=34 avg_r=-0.7087 sum_r=-181.42 x<0=0.67 elig=0.58 dorfler_tail=0.08 floor=0 sel=35 8.1s
8/401 | loss=1.0623 ev=0.283 agents=133 avg_r=-0.8781 sum_r=-224.79 x<0=0.65 elig=0.59 dorfler_tail=0.08 floor=0 sel=33 7.9s
9/401 | loss=0.9819 ev=0.304 agents=79 avg_r=-0.5083 sum_r=-130.11 x<0=0.61 elig=0.59 dorfler_tail=0.08 floor=0 sel=31 7.7s
10/401 | loss=0.9743 ev=0.299 agents=82 avg_r=-2.3678 sum_r=-606.16 x<0=0.59 elig=0.59 dorfler_tail=0.08 floor=0 sel=33 7.9s
11/401 | loss=1.0183 ev=0.320 agents=60 avg_r=1.3849 sum_r=354.54 x<0=0.53 elig=0.59 dorfler_tail=0.08 floor=0 sel=31 7.6s
12/401 | loss=0.9395 ev=0.343 agents=48 avg_r=0.4274 sum_r=109.42 x<0=0.50 elig=0.59 dorfler_tail=0.08 floor=0 sel=33 7.8s
13/401 | loss=0.8380 ev=0.367 agents=88 avg_r=-0.3599 sum_r=-92.14 x<0=0.45 elig=0.59 dorfler_tail=0.08 floor=0 sel=32 7.8s
14/401 | loss=0.9338 ev=0.341 agents=40 avg_r=0.1794 sum_r=45.93 x<0=0.42 elig=0.59 dorfler_tail=0.08 floor=0 sel=32 7.7s
15/401 | loss=0.8502 ev=0.381 agents=101 avg_r=0.1944 sum_r=49.77 x<0=0.42 elig=0.59 dorfler_tail=0.08 floor=0 sel=33 8.0s
16/401 | loss=0.9830 ev=0.370 agents=34 avg_r=-1.4113 sum_r=-361.30 x<0=0.40 elig=0.59 dorfler_tail=0.08 floor=0 sel=29 7.4s
17/401 | loss=0.8119 ev=0.428 agents=132 avg_r=1.8346 sum_r=469.66 x<0=0.42 elig=0.59 dorfler_tail=0.08 floor=0 sel=33 7.8s
18/401 | loss=0.8296 ev=0.394 agents=34 avg_r=-0.0265 sum_r=-6.80 x<0=0.36 elig=0.59 dorfler_tail=0.08 floor=0 sel=32 7.7s
19/401 | loss=0.8208 ev=0.414 agents=201 avg_r=-0.1825 sum_r=-46.71 x<0=0.34 elig=0.59 dorfler_tail=0.08 floor=0 sel=34 7.9s
20/401 | loss=0.8558 ev=0.396 agents=120 avg_r=0.8307 sum_r=212.65 x<0=0.30 elig=0.59 dorfler_tail=0.08 floor=0 sel=31 7.7s
21/401 | loss=0.8402 ev=0.410 agents=78 avg_r=-0.2640 sum_r=-67.58 x<0=0.33 elig=0.59 dorfler_tail=0.08 floor=0 sel=31 7.7s
22/401 | loss=0.8100 ev=0.413 agents=44 avg_r=0.1745 sum_r=44.68 x<0=0.33 elig=0.59 dorfler_tail=0.08 floor=0 sel=32 7.7s
23/401 | loss=0.7978 ev=0.416 agents=36 avg_r=-0.3726 sum_r=-95.38 x<0=0.27 elig=0.59 dorfler_tail=0.08 floor=0 sel=32 7.7s
24/401 | loss=0.7886 ev=0.456 agents=175 avg_r=2.2911 sum_r=586.53 x<0=0.23 elig=0.59 dorfler_tail=0.08 floor=0 sel=33 7.9s
25/401 | loss=0.8188 ev=0.402 agents=34 avg_r=0.0163 sum_r=4.18 x<0=0.24 elig=0.59 dorfler_tail=0.07 floor=0 sel=28 7.4s
26/401 | loss=0.8580 ev=0.417 agents=34 avg_r=-0.2140 sum_r=-54.78 x<0=0.23 elig=0.59 dorfler_tail=0.08 floor=0 sel=33 7.9s
27/401 | loss=0.7731 ev=0.413 agents=176 avg_r=-0.0139 sum_r=-3.56 x<0=0.22 elig=0.59 dorfler_tail=0.07 floor=0 sel=31 8.0s
28/401 | loss=0.8363 ev=0.407 agents=219 avg_r=-0.2731 sum_r=-69.90 x<0=0.21 elig=0.59 dorfler_tail=0.08 floor=0 sel=32 8.3s
29/401 | loss=0.8037 ev=0.407 agents=44 avg_r=1.4718 sum_r=376.77 x<0=0.22 elig=0.59 dorfler_tail=0.08 floor=0 sel=32 8.0s
30/401 | loss=0.7398 ev=0.460 agents=133 avg_r=1.9308 sum_r=494.30 x<0=0.21 elig=0.59 dorfler_tail=0.08 floor=0 sel=29 7.6s
31/401 | loss=0.8308 ev=0.421 agents=44 avg_r=1.0891 sum_r=278.82 x<0=0.19 elig=0.59 dorfler_tail=0.08 floor=0 sel=32 7.8s
32/401 | loss=0.8537 ev=0.451 agents=34 avg_r=0.4553 sum_r=116.57 x<0=0.16 elig=0.59 dorfler_tail=0.07 floor=0 sel=33 7.9s
33/401 | loss=0.7271 ev=0.457 agents=193 avg_r=2.1602 sum_r=553.02 x<0=0.11 elig=0.59 dorfler_tail=0.08 floor=0 sel=31 7.7s
34/401 | loss=0.8864 ev=0.395 agents=132 avg_r=0.0379 sum_r=9.71 x<0=0.13 elig=0.60 dorfler_tail=0.07 floor=0 sel=31 7.6s
35/401 | loss=0.7846 ev=0.418 agents=60 avg_r=1.8461 sum_r=472.61 x<0=0.11 elig=0.59 dorfler_tail=0.08 floor=0 sel=30 7.5s
36/401 | loss=0.8040 ev=0.428 agents=139 avg_r=0.1920 sum_r=49.14 x<0=0.08 elig=0.59 dorfler_tail=0.07 floor=0 sel=29 7.5s
37/401 | loss=0.8225 ev=0.432 agents=228 avg_r=0.9105 sum_r=233.08 x<0=0.11 elig=0.59 dorfler_tail=0.07 floor=0 sel=30 7.6s
38/401 | loss=0.7612 ev=0.431 agents=34 avg_r=1.5990 sum_r=409.35 x<0=0.11 elig=0.60 dorfler_tail=0.07 floor=0 sel=31 7.7s
39/401 | loss=0.7474 ev=0.474 agents=60 avg_r=2.1517 sum_r=550.82 x<0=0.10 elig=0.60 dorfler_tail=0.07 floor=0 sel=29 7.4s
40/401 | loss=0.7913 ev=0.417 agents=228 avg_r=2.7027 sum_r=691.89 x<0=0.09 elig=0.59 dorfler_tail=0.08 floor=0 sel=33 7.8s
41/401 | loss=0.7976 ev=0.453 agents=199 avg_r=1.2828 sum_r=328.39 x<0=0.10 elig=0.60 dorfler_tail=0.07 floor=0 sel=28 7.3s
42/401 | loss=0.7862 ev=0.467 agents=40 avg_r=2.1315 sum_r=545.65 x<0=0.07 elig=0.60 dorfler_tail=0.07 floor=0 sel=30 7.5s
43/401 | loss=0.7528 ev=0.447 agents=34 avg_r=1.6585 sum_r=424.58 x<0=0.09 elig=0.60 dorfler_tail=0.07 floor=0 sel=30 7.5s
44/401 | loss=0.8170 ev=0.432 agents=193 avg_r=1.4874 sum_r=380.76 x<0=0.09 elig=0.60 dorfler_tail=0.07 floor=0 sel=31 7.6s
45/401 | loss=0.8174 ev=0.455 agents=230 avg_r=1.1440 sum_r=292.86 x<0=0.08 elig=0.60 dorfler_tail=0.07 floor=0 sel=29 7.3s
46/401 | loss=0.7965 ev=0.445 agents=34 avg_r=2.3036 sum_r=589.72 x<0=0.09 elig=0.60 dorfler_tail=0.07 floor=0 sel=30 7.5s
47/401 | loss=0.7296 ev=0.437 agents=120 avg_r=3.0991 sum_r=793.37 x<0=0.09 elig=0.59 dorfler_tail=0.07 floor=0 sel=30 7.4s
48/401 | loss=0.7574 ev=0.426 agents=34 avg_r=1.4336 sum_r=366.99 x<0=0.06 elig=0.60 dorfler_tail=0.07 floor=0 sel=30 7.4s
49/401 | loss=0.7115 ev=0.452 agents=314 avg_r=4.5889 sum_r=1174.75 x<0=0.09 elig=0.60 dorfler_tail=0.07 floor=0 sel=31 8.1s
50/401 | loss=0.8021 ev=0.447 agents=309 avg_r=1.0066 sum_r=257.70 x<0=0.08 elig=0.60 dorfler_tail=0.07 floor=0 sel=29 7.7s
[Checkpoint] saved → checkpoints/model_iter0050.pt
51/401 | loss=0.7353 ev=0.461 agents=220 avg_r=2.4559 sum_r=628.70 x<0=0.08 elig=0.60 dorfler_tail=0.07 floor=0 sel=29 7.5s
52/401 | loss=0.7844 ev=0.429 agents=75 avg_r=1.7472 sum_r=447.29 x<0=0.08 elig=0.60 dorfler_tail=0.07 floor=0 sel=29 7.5s
53/401 | loss=0.7153 ev=0.484 agents=34 avg_r=4.0922 sum_r=1047.60 x<0=0.08 elig=0.60 dorfler_tail=0.07 floor=0 sel=29 7.4s
54/401 | loss=0.6924 ev=0.475 agents=325 avg_r=2.5784 sum_r=660.07 x<0=0.07 elig=0.60 dorfler_tail=0.07 floor=0 sel=30 7.6s
55/401 | loss=0.7292 ev=0.441 agents=1592 avg_r=2.6958 sum_r=690.12 x<0=0.07 elig=0.60 dorfler_tail=0.07 floor=0 sel=31 7.6s
56/401 | loss=0.7136 ev=0.448 agents=81 avg_r=2.9107 sum_r=745.14 x<0=0.07 elig=0.61 dorfler_tail=0.07 floor=0 sel=27 7.2s
57/401 | loss=0.7957 ev=0.442 agents=221 avg_r=2.5431 sum_r=651.03 x<0=0.08 elig=0.60 dorfler_tail=0.07 floor=0 sel=30 7.5s
58/401 | loss=0.7484 ev=0.477 agents=592 avg_r=3.0523 sum_r=781.38 x<0=0.08 elig=0.60 dorfler_tail=0.07 floor=0 sel=31 7.6s
59/401 | loss=0.8223 ev=0.424 agents=260 avg_r=1.2105 sum_r=309.90 x<0=0.06 elig=0.60 dorfler_tail=0.07 floor=0 sel=29 7.4s
60/401 | loss=0.7966 ev=0.463 agents=34 avg_r=1.3681 sum_r=350.25 x<0=0.05 elig=0.60 dorfler_tail=0.07 floor=0 sel=30 7.5s
61/401 | loss=0.6900 ev=0.478 agents=589 avg_r=3.2758 sum_r=838.62 x<0=0.05 elig=0.60 dorfler_tail=0.07 floor=0 sel=28 7.3s
62/401 | loss=0.7203 ev=0.462 agents=404 avg_r=3.5533 sum_r=909.64 x<0=0.07 elig=0.59 dorfler_tail=0.08 floor=0 sel=31 7.6s
63/401 | loss=0.7498 ev=0.437 agents=88 avg_r=1.3140 sum_r=336.38 x<0=0.08 elig=0.60 dorfler_tail=0.07 floor=0 sel=29 7.3s
64/401 | loss=0.6874 ev=0.460 agents=87 avg_r=3.1493 sum_r=806.22 x<0=0.08 elig=0.60 dorfler_tail=0.07 floor=0 sel=31 7.6s
65/401 | loss=0.7238 ev=0.479 agents=504 avg_r=2.8049 sum_r=718.04 x<0=0.08 elig=0.60 dorfler_tail=0.07 floor=0 sel=29 7.5s
66/401 | loss=0.7026 ev=0.479 agents=612 avg_r=3.3964 sum_r=869.48 x<0=0.08 elig=0.60 dorfler_tail=0.07 floor=0 sel=30 7.4s
67/401 | loss=0.7430 ev=0.449 agents=34 avg_r=2.2715 sum_r=581.51 x<0=0.08 elig=0.60 dorfler_tail=0.07 floor=0 sel=29 7.4s
68/401 | loss=0.6981 ev=0.444 agents=563 avg_r=2.3441 sum_r=600.10 x<0=0.07 elig=0.59 dorfler_tail=0.07 floor=0 sel=30 7.5s
69/401 | loss=0.7046 ev=0.472 agents=82 avg_r=2.8354 sum_r=725.87 x<0=0.08 elig=0.60 dorfler_tail=0.07 floor=0 sel=29 7.4s
70/401 | loss=0.7231 ev=0.466 agents=679 avg_r=2.1406 sum_r=547.99 x<0=0.08 elig=0.60 dorfler_tail=0.07 floor=0 sel=29 7.4s
71/401 | loss=0.6765 ev=0.461 agents=177 avg_r=2.7769 sum_r=710.88 x<0=0.07 elig=0.60 dorfler_tail=0.07 floor=0 sel=28 7.4s
72/401 | loss=0.7200 ev=0.467 agents=417 avg_r=2.5203 sum_r=645.20 x<0=0.07 elig=0.60 dorfler_tail=0.07 floor=0 sel=29 7.7s
73/401 | loss=0.7056 ev=0.470 agents=406 avg_r=2.4355 sum_r=623.49 x<0=0.06 elig=0.60 dorfler_tail=0.07 floor=0 sel=29 7.4s
74/401 | loss=0.7596 ev=0.469 agents=39 avg_r=3.4787 sum_r=890.55 x<0=0.07 elig=0.60 dorfler_tail=0.07 floor=0 sel=29 7.4s
75/401 | loss=0.8122 ev=0.437 agents=76 avg_r=0.1922 sum_r=49.19 x<0=0.06 elig=0.60 dorfler_tail=0.07 floor=0 sel=29 7.5s
76/401 | loss=0.7356 ev=0.480 agents=743 avg_r=3.3444 sum_r=856.16 x<0=0.06 elig=0.60 dorfler_tail=0.07 floor=0 sel=29 7.4s
77/401 | loss=0.6961 ev=0.463 agents=868 avg_r=3.1062 sum_r=795.20 x<0=0.05 elig=0.60 dorfler_tail=0.07 floor=0 sel=29 7.4s
78/401 | loss=0.6751 ev=0.472 agents=239 avg_r=2.1832 sum_r=558.90 x<0=0.07 elig=0.60 dorfler_tail=0.07 floor=0 sel=29 7.3s
79/401 | loss=0.7819 ev=0.463 agents=92 avg_r=3.4287 sum_r=877.75 x<0=0.07 elig=0.60 dorfler_tail=0.07 floor=0 sel=31 7.5s
80/401 | loss=0.7031 ev=0.443 agents=100 avg_r=3.0162 sum_r=772.14 x<0=0.09 elig=0.60 dorfler_tail=0.07 floor=0 sel=29 7.3s
81/401 | loss=0.7328 ev=0.468 agents=216 avg_r=1.5925 sum_r=407.67 x<0=0.08 elig=0.60 dorfler_tail=0.07 floor=0 sel=29 7.3s
82/401 | loss=0.6882 ev=0.478 agents=500 avg_r=4.0837 sum_r=1045.44 x<0=0.09 elig=0.60 dorfler_tail=0.07 floor=0 sel=30 7.5s
83/401 | loss=0.7674 ev=0.439 agents=209 avg_r=2.4277 sum_r=621.49 x<0=0.10 elig=0.60 dorfler_tail=0.07 floor=0 sel=27 7.1s
84/401 | loss=0.6714 ev=0.467 agents=226 avg_r=3.4643 sum_r=886.86 x<0=0.09 elig=0.60 dorfler_tail=0.07 floor=0 sel=28 7.3s
85/401 | loss=0.6888 ev=0.457 agents=661 avg_r=3.5194 sum_r=900.96 x<0=0.09 elig=0.60 dorfler_tail=0.07 floor=0 sel=29 7.3s
86/401 | loss=0.7823 ev=0.465 agents=78 avg_r=3.6703 sum_r=939.61 x<0=0.10 elig=0.61 dorfler_tail=0.07 floor=0 sel=29 7.5s
87/401 | loss=0.7369 ev=0.441 agents=426 avg_r=3.0157 sum_r=772.03 x<0=0.08 elig=0.60 dorfler_tail=0.07 floor=0 sel=29 7.3s
88/401 | loss=0.7635 ev=0.440 agents=445 avg_r=2.9807 sum_r=763.05 x<0=0.07 elig=0.61 dorfler_tail=0.07 floor=0 sel=28 7.3s
89/401 | loss=0.6536 ev=0.493 agents=42 avg_r=4.4092 sum_r=1128.74 x<0=0.09 elig=0.61 dorfler_tail=0.07 floor=0 sel=28 7.3s
90/401 | loss=0.7260 ev=0.459 agents=174 avg_r=2.2528 sum_r=576.72 x<0=0.08 elig=0.61 dorfler_tail=0.07 floor=0 sel=29 7.3s
91/401 | loss=0.8182 ev=0.451 agents=189 avg_r=2.7882 sum_r=713.78 x<0=0.07 elig=0.61 dorfler_tail=0.07 floor=0 sel=27 7.2s
92/401 | loss=0.7171 ev=0.475 agents=930 avg_r=2.9107 sum_r=745.14 x<0=0.08 elig=0.61 dorfler_tail=0.07 floor=0 sel=27 7.3s
93/401 | loss=0.7178 ev=0.462 agents=950 avg_r=2.5842 sum_r=661.56 x<0=0.09 elig=0.61 dorfler_tail=0.07 floor=0 sel=28 7.2s
94/401 | loss=0.6635 ev=0.480 agents=278 avg_r=4.6649 sum_r=1194.22 x<0=0.08 elig=0.61 dorfler_tail=0.07 floor=0 sel=30 8.0s
95/401 | loss=0.8666 ev=0.417 agents=516 avg_r=2.5170 sum_r=644.35 x<0=0.09 elig=0.61 dorfler_tail=0.07 floor=0 sel=29 7.5s
96/401 | loss=0.6856 ev=0.473 agents=225 avg_r=3.6171 sum_r=925.98 x<0=0.09 elig=0.60 dorfler_tail=0.07 floor=0 sel=28 7.5s
97/401 | loss=0.7293 ev=0.466 agents=139 avg_r=3.4967 sum_r=895.16 x<0=0.09 elig=0.61 dorfler_tail=0.07 floor=0 sel=29 7.6s
98/401 | loss=0.6989 ev=0.477 agents=386 avg_r=3.2573 sum_r=833.87 x<0=0.08 elig=0.61 dorfler_tail=0.07 floor=0 sel=27 7.3s
99/401 | loss=0.7278 ev=0.456 agents=607 avg_r=3.5721 sum_r=914.45 x<0=0.06 elig=0.60 dorfler_tail=0.07 floor=0 sel=29 7.6s
100/401 | loss=0.6917 ev=0.488 agents=395 avg_r=2.5313 sum_r=648.00 x<0=0.06 elig=0.60 dorfler_tail=0.07 floor=0 sel=28 7.4s
[Checkpoint] saved → checkpoints/model_iter0100.pt
101/401 | loss=0.6450 ev=0.482 agents=118 avg_r=3.6129 sum_r=924.89 x<0=0.06 elig=0.60 dorfler_tail=0.07 floor=0 sel=29 7.4s
102/401 | loss=0.6719 ev=0.502 agents=82 avg_r=3.9205 sum_r=1003.65 x<0=0.07 elig=0.60 dorfler_tail=0.07 floor=0 sel=28 7.2s
103/401 | loss=0.8262 ev=0.444 agents=34 avg_r=0.9714 sum_r=248.68 x<0=0.07 elig=0.61 dorfler_tail=0.06 floor=0 sel=28 7.3s
104/401 | loss=0.6693 ev=0.473 agents=205 avg_r=4.0583 sum_r=1038.93 x<0=0.09 elig=0.60 dorfler_tail=0.07 floor=0 sel=30 7.4s
105/401 | loss=0.7109 ev=0.493 agents=278 avg_r=3.3932 sum_r=868.66 x<0=0.07 elig=0.61 dorfler_tail=0.07 floor=0 sel=30 7.5s
106/401 | loss=0.7028 ev=0.490 agents=80 avg_r=3.2735 sum_r=838.02 x<0=0.08 elig=0.61 dorfler_tail=0.07 floor=0 sel=26 7.0s
107/401 | loss=0.6651 ev=0.484 agents=72 avg_r=2.5184 sum_r=644.70 x<0=0.07 elig=0.60 dorfler_tail=0.07 floor=0 sel=29 7.3s
108/401 | loss=0.6931 ev=0.461 agents=157 avg_r=1.9714 sum_r=504.68 x<0=0.07 elig=0.60 dorfler_tail=0.07 floor=0 sel=31 7.4s
109/401 | loss=0.6012 ev=0.517 agents=169 avg_r=3.9352 sum_r=1007.42 x<0=0.07 elig=0.60 dorfler_tail=0.07 floor=0 sel=29 7.3s
110/401 | loss=0.7184 ev=0.484 agents=34 avg_r=2.9819 sum_r=763.37 x<0=0.06 elig=0.61 dorfler_tail=0.07 floor=0 sel=27 7.3s
111/401 | loss=0.6751 ev=0.493 agents=403 avg_r=3.0738 sum_r=786.90 x<0=0.06 elig=0.60 dorfler_tail=0.07 floor=0 sel=30 7.4s
112/401 | loss=0.6429 ev=0.488 agents=161 avg_r=2.6077 sum_r=667.57 x<0=0.06 elig=0.60 dorfler_tail=0.07 floor=0 sel=28 7.2s
113/401 | loss=0.6752 ev=0.502 agents=55 avg_r=3.7771 sum_r=966.93 x<0=0.06 elig=0.60 dorfler_tail=0.07 floor=0 sel=28 7.3s
114/401 | loss=0.7463 ev=0.451 agents=278 avg_r=2.8845 sum_r=738.44 x<0=0.06 elig=0.61 dorfler_tail=0.07 floor=0 sel=30 7.4s
115/401 | loss=0.7711 ev=0.449 agents=1458 avg_r=1.9170 sum_r=490.75 x<0=0.05 elig=0.61 dorfler_tail=0.07 floor=0 sel=27 7.1s
116/401 | loss=0.6691 ev=0.478 agents=322 avg_r=2.8004 sum_r=716.90 x<0=0.05 elig=0.61 dorfler_tail=0.07 floor=0 sel=28 7.2s
117/401 | loss=0.7584 ev=0.482 agents=157 avg_r=1.9519 sum_r=499.68 x<0=0.05 elig=0.61 dorfler_tail=0.07 floor=0 sel=30 7.4s
118/401 | loss=0.6645 ev=0.505 agents=34 avg_r=4.1436 sum_r=1060.76 x<0=0.05 elig=0.61 dorfler_tail=0.07 floor=0 sel=29 7.9s
119/401 | loss=0.7026 ev=0.482 agents=525 avg_r=2.6891 sum_r=688.42 x<0=0.05 elig=0.61 dorfler_tail=0.07 floor=0 sel=28 7.5s
120/401 | loss=0.6424 ev=0.476 agents=449 avg_r=3.1357 sum_r=802.74 x<0=0.04 elig=0.60 dorfler_tail=0.07 floor=0 sel=29 7.4s
121/401 | loss=0.6441 ev=0.485 agents=751 avg_r=3.1465 sum_r=805.51 x<0=0.04 elig=0.61 dorfler_tail=0.07 floor=0 sel=28 7.5s
122/401 | loss=0.7017 ev=0.468 agents=97 avg_r=2.4756 sum_r=633.75 x<0=0.05 elig=0.61 dorfler_tail=0.07 floor=0 sel=27 7.4s
123/401 | loss=0.8205 ev=0.460 agents=88 avg_r=3.0468 sum_r=779.99 x<0=0.06 elig=0.61 dorfler_tail=0.07 floor=0 sel=29 7.6s
124/401 | loss=0.7868 ev=0.486 agents=34 avg_r=3.0342 sum_r=776.75 x<0=0.05 elig=0.61 dorfler_tail=0.07 floor=0 sel=28 7.4s
125/401 | loss=0.7189 ev=0.456 agents=631 avg_r=3.7444 sum_r=958.57 x<0=0.06 elig=0.60 dorfler_tail=0.07 floor=0 sel=29 7.4s
126/401 | loss=0.7631 ev=0.462 agents=205 avg_r=3.6346 sum_r=930.47 x<0=0.05 elig=0.61 dorfler_tail=0.07 floor=0 sel=26 7.3s
127/401 | loss=0.8456 ev=0.490 agents=276 avg_r=3.9878 sum_r=1020.87 x<0=0.05 elig=0.62 dorfler_tail=0.07 floor=0 sel=31 7.9s
128/401 | loss=0.7728 ev=0.453 agents=216 avg_r=3.3635 sum_r=861.06 x<0=0.05 elig=0.61 dorfler_tail=0.07 floor=0 sel=27 7.3s
129/401 | loss=0.6854 ev=0.497 agents=171 avg_r=3.1932 sum_r=817.45 x<0=0.05 elig=0.60 dorfler_tail=0.07 floor=0 sel=29 7.4s
130/401 | loss=0.6694 ev=0.502 agents=773 avg_r=3.1194 sum_r=798.57 x<0=0.05 elig=0.61 dorfler_tail=0.07 floor=0 sel=29 7.4s
131/401 | loss=0.8146 ev=0.475 agents=417 avg_r=4.4338 sum_r=1135.05 x<0=0.05 elig=0.61 dorfler_tail=0.07 floor=0 sel=29 7.6s
132/401 | loss=0.6740 ev=0.434 agents=199 avg_r=1.0849 sum_r=277.74 x<0=0.04 elig=0.61 dorfler_tail=0.07 floor=0 sel=25 6.9s
133/401 | loss=0.6344 ev=0.538 agents=199 avg_r=4.8060 sum_r=1230.34 x<0=0.05 elig=0.60 dorfler_tail=0.07 floor=0 sel=30 7.5s
134/401 | loss=0.7608 ev=0.484 agents=109 avg_r=2.4116 sum_r=617.37 x<0=0.04 elig=0.61 dorfler_tail=0.07 floor=0 sel=29 7.4s
135/401 | loss=0.6871 ev=0.497 agents=81 avg_r=2.6706 sum_r=683.68 x<0=0.04 elig=0.61 dorfler_tail=0.07 floor=0 sel=29 7.5s
136/401 | loss=0.6854 ev=0.500 agents=349 avg_r=3.1550 sum_r=807.67 x<0=0.04 elig=0.60 dorfler_tail=0.07 floor=0 sel=28 7.3s
137/401 | loss=0.6222 ev=0.475 agents=309 avg_r=2.9599 sum_r=757.74 x<0=0.04 elig=0.60 dorfler_tail=0.07 floor=0 sel=27 7.2s
138/401 | loss=0.7838 ev=0.473 agents=34 avg_r=3.0775 sum_r=787.84 x<0=0.03 elig=0.61 dorfler_tail=0.07 floor=0 sel=28 7.3s
139/401 | loss=0.6776 ev=0.469 agents=137 avg_r=4.6078 sum_r=1179.59 x<0=0.04 elig=0.60 dorfler_tail=0.07 floor=0 sel=31 7.6s
140/401 | loss=0.7131 ev=0.482 agents=34 avg_r=2.7598 sum_r=706.51 x<0=0.03 elig=0.60 dorfler_tail=0.07 floor=0 sel=29 7.6s
141/401 | loss=0.6298 ev=0.510 agents=716 avg_r=2.6834 sum_r=686.95 x<0=0.03 elig=0.60 dorfler_tail=0.07 floor=0 sel=29 7.7s
142/401 | loss=0.6687 ev=0.482 agents=118 avg_r=2.9901 sum_r=765.46 x<0=0.03 elig=0.60 dorfler_tail=0.07 floor=0 sel=29 7.5s
143/401 | loss=0.6278 ev=0.538 agents=684 avg_r=4.2436 sum_r=1086.37 x<0=0.03 elig=0.60 dorfler_tail=0.07 floor=0 sel=31 7.7s
144/401 | loss=0.6646 ev=0.496 agents=1317 avg_r=1.9731 sum_r=505.11 x<0=0.03 elig=0.61 dorfler_tail=0.07 floor=0 sel=26 7.2s
145/401 | loss=0.7301 ev=0.477 agents=324 avg_r=2.6170 sum_r=669.96 x<0=0.03 elig=0.60 dorfler_tail=0.07 floor=0 sel=29 7.5s
146/401 | loss=0.7054 ev=0.474 agents=318 avg_r=3.0373 sum_r=777.55 x<0=0.02 elig=0.60 dorfler_tail=0.07 floor=0 sel=32 7.6s
147/401 | loss=0.6366 ev=0.503 agents=260 avg_r=1.7196 sum_r=440.21 x<0=0.02 elig=0.60 dorfler_tail=0.07 floor=0 sel=26 7.1s
148/401 | loss=0.6500 ev=0.527 agents=64 avg_r=3.5001 sum_r=896.04 x<0=0.02 elig=0.60 dorfler_tail=0.07 floor=0 sel=31 7.5s
149/401 | loss=0.7272 ev=0.504 agents=406 avg_r=1.2588 sum_r=322.26 x<0=0.02 elig=0.60 dorfler_tail=0.07 floor=0 sel=29 7.2s
150/401 | loss=0.5931 ev=0.548 agents=494 avg_r=3.0807 sum_r=788.65 x<0=0.02 elig=0.60 dorfler_tail=0.07 floor=0 sel=28 7.2s
[Checkpoint] saved → checkpoints/model_iter0150.pt
151/401 | loss=0.7106 ev=0.473 agents=276 avg_r=2.7628 sum_r=707.27 x<0=0.02 elig=0.60 dorfler_tail=0.08 floor=0 sel=31 7.5s
152/401 | loss=0.7196 ev=0.509 agents=917 avg_r=0.6032 sum_r=154.42 x<0=0.02 elig=0.60 dorfler_tail=0.07 floor=0 sel=28 7.2s
153/401 | loss=0.6383 ev=0.494 agents=252 avg_r=4.4047 sum_r=1127.62 x<0=0.02 elig=0.60 dorfler_tail=0.07 floor=0 sel=30 7.4s
154/401 | loss=0.6348 ev=0.535 agents=310 avg_r=3.2224 sum_r=824.94 x<0=0.02 elig=0.60 dorfler_tail=0.07 floor=0 sel=30 7.4s
155/401 | loss=0.7558 ev=0.478 agents=550 avg_r=2.0697 sum_r=529.83 x<0=0.01 elig=0.60 dorfler_tail=0.07 floor=0 sel=29 7.3s
156/401 | loss=0.7824 ev=0.471 agents=759 avg_r=2.2078 sum_r=565.21 x<0=0.03 elig=0.61 dorfler_tail=0.07 floor=0 sel=27 7.2s
157/401 | loss=0.6814 ev=0.487 agents=66 avg_r=2.7153 sum_r=695.12 x<0=0.02 elig=0.60 dorfler_tail=0.07 floor=0 sel=30 7.4s
158/401 | loss=0.6918 ev=0.475 agents=157 avg_r=4.0377 sum_r=1033.66 x<0=0.01 elig=0.60 dorfler_tail=0.07 floor=0 sel=28 7.3s
159/401 | loss=0.6960 ev=0.497 agents=210 avg_r=4.4194 sum_r=1131.36 x<0=0.02 elig=0.61 dorfler_tail=0.07 floor=0 sel=28 7.4s
160/401 | loss=0.8230 ev=0.463 agents=72 avg_r=3.2715 sum_r=837.50 x<0=0.01 elig=0.61 dorfler_tail=0.07 floor=0 sel=29 7.6s
161/401 | loss=0.8833 ev=0.462 agents=101 avg_r=3.1055 sum_r=795.01 x<0=0.01 elig=0.61 dorfler_tail=0.07 floor=0 sel=28 7.5s
162/401 | loss=0.7523 ev=0.439 agents=1039 avg_r=2.8131 sum_r=720.15 x<0=0.01 elig=0.60 dorfler_tail=0.07 floor=0 sel=28 7.3s
163/401 | loss=0.7434 ev=0.484 agents=857 avg_r=5.0866 sum_r=1302.18 x<0=0.01 elig=0.61 dorfler_tail=0.07 floor=0 sel=29 8.0s
164/401 | loss=0.9129 ev=0.448 agents=208 avg_r=3.0212 sum_r=773.42 x<0=0.02 elig=0.62 dorfler_tail=0.06 floor=0 sel=27 7.7s
165/401 | loss=0.8110 ev=0.503 agents=72 avg_r=5.2848 sum_r=1352.92 x<0=0.02 elig=0.62 dorfler_tail=0.08 floor=0 sel=30 8.1s
166/401 | loss=0.9153 ev=0.417 agents=443 avg_r=2.6762 sum_r=685.11 x<0=0.02 elig=0.62 dorfler_tail=0.07 floor=0 sel=26 7.5s
167/401 | loss=0.8216 ev=0.435 agents=72 avg_r=4.6195 sum_r=1182.58 x<0=0.02 elig=0.63 dorfler_tail=0.07 floor=0 sel=28 7.8s
168/401 | loss=0.8799 ev=0.468 agents=218 avg_r=5.6227 sum_r=1439.40 x<0=0.02 elig=0.62 dorfler_tail=0.07 floor=0 sel=27 7.8s
169/401 | loss=0.9677 ev=0.464 agents=64 avg_r=3.2444 sum_r=830.56 x<0=0.02 elig=0.62 dorfler_tail=0.07 floor=0 sel=28 7.5s
170/401 | loss=0.8684 ev=0.450 agents=1183 avg_r=4.2454 sum_r=1086.82 x<0=0.02 elig=0.62 dorfler_tail=0.07 floor=0 sel=27 7.5s
171/401 | loss=0.9914 ev=0.457 agents=248 avg_r=5.2504 sum_r=1344.10 x<0=0.02 elig=0.62 dorfler_tail=0.07 floor=0 sel=28 7.7s
172/401 | loss=0.9352 ev=0.455 agents=66 avg_r=4.8499 sum_r=1241.57 x<0=0.02 elig=0.62 dorfler_tail=0.07 floor=0 sel=30 7.8s
173/401 | loss=0.8915 ev=0.475 agents=195 avg_r=4.3840 sum_r=1122.30 x<0=0.02 elig=0.63 dorfler_tail=0.07 floor=0 sel=27 7.6s
174/401 | loss=0.9410 ev=0.477 agents=366 avg_r=5.2875 sum_r=1353.60 x<0=0.02 elig=0.62 dorfler_tail=0.07 floor=0 sel=27 7.5s
175/401 | loss=0.9022 ev=0.454 agents=78 avg_r=4.4750 sum_r=1145.59 x<0=0.01 elig=0.62 dorfler_tail=0.07 floor=0 sel=31 8.0s
176/401 | loss=0.9084 ev=0.455 agents=282 avg_r=3.4913 sum_r=893.77 x<0=0.01 elig=0.62 dorfler_tail=0.07 floor=0 sel=26 7.3s
177/401 | loss=0.8292 ev=0.478 agents=252 avg_r=3.6340 sum_r=930.31 x<0=0.01 elig=0.62 dorfler_tail=0.07 floor=0 sel=28 7.5s
178/401 | loss=0.9954 ev=0.469 agents=193 avg_r=5.3305 sum_r=1364.61 x<0=0.01 elig=0.62 dorfler_tail=0.07 floor=0 sel=27 7.5s
179/401 | loss=1.0011 ev=0.426 agents=1246 avg_r=4.4377 sum_r=1136.05 x<0=0.01 elig=0.62 dorfler_tail=0.07 floor=0 sel=29 7.7s
180/401 | loss=0.9708 ev=0.457 agents=772 avg_r=5.4786 sum_r=1402.53 x<0=0.01 elig=0.62 dorfler_tail=0.07 floor=0 sel=29 7.8s
181/401 | loss=0.9704 ev=0.452 agents=132 avg_r=4.8561 sum_r=1243.16 x<0=0.01 elig=0.63 dorfler_tail=0.07 floor=0 sel=27 7.6s
182/401 | loss=1.0905 ev=0.437 agents=119 avg_r=4.0510 sum_r=1037.06 x<0=0.01 elig=0.62 dorfler_tail=0.07 floor=0 sel=27 7.4s
183/401 | loss=1.0880 ev=0.459 agents=762 avg_r=4.7612 sum_r=1218.87 x<0=0.01 elig=0.63 dorfler_tail=0.07 floor=0 sel=29 7.8s
184/401 | loss=1.0019 ev=0.454 agents=212 avg_r=3.7824 sum_r=968.29 x<0=0.01 elig=0.63 dorfler_tail=0.07 floor=0 sel=28 7.6s
185/401 | loss=0.9900 ev=0.466 agents=120 avg_r=5.3904 sum_r=1379.95 x<0=0.01 elig=0.63 dorfler_tail=0.07 floor=0 sel=28 7.6s
186/401 | loss=1.0037 ev=0.463 agents=70 avg_r=4.2867 sum_r=1097.39 x<0=0.01 elig=0.62 dorfler_tail=0.07 floor=0 sel=28 7.6s
187/401 | loss=1.2264 ev=0.454 agents=694 avg_r=6.6090 sum_r=1691.90 x<0=0.01 elig=0.63 dorfler_tail=0.07 floor=0 sel=29 8.3s
188/401 | loss=1.0584 ev=0.455 agents=761 avg_r=4.4357 sum_r=1135.54 x<0=0.01 elig=0.63 dorfler_tail=0.07 floor=0 sel=27 7.7s
189/401 | loss=1.0834 ev=0.435 agents=101 avg_r=3.8870 sum_r=995.07 x<0=0.01 elig=0.63 dorfler_tail=0.07 floor=0 sel=27 7.7s
190/401 | loss=0.9906 ev=0.480 agents=82 avg_r=5.7419 sum_r=1469.92 x<0=0.01 elig=0.63 dorfler_tail=0.07 floor=0 sel=29 7.9s
191/401 | loss=1.0026 ev=0.489 agents=112 avg_r=4.7027 sum_r=1203.90 x<0=0.01 elig=0.63 dorfler_tail=0.07 floor=0 sel=28 7.7s
192/401 | loss=0.9754 ev=0.470 agents=212 avg_r=3.5024 sum_r=896.62 x<0=0.00 elig=0.62 dorfler_tail=0.07 floor=0 sel=27 7.5s
193/401 | loss=0.9544 ev=0.504 agents=206 avg_r=6.2049 sum_r=1588.45 x<0=0.00 elig=0.62 dorfler_tail=0.07 floor=0 sel=30 8.0s
194/401 | loss=1.0699 ev=0.470 agents=92 avg_r=3.5192 sum_r=900.92 x<0=0.00 elig=0.63 dorfler_tail=0.07 floor=0 sel=27 7.5s
195/401 | loss=1.0682 ev=0.455 agents=1062 avg_r=4.7573 sum_r=1217.87 x<0=0.00 elig=0.62 dorfler_tail=0.07 floor=0 sel=28 7.7s
196/401 | loss=1.0261 ev=0.476 agents=73 avg_r=3.4637 sum_r=886.70 x<0=0.00 elig=0.63 dorfler_tail=0.07 floor=0 sel=26 7.4s
197/401 | loss=1.1041 ev=0.477 agents=82 avg_r=5.4997 sum_r=1407.91 x<0=0.00 elig=0.63 dorfler_tail=0.07 floor=0 sel=28 7.6s
198/401 | loss=1.0685 ev=0.475 agents=137 avg_r=4.8297 sum_r=1236.40 x<0=0.01 elig=0.63 dorfler_tail=0.08 floor=0 sel=29 7.8s
199/401 | loss=1.0788 ev=0.478 agents=617 avg_r=5.8426 sum_r=1495.71 x<0=0.00 elig=0.63 dorfler_tail=0.07 floor=0 sel=28 7.8s
200/401 | loss=1.0358 ev=0.482 agents=346 avg_r=5.6052 sum_r=1434.92 x<0=0.00 elig=0.63 dorfler_tail=0.07 floor=0 sel=29 7.8s
[Checkpoint] saved → checkpoints/model_iter0200.pt
201/401 | loss=0.8902 ev=0.500 agents=366 avg_r=4.7006 sum_r=1203.36 x<0=0.01 elig=0.62 dorfler_tail=0.07 floor=0 sel=26 7.3s
202/401 | loss=1.2783 ev=0.462 agents=438 avg_r=6.6009 sum_r=1689.82 x<0=0.01 elig=0.63 dorfler_tail=0.07 floor=0 sel=29 7.8s
203/401 | loss=0.9705 ev=0.479 agents=66 avg_r=4.4767 sum_r=1146.04 x<0=0.00 elig=0.62 dorfler_tail=0.07 floor=0 sel=27 7.6s
204/401 | loss=1.0327 ev=0.470 agents=174 avg_r=4.7346 sum_r=1212.06 x<0=0.00 elig=0.63 dorfler_tail=0.07 floor=0 sel=27 7.4s
205/401 | loss=1.0545 ev=0.486 agents=454 avg_r=5.4121 sum_r=1385.49 x<0=0.00 elig=0.62 dorfler_tail=0.07 floor=0 sel=29 7.7s
206/401 | loss=0.9817 ev=0.477 agents=482 avg_r=5.1323 sum_r=1313.87 x<0=0.00 elig=0.62 dorfler_tail=0.07 floor=0 sel=26 7.4s
207/401 | loss=0.9354 ev=0.464 agents=526 avg_r=2.5360 sum_r=649.22 x<0=0.00 elig=0.62 dorfler_tail=0.07 floor=0 sel=25 7.3s
208/401 | loss=1.0478 ev=0.484 agents=64 avg_r=6.3611 sum_r=1628.44 x<0=0.00 elig=0.63 dorfler_tail=0.07 floor=0 sel=30 8.2s
209/401 | loss=1.0140 ev=0.494 agents=77 avg_r=6.1189 sum_r=1566.43 x<0=0.00 elig=0.62 dorfler_tail=0.07 floor=0 sel=30 8.3s
210/401 | loss=1.0858 ev=0.489 agents=34 avg_r=4.5550 sum_r=1166.07 x<0=0.00 elig=0.63 dorfler_tail=0.07 floor=0 sel=25 7.5s
211/401 | loss=1.0737 ev=0.478 agents=473 avg_r=6.0945 sum_r=1560.20 x<0=0.00 elig=0.63 dorfler_tail=0.07 floor=0 sel=32 8.4s
212/401 | loss=1.1049 ev=0.498 agents=370 avg_r=3.9285 sum_r=1005.70 x<0=0.00 elig=0.62 dorfler_tail=0.07 floor=0 sel=25 7.3s
213/401 | loss=1.0843 ev=0.467 agents=199 avg_r=5.7006 sum_r=1459.35 x<0=0.00 elig=0.63 dorfler_tail=0.07 floor=0 sel=29 7.9s
214/401 | loss=0.9703 ev=0.500 agents=1681 avg_r=6.1949 sum_r=1585.90 x<0=0.00 elig=0.63 dorfler_tail=0.07 floor=0 sel=28 7.7s
215/401 | loss=1.1585 ev=0.454 agents=95 avg_r=4.3943 sum_r=1124.94 x<0=0.00 elig=0.63 dorfler_tail=0.07 floor=0 sel=28 7.7s
216/401 | loss=1.0844 ev=0.490 agents=132 avg_r=3.6609 sum_r=937.19 x<0=0.00 elig=0.63 dorfler_tail=0.07 floor=0 sel=26 7.4s
217/401 | loss=1.0243 ev=0.480 agents=650 avg_r=5.7942 sum_r=1483.30 x<0=0.00 elig=0.62 dorfler_tail=0.07 floor=0 sel=30 7.9s
218/401 | loss=0.9701 ev=0.494 agents=222 avg_r=4.2069 sum_r=1076.96 x<0=0.00 elig=0.62 dorfler_tail=0.07 floor=0 sel=26 7.4s
219/401 | loss=1.1205 ev=0.474 agents=340 avg_r=4.9871 sum_r=1276.71 x<0=0.00 elig=0.63 dorfler_tail=0.07 floor=0 sel=29 7.8s
220/401 | loss=1.0831 ev=0.505 agents=199 avg_r=4.2395 sum_r=1085.30 x<0=0.00 elig=0.62 dorfler_tail=0.07 floor=0 sel=27 7.5s
221/401 | loss=1.0350 ev=0.478 agents=205 avg_r=7.2874 sum_r=1865.56 x<0=0.00 elig=0.63 dorfler_tail=0.08 floor=0 sel=30 7.9s
222/401 | loss=1.1288 ev=0.485 agents=884 avg_r=3.2765 sum_r=838.78 x<0=0.00 elig=0.62 dorfler_tail=0.07 floor=0 sel=26 7.4s
223/401 | loss=1.0799 ev=0.494 agents=440 avg_r=5.8995 sum_r=1510.28 x<0=0.00 elig=0.63 dorfler_tail=0.07 floor=0 sel=29 7.7s
224/401 | loss=0.9680 ev=0.448 agents=41 avg_r=1.7854 sum_r=457.07 x<0=0.00 elig=0.63 dorfler_tail=0.07 floor=0 sel=25 7.3s
225/401 | loss=1.0479 ev=0.507 agents=377 avg_r=8.4851 sum_r=2172.19 x<0=0.00 elig=0.63 dorfler_tail=0.08 floor=0 sel=33 8.2s
226/401 | loss=1.0476 ev=0.484 agents=60 avg_r=4.7891 sum_r=1226.01 x<0=0.00 elig=0.63 dorfler_tail=0.07 floor=0 sel=26 7.4s
227/401 | loss=1.1226 ev=0.506 agents=87 avg_r=6.0974 sum_r=1560.94 x<0=0.00 elig=0.64 dorfler_tail=0.07 floor=0 sel=28 7.6s
228/401 | loss=1.0392 ev=0.481 agents=113 avg_r=5.0643 sum_r=1296.45 x<0=0.00 elig=0.63 dorfler_tail=0.07 floor=0 sel=27 7.6s
229/401 | loss=1.1729 ev=0.515 agents=220 avg_r=6.9283 sum_r=1773.65 x<0=0.00 elig=0.63 dorfler_tail=0.08 floor=0 sel=30 7.9s
230/401 | loss=1.1397 ev=0.481 agents=153 avg_r=4.7461 sum_r=1215.01 x<0=0.00 elig=0.64 dorfler_tail=0.07 floor=0 sel=28 7.7s
231/401 | loss=1.1618 ev=0.486 agents=983 avg_r=4.4464 sum_r=1138.29 x<0=0.00 elig=0.64 dorfler_tail=0.07 floor=0 sel=27 7.6s
232/401 | loss=1.0145 ev=0.533 agents=908 avg_r=6.6488 sum_r=1702.09 x<0=0.00 elig=0.63 dorfler_tail=0.07 floor=0 sel=29 8.3s
233/401 | loss=0.9984 ev=0.466 agents=60 avg_r=3.0361 sum_r=777.24 x<0=0.00 elig=0.63 dorfler_tail=0.07 floor=0 sel=26 7.7s
234/401 | loss=1.1600 ev=0.477 agents=34 avg_r=5.4348 sum_r=1391.32 x<0=0.00 elig=0.63 dorfler_tail=0.08 floor=0 sel=28 7.9s
235/401 | loss=1.0123 ev=0.500 agents=1033 avg_r=5.7679 sum_r=1476.59 x<0=0.00 elig=0.62 dorfler_tail=0.07 floor=0 sel=28 7.9s
236/401 | loss=0.9871 ev=0.493 agents=267 avg_r=5.4802 sum_r=1402.94 x<0=0.00 elig=0.63 dorfler_tail=0.07 floor=0 sel=28 7.7s
237/401 | loss=1.0411 ev=0.493 agents=823 avg_r=4.2589 sum_r=1090.27 x<0=0.00 elig=0.64 dorfler_tail=0.07 floor=0 sel=27 7.6s
238/401 | loss=0.9391 ev=0.471 agents=258 avg_r=4.8508 sum_r=1241.81 x<0=0.00 elig=0.63 dorfler_tail=0.07 floor=0 sel=28 7.7s
239/401 | loss=0.9220 ev=0.526 agents=80 avg_r=5.5145 sum_r=1411.71 x<0=0.00 elig=0.62 dorfler_tail=0.07 floor=0 sel=27 7.6s
240/401 | loss=1.0007 ev=0.516 agents=414 avg_r=4.9083 sum_r=1256.51 x<0=0.00 elig=0.62 dorfler_tail=0.07 floor=0 sel=29 7.7s
241/401 | loss=1.0398 ev=0.481 agents=387 avg_r=3.9976 sum_r=1023.38 x<0=0.00 elig=0.62 dorfler_tail=0.07 floor=0 sel=28 7.6s
242/401 | loss=0.9385 ev=0.508 agents=78 avg_r=4.1453 sum_r=1061.20 x<0=0.00 elig=0.62 dorfler_tail=0.07 floor=0 sel=26 7.3s
243/401 | loss=0.9188 ev=0.506 agents=166 avg_r=4.2940 sum_r=1099.26 x<0=0.00 elig=0.62 dorfler_tail=0.07 floor=0 sel=28 7.6s
244/401 | loss=0.8709 ev=0.493 agents=229 avg_r=3.3207 sum_r=850.10 x<0=0.00 elig=0.62 dorfler_tail=0.07 floor=0 sel=27 7.5s
245/401 | loss=0.8569 ev=0.526 agents=276 avg_r=4.4382 sum_r=1136.18 x<0=0.00 elig=0.62 dorfler_tail=0.07 floor=0 sel=28 7.6s
246/401 | loss=0.7959 ev=0.494 agents=383 avg_r=2.7136 sum_r=694.68 x<0=0.00 elig=0.61 dorfler_tail=0.07 floor=0 sel=27 7.4s
247/401 | loss=0.8470 ev=0.525 agents=197 avg_r=6.1670 sum_r=1578.75 x<0=0.00 elig=0.61 dorfler_tail=0.08 floor=0 sel=28 7.7s
248/401 | loss=0.7863 ev=0.449 agents=800 avg_r=2.1261 sum_r=544.28 x<0=0.00 elig=0.61 dorfler_tail=0.07 floor=0 sel=27 7.2s
249/401 | loss=0.8609 ev=0.504 agents=423 avg_r=3.3115 sum_r=847.74 x<0=0.00 elig=0.61 dorfler_tail=0.08 floor=0 sel=27 7.4s
250/401 | loss=0.8243 ev=0.524 agents=94 avg_r=4.7484 sum_r=1215.58 x<0=0.01 elig=0.61 dorfler_tail=0.08 floor=0 sel=29 7.7s
[Checkpoint] saved → checkpoints/model_iter0250.pt
251/401 | loss=0.8358 ev=0.497 agents=221 avg_r=3.1797 sum_r=814.00 x<0=0.00 elig=0.61 dorfler_tail=0.07 floor=0 sel=28 7.4s
252/401 | loss=0.7213 ev=0.529 agents=318 avg_r=3.7237 sum_r=953.26 x<0=0.00 elig=0.60 dorfler_tail=0.08 floor=0 sel=28 7.4s
253/401 | loss=0.7174 ev=0.530 agents=1013 avg_r=1.8543 sum_r=474.70 x<0=0.00 elig=0.61 dorfler_tail=0.07 floor=0 sel=25 7.1s
254/401 | loss=0.8496 ev=0.486 agents=101 avg_r=4.5127 sum_r=1155.26 x<0=0.00 elig=0.61 dorfler_tail=0.08 floor=0 sel=29 8.0s
255/401 | loss=0.7620 ev=0.526 agents=39 avg_r=2.8203 sum_r=721.99 x<0=0.00 elig=0.61 dorfler_tail=0.07 floor=0 sel=27 7.7s
256/401 | loss=0.7307 ev=0.534 agents=628 avg_r=4.4600 sum_r=1141.76 x<0=0.01 elig=0.61 dorfler_tail=0.08 floor=0 sel=27 7.6s
257/401 | loss=0.7684 ev=0.513 agents=395 avg_r=3.4904 sum_r=893.53 x<0=0.00 elig=0.61 dorfler_tail=0.07 floor=0 sel=27 7.7s
258/401 | loss=0.7384 ev=0.533 agents=244 avg_r=4.2749 sum_r=1094.38 x<0=0.00 elig=0.61 dorfler_tail=0.07 floor=0 sel=28 7.6s
259/401 | loss=0.8468 ev=0.500 agents=199 avg_r=2.7803 sum_r=711.75 x<0=0.00 elig=0.62 dorfler_tail=0.07 floor=0 sel=25 7.4s
260/401 | loss=0.8891 ev=0.471 agents=113 avg_r=4.3324 sum_r=1109.10 x<0=0.01 elig=0.62 dorfler_tail=0.07 floor=0 sel=27 7.5s
261/401 | loss=0.8631 ev=0.491 agents=573 avg_r=4.3577 sum_r=1115.56 x<0=0.00 elig=0.62 dorfler_tail=0.07 floor=0 sel=28 7.6s
262/401 | loss=0.8856 ev=0.504 agents=658 avg_r=4.7877 sum_r=1225.66 x<0=0.01 elig=0.62 dorfler_tail=0.08 floor=0 sel=29 7.7s
263/401 | loss=0.7890 ev=0.531 agents=215 avg_r=3.1940 sum_r=817.65 x<0=0.00 elig=0.62 dorfler_tail=0.07 floor=0 sel=26 7.4s
264/401 | loss=0.7539 ev=0.491 agents=44 avg_r=2.2303 sum_r=570.95 x<0=0.00 elig=0.61 dorfler_tail=0.07 floor=0 sel=25 7.2s
265/401 | loss=0.7910 ev=0.521 agents=34 avg_r=4.1604 sum_r=1065.05 x<0=0.00 elig=0.62 dorfler_tail=0.08 floor=0 sel=28 7.6s
266/401 | loss=0.7827 ev=0.525 agents=97 avg_r=4.0291 sum_r=1031.44 x<0=0.00 elig=0.62 dorfler_tail=0.07 floor=0 sel=27 7.4s
267/401 | loss=0.8642 ev=0.539 agents=64 avg_r=4.4701 sum_r=1144.35 x<0=0.00 elig=0.62 dorfler_tail=0.07 floor=0 sel=28 7.6s
268/401 | loss=0.7770 ev=0.503 agents=813 avg_r=3.0955 sum_r=792.44 x<0=0.00 elig=0.62 dorfler_tail=0.07 floor=0 sel=25 7.1s
269/401 | loss=0.6881 ev=0.513 agents=34 avg_r=2.4608 sum_r=629.97 x<0=0.00 elig=0.61 dorfler_tail=0.07 floor=0 sel=29 7.4s
270/401 | loss=0.6843 ev=0.513 agents=523 avg_r=3.8834 sum_r=994.14 x<0=0.00 elig=0.61 dorfler_tail=0.08 floor=0 sel=27 7.4s
271/401 | loss=0.7640 ev=0.497 agents=34 avg_r=3.2820 sum_r=840.20 x<0=0.00 elig=0.61 dorfler_tail=0.08 floor=0 sel=28 7.4s
272/401 | loss=0.8417 ev=0.493 agents=204 avg_r=2.4556 sum_r=628.62 x<0=0.01 elig=0.61 dorfler_tail=0.07 floor=0 sel=28 7.5s
273/401 | loss=0.7486 ev=0.517 agents=155 avg_r=1.8537 sum_r=474.56 x<0=0.01 elig=0.60 dorfler_tail=0.08 floor=0 sel=27 7.2s
274/401 | loss=0.6343 ev=0.551 agents=245 avg_r=3.7625 sum_r=963.20 x<0=0.00 elig=0.60 dorfler_tail=0.08 floor=0 sel=28 7.4s
275/401 | loss=0.5988 ev=0.554 agents=140 avg_r=2.5426 sum_r=650.91 x<0=0.01 elig=0.60 dorfler_tail=0.08 floor=0 sel=28 7.2s
276/401 | loss=0.7488 ev=0.529 agents=34 avg_r=1.9313 sum_r=494.41 x<0=0.01 elig=0.60 dorfler_tail=0.08 floor=0 sel=28 7.7s
277/401 | loss=0.7258 ev=0.496 agents=104 avg_r=2.8360 sum_r=726.01 x<0=0.01 elig=0.61 dorfler_tail=0.07 floor=0 sel=28 7.8s
278/401 | loss=0.6367 ev=0.539 agents=86 avg_r=3.5156 sum_r=900.00 x<0=0.00 elig=0.60 dorfler_tail=0.08 floor=0 sel=29 7.6s
279/401 | loss=0.6267 ev=0.548 agents=1453 avg_r=3.0546 sum_r=781.97 x<0=0.01 elig=0.60 dorfler_tail=0.08 floor=0 sel=28 7.6s
280/401 | loss=0.6415 ev=0.533 agents=225 avg_r=2.5181 sum_r=644.63 x<0=0.00 elig=0.59 dorfler_tail=0.08 floor=0 sel=28 7.3s
281/401 | loss=0.6360 ev=0.550 agents=211 avg_r=2.4619 sum_r=630.24 x<0=0.01 elig=0.60 dorfler_tail=0.08 floor=0 sel=27 7.4s
282/401 | loss=0.6967 ev=0.496 agents=141 avg_r=1.4766 sum_r=378.01 x<0=0.00 elig=0.61 dorfler_tail=0.07 floor=0 sel=28 7.3s
283/401 | loss=0.7013 ev=0.536 agents=77 avg_r=2.8570 sum_r=731.40 x<0=0.01 elig=0.61 dorfler_tail=0.08 floor=0 sel=27 7.3s
284/401 | loss=0.7681 ev=0.518 agents=34 avg_r=2.8556 sum_r=731.02 x<0=0.01 elig=0.60 dorfler_tail=0.08 floor=0 sel=28 7.4s
285/401 | loss=0.7100 ev=0.530 agents=146 avg_r=3.9244 sum_r=1004.65 x<0=0.01 elig=0.60 dorfler_tail=0.08 floor=0 sel=29 7.6s
286/401 | loss=0.6773 ev=0.557 agents=118 avg_r=4.1812 sum_r=1070.38 x<0=0.01 elig=0.60 dorfler_tail=0.08 floor=0 sel=29 7.6s
287/401 | loss=0.7370 ev=0.542 agents=79 avg_r=3.1609 sum_r=809.20 x<0=0.00 elig=0.61 dorfler_tail=0.08 floor=0 sel=27 7.4s
288/401 | loss=0.7687 ev=0.522 agents=34 avg_r=2.3589 sum_r=603.88 x<0=0.01 elig=0.61 dorfler_tail=0.07 floor=0 sel=25 7.2s
289/401 | loss=0.7368 ev=0.546 agents=144 avg_r=4.4971 sum_r=1151.27 x<0=0.01 elig=0.61 dorfler_tail=0.08 floor=0 sel=29 7.6s
290/401 | loss=0.8127 ev=0.523 agents=112 avg_r=3.2128 sum_r=822.48 x<0=0.00 elig=0.61 dorfler_tail=0.08 floor=0 sel=28 7.6s
291/401 | loss=0.8122 ev=0.544 agents=167 avg_r=5.3077 sum_r=1358.76 x<0=0.01 elig=0.62 dorfler_tail=0.07 floor=0 sel=26 7.4s
292/401 | loss=0.8049 ev=0.548 agents=779 avg_r=4.8604 sum_r=1244.27 x<0=0.00 elig=0.62 dorfler_tail=0.08 floor=0 sel=29 7.7s
293/401 | loss=0.8547 ev=0.510 agents=1224 avg_r=5.0976 sum_r=1304.98 x<0=0.01 elig=0.62 dorfler_tail=0.08 floor=0 sel=26 7.5s
294/401 | loss=0.7872 ev=0.549 agents=34 avg_r=4.3640 sum_r=1117.20 x<0=0.01 elig=0.61 dorfler_tail=0.08 floor=0 sel=27 7.5s
295/401 | loss=0.7772 ev=0.535 agents=133 avg_r=3.8117 sum_r=975.79 x<0=0.01 elig=0.62 dorfler_tail=0.07 floor=0 sel=27 7.3s
296/401 | loss=0.8143 ev=0.530 agents=171 avg_r=5.1571 sum_r=1320.22 x<0=0.00 elig=0.61 dorfler_tail=0.08 floor=0 sel=29 7.8s
297/401 | loss=0.8086 ev=0.544 agents=198 avg_r=5.4123 sum_r=1385.56 x<0=0.01 elig=0.62 dorfler_tail=0.08 floor=0 sel=30 8.0s
298/401 | loss=0.7918 ev=0.512 agents=66 avg_r=3.1244 sum_r=799.85 x<0=0.00 elig=0.61 dorfler_tail=0.07 floor=0 sel=24 7.0s
299/401 | loss=0.8891 ev=0.549 agents=200 avg_r=4.3910 sum_r=1124.10 x<0=0.01 elig=0.62 dorfler_tail=0.08 floor=0 sel=27 7.5s
300/401 | loss=0.8565 ev=0.548 agents=349 avg_r=5.9245 sum_r=1516.67 x<0=0.00 elig=0.62 dorfler_tail=0.08 floor=0 sel=28 8.2s
[Checkpoint] saved → checkpoints/model_iter0300.pt
301/401 | loss=0.8460 ev=0.520 agents=918 avg_r=3.2190 sum_r=824.07 x<0=0.01 elig=0.61 dorfler_tail=0.08 floor=0 sel=28 8.0s
302/401 | loss=0.8789 ev=0.531 agents=85 avg_r=4.0706 sum_r=1042.08 x<0=0.02 elig=0.62 dorfler_tail=0.08 floor=0 sel=26 7.5s
303/401 | loss=0.7883 ev=0.535 agents=324 avg_r=5.4005 sum_r=1382.52 x<0=0.00 elig=0.61 dorfler_tail=0.08 floor=0 sel=28 7.9s
304/401 | loss=0.7395 ev=0.538 agents=34 avg_r=5.0499 sum_r=1292.78 x<0=0.01 elig=0.61 dorfler_tail=0.08 floor=0 sel=30 8.0s
305/401 | loss=0.7911 ev=0.510 agents=304 avg_r=3.1696 sum_r=811.42 x<0=0.01 elig=0.61 dorfler_tail=0.08 floor=0 sel=26 7.3s
306/401 | loss=0.7920 ev=0.557 agents=383 avg_r=6.0517 sum_r=1549.24 x<0=0.00 elig=0.62 dorfler_tail=0.08 floor=0 sel=30 8.0s
307/401 | loss=0.8841 ev=0.522 agents=206 avg_r=4.6808 sum_r=1198.28 x<0=0.01 elig=0.62 dorfler_tail=0.07 floor=0 sel=27 7.4s
308/401 | loss=0.8185 ev=0.531 agents=98 avg_r=4.2498 sum_r=1087.96 x<0=0.01 elig=0.61 dorfler_tail=0.08 floor=0 sel=28 7.5s
309/401 | loss=0.7786 ev=0.553 agents=92 avg_r=4.5267 sum_r=1158.84 x<0=0.01 elig=0.62 dorfler_tail=0.08 floor=0 sel=28 7.7s
310/401 | loss=0.8129 ev=0.557 agents=232 avg_r=4.8459 sum_r=1240.55 x<0=0.00 elig=0.62 dorfler_tail=0.08 floor=0 sel=26 7.4s
311/401 | loss=0.7548 ev=0.544 agents=85 avg_r=3.9997 sum_r=1023.93 x<0=0.01 elig=0.62 dorfler_tail=0.08 floor=0 sel=28 7.6s
312/401 | loss=0.8005 ev=0.574 agents=112 avg_r=5.2808 sum_r=1351.89 x<0=0.00 elig=0.61 dorfler_tail=0.08 floor=0 sel=28 7.6s
313/401 | loss=0.7345 ev=0.581 agents=34 avg_r=4.7019 sum_r=1203.69 x<0=0.00 elig=0.62 dorfler_tail=0.08 floor=0 sel=28 7.6s
314/401 | loss=0.9237 ev=0.478 agents=1299 avg_r=1.9343 sum_r=495.18 x<0=0.02 elig=0.62 dorfler_tail=0.08 floor=0 sel=26 7.3s
315/401 | loss=0.7310 ev=0.615 agents=90 avg_r=5.8569 sum_r=1499.36 x<0=0.01 elig=0.62 dorfler_tail=0.08 floor=0 sel=29 7.8s
316/401 | loss=0.8623 ev=0.555 agents=125 avg_r=5.8924 sum_r=1508.45 x<0=0.00 elig=0.62 dorfler_tail=0.08 floor=0 sel=30 7.9s
317/401 | loss=0.9039 ev=0.531 agents=790 avg_r=4.9057 sum_r=1255.87 x<0=0.01 elig=0.62 dorfler_tail=0.08 floor=0 sel=28 7.7s
318/401 | loss=0.8584 ev=0.544 agents=667 avg_r=5.5581 sum_r=1422.86 x<0=0.01 elig=0.62 dorfler_tail=0.08 floor=0 sel=29 7.8s
319/401 | loss=0.7933 ev=0.559 agents=217 avg_r=3.9606 sum_r=1013.91 x<0=0.01 elig=0.62 dorfler_tail=0.07 floor=0 sel=26 7.4s
320/401 | loss=0.7544 ev=0.577 agents=260 avg_r=4.5550 sum_r=1166.08 x<0=0.00 elig=0.61 dorfler_tail=0.08 floor=0 sel=28 7.5s
321/401 | loss=0.9524 ev=0.525 agents=189 avg_r=5.2861 sum_r=1353.23 x<0=0.01 elig=0.62 dorfler_tail=0.08 floor=0 sel=29 7.8s
322/401 | loss=0.7658 ev=0.588 agents=228 avg_r=4.9868 sum_r=1276.62 x<0=0.00 elig=0.62 dorfler_tail=0.08 floor=0 sel=29 8.0s
323/401 | loss=0.8794 ev=0.551 agents=228 avg_r=5.1649 sum_r=1322.20 x<0=0.01 elig=0.62 dorfler_tail=0.08 floor=0 sel=28 8.0s
324/401 | loss=0.8258 ev=0.560 agents=926 avg_r=5.6783 sum_r=1453.65 x<0=0.01 elig=0.62 dorfler_tail=0.08 floor=0 sel=29 8.1s
325/401 | loss=0.8111 ev=0.546 agents=92 avg_r=3.8608 sum_r=988.37 x<0=0.00 elig=0.62 dorfler_tail=0.08 floor=0 sel=26 7.7s
326/401 | loss=0.8054 ev=0.537 agents=44 avg_r=5.0405 sum_r=1290.36 x<0=0.01 elig=0.62 dorfler_tail=0.08 floor=0 sel=28 7.8s
327/401 | loss=0.7261 ev=0.572 agents=34 avg_r=4.9393 sum_r=1264.47 x<0=0.01 elig=0.62 dorfler_tail=0.08 floor=0 sel=27 7.6s
328/401 | loss=0.8017 ev=0.541 agents=230 avg_r=4.4739 sum_r=1145.32 x<0=0.01 elig=0.62 dorfler_tail=0.08 floor=0 sel=28 7.8s
329/401 | loss=0.7753 ev=0.572 agents=485 avg_r=7.0645 sum_r=1808.50 x<0=0.00 elig=0.62 dorfler_tail=0.08 floor=0 sel=30 7.9s
330/401 | loss=0.7878 ev=0.545 agents=64 avg_r=4.5437 sum_r=1163.19 x<0=0.01 elig=0.62 dorfler_tail=0.07 floor=0 sel=25 7.4s
331/401 | loss=0.7565 ev=0.557 agents=412 avg_r=4.9920 sum_r=1277.95 x<0=0.01 elig=0.61 dorfler_tail=0.08 floor=0 sel=29 7.8s
332/401 | loss=0.8143 ev=0.552 agents=172 avg_r=3.6211 sum_r=927.01 x<0=0.01 elig=0.62 dorfler_tail=0.08 floor=0 sel=25 7.3s
333/401 | loss=0.9173 ev=0.551 agents=320 avg_r=6.9295 sum_r=1773.94 x<0=0.01 elig=0.62 dorfler_tail=0.09 floor=0 sel=33 8.3s
334/401 | loss=0.8137 ev=0.582 agents=713 avg_r=3.8566 sum_r=987.28 x<0=0.02 elig=0.62 dorfler_tail=0.08 floor=0 sel=26 7.3s
335/401 | loss=0.8842 ev=0.545 agents=60 avg_r=6.7041 sum_r=1716.25 x<0=0.01 elig=0.62 dorfler_tail=0.09 floor=0 sel=28 7.9s
336/401 | loss=0.9756 ev=0.549 agents=1171 avg_r=5.2897 sum_r=1354.17 x<0=0.02 elig=0.62 dorfler_tail=0.09 floor=0 sel=29 7.9s
337/401 | loss=0.9149 ev=0.543 agents=248 avg_r=4.5455 sum_r=1163.64 x<0=0.02 elig=0.62 dorfler_tail=0.08 floor=0 sel=27 7.5s
338/401 | loss=0.8112 ev=0.572 agents=622 avg_r=6.2201 sum_r=1592.33 x<0=0.02 elig=0.62 dorfler_tail=0.08 floor=0 sel=31 7.9s
339/401 | loss=0.8142 ev=0.568 agents=199 avg_r=3.9913 sum_r=1021.77 x<0=0.01 elig=0.61 dorfler_tail=0.08 floor=0 sel=25 7.4s
340/401 | loss=0.8424 ev=0.559 agents=96 avg_r=5.2087 sum_r=1333.43 x<0=0.01 elig=0.62 dorfler_tail=0.08 floor=0 sel=29 7.8s
341/401 | loss=0.9293 ev=0.514 agents=81 avg_r=6.3846 sum_r=1634.47 x<0=0.01 elig=0.62 dorfler_tail=0.08 floor=0 sel=29 7.9s
342/401 | loss=0.7994 ev=0.581 agents=229 avg_r=4.3458 sum_r=1112.52 x<0=0.01 elig=0.61 dorfler_tail=0.08 floor=0 sel=28 7.5s
343/401 | loss=0.8801 ev=0.527 agents=34 avg_r=4.7860 sum_r=1225.21 x<0=0.01 elig=0.62 dorfler_tail=0.08 floor=0 sel=29 7.7s
344/401 | loss=0.7951 ev=0.552 agents=388 avg_r=4.7995 sum_r=1228.67 x<0=0.01 elig=0.62 dorfler_tail=0.08 floor=0 sel=26 7.8s
345/401 | loss=0.9618 ev=0.521 agents=230 avg_r=5.5096 sum_r=1410.46 x<0=0.01 elig=0.62 dorfler_tail=0.08 floor=0 sel=30 8.1s
346/401 | loss=0.8626 ev=0.531 agents=225 avg_r=3.1414 sum_r=804.19 x<0=0.01 elig=0.62 dorfler_tail=0.07 floor=0 sel=24 7.2s
347/401 | loss=0.9345 ev=0.559 agents=591 avg_r=7.0921 sum_r=1815.57 x<0=0.00 elig=0.62 dorfler_tail=0.09 floor=0 sel=33 8.5s
348/401 | loss=0.9702 ev=0.535 agents=306 avg_r=4.1943 sum_r=1073.73 x<0=0.02 elig=0.62 dorfler_tail=0.08 floor=0 sel=27 7.5s
349/401 | loss=0.9282 ev=0.554 agents=169 avg_r=5.7926 sum_r=1482.90 x<0=0.01 elig=0.62 dorfler_tail=0.08 floor=0 sel=30 7.9s
350/401 | loss=0.8965 ev=0.529 agents=228 avg_r=4.0997 sum_r=1049.54 x<0=0.01 elig=0.63 dorfler_tail=0.08 floor=0 sel=28 7.6s
[Checkpoint] saved → checkpoints/model_iter0350.pt
351/401 | loss=0.9006 ev=0.536 agents=86 avg_r=4.7264 sum_r=1209.97 x<0=0.01 elig=0.63 dorfler_tail=0.08 floor=0 sel=27 7.6s
352/401 | loss=0.9423 ev=0.549 agents=400 avg_r=6.4270 sum_r=1645.32 x<0=0.01 elig=0.62 dorfler_tail=0.08 floor=0 sel=31 7.9s
353/401 | loss=0.8666 ev=0.526 agents=430 avg_r=4.5322 sum_r=1160.24 x<0=0.00 elig=0.62 dorfler_tail=0.08 floor=0 sel=28 7.5s
354/401 | loss=0.9237 ev=0.542 agents=90 avg_r=4.8545 sum_r=1242.75 x<0=0.01 elig=0.62 dorfler_tail=0.07 floor=0 sel=29 7.6s
355/401 | loss=0.9779 ev=0.510 agents=171 avg_r=4.5744 sum_r=1171.05 x<0=0.01 elig=0.62 dorfler_tail=0.08 floor=0 sel=29 7.6s
356/401 | loss=1.0088 ev=0.528 agents=85 avg_r=4.8350 sum_r=1237.76 x<0=0.00 elig=0.63 dorfler_tail=0.08 floor=0 sel=27 7.4s
357/401 | loss=1.0785 ev=0.467 agents=84 avg_r=3.3997 sum_r=870.32 x<0=0.01 elig=0.62 dorfler_tail=0.08 floor=0 sel=29 7.6s
358/401 | loss=0.9516 ev=0.541 agents=123 avg_r=6.2179 sum_r=1591.79 x<0=0.01 elig=0.62 dorfler_tail=0.08 floor=0 sel=31 7.8s
359/401 | loss=0.8837 ev=0.540 agents=64 avg_r=5.3393 sum_r=1366.87 x<0=0.00 elig=0.62 dorfler_tail=0.08 floor=0 sel=30 7.8s
360/401 | loss=1.0886 ev=0.507 agents=829 avg_r=3.6631 sum_r=937.76 x<0=0.01 elig=0.62 dorfler_tail=0.07 floor=0 sel=28 7.5s
361/401 | loss=1.0488 ev=0.483 agents=215 avg_r=6.7987 sum_r=1740.47 x<0=0.00 elig=0.62 dorfler_tail=0.08 floor=0 sel=30 7.7s
362/401 | loss=0.9141 ev=0.505 agents=743 avg_r=3.4182 sum_r=875.05 x<0=0.01 elig=0.62 dorfler_tail=0.08 floor=0 sel=29 7.6s
363/401 | loss=0.9284 ev=0.548 agents=94 avg_r=4.6619 sum_r=1193.46 x<0=0.00 elig=0.62 dorfler_tail=0.08 floor=0 sel=27 7.3s
364/401 | loss=0.8426 ev=0.520 agents=157 avg_r=3.2013 sum_r=819.54 x<0=0.01 elig=0.62 dorfler_tail=0.07 floor=0 sel=28 7.4s
365/401 | loss=1.0450 ev=0.499 agents=409 avg_r=5.9785 sum_r=1530.48 x<0=0.00 elig=0.62 dorfler_tail=0.08 floor=0 sel=31 7.8s
366/401 | loss=1.0103 ev=0.517 agents=118 avg_r=4.5559 sum_r=1166.30 x<0=0.01 elig=0.63 dorfler_tail=0.08 floor=0 sel=30 8.0s
367/401 | loss=0.8992 ev=0.548 agents=304 avg_r=5.5253 sum_r=1414.48 x<0=0.01 elig=0.63 dorfler_tail=0.08 floor=0 sel=29 8.1s
368/401 | loss=0.8896 ev=0.542 agents=236 avg_r=4.8329 sum_r=1237.22 x<0=0.01 elig=0.62 dorfler_tail=0.08 floor=0 sel=28 7.8s
369/401 | loss=0.9038 ev=0.547 agents=34 avg_r=4.3783 sum_r=1120.85 x<0=0.01 elig=0.62 dorfler_tail=0.08 floor=0 sel=30 8.0s
370/401 | loss=0.9561 ev=0.534 agents=34 avg_r=4.7629 sum_r=1219.31 x<0=0.02 elig=0.62 dorfler_tail=0.08 floor=0 sel=27 7.5s
371/401 | loss=0.9814 ev=0.522 agents=611 avg_r=4.7171 sum_r=1207.57 x<0=0.01 elig=0.62 dorfler_tail=0.08 floor=0 sel=29 7.7s
372/401 | loss=0.9877 ev=0.540 agents=119 avg_r=4.1701 sum_r=1067.53 x<0=0.02 elig=0.62 dorfler_tail=0.08 floor=0 sel=29 7.7s
373/401 | loss=0.8940 ev=0.547 agents=39 avg_r=5.0060 sum_r=1281.53 x<0=0.01 elig=0.63 dorfler_tail=0.08 floor=0 sel=30 7.8s
374/401 | loss=1.0368 ev=0.562 agents=197 avg_r=4.9253 sum_r=1260.87 x<0=0.01 elig=0.63 dorfler_tail=0.08 floor=0 sel=27 7.6s
375/401 | loss=0.9746 ev=0.504 agents=200 avg_r=4.9331 sum_r=1262.88 x<0=0.02 elig=0.63 dorfler_tail=0.08 floor=0 sel=27 7.5s
376/401 | loss=0.9767 ev=0.546 agents=276 avg_r=5.4246 sum_r=1388.70 x<0=0.01 elig=0.63 dorfler_tail=0.08 floor=0 sel=30 7.8s
377/401 | loss=0.9836 ev=0.524 agents=198 avg_r=5.0625 sum_r=1296.01 x<0=0.01 elig=0.64 dorfler_tail=0.08 floor=0 sel=27 7.6s
378/401 | loss=1.0488 ev=0.497 agents=745 avg_r=4.0224 sum_r=1029.73 x<0=0.02 elig=0.63 dorfler_tail=0.07 floor=0 sel=27 7.5s
379/401 | loss=0.9358 ev=0.572 agents=337 avg_r=6.0321 sum_r=1544.22 x<0=0.01 elig=0.63 dorfler_tail=0.08 floor=0 sel=29 7.8s
380/401 | loss=0.9310 ev=0.564 agents=193 avg_r=6.7029 sum_r=1715.94 x<0=0.02 elig=0.63 dorfler_tail=0.08 floor=0 sel=29 7.6s
381/401 | loss=0.9425 ev=0.524 agents=1211 avg_r=3.9985 sum_r=1023.62 x<0=0.02 elig=0.63 dorfler_tail=0.09 floor=0 sel=27 7.6s
382/401 | loss=1.0188 ev=0.566 agents=482 avg_r=5.5721 sum_r=1426.45 x<0=0.04 elig=0.63 dorfler_tail=0.08 floor=0 sel=29 7.7s
383/401 | loss=0.9704 ev=0.528 agents=209 avg_r=6.0485 sum_r=1548.41 x<0=0.03 elig=0.64 dorfler_tail=0.08 floor=0 sel=28 7.6s
384/401 | loss=0.9859 ev=0.534 agents=1230 avg_r=5.8093 sum_r=1487.18 x<0=0.02 elig=0.63 dorfler_tail=0.08 floor=0 sel=29 7.8s
385/401 | loss=1.0294 ev=0.542 agents=200 avg_r=4.0988 sum_r=1049.30 x<0=0.02 elig=0.63 dorfler_tail=0.08 floor=0 sel=28 7.6s
386/401 | loss=0.9570 ev=0.537 agents=397 avg_r=5.4463 sum_r=1394.26 x<0=0.02 elig=0.63 dorfler_tail=0.08 floor=0 sel=27 7.5s
387/401 | loss=0.9889 ev=0.533 agents=34 avg_r=6.3465 sum_r=1624.69 x<0=0.01 elig=0.64 dorfler_tail=0.08 floor=0 sel=29 7.6s
388/401 | loss=1.0284 ev=0.518 agents=242 avg_r=6.6849 sum_r=1711.35 x<0=0.01 elig=0.63 dorfler_tail=0.08 floor=0 sel=31 7.9s
389/401 | loss=0.9674 ev=0.506 agents=1219 avg_r=2.7841 sum_r=712.73 x<0=0.01 elig=0.64 dorfler_tail=0.07 floor=0 sel=24 7.3s
390/401 | loss=1.0035 ev=0.524 agents=147 avg_r=7.6948 sum_r=1969.86 x<0=0.00 elig=0.64 dorfler_tail=0.08 floor=0 sel=32 8.5s
391/401 | loss=0.9791 ev=0.521 agents=749 avg_r=4.6773 sum_r=1197.40 x<0=0.01 elig=0.63 dorfler_tail=0.07 floor=0 sel=28 7.8s
392/401 | loss=1.0303 ev=0.538 agents=506 avg_r=5.7889 sum_r=1481.96 x<0=0.01 elig=0.63 dorfler_tail=0.08 floor=0 sel=30 7.9s
393/401 | loss=0.9156 ev=0.530 agents=34 avg_r=4.9215 sum_r=1259.91 x<0=0.01 elig=0.63 dorfler_tail=0.07 floor=0 sel=27 7.4s
394/401 | loss=0.9221 ev=0.550 agents=566 avg_r=6.1226 sum_r=1567.39 x<0=0.00 elig=0.63 dorfler_tail=0.08 floor=0 sel=30 7.9s
395/401 | loss=1.0507 ev=0.505 agents=278 avg_r=3.6668 sum_r=938.69 x<0=0.01 elig=0.63 dorfler_tail=0.07 floor=0 sel=28 7.5s
396/401 | loss=1.0621 ev=0.495 agents=535 avg_r=5.1409 sum_r=1316.06 x<0=0.02 elig=0.64 dorfler_tail=0.08 floor=0 sel=27 7.4s
397/401 | loss=0.8922 ev=0.549 agents=145 avg_r=5.6600 sum_r=1448.95 x<0=0.01 elig=0.64 dorfler_tail=0.08 floor=0 sel=29 7.9s
398/401 | loss=1.0484 ev=0.536 agents=62 avg_r=5.7253 sum_r=1465.68 x<0=0.02 elig=0.64 dorfler_tail=0.08 floor=0 sel=26 7.5s
399/401 | loss=1.0258 ev=0.542 agents=146 avg_r=6.1057 sum_r=1563.07 x<0=0.02 elig=0.64 dorfler_tail=0.08 floor=0 sel=29 7.8s
400/401 | loss=0.9834 ev=0.526 agents=697 avg_r=4.9534 sum_r=1268.06 x<0=0.02 elig=0.63 dorfler_tail=0.08 floor=0 sel=28 7.6s
[Checkpoint] saved → checkpoints/model_iter0400.pt
401/401 | loss=0.9563 ev=0.563 agents=177 avg_r=7.3312 sum_r=1876.79 x<0=0.02 elig=0.64 dorfler_tail=0.08 floor=0 sel=30 7.9s
[Checkpoint] saved → checkpoints/model_iter0401.pt
[Checkpoint] saved → checkpoints/model_final.pt
[Train] done, total time 3050.1s
Training finished at Sat 30 May 16:07:16 CST 2026

Binary file not shown.

Binary file not shown.

View File

@ -302,8 +302,8 @@ add_textbox(slide, Inches(0.6), Inches(4.2), Inches(12.1), Inches(0.4),
font_color=BLACK, bold=True)
innovations = [
("[1] 无量纲化残差误差估计", "k_local 归一化三项残差分量,消除纯几何尺度偏差,跨介质公平可比", ACCENT_BLUE),
("[2] Score-based 连续尺寸场", "score = -x_i 纯排序 + 物理预算约束 + Doerfler-P95 动作掩码", ACCENT_TEAL),
("[1] 无量纲化残差误差估计", "真空波数 k 归一化残差+相位/空间特征+GVN介质内 eta 不被压低", ACCENT_BLUE),
("[2] Score-based 连续尺寸场", "score = -x_i 纯排序 + 物理预算约束 + Reverse Dörfler 动作掩码", ACCENT_TEAL),
("[3] L2 聚合奖励设计", "sqrt(sum eta_child^2) <= eta_parent 保证 r_local >= 0永不惩罚细化", ACCENT_GREEN),
("[4] 尺度不变性架构", "N_init x domain_area + lambda 无量纲化特征 + ln 压缩 + 前渐近区约束", ACCENT_WARM),
]
@ -366,9 +366,9 @@ add_textbox(slide, Inches(0.6), Inches(4.1), Inches(6.0), Inches(0.35),
text="RL 问题建模", font_size=SUBHEAD_SIZE, font_color=BLACK, bold=True)
rl_lines = [
("Agent = 每个三角形单元(数量动态变化,约 400 -> 20,000", False, Pt(11), BODY_GRAY),
("State = GNN 节点 12 维特征(几何 + PDE 残差 + 场量 + 物理参数)", False, Pt(11), BODY_GRAY),
("State = GNN 节点 14 维特征(几何 + PDE 残差 + 振幅 + 相位方向 + 物理参数)", False, Pt(11), BODY_GRAY),
("Action = 1 维连续标量 x_i -> score = -x_i 排序 -> top-k 选择细化单元", False, Pt(11), BODY_GRAY),
("Reward = L2 聚合局部改善 + 全局势函数塑形 - 动作惩罚", False, Pt(11), BODY_GRAY),
("Reward = 零和预算审查: refined 获 r_local+0.3x(eta/mu-1)-0.06; unrefined r=0", False, Pt(11), BODY_GRAY),
]
add_multiline_textbox(slide, Inches(0.6), Inches(4.5), Inches(6.0), Inches(2.0),
rl_lines, line_spacing=1.6)
@ -378,7 +378,7 @@ add_textbox(slide, Inches(7.2), Inches(4.1), Inches(5.5), Inches(0.35),
text="PPO 训练配置", font_size=SUBHEAD_SIZE, font_color=BLACK, bold=True)
train_lines = [
("双 GNN 架构Policy / Value 各自独立 MessagePassingBase", False, Pt(11), BODY_GRAY),
("2 层消息传递inner 残差 + LayerNormlatent_dim=64", False, Pt(11), BODY_GRAY),
("2 层消息传递 + GVN 全局虚拟节点 (注意力门控广播)inner 残差 + LayerNormlatent_dim=64", False, Pt(11), BODY_GRAY),
("DiagGaussian 连续动作分布log_std 可学习clamp [-4, -1]", False, Pt(11), BODY_GRAY),
("256 步 Rollout5 EpochsGAE lambda=0.95lr=3e-4梯度裁剪 0.5", False, Pt(11), BODY_GRAY),
]
@ -399,17 +399,17 @@ add_slide_title(slide, "创新 [1]:无量纲化残差误差估计 -- 消除几
add_textbox(slide, Inches(0.6), Inches(1.25), Inches(5.8), Inches(0.35),
text="前序问题:原始残差包含 h_K、h_e 等几何尺度,不同区域不可直接比较", font_size=Pt(13), font_color=ACCENT_WARM)
add_textbox(slide, Inches(0.6), Inches(1.55), Inches(5.8), Inches(0.35),
text="解决方案:引入局部波数 k_local 做无量纲归一化,反映相位分辨率残差", font_size=Pt(13), font_color=ACCENT_BLUE)
text="解决方案:改用真空波数 k 归一化,介质内残差不再被 sqrt(eps_r) 压低", font_size=Pt(13), font_color=ACCENT_BLUE)
formulas = [
("内部残差 r_int",
"(h_K/k_local) * sqrt(V) * |k^2*eps_r*u + k^2*(eps_r-1)*u_inc|_K",
"单元内部 PDE 残差;除以 k_local 使大 eps_r 介质区与真空区可比"),
"(h_K/k) * sqrt(V) * |k^2*eps_r*u + k^2*(eps_r-1)*u_inc|_K",
"单元内部 PDE 残差;真空波数 k 归一化SBC 条件保留 k_local"),
("梯度跳变 r_jump",
"sqrt(1/2 * sum_{e in dK} (h_e/k_local) * |[[grad u * n]]|^2_e)",
"相邻单元梯度跳变h_e/k_local 使细化后跳变自然衰减"),
"sqrt(1/2 * sum_{e in dK} (h_e/k) * |[[grad u * n]]|^2_e)",
"相邻单元梯度跳变h_e/k 使细化后跳变自然衰减"),
("SBC 边界 r_sbc",
"(h_bnd/k_local) * |du/dn - i*k_local*u|",
"(h_bnd/k) * |du/dn - i*k_local*u|",
"Sommerfeld 吸收边界残差,仅在边界单元非零"),
]
@ -438,13 +438,13 @@ add_textbox(slide, Inches(7.5), Inches(4.0), Inches(5.0), Inches(0.55),
add_textbox(slide, Inches(0.6), Inches(4.85), Inches(12.1), Inches(0.3),
text="量纲分析验证", font_size=SUBHEAD_SIZE, font_color=BLACK, bold=True)
da_lines = [
("k_local ~ [L]^-1, h_e ~ [L], |jump|^2 ~ [L]^-2 => h_e/k_local * |jump|^2 ~ [L]^2 * [L]^-2 = 1 严格无量纲", False, Pt(11), BODY_GRAY),
("k_local ~ [L]^-1, h_e ~ [L], |jump|^2 ~ [L]^-2 => h_e/k * |jump|^2 ~ [L]^2 * [L]^-2 = 1 严格无量纲", False, Pt(11), BODY_GRAY),
("GNN 输入用 log10 压缩的特征Reward 用原始 eta_K不经 log 压缩),两者公式一致,物理语义对齐", False, Pt(11), BODY_GRAY),
]
add_multiline_textbox(slide, Inches(0.6), Inches(5.15), Inches(12.1), Inches(0.8),
da_lines, line_spacing=1.5)
add_takeaway_bar(slide, "k_local 归一化使误差指示子反映相位分辨率残差而非网格粗疏程度,为 RL agent 提供物理一致的误差信号")
add_takeaway_bar(slide, "真空波数 k 归一化使介质内残差自然放大 ~sqrt(eps_r) 倍,为 RL agent 提供正确的介质内/外优先级信号")
add_slide_number(slide, 5)
@ -453,7 +453,7 @@ add_slide_number(slide, 5)
# ======================================================================
slide = add_blank_slide()
set_slide_bg(slide, WHITE)
add_slide_title(slide, "创新 [2]12 维增强输入特征 -- 赋予 GNN 几何与物理感知")
add_slide_title(slide, "创新 [2]14 维增强输入特征 -- 赋予 GNN 振幅与相位方向感知")
add_textbox(slide, Inches(0.6), Inches(1.25), Inches(12.1), Inches(0.35),
text="前序 11 维 -> 现 12 维,新增 dist_to_interface。全部尺度相关特征均以真空波长 lambda=2*pi/k 无量纲化", font_size=Pt(13), font_color=ACCENT_BLUE)
@ -479,7 +479,7 @@ features = [
("element_penalty", "单元惩罚系数 lambda", "--"),
("timestep", "当前 rollout 步数", "--"),
("wave_number", "Helmholtz 波数 k", "--"),
("k_local_sqrt_vol", "k_local x sqrt(volume) 已无量纲", "--"),
("k_local_sqrt_vol", "k x sqrt(eps_r) x sqrt(volume)", "--"),
("is_sbc_boundary", "是否与 SBC 边界相邻 (0/1)", "--"),
("dist_to_interface", "到介质边界的带符号距离 [新增]", "sign(d)*ln(1+|d|/lambda)"),
("epsilon_r", "单元中点介电常数(内=eps_r, 外=1.0", "--"),
@ -501,7 +501,7 @@ for i, (name, meaning, norm) in enumerate(features):
# Edge feature note — positioned after table (table bottom = 1.65 + 0.30 + 12*0.30 = 5.55")
add_textbox(slide, Inches(0.6), Inches(5.65), Inches(12.1), Inches(0.25),
text="边特征 (1 维)euclidean_distance / lambda -- 相邻单元中点无量纲距离 | 合计12 (节点) + 1 (边) = 13 维图特征",
text="边特征 (1 维)euclidean_distance / lambda -- 相邻单元中点无量纲距离 | 合计14 (节点) + 1 (边) = 15 维图特征",
font_size=Pt(9), font_color=BODY_GRAY)
add_takeaway_bar(slide, "全部与尺度相关的特征均以 lambda 做无量纲归一化dist_to_interface 用 sign·ln(1+|d|) 对数压缩,近场线性、远场自然压缩,与残差 log10 风格统一")
@ -534,7 +534,7 @@ algo_steps = [
("Step 2: Score 排序",
"score = -x_i (Actor 输出标量)\nx 越小 -> 优先级越高,纯排序,不设正负门槛"),
("Step 3: 双过滤器",
"eligible = {i | area_i > 0.25 x A_budget_i AND eta_i >= 0.05 x eta_P95}\narea_floor: 排除已足够细的单元\nDoerfler-P95: 排除低误差单元 (P95 锚定物理误差尺度)"),
"eligible = {i | area_i > V_min_safeguard AND i in Reverse_Dorfler_set}\narea_floor: 纯数值底线 (1e-10 x domain_area)\nReverse Dorfler: 能量尾部淘汰 (eps_noise=0.01, >=20% floor)"),
("Step 4: Top-k 选择",
"num = min(|eligible|, N_current//4, remaining//3) (自适应 cap, 增速 N//4)\nselected = top-k by score -> 1-to-4 切分细化"),
]
@ -549,10 +549,10 @@ for i, (title, content) in enumerate(algo_steps):
add_rect(slide, Inches(0.6), Inches(5.45), Inches(12.1), Inches(0.95), fill_color=None,
line_color=ACCENT_BLUE, line_width=Pt(0.5))
add_textbox(slide, Inches(0.8), Inches(5.5), Inches(11.7), Inches(0.85),
text="为什么用 Doerfler-P95 而非 median/meanP95 锚定物理误差尺度,免疫远场噪声稀释。远场低 eta 区即使占 90% 的单元,也不会拉低锚点。确保只有误差真正达标的区域才消耗细化预算",
text="为什么用 Reverse Dörfler 而非 P95 硬阈值P95 在重尾分布下会被奇异点推至极高一刀切屏蔽大片中等误差区域。Reverse Dörfler 基于能量累积 (L2 范数平方和),自适应于任意分布形态,剔除确认无价值的底部噪声,保留 >=20% 单元确保 Agent 选择空间",
font_size=Pt(11), font_color=BODY_GRAY)
add_takeaway_bar(slide, "Score-based 排序 + 物理预算 + Doerfler-P95 掩码:三层保障确保细化资源只投入到物理上需要的地方")
add_takeaway_bar(slide, "Score-based 排序 + 物理预算 + Reverse Dörfler 掩码:三层保障确保细化资源只投入到物理上需要的地方")
add_slide_number(slide, 7)
@ -608,16 +608,17 @@ add_multiline_textbox(slide, Inches(0.6), Inches(4.8), Inches(6.0), Inches(0.7),
pen_lines, line_spacing=1.5)
add_textbox(slide, Inches(7.2), Inches(4.45), Inches(5.5), Inches(0.3),
text="全局势函数塑形", font_size=SUBHEAD_SIZE, font_color=BLACK, bold=True)
text="Actor 奖励设计原则", font_size=SUBHEAD_SIZE, font_color=BLACK, bold=True)
glob_lines = [
("E_global = sqrt(sum eta_K^2) / ||u_h||_{L2(Omega)} (无量纲全局误差)", False, Pt(12), BODY_GRAY),
("global_bonus = alpha x [log(E_old) - log(E_new)], alpha = 0.2", False, Pt(12), BODY_GRAY),
("仅发给被细化的父单元 -- 避免被未细化单元稀释信号", False, Pt(11), CAPTION),
("global_bonus 被 Helmholtz 污染误差污染", False, Pt(12), BODY_GRAY),
("E_new > E_old 可发生在正确细化后", False, Pt(11), BODY_GRAY),
("惩罚 Agent 做对的事 → 策略崩塌 (x<0→0.01)", False, Pt(11), BODY_GRAY),
("修正: global_bonus 仅诊断, 不注入 Actor reward", False, Pt(11), CAPTION),
]
add_multiline_textbox(slide, Inches(7.2), Inches(4.8), Inches(5.5), Inches(0.7),
glob_lines, line_spacing=1.5)
add_takeaway_bar(slide, "奖励公式 = L2 聚合局部改善 (>=0) + 全局势函数塑形 (仅细化单元) - 轻微动作惩罚 -> 每个被细化父单元净奖励约 +0.387")
add_takeaway_bar(slide, "零和预算审查: 奖金 0.3*(eta/mu-1) 全场求和为零 (Doerfler 准则 RL 对偶); unrefined r=0; global_bonus 仅诊断")
add_slide_number(slide, 8)
@ -771,12 +772,14 @@ add_textbox(slide, Inches(0.8), Inches(1.85), Inches(5.4), Inches(0.3),
text="MessagePassingBase (x2, Policy / Value 各自独立基座)", font_size=Pt(13), font_color=ACCENT_BLUE, bold=True)
gnn_items = [
("节点嵌入", "Linear(12 -> 64)"),
("节点嵌入", "Linear(14 -> 64)"),
("边嵌入", "Linear(1 -> 64)"),
("MP Step 1", "EdgeModule: MLP([src|dst|edge_attr]) -> 64d"),
("", "NodeModule: MLP([node|scatter_mean(入边)]) -> 64d"),
("", "+ inner 残差 + LayerNorm"),
("MP Step 2", "同 Step 1堆叠 2 层"),
("GVN 全局虚拟节点", "h_V = Σ(η_v/Ση)·h_v (η_K 加权池化)"),
("", "α = σ(W[h_v||h_V])h_v += scale·α ⊙ W_V·h_V"),
("输出", "节点隐向量 (num_nodes, 64)"),
]
@ -896,10 +899,10 @@ add_slide_title(slide, "创新点汇总与可复用价值")
innovations = [
("[1]", "无量纲化\n残差误差估计",
"k_local 归一化三项残差分量\n消除纯几何尺度偏差\nGNN 输入与 Reward 公式物理一致",
"真空波数 k 归一化残差\n介质内 η 不再被压低\nGNN+Reward 统一使用 k 归一化",
ACCENT_BLUE),
("[2]", "Score-based\n连续尺寸场",
"score = -x_i 纯排序\n物理预算 N_budget 约束\nDoerfler-P95 双过滤器掩码",
"score = -x_i 纯排序\n物理预算 N_budget 约束\nReverse Dörfler 双过滤器掩码",
ACCENT_TEAL),
("[3]", "L2 聚合\n奖励设计",
"sqrt(sum eta_child^2) <= eta_parent 天然成立\n永不惩罚细化 (r_local >= 0)\nint 主导区强正奖励约 +0.69",
@ -927,9 +930,9 @@ add_textbox(slide, Inches(0.6), Inches(4.7), Inches(12.1), Inches(0.3),
reuse_items = [
("L2 聚合 + 父子映射", "适用于任何分裂型变长 agent RL 场景(网格细化、树搜索、层次化决策)"),
("k_local 无量纲化方法", "适用于具有特征尺度的任何 PDE 问题:跨介质、跨频率、跨几何的统一误差度量"),
("真空波数 k 归一化方法", "残差归一化用 k₀ 非 k_local介质内物理信号不再被压低"),
("Score-based + 预算约束选择", "适用于资源受限的排序-选择问题:传感器部署、计算资源分配、实验设计优化"),
("Doerfler-P95 动作掩码", "P95 锚定物理尺度的思想可推广到任何需要排除低信号样本的场景"),
("Reverse Dörfler 动作掩码", "能量尾部淘汰的思想可推广到任何需要排除低信号样本的场景"),
]
for i, (tag, desc) in enumerate(reuse_items):
add_textbox(slide, Inches(0.8), Inches(5.05 + i * 0.42), Inches(2.8), Inches(0.35),
@ -1002,8 +1005,8 @@ add_textbox(slide, Inches(0.85), Inches(2.0), Inches(11.5), Inches(1.0),
summary_points = [
"提出了一套完整的 RL 自适应网格细化框架:从物理建模、误差估计、状态表征、动作空间到奖励设计的全链路创新",
"无量纲化残差误差估计 (k_local 归一化) 使误差指示子具有跨介质、跨频率的物理一致性",
"Score-based 尺寸场 + 物理预算约束 + Doerfler-P95 掩码实现了资源感知的细化单元选择",
"真空波数 k 归一化残差使介质内 η 自然放大Agent 获得正确的物理优先级信号",
"Score-based 尺寸场 + 物理预算约束 + Reverse Dörfler 掩码实现了资源感知的细化单元选择",
"L2 聚合奖励设计从数学上保证了细化奖励非负,从根本上避免了 L1 sum 的结构性负偏置",
"sign(d)*ln(1+|d|/lambda) 对数压缩 + lambda 归一化全部特征实现了域尺寸的尺度不变泛化",
]

Binary file not shown.

155
paper_outline.md Normal file
View File

@ -0,0 +1,155 @@
# 论文大纲框架
**暂定标题(中文):** 基于图神经网络与强化学习的亥姆霍兹散射问题自适应网格细化
**暂定标题(英文):** Reinforcement LearningDriven Adaptive Mesh Refinement for 2D Helmholtz Scattering via Graph Neural Networks
---
## 1. Introduction引言
### 1.1 领域背景与重要性
- 高频亥姆霍兹方程在电磁散射、声学等领域的重要性
- 有限元方法FEM求解亥姆霍兹问题的挑战污染效应pollution effect即标准FEM在高频下误差随波数增长
### 1.2 现有方法与瓶颈
- 自适应网格细化AMR的传统方法基于残差的误差指示器、Dörfler标记策略
- 传统AMR的局限性启发式标记策略难以捕获全局误差分布高频问题中局部指标与全局误差脱节
- 已有的机器学习方法尝试(如有相关工作)
### 1.3 本文贡献Gap → Solution
- 提出将AMR建模为马尔可夫决策过程MDP使用PPO训练GNN策略网络
- 三个核心创新点:
- a空间奖励函数设计考虑网格细化层级映射
- b全局虚拟节点GVNGNN架构突破消息传递的直径瓶颈
- c物理信息特征相位距离、局部波数提升泛化能力
### 1.4 论文组织
- 简述后续各节安排
---
## 2. Problem Formulation问题形式化
### 2.1 亥姆霍兹散射问题的数学描述
- 控制方程:$\nabla^2 u_{scat} + k^2 \epsilon_r u_{scat} = k^2(1-\epsilon_r)u_{inc}$
- Sommerfeld辐射边界条件
- P1三角单元的FEM离散
### 2.2 残差误差指示器
- $\eta_K$ 的定义:内部残差 + 梯度跳跃 + SBC边界项
- 误差指示器的物理意义
### 2.3 AMR作为序贯决策问题
- 为什么传统的单步标记策略不够
- 将多步细化过程建模为MDP的理由
---
## 3. Method方法
### 3.1 RL Environment强化学习环境
#### 3.1.1 状态空间State
- 图表示:节点 = 网格单元,边 = 邻接关系
- 节点特征13维几何、残差、解信息、时间步
- 边特征1维相位距离
#### 3.1.2 动作空间Action
- 连续评分基于排序选择top-k细化
#### 3.1.3 奖励函数Reward
- 基于 $\log(\eta_{old}) - \log(\eta_{new})$ 的对数误差缩减
- 零和奖励项Dörfler准则的软实现
- 元素数惩罚项 $\lambda \cdot (N_{new} - 1)$
#### 3.1.4 预算约束
- $N_{budget} \propto k^2$
### 3.2 GNN Policy ArchitectureGNN策略架构
#### 3.2.1 消息传递基座
- 2层边更新 + 节点更新
- 残差连接 + LayerNorm
#### 3.2.2 全局虚拟节点GVN
- 注意力门控池化
- 注入全局误差分布上下文,突破消息传递的直径瓶颈
#### 3.2.3 Actor-Critic头
- 分离的策略头和价值头
- Actor对角高斯分布
- Critic节点级价值聚合
### 3.3 PPO TrainingPPO训练
- 自定义RolloutBuffer处理可变智能体数量网格细化导致节点数变化
- GAE计算中使用scatter_add将子节点价值投影回父节点
- 标准PPO裁剪损失 + 熵正则化
---
## 4. Experiments实验
### 4.1 Experimental Setup实验设置
- 数值求解器scikit-femP1三角单元
- 训练配置401次迭代256步rollout
- 初始网格:基于波数 $k$ 和域面积自动缩放($N \propto k^2$
- 预渐近约束:$h \leq \lambda_d / 1.5$
### 4.2 Baselines基线方法
- 均匀细化Uniform refinement
- 基于残差误差指示器的传统AMRDörfler标记
- 随机策略Random policy
- (如有其他消融实验变体)
### 4.3 Main Results主要结果
- 不同波数 $k$ 下的误差收敛曲线error vs. DOF
- 不同散射体几何(圆形、多圆形、方形)的泛化性能
- 网格演化可视化refinement pattern
### 4.4 Ablation Studies消融实验
- 奖励函数设计的影响(有/无零和奖励、有/无元素数惩罚)
- GVN模块的贡献有/无全局上下文)
- 物理信息特征(相位距离)的影响
- 消息传递层数的影响
### 4.5 Analysis & Diagnostics分析与诊断
- 学到的细化模式分析(是否集中在散射体边界/高梯度区域)
- 动作分布统计($x<0$ 比率的变化趋势
- 训练曲线(奖励、误差缩减、元素数的收敛过程)
---
## 5. Discussion讨论
- **核心优势**RL策略能够学习超越传统启发式的全局细化模式
- **与传统方法的关系**学到的策略隐式地实现了类似Dörfler的标记但具有更强的上下文感知
- **GVN的作用**:全局信息对高频问题中跨域误差传播的关键性
- **局限性**
- 当前仅限2D亥姆霍兹问题
- P1单元的固有色散误差未被修正
- 训练成本较高
- **未来方向**
- 双加权残差DWR引入伴随误差估计以获得更准确的奖励信号
- 相空间方法使用Wigner分布引导基于动量失配的细化
- 算子修正探索Trefftz方法或GLS稳定化以减少P1单元的固有色散误差
---
## 6. Conclusion结论
- 贡献总结将AMR建模为RL问题设计了空间奖励函数和GVN-GNN架构
- 关键证据:在多个波数和几何上展示了误差收敛优势
- 影响:为高频波传播问题的数据驱动网格优化提供了新范式
- 边界:当前框架的适用范围与假设
---
## 补充说明
| 项目 | 说明 |
|---|---|
| 论文类型 | 方法论文Method paper |
| 核心主张 | RL+GNN可以学习优于传统启发式的AMR策略尤其在高频亥姆霍兹问题中 |
| 证据支撑 | 误差收敛曲线、不同几何泛化、消融实验、网格演化可视化 |
| 待确认 | 是否有与传统AMR的定量对比数据是否有跨波数泛化的实验GVN消融结果如何 |

466
paper_outline.tex Normal file
View File

@ -0,0 +1,466 @@
\documentclass[11pt,a4paper]{article}
% ---- 基础包 ----
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{amsmath,amssymb,amsfonts}
\usepackage{graphicx}
\usepackage{booktabs}
\usepackage{hyperref}
\usepackage[margin=2.5cm]{geometry}
\usepackage{enumitem}
\usepackage{xcolor}
% ---- 实验标注命令 ----
\newcommand{\needexp}[1]{\textcolor{red}{[实验待做: #1]}}
% ---- 标题信息 ----
\title{基于图神经网络与强化学习的亥姆霍兹散射问题自适应网格细化:\\
跨波数零样本泛化与非局域误差传播}
\author{[作者姓名] \\ [单位]}
\date{}
\begin{document}
\maketitle
% ============================================================
\section{Introduction引言}
% ============================================================
\subsection{领域背景Field Scale}
\begin{itemize}
\item 高频亥姆霍兹方程 $\nabla^2 u + k^2\varepsilon_r u = f$ 是电磁散射、声学传播、地震成像等领域的核心控制方程
\item 有限元方法FEM求解亥姆霍兹问题的核心困难\textbf{污染效应pollution effect}——标准 P1 Galerkin FEM 的色散误差随波数 $k$ 增大而累积,导致"即使每波长分辨率足够,远场相位误差仍不可接受"
\item 缓解污染效应的主要手段:\textbf{自适应网格细化AMR}——在有物理特征(介质界面、高梯度区)的地方局部加密网格,在平缓区保持粗网格
\end{itemize}
\subsection{现有方法与瓶颈Prior Attempts \& Bottleneck}
\begin{itemize}
\item \textbf{传统 AMR}基于后验误差估计子(残差型 $\eta_K$、梯度恢复型的单步启发式标记策略D\"{o}rfler 标记、最大策略标记)
\item \textbf{传统方法的两个根本局限:}
\begin{enumerate}
\item \textbf{贪心单步决策}:每步仅根据当前误差分布标记细化区域,无法规划多步预算分配——早期过度细化低价值区域会耗尽后续步的预算
\item \textbf{局部信息盲区}:高频亥姆霍兹的误差通过波动物理在长距离上非局域传播(介质界面的误差影响远场散射场),而传统误差指示子仅反映局部残差,无法感知误差的因果来源
\end{enumerate}
\item \textbf{已有 ML-AMR 方法:}Adaptive Swarm Mesh Refinement (ASMR) 首次将 AMR 形式化为多智能体 MDP 并用 PPO 训练 GNN 策略,但:
\begin{itemize}
\item 针对泊松/椭圆型方程(自伴、椭圆、误差局部扩散),消息传递机制在椭圆型设置下足够
\item 未涉及高频亥姆霍兹方程的非局域性、不定号性和污染效应
\end{itemize}
\end{itemize}
\subsection{未解决的核心 gapUnresolved Gap}
\begin{itemize}
\item 高频亥姆霍兹散射中的非局域误差传播要求网格细化策略具备\textbf{全局上下文感知能力}——标准 GNN 的局部消息传递受限于图的直径,需 $O(\text{diameter})$ 层数才能传递远距离信息
\item 传统 AMR 的误差指示子和标记阈值是\textbf{$k$ 相关的}——针对某个波数调好的参数在更高频段失效,需要重新调参
\item 已有方法需依赖真值或超精细网格参考解作为训练信号——在实际工程中通常不可得
\end{itemize}
\subsection{本文贡献Present Study}
提出一种针对高频亥姆霍兹散射的 RL-GNN 自适应网格细化方法。核心贡献:
\begin{enumerate}[label=\textbf{C\arabic*}, leftmargin=*]
\item \textbf{首次将 RL-AMR 拓展到高频亥姆霍兹方程。}通过全局虚拟节点GVN架构解决非局域误差传播问题使得 GNN 策略能感知全局误差分布。
\item \textbf{跨波数零样本泛化。}通过 $k$ 不变特征归一化(真空波数归一化 + 相位距离边特征),策略在中等波数 $k\in[3,15]$ 训练后可直接泛化到更高波数 $k=30$——无需重新调参或微调。传统 AMR 方法无法做到这一点。
\item \textbf{残差型后验误差估计子 $\eta_K$ 作为奖励信号。}无需解析解或超精细参考网格,使方法可应用于任意散射体几何和介质分布。
\item \textbf{因果隔离的奖励函数设计。}通过 agent\_mapping 追踪父子元素层级,保证奖励信号的因果正确性:全局误差变化不反馈给 Actor未细化父元素获得零奖励。
\end{enumerate}
\subsection{论文组织}
第 2 节建立问题形式化,第 3 节详述方法,第 4 节给出实验与消融分析,第 5 节讨论与展望,第 6 节总结。
% ============================================================
\section{Problem Formulation问题形式化}
% ============================================================
\subsection{亥姆霍兹散射问题}
\textbf{控制方程(二维):}
\begin{equation}
\nabla^2 u_{\mathrm{scat}} + k^2 \varepsilon_r(\mathbf{x}) u_{\mathrm{scat}}
= k^2\big(1-\varepsilon_r(\mathbf{x})\big) u_{\mathrm{inc}}(\mathbf{x})
\label{eq:helmholtz}
\end{equation}
其中 $u_{\mathrm{scat}}$ 为散射场,$u_{\mathrm{inc}}$ 为入射平面波,$k$ 为真空波数,$\varepsilon_r(\mathbf{x})$ 为相对介电常数分布。外边界施加一阶 Sommerfeld 辐射条件:
\begin{equation}
\frac{\partial u_{\mathrm{scat}}}{\partial n} - i k u_{\mathrm{scat}} = 0
\label{eq:sbc}
\end{equation}
\textbf{散射体:}圆形介质柱($\varepsilon_r \in [2.0, 8.0]$),半径和位置可随机化。计算域为 $[0,1] \times [0,1]$ 矩形。
\textbf{FEM 离散:}P1 线性三角单元。Galerkin 弱形式:
\begin{equation}
\int_\Omega \nabla u_h \cdot \nabla v_h \,dx
- k^2\int_\Omega \varepsilon_r u_h v_h \,dx
- ik\oint_{\partial\Omega} u_h v_h \,ds
= -k^2\int_\Omega (1-\varepsilon_r)u_{\mathrm{inc}} v_h \,dx
\end{equation}
\subsection{残差型后验误差估计子 $\eta_K$}
对每个三角单元 $K$,定义无量纲残差误差指示子(以真空波数 $k$ 归一化,\textbf{}局部波数 $k\sqrt{\varepsilon_r}$
\begin{equation}
\eta_K^2 =
\underbrace{\left(\frac{h_K}{k}\right)^2 \cdot V_K \cdot \big|k^2\varepsilon_r u_h + k^2(\varepsilon_r-1)u_{\mathrm{inc}}\big|^2}_{\text{内部残差}}
+ \underbrace{\frac{1}{2}\sum_{e\in\partial K} \frac{h_e}{k} \cdot \big\|[\kern-2pt[ \nabla u_h\cdot\mathbf{n} ]\kern-2pt]\big\|^2_e}_{\text{梯度跳跃}}
+ \underbrace{\frac{h_{\mathrm{bnd}}}{k} \cdot \big|\frac{\partial u_h}{\partial n} - ik u_h\big|^2}_{\text{SBC 边界残差}}
\label{eq:eta}
\end{equation}
\textbf{为什么用真空波数归一化:}使用局部波数 $k_{\mathrm{local}} = k\sqrt{\varepsilon_r}$ 会导致介质内部 $\eta_K$ 被人为压制 $\sqrt{\varepsilon_r}$ 倍,使 GNN 对介质内部区域"视而不见"。用真空波数 $k$ 保证不同介质区域的误差指示子可比。
\textbf{为什么用 $\eta_K$ 作为奖励而非真值:}在实际散射问题中,不存在解析解或超精细参考解。$\eta_K$ 是仅依赖当前 FEM 解的可计算量,且在预渐近条件下($h \leq \lambda_d/N$)与真实误差等价(可靠性 + 有效性)。这使得整个方法不绑定任何特定几何或介质。
\subsection{预渐近约束Pre-asymptotic Resolution}
在细化开始前,强制介质内部单元满足 $h_K \leq \lambda_d / N$$N=1.5$$\lambda_d = 2\pi/(k\sqrt{\varepsilon_r})$ 为介质内波长),确保初始网格已充分解析介质内部波的相位变化。该约束防止 GNN 从"纯数值噪声"中学习。
\subsection{AMR 作为序贯决策问题}
$T$ 步网格细化过程形式化为 MDP $\langle \mathcal{S}, \mathcal{A}, P, R, \gamma \rangle$
\begin{itemize}
\item \textbf{状态 $\mathcal{S}$}$\mathcal{G}_t = (\mathcal{V}_t, \mathcal{E}_t)$,节点为三角单元,边为共享棱边的邻接关系。节点特征 13 维,边特征 1 维(相位距离,见 \S\ref{sec:features}
\item \textbf{动作 $\mathcal{A}$}每个单元输出连续评分 $x_i \in \mathbb{R}$,按 $\mathrm{score}_i = -x_i$ 降序排列,在物理预算 $N_{\mathrm{budget}} \propto k^2$ 约束下选择 top-$k$ 单元进行细化Rivara 最长边二分 + 一致性闭包)
\item \textbf{奖励 $R$}基于 $\eta_K$ 的对数误差缩减(见 \S\ref{sec:reward}
\item \textbf{终止:}达到最大步数 $T_{\max}=4\sim6$或预算耗尽或网格总单元数超过上限50k
\item \textbf{关键区别vs 传统 AMR}策略可以跨步规划——在早期步骤有意保留预算,在后期步骤集中处理高价值区域
\end{itemize}
% ============================================================
\section{Method方法}
% ============================================================
\subsection{$k$ 不变特征设计}
\label{sec:features}
为使 GNN 在不同波数 $k$ 下看到相似分布的输入,所有特征均设计为 $k$ 无关或 $k$ 尺度化的形式。
\textbf{节点特征13 维):}
\begin{enumerate}[leftmargin=*]
\item 单元体积 $V_K$(经过对数压缩)
\item--4. 三个残差分量:$\log(1 + \eta_{K,\mathrm{int}})$, $\log(1 + \eta_{K,\mathrm{jump}})$, $\log(1 + \eta_{K,\mathrm{bnd}})$
\item 惩罚项标志(是否属于细化惩罚区)
\item 当前时间步 $t/T_{\max}$
\item $k\sqrt{V_K}$:波数-尺度耦合特征
\item SBC 边界标志:单元是否接触 Sommerfeld 边界
\item 到介质界面的有符号对数距离:$\mathrm{sign}(d) \cdot \log(1 + |d|)$
\item $\varepsilon_r$:单元所在介质的相对介电常数
\item 场幅值:$|u_h|$
\item--13. 复场的相位特征:$\cos(\angle u_h)$, $\sin(\angle u_h)$
\end{enumerate}
\textbf{边特征1 维):}
\begin{equation}
e_{ij} = k \cdot |\mathbf{x}_i^{\mathrm{mid}} - \mathbf{x}_j^{\mathrm{mid}}| \pmod{2\pi}
\end{equation}
即两个相邻单元中点之间的相位距离。该特征是 $k$ 自适应的——在更高波数下,物理波长更短,中点距离自然更大(以相位度量)。以此保证跨波数下边特征的分布一致。
\subsection{奖励函数设计:因果隔离 + 零和预算审计}
\label{sec:reward}
奖励函数的核心原则:
\begin{enumerate}[leftmargin=*]
\item \textbf{基于 $\eta_K$ 而非真值}(如上所述)
\item \textbf{因果隔离:}仅被细化的父元素获得奖励,未细化的父元素获得零奖励。全局误差变化不反馈给 Actor——因为高频亥姆霍兹的远场误差受介质内部多个区域共同影响将全局误差直接分配给局部动作会破坏因果关系
\item \textbf{零和预算审计:}受 D\"{o}rfler 标记策略启发,引入零和奖励项——$\eta_K$ 高于均值的元素获得正奖励,低于均值的元素获得等量负惩罚。保证整体预算中性
\end{enumerate}
\textbf{奖励计算公式:}
\begin{equation}
r_i = \underbrace{\log\eta_{K,i}^{\mathrm{old}} - \max_{j \in \mathrm{children}(i)} \log\eta_{K,j}^{\mathrm{new}}}_{\text{对数误差缩减}}
+ \underbrace{\alpha \cdot \big(\eta_{K,i} - \bar{\eta}_K\big)}_{\text{零和 D\"{o}rfler 奖励}}
- \underbrace{\lambda \cdot (n_i^{\mathrm{children}} - 1)}_{\text{元素数惩罚}}
\end{equation}
其中 $\mathrm{children}(i)$ 通过 \texttt{agent\_mapping} $\phi_{ij}$ 将子元素误差映射到父元素,取 $\max$(最差子元素决定奖励,驱动策略优先处理最难改善的区域)。
\textbf{奖励归一化:}每个 rollout 内对所有 agent 的奖励做 z-score 标准化,移除 reward scale 对 PPO 更新的影响。
\subsection{GNN 策略架构}
\subsubsection{消息传递基座MessagePassingBase}
\begin{itemize}
\item 节点特征嵌入Linear(13, 64) + Tanh
\item 边特征嵌入Linear(1, 64) + Tanh
\item \texttt{MessagePassingStack}2 层 $\{\text{EdgeModule} \to \text{NodeModule}\}$
\begin{itemize}
\item EdgeModule聚合相邻节点特征 $h_i, h_j$ 与边特征 $e_{ij}$,更新边表征
\item NodeModule聚合邻边表征更新节点表征
\item 每层内部含残差连接 + LayerNorm
\end{itemize}
\item 训练时 Edge Dropout = 0.1
\end{itemize}
\subsubsection{全局虚拟节点Global Virtual Node, GVN}
\textbf{设计动机:}标准消息传递 GNN 的信息传播受限于图的直径——要在相距 $d$ 跳的两个节点间传递信息,至少需要 $d$ 层消息传递。对于高频亥姆霍兹问题介质界面的误差通过波传播影响远场需要全局上下文。GVN 提供 $O(1)$ 的全局信息通道。
\textbf{GVN 机制:}
\begin{enumerate}[leftmargin=*]
\item \textbf{池化:}对所有节点特征做误差加权池化,得到全局上下文向量 $g$
\begin{equation}
g = \sum_{i\in\mathcal{V}} w_i \cdot h_i, \quad w_i = \frac{\eta_{K,i}}{\sum_j \eta_{K,j}}
\end{equation}
误差越大的节点对全局上下文的贡献越大
\item \textbf{注意力门控广播:}$g$ 广播回每个节点,通过可学习的注意力门控 $\gamma_i \in [0,1]$ 控制每个节点对全局信息的接收程度:
\begin{equation}
h_i' = h_i + \gamma_i \cdot g, \quad \gamma_i = \sigma\big(\mathrm{MLP}([h_i, g])\big)
\end{equation}
不同物理区域的节点对全局信息的需求不同:介质界面附近需要远场上下文,均匀介质内部几乎不需要
\end{enumerate}
\textbf{GNN 总参数量:}92,740
\subsubsection{Actor-Critic 双头}
\begin{itemize}
\item \textbf{策略头Actor}MLP(64, 32) + Tanh $\to$ Linear(32, 1) $\to$ 动作均值 $\mu_i$;可学习 log\_std初始化 $-2.0$,截断 $[-4.0, -1.0]$$\to$ \texttt{DiagGaussianDistribution}
\item \textbf{价值头Critic}MLP(64, 32) + Tanh $\to$ Linear(32, 1) $\to$ 逐元素价值 $V_i$
\item 策略头和价值头不共享除 GNN backbone 外的参数
\end{itemize}
\subsection{PPO 训练}
\subsubsection{处理可变智能体数量}
网格细化导致元素数量变化,标准 RL 假设固定数量 agent。解决方案在 GAE 计算阶段,通过 \texttt{scatter\_add} 将子节点价值 $V_j(s_{t+1})$\texttt{agent\_mapping} $\phi_{ij}$ 投影回父节点索引:
\begin{equation}
\delta_i^t = r_i(s_t, a_t) + \gamma \cdot \sum_{j} \phi_{ij}^t \cdot V_j(s_{t+1}) - V_i(s_t)
\end{equation}
\subsubsection{训练超参数}
\begin{table}[h]
\centering
\begin{tabular}{ll}
\toprule
参数 &\\
\midrule
Rollout 步数 & 256 / iteration \\
PPO epochs & 3 / iteration \\
折扣因子 $\gamma$ & 0.99 \\
GAE $\lambda$ & 0.95 \\
Clip range & 0.2 \\
Max grad norm & 0.5 \\
学习率 & $3\times10^{-4}$Adam \\
熵系数 & 0.005 \\
价值损失系数 & 0.5 \\
总迭代数 & 401 \\
\bottomrule
\end{tabular}
\end{table}
\subsection{动作掩码Reverse D\"{o}rfler}
在动作选择前,应用"反向 D\"{o}rfler"过滤:按 $\eta_K$ 升序排列单元,累计误差贡献 $< 1\%$ 总误差能量的尾部单元被标记为不可细化(排除数值噪声)。同时设 20\% 最低可选比例,确保智能体始终有充足的选择空间。
% ============================================================
\section{Experiments实验}
% ============================================================
\textbf{标注说明:}红色标注 \needexp{...} 表示尚未完成的实验。
\subsection{实验设置}
\begin{itemize}
\item \textbf{PDE 求解器:}scikit-fem, P1 三角单元
\item \textbf{计算域:}$[0,1]^2$,默认散射体为圆形介质柱
\item \textbf{训练 PDE 分布:}$k \in [3, 15]$ 随机采样,$\varepsilon_r \in [2.0, 4.0]$ 随机采样,圆形散射体半径和位置随机
\item \textbf{初始网格:}密度 $\propto k^2$,预渐近约束 $h \leq \lambda_d/1.5$
\item \textbf{训练配置:}401 iteration $\times$ 256 rollout steps单 GPU 约 55 分钟
\item \textbf{硬件:}[填写 GPU 型号]
\end{itemize}
\subsection{基线方法}
\begin{enumerate}[leftmargin=*]
\item \textbf{均匀细化Uniform}每步对所有单元无差别细化(等价于全局 $h$-refinement
\item \textbf{D\"{o}rfler 标记D\"{o}rfler}使用 $\eta_K$ 作为误差指示子D\"{o}rfler 参数 $\theta=0.5$,标记累计误差占比 $\geq 50\%$ 的最小单元集合
\item \textbf{最大策略标记Max-marking}每步选取 $\eta_K$ 最高的 top-$k$ 单元($k$ 与 RL 预算一致)
\item \textbf{随机策略Random}在可选单元中等概率随机选择
\item \textbf{RL w/o GVN消融}本文方法的 GVN 消融变体
\end{enumerate}
\subsection{主要结果}
\subsubsection{误差-自由度曲线Error vs.\ DOF}
\needexp{$k=10, 15, 20, 25, 30$ 下,绘制 RL 策略与所有基线的 error vs.\ DOF 曲线。每条曲线 4--6 个细化步。}
\begin{itemize}
\item \textbf{预期结果:}RL 策略在所有波数下位于所有基线曲线之下(同等 DOF 误差更小,或同等误差更省计算)
\item \textbf{评估指标:}$\ell_2$ 相对误差vs Mie 解析解或超精细参考解),全局 $\eta_K$ 总和
\item \textbf{表格:}列出各方法在不同波数 $k$ 和不同细化步下的 $\ell_2$ 误差与单元数
\end{itemize}
\subsubsection{跨波数零样本泛化}
\needexp{训练集 $k\in[3,15]$,测试集 $k=20, 25, 30, 35$。绘制 error vs.\ DOF 曲线,对比 RL 策略与 D\"{o}rfler 标记在未见波数下的表现。}
这是区分本文方法与所有传统 AMR 方法的核心实验:
\begin{itemize}
\item D\"{o}rfler 参数 $\theta$ 固定为 0.5(在 $k=15$ 调优)——预期在高 $k$ 下性能退化
\item RL 策略不做任何调整——预期在 $k=30$ 下仍保持甚至扩大优势
\item 如果 RL 在 $k=30$ 的 error-vs-DOF 仍优于 D\"{o}rfler直接证明 $k$ 不变特征的有效性
\end{itemize}
\subsubsection{跨几何泛化}
\needexp{训练全部用圆形散射体。测试:方形介质柱、双圆柱、三圆柱。展示 error vs.\ DOF 曲线和网格快照。}
\subsubsection{跨介质参数泛化}
\needexp{训练集 $\varepsilon_r\in[2,4]$,测试 $\varepsilon_r=6,8$。展示 error vs.\ DOF。}
\subsubsection{网格演化可视化}
\needexp{选取代表性 case$k=20$,方形散射体),展示 RL 策略从初始网格到最终网格的逐步细化快照,与 D\"{o}rfler 标记的对应步快照并列对比。}
预期观察RL 策略在介质界面和高梯度区域集中细化在均匀区域保持粗网格D\"{o}rfler 标记可能在远离界面的区域"浪费"细化预算。
\subsection{消融实验}
\subsubsection{GVN 消融}
\needexp{训练两个模型:完整 RL含 GVNvs RL w/o GVN仅 2 层 message passing。在 $k=10, 20, 30$ 下对比 error vs.\ DOF。}
\textbf{核心假设:}
\begin{itemize}
\item$k$$k=10$GVN 和 w/o GVN 表现接近(误差传播范围小,局部信息足够)
\item$k$$k=30$GVN 显著优于 w/o GVN非局域误差传播范围扩大需要全局上下文
\item 交互效应:$k$ 越高GVN 的增益越大——这直接证明 GVN 解决了非局域误差传播问题
\end{itemize}
\subsubsection{零和奖励消融}
\needexp{RL w/ zero-sum vs RL w/o zero-sum对比训练曲线和最终 error vs.\ DOF。}
\subsubsection{$k$ 不变特征消融}
\needexp{三组对比:
(a) 完整 13 维节点特征 + 相位距离边特征
(b) 移除 cos/sin 相位特征(节点特征 -2 维)
(c) 相位距离边特征 → 普通欧氏距离边特征}
测试跨波数泛化性能差异。
\subsubsection{消息传递层数消融}
\needexp{1 层 vs 2 层 vs 3 层 message passing stack对比训练收敛速度和最终性能。}
\subsection{训练诊断与分析}
以下数据可从前 401 次迭代的训练日志直接提取(\textbf{无需额外实验}
\begin{itemize}
\item \textbf{学习曲线:}loss、explained variance、平均奖励、neg\_action\_ratio 随 iteration 的演化(附 4 合 1 图)
\item \textbf{neg\_action\_ratio 分析:}从 0.79(几乎所有单元都想细化)收敛到 0.05(高度选择性),解释策略如何学到"精细化是稀缺资源"
\item \textbf{Explained variance 分析:}$-0.007$(比随机还差)到 0.48(可靠的回报预测),说明价值网络学到了有意义的误差分布
\item \textbf{动作分布统计:}不同训练阶段策略输出 $x_i$ 的分布变化
\item \textbf{Mie 解验证:}\needexp{FEM 解 vs Mie 级数解析解在远场的相对 $\ell_2$ 误差,作为 FEM 求解器本身的精度基准}
\end{itemize}
% ============================================================
\section{Discussion讨论}
% ============================================================
\subsection{核心发现}
\begin{itemize}
\item \textbf{RL 策略学到了超越 D\"{o}rfler 的细化模式:}传统 D\"{o}rfler 标记是单步贪心的——每步独立标记累计误差占比 $\geq \theta$ 的最小集合。RL 策略可以在早期步骤保留预算,在后期步骤集中处理高价值区域,实现跨步优化
\item \textbf{GVN 解决了亥姆霍兹非局域性的信息瓶颈:}GVN 消融在高 $k$ 下的显著退化证明了全局上下文对高频波问题的重要性。这为未来将 RL-AMR 应用于其他非局域 PDE如积分-微分方程、分数阶方程)提供了架构参考
\item \textbf{$k$ 不变特征是跨波数泛化的关键:}策略无需在高频下重新训练或调参——这是传统 AMR 方法无法做到的,体现了 ML 方法的核心优势
\item \textbf{$\eta_K$ 作为 reward 使方法具有实用性:}不依赖解析解或超精细参考网格,原则上可应用于任意复杂介质分布
\end{itemize}
\subsection{局限性}
\begin{itemize}
\item \textbf{仅限 2D 亥姆霍兹:}拓展到 3D Maxwell 或弹性波方程需要处理更大的图规模(网格节点数 $\propto k^3$GNN 的计算效率将成为瓶颈
\item \textbf{P1 单元的固有色散误差未被修正:}当前方法通过 $h$-refinement 间接补偿 P1 的色散缺陷,而非从变分形式层面消除。在高 $k$ 极限下,细化成本不可持续
\item \textbf{训练仍需 PDE 求解器交互:}每步 rollout 需要一次 FEM 求解,训练成本与 PDE 求解开销线性相关。离线预训练或迁移学习可缓解
\item \textbf{$\eta_K$ 在预渐近区的可靠性依赖于约束:}当初始网格严重欠分辨时($h \gg \lambda$$\eta_K$ 的可靠性退化。预渐近约束是一种缓解但非根本解决
\end{itemize}
\subsection{未来方向}
\subsubsection{双加权残差DWR引入因果律}
当前 $\eta_K$ 仅衡量局部残差大小,不区分残差的"重要性"。DWR 理论通过求解伴随问题获得误差的因果权重:
\begin{equation}
J(e) = \sum_{K\in\Omega_h} \Big(\langle r_{\mathrm{int}}, z-z_h\rangle_K + \langle r_{\mathrm{jump}}, z-z_h\rangle_{\partial K}\Big)
\end{equation}
将伴随解 $z_h$ 的梯度作为 GNN 的额外节点特征,网络可以直接"看到"哪些局部残差对关心的目标泛函(如远场散射截面)有实质性贡献。这是从"盲目的局部残差驱动"向"因果律驱动的物理感知"的关键一步。
\subsubsection{相空间方法Wigner 分布):动量解耦}
在含横向动量的复杂散射中,空间域标量残差掩盖了误差的物理本质——污染效应的根源是波矢方向的失配。将波场映射到位置-动量相空间Wigner 分布),以动量偏差作为奖励信号,智能体优化目标从"缩小数值差异"升级为"逼近真实的物理色散关系"。
\subsubsection{算子层面修正GLS / Trefftz 方法)}
从变分形式出发,通过 Galerkin Least-Squares (GLS) 稳定化或 Trefftz 基函数(平面波非连续 Galerkin在 FEM 层面消除色散误差,使 GNN 面对的是干净、局域化的残差场,而非被污染效应扭曲的误差分布。
% ============================================================
\section{Conclusion结论}
% ============================================================
\begin{itemize}
\item \textbf{贡献:}将 RL-AMR 首次拓展到高频亥姆霍兹散射问题,通过 GVN 架构解决非局域误差传播,通过 $k$ 不变特征实现跨波数零样本泛化,通过 $\eta_K$ 奖励信号使方法独立于解析解
\item \textbf{关键证据:}[待实验完成后填写:在 $k=30$ 下 RL 策略的 error vs.\ DOF 优于 D\"{o}rfler 标记 XX\%GVN 在高波数下贡献 YY\%]
\item \textbf{影响:}为高频波传播问题的数据驱动网格优化提供了新范式GVN 架构对非局域 PDE 的 RL-AMR 具有通用参考价值
\item \textbf{边界:}当前框架适用于 2D Helmholtz 散射问题,在预渐近约束满足的条件下效果最佳
\end{itemize}
% ============================================================
% 附录:实验清单
% ============================================================
\clearpage
\section*{附录 A待完成实验清单}
以下所有实验需要在投稿前完成。按优先级排列。
\begin{table}[h]
\centering
\begin{tabular}{p{0.7cm} p{5cm} p{4cm} p{4cm}}
\toprule
优先级 & 实验 & 支撑的创新点 & 预计工作量 \\
\midrule
P0 & $k=10,15,20,25,30$ 下 Error vs.\ DOF5种方法 $\times$ 5波数 $\times$ 4-6步 & C1, C2 & 2--3 天 GPU 计算 \\
\hline
P0 & 跨波数泛化:训练 $k\in[3,15]$,测试 $k=20,25,30,35$ & C2核心卖点& 1--2 天 GPU \\
\hline
P0 & GVN 消融w/ vs w/o GVN @ $k=10,20,30$ & C1 & 1 天 GPU \\
\hline
P1 & 跨几何泛化:方形、多圆柱测试 & C1 的几何稳健性 & 1 天 GPU \\
\hline
P1 & 零和奖励消融 & C4 的奖励设计贡献 & 0.5 天 GPU \\
\hline
P1 & 网格演化可视化对比RL vs D\"{o}rfler& C1 的定性证据 & 0.5 天脚本 \\
\hline
P2 & 跨介质 $\varepsilon_r$ 泛化 & 特征设计的稳健性 & 1 天 GPU \\
\hline
P2 & $k$ 不变特征消融(去相位特征/换欧氏距离)& C2 的机制解释 & 1 天 GPU \\
\hline
P2 & 消息传递层数消融 & 架构设计的合理性 & 0.5 天 GPU \\
\hline
P3 & Mie 解定量对比 & FEM 求解器精度基准 & 0.5 天脚本 \\
\hline
\end{tabular}
\end{table}
\vspace{1em}
\textbf{预计总 GPU 计算时间:}8--12 天(部分可并行)。
\end{document}

BIN
result/test_circle.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

BIN
result/test_multicircle.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

BIN
result/test_square.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 MiB

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 MiB

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 MiB

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 MiB

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 MiB

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 MiB

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -8,6 +8,12 @@
# 可视化:
# python src/main.py --mode viz --checkpoint checkpoints/model_iter0400.pt
# python src/main.py --mode viz --checkpoint checkpoints/model_iter0100.pt --k-test 8.0 --center 0.6,0.5 --radius 0.1
#
#
# sbatch方式
# 训练
# sbatch sbatch_train.sh
#
###########################
algorithm:
@ -15,8 +21,8 @@ algorithm:
discount_factor: 1.0
ppo:
clip_range: 0.2
entropy_coefficient: 0.001
epochs_per_iteration: 5 # 每轮迭代对同一批 rollout 数据重复训练几个 epoch
entropy_coefficient: 0.005
epochs_per_iteration: 3 # 每轮迭代对同一批 rollout 数据重复训练几个 epoch
gae_lambda: 0.95
initial_log_std: -2.0 # 初始动作 log 标准差exp(-2)≈0.135
max_grad_norm: 0.5
@ -34,7 +40,7 @@ environment:
solution_std: true
timestep: true
volume: true
wave_number: true
wave_number: false
x_position: false
y_position: false
dist_to_interface: true
@ -47,33 +53,33 @@ environment:
boundary:
- 0
- 0
- 3
- 3
initial_num_elements: 75
- 1
- 1
initial_num_elements: 65
helmholtz:
k_ref: 6.0
k_exponent: 2.0
scatterer:
cx: 1.5
cx: 0.5
cx_max: 0.8
cx_min: 0.2
cy: 1.5
cy: 0.5
cy_max: 0.8
cy_min: 0.2
eps_r: 5.0
eps_r: 10.0
eps_r_max: 8.0
eps_r_min: 2.0
mode: random_uniform
radius: 0.2
radius: 0.1
radius_max: 0.2
radius_min: 0.05
wave_number: 30.0
wave_number_max: 3.0
wave_number_min: 15.0
wave_number_max: 15.0
wave_number_min: 3.0
wave_number_mode: random_uniform
num_pdes: 100
pde_type: helmholtz
pre_asymptotic_N: 1.5
pre_asymptotic_N: 2.0
maximum_elements: 50000
num_timesteps: 4
refinement_strategy: continuous_sizing_field
@ -104,5 +110,5 @@ network:
latent_dimension: 64
training:
learning_rate: 0.0003
lr_decay: 0.995
lr_decay: 1
optimizer: adam

264
src/helmholtz_alt.py Normal file
View File

@ -0,0 +1,264 @@
"""Alternative scatterer geometries for Helmholtz FEM problems.
Supports non-circular dielectric scatterers: square, multiple circles, etc.
Each class overrides only the geometry-dependent methods of HelmholtzProblem.
"""
from typing import Any, Dict, Union
import numpy as np
from skfem import Mesh
from environment.helmholtz import (
HelmholtzProblem,
_compute_residual_indicator,
)
# ═══════════════════════════════════════════════════════════════════
# Square dielectric scatterer
# ═══════════════════════════════════════════════════════════════════
class HelmholtzProblemSquare(HelmholtzProblem):
"""Helmholtz problem with a square dielectric scatterer.
Extra config keys under helmholtz.scatterer.square:
half_side: float half side length (default 0.2)
angle: float rotation in radians (default 0.0)
"""
def __init__(
self,
*,
fem_config: Dict[Union[str, int], Any],
random_state: np.random.RandomState = np.random.RandomState(),
):
sc = fem_config.get("helmholtz", {}).get("scatterer", {})
sq = sc.get("square", {})
self._sq_cx = float(sq.get("cx", sc.get("cx", 0.5)))
self._sq_cy = float(sq.get("cy", sc.get("cy", 0.5)))
self._sq_half = float(sq.get("half_side", sc.get("radius", 0.2)))
self._sq_angle = float(sq.get("angle", 0.0))
self._sq_eps_r = float(sc.get("eps_r", 2.0))
super().__init__(fem_config=fem_config, random_state=random_state)
self._eps_r = self._sq_eps_r
# ── geometry helpers ──
def _rotate_xy(self, x, y):
"""Rotate coordinates back to scatterer-local frame."""
if self._sq_angle == 0:
return x - self._sq_cx, y - self._sq_cy
c, s = np.cos(-self._sq_angle), np.sin(-self._sq_angle)
dx, dy = x - self._sq_cx, y - self._sq_cy
return c * dx - s * dy, s * dx + c * dy
def _in_square(self, x, y):
xr, yr = self._rotate_xy(x, y)
return (np.abs(xr) <= self._sq_half) & (np.abs(yr) <= self._sq_half)
# ── FEM assembly (called at quadrature points) ──
def _eps_r_at_quad_points(self, x, y):
return np.where(self._in_square(x, y), self._sq_eps_r, 1.0)
# ── midpoint eps_r for error estimation / features ──
def eps_r_at_midpoints(self, mesh: Mesh) -> np.ndarray:
pts = np.mean(mesh.p[:, mesh.t], axis=1).T
return np.where(self._in_square(pts[:, 0], pts[:, 1]), self._sq_eps_r, 1.0)
# ── override error estimation ──
def get_error_estimate_per_element(self, basis, solution):
eps_r_arr = self.eps_r_at_midpoints(basis.mesh)
return {"indicator": _compute_residual_indicator(
basis.mesh, solution, k=self._k, eps_r=eps_r_arr)}
# ── override features ──
def element_features(self, mesh, element_feature_names):
features_list = []
if "epsilon_r" in element_feature_names:
features_list.append(self.eps_r_at_midpoints(mesh)[:, None])
return np.concatenate(features_list, axis=1) if features_list else None
# ── Nyquist enforcement uses square bounding box ──
def _enforce_nyquist_in_dielectric(self, mesh, N=1.5, max_iter=10):
lambda_d = 2.0 * np.pi / (self._k * np.sqrt(self._sq_eps_r))
h_max = lambda_d / N
for _ in range(max_iter):
i0, i1, i2 = mesh.t[0], mesh.t[1], mesh.t[2]
x0, y0 = mesh.p[0, i0], mesh.p[1, i0]
x1, y1 = mesh.p[0, i1], mesh.p[1, i1]
x2, y2 = mesh.p[0, i2], mesh.p[1, i2]
e01 = np.sqrt((x1 - x0) ** 2 + (y1 - y0) ** 2)
e12 = np.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2)
e20 = np.sqrt((x0 - x2) ** 2 + (y0 - y2) ** 2)
h_K = np.maximum(np.maximum(e01, e12), e20)
midpoints = np.mean(mesh.p[:, mesh.t], axis=1).T
in_dielectric = self._in_square(midpoints[:, 0], midpoints[:, 1])
to_refine = np.where(in_dielectric & (h_K > h_max))[0]
if len(to_refine) == 0:
break
mesh = mesh.refined(to_refine)
return mesh
# ── visualization overlay ──
def additional_plots_from_mesh(self, mesh: Mesh) -> Dict:
corners = np.array([
[-self._sq_half, -self._sq_half],
[ self._sq_half, -self._sq_half],
[ self._sq_half, self._sq_half],
[-self._sq_half, self._sq_half],
[-self._sq_half, -self._sq_half],
])
if self._sq_angle != 0:
c, s = np.cos(self._sq_angle), np.sin(self._sq_angle)
rot = np.array([[c, -s], [s, c]])
corners = corners @ rot.T
corners[:, 0] += self._sq_cx
corners[:, 1] += self._sq_cy
return {"square_outline": (corners[:, 0], corners[:, 1])}
# ═══════════════════════════════════════════════════════════════════
# Multi-circle dielectric scatterer
# ═══════════════════════════════════════════════════════════════════
class HelmholtzProblemMultiCircle(HelmholtzProblem):
"""Helmholtz problem with multiple circular dielectric scatterers.
Extra config key under helmholtz.scatterer:
circles: list of dicts, each with cx, cy, radius, eps_r
"""
def __init__(
self,
*,
fem_config: Dict[Union[str, int], Any],
random_state: np.random.RandomState = np.random.RandomState(),
):
sc = fem_config.get("helmholtz", {}).get("scatterer", {})
circles_cfg = sc.get("circles", None)
if circles_cfg is None:
circles_cfg = [{
"cx": sc.get("cx", 0.35), "cy": sc.get("cy", 0.35),
"radius": sc.get("radius", 0.12), "eps_r": sc.get("eps_r", 3.0),
}, {
"cx": sc.get("cx", 0.65) if "cx2" not in sc else sc["cx2"], "cy": sc.get("cy", 0.65) if "cy2" not in sc else sc["cy2"],
"radius": sc.get("radius", 0.12), "eps_r": sc.get("eps_r", 3.0),
}]
self._circles = []
for c in circles_cfg:
self._circles.append({
"cx": float(c["cx"]),
"cy": float(c["cy"]),
"radius": float(c["radius"]),
"eps_r": float(c.get("eps_r", 2.0)),
})
super().__init__(fem_config=fem_config, random_state=random_state)
sc_primary = self._circles[0]
self._eps_r = sc_primary["eps_r"]
self._cx = sc_primary["cx"]
self._cy = sc_primary["cy"]
self._radius = sc_primary["radius"]
# ── geometry ──
def _eps_r_at_point(self, x, y):
"""Return eps_r at arbitrary points (broadcast-safe)."""
out = np.ones_like(x, dtype=float)
for c in self._circles:
in_c = (x - c["cx"]) ** 2 + (y - c["cy"]) ** 2 <= c["radius"] ** 2
out = np.where(in_c, c["eps_r"], out)
return out
# ── FEM assembly ──
def _eps_r_at_quad_points(self, x, y):
return self._eps_r_at_point(x, y)
# ── midpoint eps_r ──
def eps_r_at_midpoints(self, mesh: Mesh) -> np.ndarray:
pts = np.mean(mesh.p[:, mesh.t], axis=1).T
return self._eps_r_at_point(pts[:, 0], pts[:, 1])
# ── error estimation ──
def get_error_estimate_per_element(self, basis, solution):
eps_r_arr = self.eps_r_at_midpoints(basis.mesh)
return {"indicator": _compute_residual_indicator(
basis.mesh, solution, k=self._k, eps_r=eps_r_arr)}
# ── features ──
def element_features(self, mesh, element_feature_names):
features_list = []
if "epsilon_r" in element_feature_names:
features_list.append(self.eps_r_at_midpoints(mesh)[:, None])
return np.concatenate(features_list, axis=1) if features_list else None
# ── Nyquist enforcement for all circles ──
def _enforce_nyquist_in_dielectric(self, mesh, N=1.5, max_iter=15):
for _ in range(max_iter):
i0, i1, i2 = mesh.t[0], mesh.t[1], mesh.t[2]
x0, y0 = mesh.p[0, i0], mesh.p[1, i0]
x1, y1 = mesh.p[0, i1], mesh.p[1, i1]
x2, y2 = mesh.p[0, i2], mesh.p[1, i2]
e01 = np.sqrt((x1 - x0) ** 2 + (y1 - y0) ** 2)
e12 = np.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2)
e20 = np.sqrt((x0 - x2) ** 2 + (y0 - y2) ** 2)
h_K = np.maximum(np.maximum(e01, e12), e20)
midpoints = np.mean(mesh.p[:, mesh.t], axis=1).T
eps_r_at_mid = self._eps_r_at_point(midpoints[:, 0], midpoints[:, 1])
lambda_local = 2.0 * np.pi / (self._k * np.sqrt(np.maximum(eps_r_at_mid, 1.0)))
h_max = lambda_local / N
to_refine = np.where((eps_r_at_mid > 1.0) & (h_K > h_max))[0]
if len(to_refine) == 0:
break
mesh = mesh.refined(to_refine)
return mesh
# ── visualization overlay ──
def additional_plots_from_mesh(self, mesh: Mesh) -> Dict:
result = {}
for i, c in enumerate(self._circles):
theta = np.linspace(0, 2 * np.pi, 128)
result[f"circle_{i}"] = (
c["cx"] + c["radius"] * np.cos(theta),
c["cy"] + c["radius"] * np.sin(theta),
)
return result
# ═══════════════════════════════════════════════════════════════════
# Factory functions (mirror create_helmholtz_problem)
# ═══════════════════════════════════════════════════════════════════
def create_helmholtz_problem_square(
*, fem_config: Dict[Union[str, int], Any],
random_state: np.random.RandomState = np.random.RandomState(),
) -> HelmholtzProblemSquare:
return HelmholtzProblemSquare(fem_config=fem_config, random_state=random_state)
def create_helmholtz_problem_multi_circle(
*, fem_config: Dict[Union[str, int], Any],
random_state: np.random.RandomState = np.random.RandomState(),
) -> HelmholtzProblemMultiCircle:
return HelmholtzProblemMultiCircle(fem_config=fem_config, random_state=random_state)

View File

@ -49,6 +49,8 @@ def train(config: dict, iterations: int, checkpoint_dir: str = "checkpoints", sa
f"agents={metrics['num_agents']:.0f} avg_r={metrics['avg_reward']:.4f} sum_r={metrics['sum_reward']:.2f} "
f"x<0={metrics.get('neg_action_ratio', 0):.2f} "
f"elig={metrics.get('eligible_ratio', 0):.2f} "
f"dorfler_tail={metrics.get('dorfler_tail_ratio', 0):.2f} "
f"floor={metrics.get('dorfler_floor_active', 0):.0f} "
f"sel={metrics.get('selected_count', 0):.0f} "
f"{time.time() - t1:.1f}s"
)
@ -60,7 +62,7 @@ def train(config: dict, iterations: int, checkpoint_dir: str = "checkpoints", sa
def _eval_mie_error_test(env) -> float:
"""Compute relative L2 error of FEM vs Mie analytical solution."""
"""Compute relative L2 error of FEM vs Mie analytical solution (vertex-level)."""
fp = getattr(env.fem_problem, "fem_problem", None)
if fp is None:
return float("nan")
@ -83,6 +85,60 @@ def _eval_mie_error_test(env) -> float:
return float(np.linalg.norm(diff) / denom)
def _eval_mie_error_area_weighted(env):
"""Compute area-weighted relative error FEM vs Mie (triangle-level quadrature).
Returns dict with keys:
rel_err area-weighted relative error (01)
w_rmse area-weighted RMSE
max_err max pointwise absolute error (L)
"""
fp = getattr(env.fem_problem, "fem_problem", None)
if fp is None:
return {"rel_err": float("nan"), "w_rmse": float("nan"), "max_err": float("nan")}
_eps_r = getattr(fp, "_eps_r", None)
_radius = getattr(fp, "_radius", None)
_cx = getattr(fp, "_cx", None)
_cy = getattr(fp, "_cy", None)
_k = getattr(fp, "_k", None)
if any(v is None for v in [_eps_r, _radius, _cx, _cy, _k]):
return {"rel_err": float("nan"), "w_rmse": float("nan"), "max_err": float("nan")}
from environment.mie_solution import mie_scattered_field
mesh = env.mesh
pts = mesh.p.T # (num_vertices, 2)
tri = mesh.t.T # (num_triangles, 3) — vertex indices
u_mie = mie_scattered_field(pts, k0=_k, eps_r=_eps_r, radius=_radius, cx=_cx, cy=_cy)
u_fem = env.scalar_solution
err_abs = np.abs(u_fem - u_mie)
ref_abs = np.abs(u_mie)
v1, v2, v3 = pts[tri[:, 0]], pts[tri[:, 1]], pts[tri[:, 2]]
tri_areas = 0.5 * np.abs(
(v2[:, 0] - v1[:, 0]) * (v3[:, 1] - v1[:, 1])
- (v3[:, 0] - v1[:, 0]) * (v2[:, 1] - v1[:, 1])
)
err_tri_sq = (err_abs[tri[:, 0]] ** 2
+ err_abs[tri[:, 1]] ** 2
+ err_abs[tri[:, 2]] ** 2) / 3.0
ref_tri_sq = (ref_abs[tri[:, 0]] ** 2
+ ref_abs[tri[:, 1]] ** 2
+ ref_abs[tri[:, 2]] ** 2) / 3.0
total_area = np.sum(tri_areas)
w_rmse = np.sqrt(np.sum(err_tri_sq * tri_areas) / total_area)
ref_total = np.sum(ref_tri_sq * tri_areas)
rel_err = np.sqrt(np.sum(err_tri_sq * tri_areas) / ref_total) if ref_total > 1e-12 else float("nan")
return {"rel_err": float(rel_err), "w_rmse": float(w_rmse),
"max_err": float(np.max(err_abs))}
def test(config: dict, checkpoint_path: str, k_test=None, center=None, radius=None, eps_test=None):
setup_helmholtz_config(config, k_test=k_test, center=center, radius=radius, eps_test=eps_test)
algo = config.get("algorithm", {})
@ -102,7 +158,10 @@ def test(config: dict, checkpoint_path: str, k_test=None, center=None, radius=No
step = 0
n_elem_init = getattr(env, "_num_elements", env.num_agents)
mie_err_0 = _eval_mie_error_test(env)
print(f" Step {step:2d}: reward=--- mie_err={mie_err_0:.4f} elements={n_elem_init}"
aw_0 = _eval_mie_error_area_weighted(env)
print(f" Step {step:2d}: reward=--- mie_err={mie_err_0:.4f} "
f"aw_rel={aw_0['rel_err']*100:.2f}% aw_rmse={aw_0['w_rmse']:.4f} "
f"max_err={aw_0['max_err']:.4f} elements={n_elem_init} "
f"budget={getattr(env, '_n_budget', '?')}")
total_reward = 0.0
@ -113,12 +172,29 @@ def test(config: dict, checkpoint_path: str, k_test=None, center=None, radius=No
step_r = float(np.sum(reward))
total_reward += step_r
step += 1
mie_err = _eval_mie_error_test(env)
print(f" Step {step:2d}: reward={step_r:+.4f} mie_err={mie_err:.4f}"
f" elements={info.get('num_elements', '?')} "
f"x<0={info.get('neg_action_ratio', 0):.2f} sel={info.get('selected_count', 0)}")
print(f"\n[Test] total_reward={total_reward:.4f} final_mie_error={mie_err:.4f}")
# timing
_timing = env.fem_problem.last_solve_timing
_t_str = ""
if _timing is not None:
_t_str = (f" [timing] K={_timing['assemble_K']*1e3:.1f}ms"
f" f={_timing['assemble_f']*1e3:.1f}ms"
f" bnd={_timing['assemble_boundary']*1e3:.1f}ms"
f" solve={_timing['solve']*1e3:.1f}ms"
f" total={_timing['total']*1e3:.1f}ms"
f" n_dof={_timing['n_dof']}")
mie_err = _eval_mie_error_test(env)
aw = _eval_mie_error_area_weighted(env)
print(f" Step {step:2d}: reward={step_r:+.4f} mie_err={mie_err:.4f} "
f"aw_rel={aw['rel_err']*100:.2f}% aw_rmse={aw['w_rmse']:.4f} "
f"max_err={aw['max_err']:.4f} "
f"elements={info.get('num_elements', '?')} "
f"x<0={info.get('neg_action_ratio', 0):.2f} sel={info.get('selected_count', 0)}"
f"{_t_str}")
print(f"\n[Test] total_reward={total_reward:.4f} final_mie_error={mie_err:.4f}"
f" final_aw_rel={aw['rel_err']*100:.2f}%")
def main():

View File

@ -154,10 +154,55 @@ class MessagePassingStep(nn.Module):
# ──
# 6. MessagePassingStack — 堆叠 N 个 Step
# 6. GlobalVirtualNode — 注意力门控全局广播
# ──
class GlobalVirtualNode(nn.Module):
"""
Global Virtual Node (GVN) with attention-gated broadcast.
Stage A: h_V = mean(h_v) global pooling ( Lippmann-Schwinger integral)
Stage B: α_v = sigmoid(W_att[h_v || h_V] + b_att) per-node attention gate
h_v h_v + α_v (W_V · h_V) gated broadcast
Breaks the O(diameter) information bottleneck of local message passing
in O(1), injecting global error distribution and coherent background
field context into every local node.
"""
def __init__(self, latent_dim: int):
super().__init__()
self.gate = nn.Sequential(
nn.Linear(2 * latent_dim, latent_dim),
nn.LeakyReLU(),
nn.Linear(latent_dim, latent_dim),
)
self.value_proj = nn.Linear(latent_dim, latent_dim)
# Learnable scale initialized small — prevents the GVN broadcast
# from homogenizing node features before the local MP signal is learned.
self.scale = nn.Parameter(torch.tensor(0.1))
def forward(self, graph: Data):
# Stage A: η_K-weighted global pooling
# High-error regions dominate the virtual node; free-space background is
# naturally suppressed. Falls back to mean if no η available.
if hasattr(graph, 'eta') and graph.eta is not None:
w = graph.eta / (graph.eta.sum() + 1e-8) # [N], Σw = 1
h_V = (graph.x * w.unsqueeze(-1)).sum(dim=0, keepdim=True) # [1, D]
else:
h_V = graph.x.mean(dim=0, keepdim=True) # [1, D]
# Stage B: attention-gated broadcast
h_V_exp = h_V.expand(graph.x.shape[0], -1) # [N, D]
gate_in = torch.cat([graph.x, h_V_exp], dim=-1) # [N, 2D]
alpha = torch.sigmoid(self.gate(gate_in)) # [N, D]
graph.x = graph.x + self.scale * alpha * self.value_proj(h_V_exp)
# ──
# 7. MessagePassingStack — 堆叠 N 个 Step + GVN
# ──
class MessagePassingStack(nn.Module):
"""Stack of multiple MessagePassingSteps with optional step repeats."""
"""Stack of MessagePassingSteps followed by a Global Virtual Node."""
def __init__(self, latent_dim: int, stack_config: dict, scatter_reducer):
super().__init__()
@ -169,11 +214,13 @@ class MessagePassingStack(nn.Module):
for _ in range(num_steps)
]
)
self.gvn = GlobalVirtualNode(latent_dim)
def forward(self, graph: Data):
for step in self.steps:
for _ in range(self.num_step_repeats):
step(graph)
self.gvn(graph)
# ──

View File

@ -186,7 +186,8 @@ class PPOTrainer:
_rho_keys = ("rho_int_mean", "rho_jump_mean", "rho_sbc_mean",
"w_rho_int", "w_rho_jump", "w_rho_sbc")
rho_accum = {k: 0.0 for k in _rho_keys}
diag_keys = ("neg_action_ratio", "eligible_ratio", "selected_count")
diag_keys = ("neg_action_ratio", "eligible_ratio", "selected_count",
"dorfler_tail_ratio", "dorfler_floor_active")
diag_accum = {k: 0.0 for k in diag_keys}
diag_steps = 0
@ -257,7 +258,7 @@ class PPOTrainer:
torch.nn.utils.clip_grad_norm_(self.policy.parameters(), self.max_grad_norm)
self.policy.optimizer.step()
if self.policy.log_std is not None:
self.policy.log_std.data.clamp_(-4.0, -1.0)
self.policy.log_std.data.clamp_(-3.0, -1.0) # σ ∈ [0.05, 0.37]
total_losses.append(loss.item())
if self.policy.lr_scheduler is not None:

53
src/test_config.yaml Normal file
View File

@ -0,0 +1,53 @@
# Test configuration for test_media.py
# Usage: python src/test_media.py (uses this file by default)
# python src/test_media.py --k-test 8.0 (CLI overrides)
# python src/test_media.py --config my_test.yaml (use a different config)
# Path to base config (model/network/algo params)
base_config: src/config.yaml
# ── Test scenario ──
test:
geometry: square # square | multi_circle | circle
checkpoint: checkpoints/model_final.pt
output: result/test_square.png
seed: 99
# ── Wave number ──
k_test: 18.0
# ── Scatterer parameters ──
# Used based on test.geometry. Comment/uncomment as needed.
scatterer:
eps_r: 3.0
# Shared position
cx: 0.5
cy: 0.5
# Circle
radius: 0.15
# Square
half_side: 0.15
angle: 0.0
# Multi-circle (overrides cx/cy/radius above when geometry=multi_circle)
circles:
- cx: 0.35
cy: 0.5
radius: 0.12
eps_r: 3.0
- cx: 0.65
cy: 0.5
radius: 0.12
eps_r: 3.0
# ── Reference computation ──
# n_refine_vertex: uniform refinement levels for per-vertex error
# n_refine_grid: uniform refinement levels for the 2D heatmap
# grid_resolution: N x N grid points for the heatmap
reference:
n_refine_vertex: 2
n_refine_grid: 3
grid_resolution: 200

609
src/test_media.py Normal file
View File

@ -0,0 +1,609 @@
#!/usr/bin/env python3
"""Test a trained AFEM model on alternative scatterer geometries.
Supports: square, multi-circle, and the original circle.
Usage:
python src/test_media.py # uses src/test_config.yaml
python src/test_media.py --k-test 30.0 --geometry circle
python src/test_media.py --config my_test.yaml # custom config
All test parameters live in the YAML config. CLI args serve as overrides.
"""
import argparse
import copy
import os
import sys
import time
from pathlib import Path
from typing import Optional
import numpy as np
import torch
from torch_geometric.data import Batch
_project_root = Path(__file__).resolve().parent.parent
if str(_project_root) not in sys.path:
sys.path.insert(0, str(_project_root))
from src.network import create_model
from src.utils import load_checkpoint, load_config, setup_helmholtz_config
from src.helmholtz_alt import (
HelmholtzProblemSquare,
HelmholtzProblemMultiCircle,
create_helmholtz_problem_square,
create_helmholtz_problem_multi_circle,
)
# ═══════════════════════════════════════════════════════════════════════
# Geometry factory mapping
# ═══════════════════════════════════════════════════════════════════════
_GEOMETRY_FACTORIES = {
"square": create_helmholtz_problem_square,
"multi_circle": create_helmholtz_problem_multi_circle,
"circle": None, # default HelmholtzProblem
}
# ═══════════════════════════════════════════════════════════════════════
# Epsilon_r property patching
# ═══════════════════════════════════════════════════════════════════════
def _patch_epsilon_r(env):
inner_fp = env.fem_problem.fem_problem
if hasattr(inner_fp, "eps_r_at_midpoints"):
def _eps_r(self):
return inner_fp.eps_r_at_midpoints(self.mesh)
type(env)._epsilon_r_elements = property(_eps_r)
# ═══════════════════════════════════════════════════════════════════════
# Fine FEM reference (computed once, interpolated later)
# ═══════════════════════════════════════════════════════════════════════
def _compute_fine_fem_reference(env, n_refine: int = 2):
"""Compute fine-FEM reference on initial mesh + n_refine uniform refinement."""
from skfem import Basis, ElementTriP1
fp = env.fem_problem.fem_problem
ref_mesh = copy.deepcopy(env.mesh)
for _ in range(n_refine):
ref_mesh = ref_mesh.refined(np.arange(ref_mesh.t.shape[1]))
ref_basis = Basis(ref_mesh, ElementTriP1())
ref_sol = fp.calculate_solution(ref_basis, cache=False)
# Interpolate to coarse mesh vertices
pts = env.mesh.p.T
finder = ref_mesh.element_finder()
cells = finder(*pts.T)
cells = np.clip(cells, 0, ref_mesh.t.shape[1] - 1)
i0, i1, i2 = ref_mesh.t[0, cells], ref_mesh.t[1, cells], ref_mesh.t[2, cells]
p = ref_mesh.p
x, y = pts[:, 0], pts[:, 1]
x0, y0 = p[0, i0], p[1, i0]
x1, y1 = p[0, i1], p[1, i1]
x2, y2 = p[0, i2], p[1, i2]
denom = (x1 - x0) * (y2 - y0) - (x2 - x0) * (y1 - y0)
denom = np.where(np.abs(denom) < 1e-15, 1.0, denom)
w0 = ((x1 - x) * (y2 - y) - (x2 - x) * (y1 - y)) / denom
w1 = ((x2 - x) * (y0 - y) - (x0 - x) * (y2 - y)) / denom
w2 = 1.0 - w0 - w1
u_ref_on_coarse = w0 * ref_sol[i0] + w1 * ref_sol[i1] + w2 * ref_sol[i2]
return u_ref_on_coarse, ref_mesh, ref_sol
def _interpolate_ref_to_mesh(target_pts, ref_mesh, ref_sol):
"""Interpolate cached reference solution to arbitrary mesh vertices."""
finder = ref_mesh.element_finder()
cells = finder(*target_pts.T)
cells = np.clip(cells, 0, ref_mesh.t.shape[1] - 1)
i0, i1, i2 = ref_mesh.t[0, cells], ref_mesh.t[1, cells], ref_mesh.t[2, cells]
p = ref_mesh.p
x, y = target_pts[:, 0], target_pts[:, 1]
x0, y0 = p[0, i0], p[1, i0]
x1, y1 = p[0, i1], p[1, i1]
x2, y2 = p[0, i2], p[1, i2]
denom = (x1 - x0) * (y2 - y0) - (x2 - x0) * (y1 - y0)
denom = np.where(np.abs(denom) < 1e-15, 1.0, denom)
w0 = ((x1 - x) * (y2 - y) - (x2 - x) * (y1 - y)) / denom
w1 = ((x2 - x) * (y0 - y) - (x0 - x) * (y2 - y)) / denom
w2 = 1.0 - w0 - w1
return w0 * ref_sol[i0] + w1 * ref_sol[i1] + w2 * ref_sol[i2]
def _compute_ref_grid(env, n_refine: int = 3, resolution: int = 200):
"""Compute fine reference on a regular grid for smooth heatmaps."""
from skfem import Basis, ElementTriP1
fp = env.fem_problem.fem_problem
ref_mesh = copy.deepcopy(env.mesh)
for _ in range(n_refine):
ref_mesh = ref_mesh.refined(np.arange(ref_mesh.t.shape[1]))
ref_basis = Basis(ref_mesh, ElementTriP1())
ref_sol = fp.calculate_solution(ref_basis, cache=False)
boundary = fp._domain._boundary
x_vec = np.linspace(boundary[0], boundary[2], resolution)
y_vec = np.linspace(boundary[1], boundary[3], resolution)
X, Y = np.meshgrid(x_vec, y_vec)
grid_pts = np.column_stack([X.ravel(), Y.ravel()])
U_grid = np.zeros(len(grid_pts), dtype=np.complex128)
batch_size = 4096
for start in range(0, len(grid_pts), batch_size):
end = min(start + batch_size, len(grid_pts))
batch = grid_pts[start:end]
finder = ref_mesh.element_finder()
cells = finder(*batch.T)
cells = np.clip(cells, 0, ref_mesh.t.shape[1] - 1)
i0, i1, i2 = ref_mesh.t[0, cells], ref_mesh.t[1, cells], ref_mesh.t[2, cells]
p = ref_mesh.p
x, y = batch[:, 0], batch[:, 1]
x0, y0 = p[0, i0], p[1, i0]
x1, y1 = p[0, i1], p[1, i1]
x2, y2 = p[0, i2], p[1, i2]
denom = (x1 - x0) * (y2 - y0) - (x2 - x0) * (y1 - y0)
denom = np.where(np.abs(denom) < 1e-15, 1.0, denom)
w0 = ((x1 - x) * (y2 - y) - (x2 - x) * (y1 - y)) / denom
w1 = ((x2 - x) * (y0 - y) - (x0 - x) * (y2 - y)) / denom
w2 = 1.0 - w0 - w1
U_grid[start:end] = w0 * ref_sol[i0] + w1 * ref_sol[i1] + w2 * ref_sol[i2]
return {"X": X, "Y": Y, "E_scat": U_grid.reshape(resolution, resolution)}
def _compute_step_error(scalar, u_ref) -> float:
if u_ref is None:
return float("nan")
diff = np.abs(scalar - u_ref)
denom = np.linalg.norm(np.abs(u_ref))
if denom < 1e-12:
denom = 1.0
return float(np.linalg.norm(diff) / denom)
# ═══════════════════════════════════════════════════════════════════════
# Visualization
# ═══════════════════════════════════════════════════════════════════════
def _render_field(ax, triang, values, title, vmin, vmax, show_mesh=True):
tcf = ax.tripcolor(triang, values, shading="gouraud", cmap="jet",
vmin=vmin, vmax=vmax)
if show_mesh and triang is not None:
n = triang.triangles.shape[0]
ax.triplot(triang, lw=(0.5 if n < 500 else 0.3), color="black",
alpha=(0.7 if n < 2000 else 0.5))
ax.set_aspect("equal")
ax.set_title(title, fontsize=9)
ax.set_xticks([])
ax.set_yticks([])
return tcf
def _draw_scatterer(ax, geometry: str, env):
fp = env.fem_problem.fem_problem
if geometry == "square":
sq = getattr(fp, "_sq_cx", 0.5), getattr(fp, "_sq_cy", 0.5)
hs = getattr(fp, "_sq_half", 0.2)
ang = getattr(fp, "_sq_angle", 0.0)
corners = np.array([
[-hs, -hs], [hs, -hs], [hs, hs], [-hs, hs], [-hs, -hs]
])
if ang != 0:
c, s = np.cos(ang), np.sin(ang)
corners = corners @ np.array([[c, -s], [s, c]]).T
corners[:, 0] += sq[0]
corners[:, 1] += sq[1]
ax.plot(corners[:, 0], corners[:, 1], color="cyan", linewidth=1.5,
linestyle="--")
elif geometry == "multi_circle":
circles = getattr(fp, "_circles", [])
for c in circles:
theta = np.linspace(0, 2 * np.pi, 128)
ax.plot(c["cx"] + c["radius"] * np.cos(theta),
c["cy"] + c["radius"] * np.sin(theta),
color="cyan", linewidth=1.5, linestyle="--")
elif geometry == "circle":
cx = getattr(fp, "_cx", 0.5)
cy = getattr(fp, "_cy", 0.5)
r = getattr(fp, "_radius", 0.2)
theta = np.linspace(0, 2 * np.pi, 128)
ax.plot(cx + r * np.cos(theta), cy + r * np.sin(theta),
color="cyan", linewidth=1.5, linestyle="--")
def _save_pngs(steps, stem, checkpoint_path, k, geometry, env, ref_grid):
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import matplotlib.tri as tri
per_step_dir = f"{stem}_steps"
os.makedirs(os.path.dirname(stem) or ".", exist_ok=True)
os.makedirs(per_step_dir, exist_ok=True)
# ── Overview grid ──
n = len(steps)
ncols = min(n, 4)
nrows = (n + ncols - 1) // ncols
fig, axes = plt.subplots(nrows, ncols, figsize=(4 * ncols, 3.5 * nrows))
axes_flat = np.array([axes]) if nrows * ncols == 1 else np.array(axes).flatten()
for i, step_data in enumerate(steps):
mesh, scalar, err_val, n_elem = step_data[:4]
pts = mesh.p.T
tg = tri.Triangulation(pts[:, 0], pts[:, 1], mesh.t.T)
s = np.abs(scalar) if np.iscomplexobj(scalar) else scalar
vmin, vmax = s.min(), s.max()
if vmax - vmin < 1e-12:
vmin, vmax = vmin - 0.5, vmax + 0.5
tcf = _render_field(axes_flat[i], tg, s,
f"Step {i}: {n_elem} elem, err={err_val:.4f}",
vmin, vmax)
fig.colorbar(tcf, ax=axes_flat[i], fraction=0.046, pad=0.04)
_draw_scatterer(axes_flat[i], geometry, env)
for j in range(n, len(axes_flat)):
axes_flat[j].set_visible(False)
fig.subplots_adjust(left=0.04, right=0.90, top=0.90, bottom=0.06,
wspace=0.15, hspace=0.30)
geo_label = {"square": "Square", "multi_circle": "Multi-Circle",
"circle": "Circle"}.get(geometry, geometry)
fig.suptitle(
f"Helmholtz |E_scat| [{geo_label}] — {os.path.basename(checkpoint_path)}\n"
f"k={k:.1f} eps_r info in scatterer overlay",
fontsize=12,
)
fig.savefig(f"{stem}.png", dpi=200, bbox_inches="tight")
plt.close(fig)
print(f"[Viz] Overview → {stem}.png")
# ── Per-step panels (FEM + Reference + Error) ──
for i, step_data in enumerate(steps):
mesh, scalar, err_val, n_elem = step_data[:4]
u_ref_at_verts = step_data[4] if len(step_data) > 4 else None
pts = mesh.p.T
tg = tri.Triangulation(pts[:, 0], pts[:, 1], mesh.t.T)
coarse_val = np.abs(scalar) if np.iscomplexobj(scalar) else scalar
fig2, axes2 = plt.subplots(1, 3, figsize=(18, 6))
axes2 = list(np.atleast_1d(axes2))
# Panel 1: FEM
cvmin, cvmax = coarse_val.min(), coarse_val.max()
if cvmax - cvmin < 1e-12:
cvmin, cvmax = cvmin - 0.5, cvmax + 0.5
tcf1 = _render_field(axes2[0], tg, coarse_val,
f"Step {i}: FEM |E_scat| ({n_elem} elem)",
cvmin, cvmax)
_draw_scatterer(axes2[0], geometry, env)
fig2.colorbar(tcf1, ax=axes2[0], fraction=0.046, pad=0.04)
# Panel 2: Fine FEM reference on grid
if ref_grid is not None:
g = ref_grid
gm = np.abs(g["E_scat"])
mvmin, mvmax = gm.min(), gm.max()
if mvmax - mvmin < 1e-12:
mvmin, mvmax = mvmin - 0.5, mvmax + 0.5
im2 = axes2[1].pcolormesh(g["X"], g["Y"], gm,
shading="gouraud", cmap="jet",
vmin=mvmin, vmax=mvmax)
axes2[1].set_title("Fine FEM Ref |E_scat|", fontsize=9)
axes2[1].set_aspect("equal")
axes2[1].set_xticks([])
axes2[1].set_yticks([])
_draw_scatterer(axes2[1], geometry, env)
fig2.colorbar(im2, ax=axes2[1], fraction=0.046, pad=0.04)
# Panel 3: Pointwise error
if u_ref_at_verts is not None:
u_fem_abs = np.abs(scalar)
u_ref_abs = np.abs(u_ref_at_verts)
error_abs = np.abs(u_fem_abs - u_ref_abs)
evmin, evmax = 0.0, error_abs.max() or 1.0
if evmax - evmin < 1e-12:
evmax = evmin + 1.0
tcf3 = _render_field(axes2[2], tg, error_abs,
f"||FEM||Ref|| L2={err_val:.4f}",
evmin, evmax)
_draw_scatterer(axes2[2], geometry, env)
fig2.colorbar(tcf3, ax=axes2[2], fraction=0.046, pad=0.04)
fig2.tight_layout()
fig2.savefig(f"{per_step_dir}/step{i:02d}.png", dpi=150,
bbox_inches="tight")
plt.close(fig2)
print(f"[Viz] Per-step PNGs → {per_step_dir}/ ({n} files)")
# ═══════════════════════════════════════════════════════════════════════
# Scatterer config injection
# ═══════════════════════════════════════════════════════════════════════
def _inject_scatterer_config(base_config: dict, geometry: str, sc_cfg: dict, k_test: float):
"""Inject scatterer params from test config into the base config's helmholtz section.
Returns (config, factory) where factory is the geometry-specific create function.
"""
hc = (base_config.setdefault("environment", {})
.setdefault("mesh_refinement", {})
.setdefault("fem", {})
.setdefault("helmholtz", {}))
sc = hc.setdefault("scatterer", {})
sc["mode"] = "fixed"
sc["eps_r"] = float(sc_cfg.get("eps_r", 3.0))
if geometry == "square":
sc["square"] = {
"cx": float(sc_cfg.get("cx", 0.5)),
"cy": float(sc_cfg.get("cy", 0.5)),
"half_side": float(sc_cfg.get("half_side", 0.15)),
"angle": float(sc_cfg.get("angle", 0.0)),
}
elif geometry == "multi_circle":
circles_raw = sc_cfg.get("circles", [])
circles = []
for c in circles_raw:
circles.append({
"cx": float(c["cx"]), "cy": float(c["cy"]),
"radius": float(c["radius"]),
"eps_r": float(c.get("eps_r", sc_cfg.get("eps_r", 3.0))),
})
sc["circles"] = circles
elif geometry == "circle":
sc["cx"] = float(sc_cfg.get("cx", 0.5))
sc["cy"] = float(sc_cfg.get("cy", 0.5))
sc["radius"] = float(sc_cfg.get("radius", 0.2))
hc["wave_number_mode"] = "fixed"
hc["wave_number"] = float(k_test)
factory = _GEOMETRY_FACTORIES.get(geometry)
return base_config, factory
# ═══════════════════════════════════════════════════════════════════════
# Main test function
# ═══════════════════════════════════════════════════════════════════════
def test_alt_media(
base_config: dict,
test_cfg: dict,
cli_overrides: Optional[dict] = None,
):
"""Run AFEM inference with config-driven parameters.
Args:
base_config: loaded from config.yaml (model/network/algo)
test_cfg: loaded from test_config.yaml (test-specific params)
cli_overrides: optional CLI arg overrides dict
"""
ov = cli_overrides or {}
# ── Resolve parameters: test_cfg < CLI override ──
tc = test_cfg.get("test", {})
ref_cfg = test_cfg.get("reference", {})
sc_cfg = test_cfg.get("scatterer", {})
geometry = ov.get("geometry") or tc.get("geometry", "circle")
checkpoint_path = ov.get("checkpoint") or tc.get("checkpoint", "checkpoints/model_final.pt")
output_path = ov.get("output") or tc.get("output", "result/test_media.png")
seed = ov.get("seed") or tc.get("seed", 99)
k_test = ov.get("k_test") or test_cfg.get("k_test", 8.0)
n_refine_vertex = ov.get("n_refine_vertex") or ref_cfg.get("n_refine_vertex", 2)
n_refine_grid = ov.get("n_refine_grid") or ref_cfg.get("n_refine_grid", 3)
grid_resolution = ov.get("grid_resolution") or ref_cfg.get("grid_resolution", 200)
# Allow CLI override of scatterer params
for key in ("cx", "cy", "radius", "eps_r", "half_side", "angle"):
if ov.get(key) is not None:
sc_cfg[key] = ov[key]
if ov.get("circles") is not None:
sc_cfg["circles"] = ov["circles"]
algo = base_config.get("algorithm", {})
# ── 1. Inject scatterer config ──
config, factory = _inject_scatterer_config(
copy.deepcopy(base_config), geometry, sc_cfg, k_test)
# ── 2. Create env with alt factory ──
import environment.fem_problem as fem_problem_module
_orig_create = None
if factory is not None:
_orig_create = fem_problem_module.create_helmholtz_problem
fem_problem_module.create_helmholtz_problem = factory
from environment.mesh_refinement import MeshRefinement
env = MeshRefinement(
environment_config=config.get("environment", {}).get("mesh_refinement", {}),
seed=seed,
)
# ── 3. Load model ──
model = create_model(env, config.get("network", {}), algo.get("ppo", {}))
load_checkpoint(model, checkpoint_path)
model.eval()
dev = next(model.parameters()).device
print(f"[Device] {dev}")
model = model.to(dev)
# ── 4. Reset env ──
print(f"[Test] Geometry: {geometry} k={k_test:.3f}")
obs = env.reset()
# ── 5. Patch epsilon_r_elements (after reset) ──
_patch_epsilon_r(env)
# Restore original factory
if _orig_create is not None:
fem_problem_module.create_helmholtz_problem = _orig_create
# ── 6. Print scatterer info ──
fp = env.fem_problem.fem_problem
if geometry == "square":
print(f"[Test] Square: center=({getattr(fp, '_sq_cx', 0.5):.3f}, "
f"{getattr(fp, '_sq_cy', 0.5):.3f}) half_side={getattr(fp, '_sq_half', 0.2):.3f}")
elif geometry == "multi_circle":
circles_attr = getattr(fp, "_circles", [])
for i, c in enumerate(circles_attr):
print(f"[Test] Circle {i}: center=({c['cx']:.3f}, {c['cy']:.3f}) "
f"r={c['radius']:.3f} eps_r={c['eps_r']:.1f}")
elif geometry == "circle":
print(f"[Test] Circle: center=({getattr(fp, '_cx', 0.5):.3f}, "
f"{getattr(fp, '_cy', 0.5):.3f}) r={getattr(fp, '_radius', 0.2):.3f}")
# ── 7. Compute fine-FEM reference ONCE on initial mesh ──
n_init = env.mesh.t.shape[1]
print(f"[Test] Initial mesh: {n_init} elements")
print(f"[Test] Computing fine-FEM reference (n_refine_vertex={n_refine_vertex}, "
f"n_refine_grid={n_refine_grid}, grid={grid_resolution})...")
t0 = time.time()
u_ref_initial, ref_mesh, ref_sol = _compute_fine_fem_reference(env, n_refine=n_refine_vertex)
ref_grid = _compute_ref_grid(env, n_refine=n_refine_grid, resolution=grid_resolution)
print(f"[Test] Reference ready ({time.time() - t0:.1f}s, grid {ref_grid['X'].shape})")
# ── 8. Run inference ──
stem = output_path.rsplit(".", 1)[0] if "." in output_path else output_path
init_mesh = env.mesh
init_sol = env.scalar_solution
init_err = _compute_step_error(init_sol, u_ref_initial)
steps = [(init_mesh, init_sol, init_err, env.num_agents, u_ref_initial)]
n_elem_init = env.num_agents
print(f" Step 0: reward=--- err={init_err:.4f} elements={n_elem_init}")
done = False
step_idx = 0
total_reward = 0.0
while not done:
obs_g = obs.to(dev)
with torch.no_grad():
actions, _, _ = model(Batch.from_data_list([obs_g]), deterministic=True)
obs, reward, done, info = env.step(actions.cpu().numpy())
step_r = float(np.sum(reward))
total_reward += step_r
step_idx += 1
# Interpolate cached reference to current mesh vertices (no re-solve)
u_ref_current = _interpolate_ref_to_mesh(env.mesh.p.T, ref_mesh, ref_sol)
step_err = _compute_step_error(env.scalar_solution, u_ref_current)
steps.append((env.mesh, env.scalar_solution, step_err, env.num_agents,
u_ref_current))
print(f" Step {step_idx:2d}: reward={step_r:+.4f} err={step_err:.4f} "
f"elements={info.get('num_elements', '?')} "
f"sel={info.get('selected_count', 0)} "
f"done={done}")
print(f"\n[Test] total_reward={total_reward:.4f} final_err={steps[-1][2]:.4f} "
f"final_elements={steps[-1][3]}")
# ── 9. Visualize ──
_save_pngs(steps, stem, checkpoint_path, k_test, geometry, env, ref_grid)
print(f"[Viz] Done → {output_path}")
# ═══════════════════════════════════════════════════════════════════════
# CLI
# ═══════════════════════════════════════════════════════════════════════
def _load_yaml(path: str) -> dict:
"""Load a YAML file, resolving relative paths against project root."""
import yaml
if not os.path.isabs(path):
path = os.path.join(_project_root, path)
with open(path, "r") as f:
return yaml.safe_load(f)
def main():
parser = argparse.ArgumentParser(
description="Test AFEM trained model on alternative scatterer geometries")
# Config
parser.add_argument("--config", default="src/test_config.yaml",
help="Test config YAML (default: src/test_config.yaml)")
# Test scenario overrides
parser.add_argument("--geometry", choices=["square", "multi_circle", "circle"],
help="Scatterer geometry (overrides config)")
parser.add_argument("--checkpoint", help="Model checkpoint path (overrides config)")
parser.add_argument("--output", help="Output image path (overrides config)")
parser.add_argument("--seed", type=int, help="Random seed (overrides config)")
parser.add_argument("--k-test", type=float, help="Wave number (overrides config)")
# Scatterer overrides
parser.add_argument("--cx", type=float, help="Scatterer center x")
parser.add_argument("--cy", type=float, help="Scatterer center y")
parser.add_argument("--radius", type=float, help="Scatterer radius (circle)")
parser.add_argument("--eps-r", type=float, help="Dielectric constant eps_r")
parser.add_argument("--half-side", type=float, help="Half side length (square)")
parser.add_argument("--angle", type=float, help="Rotation angle in radians (square)")
parser.add_argument("--circles", nargs="*", default=None,
help="Circle specs: 'cx,cy,radius[,eps_r]' (multi_circle)")
# Reference computation overrides
parser.add_argument("--n-refine-vertex", type=int,
help="Uniform refinement levels for vertex error reference")
parser.add_argument("--n-refine-grid", type=int,
help="Uniform refinement levels for grid heatmap reference")
parser.add_argument("--grid-resolution", type=int,
help="Grid resolution N for heatmap (N x N)")
args = parser.parse_args()
# ── Load test config ──
test_cfg = _load_yaml(args.config)
# ── Load base config ──
base_config_path = test_cfg.get("base_config", "src/config.yaml")
base_config = _load_yaml(base_config_path)
# ── Build CLI overrides dict (only non-None values) ──
cli_overrides = {}
for key in ("geometry", "checkpoint", "output", "seed", "k_test",
"cx", "cy", "radius", "eps_r", "half_side", "angle",
"n_refine_vertex", "n_refine_grid", "grid_resolution"):
val = getattr(args, key.replace("-", "_"), None)
if val is not None:
cli_overrides[key] = val
# Parse --circles if provided
if args.circles is not None:
circles = []
for spec in args.circles:
parts = [float(x.strip()) for x in spec.split(",")]
circles.append({
"cx": parts[0], "cy": parts[1], "radius": parts[2],
"eps_r": parts[3] if len(parts) > 3 else 3.0,
})
cli_overrides["circles"] = circles
# ── Set seeds ──
seed = cli_overrides.get("seed", test_cfg.get("test", {}).get("seed", 99))
torch.manual_seed(seed)
np.random.seed(seed)
test_alt_media(
base_config=base_config,
test_cfg=test_cfg,
cli_overrides=cli_overrides,
)
if __name__ == "__main__":
main()

View File

@ -176,14 +176,13 @@ def _save_png(steps, stem, checkpoint_path, k, cx=0.5, cy=0.5, radius=0.2, eps_r
if im2 is not None:
fig2.colorbar(im2, ax=axes2[1], fraction=0.046, pad=0.04)
# ── Panel 3: ||FEM| - |Mie|| error ──
mie_abs = np.abs(u_mie_at_verts)
error_abs = np.abs(coarse_val - mie_abs)
# ── Panel 3: |FEM Mie| complex error ──
error_abs = np.abs(scalar - u_mie_at_verts) # complex difference, preserves phase
evmin, evmax = 0.0, error_abs.max() or 1.0
if evmax - evmin < 1e-12:
evmax = evmin + 1.0
tcf3 = _render_field(axes2[2], pts[:, 0], pts[:, 1], tg_coarse, error_abs,
f"||FEM|-|Mie|| L2={err_val:.4f} max={error_abs.max():.4f}",
f"|FEM Mie| L2={err_val:.4f} max={error_abs.max():.4f}",
evmin, evmax, show_mesh=True, cmap="hot")
axes2[2].add_patch(plt.Circle((cx, cy), radius, fill=False,
edgecolor="cyan", linewidth=1.5, linestyle="--"))
@ -240,6 +239,10 @@ def visualize(config: dict, checkpoint_path: str, output_path: str = "result/vis
init_mesh = env.mesh
init_sol = env.scalar_solution
init_err = _compute_step_error(env, u_mie_ref)
init_aw = _compute_area_weighted_error(env, u_mie_ref)
print(f" Step 0: verts={init_mesh.p.shape[1]} elem={env.num_agents} "
f"mie_err={init_err:.4f} aw_rel={init_aw['rel_err']*100:.2f}% "
f"aw_rmse={init_aw['w_rmse']:.4f} max_err={init_aw['max_err']:.4f}")
steps = [(init_mesh, init_sol, init_err, env.num_agents, u_mie_ref)]
print(f"[Viz] Running inference...")
@ -259,10 +262,24 @@ def visualize(config: dict, checkpoint_path: str, output_path: str = "result/vis
diag_n_elig = int(getattr(env, "_diag_eligible_ratio", 0) * env.num_agents)
diag_n_mask = int(getattr(env, "_diag_masked_ratio", 0) * env.num_agents)
remaining = getattr(env, "_n_budget", 0) - env.num_agents
step_aw = _compute_area_weighted_error(env, u_mie_current)
# timing
_timing = env.fem_problem.last_solve_timing
_t_str = ""
if _timing is not None:
_t_str = (f" [timing] K={_timing['assemble_K']*1e3:.1f}ms"
f" f={_timing['assemble_f']*1e3:.1f}ms"
f" bnd={_timing['assemble_boundary']*1e3:.1f}ms"
f" solve={_timing['solve']*1e3:.1f}ms"
f" total={_timing['total']*1e3:.1f}ms"
f" n_dof={_timing['n_dof']}")
print(f" Step {step_idx}: verts={env.mesh.p.shape[1]} elem={n_elem} "
f"mie_err={step_err:.4f} "
f"mie_err={step_err:.4f} aw_rel={step_aw['rel_err']*100:.2f}% "
f"aw_rmse={step_aw['w_rmse']:.4f} max_err={step_aw['max_err']:.4f} "
f"sel={diag_n_sel} elig={diag_n_elig} masked={diag_n_mask} "
f"remaining={remaining} done={done}")
f"remaining={remaining} done={done}"
f"{_t_str}")
steps.append((env.mesh, sol, step_err, n_elem, u_mie_current))
@ -283,6 +300,41 @@ def _compute_step_error(env, u_mie_ref) -> float:
return float(np.linalg.norm(diff) / denom)
def _compute_area_weighted_error(env, u_mie_ref):
"""Area-weighted relative error FEM vs Mie (triangle-level quadrature)."""
if u_mie_ref is None:
return {"rel_err": float("nan"), "w_rmse": float("nan"), "max_err": float("nan")}
mesh = env.mesh
pts = mesh.p.T
tri = mesh.t.T
u_fem = env.scalar_solution
err_abs = np.abs(u_fem - u_mie_ref)
ref_abs = np.abs(u_mie_ref)
v1, v2, v3 = pts[tri[:, 0]], pts[tri[:, 1]], pts[tri[:, 2]]
tri_areas = 0.5 * np.abs(
(v2[:, 0] - v1[:, 0]) * (v3[:, 1] - v1[:, 1])
- (v3[:, 0] - v1[:, 0]) * (v2[:, 1] - v1[:, 1])
)
err_tri_sq = (err_abs[tri[:, 0]] ** 2
+ err_abs[tri[:, 1]] ** 2
+ err_abs[tri[:, 2]] ** 2) / 3.0
ref_tri_sq = (ref_abs[tri[:, 0]] ** 2
+ ref_abs[tri[:, 1]] ** 2
+ ref_abs[tri[:, 2]] ** 2) / 3.0
total_area = np.sum(tri_areas)
w_rmse = np.sqrt(np.sum(err_tri_sq * tri_areas) / total_area)
ref_total = np.sum(ref_tri_sq * tri_areas)
rel_err = np.sqrt(np.sum(err_tri_sq * tri_areas) / ref_total) if ref_total > 1e-12 else float("nan")
return {"rel_err": float(rel_err), "w_rmse": float(w_rmse),
"max_err": float(np.max(err_abs))}
def _eval_mie_on_mesh(env, mie_info):
"""Re-evaluate Mie scattered field on current FEM mesh vertices."""
if mie_info is None:

View File

@ -2,7 +2,7 @@
$ServerA_User = "dxw"
$ServerA_IP = "222.20.97.222"
$RemotePath = "/public/home/dxw/Codes/afem" # 服务器A上项目的绝对路径
$LocalPath = "F:\ASMRplusplus-main" # 本地项目路径
$LocalPath = "F:\mine\afem" # 本地项目路径
# ==========================================
Write-Host ">>> Step 1: Downloading code from Server A..." -ForegroundColor Cyan

22
train.sh Normal file
View File

@ -0,0 +1,22 @@
#!/bin/bash
#SBATCH --job-name=afem-train
#SBATCH --partition=gpu
#SBATCH --gres=gpu:1
#SBATCH --nodelist=node06
#SBATCH --cpus-per-task=4
#SBATCH --mem=32G
#SBATCH --time=24:00:00
#SBATCH --output=logs/train_%j.out
# cd /public/home/dxw/Codes/afem
echo "Starting training at $(date)"
echo "Running on node: $(hostname)"
python -u src/main.py --mode train --config src/config.yaml
echo "Training finished at $(date)"

View File