总览 · ← 返回运行 20261003-094242-search-t2-embryo-interp-g24-D-s2
节点 n17
型内逐基因方差回复(PLAN T2EI-01)已实现并对照:γ>0 时 variogram 仅微升、neighborhood_mmd 随 γ 单调劣化,净效应为负,提交默认 γ=0,输出与父节点 13/15 逐位相同。
| 运行?一次完整的自动搜索或 Agent 会话,有自己的锁定配置和证据包。 | 20261003-094242-search-t2-embryo-interp-g24-D-s2 |
|---|---|
| 父节点 | n15 |
| 子节点 | n21 |
| 操作?种子:人写的起点;改进:在父节点上改;草稿:从头写;修复:修父节点的报错。 | 改进 |
| 状态 | 已打分 |
| 分数 | 搜索目标分 62.52(+0.0) · proxy 62.52(+0.0) · 3 次复测均分 62.32 |
| 审查 | 通过 1 越界读取:未发现。run.py 只通过 src.task2_spatial.view_io 的 load_manifest/read_stage/panel_genes/write_t2 访问 --data 视图内数据,无任何绝对路径、'..'、/mnt、/home、data/raw、打分器或 src/common/evaluation 读取,无网络下载(全文无 open/urllib/requests/socket/subprocess)。; 2 硬编码目标统计量:未发现。所有统计量(Δ=μ_b−μ_a、σ_a/σ_b/σ_out、PCA 展幅 spread_a/spread_b、RM… |
| 用时?从运行开始到结束(或到现在)的挂钟时间。 | 16 分 |
| 程序版本 | 1ad58c0a326011bddbdc5311fcd84b562de1498d (programs.git) |
方法说明?节点程序自带的 METHOD.md:这个程序做了什么、为什么。
来自 programs.git 1ad58c0a32:solution/METHOD.md
型内逐基因方差回复(PLAN T2EI-01)已实现并对照:γ>0 时 variogram 仅微升、neighborhood_mmd 随 γ 单调劣化,净效应为负,提交默认 γ=0,输出与父节点 13/15 逐位相同。
方法(family T2EI-01,PLAN:per-gene within-type variance restoration)
父节点 15 全部管线不动(mix 分层混抽、procrustes3d 对齐、α=5 收敛位移、λ=6 投影加权、β=0.2 配对收缩、各向异性坐标整形、jitter、RMS 回缩)。在 β-收缩之后、写出表达之前新增机制(T2_VARREST_GAMMA,默认 0=跳过):
- 对每个共有类型(原始括号两侧各 ≥10 细胞、输出侧 ≥4 细胞):从原始阶段计算 σ_a[g]、σ_b[g](
as_dense全型细胞),输出侧合并 a/b 两侧细胞计算 σ_out[g]、μ_out[g]。 - σ_target[g] = (1−t)·σ_a[g] + t·σ_b[g];r[g] = clip(σ_target/(σ_out+1e-6), 0.5, 2.0)。
- 对每个已表达条目(x>0):x ← μ_out[g] + (x−μ_out[g])·(1+γ·(r[g]−1)),clip ≥0;不新增非零条目。
- 逐基因重居中:把 sum 漂移按该基因 nnz 条目数摊回(首版按细胞数摊回导致均值漂移 0.545,已修正),clip 后实测型均值最大漂移 0.024(γ=0.5)/0.062(γ=1.0),全局 pseudobulk 最大移动 0.0012 ≪ DE 阈值 0.25。
- 可选
T2_VARREST_MIN_FRAC:只修正型内 nnz 比例 ≥ 阈值的基因(过滤稀疏噪声基因的 r 估计)。 - 机制不消费 rng、不改细胞选择、不改坐标:父节点抽样与 jitter 逐位保留(吸取节点 15 教训)。
- 单输入阶段退路不变:无括号时 main() 提前 return 分层复制,机制不执行。
知识来源:仅使用视图内两个括号阶段自身的测量(型内标准差),无保留阶段/基因型信息;「中间态方差按时间线性插值」是通用插值假设,非文献数值。
机制生效证据(seed 0,proxy E6.75+E8.0→E7.25,t=0.4)
- 修正 10 个共有类型;r 分布(γ=0.5 无过滤):中位 1.05、q10 0.5、q90 2.0 —— 中位比值恰在 PLAN 风险 2 的「无空间」边界(σ_out/σ_target≈0.95),压缩不是系统性的,只有部分基因偏离。
- 表达确实被改:nnz 146836→146718(clip 到 0 的条目占被改条目 0.18%@γ=0.5、0.36%@γ=1.0,零分数变化 <0.07%,稀疏结构保持);被 clip 回正的比例 1.5%@γ=0.5(PLAN 风险 4 监控项,未触发额外保护必要)。
- 型均值保持:max drift 0.024(γ=0.5),pseudobulk 最大移动 0.0012;DE 两项 raw 完全不动(de_score 0.25、de_direction 0.3853→0.3851,在打印精度内)。
- 四组分变化(A 半,同日锚点):cell_state 48.93→49.12(mmd_u 0.01164→0.01152、variogram 0.01442→0.014336,均改善);local_spatial 58.16→57.68(neighborhood_mmd 0.05506→0.05613,劣化);expression_change、shape_scale 不变(机制不触碰均值与坐标)。
关闭对照(mechanism_off_control)
T2_VARREST_GAMMA=0(提交默认):输出与父节点(本 run 起点代码、即节点 13/15 提交)在相同 seed 下逐位相同(X 与 spatial_3D array_equal 已验证,seed 0/1 均确定)。开启后输出改变(上节 nnz/raw 变化),机制确实生效。
查分结果(A 半,seed 0,共用 6/20 次)
| 配置 | 榜分 | cell_state | local_spatial | variogram raw | mmd_u raw | neighborhood raw |
|---|---|---|---|---|---|---|
| γ=0(锚,=父节点) | 61.45 | 48.93 | 58.16 | 0.01442 | 0.01164 | 0.05506 |
| γ=0.5 | 61.38 | 49.12 | 57.68 | 0.014336 | 0.01152 | 0.05613 |
| γ=0.5 + min_frac=0.03 | 61.38 | 49.11 | 57.68 | 0.014348 | 0.01152 | 0.05614 |
| γ=1.0 | 61.27 | 49.15 | 57.22 | 0.01429 | 0.01153 | 0.05719 |
结论:variogram 改善 ~0.0001 raw,远低于 PLAN 预设的放弃阈值 0.0005;neighborhood_mmd 随 γ 单调劣化(型内偏差放大使 15-NN 邻域均值分布比真值中间态更散),25 分权重的邻域损失盖过 cell_state 小幅收益。稀疏基因过滤(min_frac=0.03,把 r 的 q10/q90 收窄到 0.86/1.15)不改变结果——邻域损伤来自修正本身而非噪声基因。γ=0.25 未测:趋势单调,预期落在锚点与 61.38 之间,仍为负。
提交
默认 γ=0,与父节点逐位一致(预期榜分 62.52 不变)。代码、开关与诊断保留供后续节点复用。
给后续节点的建议
- variogram 的失分不是「型内方差被压缩」:σ_out/σ_target 中位 ≈0.95,逐基因回复无空间。方向应转向共变结构(基因间相关),而非边际方差幅度。
- 任何增大型内逐细胞偏差的操作都会伤 neighborhood_mmd(本节点 + 节点 15 的进度选择两个独立证据);cell_state 与 local_spatial 在本管线上存在实测的权衡,改表达值也要过邻域这一关。
调研员的计划
| 名称 | 型内逐基因方差回复:修正收敛位移对共变结构的过度压缩 |
|---|---|
| 动机 | variogram 是全表最弱单项(skill 0.389,得分 4.87/12.5,低于地板 6.25),说明当前管线的表达修改主动破坏了基因共变结构。α=5 收敛位移 + λ=6 投影加权 + β=0.2 配对收缩三步叠加后,型内方差被系统性压缩(λ 沿 Δ 压缩、β 沿配对方向压缩),且 nnz-only 约束使实际位移量逐细胞异质,产生人工共变畸变。节点 15 的教训明确:不能换细胞(坐标抽样噪声 ±0.8),应在固定抽样下改表达值本身。Analyst 建议的 whitening-recolor 方向,本方案用最小实现:逐基因方差回复。 |
| 做法 | 在父节点 13 全部管线(mix → α=5 收敛 → λ=6 加权 → β=0.2 配对 → aniso → jitter → RMS)的 β-收缩之后、aniso 之前,新增一步 per-gene within-type variance restoration: 1. 对每个共有类型(两侧各 ≥10 细胞),在收敛/收缩完成后计算输出侧每基因型内标准差 σ_out[g];从原始括号阶段(未修改)计算 σ_a[g]、σ_b[g]。 2. 目标标准差 σ_target[g] = (1−t)·σ_a[g] + t·σ_b[g](线性插值)。 3. 修正因子 r[g] = clip(σ_target[g] / (σ_out[g] + 1e-6), 0.5, 2.0)。 4. 阻尼修正:对每个已表达条目(x>0),x_new = μ_out[g] + (x − μ_out[g]) · (1 + γ·(r[g] − 1)),clip ≥ 0。仅修改 nnz 条目,不新增非零条目。 5. 修正后对每基因重新居中:x_new −= mean(x_new) − mean(x_before),保持型均值不变(保护 DE 两项和 pseudobulk)。 6. 参数 γ(环境变量 T2_VARREST_GAMMA):扫 {0.25, 0.5, 0.75, 1.0},默认 0.5。γ=0 跳过,逐位复现父节点。 单输入阶段退路:无括号时 main() 提前 return 分层复制,机制不执行。 vec-score 快速筛选:先跑 γ=0(锚点)和 γ=0.5,比较 variogram raw 和 mmd_u raw;若 variogram 改善 < 0.0005(对应 < 0.5 分),放弃。预计 4 次查分(γ=0 锚 + 3 个 γ 值)在 20 次限额内。 |
| 风险 | 1. 真值中间阶段的型内方差可能低于括号插值(细胞在中间态更均质),此时回复方向错误——尽早发现:γ=0.25 若 variogram 反而变差即停止。2. 修正幅度太小(σ_out 与 σ_target 差距小)→ 效果在噪声内;Engineer 应先打印 10 个类型的 σ_out/σ_target 比值分布,若中位比值在 [0.9, 1.1] 则机制无空间,应放弃。3. 重新居中步骤若实现有误可能微移 pseudobulk → 验证:修正前后逐类型逐基因均值差 < 1e-10。4. 与 nnz-only clip 的交互:r>1 时 x<μ 的条目可能被 clip 到 0,轻微改变稀疏率 → 监控零分数变化,若 >1% 则加保护(不将正值 clip 为 0)。 |
代码改动?这个节点的程序和父节点程序的逐行差别:绿色是新增,红色是删除。
对比:父节点版本 5f08c0c52e。改动的文件:solution/METHOD.md +28 −32、solution/run.py +116 −3
diff --git a/solution/METHOD.md b/solution/METHOD.mdindex 5fa153c..ae5a2df 100644--- a/solution/METHOD.md+++ b/solution/METHOD.md@@ -1,50 +1,46 @@-型内伪时间进度加权混抽(PLAN T2EI-01)已实现并对照:进度偏向有小幅 mmd_u 收益,但 variogram 与坐标重抽样噪声净亏,提交时机制关闭(与父节点13逐位一致)。+型内逐基因方差回复(PLAN T2EI-01)已实现并对照:γ>0 时 variogram 仅微升、neighborhood_mmd 随 γ 单调劣化,净效应为负,提交默认 γ=0,输出与父节点 13/15 逐位相同。 -## 方法(family T2EI-01,PLAN:进度加权分层混抽)+## 方法(family T2EI-01,PLAN:per-gene within-type variance restoration) -在父节点 13 全部管线(mix 分层混抽、procrustes3d 对齐、α=5 收敛位移、λ=6 投影加权、β=0.2 配对收缩、各向异性坐标整形、jitter、RMS 回缩)之上,新增细胞选择机制,两种模式(环境变量切换):+父节点 15 全部管线不动(mix 分层混抽、procrustes3d 对齐、α=5 收敛位移、λ=6 投影加权、β=0.2 配对收缩、各向异性坐标整形、jitter、RMS 回缩)。在 β-收缩之后、写出表达之前新增机制(`T2_VARREST_GAMMA`,默认 0=跳过): -1. **进度分数**:对每个共有类型(两侧各 ≥10 细胞),Δ = μ_b − μ_a(只留 |Δ| ≥ 0.25 的 DE 基因,复用收敛位移的 Δ)。a 侧细胞 s = clip((x−μ_a)·Δ/(Δ·Δ+ε), 0, 1)(ε=1.0),b 侧 s = clip((μ_b−x)·Δ/(Δ·Δ+ε), 0, 1)。a 侧目标 t、b 侧目标 1−t。-2. **redraw 模式**(PLAN 原方案,T2_PROG_MODE=redraw):保持 mix_indices 的每类型名额不变,型内按 p ∝ exp(−κ(s−target)²) 加权无放回重抽(T2_PROG_KAPPA,扫了 0.5/1/2;κ=0 跳过)。-3. **swap 模式**(结构修复尝试,T2_PROG_MODE=swap,T2_PROG_FRAC):完全保留父节点的分层抽样和 rng 流(jitter 逐位不变),每类型只把 |s−target| 最大的 frac·k 个已抽细胞换成未抽池中 |s−target| 最小的细胞(仅在严格更近时换)。frac=0 → 父节点逐位。-4. 单输入阶段退路:无括号时 main() 提前 return 分层复制,机制不执行(与父节点相同)。-5. 表达值在本机制中不做任何修改;每类型抽取数不变 → 类型组成不变(PLAN evidence 4 已验证:prog 开关下每类型计数一致)。+1. 对每个共有类型(原始括号两侧各 ≥10 细胞、输出侧 ≥4 细胞):从原始阶段计算 σ_a[g]、σ_b[g](`as_dense` 全型细胞),输出侧合并 a/b 两侧细胞计算 σ_out[g]、μ_out[g]。+2. σ_target[g] = (1−t)·σ_a[g] + t·σ_b[g];r[g] = clip(σ_target/(σ_out+1e-6), 0.5, 2.0)。+3. 对每个已表达条目(x>0):x ← μ_out[g] + (x−μ_out[g])·(1+γ·(r[g]−1)),clip ≥0;不新增非零条目。+4. 逐基因重居中:把 sum 漂移按该基因 nnz 条目数摊回(首版按细胞数摊回导致均值漂移 0.545,已修正),clip 后实测型均值最大漂移 0.024(γ=0.5)/0.062(γ=1.0),全局 pseudobulk 最大移动 0.0012 ≪ DE 阈值 0.25。+5. 可选 `T2_VARREST_MIN_FRAC`:只修正型内 nnz 比例 ≥ 阈值的基因(过滤稀疏噪声基因的 r 估计)。+6. 机制不消费 rng、不改细胞选择、不改坐标:父节点抽样与 jitter 逐位保留(吸取节点 15 教训)。+7. 单输入阶段退路不变:无括号时 main() 提前 return 分层复制,机制不执行。 -知识来源:仅使用视图内两个括号阶段自身的测量(型均值差 Δ、型内投影),无保留阶段/基因型信息,无外部文献数据。伪时间投影(细胞沿群体均值差方向的进度)是通用机制做法。+知识来源:仅使用视图内两个括号阶段自身的测量(型内标准差),无保留阶段/基因型信息;「中间态方差按时间线性插值」是通用插值假设,非文献数值。 ## 机制生效证据(seed 0,proxy E6.75+E8.0→E7.25,t=0.4) -- 进度分数分布(10 个共有类型):连续右偏而非 0/1 双峰,a 侧均值 0.026–0.05、b 侧 0.058–0.19(Unknown),q90 达 0.08–0.52,~55% 细胞恰在 0(clip 下界);PLAN 风险 1 的停止条件(全双峰)未触发。-- redraw κ=2:选中细胞进度均值 a 侧 0.0464(池 0.0436)、b 侧 0.1066(池 0.0812)——偏向确实把选中细胞推向目标方向(但幅度小:池分布整体远离 t=0.4/0.6,单细胞噪声 ≫ 时间信号)。-- swap frac=0.15:实际交换 462/5000 细胞(frac=0.3 → 938),每类型计数与组成不变,rng 流不消费(jitter 逐位同父节点)。-- 表达矩阵:机制只改选中的细胞索引,不改任何表达值;后续 α/λ/β 管线照常作用于新选细胞(因此下游指标随之变化)。+- 修正 10 个共有类型;r 分布(γ=0.5 无过滤):中位 1.05、q10 0.5、q90 2.0 —— **中位比值恰在 PLAN 风险 2 的「无空间」边界**(σ_out/σ_target≈0.95),压缩不是系统性的,只有部分基因偏离。+- 表达确实被改:nnz 146836→146718(clip 到 0 的条目占被改条目 0.18%@γ=0.5、0.36%@γ=1.0,零分数变化 <0.07%,稀疏结构保持);被 clip 回正的比例 1.5%@γ=0.5(PLAN 风险 4 监控项,未触发额外保护必要)。+- 型均值保持:max drift 0.024(γ=0.5),pseudobulk 最大移动 0.0012;DE 两项 raw 完全不动(de_score 0.25、de_direction 0.3853→0.3851,在打印精度内)。+- 四组分变化(A 半,同日锚点):cell_state 48.93→49.12(mmd_u 0.01164→0.01152、variogram 0.01442→0.014336,均改善);local_spatial 58.16→57.68(neighborhood_mmd 0.05506→0.05613,劣化);expression_change、shape_scale 不变(机制不触碰均值与坐标)。 ## 关闭对照(mechanism_off_control) -T2_PROG_ENABLE=0(提交默认)与 T2_PROG_KAPPA=0(redraw)/ T2_PROG_FRAC=0(swap):输出与父节点 13 在相同 seed 下**逐位相同**(X 与 spatial_3D array_equal 已验证)。开启后输出改变(X nnz 146836→147068),机制确实生效。+T2_VARREST_GAMMA=0(提交默认):输出与父节点(本 run 起点代码、即节点 13/15 提交)在相同 seed 下**逐位相同**(X 与 spatial_3D array_equal 已验证,seed 0/1 均确定)。开启后输出改变(上节 nnz/raw 变化),机制确实生效。 -## 查分结果(同日 A 半锚点,seed 0;关闭 = 61.45)+## 查分结果(A 半,seed 0,共用 6/20 次) -| 配置 | 榜分 | cell_state | shape_scale | mmd_u raw | variogram raw | occ raw |+| 配置 | 榜分 | cell_state | local_spatial | variogram raw | mmd_u raw | neighborhood raw | |---|---:|---:|---:|---:|---:|---:|-| off(=父节点13,当日锚点) | **61.45** | 48.93 | 77.75 | 0.01164 | 0.01442 | 0.8066 |-| redraw κ=0.5 | 60.91 | 49.03 | 76.58 | 0.01141 | 0.01459 | 0.7981 |-| redraw κ=1 | 61.10 | **49.56** | 76.10 | **0.01093** | 0.01456 | 0.7906 |-| redraw κ=2 | 60.65 | 48.80 | 75.41 | 0.01136 | 0.01494 | 0.7830 |-| redraw κ=0.001(均匀重抽对照) | 60.66 | 49.21 | 75.86 | 0.01141 | 0.01437 | 0.7840 |-| swap frac=0.15 | 61.36 | 48.74 | 77.34 | 0.01150 | 0.01483 | 0.7991 |-| swap frac=0.30 | 60.76 | 48.22 | 76.17 | 0.01176 | 0.01515 | 0.7808 |+| γ=0(锚,=父节点) | **61.45** | 48.93 | 58.16 | 0.01442 | 0.01164 | 0.05506 |+| γ=0.5 | 61.38 | 49.12 | 57.68 | 0.014336 | 0.01152 | 0.05613 |+| γ=0.5 + min_frac=0.03 | 61.38 | 49.11 | 57.68 | 0.014348 | 0.01152 | 0.05614 |+| γ=1.0 | 61.27 | 49.15 | 57.22 | 0.01429 | 0.01153 | 0.05719 | -结论:-1. **偏向本身有微弱真效应**:κ=1 对比同为重抽的均匀对照,cell_state +0.35、mmd_u 0.01141→0.01093、shape +0.24——方向与 PLAN 预期一致,但幅度 ≪ 噪声(~1 分)。-2. **重抽样代价占主导**:任何全量重抽(连 κ=0.001 的均匀重抽)都比父节点的特定抽样掉 ~0.8 分,几乎全部来自坐标侧(occupancy 0.807→0.784、d2 0.0047→0.0057)——细胞身份换了,坐标云的抽样噪声就换了,与偏向无关。swap 模式保坐标后 shape 只掉 0.4,但偏向收益也随之消失(只换 9% 细胞,且换上的是进度尾部=分布极端细胞,variogram 反而变差 0.01442→0.01483)。-3. **variogram 对沿 Δ 偏向选择系统性变差**(redraw κ2、swap 两档全部劣于 off):进度尾部细胞的基因偏差相关,破坏共变结构。型内进度异质性更像噪声/极端细胞而非可利用的时间梯度。+结论:variogram 改善 ~0.0001 raw,远低于 PLAN 预设的放弃阈值 0.0005;neighborhood_mmd 随 γ 单调劣化(型内偏差放大使 15-NN 邻域均值分布比真值中间态更散),25 分权重的邻域损失盖过 cell_state 小幅收益。稀疏基因过滤(min_frac=0.03,把 r 的 q10/q90 收窄到 0.86/1.15)不改变结果——邻域损伤来自修正本身而非噪声基因。γ=0.25 未测:趋势单调,预期落在锚点与 61.38 之间,仍为负。 -## 验证过 / 没验证+## 提交 -- 验证:off 逐位复现父节点(seed 0);redraw/swap 两模式全网格如上(9 次查分);vec-check 通过(seed 0/1);运行 ~14s、内存 <1GB;κ=0/frac=0 退路。-- 没验证:seed 1/2 的完整网格(off 结论基于 seed 0 同日锚点);真实括号(E7.25+E8.0→E7.5? 实际 final 视图)上的行为——但机制默认关闭,提交程序与父节点逐位相同,父节点在 final 的行为即本节点行为;PROG_MIN_CELLS / ε 未扫(机制净负,无必要)。+默认 γ=0,与父节点逐位一致(预期榜分 62.52 不变)。代码、开关与诊断保留供后续节点复用。 -## 提交状态与下一步+## 给后续节点的建议 -提交默认 T2_PROG_ENABLE=0:程序行为与父节点 13 完全一致(预期分数 ≈ 父节点)。代码保留全部机制与开关,供后续节点复用。下一步最值得试:(a) cell_state 的改善不要走"换细胞"路线(坐标抽样噪声 ±0.8 淹没一切 <0.5 的表达侧收益),应在**固定父节点抽样**的前提下改表达值本身(如按进度连续的型内插值生成中间态细胞,同时接管其坐标=原细胞坐标,保 pairing);(b) 任何声称 <1 分的改善必须与"同抽样、同 rng 流"的对照比,不能与父节点的具体抽样比。+- variogram 的失分不是「型内方差被压缩」:σ_out/σ_target 中位 ≈0.95,逐基因回复无空间。方向应转向共变**结构**(基因间相关),而非边际方差幅度。+- 任何增大型内逐细胞偏差的操作都会伤 neighborhood_mmd(本节点 + 节点 15 的进度选择两个独立证据);cell_state 与 local_spatial 在本管线上存在实测的权衡,改表达值也要过邻域这一关。diff --git a/solution/run.py b/solution/run.pyindex 7301483..f117154 100644--- a/solution/run.py+++ b/solution/run.py@@ -99,6 +99,38 @@ PAIR_DE_ONLY = os.environ.get("T2_PAIR_DE_ONLY", "1") == "1" # target RMS (scale_log_ratio untouched, expression untouched). ANISO_ENABLE=0 # skips the step and reproduces the parent bit-for-bit. ANISO_ENABLE = os.environ.get("T2_ANISO_ENABLE", "1") == "1"+# Per-gene within-type variance restoration (family T2EI-01, this node): the+# convergence (α) + projection weighting (λ) + pair shrinkage (β) stack+# systematically compresses within-type per-gene variance, so the gene-gene+# co-variation amplitude of the output sits below the true intermediate stage+# (variogram is the weakest single metric, skill 0.389 < floor). After β,+# for every shared type (≥10 cells per side in the ORIGINAL brackets):+# σ_target[g] = (1−t)·σ_a[g] + t·σ_b[g] (linear interp of measured stds)+# r[g] = clip(σ_target[g] / (σ_out[g]+1e-6), 0.5, 2.0)+# and every expressed entry (x>0) of that type's output cells is rescaled around+# the output type mean: x ← μ_out[g] + (x − μ_out[g])·(1 + γ·(r[g] − 1)),+# clipped at 0, then re-centred per gene so the type mean (hence pseudobulk,+# DE scores) does not move. Only nnz entries are touched, never creating new+# nonzeros. γ = 0 skips the step entirely and reproduces the parent bit-for-bit.+# NOTE (submitted default): the mechanism measured net-negative and monotone in+# γ on the proxy (same-day A-half anchor γ=0: 61.45; γ=0.5: 61.38; γ=1.0: 61.27;+# γ=0.5 + nnz-fraction filter 0.03: 61.38). Variogram improved only ~0.0001 raw+# (PLAN abandon threshold 0.0005) while neighborhood_mmd degraded 0.0551 →+# 0.0561 → 0.0572 with γ: enlarging within-type per-cell deviations makes the+# 15-NN neighbourhood-mean distribution MORE spread than the true intermediate+# stage, and the 25-point neighbourhood weight dominates the small cell_state+# gain. r_median = 1.05 (σ_out/σ_target ≈ 0.95) also sits at the PLAN "no room"+# boundary — the pipeline's variance compression is not systematic. Submitted+# DISABLED (bit-identical to parent node 13/15); switches kept for follow-ups.+VARREST_GAMMA = float(os.environ.get("T2_VARREST_GAMMA", "0.0"))+VARREST_MIN_CELLS = int(os.environ.get("T2_VARREST_MIN_CELLS", "10"))+VARREST_CLIP = (float(os.environ.get("T2_VARREST_CLIP_LO", "0.5")),+ float(os.environ.get("T2_VARREST_CLIP_HI", "2.0")))+# Genes expressed in fewer than VARREST_MIN_FRAC of the type's output cells have+# σ_out estimates dominated by sampling noise (a handful of nonzero entries);+# rescaling those amplifies noise and hurts neighborhood pairing. Restrict the+# correction to genes with nnz fraction ≥ MIN_FRAC within the type block.+VARREST_MIN_FRAC = float(os.environ.get("T2_VARREST_MIN_FRAC", "0.0")) # Progress-weighted stratified reselection (family T2EI-01, this node): within # each shared type, cells differ in how far they already sit along the temporal # change direction Δ = μ_b − μ_a (DE genes only, |Δ| ≥ CONVERGE_MIN_DELTA).@@ -295,6 +327,74 @@ def progress_swap(stage, idx, labels, means, delta, target_s, frac): return new_idx, info +def variance_restore(xa, xb, labs_a, labs_b, stage_a, stage_b, t, shared):+ """Per-gene within-type variance restoration (see VARREST_GAMMA comment).++ Modifies xa/xb in place; only entries already >0 are touched and per-gene+ type means are restored after the rescaling, so pseudobulk / DE stay put.+ """+ info = {"varrest_gamma": VARREST_GAMMA, "varrest_n_types": 0,+ "varrest_r_median": None, "varrest_r_q10": None, "varrest_r_q90": None,+ "varrest_max_mean_drift": None, "varrest_zero_before": None,+ "varrest_zero_after": None, "varrest_clipped_frac": None}+ la = np.asarray(stage_a.labels).astype(str)+ lb = np.asarray(stage_b.labels).astype(str)+ rs, drifts, zb, za, clipped, n_mod = [], [], 0, 0, 0, 0+ n_types = 0+ for lab in shared:+ pool_a = np.flatnonzero(la == lab)+ pool_b = np.flatnonzero(lb == lab)+ if pool_a.size < VARREST_MIN_CELLS or pool_b.size < VARREST_MIN_CELLS:+ continue+ rows_a = np.flatnonzero(labs_a == lab)+ rows_b = np.flatnonzero(labs_b == lab)+ n_out = rows_a.size + rows_b.size+ if n_out < 4:+ continue+ sig_a = as_dense(stage_a.X, pool_a).astype(np.float64).std(axis=0)+ sig_b = as_dense(stage_b.X, pool_b).astype(np.float64).std(axis=0)+ sig_target = (1.0 - t) * sig_a + t * sig_b+ block = np.vstack([xa[rows_a], xb[rows_b]]).astype(np.float64)+ mu = block.mean(axis=0)+ sig_out = block.std(axis=0)+ r = np.clip(sig_target / (sig_out + 1e-6), VARREST_CLIP[0], VARREST_CLIP[1])+ if VARREST_MIN_FRAC > 0.0:+ ok = (block > 0).mean(axis=0) >= VARREST_MIN_FRAC+ r = np.where(ok, r, 1.0)+ f = 1.0 + VARREST_GAMMA * (r - 1.0)+ mask = block > 0+ new = np.where(mask, mu + (block - mu) * f, block)+ new = np.where(mask, np.maximum(new, 0.0), block)+ # re-centre: keep the per-gene SUM over all cells (zeros included), by+ # spreading the sum drift over that gene's nnz entries only+ nz = mask.sum(axis=0).astype(np.float64)+ shift = (new.sum(axis=0) - block.sum(axis=0)) / np.maximum(nz, 1.0)+ new = np.where(mask, np.maximum(new - shift, 0.0), block)+ final_drift = np.abs(new.mean(axis=0) - mu).max()+ new32 = new.astype(np.float32)+ xa[rows_a] = new32[:rows_a.size]+ xb[rows_b] = new32[rows_a.size:]+ n_types += 1+ rs.append(r)+ drifts.append(float(final_drift))+ zb += int((~mask).sum())+ za += int((new32 == 0).sum())+ clipped += int(((new <= 0.0) & mask).sum())+ n_mod += int(mask.sum())+ if rs:+ rcat = np.concatenate(rs)+ info.update({+ "varrest_n_types": n_types,+ "varrest_r_median": float(np.median(rcat)),+ "varrest_r_q10": float(np.quantile(rcat, 0.10)),+ "varrest_r_q90": float(np.quantile(rcat, 0.90)),+ "varrest_max_mean_drift": float(np.max(drifts)),+ "varrest_zero_before": zb, "varrest_zero_after": za,+ "varrest_clipped_frac": float(clipped / max(n_mod, 1)),+ })+ return info++ def mix_converge(stage_a, stage_b, t: float, params: dict, alpha: float): t = float(t) damp = float(params.get("scale_damp", 1.0))@@ -508,6 +608,15 @@ def mix_converge(stage_a, stage_b, t: float, params: dict, alpha: float): pair_info["n_paired_types"] = n_types_paired pair_info["n_pairs"] = n_pairs + varrest_info = {"varrest_gamma": VARREST_GAMMA, "varrest_n_types": 0}+ if VARREST_GAMMA != 0.0 and ia.size and ib.size:+ if not shared:+ means_a, means_b, shared, delta = compute_delta(stage_a, stage_b, 10)+ if shared:+ labs_a_v = np.asarray(stage_a.labels).astype(str)[ia]+ labs_b_v = np.asarray(stage_b.labels).astype(str)[ib]+ varrest_info = variance_restore(xa, xb, labs_a_v, labs_b_v, stage_a, stage_b, t, shared)+ expr = np.clip(np.vstack([xa, xb]), 0.0, None).astype(np.float32) if (ia.size or ib.size) else np.zeros((0, len(stage_a.genes)), np.float32) coord_parts = [] if ia.size:@@ -525,7 +634,7 @@ def mix_converge(stage_a, stage_b, t: float, params: dict, alpha: float): info.update( t=t, n=int(expr.shape[0]), rms_a=rms_a, rms_b=rms_b, target_rms=target_rms, out_rms=rms_radius(coords), n_from_a=int(ia.size), n_from_b=int(ib.size), **conv, **pair_info,- **prog_info,+ **prog_info, **varrest_info, ) return expr, coords.astype(np.float32), info @@ -561,8 +670,12 @@ def main() -> None: "aniso_factor", "aniso_aspect_in", "aniso_aspect_out", "prog_kappa", "prog_mode", "prog_frac", "prog_n_swaps", "prog_n_types_a", "prog_n_types_b",- "prog_sel_mean_a", "prog_pool_mean_a",- "prog_sel_mean_b", "prog_pool_mean_b")}+ "prog_sel_mean_a", "prog_pool_mean_a",+ "prog_sel_mean_b", "prog_pool_mean_b",+ "varrest_gamma", "varrest_n_types", "varrest_r_median",+ "varrest_r_q10", "varrest_r_q90", "varrest_max_mean_drift",+ "varrest_zero_before", "varrest_zero_after",+ "varrest_clipped_frac")} print(json.dumps({"bracket": [a["stage"], b["stage"]], **keep}, default=float), file=sys.stderr) write_t2(args.out, expr, coords, genes, seed=args.seed)
调研来源?调研员查到并用到的知识条目和文献检索结果(只列标题和编号)。
用到的知识库条目
| 编号 | 标题 | 出处 |
|---|---|---|
| k007 | Interval staging and held-out-window filtering of external data | notes/official/来件/virtualembryo.ai/rules.md |
| k024 | World-model evaluation dimensions for state-transition predictors | notes/competition/07_biomedical_world_models.md |
| k009 | Conditional / OT flow matching for population transport | arXiv:2210.02747 (Lipman et al., Flow Matching for Generative Modeling) |
分析结果?分析员写的 ANALYSIS.json:改了什么、各组分数怎么变、假设是否成立、经验和下一步建议。
| 改了什么 | 在父节点 15 管线的 β-收缩后新增型内逐基因方差回复机制(T2_VARREST_GAMMA:σ_target 按括号阶段线性插值、r clip [0.5,2]、nnz-only 乘性缩放、逐基因重居中保型均值,另加 MIN_FRAC 稀疏基因过滤);机制在 proxy 上实测净负,提交默认 γ=0,输出与父节点 13/15 逐位相同。 |
|---|---|
| 各组分数的变化 | cell_state:不变(+0.00,50.31):提交为 γ=0;机制开启时(未提交)mmd_u 0.01164→0.01152、variogram 0.01442→0.014336 有微改善但在 A 半查分上仅 +0.19 组分,在噪声内 expression_change:不变(+0.00,62.11):提交 γ=0,输出与父节点逐位相同,de_score 0.3103 / de_direction 0.3986 均不动 local_spatial:不变(+0.00,60.34):提交为 γ=0;机制开启时 neighborhood_mmd raw 随 γ 单调劣化 0.05506→0.05613→0.05719,是净负的根源 shape_scale:不变(+0.00,77.31):机制不触碰坐标,occupancy_dice skill 0.424 仍是最弱形状项 |
| family_id | T2EI-01 |
| 假设是否成立 | 否 |
| 经验 |
|
| mechanism_active | 否 |
| 下一步建议 |
|
对话摘要?每个角色和大模型对话的统计:轮数、工具调用、用时、token 数和最后的回答摘录;原始记录只给路径。
只给统计和最后回答的摘录;完整对话请到原始记录位置里列出的文件看。
分析员
| 角色?调研员写计划、工程师改代码、分析员解读分数、审查员检查作弊。 | 分析员 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数?大模型一共回复了几轮(每轮可以调用多个工具)。 | 3 |
| 工具调用?大模型调用读文件、执行命令等工具的次数,按工具名统计。 | 共 2 次:bash 1、write 1 |
| 用时 | 不到 1 分 |
| token 数?输入 / 输出(含思考)的 token 数,来自接口返回的用量。 | 输入 16,247 · 输出 1,133 · 思考 943 |
| 任务(第一行) | 分析节点 n17 的打分结果,写 ANALYSIS.json |
| 最后的回答(摘录) | ANALYSIS.json written |
| 原始记录位置?完整对话记录在 Spark 上的文件路径;看板不复制原始内容。 | /home/spark-longxinyang/vec/runs/formal/20261003-094242-search-t2-embryo-interp-g24-D-s2/nodes/17/analyst.jsonl 7 KB /home/spark-longxinyang/vec/runs/formal/20261003-094242-search-t2-embryo-interp-g24-D-s2/nodes/17/analyst.stderr |
工程师
| 角色 | 工程师 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数 | 29 |
| 工具调用 | 共 31 次:bash 19、edit 10、read 1、write 1 |
| 用时 | 13 分 |
| token 数 | 输入 67,538 · 输出 9,628 · 思考 11,185 |
| 任务(第一行) | 按计划修改程序:型内逐基因方差回复:修正收敛位移对共变结构的过度压缩 |
| 最后的回答(摘录) | 完成。总结: **做了什么**:按 PLAN 在父节点 15 管线的 β-收缩后实现了型内逐基因方差回复(T2_VARREST_GAMMA,σ_target 线性插值、r clip [0.5,2]、nnz-only、逐基因重居中保型均值,修正了首版重居中公式的均值漂移 bug 0.545→0.024),另加稀疏基因过滤开关;机制不消费 rng、不动细胞选择与坐标。 **查分**(A 半,6/20 次):锚点 γ=0 = 61.45;γ=0.5 = 61.38;γ=0.5+min_frac = 61.38;γ=1.0 = 61.27。variogram 仅改善 ~0.0001 raw(远低于 PLAN 放弃阈值 0.0005),r 中位 1.05 落在「压缩无空间」边界,neighborhood_mmd 随 γ 单调劣化(0.0551→0.0572)盖过 cell_state 小收益。**提交默认 γ=0,与父节点逐位相同**(array_equal 验证,vec-check ok,seed 0/1 确定),保住 62.52。 **下一步最值得试**:(1) variogram 的问题不在边际方差幅度而在基因间共变结构,可试固定抽样下沿括号阶段的基因相关结构做小幅 whitening-recolor;(2) 两个独立节点证实「增大型内逐细胞偏差→伤邻域」的权衡,任何表达侧改动需先过 neighborhood_mmd 关;(3) shape 侧 occupancy_dice(skill 0.42)仍是不动细胞身份前提下的最大单项空间。 |
| 原始记录位置 | /home/spark-longxinyang/vec/runs/formal/20261003-094242-search-t2-embryo-interp-g24-D-s2/nodes/17/engineer.jsonl 190 KB /home/spark-longxinyang/vec/runs/formal/20261003-094242-search-t2-embryo-interp-g24-D-s2/nodes/17/engineer.stderr |
调研员
| 角色 | 调研员 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数 | 1 |
| 工具调用 | 共 0 次:— |
| 用时 | 2 分 |
| token 数 | 输入 16,933 · 输出 1,292 · 思考 4,907 |
| 任务(第一行) | 为节点 n17(改进,父节点 n15)写改进计划 PLAN.json |
| 最后的回答(摘录) | nnz-only 约束使实际位移量逐细胞异质,产生人工共变畸变。节点 15 的教训明确:不能换细胞(坐标抽样噪声 ±0.8),应在固定抽样下改表达值本身。Analyst 建议的 whitening-recolor 方向,本方案用最小实现:逐基因方差回复。",
"approach": "在父节点 13 全部管线(mix → α=5 收敛 → λ=6 加权 → β=0.2 配对 → aniso → jitter → RMS)的 β-收缩之后、aniso 之前,新增一步 per-gene within-type variance restoration:\n\n1. 对每个共有类型(两侧各 ≥10 细胞),在收敛/收缩完成后计算输出侧每基因型内标准差 σ_out[g];从原始括号阶段(未修改)计算 σ_a[g]、σ_b[g]。\n2. 目标标准差 σ_target[g] = (1−t)·σ_a[g] + t·σ_b[g](线性插值)。\n3. 修正因子 r[g] = clip(σ_target[g] / (σ_out[g] + 1e-6), 0.5, 2.0)。\n4. 阻尼修正:对每个已表达条目(x>0),x_new = μ_out[g] + (x − μ_out[g]) · (1 + γ·(r[g] − 1)),clip ≥ 0。仅修改 nnz 条目,不新增非零条目。\n5. 修正后对每基因重新居中:x_new −= mean(x_new) − mean(x_before),保持型均值不变(保护 DE 两项和 pseudobulk)。\n6. 参数 γ(环境变量 T2_VARREST_GAMMA):扫 {0.25, 0.5, 0.75, 1.0},默认 0.5。γ=0 跳过,逐位复现父节点。\n\n单输入阶段退路:无括号时 main() 提前 return 分层复制,机制不执行。\n\nvec-score 快速筛选:先跑 γ=0(锚点)和 γ=0.5,比较 variogram raw 和 mmd_u raw;若 variogram 改善 < 0.0005(对应 < 0.5 分),放弃。预计 4 次查分(γ=0 锚 + 3 个 γ 值)在 20 次限额内。",
"expected_groups": ["cell_state"],
"risks": "1. 真值中间阶段的型内方差可能低于括号插值(细胞在中间态更均质),此时回复方向错误——尽早发现:γ=0.25 若 variogram 反而变差即停止。2. 修正幅度太小(σ_out 与 σ_target 差距小)→ 效果在噪声内;Engineer 应先打印 10 个类型的 σ_out/σ_target 比值分布,若中位比值在 [0.9, 1.1] 则机制无空间,应放弃。3. 重新居中步骤若实现有误可能微移 pseudobulk → 验证:修正前后逐类型逐基因均值差 < 1e-10。4. 与 nnz-only clip 的交互:r>1 时 x<μ 的条目可能被 clip 到 0,轻微改变稀疏率 → 监控零分数变化,若 >1% 则加保护(不将正值 clip 为 0)。",
"family_id": "T2EI-01",
"mechanism": "收敛位移(α/λ/β)系统性压缩了型内逐基因方差,使基因间共变幅度低于真值中间态;本机制按括号阶段方差线性插值目标,对型内偏差做逐基因乘性回复,恢复共变结构而不移动型均值。",
"vs_constant_shift": "常数位移是给所有细胞加同一向量(改均值不改方差);本机制是逐基因、逐类型的偏差乘性缩放(改方差不改均值),且修正因子由括号阶段实测方差插值决定,不是全局常数。",
"mechanism_evidence": "Engineer 应打印:(1) 修正前后每类型每基因 σ 的分布(直方图或分位数),确认 σ_out 确实偏离 σ_target 且修正后靠近;(2) variogram raw 从 0.01392 下降的幅度;(3) 型均值逐基因最大偏移 < 1e-8(证明均值未动);(4) 零分数变化 < 0.5%(稀疏结构保持)。若 σ_out/σ_target 中位比值已在 [0.95, 1.05],说明压缩不严重,机制无空间。",
"mechanism_off_control": "T2_VARREST_GAMMA=0 时完全跳过修正步骤,输出与父节点 13 在相同 seed 下逐位相同(X 与 spatial_3D array_equal)。预期差别:γ>0 时 variogram raw 下降、mmd_u raw 可能微降,expression_change 和 shape 组不变。"
} |
| 原始记录位置 | /home/spark-longxinyang/vec/runs/formal/20261003-094242-search-t2-embryo-interp-g24-D-s2/nodes/17/researcher.jsonl 5 KB /home/spark-longxinyang/vec/runs/formal/20261003-094242-search-t2-embryo-interp-g24-D-s2/nodes/17/researcher.stderr |
审查员
| 角色 | 审查员 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数 | 6 |
| 工具调用 | 共 9 次:read 5、bash 3、write 1 |
| 用时 | 1 分 |
| token 数 | 输入 31,688 · 输出 1,488 · 思考 2,506 |
| 任务(第一行) | 审查节点 n17 的程序是否越界读取、写死目标、钻评分器漏洞 |
| 最后的回答(摘录) | REVIEW.json written |
| 原始记录位置 | /home/spark-longxinyang/vec/runs/formal/20261003-094242-search-t2-embryo-interp-g24-D-s2/nodes/17/reviewer.jsonl 141 KB /home/spark-longxinyang/vec/runs/formal/20261003-094242-search-t2-embryo-interp-g24-D-s2/nodes/17/reviewer.stderr |