总览 · ← 返回运行 20261003-043412-search-t2-embryo-interp-g24-D-s1
节点 n13 在终选来历上
按 PLAN T2EI-09 实现 a 侧(早端括号)中间态选胞(含保空间分层的变体 SEL_A_MODE=spatial);机制确实运行且 cell_state/expression_change 上升,但 local_spatial 一致下降 ~1.5,两种子均值净负(61.10 vs 父 61.38),故提交态默认关闭(SEL_SIDE=b,输出与父节点 11 逐位一致)。
| 运行?一次完整的自动搜索或 Agent 会话,有自己的锁定配置和证据包。 | 20261003-043412-search-t2-embryo-interp-g24-D-s1 |
|---|---|
| 父节点 | n11 |
| 子节点 | n19、n23 |
| 操作?种子:人写的起点;改进:在父节点上改;草稿:从头写;修复:修父节点的报错。 | 改进 |
| 状态 | 已打分 |
| 分数 | 搜索目标分 62.15(+0.0) · proxy 62.15(+0.0) |
| 审查 | 通过 检查1 越界读取:未发现问题——run.py 只通过 --data/--out 与 src.task2_spatial 的 load_manifest/read_stage/write_t2 读写视图内数据(run.py:294-311),无绝对路径、'..'、/mnt、/home、data/raw、downloads、打分器或 src/common/evaluation 的引用,无网络访问。; 检查2 硬编码目标统计量:未发现问题——所有统计量(型质心、RMS、细胞数 n、配额)均从 manifest 与输入现场计算(run.py:301-330),文件中的数值常量只是调参超参(KAPPA… |
| 用时?从运行开始到结束(或到现在)的挂钟时间。 | 15 分 |
| 程序版本 | 05cbb15c5728f371cf4fc3e0104c0eb97a7e769f (programs.git) |
方法说明?节点程序自带的 METHOD.md:这个程序做了什么、为什么。
来自 programs.git 05cbb15c57:solution/METHOD.md
按 PLAN T2EI-09 实现 a 侧(早端括号)中间态选胞(含保空间分层的变体 SEL_A_MODE=spatial);机制确实运行且 cell_state/expression_change 上升,但 local_spatial 一致下降 ~1.5,两种子均值净负(61.10 vs 父 61.38),故提交态默认关闭(SEL_SIDE=b,输出与父节点 11 逐位一致)。
方法(family T2EI-09,improve over node 11)
父流程完整保留:interp_bracket → procrustes3d 对齐 → scale_damp=0.5 目标 RMS → κ=0.65 组成阻尼 → b 侧型内中间态偏好选胞(blend 质心 (1−t)μ_a+tμ_b,SEL_P=1.0) → b 侧全局 xy 径向膨胀 γ=1.15 → jitter + 终缩放。
本节点新增(SEL_SIDE=both,默认 b):
- a 侧中间态选胞(PLAN 原型,
SEL_A_MODE=plain):与 b 侧完全对称——每个共有型内 按 z-scored 表达空间到混合质心 (1−t)μ_a+tμ_b 的欧氏距离升序取配额内最近的细胞。 - 保空间分层变体(
SEL_A_MODE=spatial,本节点新设计):先做父节点的无偏均匀抽取 作为"空间模板",按 (型, 对齐坐标的分位箱 nbins^3) 分组,每组配额用该组内距混合质心 最近的细胞重填。构造上保持逐型逐区域的占据数与无偏抽样完全相同,只改细胞身份, 目的是拿到表达收益而不付 occupancy/shape 代价。 - RNG 隔离:a 侧改用
default_rng([seed,7])(spatial 模式完全确定性), 主 rng 仍先执行一次与父节点相同的无偏抽取以消费同样的随机流,因此SEL_SIDE=b时 b 侧选胞、膨胀、jitter 与父节点逐位一致(h5py 递归逐数组比对 True)。 - 单输入退路不变:无括号、无选胞、无膨胀。
机制证据(mechanism_evidence,A 半,E6.75+E8.0→E7.25,t=0.4)
机制确实运行、确实改变了细胞身份:a 侧被选细胞到混合质心的平均距离 13.56 → 10.69(spatial nbins=2,34% 的 a 细胞被替换)/ 13.32 → 10.40(plain,48.5% 被替换); 11 个共有型中 7 个(Allantois、Caudal Epiblast、EXE-Endoderm、ExEM-1/2、HEM-Endoth、 LPM、Primitive Streak、SOM、Unknown、pSE 中距离有限者)参与排序,非共有型(Anterior Epiblast、EXE-Ectoderm、Gut Endoderm、CP、Blood Progenitor、PHM/PAM、aSE)保持模板不变。
四组分变化(seed 0,父 61.14 → spatial nbins=2 → 61.33): cell_state 52.84→54.01(+1.17)、expression_change 60.50→61.32(+0.82)——正是 PLAN 预期的两组, 方向一致;shape_scale 72.18→72.02(−0.16)、local_spatial 59.03→57.97(−1.06)。 de_score 0.25→0.2857、de_direction 0.3645→0.3699、variogram 0.01094→0.00993 改善, 但 neighborhood_mmd 0.05314→0.05548 恶化(local_spatial 的损失全部来自它)。
机制对照(mechanism_off_control)与查分全表
SEL_SIDE=b(关闭 a 侧选胞)输出与父节点 11 逐位一致,A 半 61.14(seed0)/ 61.62(seed1),
与父节点记录的 61.14 / 61.62 相同。打开后(两种子):
| 配置 | seed0 | seed1 | 均值 | cell_state | expr_change | shape | local |
|---|---|---|---|---|---|---|---|
| 父 SEL_SIDE=b(提交) | 61.14 | 61.62 | 61.38 | 52.84/53.27 | 60.50/60.93 | 72.18/72.28 | 59.03/60.00 |
| both, plain(PLAN 原型) | 60.97 | – | – | 53.53 | 61.09 | 71.20 | 58.08 |
| both, plain(RNG 隔离) | 60.95 | – | – | 53.79 | 59.70 | 72.31 | 58.00 |
| both, spatial nbins=2 | 61.33 | 60.87 | 61.10 | 54.01/53.40 | 61.32/60.62 | 72.02/71.65 | 57.97/57.83 |
| both, spatial nbins=3 | 61.00 | – | – | 52.84 | 61.21 | 71.80 | 58.16 |
| both, spatial nbins=4 | 60.84 | – | – | 53.08 | 60.41 | 71.74 | 58.12 |
结论:PLAN 的机制在代理上被证伪。cell_state 收益(+0.9~+1.2)稳定存在且方向符合预期, 但 local_spatial 一致损失 1.0~2.2(neighborhood_mmd 0.0531→0.0551~0.0558), 两种子均值净 −0.28,落在 T2 噪声(~1)内偏负。分层箱数 2→3→4 单调变差, 说明损失不是"粗箱内远距离换位"造成的(occupancy_dice 反而持平/略升 0.7716→0.7766), 而是把 a 侧细胞的身份换成"更偏晚端"的细胞后,其表达与其空间邻域在参考 E7.25 中的 局部耦合被破坏。这与节点 12 的教训同型(cell_state +1.2 / local −2.0,净负): 在本代理上 local_spatial 对"细胞身份—位置耦合"极敏感,任何以牺牲真实配对换取 中间态表达的做法都得不偿失。对照 b 侧:同样的中间态排序在 b 侧(1300/31671,4% 抽样) 是净收益(node 7:cell_state +4.7 且 local 57.27→60.00),因为 b 侧抽样率低、 选入的是目标时刻的代表性细胞;a 侧抽样率 52%,筛选只能改变既有位置的细胞身份。
验证过 / 没验证
- 验证:
SEL_SIDE=b与父输出逐位一致(seed 0/1);seed 0/1 确定性重跑一致; vec-check seed 0/1 ok;运行 ~2s、峰值内存 <1GB(限制 28GB / 30min); 不读绝对时间、不读视图路径/board 字段,只用时间差与 seed(伪装视图无关)。 - 验证:
SEL_SIDE=both/a三种模式(plain、spatial nbins=1..4)全部跑通并查分(8 次查询)。 - 未验证:a 侧选胞在真实括号(E7.25+E8.0→E7.5,t=1/3,a 侧抽样率更高)上的表现—— 代理上已净负,未冒险提交;B 半与 A 半有 ~1 分噪声,但两种子方向一致(seed0 +0.19、 seed1 −0.75),不足以支持提交。
- 生物学依据(通用知识,不涉禁窗测量):中间态偏好 = 假设目标时刻的细胞群更接近 两括号型均值的线性混合(谱系连续、无突然出现的新程序);z 为离散切片栅格(方法卡), 故所有坐标扰动仍只在 xy。
下一步建议
- local_spatial 是 a 侧任何"换身份"操作的硬约束:若还想提 cell_state,必须同时生成 新坐标(例如把 a 侧被替换细胞的坐标也按邻域重排/插值到新位置),保持身份—位置耦合, 而不是把中间态表达钉在早期位置上。
- 反向利用本节点的发现:b 侧低抽样率下中间态排序有效、a 侧高抽样率下无效 → 可试降低 a 侧抽样率、提高 b 侧(κ 上调到 0.75~0.85)并把选胞只留在 b 侧, 同时用 γ 补占据;父节点已提示 κ=0.75 的 shape 更高(72.08)。
- shape_scale 72.2 / occupancy_dice 0.77 仍是最大余量所在(node 2 的 dice ~0.84): 各向同性 γ 已到平台,建议按体素占据缺失方向做非各向同性补偿。
调研员的计划
| 名称 | 双侧中间态选胞:a侧也按到混合质心距离择优 |
|---|---|
| 动机 | cell_state 54.35 是四组最弱。节点7消融显示中间态选胞在κ=0.65基础上额外贡献+4.7(48.17→52.84),但目前选胞只作用于b侧(SEL_SIDE=b),a侧细胞仍均匀抽取,包含大量远离中间态的早期细胞。目标时刻介于两括号之间,a侧也应优先选已在向中间过渡的细胞。expression_change 61.08 也可能因此受益(选入细胞表达更接近中间态)。 |
| 做法 | 在父节点11的run.py上扩展SEL_SIDE:新增'both'选项。对a侧(早端括号)每个共有型,同样在z-scored表达空间计算到混合质心(1−t)μ_a+tμ_b的欧氏距离,按距离升序取配额内最近的细胞(与b侧逻辑完全对称)。步骤:(1) 在现有b侧选胞代码旁加a侧分支,SEL_SIDE=both时两侧都执行,SEL_SIDE=b时与父节点逐位一致;(2) a侧SEL_P初始=1.0(确定性),若cell_state不升反降,试0.8(保留20%随机);(3) 其余参数不变(κ=0.65, γ=1.15, SEL_TARGET=blend, scale_damp=0.5);(4) 用vec-score查A半分,先跑seed 0,若cell_state提升≥1再跑seed 1确认;(5) 单输入退路:无括号、无选胞,与父节点一致。 |
| 风险 | a侧过度筛选可能降低型内多样性,反而损害cell_state(若评分器重视分布覆盖而非均值接近);改善可能落在T2噪声(~1分)内。Engineer应在第一次vec-score后比较cell_state和expression_change是否同向变化;若cell_state下降,立即试SEL_P=0.8或回退SEL_SIDE=b。shape_scale和local_spatial因坐标随细胞走可能微变,需监控不降超1分。 |
代码改动?这个节点的程序和父节点程序的逐行差别:绿色是新增,红色是删除。
对比:父节点版本 24da73d48b。改动的文件:solution/METHOD.md +67 −64、solution/run.py +109 −7
diff --git a/solution/METHOD.md b/solution/METHOD.mdindex 986b055..8fd0c18 100644--- a/solution/METHOD.md+++ b/solution/METHOD.md@@ -1,80 +1,83 @@-父节点 mix+κ=0.65+side-b 中间态选胞不变;新增 b 侧坐标占据扩张:被选晚端细胞绕输出云质心做 xy 径向膨胀 γ=1.15(z 不动),补偿组成阻尼的空间占据损失。+按 PLAN T2EI-09 实现 a 侧(早端括号)中间态选胞(含保空间分层的变体 SEL_A_MODE=spatial);机制确实运行且 cell_state/expression_change 上升,但 local_spatial 一致下降 ~1.5,两种子均值净负(61.10 vs 父 61.38),故提交态默认关闭(SEL_SIDE=b,输出与父节点 11 逐位一致)。 -## 方法(family T2EI-05,improve over node 7)+## 方法(family T2EI-09,improve over node 11) -父流程完全保留:interp_bracket、procrustes3d 对齐、scale_damp=0.5 目标 RMS、-κ=0.65 组成阻尼、side-b 型内中间态偏好选胞(SEL_P=1.0,blend 质心)、-jitter + 终缩放。本节点只在其后加一步**坐标占据扩张**(PLAN T2EI-05):+父流程完整保留:interp_bracket → procrustes3d 对齐 → scale_damp=0.5 目标 RMS →+κ=0.65 组成阻尼 → **b 侧**型内中间态偏好选胞(blend 质心 (1−t)μ_a+tμ_b,SEL_P=1.0)+→ b 侧全局 xy 径向膨胀 γ=1.15 → jitter + 终缩放。 -- 提交配置:`SPREAD_MU=global, SPREAD_AXES=xy, SPREAD_CAP=1.15`。- 对被选入输出的全部 b 侧(晚端括号)细胞:x' = g + (x − g)·γ,g 为- a+b 堆叠云(扩张前)的质心,γ=1.15;只作用 xy 两列,z 是离散切片轴- (30–40 层、间距 10–15),离开切片栅格会直接砸 occupancy。-- 扩张在 jitter 与终缩放(scale_to_rms 到 target_rms)**之前**执行,全局- RMS 仍精确等于 target(out_rms=149.228=target_rms),表达、细胞数、- 组成、选胞结果均逐位不变——机制只改坐标。-- PLAN 原型(绕各型质心 μ_c、f_c=min(1+α(n_c/k_c−1),cap)、k_c<3 跳过)- 已实现保留(`SPREAD_MU=type`),但在代理上被证伪(见下)。-- 单输入退路:无括号、无 b 侧,扩张自动跳过,与父节点一致。+本节点新增(`SEL_SIDE=both`,默认 `b`): -## 机制证据(mechanism_evidence)+1. **a 侧中间态选胞(PLAN 原型,`SEL_A_MODE=plain`)**:与 b 侧完全对称——每个共有型内+ 按 z-scored 表达空间到混合质心 (1−t)μ_a+tμ_b 的欧氏距离升序取配额内最近的细胞。+2. **保空间分层变体(`SEL_A_MODE=spatial`,本节点新设计)**:先做父节点的无偏均匀抽取+ 作为"空间模板",按 (型, 对齐坐标的分位箱 nbins^3) 分组,每组配额用该组内**距混合质心+ 最近**的细胞重填。构造上保持逐型逐区域的占据数与无偏抽样完全相同,只改细胞身份,+ 目的是拿到表达收益而不付 occupancy/shape 代价。+3. **RNG 隔离**:a 侧改用 `default_rng([seed,7])`(spatial 模式完全确定性),+ 主 rng 仍先执行一次与父节点相同的无偏抽取以消费同样的随机流,因此+ `SEL_SIDE=b` 时 b 侧选胞、膨胀、jitter 与父节点**逐位一致**(h5py 递归逐数组比对 True)。+4. 单输入退路不变:无括号、无选胞、无膨胀。 -- b 侧共有型 n_c/k_c ≈ 24.5 且几乎与型无关(n_b=1300 vs E8.0 31671 细胞,- 比例分配):α∈{0.15,0.3,0.5} 全部饱和到 cap,α 搜索退化,唯一有效旋钮- 是 cap 本身(f_c≡cap,11 个共有型全部被扩张,无 k_c<3 跳过;实测- k_c∈{5..227})。机制确实运行:b 侧细胞到质心平均距离比 = f = 1.15。-- 四组分变化(A 半,seed 0,父 60.74 → 提交 61.14):- shape_scale 71.27→72.18(d2_shape 0.0192→0.0123),local_spatial- 58.36→59.03,expression_change 60.50→60.50、cell_state 52.84→52.84- (坐标机制按设计不碰这两组)。occupancy_dice 0.79→0.772 微降、被- d2_shape 改善抵消有余。seed 1:61.62(shape 72.28,local 60.00)。-- 与常数位移的区别:绕质心的径向膨胀改变的是 b 侧云的离散度/占据范围,- 不是型均值的平移;每细胞位移与其到质心的偏移成正比,方向各异。+## 机制证据(mechanism_evidence,A 半,E6.75+E8.0→E7.25,t=0.4) -## 机制对照(mechanism_off_control)+机制确实运行、确实改变了细胞身份:a 侧被选细胞到混合质心的平均距离+13.56 → 10.69(spatial nbins=2,34% 的 a 细胞被替换)/ 13.32 → 10.40(plain,48.5% 被替换);+11 个共有型中 7 个(Allantois、Caudal Epiblast、EXE-Endoderm、ExEM-1/2、HEM-Endoth、+LPM、Primitive Streak、SOM、Unknown、pSE 中距离有限者)参与排序,非共有型(Anterior+Epiblast、EXE-Ectoderm、Gut Endoderm、CP、Blood Progenitor、PHM/PAM、aSE)保持模板不变。 -`SPREAD_ALPHA=0` 关闭扩张:输出与父节点 7 的预测**逐位一致**(本地-h5py 逐数组比对 True),代理 A 半即父分 60.74。打开(γ=1.15)61.14 /-seed1 61.62。机制净贡献:榜分 +0.4(seed0,A 半噪声 ~1 内),shape_scale-+0.91、local_spatial +0.67(方向一致、只落在坐标相关组,符合机制预期)。+四组分变化(seed 0,父 61.14 → spatial nbins=2 → 61.33):+cell_state 52.84→54.01(+1.17)、expression_change 60.50→61.32(+0.82)——正是 PLAN 预期的两组,+方向一致;shape_scale 72.18→72.02(−0.16)、local_spatial 59.03→57.97(−1.06)。+de_score 0.25→0.2857、de_direction 0.3645→0.3699、variogram 0.01094→0.00993 改善,+但 neighborhood_mmd 0.05314→0.05548 恶化(local_spatial 的损失全部来自它)。 -## 代理查分全表(E6.75+E8.0→E7.25,t=0.4,seed 0,A 半)+## 机制对照(mechanism_off_control)与查分全表 -| 配置 | 榜分 | shape | dice | d2_shape | local |-|---|---:|---:|---:|---:|---:|-| 父 node 7(γ=1) | 60.74 | 71.27 | ~0.79 | ~0.019 | 58.36 |-| type-wise xyz cap1.2 | 59.61 | 66.55 | 0.746 | 0.0251 | 58.54 |-| type-wise xyz cap1.6(PLAN 默认) | 57.01 | 56.17 | 0.639 | 0.0600 | 58.51 |-| type-wise xy cap1.3 | 60.29 | 68.79 | 0.755 | 0.0192 | 59.02 |-| type-wise xy cap1.6 | 58.47 | 61.45 | 0.697 | 0.0385 | 59.06 |-| global xyz γ1.1 | 60.30 | 69.53 | 0.756 | 0.0174 | 58.31 |-| global xy γ1.05 | 61.05 | 71.81 | 0.790 | 0.0157 | 59.06 |-| global xy γ1.1 | 61.15 | 72.18 | 0.783 | 0.0138 | 59.07 |-| **global xy γ1.15(提交)** | **61.14** | **72.18** | 0.772 | 0.0123 | 59.03 |-| global xy γ1.2 | 61.16 | 72.25 | 0.766 | 0.0115 | 59.03 |-| global xy γ1.35 | 60.62 | 70.20 | 0.735 | 0.0134 | 58.93 |-| global xy γ1.5 | 59.52 | 65.88 | 0.685 | 0.0209 | 58.87 |+`SEL_SIDE=b`(关闭 a 侧选胞)输出与父节点 11 **逐位一致**,A 半 61.14(seed0)/ 61.62(seed1),+与父节点记录的 61.14 / 61.62 相同。打开后(两种子): -结论:PLAN 的型内扩张(绕型质心)单调有害——把细胞撒进参考不占据的体素,-dice 崩;γ 全局膨胀在 1.05–1.2 有平台,取中值 1.15。z 向扩张有害-(xyz vs xy 同 γ 差 ~0.9 分),与方法卡"z 是离散切片"的警告一致。+| 配置 | seed0 | seed1 | 均值 | cell_state | expr_change | shape | local |+|---|---:|---:|---:|---:|---:|---:|---:|+| 父 SEL_SIDE=b(**提交**) | **61.14** | **61.62** | **61.38** | 52.84/53.27 | 60.50/60.93 | 72.18/72.28 | 59.03/60.00 |+| both, plain(PLAN 原型) | 60.97 | – | – | 53.53 | 61.09 | 71.20 | 58.08 |+| both, plain(RNG 隔离) | 60.95 | – | – | 53.79 | 59.70 | 72.31 | 58.00 |+| both, spatial nbins=2 | 61.33 | 60.87 | 61.10 | 54.01/53.40 | 61.32/60.62 | 72.02/71.65 | 57.97/57.83 |+| both, spatial nbins=3 | 61.00 | – | – | 52.84 | 61.21 | 71.80 | 58.16 |+| both, spatial nbins=4 | 60.84 | – | – | 53.08 | 60.41 | 71.74 | 58.12 |++结论:**PLAN 的机制在代理上被证伪**。cell_state 收益(+0.9~+1.2)稳定存在且方向符合预期,+但 local_spatial 一致损失 1.0~2.2(neighborhood_mmd 0.0531→0.0551~0.0558),+两种子均值净 −0.28,落在 T2 噪声(~1)内偏负。分层箱数 2→3→4 单调变差,+说明损失不是"粗箱内远距离换位"造成的(occupancy_dice 反而持平/略升 0.7716→0.7766),+而是把 a 侧细胞的身份换成"更偏晚端"的细胞后,其表达与其空间邻域在参考 E7.25 中的+局部耦合被破坏。这与节点 12 的教训同型(cell_state +1.2 / local −2.0,净负):+在本代理上 **local_spatial 对"细胞身份—位置耦合"极敏感,任何以牺牲真实配对换取+中间态表达的做法都得不偿失**。对照 b 侧:同样的中间态排序在 b 侧(1300/31671,4% 抽样)+是净收益(node 7:cell_state +4.7 且 local 57.27→60.00),因为 b 侧抽样率低、+选入的是目标时刻的代表性细胞;a 侧抽样率 52%,筛选只能改变既有位置的细胞身份。 ## 验证过 / 没验证 -- 验证:默认输出 = 查分 61.14 的文件逐位一致;seed 0 重跑确定性;- seed 1 通过 vec-check 且 61.62;SPREAD_ALPHA=0 与父逐位一致;- vec-check seed 0/1 均 ok;运行 ~2s、内存远低于 28GB。-- 未验证:final 真实括号(E7.25+E8.0→E7.5,t=1/3)上 γ=1.15 的迁移性——- γ 是常数而非随 n_c/k_c 自适应(κ 固定 0.65,t 变化只改 n_b 总量,- b/a 占据失衡的方向相同);B 半与 A 半有 ~1 分噪声。榜分增幅 +0.4- 在噪声内,但改动只影响坐标两组且方向一致(shape +0.9 / local +0.7),- 期望 B 半 rank3 为正。-- 生物学依据(通用知识,不涉禁窗测量):z 为离散切片栅格(方法卡),- 插值目标的空间占据应介于两括号之间;组成阻尼减少晚端细胞后其占据- 区域欠采样,径向膨胀恢复覆盖而不改变细胞身份。+- 验证:`SEL_SIDE=b` 与父输出逐位一致(seed 0/1);seed 0/1 确定性重跑一致;+ vec-check seed 0/1 ok;运行 ~2s、峰值内存 <1GB(限制 28GB / 30min);+ 不读绝对时间、不读视图路径/board 字段,只用时间差与 seed(伪装视图无关)。+- 验证:`SEL_SIDE=both/a` 三种模式(plain、spatial nbins=1..4)全部跑通并查分(8 次查询)。+- 未验证:a 侧选胞在真实括号(E7.25+E8.0→E7.5,t=1/3,a 侧抽样率更高)上的表现——+ 代理上已净负,未冒险提交;B 半与 A 半有 ~1 分噪声,但两种子方向一致(seed0 +0.19、+ seed1 −0.75),不足以支持提交。+- 生物学依据(通用知识,不涉禁窗测量):中间态偏好 = 假设目标时刻的细胞群更接近+ 两括号型均值的线性混合(谱系连续、无突然出现的新程序);z 为离散切片栅格(方法卡),+ 故所有坐标扰动仍只在 xy。 ## 下一步建议 -γ 与 κ 联调(κ=0.75 side-b 代理 60.54、shape 72.08,配 γ≈1.1 可能更高);-occupancy_dice 仍是 shape 短板(0.77 vs node2 的 ~0.84),可试按体素占据-缺失方向的非各向同性补偿,或对被丢弃 b 细胞做"占据幽灵"仅参与坐标侧。+1. local_spatial 是 a 侧任何"换身份"操作的硬约束:若还想提 cell_state,必须**同时生成+ 新坐标**(例如把 a 侧被替换细胞的坐标也按邻域重排/插值到新位置),保持身份—位置耦合,+ 而不是把中间态表达钉在早期位置上。+2. 反向利用本节点的发现:b 侧低抽样率下中间态排序有效、a 侧高抽样率下无效 →+ 可试**降低 a 侧抽样率、提高 b 侧**(κ 上调到 0.75~0.85)并把选胞只留在 b 侧,+ 同时用 γ 补占据;父节点已提示 κ=0.75 的 shape 更高(72.08)。+3. shape_scale 72.2 / occupancy_dice 0.77 仍是最大余量所在(node 2 的 dice ~0.84):+ 各向同性 γ 已到平台,建议按体素占据缺失方向做非各向同性补偿。diff --git a/solution/run.py b/solution/run.pyindex 759095e..896635c 100644--- a/solution/run.py+++ b/solution/run.py@@ -38,6 +38,20 @@ Mechanism-off control: env SELECTION=uniform disables the midstate ranking; env SPREAD_ALPHA=0 disables the dilation and reproduces the parent bit-for-bit. Single-input fallback: identical to the parent (no bracket, no b side, dilation skipped).++Change (PLAN T2EI-09, node 13): a-side (early bracket) midstate selection,+SEL_SIDE=both. Symmetric to the b side: within each shared type, cells are+ranked by their distance to the blended centroid (1-t)*mu_a + t*mu_b and the+quota is refilled from the closest end. SEL_A_MODE=spatial additionally+preserves the spatial profile of an unbiased draw: the quota of every+(type, quantile-box) group of the uniform template is refilled with the+closest cells of the SAME group, so per-type per-region occupancy is exactly+the unbiased one. FALSIFIED on the proxy (2 seeds, A half): cell_state++0.9..+1.2 and expression_change +0.8 as predicted, but local_spatial+-1.0..-2.2 (neighborhood_mmd 0.0531 -> 0.0551..0.0558) because the a side is+52% sampled, so selection swaps cell identities at fixed positions and breaks+the identity/location coupling the reference has; net -0.28. Submitted+default is therefore SEL_SIDE=b, bit-identical to node 11. """ from __future__ import annotations@@ -61,7 +75,10 @@ SEL_P = float(os.environ.get("SEL_P", "1.0")) SEL_TARGET = os.environ.get("SEL_TARGET", "blend").strip().lower() KAPPA = float(os.environ.get("KAPPA", "0.65")) SEL_C = float(os.environ.get("SEL_C", "0.0"))-SEL_SIDE = os.environ.get("SEL_SIDE", "b").strip().lower()+SEL_SIDE = os.environ.get("SEL_SIDE", "b").strip().lower() # b|a|both (both = PLAN T2EI-09, falsified on proxy)+SEL_A_MODE = os.environ.get("SEL_A_MODE", "spatial").strip().lower() # plain|spatial+SEL_A_BINS = int(os.environ.get("SEL_A_BINS", "2"))+SEL_C_A = float(os.environ.get("SEL_C_A", "0.0")) MIN_RANK_POOL = 5 SPREAD_ALPHA = float(os.environ.get("SPREAD_ALPHA", "0.3")) SPREAD_CAP = float(os.environ.get("SPREAD_CAP", "1.15"))@@ -164,7 +181,10 @@ def _type_dists(Z: np.ndarray, labels: np.ndarray, Z_other: np.ndarray, labels_o return d -def _select_side(labels: np.ndarray, k: int, rng: np.random.Generator, d: np.ndarray | None) -> np.ndarray:+def _select_side(labels: np.ndarray, k: int, rng: np.random.Generator, d: np.ndarray | None,+ sel_p: float | None = None, sel_c: float | None = None) -> np.ndarray:+ sel_p = SEL_P if sel_p is None else float(sel_p)+ sel_c = SEL_C if sel_c is None else float(sel_c) if k <= 0: return np.array([], dtype=int) if k >= len(labels):@@ -181,12 +201,12 @@ def _select_side(labels: np.ndarray, k: int, rng: np.random.Generator, d: np.nda and idx.size >= MIN_RANK_POOL and kt < idx.size and np.isfinite(d[idx]).all()- and rng.random() < SEL_P+ and rng.random() < sel_p ) if use_rank: dd = d[idx]- if SEL_C > 0.0:- sigma = SEL_C * float(dd.std()) + 1e-12+ if sel_c > 0.0:+ sigma = sel_c * float(dd.std()) + 1e-12 key = dd / sigma + rng.gumbel(0.0, 1.0, size=dd.shape[0]) else: key = dd@@ -203,6 +223,72 @@ def _select_side(labels: np.ndarray, k: int, rng: np.random.Generator, d: np.nda return out +def _select_spatial(labels: np.ndarray, template: np.ndarray, d: np.ndarray,+ coords: np.ndarray, nbins: int, sel_c: float = 0.0) -> np.ndarray:+ """Midstate-preference selection that preserves the template's spatial profile.++ ``template`` is a uniform (unbiased) draw of the same size, e.g. the parent's+ a-side picks. Cells of the template are grouped by (type, spatial bin), where+ bins are quantile boxes of the aligned cloud over ``nbins`` per axis. Each+ group's quota is then refilled with the cells of the same (type, bin) that are+ closest to the mid-state centroid, so the per-type per-region occupancy of the+ output equals the unbiased draw while the expression profile shifts toward the+ intermediate stage. Groups without a finite distance ranking keep the template.+ """+ lab = labels.astype(str)+ tmpl_lab = lab[template]+ C = np.asarray(coords, dtype=np.float64)+ out = []+ nb = int(max(nbins, 1))+ for tname in np.unique(tmpl_lab):+ rows_t = template[tmpl_lab == tname]+ all_t = np.flatnonzero(lab == tname)+ if nb <= 1 or all_t.size < 2 * MIN_RANK_POOL:+ out.append(_refill(rows_t, all_t, d, None, sel_c))+ continue+ edges = []+ for ax in range(C.shape[1]):+ qs = np.quantile(C[all_t, ax], np.linspace(0.0, 1.0, nb + 1)[1:-1])+ qs = np.unique(qs)+ edges.append(qs)+ bt = _binof(C[rows_t], edges)+ ba = _binof(C[all_t], edges)+ for bv in np.unique(np.concatenate([bt, ba])):+ q_rows = rows_t[bt == bv]+ if q_rows.size == 0:+ continue+ cand = all_t[ba == bv]+ out.append(_refill(q_rows, cand, d, None, sel_c))+ res = np.concatenate(out) if out else np.array([], dtype=int)+ return np.unique(res)+++def _binof(P: np.ndarray, edges) -> np.ndarray:+ code = np.zeros(P.shape[0], dtype=np.int64)+ for ax, e in enumerate(edges):+ code = code * (len(e) + 1) + np.searchsorted(e, P[:, ax], side="right")+ return code+++def _refill(quota_rows: np.ndarray, cand: np.ndarray, d: np.ndarray,+ _unused, sel_c: float) -> np.ndarray:+ """Take len(quota_rows) cells from cand with the smallest mid-state distance."""+ kt = int(quota_rows.size)+ if cand.size <= kt:+ return np.sort(quota_rows)+ dd = d[cand]+ if not np.isfinite(dd).all():+ keep = np.flatnonzero(np.isfinite(dd))+ if keep.size <= kt:+ return np.sort(quota_rows)+ cand, dd = cand[keep], dd[keep]+ if sel_c > 0.0:+ sigma = sel_c * float(dd.std()) + 1e-12+ rs = np.random.RandomState(12345)+ dd = dd / sigma + rs.gumbel(0.0, 1.0, size=dd.shape[0])+ return cand[np.argsort(dd, kind="stable")[:kt]]++ def main() -> None: parser = argparse.ArgumentParser() parser.add_argument("--data", required=True)@@ -251,7 +337,23 @@ def main() -> None: if SEL_SIDE in ("both", "b"): db = _type_dists(Zb, lb, Za, la, shared, t, SEL_TARGET) - ia = _select_side(stage_a.labels, n_a, rng, da)+ ia = _select_side(stage_a.labels, n_a, rng, None) # unbiased draw, same rng stream as parent+ a_diag = {}+ if da is not None and ia.size and n_a < stage_a.n:+ if SEL_A_MODE == "spatial":+ ia_sel = _select_spatial(stage_a.labels, ia, da, ca, SEL_A_BINS, SEL_C_A)+ else:+ rng_a = np.random.default_rng([args.seed, 7])+ ia_sel = _select_side(stage_a.labels, n_a, rng_a, da, SEL_P, SEL_C_A)+ fin = np.isfinite(da[ia]) & np.isfinite(da[ia_sel]) if ia_sel.size == ia.size else np.array([])+ if ia_sel.size == ia.size:+ a_diag = {+ "a_mode": SEL_A_MODE, "a_bins": SEL_A_BINS,+ "a_d_unif": float(np.mean(da[ia][fin])) if fin.size else None,+ "a_d_sel": float(np.mean(da[ia_sel][fin])) if fin.size else None,+ "a_changed_frac": float(np.mean(~np.isin(ia_sel, ia))),+ }+ ia = ia_sel ib = _select_side(stage_b.labels, n_b, rng, db) spread_plan = []@@ -308,7 +410,7 @@ def main() -> None: "spread_alpha": SPREAD_ALPHA, "spread_cap": SPREAD_CAP, "spread_when": SPREAD_WHEN if SPREAD_ALPHA > 0 else "off", "spread_scope": SPREAD_SCOPE, "n_spread_types": len(spread_diag),- "spread": spread_diag,+ "spread": spread_diag, "sel_side": SEL_SIDE, **a_diag, }, 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 |
| k027 | Joint expression-geometry generation with relative geometry | notes/competition/03_solution_landscape.md |
分析结果?分析员写的 ANALYSIS.json:改了什么、各组分数怎么变、假设是否成立、经验和下一步建议。
| 改了什么 | 实现 a 侧中间态选胞(SEL_SIDE=both,含 plain 与新的 spatial 保占据分层两种模式)并加 RNG 隔离;Engineer 在 A 半代理上用 8 次查询测得机制净负(cell_state +0.9~+1.2 但 local_spatial −1.0~−2.2,两种子均值 61.10 vs 父 61.38),故提交态默认关闭(SEL_SIDE=b),提交输出与父节点 11 逐位一致。 |
|---|---|
| 各组分数的变化 | cell_state:噪声内(0.00,54.35→54.35) expression_change:噪声内(0.00,61.08→61.08,提交配置与父逐位一致) local_spatial:噪声内(0.00,60.69→60.69) shape_scale:噪声内(0.00,72.48→72.48) |
| family_id | T2EI-09 |
| 假设是否成立 | 否 |
| 经验 |
|
| mechanism_active | 否 |
| 下一步建议 |
|
对话摘要?每个角色和大模型对话的统计:轮数、工具调用、用时、token 数和最后的回答摘录;原始记录只给路径。
只给统计和最后回答的摘录;完整对话请到原始记录位置里列出的文件看。
分析员
| 角色?调研员写计划、工程师改代码、分析员解读分数、审查员检查作弊。 | 分析员 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数?大模型一共回复了几轮(每轮可以调用多个工具)。 | 4 |
| 工具调用?大模型调用读文件、执行命令等工具的次数,按工具名统计。 | 共 3 次:bash 1、write 1、edit 1 |
| 用时 | 不到 1 分 |
| token 数?输入 / 输出(含思考)的 token 数,来自接口返回的用量。 | 输入 12,813 · 输出 1,139 · 思考 310 |
| 任务(第一行) | 分析节点 n13 的打分结果,写 ANALYSIS.json |
| 最后的回答(摘录) | ANALYSIS.json written |
| 原始记录位置?完整对话记录在 Spark 上的文件路径;看板不复制原始内容。 | /home/spark-longxinyang/vec/runs/formal/20261003-043412-search-t2-embryo-interp-g24-D-s1/nodes/13/analyst.jsonl 12 KB /home/spark-longxinyang/vec/runs/formal/20261003-043412-search-t2-embryo-interp-g24-D-s1/nodes/13/analyst.stderr |
工程师
| 角色 | 工程师 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数 | 27 |
| 工具调用 | 共 33 次:bash 23、edit 7、read 2、write 1 |
| 用时 | 13 分 |
| token 数 | 输入 63,884 · 输出 11,944 · 思考 13,218 |
| 任务(第一行) | 按计划修改程序:双侧中间态选胞:a侧也按到混合质心距离择优 |
| 最后的回答(摘录) | 提交完成。父配置(SEL_SIDE=b)作为默认,与节点 11 逐位一致、vec-check ok、确定性通过。 **做了什么**:按 PLAN T2EI-09 实现 a 侧中间态选胞,含两个变体——`plain`(与 b 侧对称的型内到混合质心排序)和新设计的 `spatial`(先做无偏均匀抽取当空间模板,按 (型, 分位箱) 分组、组内用距混合质心最近的细胞重填配额,构造上保持逐型逐区域占据不变)。加了 RNG 隔离,`SEL_SIDE=b` 时与父输出逐位一致。 **查分结果(A 半,8 次查询)**:机制确实运行——a 侧被选细胞到混合质心平均距离 13.56→10.69(spatial)/13.32→10.40(plain),cell_state +0.9~+1.2、expression_change +0.8(PLAN 预期两组、方向一致)。但 local_spatial 一致下降 1.0~2.2(neighborhood_mmd 0.0531→0.0551~0.0558)。两种子均值:父 61.38 vs spatial 61.10(seed0 +0.19、seed1 −0.75),**净负、机制被证伪**,故默认关闭。分层箱数 2→3→4 单调变差,说明损失不是粗箱换位,而是 a 侧 52% 高抽样率下"换身份不换位置"破坏了身份—位置耦合(与节点 12 同型教训)。 **下一步最值得试**:(1) 降 a 侧抽样率、升 b 侧(κ→0.75~0.85)并把选胞只留 b 侧,配 γ 补占据——b 侧低抽样率下中间态选胞是净收益(node 7 cell_state +4.7),a 侧高抽样率下无效;(2) shape_scale 72.2 / occupancy_dice 0.77 是最大余量(node 2 dice~0.84),各向同性 γ 已到平台,改按体素占据缺失方向做非各向同性补偿。 |
| 原始记录位置 | /home/spark-longxinyang/vec/runs/formal/20261003-043412-search-t2-embryo-interp-g24-D-s1/nodes/13/engineer.jsonl 171 KB /home/spark-longxinyang/vec/runs/formal/20261003-043412-search-t2-embryo-interp-g24-D-s1/nodes/13/engineer.stderr |
调研员
| 角色 | 调研员 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数 | 1 |
| 工具调用 | 共 0 次:— |
| 用时 | 1 分 |
| token 数 | 输入 12,381 · 输出 846 · 思考 3,607 |
| 任务(第一行) | 为节点 n13(改进,父节点 n11)写改进计划 PLAN.json |
| 最后的回答(摘录) | ```json
{
"name": "双侧中间态选胞:a侧也按到混合质心距离择优",
"motivation": "cell_state 54.35 是四组最弱。节点7消融显示中间态选胞在κ=0.65基础上额外贡献+4.7(48.17→52.84),但目前选胞只作用于b侧(SEL_SIDE=b),a侧细胞仍均匀抽取,包含大量远离中间态的早期细胞。目标时刻介于两括号之间,a侧也应优先选已在向中间过渡的细胞。expression_change 61.08 也可能因此受益(选入细胞表达更接近中间态)。",
"approach": "在父节点11的run.py上扩展SEL_SIDE:新增'both'选项。对a侧(早端括号)每个共有型,同样在z-scored表达空间计算到混合质心(1−t)μ_a+tμ_b的欧氏距离,按距离升序取配额内最近的细胞(与b侧逻辑完全对称)。步骤:(1) 在现有b侧选胞代码旁加a侧分支,SEL_SIDE=both时两侧都执行,SEL_SIDE=b时与父节点逐位一致;(2) a侧SEL_P初始=1.0(确定性),若cell_state不升反降,试0.8(保留20%随机);(3) 其余参数不变(κ=0.65, γ=1.15, SEL_TARGET=blend, scale_damp=0.5);(4) 用vec-score查A半分,先跑seed 0,若cell_state提升≥1再跑seed 1确认;(5) 单输入退路:无括号、无选胞,与父节点一致。",
"expected_groups": ["cell_state", "expression_change"],
"risks": "a侧过度筛选可能降低型内多样性,反而损害cell_state(若评分器重视分布覆盖而非均值接近);改善可能落在T2噪声(~1分)内。Engineer应在第一次vec-score后比较cell_state和expression_change是否同向变化;若cell_state下降,立即试SEL_P=0.8或回退SEL_SIDE=b。shape_scale和local_spatial因坐标随细胞走可能微变,需监控不降超1分。",
"family_id": "T2EI-09",
"mechanism": "将中间态偏好选胞从仅b侧扩展到双括号:a侧细胞也按到(1−t)μ_a+tμ_b混合质心的z-score距离排序,优先选已在向中间态过渡的细胞,使两侧输出都更代表目标时刻。",
"vs_constant_shift": "不是对型均值加常数位移或全局重加权;是在每个型内改变被抽中的具体细胞(选择函数),不同细胞因到质心距离不同而被选中或排除,改变的是细胞组成而非坐标或表达的平移。",
"mechanism_evidence": "Engineer应对比SEL_SIDE=b(父)与SEL_SIDE=both:(1) 统计a侧被选细胞到混合质心的平均距离是否显著低于均匀抽样基线(t检验或排列检验);(2) 四组分变化应集中在cell_state和expression_change,坐标组(shape_scale, local_spatial)变化应远小于前两组;(3) 若cell_state和expression_change同时提升且方向一致,机制生效。",
"mechanism_off_control": "env SEL_SIDE=b 关闭a侧选胞,输出应与父节点11逐位一致(本地h5py逐数组比对)。打开(SEL_SIDE=both)后cell_state和expression_change应有变化;若四组分全部不变,说明a侧选胞未实际运行。",
"sources": []
}
``` |
| 原始记录位置 | /home/spark-longxinyang/vec/runs/formal/20261003-043412-search-t2-embryo-interp-g24-D-s1/nodes/13/researcher.jsonl 4 KB /home/spark-longxinyang/vec/runs/formal/20261003-043412-search-t2-embryo-interp-g24-D-s1/nodes/13/researcher.stderr |
审查员
| 角色 | 审查员 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数 | 4 |
| 工具调用 | 共 9 次:read 6、bash 1、glob 1、write 1 |
| 用时 | 1 分 |
| token 数 | 输入 21,736 · 输出 1,329 · 思考 2,197 |
| 任务(第一行) | 审查节点 n13 的程序是否越界读取、写死目标、钻评分器漏洞 |
| 最后的回答(摘录) | REVIEW.json written |
| 原始记录位置 | /home/spark-longxinyang/vec/runs/formal/20261003-043412-search-t2-embryo-interp-g24-D-s1/nodes/13/reviewer.jsonl 102 KB /home/spark-longxinyang/vec/runs/formal/20261003-043412-search-t2-embryo-interp-g24-D-s1/nodes/13/reviewer.stderr |