Virtual Embryo Challenge更新于 10-03 20:28(北京时间) / 每 5 分钟更新

总览 · ← 返回运行 20261003-004922-search-t2-heart-interp-g24-D

节点 n19 终选程序?按该运行锁定的规则最终选出的程序;可能是候选节点,也可能由护栏回退到基线。在终选来历上

实现 T2HI-04 型内坐标kNN表达平滑并在代理上证伪(cell_state 单调下降、expression_change 不动),按 PLAN 止损条款以关闭态(alpha=0,与父节点17逐位一致)提交。

运行?一次完整的自动搜索或 Agent 会话,有自己的锁定配置和证据包。20261003-004922-search-t2-heart-interp-g24-D
父节点n17
子节点n20、n24
操作?种子:人写的起点;改进:在父节点上改;草稿:从头写;修复:修父节点的报错。改进
状态已打分
分数搜索目标分 61.41(+0.0) · proxy 61.41(+0.0) · 3 次复测均分 61.33
审查通过 检查1(越界读取):未发现问题。run.py 仅通过 src.task2_spatial.view_io 的 load_manifest/read_stage/panel_genes 从 --data 指向的视图目录读取(run.py:55-58, 280-296),无绝对路径、'..'、/mnt、/home、data/raw、打分器或 src/common/evaluation 引用,无联网下载。; 检查2(硬编码目标统计量):未发现问题。源码中的数字常量(K=20, EXPR_ALPHA=0, K_EXPR=15, STRENGTH=1.5, MAX_FRAC=0.45,run.py:6…
用时?从运行开始到结束(或到现在)的挂钟时间。13 分
程序版本738087c4860f9997cc80233f6815b95b37b2e9ff (programs.git)

方法说明?节点程序自带的 METHOD.md:这个程序做了什么、为什么。

来自 programs.git 738087c486:solution/METHOD.md

实现 T2HI-04 型内坐标kNN表达平滑并在代理上证伪(cell_state 单调下降、expression_change 不动),按 PLAN 止损条款以关闭态(alpha=0,与父节点17逐位一致)提交。

方法族 / 实现

family_id = T2HI-04(型内坐标 kNN 表达平滑),按 PLAN 完整实现于 run.py::_expr_smooth:

  1. 在父管线(mix, align=procrustes, scale_damp=1 + 型内 kNN 坐标平滑 k=20, strength=1.5, max_frac=0.45, k_adaptive)产出的最终坐标上,对每个细胞类型分别建 cKDTree(--k-expr 15,k_eff=min(k, max(3, m−1)),m<4 的型跳过)。
  2. 每个细胞 i 的 mu_i = 其 k_expr 个同型坐标近邻(去掉自身)的表达均值;X_new[i] = (1−alpha)·X[i] + alpha·mu_i,对全部 500 个基因。
  3. 单输入阶段退路:mix 回退为父逻辑(分层抽末阶段),表达平滑仍在该单阶段输出的型内坐标上执行(不依赖两阶段信息)。
  4. 关闭对照:--expr-alpha 0(默认值)完全跳过平滑步骤。

对照结果(mechanism_off_control)

用父节点17的原 run.py(逐行还原,字节数 12170 一致)在同一视图 seed 0 上生成输出,与本节点默认输出比较:X 与 spatial_3D 均 np.array_equal = True(逐位一致)。开启态仅 X 改变,坐标、细胞数、类型组成不变。

机制生效证据(proxy A 半,seed 0,全部 17616 细胞被平滑,0 跳过)

alpha型内基因方差比 after/beforemean|ΔX|/SD改变>1%的细胞比例
0.020.9630.0068100%
0.050.9090.0169100%
0.100.8220.0339100%
0.150.7410.0508100%
0.250.5930.0846100%

方差随 alpha 单调下降、幅度与 alpha 成正比 → 低通滤波确实运行。

机制检验:证伪(vec-score,A 半,seed 0)

配置cell_stateexpression_changelocal_spatialshape_scale
关闭对照 alpha=0(=父17)65.9363.8361.7052.68
alpha=0.05, k=1561.17 (−4.76)63.82 (−0.01)61.6452.68
alpha=0.10, k=1558.38 (−7.55)63.81 (−0.02)61.5852.68

四组分变化完全符合 PLAN 预期模式(坐标不动 → local_spatial / shape_scale 只有噪声级微动;表达动 → cell_state / expression_change 动),但方向相反:cell_state 随平滑强度单调大跌,expression_change 纹丝不动。精确命中 PLAN 风险①的止损判据(cell_state 降 >1.5 且 expression_change 升 <1)。解释:评分器的细胞状态组看的是预测群体与参考群体的表达分布距离;mix 输出已是真实细胞,其"噪声"就是参考群体自带的单细胞异质性,对它做低通滤波只会把分布收窄、偏离参考。PLAN 步骤5的"仅高方差基因平滑"变体只会按比例缩小同一错误方向的效果,不再消耗查分额度。按 PLAN 止损条款:两个非零 alpha 均低于关闭对照 → 提交关闭态。

提交内容

默认参数即关闭态:输出与父节点17逐位一致(已验证)。查分共 5 次(额度 20)。vec-check 通过;seed 0/1 各自确定;EXECUTION.json 为 {"gpu": false}。

生物学知识来源

无新增外部生物学知识;仅使用"发育中空间邻近细胞表达连续"这一通用先验(PLAN 给定),且该先验在本 board 的评分下被证伪——单细胞分辨率的异质性本身被评分器计为细胞状态相似度的一部分。

未验证

  • 高方差基因子集平滑(判定为同一方向、按比例更弱的效果,止损后不测)。
  • k_expr ∈ {10, 20}(PLAN 规定仅当 alpha 方向正确时才调 k)。
  • B 半与 final 视图(关闭态与父逐位一致,迁移性等同父节点17)。

调研员的计划

名称型内坐标kNN表达平滑:局部空间邻域表达去噪
动机父节点17中cell_state=66.70、expression_change=63.90在坐标-only改动下逐位不变,说明这两组的提升必须来自表达侧。坐标侧已饱和(local_spatial mf 0.45–0.8平台61.03–61.08,shape_scale 52.70的全局缩放路线被证伪)。ANALYSIS明确建议'在表达侧找新机制(如按局部邻域表达轻微重加权),但需先设计关闭态逐位一致的对照'。节点12证明全局型×基因趋势位移失败(6档全低于关闭对照),但那是大尺度时间趋势;局部空间平滑(坐标邻居间表达混合)是不同机制,尚未尝试。若有效,可同时改善cell_state和expression_change两组(合计权重最大)。
做法在父节点17的完整管线(mix + kNN坐标平滑,参数不变)之后,新增一个表达平滑步骤:

1. 在平滑后的坐标上,对每个细胞类型分别建kNN图(复用现有cKDTree逻辑,k_expr=15)。
2. 对型内每个细胞i,计算其k_expr个同型坐标近邻的表达均值 mu_i(对X矩阵每列)。
3. 更新表达:X_new[i] = (1-alpha)X[i] + alphamu_i。
4. alpha网格:[0.02, 0.05, 0.10, 0.15, 0.25],先跑0.05和0.10两个点快速判断方向;若两者均低于关闭对照(alpha=0),立即止损提交关闭态。
5. 基因子集策略:默认全部基因参与平滑;若全基因掉分,试仅对型内高方差基因(top 50% by var)做平滑(低方差基因不变)。
6. 关闭对照:--expr-alpha 0 时不执行平滑步骤,输出与父节点17逐位一致(用np.array_equal验证X和spatial_3D)。
7. vec-score快筛:先跑alpha=0确认逐位一致(不查分),再跑0.05和0.10各查一次分(2次),根据方向决定是否继续(最多再查3–5个配置)。总查分预算≤10次。

单输入阶段退路:若无上括号阶段(单输入),mix回退为父节点逻辑,表达平滑仍可在单阶段输出的型内坐标上执行(不依赖两阶段信息)。final同理。

关键参数初值:k_expr=15(略小于坐标平滑的20,因表达对局部结构更敏感),alpha从0.05起。搜索范围:alpha∈[0.02, 0.25],k_expr∈{10,15,20}(仅当alpha方向正确时再调k)。
风险1. 表达平滑模糊真实异质性,使cell_state下降(评分器可能期望单细胞分辨率的表达多样性)。Engineer应在第一个非零alpha查分后立即对比cell_state子分:若cell_state下降>1.5而expression_change上升<1,说明平滑方向错,止损。2. 节点12已证明表达位移容易掉分;本方案的区别是局部空间平滑(非全局时间趋势),但仍可能失败。若两个非零alpha均低于关闭对照,按止损提交关闭态(与父逐位一致)。3. 小类型(<k_expr+1细胞)跳过平滑;k_adaptive已保证≥4细胞的型有k_eff≥3,表达平滑同理用k_expr_eff=min(k_expr, max(3,m-1))。4. 预期增益小(1–2分级别),需两seed同向确认;若仅单点+0.5不算进步。

代码改动?这个节点的程序和父节点程序的逐行差别:绿色是新增,红色是删除。

对比:父节点版本 5091e4a1fe。改动的文件:solution/METHOD.md +31 −47、solution/run.py +80 −3

diff --git a/solution/METHOD.md b/solution/METHOD.mdindex 6d31c33..d4535c2 100644--- a/solution/METHOD.md+++ b/solution/METHOD.md@@ -1,66 +1,50 @@-型内kNN坐标平滑位移上限0.2→0.45×型内SD强化局部致密化;PLAN的RMS恢复与各向异性缩放在代理上证伪(把尺度推离参考),按止损关闭,另加自适应k提升final稳健性。+实现 T2HI-04 型内坐标kNN表达平滑并在代理上证伪(cell_state 单调下降、expression_change 不动),按 PLAN 止损条款以关闭态(alpha=0,与父节点17逐位一致)提交。  ## 方法族 / 实现 -family_id = **T2HI-05**(kNN 平滑后 RMS 恢复 + 各向异性轴缩放,按 PLAN 实现并检验)。基线 = 父节点15:mix(align=procrustes, scale_damp=1)+ 型内 kNN 坐标平滑(k=20, strength=1.5, 位移≤max_frac×型内SD)。表达、细胞数、类型组成全程逐位不动,只改 `obsm["spatial_3D"]`。+family_id = **T2HI-04**(型内坐标 kNN 表达平滑),按 PLAN 完整实现于 `run.py::_expr_smooth`: -按 PLAN 实现了两个新机制(`--rescale-damp`、`--aniso`/`--aniso-damp`)和自适应 k(`--k-adaptive`):--1. **均匀 RMS 恢复**:平滑后 RMS_post 对 mix 已算好的 log 线性 target_rms(`info["target_rms"]`)做 `factor=1+damp·(target/RMS_post−1)` 的绕质心缩放。-2. **各向异性轴缩放**:两输入阶段 align 后缩放到 target_rms,逐轴 SD 做 log 线性插值得 target_SD_d,对平滑后坐标逐轴 `factor_d=1+damp·(target_SD_d/SD_d−1)`。-3. **自适应 k**:`k_eff=min(k, max(3, m−1))`,细胞数 <21 的小类型不再被跳过(proxy 上 5 型全部 ≥21,为 no-op;final 31 个共有型时保证稀有型也被平滑)。+1. 在父管线(mix, align=procrustes, scale_damp=1 + 型内 kNN 坐标平滑 k=20, strength=1.5, max_frac=0.45, k_adaptive)产出的**最终坐标**上,对每个细胞类型分别建 cKDTree(`--k-expr 15`,k_eff=min(k, max(3, m−1)),m<4 的型跳过)。+2. 每个细胞 i 的 mu_i = 其 k_expr 个同型坐标近邻(去掉自身)的表达均值;`X_new[i] = (1−alpha)·X[i] + alpha·mu_i`,对全部 500 个基因。+3. 单输入阶段退路:mix 回退为父逻辑(分层抽末阶段),表达平滑仍在该单阶段输出的型内坐标上执行(不依赖两阶段信息)。+4. 关闭对照:`--expr-alpha 0`(**默认值**)完全跳过平滑步骤。  ## 对照结果(mechanism_off_control) -`--rescale-damp 0 --aniso off --max-frac 0.2`(=父参数)的输出与父节点15输出 **X 与 spatial_3D 均 `np.array_equal` = True**(逐位一致),确认新代码在关闭态不泄漏。--## 机制检验:PLAN 的两个机制在 proxy 上被证伪(A半,seed 0)--| 配置 | 榜分 | shape_scale | local_spatial | scale_log_ratio | occupancy_dice |-|---|---:|---:|---:|---:|---:|-| 父节点15(mf0.2, 无缩放) | 60.77 | 53.52 | 59.81 | ~0.451 | 0.838 |-| +均匀RMS恢复 damp=1.0 | 60.69 | 53.22 | 59.81 | 0.467 | 0.838 |-| +RMS恢复+aniso damp=1.0 | 60.65 | 53.06 | 59.80 | 0.460 | 0.834 |--证据数字:平滑确实系统性收缩 RMS(RMS_post/target = **0.9832**,收缩 1.7%,方向与 PLAN 预期一致);恢复后 RMS/target = 1.0000。但 **shape_scale 反而下降**:scale_log_ratio 0.451→0.467 恶化——说明参考阶段的尺度**低于** mix 的 log 线性 target_rms(与方法卡"心脏尺度非单调,log 线性 346 够不到真值 217"一致),把 RMS 推回 target 是推离参考。aniso 的各轴 ratio_d 均 <2%(0.980/0.997/1.001),且 occupancy_dice 0.838→0.834 下降。命中 PLAN 风险①③,按止损条款以 **rescale_damp=0、aniso off** 提交。进一步用输入数据之外的方式"猜"目标尺度(更强的整体收缩)无法从两输入阶段合法导出(两端 RMS 354/335,log 线性对 damp 不敏感),针对 proxy 参考调尺度=向真值泄漏,不做。+用父节点17的原 run.py(逐行还原,字节数 12170 一致)在同一视图 seed 0 上生成输出,与本节点默认输出比较:**X 与 spatial_3D 均 `np.array_equal = True`(逐位一致)**。开启态仅 X 改变,坐标、细胞数、类型组成不变。 -## 实际提交的改进:平滑位移上限 max_frac 0.2→0.45(父节点 ANALYSIS 建议方向)+## 机制生效证据(proxy A 半,seed 0,全部 17616 细胞被平滑,0 跳过) -父节点 next_suggestions 明确建议"试 max_frac 0.3–0.4 看 shape/局部是否随更强收缩改善"。网格(k=20, strength=1.5, A半 seed 0):+| alpha | 型内基因方差比 after/before | mean\|ΔX\|/SD | 改变>1%的细胞比例 |+|---:|---:|---:|---:|+| 0.02 | 0.963 | 0.0068 | 100% |+| 0.05 | 0.909 | 0.0169 | 100% |+| 0.10 | 0.822 | 0.0339 | 100% |+| 0.15 | 0.741 | 0.0508 | 100% |+| 0.25 | 0.593 | 0.0846 | 100% | -| max_frac | 榜分 | local_spatial | shape_scale | neighborhood_mmd | mean_disp/SD |-|---:|---:|---:|---:|---:|---:|-| 0.20(父) | 60.77 | 59.81 | 53.52 | 0.0645 | 0.104 |-| 0.30 | 60.89 | 61.11 | 52.71 | 0.0611 | — |-| 0.35 | 61.01 | 61.41 | 52.86 | 0.0604 | 0.153 |-| **0.45(提交)** | **61.03** | **61.70** | **52.68** | **0.0597** | **0.176** |-| 0.60 | 61.08 | 62.00 | 52.59 | 0.0589 | — |-| 0.80 | 61.07 | 62.18 | 52.36 | 0.0585 | — |-| 0.35+s2.5 | 60.81 | 60.57 | 52.93 | 0.0625 | 0.180 |+方差随 alpha 单调下降、幅度与 alpha 成正比 → 低通滤波确实运行。 -mf∈[0.45, 0.8] 是平台(61.03–61.08,差在噪声内);取 **0.45**(平台中部、shape 侵蚀最小,迁移到 B半/final 更安全)。**跨种子一致性**:seed 1 下 mf0.45 = 61.27 vs 父配置 seed 1 = 61.02(+0.24,与 seed 0 的 +0.26 同向;local_spatial 60.2→62.0,+1.8 超噪声,shape −0.8 部分抵消)。净增益 ~+0.25 小于 T2 噪声 ~1 分,属"方向一致的小幅改进",不是大幅突破——如实记录。+## 机制检验:证伪(vec-score,A 半,seed 0) -## 机制生效证据(提交默认,proxy seed 0)+| 配置 | cell_state | expression_change | local_spatial | shape_scale |+|---|---:|---:|---:|---:|+| **关闭对照 alpha=0(=父17)** | **65.93** | **63.83** | 61.70 | 52.68 |+| alpha=0.05, k=15 | 61.17 (−4.76) | 63.82 (−0.01) | 61.64 | 52.68 |+| alpha=0.10, k=15 | 58.38 (−7.55) | 63.81 (−0.02) | 61.58 | 52.68 | -- 平滑覆盖率 100%(17616/17616,跳过类型 0);mean_disp/型内SD = 0.176(≤0.45 上限);max|delta| = 147.4。-- neighborhood_mmd 0.0645→0.0597(单调改善),local_spatial 59.81→61.70。-- 表达矩阵、细胞数(17616 ∈ [1000, 17616])、类型组成与父逐位一致(X `array_equal` True);只有坐标变。-- 关闭对照(mf=0.2)与父输出逐位一致(见上)。+四组分变化完全符合 PLAN 预期模式(坐标不动 → local_spatial / shape_scale 只有噪声级微动;表达动 → cell_state / expression_change 动),但方向相反:**cell_state 随平滑强度单调大跌,expression_change 纹丝不动**。精确命中 PLAN 风险①的止损判据(cell_state 降 >1.5 且 expression_change 升 <1)。解释:评分器的细胞状态组看的是预测群体与参考群体的表达分布距离;mix 输出已是真实细胞,其"噪声"就是参考群体自带的单细胞异质性,对它做低通滤波只会把分布收窄、偏离参考。PLAN 步骤5的"仅高方差基因平滑"变体只会按比例缩小同一错误方向的效果,不再消耗查分额度。按 PLAN 止损条款:**两个非零 alpha 均低于关闭对照 → 提交关闭态**。 -## 验证过+## 提交内容 -- 默认参数(无 flag)输出与网格 mf045_s15 文件逐位一致;seed 0 重跑逐位确定;seed 1 输出不同(无 seed 分支)。-- `vec-check` ok;坐标全部有限。-- **视图无关**:构造 +1 天平移、manifest 键序打乱、external 阶段同步平移的伪装视图,seed 0 输出的 X 与 spatial_3D 与真实视图**逐位相同**;程序只用相对时间 t、坐标、标签,不读绝对时间/路径/board 字段。-- 纯 CPU(numpy+scipy cKDTree),runtime ~2.1s,峰值内存与父相当(~0.5GB);`EXECUTION.json {"gpu": false}`。-- 查分用量:10/20(control 未查分,用逐位对照代替)。+默认参数即关闭态:输出与父节点17逐位一致(已验证)。查分共 5 次(额度 20)。`vec-check` 通过;seed 0/1 各自确定;`EXECUTION.json` 为 `{"gpu": false}`。 -## 未验证 / 风险+## 生物学知识来源 -- final 括号(31 共有型)未测;k_adaptive 使小类型(≥4 细胞)也被平滑,覆盖率应高于父节点的"跳过 <21 型",但小类型上 k_eff=3–19 的平滑幅度更依赖其自身 SD(自适应封顶),预期稳健、未实测。-- 净 +0.25(A半)在噪声边缘;依据是 local_spatial +1.8 在两个 seed 上同向、平台宽(mf 0.45–0.8),非单点尖峰。-- shape_scale 的 scale 分量短板仍在(scale_log_ratio≈0.44):合法可用的输入信息推不出参考尺度(非单调 354→217→335),任何"整体缩到某个魔数"的做法都是对 proxy 真值的拟合,不可迁移。+无新增外部生物学知识;仅使用"发育中空间邻近细胞表达连续"这一通用先验(PLAN 给定),且该先验在本 board 的评分下被证伪——单细胞分辨率的异质性本身被评分器计为细胞状态相似度的一部分。 -## 知识来源+## 未验证 -仅通用几何/统计操作(kNN 收缩、逐维 SD 裁剪、log 线性插值、Kabsch 对齐,均沿自父节点与 `src.task2_spatial`)。未使用保留阶段(E8.5/E10.5/E12.5、禁窗 (8.25,8.75)、9.5<E≤13.5)或保留基因型的任何测量信息;对目标尺度未注入任何外部数值。+- 高方差基因子集平滑(判定为同一方向、按比例更弱的效果,止损后不测)。+- k_expr ∈ {10, 20}(PLAN 规定仅当 alpha 方向正确时才调 k)。+- B 半与 final 视图(关闭态与父逐位一致,迁移性等同父节点17)。diff --git a/solution/run.py b/solution/run.pyindex bdfa47a..a073596 100644--- a/solution/run.py+++ b/solution/run.py@@ -59,6 +59,8 @@ from src.task2_spatial.view_io import board_params, interp_bracket, load_manifes  PARAMS = {"align": "procrustes", "scale_damp": 1.0} K = 20+EXPR_ALPHA = 0.0  # family T2HI-04: per-type kNN expression smoothing weight; 0 = off (control, bit-identical to parent node 17)+K_EXPR = 15 STRENGTH = 1.5  # grid-searched on the proxy A-half; 0 = parent behaviour (control) MAX_FRAC = 0.45  # displacement cap x type coord SD; grid: 0.2(parent)..0.8 plateau 61.0-61.1, 0.45 mid-plateau PCA_NORM = False@@ -131,6 +133,68 @@ def _knn_smooth(coords: np.ndarray, labels: np.ndarray, k: int, strength: float,     return new_coords.astype(np.float32), ev  +def _expr_smooth(expr: np.ndarray, coords: np.ndarray, labels: np.ndarray, k: int, alpha: float):+    """Family T2HI-04: low-pass filter of expression over per-type coordinate kNN.++    For each cell, mu_i = mean expression of its k nearest same-type neighbours in+    the FINAL (post coordinate smoothing) coordinates, self excluded.+    X_new[i] = (1-alpha)*X[i] + alpha*mu_i. Types with < k_eff+1 cells use+    k_eff = min(k, max(3, m-1)); types with < 4 cells are skipped.+    Returns (new_expr, evidence dict).+    """+    X = np.asarray(expr, dtype=np.float64)+    coords = np.asarray(coords, dtype=np.float64)+    labels = np.asarray(labels).astype(str)+    n = X.shape[0]+    Xn = X.copy()+    n_touched = 0+    n_skipped = 0+    var_before = []+    var_after = []+    rel_change = []+    for lab in np.unique(labels):+        idx = np.flatnonzero(labels == lab)+        m = idx.size+        k_eff = min(k, max(3, m - 1))+        if m < k_eff + 1:+            n_skipped += m+            continue+        pts = coords[idx]+        tree = cKDTree(pts)+        kk = min(k_eff + 1, m)+        _, nb = tree.query(pts, k=kk)+        if nb.ndim == 1:+            nb = nb[:, None]+        neigh = nb[:, 1:kk]+        if neigh.shape[1] == 0:+            n_skipped += m+            continue+        Xi = X[idx]+        mu = Xi[neigh].mean(axis=1)  # (m, G)+        Xnew_i = (1.0 - alpha) * Xi + alpha * mu+        Xn[idx] = Xnew_i+        n_touched += m+        var_before.append(Xi.var(axis=0).mean())+        var_after.append(Xnew_i.var(axis=0).mean())+        sd = Xi.std()+        if sd > 0:+            rel_change.append(np.abs(Xnew_i - Xi).mean() / sd)+    ev = {+        "expr_n_touched": int(n_touched),+        "expr_n_skipped": int(n_skipped),+        "expr_frac_touched": float(n_touched) / max(n, 1),+        "expr_var_before": float(np.mean(var_before)) if var_before else 0.0,+        "expr_var_after": float(np.mean(var_after)) if var_after else 0.0,+        "expr_var_ratio": float(np.mean(var_after) / np.mean(var_before)) if var_before and np.mean(var_before) > 0 else 1.0,+        "expr_mean_abs_change_over_sd": float(np.mean(rel_change)) if rel_change else 0.0,+    }+    # fraction of cells whose expression changed by >1% of their own L1 norm+    d = np.abs(Xn - X).sum(axis=1)+    base = np.abs(X).sum(axis=1)+    ev["expr_frac_cells_changed_gt1pct"] = float(np.mean(d > 0.01 * np.maximum(base, 1e-12)))+    return Xn.astype(np.float32), ev++ def _pca_normalize(coords: np.ndarray) -> np.ndarray:     """Deterministic PCA canonicalisation: centroid -> PCA axes -> det=+1 -> third-moment sign."""     C = np.asarray(coords, dtype=np.float64)@@ -209,6 +273,8 @@ def main() -> None:     parser.add_argument("--aniso", choices=("on", "off"), default=("on" if ANISO else "off"))     parser.add_argument("--aniso-damp", type=float, default=ANISO_DAMP)     parser.add_argument("--k-adaptive", choices=("on", "off"), default=("on" if K_ADAPTIVE else "off"))+    parser.add_argument("--expr-alpha", type=float, default=EXPR_ALPHA)+    parser.add_argument("--k-expr", type=int, default=K_EXPR)     args = parser.parse_args()      manifest = load_manifest(args.data)@@ -221,7 +287,10 @@ def main() -> None:         coords = stage.coords[rows]         if args.pca_norm == "on":             coords = _pca_normalize(coords)-        write_t2(args.out, stage.X[rows].toarray(), coords, genes, seed=args.seed)+        Xe = stage.X[rows].toarray()+        if args.expr_alpha != 0.0:+            Xe, _ = _expr_smooth(Xe, coords, np.asarray(stage.labels)[rows], args.k_expr, args.expr_alpha)+        write_t2(args.out, Xe, coords, genes, seed=args.seed)         return     stage_a = read_stage(args.data, a, genes)     stage_b = read_stage(args.data, b, genes)@@ -229,7 +298,9 @@ def main() -> None:     expr, coords, info = interpolate(stage_a, stage_b, t, params)      ev = {}-    if args.strength != 0.0:+    need_labels = args.strength != 0.0 or args.expr_alpha != 0.0+    labels = None+    if need_labels:         n = int(info["n"])         n_from_a = int(info["n_from_a"])         # reproduce the source-row labels exactly as interpolate drew them@@ -240,6 +311,7 @@ def main() -> None:         labs_a = np.asarray(stage_a.labels).astype(str)[ia]         labs_b = np.asarray(stage_b.labels).astype(str)[ib]         labels = np.concatenate([labs_a, labs_b])+    if args.strength != 0.0:         coords, ev = _knn_smooth(coords, labels, args.k, args.strength, args.max_frac,                                  adaptive=(args.k_adaptive == "on"))         if args.rescale_damp != 0.0 or args.aniso == "on":@@ -251,10 +323,15 @@ def main() -> None:     if args.pca_norm == "on":         coords = _pca_normalize(coords) +    if args.expr_alpha != 0.0:+        expr, ev3 = _expr_smooth(expr, coords, labels, args.k_expr, args.expr_alpha)+        ev.update(ev3)+     keep = {k: info.get(k) for k in ("t", "n", "rms_a", "rms_b", "out_rms", "n_shared_types", "z_dot", "z_flipped", "align", "n_from_a", "n_from_b")}     print(json.dumps({"bracket": [a["stage"], b["stage"]], **keep, "strength": args.strength, "k": args.k,                       "pca_norm": args.pca_norm, "rescale_damp": args.rescale_damp, "aniso": args.aniso,-                      "aniso_damp": args.aniso_damp, "k_adaptive": args.k_adaptive, **ev}, default=float), file=sys.stderr)+                      "aniso_damp": args.aniso_damp, "k_adaptive": args.k_adaptive,+                      "expr_alpha": args.expr_alpha, "k_expr": args.k_expr, **ev}, default=float), file=sys.stderr)     write_t2(args.out, expr, coords, genes, seed=args.seed)  

调研来源?调研员查到并用到的知识条目和文献检索结果(只列标题和编号)。

用到的知识库条目

编号标题出处
k007Interval staging and held-out-window filtering of external datanotes/official/来件/virtualembryo.ai/rules.md
k026Canonicalise predicted 3D coordinates before submissionnotes/pitfalls/04_scorer_invariance.md
k027Joint expression-geometry generation with relative geometrynotes/competition/03_solution_landscape.md

分析结果?分析员写的 ANALYSIS.json:改了什么、各组分数怎么变、假设是否成立、经验和下一步建议。

改了什么在父节点17管线上实现了 T2HI-04 型内坐标 kNN 表达平滑(_expr_smooth,k_expr=15,alpha 网格 0.02–0.25),proxy 上证伪后按 PLAN 止损条款以关闭态(--expr-alpha 0,默认值)提交,输出与父17逐位一致(np.array_equal 验证),因此榜分与四组分完全不变。
各组分数的变化cell_state:不变 +0.00(66.70,同上)
expression_change:不变 +0.00(63.90,关闭态提交,输出与父逐位一致)
local_spatial:不变 +0.00(62.34,同上)
shape_scale:不变 +0.00(52.70,同上)
family_idT2HI-04
假设是否成立否
经验
  1. 在 mix 输出(已是真实细胞)上做型内坐标 kNN 表达低通滤波:机制确实运行(型内方差比随 alpha 单调降 0.963→0.593,100% 细胞被改),但 cell_state 单调大跌(alpha=0.05 时 −4.76,0.10 时 −7.55),expression_change 纹丝不动(−0.01/−0.02)——评分器把单细胞分辨率的表达异质性本身计为细胞状态相似度,收窄分布即偏离参考。
  2. 表达侧的'平滑去噪'与节点12的'全局时间趋势位移'两条路线均已证伪:对该 board 的表达修改要么保持逐细胞的真实异质性,要么增加/重塑多样性,任何降低型内方差的变换预期都会掉 cell_state。
  3. 关闭态逐位一致对照(np.array_equal 代替查分)+ 两个非零 alpha 快速定向的止损流程有效:仅用 5/20 次查分即完成机制检验并安全回退,榜分零损失。
  4. PLAN 风险条款写成可执行的数值判据(cell_state 降>1.5 且 expression_change 升<1 即止损)使 Engineer 无需额外查分即可停止变体搜索(高方差基因子集平滑被正确判定为同方向更弱效果而未测)。
mechanism_active是
下一步建议
  1. 针对 cell_state/expression_change:试'保分布或增多样性'方向的表达修饰——如在 mix 抽样时按型内高方差基因轴做保方差的轻微重加权,或学习型内表达协方差后对 mix 细胞做保方差的微扰(幅度参数从 0.02×SD 起网格,先跑关闭态逐位一致对照再跑两个非零档)。
  2. 沿用本节点的止损框架:任何表达侧新机制先验证 --off 态与父输出 np.array_equal,再用 ≤2 次查分定方向,方向错立即提交关闭态。
  3. shape_scale(52.70)与 local_spatial(62.34)在坐标侧已进入平台(mf 0.45–0.8 榜分 61.03–61.08),全局缩放路线被父节点证伪不可迁移;坐标侧建议停止调参,把查分预算全部投向表达侧新机制。

对话摘要?每个角色和大模型对话的统计:轮数、工具调用、用时、token 数和最后的回答摘录;原始记录只给路径。

只给统计和最后回答的摘录;完整对话请到原始记录位置里列出的文件看。

分析员

角色?调研员写计划、工程师改代码、分析员解读分数、审查员检查作弊。分析员 alibaba-token-plan-cn/qwen3.8-max
调用次数1 次
轮数?大模型一共回复了几轮(每轮可以调用多个工具)。2
工具调用?大模型调用读文件、执行命令等工具的次数,按工具名统计。共 1 次:write 1
用时不到 1 分
token 数?输入 / 输出(含思考)的 token 数,来自接口返回的用量。输入 10,756 · 输出 909 · 思考 530
任务(第一行)分析节点 n19 的打分结果,写 ANALYSIS.json
最后的回答(摘录)
ANALYSIS.json written
原始记录位置?完整对话记录在 Spark 上的文件路径;看板不复制原始内容。/home/spark-longxinyang/vec/runs/formal/20261003-004922-search-t2-heart-interp-g24-D/nodes/19/analyst.jsonl 5 KB
/home/spark-longxinyang/vec/runs/formal/20261003-004922-search-t2-heart-interp-g24-D/nodes/19/analyst.stderr

工程师

角色工程师 alibaba-token-plan-cn/qwen3.8-max
调用次数1 次
轮数23
工具调用共 27 次:bash 19、edit 6、read 1、write 1
用时7 分
token 数输入 46,117 · 输出 7,732 · 思考 3,425
任务(第一行)按计划修改程序:型内坐标kNN表达平滑:局部空间邻域表达去噪
最后的回答(摘录)
完成。

- **做了什么**:按 PLAN 实现 T2HI-04 型内坐标 kNN 表达平滑(k_expr=15,alpha 网格 0.02–0.25),关闭对照 `--expr-alpha 0` 与父节点17输出逐位一致(np.array_equal 验证 X 和坐标)。
- **查分结果**(5/20 次,A 半 seed 0):机制确实运行(型内方差随 alpha 单调降 0.963→0.593),但被证伪——cell_state 65.93→61.17(α=0.05)→58.38(α=0.10),expression_change 不动(63.83→63.81)。命中 PLAN 止损判据,以关闭态提交(=父17,预期榜分 ~61.3)。
- **下一步最值得试**:表达侧"平滑去噪"方向已死;细胞状态组的短板更可能需要**增加/重塑分布多样性**(如 mix 抽样时对高方差基因轴做保分布的重加权,或用 external MOSTA E9.5 学习型内表达协方差后对 mix 细胞做保方差的轻微修饰),而非低通滤波。shape_scale(52.68)仍是最大短板,但全局缩放路线已被父节点证明不可迁移。
原始记录位置/home/spark-longxinyang/vec/runs/formal/20261003-004922-search-t2-heart-interp-g24-D/nodes/19/engineer.jsonl 133 KB
/home/spark-longxinyang/vec/runs/formal/20261003-004922-search-t2-heart-interp-g24-D/nodes/19/engineer.stderr

调研员

角色调研员 alibaba-token-plan-cn/qwen3.8-max
调用次数1 次
轮数1
工具调用共 0 次:—
用时5 分
token 数输入 12,472 · 输出 6,507 · 思考 8,192
任务(第一行)为节点 n19(改进,父节点 n17)写改进计划 PLAN.json
最后的回答(摘录)
制(如按局部邻域表达轻微重加权),但需先设计关闭态逐位一致的对照'。节点12证明全局型×基因趋势位移失败(6档全低于关闭对照),但那是大尺度时间趋势;局部空间平滑(坐标邻居间表达混合)是不同机制,尚未尝试。若有效,可同时改善cell_state和expression_change两组(合计权重最大)。",
  "approach": "在父节点17的完整管线(mix + kNN坐标平滑,参数不变)之后,新增一个表达平滑步骤:\n\n1. 在平滑后的坐标上,对每个细胞类型分别建kNN图(复用现有cKDTree逻辑,k_expr=15)。\n2. 对型内每个细胞i,计算其k_expr个同型坐标近邻的表达均值 mu_i(对X矩阵每列)。\n3. 更新表达:X_new[i] = (1-alpha)*X[i] + alpha*mu_i。\n4. alpha网格:[0.02, 0.05, 0.10, 0.15, 0.25],先跑0.05和0.10两个点快速判断方向;若两者均低于关闭对照(alpha=0),立即止损提交关闭态。\n5. 基因子集策略:默认全部基因参与平滑;若全基因掉分,试仅对型内高方差基因(top 50% by var)做平滑(低方差基因不变)。\n6. 关闭对照:--expr-alpha 0 时不执行平滑步骤,输出与父节点17逐位一致(用np.array_equal验证X和spatial_3D)。\n7. vec-score快筛:先跑alpha=0确认逐位一致(不查分),再跑0.05和0.10各查一次分(2次),根据方向决定是否继续(最多再查3–5个配置)。总查分预算≤10次。\n\n单输入阶段退路:若无上括号阶段(单输入),mix回退为父节点逻辑,表达平滑仍可在单阶段输出的型内坐标上执行(不依赖两阶段信息)。final同理。\n\n关键参数初值:k_expr=15(略小于坐标平滑的20,因表达对局部结构更敏感),alpha从0.05起。搜索范围:alpha∈[0.02, 0.25],k_expr∈{10,15,20}(仅当alpha方向正确时再调k)。",
  "expected_groups": ["cell_state", "expression_change"],
  "risks": "1. 表达平滑模糊真实异质性,使cell_state下降(评分器可能期望单细胞分辨率的表达多样性)。Engineer应在第一个非零alpha查分后立即对比cell_state子分:若cell_state下降>1.5而expression_change上升<1,说明平滑方向错,止损。2. 节点12已证明表达位移容易掉分;本方案的区别是局部空间平滑(非全局时间趋势),但仍可能失败。若两个非零alpha均低于关闭对照,按止损提交关闭态(与父逐位一致)。3. 小类型(<k_expr+1细胞)跳过平滑;k_adaptive已保证≥4细胞的型有k_eff≥3,表达平滑同理用k_expr_eff=min(k_expr, max(3,m-1))。4. 预期增益小(1–2分级别),需两seed同向确认;若仅单点+0.5不算进步。",
  "family_id": "T2HI-04",
  "mechanism": "在坐标空间定义的型内局部邻域上,对表达做低通滤波(kNN均值混合),利用发育中空间邻近细胞表达连续的先验,减少抽样/技术噪声导致的表达不连续。",
  "vs_constant_shift": "常数位移是对整个型的所有细胞施加相同的表达偏移向量;本机制是按每个细胞的局部坐标邻域计算不同的平滑目标,位移量和方向逐细胞不同(边界细胞与中心细胞的修正不同),且幅度由局部邻域表达方差决定,不是全局常数。",
  "mechanism_evidence": "Engineer应记录:(1) 平滑前后X的逐基因方差变化(预期型内方差降低,降幅与alpha成正比);(2) 被平滑改变表达>1%的细胞比例;(3) 四组分各自变化(预期cell_state和expression_change动,local_spatial和shape_scale不动因为坐标不变);(4) 平滑量(mean |X_new - X| / per-gene SD)作为机制强度指标。若方差未降或改变细胞比例≈0,说明机制未运行。",
  "mechanism_off_control": "命令行加 --expr-alpha 0(默认值),此时完全跳过表达平滑步骤,输出X和spatial_3D与父节点17逐位一致(np.array_equal=True)。预期差别:关闭态与父输出完全相同;开启态仅X改变,坐标/细胞数/类型组成不变。",
  "sources": []
}
```
原始记录位置/home/spark-longxinyang/vec/runs/formal/20261003-004922-search-t2-heart-interp-g24-D/nodes/19/researcher.jsonl 26 KB
/home/spark-longxinyang/vec/runs/formal/20261003-004922-search-t2-heart-interp-g24-D/nodes/19/researcher.stderr

审查员

角色审查员 alibaba-token-plan-cn/qwen3.8-max
调用次数1 次
轮数7
工具调用共 10 次:read 7、bash 2、write 1
用时不到 1 分
token 数输入 21,132 · 输出 1,482 · 思考 1,110
任务(第一行)审查节点 n19 的程序是否越界读取、写死目标、钻评分器漏洞
最后的回答(摘录)
REVIEW.json written
原始记录位置/home/spark-longxinyang/vec/runs/formal/20261003-004922-search-t2-heart-interp-g24-D/nodes/19/reviewer.jsonl 97 KB
/home/spark-longxinyang/vec/runs/formal/20261003-004922-search-t2-heart-interp-g24-D/nodes/19/reviewer.stderr