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

总览 · ← 返回运行 20261002-202908-search-t1-scr-D

节点 n31

按PLAN实现管线末端逐型对角仿射残差校正(--shape-rho,输出残差逐PC缩放到输入方差轮廓,总量级不变);X3 A半 ρ=±0.1/0.2/0.5 全部降 cov 与 de,机制否决,提交默认 ρ=0(与父节点逐元素一致,nnz==0)。

运行?一次完整的自动搜索或 Agent 会话,有自己的锁定配置和证据包。20261002-202908-search-t1-scr-D
父节点n29
子节点—
操作?种子:人写的起点;改进:在父节点上改;草稿:从头写;修复:修父节点的报错。改进
状态已打分
分数搜索目标分 61.73(+0.0) · X3 61.73(+0.0) · 3 次复测均分 61.92
审查通过 1 越界读取:未发现问题。run.py 仅通过 src.task1_temporal.view_io(load_manifest/inputs_by_time/read_stage 等,L31-40, L187-198)读取视图数据,全文无绝对路径、'..'、/mnt、/home、data/raw、downloads、评分器路径,无网络调用;prior 清单未被读取也无违规。; 2 硬编码目标统计量:未发现问题。SYNONYM_PARENTS(run.py L45-49)仅为标签改名/拆分规则(LV-CM+RV-CM→V-CM,Endothelium→Endocardium/BEC),不含任…
用时?从运行开始到结束(或到现在)的挂钟时间。18 分
程序版本a8f3b161a38878849d45aa01b6f1370a2dcf6da1 (programs.git)

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

来自 programs.git a8f3b161a3:solution/METHOD.md

按PLAN实现管线末端逐型对角仿射残差校正(--shape-rho,输出残差逐PC缩放到输入方差轮廓,总量级不变);X3 A半 ρ=±0.1/0.2/0.5 全部降 cov 与 de,机制否决,提交默认 ρ=0(与父节点逐元素一致,nnz==0)。

实现(family: lowrank_shape,PLAN 指定机制)

管线 = 节点22/25/29(copy_last + 按型 EB 收缩位移 ×α·r + top-25 PC 低秩投影 + η=−3 局部切向扩张(k=15) + f=1.3 范数归一 + γ=0.3 位移轴逐细胞调制 + β=0 wvar 关闭态)。新增末端步骤:

  • 开关:--shape-rho(env VEC_SHAPE_RHO,默认 0.0 = 关闭)、--shape-lo 0.6 / --shape-hi 1.67、--shape-min-cells 30、--shape-sparse(env VEC_SHAPE_SPARSE=1)。
  • 对每型 c(输出与 stage-2 输入均 ≥30 细胞,否则跳过):var_in_c[k] = Z2(stage-2 全部细胞的 top-25 PC 坐标,复用已有 V/mu/hvg)型内逐维方差;var_out_c[k] = 管线输出细胞的 Zout 逐维方差。
  • target_var_c[k] = mean(var_out_c)·var_in_c[k]/mean(var_in_c)(总方差量级不变,只改形状);ratio_c[k] = sqrt(target/max(var_out,1e-8)),clip [0.6,1.67]。
  • 型内中心化残差 r_i = z_out_i − mean_out_c 逐维乘 (1−ρ)+ρ·ratio_c[k],校正以加性 delta(V@dZ)映回基因空间 HVG 列;dense 模式整体重写 HVG 列,sparse 模式(--shape-sparse)只加在既有非零元上(保持父节点稀疏结构、clamp≥0)。
  • ρ=0 时分支整体跳过 → 逐元素还原父节点(实测 nnz==0)。单输入视图走 copy_last 分支,不触发。视图无关:var_in/var_out/V/mu 全部由视图输入矩阵现场计算,只用相对时间差,不读 board/mode/路径/绝对时间。

机制生效证据(stderr shape 行,ρ=0.2 sparse,seed 0)

  • 8 个型通过 ≥30 阈值被校正(637/652 细胞实际改变输出值);5 个小型(BEC、NCC-derived、ST、aSHF n_out=9、pSHF n_out=3)跳过。
  • sd(ratio_c) = 0.09–0.23 > 0.05(PLAN 判据):η 扩张确实造成可测量的方差轮廓失真;mean(ratio) ≈ 0.84–0.97,即校正主要是收缩多数 PC、放大少数 PC。
  • AVC-CM 与 V-CM 的 ratio 触 clip(min 0.60/0.66,max 1.67),失真最大;Endocardium 最小(sd 0.094)。

对照与查分(X3 A半,5 次额度;对照 = ρ=0 = 父节点输出 seed0 = 59.69:cs 87.6 / cov 44.6 / de 50.5 / dir 49.6,取自节点25/29 METHOD 记录)

配置cell_statecovariationde_recoverydirection
ρ=0(对照,nnz==0 已验证)87.644.650.549.6
dense ρ=+0.286.7834.2050.049.85
sparse ρ=+0.187.5644.1650.049.82
sparse ρ=+0.287.5344.0250.049.81
sparse ρ=+0.587.3443.6950.049.81
sparse ρ=−0.287.6644.5050.049.87

结论:机制否决(PLAN 停止判据「cov 无改善即停」触发)

  1. covariation 在 ρ 正负两个方向都不升反降,且随 |ρ| 单调(+0.1→+0.5:44.16→43.69;−0.2:44.50 仍低于对照 44.6)。把输出方差轮廓"恢复"向 stage-2 输入轮廓直接损害 cov 组分 → 评分器看重的共变结构恰恰包含 η 扩张引入的成分,或 target 轮廓(0.25 天前的输入)本身不是目标阶段的真实轮廓。
  2. de_recovery 在任何 ρ≠0 下都固定 −0.5(50.5→50.0),与幅度无关,说明残差缩放系统性抹掉了一部分型间 DE 信号。
  3. dense 模式(重写整个 HVG 列、稠密化)灾难性降 cov(34.2):输出的零元结构本身携带被评分器利用的信号,任何稠密化都不可取;sparse 模式保住 cs/dir 但救不回 cov。
  4. direction 微升 +0.2~0.3,远低于噪声线(~2),无意义。
  5. 与节点 24(f_m 收缩)、25(σ 局部方向加权)、29(w_c 方差比重加权)合并结论:凡是在 top-25 PC 空间按方差轮廓做重加权/重排/缩放的操作族(无论作用于位移还是输出残差、正负双向)都一致降分。cov≈44.5 是当前框架结构性上限的判断再次得到支持;要攻 cov 只能换框架(按型 stage-2 重抽样 + 型内 OT/NN 映射),PLAN 风险 4 的表述成立——η 引起的失真可测量(sd(ratio)>0.05)但校正它无收益,cov 瓶颈不在方差轮廓形状。
  6. 按树内先例(节点16/24/25/29):提交默认 --shape-rho 0,机制代码与开关完整保留,输出与父节点逐元素一致(实测 (parent!=rho0).nnz==0,parent = 节点29 提交版代码同 seed 重跑),不引入未验证的负向改动。

未验证 / 局限

  • 只在 X3 A半 seed0 扫参(5 次额度);ρ>0 各配置降幅 0.5~10 且跨符号、跨稀疏模式单调一致,超过噪声线,未跑 seed1 复核。
  • ρ 的 dense/sparse 中间形态(如仅对 top-5 PC 校正、或校正后重投影回稀疏模式)未测:cov 随 |ρ| 单调降,细分方向不可能翻正。
  • proxy / proxy2 / final 视图未实跑(本节点分数只由 X3 决定);默认 ρ=0 时代码路径与父节点完全相同,父节点在这些视图均已跑通;单输入退路(len(entries)<2 → copy_last)不受新分支影响。
  • 知识来源:无外部生物数据/文献;var_in、var_out、V、hvg、r 全部由视图输入矩阵与相对时间差现场计算;SYNONYM_PARENTS 沿用父节点通用谱系改名知识。

下一步建议

  • 判死整个 "PC 方差轮廓重加权" 机制族(节点24/25/29/31 四种形式、作用于位移与输出两侧、正负双向均已试遍)。不要再提此类 PLAN。
  • direction ~50 地板:按节点29 建议扫时间缩放形式 α(r)=α0+α1·r 或按 r 分位数重排,只认 direction >2 分变化。
  • covariation:唯一未试的方向是换框架——按型从 stage-2 经验云重抽样 + 型内 OT/最近邻映射到目标,显式保留源细胞间基因-基因相关与零元结构(本节点 dense 结果证明零元结构不可破坏)。

调研员的计划

名称lowrank_shape: 逐型 PC 方差轮廓恢复(对角仿射残差校正)
动机covariation 自节点 13 引入 η=-3 各向同性局部扩张后从 48.20(节点 5)降至 44.54 并钉死在 ~44.5(节点 22/25/29 均为 44.59),成为最弱分组之一。η 在 25 维 PC 空间等量添加方差,使输出型内方差轮廓趋于各向同性,偏离输入阶段的真实方差谱,直接损害基因-基因共变。节点 24/25/29 已证明修改位移方向/幅度的乘子全部降 cell_state,但尚无节点尝试对输出残差做事后形状校正。direction 50.06 为时间缩放问题(ANALYSIS 明确指出),不在本节点范围内。
做法在现有管线(copy_last + EB 位移 + top-25 PC 投影 + η=-3 局部扩张 + f=1.3 归一 + γ=0.3 调制)末尾新增逐型对角仿射残差校正步骤:

1. 对每个型 c(≥30 细胞,否则跳过),计算 stage-2 输入细胞在 top-25 PC 空间的逐维方差 var_in_c[k] 和管线输出细胞的逐维方差 var_out_c[k](均用已有 Z 坐标,不新增 SVD)。
2. 构造目标方差轮廓:target_var_c[k] = mean(var_out_c) × (var_in_c[k] / mean(var_in_c))。这保持输出的总方差量级不变,只校正形状(各 PC 的相对比例)。
3. 对角缩放因子:ratio_c[k] = sqrt(target_var_c[k] / max(var_out_c[k], 1e-8)),clip 到 [0.6, 1.67]。
4. 阻尼应用:对每个输出细胞 i 的型内中心化残差 r_i[k] = z_out_i[k] - mean_out_c[k],校正为 r_i[k] × ((1-ρ) + ρ × ratio_c[k])。ρ 为阻尼系数。
5. 校正后残差加回型均值得到最终 PC 坐标,再经 V 矩阵映回基因空间(仅 HVG),非 HVG 不变。

参数:ρ ∈ {0, 0.1, 0.2, 0.3, 0.5},先跑 ρ=0(对照)和 ρ=0.2,确认方向后再扫其余。min-cells=30,低于此跳过校正。clip 范围 [0.6, 1.67] 防止极端值。

单输入退路:len(entries)<2 走 copy_last,无位移无扩张,校正步骤不执行(分支在 η 之后、仅双输入路径触发)。

vec-score 快筛:先跑 ρ=0 确认与父节点 nnz==0;再跑 ρ=0.2 看四组分;若 cov 无改善或 cs 降 >2 即停止。

实现要点:var_in_c 和 var_out_c 均从已有 Z 坐标(n_cells × 25 矩阵)按型分组计算,O(n×25),无需额外 SVD 或 Ledoit-Wolf 调用,30 分钟内可完成。
风险1. η=-3 引起的方差轮廓失真可能很小(ratio≈1),校正无实际效果 → Engineer 应先打印 2-3 个主要型的 ratio_c 分布,若 sd(ratio)<0.05 则机制信号不存在,可提前终止。2. 校正可能轻微移动细胞导致 cell_state 下降 → 用 ρ≤0.3 限制幅度,若 cs 降 >2 即放弃。3. 型内细胞数不足(如 BEC/ST/NCC-derived 仅 1 细胞)→ 跳过校正,不影响。4. X3 只有 0.25 天间隔,输入输出方差差异可能极小 → 这恰恰是机制的合理测试:如果连 η 引起的失真都校正不了,说明 covariation 瓶颈不在此。5. 与节点 25 的区别:节点 25 修改了扩张方向 ĝ(改变了位移方向),本方案不修改任何位移/扩张方向,只在最后对输出残差做对角缩放(事后形状校正)。

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

对比:父节点版本 488a53837a。改动的文件:solution/METHOD.md +34 −39、solution/run.py +102 −1

diff --git a/solution/METHOD.md b/solution/METHOD.mdindex 1c169a3..76b6b4b 100644--- a/solution/METHOD.md+++ b/solution/METHOD.md@@ -1,55 +1,50 @@-按PLAN给型级位移加逐PC方差比重加权 w_c·clip((λ2/λ1)^β,lo,hi);X3 A半6配置β正负双向、两种ε均单调降分,机制否决,提交β=0(与父节点逐元素一致,nnz==0)。+按PLAN实现管线末端逐型对角仿射残差校正(--shape-rho,输出残差逐PC缩放到输入方差轮廓,总量级不变);X3 A半 ρ=±0.1/0.2/0.5 全部降 cov 与 de,机制否决,提交默认 ρ=0(与父节点逐元素一致,nnz==0)。  ## 实现(family: lowrank_shape,PLAN 指定机制) -管线 = 节点22/25(copy_last + 按型 EB 收缩位移 ×α·r + top-25 PC 低秩投影 + η=−3 局部切向扩张(k=15) + f=1.3 范数归一 + γ=0.3 位移轴逐细胞调制)。新增开关:+管线 = 节点22/25/29(copy_last + 按型 EB 收缩位移 ×α·r + top-25 PC 低秩投影 + η=−3 局部切向扩张(k=15) + f=1.3 范数归一 + γ=0.3 位移轴逐细胞调制 + β=0 wvar 关闭态)。新增末端步骤: -- `--wvar-beta`(环境变量 `VEC_WVAR_BETA`,**默认 0.0 = 关闭**)、`--wvar-lo 0.5` / `--wvar-hi 2.0`、`--wvar-min-cells 50`、`--wvar-eps {median,self}`。-- Z_s = 输入阶段 s 全部细胞的 top-25 PC 坐标(与 γ 调制共用同一 V / mu / hvg,来自 `covariation_basis`);λ_c,m^(s) = Var(Z_s[lab_s==c, m])。-- `median` 模式(PLAN 原文):ε = median_m λ^(1);`self` 模式(对照实现):ε=0,ratio 直接 = λ2/λ1,避免 median 地板给高序号 PC 引入的系统性倾斜(median 模式下 ratio 对 m>~13 恒 <1,实测每型固定 7 个 PC 触 lo clip,是与"真实方差演化"无关的索引伪信号)。-- 型在任一阶段 <50 细胞 → 回退到全体细胞的池化 ratio(PLAN 风险1 预案);stage-2 型名在 stage-1 缺失时按 `SYNONYM_PARENTS` 取亲本池,再缺则池化。-- 重加权在 `wc = V^T dv` 之后、`tilde = V wc` 之前完成,因此 γ 调制的轴、f=1.3 局部归一的参考范数都随重加权后的 w_c' 变化(PLAN 步骤4)。-- β=0 时 `wvar_on=False`,Z1 不计算,分支完全跳过 → 逐元素还原父节点(实测 nnz==0,seed 0);单输入视图走 `len(entries)>=2` 之外的 copy_last 分支,不受影响。视图无关:λ 全部由视图自身输入矩阵现场算出,只用相对时间差(r),不读 board/mode/路径/绝对时间。+- 开关:`--shape-rho`(env `VEC_SHAPE_RHO`,**默认 0.0 = 关闭**)、`--shape-lo 0.6` / `--shape-hi 1.67`、`--shape-min-cells 30`、`--shape-sparse`(env `VEC_SHAPE_SPARSE=1`)。+- 对每型 c(输出与 stage-2 输入均 ≥30 细胞,否则跳过):var_in_c[k] = Z2(stage-2 全部细胞的 top-25 PC 坐标,复用已有 V/mu/hvg)型内逐维方差;var_out_c[k] = 管线输出细胞的 Zout 逐维方差。+- target_var_c[k] = mean(var_out_c)·var_in_c[k]/mean(var_in_c)(总方差量级不变,只改形状);ratio_c[k] = sqrt(target/max(var_out,1e-8)),clip [0.6,1.67]。+- 型内中心化残差 r_i = z_out_i − mean_out_c 逐维乘 (1−ρ)+ρ·ratio_c[k],校正以**加性 delta**(V@dZ)映回基因空间 HVG 列;dense 模式整体重写 HVG 列,sparse 模式(`--shape-sparse`)只加在既有非零元上(保持父节点稀疏结构、clamp≥0)。+- ρ=0 时分支整体跳过 → 逐元素还原父节点(实测 nnz==0)。单输入视图走 copy_last 分支,不触发。视图无关:var_in/var_out/V/mu 全部由视图输入矩阵现场计算,只用相对时间差,不读 board/mode/路径/绝对时间。 -## 机制生效证据(stderr `wvar` 行,seed 0)+## 机制生效证据(stderr `shape` 行,ρ=0.2 sparse,seed 0) -- 打印每型 sd(w)、min/max、与原始 w_c 的夹角余弦、触 clip 维数;型规模 n1/n2 一并打印(最小真实型 IFT-CM n1=133/n2=489,Endocardium 239/305,OFT/RV-CM 327/391;BEC/ST/NCC-derived 各 1 细胞 → 走池化回退 n1=1379/n2=2174)。-- `median` 模式:β=0.5 sd(w)=0.096–0.138、cos=0.99(PLAN 判据 sd>0.05 勉强达标但方向几乎未变);β=1 sd(w)=0.15–0.21;β=2 sd(w)=0.30–0.42、cos=0.897–0.98(7 维触 clip)→ 机制确实生效。-- `self` 模式:β=1 sd(w)=0.10–0.21、cos=0.973–0.995;β=3 更强。-- 关键诊断:X3 两输入只差 0.25 天,纯 λ2/λ1 的自然 sd(log ratio)≈0.1–0.2,即"型内形状演化"信号本身很弱;要把 cos 拉到 0.9 需要 β≥2,而那已进入纯噪声放大区。+- 8 个型通过 ≥30 阈值被校正(637/652 细胞实际改变输出值);5 个小型(BEC、NCC-derived、ST、aSHF n_out=9、pSHF n_out=3)跳过。+- sd(ratio_c) = 0.09–0.23 > 0.05(PLAN 判据):η 扩张确实造成可测量的方差轮廓失真;mean(ratio) ≈ 0.84–0.97,即校正主要是收缩多数 PC、放大少数 PC。+- AVC-CM 与 V-CM 的 ratio 触 clip(min 0.60/0.66,max 1.67),失真最大;Endocardium 最小(sd 0.094)。 -## 对照与查分(X3 A半,共用 6 次额度;对照 = 父节点输出,seed0 = 59.69,取自节点25 METHOD 记录,未重复消耗额度)+## 对照与查分(X3 A半,5 次额度;对照 = ρ=0 = 父节点输出 seed0 = 59.69:cs 87.6 / cov 44.6 / de 50.5 / dir 49.6,取自节点25/29 METHOD 记录) -| 配置 | seed0 总分 | cell_state | covariation | de_recovery | direction |-|---|---|---|---|---|---|-| β=0(对照,= 节点22/25) | **59.69** | 87.6 | 44.6 | 50.5 | 49.6* |-| median β=+1.0 | 58.16 | 83.28 | 43.91 | 48.62 | 48.98 |-| median β=+2.0 | 56.61 | 79.60 | 43.28 | 47.75 | 48.57 |-| median β=−1.0 | 58.63 | 82.31 | 43.28 | 50.96 | 50.18 |-| median β=−2.0 | 55.29 | 70.80 | 42.80 | 51.46 | 50.50 |-| self β=+1.0 | 58.40 | 83.77 | 43.68 | 49.07 | 49.07 |-| self β=+3.0 | 56.36 | 79.02 | 42.31 | 48.18 | 48.59 |+| 配置 | cell_state | covariation | de_recovery | direction |+|---|---|---|---|---|+| ρ=0(对照,nnz==0 已验证) | 87.6 | 44.6 | 50.5 | 49.6 |+| dense ρ=+0.2 | 86.78 | **34.20** | 50.0 | 49.85 |+| sparse ρ=+0.1 | 87.56 | 44.16 | 50.0 | 49.82 |+| sparse ρ=+0.2 | 87.53 | 44.02 | 50.0 | 49.81 |+| sparse ρ=+0.5 | 87.34 | 43.69 | 50.0 | 49.81 |+| sparse ρ=−0.2 | 87.66 | 44.50 | 50.0 | 49.87 | -\* 对照分组值取自节点25 METHOD 中 β=0 seed0 查分记录(cov 44.6 区间),未额外查分。+## 结论:机制否决(PLAN 停止判据「cov 无改善即停」触发) -## 结论:机制否决(PLAN 成功判据不成立)--1. **PLAN 判据「direction 在 β>0 时 >52」完全未达成**:direction 在全部 6 个非零配置里都 ≤50.5,且 β>0 时反而低于对照(48.6–49.1)。方向组分连续 6 个节点钉在 ~50 地板,说明它不由 w_c 的 PC 内重分布决定。-2. **单调性明确、跨符号一致**:|β| 越大总分越低,β>0 与 β<0 都降,`median` 与 `self` 两种 ε 定义都降 → 不是参数没调好,而是"按型内 PC 方差比重排位移方向"这一族操作在本管线上系统性有害。-3. **主损项是 cell_state**(87.6 → 83.3 → 79.6 → 70.8),与节点24(f_m 收缩,cs↓占主导)和节点25(σ 加权局部项,cs↓)同向:本管线的高分主要来自"输出细胞紧贴 stage-2 型内经验云",任何按 PC 重新分配型级位移的操作都会把细胞推离该云的边缘分布。-4. **de_recovery 只有 β<0(放大高序号 PC)时略升**(−1: 50.96、−2: 51.46 vs 对照 50.5),但 cs 同时暴跌 5–17,总分净降;这条 trade-off 与节点25 的 de 负信号方向相反,说明 de 对该开关的响应也不稳定,不足以单独作为判据。-5. covariation 在所有配置里都 ≤44.6(对照值),再次支持节点25 的判断:cov≈44.5 是当前 copy_last+低秩位移框架的结构性上限,PC 空间内的重加权类修补无净收益。-6. 按树内先例(节点16/24/25):**提交默认 `--wvar-beta 0`**,机制代码与开关完整保留,输出与父节点逐元素一致(实测 `(parent != final).nnz == 0`,且同 seed 两次运行 nnz==0 确认确定性),不引入未验证的负向改动。+1. **covariation 在 ρ 正负两个方向都不升反降**,且随 |ρ| 单调(+0.1→+0.5:44.16→43.69;−0.2:44.50 仍低于对照 44.6)。把输出方差轮廓"恢复"向 stage-2 输入轮廓直接损害 cov 组分 → 评分器看重的共变结构恰恰包含 η 扩张引入的成分,或 target 轮廓(0.25 天前的输入)本身不是目标阶段的真实轮廓。+2. **de_recovery 在任何 ρ≠0 下都固定 −0.5**(50.5→50.0),与幅度无关,说明残差缩放系统性抹掉了一部分型间 DE 信号。+3. dense 模式(重写整个 HVG 列、稠密化)灾难性降 cov(34.2):输出的零元结构本身携带被评分器利用的信号,任何稠密化都不可取;sparse 模式保住 cs/dir 但救不回 cov。+4. direction 微升 +0.2~0.3,远低于噪声线(~2),无意义。+5. 与节点 24(f_m 收缩)、25(σ 局部方向加权)、29(w_c 方差比重加权)合并结论:**凡是在 top-25 PC 空间按方差轮廓做重加权/重排/缩放的操作族(无论作用于位移还是输出残差、正负双向)都一致降分**。cov≈44.5 是当前框架结构性上限的判断再次得到支持;要攻 cov 只能换框架(按型 stage-2 重抽样 + 型内 OT/NN 映射),PLAN 风险 4 的表述成立——η 引起的失真可测量(sd(ratio)>0.05)但校正它无收益,cov 瓶颈不在方差轮廓形状。+6. 按树内先例(节点16/24/25/29):提交默认 `--shape-rho 0`,机制代码与开关完整保留,输出与父节点逐元素一致(实测 `(parent!=rho0).nnz==0`,parent = 节点29 提交版代码同 seed 重跑),不引入未验证的负向改动。  ## 未验证 / 局限 -- 只在 X3 A半 seed0 上扫参(6 次额度);未跑 seed1 —— 因为 6 个配置的总分降幅全部 ≥1.1(多数 ≥1.7),远超单 seed 噪声线,且单调性跨符号跨 ε 一致,seed1 复核不会改变否决结论(额度优先留给方向性判别,而非确认已明确的负结果)。-- proxy / proxy2 / final 视图未实跑(本节点分数只由 X3 决定);但默认 β=0 时代码路径与父节点完全相同,父节点在这些视图上均已跑通。-- 未测 β 的连续中间值(如 0.25):β=0.5 时 cos≈0.99(几乎不动),介于对照与 β=1(−1.5)之间,不可能翻正。-- 知识来源:无外部生物数据/文献;λ、V、hvg、r 全部由视图输入矩阵与相对时间差现场计算。`SYNONYM_PARENTS` 沿用父节点的通用谱系改名知识(Endothelium→Endocardium/BEC、LV-CM+RV-CM→V-CM),非保留阶段测量。+- 只在 X3 A半 seed0 扫参(5 次额度);ρ>0 各配置降幅 0.5~10 且跨符号、跨稀疏模式单调一致,超过噪声线,未跑 seed1 复核。+- ρ 的 dense/sparse 中间形态(如仅对 top-5 PC 校正、或校正后重投影回稀疏模式)未测:cov 随 |ρ| 单调降,细分方向不可能翻正。+- proxy / proxy2 / final 视图未实跑(本节点分数只由 X3 决定);默认 ρ=0 时代码路径与父节点完全相同,父节点在这些视图均已跑通;单输入退路(len(entries)<2 → copy_last)不受新分支影响。+- 知识来源:无外部生物数据/文献;var_in、var_out、V、hvg、r 全部由视图输入矩阵与相对时间差现场计算;SYNONYM_PARENTS 沿用父节点通用谱系改名知识。  ## 下一步建议 -- **停止在 PC 空间内做"重加权/重排"类修补**:f_m 收缩(24)、σ 局部方向加权(25)、w_c 方差比重加权(本节点)三种形式、正负双向都已试遍,全部 cs↓主导、总分单调降。低秩位移的方向自由度已被穷尽。-- direction ~50 地板更可能是"时间缩放形式"问题而非方向问题:建议下一节点直接扫 α(r) 的函数形式(α0+α1·r、按 r 分位数单调重排),只认 direction 组分 >2 分的变化;本节点未触碰该轴。-- 若仍要攻 covariation,按节点25 建议换框架(按型重抽样 + 型内 OT/最近邻映射,保留源细胞间基因-基因相关),不要再在现有位移项上加乘子。+- **判死整个 "PC 方差轮廓重加权" 机制族**(节点24/25/29/31 四种形式、作用于位移与输出两侧、正负双向均已试遍)。不要再提此类 PLAN。+- direction ~50 地板:按节点29 建议扫时间缩放形式 α(r)=α0+α1·r 或按 r 分位数重排,只认 direction >2 分变化。+- covariation:唯一未试的方向是换框架——按型从 stage-2 经验云重抽样 + 型内 OT/最近邻映射到目标,显式保留源细胞间基因-基因相关与零元结构(本节点 dense 结果证明零元结构不可破坏)。diff --git a/solution/run.py b/solution/run.pyindex df5a58e..9420c54 100644--- a/solution/run.py+++ b/solution/run.py@@ -158,6 +158,28 @@ def main() -> None:                         help="floor for lam1 in the variance ratio: 'median' = "                              "PLAN's median_m(lam1) (cross-PC), 'self' = pure "                              "per-PC ratio lam2/lam1")+    parser.add_argument("--shape-rho", type=float,+                        default=float(os.environ.get("VEC_SHAPE_RHO", "0.0")),+                        help="damping of the per-type diagonal affine residual "+                              "correction applied to the pipeline output: each "+                              "output cell's type-centered PC residual is scaled "+                              "per-PC by (1-rho)+rho*ratio_c[k], where ratio "+                              "restores the stage-2 within-type variance profile "+                              "at constant total variance. rho=0 -> skipped, "+                              "parent output element-wise.")+    parser.add_argument("--shape-lo", type=float,+                        default=float(os.environ.get("VEC_SHAPE_LO", "0.6")))+    parser.add_argument("--shape-hi", type=float,+                        default=float(os.environ.get("VEC_SHAPE_HI", "1.67")))+    parser.add_argument("--shape-sparse", action="store_true",+                        default=os.environ.get("VEC_SHAPE_SPARSE", "") == "1",+                        help="apply the residual-correction delta only at "+                              "existing nonzeros of the output (preserves the "+                              "parent's sparsity pattern)")+    parser.add_argument("--shape-min-cells", type=int,+                        default=int(os.environ.get("VEC_SHAPE_MIN_CELLS", "30")),+                        help="types with fewer cells than this (in the output or "+                              "in stage-2 input) skip the correction")     parser.add_argument("--no-time-scale", action="store_true",                         default=os.environ.get("VEC_NO_TIME_SCALE", "") == "1")     args = parser.parse_args()@@ -232,7 +254,7 @@ def main() -> None:             # PC coordinates of every stage-2 cell; for each output cell,             # g_i = mean over its kNN (excluding itself) of (z_j - z_i).             # Z2 is also needed by the gamma modulation (this node).-            if args.local_eta != 0.0 or args.gamma != 0.0:+            if args.local_eta != 0.0 or args.gamma != 0.0 or args.shape_rho != 0.0:                 Xl = last.X.tocsr()                 Z2 = (np.asarray(Xl[:, hvg].todense(), dtype=np.float64) - mu) @ V             # stage-1 PC coordinates for the variance-ratio reweighting@@ -381,6 +403,85 @@ def main() -> None:                     if Loc is not None:                         add = add + Loc[m_i, cols]                     Xs.data[lo:hi] = np.maximum(Xs.data[lo:hi] + add, 0.0)++        # Per-type diagonal affine residual correction (mechanism of this node).+        # The isotropic eta expansion flattens the within-type PC variance+        # profile of the output; here each output cell's type-centered residual+        # in PC space is scaled per dimension by (1-rho)+rho*ratio_c[k], where+        # ratio_c[k] = sqrt(target_var[k]/var_out[k]) with+        # target_var[k] = mean(var_out) * var_in[k]/mean(var_in) (same total+        # variance, input-shaped profile), clipped to [lo, hi]. var_in comes+        # from the stage-2 input cells' coordinates Z2, var_out from the+        # pipeline output cells. Correction is applied as an additive delta in+        # gene space (V @ dZ), so rho=0 leaves the output untouched.+        if args.shape_rho != 0.0 and use_proj and Z2 is not None:+            Xo = np.asarray(Xs[:, hvg].todense(), dtype=np.float64)+            Zout = (Xo - mu) @ V+            dXall = np.zeros_like(Xo) if args.shape_sparse else None+            n_corr = 0+            for t in np.unique(labs):+                om = np.flatnonzero(labs == t)+                im = np.flatnonzero(lab2 == t)+                if len(om) < args.shape_min_cells or len(im) < args.shape_min_cells:+                    print("shape %-16s SKIP n_out=%d n_in=%d" % (str(t), len(om), len(im)),+                          file=sys.stderr)+                    continue+                var_in = Z2[im].var(axis=0)+                zo = Zout[om]+                var_out = zo.var(axis=0)+                mi, mo = float(var_in.mean()), float(var_out.mean())+                if mi <= 0.0 or mo <= 0.0:+                    continue+                target = mo * (var_in / mi)+                ratio = np.clip(np.sqrt(target / np.maximum(var_out, 1e-8)),+                                args.shape_lo, args.shape_hi)+                r = zo - zo.mean(axis=0, keepdims=True)+                dZ = r * (args.shape_rho * (ratio - 1.0))[None, :]+                dX = dZ @ V.T+                if args.shape_sparse:+                    dXall[om] = dX+                else:+                    Xo[om] = np.maximum(Xo[om] + dX, 0.0)+                n_corr += len(om)+                print("shape %-16s n_out=%4d n_in=%4d sd(ratio)=%.3f min=%.2f "+                      "max=%.2f mean=%.3f" % (str(t), len(om), len(im),+                                              float(ratio.std()), float(ratio.min()),+                                              float(ratio.max()), float(ratio.mean())),+                      file=sys.stderr)+            if n_corr > 0:+                if args.shape_sparse:+                    # apply the gene-space delta only at existing nonzeros of+                    # the HVG columns (preserves the parent sparsity pattern)+                    colmap = np.full(Xs.shape[1], -1, dtype=np.int64)+                    colmap[hvg] = np.arange(len(hvg))+                    Xs = Xs.tocsr()+                    for i in range(Xs.shape[0]):+                        lo_, hi_ = Xs.indptr[i], Xs.indptr[i + 1]+                        if hi_ <= lo_:+                            continue+                        pos = colmap[Xs.indices[lo_:hi_]]+                        v = pos >= 0+                        if v.any():+                            upd = np.maximum(Xs.data[lo_:hi_][v] + dXall[i, pos[v]], 0.0)+                            Xs.data[lo_:hi_][v] = upd.astype(np.float32)+                    Xs.eliminate_zeros()+                    print("shape(sparse) corrected %d cells; nnz=%d" % (n_corr, Xs.nnz),+                          file=sys.stderr)+                else:+                    mask_hvg = np.zeros(Xs.shape[1], dtype=bool)+                    mask_hvg[hvg] = True+                    nonh = np.flatnonzero(~mask_hvg)+                    Xn = sparse.hstack(+                        [sparse.csr_matrix(Xo.astype(np.float32)), Xs[:, nonh]],+                        format="csr")+                    order = np.concatenate([hvg, nonh])+                    perm = np.empty(Xs.shape[1], dtype=np.int64)+                    perm[order] = np.arange(Xs.shape[1])+                    Xs = Xn[:, perm].tocsr()+                    Xs.eliminate_zeros()+                    print("shape corrected %d cells; nnz=%d" % (n_corr, Xs.nnz),+                          file=sys.stderr)+         X = Xs         if use_proj and diag:             print("proj diag (type, n_cells, ||proj||/||d||, corr):", file=sys.stderr)

调研来源?调研员查到并用到的知识条目和文献检索结果(只列标题和编号)。

用到的知识库条目

编号标题出处
k041Within-stage pseudotime and graph toolkit offline: scanpy DPT/PAGA/Leiden, Palantir, CellRank 210.1186/s13059-019-1663-x (PAGA); 10.1038/s41587-019-0068-4 (Palantir); 10.1038/s41592-024-02303-9 (CellRank 2)
k031Offline OT toolkit in the sandbox: moscot TemporalProblem, wot OTModel, POT, geomloss10.1038/s41586-024-08453-2 (moscot); 10.1016/j.cell.2019.01.006 (Waddington-OT)
k018Damped per-type shift: shrinkage alpha on the observed deltanotes/plan/cards/T1.md

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

改了什么在管线末端新增逐型对角仿射残差校正(--shape-rho,把输出细胞的型内 PC 残差逐维缩放,使方差轮廓恢复向 stage-2 输入轮廓,总方差量级不变),含 dense/sparse 两种写回模式;扫参后机制被否决,提交默认 ρ=0,输出与父节点逐元素一致(nnz==0),故榜分与四组全部 +0.00。
各组分数的变化cell_state:噪声内(+0.00,91.13);机制开启时基本不变(sparse 87.6→87.3~87.7,X3 A半)
covariation:噪声内(+0.00,44.59);机制开启时全部下降且随 |ρ| 单调(+0.1/+0.2/+0.5/−0.2 → 44.16/44.02/43.69/44.50,对照 44.6),dense 模式灾难性降至 34.2
de_recovery:噪声内(+0.00,51.85,提交态与父节点相同);机制开启时 de 固定降 0.5(50.5→50.0,X3 A半 seed0)
direction:噪声内(+0.00,50.06);机制开启时仅 +0.2~0.3,远低于 ~2 噪声线
family_idlowrank_shape
假设是否成立否
经验
  1. 在 copy_last+低秩位移框架下,把输出 PC 方差轮廓恢复向输入(stage-2)轮廓会单调降 covariation:评分器看重的共变结构包含 η 扩张引入的成分,或 0.25 天前的输入轮廓本身不是目标轮廓;cov≈44.5 的瓶颈不在方差轮廓形状。
  2. 对输出残差做任何 PC 逐维缩放都会固定损失约 0.5 分 de_recovery,与幅度无关,说明残差缩放系统性抹掉型间 DE 信号。
  3. dense 写回(重写整个 HVG 列、稠密化)使 cov 从 44.6 崩到 34.2:输出的零元结构本身携带被评分器利用的信号,任何修改必须保持父节点稀疏模式(sparse delta 写回)。
  4. 结合节点 24(f_m 收缩)、25(σ 局部方向加权)、29(w_c 方差比重加权)、31(输出残差对角校正):凡在 top-25 PC 空间按方差轮廓做重加权/重排/缩放的操作族,无论作用于位移还是输出、正负双向,全部一致降分,该机制族应判死。
  5. 机制验证方法论有效:先跑关闭态确认 nnz==0,再打印 sd(ratio)(0.09–0.23>0.05 判据)确认可测失真存在,可在少量查分额度内干净地否决一个机制。
mechanism_active是
下一步建议
  1. 针对 direction(~50 地板):扫时间缩放函数形式 α(r)=α0+α1·r 或按 r 分位数单调重排,只认 direction >2 分的变化;节点 24/25/29/31 均未触碰该轴。
  2. 针对 covariation:放弃 PC 空间内修补,换框架为按型从 stage-2 经验云重抽样 + 型内 OT/最近邻映射到目标,显式保留源细胞间基因-基因相关,且必须保持父节点零元结构(dense 结果证明稀疏模式不可破坏)。
  3. 不要再提交任何 PC 方差轮廓重加权/缩放类 PLAN(四种形式、两侧作用点、正负双向已全部试遍并否决)。

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

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

分析员

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

工程师

角色工程师 alibaba-token-plan-cn/qwen3.8-max
调用次数1 次
轮数24
工具调用共 25 次:bash 16、edit 7、read 1、write 1
用时10 分
token 数输入 51,817 · 输出 8,651 · 思考 6,810
任务(第一行)按计划修改程序:lowrank_shape: 逐型 PC 方差轮廓恢复(对角仿射残差校正)
最后的回答(摘录)
**做了什么**:按 PLAN(lowrank_shape)在管线末端实现逐型对角仿射残差校正(`--shape-rho`,把输出 PC 方差轮廓恢复向 stage-2 输入轮廓,总量级不变),含 dense 与 sparse(保零元结构)两种写回模式;ρ=0 对照验证与父节点逐元素一致(nnz==0)。

**查分结果**(X3 A半,5 次额度):机制否决——cov 在 ρ=+0.1/+0.2/+0.5/−0.2 全部低于对照 44.6(44.16/44.02/43.69/44.50)且随 |ρ| 单调,de 固定 −0.5;dense 模式稠密化灾难性降 cov 至 34.2。机制确实生效(sd(ratio)=0.09–0.23 > 0.05,637 细胞被改变)但校正无收益。提交默认 ρ=0(= 父节点输出,B半 61.73 保底),METHOD.md 写明否决证据与对照表,vec-check 通过。

**下一步最值得试**:(1) 判死整个 PC 方差轮廓重加权族(节点24/25/29/31 四种形式全败);(2) direction ~50 地板应攻时间缩放形式 α(r)=α0+α1·r;(3) cov 若还要攻,换框架为按型 stage-2 重抽样 + 型内 OT/NN 映射,且必须保持零元结构(dense 结果证明稀疏模式本身携带被评分器利用的信号)。
原始记录位置/home/spark-longxinyang/vec/runs/formal/20261002-202908-search-t1-scr-D/nodes/31/engineer.jsonl 147 KB
/home/spark-longxinyang/vec/runs/formal/20261002-202908-search-t1-scr-D/nodes/31/engineer.stderr

调研员

角色调研员 alibaba-token-plan-cn/qwen3.8-max
调用次数2 次
轮数2
工具调用共 0 次:—
用时6 分
token 数输入 18,646 · 输出 1,438 · 思考 15,573
任务(第一行)为节点 n31(改进,父节点 n29)写改进计划 PLAN.json
最后的回答(摘录)
 f=1.3 归一 + γ=0.3 调制)末尾新增逐型对角仿射残差校正步骤:\n\n1. 对每个型 c(≥30 细胞,否则跳过),计算 stage-2 输入细胞在 top-25 PC 空间的逐维方差 var_in_c[k] 和管线输出细胞的逐维方差 var_out_c[k](均用已有 Z 坐标,不新增 SVD)。\n2. 构造目标方差轮廓:target_var_c[k] = mean(var_out_c) × (var_in_c[k] / mean(var_in_c))。这保持输出的总方差量级不变,只校正形状(各 PC 的相对比例)。\n3. 对角缩放因子:ratio_c[k] = sqrt(target_var_c[k] / max(var_out_c[k], 1e-8)),clip 到 [0.6, 1.67]。\n4. 阻尼应用:对每个输出细胞 i 的型内中心化残差 r_i[k] = z_out_i[k] - mean_out_c[k],校正为 r_i[k] × ((1-ρ) + ρ × ratio_c[k])。ρ 为阻尼系数。\n5. 校正后残差加回型均值得到最终 PC 坐标,再经 V 矩阵映回基因空间(仅 HVG),非 HVG 不变。\n\n参数:ρ ∈ {0, 0.1, 0.2, 0.3, 0.5},先跑 ρ=0(对照)和 ρ=0.2,确认方向后再扫其余。min-cells=30,低于此跳过校正。clip 范围 [0.6, 1.67] 防止极端值。\n\n单输入退路:len(entries)<2 走 copy_last,无位移无扩张,校正步骤不执行(分支在 η 之后、仅双输入路径触发)。\n\nvec-score 快筛:先跑 ρ=0 确认与父节点 nnz==0;再跑 ρ=0.2 看四组分;若 cov 无改善或 cs 降 >2 即停止。\n\n实现要点:var_in_c 和 var_out_c 均从已有 Z 坐标(n_cells × 25 矩阵)按型分组计算,O(n×25),无需额外 SVD 或 Ledoit-Wolf 调用,30 分钟内可完成。",
  "expected_groups": ["covariation"],
  "risks": "1. η=-3 引起的方差轮廓失真可能很小(ratio≈1),校正无实际效果 → Engineer 应先打印 2-3 个主要型的 ratio_c 分布,若 sd(ratio)<0.05 则机制信号不存在,可提前终止。2. 校正可能轻微移动细胞导致 cell_state 下降 → 用 ρ≤0.3 限制幅度,若 cs 降 >2 即放弃。3. 型内细胞数不足(如 BEC/ST/NCC-derived 仅 1 细胞)→ 跳过校正,不影响。4. X3 只有 0.25 天间隔,输入输出方差差异可能极小 → 这恰恰是机制的合理测试:如果连 η 引起的失真都校正不了,说明 covariation 瓶颈不在此。5. 与节点 25 的区别:节点 25 修改了扩张方向 ĝ(改变了位移方向),本方案不修改任何位移/扩张方向,只在最后对输出残差做对角缩放(事后形状校正)。",
  "family_id": "lowrank_shape",
  "mechanism": "对管线输出细胞的型内中心化残差施加逐型对角仿射变换,将各 PC 维度的方差比例恢复向输入阶段的经验轮廓,校正 η 各向同性扩张引入的形状失真;总方差量级不变,只改相对形状。",
  "vs_constant_shift": "常数位移改变型内均值位置,不改变残差结构;本机制固定均值不变,仅对中心化残差做逐维缩放(对角仿射),改变的是群体形状(方差轮廓)而非位置。",
  "mechanism_evidence": "Engineer 应打印:(1) 每个主要型的 ratio_c 向量(25 维)的 mean/sd/min/max,证明 η 确实引起了可测量的方差轮廓失真(sd(ratio)>0.05);(2) 校正前后逐型逐 PC 方差对比;(3) 四组分各自变化,重点看 covariation 是否 >45.5 且 cell_state 损失 <2;(4) 实际改变了多少细胞的输出值(nnz 统计)。",
  "mechanism_off_control": "ρ=0 时校正因子退化为 1.0,残差不变,输出与父节点逐元素一致(验证 (parent!=output).nnz==0)。同一程序 --shape-rho 0 即关闭。预期:ρ=0 与父节点完全相同;ρ>0 时 covariation 有 >1 分变化而 cell_state 变化 <2 分。若 ρ>0 时输出不变,说明机制未运行。",
  "sources": []
}
原始记录位置/home/spark-longxinyang/vec/runs/formal/20261002-202908-search-t1-scr-D/nodes/31/researcher.jsonl 1 KB
/home/spark-longxinyang/vec/runs/formal/20261002-202908-search-t1-scr-D/nodes/31/researcher.1.jsonl 5 KB
/home/spark-longxinyang/vec/runs/formal/20261002-202908-search-t1-scr-D/nodes/31/researcher.stderr

审查员

角色审查员 alibaba-token-plan-cn/qwen3.8-max
调用次数1 次
轮数5
工具调用共 7 次:bash 4、read 2、write 1
用时不到 1 分
token 数输入 20,247 · 输出 1,072 · 思考 1,376
任务(第一行)审查节点 n31 的程序是否越界读取、写死目标、钻评分器漏洞
最后的回答(摘录)
REVIEW.json written
原始记录位置/home/spark-longxinyang/vec/runs/formal/20261002-202908-search-t1-scr-D/nodes/31/reviewer.jsonl 103 KB
/home/spark-longxinyang/vec/runs/formal/20261002-202908-search-t1-scr-D/nodes/31/reviewer.stderr