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

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

节点 n21 在终选来历上

在父19(扭曲抽样+t_eff RMS校准+otpair OT坐标位移)基座上,把抽样改为成熟度偏向:每个型-侧块沿该型表达轴 mean_b−mean_a 的投影做指数秩倾斜无放回抽样(κ=64,a端偏超前、b端偏落后,分配不变),组成层面逼近中间态;OT位移参数不动。A半 seed0 榜分 62.40→62.49,cell_state 54.61→55.36、expression_change

运行?一次完整的自动搜索或 Agent 会话,有自己的锁定配置和证据包。20261003-004922-search-t2-embryo-interp-g24-D
父节点n19
子节点n24
操作?种子:人写的起点;改进:在父节点上改;草稿:从头写;修复:修父节点的报错。改进
状态已打分
分数搜索目标分 62.44(+0.0) · proxy 62.44(+0.0) · 3 次复测均分 62.07
审查通过 1 越界读取:未发现问题——run.py 仅通过 view_io 的 load_manifest/read_stage/panel_genes 读取 --data 下视图内文件,无绝对路径、..、/mnt、/home、网络或打分器路径。; 2 硬编码目标统计量:未发现问题——TPOW=1.75、DAMP=0.60、SEL=64、BETA=1.0、EPS_FRAC=0.05(run.py:79-92)均为纯算法超参;轴 v=mean_b-mean_a、target_rms、细胞数分配均由两个输入阶段现场计算(run.py:149-154, 403-406),无写死的比例表、基因列表或数值常量。…
用时?从运行开始到结束(或到现在)的挂钟时间。20 分
程序版本23f3edc5cf94091a7bb7178cc815dba785271742 (programs.git)

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

来自 programs.git 23f3edc5cf:solution/METHOD.md

在父19(扭曲抽样+t_eff RMS校准+otpair OT坐标位移)基座上,把抽样改为成熟度偏向:每个型-侧块沿该型表达轴 mean_b−mean_a 的投影做指数秩倾斜无放回抽样(κ=64,a端偏超前、b端偏落后,分配不变),组成层面逼近中间态;OT位移参数不动。A半 seed0 榜分 62.40→62.49,cell_state 54.61→55.36、expression_change 60.13→60.71、local_spatial 57.28→56.0(OT源点改变所致)。

方法(家族 T2EI-02,节点 19 之上的 improve)

基座与父节点 19 完全相同:procrustes3d 对齐、t_draw=t^1.75 扭曲分层抽样、RMS 目标 t_eff=mid+damp0.60、 otpair 型内 Sinkhorn OT 坐标位移(β=1.0,ε=(0.05·target_rms)²,位移后重缩放回 target_rms)。

本节点改动(只在抽样阶段):

  • 对每个在括号两端都有 ≥5 细胞的型 τ,轴 v = mean_b[τ] − mean_a[τ](log 表达伪批量差,视图内现场计算);
  • 块内每个候选细胞的投影 p = x·v/‖v‖ 升序秩量化 u∈[0,1],权重 w = exp(±κ(u−0.5)):a 端取 +(偏超前)、b 端取 −(偏落后);
  • Efraimidis-Spirakis 加权无放回抽 k 个(k = stratified_choice 的原分配,故组成/细胞数不变,只换块内细胞);
  • κ = T2EI_SEL(默认 64);T2EI_SEL=0 走原 mix_indices,与父 19 逐位相同(实测 .X 与 obsm array_equal)。
  • T2EI_SEL_MODE=global 用全局伪批量差做轴(实测更差,默认 type)。

网格结果(proxy A 半,seed 0,查分 7 次,余 13)

κ榜分cell_stateexpr_changelocal_spatialshape_scale
0(=父19)62.4054.6160.1357.2877.58
4 / 8 / 1661.62 / 62.19 / 62.2352.76 / 53.94 / 54.4260.39 / 60.62 / 60.7556.10 / 55.51 / 56.0477.24 / 78.69 / 77.70
16(global 轴)62.1853.5560.4655.9378.80
32 / 6462.36 / 62.4955.43 / 55.3660.70 / 60.7155.99 / 56.0077.30 / 77.89

机制证据

  1. 对照:T2EI_SEL=0 输出与父 19 程序输出逐位相同(.X、obsm array_equal),预期榜分 = 父 62.40±0。
  2. 机制确实改变抽中细胞:22 个型-侧块全部被偏向(sel_biased_blocks=22),抽中细胞沿发育轴的带符号投影均值 +1.0~1.2σ(a 端偏大、b 端偏小,sel_z_mean_signed 记录在 stderr JSON)。
  3. 四组分变化:cell_state +0.75、expression_change +0.58(组成/状态层面,符合预期方向);shape_scale +0.31(噪声内);local_spatial −1.28(抽中细胞集合改变使 OT 源点云不同,a/b 亚云配对略变差,neighborhood_mmd 0.0604→0.0599 基本持平,掉分主要来自 variogram/邻域构成)。
  4. 与 PLAN 预期(cell_state≈56.8)不符的如实记录:本实现是节点16思路的重写(拿不到节点16代码),指数秩倾斜形式在 κ=16 时 cell_state 反降(54.42),κ 增大到 32–64 才转正且榜分与父持平略高(+0.09,小于 T2 噪声 ~1)。组合净增益在噪声内,未达 PLAN 预期;κ=4 附近还存在首版实现的方向 bug(b 端双重取反导致两端同向偏成熟,cell_state 46.76),已修复并如实记录。

生物学依据与知识来源

无外部数据、无文献数值、无保留阶段信息。发育轴、投影、OT 目标全部由视图内两个括号阶段的表达/坐标/标签现场计算;t、t_draw、κ、ε 均为相对量或纯算法超参。"同一类型内细胞沿谱系进程存在成熟度梯度、中间时刻的群体应由两端中更靠近中间态的细胞组成"是不针对禁窗的通用发育生物学常识。

验证与未验证

  • 验证:seed 0 重跑逐位相同(确定性);过 vec-check;对照与父逐位相同;只用相对时间差,无视图/绝对时间分支;运行 ~2s、内存远低于限额;单输入无括号时走父的 copy-latest 分支,成熟度选择与 OT 位移均不触发。
  • 未验证:B 半分数与 seed 1/2(+0.09 在噪声内,B 半可能持平或略低于父);真实 final 视图(阶段更大)的运行时间(已有 8000 下采样+分块防护)。

下一步建议

  • local_spatial 是本组合的主要代价:可在 OT 位移后按原坐标 kNN 轻微平滑,或让位移权重按型细胞数自适应,回收 1 分左右即稳超父。
  • 成熟度轴可去噪(按型细胞数向全局轴收缩、或只用型内高变基因),κ=32–64 区间再细扫。

调研员的计划

名称Node19 otpair基座组合成熟度选择:修复cell_state组成缺陷
动机父19最弱组cell_state=54.61,与节点12/15/17完全相同(抽样组成未动)。节点16/18已证明成熟度选择(SEL=16)在同一抽样基座上可将cell_state从54.61→56.78(+2.17)、expression_change从60.13→61.99(+1.86),且机制与坐标正交(只改抽中哪些细胞,不改坐标)。父19的OT位移只动坐标不动组成,因此两者可叠加。预期组合后cell_state≈56.8、expression_change≈62.0、shape_scale保持≈77,榜分预计64+。
做法1) 以父19的run.py为基座,将节点16的成熟度选择逻辑移植进来:在t_draw=t^1.75分层抽样时,对每个型-侧块,沿该型a→b轴计算每个候选细胞的投影位置,a端偏向取投影值更大(更超前)的细胞、b端偏向取投影值更小(更落后)的细胞,选择强度κ=16(与节点16/18提交值一致)。2) OT位移参数保持父19提交值不动:SHIFT_MODE=otpair、β=1.0、EPS_FRAC=0.05、COORD_SHIFT=true。3) 环境变量T2EI_SEL控制κ(0=关闭成熟度选择,退化为父19逐位相同);T2EI_COORD_SHIFT=false关闭OT位移。4) 先用proxy A半seed 0查一次确认cell_state/expression_change提升且shape_scale不降;若榜分>63再查seed 1确认。5) 若时间允许(余>10min),尝试β=0.7看local_spatial是否回收1-2分而shape_scale仅损失<1分。单输入阶段退路:无括号时走copy-latest分支,成熟度选择与OT位移均不触发。
风险1) 成熟度选择改变了抽中细胞集合,OT的源点分布略变,位移向量会不同于父19——但目标云(对侧阶段全云)不变,机制仍成立;若shape_scale掉>2分说明交互有害,回退κ=0。2) 30分钟应足够(两个组件均已实现,只需合并+验证),主要风险是合并时env变量冲突——Engineer应确保T2EI_SEL与T2EI_COORD_SHIFT独立。3) 若cell_state提升<1.5(低于噪声+预期),检查κ值是否正确传入、轴方向是否一致。

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

对比:父节点版本 6b09d03bc8。改动的文件:solution/METHOD.md +27 −46、solution/run.py +140 −3

diff --git a/solution/METHOD.md b/solution/METHOD.mdindex de1be76..e71e3e8 100644--- a/solution/METHOD.md+++ b/solution/METHOD.md@@ -1,63 +1,44 @@-在父17扭曲抽样基座上,按细胞型用Sinkhorn OT把抽中细胞坐标向对侧阶段同型云的重心投影位移(β=1,ε=(0.05·RMS)²),表达与抽样不动;shape_scale 69.1→79.2,d2_shape 0.029→0.007,A半 60.43→62.16。+在父19(扭曲抽样+t_eff RMS校准+otpair OT坐标位移)基座上,把抽样改为成熟度偏向:每个型-侧块沿该型表达轴 mean_b−mean_a 的投影做指数秩倾斜无放回抽样(κ=64,a端偏超前、b端偏落后,分配不变),组成层面逼近中间态;OT位移参数不动。A半 seed0 榜分 62.40→62.49,cell_state 54.61→55.36、expression_change 60.13→60.71、local_spatial 57.28→56.0(OT源点改变所致)。 -## 方法(家族 T2EI-02,节点 17 之上的 improve)+## 方法(家族 T2EI-02,节点 19 之上的 improve) -基座与父节点 17 完全相同(procrustes3d 对齐、t_draw=t^1.75 扭曲分层抽样、RMS 目标 t_eff=mid+damp0.60)。-本节点唯一改动:在输出坐标(jitter+scale_to_rms 之后)插入一步**纯坐标位移**:+基座与父节点 19 完全相同:procrustes3d 对齐、t_draw=t^1.75 扭曲分层抽样、RMS 目标 t_eff=mid+damp0.60、+otpair 型内 Sinkhorn OT 坐标位移(β=1.0,ε=(0.05·target_rms)²,位移后重缩放回 target_rms)。 -- 对每个在括号两端都出现(各 ≥5 细胞)的细胞型 τ,用 log 域 Sinkhorn(40 迭代、均匀边际、-  ε=(0.05·target_rms)²、平方欧氏代价)把该型抽中细胞重心投影到**对侧阶段同型全云**上:-  a 侧细胞位移 β·t·(proj−coord),b 侧细胞位移 β·(1−t)·(proj−coord),β=1.0。-- 位移后重新 scale_to_rms 到 target_rms(均匀缩放不改尺度不变形状项,只把 scale 项保持在父节点校准的峰上)。-- 表达矩阵、抽样、细胞数完全不动;单输入无括号时走父的 copy-latest 分支,位移不触发。-- 内存安全:对侧云超过 8000 细胞时按等距索引确定性下采样;代价矩阵用展开式平方距离、按行分块,-  最终视图(更大阶段)不会爆 28GB。+本节点改动(只在抽样阶段): -环境变量:`T2EI_SHIFT_MODE`(otpair/shrink/translate)、`T2EI_BETA`、`T2EI_EPS_FRAC`、-`T2EI_COORD_SHIFT`(false=关闭机制,与父逐位相同)。提交默认 otpair/1.0/0.05/true。+- 对每个在括号两端都有 ≥5 细胞的型 τ,轴 v = mean_b[τ] − mean_a[τ](log 表达伪批量差,视图内现场计算);+- 块内每个候选细胞的投影 p = x·v/‖v‖ 升序秩量化 u∈[0,1],权重 w = exp(±κ(u−0.5)):a 端取 +(偏超前)、b 端取 −(偏落后);+- Efraimidis-Spirakis 加权无放回抽 k 个(k = stratified_choice 的原分配,故组成/细胞数不变,只换块内细胞);+- κ = T2EI_SEL(默认 64);T2EI_SEL=0 走原 mix_indices,与父 19 逐位相同(实测 .X 与 obsm array_equal)。+- T2EI_SEL_MODE=global 用全局伪批量差做轴(实测更差,默认 type)。 -## 网格结果(proxy A 半,seed 0,查分 13 次,余 3)+## 网格结果(proxy A 半,seed 0,查分 7 次,余 13) -| 变体 | 配置 | 榜分 | shape_scale | local_spatial | d2_shape | occ_dice |-|---|---|---:|---:|---:|---:|---:|-| 对照 | COORD_SHIFT=false | **60.43**(=父) | 69.13 | 59.04 | 0.0287 | 0.795 |-| shrink(PLAN 原案) | β=0.05 / 0.10 / 0.15 | 60.39 / 60.07 / 59.64 | 69.55 / 68.69 / 67.55 | 58.47 / 58.04 / 57.46 | 0.0290 / 0.0298 / 0.0314 | 0.803 / 0.793 / 0.779 |-| translate(型质心刚体平移) | β=0.25 / 0.5 / 1.0 | 60.56 / 60.51 / 60.04 | 70.03 / 70.50 / 70.15 | 58.65 / 57.99 / 56.48 | 0.0260 / 0.0242 / 0.0236 | 0.797 / 0.796 / 0.787 |-| otpair | β=0.3 / 0.6 / **1.0** / 1.4(ε=0.10·0.3–1.4 见下) | 61.18 / 61.76 / **61.88** / 61.31 | 72.78 / 76.83 / 78.60 / 76.42 | 58.42 / 56.65 / 55.40 / 55.28 | 0.0192 / 0.0119 / 0.0093 / 0.0107 | 0.807 / 0.824 / 0.832 / 0.812 |-| otpair β=1.0 | ε_frac=0.02 / **0.05** / 0.07 / 0.20 | 62.01 / **62.16** / 61.93 / 61.72 | 77.78 / **79.24** / 78.56 / 77.68 | 56.73 / 55.86 / 55.62 / 55.64 | 0.0125 / **0.0074** / — / 0.0103 | 0.838 / 0.828 / — / 0.826 |-| otpair β=0.7 | ε_frac=0.05 | 61.98 | 77.75 | 56.63 | 0.0107 | 0.829 |-| **提交(seed 1)** | otpair β=1.0 ε=0.05 | **61.75** | 79.37 | 55.41 | — | — |+| κ | 榜分 | cell_state | expr_change | local_spatial | shape_scale |+|---|---:|---:|---:|---:|---:|+| 0(=父19) | 62.40 | 54.61 | 60.13 | 57.28 | 77.58 |+| 4 / 8 / 16 | 61.62 / 62.19 / 62.23 | 52.76 / 53.94 / 54.42 | 60.39 / 60.62 / 60.75 | 56.10 / 55.51 / 56.04 | 77.24 / 78.69 / 77.70 |+| 16(global 轴) | 62.18 | 53.55 | 60.46 | 55.93 | 78.80 |+| 32 / **64** | 62.36 / **62.49** | 55.43 / 55.36 | 60.70 / 60.71 | 55.99 / 56.00 | 77.30 / 77.89 | -(otpair β 网格在 ε_frac=0.10 下扫;随后固定 β=1.0 扫 ε。所有行 expression_change=60.27、cell_state=53.27 逐位不变。)+## 机制证据 -## 机制证据(PLAN 四项,按实际变体记录)--1. **对照逐位相同**:`T2EI_COORD_SHIFT=false` 跳过全部新代码路径,得分与父节点 A 半记录完全一致(60.4288 vs 父 60.43);重写后的内存安全 Sinkhorn 与重写前输出 coords 逐位相同(max diff 0.0)。-2. **表达/抽样未动**:全网格 expression_change(60.27)与 cell_state(53.27)逐位不变,de/mmd_u/variogram 指标逐位相同——只有坐标两组变化。-3. **按型位移非常数**:otpair β=1.0 位移 3381 细胞、11 型(22 个型×侧块),逐块位移 L2 均值 26.7–95.1,方向和幅度各异;每个细胞的目标是 OT 重心投影(型内流形匹配),不是同一向量。-4. **形状效应非尺度效应**:位移后 RMS 146.39→141.55(−3.3%),随后重缩放回 target_rms,scale_log_ratio 全程 −0.003(父校准峰位);shape_scale 增益全部来自尺度不变项:d2_shape 0.0287→0.0074、occupancy_dice 0.795→0.828。shape_scale 79.2 已超过无扭曲种子节点 2 的 74.4——扭曲抽样造成的形状缺口被补齐并反超。--**与 PLAN 的偏离(如实记录)**:PLAN 指定的是"向插值型质心收缩"(shrink),网格证伪——收缩压扁型内分布,-d2_shape 反而变差、local_spatial 单调掉分,按 PLAN 第 9 条应回退 β=0。同族的两个替代实现里,-型质心刚体平移(translate)净增益≈0,**型内 OT 重心配对(otpair)大幅有效**:它不只修型质心位置,-还把 a/b 两侧同型云的相对构型收拢到中间态。提交的是 otpair,机制仍是"按细胞型的坐标位移、表达抽样不动"(T2EI-02 家族内)。-代价:local_spatial 59.04→55.86(a/b 亚云合并使邻域内表达更混杂,neighborhood_mmd 0.0531→0.0604),-净 +1.73 分且 seed 0/1 一致(61.75 vs 父 seed1 ~60.0,Δ 相同),非噪声。+1. 对照:T2EI_SEL=0 输出与父 19 程序输出逐位相同(.X、obsm array_equal),预期榜分 = 父 62.40±0。+2. 机制确实改变抽中细胞:22 个型-侧块全部被偏向(sel_biased_blocks=22),抽中细胞沿发育轴的带符号投影均值 +1.0~1.2σ(a 端偏大、b 端偏小,sel_z_mean_signed 记录在 stderr JSON)。+3. 四组分变化:cell_state +0.75、expression_change +0.58(组成/状态层面,符合预期方向);shape_scale +0.31(噪声内);local_spatial −1.28(抽中细胞集合改变使 OT 源点云不同,a/b 亚云配对略变差,neighborhood_mmd 0.0604→0.0599 基本持平,掉分主要来自 variogram/邻域构成)。+4. 与 PLAN 预期(cell_state≈56.8)不符的如实记录:本实现是节点16思路的重写(拿不到节点16代码),指数秩倾斜形式在 κ=16 时 cell_state 反降(54.42),κ 增大到 32–64 才转正且榜分与父持平略高(+0.09,小于 T2 噪声 ~1)。**组合净增益在噪声内,未达 PLAN 预期**;κ=4 附近还存在首版实现的方向 bug(b 端双重取反导致两端同向偏成熟,cell_state 46.76),已修复并如实记录。  ## 生物学依据与知识来源 -无外部数据、无文献数值、无保留阶段信息。位移目标全部由视图内两个输入阶段的坐标和 celltype 标签现场计算;-t、t_draw、ε 均为相对量。OT/Sinkhorn 是通用算法(Cuturi 2013 常识性方法),不编码任何禁窗知识。+无外部数据、无文献数值、无保留阶段信息。发育轴、投影、OT 目标全部由视图内两个括号阶段的表达/坐标/标签现场计算;t、t_draw、κ、ε 均为相对量或纯算法超参。"同一类型内细胞沿谱系进程存在成熟度梯度、中间时刻的群体应由两端中更靠近中间态的细胞组成"是不针对禁窗的通用发育生物学常识。  ## 验证与未验证 -- 验证:seed 0 重跑逐位相同(确定性,Sinkhorn 无随机);seed 0/1 过 vec-check;对照与父逐分一致;-  只用相对时间差,无 board/mode/绝对时间分支(伪装视图平移不变);只读 manifest 列出的文件;运行 16s、峰值内存远低于限额。-- 未验证:真实 final 视图(E7.25+E8.0→E7.75,阶段更大)上 otpair 的运行时间(已做 8000 上限+分块防护,预计 <5min);-  B 半分数;local_spatial 权重在 B 半是否放大(若放大,β=0.6–0.7 更稳,A 半仍有 61.8–62.0)。+- 验证:seed 0 重跑逐位相同(确定性);过 vec-check;对照与父逐位相同;只用相对时间差,无视图/绝对时间分支;运行 ~2s、内存远低于限额;单输入无括号时走父的 copy-latest 分支,成熟度选择与 OT 位移均不触发。+- 未验证:B 半分数与 seed 1/2(+0.09 在噪声内,B 半可能持平或略低于父);真实 final 视图(阶段更大)的运行时间(已有 8000 下采样+分块防护)。  ## 下一步建议 -- β 或位移权重按型自适应(细胞数多的型少移,保护邻域);-- otpair 与节点 16 的成熟度选择组合(cell_state 再 +2);-- local_spatial 回收:位移后按原坐标 kNN 做轻微局部平滑。+- local_spatial 是本组合的主要代价:可在 OT 位移后按原坐标 kNN 轻微平滑,或让位移权重按型细胞数自适应,回收 1 分左右即稳超父。+- 成熟度轴可去噪(按型细胞数向全局轴收缩、或只用型内高变基因),κ=32–64 区间再细扫。diff --git a/solution/run.py b/solution/run.pyindex cd96f51..6a5508e 100644--- a/solution/run.py+++ b/solution/run.py@@ -1,5 +1,19 @@ #!/usr/bin/env python3-"""Node 19 (family T2EI-02): parent-17 mix pipeline + per-type OT coordinate displacement.+"""Node 21 (family T2EI-02): node-19 otpair OT coordinate displacement + maturity-biased draws.++Shipped change (vs parent 19): within the t_draw=t^1.75 stratified draw, each+type-side block is sampled with an exponential rank tilt (kappa=64, env+T2EI_SEL) along the type's a->b expression axis v = mean_b - mean_a: a-side+cells prefer higher projection (advanced toward b), b-side cells prefer lower+projection (lagging toward a); allocation per type unchanged. T2EI_SEL=0+restores mix_indices and is bit-identical to parent 19 (verified). Proxy A-half+seed 0: cell_state 54.61->55.36, expression_change 60.13->60.71, board+62.40->62.49; kappa grid 4/8/16/32/64 = 61.62/62.19/62.23/62.36/62.49.+OT displacement parameters unchanged (otpair, beta=1.0, eps_frac=0.05).++Node 19 docstring follows.++Node 19 (family T2EI-02): parent-17 mix pipeline + per-type OT coordinate displacement.  Shipped change (vs parent 17): after the drawn cloud is jittered and scaled to target_rms, each drawn cell of a type present in BOTH bracket stages moves by@@ -74,6 +88,125 @@ BETA = float(os.environ.get("T2EI_BETA", "1.0")) SHIFT_MODE = os.environ.get("T2EI_SHIFT_MODE", "otpair") EPS_FRAC = float(os.environ.get("T2EI_EPS_FRAC", "0.05")) COORD_SHIFT = os.environ.get("T2EI_COORD_SHIFT", "true").strip().lower() not in {"0", "false", "no", "off"}+SEL = float(os.environ.get("T2EI_SEL", "64"))+SEL_MODE = os.environ.get("T2EI_SEL_MODE", "type")+++def _alloc(labels: np.ndarray, n: int):+    """Same per-type allocation as stratified_choice (deterministic part)."""+    labels = np.asarray(labels).astype(str)+    n = int(min(max(n, 1), len(labels)))+    if n >= len(labels):+        return None+    types, counts = np.unique(labels, return_counts=True)+    raw = counts / counts.sum() * n+    alloc = np.floor(raw).astype(int)+    rem = int(n - alloc.sum())+    order = np.argsort(-(raw - alloc))+    for i in range(rem):+        alloc[order[i % len(order)]] += 1+    alloc = np.minimum(alloc, counts)+    deficit = int(n - alloc.sum())+    if deficit > 0:+        spare = counts - alloc+        for i in np.argsort(-spare):+            tk = int(min(deficit, spare[i]))+            alloc[i] += tk+            deficit -= tk+            if deficit == 0:+                break+    return types, alloc+++def _weighted_pick(idx: np.ndarray, k: int, w: np.ndarray, rng) -> np.ndarray:+    """Efraimidis-Spirakis weighted sampling without replacement (top-k of log u / w)."""+    m = idx.size+    if k >= m:+        return idx+    u = rng.random(m)+    np.maximum(u, 1e-12, out=u)+    keys = np.log(u) / np.maximum(w, 1e-12)+    sel = np.argpartition(-keys, k - 1)[:k]+    return idx[sel]+++def maturity_draw(stage_a, stage_b, t_draw: float, n: int, rng, kappa: float):+    """mix_indices with maturity-biased within-type draws.++    Per type present in both stages (>= MIN_TYPE_N cells each), the a->b axis is+    v = mean_b - mean_a of log expression; each candidate cell's projection onto+    v is ranked within its type-side block, and cells are drawn without+    replacement with weight exp(+kappa*u) on the a-side (u = ascending rank+    quantile; prefer advanced cells) and exp(-kappa*u) on the b-side (prefer+    lagging cells). Allocation per type/side is identical to stratified_choice.+    Returns (ia, ib, stats)."""+    n_b = int(np.clip(int(round(float(t_draw) * n)), 0, n))+    n_a = n - n_b+    stats = {}+    if n_a == 0 or n_b == 0:+        ia, ib = mix_indices(stage_a.labels, stage_b.labels, t_draw, n, rng)+        return ia, ib, stats+    means_a = type_means(stage_a.X, stage_a.labels)+    means_b = type_means(stage_b.X, stage_b.labels)+    labs_a = np.asarray(stage_a.labels).astype(str)+    labs_b = np.asarray(stage_b.labels).astype(str)+    gma = np.asarray(as_dense(stage_a.X).mean(axis=0), dtype=np.float32)+    gmb = np.asarray(as_dense(stage_b.X).mean(axis=0), dtype=np.float32)+    z_gaps = []+    n_biased_blocks = 0+    sides = []+    for side, stage, labs, k_total, sign in (+        ("a", stage_a, labs_a, n_a, +1.0),+        ("b", stage_b, labs_b, n_b, -1.0),+    ):+        picks = []+        res = _alloc(labs, k_total)+        if res is None:+            picks.append(np.arange(len(labs)))+        else:+            types, alloc = res+            for lab, k in zip(types, alloc):+                k = int(k)+                if k <= 0:+                    continue+                idx = np.flatnonzero(labs == lab)+                ma = means_a.get(lab)+                mb = means_b.get(lab)+                n_opp = int((labs_b == lab).sum()) if side == "a" else int((labs_a == lab).sum())+                if k >= idx.size or ma is None or mb is None or idx.size < MIN_TYPE_N or n_opp < MIN_TYPE_N:+                    picks.append(rng.choice(idx, k, replace=False))+                    continue+                if SEL_MODE == "global":+                    v = (gmb - gma).astype(np.float64)+                else:+                    v = (mb - ma).astype(np.float64)+                nv = float(np.linalg.norm(v))+                if nv <= 1e-9:+                    picks.append(rng.choice(idx, k, replace=False))+                    continue+                proj = np.asarray(as_dense(stage.X, idx), dtype=np.float64) @ v / nv+                m = idx.size+                ranks = np.empty(m, dtype=np.float64)+                ranks[np.argsort(proj, kind="stable")] = np.arange(m)+                u = ranks / max(m - 1, 1)+                w = np.exp(sign * kappa * (u - 0.5))+                chosen = _weighted_pick(idx, k, w, rng)+                picks.append(chosen)+                n_biased_blocks += 1+                pm = proj.mean()+                ps = proj.std() + 1e-12+                zsel = (proj[np.isin(np.arange(m), np.searchsorted(idx, chosen))] - pm) / ps+                z_gaps.append(float(sign * zsel.mean()))+        arr = np.concatenate(picks) if picks else np.array([], dtype=int)+        sides.append(arr)+    stats = {+        "sel_kappa": kappa,+        "sel_biased_blocks": n_biased_blocks,+        "sel_z_mean_signed": float(np.mean(z_gaps)) if z_gaps else 0.0,+        "sel_n_from_a": int(sides[0].size),+        "sel_n_from_b": int(sides[1].size),+    }+    return sides[0], sides[1], stats   def type_centroids(coords: np.ndarray, labels, min_n: int = MIN_TYPE_N) -> dict:@@ -272,7 +405,11 @@ def main() -> None:     cb = scale_to_rms(aligned_b, target_rms)     n = interp_count(stage_a.n, stage_b.n, t, int(params["min_cells"]), int(params["max_cells"]), float(params.get("count_damp", 1.0))) -    ia, ib = mix_indices(stage_a.labels, stage_b.labels, t_draw, n, rng)+    sel_stats = {}+    if SEL > 0.0:+        ia, ib, sel_stats = maturity_draw(stage_a, stage_b, t_draw, n, rng, SEL)+    else:+        ia, ib = mix_indices(stage_a.labels, stage_b.labels, t_draw, n, rng)     expr = np.clip(np.vstack([as_dense(stage_a.X, ia), as_dense(stage_b.X, ib)]), 0.0, None).astype(np.float32)     coords = _jitter(np.vstack([np.asarray(ca[ia], dtype=np.float64), np.asarray(cb[ib], dtype=np.float64)]), rng)     coords = scale_to_rms(coords, target_rms)@@ -298,7 +435,7 @@ def main() -> None:         "z_flipped": ainfo.get("z_flipped"), "align": align,         "cells_moved": moved, "within_type_var_ratio": var_ratio,         "beta": BETA if (COORD_SHIFT and BETA > 0.0) else 0.0, "coord_shift": bool(COORD_SHIFT),-        **shift_stats,+        **shift_stats, **sel_stats,     }     print(json.dumps({"bracket": [a["stage"], b["stage"]], **info}, default=float), file=sys.stderr)     write_t2(args.out, expr, coords.astype(np.float32), 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
k003Fused Gromov-Wasserstein mapping for spatial snapshots10.1038/s41586-024-08453-2

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

改了什么在父19的 otpair OT 坐标位移基座上,把 t_draw=t^1.75 分层抽样的块内选取改为成熟度偏向:每个型-侧块沿该型表达轴 v=mean_b-mean_a 的投影做指数秩倾斜 Efraimidis-Spirakis 无放回抽样(a端偏超前、b端偏落后,分配不变),提交的 κ=64(T2EI_SEL,PLAN 原定 16);OT 参数(otpair/β=1.0/ε_frac=0.05)与表达输出逻辑未动。
各组分数的变化cell_state:变好且超噪声:54.61→56.61(+2.00),是唯一明确的正向分组,接近 PLAN 预期的 ≈56.8。
expression_change:变坏但在噪声内:60.13→60.03(-0.10),与 PLAN 预期的 ≈62.0 相反。
local_spatial:噪声内:57.28→57.51(+0.23);与 Engineer 在 proxy A 半 seed0 记录的 57.28→56.00(-1.28)符号相反。
shape_scale:变坏:77.58→75.62(-1.96,约 2 倍 T2 噪声),PLAN 声称 OT 机制未变故应保持 ≈77±1,实际未成立。
family_idT2EI-02
假设是否成立否
经验
  1. 在"OT 位移基座 + 成熟度偏向抽样"条件下做组成层面改动,抽中细胞集合改变会连带改变 OT 源点云,shape_scale 掉 1.96 分把 cell_state 的 +2.00 抵掉,榜分净 +0.04(噪声内):坐标位移与抽样组成在此实现下并不正交,不能按单独节点的效果线性相加。
  2. proxy A 半 seed0 的单 seed 分组数值不可作为提交依据:本节点在该 proxy 上量到 shape_scale 77.89 / local_spatial 56.00,正式评分却是 75.62 / 57.51(两项符号相反、差约 2 分),只有 cell_state 方向一致,说明单 seed proxy 的 shape_scale/local_spatial 有 ±2 分级别漂移。
  3. 选择强度 κ 不能跨实现搬运:节点16 声称有效的 κ=16 在本重写(指数秩倾斜)下 cell_state 反降到 54.42,κ 需到 32-64 才转正,移植一个机制时必须在新基座上重新扫该超参。
  4. PLAN 的门控条件(榜分>63 才查 seed 1)未满足却仍提交了 κ=64,且 κ 与 PLAN 指定的 16 不一致;未做第二个 seed 验证是本次组间预测失效没被提前发现的原因。
  5. 偏向抽样实现容易把符号写反(首版 b 端双重取反使两端同向偏成熟,cell_state 崩到 46.76);stderr 里输出 sel_z_mean_signed / sel_biased_blocks 并核对符号,是低成本的有效自检。
  6. 关闭机制的逐位对照(κ=0 时 .X 与 obsm 与父 array_equal)成本极低,能干净地把改动归因到抽样阶段,值得保留为标配。
mechanism_active是
下一步建议
  1. 针对 shape_scale:在 κ=32-64 下联扫 OT 参数(β=1.0→0.8/0.6、ε_frac=0.05→0.03/0.07),寻找 cell_state 保住 +2 而 shape_scale 回到 ≥77 的组合,不要固定 OT 参数只调 κ。
  2. 针对 local_spatial 与 shape_scale 的邻域代价:在 OT 位移后按位移前坐标做 kNN(k=5-10)轻微平滑,或把位移幅度按型细胞数自适应衰减,目标回收 1-2 分。
  3. 针对 cell_state 增益的稳健性:把成熟度轴按型细胞数向全局轴收缩(λ=n_τ/(n_τ+n0),n0≈30)或只用型内高变基因,κ 在 32/48/64/96 细扫,并在 seed 0+1 两个 seed 上都查分、且以榜分而非单组分数为准再提交。

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

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

分析员

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

工程师

角色工程师 alibaba-token-plan-cn/qwen3.8-max
调用次数1 次
轮数34
工具调用共 39 次:bash 25、edit 9、read 4、write 1
用时18 分
token 数输入 68,331 · 输出 12,232 · 思考 11,734
任务(第一行)按计划修改程序:Node19 otpair基座组合成熟度选择:修复cell_state组成缺陷
最后的回答(摘录)
完成。总结:

- **做了什么**:按 PLAN 把节点16思路的"成熟度选择"重写并合并进父19的 otpair OT 位移基座:每个型-侧块沿表达轴 mean_b−mean_a 的投影做指数秩倾斜无放回抽样(κ 可调,`T2EI_SEL=0` 对照与父逐位相同,已验证 array_equal)。修掉了首版 b 端方向双重取反的 bug。
- **查分结果**(proxy A半 seed0,用 7/20 次):κ=4/8/16/32/64 → 61.62/62.19/62.23/62.36/**62.49**(父 62.40);κ=64 提交:cell_state 54.61→55.36、expression_change 60.13→60.71、shape_scale 77.58→77.89、local_spatial 57.28→56.00。净增益 +0.09 在噪声内,未达 PLAN 预期(cell_state≈56.8),已在 METHOD.md 如实记录。
- **下一步最值得试**:回收 local_spatial(OT 位移后按原坐标 kNN 轻微平滑,或位移权重按型细胞数自适应);成熟度轴去噪(按型细胞数向全局轴收缩)后在 κ=32–64 细扫。
原始记录位置/home/spark-longxinyang/vec/runs/formal/20261003-004922-search-t2-embryo-interp-g24-D/nodes/21/engineer.jsonl 199 KB
/home/spark-longxinyang/vec/runs/formal/20261003-004922-search-t2-embryo-interp-g24-D/nodes/21/engineer.stderr

调研员

角色调研员 alibaba-token-plan-cn/qwen3.8-max
调用次数1 次
轮数1
工具调用共 0 次:—
用时1 分
token 数输入 13,575 · 输出 1,009 · 思考 2,319
任务(第一行)为节点 n21(改进,父节点 n19)写改进计划 PLAN.json
最后的回答(摘录)
```json
{
  "name": "Node19 otpair基座组合成熟度选择:修复cell_state组成缺陷",
  "motivation": "父19最弱组cell_state=54.61,与节点12/15/17完全相同(抽样组成未动)。节点16/18已证明成熟度选择(SEL=16)在同一抽样基座上可将cell_state从54.61→56.78(+2.17)、expression_change从60.13→61.99(+1.86),且机制与坐标正交(只改抽中哪些细胞,不改坐标)。父19的OT位移只动坐标不动组成,因此两者可叠加。预期组合后cell_state≈56.8、expression_change≈62.0、shape_scale保持≈77,榜分预计64+。",
  "approach": "1) 以父19的run.py为基座,将节点16的成熟度选择逻辑移植进来:在t_draw=t^1.75分层抽样时,对每个型-侧块,沿该型a→b轴计算每个候选细胞的投影位置,a端偏向取投影值更大(更超前)的细胞、b端偏向取投影值更小(更落后)的细胞,选择强度κ=16(与节点16/18提交值一致)。2) OT位移参数保持父19提交值不动:SHIFT_MODE=otpair、β=1.0、EPS_FRAC=0.05、COORD_SHIFT=true。3) 环境变量T2EI_SEL控制κ(0=关闭成熟度选择,退化为父19逐位相同);T2EI_COORD_SHIFT=false关闭OT位移。4) 先用proxy A半seed 0查一次确认cell_state/expression_change提升且shape_scale不降;若榜分>63再查seed 1确认。5) 若时间允许(余>10min),尝试β=0.7看local_spatial是否回收1-2分而shape_scale仅损失<1分。单输入阶段退路:无括号时走copy-latest分支,成熟度选择与OT位移均不触发。",
  "expected_groups": ["cell_state", "expression_change"],
  "risks": "1) 成熟度选择改变了抽中细胞集合,OT的源点分布略变,位移向量会不同于父19——但目标云(对侧阶段全云)不变,机制仍成立;若shape_scale掉>2分说明交互有害,回退κ=0。2) 30分钟应足够(两个组件均已实现,只需合并+验证),主要风险是合并时env变量冲突——Engineer应确保T2EI_SEL与T2EI_COORD_SHIFT独立。3) 若cell_state提升<1.5(低于噪声+预期),检查κ值是否正确传入、轴方向是否一致。",
  "family_id": "T2EI-02",
  "mechanism": "在OT坐标位移(型内Sinkhorn重心配对)的抽样阶段插入成熟度偏向选择:a端取沿型发育轴更超前、b端取更落后的细胞,使抽中组成更接近中间态,从而在不改坐标机制的前提下提升cell_state和expression_change。",
  "vs_constant_shift": "成熟度选择改变的是每个型-侧块内抽中哪些真实细胞(组成层面),不是对输出施加统一位移或重加权;OT位移本身是逐细胞、逐型的非均匀映射(每个细胞目标不同),且位移方向和幅度由型内流形匹配决定,不是常数向量。",
  "mechanism_evidence": "1) cell_state和expression_change应从54.61/60.13提升到≈56.5+/61.5+(与节点16单独效果一致);2) shape_scale应保持≈77±1(OT机制未变);3) 关闭κ(T2EI_SEL=0)后应逐位复现父19的62.40;4) 按型记录抽中细胞沿发育轴的投影均值,验证a端确实偏大、b端偏小。",
  "mechanism_off_control": "设T2EI_SEL=0(或κ=0),成熟度选择退化为均匀随机抽取(与父19相同),其余参数不变;预期输出与父19逐位相同(坐标、表达、组成),榜分=62.40±0。若不等则说明合并引入了副作用,需排查。"
}
```
原始记录位置/home/spark-longxinyang/vec/runs/formal/20261003-004922-search-t2-embryo-interp-g24-D/nodes/21/researcher.jsonl 4 KB
/home/spark-longxinyang/vec/runs/formal/20261003-004922-search-t2-embryo-interp-g24-D/nodes/21/researcher.stderr

审查员

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