总览 · ← 返回运行 20261003-172000-search-t2-heart-extrap-chain-12h
节点 n26
节点23空间平滑基座上叠加按型log2速度软阈值乘法外推(α=1、k=0.7)与逐细胞线性总量回拉(γ=0.6);坐标、组成、细胞数、行序冻结。
| 运行?一次完整的自动搜索或 Agent 会话,有自己的锁定配置和证据包。 | 20261003-172000-search-t2-heart-extrap-chain-12h |
|---|---|
| 父节点 | n23 |
| 子节点 | n28 |
| 操作?种子:人写的起点;改进:在父节点上改;草稿:从头写;修复:修父节点的报错。 | 改进 |
| 状态 | 已打分 |
| 分数 | 搜索目标分 55.09(+4.5) · proxy_noscale 55.09(+4.5) · 3 次复测均分 55.11 |
| 审查 | 通过 检查项1(越界读取):未发现问题。run.py 仅通过 view_io 的 load_manifest/read_stage/panel_genes 读取 --data 目录下的视图输入(E8.25_late.h5ad、E8.75.h5ad),无绝对路径、..、/mnt、/home、data/raw、downloads、打分器或 src/common/evaluation 读取;external/ 数据在 METHOD.md 中明确声明未使用,代码中无引用;无联网下载。; 检查项2(硬编码目标统计量):未发现问题。所有常量(EPS=0.6、STEPS=2、ALPHA=1.0、K_NN=15、… |
| 用时?从运行开始到结束(或到现在)的挂钟时间。 | 34 分 |
| 程序版本 | dcafeb5ba7d16614d509e77260d3000d83090b27 (programs.git) |
方法说明?节点程序自带的 METHOD.md:这个程序做了什么、为什么。
来自 programs.git dcafeb5ba7:solution/METHOD.md
节点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):
- 按型速度:取视图内最后两个输入阶段(
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)。 - 软阈值:
v → sign(v)·max(|v|−k, 0),k=0.7,只保留有把握的强运动基因(k 是关键调参:噪声级小速度被清零,见下表 k 梯度)。 - 逐细胞乘法位移:
x'_{i,g} = x_{i,g} · 2^(α·v_soft_{t(i),g}),α=1(把上一个观测步的方向延续一步;纯乘法极限:零保持零、无需 clip)。作用在"平滑+精确复原"后的矩阵上。 - 逐细胞总量回拉(节点 24 配方):线性 CP10k 空间
T=Σ_g expm1(x_g),f_i=(T_i^orig/T_i^new)^γ,γ=0.6,x''=log1p(expm1(x')·f_i)。把每个细胞的文库总量部分拉回其自身原值(CP10k 不变量),防止位移把细胞整体推离真值流形。 - 单输入退路:视图只有一个输入阶段时 α 强制为 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)
- de_direction raw 0 → 0.1998(脱离无变化保护:std(dp)=0.173,远超 1% 阈值)✓
- de_score raw 0 → 0.1528 ✓
- neighborhood_mmd raw 0.10679(父 A 半)→ 0.08316,优于 PLAN 要求的 ≤0.107 ✓
- spearman(dp, v̄) = 0.49 > 0.3 ✓(500 基因全 gene 集)
- 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/)未使用。
调研员的计划
| 名称 | 空间平滑+速度引导部分伪批量恢复(解锁DE组) |
|---|---|
| 动机 | 父节点23的local_spatial +1.88(nbh raw 0.1126→0.1045)和cell_state +0.60(mmd_u 0.0586→0.0549)已验证,但expression_change恒为50.00(de_score/de_direction raw=0),因逐基因列缩放精确复原伪批量使dp≡0。节点21/24证明按型乘法速度外推可让de_direction达0.2068、de_score达0.1111(节点24),是+4分级别的增益来源。本节点修复的结构问题:将'精确复原到原始伪批量'替换为'复原到速度引导的微移目标伪批量',在保留空间平滑邻域收益的同时给DE提供受控方向信号。 |
| 做法 | 步骤:(1) 基座不变:anchor=末观测输入,分层抽样,表达/坐标原样。(2) 空间平滑不变:坐标15-NN图,2步ε=0.6,支撑掩码(只动x>0),得Y_smooth。(3) 计算速度:读两个输入阶段(prev和anchor),逐细胞类型算伪批量log2速度 v_g,t = log2(pb_anchor_g+1) − log2(pb_prev_g+1);再按输出中每个细胞的类型分配,得逐细胞速度向量 v_i,g。(4) 计算目标伪批量:pb_target_g = pb_orig_g × 2^(α·v̄_g),其中 v̄_g = Σ_t (n_t/n)·v_g,t 是组成加权平均速度(逐基因标量)。(5) 部分恢复:Y_final = Y_smooth × (pb_target / pb_smooth) 逐基因列缩放。α=0时退化为节点23精确复原(消融态)。(6) 保零模式:列缩放后仍只在原始支撑上保留非零值(Y_final[mask==0]=0),缩放后重新归一化到pb_target。(7) 单输入阶段退路:若视图只有一个输入阶段(无法算速度),自动回退α=0,输出逐位等于节点23。(8) vec-score快筛:先跑α∈{0.05,0.1,0.2,0.3,0.5}×1次,看de_direction raw是否>0.01(脱离无变化保护)且nbh raw不劣于0.107;选最优α后复跑确认。(9) 可选第二步(主机制验证后):若variogram raw恶化>0.002,对列缩放因子做方差修正 s_g←s_g^0.85(轻度压缩极端缩放),重查一次。 |
| 风险 | 1) α过小时std(dp)<1%×std(dt)仍触发无变化保护,DE保持0——Engineer应先诊断std(dp)/std(dt)比值,确认α=0.1时比值>0.01,否则直接跳到α=0.3。2) 速度方向在A半真值上可能与实际变化方向不一致(外推榜的dt不完全等于速度延续),表现为de_direction为负——若de_direction<-0.01,止损回退α=0。3) 列缩放到非原始目标可能轻微恶化mmd_u(节点23的教训是缩放因子中位5.4时0.16%条目越界)——监控mmd_u raw,若>0.056则降α。4) 伪装视图测试:速度计算只用视图内两个阶段的表达,不读绝对时间名,应time-free;Engineer须在伪装视图上验证输出逐位相同。 |
代码改动?这个节点的程序和父节点程序的逐行差别:绿色是新增,红色是删除。
对比:父节点版本 d9a9fb210f。改动的文件:solution/METHOD.md +57 −51、solution/README.md +19 −11、solution/run.py +217 −88
diff --git a/solution/METHOD.md b/solution/METHOD.mdindex 68f2421..1e9d6cb 100644--- a/solution/METHOD.md+++ b/solution/METHOD.md@@ -1,72 +1,78 @@-锚阶段表达在坐标15-NN图上做2步扩散平滑(ε=0.6,只动实测正值、保零模式),逐基因列缩放精确复原伪批量;坐标、组成、细胞数、行序全部不变,DE恒处无变化保护区。+节点23空间平滑基座上叠加按型log2速度软阈值乘法外推(α=1、k=0.7)与逐细胞线性总量回拉(γ=0.6);坐标、组成、细胞数、行序冻结。 -# 方法(family T2HX-04,节点 23,父节点 22 = copy_last 50.00)+# 方法(family T2HX-04,improve 自节点 23) -## 提交态机制(run.py 默认,无环境变量时即此态)+**基座(= 节点 23 提交态,逐位继承)**:anchor=末观测输入,n 夹到 [min_cells, max_cells]、`take` 分层、行序排序;表达在坐标 15-NN 图上做 2 步支撑掩码扩散(ε=0.6,`Y←clip(Y+ε(WY−Y),0)`,残差只施加在原始 x>0 条目上,零模式逐位保留);随后逐基因列缩放**精确复原**伪批量。坐标不动 → 形状三项逐位不变。 -基座与父节点逐位相同:anchor = `anchor_entry(manifest)`(末观测输入),n 夹到-[min_cells, max_cells],`take` 按 celltype 分层,表达/坐标原样。本代理视图 anchor n=24,826 ≤-max_cells=25,179 → 全量输出、行序=原序、无抽样(seed 不影响输出;机制不消耗随机数)。+**机制(本节点新增,α≠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(已在模拟单输入视图上实测通过)。 -在基座之上做**空间图扩散 + 伪批量复原**(`smooth_expression`, mode=`pbrestore`):+**提交参数**:ε=0.6、2 步;α=1.0、k=0.7、γ=0.6;门控 (30, 0.05, 2.0)。全部为固定常数或从视图输入现场计算,无任何来自已发布/保留阶段的数值。 -1. 输出细胞在自己的坐标上建 15-NN 图(含自身,cKDTree;与评分器 neighborhood_mmd 的邻域定义一致),W = 行归一化均值算子。-2. 扩散 STEPS=2 步:`Y ← clip(Y + ε·(W·Y − Y), 0)`,ε=0.6;残差**只施加在原始实测支撑(x>0)上**,零模式逐位保留(避免 full 模式的变差图毒性,见下)。-3. 一次逐基因列缩放复原伪批量:`Y ← Y · (colsum(X)/colsum(Y))`。由此 dp = pb(pred) − pb(ref) 与 copy_last 基座**完全相同**(实测 max|Δpb| = 1.5e-9),DE 两项恒为 raw 0(无变化保护与基座同态),ε 不再受 PLAN 的 std(dp)≤0.003 预算约束——该预算约束在 keepzero 解码下把 ε 压到 0.0133,是本节点找到的解锁点。-4. PLAN 第 5 步的逐基因 |dp_g|>0.1 回退保留为保险(复原精确,从未触发,genes_reverted=0)。+# 消融对照(mechanism_off_control) -坐标、细胞集合、行序、细胞类型组成不变 → d2_shape / occupancy_dice / scale_log_ratio 逐位不变(所有查分中三项 raw 恒为 0.04891 / 0.8148 / −0.4375),结构门恒为 1。+`--ablate <任意名>` → α=0 → 位移与回拉整块跳过,列缩放退化为精确复原,**输出逐位等于节点 23 提交态**(已用 `np.array_equal` 对父程序输出比对:X、坐标、基因序全同)。消融态 A 半 = 父节点 50.58;开启态 A 半 54.87。mechanism_active 必为 yes。 -`--ablate <任意名>` → ε=0,走同一代码路径但不进扩散分支,输出**逐位等于 copy_last**(已对父节点输出做逐位比对,X 与坐标全部相等)。+# 机制生效证据(对照 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 显著为正 → 速度方向与真值变化方向一致,机制生效 ✓ -- 同一微环境中的细胞共享旁分泌信号与形态发生素梯度,相邻细胞的状态相互耦合;对单细胞表达做 kNN 图扩散去噪是已发表的标准算子(MAGIC,van Dijk et al., Cell 2018,doi:10.1016/j.cell.2018.05.061)。本方法把该算子跑在**空间** kNN 图上,并做库大小(列和)复原,使平均表达不产生任何虚假的"变化"信号。这是通用机制知识,不含任何保留阶段/保留基因型的测量值;程序中没有来自已发布阶段的常数(列缩放因子、邻域图、残差全部由视图内输入现场计算)。-- 未使用视图外数据、external/、prior/;未读任何阶段时间(机制 time-free),伪装视图(时间平移 +1、manifest 键序反转、路径变更、seed 3)输出与真实视图逐位相同(已实测)。+**实际改变了哪些细胞**:平滑层改动全部 24,826 个细胞的支撑内条目(absmean_dcell 0.128);速度层再改 24,788 个细胞(38 个无速度类型细胞只含平滑改动),改动仍限于原始支撑(零模式不变,nnz 10.5%)。 -## 查分记录(vec-score T2:heart:val_extrap/proxy_noscale,A 半,共 14 次,余 6)+**四组分变化(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(坐标冻结,逐位不变)。 -本环境基线(base=copy_last,查分 #1):50.000,nbh raw 0.11445、mmd_u 0.05856、variogram 0.058616、shape 0.04891/0.8148/−0.4375,八项 skill 全 0.500。(官方运行环境的地板 raw 是 0.1126 等,与此处 A 半锚略有差别;下面一律用**同环境配对差**读数。)+**层分解**(同一 A 半):copy_last 50.00;仅平滑(父)50.58;仅速度(ε=0 探针)53.65;平滑+速度 54.87 ≈ 两层收益相加。 -| # | 解码 / 幅度 | 榜分 | nbh raw (pts) | mmd_u raw | variogram raw | 备注 |-|---|---|---:|---|---|---|---|-| 2 | full ε=0.02(PLAN 原解码,全支撑) | 49.267 | 0.11461 (12.49) | 0.05947 | 0.072491 | 触发 PLAN 步骤 8 止损:nbh 变差、variogram 严重受损(零点被填密,nnz 10.5%→42.2%)→ PLAN 原机制按原解码**证否** |-| — | full ε=0.005 | 未查分 | — | — | — | 本地诊断:任何 ε>0 的 full 模式 nnz 均跳到 42.2%,变差图毒性与幅度无关,弃 |-| 3 | keepzero(支撑掩码,无复原;ε=0.02/0.05 均被 DP 预算压到 ε_eff=0.0133) | 50.052 | 0.11371 (12.54) | 0.05851 | 0.05846 | 三项全微升:方向为正但幅度被预算锁死 |-| 4 | pbrestore 1 步 ε=0.15 | 50.117 | 0.11215 (12.63) | 0.05818 | 0.059191 | |-| 5 | pbrestore 1 步 ε=0.4 | 50.335 | 0.10881 (12.82) | 0.05728 | 0.059559 | |-| 9 | pbrestore 1 步 ε=0.55 | 50.449 | 0.10733 | 0.05659 | 0.059736 | |-| 6 | pbrestore 1 步 ε=0.7 | 50.532 | 0.10654 (12.95) | 0.05584 | 0.059837 | nbh 谷底附近 |-| 8 | pbrestore 1 步 ε=0.85 | 50.558 | 0.10682 | 0.05515 | 0.059763 | |-| 7 | pbrestore 1 步 ε=1.0 | 50.487 | 0.10889 | 0.05478 | 0.059232 | nbh 回弹(列缩放 s_g 中位 5.4 过度畸变) |-| 10 | pbrestore 1 步 ε=0.85, k=30 | 50.530 | 0.10699 | 0.05550 | 0.059724 | k=15(评分器邻域定义)不劣于 k=30 |-| 11 | **pbrestore 2 步 ε=0.6(提交态)** | **50.582** | 0.10679 (12.93) | 0.05487 (6.44) | 0.059636 (6.21) | local 51.73 / cell_state 50.59 / 其余 50.00 |-| 12 | pbrestore 3 步 ε=0.45 | 50.594 | 0.10669 | 0.05479 | 0.059600 | 与 2 步 0.6 差 0.012=噪声;取更简单的 2 步 |-| 14 | pbrestore 2 步 ε=0.7 | 50.527 | 0.10824 | 0.05466 | 0.059301 | 平台右缘确认 |-| 13 | mupos ε=1.0(向"邻域正值均值"扩散,无通胀) | 49.901 | 0.11511 (劣于基线) | 0.05877 | 0.058902 | 对照解码:温和的、保幅度的平滑**无效偏负**;增益来自强扩散(邻域均值主导)+列复原的组合 |+# 查分记录(19/20 次,全部 A 半 proxy_noscale;shape 三项恒 50.00) -剂量-反应平滑单峰、平台(1s0.7–0.85、2s0.6、3s0.45 都在 50.53–50.59),与 node5/15 那种 occupancy 单点尖峰(抽样伪影、从未复现)形态不同;nbh 与 mmd_u 两条 raw 曲线随扩散强度**单调**下行到各自谷底,方向一致。+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)。 -PLAN 提交门槛核对(A 半,输出对 seed 确定 → "3 种子均值"=单值):50.582 > 50.5 ✓;nbh raw 0.10679 < 0.1120 ✓;shape 三项逐位不变 ✓。按门槛提交机制开启态(非 ε=0 对照态)。+| # | 解码 | α | 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 | -## 机制生效证据(PLAN mechanism_evidence 逐项)+响应面平滑单峰: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)。 -1. neighborhood_mmd raw:环境地板 0.11445 → 提交态 0.10679(skill 0.500→0.517,local_spatial 组 50.00→51.73)。-2. std(dp):提交态实测 2.8e-10(列复原后 pb 与基座逐基因相同,max|Δpb|=1.5e-9,float32 舍入级)≪ 0.003 预算;de_score / de_direction raw 在全部 14 次查分中恒为 0。-3. mmd_u raw 0.05856→0.05487(改善);variogram raw 0.058616→0.059636(+0.0010,恶化 −0.09 pts,来自列缩放对成对差的轻微放大;full 模式的 +0.0139 毒性已通过支撑掩码消除)。-4. shape 三项 raw 在所有查分中逐位相同(坐标未动):d2_shape 0.04891、occupancy_dice 0.8148、scale_log_ratio −0.4375;结构门恒 1。-5. 被改变的细胞:不是只动空间孤立点——这是全场变换,全部 24,826 个细胞的实测正值都移动(per-cell |Δ| mean 0.128、p99 2.52、max 11.1);移动最大的行(21401、14896、21403…)位于表达高频起伏的密集组织区而非孤立点。四组分变化:expression_change +0.00、shape_scale +0.00、cell_state +0.59、local_spatial +1.73(A 半配对)。+# 与 PLAN 的偏离 -## 已验证 / 未验证+PLAN 指定 colscale 解码为主机制;实测其 DE 方向信号为零(#1,de_dir −0.004),按 §5 在同一速度场上换解码(pertype,即节点 21/24 已验证的乘法家族)后机制生效。机制族(速度引导的部分伪批量恢复 + 空间平滑保邻域)、门控、消融定义均按 PLAN;解码由"逐基因列缩放"改为"按型逐细胞乘法+总量回拉",属解码偏离,与父节点 23 的偏离先例同类。v̄_g(组成加权)仍计算并用于诊断(spearman 证据)。 -已验证:ε=0 逐位=父节点;seed 0/3/7 输出相同(机制无随机性,本视图 take 返回全量);伪装视图逐位不变;vec-check ok(默认态与 ablate 态);运行 2.0s / 峰值内存 0.83GB(限额 30min / 28GB);纯 CPU(EXECUTION.json gpu:false)。+# 验证过 / 未验证 -未验证 / 风险:-- B 半与正式分的迁移:+0.58 低于 T2 单读数噪声带(~1),依赖的是配对确定性下的系统性方向;剂量曲线平滑单峰,比尖峰类伪影可信,但 B 半可能缩水。终选护栏要求 > copy_last +1,本机制**大概率过不了护栏**(预期 +0.5~0.6),届时按规则回退基线——这是搜索树层面的收益(首个非伪影正方向),不是终选收益。-- 输出值域:强扩散+列复原后 0.16% 条目超出 log1p(CP10k) 原始上限 9.21(max 17.4)。契约只要求有限、非负;这是扩散类去噪输出离开原始量纲的固有性质(MAGIC 同),非评分器漏洞,但审查者应知悉。若判不可接受,退一档用 1 步 ε=0.4(50.335,max 9.9,仅 9 个条目越界)。-- final 视图若 anchor 细胞数 > max_cells:扩散在分层子样本上运行(密度更低、邻域更宽),机制不变但幅度未实测。-- 单输入视图:机制 time-free、只需坐标+表达,自然可跑(未在本 run 实测单输入视图)。+**已验证**:`--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 次查分额度未用。 -1) variogram 的 −0.09 是可回收项:在列复原后做保 pb 的轻度方差整形;2) 扩散强度的逐基因/逐类型自适应(高噪声基因多扩散);3) 与组成信息正交组合的空间前沿加权(发育前沿细胞扩散少、后方多);4) 在 B 半不可见的前提下,勿再对 A 半平台内部做 <0.05 的峰值追逐(噪声拟合)。+**风险提示(审查者需知)**:列复原+乘法位移使部分条目超出 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/)未使用。diff --git a/solution/README.md b/solution/README.mdindex abc55df..ff2a8d4 100644--- a/solution/README.md+++ b/solution/README.md@@ -1,14 +1,22 @@-# 空间邻域表达扩散 + 伪批量复原(T2HX-04)——提交态:机制开启+# 空间平滑 + 按型速度软阈值乘法外推 + 总量回拉(T2HX-04)——提交态:机制开启 -`run.py` 默认态 = copy_last 基座(anchor=末观测阶段,n 夹到 [min_cells, max_cells],`take`-分层,行序排序)之上做 2 步空间图扩散:`Y ← clip(Y + 0.6·(W·Y − Y), 0)`,W=坐标 15-NN-均值算子,残差只施加在原始实测支撑(x>0)上(零模式逐位保留),最后一次逐基因列缩放-精确复原伪批量(dp 与基座逐位相同 → DE 两项恒受无变化保护)。坐标、组成、细胞数、行序不变。+`run.py` 默认态 = 节点 23 基座(copy_last 锚阶段,n 夹到 [min_cells, max_cells],`take` 分层,+坐标 15-NN 图 2 步支撑掩码扩散 ε=0.6,逐基因列缩放精确复原伪批量)之上叠加速度层: -A 半配对实测(本环境基线 50.000):提交态 50.582,neighborhood_mmd raw 0.11445→0.10679,-mmd_u 0.05856→0.05487,variogram 0.058616→0.059636,shape 三项逐位不变。全部 14 次查分-与剂量-反应表见 METHOD.md。+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 配方)。 -- `--ablate <任意名>`:ε=0,输出逐位等于 copy_last(已对父节点输出逐位比对)。-- `VEC_EPS` / `VEC_STEPS` / `VEC_MODE` / `VEC_KNN`:仅供探针复现(pbrestore / keepzero / full 三种解码)。-- 纯 CPU(EXECUTION.json gpu:false);机制 time-free、不消耗随机数,seed 与伪装视图下输出逐位相同(已实测)。+坐标、组成、细胞数、行序冻结 → 形状三项逐位 = 地板。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 天)下输出逐位相同(已实测)。diff --git a/solution/run.py b/solution/run.pyindex 86b8e3c..1b5a6b3 100644--- a/solution/run.py+++ b/solution/run.py@@ -1,41 +1,56 @@ #!/usr/bin/env python3-"""T2 extrapolation: spatial-neighborhood expression diffusion on the-copy_last anchor output, pseudobulk-restoring (family T2HX-04, PLAN node 23).--Base (identical to copy_last / mechanism-off control): anchor = last observed-stage, n clipped to [min_cells, max_cells], stratified-by-celltype sampling via-``take``, expression and coordinates passed through unchanged.--Mechanism (eps != 0; eps = 0 -- the ``--ablate`` state -- is bitwise the-copy_last base, same take and same rng stream):- 1. Build the 15-nearest-neighbor graph of the OUTPUT cells on their own- coordinates (same neighborhood definition as the scorer's- neighborhood_mmd: 15 nearest neighbors including self, cKDTree).- 2. Diffuse expression toward the neighborhood mean, S steps of- Y <- clip(Y + eps * (W Y - Y), 0), applied ONLY to measured entries- (Y > 0 on the original support); the zero pattern is preserved, so the- variogram is spared the densification toxicity measured for unmasked- smoothing (A-half: full-mask eps=0.02 variogram 0.0586 -> 0.0725).- 3. Restore the pseudobulk exactly with one per-gene column scaling- s_g = sum_i(X_ig) / sum_i(Y_ig). dp (pb pred - pb ref) is therefore- bitwise the copy_last base -> the DE no-change protection holds for any- eps, and no constant is taken from published stages.- 4. Per-gene guard: any gene whose induced |dp_g| > 0.1 is reverted- (never triggered by the exact restoration; PLAN step 5 kept as a bound).- 5. Coordinates, cell set, row order and composition are untouched, so every- shape/scale metric is bitwise unchanged; only expression moves, and each- cell moves toward its own spatial neighborhood mean (spatially- heterogeneous direction and magnitude, unlike a constant shift).--Biology: one microenvironment shares paracrine signals, so neighboring cells'-expression states are coupled; the same operator is the standard one-step-graph-diffusion denoiser for single-cell data (MAGIC-style, van Dijk et al.-2018, doi:10.1016/j.cell.2018.05.061), here run on the SPATIAL kNN graph with-library-size restoration. No external data, no stage-derived constants.--View-independent: no absolute stage names/times are read (the mechanism is-time-free); everything is computed from the view's own cells. Deterministic-given --seed (the mechanism consumes no randomness).+"""T2 extrapolation: spatial-neighborhood diffusion (node-23 base) + velocity-+guided partial pseudobulk restoration that unlocks the DE group (family+T2HX-04, PLAN node 26).++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+coordinates-15-NN graph, Y <- clip(Y + eps*(WY - Y), 0) with eps=0.6 applied+only to originally measured entries (x>0; zero pattern preserved), followed by+per-gene column scaling that restores the anchor pseudobulk EXACTLY -> dp = 0+-> DE no-change protection, coordinates/composition/row order untouched.++Mechanism (alpha != 0): the column-scaling restoration target is no longer+the anchor pseudobulk but a velocity-tilted one,++ pb_target_g = pb_anchor_g * 2**(alpha * vbar_g),+ vbar_g = sum_t (n_t/n) * v_{t,g} (output-composition-weighted)+ v_{t,g} = log2(pb_anchor_{t,g}) - log2(pb_prev_{t,g}) (per cell type)++computed from the two input stages' own pseudobulks (hard gates: type present+with >= MIN_TYPE_CELLS cells in both stages; gene pb >= GENE_FLOOR in both;+|v| <= V_CAP). dp therefore carries the direction each gene moved over the+last observed step, continued by alpha steps -> de_score / de_direction can+leave the no-change floor. Two decodes of the same velocity field:++ pertype (SUBMITTED): exact restoration first, then per-cell multiplicative+ displacement x' = x * 2**(alpha * soft_k(v_{t(i),g})) (soft threshold+ k keeps only confidently moving genes) with node-24's per-cell+ renormalization pulling each cell's linear (CP10k) total back toward its+ own original total with power gamma; alpha=0 skips the block (bitwise+ node 23).+ colscale (PLAN's first decode; measured, kept for reproducibility): one+ per-gene column scaling of the smoothed matrix to pb_target (alpha=0+ bitwise = node 23 exact restoration). On the A half this decode left+ de_direction ~ 0 (composition-weighted averaging cancels the per-type+ direction signal) while pertype reached de_direction 0.20 -> pertype is+ the submitted decode; both share the same velocity field and gates.++Biology: transcriptional velocity of a cell type over an observed interval+(gene-wise log fold change of its pseudobulk) extrapolates the regulatory+programs acting over the next interval (lineage progression, signal-driven+TF cascades; the same per-type log-FC extrapolation validated in nodes+21/24). No external data, no constants from published/held-out stages; every+number is computed from the view's own inputs.++Single-input fallback: without a previous stage no velocity exists -> alpha+is forced to 0 and the output is bitwise node 23 (which is bitwise copy_last+under its own no-change protection).++View-independent: no absolute stage names or times are read; the mechanism is+time-free (alpha is a fixed damping constant, not a stage-derived number).+Deterministic given --seed (the mechanism consumes no randomness). """ from __future__ import annotations@@ -51,34 +66,41 @@ from scipy.spatial import cKDTree from src.task2_spatial.sample import take from src.task2_spatial.view_io import ( anchor_entry,+ extrap_step, load_manifest, panel_genes, read_stage, write_t2, ) -# Submitted state (A-half dose-response, see METHOD.md): 2 diffusion steps at-# eps=0.6 with per-gene pseudobulk restoration -> 50.58 (base 50.00).+# --- node-23 base (submitted state of the parent) ------------------------- DEFAULT_EPS = float(os.environ.get("VEC_EPS", "0.6")) DEFAULT_STEPS = int(os.environ.get("VEC_STEPS", "2"))-# Decode modes for the residual field r = mu_kNN - x (probing; the PLAN-# requires >=3 decode/magnitude combinations before invalidation):-# pbrestore - support-masked diffusion + exact per-gene pb restoration-# keepzero - support-masked, no restoration; eps capped by DP_BUDGET-# full - unmasked (densifies zeros; variogram-toxic, rejected) DEFAULT_MODE = os.environ.get("VEC_MODE", "pbrestore")-DP_BUDGET = 0.003 # std_g of induced pseudobulk change kept inside DE protection-GENE_REVERT = 0.1 # per-gene |dp_g| guard (PLAN step 5)-K_NN = int(os.environ.get("VEC_KNN", "15")) # scorer nbh def = 15 (incl. self)+DP_BUDGET = 0.003+GENE_REVERT = 0.1 # per-gene |unintended dp| guard (node-23 PLAN step 5)+K_NN = int(os.environ.get("VEC_KNN", "15"))++# --- velocity mechanism (this node) -----------------------------------------+# Submitted state (A-half dose-response, see METHOD.md): pertype decode,+# alpha=1.0, soft threshold k=0.7, renormalization gamma=0.6 -> 54.87+# (node-23 base 50.58, tree best node 24 54.13 on the same A half).+DEFAULT_ALPHA = float(os.environ.get("VEC_ALPHA", "1.0"))+DEFAULT_DECODE = os.environ.get("VEC_DECODE", "pertype") # colscale | pertype+MIN_TYPE_CELLS = int(os.environ.get("VEC_MINCELLS", "30"))+GENE_FLOOR = float(os.environ.get("VEC_GFLOOR", "0.05"))+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 -def smooth_expression(X: np.ndarray, coords: np.ndarray, eps: float, mode: str,- steps: int):- """Support-masked kNN-graph diffusion with exact pseudobulk restoration.+def diffuse(X64: np.ndarray, coords: np.ndarray, eps: float, mode: str,+ steps: int):+ """Support-masked kNN-graph diffusion (node-23 operator, no restoration). - Returns (X', diag). X is (n, g) float32 dense, coords (n, 3) float64.+ Returns (Y, diag). Y is float64, same zero pattern as X64 for masked modes. """- n = X.shape[0]+ n = X64.shape[0] k = int(min(K_NN, n)) tree = cKDTree(coords) _, idx = tree.query(coords, k=k)@@ -89,49 +111,70 @@ def smooth_expression(X: np.ndarray, coords: np.ndarray, eps: float, mode: str, (np.repeat(np.arange(n, dtype=np.int64), k), idx.ravel())), shape=(n, n), )- X64 = X.astype(np.float64)- mask = X64 > 0 # original measured support+ mask = X64 > 0 n_steps = max(1, int(steps)) if mode == "pbrestore" else 1- Y = X64.copy() eps_eff = eps scale = 1.0 std_dp_unit = 0.0 for _ in range(n_steps):- R = (W @ Y) - Y # residual toward neighborhood mean+ R = (W @ Y) - Y if mode != "full":- R = np.where(mask, R, 0.0) # never touch unmeasured zeros+ R = np.where(mask, R, 0.0) if mode != "pbrestore": std_dp_unit = float(R.mean(axis=0).std()) if abs(eps) * std_dp_unit > DP_BUDGET: scale = DP_BUDGET / (abs(eps) * std_dp_unit) eps_eff = eps * scale Y = np.clip(Y + eps_eff * R, 0.0, None)+ diag = {"eps": eps, "mode": mode, "steps": n_steps, "eps_eff": eps_eff,+ "scale": scale, "std_dp_unit": std_dp_unit}+ return Y, diag - if mode == "pbrestore":- # one per-gene column scaling restores the pseudobulk exactly, so dp- # (and hence the DE no-change protection) is the copy_last base.- col0 = X64.sum(axis=0)- colS = Y.sum(axis=0)- s = np.where(colS > 0, col0 / np.maximum(colS, 1e-12), 1.0)- Y = Y * s- Xs = Y - dp = Xs.mean(axis=0) - X64.mean(axis=0)- bad = np.abs(dp) > GENE_REVERT- if bad.any():- Xs[:, bad] = X64[:, bad]- dp[bad] = 0.0+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. - dcell = np.abs(Xs - X64)- diag = {- "eps": eps, "mode": mode, "steps": n_steps, "eps_eff": eps_eff,- "scale": scale, "std_dp_unit": std_dp_unit, "std_dp": float(dp.std()),- "absmean_dcell": float(dcell.mean()),- "max_dcell": float(dcell.max()),- "genes_reverted": int(bad.sum()),- }- return Xs.astype(np.float32), diag+ 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.+ """+ Xp = prev_stage.X.toarray().astype(np.float64) if sp.issparse(prev_stage.X) \+ else np.asarray(prev_stage.X, dtype=np.float64)+ lp = np.asarray(prev_stage.labels).astype(str)+ la = np.asarray(anch_labels).astype(str)++ types_a, cnt_a = np.unique(la, return_counts=True)+ types_p, cnts_p = np.unique(lp, return_counts=True)+ cnt_p = dict(zip(types_p, cnts_p))+ idx_p = {t: np.flatnonzero(lp == t) for t in types_p}++ vbar = np.zeros(g, dtype=np.float64)+ v_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)+ 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)+ v_by_type[str(t)] = v+ w = n_t / n_out+ vbar += w * v+ n_used += 1+ return vbar, v_by_type, n_used+++def soft_threshold(v: np.ndarray, k: float) -> np.ndarray:+ if k <= 0:+ return v+ return np.sign(v) * np.maximum(np.abs(v) - k, 0.0) def main() -> None:@@ -142,7 +185,10 @@ def main() -> None: parser.add_argument("--ablate", default=None) args = parser.parse_args() - eps = 0.0 if args.ablate is not None else DEFAULT_EPS+ ablated = args.ablate is not None+ eps = DEFAULT_EPS+ alpha = 0.0 if ablated else DEFAULT_ALPHA+ decode = DEFAULT_DECODE manifest = load_manifest(args.data) genes = panel_genes(args.data, manifest)@@ -154,21 +200,104 @@ def main() -> None: rows = np.sort(take(stage.labels, n, rng)) else: rows = np.sort(rng.choice(stage.n, size=n, replace=True))- print(f"[diag] base copy_last eps={eps} n={rows.size}", file=sys.stderr)+ print(f"[diag] base copy_last eps={eps} alpha={alpha} decode={decode} "+ f"n={rows.size}", file=sys.stderr) X = stage.X[rows].toarray().astype(np.float32) coords = np.ascontiguousarray(stage.coords[rows], dtype=np.float64)[:, :3]+ out_labels = np.asarray(stage.labels)[rows].astype(str) + X64 = X.astype(np.float64)+ Xs = X64 if eps != 0.0 and np.isfinite(coords).all() and X.shape[0] >= 2:- X, diag = smooth_expression(X, coords, eps, DEFAULT_MODE, DEFAULT_STEPS)+ Y, diag = diffuse(X64, coords, eps, DEFAULT_MODE, DEFAULT_STEPS) print(f"[diag] smooth mode={diag['mode']} steps={diag['steps']} "- f"eps_eff={diag['eps_eff']:.6f} scale={diag['scale']:.4f} "- f"std_dp={diag['std_dp']:.6f} (budget {DP_BUDGET}) "- f"absmean_dcell={diag['absmean_dcell']:.5f} "- f"max_dcell={diag['max_dcell']:.4f} "- f"genes_reverted={diag['genes_reverted']}", file=sys.stderr)+ f"eps_eff={diag['eps_eff']:.6f} scale={diag['scale']:.4f}",+ file=sys.stderr)+ else:+ Y = X64.copy()++ g = X64.shape[1]++ # ---- velocity field (needs a previous stage; else alpha -> 0) ----------+ vbar = np.zeros(g, dtype=np.float64)+ v_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(+ 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} "+ f"nonzero={int((vbar != 0).sum())}", file=sys.stderr)+ del prev_stage+ else:+ alpha = 0.0+ print("[diag] single input stage -> alpha forced to 0",+ file=sys.stderr)++ if decode == "colscale" or alpha == 0.0:+ # ---- partial restoration to pb_target = pb_orig * 2**(alpha*vbar) --+ # alpha = 0 is bitwise the node-23 exact restoration.+ col0 = X64.sum(axis=0)+ colS = Y.sum(axis=0)+ s = np.where(colS > 0, col0 / np.maximum(colS, 1e-12), 1.0)+ tilt = np.power(2.0, alpha * vbar) if alpha != 0.0 else None+ if tilt is not None:+ s = s * tilt+ Xs = Y * s+ pb_intended = X64.mean(axis=0)+ if tilt is not None:+ pb_intended = pb_intended * tilt+ else:+ # ---- pertype decode: exact restore, then per-cell multiplicative ----+ col0 = X64.sum(axis=0)+ colS = Y.sum(axis=0)+ s = np.where(colS > 0, col0 / np.maximum(colS, 1e-12), 1.0)+ 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)+ unknown = 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)+ 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+ if GAMMA_RENORM > 0:+ T0 = np.expm1(np.clip(Y0, 0, 20.0)).sum(axis=1)+ T1 = np.expm1(np.clip(Xs, 0, 20.0)).sum(axis=1)+ 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} "+ f"shift_absmax_log2={np.abs(alpha * Vs).max():.3f}",+ file=sys.stderr)+ pb_intended = None # guard skipped for the pertype decode++ if pb_intended is not None:+ dp = Xs.mean(axis=0) - pb_intended+ bad = np.abs(dp) > GENE_REVERT+ if bad.any():+ Xs[:, bad] = X64[:, bad]+ n_bad = int(bad.sum())+ else:+ n_bad = -1++ dp_out = Xs.mean(axis=0) - X64.mean(axis=0)+ dcell = np.abs(Xs - X64)+ print(f"[diag] out std_dp={dp_out.std():.5f} mean|dp|={np.abs(dp_out).mean():.5f} "+ f"max|dp|={np.abs(dp_out).max():.4f} genes_guard_reverted={n_bad} "+ f"absmean_dcell={dcell.mean():.5f} max_dcell={dcell.max():.4f} "+ f"Xmax={Xs.max():.3f}", file=sys.stderr) - write_t2(args.out, X, coords[:, :3], genes, seed=args.seed)+ write_t2(args.out, Xs.astype(np.float32), coords[:, :3], genes,+ seed=args.seed) if __name__ == "__main__":
调研来源?调研员查到并用到的知识条目和文献检索结果(只列标题和编号)。
用到的知识库条目
| 编号 | 标题 | 出处 |
|---|---|---|
| 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 |
| k016 | Degenerate-solution checks for population predictions | notes/handover/02_知识学习路线.md |
分析结果?分析员写的 ANALYSIS.json:改了什么、各组分数怎么变、假设是否成立、经验和下一步建议。
| 改了什么 | 在节点23(copy_last + 坐标15-NN图2步支撑掩码扩散ε=0.6 + 逐基因伪批量精确复原)基座上,把复原目标从原伪批量改为按型log2速度引导的目标,实际提交解码为按型逐细胞乘法位移(α=1、软阈值k=0.7、门控30细胞/pb≥0.05/|v|≤2)加逐细胞线性总量回拉(γ=0.6,CP10k空间)。坐标、组成、细胞数、行序冻结。 |
|---|---|
| 各组分数的变化 | cell_state:变好:50.60→56.82(+6.22)。mmd_u raw 0.05458→0.0473(skill 0.516→0.552,+0.44分),variogram raw 0.05911→0.04147(skill 0.495→0.584,+1.11分,本节点单项最大变化之一;速度位移反而修复了父节点列缩放造成的变差图恶化)。 expression_change:变好:50.00→54.93(+4.93,远超T2约1分噪声)。de_score raw 0→0.1528(skill 0.500→0.544,+0.55分),de_direction raw 0→0.1961(skill 0.500→0.555,+0.68分)——脱离无变化保护,速度方向与真值变化方向一致。 local_spatial:变好:51.88→58.62(+6.74)。neighborhood_mmd raw 0.1045→0.07958(skill 0.519→0.586,+1.69分),位移未破坏表达-位置配对,反而在平滑收益上继续压低。 shape_scale:不变:50.00→50.00。坐标冻结,d2_shape 0.04911、occupancy_dice 0.8066、scale_log_ratio -0.4334 三项raw逐位与父相同,skill全0.500(地板),结构门恒1。 |
| family_id | T2HX-04 |
| 假设是否成立 | 是 |
| 经验 |
|
| mechanism_active | 是 |
| 下一步建议 |
|
对话摘要?每个角色和大模型对话的统计:轮数、工具调用、用时、token 数和最后的回答摘录;原始记录只给路径。
只给统计和最后回答的摘录;完整对话请到原始记录位置里列出的文件看。
分析员
| 角色?调研员写计划、工程师改代码、分析员解读分数、审查员检查作弊。 | 分析员 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数?大模型一共回复了几轮(每轮可以调用多个工具)。 | 4 |
| 工具调用?大模型调用读文件、执行命令等工具的次数,按工具名统计。 | 共 3 次:bash 2、write 1 |
| 用时 | 不到 1 分 |
| token 数?输入 / 输出(含思考)的 token 数,来自接口返回的用量。 | 输入 22,830 · 输出 1,579 · 思考 776 |
| 任务(第一行) | 分析节点 n26 的打分结果,写 ANALYSIS.json |
| 最后的回答(摘录) | ANALYSIS.json written |
| 原始记录位置?完整对话记录在 Spark 上的文件路径;看板不复制原始内容。 | /home/spark-longxinyang/vec/runs/formal/20261003-172000-search-t2-heart-extrap-chain-12h/nodes/26/analyst.jsonl 10 KB /home/spark-longxinyang/vec/runs/formal/20261003-172000-search-t2-heart-extrap-chain-12h/nodes/26/analyst.stderr |
工程师
| 角色 | 工程师 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数 | 51 |
| 工具调用 | 共 57 次:bash 45、edit 5、write 4、read 3 |
| 用时 | 29 分 |
| token 数 | 输入 128,251 · 输出 26,542 · 思考 32,648 |
| 任务(第一行) | 按计划修改程序:空间平滑+速度引导部分伪批量恢复(解锁DE组) |
| 最后的回答(摘录) | All verifications pass. Session complete. **做了什么**:在节点 23(空间 15-NN 扩散平滑 + 伪批量精确复原)基座上,按 PLAN 实现"速度引导的部分伪批量恢复"。PLAN 原定的 colscale 解码(组成加权 v̄_g 列缩放)实测 DE 方向信号为零(de_direction −0.004,α=0.3,51.17 分);在同一速度场上换按型逐细胞解码(软阈值 k=0.7 乘法位移 α=1 + 节点 24 的逐细胞线性总量回拉 γ=0.6)后机制生效,提交该解码。`--ablate` 态逐位等于节点 23(已比对)。 **查分结果**(19/20 次,A 半 proxy_noscale):提交态 **54.87**(父 50.58、copy_last 50.00、树最优节点 24 为 54.13)。四组:expression_change 50→54.99(de_dir 0→0.1998、de_score 0→0.1528)、cell_state →56.55(mmd_u 0.0482、variogram 0.0422 均优于父)、local_spatial →57.94(nbh 0.1068→0.0832)、shape_scale 冻结不变。层分解:仅平滑 50.58、仅速度 53.65、合并 54.87,两层收益近似相加。响应面平滑单峰(k∈[0.6,0.75]×γ∈[0.5,0.65]×α∈[1,1.25] 平台 54.6–54.9),提交点取高分点集中心而非 argmax。已验证:seed 0/1/2 逐位相同、伪装视图(时间 +1 天/改名/键序打乱)逐位相同、单输入视图回退 α=0、vec-check 通过、纯 CPU ~6s。 **下一步最值得试**:(1) 在此机制上微调平滑层(ε/步数在速度位移后可能最优值偏移);(2) variogram 对 γ 敏感(γ=1 时 0.0368 最好但 mmd_u 变差),可试位移后按基因方差整形回收 cell_state 残分;(3) k 门控换成按型细胞数自适应的显著性门(如 pb 差的标准误),可能在 final 视图(步长比 4/3、anchor 可能超 max_cells)上更稳健。 |
| 原始记录位置 | /home/spark-longxinyang/vec/runs/formal/20261003-172000-search-t2-heart-extrap-chain-12h/nodes/26/engineer.jsonl 290 KB /home/spark-longxinyang/vec/runs/formal/20261003-172000-search-t2-heart-extrap-chain-12h/nodes/26/engineer.stderr |
调研员
| 角色 | 调研员 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数 | 1 |
| 工具调用 | 共 0 次:— |
| 用时 | 3 分 |
| token 数 | 输入 19,993 · 输出 1,457 · 思考 5,812 |
| 任务(第一行) | 为节点 n26(改进,父节点 n23)写改进计划 PLAN.json |
| 最后的回答(摘录) | 21/24证明按型乘法速度外推可让de_direction达0.2068、de_score达0.1111(节点24),是+4分级别的增益来源。本节点修复的结构问题:将'精确复原到原始伪批量'替换为'复原到速度引导的微移目标伪批量',在保留空间平滑邻域收益的同时给DE提供受控方向信号。",
"approach": "步骤:(1) 基座不变:anchor=末观测输入,分层抽样,表达/坐标原样。(2) 空间平滑不变:坐标15-NN图,2步ε=0.6,支撑掩码(只动x>0),得Y_smooth。(3) 计算速度:读两个输入阶段(prev和anchor),逐细胞类型算伪批量log2速度 v_g,t = log2(pb_anchor_g+1) − log2(pb_prev_g+1);再按输出中每个细胞的类型分配,得逐细胞速度向量 v_i,g。(4) 计算目标伪批量:pb_target_g = pb_orig_g × 2^(α·v̄_g),其中 v̄_g = Σ_t (n_t/n)·v_g,t 是组成加权平均速度(逐基因标量)。(5) 部分恢复:Y_final = Y_smooth × (pb_target / pb_smooth) 逐基因列缩放。α=0时退化为节点23精确复原(消融态)。(6) 保零模式:列缩放后仍只在原始支撑上保留非零值(Y_final[mask==0]=0),缩放后重新归一化到pb_target。(7) 单输入阶段退路:若视图只有一个输入阶段(无法算速度),自动回退α=0,输出逐位等于节点23。(8) vec-score快筛:先跑α∈{0.05,0.1,0.2,0.3,0.5}×1次,看de_direction raw是否>0.01(脱离无变化保护)且nbh raw不劣于0.107;选最优α后复跑确认。(9) 可选第二步(主机制验证后):若variogram raw恶化>0.002,对列缩放因子做方差修正 s_g←s_g^0.85(轻度压缩极端缩放),重查一次。",
"expected_groups": ["expression_change", "local_spatial"],
"risks": "1) α过小时std(dp)<1%×std(dt)仍触发无变化保护,DE保持0——Engineer应先诊断std(dp)/std(dt)比值,确认α=0.1时比值>0.01,否则直接跳到α=0.3。2) 速度方向在A半真值上可能与实际变化方向不一致(外推榜的dt不完全等于速度延续),表现为de_direction为负——若de_direction<-0.01,止损回退α=0。3) 列缩放到非原始目标可能轻微恶化mmd_u(节点23的教训是缩放因子中位5.4时0.16%条目越界)——监控mmd_u raw,若>0.056则降α。4) 伪装视图测试:速度计算只用视图内两个阶段的表达,不读绝对时间名,应time-free;Engineer须在伪装视图上验证输出逐位相同。",
"family_id": "T2HX-04",
"mechanism": "空间kNN图扩散(保邻域)+ 速度引导的部分伪批量恢复:列缩放目标从'精确复原原始pb'改为'复原到pb_orig×2^(α·velocity)',使dp获得与发育时间方向一致的非零信号,解锁DE评分。",
"vs_constant_shift": "每基因的位移方向和幅度由该基因在两个输入阶段间的细胞类型加权速度决定(上调基因正移、下调基因负移、不变基因不移),且不同细胞类型的细胞携带不同速度向量;不是所有基因/细胞同一方向同一幅度的常数位移。消融α=0时输出逐位回到节点23。",
"mechanism_evidence": "1) de_direction raw从0变为>0.01(脱离地板);2) de_score raw从0变为>0.005;3) neighborhood_mmd raw保持≤0.107(空间平滑收益未被漂移破坏);4) 逐基因位移方向与速度方向的正相关(spearman(dp, v̄)>0.3);5) 若de_direction为负或零,说明速度方向与真值变化不一致,机制未生效。",
"mechanism_off_control": "α=0(环境变量VEC_ALPHA=0或--ablate):目标伪批量=原始伪批量,列缩放退化为精确复原,输出逐位等于节点23(即空间平滑+精确复原)。预期差别:ablate态de_score=de_direction=0、nbh raw≈0.1045;开启态de_direction>0、nbh raw≤0.107。若两者输出逐位相同,说明速度计算或恢复步骤未运行。",
"sources": []}
``` |
| 原始记录位置 | /home/spark-longxinyang/vec/runs/formal/20261003-172000-search-t2-heart-extrap-chain-12h/nodes/26/researcher.jsonl 6 KB /home/spark-longxinyang/vec/runs/formal/20261003-172000-search-t2-heart-extrap-chain-12h/nodes/26/researcher.stderr |
审查员
| 角色 | 审查员 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数 | 6 |
| 工具调用 | 共 10 次:read 8、bash 1、write 1 |
| 用时 | 1 分 |
| token 数 | 输入 17,468 · 输出 1,506 · 思考 2,198 |
| 任务(第一行) | 审查节点 n26 的程序是否越界读取、写死目标、钻评分器漏洞 |
| 最后的回答(摘录) | REVIEW.json written |
| 原始记录位置 | /home/spark-longxinyang/vec/runs/formal/20261003-172000-search-t2-heart-extrap-chain-12h/nodes/26/reviewer.jsonl 113 KB /home/spark-longxinyang/vec/runs/formal/20261003-172000-search-t2-heart-extrap-chain-12h/nodes/26/reviewer.stderr |