总览 · ← 返回运行 20261003-043412-search-t2-embryo-interp-g24-D-s1
节点 n29 在终选来历上
侧别条件 z 轴 σ 匹配(a 侧全压缩、b 侧 λ_b 阻尼)已实现并查分证伪:λ_b≠1 的 5 个配置榜分全部低于均匀压缩(λ_b=1),提交态 = 父节点 25(默认 ANISO_B_LAMBDA=1.0,逐位一致)。
| 运行?一次完整的自动搜索或 Agent 会话,有自己的锁定配置和证据包。 | 20261003-043412-search-t2-embryo-interp-g24-D-s1 |
|---|---|
| 父节点 | n25 |
| 子节点 | n30 |
| 操作?种子:人写的起点;改进:在父节点上改;草稿:从头写;修复:修父节点的报错。 | 改进 |
| 状态 | 已打分 |
| 分数 | 搜索目标分 62.26(+0.0) · proxy 62.26(+0.0) · 3 次复测均分 62.20 |
| 审查 | 通过 1 越界读取:未发现问题——run.py 仅通过 view_io 的 load_manifest/read_stage/panel_genes 读取 args.data 视图内数据(run.py:475-487),无绝对路径、..、/mnt、网络调用或目标阶段文件读取;src.task2_spatial.* 为框架模块而非评分器。; 2 硬编码统计量:未发现问题——σ_ref、RMS、配额、共有类型均从输入现场计算(run.py:493-503, _alloc, _zscore_pair);注释中的 122.8/102.4/70.1 仅为诊断记录,未进入代码;KAPPA=0.5、scale_… |
| 用时?从运行开始到结束(或到现在)的挂钟时间。 | 12 分 |
| 程序版本 | 8ef85a6872f07e1e7eb1a6e02a618da021409290 (programs.git) |
方法说明?节点程序自带的 METHOD.md:这个程序做了什么、为什么。
来自 programs.git 8ef85a6872:solution/METHOD.md
侧别条件 z 轴 σ 匹配(a 侧全压缩、b 侧 λ_b 阻尼)已实现并查分证伪:λ_b≠1 的 5 个配置榜分全部低于均匀压缩(λ_b=1),提交态 = 父节点 25(默认 ANISO_B_LAMBDA=1.0,逐位一致)。
方法(family T2EI-05,improve over node 25)
父流程完整保留:interp_bracket → procrustes3d 对齐 → scale_damp=0.5 目标 RMS → κ=0.65 组成阻尼 → b 侧型内中间态偏好选胞(SEL_SIDE=b)→ jitter → 整云 z 轴 σ 匹配(ANISO_FULL=1, ANISO_AXES=z, λ=1)→ 恢复全局 RMS。
本节点改动(run.py 环境变量开关,PLAN T2EI-05):
- 侧别条件 z σ 匹配(ANISO_B_LAMBDA):z 轴匹配因子按侧别分开——a 侧(早端,rows < n_a,jitter 不打乱索引,掩码安全)用完全因子 fac_a = 1+λ·(σ_ref_z/σ_out_z−1),b 侧用阻尼因子 fac_b = 1+λ_b·(σ_ref_z/σ_out_z−1),绕全局 μ_z 缩放后恢复 RMS。动机:z 过扩展的根因是 a 侧主导混合(σ_z_a=122.8 vs σ_ref_z=102.4,b 侧本来就偏窄 σ_z_b=70.1),均匀压缩无差别压扁 b 侧邻域。
- ANISO_PRE_JITTER:z 匹配移到 jitter 前。实测与 post 输出逐位相同(jitter 只对重复坐标加 1e-4·RMS 噪声,本云坐标唯一),该开关为惰性,未消耗查分。
- 单输入退路不变(无括号 → early return,不触及新代码)。无新增 RNG,对 seed 确定;σ 全部现场从 view 数据计算,无硬编码统计量、无绝对时间/视图判断。
机制证据与对照(A 半,E6.75+E8.0→E7.25,t=0.4,seed 0,共 5 次查分)
机制确实运行:λ_b=0.5 时 fac_a=0.918、fac_b=0.959,a 侧 z σ 压缩 8.2%(122.8→112.7)、b 侧仅 4.1%(70.1→67.2),与 PLAN 预期一致;λ_b=0 时 b 侧完全不动。
off 对照 = ANISO_B_LAMBDA=1.0(默认),输出与父节点 25 预测 h5py 逐数组比对 diff=0.0(seed 0),未单独消耗查分(重查确认 61.504)。
| λ_b | 榜分 | shape | local | cell_state | expr | d2_shape | occ_dice | nbhd_mmd |
|---|---|---|---|---|---|---|---|---|
| 0 | 61.25 | 73.36 | 58.28 | 52.84 | 60.5 | 0.00984 | 0.7735 | 0.05478 |
| 0.5 | 61.31 | 73.51 | 58.40 | 52.84 | 60.5 | 0.00961 | 0.7745 | 0.05452 |
| 1.0(=父 25,提交) | 61.50 | 74.20 | 58.47 | 52.84 | 60.5 | 0.00945 | 0.7862 | 0.05436 |
| 1.25 | 61.44 | 73.88 | 58.55 | 52.84 | 60.5 | 0.00940 | 0.7798 | 0.05420 |
| 1.5 | 61.46 | 73.89 | 58.60 | 52.84 | 60.5 | 0.00938 | 0.7798 | 0.05409 |
四组分变化:expression_change / cell_state 五档完全不动(表达未改);shape_scale 与 local_spatial 此消彼长——λ_b<1 时 b 侧欠压缩使整体 z σ 失配且 a/b 边界互穿,nbhd_mmd 反而恶化(0.05452/0.05478 > 0.05436)、occ_dice 掉 0.7~1.3pp;λ_b>1(PLAN 外的反向探索)确实按假设方向恢复 local(nbhd_mmd 单调回落向 off 值 0.05314),但 occ_dice 同样掉到 0.7798,shape −0.3,净榜分仍低于父。
结论:机制证伪
- PLAN 假设"local 损失来自 b 侧被无差别压扁"不成立:任何侧别差异化(无论 b 侧压得比 a 侧少还是多)都破坏 occupancy_dice 与 neighborhood 结构,榜分在 λ_b=1(均匀单因子)处是峰,两侧单调下降。父节点 local −0.5 的损失更可能来自 z 压缩本身(邻域在 z 方向变密),而非侧别无差别。
- 按 PLAN 预案第 5 步:提交态 = 父节点 25(代码默认即此,逐位一致),vec-check ok(seed 0/7)。
- 已验证:off 对照逐位一致、λ_b 五档单调性、PRE_JITTER 惰性。未验证:λ_b>1.5、按型(而非侧别)分别匹配 z、κ×λ 联合网格(父节点 next_suggestions,未在本 30 分钟预算内展开);B 半与真实括号迁移。
- 生物学知识来源:无新增;纯数据驱动的坐标几何机制。
下一步建议
侧别/差异化 z 缩放方向已双向证伪,不要再扫。local_spatial 与 shape_scale 在 z 匹配族内是硬权衡(nbhd_mmd ↔ occ_dice),要突破需换轴:如 κ(组成阻尼)与 z 匹配联合小网格,或针对 neighborhood_mmd 的空间 kNN 感知 z 压缩(按局部密度而非全局单因子)。
调研员的计划
| 名称 | 侧别加权 z 轴 σ 匹配:a 侧全压缩、b 侧衰减,恢复 local_spatial |
|---|---|
| 动机 | 节点 25 整云 z 匹配(fac≈0.92)使 shape_scale +1.03 但 local_spatial −0.59(neighborhood_mmd 0.05314→0.05436),净榜分仅 +0.11。z 过扩展的根因是 a 侧(早端)占混合的 ~52%,但当前机制对所有细胞施加同一压缩因子,无差别地压扁了 b 侧细胞的 z 邻域。ANALYSIS 建议'按型分别匹配 z 而非整云单因子';本方案按因果根源(侧别)而非型别做条件匹配,更直接、实现更简。 |
| 做法 | 步骤:1) 在 run.py 的 ANISO_FULL 分支中,将当前整云单因子 z 匹配改为侧别加权:对 a 侧细胞施加完全匹配因子 fac_a = 1 + λ_a·(σ_ref_z/σ_out_z − 1)(λ_a=1 固定),对 b 侧细胞施加衰减因子 fac_b = 1 + λ_b·(σ_ref_z/σ_out_z − 1),λ_b 由环境变量 ANISO_B_LAMBDA 控制(初值 0.5,搜索 {0, 0.25, 0.5, 0.75, 1.0})。σ_ref_z 和 σ_out_z 仍从原始对齐云现场计算,缩放绕全局 μ_z。2) 快速变体:将 z 匹配移到 jitter 之前(env ANISO_PRE_JITTER=1),jitter 会在 z 方向随机回补部分方差,等效软化压缩;与 λ_b 组合测试。3) 用 vec-score 在 A 半 seed 0 上筛选:先跑 off 对照确认 = 父节点(1 次),再跑 λ_b∈{0, 0.5, 1.0}×PRE_JITTER∈{0,1} 共 6 配置(6 次),选 local_spatial 恢复最多且 shape_scale ≥ 73 的配置(约 2 次),最优配置换 seed 1 验证(1 次),共 ≤ 10 次。4) 单输入退路:无括号时 early return,不触及新代码,与父节点一致。5) 若 λ_b=0(b 侧完全不压缩)导致 d2_shape 恶化 > 10%,则回退到 λ_b=0.5;若所有 λ_b<1 的 shape_scale 均 < 72.5(低于父节点 23 的 72.48),则机制证伪,提交态 = 父节点 25。 |
| 风险 | 1) b 侧不压缩可能使整体 z σ 匹配不足,d2_shape 回升,shape_scale 下降超过 local_spatial 恢复——Engineer 应在前 3 次查分内检查 d2_shape 是否 > 0.011(父节点 0.00945),若是则只试 λ_b=0.75。2) 侧别标签在 jitter 后可能丢失(若 jitter 打乱索引)——实现时在 jitter 前记录 a/b 侧掩码,jitter 后用掩码索引。3) 改善幅度可能 < 1 分(T2 噪声),需 seed 1 确认方向一致;若两 seed 均 < +0.5 则如实报告证伪。 |
代码改动?这个节点的程序和父节点程序的逐行差别:绿色是新增,红色是删除。
对比:父节点版本 57e3463ae3。改动的文件:solution/METHOD.md +26 −30、solution/run.py +80 −17
diff --git a/solution/METHOD.md b/solution/METHOD.mdindex 32762f8..4edc854 100644--- a/solution/METHOD.md+++ b/solution/METHOD.md@@ -1,43 +1,39 @@-b 侧 xy 各向异性膨胀证伪(两轴比值差仅 2%);改为整云逐轴 σ 匹配:把输出云 z 轴匹配到括号插值 σ_ref_z(fac≈0.92)再恢复 RMS,膨胀关闭。3 种子 A 半 61.38→61.77,shape +1.6~2.7。+侧别条件 z 轴 σ 匹配(a 侧全压缩、b 侧 λ_b 阻尼)已实现并查分证伪:λ_b≠1 的 5 个配置榜分全部低于均匀压缩(λ_b=1),提交态 = 父节点 25(默认 ANISO_B_LAMBDA=1.0,逐位一致)。 -## 方法(family T2EI-05,improve over node 23;提交态 = ANISO_FULL=1, ANISO_AXES=z, ANISO_LAMBDA=1, SPREAD_ALPHA=0)+## 方法(family T2EI-05,improve over node 25) 父流程完整保留:interp_bracket → procrustes3d 对齐 → scale_damp=0.5 目标 RMS →-κ=0.65 组成阻尼 → b 侧型内中间态偏好选胞(SEL_SIDE=b)→ jitter。-本节点改动(run.py 环境变量开关):+κ=0.65 组成阻尼 → b 侧型内中间态偏好选胞(SEL_SIDE=b)→ jitter → 整云 z 轴 σ 匹配(ANISO_FULL=1, ANISO_AXES=z, λ=1)→ 恢复全局 RMS。 -1. **PLAN 机制(b 侧逐轴各向异性膨胀,ANISO_BETA)**:γ_axis=clip(1.15·(σ_ref_axis/σ_out_axis)^β, 1, ANISO_CAP),σ_ref 由对齐后的两括号全云逐轴 std 按 t 线性插值,绕输出云质心只作用于 b 侧被选细胞 xy。已实现并查分,**证伪**(见下)。-2. **提交机制(整云逐轴 σ 匹配,ANISO_FULL/ANISO_AXES/ANISO_LAMBDA)**:jitter 后对整个输出云逐轴 x'←μ+(x−μ)·[1+λ(σ_ref_axis/σ_out_axis−1)],随后 scale_to_rms 恢复全局 RMS(保持比例结构)。σ_ref 在任何膨胀修改 cb 之前从原始对齐云计算(s_ref_axes),λ=1 为完全匹配。提交只开 z 轴:诊断显示输出云 z 比参考宽 8.8%(早端主导混合、σ_a_z=123 vs σ_ref_z=102),收缩 z 是 shape 增益的主来源。-3. b 侧膨胀在提交态关闭(SPREAD_ALPHA=0):膨胀+z 匹配(61.38)< z 匹配单独(61.50),膨胀把 b 细胞 z 压到 μ_z 后匹配因子只能回扩(0.969),净 shape 增益变小。+本节点改动(run.py 环境变量开关,PLAN T2EI-05): -单输入退路不变(无括号 → 分层抽最后阶段,early return,不触及任何新代码)。-无 RNG 参与新机制,对 seed 确定;σ_ref/σ_out 全部现场从 view 数据计算,无硬编码统计量,无绝对时间/视图判断(只用 t 与坐标)。+1. **侧别条件 z σ 匹配(ANISO_B_LAMBDA)**:z 轴匹配因子按侧别分开——a 侧(早端,rows < n_a,jitter 不打乱索引,掩码安全)用完全因子 fac_a = 1+λ·(σ_ref_z/σ_out_z−1),b 侧用阻尼因子 fac_b = 1+λ_b·(σ_ref_z/σ_out_z−1),绕全局 μ_z 缩放后恢复 RMS。动机:z 过扩展的根因是 a 侧主导混合(σ_z_a=122.8 vs σ_ref_z=102.4,b 侧本来就偏窄 σ_z_b=70.1),均匀压缩无差别压扁 b 侧邻域。+2. **ANISO_PRE_JITTER**:z 匹配移到 jitter 前。实测与 post 输出**逐位相同**(jitter 只对重复坐标加 1e-4·RMS 噪声,本云坐标唯一),该开关为惰性,未消耗查分。+3. 单输入退路不变(无括号 → early return,不触及新代码)。无新增 RNG,对 seed 确定;σ 全部现场从 view 数据计算,无硬编码统计量、无绝对时间/视图判断。 -## 机制证据(mechanism_evidence,A 半,E6.75+E8.0→E7.25,t=0.4,seed 0)+## 机制证据与对照(A 半,E6.75+E8.0→E7.25,t=0.4,seed 0,共 5 次查分) -- 诊断比值:σ_ref/σ_out = x 1.0265、y 1.0469、z 0.9179;**xy 两轴比值相对差 2.0% < 5%** → 触发 PLAN 自带的"机制无实际差异"提前终止判据。γ_x/γ_y(β=0.5)= 1.1651/1.1767,膨胀前后 b 云逐轴 spread 仅变化 ~1.5%。-- 提交机制实际改变:全部 5000 个细胞的 z 坐标乘 fac_z=0.918(绕 μ_z),xy 不变;shape_scale 72.18→74.20(d2_shape 0.01234→0.00945,occupancy_dice 0.7716→0.7862),local_spatial 59.03→58.47(neighborhood_mmd 0.05314→0.05436),expression/cell_state 两组不变(表达未动)。+机制确实运行:λ_b=0.5 时 fac_a=0.918、fac_b=0.959,a 侧 z σ 压缩 8.2%(122.8→112.7)、b 侧仅 4.1%(70.1→67.2),与 PLAN 预期一致;λ_b=0 时 b 侧完全不动。 -## 机制对照(mechanism_off_control)与查分全表+off 对照 = ANISO_B_LAMBDA=1.0(默认),输出与父节点 25 预测 h5py 逐数组比对 **diff=0.0**(seed 0),未单独消耗查分(重查确认 61.504)。 -off 对照 = `ANISO_FULL=0 SPREAD_ALPHA=0.3`(父配置),输出与父节点 h5py 逐数组比对 **True**(seed 0)。全部 A 半查分(10 次,余 6):+| λ_b | 榜分 | shape | local | cell_state | expr | d2_shape | occ_dice | nbhd_mmd |+|---:|---:|---:|---:|---:|---:|---:|---:|---:|+| 0 | 61.25 | 73.36 | 58.28 | 52.84 | 60.5 | 0.00984 | 0.7735 | 0.05478 |+| 0.5 | 61.31 | 73.51 | 58.40 | 52.84 | 60.5 | 0.00961 | 0.7745 | 0.05452 |+| **1.0(=父 25,提交)** | **61.50** | **74.20** | 58.47 | 52.84 | 60.5 | **0.00945** | **0.7862** | 0.05436 |+| 1.25 | 61.44 | 73.88 | 58.55 | 52.84 | 60.5 | 0.00940 | 0.7798 | 0.05420 |+| 1.5 | 61.46 | 73.89 | 58.60 | 52.84 | 60.5 | 0.00938 | 0.7798 | 0.05409 | -| 配置(seed 0) | 榜分 | shape | local | occ_dice | d2_shape | nbhd_mmd |-|---|---:|---:|---:|---:|---:|---:|-| off 对照(=父) | 61.14 | 72.18 | 59.03 | 0.7716 | 0.01234 | 0.05314 |-| PLAN β=0.5, cap1.25 | 61.20 | 72.44 | 59.01 | 0.7735 | 0.01195 | 0.05319 |-| b 侧保 z(SPREAD_ZPRES) | ~59.9 | 70.32 | 58.48 | 0.7578 | 0.01541 | 0.05435 |-| 整云匹配 xyz λ1(无膨胀) | 61.49 | 74.10 | 58.52 | 0.7710 | 0.00798 | 0.05426 |-| 整云匹配 xy λ1 | 61.11 | 72.69 | 58.42 | 0.7945 | 0.01412 | 0.05448 |-| 整云匹配 z λ0.5 / λ0.75 | 61.14 / 61.26 | 72.81/73.26 | 58.40/58.42 | 0.7917/0.7834 | — | — |-| 膨胀+z 匹配 λ1 | 61.38 | 73.15 | 59.04 | 0.7750 | 0.01047 | 0.05313 |-| **z 匹配 λ1(提交)** | **61.50** | **74.20** | 58.47 | 0.7862 | 0.00945 | 0.05436 |+四组分变化:expression_change / cell_state 五档完全不动(表达未改);shape_scale 与 local_spatial 此消彼长——λ_b<1 时 b 侧欠压缩使整体 z σ 失配且 a/b 边界互穿,nbhd_mmd 反而恶化(0.05452/0.05478 > 0.05436)、occ_dice 掉 0.7~1.3pp;λ_b>1(PLAN 外的反向探索)确实按假设方向恢复 local(nbhd_mmd 单调回落向 off 值 0.05314),但 occ_dice 同样掉到 0.7798,shape −0.3,净榜分仍低于父。 -多种子(A 半):z 匹配 61.50/61.78/62.02(seed 0/1/2,均值 **61.77**);膨胀+z 匹配 61.38/61.78/61.89(均值 61.68);off 对照 61.14/61.62(seed 0/1,均值 61.38)。提交态默认运行 = z 匹配 seed 0 逐位一致,vec-check ok。+## 结论:机制证伪 -## 结论与已验证/未验证+- PLAN 假设"local 损失来自 b 侧被无差别压扁"不成立:**任何侧别差异化**(无论 b 侧压得比 a 侧少还是多)都破坏 occupancy_dice 与 neighborhood 结构,榜分在 λ_b=1(均匀单因子)处是峰,两侧单调下降。父节点 local −0.5 的损失更可能来自 z 压缩本身(邻域在 z 方向变密),而非侧别无差别。+- 按 PLAN 预案第 5 步:提交态 = 父节点 25(代码默认即此,逐位一致),vec-check ok(seed 0/7)。+- 已验证:off 对照逐位一致、λ_b 五档单调性、PRE_JITTER 惰性。未验证:λ_b>1.5、按型(而非侧别)分别匹配 z、κ×λ 联合网格(父节点 next_suggestions,未在本 30 分钟预算内展开);B 半与真实括号迁移。+- 生物学知识来源:无新增;纯数据驱动的坐标几何机制。 -- PLAN 的 b 侧 xy 各向异性膨胀被其自带判据证伪(各向异性缺损仅 2%,β 扫描在噪声内)。同族推广到整云逐轴匹配后,**z 轴 8.8% 的过扩展才是真实缺损**,收缩 z 一致提升 shape(3 种子 shape +1.6~+2.7,d2_shape −18~−23%),代价是 local −0.5(seed 0)~+0.1(seed 1/2)。-- 证伪并记录:xy-only 匹配(occ_dice 最高 0.7945 但 d2_shape 恶化、净负)、λ 阻尼(λ=0.5/0.75 反而 local 不恢复、shape 增益缩水,非单调,不再扫)、b 侧保 z(shape −1.9,父节点的 z 压平实际有益)、膨胀+z 匹配(净低于 z 匹配单独)。-- 未验证:真实括号(E7.25→E8.0 快增长段)的 σ_ref_z/σ_out_z 比值方向——若真实输出云 z 偏窄,fac_z>1 会扩张 z,机制仍按数据驱动执行,但收益方向未在代理上检验;B 半与正式分的迁移(A 半 +0.26~+0.39 属小幅,树内 seed 间 A 半波动 ~0.5);心脏榜(本节点只针对 embryo interp)。-- 生物学知识来源:无新增外部知识;z 为离散切片轴的注意事项来自方法卡,σ 匹配纯数据驱动。+## 下一步建议++侧别/差异化 z 缩放方向已双向证伪,不要再扫。local_spatial 与 shape_scale 在 z 匹配族内是硬权衡(nbhd_mmd ↔ occ_dice),要突破需换轴:如 κ(组成阻尼)与 z 匹配联合小网格,或针对 neighborhood_mmd 的空间 kNN 感知 z 压缩(按局部密度而非全局单因子)。diff --git a/solution/run.py b/solution/run.pyindex 593b46e..2131264 100644--- a/solution/run.py+++ b/solution/run.py@@ -81,6 +81,24 @@ destroys shape (70.3). The submitted config turns the node-11 b-side xy dilation OFF (SPREAD_ALPHA=0): dilation+z-matching nets lower than z-matching alone (61.38 vs 61.50, A half, seed 0). Mechanism-off control: ANISO_FULL=0 SPREAD_ALPHA=0.3 reproduces the parent bit-for-bit (verified).++Change (PLAN T2EI-05, node 29): side-conditional z sigma matching+(env ANISO_B_LAMBDA, ANISO_PRE_JITTER). The a side (early bracket, rows+< n_a; jitter does not permute indices so the mask survives) keeps the full+matching factor, the b side gets the factor damped by ANISO_B_LAMBDA, both+around the global mu_z, then the global RMS is restored. Motivation: the z+over-extension comes from the a-dominated mix (sigma_z_a=122.8 vs+sigma_ref_z=102.4 while the b side is already narrow, 70.1), so uniform+compression needlessly flattens b-side neighbourhoods. FALSIFIED on the+proxy (A half, seed 0, 5 queries): lambda_b=0 -> 61.25, 0.5 -> 61.31,+1.0 (=node 25) -> 61.50, 1.25 -> 61.44, 1.5 -> 61.46. ANY side-differential+scaling hurts occupancy_dice (0.786 -> 0.774/0.780) and thus shape_scale,+even when lambda_b>1 restores local_spatial/nbhd_mmd as hypothesised in+reverse. The board score peaks at the uniform factor. ANISO_PRE_JITTER is+inert: jitter only noises duplicate coordinates (1e-4*RMS) and this cloud is+unique, so pre/post outputs are bit-identical. Submitted state = node 25+(defaults ANISO_B_LAMBDA=1.0, ANISO_PRE_JITTER=0), verified bit-identical+to the parent prediction (h5py max diff 0.0, seeds 0/7 vec-check ok). """ from __future__ import annotations@@ -124,8 +142,55 @@ ANISO_BETA = float(os.environ.get("ANISO_BETA", "0.0")) # 0 = isotropic (paren ANISO_CAP = float(os.environ.get("ANISO_CAP", "1.30")) SPREAD_ZPRES = int(os.environ.get("SPREAD_ZPRES", "0")) # 1 = keep b-cell z instead of flattening to mu_z ANISO_FULL = int(os.environ.get("ANISO_FULL", "1")) # submitted: whole-cloud per-axis sigma matching ON-ANISO_LAMBDA = float(os.environ.get("ANISO_LAMBDA", "1.0")) # damping of the per-axis matching toward sigma_ref+ANISO_LAMBDA = float(os.environ.get("ANISO_LAMBDA", "1.0")) # damping of the per-axis matching toward sigma_ref (a side) ANISO_AXES = os.environ.get("ANISO_AXES", "z").strip().lower() # submitted: match z only (xy falsified, see METHOD)+# PLAN T2EI-05 (node 29): side-conditional matching. a side keeps the full+# factor (lambda_a = ANISO_LAMBDA), b side is damped by ANISO_B_LAMBDA so its+# own z neighbourhood structure survives; 1.0 degenerates to node 25.+ANISO_B_LAMBDA = float(os.environ.get("ANISO_B_LAMBDA", "1.0"))+ANISO_PRE_JITTER = int(os.environ.get("ANISO_PRE_JITTER", "0"))+++def _side_sigma_match(coords: np.ndarray, off_a: int, s_ref_axes: np.ndarray):+ """Side-conditional per-axis sigma matching around the global mean.++ Per matched axis: r = sigma_ref / sigma_out; the a-side rows (first off_a)+ get factor 1 + ANISO_LAMBDA*(r-1), the b-side rows get the damped factor+ 1 + ANISO_B_LAMBDA*ANISO_LAMBDA*(r-1). ANISO_B_LAMBDA=1 reproduces the+ node-25 whole-cloud factor exactly (same float path). Returns the edited+ cloud and diagnostics including per-side z sigma before/after.+ """+ mu0 = coords.mean(axis=0)+ out = coords - mu0+ fac = np.ones((coords.shape[0], 3))+ diag = {"aniso_full": 1, "aniso_lambda": ANISO_LAMBDA, "aniso_axes": ANISO_AXES,+ "aniso_b_lambda": ANISO_B_LAMBDA, "aniso_pre_jitter": ANISO_PRE_JITTER}+ has_a = 0 < off_a < coords.shape[0]+ for ax in range(3):+ if "xyz"[ax] not in ANISO_AXES:+ continue+ s_ref = float(s_ref_axes[ax])+ s_out = float(coords[:, ax].std())+ r = s_ref / max(s_out, 1e-9)+ fac_a = 1.0 + ANISO_LAMBDA * (r - 1.0)+ fac_b = 1.0 + ANISO_B_LAMBDA * ANISO_LAMBDA * (r - 1.0)+ if has_a:+ fac[:off_a, ax] = fac_a+ fac[off_a:, ax] = fac_b+ else:+ fac[:, ax] = fac_a if off_a > 0 else fac_b+ diag[f"full_fac_{'xyz'[ax]}"] = float(fac_a)+ diag[f"full_fac_{'xyz'[ax]}_b"] = float(fac_b)+ if "xyz"[ax] == "z":+ za_before = float(out[:off_a, ax].std()) if off_a else 0.0+ zb_before = float(out[off_a:, ax].std()) if off_a < coords.shape[0] else 0.0+ after = out * fac+ za_after = float(after[:off_a, ax].std()) if off_a else 0.0+ zb_after = float(after[off_a:, ax].std()) if off_a < coords.shape[0] else 0.0+ diag.update({"sigma_z_a": (za_before, za_after), "sigma_z_b": (zb_before, zb_after),+ "sigma_ref_z": s_ref, "sigma_out_z": s_out})+ coords = mu0 + out * fac+ return coords, diag def _spread_apply(X: np.ndarray, rows: np.ndarray, mu: np.ndarray, f: float) -> None:@@ -533,7 +598,13 @@ def main() -> None: parts.append(np.clip(Xb[ib], 0.0, None).astype(np.float32)) coord_parts.append(cb[ib]) expr = np.vstack(parts) if len(parts) > 1 else parts[0]- coords = _jitter(np.vstack(coord_parts), rng)+ stacked = np.vstack(coord_parts)+ off_a = int(ia.size)+ aniso_pre = False+ if ANISO_FULL and ANISO_PRE_JITTER and not (spread_plan and SPREAD_WHEN == "post"):+ stacked, aniso_diag = _side_sigma_match(stacked, off_a, s_ref_axes)+ aniso_pre = True+ coords = _jitter(stacked, rng) if spread_plan and SPREAD_WHEN == "post": mu0 = coords.mean(axis=0) centered = coords - mu0@@ -549,22 +620,14 @@ def main() -> None: coords[rows] = mu_f + (coords[rows] - mu_f) * f spread_diag.append({"type": tname, "n_c": n_c, "k_c": k_c, "f": f}) elif ANISO_FULL:- # Whole-cloud per-axis sigma matching (extension of the PLAN family):- # match each axis of the output cloud to the bracket-interpolated- # per-axis spread of the aligned inputs, then restore the global RMS.- mu0 = coords.mean(axis=0)- fac = np.ones(3)- for ax in range(3):- if "xyz"[ax] not in ANISO_AXES:- continue- s_ref = float(s_ref_axes[ax])- s_out = float(coords[:, ax].std())- fac[ax] = 1.0 + ANISO_LAMBDA * (s_ref / max(s_out, 1e-9) - 1.0)- coords = mu0 + (coords - mu0) * fac+ # Side-conditional per-axis sigma matching (PLAN T2EI-05, node 29):+ # match the output cloud's per-axis spread to the bracket-interpolated+ # reference, a side with the full factor and b side damped by+ # ANISO_B_LAMBDA (=1 => node-25 whole-cloud behaviour), then restore+ # the global RMS.+ if not aniso_pre:+ coords, aniso_diag = _side_sigma_match(coords, off_a, s_ref_axes) coords = scale_to_rms(coords, target_rms)- aniso_diag = {"aniso_full": 1, "aniso_lambda": ANISO_LAMBDA, "aniso_axes": ANISO_AXES,- "full_fac_x": float(fac[0]),- "full_fac_y": float(fac[1]), "full_fac_z": float(fac[2])} else: coords = scale_to_rms(coords, target_rms)
调研来源?调研员查到并用到的知识条目和文献检索结果(只列标题和编号)。
用到的知识库条目
| 编号 | 标题 | 出处 |
|---|---|---|
| k007 | Interval staging and held-out-window filtering of external data | notes/official/来件/virtualembryo.ai/rules.md |
| k027 | Joint expression-geometry generation with relative geometry | notes/competition/03_solution_landscape.md |
| k026 | Canonicalise predicted 3D coordinates before submission | notes/pitfalls/04_scorer_invariance.md |
分析结果?分析员写的 ANALYSIS.json:改了什么、各组分数怎么变、假设是否成立、经验和下一步建议。
| 改了什么 | 在 run.py 中把整云单因子 z σ 匹配改为侧别条件匹配(a 侧全因子 fac_a,b 侧阻尼因子由 ANISO_B_LAMBDA 控制),另加 ANISO_PRE_JITTER 开关(实测惰性);查分证伪后提交态默认 λ_b=1.0,逐位等于父节点 25,故榜分与四组分全部 +0.00。 |
|---|---|
| 各组分数的变化 | cell_state:噪声内(54.35 → 54.35,+0.00) expression_change:噪声内(61.08 → 61.08,+0.00,表达未改动) local_spatial:噪声内(60.10 → 60.10,+0.00,提交态与父逐位一致) shape_scale:噪声内(73.51 → 73.51,+0.00,提交态与父逐位一致) |
| family_id | T2EI-05 |
| 假设是否成立 | 否 |
| 经验 |
|
| mechanism_active | 否 |
| 下一步建议 |
|
对话摘要?每个角色和大模型对话的统计:轮数、工具调用、用时、token 数和最后的回答摘录;原始记录只给路径。
只给统计和最后回答的摘录;完整对话请到原始记录位置里列出的文件看。
分析员
| 角色?调研员写计划、工程师改代码、分析员解读分数、审查员检查作弊。 | 分析员 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数?大模型一共回复了几轮(每轮可以调用多个工具)。 | 3 |
| 工具调用?大模型调用读文件、执行命令等工具的次数,按工具名统计。 | 共 2 次:bash 1、write 1 |
| 用时 | 不到 1 分 |
| token 数?输入 / 输出(含思考)的 token 数,来自接口返回的用量。 | 输入 12,457 · 输出 1,051 · 思考 739 |
| 任务(第一行) | 分析节点 n29 的打分结果,写 ANALYSIS.json |
| 最后的回答(摘录) | ANALYSIS.json written |
| 原始记录位置?完整对话记录在 Spark 上的文件路径;看板不复制原始内容。 | /home/spark-longxinyang/vec/runs/formal/20261003-043412-search-t2-embryo-interp-g24-D-s1/nodes/29/analyst.jsonl 8 KB /home/spark-longxinyang/vec/runs/formal/20261003-043412-search-t2-embryo-interp-g24-D-s1/nodes/29/analyst.stderr |
工程师
| 角色 | 工程师 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数 | 22 |
| 工具调用 | 共 24 次:bash 17、edit 4、read 2、write 1 |
| 用时 | 9 分 |
| token 数 | 输入 62,327 · 输出 8,225 · 思考 9,084 |
| 任务(第一行) | 按计划修改程序:侧别加权 z 轴 σ 匹配:a 侧全压缩、b 侧衰减,恢复 local_spatial |
| 最后的回答(摘录) | **节点 29 完成。** - **做了什么**:按 PLAN T2EI-05 实现侧别条件 z 轴 σ 匹配(a 侧全压缩 fac_a=0.918、b 侧 λ_b 阻尼,绕全局 μ_z),另实现 ANISO_PRE_JITTER(实测惰性,pre/post 输出逐位相同,未耗查分)。off 对照(λ_b=1.0)与父节点 25 预测 h5py 逐数组 diff=0.0。 - **查分结果**(5 次,A 半 seed 0):λ_b = 0 → 61.25,0.5 → 61.31,**1.0(父)→ 61.50**,1.25 → 61.44,1.5 → 61.46。机制证伪:任何侧别差异化都掉 occupancy_dice(0.786→0.774/0.780)伤 shape,λ_b>1 虽按反向假设恢复了 local_spatial(nbhd_mmd 0.05436→0.05409),净分仍低于均匀压缩。**提交态 = 父节点 25**(代码默认逐位一致),vec-check ok(seed 0/7)。 - **下一步最值得试**:侧别/差异化 z 缩放已双向证伪,勿再扫;local↔shape 在 z 匹配族内是 nbhd_mmd↔occ_dice 硬权衡。建议换轴:κ(组成阻尼 0.55–0.75)× z 匹配联合小网格,或空间局部感知的 z 压缩(按局部密度调制因子而非全局单因子)。 |
| 原始记录位置 | /home/spark-longxinyang/vec/runs/formal/20261003-043412-search-t2-embryo-interp-g24-D-s1/nodes/29/engineer.jsonl 171 KB /home/spark-longxinyang/vec/runs/formal/20261003-043412-search-t2-embryo-interp-g24-D-s1/nodes/29/engineer.stderr |
调研员
| 角色 | 调研员 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数 | 1 |
| 工具调用 | 共 0 次:— |
| 用时 | 2 分 |
| token 数 | 输入 14,376 · 输出 1,479 · 思考 5,214 |
| 任务(第一行) | 为节点 n29(改进,父节点 n25)写改进计划 PLAN.json |
| 最后的回答(摘录) | 点 25 整云 z 匹配(fac≈0.92)使 shape_scale +1.03 但 local_spatial −0.59(neighborhood_mmd 0.05314→0.05436),净榜分仅 +0.11。z 过扩展的根因是 a 侧(早端)占混合的 ~52%,但当前机制对所有细胞施加同一压缩因子,无差别地压扁了 b 侧细胞的 z 邻域。ANALYSIS 建议'按型分别匹配 z 而非整云单因子';本方案按因果根源(侧别)而非型别做条件匹配,更直接、实现更简。",
"approach": "步骤:1) 在 run.py 的 ANISO_FULL 分支中,将当前整云单因子 z 匹配改为侧别加权:对 a 侧细胞施加完全匹配因子 fac_a = 1 + λ_a·(σ_ref_z/σ_out_z − 1)(λ_a=1 固定),对 b 侧细胞施加衰减因子 fac_b = 1 + λ_b·(σ_ref_z/σ_out_z − 1),λ_b 由环境变量 ANISO_B_LAMBDA 控制(初值 0.5,搜索 {0, 0.25, 0.5, 0.75, 1.0})。σ_ref_z 和 σ_out_z 仍从原始对齐云现场计算,缩放绕全局 μ_z。2) 快速变体:将 z 匹配移到 jitter 之前(env ANISO_PRE_JITTER=1),jitter 会在 z 方向随机回补部分方差,等效软化压缩;与 λ_b 组合测试。3) 用 vec-score 在 A 半 seed 0 上筛选:先跑 off 对照确认 = 父节点(1 次),再跑 λ_b∈{0, 0.5, 1.0}×PRE_JITTER∈{0,1} 共 6 配置(6 次),选 local_spatial 恢复最多且 shape_scale ≥ 73 的配置(约 2 次),最优配置换 seed 1 验证(1 次),共 ≤ 10 次。4) 单输入退路:无括号时 early return,不触及新代码,与父节点一致。5) 若 λ_b=0(b 侧完全不压缩)导致 d2_shape 恶化 > 10%,则回退到 λ_b=0.5;若所有 λ_b<1 的 shape_scale 均 < 72.5(低于父节点 23 的 72.48),则机制证伪,提交态 = 父节点 25。",
"expected_groups": ["local_spatial", "shape_scale"],
"risks": "1) b 侧不压缩可能使整体 z σ 匹配不足,d2_shape 回升,shape_scale 下降超过 local_spatial 恢复——Engineer 应在前 3 次查分内检查 d2_shape 是否 > 0.011(父节点 0.00945),若是则只试 λ_b=0.75。2) 侧别标签在 jitter 后可能丢失(若 jitter 打乱索引)——实现时在 jitter 前记录 a/b 侧掩码,jitter 后用掩码索引。3) 改善幅度可能 < 1 分(T2 噪声),需 seed 1 确认方向一致;若两 seed 均 < +0.5 则如实报告证伪。",
"family_id": "T2EI-05",
"mechanism": "侧别条件 z 轴 σ 匹配:a 侧细胞用完全因子压缩 z 以修正早端主导混合造成的 z 过扩展,b 侧细胞用衰减因子(ANISO_B_LAMBDA < 1)保留其 z 邻域结构,绕全局 μ_z 缩放后恢复 RMS。",
"vs_constant_shift": "常数 z 位移对所有细胞加同一偏移,不改变 z 离散度。本机制按侧别施加不同的乘性 z 缩放(绕质心),改变 a 侧和 b 侧各自的 z 展布,且缩放因子由括号插值 σ_ref_z 数据驱动,不是固定常数。",
"mechanism_evidence": "Engineer 应打印:(1) a 侧和 b 侧各自的 z σ 在匹配前后的变化(预期 a 侧压缩 ~8%,b 侧压缩 < 4% @ λ_b=0.5);(2) neighborhood_mmd 相对整云匹配(0.05436)是否回落到 ≤ 0.0535;(3) d2_shape 是否保持 ≤ 0.010;(4) 四组分各自的变化,尤其 local_spatial 是否回到 ≥ 60.5。",
"mechanism_off_control": "ANISO_B_LAMBDA=1.0 且 ANISO_PRE_JITTER=0 时,a/b 侧因子相同,退化为整云单因子 z 匹配,输出应与父节点 25 逐数组一致(h5py 逐数组 allclose 验证)。若不一致说明实现有 bug。",
"sources": []
}
``` |
| 原始记录位置 | /home/spark-longxinyang/vec/runs/formal/20261003-043412-search-t2-embryo-interp-g24-D-s1/nodes/29/researcher.jsonl 5 KB /home/spark-longxinyang/vec/runs/formal/20261003-043412-search-t2-embryo-interp-g24-D-s1/nodes/29/researcher.stderr |
审查员
| 角色 | 审查员 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数 | 7 |
| 工具调用 | 共 9 次:read 6、bash 2、write 1 |
| 用时 | 1 分 |
| token 数 | 输入 27,411 · 输出 1,352 · 思考 3,359 |
| 任务(第一行) | 审查节点 n29 的程序是否越界读取、写死目标、钻评分器漏洞 |
| 最后的回答(摘录) | REVIEW.json written |
| 原始记录位置 | /home/spark-longxinyang/vec/runs/formal/20261003-043412-search-t2-embryo-interp-g24-D-s1/nodes/29/reviewer.jsonl 130 KB /home/spark-longxinyang/vec/runs/formal/20261003-043412-search-t2-embryo-interp-g24-D-s1/nodes/29/reviewer.stderr |