总览 · ← 返回运行 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 原文实现:
- 加载 prev(E8.25_late,58716 细胞)与 last(E8.75,24826 细胞)两个输入阶段,对每个基因 g 计算伪批量差
delta_g = mean(X_last[:,g]) − mean(X_prev[:,g])(面板序,500 基因)。 - 对末阶段每个输出细胞:
X_pred[cell,g] = clip(X_last[cell,g] + α·delta_g, 0, ∞)。每个基因有独立的、数据驱动的位移;无变化的基因不动(本视图上 500/500 基因 |delta|>0)。这不是常数位移(每基因不同标量),也不是组成重加权(细胞集合与比例不动)。 - 坐标管线与父节点完全一致:确定性 PCA 规范帧(去质心 → eigh 降序 → det=+1 → 第三矩定向)+ 各向同性缩放到
0.946 × max_k RMS(input_k)(proxy: rms_inputs=[354.13, 216.88] → rms_out=335.00)。 - 单输入退路:prev 不存在时无 delta,α 强制为 0,表达照抄、坐标同管线,不崩。
- 开关:
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_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开关后供后续节点复用。
验证过的
- 确定性:同 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)
t2hx03_a0.2→ 52.05(方向为负,触发 PLAN 停止规则)t2hx03_control_a0→ 54.15(机制关闭对照 = 父节点)t2hx03_a0.05→ 53.02(边界探针,确认单调)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)
调研来源?调研员查到并用到的知识条目和文献检索结果(只列标题和编号)。
用到的知识库条目
| 编号 | 标题 | 出处 |
|---|---|---|
| k007 | Interval staging and held-out-window filtering of external data | notes/official/来件/virtualembryo.ai/rules.md |
| k026 | Canonicalise predicted 3D coordinates before submission | notes/pitfalls/04_scorer_invariance.md |
| k027 | Joint expression-geometry generation with relative geometry | notes/competition/03_solution_landscape.md |
分析结果?分析员写的 ANALYSIS.json:改了什么、各组分数怎么变、假设是否成立、经验和下一步建议。
| 改了什么 | 实现了 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_id | T2HX-03 |
| 假设是否成立 | 否 |
| 经验 |
|
| mechanism_active | 否 |
| 下一步建议 |
|
对话摘要?每个角色和大模型对话的统计:轮数、工具调用、用时、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 |