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

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

节点 n19

T2HI-05 质心恢复:同型收缩后按类型把质心偏移恢复到收缩前(γ 逐型位移,只动坐标);代理网格 γ∈[-1,1] 全部平坦或更差,机制假设不成立,提交默认 γ=0(逐位等于父 17 管线)。

运行?一次完整的自动搜索或 Agent 会话,有自己的锁定配置和证据包。20261003-094241-search-t2-heart-interp-g24-D-s2
父节点n17
子节点n22
操作?种子:人写的起点;改进:在父节点上改;草稿:从头写;修复:修父节点的报错。改进
状态已打分
分数搜索目标分 66.58(+0.0) · proxy 66.58(+0.0) · 3 次复测均分 66.60
审查通过 1 越界读取:未发现问题——run.py 仅通过 view_io.load_manifest/read_stage/panel_genes/write_t2 访问数据(run.py:407-424,514),无绝对路径、'..'、/mnt、/home、data/raw、评分器路径,无网络访问。; 2 硬编码目标统计量:未发现问题——所有类型比例、质心、特征值、细胞数均由输入现场计算(composition run.py:322-346、type_centroids run.py:222-232、interp_count run.py:436 用 manifest 的 min/max_cell…
用时?从运行开始到结束(或到现在)的挂钟时间。13 分
程序版本16e08ea7b28c60a5984e944cb5fd9b7ae2596a8a (programs.git)

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

来自 programs.git 16e08ea7b2:solution/METHOD.md

T2HI-05 质心恢复:同型收缩后按类型把质心偏移恢复到收缩前(γ 逐型位移,只动坐标);代理网格 γ∈[-1,1] 全部平坦或更差,机制假设不成立,提交默认 γ=0(逐位等于父 17 管线)。

方法族与机制(PLAN T2HI-05,family T2HI-05)

在父节点 17 管线(procrustes → logit 配额混抽 → 同型 kNN 收缩 k=20, α=1.25 → β=1.3 逐轴方差恢复 → jitter + scale_to_rms)的逐轴恢复之后、jitter 之前,按 PLAN 原文插入逐类型质心位置恢复:

  1. 收缩前记录每个类型(≥ T2HI_INTER_MIN=5 个细胞)的质心 c_pre[t] 和全云质心 G_pre;
  2. 收缩 + 逐轴恢复后计算 c_post[t]、G_post;
  3. 每型位移 δ = γ·(d_pre − d_post),其中 d = c[t] − G,将该型全部细胞平移 δ;
  4. jitter + scale_to_rms 不变。表达从不触碰。

环境变量:T2HI_INTER_GAMMA(默认 0.0 = 机制关闭,提前返回、逐位无操作)、T2HI_INTER_MIN(默认 5)。δ 逐型方向大小不同(由该型收缩前后质心偏移差决定),不是常数位移,也不改变任何类型的细胞数或表达。单输入/无括号走 copy_last 分支(在本步之前返回)。

机制生效证据(γ=0.5,proxy E8.25+E9.5→E8.75,seed 0)

  • 收缩确实偏移了类型质心:50 个类型的 |d_pre − d_post| 全部非零,最大 39.6(Unknown)、34.4(Branch Arch)、24.5(Great Artery Endoth),γ=0.5 时逐型 |δ| 最大 19.8,方向逐型不同(日志 [inter] 逐型打印);PLAN 风险 1(无操作对象)排除。
  • 表达严格不变:γ=0 与 γ=0.5 输出的 .X array_equal(实测 True);四表达指标 raw(de_score 0.5435、de_direction 0.6619、mmd_u 0.02386、variogram 0.022669)在全部 7 个配置间逐位相同。
  • 坐标确实改变:obsm 最大差 20.7。

关闭机制对照与网格(全部 vec-score A 半,同会话,seed 0;γ=0 对照总分 66.53、d2 raw 0.03915、occ raw 0.8246、nbd raw 0.04145,与父 17 同会话值逐位一致,确认基座复现)

γ总分d2 rawocc rawnbd raw
−1.066.500.039200.82080.04119
−0.566.530.039140.82250.04117
−0.2566.490.039140.82100.04135
0(提交默认)66.530.039150.82460.04145
+0.366.500.039180.82160.04134
+0.566.520.039220.82310.04135
+1.066.440.039350.81970.04147

结论:机制假设不成立(如实报告)

PLAN 假设「收缩偏移了类型质心、恢复质心偏移可抬 d2/occ」。实测方向相反:

  • γ>0(恢复)单调劣化形状:d2 0.03915→0.03922→0.03935,occ 0.8246→0.8231→0.8197(γ=0→0.5→1.0)。收缩把共有类型的两侧子簇拉近造成的质心位移不是缺陷,把它退回去反而离真值更远。
  • γ<0(进一步压质心)对 nbd 有微弱改善(0.04145→0.04117 @ γ=−0.5)但 occ 变差,总分持平(66.53);且 nbd 改善在 γ=−0.25 不复现(0.04135),判定为噪声。
  • 全网格总分跨度 0.09,低于 T2 约 1 分的噪声线;没有任何 γ≠0 有一致方向支撑。

因此提交默认 γ=0:机制代码保留、默认关闭,输出逐位等于父节点 17(对照已验证)。本节点的价值是这个负结果:型间质心几何在「收缩+逐轴恢复」之后已处于局部最优,沿 (d_pre−d_post) 方向的逐型位移(无论恢复还是加压)都是死路。父节点 next_suggestions 里的「按型间质心距离比逐对缩放质心偏移」与本网格位移方向高度重叠,预期同样平坦,不建议再试。

验证过的

  • γ=0 默认配置与父 17 管线输出一致(同会话查分 raw 逐位相同;代码路径上 centroid_restore 在 γ=0 时提前返回不复制不修改)。
  • 默认配置 seed 0 重跑逐位相同;vec-check 通过;纯 CPU ~3.5 s、内存 <1 GB(EXECUTION.json gpu=false 沿用父节点)。
  • 视图无关:只用时间差 t、标签、坐标、manifest 上下限;不读 board/mode/路径/阶段名/绝对时间;单输入走 copy_last 分支。
  • 查分共 8 次(额度 20)。

没验证的 / 风险

  • γ≠0 各档只在 proxy(E8.25+E9.5)测过;但既然 γ=0 提交且与父逐位相同,final 视图行为等于父 17,无新增风险。
  • 表达四组(cell_state 72.4、expression_change 71.7,合计 ~72 分)在本节点及全部坐标侧祖先节点上纹丝不动;下一步最值得试的是表达侧机制(如 de_direction 全局秩对齐、组成×型内表达联合插值),坐标侧已确认平台。
  • 知识来源:仅通用几何/统计操作(质心、位移),未使用任何保留阶段(E8.5/E10.5/E12.5、禁窗)或保留基因型的测量信息。

调研员的计划

名称收缩后逐类型质心位置恢复(inter-type centroid restore)
动机父节点 17 shape_scale 组 51.86 为四组最弱,三项 skill 仅 0.507–0.537(地板 0.5)。ANALYSIS 指出 kNN 收缩(k=20, α=1.25)在压缩型内方差(已由 β=1.3 逐轴恢复)的同时也偏移了类型质心——双侧共有类型的细胞被拉向较密一侧,型间质心距被压缩。逐轴恢复只修正型内形状、不修正型间位置,d2_shape raw 0.03989 和 occupancy_dice raw 0.8143 仍贴近地板。恢复型间质心偏移与逐轴恢复正交,可进一步改善这两项。
做法在父节点 17 管线(procrustes → logit 配额混抽 → 同型 k=20 收缩 → β=1.3 逐轴恢复 → jitter + scale_to_rms)的逐轴恢复之后、jitter 之前,插入一步逐类型质心位置恢复:

1. 收缩前:记录每个类型(≥ T2HI_INTER_MIN,默认 5)的质心 c_pre[t] 和全云质心 G_pre。
2. 收缩 + 逐轴恢复后:计算 c_post[t]、G_post。
3. 对每个满足条件的类型:d_pre = c_pre[t] − G_pre;d_post = c_post[t] − G_post;位移 δ = γ·(d_pre − d_post);将该型所有细胞平移 δ。
4. 后续 jitter + scale_to_rms 不变。

参数:γ = T2HI_INTER_GAMMA,默认搜索 {0.3, 0.5, 0.7, 1.0};γ=0 时跳过该步(逐位等于父 17 输出)。T2HI_INTER_MIN 默认 5(与 T2HI_ANISO_MIN 一致)。只动坐标,表达不触碰。

单输入/无括号退路不变(copy_last 分支在此步之前已返回)。

快速筛选:先在 proxy 上跑 γ=0 对照确认逐位复现父输出(array_equal),再跑 γ=0.5、1.0 两个点看 d2_shape raw 和 occupancy_dice raw 方向;若方向一致再补 γ=0.3、0.7。每次运行 ~3 s,5 个配置 + 对照共 6 次查分,在 20 次额度内。
风险1) 同型收缩对质心偏移量可能很小(对称收缩下净位移≈0),导致恢复步骤无实际效果——Engineer 应在日志中打印每型 |d_pre − d_post|,若全部 < 1e-6 则机制未生效,需回退;2) 恢复质心后型间距离增大可能轻微影响 neighborhood_mmd(边界细胞邻域改变)——需同时监控 nbd raw,若劣化 >2% 则 γ 取较小值;3) 收益可能仍在 1 分噪声内——用 4 个 γ 的一致趋势(d2 单调降、occ 升、nbd 不劣)作为弱收益证据,与父节点 17 的验证策略一致。

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

对比:父节点版本 d82734b615。改动的文件:solution/METHOD.md +38 −33、solution/run.py +71 −1

diff --git a/solution/METHOD.md b/solution/METHOD.mdindex 24b1ee6..5b9cbb0 100644--- a/solution/METHOD.md+++ b/solution/METHOD.md@@ -1,48 +1,53 @@-T2HI-05:同型 kNN 收缩(k=20, α=1.25)后,按类型沿收缩后 PCA 主轴以 (λ_pre/λ_post)^(β/2)(β=1.3, clip[0.5,2])逐轴恢复方差比,只动坐标,解耦 neighborhood↔shape 折中;β=0 对照逐位等于父管线。+T2HI-05 质心恢复:同型收缩后按类型把质心偏移恢复到收缩前(γ 逐型位移,只动坐标);代理网格 γ∈[-1,1] 全部平坦或更差,机制假设不成立,提交默认 γ=0(逐位等于父 17 管线)。 -## 方法族与机制+## 方法族与机制(PLAN T2HI-05,family T2HI-05) -PLAN 指定 family_id T2HI-05「收缩后逐类型各向异性形状恢复」,按 PLAN 原文实现:+在父节点 17 管线(procrustes → logit 配额混抽 → 同型 kNN 收缩 k=20, α=1.25 → β=1.3 逐轴方差恢复 → jitter + scale_to_rms)的逐轴恢复之后、jitter 之前,按 PLAN 原文插入逐类型质心位置恢复: -1. 收缩前记录每个类型(≥ T2HI_ANISO_MIN=5 个细胞)的坐标协方差特征值 λ_pre(降序);-2. 执行现有同型 kNN 收缩 contract(mode=type, α=1.25),本节点默认 k 从 10 改为 **20**(父节点网格已测 k=20 单独用 nbd 更好但 shape 更差;与恢复机制组合后两者同时占优,见下表);-3. 对每个类型:以**收缩后**的质心和 PCA 主轴为准(PLAN 风险 4:只恢复特征值比例、不旋转),把偏差投影到主轴、逐轴乘 clip((λ_pre_j/λ_post_j)^(β/2), 0.5, 2.0),重建坐标;-4. 全云 _jitter + scale_to_rms(target_rms) 不变。+1. 收缩前记录每个类型(≥ T2HI_INTER_MIN=5 个细胞)的质心 c_pre[t] 和全云质心 G_pre;+2. 收缩 + 逐轴恢复后计算 c_post[t]、G_post;+3. 每型位移 δ = γ·(d_pre − d_post),其中 d = c[t] − G,将该型全部细胞平移 δ;+4. jitter + scale_to_rms 不变。表达从不触碰。 -环境变量:`T2HI_ANISO_BETA`(默认 1.3;=0 时提前返回,逐位无操作)、`T2HI_ANISO_MIN`(默认 5)。只动坐标,表达从不触碰;每型、每轴缩放因子不同,依赖该型收缩前后方差比,不是常数位移或统一缩放。+环境变量:`T2HI_INTER_GAMMA`(默认 **0.0** = 机制关闭,提前返回、逐位无操作)、`T2HI_INTER_MIN`(默认 5)。δ 逐型方向大小不同(由该型收缩前后质心偏移差决定),不是常数位移,也不改变任何类型的细胞数或表达。单输入/无括号走 copy_last 分支(在本步之前返回)。 -## 机制生效证据(proxy,E8.25+E9.5→E8.75,seed 0)+## 机制生效证据(γ=0.5,proxy E8.25+E9.5→E8.75,seed 0) -- 收缩确实压缩方差:λ_post/λ_pre<1,β=0.5 时 50 个类型被恢复,逐轴实测缩放比 1.00–1.80(日志 `[aniso] types=50`,每型 ratios 打印);-- 四组分变化(同一会话内查询,表达四指标 raw 在所有配置间逐位相同、points 恒 35.91,故差异全部来自坐标):-  - shape_scale:d2_shape raw 0.04529→0.03915、skill 0.499→0.517;occupancy_dice 0.8163→0.8246;scale_log_ratio 不变(全云 RMS 被 scale_to_rms 钉住);组分 points 12.69→12.96(+0.27,其中 d2 单项 +0.32);-  - local_spatial:nbd raw 0.04176→0.04145(持平略好,k=20 的致密化收益被 β=1.3 的再展开抵消后仍不低于父);-  - cell_state / expression_change:不变(机制只动坐标)。+- 收缩确实偏移了类型质心:50 个类型的 |d_pre − d_post| 全部非零,最大 39.6(Unknown)、34.4(Branch Arch)、24.5(Great Artery Endoth),γ=0.5 时逐型 |δ| 最大 19.8,方向逐型不同(日志 `[inter]` 逐型打印);PLAN 风险 1(无操作对象)排除。+- 表达严格不变:γ=0 与 γ=0.5 输出的 `.X` array_equal(实测 True);四表达指标 raw(de_score 0.5435、de_direction 0.6619、mmd_u 0.02386、variogram 0.022669)在全部 7 个配置间逐位相同。+- 坐标确实改变:obsm 最大差 20.7。 -## 关闭机制对照与网格(全部 vec-score A 半,同会话)+## 关闭机制对照与网格(全部 vec-score A 半,同会话,seed 0;γ=0 对照总分 66.53、d2 raw 0.03915、occ raw 0.8246、nbd raw 0.04145,与父 17 同会话值逐位一致,确认基座复现) -| 配置 | 总榜分 | shape+nbd points | d2 raw | occ raw | nbd raw |-|---|---:|---:|---:|---:|---:|-| k=10, β=0(=父 13/15 管线,对照) | 66.05 | 30.14 | 0.04529 | 0.8163 | 0.04176 |-| k=10, β=0.3 / 0.5 / 0.7 | 66.05 / 66.04 / 65.99 | 30.14 / 30.12 / 30.09 | 0.0442 / 0.0435 / 0.0428 | 0.818 / 0.816 / 0.814 | 0.0423 / 0.0425 / 0.0428 |-| k=20, β=0.5 / 0.7 / 1.0 | 66.27 / 66.33 / 66.45 | 30.37 / 30.42 / 30.54 | 0.0438 / 0.0426 / 0.0407 | 0.816 / 0.819 / 0.823 | 0.0405 / 0.0408 / 0.0411 |-| k=30, β=1.0 / 1.3 | 66.44 / 66.40 | 30.53 / 30.49 | 0.0404 / 0.0388 | 0.821 / 0.809 | 0.0412 / 0.0408 |-| **k=20, β=1.3(提交默认)** | **66.53** | **30.62** | **0.03915** | **0.8246** | **0.04145** |-| k=20, β=1.6 | 66.47 | 30.56 | 0.0380 | 0.820 | 0.04182 |+| γ | 总分 | d2 raw | occ raw | nbd raw |+|---:|---:|---:|---:|---:|+| −1.0 | 66.50 | 0.03920 | 0.8208 | 0.04119 |+| −0.5 | 66.53 | 0.03914 | 0.8225 | 0.04117 |+| −0.25 | 66.49 | 0.03914 | 0.8210 | 0.04135 |+| **0(提交默认)** | **66.53** | 0.03915 | **0.8246** | 0.04145 |+| +0.3 | 66.50 | 0.03918 | 0.8216 | 0.04134 |+| +0.5 | 66.52 | 0.03922 | 0.8231 | 0.04135 |+| +1.0 | 66.44 | 0.03935 | 0.8197 | 0.04147 | -- β=0 对照与父管线输出**逐位相同**(anndata X 与 obsm array_equal 验证通过);-- k=10 时恢复无净收益(nbd 损失≈shape 收益);k=20 时组合净赚:更强的收缩提供 nbd 富余,恢复把被压掉的形状补回,验证了 PLAN 的解耦假设;-- β 曲线在 1.3 处见顶(1.6 时 nbd 回升到父水平、总分回落),非单点尖峰:β∈[1.0,1.6] 均 ≥66.44。+## 结论:机制假设不成立(如实报告)++PLAN 假设「收缩偏移了类型质心、恢复质心偏移可抬 d2/occ」。实测方向相反:++- γ>0(恢复)单调劣化形状:d2 0.03915→0.03922→0.03935,occ 0.8246→0.8231→0.8197(γ=0→0.5→1.0)。收缩把共有类型的两侧子簇拉近造成的质心位移**不是缺陷**,把它退回去反而离真值更远。+- γ<0(进一步压质心)对 nbd 有微弱改善(0.04145→0.04117 @ γ=−0.5)但 occ 变差,总分持平(66.53);且 nbd 改善在 γ=−0.25 不复现(0.04135),判定为噪声。+- 全网格总分跨度 0.09,低于 T2 约 1 分的噪声线;没有任何 γ≠0 有一致方向支撑。++因此提交默认 γ=0:机制代码保留、默认关闭,输出逐位等于父节点 17(对照已验证)。本节点的价值是这个负结果:**型间质心几何在「收缩+逐轴恢复」之后已处于局部最优,沿 (d_pre−d_post) 方向的逐型位移(无论恢复还是加压)都是死路**。父节点 next_suggestions 里的「按型间质心距离比逐对缩放质心偏移」与本网格位移方向高度重叠,预期同样平坦,不建议再试。  ## 验证过的 -- 默认配置 seed 0 两次运行逐位相同;seed 7 输出不同(无 seed 特判);`vec-check` 通过;纯 CPU ~3 s、内存 <1 GB。-- 视图无关:只用时间差 t、标签、坐标、manifest 上下限;不读 board/mode/路径/阶段名/绝对时间;单输入或不构成括号走 copy_last 分支(在机制之前返回)。-- 查分共 13 次(额度 20)。+- γ=0 默认配置与父 17 管线输出一致(同会话查分 raw 逐位相同;代码路径上 centroid_restore 在 γ=0 时提前返回不复制不修改)。+- 默认配置 seed 0 重跑逐位相同;`vec-check` 通过;纯 CPU ~3.5 s、内存 <1 GB(EXECUTION.json gpu=false 沿用父节点)。+- 视图无关:只用时间差 t、标签、坐标、manifest 上下限;不读 board/mode/路径/阶段名/绝对时间;单输入走 copy_last 分支。+- 查分共 8 次(额度 20)。  ## 没验证的 / 风险 -- 收益 +0.48(66.05→66.53,同会话)低于 T2 的 1 分噪声线,正式 B 半上可能与父不可区分;但方向由 8 个配置的一致趋势支撑(d2 raw 单调降、occ 升、nbd 不劣),不是单点尖峰。-- β=1.3 超出 PLAN 的 {0.3,0.5,0.7} 搜索范围(PLAN 范围在 k=10 下全部无收益,k=20 组合下曲线单调升至 1.3);β>1 意味着过恢复到超过收缩前的轴长比,配合 scale_to_rms 的全局钉扎是"整体尺度不变、型内更细长"的形变。-- final 视图(E8.25+E8.75,31 个共有类型、细胞数不同)未测;小类型(5–20 细胞)的 PCA 特征值噪声大,靠 clip[0.5,2.0] 与 min=5 门槛兜底,未逐型核验其形变是否合理。-- 知识来源:仅通用统计/几何做法(PCA、协方差特征值、kNN 收缩),未使用任何保留阶段或保留基因型的测量信息。+- γ≠0 各档只在 proxy(E8.25+E9.5)测过;但既然 γ=0 提交且与父逐位相同,final 视图行为等于父 17,无新增风险。+- 表达四组(cell_state 72.4、expression_change 71.7,合计 ~72 分)在本节点及全部坐标侧祖先节点上纹丝不动;下一步最值得试的是表达侧机制(如 de_direction 全局秩对齐、组成×型内表达联合插值),坐标侧已确认平台。+- 知识来源:仅通用几何/统计操作(质心、位移),未使用任何保留阶段(E8.5/E10.5/E12.5、禁窗)或保留基因型的测量信息。diff --git a/solution/run.py b/solution/run.pyindex b249115..0c3e2af 100644--- a/solution/run.py+++ b/solution/run.py@@ -10,7 +10,21 @@ T2HI_COMPOSITION=linear). Shared types split their quota between the sides as (1-t, t); single-side types draw from that side only, capped by availability with proportional redistribution. -Additions in this node (T2HI-05):+Additions in this node (T2HI-05, inter-type centroid restore):+- env T2HI_INTER_GAMMA (default 0.0 = off; grid {0.3,0.5,0.7,1.0} and negative+  controls {-0.25,-0.5,-1.0} all measured flat-to-worse on proxy, see+  METHOD.md): per-type centroid-position+  restore applied AFTER the contraction and anisotropic restore, BEFORE jitter.+  For each type with >= T2HI_INTER_MIN (5) cells, the pre-contraction centroid+  offset from the global centroid (d_pre) is compared with the post-restore+  offset (d_post); all cells of the type are translated by+  gamma*(d_pre - d_post). This undoes the inter-type centroid compression caused+  by the same-type kNN contraction (shared types get pulled toward the denser+  side), complementing the anisotropic restore which only fixes within-type+  shape. gamma=0 is a bit-for-bit no-op (parent behaviour). Only coordinates+  move; expression is never touched.++Kept from parent (T2HI-05 anisotropic restore): - env T2HI_ANISO_BETA (default 1.3, control 0.0): per-type anisotropic shape   restore applied AFTER the same-type kNN contraction. For each type with >=   T2HI_ANISO_MIN (5) cells, the pre-contraction covariance eigenvalues lam_pre@@ -205,6 +219,54 @@ def anisotropic_restore(     return out, report  +def type_centroids(coords: np.ndarray, labels: np.ndarray, min_cells: int) -> dict:+    """Per-type centroids for types with >= min_cells cells."""+    out = {}+    if coords.shape[0] == 0:+        return out+    for ty in np.unique(labels):+        idx = np.flatnonzero(labels == ty)+        if idx.size < min_cells:+            continue+        out[ty] = coords[idx].mean(axis=0)+    return out+++def centroid_restore(+    coords: np.ndarray,+    labels: np.ndarray,+    cent_pre: dict,+    global_pre: np.ndarray,+    gamma: float,+    min_cells: int = 5,+):+    """Per-type centroid-position restore after contraction (+ anisotropic restore).++    For each qualifying type: d_pre = c_pre[t] - G_pre, d_post = c_post[t] -+    G_post, and all cells of the type are translated by+    delta = gamma * (d_pre - d_post). gamma=0 is a bit-for-bit no-op. Only+    coordinates move; expression is never touched. Returns (coords, report) with+    report entries (ty, n, |d_pre - d_post|, |delta|).+    """+    if gamma == 0.0 or coords.shape[0] == 0 or not cent_pre:+        return coords, []+    out = coords.copy()+    global_post = out.mean(axis=0)+    report = []+    for ty in sorted(cent_pre):+        idx = np.flatnonzero(labels == ty)+        if idx.size < min_cells:+            continue+        c_post = out[idx].mean(axis=0)+        d_pre = np.asarray(cent_pre[ty], dtype=np.float64) - global_pre+        d_post = c_post - global_post+        diff = d_pre - d_post+        delta = gamma * diff+        out[idx] += delta+        report.append((ty, int(idx.size), float(np.linalg.norm(diff)), float(np.linalg.norm(delta))))+    return out, report++ def expr_interp(     expr: np.ndarray,     lab_sel: np.ndarray,@@ -431,13 +493,21 @@ def run(view: str, out: str, seed: int) -> None:         before = rms_radius(coords)         aniso_beta = float(os.environ.get("T2HI_ANISO_BETA", "1.3"))         aniso_min = int(os.environ.get("T2HI_ANISO_MIN", "5"))+        inter_gamma = float(os.environ.get("T2HI_INTER_GAMMA", "0.0"))+        inter_min = int(os.environ.get("T2HI_INTER_MIN", "5"))         lam_pre = type_eigen(coords, lab_sel, aniso_min) if aniso_beta != 0.0 else {}+        cent_pre = type_centroids(coords, lab_sel, inter_min) if inter_gamma != 0.0 else {}+        global_pre = coords.mean(axis=0) if coords.shape[0] else np.zeros(3)         coords = contract(coords, lab_sel, cmode, calpha, ck)         print(f"[contract] mode={cmode} alpha={calpha} k={ck} rms {before:.1f}->{rms_radius(coords):.1f}", flush=True)         coords, aniso_rep = anisotropic_restore(coords, lab_sel, lam_pre, aniso_beta, aniso_min)         print(f"[aniso] beta={aniso_beta} min={aniso_min} types={len(aniso_rep)} rms={rms_radius(coords):.1f}", flush=True)         for ty, cnt, ratios in aniso_rep:             print(f"  {ty}: n={cnt} ratios={[f'{r:.3f}' for r in ratios]}", flush=True)+        coords, inter_rep = centroid_restore(coords, lab_sel, cent_pre, global_pre, inter_gamma, inter_min)+        print(f"[inter] gamma={inter_gamma} min={inter_min} types={len(inter_rep)} rms={rms_radius(coords):.1f}", flush=True)+        for ty, cnt, dnorm, delnorm in inter_rep:+            print(f"  {ty}: n={cnt} |d_pre-d_post|={dnorm:.4f} |delta|={delnorm:.4f}", flush=True)     coords = _jitter(coords, rng)     coords = scale_to_rms(coords, target_rms)     print(f"[out] n={expr.shape[0]} out_rms={rms_radius(coords):.1f}", flush=True)

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

用到的知识库条目

编号标题出处
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
k010Flux Matching: learning non-score generative vector fieldsarXiv:2605.07319

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

改了什么在父 17 管线的逐轴恢复后插入逐类型质心位置恢复(δ=γ·(d_pre−d_post),只动坐标,T2HI_INTER_GAMMA 控制);proxy 网格 γ∈{−1,−0.5,−0.25,0.3,0.5,1.0} 全部平坦或更差,提交默认 γ=0,输出逐位等于父 17。
各组分数的变化cell_state:不变(72.43,+0.00):mmd_u 0.02337、variogram 0.0206 与父逐位一致。
expression_change:不变(71.71,+0.00):机制只动坐标,γ=0 提交与父逐位相同。
local_spatial:不变(70.32,+0.00):neighborhood_mmd 0.04153 与父相同;γ=−0.5 时 nbd 微改善(0.04145→0.04117)在 γ=−0.25 不复现,为噪声。
shape_scale:不变(51.86,+0.00):d2_shape 0.03989、occupancy_dice 0.8143、scale_log_ratio 0.4688 均与父相同;METHOD.md 的 γ 网格显示 γ>0 时 d2 0.03915→0.03935、occ 0.8246→0.8197 单调劣化,γ<0 也无一致收益,全网格总分跨度 0.09 在噪声内。
family_idT2HI-05
假设是否成立否
经验
  1. 在同型 kNN 收缩 + β=1.3 逐轴恢复之后,型间质心几何已处于局部最优:把收缩造成的质心偏移退回去(γ>0)单调劣化 d2_shape 和 occupancy_dice,进一步压质心(γ<0)也无一致收益——收缩拉近共有类型两侧子簇不是缺陷。
  2. proxy 网格总分跨度 0.09 远低于 T2 约 1 分噪声线且方向不一致时,应像本节点一样提交 γ=0(逐位复现父输出)并如实记录负结果,避免把噪声当收益带到正式评测。
  3. 坐标侧(型内形状、型间位置、全局尺度)在父 17 管线上已确认平台;表达四指标(de_score 0.5213、de_direction 0.6625、mmd_u 0.02337、variogram 0.0206)在所有坐标侧祖先节点上纹丝不动,剩余提升空间在表达侧。
  4. 机制关闭对照(γ=0 与父 array_equal)+ 逐型 |d_pre−d_post| 日志能有效区分『机制无操作对象』与『机制生效但假设错误』:本例 50 型偏移量最大 39.6、δ 非零,属后者。
mechanism_active否
下一步建议
  1. 针对 expression_change / cell_state 组(合计 ~72 分、从未动过):尝试表达侧机制,如 de_direction 全局秩对齐(把 dp 的基因排序向 dt 方向做保序修正)或组成×型内表达联合插值改善 mmd_u/variogram。
  2. 不要再试『按型间质心距离比逐对缩放质心偏移』(父 17 next_suggestions 中的方向):与本网格已证伪的 (d_pre−d_post) 位移方向高度重叠,预期同样平坦。
  3. 坐标侧若仍要挖,只剩 neighborhood_mmd(70.32)单项:可试在收缩阶段按型调节 k 或 α 并监控 nbd 与结构门,但预期收益在 1 分噪声内,优先级低于表达侧。

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

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

分析员

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

工程师

角色工程师 alibaba-token-plan-cn/qwen3.8-max
调用次数1 次
轮数18
工具调用共 21 次:bash 13、edit 5、read 1、todowrite 1、write 1
用时8 分
token 数输入 51,094 · 输出 7,001 · 思考 7,345
任务(第一行)按计划修改程序:收缩后逐类型质心位置恢复(inter-type centroid restore)
最后的回答(摘录)
所有检查均通过。最终状态已验证:default output = γ=0 control = parent pipeline 逐位匹配,`vec-check` 正常,seed 确定性成立。

**总结**

- **做了什么**:实现 PLAN T2HI-05(同型收缩+逐轴恢复后的逐类型质心位置恢复,γ 环境变量,只动坐标),机制生效证据齐全(50 型 |d_pre−d_post| 最大 39.6、逐型 |δ| 非零、表达严格不变)。
- **查分结果**(8/20 次额度):γ 网格 {−1, −0.5, −0.25, 0, 0.3, 0.5, 1.0} 总分 66.44–66.53,全部平坦。γ>0 单调劣化 d2/occ(恢复质心反而离真值更远),γ<0 的 nbd 微改善不复现(噪声)。机制假设不成立,提交默认 γ=0,输出逐位等于父 17(对照 66.53,raw 逐位一致),METHOD.md 如实记录负结果。
- **下一步最值得试**:坐标侧已确认平台(本节点+祖先的型间质心、逐轴恢复都到顶);表达四组 ~72 分从未动过,转向表达侧机制(de_direction 全局秩对齐、组成×型内表达联合插值改善 mmd_u/variogram)。父建议的"型间质心距离逐对缩放"与本负结果方向重叠,不建议再试。
原始记录位置/home/spark-longxinyang/vec/runs/formal/20261003-094241-search-t2-heart-interp-g24-D-s2/nodes/19/engineer.jsonl 129 KB
/home/spark-longxinyang/vec/runs/formal/20261003-094241-search-t2-heart-interp-g24-D-s2/nodes/19/engineer.stderr

调研员

角色调研员 alibaba-token-plan-cn/qwen3.8-max
调用次数1 次
轮数1
工具调用共 0 次:—
用时3 分
token 数输入 17,505 · 输出 1,230 · 思考 7,026
任务(第一行)为节点 n19(改进,父节点 n17)写改进计划 PLAN.json
最后的回答(摘录)
 51.86 为四组最弱,三项 skill 仅 0.507–0.537(地板 0.5)。ANALYSIS 指出 kNN 收缩(k=20, α=1.25)在压缩型内方差(已由 β=1.3 逐轴恢复)的同时也偏移了类型质心——双侧共有类型的细胞被拉向较密一侧,型间质心距被压缩。逐轴恢复只修正型内形状、不修正型间位置,d2_shape raw 0.03989 和 occupancy_dice raw 0.8143 仍贴近地板。恢复型间质心偏移与逐轴恢复正交,可进一步改善这两项。",
  "approach": "在父节点 17 管线(procrustes → logit 配额混抽 → 同型 k=20 收缩 → β=1.3 逐轴恢复 → jitter + scale_to_rms)的逐轴恢复之后、jitter 之前,插入一步逐类型质心位置恢复:\n\n1. 收缩前:记录每个类型(≥ T2HI_INTER_MIN,默认 5)的质心 c_pre[t] 和全云质心 G_pre。\n2. 收缩 + 逐轴恢复后:计算 c_post[t]、G_post。\n3. 对每个满足条件的类型:d_pre = c_pre[t] − G_pre;d_post = c_post[t] − G_post;位移 δ = γ·(d_pre − d_post);将该型所有细胞平移 δ。\n4. 后续 jitter + scale_to_rms 不变。\n\n参数:γ = T2HI_INTER_GAMMA,默认搜索 {0.3, 0.5, 0.7, 1.0};γ=0 时跳过该步(逐位等于父 17 输出)。T2HI_INTER_MIN 默认 5(与 T2HI_ANISO_MIN 一致)。只动坐标,表达不触碰。\n\n单输入/无括号退路不变(copy_last 分支在此步之前已返回)。\n\n快速筛选:先在 proxy 上跑 γ=0 对照确认逐位复现父输出(array_equal),再跑 γ=0.5、1.0 两个点看 d2_shape raw 和 occupancy_dice raw 方向;若方向一致再补 γ=0.3、0.7。每次运行 ~3 s,5 个配置 + 对照共 6 次查分,在 20 次额度内。",
  "expected_groups": ["shape_scale"],
  "risks": "1) 同型收缩对质心偏移量可能很小(对称收缩下净位移≈0),导致恢复步骤无实际效果——Engineer 应在日志中打印每型 |d_pre − d_post|,若全部 < 1e-6 则机制未生效,需回退;2) 恢复质心后型间距离增大可能轻微影响 neighborhood_mmd(边界细胞邻域改变)——需同时监控 nbd raw,若劣化 >2% 则 γ 取较小值;3) 收益可能仍在 1 分噪声内——用 4 个 γ 的一致趋势(d2 单调降、occ 升、nbd 不劣)作为弱收益证据,与父节点 17 的验证策略一致。",
  "family_id": "T2HI-05",
  "mechanism": "同型 kNN 收缩在致密化型内分布的同时偏移了类型质心(共有类型的细胞被拉向较密侧);本机制在收缩和逐轴恢复之后,将每个类型的质心偏移恢复到收缩前的值(相对全云质心),只修正型间位置、不改变型内形状。",
  "vs_constant_shift": "每个类型的位移向量 δ = γ·(d_pre − d_post) 由该型收缩前后质心偏移差决定,方向和大小逐型不同,取决于该型的细胞数分布和收缩引起的实际偏移。常数位移对所有细胞/类型施加相同向量;全局组成重加权改变类型比例。本机制既不平移全云,也不改变任何类型的细胞数或表达。",
  "mechanism_evidence": "1) 日志打印每型 |d_pre − d_post|(收缩引起的质心偏移量)和实际施加的 |δ|,验证非零且逐型不同;2) 对比 γ=0 与 γ>0 的 d2_shape raw、occupancy_dice raw、nbd raw:d2 和 occ 应改善,nbd 不劣化;3) 表达四指标 raw 在 γ=0 与 γ>0 之间应逐位相同(机制只动坐标);4) 若所有型的 |d_pre − d_post| < 1e-6,说明收缩未改变质心,机制无操作对象。",
  "mechanism_off_control": "设 T2HI_INTER_GAMMA=0:跳过质心恢复步骤,输出应与父节点 17 逐位相同(anndata X 和 obsm array_equal 验证)。预期差别:γ=0 时 d2_shape raw ≈ 0.03989、occ raw ≈ 0.8143;γ>0 时这两项应减小/增大。"
}
原始记录位置/home/spark-longxinyang/vec/runs/formal/20261003-094241-search-t2-heart-interp-g24-D-s2/nodes/19/researcher.jsonl 5 KB
/home/spark-longxinyang/vec/runs/formal/20261003-094241-search-t2-heart-interp-g24-D-s2/nodes/19/researcher.stderr

审查员

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