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

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

节点 n23

实现PLAN T2HI-01:表达混合靶点从空间1-NN单细胞改为同型a侧k近邻均值(门控仍用1-NN解耦),实测k=3/5与γ联动扫描全部无净增益(≤+0.09,噪声内),提交态取k=1(输出与节点21逐位一致)。

运行?一次完整的自动搜索或 Agent 会话,有自己的锁定配置和证据包。20261003-004922-search-t2-heart-interp-g24
父节点n21
子节点—
操作?种子:人写的起点;改进:在父节点上改;草稿:从头写;修复:修父节点的报错。改进
状态已打分
分数搜索目标分 61.79(+0.0) · proxy 61.79(+0.0) · 3 次复测均分 61.40
审查通过 1 越界读取:未发现问题——run.py 仅通过 src.task2_spatial.view_io 的 load_manifest/read_stage/panel_genes 读取 manifest['inputs'] 给的输入阶段,无绝对路径、'..'、/mnt、/home、目标阶段文件或联网代码。; 2 硬编码目标统计量:未发现问题——代码中无细胞类型比例表、细胞数或基因列表常量;gamma=2.8、gate_q=0.8 等为家族调优超参数,delta/门控/型均值全部由输入现场计算(run.py:394-418, 406-409)。; 3 钻评分器漏洞:未发现问题——T2HI_CA…
用时?从运行开始到结束(或到现在)的挂钟时间。18 分
程序版本f6ec89af862047b807fdd1b39bdb487a38b3d53a (programs.git)

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

来自 programs.git f6ec89af86:solution/METHOD.md

实现PLAN T2HI-01:表达混合靶点从空间1-NN单细胞改为同型a侧k近邻均值(门控仍用1-NN解耦),实测k=3/5与γ联动扫描全部无净增益(≤+0.09,噪声内),提交态取k=1(输出与节点21逐位一致)。

方法(family T2HI-01,improve 自节点 21)

底座与节点 21 完全一致:双 bracket 组成插值 → Procrustes 对齐 → log 插值 RMS → 型内 NN 坐标融合(α=1.0,cap=0 即原 1-NN 贪心)→ chg_l2 分位数门控表达混合(γ=2.8, q=0.8, global)→ jitter → RMS → PCA canon。坐标路径零改动。

新增(T2HI_EXPR_K,默认 1):

  • _blend_within_type 里,对每个被融合的 b 细胞额外查询同型 a 侧的 k 个空间最近邻(cKDTree(pa).query(pb, k=min(k, n_a)),含 min(k, n_a) 保护,PLAN 风险 2),记入 stats["nnk_a"](不足 k 时以 -1 填充)。
  • 表达混合时,被门控选中的 b 细胞的靶点改为这 k 个近邻的表达均值 Xa_tgt:xb ← xb + γ·(Xa_tgt − xb)。
  • 门控量 chg_l2 = ||Xa_1nn − Xb|| 仍按原 1-NN 配对计算(PLAN 步骤 2,遵循节点 21 教训 3:配对/门控与表达靶点解耦),所以 keep 集合与 k=1 完全相同。
  • k=1 时走原代码路径,为机制关闭对照。

机制生效证据(PLAN mechanism_evidence 四项,proxy seed 0)

  1. 门控集不变:k=1/3/5 下 cells_kept 均为 455/2273,per-type kept/total 逐项相同(NCC 149/341、Peri 9/621、V-CM 22/814、aPHM 76/239、pPHM 199/258);chg_l2 kept mean/std/min/max 逐位相同(123.561/3.203/119.100/133.314)。
  2. 混合后型内表达方差(within_type_var after,k=1 为 3011.4):k=3 → 2136.3(比值 0.71),k=5 → 1941.0(0.64)。靶点范数 tgt_norm 44.13 → 38.47(k=3,tgt/1-NN=0.872)→ 37.06(k=5,0.840):k 近邻均值确实去噪并缩小了过冲步长。
  3. 四组分变化见下表:expression_change k=3 −0.0 至 +0.4(γ 联动),cell_state −0.26(k=3 γ2.8,触发 PLAN 风险 1 的 <−1 阈值之前但方向为负),local_spatial/shape_scale 不动(坐标未改)。
  4. 获益最大的型:无。k-NN 均值缩小步长等价于降低有效 γ,与节点 18「γ 越大越好(1.2→2.8 单调升)」方向相反;稀疏型假设未兑现——aPHM(n_b/n_a=1.25)在 k=3/5 下无独立正向信号(组内 keep 数少,被全局 q=0.8 门主导)。

机制关闭对照与查分(A半 proxy,seed 0;节点正式分用 B半)

off 对照 T2HI_EXPR_K=1(默认):与节点 21 输出走完全相同代码路径(nnk_a 不参与),实测默认运行与显式 k=1 运行 X 与坐标 np.array_equal;seed 0 重跑逐位一致(确定性验证)。A半分数 61.346 = 节点 21 的 61.346(复现)。

配置A半榜分expr_changecell_statelocalshape
k=1, γ=2.8(off,提交态)61.34667.8266.1357.8153.62
k=3, γ=2.861.3667.8265.8757.8153.62
k=5, γ=2.861.2767.8665.8957.7053.62
k=3, γ=3.261.3868.2265.8757.8053.62
k=3, γ=3.661.3468.0665.8157.8853.62
k=1, γ=3.261.4468.1666.0857.8953.62
k=1, γ=3.661.3767.8766.0357.9653.62
k=1, γ=4.061.3467.7565.9758.0353.62
k=1, γ=2.5(k=3 γ=2.5:61.21)67.5965.9857.6553.62

结论:机制被证伪。 k=3 vs k=1 差 +0.01(<0.5,PLAN 风险 3 判无效);γ 联动补偿(k-NN 均值把步长缩到 0.87×,用更大 γ 补回)最好也只有 k=3 γ3.2 = +0.03。去噪方向本身无效:1-NN 单细胞靶点的「噪声」不是 expression_change 的瓶颈,k 近邻均值把过冲步长缩小反而抵消增益(与节点 18 γ 单调性一致)。k=1 γ=3.2 的 +0.09 亦在 seed 噪声内(seed 1 下 γ=2.8 本身即 61.55,波动 ±0.2),且 B 半不一定复现,不改默认。按 PLAN 决策规则提交 k=1(=父节点行为,逐位一致,零风险)。

未验证 / 下一步

  • 未验证:k-NN 靶点在真实 bracket(E8.25+E9.5→E8.75,31 个共有型、b 侧更密)上的行为——proxy 只有 5 个共有型且 a 侧稀疏(10570 抽样后),真实任务上 k 近邻的构成会不同;但 proxy 上方向为负,不值得消耗真实查分。
  • 表达侧「改靶点构造」两条路(节点 20 逐细胞 β、本节点 k-NN 均值)都已证明在噪声内:expression_change ~68 可能是该门控混合结构在 proxy 上的平台。下一步若继续攻 expression,应改混合的函数形式(如对 keep 细胞做 a/b 表达的非线性重标定、或在 log 域混合),而不是继续调步长/靶点。
  • local_spatial 唯一残余正向信号仍是 mutual 融合的 α_a 扫描(节点 21 next_suggestions 1),本节点未触碰坐标路径。
  • 知识来源:无外部生物知识;全部为对已有底座的结构改动。

调研员的计划

名称k-NN表达靶点替代1-NN:混合目标从单最近邻改为同型k近邻均值
动机父节点21(=节点19)expression_change 67.90是四组中响应最活跃的组分(节点14→20累计+4.0),但当前混合靶点是单个空间1-NN的表达——在稀疏型(如aPHM n_b/n_a=1.25)中1-NN可能不是最佳表达参照。节点21 ANALYSIS明确建议'在保持原1-NN坐标配对不变的前提下只调表达侧'。节点20的逐细胞自适应β(+1.22 expression)方向正确但幅度在噪声边缘,说明需要改变靶点构造而非仅调系数。
做法步骤:1) 在 _blend_within_type 中,坐标融合仍用空间1-NN(cKDTree query k=1),但表达混合靶点改为同型a侧k-NN均值:对每个被融合b细胞,取其同型a侧k个最近邻(cKDTree query k=k_expr),xa_target = mean(a侧k近邻表达)。2) 门控量chg_l2仍按原1-NN计算(||xa_1nn - xb||),保持门控选中集不变(解耦坐标配对与表达靶点,遵循节点21教训3)。3) 混合公式不变:xb ← xb + γ*(xa_target - xb),γ=2.8,q=0.8。4) 参数扫描:k_expr ∈ {1, 3, 5}(k=1即当前行为,为off对照);若k=3有效,再试γ ∈ {2.5, 2.8, 3.2}。5) 单输入阶段退路:t=0时copy_last,不触发混合,与现有fallback一致。6) vec-score快筛:先跑k=3 vs k=1的A半对比,差>1分再扫γ;否则直接提交k=1(=父节点)。时间预算:实现~10min,3次查分~3min,余量充足。
风险1) 型内表达异质性高时,k-NN均值可能模糊亚群信号,导致cell_state下降——Engineer应在k=3查分时同时看cell_state,若降>1则停止。2) 稀疏型(aPHM n_a仅~700)k=5可能超出型内细胞数——需min(k, n_a)保护。3) 预期提升可能<1分(噪声)——若k=3与k=1差<0.5,判无效,提交k=1(=父节点,零风险)。尽早发现:第一次vec-score即可判断方向。

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

对比:父节点版本 5e9b420bfb。改动的文件:solution/METHOD.md +32 −47、solution/run.py +58 −4

diff --git a/solution/METHOD.md b/solution/METHOD.mdindex 3d03d4f..8d397d4 100644--- a/solution/METHOD.md+++ b/solution/METHOD.md@@ -1,59 +1,44 @@-实现PLAN T2HI-04结构性修复:把型内b→a的1-NN贪心换成容量约束最优指派(LAP),实测local_spatial零响应、shape/expression小幅变差,提交态默认关闭(输出与节点19逐位一致)。+实现PLAN T2HI-01:表达混合靶点从空间1-NN单细胞改为同型a侧k近邻均值(门控仍用1-NN解耦),实测k=3/5与γ联动扫描全部无净增益(≤+0.09,噪声内),提交态取k=1(输出与节点21逐位一致)。 -## 方法(family T2HI-04,improve 自节点 19)+## 方法(family T2HI-01,improve 自节点 21) -底座与节点 19 完全一致:双 bracket 组成插值 → Procrustes 对齐 → 统一 log 插值 RMS → 型内 NN 坐标融合(α=1.0)→ chg_l2 分位数门控表达混合(γ=2.8, q=0.8)→ jitter → RMS → PCA canon。表达侧未改动。+底座与节点 21 完全一致:双 bracket 组成插值 → Procrustes 对齐 → log 插值 RMS → 型内 NN 坐标融合(α=1.0,cap=0 即原 1-NN 贪心)→ chg_l2 分位数门控表达混合(γ=2.8, q=0.8, global)→ jitter → RMS → PCA canon。坐标路径零改动。 -新增(`_capacity_assign`,`run.py`):每个共有型内,b 侧细胞到 a 侧细胞的配对由「无约束 1-NN 贪心」改为**容量约束指派**——每个 a 细胞最多承接 `capacity` 个 b 细胞。两种模式:+新增(`T2HI_EXPR_K`,默认 1): -- `T2HI_CAP=c`:固定容量。指派用 a 侧复制 c 份后的**最优 LAP**(`scipy.optimize.linear_sum_assignment`,最小化总距离;行列式规模 n_b×(n_a·c) ≤ 6e7 时启用),超限则退回 kNN 贪心两轮(k=8→64,按距离升序稳定排序)。-- `T2HI_CAP_KAPPA=κ`:逐型容量 `cap=ceil(κ·n_b/n_a)`,κ=1 时 n_a·cap ≥ n_b,**保证零未融合**,只把占用摊平。-- `T2HI_CAP=0`(默认,提交态):cap := n_b,走原 k=1 查询路径,**逐位退化为节点 19**。+- `_blend_within_type` 里,对每个被融合的 b 细胞额外查询同型 a 侧的 k 个空间最近邻(`cKDTree(pa).query(pb, k=min(k, n_a))`,含 `min(k, n_a)` 保护,PLAN 风险 2),记入 `stats["nnk_a"]`(不足 k 时以 -1 填充)。+- 表达混合时,被门控选中的 b 细胞的靶点改为这 k 个近邻的**表达均值** `Xa_tgt`:`xb ← xb + γ·(Xa_tgt − xb)`。+- **门控量 chg_l2 = ||Xa_1nn − Xb|| 仍按原 1-NN 配对计算**(PLAN 步骤 2,遵循节点 21 教训 3:配对/门控与表达靶点解耦),所以 keep 集合与 k=1 完全相同。+- k=1 时走原代码路径,为机制关闭对照。 -未拿到槽位的 b 细胞保留 Procrustes 坐标(不融合),也不进入表达混合(`nn_b/nn_a` 只含已指派对)。+## 机制生效证据(PLAN mechanism_evidence 四项,proxy seed 0) -## 机制生效证据(PLAN mechanism_evidence 五项,proxy seed 0)+1. **门控集不变**:k=1/3/5 下 cells_kept 均为 455/2273,per-type kept/total 逐项相同(NCC 149/341、Peri 9/621、V-CM 22/814、aPHM 76/239、pPHM 199/258);chg_l2 kept mean/std/min/max 逐位相同(123.561/3.203/119.100/133.314)。+2. **混合后型内表达方差**(`within_type_var` after,k=1 为 3011.4):k=3 → 2136.3(比值 0.71),k=5 → 1941.0(0.64)。靶点范数 tgt_norm 44.13 → 38.47(k=3,tgt/1-NN=0.872)→ 37.06(k=5,0.840):k 近邻均值确实去噪并缩小了过冲步长。+3. **四组分变化**见下表:expression_change k=3 −0.0 至 +0.4(γ 联动),cell_state −0.26(k=3 γ2.8,触发 PLAN 风险 1 的 <−1 阈值之前但方向为负),local_spatial/shape_scale 不动(坐标未改)。+4. **获益最大的型**:无。k-NN 均值缩小步长等价于降低有效 γ,与节点 18「γ 越大越好(1.2→2.8 单调升)」方向相反;稀疏型假设未兑现——aPHM(n_b/n_a=1.25)在 k=3/5 下无独立正向信号(组内 keep 数少,被全局 q=0.8 门主导)。 -每型 n_b/n_a 实测(PLAN 风险 1 的反面:绝大多数型 n_b ≫ n_a,机制**有大量操作空间**):NCC 0.76、Peri 9.29、V-CM 4.97、aPHM 1.25、pPHM 4.31;均值 4.11。共有型 a 侧合计 7115、b 侧 17338。+## 机制关闭对照与查分(A半 proxy,seed 0;节点正式分用 B半) -| 配置 | 型内 unique 坐标(融合前→后) | occ_max 均值 | a 细胞被用比例 | 未融合 | nn_dist_after | mean_disp |-|---|---|---:|---:|---:|---:|---:|-| cap=0(off,=节点19) | 3467.6 → **124.6** | — | — | 0 | 0.0 | 200.6 |-| cap=1 | 3467.6 → 3467.6 | 1.0 | 0.951 | 11062 (63.8%) | 124.6 | 148.5 |-| cap=2 | 3467.6 → 2709.6 | 2.0 | 0.847 | 8480 (48.9%) | 87.1 | 251.9 |-| cap=3 | 3467.6 → 2171.4 | 3.0 | 0.800 | 6263 (36.1%) | 59.6 | 299.2 |-| κ=1.0(cap_mean 4.60) | 3467.6 → **1167.2** | 4.6 | 0.887 | **0** | — | — |+off 对照 `T2HI_EXPR_K=1`(默认):与节点 21 输出走完全相同代码路径(`nnk_a` 不参与),实测默认运行与显式 k=1 运行 X 与坐标 np.array_equal;seed 0 重跑逐位一致(确定性验证)。A半分数 61.346 = 节点 21 的 61.346(复现)。 -即:机制确实消除了坐标坍缩(unique 位置 124.6 → 1167.2,κ=1 时零未融合;cap=1 时全部分开)。+| 配置 | A半榜分 | expr_change | cell_state | local | shape |+|---|---:|---:|---:|---:|---:|+| k=1, γ=2.8(off,提交态) | **61.346** | 67.82 | 66.13 | 57.81 | 53.62 |+| k=3, γ=2.8 | 61.36 | 67.82 | 65.87 | 57.81 | 53.62 |+| k=5, γ=2.8 | 61.27 | 67.86 | 65.89 | 57.70 | 53.62 |+| k=3, γ=3.2 | 61.38 | 68.22 | 65.87 | 57.80 | 53.62 |+| k=3, γ=3.6 | 61.34 | 68.06 | 65.81 | 57.88 | 53.62 |+| k=1, γ=3.2 | 61.44 | 68.16 | 66.08 | 57.89 | 53.62 |+| k=1, γ=3.6 | 61.37 | 67.87 | 66.03 | 57.96 | 53.62 |+| k=1, γ=4.0 | 61.34 | 67.75 | 65.97 | 58.03 | 53.62 |+| k=1, γ=2.5 | (k=3 γ=2.5:61.21) | 67.59 | 65.98 | 57.65 | 53.62 | -## 机制关闭对照与查分(A半,seed 0;节点正式分用 B半)+**结论:机制被证伪。** k=3 vs k=1 差 +0.01(<0.5,PLAN 风险 3 判无效);γ 联动补偿(k-NN 均值把步长缩到 0.87×,用更大 γ 补回)最好也只有 k=3 γ3.2 = +0.03。去噪方向本身无效:1-NN 单细胞靶点的「噪声」不是 expression_change 的瓶颈,k 近邻均值把过冲步长缩小反而抵消增益(与节点 18 γ 单调性一致)。k=1 γ=3.2 的 +0.09 亦在 seed 噪声内(seed 1 下 γ=2.8 本身即 61.55,波动 ±0.2),且 B 半不一定复现,不改默认。按 PLAN 决策规则提交 k=1(=父节点行为,逐位一致,零风险)。 -off 对照 `T2HI_CAP=0`:与节点 19 输出 **np.array_equal 验证 X 与坐标逐位一致**,分数复现 61.346(=节点19 的 61.346),四组分 expr 67.82 / cell_state 66.13 / shape 53.62 / local 57.81。+## 未验证 / 下一步 -| 配置 | 榜分 | expression_change | cell_state | local_spatial | shape_scale | 关键 metric |-|---|---:|---:|---:|---:|---:|---|-| off(cap=0,提交态) | **61.346** | 67.82 | 66.13 | 57.81 | 53.62 | neighborhood_mmd 0.07001, occ_dice 0.8285, d2_shape 0.03545, variogram 0.02829 |-| cap=1 | 59.785 | 64.99 | 66.05 | 54.69 | 53.41 | nb_mmd 0.07942↑, occ_dice 0.8398↑, d2_shape 0.03952↑, de_score 0.3696↓ |-| κ=1.0(零未融合) | 61.063 | 67.19 | 66.07 | **57.83** | 53.17 | nb_mmd 0.06997, occ_dice 0.8364↑, d2_shape 0.03960↑ |-| mutual=1(a 侧也向 b 位移,附带试验) | 61.364 | 67.82 | 66.13 | 57.94 | 53.57 | nb_mmd 0.06966, d2_shape 0.03581 |--四组分变化(κ=1 vs off):local_spatial **+0.02(噪声内)**、shape_scale −0.45、expression_change −0.63、cell_state −0.06。cap=1 vs off:local_spatial **−3.12**、expression −2.83。--**结论:PLAN 的机制假设被证伪。** 坐标坍缩(124.6 unique)不是 local_spatial 的瓶颈——把它彻底消除(κ=1,零未融合、unique×9.4)后 neighborhood_mmd 只从 0.07001 → 0.06997、local_spatial 57.81 → 57.83(+0.02 ≪ 噪声 2)。反而 occupancy_dice 上升(0.8285→0.8364)而 d2_shape 明显变差(0.03545→0.03960),两者相抵后 shape_scale 净降 0.45;表达侧因为配对变了、chg_l2 门控选中的细胞集不同而掉 0.63。cap=1 更差:64% 的 b 细胞退回 Procrustes 位置,neighborhood_mmd 恶化到 0.07942——**与节点 18「α_low<1 单调降分」同一方向:融合越彻底越好,任何削弱型内融合的改动都降分**。--按 PLAN 风险 2/3(capacity=1 降分则试 2;提升 <0.5 判无效):cap=1/2/3 与 κ=1 全部 ≤ off,故提交态取 `T2HI_CAP=0`,即节点 19 的行为,改动分数中性偏保守。--## 下一步(数据支持的)--1. local_spatial 的唯一正向信号是「更彻底的融合」:mutual=1(a 侧也向最近 b 位移)给出 local 57.94 / nb_mmd 0.06966,净 +0.02,仍在噪声内。若要继续攻该组分,应扫 mutual 的 α_a(a 侧位移系数)与「b→a 的 k-NN 质心融合」而不是配对拓扑。-2. shape_scale 的 d2_shape 与 occupancy_dice 对坐标重分配的反应**方向相反**,说明它不是单一可优化目标;scale_log_ratio 恒为 0.4669(RMS 由 bracket log 插值决定,proxy 上够不到真值),该组分基本是 mix 家族的结构性天花板,建议停止投入(与节点 11–19 一致)。-3. expression_change 对「哪些 b 细胞被融合」高度敏感(cap=1 时 de_score 0.4457→0.3696):门控量 chg_l2 依赖配对,配对一变选中集就变。若以后改配对,应把表达门控的 d 固定在原 1-NN 配对上以解耦。--## 验证过 / 未验证--- 已验证:off 与节点 19 逐位一致(X + 坐标);off 分数复现 61.346;seed 1 两次运行逐位一致(确定性);vec-check `ok`;cap/κ 全部诊断量;~2–21 s(cap=3 最慢 21 s,off 1.6 s)、峰值 <0.75 GB,远低于 limits(28 GB / 30 min)。-- 未验证:B半正式分(提交态输出与节点 19 逐位相同,预期 ≈61.79);真实括号(31 共有型、n_b/n_a 比值分布不同)上容量约束的效果——proxy 上机制方向已明确为负,未再花额度;κ<1 与 κ>1 的细网格(κ=1 已是零未融合的边界,κ>1 只会退回无约束)。--## 知识来源--未使用任何保留阶段/保留基因型信息、文献数值或外部数据(`external/`、`prior/` 未读)。所有统计量(型内 n_b/n_a、kNN、指派、分位数、RMS、PCA 轴)均由当次视图输入现场计算,不依赖视图路径或绝对时间(只用时间差 t),满足视图无关要求。生物学知识仅沿用父节点:细胞类型标签(输入 obs 自带)用于型内配对。+- 未验证:k-NN 靶点在真实 bracket(E8.25+E9.5→E8.75,31 个共有型、b 侧更密)上的行为——proxy 只有 5 个共有型且 a 侧稀疏(10570 抽样后),真实任务上 k 近邻的构成会不同;但 proxy 上方向为负,不值得消耗真实查分。+- 表达侧「改靶点构造」两条路(节点 20 逐细胞 β、本节点 k-NN 均值)都已证明在噪声内:expression_change ~68 可能是该门控混合结构在 proxy 上的平台。下一步若继续攻 expression,应改**混合的函数形式**(如对 keep 细胞做 a/b 表达的非线性重标定、或在 log 域混合),而不是继续调步长/靶点。+- local_spatial 唯一残余正向信号仍是 mutual 融合的 α_a 扫描(节点 21 next_suggestions 1),本节点未触碰坐标路径。+- 知识来源:无外部生物知识;全部为对已有底座的结构改动。diff --git a/solution/run.py b/solution/run.pyindex d0fa7a2..c476320 100644--- a/solution/run.py+++ b/solution/run.py@@ -170,6 +170,7 @@ def _blend_within_type(     rng: np.random.Generator | None = None,     capacity: int = 0,     cap_kappa: float = 0.0,+    expr_k: int = 1, ) -> tuple[np.ndarray, np.ndarray, dict]:     """Per-type NN coordinate fusion (family T2HI-04 blend) + optional     within-type calibrated dispersion (T2HI_DISP).@@ -198,6 +199,7 @@ def _blend_within_type(     }     nn_b_list: list[np.ndarray] = []     nn_a_list: list[np.ndarray] = []+    nnk_a_list: list[np.ndarray] = []     for lab in common:         idx_a = np.flatnonzero(la == lab)         idx_b = np.flatnonzero(lb == lab)@@ -229,6 +231,17 @@ def _blend_within_type(         sel_b = idx_b[placed]         nn_b_list.append(sel_b)         nn_a_list.append(idx_a[j[placed]])+        if expr_k > 1:+            n_pl = int(placed.sum())+            if n_pl:+                kq = int(min(expr_k, n_a_t))+                _, jk = cKDTree(pa[:, sl]).query(pb[placed][:, sl], k=kq)+                jk = np.asarray(jk, dtype=np.int64).reshape(n_pl, kq)+                pad = np.full((n_pl, expr_k), -1, dtype=np.int64)+                pad[:, :kq] = jk+                nnk_a_list.append(np.where(pad >= 0, idx_a[np.clip(pad, 0, None)], -1))+            else:+                nnk_a_list.append(np.empty((0, expr_k), dtype=np.int64))         disp_b = np.zeros_like(pb)         disp_b[placed] = 0.0         disp_b[placed, sl] = alpha * (pa[j[placed]][:, sl] - pb[placed][:, sl])@@ -270,6 +283,7 @@ def _blend_within_type(     stats["unfused_frac"] = float(stats["unfused"]) / max(stats["cells_fused"], 1)     stats["nn_b"] = np.concatenate(nn_b_list) if nn_b_list else np.empty(0, dtype=int)     stats["nn_a"] = np.concatenate(nn_a_list) if nn_a_list else np.empty(0, dtype=int)+    stats["nnk_a"] = np.concatenate(nnk_a_list) if nnk_a_list else np.empty((0, 0), dtype=int)     return out_a, out_b, stats  @@ -422,6 +436,12 @@ def main() -> None:     # each a-side cell may host at most T2HI_CAP b-side cells (0 = off, i.e.     # the original unconstrained 1-NN greedy of node 19). T2HI_CAP_KAPPA > 0     # sets a per-type capacity of ceil(kappa * n_b / n_a) instead.+    # k-NN expression target (family T2HI-01): with T2HI_EXPR_K = k > 1 the+    # blend target of each fused b cell becomes the mean expression of its k+    # nearest same-type a-side neighbours instead of the single 1-NN. The+    # chg_l2 gate keeps using the original 1-NN pair (decoupled, node-21+    # lesson 3). k = 1 is the mechanism-off control (= node 21 output).+    expr_k = int(os.environ.get("T2HI_EXPR_K", "1"))     cap_fixed = int(os.environ.get("T2HI_CAP", "0"))     cap_kappa = float(os.environ.get("T2HI_CAP_KAPPA", "0.0"))     disp_beta = float(os.environ.get("T2HI_BETA", "0.5"))@@ -437,7 +457,7 @@ def main() -> None:         blend_min = int(os.environ.get("T2HI_BLEND_MIN", "5"))         ca_s, cb_s, blend_info = _blend_within_type(             ca[ia], cb[ib], a.labels[ia], b.labels[ib], common, blend_alpha, blend_min, "3d",-            False, disp_beta, rng_disp, cap_fixed, cap_kappa,+            False, disp_beta, rng_disp, cap_fixed, cap_kappa, expr_k,         )         ca = ca.astype(np.float64, copy=True)         cb = cb.astype(np.float64, copy=True)@@ -450,7 +470,7 @@ def main() -> None:         cb_pre = cb.copy()         ca, cb, blend_info = _blend_within_type(             ca, cb, a.labels, b.labels, common, blend_alpha, blend_min, blend_axes, blend_mutual,-            disp_beta, rng_disp, cap_fixed, cap_kappa,+            disp_beta, rng_disp, cap_fixed, cap_kappa, expr_k,         )     if blend_info is not None:         blend_min = int(os.environ.get("T2HI_BLEND_MIN", "5"))@@ -504,7 +524,38 @@ def main() -> None:             else:                 keep = np.ones(d.shape, dtype=bool)             blended = Xb_f.copy()-            blended[keep] = Xb_f[keep] + gamma * diff[keep]+            nnk_a = blend_info.get("nnk_a")+            if expr_k > 1 and nnk_a is not None and np.size(nnk_a):+                # k-NN expression target: the blend target of each kept b cell+                # is the mean expression of its k nearest same-type a-side+                # neighbours; the chg_l2 gate (d) stays on the original 1-NN+                # pair, so the kept set is identical to the k=1 run.+                nnk = np.asarray(nnk_a)+                if blend_ref == "sampled":+                    nnk = np.where(nnk >= 0, ia[np.clip(nnk, 0, None)], -1)+                rows = np.flatnonzero(keep)+                nk = nnk[sel][keep]+                tgt = np.zeros((rows.size, Xb_f.shape[1]), dtype=np.float64)+                cnt = np.zeros(rows.size, dtype=np.float64)+                for jj in range(nk.shape[1]):+                    col = nk[:, jj]+                    m = col >= 0+                    if m.any():+                        tgt[m] += as_dense(a.X, col[m]).astype(np.float64)+                        cnt[m] += 1.0+                tgt /= np.maximum(cnt, 1.0)[:, None]+                diff_t = tgt - Xb_f[rows]+                blended[rows] = Xb_f[rows] + gamma * diff_t+                tgt_norm = float(np.linalg.norm(diff_t, axis=1).mean()) if rows.size else 0.0+                tgt_over_nn = (+                    float(np.linalg.norm(diff_t, axis=1).sum()+                          / max(np.linalg.norm(diff[keep], axis=1).sum(), 1e-12))+                    if rows.size else 0.0+                )+            else:+                blended[keep] = Xb_f[keep] + gamma * diff[keep]+                tgt_norm = float(np.linalg.norm(diff[keep], axis=1).mean()) if keep.any() else 0.0+                tgt_over_nn = 1.0             xb[pos[nn_b[sel]]] = blended.astype(np.float32)              # chg_l2-gated coordinate displacement (family T2HI-04 mechanism):@@ -556,6 +607,7 @@ def main() -> None:             chg = gamma * d             exprnn_info = {                 "gamma": gamma, "gate_q": gate_q, "gate_mode": gate_mode,+                "expr_k": expr_k, "tgt_norm": tgt_norm, "tgt_over_nn": tgt_over_nn,                 "cells_mixed": int(sel.sum()), "cells_kept": int(keep.sum()),                 "chg_mean": float(chg[keep].mean()) if keep.any() else 0.0,                 "chg_std": float(chg[keep].std()) if keep.any() else 0.0,@@ -617,7 +669,9 @@ def main() -> None:                   f"b_a_nn_after_disp={blend_info['disp_nn_after']:.1f}", flush=True)     if exprnn_info is not None:         print(f"[exprnn] gamma={exprnn_info['gamma']:.2f} gate_q={exprnn_info['gate_q']:.2f}"-              f"({exprnn_info['gate_mode']}) cells_fused={exprnn_info['cells_mixed']} "+              f"({exprnn_info['gate_mode']}) expr_k={exprnn_info['expr_k']} "+              f"tgt_norm={exprnn_info['tgt_norm']:.3f} tgt_over_nn={exprnn_info['tgt_over_nn']:.3f} "+              f"cells_fused={exprnn_info['cells_mixed']} "               f"cells_kept={exprnn_info['cells_kept']} "               f"chg_l2 kept mean={exprnn_info['chg_mean']:.3f} std={exprnn_info['chg_std']:.3f} "               f"min={exprnn_info['chg_min']:.3f} max={exprnn_info['chg_max']:.3f} "

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

用到的知识库条目

编号标题出处
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
k003Fused Gromov-Wasserstein mapping for spatial snapshots10.1038/s41586-024-08453-2

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

改了什么新增 T2HI_EXPR_K 开关:把被融合 b 细胞的表达混合靶点从空间 1-NN 单细胞改为同型 a 侧 k 近邻均值(chg_l2 门控仍固定原 1-NN 配对,keep 集不变)。proxy 上扫 k∈{1,3,5}×γ∈{2.5-4.0} 共 9 次查分后证伪,提交态取 k=1,输出与父节点 21 逐位一致,故榜分 61.79 零变化。
各组分数的变化cell_state:噪声内:66.87 → 66.87(+0.00);proxy 上 k=3 为 −0.26,方向为负
expression_change:噪声内:67.90 → 67.90(+0.00,提交态=父节点);proxy 上 k=3/5 与 γ 联动最大也只 +0.4,均在 seed 噪声内
local_spatial:不变:58.24 → 58.24(+0.00,坐标路径未触碰)
shape_scale:不变:54.15 → 54.15(+0.00,坐标路径未触碰)
family_idT2HI-01
假设是否成立否
经验
  1. 在该 chg_l2 门控混合结构下,把表达靶点从 1-NN 换成 k 近邻均值等价于把过冲步长缩到 ~0.87×,用 γ 补偿回来(k3γ3.2)也只有 +0.03,证明 1-NN 靶点噪声不是 expression_change 的瓶颈。
  2. k-NN 均值去噪与节点 18 观察到的 γ 单调升(1.2→2.8)方向矛盾:任何缩小有效步长的'去噪'都会抵消增益,两者是同一枚硬币。
  3. 节点 20(逐细胞自适应 β)与节点 23(k-NN 靶点)两条'调步长/换靶点'路线均在噪声内,expression_change ~68 大概率是该混合结构的平台。
  4. 把门控量与表达靶点解耦(chg_l2 固定原 1-NN 配对)是有效的实验设计:keep 集逐位不变,使 k 的效果可被干净归因。
  5. proxy 上方向明确为负时不消耗真实查分额度、直接提交 off 对照(=父节点)的策略有效,本节点零风险落地。
mechanism_active否
下一步建议
  1. expression_change 组:停止调步长/靶点,改混合的函数形式——在 log 域做 xb←xb+γ·(log_a − log_b) 混合,或对 keep 细胞做 a/b 表达的非线性重标定(如分位数映射)。
  2. local_spatial 组:扫 mutual 融合的 a 侧位移系数 α_a(节点 21/23 均指出这是该组唯一残余正向信号,proxy 上 mutual=1 给过 local +0.02)。
  3. shape_scale 组:d2_shape 与 occupancy_dice 对坐标重分配反应方向相反,是 mix 家族的结构性天花板,停止投入(与节点 11-23 一致)。

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

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

分析员

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

工程师

角色工程师 alibaba-token-plan-cn/qwen3.8-max
调用次数1 次
轮数37
工具调用共 40 次:bash 28、edit 9、read 2、write 1
用时15 分
token 数输入 70,227 · 输出 9,108 · 思考 10,193
任务(第一行)按计划修改程序:k-NN表达靶点替代1-NN:混合目标从单最近邻改为同型k近邻均值
最后的回答(摘录)
Done. Summary:

**做了什么**:按 PLAN 实现 T2HI-01 k-NN 表达靶点机制(`T2HI_EXPR_K`)——被融合 b 细胞的表达混合靶点从空间 1-NN 单细胞改为同型 a 侧 k 近邻均值,chg_l2 门控固定在原 1-NN 配对上(解耦,遵循节点 21 教训 3),含 `min(k, n_a)` 保护。

**查分结果**(A半 proxy,9 次查询):机制生效证据齐全(keep 集 455 逐位不变、tgt_norm 44.1→38.5、型内方差 ×0.71),但 k=3 vs k=1 仅 +0.01,k=5 −0.08,γ 联动补偿(k3γ3.2 +0.03、k1γ3.2 +0.09)全部在噪声内——**机制被证伪**:1-NN 靶点噪声不是 expression_change 瓶颈,k 近邻均值缩小过冲步长反而抵消增益。按 PLAN 决策规则提交 k=1 默认(与节点 21 输出逐位一致,确定性已验证,vec-check 通过,运行 ~2s)。

**下一步建议**:表达侧「调步长/换靶点」两条路(节点 20、23)均已到平台(~68);应改混合的函数形式(log 域混合或非线性重标定),或转攻 local_spatial 的 mutual α_a 扫描(唯一残余正向信号)。
原始记录位置/home/spark-longxinyang/vec/runs/formal/20261003-004922-search-t2-heart-interp-g24/nodes/23/engineer.jsonl 189 KB
/home/spark-longxinyang/vec/runs/formal/20261003-004922-search-t2-heart-interp-g24/nodes/23/engineer.stderr

调研员

角色调研员 alibaba-token-plan-cn/qwen3.8-max
调用次数1 次
轮数1
工具调用共 0 次:—
用时2 分
token 数输入 14,748 · 输出 985 · 思考 3,999
任务(第一行)为节点 n23(改进,父节点 n21)写改进计划 PLAN.json
最后的回答(摘录)
{
  "name": "k-NN表达靶点替代1-NN:混合目标从单最近邻改为同型k近邻均值",
  "motivation": "父节点21(=节点19)expression_change 67.90是四组中响应最活跃的组分(节点14→20累计+4.0),但当前混合靶点是单个空间1-NN的表达——在稀疏型(如aPHM n_b/n_a=1.25)中1-NN可能不是最佳表达参照。节点21 ANALYSIS明确建议'在保持原1-NN坐标配对不变的前提下只调表达侧'。节点20的逐细胞自适应β(+1.22 expression)方向正确但幅度在噪声边缘,说明需要改变靶点构造而非仅调系数。",
  "approach": "步骤:1) 在 _blend_within_type 中,坐标融合仍用空间1-NN(cKDTree query k=1),但表达混合靶点改为同型a侧k-NN均值:对每个被融合b细胞,取其同型a侧k个最近邻(cKDTree query k=k_expr),xa_target = mean(a侧k近邻表达)。2) 门控量chg_l2仍按原1-NN计算(||xa_1nn - xb||),保持门控选中集不变(解耦坐标配对与表达靶点,遵循节点21教训3)。3) 混合公式不变:xb ← xb + γ*(xa_target - xb),γ=2.8,q=0.8。4) 参数扫描:k_expr ∈ {1, 3, 5}(k=1即当前行为,为off对照);若k=3有效,再试γ ∈ {2.5, 2.8, 3.2}。5) 单输入阶段退路:t=0时copy_last,不触发混合,与现有fallback一致。6) vec-score快筛:先跑k=3 vs k=1的A半对比,差>1分再扫γ;否则直接提交k=1(=父节点)。时间预算:实现~10min,3次查分~3min,余量充足。",
  "expected_groups": ["expression_change", "cell_state"],
  "risks": "1) 型内表达异质性高时,k-NN均值可能模糊亚群信号,导致cell_state下降——Engineer应在k=3查分时同时看cell_state,若降>1则停止。2) 稀疏型(aPHM n_a仅~700)k=5可能超出型内细胞数——需min(k, n_a)保护。3) 预期提升可能<1分(噪声)——若k=3与k=1差<0.5,判无效,提交k=1(=父节点,零风险)。尽早发现:第一次vec-score即可判断方向。",
  "family_id": "T2HI-01",
  "mechanism": "将被融合b细胞的表达混合靶点从空间1-NN的单细胞表达替换为同型a侧k近邻(k=3)的均值表达,降低稀疏型中单最近邻的噪声敏感度,使过冲方向更稳健。",
  "vs_constant_shift": "混合靶点是逐细胞、依赖局部空间邻域的(每个b细胞的k-NN集合不同),混合量随chg_l2门控逐细胞开关,不是对整型施加同一向量;γ>1的过冲使输出超出a侧均值,不是简单回归均值。",
  "mechanism_evidence": "Engineer应报告:(1) k=3时实际被混合的细胞数与k=1是否一致(门控集不变);(2) 混合后型内表达方差(per-type std)k=3 vs k=1的比值;(3) expression_change和cell_state四组分各自变化;(4) 若k=3有效,列出获益最大的型(按型内n_a/n_b比排序验证稀疏型获益更多的假设)。",
  "mechanism_off_control": "T2HI_EXPR_K=1(默认)时,k-NN均值退化为1-NN本身,输出与父节点逐位一致(可用np.array_equal验证)。预期k=1分数=61.346(A半proxy),k≠1时expression_change应有±1方向变化。",
  "sources": []
}
原始记录位置/home/spark-longxinyang/vec/runs/formal/20261003-004922-search-t2-heart-interp-g24/nodes/23/researcher.jsonl 4 KB
/home/spark-longxinyang/vec/runs/formal/20261003-004922-search-t2-heart-interp-g24/nodes/23/researcher.stderr

审查员

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