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

总览 · ← 返回运行 20261003-070222-search-t2-heart-extrap-g24-D

节点 n13 在终选来历上

实现T2HX-03基因级趋势外推,proxy证伪(α=0.2→52.05、de_direction−0.06,与幅度无关),按停止规则提交α=0;坐标机制保留,输出=父节点12(54.15)。

运行?一次完整的自动搜索或 Agent 会话,有自己的锁定配置和证据包。20261003-070222-search-t2-heart-extrap-g24-D
父节点n12
子节点n16
操作?种子:人写的起点;改进:在父节点上改;草稿:从头写;修复:修父节点的报错。改进
状态已打分
分数搜索目标分 54.15(+0.0) · proxy 54.15(+0.0)
审查未审查
用时?从运行开始到结束(或到现在)的挂钟时间。17 分
程序版本35d31a123ff76c5b0f7df54e3a5bb2ca80d644fa (programs.git)

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

来自 programs.git 35d31a123f:solution/METHOD.md

实现T2HX-03基因级趋势外推,proxy证伪(α=0.2→52.05、de_direction−0.06,与幅度无关),按停止规则提交α=0;坐标机制保留,输出=父节点12(54.15)。

榜 / 视图

T2:heart:val_extrap,proxy = E8.25_late + E8.75 → E9.5(步长比 1.5)。纯 CPU,约 2 s,峰值内存 <1 GB(EXECUTION.json: gpu=false)。

实际实现的方法族(PLAN T2HX-03)

阻尼基因级表达趋势外推,按 PLAN 原文实现:

  1. 加载 prev(E8.25_late,58716 细胞)与 last(E8.75,24826 细胞)两个输入阶段,对每个基因 g 计算伪批量差 delta_g = mean(X_last[:,g]) − mean(X_prev[:,g])(面板序,500 基因)。
  2. 对末阶段每个输出细胞:X_pred[cell,g] = clip(X_last[cell,g] + α·delta_g, 0, ∞)。每个基因有独立的、数据驱动的位移;无变化的基因不动(本视图上 500/500 基因 |delta|>0)。这不是常数位移(每基因不同标量),也不是组成重加权(细胞集合与比例不动)。
  3. 坐标管线与父节点完全一致:确定性 PCA 规范帧(去质心 → eigh 降序 → det=+1 → 第三矩定向)+ 各向同性缩放到 0.946 × max_k RMS(input_k)(proxy: rms_inputs=[354.13, 216.88] → rms_out=335.00)。
  4. 单输入退路:prev 不存在时无 delta,α 强制为 0,表达照抄、坐标同管线,不崩。
  5. 开关:VEC_MECH_OFF=1 或 VEC_ALPHA=<a>(仅扫参用);提交默认 ALPHA=0.0。

机制生效的证据(α=0.2 实测,proxy seed 0)

  • 实际改变了哪些细胞:全部 24826 个输出细胞都被移动(统一加 α·delta 向量);500/500 基因有非零位移,|delta| 中位数 0.112、P90 0.705、max 2.088(不是只有少数基因被移动);表达矩阵 L2 变化 190.6(非零);8.1M 个条目被下界 clip(零表达条目对负 delta 基因不动、对正 delta 基因变非零)。
  • 四组分各自的变化(α=0 对照 → α=0.2):expression_change 50.00 → 47.88;cell_state 50.00 → 44.98;local_spatial 50.00 → 49.46;shape_scale 66.60 → 65.88。榜分 54.15 → 52.05。de_direction 0 → −0.0596,de_score 0 → −0.1111,mmd_u 0.0586 → 0.0605,variogram 0.0586 → 0.0849。

机制对照结果(PLAN mechanism_off_control)

配置榜分expr_changecell_statelocal_spatialshape_scale
α=0(VEC_MECH_OFF=1,= 父节点 12)54.1550.0050.0050.0066.60
α=0.0553.0247.8847.8649.9066.46
α=0.252.0547.8844.9849.4665.88

对照与 PLAN 预期一致(关闭后回到 54.15 / 50.00×3 / 66.60),即表达外推机制确实生效并改变了输出;但打开时方向为负,且 α 越小越接近 50(单调),α=0 是族内最优边界。

为什么提交 α=0(如实报告:机制被证伪)

  • PLAN 停止规则:「第一次查 α=0.2 时若 expression_change<50 立即终止」。实测 47.88 < 50,且 cell_state 44.98 同时 <50(PLAN 第 6 条的终止条件「两组均 ≤50」满足),故不扫 [0.1, 0.3, 0.5, 1.0],只补了一个边界探针 α=0.05 确认单调性。
  • de_score / de_direction 在 α=0.05 与 α=0.2 完全相同(−0.1111 / −0.0596):DE 方向指标与幅度无关,说明 prev→last 的基因级趋势方向本身与保留目标 E9.5 的真实变化方向不一致(负相关),缩小 α 只能稀释损失、不能翻正。
  • 与树内及方法卡证据一致:节点 4(分型伪批量 α=0.05)cell_state 49.04,节点 10(α=0.02)49.40,方法卡 damped_shift 分型网格 α∈[0.1,1.0] 全部 49.47→48.77 < 50,官方 pseudobulk_shift 基线 48.77。本次把证伪扩展到全局逐基因 delta(不分型、不做匹配)这一未测变体。
  • 结构分析(离线,未耗查分):全局 delta 的均值 −0.124(E8.75 整体表达水平比 E8.25_late 低约 20%),疑似跨样本技术差异(覆盖/深度)而非生物学趋势;组成控制后的分型 delta 均值 −0.004、幅度小 30 倍(|δ| 中位数 0.0035),与全局 delta 相关 0.71;去掉全局水平项的校正 delta 与原始 delta cos=0.87——失败的主要分量(80% 符号一致)在这两个「结构修复」变体中仍然保留,且分型版本已被方法卡网格直接证伪,故未再消耗查分探针。
  • 提交 α=0.2 会把节点打到 52.05(低于父 54.15)并向树传播一个在 proxy 上有害的机制;按方法卡先例(「外推网格单调低于地板,取边界 α=0」)与节点 12 的处理方式,提交族边界 α=0,机制代码保留在 VEC_ALPHA 开关后供后续节点复用。

验证过的

  • 确定性:同 seed 重跑 .X(data/indices/indptr)与 obsm/spatial_3D 逐元素相同;seed 0 与 seed 1 的 .X/obsm/obs/var 完全相同(n=24826 ≤ max_cells=25179,无抽样,rng 未被消费;仅 uns/generator_seed 记录不同,与父节点行为一致)。
  • 与父节点等价:提交默认(α=0)的输出与 VEC_MECH_OFF=1 对照、与父节点 12 的预测逐字节一致;正式分预期 = 父节点(54.15 A 半,rank3 ≈ 54.00)。
  • 视图无关:输出只取决于视图数据与 seed;不读 board/mode/source/dataset,无绝对发育时间分支(extrap_step 的步长比仅写日志;时间统一平移后 prev/last 选择与 delta 不变)。
  • 格式:vec-check --data <proxy view> → {"status":"ok","errors":[]}(α=0、α=0.05、α=0.2 三个产物都通过)。

没验证 / 风险

  • α>0 在真实括号(E8.75+E9.5→E10.5,同一官方数据集、delta 更干净)上的方向未验证也无法验证(目标保留);proxy 的失败可能部分源于 E8.25_late 与 E8.75 两样本间的技术水平差。但按「分数要能迁移」与护栏规则,不能提交一个在唯一尺子上为负的机制赌真实视图翻正。
  • 负 α(逆时间外推)在 proxy 上会得分更高,但那是利用两输入样本的技术水平差、对真实任务无迁移性的打分器特化,明确不做。
  • 表达侧四组中 cell_state / expression_change / local_spatial 仍钉在 50.00(copy_last 地板),shape_scale 仍被 d2_shape=0.04891 钉在 66.60。本节点没有打开新缺口,贡献是把「基因级趋势外推」整族(全局 delta 变体)在 proxy 上证伪并留下可复用的开关实现。

知识来源

只用通用机制知识:线性趋势外推(数值方法);胚胎随发育时间增大、样本观测 RMS 只能低估真实尺寸(坐标机制沿用父节点,测量学常识)。未使用任何保留阶段(E8.5/E10.5/E12.5、禁窗 (8.25,8.75) 与 9.5<E≤13.5)或保留基因型的数据、比例、标记基因或形态信息;external/(Qiu E8.75)与 prior/ 均未被 run.py 读取。

查分记录(共 4 次 / 上限 20)

  1. t2hx03_a0.2 → 52.05(方向为负,触发 PLAN 停止规则)
  2. t2hx03_control_a0 → 54.15(机制关闭对照 = 父节点)
  3. t2hx03_a0.05 → 53.02(边界探针,确认单调)
  4. t2hx03_committed_a0 → 54.15(提交产物确认)

调研员的计划

名称阻尼基因级表达趋势外推 + 保留坐标缩放机制
动机父节点12及全树所有节点的表达均为copy_last(α=0),cell_state/expression_change/local_spatial三组恒50.00(=copy_last地板),是唯一未被突破的缺口。树内从未尝试过修改表达值本身——节点3/4/10的伪批量位移改的是坐标而非表达。两个输入阶段(E8.25_late→E8.75)提供每基因的时间趋势,线性外推可给出非零的表达变化预测,直接瞄准expression_change和cell_state。shape_scale已钉在66.60(d2_shape=0.0489),FACTOR=0.946已锁定不再扫。
做法1. 保留父节点坐标管线不变(PCA规范化+各向同性缩放到0.946×max RMS)。2. 新增表达外推:加载prev和last两个输入阶段,对每个基因g计算delta_g = mean(X_last[:,g]) - mean(X_prev[:,g]);对末阶段每个细胞:X_pred[cell,g] = X_last[cell,g] + α·delta_g。3. α扫描顺序:先跑α=0.2确认方向(1次查询);若expression_change>50,扫[0.1, 0.3, 0.5, 1.0](4次);若方向为负立即停止并报告。4. 最优α附近细扫(±0.05步长,2-3次)。5. 单输入阶段退路:无prev时α强制为0(表达照抄,等同父节点)。6. vec-score快速筛选:每次只查proxy seed 0,关注expression_change和cell_state两组;若两组均≤50则判定方向为负,终止。7. 全量验证:最优α用seed 0/1跑两次确认稳定性。总查询预算≤12次。
风险1. 表达变化方向在last→target间可能反转(发育非线性),导致外推方向为负——Engineer第一次查α=0.2时若expression_change<50立即终止,不浪费后续查询。2. 细胞组成变化混杂基因均值(prev和last的细胞类型比例不同),delta_g可能反映组成变化而非真实表达动力学——缓解:α保守(≤1.0),且机制对照可隔离净效应。3. 改善幅度<T2噪声(1分)——需α扫描中至少2个相邻点同方向>50才判定为真信号。4. 稀疏矩阵上小delta可能被噪声淹没——检查修改后表达的L2变化量是否非零。

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

对比:父节点版本 7cfce055ec。改动的文件:solution/METHOD.md +45 −23、solution/README.md +8 −8、solution/run.py +83 −46

diff --git a/solution/METHOD.md b/solution/METHOD.mdindex 6c9f001..fa1893c 100644--- a/solution/METHOD.md+++ b/solution/METHOD.md@@ -1,40 +1,62 @@-去除伪批量位移(α=0)+ 确定性 PCA 坐标规范化 + 各向同性缩放到 0.946×max_k RMS(input_k),shape_scale 66.60+实现T2HX-03基因级趋势外推,proxy证伪(α=0.2→52.05、de_direction−0.06,与幅度无关),按停止规则提交α=0;坐标机制保留,输出=父节点12(54.15)。  ## 榜 / 视图 -`T2:heart:val_extrap`,proxy = E8.25_late + E8.75 → E9.5(步长比 1.5)。纯 CPU,约 4.6 s,峰值内存 <1 GB(`EXECUTION.json`: `gpu=false`)。+`T2:heart:val_extrap`,proxy = E8.25_late + E8.75 → E9.5(步长比 1.5)。纯 CPU,约 2 s,峰值内存 <1 GB(`EXECUTION.json`: `gpu=false`)。 -## 方法(PLAN family T2HX-06)+## 实际实现的方法族(PLAN T2HX-03) -1. **表达:完全照抄末阶段(α=0)**。父节点 10 保留的「表达匹配型伪批量位移」被删除,不再只是调小。依据:树内数据一致显示该机制在 α∈{0.02, 0.05} 上都不产生超出噪声的收益,且方向偏负(cell_state 49.04 / 49.40,α=0 时为 50.00;expression_change 49.87 / 50.00 vs 50.00)。删除后 cell_state、expression_change 都回到 50.00。-2. **坐标:确定性 PCA 规范化**(本节点相对父节点 10 的结构修复)。末阶段点云 → 去质心 → 协方差 `eigh` → 特征值降序(`stable` 排序,并列按列序)→ 若 det<0 翻转最后一列(固定手性)→ 每根轴按**第三中心矩为正**定向(退化时依次用第一矩、特征向量最大绝对值分量的符号),得到与采集姿态无关、且对同一朵点云唯一的规范帧。-3. **坐标:各向同性缩放到 `FACTOR × max_k RMS(input_k)`,FACTOR=0.946**。理由(生物学/几何,不依赖保留阶段):一个样本测到的空间 RMS 半径取决于它覆盖了多少结构(视野、保留切片数),只能**低估**真实尺寸,因此不是随时间单调的生物量——本视图上它从 354(较早)降到 217(较晚),沿趋势外推必错;胚胎随时间长大,更晚的目标阶段其尺度至少是各输入观测到的最大值,再乘一个阻尼因子。只做刚体旋转 + 全局缩放,细胞间相对几何、z 切片结构都不动。-4. **细胞数 / 组成**:不动,`n = clip(last.n, min_cells, max_cells)`,超上限时用 `src.task2_spatial.sample.take` 按细胞类型分层无放回抽样(proxy 上 53742 → 24826)。-5. **单输入退路**:无 prev 时同样走规范化 + 缩放(此时 max RMS 就是该点云自身的 RMS,缩放为恒等),表达照抄,分层抽到 max_cells,不崩。+**阻尼基因级表达趋势外推**,按 PLAN 原文实现: -`FACTOR` 是唯一被扫的标量;`VEC_FACTOR` 环境变量只为扫参存在,提交时不设置,走代码里的 0.946。+1. 加载 prev(E8.25_late,58716 细胞)与 last(E8.75,24826 细胞)两个输入阶段,对每个基因 g 计算伪批量差 `delta_g = mean(X_last[:,g]) − mean(X_prev[:,g])`(面板序,500 基因)。+2. 对末阶段每个输出细胞:`X_pred[cell,g] = clip(X_last[cell,g] + α·delta_g, 0, ∞)`。每个基因有独立的、数据驱动的位移;无变化的基因不动(本视图上 500/500 基因 |delta|>0)。这不是常数位移(每基因不同标量),也不是组成重加权(细胞集合与比例不动)。+3. 坐标管线与父节点完全一致:确定性 PCA 规范帧(去质心 → eigh 降序 → det=+1 → 第三矩定向)+ 各向同性缩放到 `0.946 × max_k RMS(input_k)`(proxy: rms_inputs=[354.13, 216.88] → rms_out=335.00)。+4. 单输入退路:prev 不存在时无 delta,α 强制为 0,表达照抄、坐标同管线,不崩。+5. 开关:`VEC_MECH_OFF=1` 或 `VEC_ALPHA=<a>`(仅扫参用);提交默认 `ALPHA=0.0`。 -## 机制生效的证据+## 机制生效的证据(α=0.2 实测,proxy seed 0) -- **实际改变了什么**:只改坐标(旋转 + 全局缩放),表达矩阵与细胞集合完全等同 copy_last。proxy seed 0 实测:`rms_inputs=[354.13, 216.88]` → `rms_out=335.00`,`scale_log_ratio=-0.0027`(≈0),PCA `eig_frac=[0.398, 0.350, 0.252]`,`axis_signs=[+1,-1,+1]`(确实翻了轴,不是恒等变换)。-- **四组分变化**(父节点 10 → 本节点,同一 proxy):cell_state 49.40 → **50.00**;expression_change 50.00 → **50.00**;local_spatial 50.07 → **50.00**(噪声内);shape_scale 66.27 → **66.60**。榜分 53.94 → **54.15**。-- **机制关闭对照**(`VEC_MECH_OFF=1`,跳过 PCA 规范化与缩放,输出末阶段原始坐标):shape_scale 66.60 → **50.00**,`scale_log_ratio` → −0.4375,其余三组不变(表达未动),榜分 **50.00**(= copy_last 地板)。即 +4.15 榜分全部来自该坐标机制,与 PLAN 的 `mechanism_off_control` 预期一致。+- **实际改变了哪些细胞**:全部 24826 个输出细胞都被移动(统一加 α·delta 向量);500/500 基因有非零位移,|delta| 中位数 0.112、P90 0.705、max 2.088(不是只有少数基因被移动);表达矩阵 L2 变化 190.6(非零);8.1M 个条目被下界 clip(零表达条目对负 delta 基因不动、对正 delta 基因变非零)。+- **四组分各自的变化**(α=0 对照 → α=0.2):expression_change 50.00 → **47.88**;cell_state 50.00 → **44.98**;local_spatial 50.00 → **49.46**;shape_scale 66.60 → **65.88**。榜分 54.15 → **52.05**。de_direction 0 → −0.0596,de_score 0 → −0.1111,mmd_u 0.0586 → 0.0605,variogram 0.0586 → 0.0849。++## 机制对照结果(PLAN `mechanism_off_control`)++| 配置 | 榜分 | expr_change | cell_state | local_spatial | shape_scale |+|---|---:|---:|---:|---:|---:|+| α=0(`VEC_MECH_OFF=1`,= 父节点 12) | **54.15** | 50.00 | 50.00 | 50.00 | 66.60 |+| α=0.05 | 53.02 | 47.88 | 47.86 | 49.90 | 66.46 |+| α=0.2 | 52.05 | 47.88 | 44.98 | 49.46 | 65.88 |++对照与 PLAN 预期一致(关闭后回到 54.15 / 50.00×3 / 66.60),即表达外推机制确实生效并改变了输出;但打开时**方向为负**,且 α 越小越接近 50(单调),α=0 是族内最优边界。++## 为什么提交 α=0(如实报告:机制被证伪)++- PLAN 停止规则:「第一次查 α=0.2 时若 expression_change<50 立即终止」。实测 47.88 < 50,且 cell_state 44.98 同时 <50(PLAN 第 6 条的终止条件「两组均 ≤50」满足),故不扫 [0.1, 0.3, 0.5, 1.0],只补了一个边界探针 α=0.05 确认单调性。+- de_score / de_direction 在 α=0.05 与 α=0.2 完全相同(−0.1111 / −0.0596):DE 方向指标与幅度无关,说明 **prev→last 的基因级趋势方向本身与保留目标 E9.5 的真实变化方向不一致**(负相关),缩小 α 只能稀释损失、不能翻正。+- 与树内及方法卡证据一致:节点 4(分型伪批量 α=0.05)cell_state 49.04,节点 10(α=0.02)49.40,方法卡 damped_shift 分型网格 α∈[0.1,1.0] 全部 49.47→48.77 < 50,官方 pseudobulk_shift 基线 48.77。本次把证伪扩展到**全局逐基因 delta**(不分型、不做匹配)这一未测变体。+- 结构分析(离线,未耗查分):全局 delta 的均值 −0.124(E8.75 整体表达水平比 E8.25_late 低约 20%),疑似跨样本技术差异(覆盖/深度)而非生物学趋势;组成控制后的分型 delta 均值 −0.004、幅度小 30 倍(|δ| 中位数 0.0035),与全局 delta 相关 0.71;去掉全局水平项的校正 delta 与原始 delta cos=0.87——失败的主要分量(80% 符号一致)在这两个「结构修复」变体中仍然保留,且分型版本已被方法卡网格直接证伪,故未再消耗查分探针。+- 提交 α=0.2 会把节点打到 52.05(低于父 54.15)并向树传播一个在 proxy 上有害的机制;按方法卡先例(「外推网格单调低于地板,取边界 α=0」)与节点 12 的处理方式,提交族边界 α=0,机制代码保留在 `VEC_ALPHA` 开关后供后续节点复用。  ## 验证过的 -- **FACTOR 细扫(9 次 `vec-score`,全部 proxy seed 0)**:0.90→53.32 / 0.92→53.68 / 0.94→54.06 / 0.943→54.12 / **0.946→54.15** / 0.948→54.11 / 0.95→54.07 / 0.96→53.88 / 0.98→53.53。shape_scale 分别为 63.28 / 64.71 / 66.25 / 66.49 / **66.60** / 66.44 / 66.28 / 65.51 / 64.10。峰值在 0.946(`scale_log_ratio` 最接近 0),两侧单调下降,与父节点 ANALYSIS 的「factor 是最强单一杠杆」一致。-- **种子稳定性**:seed 0 / 1 / 2 榜分均为 54.1494(分层抽样对指标影响可忽略),rank3 期望 ≈54.15。-- **确定性**:同 seed 重跑,`.X`(data/indices/indptr)、`obsm/spatial_3D`、`obs`、`var` 逐字节相同。-- **视图无关**:在伪装视图(随机路径、manifest 键序打乱、所有阶段时间统一 +1 天)上重跑 seed 0,`.X` 与 `spatial_3D` 与真实视图完全相同。代码不读 `board`/`mode`/`source`/`dataset`,不依赖绝对发育时间(只用 `extrap_step` 的步长比,且仅用于日志)。-- **格式**:`vec-check --data <proxy view>` → `{"status": "ok", "errors": []}`。+- **确定性**:同 seed 重跑 `.X`(data/indices/indptr)与 `obsm/spatial_3D` 逐元素相同;seed 0 与 seed 1 的 `.X`/`obsm`/`obs`/`var` 完全相同(n=24826 ≤ max_cells=25179,无抽样,rng 未被消费;仅 `uns/generator_seed` 记录不同,与父节点行为一致)。+- **与父节点等价**:提交默认(α=0)的输出与 `VEC_MECH_OFF=1` 对照、与父节点 12 的预测逐字节一致;正式分预期 = 父节点(54.15 A 半,rank3 ≈ 54.00)。+- **视图无关**:输出只取决于视图数据与 seed;不读 `board`/`mode`/`source`/`dataset`,无绝对发育时间分支(`extrap_step` 的步长比仅写日志;时间统一平移后 prev/last 选择与 delta 不变)。+- **格式**:`vec-check --data <proxy view>` → `{"status":"ok","errors":[]}`(α=0、α=0.05、α=0.2 三个产物都通过)。  ## 没验证 / 风险 -- 0.946 是在 proxy 括号(E8.25+E8.75)上扫出的阻尼因子;真实外推括号是 E8.75+E9.5 → E10.5,输入 RMS 组合不同,`max_k RMS(input_k) × 0.946` 未必同样贴近真值。方法卡记录的 final 上 E8.75→E9.5 只剩 5 个同名类型——本方法**不用类型名也不用 prev 的表达**(表达照抄末阶段),所以类型名对不上不影响;PCA 也不依赖类型名。-- PCA 规范化把点云旋到一个由自身三阶矩决定的帧。若评分器的对齐是各向同性的(Procrustes/Kabsch),旋转本身是中性的,收益应主要来自尺度;实测加 PCA 比不加(父节点 10 的 66.27)高 0.33,落在 T2 噪声(约 1 分)内,**不能确认 PCA 规范化本身有独立收益**,只能说没有害处。-- shape_scale 已被 `d2_shape=0.04891`(形状项,跨所有 factor 恒定)钉住,只靠全局缩放无法再涨;要突破需要改变点云形状,而这需要关于保留阶段形态的信息,属禁用范围。-- cell_state / expression_change / local_spatial 三组恒为 50.00(= copy_last 水平)。本节点没有提出任何能真正预测 E9.5→E10.5 表达变化的机制,这是已知的最大缺口。+- α>0 在**真实括号**(E8.75+E9.5→E10.5,同一官方数据集、delta 更干净)上的方向未验证也无法验证(目标保留);proxy 的失败可能部分源于 E8.25_late 与 E8.75 两样本间的技术水平差。但按「分数要能迁移」与护栏规则,不能提交一个在唯一尺子上为负的机制赌真实视图翻正。+- 负 α(逆时间外推)在 proxy 上会得分更高,但那是利用两输入样本的技术水平差、对真实任务无迁移性的打分器特化,明确不做。+- 表达侧四组中 cell_state / expression_change / local_spatial 仍钉在 50.00(copy_last 地板),shape_scale 仍被 d2_shape=0.04891 钉在 66.60。本节点没有打开新缺口,贡献是把「基因级趋势外推」整族(全局 delta 变体)在 proxy 上证伪并留下可复用的开关实现。  ## 知识来源 -只用通用机制知识:胚胎随发育时间增大(尺度非递减),以及「样本测到的空间范围受视野/切片保留限制、只能低估真实结构尺寸」这一测量学事实。未使用任何保留阶段(E10.5、E12.5,禁窗 9.5<E≤13.5)或保留基因型的实测数据、比例、标记基因或形态信息;`external/`(Qiu E8.75)与 `prior/` 均未被 `run.py` 读取。+只用通用机制知识:线性趋势外推(数值方法);胚胎随发育时间增大、样本观测 RMS 只能低估真实尺寸(坐标机制沿用父节点,测量学常识)。未使用任何保留阶段(E8.5/E10.5/E12.5、禁窗 (8.25,8.75) 与 9.5<E≤13.5)或保留基因型的数据、比例、标记基因或形态信息;`external/`(Qiu E8.75)与 `prior/` 均未被 `run.py` 读取。++## 查分记录(共 4 次 / 上限 20)++1. `t2hx03_a0.2` → 52.05(方向为负,触发 PLAN 停止规则)+2. `t2hx03_control_a0` → 54.15(机制关闭对照 = 父节点)+3. `t2hx03_a0.05` → 53.02(边界探针,确认单调)+4. `t2hx03_committed_a0` → 54.15(提交产物确认)diff --git a/solution/README.md b/solution/README.mdindex c47e482..e9283f5 100644--- a/solution/README.md+++ b/solution/README.md@@ -1,12 +1,12 @@-# T2:heart:val_extrap — α=0 照抄末阶段表达 + PCA 规范化坐标 + 0.946×max RMS 缩放+# T2:heart:val_extrap — T2HX-03 基因级趋势外推(proxy 证伪,提交 α=0)+ PCA 规范化坐标 + 0.946×max RMS 缩放 -`run.py --data <view> --out <pred.h5ad> --seed <int>`(纯 CPU,约 5 s,`EXECUTION.json`: gpu=false)。+`run.py --data <view> --out <pred.h5ad> --seed <int>`(纯 CPU,约 2 s,`EXECUTION.json`: gpu=false)。 -- 表达:末阶段原样照抄(位移机制已删除,α=0)。-- 坐标:确定性 PCA 规范帧(去质心 → eigh 降序 → det=+1 → 第三矩定向),再各向同性缩放到 `FACTOR × max_k RMS(input_k)`,FACTOR=0.946。+- 表达机制(T2HX-03,已实现、可开关):`delta_g = mean(X_last[:,g]) − mean(X_prev[:,g])`,输出细胞 `X = clip(X_last + α·delta, 0, ∞)`。proxy 上 α=0.2 → 52.05、α=0.05 → 53.02、α=0 → 54.15,de_direction=−0.06 与幅度无关:方向为负,按 PLAN 停止规则提交 **α=0**(表达照抄末阶段)。+- 坐标:确定性 PCA 规范帧(去质心 → eigh 降序 → det=+1 → 第三矩定向),再各向同性缩放到 `FACTOR × max_k RMS(input_k)`,FACTOR=0.946(父节点机制,原样保留)。 - 细胞数:`clip(last.n, min_cells, max_cells)`,超上限时按细胞类型分层无放回抽样。-- 单输入:同一代码路径(缩放退化为恒等),不崩。-- `VEC_MECH_OFF=1`:关闭 PCA 规范化与缩放(= copy_last 空间部分),用于机制对照。-- `VEC_FACTOR=<f>`:仅扫参用,提交时不设置。+- 单输入:无 prev → α 强制 0;坐标缩放退化为恒等,不崩。+- `VEC_MECH_OFF=1`:关闭表达外推(α=0,PLAN 对照,输出=父节点 12)。+- `VEC_ALPHA=<a>` / `VEC_FACTOR=<f>`:仅扫参用,提交时不设置。 -细节与验证见 `METHOD.md`。无模型权重,故无 `ARTIFACTS.json`。+证据、对照与查分记录见 `METHOD.md`。无模型权重,故无 `ARTIFACTS.json`。diff --git a/solution/run.py b/solution/run.pyindex 544ab96..b81d07d 100644--- a/solution/run.py+++ b/solution/run.py@@ -1,32 +1,44 @@ #!/usr/bin/env python3-"""T2 extrapolation: copy-last expression + deterministic PCA-normalised, rescaled coordinates.--Mechanism (PLAN family T2HX-06).  Two parts:--1. Expression: the last observed stage is copied verbatim (alpha = 0).  On the-   proxy, pseudobulk displacement with alpha in [0.02, 0.05] never produced a-   gain above noise (cell_state 49.04-49.40 vs 50.00 at alpha = 0), so the-   shift mechanism is removed rather than tuned.--2. Coordinates: the last stage's point cloud is put in a deterministic-   canonical frame (centroid at origin, PCA rotation with fixed chirality and-   axis orientation via third moments) and then rescaled isotropically to-   ``FACTOR * max_k RMS(input_k)``.  Rationale: the measured RMS radius of a-   sample can only underestimate the extent of the structure (field of view /-   sections kept), it is not monotone in time (proxy inputs: 354 -> 217), and-   the embryo grows, so the target extent is at least the largest observed-   input RMS, damped by FACTOR.  PCA normalisation removes the arbitrary-   acquisition rotation of the sample so the scorer's alignment step compares-   clouds in a reproducible frame.  Cell-to-cell relative geometry is-   preserved (rigid rotation + global scale only).--``VEC_MECH_OFF=1`` disables PCA normalisation and rescaling (raw last-stage-coordinates = copy_last spatial part).  ``VEC_FACTOR`` overrides FACTOR-(scan knob, defaults to the committed value).--Single input stage: coordinates still get the canonical frame (scaling is-identity since the single input RMS is the cloud's own RMS); expression is-copied, stratified to max_cells.+"""T2 extrapolation: copy-last expression (trend mechanism falsified, alpha=0) + PCA-normalised rescaled coordinates.++Mechanism (PLAN family T2HX-03), implemented in full and committed with+alpha = 0 because the proxy falsified every alpha > 0.  Three parts:++1. Expression trend extrapolation (new, this node): with two or more input+   stages, compute the per-gene pseudobulk delta between the last two inputs,+   ``delta_g = mean(X_last[:, g]) - mean(X_prev[:, g])``, and displace every+   output cell of the last stage by ``alpha * delta_g`` (clipped at 0).  Each+   gene gets its own data-driven displacement; genes that did not change are+   not moved.  With a single input stage there is no delta and alpha is+   forced to 0 (expression copied verbatim).++   Proxy verdict (T2:heart:val_extrap, E8.25_late + E8.75 -> E9.5):+   alpha = 0.2 -> board 52.05 (expression_change 47.88, cell_state 44.98,+   de_direction -0.0596); alpha = 0.05 -> board 53.02 (expression_change+   47.88, cell_state 47.86); alpha = 0 (control) -> board 54.15 with all+   expression groups at 50.00.  de_score/de_direction are identical at+   alpha = 0.05 and 0.2 (direction metrics are magnitude-invariant), so the+   prev->last per-gene trend points away from the held-out target on this+   view for any alpha > 0; the committed default is the family boundary+   alpha = 0.  VEC_ALPHA re-enables the mechanism for future probes.++2. Expression baseline: the last observed stage's cells are otherwise copied+   verbatim (values and sparsity structure), stratified-sampled to max_cells+   when needed.++3. Coordinates (unchanged from parent): the last stage's point cloud is put+   in a deterministic canonical frame (centroid at origin, PCA rotation with+   fixed chirality and axis orientation via third moments) and then rescaled+   isotropically to ``FACTOR * max_k RMS(input_k)``.  Rationale: the measured+   RMS radius of a sample can only underestimate the extent of the structure+   (field of view / sections kept), it is not monotone in time, and the embryo+   grows, so the target extent is at least the largest observed input RMS,+   damped by FACTOR.  Cell-to-cell relative geometry is preserved.++``VEC_MECH_OFF=1`` disables the expression extrapolation (alpha forced to 0;+output equals the parent node: copied expression + scaled coordinates).+``VEC_ALPHA`` overrides ALPHA (scan knob, defaults to the committed value).+``VEC_FACTOR`` overrides FACTOR (scan knob). """  from __future__ import annotations@@ -51,6 +63,7 @@ from src.task2_spatial.view_io import ( )  FACTOR = 0.946+ALPHA = 0.0   def pca_canonicalise(coords: np.ndarray) -> tuple[np.ndarray, dict]:@@ -87,6 +100,13 @@ def pca_canonicalise(coords: np.ndarray) -> tuple[np.ndarray, dict]:     return x @ evecs, diag  +def gene_trend(prev, last) -> np.ndarray:+    """Per-gene pseudobulk delta mean(X_last) - mean(X_prev), panel order."""+    pm = np.asarray(prev.X.mean(axis=0), dtype=np.float64).ravel()+    lm = np.asarray(last.X.mean(axis=0), dtype=np.float64).ravel()+    return (lm - pm).astype(np.float32)++ def main() -> None:     parser = argparse.ArgumentParser()     parser.add_argument("--data", required=True)@@ -96,6 +116,7 @@ def main() -> None:      mech_off = os.environ.get("VEC_MECH_OFF", "") == "1"     factor = float(os.environ.get("VEC_FACTOR", "") or FACTOR)+    alpha = 0.0 if mech_off else float(os.environ.get("VEC_ALPHA", "") or ALPHA)      manifest = load_manifest(args.data)     genes = panel_genes(args.data, manifest)@@ -108,25 +129,41 @@ def main() -> None:     idx = np.arange(last.n) if n >= last.n else np.sort(take(last.labels, n, rng))     block = as_dense(last.X, idx).astype(np.float32) -    if mech_off:-        coords = last.coords[idx].astype(np.float32)-        info: dict = {"mech": "off", "n": int(len(idx)), "rms_out": round(rms_radius(coords), 2)}-    else:-        canon, pca_diag = pca_canonicalise(last.coords[idx])-        radii = [rms_radius(read_stage(args.data, e, genes).coords) for e in inputs_by_time(manifest)]-        target_rms = float(np.max(radii)) * factor-        coords = scale_to_rms(canon, target_rms).astype(np.float32)-        info = {-            "mech": "on",-            "factor": factor,-            "dt_ratio": float(ratio),-            "n": int(len(idx)),-            "pca": pca_diag,-            "rms_inputs": [round(r, 2) for r in radii],-            "rms_out": round(rms_radius(coords), 2),+    delta_info: dict = {}+    if alpha != 0.0 and prev_e is not None:+        prev = read_stage(args.data, prev_e, genes)+        delta = gene_trend(prev, last)+        shifted = block + np.float32(alpha) * delta+        n_clip_lo = int((shifted < 0.0).sum())+        block = np.clip(shifted, 0.0, None).astype(np.float32)+        ad = np.abs(delta)+        delta_info = {+            "alpha": alpha,+            "delta_med_abs": float(np.median(ad)),+            "delta_p90_abs": float(np.percentile(ad, 90)),+            "delta_max_abs": float(ad.max()),+            "n_genes_moved": int((ad > 1e-9).sum()),+            "l2_change": float(np.linalg.norm(block - as_dense(last.X, idx))),+            "n_clipped_entries": n_clip_lo,         }-        if prev_e is not None:-            info["step"] = [prev_e["stage"], last_e["stage"], manifest["target"]["stage"]]+        del prev++    canon, pca_diag = pca_canonicalise(last.coords[idx])+    radii = [rms_radius(read_stage(args.data, e, genes).coords) for e in inputs_by_time(manifest)]+    target_rms = float(np.max(radii)) * factor+    coords = scale_to_rms(canon, target_rms).astype(np.float32)+    info = {+        "mech": "off" if mech_off else "on",+        "factor": factor,+        "dt_ratio": float(ratio),+        "n": int(len(idx)),+        "pca": pca_diag,+        "rms_inputs": [round(r, 2) for r in radii],+        "rms_out": round(rms_radius(coords), 2),+    }+    info.update(delta_info)+    if prev_e is not None:+        info["step"] = [prev_e["stage"], last_e["stage"], manifest["target"]["stage"]]     print(json.dumps(info, default=float), file=sys.stderr)     write_t2(args.out, block, coords, genes, seed=args.seed) 

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

用到的知识库条目

编号标题出处
k007Interval staging and held-out-window filtering of external datanotes/official/来件/virtualembryo.ai/rules.md
k026Canonicalise predicted 3D coordinates before submissionnotes/pitfalls/04_scorer_invariance.md
k027Joint expression-geometry generation with relative geometrynotes/competition/03_solution_landscape.md

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

改了什么实现了 T2HX-03 基因级趋势外推(X_last + α·(mean_last − mean_prev),逐基因,clip 于 0),带 VEC_ALPHA/VEC_MECH_OFF 开关;坐标管线(PCA 规范化 + 0.946×max RMS)原样保留。proxy 上证伪(α=0.2→52.05、α=0.05→53.02),按 PLAN 停止规则提交 α=0,最终输出与父节点 12 逐字节相同。
各组分数的变化cell_state:噪声内:50.00 → 50.00(+0.00);proxy 探针 α=0.2 时 44.98(−5.02,方向为负)
expression_change:噪声内:50.00 → 50.00(+0.00,提交即 α=0,等同父节点);proxy 探针 α=0.2 时 47.88(−2.12,方向为负)
local_spatial:不变:50.00 → 50.00(+0.00);proxy 探针 α=0.2 时 49.46(−0.54)
shape_scale:不变:66.60 → 66.60(+0.00,坐标机制原样保留)
family_idT2HX-03
假设是否成立否
经验
  1. 在本视图(T2:heart:val_extrap,proxy=E8.25_late+E8.75→E9.5)上,沿 prev→last 逐基因伪批量差做线性外推,任何 α>0 都使榜分单调下降(α=0.05→53.02、α=0.2→52.05 vs α=0→54.15),且 de_direction=−0.0596 在两个 α 上完全相同——方向指标与幅度无关,缩小 α 只能稀释损失不能翻正,故不必扫更大的 α 网格。
  2. 诊断技巧:de_score/de_direction 在 α=0.05 与 α=0.2 完全一致,可据此判定失败源于趋势方向本身错误,而非位移幅度不当,避免浪费查分预算在幅度扫描上。
  3. 全局逐基因 delta 被 −0.124 的整体水平偏移主导(E8.75 表达水平比 E8.25_late 低约 20%,疑似跨样本覆盖/深度技术差而非生物趋势);组成控制后的分型 delta 与全局 delta 相关 0.71、校正变体 cos=0.87,说明失败主分量在'结构修复'变体中仍保留——离线相关性分析可提前排除变体、省查分。
  4. 至此'沿观测趋势外推表达'整族在 proxy 上已有 5 组独立证伪证据(node 4 分型 α=0.05、node 10 α=0.02、方法卡 damped_shift 分型网格 α∈[0.1,1.0]、官方 pseudobulk_shift 基线、本节点全局 delta 变体),后续节点不应再在该族内调参。
  5. 机制被证伪时提交族边界 α=0 并保留 VEC_ALPHA 开关代码是正确做法:不向树传播 proxy 上有害的机制,同时留下可复用实现;负 α(逆时间)虽在 proxy 得分更高但属打分器特化(利用样本间技术水平差),不可迁移,明确不做。
  6. 查询预算纪律:PLAN 设停止规则(首查 α=0.2 若 expression_change<50 即停),实际只用 4/20 次查分就完成证伪+对照+提交确认,值得沿用。
mechanism_active否
下一步建议
  1. 放弃表达侧'趋势外推'族(expression_change/cell_state 组):树内 5 组证据一致为负,任何 α>0 变体(全局、分型、水平校正)都不要再试。
  2. 若要突破 expression_change/cell_state 的 50.00 地板,需找与 prev→last 趋势正交的信号源,例如用 prior/ 调控网络约束下的谱系方向微调或细胞组成演化模型;每个新方向先用 1 次 proxy 查分确认 de_direction 符号为正再投入幅度扫描。
  3. shape_scale 组被 d2_shape=0.0489 钉在 66.60,只靠全局缩放无法再涨;如需提升需改变点云形状本身,且不依赖保留阶段信息——这是四个组里唯一有非零起点的组,优先级高于表达三组的 50.00 地板。

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

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

分析员

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

工程师

角色工程师 alibaba-token-plan-cn/qwen3.8-max
调用次数1 次
轮数27
工具调用共 33 次:bash 21、todowrite 3、read 3、write 3、edit 3
用时13 分
token 数输入 69,142 · 输出 11,594 · 思考 17,321
任务(第一行)按计划修改程序:阻尼基因级表达趋势外推 + 保留坐标缩放机制
最后的回答(摘录)
**做了什么**:按 PLAN 完整实现 T2HX-03 基因级趋势外推(`X + α·(mean_last − mean_prev)`,逐基因、含单输入退路与 `VEC_MECH_OFF`/`VEC_ALPHA` 开关),坐标管线原样保留父节点的 PCA 规范化 + 0.946×max RMS。

**查分结果**(4/20 次):α=0.2 → **52.05**(expression_change 47.88、cell_state 44.98、de_direction −0.0596),触发 PLAN 停止规则;边界探针 α=0.05 → 53.02(de 指标与幅度不变,方向性失败);对照 α=0 → **54.15** = 父节点;提交产物 → **54.15**,vec-check 通过、seed 0/1 及重跑逐字节确定。离线分析显示全局 delta 被 −20% 的跨样本表达水平差主导(疑似技术伪影),水平校正/组成控制变体与失败向量 cos≥0.74,未再耗查分。提交 α=0:该机制族(含全局 delta 变体)在 proxy 上被证伪,如实记录。

**下一步最值得试**:表达侧「沿观测趋势线性外推」已被 5 组独立证据证伪(node 4/10、方法卡分型网格、官方 pseudobulk_shift、本节点全局 delta),不建议再调 α;若要突破 50 地板,需要与 prev→last 趋势**正交**的变化来源(如 prior/ 调控网络约束下的谱系方向微调,或细胞组成演化),且任何新方向先用 1 次查分验证 de_direction 符号再投入。
原始记录位置/home/spark-longxinyang/vec/runs/formal/20261003-070222-search-t2-heart-extrap-g24-D/nodes/13/engineer.jsonl 164 KB
/home/spark-longxinyang/vec/runs/formal/20261003-070222-search-t2-heart-extrap-g24-D/nodes/13/engineer.stderr

调研员

角色调研员 alibaba-token-plan-cn/qwen3.8-max
调用次数1 次
轮数1
工具调用共 0 次:—
用时3 分
token 数输入 11,711 · 输出 1,120 · 思考 7,307
任务(第一行)为节点 n13(改进,父节点 n12)写改进计划 PLAN.json
最后的回答(摘录)
al trend information available from two input stages (E8.25_late → E8.75). A damped gene-level expression extrapolation is the minimal mechanism to address this.

```json
{
  "name": "阻尼基因级表达趋势外推 + 保留坐标缩放机制",
  "motivation": "父节点12及全树所有节点的表达均为copy_last(α=0),cell_state/expression_change/local_spatial三组恒50.00(=copy_last地板),是唯一未被突破的缺口。树内从未尝试过修改表达值本身——节点3/4/10的伪批量位移改的是坐标而非表达。两个输入阶段(E8.25_late→E8.75)提供每基因的时间趋势,线性外推可给出非零的表达变化预测,直接瞄准expression_change和cell_state。shape_scale已钉在66.60(d2_shape=0.0489),FACTOR=0.946已锁定不再扫。",
  "approach": "1. 保留父节点坐标管线不变(PCA规范化+各向同性缩放到0.946×max RMS)。2. 新增表达外推:加载prev和last两个输入阶段,对每个基因g计算delta_g = mean(X_last[:,g]) - mean(X_prev[:,g]);对末阶段每个细胞:X_pred[cell,g] = X_last[cell,g] + α·delta_g。3. α扫描顺序:先跑α=0.2确认方向(1次查询);若expression_change>50,扫[0.1, 0.3, 0.5, 1.0](4次);若方向为负立即停止并报告。4. 最优α附近细扫(±0.05步长,2-3次)。5. 单输入阶段退路:无prev时α强制为0(表达照抄,等同父节点)。6. vec-score快速筛选:每次只查proxy seed 0,关注expression_change和cell_state两组;若两组均≤50则判定方向为负,终止。7. 全量验证:最优α用seed 0/1跑两次确认稳定性。总查询预算≤12次。",
  "expected_groups": ["expression_change", "cell_state"],
  "risks": "1. 表达变化方向在last→target间可能反转(发育非线性),导致外推方向为负——Engineer第一次查α=0.2时若expression_change<50立即终止,不浪费后续查询。2. 细胞组成变化混杂基因均值(prev和last的细胞类型比例不同),delta_g可能反映组成变化而非真实表达动力学——缓解:α保守(≤1.0),且机制对照可隔离净效应。3. 改善幅度<T2噪声(1分)——需α扫描中至少2个相邻点同方向>50才判定为真信号。4. 稀疏矩阵上小delta可能被噪声淹没——检查修改后表达的L2变化量是否非零。",
  "family_id": "T2HX-03",
  "mechanism": "利用两个输入阶段的每基因均值差作为时间趋势向量,对末阶段表达做阻尼线性外推(α·Δ),预测目标阶段的表达变化方向与幅度。",
  "vs_constant_shift": "常数位移对全部基因施加同一标量偏移;本机制为每个基因计算独立的、数据驱动的位移量(由该基因在prev→last的实际变化决定),是一个基因空间中的方向向量而非标量。无变化的基因不被移动,变化大的基因获得大位移,且方向由实测时间序列决定。",
  "mechanism_evidence": "1. α>0时表达矩阵与copy_last的逐元素差异非零(报告L2范数和受影响基因数)。2. expression_change从50.00上升(目标≥51)。3. 报告每基因|delta|分布(中位数、P90),确认不是只有少数基因被移动。4. 四组分各自的变化:预期expression_change和cell_state上升,local_spatial和shape_scale不变(坐标未动)。",
  "mechanism_off_control": "环境变量VEC_ALPHA=0(或代码中设α=0),跳过表达外推,输出等同父节点(表达照抄+坐标缩放)。预期:expression_change和cell_state回到50.00,shape_scale保持66.60,总分回到54.15。若关闭后分数不变,说明表达外推未生效。",
  "sources": []
}
```
原始记录位置/home/spark-longxinyang/vec/runs/formal/20261003-070222-search-t2-heart-extrap-g24-D/nodes/13/researcher.jsonl 5 KB
/home/spark-longxinyang/vec/runs/formal/20261003-070222-search-t2-heart-extrap-g24-D/nodes/13/researcher.stderr