总览 · ← 返回运行 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_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 |
机制证据
- 对照:T2EI_SEL=0 输出与父 19 程序输出逐位相同(.X、obsm array_equal),预期榜分 = 父 62.40±0。
- 机制确实改变抽中细胞:22 个型-侧块全部被偏向(sel_biased_blocks=22),抽中细胞沿发育轴的带符号投影均值 +1.0~1.2σ(a 端偏大、b 端偏小,sel_z_mean_signed 记录在 stderr JSON)。
- 四组分变化: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/邻域构成)。
- 与 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)
调研来源?调研员查到并用到的知识条目和文献检索结果(只列标题和编号)。
用到的知识库条目
| 编号 | 标题 | 出处 |
|---|---|---|
| k007 | Interval staging and held-out-window filtering of external data | notes/official/来件/virtualembryo.ai/rules.md |
| k026 | Canonicalise predicted 3D coordinates before submission | notes/pitfalls/04_scorer_invariance.md |
| k003 | Fused Gromov-Wasserstein mapping for spatial snapshots | 10.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_id | T2EI-02 |
| 假设是否成立 | 否 |
| 经验 |
|
| mechanism_active | 是 |
| 下一步建议 |
|
对话摘要?每个角色和大模型对话的统计:轮数、工具调用、用时、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 |