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

总览 · ← 返回运行 20261003-172000-search-t2-heart-extrap-chain-12h

节点 n4

按基因型间方差占比 w_g=B_g/(B_g+W_g) 收缩按型伪批量位移(damped_shift 家族 T2HX-01),α=0.05,坐标/组成/细胞数照抄末输入。

运行?一次完整的自动搜索或 Agent 会话,有自己的锁定配置和证据包。20261003-172000-search-t2-heart-extrap-chain-12h
父节点n2
子节点n5
操作?种子:人写的起点;改进:在父节点上改;草稿:从头写;修复:修父节点的报错。改进
状态已打分
分数搜索目标分 49.89(+0.4) · proxy_noscale 49.89(+0.4) · 3 次复测均分 49.90
审查未审查
用时?从运行开始到结束(或到现在)的挂钟时间。17 分
程序版本f75a404e0f6e83e3b685b552607600f9efd367f3 (programs.git)
导入自20261003-105537-search-t2-heart-extrap-g24-D#4
备注re-scored at launch (origin 20261003-105537-search-t2-heart-extrap-g24-D node 4, score there 49.89)

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

来自 programs.git f75a404e0f:solution/METHOD.md

按基因型间方差占比 w_g=B_g/(B_g+W_g) 收缩按型伪批量位移(damped_shift 家族 T2HX-01),α=0.05,坐标/组成/细胞数照抄末输入。

方法

父节点(damped_shift α=0.1,49.51)基础上,对每个类型 t 的位移向量 delta_t = mean(last|t) − mean(prev|t) 逐基因乘权重 w_g:

  • w_g = B_g / (B_g + W_g + 1e-8),B_g = 末输入阶段按细胞数加权的型间方差,W_g = 池内(型内)方差;只在末输入阶段数据上现场计算,无任何硬编码统计量。
  • 末阶段细胞数 < 10 的类型回退 w=1(本视图无此类,两输入各 33 型、最小 18 细胞;final 上由程序现场判断)。
  • shift = α·w_g·delta_t,clip ≥ 0;α=0.05。
  • 坐标 = 末阶段自己的坐标(β=0,仅按 rms_last 归一,n=末阶段细胞数时等同原样);组成不动(α_comp=0);n = 末阶段细胞数夹到 [min,max](本视图 24826 ≤ 25179,全量输出,无抽样 → 输出对 seed 不变,仅文件元数据含 seed)。
  • 单输入退路:copy_last(与父节点相同)。
  • 机制开关:环境变量 T2HX_VARW=0 强制 w≡1(退化为父节点的均匀按型位移);T2HX_WMODE=cons 是试验过的另一权重(未采用);T2HX_ALPHA 覆盖 α。提交默认:VARW 开、WMODE=bt、α=0.05。

机制证据(proxy_noscale,A 半,seed 0)

配置榜分cell_stateexpression_changelocal_spatialvariogram skillde_score skill
父 α=0.1 均匀49.5148.4149.3550.270.4680.489
w 开 α=0.1549.5949.2049.1250.050.4840.479
w 关 α=0.15(对照)49.3948.0649.1650.350.4600.486
w 开 α=0.05(提交)49.8949.5550.0050.020.4910.500*
  • 开/关对照(同 α=0.15):加权使 variogram 0.460→0.484、cell_state 48.06→49.20,差异集中在 cell_state 组,符合 PLAN 预期机制方向;证明权重实际生效(w_mean=0.121,p10=0.004,p90=0.374;加权后位移 L2 为均匀的 23.4%,低于 PLAN 风险 1 的 30% 阈值——即权重同时把有效幅度压小,α=0.15 加权的收益部分来自更小的有效位移)。
  • α=0 对照:代码路径输出 = 末阶段原样(alpha32=0 时 clip(block+0·dw)=block),即 copy_last。
  • 所有 33 个共有类型的全部 24826 个细胞都收到位移(本视图两阶段类型完全同名);被压缩最多的是低 B/T(型内异质性主导)基因。
  • \*α=0.05 时 DE 两项 skill 恰为 0.500:位移已小到触发无变化保护(std(dp) < 1%·std(dt) → DE 记 0,与地板同),即提交配置在 DE 组上等同 copy_last,只在 variogram(0.491,略低于地板 0.5)上有可测差异。

结论(如实报告,PLAN 风险 3 成立)

  • 在 proxy_noscale 上,任何 α>0 都 ≤ copy_last(50.00):α 越大越差(0.05→49.89,0.1→49.51,0.15→49.59/关 49.39,与方法卡"skill 随 α 单调下降"一致)。方差加权确实按设计减轻了损伤(同 α 下 on > off),但没有把外推变成正收益。
  • 另试的型间符号一致性权重(w_g=|Σc_t δ_tg|/Σc_t|δ_tg|,α=0.15/0.5):49.52 / 49.49,de_score 反降至 0.476,未采用。
  • 提交 α=0.05 而非 α=0:本尺子上 −0.11(噪声内),但保留机制——若 final(E9.5→E10.5,步长比 4/3)的上一步方向正确,微小加权位移有正收益空间;若方向错误,损伤被限制在 ~0.1 分且 DE 触发无变化保护。这一点无法在代理上验证(方法卡:代理上一步是缩小,真实是长大;外推榜本地分历史上高估官网分)。
  • 终选护栏(>copy_last+1)本节点达不到,预期终选回退基线。

验证过 / 未验证

  • 验证过:proxy 视图格式(vec-check ok)、seed 0/1/2 内容与分数一致(输出对 seed 不变)、机制开关对照、α∈{0.05,0.15,0.5}×两种权重、运行 ~6 s / <1 GB。
  • 未验证:真实括号(final)上的方向与幅度;伪装视图重跑(代码无路径/绝对时间依赖,所有统计现场从 manifest 输入计算,预期通过);w_g 在 final 末两阶段类型交集很小时的稳定性(回退 w=1 逻辑未在实际小交集数据上跑过)。

知识来源

无外部生物学知识、无文献/数据库数值。全部统计量(类型均值、方差、权重、RMS、细胞数)从视图 manifest 指向的两个输入阶段现场计算。

调研员的计划

名称基因方差加权收缩的按型伪批量位移(修复 variogram 下降)
动机父节点 2(damped_shift α=0.1)得分 49.51,低于 copy_last 基线(节点 1,50.00)。最弱组 cell_state=48.41,其中 variogram skill 仅 0.468(地板 0.5),是唯一显著低于地板的指标。原因:父节点对全部 500 个基因施加相同的按型均值位移,高型内方差基因的型内协方差结构被平移打乱,导致跨细胞对距离分布(variogram 度量的 E|xi−xj|^0.5)失真。de_score skill 0.489 也略低于地板,说明位移方向对部分基因不正确。
做法在父节点 run.py 的 damped_shift 调用之前,增加一步基因权重计算:
1. 对 last 阶段,按细胞类型分组,计算每个基因 g 的型间方差 B_g 和总方差 T_g(型间+型内),权重 w_g = B_g / (T_g + eps),eps=1e-8。仅在 last 阶段数据上计算,不引入外部统计量。
2. 将父节点的按型位移向量 delta_t(每个类型一个 500 维向量)逐基因乘以 w_g,即 shift_{t,g} = α · w_g · delta_{t,g}。α 初始 0.15(略高于父节点 0.1,因为权重会缩小有效位移),搜索范围 [0.05, 0.3],步长 0.05。
3. 夹到 ≥0 的逻辑不变;坐标、组成、time_scale 均与父节点相同(β=0, α_comp=0, time_scale=False)。
4. 单输入阶段退路:若 prev 为 None,直接 copy_last,与父节点一致。
5. 用 vec-score 在 proxy_noscale 上查分;先跑 α=0(应等于 copy_last,验证权重不引入 bug)和 α=0.15,比较 variogram skill 是否回到 ≥0.50。若 α=0.15 的 variogram 改善但 de_score 下降,降到 α=0.10。最多查 6 次分。
6. 实现改动量:约 20 行 numpy 代码(方差计算 + 权重乘法),30 分钟内可完成。
风险1) 权重可能过度抑制有效位移,使输出趋近 copy_last(α 有效值太小);Engineer 应检查加权后位移的 L2 范数是否仍为父节点的 30%以上。2) 型间方差估计在小类型上噪声大;若某类型细胞数 <10,该类型回退到不加权(w=1)。3) 外推方向本身可能错误(METHOD.md 已警告),此时任何 α>0 都不如 α=0;若所有 α>0 的查分均 ≤ copy_last,应如实报告失败。4) 分数噪声约 1 分,差距 <1 分不算改善,需至少两次查分确认。

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

对比:父节点版本 0a69ad9676。改动的文件:solution/EXECUTION.json +1 −0、solution/METHOD.md +42 −0、solution/README.md +2 −5、solution/run.py +122 −19

diff --git a/solution/EXECUTION.json b/solution/EXECUTION.jsonnew file mode 100644index 0000000..9d5125c--- /dev/null+++ b/solution/EXECUTION.json@@ -0,0 +1 @@+{"gpu": false}diff --git a/solution/METHOD.md b/solution/METHOD.mdnew file mode 100644index 0000000..f6c941e--- /dev/null+++ b/solution/METHOD.md@@ -0,0 +1,42 @@+按基因型间方差占比 w_g=B_g/(B_g+W_g) 收缩按型伪批量位移(damped_shift 家族 T2HX-01),α=0.05,坐标/组成/细胞数照抄末输入。++## 方法++父节点(damped_shift α=0.1,49.51)基础上,对每个类型 t 的位移向量 delta_t = mean(last|t) − mean(prev|t) 逐基因乘权重 w_g:++- w_g = B_g / (B_g + W_g + 1e-8),B_g = 末输入阶段按细胞数加权的型间方差,W_g = 池内(型内)方差;**只在末输入阶段数据上现场计算**,无任何硬编码统计量。+- 末阶段细胞数 < 10 的类型回退 w=1(本视图无此类,两输入各 33 型、最小 18 细胞;final 上由程序现场判断)。+- shift = α·w_g·delta_t,clip ≥ 0;α=0.05。+- 坐标 = 末阶段自己的坐标(β=0,仅按 rms_last 归一,n=末阶段细胞数时等同原样);组成不动(α_comp=0);n = 末阶段细胞数夹到 [min,max](本视图 24826 ≤ 25179,全量输出,无抽样 → 输出对 seed 不变,仅文件元数据含 seed)。+- 单输入退路:copy_last(与父节点相同)。+- 机制开关:环境变量 `T2HX_VARW=0` 强制 w≡1(退化为父节点的均匀按型位移);`T2HX_WMODE=cons` 是试验过的另一权重(未采用);`T2HX_ALPHA` 覆盖 α。提交默认:VARW 开、WMODE=bt、α=0.05。++## 机制证据(proxy_noscale,A 半,seed 0)++| 配置 | 榜分 | cell_state | expression_change | local_spatial | variogram skill | de_score skill |+|---|---:|---:|---:|---:|---:|---:|+| 父 α=0.1 均匀 | 49.51 | 48.41 | 49.35 | 50.27 | 0.468 | 0.489 |+| w 开 α=0.15 | 49.59 | 49.20 | 49.12 | 50.05 | 0.484 | 0.479 |+| **w 关 α=0.15(对照)** | **49.39** | **48.06** | **49.16** | **50.35** | **0.460** | 0.486 |+| w 开 α=0.05(提交) | 49.89 | 49.55 | 50.00 | 50.02 | 0.491 | 0.500* |++- 开/关对照(同 α=0.15):加权使 variogram 0.460→0.484、cell_state 48.06→49.20,差异集中在 cell_state 组,符合 PLAN 预期机制方向;证明权重实际生效(w_mean=0.121,p10=0.004,p90=0.374;加权后位移 L2 为均匀的 23.4%,低于 PLAN 风险 1 的 30% 阈值——即权重同时把有效幅度压小,α=0.15 加权的收益部分来自更小的有效位移)。+- α=0 对照:代码路径输出 = 末阶段原样(alpha32=0 时 `clip(block+0·dw)=block`),即 copy_last。+- 所有 33 个共有类型的全部 24826 个细胞都收到位移(本视图两阶段类型完全同名);被压缩最多的是低 B/T(型内异质性主导)基因。+- \*α=0.05 时 DE 两项 skill 恰为 0.500:位移已小到触发无变化保护(std(dp) < 1%·std(dt) → DE 记 0,与地板同),即提交配置在 DE 组上等同 copy_last,只在 variogram(0.491,略低于地板 0.5)上有可测差异。++## 结论(如实报告,PLAN 风险 3 成立)++- 在 proxy_noscale 上,**任何 α>0 都 ≤ copy_last(50.00)**:α 越大越差(0.05→49.89,0.1→49.51,0.15→49.59/关 49.39,与方法卡"skill 随 α 单调下降"一致)。方差加权确实按设计减轻了损伤(同 α 下 on > off),但没有把外推变成正收益。+- 另试的型间符号一致性权重(w_g=|Σc_t δ_tg|/Σc_t|δ_tg|,α=0.15/0.5):49.52 / 49.49,de_score 反降至 0.476,未采用。+- 提交 α=0.05 而非 α=0:本尺子上 −0.11(噪声内),但保留机制——若 final(E9.5→E10.5,步长比 4/3)的上一步方向正确,微小加权位移有正收益空间;若方向错误,损伤被限制在 ~0.1 分且 DE 触发无变化保护。**这一点无法在代理上验证**(方法卡:代理上一步是缩小,真实是长大;外推榜本地分历史上高估官网分)。+- 终选护栏(>copy_last+1)本节点达不到,预期终选回退基线。++## 验证过 / 未验证++- 验证过:proxy 视图格式(vec-check ok)、seed 0/1/2 内容与分数一致(输出对 seed 不变)、机制开关对照、α∈{0.05,0.15,0.5}×两种权重、运行 ~6 s / <1 GB。+- 未验证:真实括号(final)上的方向与幅度;伪装视图重跑(代码无路径/绝对时间依赖,所有统计现场从 manifest 输入计算,预期通过);`w_g` 在 final 末两阶段类型交集很小时的稳定性(回退 w=1 逻辑未在实际小交集数据上跑过)。++## 知识来源++无外部生物学知识、无文献/数据库数值。全部统计量(类型均值、方差、权重、RMS、细胞数)从视图 manifest 指向的两个输入阶段现场计算。diff --git a/solution/README.md b/solution/README.mdindex 55efcde..424574a 100644--- a/solution/README.md+++ b/solution/README.md@@ -1,6 +1,3 @@-# damped_shift(T2:heart:val_extrap)+# damped_shift + 基因型间方差加权收缩(T2:heart:val_extrap) -最新两个输入 (prev, last);last 的每个细胞加 α·(mean(last|类型) − mean(prev|类型)),只对两阶段同名的类型,夹到 ≥0。α=0.1,β=0(坐标就是 last 自己的,不缩放),α_comp=0(组成不动),time_scale 关(不乘步长比)。这是方法卡网格里最好的非平凡点;方法卡最终提交的 α=0 等于 `copy_last`。-proxy(两个较早的已发布心脏阶段 → 第三个,步长比 1.5)预期 49.47(seed 0 实测 49.475,与网格 `damp_a010_c0` 一致;表达 49.2 / 状态 48.5 / 形状 50.0 / 邻域 50.3)。-final(最新两个已发布心脏阶段 → E10.5,步长比 4/3):n = 榜上限,坐标原尺度;末步同名类型少,分型位移在 final 上基本空转(同名类型数由程序从输入算)。-已知弱点:代理与真实的上一步尺寸走向可能相反,α、β 的方向在代理上验证不了。这是起点,不是方案。各阶段的尺寸、细胞数不在这里给出(2026-10-03 泄漏审计:每个已发布心脏阶段都是某个本地尺子的目标)。+末输入全量输出;每个共有类型加 α·w_g·(mean(last|t) − mean(prev|t)),w_g = B_g/(B_g+W_g)(末阶段型间方差占比,现场计算),α=0.05,clip≥0;坐标/组成/细胞数照抄末输入。机制开关 `T2HX_VARW=0`(关=均匀位移)、`T2HX_ALPHA`、`T2HX_WMODE`。详见 METHOD.md(含开/关对照与查分结果)。diff --git a/solution/run.py b/solution/run.pyindex d62b7bc..b664330 100644--- a/solution/run.py+++ b/solution/run.py@@ -1,30 +1,81 @@ #!/usr/bin/env python3-"""damped_shift (T2 extrapolation): last input + α·per-type pseudobulk delta of the last step.+"""Variance-weighted damped_shift (T2 extrapolation), family T2HX-01. -Takes the two latest inputs (prev, last). Each last-stage cell of a type that-also exists in prev gets α·(mean(last|type) − mean(prev|type)), clipped at 0.-Coordinates are the last stage's own, rescaled by exp(β·Δlog RMS) (β=0 keeps-the scale); composition moves by α_comp·Δfraction (0 keeps it). Cell count is-the last stage's, clipped to the board range. ``time_scale`` is off, so the-step ratio (target − last)/(last − prev) is not applied.+Same skeleton as the parent (last input + alpha * per-type pseudobulk delta of+the last step, coords/counts/composition held), but the per-type delta is+shrunk gene-wise by w_g = B_g / (B_g + W_g + eps): B_g is the between-type+(count-weighted) variance of the last stage's type means, W_g the pooled+within-type variance, both computed on the last input only. Genes whose+last-stage variation is mostly within-type heterogeneity move less, protecting+the gene-gene covariance structure the variogram metric scores. -ALPHA=0.1 is the best non-trivial point of the T2 card's grid (proxy 49.47);-α=0 is copy_last, the card's submitted choice. With one input, copy the last.+Types with fewer than MIN_TYPE_CELLS cells in the last stage fall back to the+unweighted delta (their variance estimates are too noisy). With one input the+program copies the last stage, as the parent does.++Mechanism switch: T2HX_VARW=0 forces w_g = 1 for every gene, which reduces the+program to the parent's uniform per-type shift at the same alpha (control). """  from __future__ import annotations  import argparse import json+import os import sys  import numpy as np -from src.task2_spatial.methods import damped_shift-from src.task2_spatial.sample import take-from src.task2_spatial.view_io import board_params, extrap_step, load_manifest, panel_genes, read_stage, write_t2+from src.task2_spatial.frame import rms_radius, scale_to_rms+from src.task2_spatial.sample import extrap_count, take+from src.task2_spatial.shift import type_means+from src.task2_spatial.transport import as_dense+from src.task2_spatial.view_io import extrap_step, load_manifest, panel_genes, read_stage, write_t2++ALPHA = float(os.environ.get("T2HX_ALPHA", "0.05"))+VARW = os.environ.get("T2HX_VARW", "1") != "0"+WMODE = os.environ.get("T2HX_WMODE", "bt")+MIN_TYPE_CELLS = 10+EPS = 1e-8+ -PARAMS = {"alpha": 0.1, "beta": 0.0, "alpha_comp": 0.0, "n_damp": 0.0, "time_scale": False}+def consistency_weights(deltas: dict[str, np.ndarray], counts: dict[str, int]) -> np.ndarray:+    """w_g = |sum_t c_t delta_tg| / sum_t c_t |delta_tg|: sign-consistency of the per-type step."""+    labs = list(deltas)+    D = np.stack([deltas[t].astype(np.float64) for t in labs])+    C = np.array([counts[t] for t in labs], dtype=np.float64)+    C = C / max(C.sum(), 1.0)+    num = np.abs((C[:, None] * D).sum(axis=0))+    den = (C[:, None] * np.abs(D)).sum(axis=0) + EPS+    return (num / den).astype(np.float32)+++def gene_type_weights(X, labels: np.ndarray) -> tuple[np.ndarray, set[str]]:+    """Per-gene between-type variance share w_g = B_g / (B_g + W_g + eps) of the last stage."""+    labels = np.asarray(labels).astype(str)+    types, counts = np.unique(labels, return_counts=True)+    n_genes = int(X.shape[1])+    grand = as_dense(X, np.arange(len(labels))).mean(axis=0).astype(np.float64)+    B = np.zeros(n_genes, dtype=np.float64)+    W = np.zeros(n_genes, dtype=np.float64)+    ntot = 0+    small: set[str] = set()+    for t, c in zip(types.tolist(), counts.tolist()):+        if c < MIN_TYPE_CELLS:+            small.add(t)+            continue+        d = as_dense(X, np.flatnonzero(labels == t)).astype(np.float64)+        mu = d.mean(axis=0)+        var = d.var(axis=0)+        B += c * (mu - grand) ** 2+        W += c * var+        ntot += c+    if ntot == 0:+        return np.ones(n_genes, dtype=np.float32), set(types.tolist())+    B /= ntot+    W /= ntot+    w = (B / (B + W + EPS)).astype(np.float32)+    return w, small   def main() -> None:@@ -38,17 +89,69 @@ def main() -> None:     genes = panel_genes(args.data, manifest)     prev, last, ratio = extrap_step(manifest)     stage_last = read_stage(args.data, last, genes)+    lo, hi = int(manifest["min_cells"]), int(manifest["max_cells"])+     if prev is None:-        n = int(np.clip(stage_last.n, manifest["min_cells"], manifest["max_cells"]))+        n = int(np.clip(stage_last.n, lo, hi))         rows = np.sort(take(stage_last.labels, min(n, stage_last.n), np.random.default_rng(args.seed)))         write_t2(args.out, stage_last.X[rows].toarray(), stage_last.coords[rows], genes, seed=args.seed)         return+     stage_prev = read_stage(args.data, prev, genes)-    params = board_params(manifest, "damped_shift", PARAMS, args.seed)-    expr, coords, info = damped_shift(stage_prev, stage_last, ratio, params)-    keep = {k: info.get(k) for k in ("alpha", "beta", "dt_ratio", "n", "rms_prev", "rms_last", "out_rms", "n_shared_types")}-    print(json.dumps({"step": [prev["stage"], last["stage"]], **keep}, default=float), file=sys.stderr)-    write_t2(args.out, expr, coords, genes, seed=args.seed)+    rng = np.random.default_rng(args.seed)+    n = int(np.clip(extrap_count(stage_prev.n, stage_last.n, 0.0, lo, hi), lo, hi))+    idx = np.arange(stage_last.n) if n >= stage_last.n else take(stage_last.labels, n, rng)++    means_prev = type_means(stage_prev.X, stage_prev.labels)+    means_last = type_means(stage_last.X, stage_last.labels)+    w, small = gene_type_weights(stage_last.X, stage_last.labels)+    if WMODE == "cons":+        labs = np.asarray(stage_last.labels).astype(str)+        counts = {t: int((labs == t).sum()) for t in means_last}+        big = {t: (means_last[t] - means_prev[t]).astype(np.float32) for t in means_last if t in means_prev and counts[t] >= MIN_TYPE_CELLS}+        w = consistency_weights(big, counts) if big else np.ones_like(w)+    if not VARW:+        w = np.ones_like(w)++    block = as_dense(stage_last.X, idx)+    out = block.copy()+    sub_labels = np.asarray(stage_last.labels).astype(str)[idx]+    alpha32 = np.float32(ALPHA)+    norm_w = 0.0+    norm_u = 0.0+    n_shared = 0+    for lab, mu in means_last.items():+        if lab not in means_prev:+            continue+        n_shared += 1+        d = (mu - means_prev[lab]).astype(np.float32)+        dw = d if lab in small else w * d+        norm_w += float(np.dot(dw, dw))+        norm_u += float(np.dot(d, d))+        mask = sub_labels == lab+        if not mask.any():+            continue+        out[mask] = np.clip(block[mask] + alpha32 * dw, 0.0, None)++    rms_last = rms_radius(stage_last.coords)+    coords = scale_to_rms(stage_last.coords[idx], rms_last)+    expr = np.clip(out, 0.0, None).astype(np.float32)++    info = {+        "method": "damped_shift_varw",+        "alpha": ALPHA,+        "varw": VARW, "wmode": WMODE,+        "n": int(expr.shape[0]),+        "n_shared_types": n_shared,+        "w_mean": float(w.mean()),+        "w_p10": float(np.quantile(w, 0.10)),+        "w_p90": float(np.quantile(w, 0.90)),+        "shift_l2_ratio": float(np.sqrt(norm_w / max(norm_u, 1e-12))),+        "rms_last": float(rms_last),+        "out_rms": float(rms_radius(coords)),+    }+    print(json.dumps({"step": [prev["stage"], last["stage"]], **info}, default=float), file=sys.stderr)+    write_t2(args.out, expr, coords.astype(np.float32), genes, seed=args.seed)   if __name__ == "__main__":

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

用到的知识库条目

编号标题出处
k016Degenerate-solution checks for population predictionsnotes/handover/02_知识学习路线.md
k007Interval staging and held-out-window filtering of external datanotes/official/来件/virtualembryo.ai/rules.md
k021Low-rank covariance residuals to avoid mean collapsenotes/guides/modeling_and_evaluation_guide.html

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

改了什么在父节点 damped_shift 骨架上,把按型伪批量位移 delta_t 逐基因乘以末阶段现场计算的型间方差占比 w_g=B_g/(B_g+W_g)(<10 细胞的类型回退 w=1),并把 α 从 0.1 降到 0.05;坐标/组成/细胞数照抄末输入。实现为 run.py 内联(+环境变量开关 T2HX_VARW / T2HX_ALPHA / T2HX_WMODE),另试的型间符号一致性权重未采用。
各组分数的变化cell_state:49.55(+1.14,略高于 T2 约 1 分噪声)——全部来自 variogram:原始 0.06601→0.06016,skill 0.468→0.491,+0.29 分;mmd_u 不动(0.05821→0.05832,skill 0.500,−0.01 分)。variogram 仍未回到地板 0.500,PLAN 的 ≥0.50 判据未达。
expression_change:50.00(+0.65)——但不是 DE 预测变好:de_score 原始 −0.0417→0、de_direction −0.0091→0,两项 skill 同时回到 0.500(=地板),是位移小到触发无变化保护(std(dp)<1%·std(dt) → DE 记 0),该组实质退化为 copy_last。
local_spatial:50.02(−0.25)——neighborhood_mmd 0.1114→0.1125,skill 0.503→0.500,在噪声内;结构门未触发(邻域 skill ≥0.5)。
shape_scale:50.00(+0.00)——三项原始值与父节点完全相同(d2_shape 0.04911、occupancy_dice 0.8066、scale_log_ratio −0.4334),坐标没动,符合设计。
family_idT2HX-01
假设是否成立unclear
经验
  1. 在 T2 外推榜的 damped_shift 家族里,任何 α>0 都不如 copy_last:α=0.05→49.89、0.1→49.51、0.15→49.59(关权重 49.39),全部 ≤50.00;逐基因加权只能减轻损伤(同 α 下 on>off),不能把外推位移变成收益。
  2. 机制开/关对照要放在同一 α 上做才有解释力:α=0.15 下 VARW 开 49.59 vs 关 49.39、variogram 0.484 vs 0.460,差异集中在 cell_state,才能把改善归因到权重而不是更小的有效幅度。
  3. 加权同时压小了有效幅度(w_mean=0.121,加权后位移 L2 只有均匀位移的 23.4%,低于 PLAN 的 30% 阈值),所以"加权有效"与"位移更小"混杂;应补一个把加权位移重标定回同 L2 的对照来分离两者。
  4. DE 两项的 skill=0.500 是"位移小到触发无变化保护"的产物,不是方向预测变准;读 expression_change 组时必须核对 de_score/de_direction 的原始值是否恰为 0。
  5. 把 α 从 0.1 降到 0.05 带来的 +0.39 榜分在 T2 约 1 分噪声内,且本节点 49.89 仍低于 copy_last 50.00,这类"向基线回退"不应记作 improve 成功。
  6. 形状组三项对外推位移完全不敏感(坐标不动则原始值逐位相同),在只动表达的方案里不必再查形状分。
mechanism_active是
下一步建议
  1. 终选/回退:T2:heart:val_extrap 上直接提交 copy_last(α=0,50.00),把本节点的方差加权只作为"若真实外推方向正确"的可选微调,不要在 α/权重上继续网格(α∈{0.05,0.1,0.15,0.5} 已覆盖,全部 ≤copy_last)。
  2. 若继续做位移类方法,先加一个 L2 重标定对照(加权后位移缩放回与均匀位移同 L2 再乘 α),在 cell_state 组上单独看 variogram skill 是否 >0.50,以区分"权重选择性"与"幅度变小"两种解释。
  3. 换信息源而不是换 α:针对 expression_change / cell_state 组,用 prior/ 的 TF regulon、Reactome 通路约束构造位移方向(只对通路内、且两阶段型间方向一致的基因给非零位移),先在 proxy 上验证 de_score 原始值能否从 0 变正、skill>0.500,再上 final。
  4. 针对 local_spatial(唯一 skill ≥0.5 的组,neighborhood_mmd 0.1114):做"只改坐标不改表达"的探索(例如按局部表达相似性做小幅位置重排),看 neighborhood_mmd 能否降到 <0.111;注意坐标一动形状组三项也会变,需同时监控结构门。

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

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

分析员

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

工程师

角色工程师 alibaba-token-plan-cn/qwen3.8-max
调用次数1 次
轮数30
工具调用共 33 次:—
用时12 分
token 数输入 63,672 · 输出 8,783 · 思考 11,927
任务(第一行)按计划修改程序:基因方差加权收缩的按型伪批量位移(修复 variogram 下降)
最后的回答(摘录)
**做了什么**:按 PLAN 实现基因型间方差加权收缩的按型位移(w_g=B_g/(B_g+W_g),末阶段现场计算,α=0.05),含机制开关与单输入退路;另试了型间符号一致性权重(失败,未采用)。查分 6 次。

**查分结果**(proxy_noscale,A 半):提交配置 49.89(seed 0/1 一致,vec-check ok),父节点 49.51;机制开/关对照(同 α=0.15)49.59 vs 49.39,variogram 0.460→0.484——机制按设计生效但仍是减损,不是收益。PLAN 风险 3 成立:本尺子上任何 α>0 都 ≤ copy_last(50.00),METHOD.md 已如实记录;提交 α=0.05 保留机制(DE 触发无变化保护,损伤 ~0.1),预期达不到终选 +1 护栏。

**下一步最值得试**:外推方向在本代理上不可验证(代理上一步是缩小、真实是长大),继续在 α/权重上网格没有空间;更有希望的是换信息源——用 `prior/`(TF regulons、Reactome)或允许的外部数据构造与阶段趋势一致性更高的位移方向,或转向组成/邻域结构(local_spatial 是唯一 >0.5 的组,neighborhood 0.503–0.512 随位移增大而升,值得单独探索大 α+保结构权重)。
原始记录位置/home/spark-longxinyang/vec/runs/formal/20261003-172000-search-t2-heart-extrap-chain-12h/nodes/4/engineer.jsonl (文件不在)

调研员

角色调研员 alibaba-token-plan-cn/qwen3.8-max
调用次数2 次
轮数2
工具调用共 0 次:—
用时3 分
token 数输入 9,534 · 输出 2,175 · 思考 6,852
任务(第一行)为节点 n4(改进,父节点 n2)写改进计划 PLAN.json
最后的回答(摘录)
{
  "name": "基因方差加权收缩的按型伪批量位移(修复 variogram 下降)",
  "motivation": "父节点 2(damped_shift α=0.1)得分 49.51,低于 copy_last 基线(节点 1,50.00)。最弱组 cell_state=48.41,其中 variogram skill 仅 0.468(地板 0.5),是唯一显著低于地板的指标。原因:父节点对全部 500 个基因施加相同的按型均值位移,高型内方差基因的型内协方差结构被平移打乱,导致跨细胞对距离分布(variogram 度量的 E|xi−xj|^0.5)失真。de_score skill 0.489 也略低于地板,说明位移方向对部分基因不正确。",
  "approach": "在父节点 run.py 的 damped_shift 调用之前,增加一步基因权重计算:\n1. 对 last 阶段,按细胞类型分组,计算每个基因 g 的型间方差 B_g 和总方差 T_g(型间+型内),权重 w_g = B_g / (T_g + eps),eps=1e-8。仅在 last 阶段数据上计算,不引入外部统计量。\n2. 将父节点的按型位移向量 delta_t(每个类型一个 500 维向量)逐基因乘以 w_g,即 shift_{t,g} = α · w_g · delta_{t,g}。α 初始 0.15(略高于父节点 0.1,因为权重会缩小有效位移),搜索范围 [0.05, 0.3],步长 0.05。\n3. 夹到 ≥0 的逻辑不变;坐标、组成、time_scale 均与父节点相同(β=0, α_comp=0, time_scale=False)。\n4. 单输入阶段退路:若 prev 为 None,直接 copy_last,与父节点一致。\n5. 用 vec-score 在 proxy_noscale 上查分;先跑 α=0(应等于 copy_last,验证权重不引入 bug)和 α=0.15,比较 variogram skill 是否回到 ≥0.50。若 α=0.15 的 variogram 改善但 de_score 下降,降到 α=0.10。最多查 6 次分。\n6. 实现改动量:约 20 行 numpy 代码(方差计算 + 权重乘法),30 分钟内可完成。",
  "expected_groups": ["cell_state", "expression_change"],
  "risks": "1) 权重可能过度抑制有效位移,使输出趋近 copy_last(α 有效值太小);Engineer 应检查加权后位移的 L2 范数是否仍为父节点的 30%以上。2) 型间方差估计在小类型上噪声大;若某类型细胞数 <10,该类型回退到不加权(w=1)。3) 外推方向本身可能错误(METHOD.md 已警告),此时任何 α>0 都不如 α=0;若所有 α>0 的查分均 ≤ copy_last,应如实报告失败。4) 分数噪声约 1 分,差距 <1 分不算改善,需至少两次查分确认。",
  "family_id": "T2HX-01",
  "mechanism": "按基因型间方差占比对按型伪批量位移做逐基因收缩:高型内方差基因(其变异主要反映型内异质性而非阶段趋势)的位移被压小,从而保护 variogram 度量的基因共变结构。",
  "vs_constant_shift": "父节点对全部基因施加相同的 α·delta(每型一个常向量);本方案将位移乘以逐基因权重 w_g = B_g/T_g,使位移在基因维度上非均匀——型间差异小的基因几乎不移,型间差异大的基因才移。这不是全局组成重加权(不改类型比例),也不是单纯缩小 α(α 仍控制幅度,权重控制方向选择性)。",
  "mechanism_evidence": "1) 打印加权前后位移向量的每基因幅度分布,确认低 B/T 基因的位移被显著压缩;2) 比较 variogram skill:父节点 0.468,本方案应 ≥0.50;3) 检查 mmd_u skill 不恶化(≥0.500);4) 对比加权与不加权(全 w=1)在相同 α 下的四组分差异,差异应集中在 cell_state 组。",
  "mechanism_off_control": "将权重数组全部设为 1.0(即 w_g=1 对所有基因),此时退化为父节点的均匀按型位移;预期输出与父节点完全相同(相同 α 下)。若关闭后输出不变,说明权重计算未生效。另一对照:α=0,输出应等于 copy_last。",
  "sources": []
}
原始记录位置/home/spark-longxinyang/vec/runs/formal/20261003-172000-search-t2-heart-extrap-chain-12h/nodes/4/researcher.jsonl (文件不在)
/home/spark-longxinyang/vec/runs/formal/20261003-172000-search-t2-heart-extrap-chain-12h/nodes/4/researcher.1.jsonl (文件不在)