总览 · ← 返回运行 20261003-172000-search-t2-heart-extrap-chain-12h
节点 n39 在终选来历上
NO_CHANGE: 线性空间锚点混合(λ×2 域×再闭合 6 档全劣于父或门失败;备选库尺寸归一、型内收缩亦证否)
| 运行?一次完整的自动搜索或 Agent 会话,有自己的锁定配置和证据包。 | 20261003-172000-search-t2-heart-extrap-chain-12h |
|---|---|
| 父节点 | n37 |
| 子节点 | n41 |
| 操作?种子:人写的起点;改进:在父节点上改;草稿:从头写;修复:修父节点的报错。 | 改进 |
| 状态 | 已打分 |
| 分数 | 搜索目标分 57.11(+0.0) · proxy_noscale 57.11(+0.0) |
| 审查 | 通过 检查1(越界读取):未发现问题。run.py 全部数据读取经 src.task2_spatial.view_io(load_manifest/read_stage/panel_genes,参数只有 args.data 视图路径,run.py:401-409、701-703、719);grep 全文无 open(/h5py/np.load/绝对路径/../、/mnt、/home、data/raw、downloads、评分器或 src/common/evaluation 导入,无联网下载;external qiu2024 与 prior/ 在代码中从未被读取。; 检查2(硬编码目标统计量):未发… |
| 用时?从运行开始到结束(或到现在)的挂钟时间。 | 35 分 |
| 程序版本 | f39e397d5145b5ceee53e6f27eb800fff3aee8af (programs.git) |
方法说明?节点程序自带的 METHOD.md:这个程序做了什么、为什么。
来自 programs.git f39e397d51:solution/METHOD.md
NO_CHANGE: 线性空间锚点混合(λ×2 域×再闭合 6 档全劣于父或门失败;备选库尺寸归一、型内收缩亦证否)
结论
PLAN(T2HX-09 线性空间锚点混合)按其字面实现并在代理上查分证否:所有真实混合幅度都单调劣于父节点。
按 improve 规则改交两个针对同一弱项(cell_state / mmd_u,八项最低 skill 0.551)的备选机制,也全部证否。
提交的程序默认关闭本节点全部新机制(VEC_BLEND_LAMBDA=1.0、VEC_TOTNORM_W=0、VEC_TYPE_SHRINK=0),
输出与父节点 35/37 逐位相同(本地 cmp 验证:X、坐标、基因序、细胞数全同;--ablate blend 同样逐位相同,
mechanism_active 将为 no)。基座保持不变:α=1, k=0.5, γ=1.35, ε=0.1, β_rec=0.15, PBC=10, 门控, 坐标/组成/行序冻结。
方法(实现了什么)
- PLAN 机制(blend):父管线产出 x_extrapolated(log1p)后,在线性 CP10k 域与锚阶段原始表达逐元素混合
x_final = (1−λ)·expm1(x_anchor) + λ·expm1(x_extrap),再 log1p 输出;零值保持零(两侧同支撑)。 DE 门控(PLAN 原文):混合后 dp=pb(x_final)−pb(x_anchor) 须满足 spearman(dp,dt_approx)≥0.3 且 std(dp)≥0.01·std(dt_approx),否则回退 λ=1(=父输出)。VEC_BLEND_DOMAIN=log是 log1p 域变体;VEC_BLEND_RECLOSE=w是混合后逐细胞总量回拉锚总量的变体。 - 备选 (c) TOTNORM:管线后逐细胞线性总量归一
scale=(tot_ref/tot_i)^w(细胞组成不变、零保持零)。 mode=cell(tot_ref=该细胞自身锚总量,恢复 CP10k 不变量)/ median(tot_ref=预测自身中位数,保电平去离散)/ global(一致压暗到锚中位数)。门控改为相对基线:spearman 不得低于混合前矩阵 −0.02(父输出自身的最终 spearman≈0.261 就低于 0.3 的绝对门,绝对门对机制比对基座更严,不公平)。 - 备选 (d) TYPE_SHRINK:型内径向收缩
x ← μ_t + (1−w)(x−μ_t)(μ_t=最终矩阵的型×基因均值)。 型质心是不动点 → dp 逐位保持(实测 max|Δdp|=3e-13),只动型内离散度——与位移幅度正交的"宽度"轴。 SUP=1 变体只收缩正值、保零模式(防零膨胀)。
查分记录(A 半,父节点 = 56.869;共 10 次,配额 20 剩 10)
| # | 配置 | 总分 | de_score | de_dir | mmd_u | variogram | nb_mmd |
|---|---|---|---|---|---|---|---|
| — | 父 35/37 | 56.869 | 0.2778 | 0.3839 | 0.04853 | 0.03541 | 0.08093 |
| 1 | blend lin λ=0.8 | 54.377 | 0.3194 | 0.3230 | 0.05131 | 0.05179 | 0.09612 |
| 2 | blend lin λ=0.9 | 55.209 | 0.3194 | 0.3529 | 0.04975 | 0.04851 | 0.09019 |
| 3 | blend lin λ=0.95 | 56.869* | 门失败回退=父 | ||||
| 4 | blend lin λ=0.7 | 53.792 | 0.3056 | 0.3134 | 0.05267 | 0.05383 | 0.10044 |
| 5 | λ=0(诊断) | 56.869* | 门失败回退=父(dp=0 触发无变化保护) | ||||
| 6 | blend log λ=0.8(强制过门) | 56.335 | 0.2778 | 0.3839 | 0.04844 | 0.04133 | 0.08189 |
| 7 | TOTNORM cell w=1(强制过门) | 54.982 | 0.1806 | 0.3035 | 0.05885 | 0.03577 | 0.08741 |
| 8 | TOTNORM median w=1(相对门通过) | 56.552 | 0.2361 | 0.3522 | 0.04676 | 0.03823 | 0.07918 |
| 9 | TYPE_SHRINK 抬零 w=0.15 | 54.994 | 0.2778 | 0.3838 | 0.05258 | 0.05823 | 0.08206 |
| 10 | TYPE_SHRINK 保支撑 w=0.15(强制过门) | 56.007 | 0.2083 | 0.3885 | 0.05430 | 0.03524 | 0.08428 |
未查分的离线门失败档(spearman(dp,dt_approx),基座最终值 0.261):blend lin λ=0.8 + RECLOSE=1 → 0.231; TOTNORM cell w=0.5 → 0.232;TOTNORM global w=1 → 0.197。
机制生效证据(PLAN mechanism_evidence 五项)
- 改变了哪些细胞:blend 全体细胞(changed_frac_pos=1.0),零模式逐位保持(zero_preserved=True); λ=0.8 时 |x_final−x_extrap| q50/q90 = 0.148/2.760(log1p 单位)。
- 型内表达 std(log1p,按型平均):父 0.7056 → blend λ=0.8 0.8003(不降反升:混合把逐细胞膨胀比 r_i 的离散(std(log r)≈3.9)注入每个基因,PLAN 预期的"型内方差压缩"在线性域混合下不成立); TYPE_SHRINK w=0.15 → 0.6170(按构造收缩)。
- mmd_u:λ=0.8 → 0.05131(劣于父 0.04853),未出现预期改善;唯一 mmd_u 改善的档是 TOTNORM median (0.04676)和 blend log(0.04844),但都被 DE/variogram/nb_mmd 的更大损失抵消。
- de_direction:λ=0.8 → 0.3230 < 0.3839,PLAN 风险 1 命中(首查即低于守卫值);λ 越小越差,单调。
- 四组分(λ=0.8 vs 父):expression 59.94/60.29、cell_state 53.21/58.59、local 54.36/58.60、shape 50/50—— 除 DE 的 de_score 一步量化抬升外全组下降。
- 中位每细胞总量:锚 10000(CP10k),父输出 1.825×,blend λ=0.8 → 1.660×,TOTNORM cell → 1.000×。
为什么证否(读分)
- 线性域混合注入非物理的逐细胞库尺寸离散:外推细胞的膨胀比 r_i 差异极大,(1−λ) 权重的回拉使每个细胞 落在锚总量与 r_i·锚总量之间的不同位置 → nb_mmd/variogram 单调恶化,且 mmd_u 并未因"拉近锚"而改善。
- 1.8× 电平与逐细胞膨胀是信号不是伪影(在本尺子上):TOTNORM cell 恢复 CP10k 不变量后 de_score 崩 (0.278→0.181)且 mmd_u 反而恶化(0.0589)——真值 E9.5 云在 truth-PCA 里位于比锚更亮、且逐细胞亮度 异质的方向上;父节点的"过量"表达量部分编码了真实位移幅度。median 变体(保电平、去离散)同时改善 mmd_u 与 nb_mmd,但 DE 两项+variogram 损失更大,净 −0.32。
- 型内宽度不是 mmd_u 的短板:dp 逐位保持的型内收缩(抬零版)de 两项纹丝不动而 mmd_u/variogram 显著 恶化(抬零 87.5% 直接击穿 variogram 0.035→0.058);保支撑版避免抬零但稀疏基因 dp 被压低,de_score 崩。 两个解码都说明真值型内离散不比父输出窄,收缩宽度必输。
- 汇总:blend(2 域×4 幅度×再闭合变体)、TOTNORM(3 模式)、TYPE_SHRINK(2 解码)共 11 个配置、10 次 查分,无一超过父节点;满足"≥3 种解码/幅度、≥6 次查分"的证否标准。父节点 ANALYSIS 的帕累托前沿结论 在三个新变换族上再次成立:mmd_u 只对"付出更多 de_direction/variogram"的变换作正向响应。
验证过 / 未验证
- 验证:默认输出与父逐位相同(X/坐标/基因序/n=24826);
--ablate blend逐位相同;seed 0/1 输出相同; 伪装视图(时间 +1 天、manifest 键序打乱、路径更换)下机制关与机制开两种运行输出均逐位相同(view 无关); vec-check 通过;运行 ~3s / <2GB。 - 未验证:TOTNORM global、blend+RECLOSE 等离线门失败档未查分(方向已被同族查分档覆盖);B 半与官网外推 榜(本地尺子已知高估,全部结论只在 A 半代理上成立)。
知识与来源
未使用任何外部生物学知识或保留阶段信息;全部机制仅由视图内输入数据现场计算的量驱动 (锚/前阶段伪批量、型均值、每细胞总量、坐标 kNN 图),无任何阶段特异常数。评分规则事实引自任务书 "T2 评分规则简报"(veckit 公开代码)与父节点 35/37 的 METHOD/ANALYSIS。
给后续节点
- 不要再试:锚混合(任何域/幅度)、逐细胞或全局库尺寸归一(任何模式)、型内宽度收缩/扩张——已 11 配置证否。
- 若要攻 cell_state:mmd_u 的可行改善历史上只伴随 γ/β_rec 等再闭合轴(node 31 γ=0.45 时 mmd_u=0.0454 但 DE 差),说明其瓶颈是质心位置(外推方向)而非宽度/电平;需要更好的速度方向估计(如引入视图内 external Qiu E8.75 心脏样本做型内参考),而不是对现有输出做后变换。
- 本基座(含 blend/totnorm/type_shrink 钩子,全部默认关)可复用:钩子都有独立门控与 DEBUG 证据输出。
调研员的计划
| 名称 | T2HX-09 线性空间锚点混合:非对数域压缩外推幅度以改善型内分布 |
|---|---|
| 动机 | 父节点 37 总分 57.11,四组中 cell_state 58.92 最弱(mmd_u skill 0.551 为八项最低)。ANALYSIS 明确指出所有表达变换轴(α、W、β_rec、k、ε)落在同一条帕累托前沿上(DE+variogram ↔ nb_mmd+mmd_u,~1:1 交换),总分 ±0.1 平坦。需要与位移幅度正交的新轴。线性空间锚点混合改变的是型内分布的方差结构(压缩极端值、拉近零值),而非位移方向或平滑度,属于不同变换族。 |
| 做法 | 在父节点 35 完整管线(α=1, k=0.5, γ=1.35, ε=0.1, β_rec=0.15, PBC=10, 门控)产出 x_extrapolated 后,做线性空间混合:x_final = (1−λ)·x_anchor + λ·x_extrapolated(逐元素,锚阶段原始表达为 x_anchor)。关键参数:λ 初值 0.80,搜索 {0.60, 0.70, 0.80, 0.90, 1.00} 共 5 档。λ=1.0 时逐位等于父节点。性质:(1) 零值保持零(0·任何=0);(2) 大 |v| 基因的有效位移被压缩更多(非线性于 v),小 |v| 基因几乎不变;(3) 型内方差被压缩(混合降低离散度),可能改善 mmd_u。DE 门控:混合后重算 dp=pb(x_final)−pb(x_anchor),验证 spearman(dp, dt_approx)≥0.3 且 std(dp)≥0.01·std(dt_approx),不过则回退 λ=1。单输入退路:只有一个阶段时无法算速度,直接 λ=1(copy_last)。vec-score 快筛:先跑 λ=0.8 单次查分看 mmd_u 和 de_direction 方向,再决定是否扩展网格。 |
| 风险 | 1) 线性混合可能同时压缩 DE 信号(de_score/de_direction 下降),重蹈帕累托交换;Engineer 第一次查分即看 de_direction 是否 <0.3839,若是则停止。2) 型内方差压缩可能损害 variogram(共变结构变弱);监控 variogram raw 是否 >0.0355。3) λ<0.7 时可能触发无变化保护(std(dp)<1%·std(dt))导致 DE 记 0;Engineer 应在离线先验证。4) 外推榜本地尺子已知高估(54.2→49.6),本地小幅领先不可信;需 >1 分差才算进步。 |
代码改动?这个节点的程序和父节点程序的逐行差别:绿色是新增,红色是删除。
对比:父节点版本 9b9e1fb164。改动的文件:solution/METHOD.md +94 −75、solution/run.py +301 −4
diff --git a/solution/METHOD.md b/solution/METHOD.mdindex ec47d69..b72a603 100644--- a/solution/METHOD.md+++ b/solution/METHOD.md@@ -1,75 +1,94 @@-NO_CHANGE: 位移场空间混合 VDIFF(nb_mmd 随 W/解码 9 档单调改善但与 de_direction 等值交换、总分噪声内;备选 β_rec<0 锐化、k=0.6 亦不超父)--# 节点 37(improve,父 35):速度场空间相干化 VDIFF —— 已实现、已实测、按 PLAN 边界规则关闭提交--提交态 = 父节点 35 配置逐位不变(`VEC_VDIFF_W=0` 默认),输出与父节点逐位相同(本地 cmp 验证),-预期 `mechanism_active: no`(NO_CHANGE 状态的正确表现)。所有默认参数承父:-α=1、k=0.5、γ=1.35、ε=0.1(SMOOTH_STEPS=2、K=15)、β_rec=0.15、VEC_REC_LEVEL=matched、PBC=10、-门控(std 比 ≥0.01、spearman ≥0.3)、坐标/行序/细胞数/组成冻结。--## 做了什么--1. **PLAN 机制原样实现**:逐细胞乘法位移前,log2 域速度场在坐标 15-NN 图上做一步加权混合- `d_eff = (1−W)·v_type(i) + W·mean_{j∈kNN(i,15)} v_type(j)`(`VEC_VDIFF_W`、`VEC_VDIFF_K=15`)。-2. **机制确实运行了**(PLAN mechanism_evidence 四项全报,DEBUG 输出):- - affected_frac(|Δd|>1e-6 的细胞比例)= **0.9014**(该点云 90% 细胞在坐标 15-NN 内有异型邻居;- 型内部细胞位移逐位不变,affected_inside_frac=0.00000,符合"只在型边界生效"的设计);- - 受影响细胞 |d_eff−d_raw| 逐细胞最大值 q50/q90/max:W=0.1 → 0.039/0.092/0.332;- W=0.2 → 0.079/0.184/0.664;W=0.3 → 0.118/0.276/0.997(L2 均值 0.157/0.313/0.470);- - nb_mmd raw 随 W 单调回落(见下表),从 0.08093 最低到 0.07845(W=0.5);- - de_score/de_direction:伪批量方向被型间混合稀释,de_direction 单调下降(下表),PLAN 守卫失败。-3. **判无效的查分证据**(§5:9 个 VDIFF 家族配置 + 2 个备选机制 + 1 个基线 = 12 次查分,A 半,- proxy_noscale;shape_scale 组恒 50.00——坐标冻结;所有配置 nb_mmd skill ≥0.586,结构门恒 1;- raw 越小越好的指标:mmd_u、variogram、nb_mmd):--| # | 配置 | 总分 | expr/cell/local 组 | de_score | de_dir | mmd_u | variogram | nb_mmd |-|---|---|---|---|---|---|---|---|---|-| 1 | 基线 W=0(=父 35) | **56.869** | 60.29/58.59/58.60 | 0.2778 | 0.3839 | 0.04853 | 0.035414 | 0.08093 |-| 2 | W=0.1 | 56.776 | 59.69/58.62/58.80 | 0.2500 | 0.3783 | 0.04800 | 0.035734 | 0.08026 |-| 3 | W=0.2 | 56.901 | 60.00/58.63/58.98 | 0.2778 | 0.3686 | 0.04750 | 0.036090 | 0.07967 |-| 4 | W=0.25 | 56.848 | 59.70/58.63/59.06 | 0.2639 | 0.3662 | 0.04726 | 0.036279 | 0.07940 |-| 5 | W=0.3 | **56.917** | 59.90/58.63/59.14 | 0.2778 | 0.3633 | 0.04697 | 0.036493 | 0.07915 |-| 6 | W=0.35 | 56.914 | 59.82/58.63/59.21 | 0.2778 | 0.3590 | 0.04672 | 0.036696 | 0.07893 |-| 7 | W=0.5 | 56.849 | 59.42/58.62/59.35 | 0.2639 | 0.3512 | 0.04600 | 0.037312 | 0.07845 |-| 8 | W=0.2 + NORM=1(幅度保持) | 56.714 | 59.62/58.56/58.68 | 0.2500 | 0.3747 | 0.04836 | 0.035617 | 0.08067 |-| 9 | W=0.5 + NORM=1 | 56.791 | 59.77/58.55/58.84 | 0.2778 | 0.3567 | 0.04775 | 0.036134 | 0.08013 |-| 10 | W=0.3 + α=1.2(幅度补偿) | 56.650 | 59.57/58.86/58.17 | 0.2500 | 0.3722 | 0.05036 | 0.033287 | 0.08238 |-| 11 | 备选:β_rec=−0.15(再闭合场锐化) | 56.775 | 59.53/58.52/59.04 | 0.2500 | 0.3703 | 0.04880 | 0.035395 | 0.07947 |-| 12 | 备选:k=0.6(速度软阈值加严) | 56.804 | 60.04/58.57/58.61 | 0.2639 | 0.3838 | 0.04853 | 0.035456 | 0.08091 |-- 关键配置的单项 points(组分=各指标 points 和;父基线/W=0.2/W=0.3):- de_score 7.328/7.328/7.328,de_dir 7.745/7.672/7.647,mmd_u 6.834/6.901/6.935,- variogram 7.813/7.757/7.723,nb_mmd 14.650/14.745/14.785 → 净差 +0.03/+0.05。--4. **PLAN 判定**:主判 nb_mmd(A 半等价目标 <0.08025,即节点 33 水平)在 W≥0.2 达成- (0.07967…0.07845);守卫 mmd_u≤0.04860 达成(0.0475/0.0470);**守卫 de_direction≥0.3839- 全部 W>0 档失败**(0.3783/0.3686/0.3633,单调)。按 PLAN 规则 (4)"若 3 档均不达标则提交 W=0"执行。-5. **备选机制**(§2 要求,针对同一弱项 local_spatial/nb_mmd):- - 幅度保持解码(NORM=1,混合后逐细胞 L2 归一回原模长):nb_mmd 收益基本消失- (0.08067 vs 同幅 plain 0.07967)→ **收益来自边界幅度收缩本身而非方向相干**;总分更低。- - α 补偿(W=0.3+α=1.2,把稀释的幅度加回来):de_dir/vario 回升(vario 0.033287 全树最佳)但- nb_mmd 反弹到 0.08238、mmd_u 0.05036 → 总分 56.650,最差。- - β_rec=−0.15 再闭合场锐化(节点 35 单调变差曲线的反向外推):nb_mmd 0.07947 有效,但- de_direction 0.3703 + de_score −1 步 → 56.775。(β=−0.3 已生成未查分:PBC 钳制 1.24% 细胞,伪影风险。)- - k=0.6(ANALYSIS 建议 #3):de_dir 守住 0.3838 但 de_score −1 步 → 56.804。--## 结论(给后续节点)--在 (α1, k0.5, γ1.35, ε0.1, β_rec0.15) 基座上,**所有表达变换轴都落在同一条帕累托前沿上**:-{de_direction, de_score, variogram} ↔ {nb_mmd, mmd_u} 以约 1:1 的 points 汇率交换-(W=0.3:nb_mmd +0.135、mmd_u +0.101 ↔ de_dir −0.098、vario −0.090,净 +0.048 ≈ 噪声的 1/20)。-α、W、β_rec(两个符号)、k 全部只沿这条前沿移动;总分表面在 ±0.1 内平坦。-要拿 >噪声 的收益需要与"位移幅度/平滑度"正交的新轴;组成与坐标两轴在本家族内已冻结且-早前证否(节点 16/22)。唯一未试的解耦思路:只对边界细胞收缩位移、同时按 (型,基因) 把-型内平均倍数变化精确补回(dp 守恒重分配)——但查分 #10 表明"补回幅度"这一步本身就会-吃掉 nb_mmd 收益,预期不乐观。--## 验证过 / 没验证过--- 验证过:机制生效证据(上);W=0 提交态输出与父节点 35 逐位相同(cmp);seed 0 逐位可复现;- seed 0/1 内容一致(锚 24826 ≤ max_cells 25179,take 全取,仅 uns/generator_seed 元数据随 seed);- `--ablate mechanism` 与完整运行逐位一致(W=0 下机制本就关闭);vec-check ok;CPU ~3.5s、<1.5GB。-- 没验证过:各配置的 B 半分数(只查了 A 半);β_rec=−0.3 与 NORM=0.5 中间档(未查分);- 真实榜(E9.5→E10.5)上的行为——代码路径视图无关(无绝对时间、无视图标识、参数全为运行时- 数据自算),但配置只在本代理 A 半上验证过。-- 生物学知识来源:无新增(未引入任何外部测量、保留阶段信息或文献先验;所有量由视图输入在运行时计算)。+NO_CHANGE: 线性空间锚点混合(λ×2 域×再闭合 6 档全劣于父或门失败;备选库尺寸归一、型内收缩亦证否)++## 结论++PLAN(T2HX-09 线性空间锚点混合)按其字面实现并在代理上查分证否:所有真实混合幅度都单调劣于父节点。+按 improve 规则改交两个针对同一弱项(cell_state / mmd_u,八项最低 skill 0.551)的备选机制,也全部证否。+提交的程序默认关闭本节点全部新机制(`VEC_BLEND_LAMBDA=1.0`、`VEC_TOTNORM_W=0`、`VEC_TYPE_SHRINK=0`),+输出与父节点 35/37 逐位相同(本地 cmp 验证:X、坐标、基因序、细胞数全同;`--ablate blend` 同样逐位相同,+mechanism_active 将为 no)。基座保持不变:α=1, k=0.5, γ=1.35, ε=0.1, β_rec=0.15, PBC=10, 门控, 坐标/组成/行序冻结。++## 方法(实现了什么)++1. **PLAN 机制(blend)**:父管线产出 x_extrapolated(log1p)后,在线性 CP10k 域与锚阶段原始表达逐元素混合+ `x_final = (1−λ)·expm1(x_anchor) + λ·expm1(x_extrap)`,再 log1p 输出;零值保持零(两侧同支撑)。+ DE 门控(PLAN 原文):混合后 dp=pb(x_final)−pb(x_anchor) 须满足 spearman(dp,dt_approx)≥0.3 且+ std(dp)≥0.01·std(dt_approx),否则回退 λ=1(=父输出)。`VEC_BLEND_DOMAIN=log` 是 log1p 域变体;+ `VEC_BLEND_RECLOSE=w` 是混合后逐细胞总量回拉锚总量的变体。+2. **备选 (c) TOTNORM**:管线后逐细胞线性总量归一 `scale=(tot_ref/tot_i)^w`(细胞组成不变、零保持零)。+ mode=cell(tot_ref=该细胞自身锚总量,恢复 CP10k 不变量)/ median(tot_ref=预测自身中位数,保电平去离散)/+ global(一致压暗到锚中位数)。门控改为相对基线:spearman 不得低于混合前矩阵 −0.02(父输出自身的最终+ spearman≈0.261 就低于 0.3 的绝对门,绝对门对机制比对基座更严,不公平)。+3. **备选 (d) TYPE_SHRINK**:型内径向收缩 `x ← μ_t + (1−w)(x−μ_t)`(μ_t=最终矩阵的型×基因均值)。+ 型质心是不动点 → dp 逐位保持(实测 max|Δdp|=3e-13),只动型内离散度——与位移幅度正交的"宽度"轴。+ SUP=1 变体只收缩正值、保零模式(防零膨胀)。++## 查分记录(A 半,父节点 = 56.869;共 10 次,配额 20 剩 10)++| # | 配置 | 总分 | de_score | de_dir | mmd_u | variogram | nb_mmd |+|---|---|---:|---:|---:|---:|---:|---:|+| — | 父 35/37 | **56.869** | 0.2778 | 0.3839 | 0.04853 | 0.03541 | 0.08093 |+| 1 | blend lin λ=0.8 | 54.377 | 0.3194 | 0.3230 | 0.05131 | 0.05179 | 0.09612 |+| 2 | blend lin λ=0.9 | 55.209 | 0.3194 | 0.3529 | 0.04975 | 0.04851 | 0.09019 |+| 3 | blend lin λ=0.95 | 56.869* | *门失败回退=父* | | | | |+| 4 | blend lin λ=0.7 | 53.792 | 0.3056 | 0.3134 | 0.05267 | 0.05383 | 0.10044 |+| 5 | λ=0(诊断) | 56.869* | *门失败回退=父(dp=0 触发无变化保护)* | | | | |+| 6 | blend log λ=0.8(强制过门) | 56.335 | 0.2778 | 0.3839 | 0.04844 | 0.04133 | 0.08189 |+| 7 | TOTNORM cell w=1(强制过门) | 54.982 | 0.1806 | 0.3035 | 0.05885 | 0.03577 | 0.08741 |+| 8 | TOTNORM median w=1(相对门通过) | 56.552 | 0.2361 | 0.3522 | 0.04676 | 0.03823 | 0.07918 |+| 9 | TYPE_SHRINK 抬零 w=0.15 | 54.994 | 0.2778 | 0.3838 | 0.05258 | 0.05823 | 0.08206 |+| 10 | TYPE_SHRINK 保支撑 w=0.15(强制过门) | 56.007 | 0.2083 | 0.3885 | 0.05430 | 0.03524 | 0.08428 |++未查分的离线门失败档(spearman(dp,dt_approx),基座最终值 0.261):blend lin λ=0.8 + RECLOSE=1 → 0.231;+TOTNORM cell w=0.5 → 0.232;TOTNORM global w=1 → 0.197。++## 机制生效证据(PLAN mechanism_evidence 五项)++- 改变了哪些细胞:blend 全体细胞(changed_frac_pos=1.0),零模式逐位保持(zero_preserved=True);+ λ=0.8 时 |x_final−x_extrap| q50/q90 = 0.148/2.760(log1p 单位)。+- 型内表达 std(log1p,按型平均):父 0.7056 → blend λ=0.8 **0.8003(不降反升**:混合把逐细胞膨胀比 r_i+ 的离散(std(log r)≈3.9)注入每个基因,PLAN 预期的"型内方差压缩"在线性域混合下不成立);+ TYPE_SHRINK w=0.15 → 0.6170(按构造收缩)。+- mmd_u:λ=0.8 → 0.05131(劣于父 0.04853),未出现预期改善;唯一 mmd_u 改善的档是 TOTNORM median+ (0.04676)和 blend log(0.04844),但都被 DE/variogram/nb_mmd 的更大损失抵消。+- de_direction:λ=0.8 → 0.3230 < 0.3839,PLAN 风险 1 命中(首查即低于守卫值);λ 越小越差,单调。+- 四组分(λ=0.8 vs 父):expression 59.94/60.29、cell_state 53.21/58.59、local 54.36/58.60、shape 50/50——+ 除 DE 的 de_score 一步量化抬升外全组下降。+- 中位每细胞总量:锚 10000(CP10k),父输出 1.825×,blend λ=0.8 → 1.660×,TOTNORM cell → 1.000×。++## 为什么证否(读分)++1. **线性域混合注入非物理的逐细胞库尺寸离散**:外推细胞的膨胀比 r_i 差异极大,(1−λ) 权重的回拉使每个细胞+ 落在锚总量与 r_i·锚总量之间的不同位置 → nb_mmd/variogram 单调恶化,且 mmd_u 并未因"拉近锚"而改善。+2. **1.8× 电平与逐细胞膨胀是信号不是伪影(在本尺子上)**:TOTNORM cell 恢复 CP10k 不变量后 de_score 崩+ (0.278→0.181)且 mmd_u 反而恶化(0.0589)——真值 E9.5 云在 truth-PCA 里位于比锚更亮、且逐细胞亮度+ 异质的方向上;父节点的"过量"表达量部分编码了真实位移幅度。median 变体(保电平、去离散)同时改善+ mmd_u 与 nb_mmd,但 DE 两项+variogram 损失更大,净 −0.32。+3. **型内宽度不是 mmd_u 的短板**:dp 逐位保持的型内收缩(抬零版)de 两项纹丝不动而 mmd_u/variogram 显著+ 恶化(抬零 87.5% 直接击穿 variogram 0.035→0.058);保支撑版避免抬零但稀疏基因 dp 被压低,de_score 崩。+ 两个解码都说明真值型内离散不比父输出窄,收缩宽度必输。+4. 汇总:blend(2 域×4 幅度×再闭合变体)、TOTNORM(3 模式)、TYPE_SHRINK(2 解码)共 11 个配置、10 次+ 查分,无一超过父节点;满足"≥3 种解码/幅度、≥6 次查分"的证否标准。父节点 ANALYSIS 的帕累托前沿结论+ 在三个新变换族上再次成立:**mmd_u 只对"付出更多 de_direction/variogram"的变换作正向响应**。++## 验证过 / 未验证++- 验证:默认输出与父逐位相同(X/坐标/基因序/n=24826);`--ablate blend` 逐位相同;seed 0/1 输出相同;+ 伪装视图(时间 +1 天、manifest 键序打乱、路径更换)下机制关与机制开两种运行输出均逐位相同(view 无关);+ vec-check 通过;运行 ~3s / <2GB。+- 未验证:TOTNORM global、blend+RECLOSE 等离线门失败档未查分(方向已被同族查分档覆盖);B 半与官网外推+ 榜(本地尺子已知高估,全部结论只在 A 半代理上成立)。++## 知识与来源++未使用任何外部生物学知识或保留阶段信息;全部机制仅由视图内输入数据现场计算的量驱动+(锚/前阶段伪批量、型均值、每细胞总量、坐标 kNN 图),无任何阶段特异常数。评分规则事实引自任务书+"T2 评分规则简报"(veckit 公开代码)与父节点 35/37 的 METHOD/ANALYSIS。++## 给后续节点++- 不要再试:锚混合(任何域/幅度)、逐细胞或全局库尺寸归一(任何模式)、型内宽度收缩/扩张——已 11 配置证否。+- 若要攻 cell_state:mmd_u 的可行改善历史上只伴随 γ/β_rec 等再闭合轴(node 31 γ=0.45 时 mmd_u=0.0454 但+ DE 差),说明其瓶颈是质心位置(外推方向)而非宽度/电平;需要更好的**速度方向**估计(如引入视图内+ external Qiu E8.75 心脏样本做型内参考),而不是对现有输出做后变换。+- 本基座(含 blend/totnorm/type_shrink 钩子,全部默认关)可复用:钩子都有独立门控与 DEBUG 证据输出。diff --git a/solution/run.py b/solution/run.pyindex 74ff27e..94b0680 100644--- a/solution/run.py+++ b/solution/run.py@@ -24,10 +24,59 @@ Mechanism (on by default, alpha = 1.0): Coordinates, row order and cell count are never modified. ---ablate <name> (any name) turns THIS node's mechanism off and keeps the-rest of the pipeline unchanged. Node 37 ships with its mechanism OFF-(VEC_VDIFF_W=0, falsified -- see the node 37 block below), so the ablated-run is bit-for-bit identical to the full run (both = parent node 35).+--ablate <name> (any name) turns THIS node's mechanisms off (blend lambda=1,+totnorm w=0, type_shrink w=0) and keeps the rest of the pipeline unchanged.+Node 39 ships with all its mechanisms OFF (falsified -- see the node 39 block+below), so the ablated run is bit-for-bit identical to the full run (both =+parent node 35).++Node 39 (T2HX-09, linear-space anchor blend): FALSIFIED, ships OFF+(VEC_BLEND_LAMBDA=1.0, VEC_TOTNORM_W=0, VEC_TYPE_SHRINK=0), so the output is+bit-for-bit parent node 35 (NO_CHANGE). The PLAN mechanism was implemented+exactly: after the full pipeline produces x_extrapolated, mix it with the+anchor stage's ORIGINAL expression in the linear (CP10k) domain,+x_final = (1-L)*x_anchor + L*x_extrap, then log1p; DE gate on the blended dp+(spearman >= 0.3, std >= 0.01) with fallback L=1. Evidence it ran: zeros+preserved, changed_frac_pos = 1.0, |dx| q50 = 0.148 at L=0.8, per-cell total+ratio pulled 1.825 -> 1.660. A-half scores (parent 56.869):+ L (lin) 0.7 0.8 0.9 0.95+ total 53.79 54.38 55.21 56.87 (gate fallback = parent)+ Monotone toward the parent: every real blend amplitude is worse. The linear+ mix injects per-cell library-size heterogeneity (cells differ in inflation+ ratio r_i, std(log r) ~ 3.9) that neither a measured stage nor the parent+ has: nb_mmd 0.0809 -> 0.0961/0.1004 and variogram 0.0354 -> 0.0518/0.0538+ at L=0.8/0.7, while mmd_u does NOT improve (0.0485 -> 0.0513/0.0527).+ de_direction also falls (0.3839 -> 0.3230/0.3134).+Alternate decodes of the same mechanism, all falsified:+ (a) log1p-domain blend (x_final = (1-L)*x_anchor_log + L*x_extrap_log,+ L=0.8, gate forced): 56.335 -- de_direction held (0.3839) but variogram+ 0.0413 and nb_mmd 0.0819; a log-domain blend is an amplitude+ compression, i.e. the known Pareto axis.+ (b) linear blend + exact per-cell total re-closure to the anchor total+ (L=0.8): kills dp direction offline (spearman 0.231 < 0.3 gate).+Alternate mechanisms targeting the same weakness (cell_state / mmd_u 0.551,+the lowest skill), also falsified:+ (c) per-cell library-size normalisation TOTNORM (uniform linear scale per+ cell after the pipeline). mode=cell w=1 (restore the cell's own anchor+ total, gate forced): 54.98 -- mmd_u WORSENED (0.0485 -> 0.0589) and+ de_score collapsed (0.278 -> 0.181): the 1.8x stage brightness carries+ real de/mmd signal on this ruler. mode=median w=1 (scale to the+ prediction's own median: level kept, per-cell spread removed, relative+ gate passed): 56.55 -- mmd_u 0.0468 and nb_mmd 0.0792 both improved but+ de_direction 0.352/de_score 0.236/variogram 0.038 cost more.+ mode=global w=1 (uniform dimming): spearman 0.197, gate-failed offline.+ (d) within-type radial contraction TYPE_SHRINK (x <- mu_t + (1-w)(x-mu_t),+ type centroids fixed -> dp preserved to 3e-13). Zero-lifting variant+ w=0.15: 54.99 (variogram 0.058 destroyed by lifting 87.5% of the zeros,+ mmd_u worse). Support-preserving variant w=0.15: 56.01 (sparse genes+ lose dp -> de_score 0.208, mmd_u worse 0.0543). The truth's within-type+ width is NOT narrower than the parent's; contracting it always loses.+Conclusion (consistent with nodes 33/35/37): on this base every post-hoc+expression transform -- amplitude, level, per-cell spread, within-type width,+anchor mixing -- moves along one Pareto front whose weighted sum is maximised+at the parent; mmd_u responds positively only to transforms that cost more+de_direction/variogram than it gains. 10 vec-score queries; per-config metric+tables in METHOD.md. Node 37 (VDIFF, spatial mixing of the log2 displacement field): FALSIFIED, ships at VDIFF_W=0 (output bit-for-bit parent node 35). The PLAN's@@ -330,6 +379,10 @@ falsified), VEC_REC_STEPS (1), VEC_REC_K (15), VEC_REC_LEVEL (matched), VEC_REC_BRIGHT (1.0 = off, diagnostic only), VEC_VDIFF_W (0.0 = off, node 37 falsified), VEC_VDIFF_K (15), VEC_VDIFF_NORM (0.0 = off, falsified amplitude-preserving decode),+VEC_BLEND_LAMBDA (1.0 = off, node 39 falsified), VEC_BLEND_RECLOSE (0.0),+VEC_BLEND_DOMAIN (lin), VEC_TOTNORM_W (0.0 = off, node 39 falsified),+VEC_TOTNORM_MODE (cell), VEC_TYPE_SHRINK (0.0 = off, node 39 falsified),+VEC_TYPE_SHRINK_SUP (1), VEC_POST_EPS (0.0 = off, falsified), VEC_POST_STEPS (2), VEC_POST_K (15), VEC_PBC (10.0), VEC_MIXMODE (rel), VEC_MIXREL (1.0), VEC_MIXEPS (1.0), VEC_DOMAIN (log), VEC_SOFTD (0), VEC_CAPD (0), VEC_CVEL (-1 = legacy@@ -392,6 +445,13 @@ POST_K = int(os.environ.get("VEC_POST_K", "15")) # coordinate neighbours of the VDIFF_W = float(os.environ.get("VEC_VDIFF_W", "0.0")) # spatial velocity diffusion weight (0 = off) VDIFF_K = int(os.environ.get("VEC_VDIFF_K", "15")) # coordinate neighbours for the velocity diffusion VDIFF_NORM = float(os.environ.get("VEC_VDIFF_NORM", "0.0")) # >0: per-cell renormalise the blended velocity to (1-VDIFF_NORM)*raw_norm + VDIFF_NORM*blended_norm (1 = exact raw-norm preservation, direction-only blending)+BLEND_LAMBDA = float(os.environ.get("VEC_BLEND_LAMBDA", "1.0")) # node 39 (T2HX-09): linear-space anchor blend weight; x_final = (1-L)*x_anchor + L*x_extrap in CP10k domain, applied after the whole pipeline (1.0 = off, output bit-for-bit parent node 35)+BLEND_RECLOSE = float(os.environ.get("VEC_BLEND_RECLOSE", "0.0")) # >0: after the linear blend, rescale each cell's linear totals toward its own anchor total with power w (1 = exact per-cell total restoration); removes the library-size heterogeneity injected by blending cells with different inflation ratios r_i+BLEND_DOMAIN = os.environ.get("VEC_BLEND_DOMAIN", "lin") # "lin" (PLAN): blend in CP10k domain; "log": blend in log1p domain (linear compression of the log displacement, library size untouched by construction)+TOTNORM_W = float(os.environ.get("VEC_TOTNORM_W", "0.0")) # node 39 alternate mechanism: per-cell library-size normalisation AFTER the pipeline; each cell's linear profile is scaled by (tot_anchor_i/tot_i)**w (CP10k invariant that every measured stage satisfies; 0 = off). Uniform per cell => composition untouched, dp direction preserved up to second-order effects.+TOTNORM_MODE = os.environ.get("VEC_TOTNORM_MODE", "cell") # "cell": restore each cell's OWN anchor total; "global": uniform dimming to the anchor median total; "median": scale to the predicted stage's own median total (level-preserving per-cell spread removal)+TYPE_SHRINK = float(os.environ.get("VEC_TYPE_SHRINK", "0.0")) # node 39 alternate mechanism 2: within-type radial contraction in log1p space, x <- mu_t + (1-w)*(x - mu_t), mu_t = per-(type,gene) mean of the FINAL matrix; type centroids (hence dp, de_direction) preserved by construction, only within-type dispersion shrinks -- the width axis mmd_u measures (0 = off)+TYPE_SHRINK_SUP = os.environ.get("VEC_TYPE_SHRINK_SUP", "1") not in ("0", "", "false", "False") # support-preserving variant: contract positive entries only, anchor zeros stay exactly zero (the plain map lifts ~87% of zeros to w*mu, a zero-inflation the metrics are documented to punish); per-(type,gene) means then shrink by (1-w*(1-p_pos)) REGRESS_MODE = os.environ.get("VEC_REGRESS_MODE", "type") # "type" (per-type OLS) or "global" (pooled slope) REGRESS_W = float(os.environ.get("VEC_REGRESS_W", "1.0")) # blend weight of the residual velocity (1 = pure residual) REGRESS_MINGENES = int(os.environ.get("VEC_REGRESS_MINGENES", "50")) # types with fewer positive-pb genes skip regression@@ -630,6 +690,12 @@ def main() -> None: beta_rec = BETA_REC if args.ablate is not None and BETA_REC < 0.0: beta_rec = 0.0+ # Node 39 off-control: --ablate blend sets lambda = 1.0, which makes the+ # linear-space anchor blend a bit-for-bit no-op (x_final = x_extrapolated,+ # output identical to parent node 35); the rest of the pipeline is untouched.+ blend_lambda = BLEND_LAMBDA if args.ablate is None else 1.0+ totnorm_w = TOTNORM_W if args.ablate is None else 0.0+ type_shrink = TYPE_SHRINK if args.ablate is None else 0.0 post_on = True manifest = load_manifest(args.data)@@ -959,6 +1025,237 @@ def main() -> None: f"zero_preserved={pinfo.get('zero_pattern_preserved')} " f"dp_std_ratio={np.std(dp_post) / (np.std(dt_approx) + 1e-12):.4f} " f"spearman_dp={sp_post:.4f} (pre-pass {sp:.4f})", flush=True)+ if 0.0 <= blend_lambda < 1.0:+ # Node 39 (T2HX-09): linear-space anchor blend. After the+ # whole pipeline has produced x_extrapolated (log1p), mix it+ # with the anchor stage's ORIGINAL expression in the linear+ # (CP10k) domain:+ # x_final = (1-L)*expm1(x_anchor) + L*expm1(x_extrap),+ # output = log1p(x_final).+ # Properties: zeros stay exactly zero (both operands share+ # the anchor support, sparsity pattern bit-preserved);+ # large linear displacements are compressed more in the+ # final log1p representation than small ones (non-linear in+ # v); within-type dispersion shrinks toward the anchor's.+ # Unlike log-domain alpha scaling, this changes the SHAPE+ # of the within-type distribution, not the displacement+ # direction. DE gate (PLAN): recompute dp on the blended+ # matrix; require std(dp) >= 0.01*std(dt_approx) and+ # spearman(dp, dt_approx) >= GATE_SPEARMAN, else fall back+ # to lambda = 1 (bit-for-bit parent).+ if BLEND_DOMAIN == "log":+ # Variant (b): blend in the log1p domain instead -- a+ # linear compression of the total log displacement+ # toward the anchor; per-cell library sizes are mixed+ # in log space (no new linear-domain heterogeneity).+ Xp_blend = (1.0 - blend_lambda) * Xa + blend_lambda * Xp+ lin_f = np.expm1(Xp_blend)+ else:+ lin_a = np.expm1(Xa)+ lin_e = np.expm1(Xp)+ lin_f = (1.0 - blend_lambda) * lin_a + blend_lambda * lin_e+ if BLEND_RECLOSE > 0.0:+ # Variant (a): per-cell total re-closure of the+ # blend. Blending mixes cells whose inflation ratio+ # r_i = tot_e/tot_a varies widely (std(log r) ~ 3.6),+ # so the blended stage carries a per-cell+ # library-size spread that neither the anchor nor a+ # measured stage has. Rescale each blended cell's+ # linear totals toward its OWN anchor total with+ # power w (w=1: exact restoration of the anchor+ # per-cell library size; the CP10k invariant of+ # measured stages is restored by construction).+ tot_f = lin_f.sum(axis=1, keepdims=True)+ tot_a_c = lin_a.sum(axis=1, keepdims=True)+ sc_b = np.power(np.divide(tot_a_c, np.maximum(tot_f, 1e-12),+ out=np.ones_like(tot_f),+ where=tot_f > 1e-12), BLEND_RECLOSE)+ lin_f = lin_f * sc_b+ Xp_blend = np.log1p(np.maximum(lin_f, 0.0))+ dp_b = Xp_blend.mean(axis=0) - pba+ std_ratio_b = float(np.std(dp_b) / (np.std(dt_approx) + 1e-12))+ sp_b = float(np.corrcoef(_rank(dp_b), _rank(dt_approx))[0, 1])+ if DEBUG:+ # Mechanism evidence (PLAN mechanism_evidence):+ # (1) per-cell |x_final - x_extrap| over positive genes;+ # (2) within-type expression std (expect compression);+ # zero-pattern preservation; library-size pull-back.+ d_abs = np.abs(Xp_blend - Xp)+ pos = Xa > 0+ lab_b = np.asarray(stage.labels[rows]).astype(str)+ def _wt_std(M: np.ndarray) -> float:+ return float(np.mean([M[lab_b == t].std(axis=0).mean()+ for t in set(lab_b.tolist())+ if (lab_b == t).sum() > 1]))+ tot_a = float(np.median(np.expm1(Xa).sum(axis=1)))+ tot_e = float(np.median(np.expm1(Xp).sum(axis=1)))+ tot_f = float(np.median(lin_f.sum(axis=1)))+ print(f"blend: lambda={blend_lambda} domain={BLEND_DOMAIN} "+ f"reclose={BLEND_RECLOSE} "+ f"changed_frac_pos={float((d_abs[pos] > 0).mean()):.4f} "+ f"|dx| q50/q90/max={np.quantile(d_abs[pos], 0.5):.4f}/"+ f"{np.quantile(d_abs[pos], 0.9):.4f}/{d_abs[pos].max():.4f} "+ f"wt_std={_wt_std(Xp):.4f}->{_wt_std(Xp_blend):.4f} "+ f"zero_preserved={bool(((Xp_blend == 0) == ~pos).all())} "+ f"median_total(x anchor)={tot_a:.1f} "+ f"extrap/anchor={tot_e / max(tot_a, 1e-12):.3f} "+ f"final/anchor={tot_f / max(tot_a, 1e-12):.3f} "+ f"gate: std_ratio={std_ratio_b:.4f} spearman={sp_b:.4f}",+ flush=True)+ if std_ratio_b >= 0.01 and sp_b >= GATE_SPEARMAN:+ Xp = Xp_blend+ elif DEBUG:+ print("blend gate FAILED: fallback lambda=1 (parent output)",+ flush=True)+ if totnorm_w > 0.0:+ # Node 39 ALTERNATE mechanism (after the PLAN's linear-space+ # anchor blend was falsified): per-cell library-size+ # normalisation. The pipeline output violates the CP10k+ # total invariant that every measured stage satisfies+ # exactly: median per-cell linear total is ~1.8x the anchor+ # with a per-cell log-ratio spread of ~3.9 (nodes 24/31/33+ # only pulled the SPREAD part-way back and pinned the LEVEL+ # at the inflated median by construction). No real stage+ # has this brightness axis; the truth-fitted PCA of mmd_u /+ # variogram / neighborhood_mmd is expected to pick it up as+ # a systematic offset of the whole predicted cloud.+ # Scale each cell's linear profile by (tot_ref/tot_i)**w --+ # uniform per cell, so the composition of every cell is+ # untouched and zeros stay zero:+ # mode "cell": tot_ref = the cell's OWN anchor total+ # (exact restoration of the measured+ # per-cell library-size distribution);+ # mode "global": tot_ref = anchor median total for every+ # cell (uniform dimming; isolates the+ # level component from the spread removal).+ # Both references are computed from the input data at+ # runtime (no stage-specific constant). The gamma+ # re-closure axis never tested this: it holds the median+ # level at the unshifted median by construction.+ lin_n = np.expm1(Xp)+ tot_n = lin_n.sum(axis=1, keepdims=True)+ tot_a_n = np.expm1(Xa).sum(axis=1, keepdims=True)+ if TOTNORM_MODE == "global":+ lvl_ref = float(np.median(tot_a_n)) / max(float(np.median(tot_n)), 1e-12)+ sc_n = np.full_like(tot_n, lvl_ref ** totnorm_w)+ elif TOTNORM_MODE == "median":+ # Level-preserving spread removal: scale each cell to+ # the PREDICTED stage's own median total. Keeps the+ # stage-level brightness (which the falsified "cell"+ # mode showed carries real de/mmd signal) and removes+ # only the per-cell library-size heterogeneity that the+ # re-closure field injects (log-ratio std ~0.93 vs 0 for+ # every measured CP10k stage). Reference computed from+ # the prediction itself at runtime.+ med_n = float(np.median(tot_n))+ sc_n = np.power(np.divide(np.full_like(tot_n, med_n),+ np.maximum(tot_n, 1e-12),+ out=np.ones_like(tot_n),+ where=tot_n > 1e-12), totnorm_w)+ else:+ sc_n = np.power(np.divide(tot_a_n, np.maximum(tot_n, 1e-12),+ out=np.ones_like(tot_n),+ where=tot_n > 1e-12), totnorm_w)+ Xp_norm = np.log1p(lin_n * sc_n)+ dp_n = Xp_norm.mean(axis=0) - pba+ dp_base = Xp.mean(axis=0) - pba+ std_ratio_n = float(np.std(dp_n) / (np.std(dt_approx) + 1e-12))+ sp_n = float(np.corrcoef(_rank(dp_n), _rank(dt_approx))[0, 1])+ sp_base = float(np.corrcoef(_rank(dp_base), _rank(dt_approx))[0, 1])+ if DEBUG:+ d_abs = np.abs(Xp_norm - Xp)+ pos = Xa > 0+ lab_n = np.asarray(stage.labels[rows]).astype(str)+ wt_pre = float(np.mean([Xp[lab_n == t].std(axis=0).mean()+ for t in set(lab_n.tolist()) if (lab_n == t).sum() > 1]))+ wt_post = float(np.mean([Xp_norm[lab_n == t].std(axis=0).mean()+ for t in set(lab_n.tolist()) if (lab_n == t).sum() > 1]))+ print(f"totnorm: w={totnorm_w} mode={TOTNORM_MODE} "+ f"median_total pred/anchor={float(np.median(tot_n)) / float(np.median(tot_a_n)):.3f}"+ f"->{float(np.median((lin_n * sc_n).sum(axis=1))) / float(np.median(tot_a_n)):.3f} "+ f"logratio_std={float(np.std(np.log(np.maximum(tot_n, 1e-12) / np.maximum(tot_a_n, 1e-12)))):.3f}"+ f"->{float(np.std(np.log(np.maximum((lin_n * sc_n).sum(axis=1, keepdims=True), 1e-12) / np.maximum(tot_a_n, 1e-12)))):.3f} "+ f"|dx| q50/q90={np.quantile(d_abs[pos], 0.5):.4f}/{np.quantile(d_abs[pos], 0.9):.4f} "+ f"wt_std={wt_pre:.4f}->{wt_post:.4f} "+ f"gate: std_ratio={std_ratio_n:.4f} spearman={sp_n:.4f} "+ f"(base {sp_base:.4f})",+ flush=True)+ if std_ratio_n >= 0.01 and sp_n >= sp_base - 0.02:+ # Gate: relative, not absolute. The parent's own final+ # output sits at spearman ~0.26 (below the pipeline's+ # pre-renormalisation gate of 0.3, which is computed on+ # the PRE-reclosure shift by design), so an absolute 0.3+ # threshold here would be stricter on the mechanism than+ # on the base it refines. Accept if dp direction does+ # not degrade vs the pre-totnorm matrix (margin 0.02,+ # within rank jitter) and the DE protection holds.+ Xp = Xp_norm+ else:+ if DEBUG:+ print(f"totnorm gate FAILED (sp_n={sp_n:.4f} vs "+ f"base {sp_base:.4f}): fallback (parent output)",+ flush=True)+ if type_shrink > 0.0:+ # Node 39 ALTERNATE mechanism 2 (after blend and totnorm+ # were falsified): within-type radial contraction in log1p+ # space. Every cell is pulled a fraction w toward its OWN+ # type's per-gene mean of the final matrix:+ # x_ig <- mu_tg + (1-w)*(x_ig - mu_tg).+ # Type centroids are fixed points of the map, so the+ # per-type -- and with frozen composition the global --+ # pseudobulk is preserved BY CONSTRUCTION: dp, de_score and+ # de_direction cannot move (verified in DEBUG). The map+ # only shrinks the WITHIN-type dispersion, the width axis+ # of the cell-state distribution that mmd_u measures;+ # unlike the blend/totnorm family it never touches the+ # displacement amplitude or the library-size level, so it+ # is orthogonal to the Pareto front the ANALYSIS+ # identified. No clipping needed: x >= 0 and mu >= 0 imply+ # the contracted value stays >= min(x, mu) >= 0. Zeros of+ # genes with mu_tg > 0 lift to w*mu_tg (part of the+ # contraction, monitored in DEBUG).+ lab_s = np.asarray(stage.labels[rows]).astype(str)+ Xp_sh = Xp.copy()+ sup_mask = Xa > 0 if TYPE_SHRINK_SUP else None+ for t in set(lab_s.tolist()):+ m_t = lab_s == t+ if int(m_t.sum()) < 2:+ continue+ mu_t = Xp[m_t].mean(axis=0)+ blk = mu_t + (1.0 - type_shrink) * (Xp[m_t] - mu_t)+ if sup_mask is not None:+ # Support-preserving variant: contract positive+ # entries only, zeros stay exactly zero (the+ # centroid-preserving map lifts 87.5% of the anchor+ # zeros to w*mu, a zero-inflation the metrics are+ # documented to punish). Per-(type,gene) means then+ # shrink by (1 - w*(1-p_pos)): sparse genes lose dp+ # amplitude, watched by the gate.+ blk = np.where(sup_mask[m_t], blk, 0.0)+ Xp_sh[m_t] = blk+ dp_s = Xp_sh.mean(axis=0) - pba+ dp_p = Xp.mean(axis=0) - pba+ std_ratio_s = float(np.std(dp_s) / (np.std(dt_approx) + 1e-12))+ sp_s = float(np.corrcoef(_rank(dp_s), _rank(dt_approx))[0, 1])+ if DEBUG:+ pos_s = Xa > 0+ d_abs = np.abs(Xp_sh - Xp)+ wt_pre = float(np.mean([Xp[lab_s == t].std(axis=0).mean()+ for t in set(lab_s.tolist()) if (lab_s == t).sum() > 1]))+ wt_post = float(np.mean([Xp_sh[lab_s == t].std(axis=0).mean()+ for t in set(lab_s.tolist()) if (lab_s == t).sum() > 1]))+ print(f"type_shrink: w={type_shrink} "+ f"changed_frac_pos={float((d_abs[pos_s] > 1e-6).mean()):.4f} "+ f"|dx| q50/q90={np.quantile(d_abs[pos_s], 0.5):.4f}/{np.quantile(d_abs[pos_s], 0.9):.4f} "+ f"wt_std={wt_pre:.4f}->{wt_post:.4f} "+ f"zeros_lifted_frac={float(((Xp_sh > 0) & ~pos_s).mean()):.5f} "+ f"dp_max_abs_diff={float(np.abs(dp_s - dp_p).max()):.3e} "+ f"gate: std_ratio={std_ratio_s:.4f} spearman={sp_s:.4f}",+ flush=True)+ if std_ratio_s >= 0.01 and sp_s >= GATE_SPEARMAN - 0.05:+ Xp = Xp_sh+ elif DEBUG:+ print("type_shrink gate FAILED: fallback (parent output)", flush=True) X = Xp.astype(np.float32) write_t2(args.out, X, coords, genes, seed=args.seed)
调研来源?调研员查到并用到的知识条目和文献检索结果(只列标题和编号)。
用到的知识库条目
| 编号 | 标题 | 出处 |
|---|---|---|
| k007 | Interval staging and held-out-window filtering of external data | notes/official/来件/virtualembryo.ai/rules.md |
| k026 | Canonicalise predicted 3D coordinates before submission | notes/pitfalls/04_scorer_invariance.md |
| k027 | Joint expression-geometry generation with relative geometry | notes/competition/03_solution_landscape.md |
分析结果?分析员写的 ANALYSIS.json:改了什么、各组分数怎么变、假设是否成立、经验和下一步建议。
| 改了什么 | 实现了 PLAN 的线性空间锚点混合(CP10k 域 x_final=(1−λ)x_anchor+λx_extrap,含 DE 门控与 log 域/再闭合变体)及两个备选后变换(TOTNORM 库尺寸归一 3 模式、TYPE_SHRINK 型内径向收缩 2 解码),A 半代理查分 11 配置全部劣于父后按 improve 规则关闭提交:VEC_BLEND_LAMBDA=1.0、VEC_TOTNORM_W=0、VEC_TYPE_SHRINK=0,提交输出与父节点 35/37 逐位相同(NO_CHANGE),榜分 57.11 不变。 |
|---|---|
| 各组分数的变化 | cell_state:噪声内(逐位相同):58.92 → 58.92,+0.00;mmd_u 0.04751、variogram 0.03471 与父一致,PLAN 预期的 mmd_u 改善未兑现 expression_change:噪声内(实为逐位相同):60.35 → 60.35,+0.00;de_score 0.2778 / de_direction 0.3874 与父完全一致 local_spatial:无变化:59.15 → 59.15;neighborhood_mmd 0.07784(skill 0.592)与父相同,结构门恒 1 shape_scale:无变化:50.00 → 50.00,坐标冻结,d2_shape 0.04911 / occupancy_dice 0.8066 / scale_log_ratio −0.4334 均与父相同 |
| family_id | T2HX-09 |
| 假设是否成立 | 否 |
| 经验 |
|
| mechanism_active | 否 |
| 下一步建议 |
|
对话摘要?每个角色和大模型对话的统计:轮数、工具调用、用时、token 数和最后的回答摘录;原始记录只给路径。
只给统计和最后回答的摘录;完整对话请到原始记录位置里列出的文件看。
分析员
| 角色?调研员写计划、工程师改代码、分析员解读分数、审查员检查作弊。 | 分析员 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数?大模型一共回复了几轮(每轮可以调用多个工具)。 | 2 |
| 工具调用?大模型调用读文件、执行命令等工具的次数,按工具名统计。 | 共 1 次:write 1 |
| 用时 | 不到 1 分 |
| token 数?输入 / 输出(含思考)的 token 数,来自接口返回的用量。 | 输入 20,558 · 输出 1,273 · 思考 623 |
| 任务(第一行) | 分析节点 n39 的打分结果,写 ANALYSIS.json |
| 最后的回答(摘录) | ANALYSIS.json written |
| 原始记录位置?完整对话记录在 Spark 上的文件路径;看板不复制原始内容。 | /home/spark-longxinyang/vec/runs/formal/20261003-172000-search-t2-heart-extrap-chain-12h/nodes/39/analyst.jsonl 6 KB /home/spark-longxinyang/vec/runs/formal/20261003-172000-search-t2-heart-extrap-chain-12h/nodes/39/analyst.stderr |
工程师
| 角色 | 工程师 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数 | 57 |
| 工具调用 | 共 58 次:bash 33、edit 21、read 3、write 1 |
| 用时 | 27 分 |
| token 数 | 输入 129,753 · 输出 22,190 · 思考 28,691 |
| 任务(第一行) | 按计划修改程序:T2HX-09 线性空间锚点混合:非对数域压缩外推幅度以改善型内分布 |
| 最后的回答(摘录) | **Done — NO_CHANGE submission** (mechanisms implemented, falsified, shipped off; output bit-for-bit = parent 35/37, `--ablate blend` identical, seed-deterministic, disguised-view identical, vec-check ok; 10/20 queries used). - **PLAN 机制(线性空间锚点混合)**:λ=0.7/0.8/0.9 → 53.79/54.38/55.21,单调劣于父 56.87(A 半);λ=0.95 门失败回退。线性混合把逐细胞膨胀比离散注入每个基因:nb_mmd 0.081→0.096、variogram 0.035→0.052,mmd_u 反而恶化,PLAN 预期的型内方差压缩实测不成立(0.706→0.800)。log 域与再闭合变体亦证否(56.34 / 门失败)。 - **备选机制(同弱项 cell_state/mmd_u)**:TOTNORM 库尺寸归一 3 模式(cell 54.98、median 56.55、global 门失败)——恢复 CP10k 不变量使 de_score 崩且 mmd_u 恶化,证明 1.8× 亮度是信号;TYPE_SHRINK 型内收缩 2 解码(抬零 54.99、保支撑 56.01)——dp 逐位保持时 mmd_u 仍恶化,型内宽度不是短板。共 11 配置证否,全部记录在 METHOD.md。 - **下一步最值得试**:mmd_u 瓶颈在质心位置(速度方向)而非宽度/电平——用视图内 external Qiu E8.75 心脏样本做型内参考改进速度方向估计,而不是继续对输出做后变换;后变换族(幅度、电平、离散、宽度、锚混合)已在节点 33/35/37/39 全部扫平。 |
| 原始记录位置 | /home/spark-longxinyang/vec/runs/formal/20261003-172000-search-t2-heart-extrap-chain-12h/nodes/39/engineer.jsonl 418 KB /home/spark-longxinyang/vec/runs/formal/20261003-172000-search-t2-heart-extrap-chain-12h/nodes/39/engineer.stderr |
调研员
| 角色 | 调研员 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数 | 1 |
| 工具调用 | 共 0 次:— |
| 用时 | 6 分 |
| token 数 | 输入 22,610 · 输出 8,092 · 思考 8,192 |
| 任务(第一行) | 为节点 n39(改进,父节点 n37)写改进计划 PLAN.json |
| 最后的回答(摘录) | s compressed non-uniformly).
λ initial value: 0.8 (i.e., 80% extrapolated, 20% anchor)
Search range: 0.6, 0.7, 0.8, 0.9, 1.0
Off control: λ=1.0 gives exactly the parent prediction.
Let me write the final JSON.
</think>
```json
{
"name": "T2HX-09 线性空间锚点混合:非对数域压缩外推幅度以改善型内分布",
"motivation": "父节点 37 总分 57.11,四组中 cell_state 58.92 最弱(mmd_u skill 0.551 为八项最低)。ANALYSIS 明确指出所有表达变换轴(α、W、β_rec、k、ε)落在同一条帕累托前沿上(DE+variogram ↔ nb_mmd+mmd_u,~1:1 交换),总分 ±0.1 平坦。需要与位移幅度正交的新轴。线性空间锚点混合改变的是型内分布的方差结构(压缩极端值、拉近零值),而非位移方向或平滑度,属于不同变换族。",
"approach": "在父节点 35 完整管线(α=1, k=0.5, γ=1.35, ε=0.1, β_rec=0.15, PBC=10, 门控)产出 x_extrapolated 后,做线性空间混合:x_final = (1−λ)·x_anchor + λ·x_extrapolated(逐元素,锚阶段原始表达为 x_anchor)。关键参数:λ 初值 0.80,搜索 {0.60, 0.70, 0.80, 0.90, 1.00} 共 5 档。λ=1.0 时逐位等于父节点。性质:(1) 零值保持零(0·任何=0);(2) 大 |v| 基因的有效位移被压缩更多(非线性于 v),小 |v| 基因几乎不变;(3) 型内方差被压缩(混合降低离散度),可能改善 mmd_u。DE 门控:混合后重算 dp=pb(x_final)−pb(x_anchor),验证 spearman(dp, dt_approx)≥0.3 且 std(dp)≥0.01·std(dt_approx),不过则回退 λ=1。单输入退路:只有一个阶段时无法算速度,直接 λ=1(copy_last)。vec-score 快筛:先跑 λ=0.8 单次查分看 mmd_u 和 de_direction 方向,再决定是否扩展网格。",
"expected_groups": ["cell_state"],
"risks": "1) 线性混合可能同时压缩 DE 信号(de_score/de_direction 下降),重蹈帕累托交换;Engineer 第一次查分即看 de_direction 是否 <0.3839,若是则停止。2) 型内方差压缩可能损害 variogram(共变结构变弱);监控 variogram raw 是否 >0.0355。3) λ<0.7 时可能触发无变化保护(std(dp)<1%·std(dt))导致 DE 记 0;Engineer 应在离线先验证。4) 外推榜本地尺子已知高估(54.2→49.6),本地小幅领先不可信;需 >1 分差才算进步。",
"family_id": "T2HX-09",
"mechanism": "在线性表达空间(非 log2 域)将外推预测与锚阶段原始表达按 λ 加权混合,压缩大位移基因的过冲、保留小位移基因信号,改变型内分布形状而非位移方向。",
"vs_constant_shift": "常数位移对每基因施加统一方向/幅度的偏移;本机制不引入新方向,只对已有外推做非线性幅度压缩(大 |v| 压多、小 |v| 压少),且在线性域操作改变方差结构,不等同于 log 域的 α 缩放。",
"mechanism_evidence": "Engineer 报告:(1) λ=0.8 时逐细胞 |x_final−x_extrap| 的分布(应 >0 对绝大多数非零基因);(2) 型内表达标准差变化(预期收缩);(3) mmd_u raw 变化(预期 <0.04751);(4) de_direction 是否守住 ≥0.3839;(5) 四组分各自变化。",
"mechanism_off_control": "λ=1.0 时 x_final = x_extrapolated 逐位,输出与父节点 35 完全相同;预期所有指标变化 +0.00。程序通过 VEC_BLEND_LAMBDA=1.0 或 --ablate blend 实现。",
"sources": []
}
``` |
| 原始记录位置 | /home/spark-longxinyang/vec/runs/formal/20261003-172000-search-t2-heart-extrap-chain-12h/nodes/39/researcher.jsonl 30 KB /home/spark-longxinyang/vec/runs/formal/20261003-172000-search-t2-heart-extrap-chain-12h/nodes/39/researcher.stderr |
审查员
| 角色 | 审查员 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数 | 12 |
| 工具调用 | 共 17 次:read 8、bash 6、grep 2、write 1 |
| 用时 | 4 分 |
| token 数 | 输入 58,190 · 输出 2,960 · 思考 4,801 |
| 任务(第一行) | 审查节点 n39 的程序是否越界读取、写死目标、钻评分器漏洞 |
| 最后的回答(摘录) | REVIEW.json written |
| 原始记录位置 | /home/spark-longxinyang/vec/runs/formal/20261003-172000-search-t2-heart-extrap-chain-12h/nodes/39/reviewer.jsonl 271 KB /home/spark-longxinyang/vec/runs/formal/20261003-172000-search-t2-heart-extrap-chain-12h/nodes/39/reviewer.stderr |