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

总览 · ← 返回运行 20261002-202907-search-t1-scr-A

节点 n13

在父节点(ISO β=3)之上加 PC 空间型内协方差校正块(COVAR_FIX2):对 5 个 shaped 类型用 last 阶段型内协方差做白化-再着色,默认提交配置为相关结构校正(MODE=1, W=1.0,保各 PC 方差);实测 covariation 组对该机制不敏感,如实报告阴性结果。

运行?一次完整的自动搜索或 Agent 会话,有自己的锁定配置和证据包。20261002-202907-search-t1-scr-A
父节点n11
子节点—
操作?种子:人写的起点;改进:在父节点上改;草稿:从头写;修复:修父节点的报错。改进
状态已打分
分数搜索目标分 59.01(+0.0) · X3 59.01(+0.0) · 3 次复测均分 59.62
审查未审查
用时?从运行开始到结束(或到现在)的挂钟时间。19 分
程序版本222d9189574d6569fd2fc8c422910a730ed5d417 (programs.git)

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

来自 programs.git 222d918957:solution/METHOD.md

在父节点(ISO β=3)之上加 PC 空间型内协方差校正块(COVAR_FIX2):对 5 个 shaped 类型用 last 阶段型内协方差做白化-再着色,默认提交配置为相关结构校正(MODE=1, W=1.0,保各 PC 方差);实测 covariation 组对该机制不敏感,如实报告阴性结果。

方法

父节点流水线(分型 PCA 均值外推 + ISO β=3 各向同性形状扩张 + 非零掩码加性解码)完全不变。在解码后、clip≥0 前插入协方差校正块(env 开关 COVAR_FIX2_W,W=0 即逐元素回到父节点):

  1. 仅对 shaped types(两阶段各 ≥10 细胞的配对类型,本视图 5 个:AVC-CM、IFT-CM、OFT/RV-CM、SV-CM、Unknown,共 486/652 细胞;LOWRANK_FALLBACK=none 下未配对类型不动)。
  2. 把预测细胞在 hvg 上的表达逆投影回 25 维 PC 空间,去型内质心得 R_pred;Σ_pred = cov(R_pred)+εI(ε=1e-6)。同型 last 阶段细胞得 Σ_last。
  3. T = Σ_last^{1/2}·Σ_pred^{-1/2}(eigh,负特征值 clip 到 ε),T_blend = (1−W)I + W·T,r_new = T_blend·r(保均值与细胞数)。
  4. 三种模式:MODE=0 原始 PLAN 版;NORM=1 时 T 除以 (det T)^{1/k}(体积保持,只修方向);MODE=1(提交默认)相关结构版:把 Σ 各自标准化成相关矩阵后算 T,作用后再乘回 Σ_pred 的逐 PC 标准差——精确保各 PC 方差不变,只把型内相关结构向 Σ_last 旋转。
  5. 解码与父一致:Δ = (r_new − r_old) 逆投影到基因空间,只加到原非零位置,clip≥0。
  6. Σ_pred 特征值非正或条件数 >1000 的类型跳过(实测无类型触发)。

机制生效证据(COVAR_FIX2_DEBUG=1)

  • W=0 对照与父节点输出逐元素 maxdiff = 0.0(机制关闭 = 父节点)。
  • W>0 时 5 个类型全部被校正,fixed_cells=486(非全部 652,未配对类型不动);Σ_pred→Σ_last 的 Frobenius 距离全部缩小(如 OFT/RV-CM 33.3→21.8,IFT-CM 76.6→60.4 @MODE=1,W=0.5)。
  • 均值保持:de_recovery 与 direction 在所有配置下几乎不变(de_recovery 恒 52.47),证明校正只动二阶结构。

查分结果(X3 A 半,seed0,共用 5 次,剩 15)

配置总分cell_statecovarde_recdir
父节点 ISO β=3(W=0)57.6776.3545.5752.4750.12
MODE=0 W=0.1057.5775.9745.6652.4750.11
NORM=1 W=0.3057.5275.8545.6352.4750.10
NORM=1 W=0.6057.3975.3745.6952.4750.09
MODE=1 W=0.5057.6176.1345.6552.4750.10
MODE=1 W=1.00(提交默认)57.6676.2345.7652.4750.07

结论(如实报告阴性结果)

PLAN 预期 covar +2~5;实测所有变体的 covar 变化 ≤ +0.19(远小于 T1 噪声 ~2),触发了 PLAN risks 1 的停止条件("若 W=0.10 变化 <1 分则说明 25 维 PC 空间校正太弱,应如实报告")。且 MODE=0/NORM 版随 W 增大 cell_state 单调下滑(T 的各向同性分量 ≈ 削弱 ISO 扩张,重演 node 11 的"削弱扩张必亏"教训);MODE=1 保方差版成功保护了 cell_state(76.23≈父)但 covar 仍不动。covariation 组对型内二阶结构修复不敏感——结合 node 11 的基因空间 CORR 校准同样无效,型内相关结构(PC 空间与基因空间两种实现)都不是 covar 组的驱动因素;node 10 的 covar +9.36 更可能来自其全类型施加+行洗牌对整体分布的破坏性重塑,而非相关修复本身。

提交默认 = 机制打开(MODE=1, W=1.0):A 半总分与父持平(57.66 vs 57.67,噪声内),covar 方向 +0.19,无实测代价,符合方法族"提交时机制打开"的要求。

验证与未验证

  • 已验证:W=0 逐元素等于父;seed0 重跑逐元素确定;vec-check ok;单输入退路(copy_last)未改动;校正块只用视图内数据与时间差,无绝对时间/视图依赖。
  • 未验证:B 半与 seed1/2;该机制在 final 视图(E8.5+E9.5→E10.5)上的效果(代码视图无关,应同样运行);W>1 或与非零掩码解码联合的进一步变体(证据显示 covar 组不响应,不值得扫)。

知识来源

无外部生物知识;全部为视图内数据的线性代数运算(父节点已有的 PCA/均值外推框架 + 协方差白化-再着色,通用统计方法)。

调研员的计划

名称低秩协方差方向校正:PC空间温和白化-再着色修复covariation
动机父节点11(榜分59.00)covariation=45.93是四组最弱,且低于copy_last基线(node1的48.44),说明均值位移+各向同性扩张实际上损害了共变结构。node10证明PC空间协方差校正可大幅拉升covariation(+9.36→55.29),但因W=0.2、全类型施加、行洗牌导致cell_state崩溃(-6.99)。ANALYSIS建议'用last阶段型内协方差的低秩主方向直接重塑残差'。本方案在node10机制基础上做三处关键约束以实现净增益。
做法在父节点run.py的ISO扩张之后、基因空间解码之前,插入PC空间协方差校正块(env开关COVAR_FIX2_W,默认0=关):

1. 对每个shaped type(仅5个配对类型,LOWRANK_FALLBACK=none的类型不动):
a) 取该类型所有细胞在25维PC空间的残差矩阵R_pred(ISO扩张后)
b) 计算Σ_pred = cov(R_pred)(25×25)
c) 取last阶段该类型的PC残差R_last,计算Σ_last = cov(R_last)(25×25)
d) 正则化:Σ_pred += ε·I, Σ_last += ε·I(ε=1e-6)
e) 计算变换T = Σ_last^{1/2} · Σ_pred^{-1/2}(矩阵平方根用eigh)
f) 混合:T_blend = (1-W)·I + W·T
g) 对每个细胞残差:r_new = T_blend @ r_old

2. 参数:W ∈ {0.05, 0.10, 0.15}(vs node10的0.2);仅shaped types(vs node10的ALL=1);无行洗牌。

3. 解码不变:PC→基因空间逆投影、非零掩码、clip≥0,与父节点完全一致。

4. 单输入退路:copy_last不变(len(inputs)<2分支不动)。

5. 查分策略:先跑W=0(对照,应与父逐元素一致)确认实现正确,再跑W=0.10(中位),若covar≥47且cell_state≥76则试W=0.05和0.15;若W=0.10已使cell_state<75则只试W=0.05。预计4-6次查分。

6. 矩阵平方根实现:np.linalg.eigh + clip负特征值≥1e-10 + 重构,无需额外依赖。
风险1) W过小(0.05)可能效果在噪声内(<2分)——Engineer应在W=0.10看到≥2分covariation变化才继续;若W=0.10变化<1分则说明25维PC空间校正太弱,应如实报告。2) cell_state仍可能下滑——若W=0.10时cell_state<76应停止增大W,接受covariation小幅改善。3) Σ_pred接近奇异(某些类型细胞数<25)——已有ε正则化和shape_min_cells=10门槛,但应额外检查eigh后特征值是否全正;若某类型Σ_pred条件数>1000则跳过该类型校正。4) 与node10的区别不够大导致类似失败——尽早发现:若W=0.10时cell_state已跌>3分,说明机制本身对cell_state有根本损伤,应停止。

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

对比:父节点版本 279aef2c1d。改动的文件:solution/METHOD.md +28 −49、solution/README.md +3 −0、solution/run.py +73 −0

diff --git a/solution/METHOD.md b/solution/METHOD.mdindex 0903df5..f691188 100644--- a/solution/METHOD.md+++ b/solution/METHOD.md@@ -1,65 +1,44 @@-形状演化由逐PC各向异性改为各向同性单一扩张系数(型内方差加权、β=3、保留非零掩码解码),采用 node7 已验证机制作提交默认;PLAN 的 top-k PC 选择与相关校正已实现并实测无增益,默认关闭。+在父节点(ISO β=3)之上加 PC 空间型内协方差校正块(COVAR_FIX2):对 5 个 shaped 类型用 last 阶段型内协方差做白化-再着色,默认提交配置为相关结构校正(MODE=1, W=1.0,保各 PC 方差);实测 covariation 组对该机制不敏感,如实报告阴性结果。 -## 本节点做了什么+## 方法 -按 PLAN 在父节点(node 9 = node 5,逐 PC 各向异性 lowrank_shape,β=3)上实现三个开关,全部只在 env 显式开启时生效,默认值即提交配置:+父节点流水线(分型 PCA 均值外推 + ISO β=3 各向同性形状扩张 + 非零掩码加性解码)完全不变。在解码后、clip≥0 前插入协方差校正块(env 开关 `COVAR_FIX2_W`,W=0 即逐元素回到父节点): -1. **LOWRANK_SHAPE_TOPK**(PLAN 步 1–3,默认 0=全 25 PC):算出 `scale[25]` 后,若 TOPK>0 按 `|scale[k]|` 降序保留前 k 个、其余置 0(按方差比信号强弱选,不按 PC 方差序号)。-2. **LOWRANK_SHAPE_CORR_W**(PLAN 步 4,默认 0=关):解码后逐类型对 200 个高变 HVG 做型内基因-基因相关校准,`C_t = w·C_input + (1−w)·C_pred`,在标准化空间做白化-再着色 `T = C_pred^{-1/2}·C_t^{1/2}` 变换每个细胞;**CORR_MASK=1**(默认)把校准块重新掩回原非零模式,避免向零位置注入稠密信号(node 9 的教训)。-3. **LOWRANK_SHAPE_ISO**(默认 **1**,提交采用):把逐 PC 各向异性 `scale_k` 替换为型内方差加权的单一系数 `scale_iso = Σ vl_k·scale_k / Σ vl_k`(vl=last 阶段型内各 PC 方差),对所有 25 PC 均匀施加。这是全树最佳节点 node 7(rank3 59.60)已验证的机制,本节点把它并入 node 9 血统。+1. 仅对 shaped types(两阶段各 ≥10 细胞的配对类型,本视图 5 个:AVC-CM、IFT-CM、OFT/RV-CM、SV-CM、Unknown,共 486/652 细胞;LOWRANK_FALLBACK=none 下未配对类型不动)。+2. 把预测细胞在 hvg 上的表达逆投影回 25 维 PC 空间,去型内质心得 R_pred;Σ_pred = cov(R_pred)+εI(ε=1e-6)。同型 last 阶段细胞得 Σ_last。+3. T = Σ_last^{1/2}·Σ_pred^{-1/2}(eigh,负特征值 clip 到 ε),T_blend = (1−W)I + W·T,r_new = T_blend·r(保均值与细胞数)。+4. 三种模式:MODE=0 原始 PLAN 版;NORM=1 时 T 除以 (det T)^{1/k}(体积保持,只修方向);**MODE=1(提交默认)相关结构版**:把 Σ 各自标准化成相关矩阵后算 T,作用后再乘回 Σ_pred 的逐 PC 标准差——精确保各 PC 方差不变,只把型内相关结构向 Σ_last 旋转。+5. 解码与父一致:Δ = (r_new − r_old) 逆投影到基因空间,只加到原非零位置,clip≥0。+6. Σ_pred 特征值非正或条件数 >1000 的类型跳过(实测无类型触发)。 -**提交默认 = ISO=1, β=3, TOPK=0, CORR_W=0**(其余参数 τ=0.3、NHVG=2500、NPC=25、α=1.8、τ_shape=0.5、RLO=1、CLIP=4、mc=10 全部沿用父节点)。单输入退路(copy_last)未改动。+## 机制生效证据(COVAR_FIX2_DEBUG=1) -## 查分结果(X3 A 半,seed0,共用 13 次额度,剩 7)+- W=0 对照与父节点输出逐元素 maxdiff = 0.0(机制关闭 = 父节点)。+- W>0 时 5 个类型全部被校正,fixed_cells=486(非全部 652,未配对类型不动);Σ_pred→Σ_last 的 Frobenius 距离全部缩小(如 OFT/RV-CM 33.3→21.8,IFT-CM 76.6→60.4 @MODE=1,W=0.5)。+- 均值保持:de_recovery 与 direction 在所有配置下几乎不变(de_recovery 恒 52.47),证明校正只动二阶结构。++## 查分结果(X3 A 半,seed0,共用 5 次,剩 15)  | 配置 | 总分 | cell_state | covar | de_rec | dir | |---|---|---|---|---|---|-| 父节点 aniso β=3(ISO=0,复现) | 57.33 | 75.52 | 45.21 | 52.47 | 50.08 |-| TOPK=3 | 56.77 | 73.2 | **46.53** | 51.96 | 50.05 |-| TOPK=5 | 56.88 | 73.67 | 46.41 | 51.96 | 50.02 |-| TOPK=8 | 57.14 | 74.72 | 45.43 | 52.47 | 50.07 |-| TOPK=12 | 57.17 | 74.91 | 45.33 | 52.47 | 50.07 |-| CORR_W=0.25 稠密(MASK=0) | 56.74 | 74.68 | 43.48 | 52.47 | 50.08 |-| CORR_W=0.5 稠密(MASK=0) | 56.29 | 73.79 | 42.55 | 52.47 | 50.09 |-| CORR_W=0.5 掩码(MASK=1) | 57.33 | 75.37 | 45.38 | 52.47 | 50.09 |-| CORR_W=1.0 掩码(MASK=1) | 57.07 | 74.84 | 45.63 | 51.96 | 50.02 |-| **ISO β=3(提交默认)** | **57.67** | **76.35** | **45.57** | **52.47** | **50.12** |-| ISO β=2 | 56.95 | 73.94 | 46.28 | 51.96 | 50.10 |-| ISO β=4 | 57.73 | 77.5 | 44.87 | 51.96 | 50.06 |-| ISO β=5 | 57.53 | 77.38 | 44.19 | 51.96 | 49.95 |--**结论**:-- **PLAN 主轴 top-k 证伪**:covar 随 k 减小单调回升(45.21→46.53@k=3,验证「去掉 ratio≈1 的噪声 PC 恢复共变」的假设方向正确),但 cell_state 与 de_recovery 同步下滑更多,总分无一超过父节点,无 k 满足 PLAN 接受判据(covar≥47 且 cell_state≥74 且总分≥57.3)。covariation↔cell_state 的张力是根本性的:恢复共变总以更多细胞多样性为代价。-- **PLAN 步 4 相关校正证伪**:稠密施加使 covar 崩到 42–43(重演 node 9 的 ALLHVG 失败——稠密化注入人工共变);加 CORR_MASK 掩回原非零后 covar 只回到 ≈父(45.4),因为只保留原有非零位置时校准几乎不改变二阶结构。净增益为零。-- **采用 ISO β=3(node 7 机制)**:四组全部 ≥父节点(cell_state +0.83、covar +0.36、de_rec 持平、dir +0.04),A 半总分 57.67(+0.34,在 T1 噪声 ~2 内),但方向与 node 7 的 B 半 rank3 优势(59.60 vs 父 59.11)一致,且我的 ISO β=3 A 半画像(cell_state 76.35 / covar 45.57)与 node 7 B 半(78.93 / 45.93,A 半通常低 2–3)吻合,故判断可迁移。β=4 总分名义略高(+0.06,纯噪声)但以 covar −0.34 换 cell_state,不采用。--## 机制生效证据(lowrank_shape 家族,ISO 默认开)--- **机制开关对照**:`LOWRANK_SHAPE_ISO=0` 输出与父节点(node 9 各向异性)逐元素 maxdiff=0.0(已验证);`LOWRANK_SHAPE_BETA=0` 关闭全部形状部分(复现 node 4,父已验证)。`ISO=1` 输出 nnz=1278357 vs `ISO=0` nnz=1277931,二者不同 → ISO 分支确在执行。-- **top-k 选择逻辑独立验证**:LOWRANK_DEBUG 打印保留的 PC 序号,AVC-CM=[6,7,9,15,24]、IFT-CM=[1,6,10,11,17]、SV-CM=[4,13,17,20,22] —— 分散而非前 k 个方差 PC,证明按 `|scale|` 选择而非按方差序号(PLAN 风险 2 已排除)。-- **改变了哪些细胞**:5 个配对类型被形状化(AVC-CM、IFT-CM、OFT/RV-CM、SV-CM、Unknown);不可配对类型不动(LOWRANK_FALLBACK=none)。各向同性下每个细胞的位移仍取决于其自身在 PC 空间偏离型心的残差(非常数位移,与 constant_shift 本质不同)。-- **vs constant_shift**:型内不同细胞获得不同位移;常数位移无法改变型内协方差。--## 验证过的+| 父节点 ISO β=3(W=0) | 57.67 | 76.35 | 45.57 | 52.47 | 50.12 |+| MODE=0 W=0.10 | 57.57 | 75.97 | 45.66 | 52.47 | 50.11 |+| NORM=1 W=0.30 | 57.52 | 75.85 | 45.63 | 52.47 | 50.10 |+| NORM=1 W=0.60 | 57.39 | 75.37 | 45.69 | 52.47 | 50.09 |+| MODE=1 W=0.50 | 57.61 | 76.13 | 45.65 | 52.47 | 50.10 |+| **MODE=1 W=1.00(提交默认)** | **57.66** | **76.23** | **45.76** | 52.47 | 50.07 | -- ISO=0(关机制)逐元素复现父节点 maxdiff=0.0;ISO=1 默认输出 = 显式 ISO=1 输出 maxdiff=0.0。-- seed0 连跑两次逐元素一致(确定性);seed1/2/3 正常运行、输出有限无 NaN、细胞数=652(在 [500,652])。-- **伪装视图**(所有阶段时间 +1 天、manifest 键逆序重排版、换路径 /tmp/opencode/dv11):输出与真实视图逐元素 maxdiff=0.0,基因顺序一致 → 视图无关(程序只用时间差 dt_in/dt_out,不读绝对时间/阶段名/board/mode/source/dataset,不写死细胞数)。-- vec-check:真实视图与伪装视图默认输出均 status=ok。-- 运行 ~10 s、内存 ~1.5 GB(limits 28 GB / 30 min 内富余)。-- 单输入退路(copy_last)代码路径未改动。+## 结论(如实报告阴性结果) -## 没验证的 / 风险+PLAN 预期 covar +2~5;实测所有变体的 covar 变化 ≤ +0.19(远小于 T1 噪声 ~2),触发了 PLAN risks 1 的停止条件("若 W=0.10 变化 <1 分则说明 25 维 PC 空间校正太弱,应如实报告")。且 MODE=0/NORM 版随 W 增大 cell_state 单调下滑(T 的各向同性分量 ≈ 削弱 ISO 扩张,重演 node 11 的"削弱扩张必亏"教训);MODE=1 保方差版成功保护了 cell_state(76.23≈父)但 covar 仍不动。**covariation 组对型内二阶结构修复不敏感**——结合 node 11 的基因空间 CORR 校准同样无效,型内相关结构(PC 空间与基因空间两种实现)都不是 covar 组的驱动因素;node 10 的 covar +9.36 更可能来自其全类型施加+行洗牌对整体分布的破坏性重塑,而非相关修复本身。 -- ISO β=3 只在 X3 A 半 seed0 打分(57.67);B 半行为推断自 node 7(同机制、B 半 rank3 59.60),未直接测。相对父的 A 半增益 +0.34 在噪声内,正式分增益预期同样小(~+0.5 rank3),但方向稳健。-- 未测 proxy/proxy2/final 视图(本节点只挂 X3);机制与父同族,父的跨视图结论应继续成立。-- top-k 与 CORR_W 两轴已判定无增益,未做更细扫描(PLAN 风险 3「delta<2 不追」已触发)。+提交默认 = 机制打开(MODE=1, W=1.0):A 半总分与父持平(57.66 vs 57.67,噪声内),covar 方向 +0.19,无实测代价,符合方法族"提交时机制打开"的要求。 -## 下一步建议(给后续节点)+## 验证与未验证 -- covariation 与 cell_state 的张力是 lowrank_shape 家族的核心瓶颈:任何恢复共变的操作(top-k、相关校正、降 β)都掉细胞多样性。要突破需从「注入正确的型内相关结构」而非「削弱扩张」入手——例如用 last 阶段型内协方差的低秩主方向直接重塑残差(保均值与细胞数),而不是各向同性放大。-- direction 组(~50,de_direction≈0.001–0.003 几乎无信号):对不可配对类型(Endocardium、V-CM 等,当前 LOWRANK_FALLBACK=none 完全不动)加 OT/近邻标签位移兜底,仍是未试方向,宜作独立开关单测。+- 已验证:W=0 逐元素等于父;seed0 重跑逐元素确定;vec-check ok;单输入退路(copy_last)未改动;校正块只用视图内数据与时间差,无绝对时间/视图依赖。+- 未验证:B 半与 seed1/2;该机制在 final 视图(E8.5+E9.5→E10.5)上的效果(代码视图无关,应同样运行);W>1 或与非零掩码解码联合的进一步变体(证据显示 covar 组不响应,不值得扫)。  ## 知识来源 -未使用任何保留阶段/基因型的测量信息;未读禁窗数据;未用 `uns.celltype_palette`;external/ 与 prior/ 均未读取。只用 view 内两个输入阶段的表达、标签、时间差。「细胞状态多样性随发育时间增加」为通用发育生物学常识(谱系渐进分化),不针对禁窗阶段;其余为统计常识(PCA、方差比收缩、各向同性 vs 各向异性扩张、稀疏掩码解码、相关矩阵白化),无外部数据注入。+无外部生物知识;全部为视图内数据的线性代数运算(父节点已有的 PCA/均值外推框架 + 协方差白化-再着色,通用统计方法)。diff --git a/solution/README.md b/solution/README.mdindex 663e2b0..3b34359 100644--- a/solution/README.md+++ b/solution/README.md@@ -2,3 +2,6 @@  See METHOD.md. Entry: `python run.py --data <view> --out <pred.h5ad> --seed <int>` (pure CPU, `EXECUTION.json` gpu=false). Env knobs (defaults are the submitted config): `LOWRANK_TAU=0.3`, `LOWRANK_ALPHA=1.8`, `LOWRANK_PER_TYPE=1`, `LOWRANK_FALLBACK=none`, `LOWRANK_NHVG=2500`, `LOWRANK_NPC=25`, `LOWRANK_SCAP=4.0`, `LOWRANK_SHAPE_BETA=3.0` (0 = parent node 4 exactly), `LOWRANK_SHAPE_TAU=0.5`, `LOWRANK_SHAPE_CLIP=4.0`, `LOWRANK_SHAPE_RLO=1.0` (expansion-only), `LOWRANK_SHAPE_NPCS=25`, `LOWRANK_SHAPE_MINCELLS=10`.++## node 13 追加:COVAR_FIX2(提交默认打开)+PC 空间型内协方差校正:`COVAR_FIX2_W`(默认 1.0,0=关闭、逐元素回到父节点)、`COVAR_FIX2_MODE`(默认 1=相关结构校正、保各 PC 方差;0=PLAN 原始白化-再着色)、`COVAR_FIX2_NORM`(默认 0;1=det(T)=1 体积保持,仅 MODE=0 时生效)、`COVAR_FIX2_EPS=1e-6`、`COVAR_FIX2_COND_MAX=1000`、`COVAR_FIX2_DEBUG=1` 打印每型 Σ 距离与校正细胞数。详见 METHOD.md(covariation 组对该机制不敏感的阴性结果)。diff --git a/solution/run.py b/solution/run.pyindex e35b8cc..db443aa 100644--- a/solution/run.py+++ b/solution/run.py@@ -80,6 +80,12 @@ def main() -> None:     corr_w = _env_float("LOWRANK_SHAPE_CORR_W", 0.0)     corr_nhvg = _env_int("LOWRANK_SHAPE_CORR_NHVG", 200)     corr_mask = _env_int("LOWRANK_SHAPE_CORR_MASK", 1)+    covar_w = _env_float("COVAR_FIX2_W", 1.0)+    covar_eps = _env_float("COVAR_FIX2_EPS", 1e-6)+    covar_cond_max = _env_float("COVAR_FIX2_COND_MAX", 1000.0)+    covar_norm = _env_int("COVAR_FIX2_NORM", 0)+    covar_mode = _env_int("COVAR_FIX2_MODE", 1)  # 1 = correlation-only, variance-preserving+    covar_debug = bool(os.environ.get("COVAR_FIX2_DEBUG"))      manifest = load_manifest(args.data)     genes = panel_genes(args.data, manifest)@@ -287,6 +293,73 @@ def main() -> None:                 sub_d = np.where(orig_nz, sub_d, 0.0)             Xc[sel_pred] = sp.csr_matrix(sub_d.astype(np.float32)) +    if covar_w > 0.0 and shape_scale_by_type:+        from numpy.linalg import eigh as _eigh2++        def _sym_pow2(M: np.ndarray, p: float, eps: float) -> np.ndarray:+            M = 0.5 * (M + M.T)+            w_, Q = _eigh2(M)+            w_ = np.clip(w_, eps, None)+            return (Q * (w_ ** p)) @ Q.T++        kk = V.shape[1]+        n_fixed_cells = 0+        for t in sorted(shape_scale_by_type.keys()):+            m_in = lab_last == t+            sel = np.flatnonzero(lab_last_rows == t)+            if sel.size < shape_min_cells or int(m_in.sum()) < shape_min_cells:+                continue+            Gp = _dense(Xc[sel][:, hvg]).astype(np.float64)+            Rp = (Gp - mean_h) @ V+            mu_p = Rp.mean(axis=0)+            Rp_c = Rp - mu_p+            Sp = (Rp_c.T @ Rp_c) / max(sel.size - 1, 1)+            from numpy.linalg import eigvalsh as _eigvalsh2+            ev_p = _eigvalsh2(0.5 * (Sp + Sp.T))+            if ev_p.min() <= 0 or ev_p.max() / ev_p.min() > covar_cond_max:+                if covar_debug:+                    print(f"  COVAR2 skip type={t} n={sel.size} cond={ev_p.max() / max(ev_p.min(), 1e-12):.1f}")+                continue+            Sp += covar_eps * np.eye(kk)+            Rl = Z_last[m_in].astype(np.float64)+            Rl_c = Rl - Rl.mean(axis=0)+            Sl = (Rl_c.T @ Rl_c) / max(int(m_in.sum()) - 1, 1)+            Sl += covar_eps * np.eye(kk)+            if covar_mode == 1:+                dp = np.sqrt(np.clip(np.diag(Sp), 1e-12, None))+                Dinv = np.diag(1.0 / dp)+                Rpc = Dinv @ Sp @ Dinv+                Dl = np.diag(1.0 / np.sqrt(np.clip(np.diag(Sl), 1e-12, None)))+                Rlc = Dl @ Sl @ Dl+                T = _sym_pow2(Rlc, 0.5, covar_eps) @ _sym_pow2(Rpc, -0.5, covar_eps)+                Tb = (1.0 - covar_w) * np.eye(kk) + covar_w * T+                Rn_c = (Rp_c @ Dinv @ Tb.T) * dp[None, :]+            else:+                T = _sym_pow2(Sl, 0.5, covar_eps) @ _sym_pow2(Sp, -0.5, covar_eps)+                if covar_norm:+                    sign, logdet = np.linalg.slogdet(T)+                    if sign > 0:+                        T = T / float(np.exp(logdet / kk))+                Tb = (1.0 - covar_w) * np.eye(kk) + covar_w * T+                Rn_c = Rp_c @ Tb.T+            d_gene = ((Rn_c - Rp_c) @ Vt).astype(np.float32)+            sub = Xc[sel]+            row_ids = np.repeat(np.arange(sub.shape[0]), np.diff(sub.indptr))+            pos = np.searchsorted(hvg, sub.indices)+            pos_c = np.clip(pos, 0, hvg.size - 1)+            valid = hvg[pos_c] == sub.indices+            sub.data += np.where(valid, d_gene[row_ids, pos_c], 0.0).astype(np.float32)+            Xc[sel] = sub+            n_fixed_cells += sel.size+            if covar_debug:+                Sn = (Rn_c.T @ Rn_c) / max(sel.size - 1, 1)+                d_before = float(np.linalg.norm(Sp - Sl))+                d_after = float(np.linalg.norm(Sn - Sl))+                print(f"  COVAR2 type={t} n_pred={sel.size} n_last={int(m_in.sum())} "+                      f"|Sp-Sl|_F {d_before:.3f} -> |Sn-Sl|_F {d_after:.3f}")+        if covar_debug:+            print(f"COVAR2 W={covar_w} fixed_cells={n_fixed_cells}")+     np.clip(Xc.data, 0.0, None, out=Xc.data)     Xc.eliminate_zeros()     out_X = Xc

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

用到的知识库条目

编号标题出处
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)
k038RNA velocity family (scVelo, dynamo, CellRank velocity kernel): not applicable to T1 files; substitutes10.1038/s41587-020-0591-3 (scVelo); 10.1016/j.cell.2021.12.045 (dynamo); 10.1038/s41592-024-02303-9 (CellRank 2)

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

改了什么在父节点(ISO β=3)解码后、clip 前插入 PC 空间型内协方差校正块 COVAR_FIX2(env 开关,W=0 逐元素回到父):仅对 5 个 shaped 类型(486/652 细胞)用 last 阶段型内协方差做白化-再着色,含三种模式;提交默认 MODE=1(相关结构校正、保各 PC 方差)、W=1.0。
各组分数的变化cell_state:噪声内(-0.03,78.90 vs 78.93)
covariation:噪声内(+0.16,46.09 vs 45.93,远小于 T1 噪声 ~2;PLAN 预期 +2~5 未实现)
de_recovery:噪声内(+0.00,54.37 vs 54.37)
direction:噪声内(-0.04,50.13 vs 50.17)
family_idlowrank_shape
假设是否成立否
经验
  1. 在 lowrank_shape(ISO β=3)血统上,对 shaped types 做 PC 空间型内协方差白化-再着色(W 0.1~1.0、三种模式),covariation 变化 ≤ +0.19,全部在噪声内:型内二阶结构修复(PC 空间的 COVAR_FIX2 与 node 11 的基因空间 CORR 校准)都不是 covariation 组的驱动因素,该轴可判定为死路。
  2. 非保方差的协方差变换(MODE=0/NORM=1)随 W 增大 cell_state 单调下滑,因 T 的各向同性分量实质削弱 ISO 扩张;只有 MODE=1(标准化成相关矩阵、保各 PC 方差)能护住 cell_state——任何二阶校正必须先剥离尺度分量再施加。
  3. node 10 的 covar +9.36 更可能来自全类型施加+行洗牌对整体分布的破坏性重塑,而非相关结构修复本身;引用历史大增益前应先归因到具体成分。
  4. 机制关闭对照(W=0 与父逐元素 maxdiff=0.0)成本极低且能确证插入点正确,本次 5 次查分即触发 PLAN 停止条件,是良好的预算控制范例。
  5. Engineer 报告与变化量表一致(covar A 半 +0.19 / 正式 +0.16,均在噪声内),其'如实报告阴性结果'的说法可信。
mechanism_active是
下一步建议
  1. 针对 direction 组(~50,de_direction 几乎无信号):对当前 LOWRANK_FALLBACK=none 完全不动的不可配对类型(Endocardium、V-CM 等)加 OT/近邻标签位移兜底,做成独立 env 开关单测,W=0 时逐元素回父。
  2. 针对 covariation 组:先做指标归因实验(如对输出做受控扰动——改变类型间组成比例、整体方差尺度、均值位移幅度——观察 covar 指标响应),确认它对什么结构敏感后再设计机制,不要继续扫型内二阶结构变体。
  3. 保留本节点 MODE=1 实现作为可复用组件,但在证明 covar 响应源之前不再增加 W 或模式扫描;预算转向 direction/de_recovery 轴。

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

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

分析员

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

工程师

角色工程师 alibaba-token-plan-cn/qwen3.8-max
调用次数1 次
轮数23
工具调用共 26 次:bash 18、edit 6、read 1、write 1
用时15 分
token 数输入 55,159 · 输出 7,712 · 思考 14,262
任务(第一行)按计划修改程序:低秩协方差方向校正:PC空间温和白化-再着色修复covariation
最后的回答(摘录)
完成。总结:

**做了什么**:按 PLAN 在父节点(node 11, ISO β=3)解码后插入 PC 空间型内协方差校正块(`COVAR_FIX2_W`,仅 5 个 shaped types、486/652 细胞),实现了三种模式:原始白化-再着色、det=1 体积保持、相关结构校正(保各 PC 方差)。W=0 对照与父逐元素一致(maxdiff=0.0),seed0 重跑确定,vec-check 通过。

**查分结果**(5 次,X3 A 半):所有变体 covar 变化 ≤ +0.19(PLAN 预期 +2~5,噪声 ~2),触发 PLAN 停止条件,如实报告阴性结果——covariation 组对型内二阶结构修复不敏感(PC 空间与 node 11 的基因空间实现均无效)。MODE=0/NORM 版随 W 增大 cell_state 单调下滑(T 的各向同性分量 ≈ 削弱扩张,重演 node 11 教训);MODE=1 版保住了 cell_state。提交默认 = 机制打开(MODE=1, W=1.0):总分 57.66 vs 父 57.67(噪声内持平),covar +0.19。

**下一步最值得试**:covar 组的驱动因素不在型内相关结构,更可能在类型间组成/均值或整体分布形状(node 10 的 +9.36 疑来自全类型破坏性重塑);建议下个好节点转向不可配对类型(Endocardium、V-CM 等,当前完全不动)的 OT/近邻位移兜底以攻 direction 组(~50,几乎无信号),或研究 covar 组指标对什么结构敏感后再动。
原始记录位置/home/spark-longxinyang/vec/runs/formal/20261002-202907-search-t1-scr-A/nodes/13/engineer.jsonl 120 KB
/home/spark-longxinyang/vec/runs/formal/20261002-202907-search-t1-scr-A/nodes/13/engineer.stderr

调研员

角色调研员 alibaba-token-plan-cn/qwen3.8-max
调用次数1 次
轮数1
工具调用共 0 次:—
用时2 分
token 数输入 17,169 · 输出 1,286 · 思考 6,218
任务(第一行)为节点 n13(改进,父节点 n11)写改进计划 PLAN.json
最后的回答(摘录)
、全类型施加、行洗牌导致cell_state崩溃(-6.99)。ANALYSIS建议'用last阶段型内协方差的低秩主方向直接重塑残差'。本方案在node10机制基础上做三处关键约束以实现净增益。",
  "approach": "在父节点run.py的ISO扩张之后、基因空间解码之前,插入PC空间协方差校正块(env开关COVAR_FIX2_W,默认0=关):\n\n1. 对每个shaped type(仅5个配对类型,LOWRANK_FALLBACK=none的类型不动):\n   a) 取该类型所有细胞在25维PC空间的残差矩阵R_pred(ISO扩张后)\n   b) 计算Σ_pred = cov(R_pred)(25×25)\n   c) 取last阶段该类型的PC残差R_last,计算Σ_last = cov(R_last)(25×25)\n   d) 正则化:Σ_pred += ε·I, Σ_last += ε·I(ε=1e-6)\n   e) 计算变换T = Σ_last^{1/2} · Σ_pred^{-1/2}(矩阵平方根用eigh)\n   f) 混合:T_blend = (1-W)·I + W·T\n   g) 对每个细胞残差:r_new = T_blend @ r_old\n\n2. 参数:W ∈ {0.05, 0.10, 0.15}(vs node10的0.2);仅shaped types(vs node10的ALL=1);无行洗牌。\n\n3. 解码不变:PC→基因空间逆投影、非零掩码、clip≥0,与父节点完全一致。\n\n4. 单输入退路:copy_last不变(len(inputs)<2分支不动)。\n\n5. 查分策略:先跑W=0(对照,应与父逐元素一致)确认实现正确,再跑W=0.10(中位),若covar≥47且cell_state≥76则试W=0.05和0.15;若W=0.10已使cell_state<75则只试W=0.05。预计4-6次查分。\n\n6. 矩阵平方根实现:np.linalg.eigh + clip负特征值≥1e-10 + 重构,无需额外依赖。",
  "expected_groups": ["covariation"],
  "risks": "1) W过小(0.05)可能效果在噪声内(<2分)——Engineer应在W=0.10看到≥2分covariation变化才继续;若W=0.10变化<1分则说明25维PC空间校正太弱,应如实报告。2) cell_state仍可能下滑——若W=0.10时cell_state<76应停止增大W,接受covariation小幅改善。3) Σ_pred接近奇异(某些类型细胞数<25)——已有ε正则化和shape_min_cells=10门槛,但应额外检查eigh后特征值是否全正;若某类型Σ_pred条件数>1000则跳过该类型校正。4) 与node10的区别不够大导致类似失败——尽早发现:若W=0.10时cell_state已跌>3分,说明机制本身对cell_state有根本损伤,应停止。",
  "family_id": "lowrank_shape",
  "mechanism": "在各向同性扩张后,用last阶段观测协方差的矩阵平方根对预测残差做温和白化-再着色变换,将型内共变结构向观测目标校正,而非各向同性放大。",
  "vs_constant_shift": "常数位移对所有细胞加同一向量,不改变型内协方差结构。本机制对每个细胞的残差施加线性变换(依赖于该细胞在PC空间的残差方向),改变的是型内基因-基因相关模式(二阶结构),且不同细胞因残差方向不同而获得不同的变换效果。",
  "mechanism_evidence": "1) W=0输出与父节点逐元素maxdiff=0.0(机制关闭对照)。2) W>0时,打印shaped type的Σ_pred与Σ_last的Frobenius范数距离,校正后应缩小。3) 报告每组的四组分变化,特别是covariation与cell_state的trade-off。4) 打印被校正的细胞数(应仅为5个shaped type的细胞,非全部652)。5) 对比W=0与W=0.10输出的型内基因-基因相关矩阵(取前50 HVG),确认相关模式确实改变。",
  "mechanism_off_control": "同一程序设COVAR_FIX2_W=0(env变量),跳过整个校正块,输出应与父节点(ISO=1, β=3)逐元素一致(maxdiff=0.0)。预期差别:W=0时covariation≈45.9;W>0时covariation应上升2-5分,cell_state下降≤2分。"
}
原始记录位置/home/spark-longxinyang/vec/runs/formal/20261002-202907-search-t1-scr-A/nodes/13/researcher.jsonl 5 KB
/home/spark-longxinyang/vec/runs/formal/20261002-202907-search-t1-scr-A/nodes/13/researcher.stderr