总览 · ← 返回运行 20261003-172000-search-t2-heart-extrap-chain-12h
节点 n28 在终选来历上
NO_CHANGE: SE自适应z分数速度门控(替换4档+否决4档+一致性加权2档,另ε重扫4档、V_CAP/k边缘2档,14配置全≤父节点fixed k=0.7的54.87)
| 运行?一次完整的自动搜索或 Agent 会话,有自己的锁定配置和证据包。 | 20261003-172000-search-t2-heart-extrap-chain-12h |
|---|---|
| 父节点 | n26 |
| 子节点 | n30 |
| 操作?种子:人写的起点;改进:在父节点上改;草稿:从头写;修复:修父节点的报错。 | 改进 |
| 状态 | 已打分 |
| 分数 | 搜索目标分 55.09(+0.0) · proxy_noscale 55.09(+0.0) |
| 审查 | 通过 1 越界读取:未发现问题。run.py 只通过 view_io 的 load_manifest/read_stage/panel_genes 访问 --data 下的视图文件(run.py:262-264, 298),无绝对路径、..、/mnt、external、打分器或 src/common/evaluation 读取,无联网。; 2 硬编码目标统计量:未发现问题。所有常量(eps=0.6、k=0.7、gamma=0.6、alpha=1.0、MIN_TYPE_CELLS=30、GENE_FLOOR=0.05、V_CAP=2.0,run.py:87-119)是管线超参数而非目标阶段统计量;速… |
| 用时?从运行开始到结束(或到现在)的挂钟时间。 | 28 分 |
| 程序版本 | b49b3a6f0a50773d1356816d78f441ae18bc2a6c (programs.git) |
方法说明?节点程序自带的 METHOD.md:这个程序做了什么、为什么。
来自 programs.git b49b3a6f0a:solution/METHOD.md
NO_CHANGE: SE自适应z分数速度门控(替换4档+否决4档+一致性加权2档,另ε重扫4档、V_CAP/k边缘2档,14配置全≤父节点fixed k=0.7的54.87)
结论
PLAN 的机制(用型内细胞间方差估计速度 SE、以 z 分数门控替换固定软阈值 k=0.7)被证否: 在同一 A 半尺子(proxy_noscale)上与父节点提交态配对比较,所有 z 门控变体、z 否决变体、 以及备选机制(跨型方向一致性加权)全部 ≤ 父节点(54.87),差距多数超过 T2 约 1 分的噪声。 提交态 = 父节点 26 的固定 k=0.7 配置(默认输出与父节点 逐位相同,已本机 np.array_equal 验证)。
实现与 SE 公式修正(PLAN 风险 1 命中)
PLAN 原 SE 公式 SE² = var_log2/(n·pb²·ln²2) + … 在本视图实测:79% 的过门(型,基因)对
SE>1,中位 z=0.31(过度保守,几乎清空所有速度)。按 PLAN 风险 1 预案改用直接 delta-method
标准误(pb 所在 log1p 空间的均值标准误):SE(v_{t,g}) = sqrt(var_a/n_a + var_p/n_p)/ln2,
实测中位 SE=0.095、中位 z=6.6、z≥2 保留 80% 过门对——量级合理,作为实际测试的 SE。
机制生效证据(诊断输出):z(2,1) 保留 7705 对(固定 k=0.7 保留 4603 对,对称差 ~3200), sum|v_soft| 6470 vs 2799,shift_absmax_log2 1.975 vs 1.300——门控确实大幅改变了 (型,基因)通过集合与位移幅度,且四组分随之显著变化(见下表),不是空转。
全部查分记录(18 次,A 半 proxy_noscale,seed 0;剩余 2 次未用)
父节点提交态在同半的配对对照 = 54.87(expr 54.99 / cell 56.55 / local 57.94 / shape 50.00; de_score 0.1528、de_direction 0.1998、mmd_u 0.04817、variogram 0.042206、nbh 0.08316)。 shape 组全程冻结坐标恒为地板,下表只列变化的组。止损线:PLAN 规定 de_direction<0.18 即劣于父。
| # | 配置 | 总分 | expr | cell | local | de_score | de_dir | mmd_u | vario | nbh |
|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 对照 fixed k=0.7(=父26) | 54.87 | 54.99 | 56.55 | 57.94 | 0.1528 | 0.1998 | 0.0482 | 0.0422 | 0.0832 |
| 2 | z替换 zmin=2, zk=1(PLAN初值) | 50.61 | 53.01 | 49.41 | 50.02 | 0.1111 | 0.1092 | 0.0847 | 0.0427 | 0.1144 |
| 3 | z替换 zmin=8, zk=8(高选择) | 54.78 | 54.26 | 56.83 | 58.04 | 0.1250 | 0.1801 | 0.0465 | 0.0427 | 0.0828 |
| 4 | z替换 zmin=2, zk=7(幅度≈父) | 54.84 | 54.17 | 57.02 | 58.16 | 0.1250 | 0.1742 | 0.0474 | 0.0413 | 0.0824 |
| 5 | z替换 zmin=2, zk=5 | 54.64 | 54.10 | 56.69 | 57.75 | 0.1389 | 0.1550 | 0.0516 | 0.0389 | 0.0838 |
| 6 | z否决 fixed k0.7 + z≥2 | 54.87 | 54.99 | 56.55 | 57.94 | 0.1528 | 0.1997 | 0.0482 | 0.0422 | 0.0832 |
| 7 | z否决 z≥3 | 54.86 | 54.98 | 56.54 | 57.93 | 0.1528 | 0.1993 | 0.0482 | 0.0422 | 0.0832 |
| 8 | z否决 z≥4 | 54.80 | 54.72 | 56.55 | 57.94 | 0.1389 | 0.1964 | 0.0481 | 0.0423 | 0.0831 |
| 9 | z否决 z≥6 | 54.76 | 54.72 | 56.48 | 57.82 | 0.1250 | 0.2098 | 0.0480 | 0.0426 | 0.0836 |
| 10 | ε重扫 ε=0.45×2步 | 54.76 | 54.53 | 56.20 | 58.31 | 0.1250 | 0.1979 | 0.0491 | 0.0425 | 0.0819 |
| 11 | ε重扫 ε=0.75×2步 | 54.56 | 54.71 | 56.66 | 56.88 | 0.1389 | 0.1953 | 0.0472 | 0.0426 | 0.0868 |
| 12 | ε重扫 ε=0.6×1步 | 54.62 | 54.40 | 55.87 | 58.22 | 0.1250 | 0.1889 | 0.0501 | 0.0429 | 0.0822 |
| 13 | ε重扫 ε=0.6×3步 | 54.44 | 54.68 | 56.60 | 56.46 | 0.1389 | 0.1934 | 0.0470 | 0.0430 | 0.0883 |
| 14 | 备选:一致性加权 W=1(保幅) | 54.63 | 54.00 | 56.59 | 57.94 | 0.1250 | 0.1629 | 0.0473 | 0.0429 | 0.0831 |
| 15 | 备选:一致性加权 W=2(保幅) | 54.46 | 53.70 | 56.39 | 57.73 | 0.1250 | 0.1422 | 0.0473 | 0.0435 | 0.0839 |
| 16 | 备选:V_CAP 2.0→1.5 | 53.35 | 53.31 | 54.28 | 55.82 | 0.1250 | 0.1153 | — | — | — |
| 17 | k=0.75(平台边缘) | 54.80 | 55.06 | 56.37 | 57.77 | 0.1528 | 0.2041 | 0.0473 | 0.0437 | 0.0845 |
(#17 的 expr 组 55.06 略高于父 54.99、de_dir 0.2041>0.1998,但 cell_state/local 同时下降, 总分 54.80<54.87,净负;未提交。)
为什么 z 门控无效(读数)
- 信噪结构不匹配:clean SE 中位仅 0.095(log1p 空间型内均值的标准误),过门对的中位 |v|=0.666 → 中位 z≈6.6。z≥2–3 几乎不筛(保留 72–80%),真正起筛选作用的是幅度阈值; 而父节点教训(k=0.25→de_dir 0.12)说明放行小速度就是放噪声。z(2,1) 总位移 2.3 倍于父, mmd_u 0.085、nbh 0.114 双双崩到地板。
- 等幅度替换仍略差:z(2,7)/z(8,8) 把 sum|v_soft| 调回 ≈父(2758/2409 vs 2799), de_direction 仍只有 0.174/0.180 < 0.1998——把"大而噪"(小型高|v|)换成"小而稳" (大型低|v|)不改善方向信号;PLAN 动机中"大类型可靠小速度被误杀"的部分在本数据上 不成立(这些小速度对 de_direction 是稀释而非增益)。
- 纯否决(保留父集合、只删低 z 对)单调不升:z≥2 时仅删 49 对 ≈ 恒等;z≥4/6 删 319/801 对,de_score 0.1528→0.1389→0.125。z≥6 的 de_dir 0.2098 是全表最高,但 de_score(top-k 命中率)反向掉——两项此消彼长,组均值不升。
- 一致性加权反号:跨型方向不一致的基因(coh 低)并非噪声——逐型解码本来就按型施加 各自符号,压制"不一致"基因把 de_dir 从 0.1998 拉到 0.163/0.142。与节点 26 教训一致: 基因维的跨型聚合(无论是平均还是一致性度量)都会破坏按型方向信号。
已验证 / 未验证
- 已验证:默认态输出与父节点 26 逐位相同(X、坐标、基因序、细胞序);
--fixed-k 0.7与默认逐位相同;--ablate mechanism→ α=0 → 逐位等于节点 23 基座(std_dp=0,DE 保护区), 与默认输出不同(mechanism_active=yes);--ablate=--fixed-k→ 与默认逐位相同。 - 已验证:seed 0/1/2 输出逐位相同(机制与采样在本视图不消耗有效随机性)。
- 已验证:伪装视图(所有阶段时间 +1 天、manifest 键序打乱重排版、路径改名)输出逐位相同, 非 view_dependent;程序不读绝对时间、不读视图名。
- 已验证:单输入阶段视图不崩溃,α 自动归 0,vec-check 通过;正式视图 vec-check 通过。
- 未验证:final 视图(步长比 4/3、anchor 可能超 max_cells)上 z 否决的稳健性收益—— proxy 上 z≥2 否决 ≈ 恒等(只删 49 对),无法区分"稳健"与"无用";因 A 半无一配置为正 收益,按证否规则不提交任何 z 变体。
- 知识来源:无。所有数值(SE、速度、门控、位移)均从视图内两个输入阶段现场计算; 未使用任何外部数据、文献数值或已发布/保留阶段的测量值。
给后续节点的方向建议
- 固定 k=0.7 平台对"门控形状"不敏感(k∈[0.6,0.75]、z 否决、SE 调制都在 ±0.3 内), expression_change 的 de_score/de_direction 此消彼长(#9、#17),继续在门控层做文章 预期收益 <噪声。
- 仍有空间的读数:k=0.75 使 expr 组 55.06(全表最高)且 de_dir 0.2041,代价在 cell_state(mmd_u/var)与 local(nbh)。若能把"更强的方向信号"与"保住 mmd/nbh"解耦 (例如只对 de_score 敏感的 top-mover 子集加大位移、其余保持父幅度),可能同时抬两组。
- 平滑层 ε=0.6×2 步在位移后仍是最优(4 档重扫全负),不要再扫。
调研员的计划
| 名称 | SE自适应z分数速度门控替换固定软阈值(父26表达变化组) |
|---|---|
| 动机 | 父节点26四组中expression_change最弱(54.93),de_score 0.1528/de_direction 0.1961仍有大量空间。当前固定软阈值k=0.7对所有(型,基因)一视同仁,但速度估计的信噪比差异巨大:31个过门型中细胞数从30到数千不等,基因pb从0.05到高表达跨两个数量级。小类型低表达基因的速度SE大、噪声主导,固定k放行噪声;大类型高表达基因的可靠小速度(|v|<0.7)被固定k误杀。ANALYSIS next_suggestions第3条明确建议'按型细胞数自适应的显著性门(如两阶段pb差的z分数/标准误)'。响应面已在k∈[0.6,0.75]×γ∈[0.5,0.65]×α∈[1,1.25]形成54.6–54.9宽平台,固定参数接近极限,需要结构性改变才能突破。 |
| 做法 | 在父节点26的完整管线(平滑ε=0.6×2步→按型速度乘法位移→γ回拉)上,只替换速度门控层: 1. 速度SE估计:对每个过门型t(两阶段各≥30细胞),基因g在两阶段型内pb≥0.05:用型内细胞间方差估计SE。具体:SE²(v_{t,g}) ≈ var_anchor_{t,g}/(n_anchor_t · pb_anchor²_{t,g}·ln²2) + var_prev_{t,g}/(n_prev_t · pb_prev²_{t,g}·ln²2),其中var是型内细胞在log2空间的方差(用np.var on log2(x+1e-9)的型内值)。这比Poisson假设更稳健,直接从数据现场计算。 2. z分数门控:z_{t,g} = |v_{t,g}| / SE_{t,g}。保留条件:z ≥ z_min(初值2.0,扫描{1.5, 2.0, 2.5, 3.0})且|v|≤V_CAP=2.0(保留上限防极端值)。 3. z空间软阈值:通过z门控后,v_soft = sign(v)·(|v| − SE·z_k),z_k是z空间软阈值(初值1.0,扫描{0.5, 1.0, 1.5})。等价于只保留超过z_k个标准误的部分,阈值随SE自适应。SE=0时(理论上不会,但数值保护)回退到固定k=0.7。 4. 其余管线不变:α=1.0、γ=0.6、ε=0.6、2步扩散、坐标/组成/行序冻结均继承父节点。 5. 联合ε重扫(次要):提交最优z门控后,在固定z参数下扫ε∈{0.3, 0.45, 0.6, 0.75}×步数{1, 2},检验速度位移后最优平滑是否偏移(ANALYSIS建议1)。仅当ε变化带来>1分时才改。 6. 单输入退路:只有一个输入阶段→无速度→α=0→逐位回退节点23基座,与父节点相同。 7. vec-score快速筛选:先跑z_min=2.0/z_k=1.0,看de_direction是否≥0.20(父值0.196);若de_direction<0.18(劣于父),立即止损回退父参数。查分≤8次:4次z门控网格 + 1次最优确认 + 1次ablate对照 + 2次ε重扫。 |
| 风险 | 1) SE估计不准:型内细胞数少(~30)时方差估计本身噪声大,z分数可能不稳定。Engineer应检查SE分布:若>50%的(型,基因)对SE>1(即z普遍<1),说明SE估计过保守,需换更简单的SE(如仅用pb和n的delta method)。2) 改善在噪声内:T2噪声~1分,若总分提升<1.5需复查确认。3) z门控过严导致过多基因被清零→dp幅度不足→重新触发无变化保护(std(dp)<1%×std(dt))。Engineer应在第一次查分后检查std(dp)是否>0.01。4) 过度拟合A半:z参数扫描应在宽平台中心取点,不追argmax。 |
代码改动?这个节点的程序和父节点程序的逐行差别:绿色是新增,红色是删除。
对比:父节点版本 dcafeb5ba7。改动的文件:solution/METHOD.md +90 −78、solution/README.md +40 −17、solution/run.py +121 −8
diff --git a/solution/METHOD.md b/solution/METHOD.mdindex 1e9d6cb..ab987e4 100644--- a/solution/METHOD.md+++ b/solution/METHOD.md@@ -1,78 +1,90 @@-节点23空间平滑基座上叠加按型log2速度软阈值乘法外推(α=1、k=0.7)与逐细胞线性总量回拉(γ=0.6);坐标、组成、细胞数、行序冻结。--# 方法(family T2HX-04,improve 自节点 23)--**基座(= 节点 23 提交态,逐位继承)**:anchor=末观测输入,n 夹到 [min_cells, max_cells]、`take` 分层、行序排序;表达在坐标 15-NN 图上做 2 步支撑掩码扩散(ε=0.6,`Y←clip(Y+ε(WY−Y),0)`,残差只施加在原始 x>0 条目上,零模式逐位保留);随后逐基因列缩放**精确复原**伪批量。坐标不动 → 形状三项逐位不变。--**机制(本节点新增,α≠0)**:-1. **按型速度**:取视图内最后两个输入阶段(`extrap_step`,不读绝对时间),对每个细胞类型 t 算伪批量 log2 速度 `v_{t,g} = log2 pb_anchor_{t,g} − log2 pb_prev_{t,g}`。硬门控:类型在两阶段各 ≥30 细胞;基因在两阶段型内 pb ≥0.05;|v| ≤ 2。锚阶段 33 型中 31 型过门(2 型 38 个细胞无速度,位移为 0)。-2. **软阈值**:`v → sign(v)·max(|v|−k, 0)`,k=0.7,只保留有把握的强运动基因(k 是关键调参:噪声级小速度被清零,见下表 k 梯度)。-3. **逐细胞乘法位移**:`x'_{i,g} = x_{i,g} · 2^(α·v_soft_{t(i),g})`,α=1(把上一个观测步的方向延续一步;纯乘法极限:零保持零、无需 clip)。作用在"平滑+精确复原"后的矩阵上。-4. **逐细胞总量回拉(节点 24 配方)**:线性 CP10k 空间 `T=Σ_g expm1(x_g)`,`f_i=(T_i^orig/T_i^new)^γ`,γ=0.6,`x''=log1p(expm1(x')·f_i)`。把每个细胞的文库总量部分拉回其自身原值(CP10k 不变量),防止位移把细胞整体推离真值流形。-5. **单输入退路**:视图只有一个输入阶段时 α 强制为 0,输出逐位回到节点 23(已在模拟单输入视图上实测通过)。--**提交参数**:ε=0.6、2 步;α=1.0、k=0.7、γ=0.6;门控 (30, 0.05, 2.0)。全部为固定常数或从视图输入现场计算,无任何来自已发布/保留阶段的数值。--# 消融对照(mechanism_off_control)--`--ablate <任意名>` → α=0 → 位移与回拉整块跳过,列缩放退化为精确复原,**输出逐位等于节点 23 提交态**(已用 `np.array_equal` 对父程序输出比对:X、坐标、基因序全同)。消融态 A 半 = 父节点 50.58;开启态 A 半 54.87。mechanism_active 必为 yes。--# 机制生效证据(对照 PLAN mechanism_evidence)--1. de_direction raw 0 → **0.1998**(脱离无变化保护:std(dp)=0.173,远超 1% 阈值)✓-2. de_score raw 0 → **0.1528** ✓-3. neighborhood_mmd raw 0.10679(父 A 半)→ **0.08316**,优于 PLAN 要求的 ≤0.107 ✓-4. spearman(dp, v̄) = **0.49** > 0.3 ✓(500 基因全 gene 集)-5. de_direction 显著为正 → 速度方向与真值变化方向一致,机制生效 ✓--**实际改变了哪些细胞**:平滑层改动全部 24,826 个细胞的支撑内条目(absmean_dcell 0.128);速度层再改 24,788 个细胞(38 个无速度类型细胞只含平滑改动),改动仍限于原始支撑(零模式不变,nnz 10.5%)。--**四组分变化(A 半,父→本)**:expression_change 50.00→54.99(de_score 0→0.1528、de_dir 0→0.1998);cell_state 50.60→56.55(mmd_u 0.05487→0.04817,variogram 0.059636→0.042206);local_spatial 51.88→57.94(nbh 0.10679→0.08316);shape_scale 50.00→50.00(坐标冻结,逐位不变)。--**层分解**(同一 A 半):copy_last 50.00;仅平滑(父)50.58;仅速度(ε=0 探针)53.65;平滑+速度 54.87 ≈ 两层收益相加。--# 查分记录(19/20 次,全部 A 半 proxy_noscale;shape 三项恒 50.00)--PLAN 的 colscale 解码(组成加权 v̄_g 列缩放到 pb_orig×2^(α·v̄))先测:α=0.3 得 51.17,**de_score −0.0278、de_dir −0.0039 ≈ 0**——保护已解除(std(dp)=0.070)但方向信号为零:按输出组成加权平均把各型的方向信号抵消了。同一速度场换按型逐细胞解码后 DE 立即解锁,故提交 pertype 解码(解码/幅度组合 ≥3 种、查分 ≥6 次后才放弃 colscale,符合 §5)。--| # | 解码 | α | k | γ | ε | 榜分 | expr | cell | local | de_score | de_dir | mmd_u | vario | nbh |-|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|-| 1 | colscale | 0.3 | – | – | 0.6 | 51.17 | 49.59 | 51.79 | 53.30 | −0.028 | −0.004 | 0.0525 | 0.0566 | 0.1003 |-| 2 | pertype | 1.0 | 0.5 | 0.5 | 0.6 | 54.55 | 54.14 | 56.35 | 57.71 | 0.153 | 0.143 | 0.0502 | 0.0412 | 0.0839 |-| 3 | pertype | 0.5 | 0.5 | 0.5 | 0.6 | 52.63 | 53.02 | 53.07 | 54.45 | 0.111 | 0.109 | 0.0502 | 0.0535 | 0.0958 |-| 4 | pertype | 1.5 | 0.5 | 0.5 | 0.6 | 52.24 | 53.32 | 52.51 | 53.15 | 0.139 | 0.101 | 0.0700 | 0.0402 | 0.1009 |-| 5 | pertype | 1.0 | 0.25 | 0.5 | 0.6 | 53.36 | 53.81 | 54.17 | 55.44 | 0.153 | 0.120 | 0.0612 | 0.0402 | 0.0921 |-| 6 | pertype | 1.0 | 0.75 | 0.5 | 0.6 | 54.29 | 54.14 | 55.82 | 57.22 | 0.125 | 0.172 | 0.0472 | 0.0457 | 0.0856 |-| 7 | pertype | 1.0 | 0.5 | 0(关) | 0.6 | 49.92 | 47.19 | 50.94 | 51.54 | −0.236 | −0.003 | 0.0523 | 0.0609 | 0.1076 |-| 8 | pertype | 1.0 | 0.5 | 1.0 | 0.6 | 52.58 | 55.48 | 52.49 | 52.33 | 0.181 | 0.202 | 0.0765 | 0.0368 | 0.1043 |-| 9 | pertype | 1.0 | 0.5 | 0.65 | 0.6 | 54.41 | 54.87 | 55.83 | 56.93 | 0.167 | 0.178 | 0.0562 | 0.0383 | 0.0866 |-| 10 | pertype | 1.0 | 0.5 | 0.35 | 0.6 | 54.03 | 53.17 | 55.84 | 57.11 | 0.125 | 0.106 | 0.0471 | 0.0457 | 0.0860 |-| 11 | pertype | 1.0 | 0.6 | 0.5 | 0.6 | 54.64 | 54.34 | 56.40 | 57.80 | 0.153 | 0.157 | 0.0482 | 0.0427 | 0.0836 |-| 12 | pertype | 1.0 | 0.75 | 0.65 | 0.6 | 54.91 | 55.12 | 56.57 | 57.95 | 0.153 | 0.208 | 0.0480 | 0.0423 | 0.0831 |-| 13 | pertype | 1.25 | 0.75 | 0.5 | 0.6 | 54.83 | 54.48 | 56.80 | 58.05 | 0.139 | 0.180 | 0.0488 | 0.0408 | 0.0828 |-| 14 | pertype | 0.75 | 0.5 | 0.5 | 0.6 | 54.04 | 54.02 | 55.32 | 56.81 | 0.153 | 0.135 | 0.0477 | 0.0470 | 0.0871 |-| 15 | pertype | 1.0 | 1.0 | 0.65 | 0.6 | 54.26 | 55.84 | 54.91 | 56.28 | 0.181 | 0.226 | 0.0477 | 0.0486 | 0.0890 |-| 16 | pertype | 1.25 | 0.75 | 0.65 | 0.6 | 54.82 | 55.21 | 56.57 | 57.51 | 0.167 | 0.200 | 0.0538 | 0.0376 | 0.0846 |-| 17 | pertype | 1.0 | 0.9 | 0.6 | 0.6 | 54.37 | 55.21 | 55.44 | 56.82 | 0.153 | 0.214 | 0.0473 | 0.0470 | 0.0870 |-| 18 | **pertype** | **1.0** | **0.7** | **0.6** | **0.6** | **54.87** | 54.99 | 56.55 | 57.94 | 0.153 | 0.200 | 0.0482 | 0.0422 | 0.0832 |-| 19 | pertype | 1.0 | 0.7 | 0.6 | 0(平滑层消融) | 53.65 | 53.58 | 54.90 | 56.13 | 0.097 | 0.162 | 0.0530 | 0.0438 | 0.0895 |--响应面平滑单峰:k∈[0.6,0.75]、γ∈[0.5,0.65]、α∈[1,1.25] 为宽平台(54.6–54.9),提交点 (#18) 取高分点集 (#12/#13/#16/#18) 的中心而非 argmax,避免 A 半尖峰拟合。γ=0(#7)崩到 49.92 且 de_score 反号 −0.236——总量回拉是位移不破坏细胞流形的前提;γ=1(#8)DE 最高但 mmd_u/nbh 变差。colscale 未测的 α 档由本地 std(dp) 诊断覆盖(α=0.05–1.0 → std(dp) 0.012–0.213)。--# 与 PLAN 的偏离--PLAN 指定 colscale 解码为主机制;实测其 DE 方向信号为零(#1,de_dir −0.004),按 §5 在同一速度场上换解码(pertype,即节点 21/24 已验证的乘法家族)后机制生效。机制族(速度引导的部分伪批量恢复 + 空间平滑保邻域)、门控、消融定义均按 PLAN;解码由"逐基因列缩放"改为"按型逐细胞乘法+总量回拉",属解码偏离,与父节点 23 的偏离先例同类。v̄_g(组成加权)仍计算并用于诊断(spearman 证据)。--# 验证过 / 未验证--**已验证**:`--ablate` 逐位=节点 23(本机比对);seed 0/1/2 输出逐位相同(机制不消耗随机数;proxy 上 n=24,826 ≤ max_cells 全细胞直通);伪装视图(阶段文件改名、manifest 键序打乱、全部时间 +1 天、换路径)输出逐位相同;模拟单输入视图回退 α=0 不崩;vec-check 全过;纯 CPU,运行 ~6 s、峰值内存 <2 GB(限 28 GB/30 min)。--**未验证**:B 半分数(节点正式分);final 视图实跑——真实括号步长比 4/3 vs 代理 1.5,α=1 为固定常数不随时间缩放(与节点 24 的官方验证选择一致,可迁移性由"位移=上一步方向延续一步"的定义保证);final anchor 若超 max_cells,平滑与位移跑在分层子样本上(密度更低,幅度未实测)。留 1 次查分额度未用。--**风险提示(审查者需知)**:列复原+乘法位移使部分条目超出 log1p(CP10k) 原始上限 9.21(本配置 max 17.7,父节点即 17.4;仅平滑+速度无复原时 13.5)。契约允许(有限非负),节点 23 已带此性质过审。--# 知识来源--- 按型 log-FC 速度外推:转录组速度思想的伪批量离散形式(上一观测区间各型各基因的方向性变化延续到下一区间),通用机制知识,不含任何保留阶段测量值;本树节点 21/24 已实验验证(24 为官方分验证的树内最优)。-- 空间 kNN 图扩散去噪:MAGIC(van Dijk et al. 2018, doi:10.1016/j.cell.2018.05.061),继承自节点 23。-- 所有数值(速度、门控通过集、伪批量、缩放因子)均从视图输入现场计算;α/k/γ/ε 为固定超参数,由本 A 半网格选定,无已发布阶段来源常数。外部数据(external/)未使用。+NO_CHANGE: SE自适应z分数速度门控(替换4档+否决4档+一致性加权2档,另ε重扫4档、V_CAP/k边缘2档,14配置全≤父节点fixed k=0.7的54.87)++## 结论++PLAN 的机制(用型内细胞间方差估计速度 SE、以 z 分数门控替换固定软阈值 k=0.7)**被证否**:+在同一 A 半尺子(proxy_noscale)上与父节点提交态配对比较,所有 z 门控变体、z 否决变体、+以及备选机制(跨型方向一致性加权)全部 ≤ 父节点(54.87),差距多数超过 T2 约 1 分的噪声。+提交态 = 父节点 26 的固定 k=0.7 配置(默认输出与父节点 **逐位相同**,已本机 np.array_equal 验证)。++## 实现与 SE 公式修正(PLAN 风险 1 命中)++PLAN 原 SE 公式 `SE² = var_log2/(n·pb²·ln²2) + …` 在本视图实测:**79% 的过门(型,基因)对+SE>1,中位 z=0.31**(过度保守,几乎清空所有速度)。按 PLAN 风险 1 预案改用直接 delta-method+标准误(pb 所在 log1p 空间的均值标准误):`SE(v_{t,g}) = sqrt(var_a/n_a + var_p/n_p)/ln2`,+实测中位 SE=0.095、中位 z=6.6、z≥2 保留 80% 过门对——量级合理,作为实际测试的 SE。++机制生效证据(诊断输出):z(2,1) 保留 7705 对(固定 k=0.7 保留 4603 对,对称差 ~3200),+sum|v_soft| 6470 vs 2799,shift_absmax_log2 1.975 vs 1.300——门控确实大幅改变了+(型,基因)通过集合与位移幅度,且四组分随之显著变化(见下表),不是空转。++## 全部查分记录(18 次,A 半 proxy_noscale,seed 0;剩余 2 次未用)++父节点提交态在同半的配对对照 = **54.87**(expr 54.99 / cell 56.55 / local 57.94 / shape 50.00;+de_score 0.1528、de_direction 0.1998、mmd_u 0.04817、variogram 0.042206、nbh 0.08316)。+shape 组全程冻结坐标恒为地板,下表只列变化的组。止损线:PLAN 规定 de_direction<0.18 即劣于父。++| # | 配置 | 总分 | expr | cell | local | de_score | de_dir | mmd_u | vario | nbh |+|---|---|---:|---:|---:|---:|---:|---:|---:|---:|---:|+| 1 | **对照 fixed k=0.7(=父26)** | **54.87** | 54.99 | 56.55 | 57.94 | 0.1528 | 0.1998 | 0.0482 | 0.0422 | 0.0832 |+| 2 | z替换 zmin=2, zk=1(PLAN初值) | 50.61 | 53.01 | 49.41 | 50.02 | 0.1111 | 0.1092 | 0.0847 | 0.0427 | 0.1144 |+| 3 | z替换 zmin=8, zk=8(高选择) | 54.78 | 54.26 | 56.83 | 58.04 | 0.1250 | 0.1801 | 0.0465 | 0.0427 | 0.0828 |+| 4 | z替换 zmin=2, zk=7(幅度≈父) | 54.84 | 54.17 | 57.02 | 58.16 | 0.1250 | 0.1742 | 0.0474 | 0.0413 | 0.0824 |+| 5 | z替换 zmin=2, zk=5 | 54.64 | 54.10 | 56.69 | 57.75 | 0.1389 | 0.1550 | 0.0516 | 0.0389 | 0.0838 |+| 6 | z否决 fixed k0.7 + z≥2 | 54.87 | 54.99 | 56.55 | 57.94 | 0.1528 | 0.1997 | 0.0482 | 0.0422 | 0.0832 |+| 7 | z否决 z≥3 | 54.86 | 54.98 | 56.54 | 57.93 | 0.1528 | 0.1993 | 0.0482 | 0.0422 | 0.0832 |+| 8 | z否决 z≥4 | 54.80 | 54.72 | 56.55 | 57.94 | 0.1389 | 0.1964 | 0.0481 | 0.0423 | 0.0831 |+| 9 | z否决 z≥6 | 54.76 | 54.72 | 56.48 | 57.82 | 0.1250 | **0.2098** | 0.0480 | 0.0426 | 0.0836 |+| 10 | ε重扫 ε=0.45×2步 | 54.76 | 54.53 | 56.20 | 58.31 | 0.1250 | 0.1979 | 0.0491 | 0.0425 | 0.0819 |+| 11 | ε重扫 ε=0.75×2步 | 54.56 | 54.71 | 56.66 | 56.88 | 0.1389 | 0.1953 | 0.0472 | 0.0426 | 0.0868 |+| 12 | ε重扫 ε=0.6×1步 | 54.62 | 54.40 | 55.87 | 58.22 | 0.1250 | 0.1889 | 0.0501 | 0.0429 | 0.0822 |+| 13 | ε重扫 ε=0.6×3步 | 54.44 | 54.68 | 56.60 | 56.46 | 0.1389 | 0.1934 | 0.0470 | 0.0430 | 0.0883 |+| 14 | 备选:一致性加权 W=1(保幅) | 54.63 | 54.00 | 56.59 | 57.94 | 0.1250 | 0.1629 | 0.0473 | 0.0429 | 0.0831 |+| 15 | 备选:一致性加权 W=2(保幅) | 54.46 | 53.70 | 56.39 | 57.73 | 0.1250 | 0.1422 | 0.0473 | 0.0435 | 0.0839 |+| 16 | 备选:V_CAP 2.0→1.5 | 53.35 | 53.31 | 54.28 | 55.82 | 0.1250 | 0.1153 | — | — | — |+| 17 | k=0.75(平台边缘) | 54.80 | **55.06** | 56.37 | 57.77 | 0.1528 | 0.2041 | 0.0473 | 0.0437 | 0.0845 |++(#17 的 expr 组 55.06 略高于父 54.99、de_dir 0.2041>0.1998,但 cell_state/local 同时下降,+总分 54.80<54.87,净负;未提交。)++## 为什么 z 门控无效(读数)++1. **信噪结构不匹配**:clean SE 中位仅 0.095(log1p 空间型内均值的标准误),过门对的中位+ |v|=0.666 → 中位 z≈6.6。z≥2–3 几乎不筛(保留 72–80%),真正起筛选作用的是幅度阈值;+ 而父节点教训(k=0.25→de_dir 0.12)说明放行小速度就是放噪声。z(2,1) 总位移 2.3 倍于父,+ mmd_u 0.085、nbh 0.114 双双崩到地板。+2. **等幅度替换仍略差**:z(2,7)/z(8,8) 把 sum|v_soft| 调回 ≈父(2758/2409 vs 2799),+ de_direction 仍只有 0.174/0.180 < 0.1998——把"大而噪"(小型高|v|)换成"小而稳"+ (大型低|v|)不改善方向信号;PLAN 动机中"大类型可靠小速度被误杀"的部分在本数据上+ 不成立(这些小速度对 de_direction 是稀释而非增益)。+3. **纯否决(保留父集合、只删低 z 对)单调不升**:z≥2 时仅删 49 对 ≈ 恒等;z≥4/6 删+ 319/801 对,de_score 0.1528→0.1389→0.125。z≥6 的 de_dir 0.2098 是全表最高,但+ de_score(top-k 命中率)反向掉——两项此消彼长,组均值不升。+4. **一致性加权反号**:跨型方向不一致的基因(coh 低)并非噪声——逐型解码本来就按型施加+ 各自符号,压制"不一致"基因把 de_dir 从 0.1998 拉到 0.163/0.142。与节点 26 教训一致:+ 基因维的跨型聚合(无论是平均还是一致性度量)都会破坏按型方向信号。++## 已验证 / 未验证++- 已验证:默认态输出与父节点 26 逐位相同(X、坐标、基因序、细胞序);`--fixed-k 0.7`+ 与默认逐位相同;`--ablate mechanism` → α=0 → 逐位等于节点 23 基座(std_dp=0,DE 保护区),+ 与默认输出不同(mechanism_active=yes);`--ablate=--fixed-k` → 与默认逐位相同。+- 已验证:seed 0/1/2 输出逐位相同(机制与采样在本视图不消耗有效随机性)。+- 已验证:伪装视图(所有阶段时间 +1 天、manifest 键序打乱重排版、路径改名)输出逐位相同,+ 非 view_dependent;程序不读绝对时间、不读视图名。+- 已验证:单输入阶段视图不崩溃,α 自动归 0,vec-check 通过;正式视图 vec-check 通过。+- 未验证:final 视图(步长比 4/3、anchor 可能超 max_cells)上 z 否决的稳健性收益——+ proxy 上 z≥2 否决 ≈ 恒等(只删 49 对),无法区分"稳健"与"无用";因 A 半无一配置为正+ 收益,按证否规则不提交任何 z 变体。+- 知识来源:无。所有数值(SE、速度、门控、位移)均从视图内两个输入阶段现场计算;+ 未使用任何外部数据、文献数值或已发布/保留阶段的测量值。++## 给后续节点的方向建议++- 固定 k=0.7 平台对"门控形状"不敏感(k∈[0.6,0.75]、z 否决、SE 调制都在 ±0.3 内),+ expression_change 的 de_score/de_direction 此消彼长(#9、#17),继续在门控层做文章+ 预期收益 <噪声。+- 仍有空间的读数:k=0.75 使 expr 组 55.06(全表最高)且 de_dir 0.2041,代价在+ cell_state(mmd_u/var)与 local(nbh)。若能把"更强的方向信号"与"保住 mmd/nbh"解耦+ (例如只对 de_score 敏感的 top-mover 子集加大位移、其余保持父幅度),可能同时抬两组。+- 平滑层 ε=0.6×2 步在位移后仍是最优(4 档重扫全负),不要再扫。diff --git a/solution/README.md b/solution/README.mdindex ff2a8d4..3397cbd 100644--- a/solution/README.md+++ b/solution/README.md@@ -1,22 +1,45 @@-# 空间平滑 + 按型速度软阈值乘法外推 + 总量回拉(T2HX-04)——提交态:机制开启+# SE 自适应 z 门控(T2HX-04,节点 28)——已证否,提交态 = 父节点 26(fixed k=0.7,逐位相同) -`run.py` 默认态 = 节点 23 基座(copy_last 锚阶段,n 夹到 [min_cells, max_cells],`take` 分层,-坐标 15-NN 图 2 步支撑掩码扩散 ε=0.6,逐基因列缩放精确复原伪批量)之上叠加速度层:+PLAN 提议把父节点 26 的固定软阈值 k=0.7 换成按(型,基因)标准误的 z 分数自适应门控。+在同一 A 半尺子上与父节点配对查分 18 次:z 替换(4 档)、z 否决(4 档)、跨型一致性加权+(2 档)、ε 重扫(4 档)、V_CAP/k 边缘(2 档)共 14 个配置**全部 ≤ 父节点 54.87**(多数+超过 T2 ~1 分噪声)。机制证否,按规则提交 NO_CHANGE,默认输出**逐位等于父节点 26**+(已本机 np.array_equal 验证 X / 坐标 / 基因序 / 细胞序)。 -1. 由视图内最后两个输入阶段算**按细胞类型**伪批量 log2 速度 v_{t,g}(门控:型两阶段各 ≥30 细胞、- 基因型内 pb ≥0.05、|v|≤2);-2. 软阈值 k=0.7 去掉噪声级小速度;+读数详见 METHOD.md(含全部 17 行分项表与 4 条无效原因分析)。++## 提交态管线(= 父节点 26)++节点 23 基座(copy_last 锚阶段,n 夹到 [min_cells, max_cells],`take` 分层,坐标 15-NN 图+2 步支撑掩码扩散 ε=0.6,逐基因列缩放精确复原伪批量)之上叠加速度层:++1. 由视图内最后两个输入阶段算**按细胞类型**伪批量 log2 速度 v_{t,g}(门控:型两阶段各 ≥30+ 细胞、基因型内 pb ≥0.05、|v|≤2);+2. 固定软阈值 k=0.7(去掉噪声级小速度); 3. 逐细胞乘法位移 x' = x·2^(α·v_soft),α=1; 4. 逐细胞线性总量回拉 f=(T_orig/T_new)^γ,γ=0.6(CP10k 不变量,节点 24 配方)。 -坐标、组成、细胞数、行序冻结 → 形状三项逐位 = 地板。A 半配对实测:提交态 **54.87**-(父节点 23 同半 50.58、copy_last 50.00;仅速度无平滑 53.65)。de_direction 0→0.1998、-de_score 0→0.1528、nbh 0.10679→0.08316、mmd_u 0.05487→0.04817、variogram 0.059636→0.042206。-19 次查分全表与响应面见 METHOD.md。--- `--ablate <任意名>`:α=0,速度层整块跳过,输出**逐位等于节点 23**(已本机比对)。-- `VEC_ALPHA / VEC_DECODE / VEC_KSOFT / VEC_GAMMA / VEC_EPS / VEC_STEPS / VEC_MODE / VEC_KNN /- VEC_MINCELLS / VEC_GFLOOR / VEC_VCAP`:仅供探针复现(colscale 解码为 PLAN 原解码,实测 DE 无方向信号,保留可复现)。-- 单输入阶段视图:α 自动归 0,逐位回到节点 23(已实测)。-- 纯 CPU(EXECUTION.json gpu:false);机制 time-free、不消耗随机数,seed 0/1/2 与伪装视图- (改名/键序打乱/时间 +1 天)下输出逐位相同(已实测)。+坐标、组成、细胞数、行序冻结 → 形状三项逐位 = 地板。++## 对照开关(供 harness 与复现)++- `--ablate mechanism`:α=0,速度层整块跳过,输出**逐位等于节点 23 基座**(std_dp=0,+ DE 保护区;已本机比对)。与默认输出不同 → mechanism_active=yes。+- `--fixed-k 0.7` / `--ablate=--fixed-k`:显式走固定 k 路径,与默认逐位相同。+- 证否的机制代码保留在文件内,仅由 env 开关驱动,不进默认路径:+ `VEC_GATE=z`(z 替换,配 `VEC_ZMIN`/`VEC_ZK`)、`VEC_GATE=veto`(固定 k + z 否决)、+ `VEC_CONS>0`(跨型一致性加权,配 `VEC_CONSNORM`)。SE 用 clean delta-method+ `sqrt(var_a/n_a+var_p/n_p)/ln2`(PLAN 原公式实测 79% SE>1、中位 z=0.31,过度保守,+ 按 PLAN 风险 1 预案改)。其余 env(`VEC_ALPHA/VEC_DECODE/VEC_KSOFT/VEC_GAMMA/VEC_EPS/+ VEC_STEPS/VEC_MODE/VEC_KNN/VEC_MINCELLS/VEC_GFLOOR/VEC_VCAP`)仅供探针复现。++## 稳健性(已实测)++- 纯 CPU(EXECUTION.json gpu:false);机制 time-free、不消耗有效随机数:seed 0/1/2 输出+ 逐位相同。+- 伪装视图(所有阶段时间 +1 天、manifest 键序打乱重排版、路径改名)输出**逐位相同**,+ 非 view_dependent;程序不读绝对时间 / 视图名。+- 单输入阶段视图不崩溃,α 自动归 0,逐位回到节点 23(已实测)。+- 正式视图与单输入视图 vec-check 均通过。+- 无外部数据、无来自已发布 / 保留阶段的常数;所有数值(SE、速度、门控、位移)从视图内+ 两个输入阶段现场计算。diff --git a/solution/run.py b/solution/run.pyindex 1b5a6b3..ae89429 100644--- a/solution/run.py+++ b/solution/run.py@@ -3,6 +3,16 @@ guided partial pseudobulk restoration that unlocks the DE group (family T2HX-04, PLAN node 26). +NODE 28 (this file): PLAN proposed replacing the fixed soft threshold k=0.7+with an SE-adaptive z gate (per (type,gene) standard error of the log2+velocity). Measured on the A half (18 paired vec-score runs, METHOD.md):+every z-gate / z-veto / consistency-weighting variant scored <= the parent's+fixed k=0.7 (54.87) -> mechanism falsified, NO_CHANGE submitted. The default+state below is therefore BITWISE the parent node-26 configuration (fixed+k=0.7); the z-gate (VEC_GATE=z), significance veto (VEC_GATE=veto) and+cross-type consistency weighting (VEC_CONS>0) code paths are kept with their+env knobs only to make the falsification reproducible.+ Base (identical to node 23 = the ``--ablate`` state): anchor = last observed input stage, n clipped to [min_cells, max_cells], stratified-by-celltype sampling via ``take``, then 2 steps of support-masked diffusion on the@@ -93,6 +103,21 @@ V_CAP = float(os.environ.get("VEC_VCAP", "2.0")) K_SOFT = float(os.environ.get("VEC_KSOFT", "0.7")) # pertype soft threshold GAMMA_RENORM = float(os.environ.get("VEC_GAMMA", "0.6")) # pertype total pullback +# --- SE-adaptive z gate (this node): replaces the fixed soft threshold -------+# PLAN's SE formula (var_log2 / (n * pb^2 * ln2^2)) measured >50% of gated+# (type,gene) pairs with SE>1 (median z=0.31) -> PLAN risk-1 fallback: the+# direct standard error of the per-type mean in log space,+# SE(v_{t,g}) = sqrt(var_a/n_a + var_p/n_p) / ln2,+# with var_* the within-type cell-to-cell variance of the log1p values (the+# space pb is computed in). Median SE 0.095, median z 6.6 on the proxy view.+GATE_MODE = os.environ.get("VEC_GATE", "fixed") # z | fixed | veto+Z_MIN = float(os.environ.get("VEC_ZMIN", "2.0"))+Z_K = float(os.environ.get("VEC_ZK", "1.0"))+# alternative mechanisms (backup directions after the z gate measured flat):+CONS_W = float(os.environ.get("VEC_CONS", "0.0")) # cross-type consistency+CONS_NORM = bool(int(os.environ.get("VEC_CONSNORM", "1")))+SHRINK = float(os.environ.get("VEC_SHRINK", "0.0")) # pull toward consensus+ def diffuse(X64: np.ndarray, coords: np.ndarray, eps: float, mode: str, steps: int):@@ -134,12 +159,15 @@ def diffuse(X64: np.ndarray, coords: np.ndarray, eps: float, mode: str, def type_velocity(prev_stage, anch_X: np.ndarray, anch_labels: np.ndarray, out_labels: np.ndarray, n_out: int, g: int):- """Composition-weighted per-gene log2 velocity vbar_g and per-type table.+ """Composition-weighted per-gene log2 velocity vbar_g and per-type tables. vbar_g = sum_t (n_t/n_out) * v_{t,g}; v_{t,g} = log2 pb_anchor_t - log2 pb_prev_t with hard gates (type support, gene floor, |v| cap). Types with no previous-stage support get v = 0 (no evidence -> no displacement).- Also returns v_by_type dict and the per-cell velocity matrix rows.+ Returns (vbar, v_by_type, se_by_type, n_used): se_{t,g} is the standard+ error of v_{t,g} from the within-type cell-to-cell variance of the log1p+ values in each stage, SE = sqrt(var_a/n_a + var_p/n_p)/ln2 (delta method+ on the stage means; the space pb is computed in). """ Xp = prev_stage.X.toarray().astype(np.float64) if sp.issparse(prev_stage.X) \ else np.asarray(prev_stage.X, dtype=np.float64)@@ -151,24 +179,31 @@ def type_velocity(prev_stage, anch_X: np.ndarray, anch_labels: np.ndarray, cnt_p = dict(zip(types_p, cnts_p)) idx_p = {t: np.flatnonzero(lp == t) for t in types_p} + ln2 = np.log(2.0) vbar = np.zeros(g, dtype=np.float64) v_by_type: dict[str, np.ndarray] = {}+ se_by_type: dict[str, np.ndarray] = {} n_used = 0 for t, n_t in zip(types_a, cnt_a): n_p = int(cnt_p.get(t, 0)) if n_t < MIN_TYPE_CELLS or n_p < MIN_TYPE_CELLS: continue rows_a = la == t- pb_a = anch_X[rows_a].mean(axis=0)- pb_p = Xp[idx_p[t]].mean(axis=0)+ Xa_t = anch_X[rows_a]+ Xp_t = Xp[idx_p[t]]+ pb_a = Xa_t.mean(axis=0)+ pb_p = Xp_t.mean(axis=0) gate = (pb_a >= GENE_FLOOR) & (pb_p >= GENE_FLOOR) v = np.log2(np.maximum(pb_a, 1e-12)) - np.log2(np.maximum(pb_p, 1e-12)) v = np.where(gate, np.clip(v, -V_CAP, V_CAP), 0.0)+ se = np.sqrt(Xa_t.var(axis=0) / n_t + Xp_t.var(axis=0) / n_p) / ln2+ se = np.where(gate, np.maximum(se, 1e-9), np.inf) v_by_type[str(t)] = v+ se_by_type[str(t)] = se w = n_t / n_out vbar += w * v n_used += 1- return vbar, v_by_type, n_used+ return vbar, v_by_type, se_by_type, n_used def soft_threshold(v: np.ndarray, k: float) -> np.ndarray:@@ -177,18 +212,52 @@ def soft_threshold(v: np.ndarray, k: float) -> np.ndarray: return np.sign(v) * np.maximum(np.abs(v) - k, 0.0) +def z_threshold(v: np.ndarray, se: np.ndarray, z_min: float,+ z_k: float) -> np.ndarray:+ """SE-adaptive gate: keep |v| >= z_min*SE, subtract z_k*SE (soft)."""+ z = np.abs(v) / se+ keep = (z >= z_min) & (v != 0.0)+ return np.where(keep, np.sign(v) * np.maximum(np.abs(v) - z_k * se, 0.0),+ 0.0)+++def both_threshold(v: np.ndarray, se: np.ndarray, k: float,+ z_min: float) -> np.ndarray:+ """Fixed magnitude soft threshold k + significance veto z >= z_min.++ Keeps the parent's magnitude selectivity (only strong movers survive k)+ but drops strong-yet-unreliable velocities (small types / noisy genes,+ |v|>k with z below z_min): the adaptive-significance-gate direction of+ node-26 ANALYSIS suggestion 3.+ """+ z = np.abs(v) / se+ keep = (z >= z_min) & (v != 0.0)+ return np.where(keep, soft_threshold(v, k), 0.0)++ def main() -> None: parser = argparse.ArgumentParser() parser.add_argument("--data", required=True) parser.add_argument("--out", required=True) parser.add_argument("--seed", type=int, default=0) parser.add_argument("--ablate", default=None)+ parser.add_argument("--fixed-k", type=float, default=None,+ help="off-control: skip SE/z gate, use this fixed "+ "soft threshold (parent node-26 behaviour)") args = parser.parse_args() ablated = args.ablate is not None eps = DEFAULT_EPS alpha = 0.0 if ablated else DEFAULT_ALPHA decode = DEFAULT_DECODE+ gate_mode = GATE_MODE+ k_soft = K_SOFT+ if args.fixed_k is not None:+ gate_mode, k_soft = "fixed", args.fixed_k+ if ablated and "fixed" in str(args.ablate):+ # named off-control for the z gate only (velocity mechanism stays on)+ alpha = DEFAULT_ALPHA+ gate_mode, k_soft = "fixed", K_SOFT manifest = load_manifest(args.data) genes = panel_genes(args.data, manifest)@@ -222,11 +291,12 @@ def main() -> None: # ---- velocity field (needs a previous stage; else alpha -> 0) ---------- vbar = np.zeros(g, dtype=np.float64) v_by_type: dict[str, np.ndarray] = {}+ se_by_type: dict[str, np.ndarray] = {} if alpha != 0.0: prev_entry, _, _ = extrap_step(manifest) if prev_entry is not None: prev_stage = read_stage(args.data, prev_entry, genes)- vbar, v_by_type, n_used = type_velocity(+ vbar, v_by_type, se_by_type, n_used = type_velocity( prev_stage, X64, out_labels, out_labels, rows.size, g) print(f"[diag] velocity types_used={n_used} " f"vbar_std={vbar.std():.4f} vbar_absmax={np.abs(vbar).max():.4f} "@@ -258,14 +328,53 @@ def main() -> None: Y0 = Y * s # node-23 restored base utypes, uidx = np.unique(out_labels, return_inverse=True) Vt = np.zeros((utypes.size, g), dtype=np.float64)+ Vs = np.zeros((utypes.size, g), dtype=np.float64) unknown = 0+ n_keep_z = n_keep_fk = 0 for j, t in enumerate(utypes): v = v_by_type.get(str(t)) if v is None: unknown += int((uidx == j).sum()) continue Vt[j] = v- Vs = soft_threshold(Vt, K_SOFT)+ if gate_mode == "z":+ se = se_by_type[str(t)]+ Vs[j] = z_threshold(v, se, Z_MIN, Z_K)+ elif gate_mode == "veto":+ se = se_by_type[str(t)]+ Vs[j] = both_threshold(v, se, k_soft, Z_MIN)+ else:+ Vs[j] = soft_threshold(v, k_soft)+ n_keep_z = int(((Vs != 0) & (np.abs(Vt) > 0)).sum())+ n_keep_fk = int((np.abs(soft_threshold(Vt, K_SOFT)) > 0).sum())++ # --- backup mechanism: cross-type direction-consistency gate -------+ # For each gene g, measure how much the output-composition-weighted+ # per-type velocities agree in DIRECTION:+ # c_g = |sum_t w_t v_{t,g}| / sum_t w_t |v_{t,g}| in [0,1]+ # w_t = n_t/n_out. c_g -> 1 when all types push gene g the same way+ # (a coherent program, likely to extrapolate), c_g -> 0 when types+ # cancel (gene moving in opposing directions across lineages -> the+ # per-cell decode cannot trust a single sign). Damping v by+ # c_g**CONS_W suppresses incoherent genes and sharpens de_direction,+ # the weakest expression_change metric. CONS_W=0 disables (parent).+ if CONS_W > 0:+ cnt_out = np.bincount(uidx, minlength=utypes.size).astype(np.float64)+ w_t = cnt_out / max(cnt_out.sum(), 1.0) # (n_types,)+ num = np.abs(w_t @ Vs) # (g,)+ den = (w_t @ np.abs(Vs)) + 1e-12+ coh = np.clip(num / den, 0.0, 1.0)+ sum_before = float(np.abs(Vs).sum())+ Vs = Vs * np.power(coh, CONS_W)[None, :]+ sum_after = float(np.abs(Vs).sum())+ if CONS_NORM and sum_after > 0:+ Vs *= sum_before / sum_after+ print(f"[diag] consistency CONS_W={CONS_W} norm={int(CONS_NORM)} "+ f"coh_med={np.median(coh):.3f} "+ f"vsum {sum_before:.0f}->{sum_after:.0f}"+ f"{'->%d (renorm)' % sum_before if CONS_NORM else ''}",+ file=sys.stderr)+ shift_t = np.power(2.0, alpha * Vs) # (n_types, g) Xs = Y0 * shift_t[uidx] # node-24 per-cell renormalization in linear CP10k space@@ -275,7 +384,11 @@ def main() -> None: f = np.power(T0 / np.maximum(T1, 1e-12), GAMMA_RENORM) Xs = np.log1p(np.expm1(np.clip(Xs, 0, 20.0)) * f[:, None]) Xs = np.clip(Xs, 0.0, None)- print(f"[diag] pertype cells_without_velocity={unknown} "+ print(f"[diag] pertype gate={gate_mode}"+ f"{f' zmin={Z_MIN} zk={Z_K}' if gate_mode == 'z' else f' k={k_soft}'}"+ f" kept_pairs={n_keep_z} (fixed-k0.7 would keep {n_keep_fk}) "+ f"sum|v_soft|={np.abs(Vs).sum():.0f} "+ f"cells_without_velocity={unknown} " f"shift_absmax_log2={np.abs(alpha * Vs).max():.3f}", file=sys.stderr) pb_intended = None # guard skipped for the pertype decode
调研来源?调研员查到并用到的知识条目和文献检索结果(只列标题和编号)。
用到的知识库条目
| 编号 | 标题 | 出处 |
|---|---|---|
| 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 |
| k026 | Canonicalise predicted 3D coordinates before submission | notes/pitfalls/04_scorer_invariance.md |
分析结果?分析员写的 ANALYSIS.json:改了什么、各组分数怎么变、假设是否成立、经验和下一步建议。
| 改了什么 | 实现并测试了 PLAN 的 SE 自适应 z 门控(替换固定 k=0.7),18 次配对查分(z 替换 4 档、z 否决 4 档、跨型一致性加权 2 档、ε 重扫 4 档、V_CAP/k 边缘 2 档)全部 ≤ 父节点同半 54.87;机制被证否,按 NO_CHANGE 规则提交,默认输出与父节点 26 逐位相同(fixed k=0.7),证否代码仅由 env 开关保留。 |
|---|---|
| 各组分数的变化 | cell_state:噪声内(逐位相同):56.82→56.82,mmd_u 0.0473、variogram 0.04147 不变 expression_change:噪声内(逐位相同):54.93→54.93,de_score 0.1528、de_direction 0.1961 与父节点完全一致 local_spatial:噪声内(逐位相同):58.62→58.62,neighborhood_mmd 0.07958 不变 shape_scale:噪声内(逐位相同):50.00→50.00,坐标冻结恒为地板 |
| family_id | T2HX-04 |
| 假设是否成立 | 否 |
| 经验 |
|
| mechanism_active | 是 |
| 下一步建议 |
|
对话摘要?每个角色和大模型对话的统计:轮数、工具调用、用时、token 数和最后的回答摘录;原始记录只给路径。
只给统计和最后回答的摘录;完整对话请到原始记录位置里列出的文件看。
分析员
| 角色?调研员写计划、工程师改代码、分析员解读分数、审查员检查作弊。 | 分析员 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数?大模型一共回复了几轮(每轮可以调用多个工具)。 | 2 |
| 工具调用?大模型调用读文件、执行命令等工具的次数,按工具名统计。 | 共 1 次:write 1 |
| 用时 | 不到 1 分 |
| token 数?输入 / 输出(含思考)的 token 数,来自接口返回的用量。 | 输入 21,588 · 输出 1,376 · 思考 204 |
| 任务(第一行) | 分析节点 n28 的打分结果,写 ANALYSIS.json |
| 最后的回答(摘录) | ANALYSIS.json written |
| 原始记录位置?完整对话记录在 Spark 上的文件路径;看板不复制原始内容。 | /home/spark-longxinyang/vec/runs/formal/20261003-172000-search-t2-heart-extrap-chain-12h/nodes/28/analyst.jsonl 6 KB /home/spark-longxinyang/vec/runs/formal/20261003-172000-search-t2-heart-extrap-chain-12h/nodes/28/analyst.stderr |
工程师
| 角色 | 工程师 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数 | 50 |
| 工具调用 | 共 50 次:bash 33、edit 14、write 2、read 1 |
| 用时 | 25 分 |
| token 数 | 输入 105,886 · 输出 21,572 · 思考 22,592 |
| 任务(第一行) | 按计划修改程序:SE自适应z分数速度门控替换固定软阈值(父26表达变化组) |
| 最后的回答(摘录) | Done. Summary: **做了什么**:实现 PLAN 的 SE 自适应 z 门控(PLAN 原 SE 公式命中其风险 1——79% 条目 SE>1,按预案改用 clean delta-method SE,中位 0.095),并测了 z 替换(zmin/zk 4 档)、z 否决(4 档)、备选机制跨型一致性加权(2 档)、ε 联合重扫(4 档)、V_CAP=1.5 与 k=0.75(2 档),共 18 次配对查分。 **查分结果**:父节点同半对照 54.87;所有 14 个配置 ≤ 对照——z 替换最好 54.84(等幅度下 de_direction 0.174<0.1998),z 否决单调不升(z≥6 时 de_dir 0.2098 全表最高但 de_score 反掉),一致性加权把 de_dir 拉到 0.163/0.142,ε 重扫全负。机制证否,按规则提交 NO_CHANGE:默认输出与父节点 26 逐位相同(已验证),`--ablate mechanism` → α=0 逐位等于节点 23 基座,seed 0/1/2、伪装视图(时间+1、键序打乱、改名)、单输入退路、vec-check 全部通过。 **下一步最值得试**:门控层已证实是 ±0.3 的宽平台,别再扫。k=0.75 显示 expr 组可到 55.06(de_dir 0.2041)但 mmd/nbh 付代价——值得试"对 top-mover 基因子集加大位移、其余保持父幅度"的解耦解码,同时抬 expression_change 与 cell_state。 |
| 原始记录位置 | /home/spark-longxinyang/vec/runs/formal/20261003-172000-search-t2-heart-extrap-chain-12h/nodes/28/engineer.jsonl 267 KB /home/spark-longxinyang/vec/runs/formal/20261003-172000-search-t2-heart-extrap-chain-12h/nodes/28/engineer.stderr |
调研员
| 角色 | 调研员 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数 | 1 |
| 工具调用 | 共 0 次:— |
| 用时 | 2 分 |
| token 数 | 输入 21,176 · 输出 1,584 · 思考 5,777 |
| 任务(第一行) | 为节点 n28(改进,父节点 n26)写改进计划 PLAN.json |
| 最后的回答(摘录) | _anchor_t · pb_anchor²_{t,g}·ln²2) + var_prev_{t,g}/(n_prev_t · pb_prev²_{t,g}·ln²2),其中var是型内细胞在log2空间的方差(用np.var on log2(x+1e-9)的型内值)。这比Poisson假设更稳健,直接从数据现场计算。\n2. **z分数门控**:z_{t,g} = |v_{t,g}| / SE_{t,g}。保留条件:z ≥ z_min(初值2.0,扫描{1.5, 2.0, 2.5, 3.0})且|v|≤V_CAP=2.0(保留上限防极端值)。\n3. **z空间软阈值**:通过z门控后,v_soft = sign(v)·(|v| − SE·z_k),z_k是z空间软阈值(初值1.0,扫描{0.5, 1.0, 1.5})。等价于只保留超过z_k个标准误的部分,阈值随SE自适应。SE=0时(理论上不会,但数值保护)回退到固定k=0.7。\n4. **其余管线不变**:α=1.0、γ=0.6、ε=0.6、2步扩散、坐标/组成/行序冻结均继承父节点。\n5. **联合ε重扫(次要)**:提交最优z门控后,在固定z参数下扫ε∈{0.3, 0.45, 0.6, 0.75}×步数{1, 2},检验速度位移后最优平滑是否偏移(ANALYSIS建议1)。仅当ε变化带来>1分时才改。\n6. **单输入退路**:只有一个输入阶段→无速度→α=0→逐位回退节点23基座,与父节点相同。\n7. **vec-score快速筛选**:先跑z_min=2.0/z_k=1.0,看de_direction是否≥0.20(父值0.196);若de_direction<0.18(劣于父),立即止损回退父参数。查分≤8次:4次z门控网格 + 1次最优确认 + 1次ablate对照 + 2次ε重扫。",
"expected_groups": ["expression_change", "cell_state"],
"risks": "1) SE估计不准:型内细胞数少(~30)时方差估计本身噪声大,z分数可能不稳定。Engineer应检查SE分布:若>50%的(型,基因)对SE>1(即z普遍<1),说明SE估计过保守,需换更简单的SE(如仅用pb和n的delta method)。2) 改善在噪声内:T2噪声~1分,若总分提升<1.5需复查确认。3) z门控过严导致过多基因被清零→dp幅度不足→重新触发无变化保护(std(dp)<1%×std(dt))。Engineer应在第一次查分后检查std(dp)是否>0.01。4) 过度拟合A半:z参数扫描应在宽平台中心取点,不追argmax。",
"family_id": "T2HX-04",
"mechanism": "用型内细胞间方差估计每个(型,基因)速度的标准误,将固定软阈值k=0.7替换为z分数自适应门控:高信噪比的速度(大类型、高表达基因)保留更多,低信噪比的速度(小类型、低表达基因)被更严格过滤,阈值随测量精度自适应。",
"vs_constant_shift": "常数位移对每个基因施加相同方向和幅度,不区分测量可靠性;本机制按(型,基因)的测量精度差异化处理——同一个速度值,在大类型(低SE)中保留、在小类型(高SE)中被衰减或清零,输出是细胞类型和基因特异的,不是全局统一的。",
"mechanism_evidence": "1) 对比固定k=0.7与自适应z门控下的de_direction/de_score raw值,自适应应≥固定(预期de_direction从0.196→0.21+)。2) 统计自适应门控实际改变的速度条目数:应比固定k=0.7多出大类型中小速度条目(|v|<0.7但z>2),减少小类型中噪声条目(|v|>0.7但z<2)。Engineer打印两组门控下过门(型,基因)对数量和对称差集大小。3) spearman(dp, dt_approx)应从父的0.49提升。4) 四组分各自变化:expression_change应改善,cell_state和local_spatial不应恶化超过噪声。",
"mechanism_off_control": "同一程序加`--fixed-k 0.7`标志→跳过SE计算和z门控,回退到父节点的固定软阈值k=0.7(其余管线不变),预期输出与父节点26逐位相同(np.array_equal验证)。`--ablate mechanism`→α=0→逐位等于节点23基座。两层对照分离:adaptive vs fixed-k隔离z门控贡献;fixed-k vs ablate隔离速度机制贡献。",
"sources": []
} |
| 原始记录位置 | /home/spark-longxinyang/vec/runs/formal/20261003-172000-search-t2-heart-extrap-chain-12h/nodes/28/researcher.jsonl 6 KB /home/spark-longxinyang/vec/runs/formal/20261003-172000-search-t2-heart-extrap-chain-12h/nodes/28/researcher.stderr |
审查员
| 角色 | 审查员 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数 | 8 |
| 工具调用 | 共 10 次:read 5、bash 4、write 1 |
| 用时 | 1 分 |
| token 数 | 输入 26,684 · 输出 1,449 · 思考 1,301 |
| 任务(第一行) | 审查节点 n28 的程序是否越界读取、写死目标、钻评分器漏洞 |
| 最后的回答(摘录) | REVIEW.json written |
| 原始记录位置 | /home/spark-longxinyang/vec/runs/formal/20261003-172000-search-t2-heart-extrap-chain-12h/nodes/28/reviewer.jsonl 118 KB /home/spark-longxinyang/vec/runs/formal/20261003-172000-search-t2-heart-extrap-chain-12h/nodes/28/reviewer.stderr |