总览 · ← 返回运行 20261003-094241-search-t2-heart-interp-g24-D-s2
节点 n22
T2HI-01 跨侧kNN配对表达插值:共有类型在表达PCA空间贪心最近邻配对,按时间分数t做配对线性插值再以强度f混回原表达(坐标不动);代理上f=0.5/1.0均劣于对照且variogram超PLAN放弃阈,提交默认f=0(逐位等于父17/19管线)。
| 运行?一次完整的自动搜索或 Agent 会话,有自己的锁定配置和证据包。 | 20261003-094241-search-t2-heart-interp-g24-D-s2 |
|---|---|
| 父节点 | n19 |
| 子节点 | n24 |
| 操作?种子:人写的起点;改进:在父节点上改;草稿:从头写;修复:修父节点的报错。 | 改进 |
| 状态 | 已打分 |
| 分数 | 搜索目标分 66.58(+0.0) · proxy 66.58(+0.0) · 3 次复测均分 66.60 |
| 审查 | 通过 1 越界读取:未发现问题。run.py 仅通过 src.task2_spatial.view_io(load_manifest/read_stage/panel_genes/write_t2)以传入的 view 参数读数据,全文无绝对路径、'..'、/mnt、/home、data/raw、downloads、src/common/evaluation 或打分器路径,无任何联网代码。; 2 硬编码目标统计量:未发现问题。run.py 中没有细胞类型名、比例表、基因列表或细胞数常量;类型集合由 np.unique(labels) 现场得出(composition/type_centroids 等… |
| 用时?从运行开始到结束(或到现在)的挂钟时间。 | 27 分 |
| 程序版本 | 46467c91174fe42920a9421b2fb314e5cfd24c60 (programs.git) |
方法说明?节点程序自带的 METHOD.md:这个程序做了什么、为什么。
来自 programs.git 46467c9117:solution/METHOD.md
T2HI-01 跨侧kNN配对表达插值:共有类型在表达PCA空间贪心最近邻配对,按时间分数t做配对线性插值再以强度f混回原表达(坐标不动);代理上f=0.5/1.0均劣于对照且variogram超PLAN放弃阈,提交默认f=0(逐位等于父17/19管线)。
方法族与机制(PLAN T2HI-01,family T2HI-01)
在父 19(=父 17 管线:procrustes 对齐 → logit 配额混抽 → 同型 kNN 收缩 k=20 α=1.25 → β=1.3 逐轴方差恢复 → jitter + scale_to_rms)的配额混抽之后、同型 kNN 收缩之前插入表达侧步骤(表达与坐标解耦,插入顺序不影响坐标链):
- 每个共有类型(两侧抽取细胞均 ≥ T2HI_MATCH_MIN=5):该型全部抽取细胞表达做 SVD-PCA 取前 min(30, n−1) 维;
- PCA 空间 side-a × side-b 距离矩阵,贪心最近邻匹配(全局最小对迭代、移除已配细胞),assert 匹配对数 = min(n_a, n_b);
- 距离门控:匹配距离 > T2HI_MATCH_DMAX(2.0) × 该型中位匹配距离的对跳过,保留原表达;
- 通过门控的对在全基因空间插值 x_interp = (1−t)·x_a + t·x_b,按强度混回 x_final = (1−f)·x_orig + f·x_interp,clip ≥ 0;即 side-a 细胞向匹配对移动 f·t,side-b 移动 f·(1−t);
- 未匹配/门控拒绝的细胞表达不动;坐标全程不动;
- 环境变量:
T2HI_MATCH_F(默认 0.0 = 关闭,匹配前早退)、T2HI_MATCH_MIN(5)、T2HI_MATCH_DMAX(2.0)。
单输入/无括号走 copy_last 分支(本步不执行)。视图无关:只用时间差 t、标签、表达矩阵、manifest 上下限;不读 board/路径/阶段名/绝对时间。
机制生效证据(proxy E8.25+E9.5→E8.75,t=0.4,seed 0,f=0.5)
- 匹配统计(日志
[match_interp]逐型打印):5 个共有类型全部有操作对象——NCC a=1619 b=1079 pairs=1079、Peri 510/566→510、V-CM 1250/844→844、aPHM 817/544→544、pPHM 416/277→277;每型 pairs = min(n_a,n_b)(assert 通过),中位匹配距离 19.0–27.4,门控拒绝 0(dmax=2.0×中位数下全部通过),平均 |Δx|(全基因)33.9–39.4。 - 表达确实改变:f=0.5 与 f=0 的
.Xnp.array_equal = False;6508/17616 个细胞被改(= 2×3254 匹配对,逐对一致),逐细胞 L1 位移均值 77.2、最大 149.5,随 f 增大(f=1.0 位移加倍)——逐细胞方向大小由各自匹配对决定,不是常数位移。 - 坐标严格不变:f=0 与 f=0.5 的 obsm np.array_equal = True;四形状/邻域之外的坐标链指标(d2_shape 0.03915、occupancy_dice 0.8246、scale_log_ratio 0.4669)在全部 3 个 f 配置间逐位相同。
- 四组分变化模式符合预期方向判定:expression_change 与 cell_state 变动、shape_scale 完全不变(机制未触碰坐标,无 bug)。
关闭机制对照与网格(全部 vec-score A 半,同会话,seed 0,共 5 次查分 / 额度 20)
对照 f=0:与父 19(=父 17)默认输出 .X 与 obsm 均 np.array_equal = True(逐位复现),A 半总分 66.53、八项 raw 与父 19 同会话对照逐位一致(de_score 0.5435、de_direction 0.6619、mmd_u 0.02386、variogram 0.022669、nbd 0.04145),确认基座复现。
| f | 总分 | de_score | de_direction | mmd_u | variogram | nbd |
|---|---|---|---|---|---|---|
| 0(提交默认) | 66.53 | 0.5435 | 0.6619 | 0.02386 | 0.022669 | 0.04145 |
| 0.5 | 65.25 | 0.5435 | 0.6615 | 0.02723 | 0.028522 | 0.04382 |
| 1.0 | 64.44 | 0.5217 | 0.6584 | 0.02907 | 0.029674 | 0.04691 |
结论:机制假设不成立(如实报告,按 PLAN 决策规则放弃)
PLAN 假设「配对插值保协方差,能抬 de_score/de_direction 而不伤 variogram」。实测:
- DE 组纹丝不动甚至变差:对称配对移动在全基因伪批量上近乎抵消——每对的净贡献为 f·(2t−1)·(x_b−x_a),t=0.4 时系数仅 −0.2f,所以 de_score 在 f=0.5 与对照完全相同(0.5435),f=1.0 反而降到 0.5217(配对在 f=1 时收敛成相同点,制造重复细胞)。PLAN 的机制收益前提(de_score raw 上升 ≥0.01)被证伪。
- 分布类指标随 f 单调劣化:插值把共有类型的两侧子簇互相拉近、缩小整体方差,细胞落到真实数据流形之外——variogram +26%(f=0.5,0.022669→0.028522,远超 PLAN 放弃阈 0.022/基线+5%)、mmd_u +14%、nbd +5.7%(f=0.5)到 +13%(f=1.0)。与节点 15 均值位移同一失败模式(型内方差收缩),只是程度较轻。
- 按 PLAN 第一轮决策规则(f=0.5 variogram raw > 0.022 → 立即放弃、提交 f=0)执行;未进第二轮。未试 f<0.5:DE 收益在 f=0.5 已确认为零(不是幅度问题而是方向性抵消),减小 f 只会让各项损失收敛到对照、总分从下方逼近 66.53,无正收益区间。
因此提交默认 f=0:机制代码保留、默认关闭,输出逐位等于父节点 17/19。本节点的价值是这个负结果加机理解释:跨侧配对插值的对称位移在伪批量上抵消(DE 无收益),却必然压缩两侧子簇间方差(variogram/mmd_u/nbd 单调受损)——任何以"两侧真实细胞表达互相混合"为核心的表达侧机制(节点 15 均值位移、本节点配对插值)都已证伪。
验证过的
- f=0 默认输出与父 19 管线逐位相同(np.array_equal,.X 与 obsm);同会话查分 66.53,raw 与父对照一致。
- f=0.5 机制生效证据完整(匹配对数、门控、逐细胞位移、坐标不变),见上。
- 默认配置 seed 0 重跑逐位相同;
vec-check通过;纯 CPU ~3 s、内存 <1 GB(EXECUTION.json gpu=false 沿用父节点)。 - 视图无关:机制只用时间差 t、celltype 标签、表达矩阵;单输入走 copy_last 分支;不读 board/mode/路径/阶段名/绝对时间。
- 查分共 5 次(额度 20)。
没验证的 / 风险
- 非对称变体(只动 side-a、或两侧不同权重)未测:伪批量不再抵消,但节点 15 已证型均值方向的位移伤 variogram,且真实 E8.75 的时间非线性未知,预期收益不明确(PLAN 决策规则已判放弃,未越界尝试)。
- dmax 门控在本数据上拒绝 0 对(两侧同型转录组距离分布紧凑),门控参数未起作用,无法评估其调节能力。
- B 半正式分预期与父相同(66.58):f=0 输出逐位等于父。
下一步建议
- 表达侧「混合两侧真实细胞」家族(均值位移、配对插值)已两次证伪,不要再试对称混合类机制。
- 表达侧若继续挖,需要不缩小方差的机制:例如只在 DE 头部基因上做保序秩修正(de_score 0.52/0.54 是表达组最低单项),且修正必须逐基因、零均值、不改变细胞间协方差;或改善组成配额以外的型内分布形状(mmd_u)。
- 坐标侧已确认平台(节点 17/19),不建议再动。
调研员的计划
| 名称 | 共有类型跨侧kNN配对表达插值(保协方差,非均值位移) |
|---|---|
| 动机 | 父 19 及全部坐标侧祖先(13/15/17/19)的表达四指标从未变动:de_score 0.5213(skill 0.684)、de_direction 0.6625(skill 0.750)、mmd_u 0.02337(skill 0.713)、variogram 0.0206(skill 0.736);expression_change 71.71、cell_state 72.43 是唯一未开发空间(ANALYSIS 明确建议表达侧机制)。节点 15 的型均值位移表达插值失败(variogram 0.0206→≥0.0265,+29%),原因是向型均值收缩摧毁型内基因共变。本方案用跨侧 kNN 配对插值替代表均值位移:匹配对(x_a≈x_b)的线性组合在理论上保留协方差(Cov_new≈Cov_orig),是针对同一失败模式的不同解法。坐标侧已确认平台(节点 19 全网格跨度 0.09 < 1 分噪声),不再触碰。 |
| 做法 | 在父 17 管线的配额混抽之后、同型 kNN 收缩之前,插入表达侧步骤(表达与坐标解耦,顺序不影响坐标链): 1. 对每个共有类型(两侧抽取细胞均 ≥ T2HI_MATCH_MIN=5),将该型全部抽取细胞的表达矩阵做 SVD-PCA 取前 min(30, n−1) 维; 2. 在 PCA 空间计算 side-a × side-b 距离矩阵,贪心最近邻匹配(迭代取全局最小对、移除已配细胞),记录每型匹配对数与距离; 3. 距离门控:匹配距离 > T2HI_MATCH_DMAX(默认 2.0)× 该型中位匹配距离的细胞跳过,保留原表达; 4. 对通过门控的匹配对,在全基因空间插值:x_interp = (1−t)·x_a + t·x_b(t 为时间插值分数);再按强度 f 混回:x_final = (1−f)·x_orig + f·x_interp,clip ≥ 0。side-a 细胞向 side-b 匹配对移动权重 f·t,side-b 细胞向 side-a 移动权重 f·(1−t); 5. 未匹配/门控拒绝的细胞表达不动;坐标全程不动; 6. 环境变量:T2HI_MATCH_F(默认 0.0 = 关闭,提前返回)、T2HI_MATCH_MIN(默认 5)、T2HI_MATCH_DMAX(默认 2.0)。 网格与快筛(seed 0,proxy,vec-score A 半): - 第一轮:f ∈ {0, 0.5, 1.0}(3 次查分)。决策规则:若 f=0.5 的 variogram raw > 0.022(基线 0.0206 的 +7%),立即放弃本方向、提交 f=0;若 variogram ≤ 0.0216(+5%)且 de_score 或 de_direction raw 改善 ≥ 0.005,进入第二轮; - 第二轮:f ∈ {0.3, 0.5, 0.7}(3 次),选总分最高且 variogram ≤ 0.0216 的配置; - 第三轮(可选):最佳 f ± 0.1 精调(2 次),需与第二轮最佳值比较确认方向一致; - 总查分 ≤ 10 次(额度 20)。 - 每次查分记录 de_score、de_direction、mmd_u、variogram、neighborhood_mmd 五项 raw 及总分。 单输入/无括号退路:走 copy_last 分支,本步不执行(在混抽前已返回)。 视图无关性:只用时间差 t、标签、表达矩阵、manifest 上下限;不读 board/路径/阶段名/绝对时间。 |
| 风险 | 1. 匹配质量差(同型两侧转录组差异大、无近邻对)→ 插值产生非物理表达 → variogram/mmd_u 劣化。Engineer 在 f=0.5 首次查分即检查 variogram raw:> 0.022 立即停止,不继续网格,提交 f=0。日志应打印每型平均匹配距离以辅助判断。 2. 效果太小(总分 Δ < 1 分):de_score + de_direction 合计改善 < 0.01 raw 时,用种子 0/1/2 各跑一次确认方向一致性再下结论,避免把噪声当收益。 3. neighborhood_mmd 因表达改变而微降(坐标未动但表达-位置配对被扰动):若 nbd raw 从 0.04153 升至 > 0.043(+3.5%),需确认表达侧 de/mmd 收益是否补偿;若总分不升,降级为负结果记录。 4. 贪心匹配实现错误(自匹配、跨型匹配、重复配对):日志打印每型匹配对数应 = min(n_a, n_b),平均距离应为正有限值;用 assert 检查。 |
代码改动?这个节点的程序和父节点程序的逐行差别:绿色是新增,红色是删除。
对比:父节点版本 16e08ea7b2。改动的文件:solution/METHOD.md +43 −35、solution/run.py +120 −1
diff --git a/solution/METHOD.md b/solution/METHOD.mdindex 5b9cbb0..da5ece5 100644--- a/solution/METHOD.md+++ b/solution/METHOD.md@@ -1,53 +1,61 @@-T2HI-05 质心恢复:同型收缩后按类型把质心偏移恢复到收缩前(γ 逐型位移,只动坐标);代理网格 γ∈[-1,1] 全部平坦或更差,机制假设不成立,提交默认 γ=0(逐位等于父 17 管线)。+T2HI-01 跨侧kNN配对表达插值:共有类型在表达PCA空间贪心最近邻配对,按时间分数t做配对线性插值再以强度f混回原表达(坐标不动);代理上f=0.5/1.0均劣于对照且variogram超PLAN放弃阈,提交默认f=0(逐位等于父17/19管线)。 -## 方法族与机制(PLAN T2HI-05,family T2HI-05)+## 方法族与机制(PLAN T2HI-01,family T2HI-01) -在父节点 17 管线(procrustes → logit 配额混抽 → 同型 kNN 收缩 k=20, α=1.25 → β=1.3 逐轴方差恢复 → jitter + scale_to_rms)的逐轴恢复之后、jitter 之前,按 PLAN 原文插入逐类型质心位置恢复:+在父 19(=父 17 管线:procrustes 对齐 → logit 配额混抽 → 同型 kNN 收缩 k=20 α=1.25 → β=1.3 逐轴方差恢复 → jitter + scale_to_rms)的**配额混抽之后、同型 kNN 收缩之前**插入表达侧步骤(表达与坐标解耦,插入顺序不影响坐标链): -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 不变。表达从不触碰。+1. 每个共有类型(两侧抽取细胞均 ≥ T2HI_MATCH_MIN=5):该型全部抽取细胞表达做 SVD-PCA 取前 min(30, n−1) 维;+2. PCA 空间 side-a × side-b 距离矩阵,贪心最近邻匹配(全局最小对迭代、移除已配细胞),assert 匹配对数 = min(n_a, n_b);+3. 距离门控:匹配距离 > T2HI_MATCH_DMAX(2.0) × 该型中位匹配距离的对跳过,保留原表达;+4. 通过门控的对在全基因空间插值 x_interp = (1−t)·x_a + t·x_b,按强度混回 x_final = (1−f)·x_orig + f·x_interp,clip ≥ 0;即 side-a 细胞向匹配对移动 f·t,side-b 移动 f·(1−t);+5. 未匹配/门控拒绝的细胞表达不动;坐标全程不动;+6. 环境变量:`T2HI_MATCH_F`(默认 **0.0** = 关闭,匹配前早退)、`T2HI_MATCH_MIN`(5)、`T2HI_MATCH_DMAX`(2.0)。 -环境变量:`T2HI_INTER_GAMMA`(默认 **0.0** = 机制关闭,提前返回、逐位无操作)、`T2HI_INTER_MIN`(默认 5)。δ 逐型方向大小不同(由该型收缩前后质心偏移差决定),不是常数位移,也不改变任何类型的细胞数或表达。单输入/无括号走 copy_last 分支(在本步之前返回)。+单输入/无括号走 copy_last 分支(本步不执行)。视图无关:只用时间差 t、标签、表达矩阵、manifest 上下限;不读 board/路径/阶段名/绝对时间。 -## 机制生效证据(γ=0.5,proxy E8.25+E9.5→E8.75,seed 0)+## 机制生效证据(proxy E8.25+E9.5→E8.75,t=0.4,seed 0,f=0.5) -- 收缩确实偏移了类型质心: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。+- 匹配统计(日志 `[match_interp]` 逐型打印):5 个共有类型全部有操作对象——NCC a=1619 b=1079 pairs=1079、Peri 510/566→510、V-CM 1250/844→844、aPHM 817/544→544、pPHM 416/277→277;每型 pairs = min(n_a,n_b)(assert 通过),中位匹配距离 19.0–27.4,门控拒绝 0(dmax=2.0×中位数下全部通过),平均 |Δx|(全基因)33.9–39.4。+- 表达确实改变:f=0.5 与 f=0 的 `.X` np.array_equal = **False**;6508/17616 个细胞被改(= 2×3254 匹配对,逐对一致),逐细胞 L1 位移均值 77.2、最大 149.5,随 f 增大(f=1.0 位移加倍)——逐细胞方向大小由各自匹配对决定,不是常数位移。+- 坐标严格不变:f=0 与 f=0.5 的 obsm np.array_equal = True;四形状/邻域之外的坐标链指标(d2_shape 0.03915、occupancy_dice 0.8246、scale_log_ratio 0.4669)在全部 3 个 f 配置间逐位相同。+- 四组分变化模式符合预期方向判定:expression_change 与 cell_state 变动、shape_scale 完全不变(机制未触碰坐标,无 bug)。 -## 关闭机制对照与网格(全部 vec-score A 半,同会话,seed 0;γ=0 对照总分 66.53、d2 raw 0.03915、occ raw 0.8246、nbd raw 0.04145,与父 17 同会话值逐位一致,确认基座复现)+## 关闭机制对照与网格(全部 vec-score A 半,同会话,seed 0,共 5 次查分 / 额度 20) -| γ | 总分 | 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 |+对照 f=0:与父 19(=父 17)默认输出 `.X` 与 `obsm` 均 np.array_equal = **True**(逐位复现),A 半总分 **66.53**、八项 raw 与父 19 同会话对照逐位一致(de_score 0.5435、de_direction 0.6619、mmd_u 0.02386、variogram 0.022669、nbd 0.04145),确认基座复现。 -## 结论:机制假设不成立(如实报告)+| f | 总分 | de_score | de_direction | mmd_u | variogram | nbd |+|---:|---:|---:|---:|---:|---:|---:|+| **0(提交默认)** | **66.53** | 0.5435 | 0.6619 | 0.02386 | 0.022669 | 0.04145 |+| 0.5 | 65.25 | 0.5435 | 0.6615 | 0.02723 | 0.028522 | 0.04382 |+| 1.0 | 64.44 | 0.5217 | 0.6584 | 0.02907 | 0.029674 | 0.04691 | -PLAN 假设「收缩偏移了类型质心、恢复质心偏移可抬 d2/occ」。实测方向相反:+## 结论:机制假设不成立(如实报告,按 PLAN 决策规则放弃) -- γ>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 有一致方向支撑。+PLAN 假设「配对插值保协方差,能抬 de_score/de_direction 而不伤 variogram」。实测: -因此提交默认 γ=0:机制代码保留、默认关闭,输出逐位等于父节点 17(对照已验证)。本节点的价值是这个负结果:**型间质心几何在「收缩+逐轴恢复」之后已处于局部最优,沿 (d_pre−d_post) 方向的逐型位移(无论恢复还是加压)都是死路**。父节点 next_suggestions 里的「按型间质心距离比逐对缩放质心偏移」与本网格位移方向高度重叠,预期同样平坦,不建议再试。+1. **DE 组纹丝不动甚至变差**:对称配对移动在全基因伪批量上近乎抵消——每对的净贡献为 f·(2t−1)·(x_b−x_a),t=0.4 时系数仅 −0.2f,所以 de_score 在 f=0.5 与对照完全相同(0.5435),f=1.0 反而降到 0.5217(配对在 f=1 时收敛成相同点,制造重复细胞)。PLAN 的机制收益前提(de_score raw 上升 ≥0.01)被证伪。+2. **分布类指标随 f 单调劣化**:插值把共有类型的两侧子簇互相拉近、缩小整体方差,细胞落到真实数据流形之外——variogram +26%(f=0.5,0.022669→0.028522,远超 PLAN 放弃阈 0.022/基线+5%)、mmd_u +14%、nbd +5.7%(f=0.5)到 +13%(f=1.0)。与节点 15 均值位移同一失败模式(型内方差收缩),只是程度较轻。+3. 按 PLAN 第一轮决策规则(f=0.5 variogram raw > 0.022 → 立即放弃、提交 f=0)执行;未进第二轮。未试 f<0.5:DE 收益在 f=0.5 已确认为零(不是幅度问题而是方向性抵消),减小 f 只会让各项损失收敛到对照、总分从下方逼近 66.53,无正收益区间。++因此提交默认 f=0:机制代码保留、默认关闭,输出逐位等于父节点 17/19。本节点的价值是这个负结果加机理解释:**跨侧配对插值的对称位移在伪批量上抵消(DE 无收益),却必然压缩两侧子簇间方差(variogram/mmd_u/nbd 单调受损)——任何以"两侧真实细胞表达互相混合"为核心的表达侧机制(节点 15 均值位移、本节点配对插值)都已证伪**。 ## 验证过的 -- γ=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)。+- f=0 默认输出与父 19 管线逐位相同(np.array_equal,.X 与 obsm);同会话查分 66.53,raw 与父对照一致。+- f=0.5 机制生效证据完整(匹配对数、门控、逐细胞位移、坐标不变),见上。+- 默认配置 seed 0 重跑逐位相同;`vec-check` 通过;纯 CPU ~3 s、内存 <1 GB(EXECUTION.json gpu=false 沿用父节点)。+- 视图无关:机制只用时间差 t、celltype 标签、表达矩阵;单输入走 copy_last 分支;不读 board/mode/路径/阶段名/绝对时间。+- 查分共 5 次(额度 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、禁窗)或保留基因型的测量信息。+- 非对称变体(只动 side-a、或两侧不同权重)未测:伪批量不再抵消,但节点 15 已证型均值方向的位移伤 variogram,且真实 E8.75 的时间非线性未知,预期收益不明确(PLAN 决策规则已判放弃,未越界尝试)。+- dmax 门控在本数据上拒绝 0 对(两侧同型转录组距离分布紧凑),门控参数未起作用,无法评估其调节能力。+- B 半正式分预期与父相同(66.58):f=0 输出逐位等于父。++## 下一步建议++- 表达侧「混合两侧真实细胞」家族(均值位移、配对插值)已两次证伪,不要再试对称混合类机制。+- 表达侧若继续挖,需要**不缩小方差**的机制:例如只在 DE 头部基因上做保序秩修正(de_score 0.52/0.54 是表达组最低单项),且修正必须逐基因、零均值、不改变细胞间协方差;或改善组成配额以外的型内分布形状(mmd_u)。+- 坐标侧已确认平台(节点 17/19),不建议再动。diff --git a/solution/run.py b/solution/run.pyindex 0c3e2af..d75b263 100644--- a/solution/run.py+++ b/solution/run.py@@ -10,7 +10,24 @@ 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, inter-type centroid restore):+Addition in this node (T2HI-01, cross-side kNN paired expression interpolation):+- env T2HI_MATCH_F (default 0.0 = off, early return before any matching):+ for every shared type with >= T2HI_MATCH_MIN (5) drawn cells per side, PCA+ (economy SVD, min(30, n-1) dims) of the type's drawn cells, greedy global-min+ nearest-neighbour matching side-a x side-b in PCA space, distance gate+ (skip pairs > T2HI_MATCH_DMAX (2.0) x median match distance), then full-gene+ interpolation x_interp = (1-t)*x_a + t*x_b blended back as+ x_final = (1-f)*x_orig + f*x_interp (side-a cells move f*t toward their match,+ side-b cells f*(1-t)); clip >= 0. Coordinates never touched. MEASURED HARMFUL+ on proxy (f=0.5: 65.25 vs 66.53 control; f=1.0: 64.44): symmetric paired+ motion cancels in pseudobulk so de_score is unchanged (0.5435 both at f=0 and+ f=0.5, A-half), while blending pulls the two side sub-clusters of shared+ types together and shrinks variance: variogram 0.02267 -> 0.02852 (+26%) ->+ 0.02967, mmd_u 0.02386 -> 0.02723 -> 0.02907, neighborhood_mmd 0.04145 ->+ 0.04382 -> 0.04691, all monotone in f. Submitted default f=0 is a bit-for-bit+ reproduction of the parent pipeline (verified np.array_equal on .X and obsm).++Kept from parent (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@@ -319,6 +336,95 @@ def expr_interp( return out, n_types, n_genes, std_after - std_before +def match_interp(+ expr: np.ndarray,+ la_sel: np.ndarray,+ lb_sel: np.ndarray,+ n_a: int,+ t: float,+ f: float,+ dmax_mult: float,+ min_count: int,+):+ """Cross-side kNN paired expression interpolation for shared types (T2HI-01).++ For every type drawn on both sides with >= min_count cells per side:+ 1. PCA (economy SVD) of the type's drawn cells to min(30, n-1, n_genes) dims;+ 2. greedy global-min nearest-neighbour matching between side-a and side-b+ cells in PCA space (each cell used at most once, pairs = min(na, nb));+ 3. gate: pairs with distance > dmax_mult * median match distance are skipped+ (original expression kept);+ 4. gated-in pairs interpolate in full gene space:+ x_interp = (1-t)*x_a + t*x_b, blended back as+ x_final = (1-f)*x_orig + f*x_interp, i.e. side-a cells move f*t*(x_b-x_a)+ toward their match and side-b cells move f*(1-t)*(x_a-x_b). Clip >= 0.+ Coordinates are never touched. f=0 is a bit-for-bit no-op (early return).+ Returns (expr, report); report rows:+ (ty, na, nb, n_pairs, n_ok, n_gated, med_dist, mean|delta|).+ """+ if f == 0.0 or expr.shape[0] == 0 or n_a <= 0:+ return expr, []+ n_b = expr.shape[0] - n_a+ if n_b <= 0:+ return expr, []+ out = expr.copy()+ report = []+ for ty in sorted(set(la_sel.tolist()) & set(lb_sel.tolist())):+ ia = np.flatnonzero(la_sel == ty)+ ib = n_a + np.flatnonzero(lb_sel == ty)+ if ia.size < min_count or ib.size < min_count:+ continue+ rows = np.concatenate([ia, ib])+ sub = expr[rows].astype(np.float64)+ dev = sub - sub.mean(axis=0)+ k = int(min(30, sub.shape[0] - 1, sub.shape[1]))+ if k < 1:+ continue+ _, _, Vt = np.linalg.svd(dev, full_matrices=False)+ Z = dev @ Vt[:k].T+ Za = Z[: ia.size]+ Zb = Z[ia.size :]+ D2 = (Za**2).sum(1)[:, None] + (Zb**2).sum(1)[None, :] - 2.0 * (Za @ Zb.T)+ D = np.sqrt(np.maximum(D2, 0.0))+ m = int(min(D.shape))+ order = np.argsort(D, axis=None, kind="stable")+ used_a = np.zeros(D.shape[0], dtype=bool)+ used_b = np.zeros(D.shape[1], dtype=bool)+ pairs = []+ for flat in order:+ if len(pairs) >= m:+ break+ i, j = np.unravel_index(int(flat), D.shape)+ if used_a[i] or used_b[j]:+ continue+ used_a[i] = True+ used_b[j] = True+ pairs.append((i, j, float(D[i, j])))+ assert len(pairs) == m, f"greedy matching produced {len(pairs)} != min(na,nb)={m}"+ dists = np.array([p[2] for p in pairs])+ med = float(np.median(dists))+ gate = dmax_mult * med+ n_ok = 0+ n_gated = 0+ dnorms = []+ for i, j, d in pairs:+ if d > gate:+ n_gated += 1+ continue+ xa = expr[ia[i]].astype(np.float64)+ xb = expr[ib[j]].astype(np.float64)+ delta = xb - xa+ out[ia[i]] = (xa + f * t * delta).astype(np.float32)+ out[ib[j]] = (xb - f * (1.0 - t) * delta).astype(np.float32)+ n_ok += 1+ dnorms.append(float(np.linalg.norm(delta)))+ report.append(+ (ty, int(ia.size), int(ib.size), m, n_ok, n_gated, med, float(np.mean(dnorms)) if dnorms else 0.0)+ )+ out = np.clip(out, 0.0, None).astype(np.float32)+ return out, report++ def composition(labels_a, labels_b, t: float, mode: str, eps: float): """Per-type target fractions at time t over the union of both sides' types.""" la = np.asarray(labels_a).astype(str)@@ -486,6 +592,19 @@ def run(view: str, out: str, seed: int) -> None: f"genes_shifted={ei_genes} mean_gene_std_change={ei_dstd:+.5f}", flush=True, )+ match_f = float(os.environ.get("T2HI_MATCH_F", "0.0"))+ match_min = int(os.environ.get("T2HI_MATCH_MIN", "5"))+ match_dmax = float(os.environ.get("T2HI_MATCH_DMAX", "2.0"))+ expr, mi_rep = match_interp(+ expr, la_sel, lb_sel, int(ia.size), float(t), match_f, match_dmax, match_min+ )+ print(f"[match_interp] f={match_f} min={match_min} dmax={match_dmax} types={len(mi_rep)}", flush=True)+ for ty, na_, nb_, npair, nok, nskip, med, dnorm in mi_rep:+ print(+ f" {ty}: a={na_} b={nb_} pairs={npair} ok={nok} gated={nskip} "+ f"med_dist={med:.3f} mean_abs_delta={dnorm:.3f}",+ flush=True,+ ) cmode = os.environ.get("T2HI_CONTRACT", "type").strip().lower() calpha = float(os.environ.get("T2HI_CONTRACT_A", "1.25")) ck = int(os.environ.get("T2HI_CONTRACT_K", "20"))
调研来源?调研员查到并用到的知识条目和文献检索结果(只列标题和编号)。
用到的知识库条目
| 编号 | 标题 | 出处 |
|---|---|---|
| k007 | Interval staging and held-out-window filtering of external data | notes/official/来件/virtualembryo.ai/rules.md |
| k013 | Rules on external data, pre-trained models and use of returned scores | notes/official/来件/virtualembryo.ai/rules.md |
| k026 | Canonicalise predicted 3D coordinates before submission | notes/pitfalls/04_scorer_invariance.md |
分析结果?分析员写的 ANALYSIS.json:改了什么、各组分数怎么变、假设是否成立、经验和下一步建议。
| 改了什么 | 实现 T2HI-01 跨侧 kNN 配对表达插值(每共有型 PCA-30 贪心最近邻匹配、2.0×中位距离门控、全基因配对插值按强度 f 混回,坐标不动,T2HI_MATCH_F 开关);proxy 网格 f=0.5/1.0 均劣于对照且 variogram 超 PLAN 放弃阈,按决策规则提交 f=0,输出与父 19(=父 17 管线)逐位相同(np.array_equal 验证 .X 与 obsm)。 |
|---|---|
| 各组分数的变化 | cell_state:与父完全相同(+0.00,72.43);网格中 f=0.5 使 mmd_u 0.02386→0.02723(+14%)、variogram 0.022669→0.028522(+26%,超 PLAN 放弃阈 0.022),单调劣化。 expression_change:与父完全相同(+0.00,71.71);提交 f=0 输出逐位等于父,非噪声而是无改动。网格中 f=0.5 时 de_score 0.5435 纹丝不动、f=1.0 反降至 0.5217(A 半)。 local_spatial:与父完全相同(+0.00,70.32);网格中 neighborhood_mmd 0.04145→0.04382(f=0.5,+5.7%)→0.04691(f=1.0,+13%),表达-位置配对被扰动而单调受损。 shape_scale:与父完全相同(+0.00,51.86);坐标全程未动,d2/occ/scale 三项在所有 f 配置间逐位一致,符合 PLAN 的 bug 判定预期(无 bug)。 |
| family_id | T2HI-01 |
| 假设是否成立 | 否 |
| 经验 |
|
| mechanism_active | 否 |
| 下一步建议 |
|
对话摘要?每个角色和大模型对话的统计:轮数、工具调用、用时、token 数和最后的回答摘录;原始记录只给路径。
只给统计和最后回答的摘录;完整对话请到原始记录位置里列出的文件看。
分析员
| 角色?调研员写计划、工程师改代码、分析员解读分数、审查员检查作弊。 | 分析员 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数?大模型一共回复了几轮(每轮可以调用多个工具)。 | 3 |
| 工具调用?大模型调用读文件、执行命令等工具的次数,按工具名统计。 | 共 2 次:bash 1、write 1 |
| 用时 | 不到 1 分 |
| token 数?输入 / 输出(含思考)的 token 数,来自接口返回的用量。 | 输入 17,993 · 输出 1,249 · 思考 1,123 |
| 任务(第一行) | 分析节点 n22 的打分结果,写 ANALYSIS.json |
| 最后的回答(摘录) | ANALYSIS.json written |
| 原始记录位置?完整对话记录在 Spark 上的文件路径;看板不复制原始内容。 | /home/spark-longxinyang/vec/runs/formal/20261003-094241-search-t2-heart-interp-g24-D-s2/nodes/22/analyst.jsonl 7 KB /home/spark-longxinyang/vec/runs/formal/20261003-094241-search-t2-heart-interp-g24-D-s2/nodes/22/analyst.stderr |
工程师
| 角色 | 工程师 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数 | 22 |
| 工具调用 | 共 23 次:bash 16、edit 3、todowrite 2、read 1、write 1 |
| 用时 | 13 分 |
| token 数 | 输入 64,987 · 输出 8,528 · 思考 11,880 |
| 任务(第一行) | 按计划修改程序:共有类型跨侧kNN配对表达插值(保协方差,非均值位移) |
| 最后的回答(摘录) | **做了什么**:按 PLAN T2HI-01 实现共有类型跨侧 kNN 配对表达插值(PCA 贪心匹配 + 距离门控 + 全基因配对插值混回,坐标不动,`T2HI_MATCH_F` 开关),插入父 19 管线的配额混抽之后、收缩之前。 **查分结果**(A 半,5/20 次额度):f=0 对照 **66.53**(与父 19 输出 `.X`/`obsm` 逐位相同,np.array_equal 验证);f=0.5 **65.25**(variogram 0.022669→0.028522,+26%,超 PLAN 放弃阈;de_score 0.5435 纹丝不动);f=1.0 **64.44**(de_score 反降到 0.5217)。机制有操作对象(5 型 3254 对全部匹配成功、6508 细胞表达被改、坐标逐位不变),但假设被证伪:对称配对位移在伪批量上抵消(净系数 f(2t−1)=−0.2f),DE 无收益,而两侧子簇互相拉近必然压缩方差。按 PLAN 决策规则提交 f=0(逐位等于父 17/19,vec-check 通过,seed 0/1 均验证)。 **下一步最值得试**:表达侧「混合两侧真实细胞」家族已两次证伪(节点 15 均值位移、本节点配对插值),不要再试对称混合类;若要挖 de_score(0.52,表达组最低项),需要不缩小方差的逐基因保序秩修正(零均值、不动细胞间协方差),或非对称单侧位移(需先验证真实括号的时间非线性方向)。坐标侧已确认平台,不建议再动。 |
| 原始记录位置 | /home/spark-longxinyang/vec/runs/formal/20261003-094241-search-t2-heart-interp-g24-D-s2/nodes/22/engineer.jsonl 149 KB /home/spark-longxinyang/vec/runs/formal/20261003-094241-search-t2-heart-interp-g24-D-s2/nodes/22/engineer.stderr |
调研员
| 角色 | 调研员 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数 | 1 |
| 工具调用 | 共 0 次:— |
| 用时 | 9 分 |
| token 数 | 输入 17,374 · 输出 14,861 · 思考 8,192 |
| 任务(第一行) | 为节点 n22(改进,父节点 n19)写改进计划 PLAN.json |
| 最后的回答(摘录) | 0.0216(+5%)且 de_score 或 de_direction raw 改善 ≥ 0.005,进入第二轮;\n- 第二轮:f ∈ {0.3, 0.5, 0.7}(3 次),选总分最高且 variogram ≤ 0.0216 的配置;\n- 第三轮(可选):最佳 f ± 0.1 精调(2 次),需与第二轮最佳值比较确认方向一致;\n- 总查分 ≤ 10 次(额度 20)。\n- 每次查分记录 de_score、de_direction、mmd_u、variogram、neighborhood_mmd 五项 raw 及总分。\n\n单输入/无括号退路:走 copy_last 分支,本步不执行(在混抽前已返回)。\n视图无关性:只用时间差 t、标签、表达矩阵、manifest 上下限;不读 board/路径/阶段名/绝对时间。",
"expected_groups": ["expression_change", "cell_state"],
"risks": "1. 匹配质量差(同型两侧转录组差异大、无近邻对)→ 插值产生非物理表达 → variogram/mmd_u 劣化。Engineer 在 f=0.5 首次查分即检查 variogram raw:> 0.022 立即停止,不继续网格,提交 f=0。日志应打印每型平均匹配距离以辅助判断。\n2. 效果太小(总分 Δ < 1 分):de_score + de_direction 合计改善 < 0.01 raw 时,用种子 0/1/2 各跑一次确认方向一致性再下结论,避免把噪声当收益。\n3. neighborhood_mmd 因表达改变而微降(坐标未动但表达-位置配对被扰动):若 nbd raw 从 0.04153 升至 > 0.043(+3.5%),需确认表达侧 de/mmd 收益是否补偿;若总分不升,降级为负结果记录。\n4. 贪心匹配实现错误(自匹配、跨型匹配、重复配对):日志打印每型匹配对数应 = min(n_a, n_b),平均距离应为正有限值;用 assert 检查。",
"family_id": "T2HI-01",
"mechanism": "对共有类型的每个抽取细胞,在表达 PCA 空间找对侧同型最近邻,按时间分数 t 做配对线性插值(x_interp=(1−t)·x_a+t·x_b),再按强度 f 混回原表达。每个细胞的位移向量 = f·(x_interp−x_orig),方向和幅度由其匹配对决定,型内逐细胞不同。与节点 15 均值位移的本质区别:配对插值保留匹配对间的个体差异和基因共变结构(Cov_new≈Cov_orig 当匹配良好时),均值位移则将所有细胞压向同一中心、摧毁型内方差。",
"vs_constant_shift": "常数位移对同型所有细胞加同一向量(方向大小均同);本机制每个细胞向自己的跨侧匹配对插值,位移向量 = f·t·(x_matched − x_orig),逐细胞方向大小不同,由表达空间中的配对关系决定。型均值位移(节点 15 已证伪)是所有细胞向同一型均值收缩;本机制是逐对插值,不改变型内表达分布的形状。",
"mechanism_evidence": "1. 匹配统计日志:每型匹配对数(应 > 0 且 = min(n_a,n_b))、中位匹配距离、门控拒绝比例——证明机制有操作对象且匹配质量可控。\n2. 表达确实改变:f > 0 时 .X 与 f=0 不逐位相同(np.array_equal 应为 False);逐细胞 ‖Δx‖ 分布非零且随 f 线性增大。\n3. variogram raw 保持 ≤ 0.0216(基线 0.0206 的 +5%),证明配对插值未摧毁共变结构——这是与节点 15 失败模式(+29%)的关键区分证据。\n4. de_score raw 从 0.5213 上升、de_direction raw 从 0.6625 上升(目标 ≥ +0.01)。\n5. 四组分变化模式:expression_change 应升,cell_state 不降或微升,local_spatial 和 shape_scale 应不变(坐标未动)。若 shape_scale 变动,说明实现触碰了坐标(bug)。",
"mechanism_off_control": "T2HI_MATCH_F=0.0 时代码在匹配步骤前提前返回,不执行 PCA、匹配或插值,输出 .X 和 obsm 与父 17 管线逐位相同(用 np.array_equal 验证)。预期:总分 66.58、八项 raw 与父逐位一致,无任何差别。若 f=0 输出与父不同,说明实现有 bug,须修复后再跑网格。"
}
``` |
| 原始记录位置 | /home/spark-longxinyang/vec/runs/formal/20261003-094241-search-t2-heart-interp-g24-D-s2/nodes/22/researcher.jsonl 58 KB /home/spark-longxinyang/vec/runs/formal/20261003-094241-search-t2-heart-interp-g24-D-s2/nodes/22/researcher.stderr |
审查员
| 角色 | 审查员 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数 | 6 |
| 工具调用 | 共 9 次:read 6、bash 2、write 1 |
| 用时 | 1 分 |
| token 数 | 输入 27,882 · 输出 1,358 · 思考 1,082 |
| 任务(第一行) | 审查节点 n22 的程序是否越界读取、写死目标、钻评分器漏洞 |
| 最后的回答(摘录) | REVIEW.json written |
| 原始记录位置 | /home/spark-longxinyang/vec/runs/formal/20261003-094241-search-t2-heart-interp-g24-D-s2/nodes/22/reviewer.jsonl 132 KB /home/spark-longxinyang/vec/runs/formal/20261003-094241-search-t2-heart-interp-g24-D-s2/nodes/22/reviewer.stderr |