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

总览 · ← 返回运行 20261001-140531-search-t1-g23-spark

节点 n12

METHOD

运行?一次完整的自动搜索或 Agent 会话,有自己的锁定配置和证据包。20261001-140531-search-t1-g23-spark
父节点n8
子节点—
操作?种子:人写的起点;改进:在父节点上改;草稿:从头写;修复:修父节点的报错。改进
状态已打分
分数搜索目标分 54.15(+1.0) · proxy 56.23(+0.0) · proxy2 56.23(+0.0) · X3 50.00(+3.1) · 3 次复测均分 54.02
审查通过 1 越界读取:未发现问题。run.py 只通过 view_io(load_manifest/inputs_by_time/external_inputs/read_stage)读取 manifest 提供的输入阶段(run.py:252-280),无绝对路径、无 ..//mnt//home、不读目标阶段或 src/common/evaluation,无联网;导入的 src.task1_temporal.{reweight,view_io} 是任务框架模块而非打分器。; 2 硬编码目标统计量:未发现问题。数值常量仅为 N_CELLS=4000、winsor=1.0、heart_w=1.6/ed…
用时?从运行开始到结束(或到现在)的挂钟时间。15 分
程序版本a225ae1198eb2e3eed49eac84cb77b57732c17c1 (programs.git)

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

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

METHOD

词表守卫:官方标签视图沿用心脏重加权(输出与父节点逐位相同);外来标签视图(X3 Qiu)直传最新输入全部真实细胞;两阶段位移经 top-K 限域网格实测劣于直传,默认关闭(α=0)。

方法

基座 = 节点 8 的 run.py。按最新输入阶段标签落在已知心脏词表(HEART_TYPES ∪ EDGE_TYPES ∪ DROP_TYPES,来自 src.task1_temporal.reweight,E8.5/E9.5 官方命名)的比例 f 分流:

  • f ≥ 0.5(官方标签:proxy / proxy2 / final):逐位复现父节点路径——最新官方输入按类型重加权(心脏 ×1.6、边缘 ×0.25、丢 Neural Tube)抽 4000 个真实细胞,RNG 顺序与节点 2/8 完全一致。proxy2 的外部锚(Qiu E9.0)保持禁用(节点 8 已证有害)。
  • f < 0.5(外来标签:X3 的 Qiu 簇名,f=0):直传——原样输出最新输入阶段全部真实细胞(2174 个,落在 [500, 5000] 内故无重采样;超界时无放回抽样/补齐)。不做有放回重采样(树内已证 4000>2174 的重采样亏 ~3 分)。输出与 seed 无关(X 逐位相同,仅 uns.generator_seed 元数据不同)。

保留但默认关闭的机制(--alpha-2stage > 0 才生效):top-K 限域两阶段位移 two_stage_deltas_restricted——≥2 个同数据集官方输入时,对共有类型算伪批量差 Δ=mean(last|t)−mean(prev|t),乘时间比 r=(t_target−t_last)/(t_last−t_prev) clip [0,2],winsorize ±1.0;基因限域为各类型 |Δ| 逐基因最大值排名 top-K(默认 500),剔除看家基因(Rpl/Rps/Mt-*/Actb/Gapdh/Actg1),限域外一律不动;|αΔ|<0.05 置零;零保留应用(只移非零项、clip≥0)。

验证(A 半,seed 0,本节点实测)

  • proxy:56.19(与父节点输出 md5 逐位相同;父正式分 56.23)
  • proxy2:与 proxy 输出逐位相同(单官方输入、锚关闭)
  • X3 直传(α=0,提交配置):50.00(恰为 copy_last 地板)
  • X3 限域位移 α=0.5,K=500(α_eff=1.0):48.66(de_recovery 46.09、cell_state 49.31、covariation 49.57)——全面劣于直传
  • X3 限域位移 α=0.3,K=200(α_eff=0.6):48.93——同样劣于直传
  • 结论:top-K 限域不仅没救回节点 8 全基因位移的 cell_state/covariation 损失,连 de_recovery 也从 47.75 掉到 46.09——|Δ| 最大的 top-K 基因主要携带技术/组成噪声而非目标方向信号。位移方向在 X3 上第三次被否决(节点 6 全局阻尼、节点 8 全基因零保留、本节点 top-K 限域零保留)。
  • proxy 重加权网格(heart_w∈{1.3,1.6,2.0}×edge_w∈{0.1,0.25,0.5},7 个 A 半查分):最优仍是 (1.6,0.1)≈56.25 与 (1.6,0.25)=56.19,差 0.05 为噪声;1.3/2.0 或 edge 0.5 都降到 ~55.5。维持 1.6/0.25 保证与父节点逐位一致。

未验证

  • final 视图(官方 E8.5+E9.5,f≥0.5):走重加权路径,位移默认关。两阶段位移在 final 上未测(X3 三次否决后不再投入)。
  • B 半分数:直传与重加权输出确定,B 半应稳定复现(预期 rank3 ≈ 54.0,追平节点 4/7,超父节点 +1)。
  • 直传路径下细胞数 > max_cells 或 < min_cells 的视图(X3 不触发)。

生物学知识来源

仅使用 modeling/ 内已有的官方类型词表(HEART/EDGE/DROP,节点 2 种子自带);未引入保留阶段(E10.5/E12.5、9.5<E≤13.5)或保留基因型的任何信息。X3 直传不依赖任何细胞类型知识(f=0 时完全绕开词表)。

调研员的计划

名称X3 词表守卫直传 + top-K 基因限域保守两阶段位移(组合节点4/7与节点8部件)
动机父节点 8 榜分 53.12,最弱组 de_recovery 51.69、covariation 52.42,短板全部来自 X3(46.90 vs proxy/proxy2 56.23)。树内两条已验证事实:(1) 节点 4/7 证明 X3 上有放回重采样(4000>2174 真实细胞)本身亏 ~3.1 分,直传全部真实细胞使 X3 恰好回到 50.00(rank3 54.02,当前最佳);(2) 节点 8 证明同数据集两阶段 per-type 零保留位移在 α_eff=2、全基因时使 X3 de_recovery +5.0(42.74→47.75)但 cell_state -2.4、covariation -1.6,净 +0.2——收益被过强位移对流形的扰动抵消。父节点 next_suggestions 第 1、2 条正指向此权衡。本方案把两个已验证部件组合:先用直传锁定 X3≥50 的地板收益(+3.1/3≈+1.05 榜分,确定性、超噪声),再用限域、缩小的位移去争取突破 50 的天花板,这是全树尚未试过的组合。
做法基座 = 节点 8 的 run.py(保留 two_stage_deltas、prep_delta、apply_shift 零保留机制,外部锚 --alpha-ext 0 永久关闭)。改动分两步:
【A. X3 直传守卫(必做,先落地)】移植节点 7 的词表守卫:最新输入阶段标签落在已知心脏词表(HEART∪EDGE∪DROP)的比例 f≥0.5 → 逐位复现父节点 heart_reweight 路径(proxy/proxy2 输出与节点 8 逐位相同,56.23 不动);f<0.5(X3 的 Qiu 标签,f=0)→ 原样输出最新输入全部真实细胞(clip 到 min/max_cells),不做有放回重采样。
【B. 限域保守位移(叠加在直传之上,只对 f<0.5 且 ≥2 个同数据集输入的视图生效)】per-type 伪批量差 Δ=mean(last|t)−mean(prev|t),时间比 r=(t_target−t_last)/(t_last−t_prev)(X3=2),α_eff=α·r clip 到 [0,2];新增基因限域:取各类型 |Δ| 的逐基因最大值排名 top-K(K 初值 500),并剔除看家基因(Rpl/Rps/Actb/Gapdh/Actg1/Mt-*),限域外基因一律不动;winsorize ±1.0,MIN_DELTA 提到 0.05,零保留应用(只移非零项、clip≥0)。
【查分流程(A 半,vec-score,预算 20 次,实跑 ~10 次)】每次运行 ~2 s:(1) α=0 纯直传,X3 应 ≈50(1 次,同时验证 proxy A 半 56.19 未破坏,1 次);(2) 网格 α∈{0.3,0.5,0.8}(α_eff∈{0.6,1.0,1.6})× K∈{200,500},先跑 (0.5,500) 与 (0.3,200) 两个最保守点,若任一 X3 A 半 >50.8 再补邻近点,否则立即止损(≤6 次);(3) 最优候选与 α=0 各复查 1 次确认稳定(输出对程序 seed 确定性,差异只来自评分侧)。提交规则:位移仅当 X3 A 半比直传高 ≥1 才启用,否则 α=0 提交纯直传(仍保底追平 54.15)。
【单输入退路 / final 迁移】proxy 单输入无差可算,自动退化为父节点重加权输出(逐位相同)。final(官方 E8.5+E9.5,f≥0.5)走重加权路径;若 B 在 X3 上验证为正,final 用同一机制但 α_eff=α·1(r=1,天然减半),且直传守卫在 final 不触发(除非请求细胞数>真实细胞数,此时按节点 4 逻辑直传)。proxy2 的 Qiu E9.0 外部输入不参与位移(已证有害),只覆盖 27,887 基因的问题因锚关闭而不触及。
风险(1) 位移即使限域到 top-500、α_eff≤1 仍可能重演节点 8 的 cell_state/covariation 损失>de_recovery 收益——第一次网格查分(α=0.5,K=500)即可判定,X3 A 半 ≤50 立即回退 α=0,止损成本 2 次查分;(2) X3=50.00 可能恰是 copy_last 地板且位移无法真正超越——保底收益(榜分 +1.05,确定性)不受影响;(3) 词表守卫移植出错会破坏 proxy 逐位一致性——用 1 次 proxy A 半查分对照 56.19 验证,任何偏差先修守卫再谈位移;(4) A 半/B 半差异:直传部分输出确定性,B 半应稳定复现;位移带来的 <1 分增益可能不迁移,故提交阈值设在 ≥1 分;(5) 25 分钟时限紧——A 部分是小 diff(节点 7 已有现成逻辑可参考),B 只在 prep_delta 前加 top-K 掩码,先跑通 A 提交保底,再迭代 B。

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

对比:父节点版本 8f3ac35ac4。改动的文件:solution/METHOD.md +20 −10、solution/run.py +116 −21

diff --git a/solution/METHOD.md b/solution/METHOD.mdindex ceaa542..6516ce5 100644--- a/solution/METHOD.md+++ b/solution/METHOD.md@@ -1,22 +1,32 @@ # METHOD -父节点心脏重加权不变;X3 类视图(≥2 个官方输入)加同数据集按类型时间差零保留位移(α_eff=2);proxy2 外部锚位移经测试有害已禁用。+词表守卫:官方标签视图沿用心脏重加权(输出与父节点逐位相同);外来标签视图(X3 Qiu)直传最新输入全部真实细胞;两阶段位移经 top-K 限域网格实测劣于直传,默认关闭(α=0)。  ## 方法 -基线 = 节点 2(heart_jcf_peri):最新官方输入按细胞类型重加权(心脏 ×1.6、边缘 ×0.25、丢 Neural Tube),抽 4000 个真实细胞,采样 RNG 顺序与父节点逐位一致(已验证 proxy/proxy2 输出与父节点相同)。+基座 = 节点 8 的 run.py。按最新输入阶段标签落在已知心脏词表(HEART_TYPES ∪ EDGE_TYPES ∪ DROP_TYPES,来自 `src.task1_temporal.reweight`,E8.5/E9.5 官方命名)的比例 f 分流: -在此之上新增 `two_stage_deltas`:当视图有 ≥2 个官方输入阶段(X3:Qiu E8.75+E9.0;final:官方 E8.5+E9.5)时,对两阶段共有的每个细胞类型算伪批量差 Δ=mean(last|t)−mean(prev|t),乘以时间外推系数 (t_target−t_last)/(t_last−t_prev)(clip 到 [0,2];X3=2,final=1),winsorize ±1.0,|Δ|<0.02 的基因置 0,再按细胞类型加到抽样后的细胞上。**零保留**:只移动非零表达项并 clip≥0,稀疏/共变结构不被稠密化破坏(节点 3 全局稠密 pseudobulk_shift 的 covariation 38.53 即此失败模式)。单输入视图(proxy)无差可算,自动退化为父节点。+- **f ≥ 0.5(官方标签:proxy / proxy2 / final)**:逐位复现父节点路径——最新官方输入按类型重加权(心脏 ×1.6、边缘 ×0.25、丢 Neural Tube)抽 4000 个真实细胞,RNG 顺序与节点 2/8 完全一致。proxy2 的外部锚(Qiu E9.0)保持禁用(节点 8 已证有害)。+- **f < 0.5(外来标签:X3 的 Qiu 簇名,f=0)**:**直传**——原样输出最新输入阶段全部真实细胞(2174 个,落在 [500, 5000] 内故无重采样;超界时无放回抽样/补齐)。不做有放回重采样(树内已证 4000>2174 的重采样亏 ~3 分)。输出与 seed 无关(X 逐位相同,仅 uns.generator_seed 元数据不同)。 -外部锚(proxy2 的 Qiu E9.0,diff-in-diff 去跨技术批次,看家基因中位|Δ| 从 2.27 降到 0.05–0.09)已实现但**默认关闭**(--alpha-ext 0):A 半实测 50.59,比父节点低 5.6(cell_state 44.3)。原因是 Qiu 簇名与官方类型对应关系失真(其 "SHF" 簇呈心肌特征、"FHF" 呈祖细胞特征),DD 残差仍混入组成/技术差。+保留但默认关闭的机制(`--alpha-2stage > 0` 才生效):**top-K 限域两阶段位移** `two_stage_deltas_restricted`——≥2 个同数据集官方输入时,对共有类型算伪批量差 Δ=mean(last|t)−mean(prev|t),乘时间比 r=(t_target−t_last)/(t_last−t_prev) clip [0,2],winsorize ±1.0;基因限域为各类型 |Δ| 逐基因最大值排名 top-K(默认 500),剔除看家基因(Rpl*/Rps*/Mt-*/Actb/Gapdh/Actg1),限域外一律不动;|αΔ|<0.05 置零;零保留应用(只移非零项、clip≥0)。 -## 验证(A 半,seed 0)+## 验证(A 半,seed 0,本节点实测) -- proxy:56.19(父 56.23,输出逐位相同,差异为评分侧噪声)-- proxy2:与 proxy 相同输出(锚关闭)-- X3 两阶段位移 α_eff=2:46.77(de_recovery 42.74→47.75,cell_state −2.4、covariation −1.6,净 +0.2,噪声内但方向对最弱组有利);α=0 无重复抽样变体 46.54-- proxy2 外部锚 α=1.0:50.59(弃用)+- proxy:56.19(与父节点输出 md5 逐位相同;父正式分 56.23)+- proxy2:与 proxy 输出逐位相同(单官方输入、锚关闭)+- X3 直传(α=0,提交配置):**50.00**(恰为 copy_last 地板)+- X3 限域位移 α=0.5,K=500(α_eff=1.0):48.66(de_recovery 46.09、cell_state 49.31、covariation 49.57)——**全面劣于直传**+- X3 限域位移 α=0.3,K=200(α_eff=0.6):48.93——同样劣于直传+- 结论:top-K 限域不仅没救回节点 8 全基因位移的 cell_state/covariation 损失,连 de_recovery 也从 47.75 掉到 46.09——|Δ| 最大的 top-K 基因主要携带技术/组成噪声而非目标方向信号。位移方向在 X3 上第三次被否决(节点 6 全局阻尼、节点 8 全基因零保留、本节点 top-K 限域零保留)。+- proxy 重加权网格(heart_w∈{1.3,1.6,2.0}×edge_w∈{0.1,0.25,0.5},7 个 A 半查分):最优仍是 (1.6,0.1)≈56.25 与 (1.6,0.25)=56.19,差 0.05 为噪声;1.3/2.0 或 edge 0.5 都降到 ~55.5。维持 1.6/0.25 保证与父节点逐位一致。  ## 未验证 -final 视图(E8.5+E9.5→E10.5)上 α_eff=1 的同数据集位移;X3 更小 α;B 半分数。生物学知识来源:Myl7/Tnnt2/Actc1 为心肌肌小节标记、Isl1/Fgf10/Tbx1 为 SHF 标记(Kelly 2001/2014,用于外部锚的映射诊断,该路径现已禁用);JCF 为心外膜前体(Tyser 2021,父节点重加权已含)。+- final 视图(官方 E8.5+E9.5,f≥0.5):走重加权路径,位移默认关。两阶段位移在 final 上未测(X3 三次否决后不再投入)。+- B 半分数:直传与重加权输出确定,B 半应稳定复现(预期 rank3 ≈ 54.0,追平节点 4/7,超父节点 +1)。+- 直传路径下细胞数 > max_cells 或 < min_cells 的视图(X3 不触发)。++## 生物学知识来源++仅使用 `modeling/` 内已有的官方类型词表(HEART/EDGE/DROP,节点 2 种子自带);未引入保留阶段(E10.5/E12.5、9.5<E≤13.5)或保留基因型的任何信息。X3 直传不依赖任何细胞类型知识(f=0 时完全绕开词表)。diff --git a/solution/run.py b/solution/run.pyindex 67732bb..30675dc 100644--- a/solution/run.py+++ b/solution/run.py@@ -23,7 +23,13 @@ import argparse import numpy as np from scipy import sparse -from src.task1_temporal.reweight import DROP_TYPES, largest_remainder, type_weights+from src.task1_temporal.reweight import (+    DROP_TYPES,+    EDGE_TYPES,+    HEART_TYPES,+    largest_remainder,+    type_weights,+) from src.task1_temporal.view_io import (     external_inputs,     inputs_by_time,@@ -41,12 +47,13 @@ MIN_DELTA = 0.02 HK_PREFIX = ("Rpl", "Rps")  -def resample_with_labels(X, labels: np.ndarray, n: int, seed: int, dup: bool = True):+def resample_with_labels(X, labels: np.ndarray, n: int, seed: int, dup: bool = True,+                         heart_w: float = 1.6, edge_w: float = 0.25):     """Same RNG order as reweight.heart_reweight, but also returns row types."""     rng = np.random.default_rng(seed)     types = [str(t) for t in np.unique(labels) if str(t) not in DROP_TYPES]     counts = np.array([(labels == t).sum() for t in types], dtype=np.float64)-    alloc = largest_remainder(counts * type_weights(types, 1.6, 0.25), n)+    alloc = largest_remainder(counts * type_weights(types, heart_w, edge_w), n)     rows, out_types = [], []     for t, k in zip(types, alloc):         if k <= 0:@@ -153,6 +160,55 @@ def two_stage_deltas(prev, last, alpha: float) -> dict[str, np.ndarray]:     return out  +HK_EXACT = {"Actb", "Gapdh", "Actg1"}+++def two_stage_deltas_restricted(+    prev, last, alpha: float, topk: int, min_delta: float = 0.05+) -> dict[str, np.ndarray]:+    """Per-type two-stage deltas confined to a global top-K |delta| gene set+    (housekeeping excluded); all other genes untouched."""+    lp, ll = labels_of(prev), labels_of(last)+    raw: dict[str, np.ndarray] = {}+    for t in np.unique(ll):+        if t not in set(lp.tolist()):+            continue+        d = pb(last.X, ll == t) - pb(prev.X, lp == t)+        raw[str(t)] = np.clip(np.nan_to_num(d), -WINSOR, WINSOR)+    if not raw:+        return {}+    maxabs = np.max(np.abs(np.vstack(list(raw.values()))), axis=0)+    hk = np.array(+        [g.startswith(HK_PREFIX) or g.startswith("Mt-") or g in HK_EXACT for g in _GENES]+    )+    maxabs[hk] = -1.0+    keep = np.zeros(len(_GENES), dtype=bool)+    idx = np.argsort(-maxabs)[:topk]+    keep[idx[maxabs[idx] > 0.0]] = True+    out = {}+    for t, d in raw.items():+        dd = alpha * d * keep+        dd[np.abs(dd) < min_delta] = 0.0+        out[t] = dd.astype(np.float32)+    return out+++def passthrough(X, labels: np.ndarray, n: int, seed: int):+    """All real cells of the latest input, clipped into [min_cells, max_cells]+    without replacement resampling: full pass-through when n == n_obs."""+    n_obs = X.shape[0]+    if n == n_obs:+        return X, np.asarray(labels, dtype=object)+    rng = np.random.default_rng(seed)+    if n < n_obs:+        idx = np.sort(rng.choice(n_obs, size=n, replace=False))+    else:+        idx = np.concatenate(+            [np.arange(n_obs), rng.choice(n_obs, size=n - n_obs, replace=True)]+        )+    return X[idx], np.asarray([str(labels[i]) for i in idx], dtype=object)++ def apply_shift(X, row_types: np.ndarray, deltas: dict[str, np.ndarray]) -> sparse.csr_matrix:     """Zero-preserving: x' = max(x + d_g, 0) where x > 0; zeros stay zero."""     X = sparse.csr_matrix(X)@@ -184,7 +240,11 @@ def main() -> None:     parser.add_argument("--out", required=True)     parser.add_argument("--seed", type=int, default=0)     parser.add_argument("--alpha-ext", type=float, default=0.0)-    parser.add_argument("--alpha-2stage", type=float, default=1.0)+    parser.add_argument("--alpha-2stage", type=float, default=0.0)+    parser.add_argument("--topk", type=int, default=500)+    parser.add_argument("--min-delta-r", type=float, default=0.05)+    parser.add_argument("--heart-w", type=float, default=1.6)+    parser.add_argument("--edge-w", type=float, default=0.25)     parser.add_argument("--nodup", action="store_true")     args = parser.parse_args() @@ -195,25 +255,60 @@ def main() -> None:     official = inputs_by_time(manifest)     ext = external_inputs(manifest)     last = read_stage(args.data, official[-1], genes)-    n = target_n_cells(manifest, min(N_CELLS, last.n_obs) if args.nodup else N_CELLS)-    X, row_types = resample_with_labels(last.X, labels_of(last), n, args.seed, dup=not args.nodup)--    deltas: dict[str, np.ndarray] = {}+    labels = labels_of(last)     t_last = official[-1]["time"]     t_target = manifest["target"]["time"]-    if ext and args.alpha_ext > 0:-        e = read_stage(args.data, ext[-1], genes, missing="zero")-        cov = e.var["covered"].to_numpy()-        deltas = marker_map_deltas(last, e, cov)-        deltas = {k: prep_delta(args.alpha_ext * v.astype(np.float64)) for k, v in deltas.items()}-    elif len(official) >= 2 and args.alpha_2stage > 0:-        prev = read_stage(args.data, official[-2], genes)-        span = t_last - official[-2]["time"]-        alpha = args.alpha_2stage * np.clip((t_target - t_last) / span, 0.0, 2.0) if span > 0 else 0.0-        deltas = two_stage_deltas(prev, last, alpha)--    if deltas:-        X = apply_shift(X, row_types, deltas)++    known = HEART_TYPES | EDGE_TYPES | DROP_TYPES+    frac_known = float(np.mean([str(t) in known for t in labels]))++    if frac_known >= 0.5:+        # Official-label view: parent path, bit-identical output.+        n = target_n_cells(manifest, min(N_CELLS, last.n_obs) if args.nodup else N_CELLS)+        X, row_types = resample_with_labels(last.X, labels, n, args.seed, dup=not args.nodup,+                                            heart_w=args.heart_w, edge_w=args.edge_w)++        deltas: dict[str, np.ndarray] = {}+        if ext and args.alpha_ext > 0:+            e = read_stage(args.data, ext[-1], genes, missing="zero")+            cov = e.var["covered"].to_numpy()+            deltas = marker_map_deltas(last, e, cov)+            deltas = {+                k: prep_delta(args.alpha_ext * v.astype(np.float64)) for k, v in deltas.items()+            }+        elif len(official) >= 2 and args.alpha_2stage > 0:+            prev = read_stage(args.data, official[-2], genes)+            span = t_last - official[-2]["time"]+            alpha = (+                args.alpha_2stage * np.clip((t_target - t_last) / span, 0.0, 2.0)+                if span > 0+                else 0.0+            )+            deltas = two_stage_deltas_restricted(+                prev, last, alpha, args.topk, args.min_delta_r+            )+        if deltas:+            X = apply_shift(X, row_types, deltas)+    else:+        # Foreign-label view (e.g. X3 Qiu clusters): pass through all real+        # cells of the latest input; resampling with replacement lost ~3 pts.+        n = target_n_cells(manifest, last.n_obs)+        X, row_types = passthrough(last.X, labels, n, args.seed)+        deltas = {}+        if len(official) >= 2 and args.alpha_2stage > 0:+            prev = read_stage(args.data, official[-2], genes)+            span = t_last - official[-2]["time"]+            alpha = (+                args.alpha_2stage * np.clip((t_target - t_last) / span, 0.0, 2.0)+                if span > 0+                else 0.0+            )+            deltas = two_stage_deltas_restricted(+                prev, last, alpha, args.topk, args.min_delta_r+            )+        if deltas:+            X = apply_shift(X, row_types, deltas)+     write_prediction(X, genes, args.out, seed=args.seed)  

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

用到的知识库条目

编号标题出处
k031Offline OT toolkit in the sandbox: moscot TemporalProblem, wot OTModel, POT, geomloss10.1038/s41586-024-08453-2 (moscot); 10.1016/j.cell.2019.01.006 (Waddington-OT)
k041Within-stage pseudotime and graph toolkit offline: scanpy DPT/PAGA/Leiden, Palantir, CellRank 210.1186/s13059-019-1663-x (PAGA); 10.1038/s41587-019-0068-4 (Palantir); 10.1038/s41592-024-02303-9 (CellRank 2)
k018Damped per-type shift: shrinkage alpha on the observed deltanotes/plan/cards/T1.md

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

改了什么在节点 8 基座上加词表守卫分流:官方标签视图(f≥0.5)逐位复现父节点心脏重加权路径;外来标签视图(X3 Qiu,f=0)直传最新输入全部 2174 个真实细胞,不做有放回重采样。同时实现 PLAN-B 的 top-K 限域两阶段位移(two_stage_deltas_restricted,剔除看家基因),A 半网格实测劣于直传后默认关闭(--alpha-2stage 0)。
各组分数的变化X3:变好 +3.10(46.90→50.00),超噪声,来自直传替换有放回重采样,确定性收益
cell_state:噪声内 +1.36(53.04→54.40)
covariation:噪声内 +1.54(52.42→53.96)
de_recovery:噪声内 +0.71(51.69→52.41),T1 噪声约 2 分
direction:噪声内 +0.55(55.22→55.77)
proxy/proxy2:不变 +0.00(56.23→56.23),守卫生效,输出与父节点逐位相同
假设是否成立是
经验
  1. 在 X3(Qiu 外来标签、请求细胞数≤真实细胞数)上,直传全部真实细胞比重采样到 4000 高 3.1 分,且此收益确定性、可复现(节点 4/7/12 三次一致)。
  2. X3 上的两阶段时间外推位移已第三次被否决:节点 6 全局阻尼、节点 8 全基因零保留(净 +0.2)、本节点 top-K=500/200 限域零保留(48.66/48.93,连 de_recovery 都从 47.75 掉到 46.09)——|Δ| 最大的基因主要携带技术/组成噪声而非目标方向信号,缩小 α 或限域都救不回。
  3. X3=50.00 恰为 copy_last 地板,位移类方法在该视图上大概率无法超越,后续不应再投入。
  4. 词表守卫(HEART∪EDGE∪DROP 覆盖率 f≥0.5 判官方标签)能在加入新分支时保证官方视图输出 md5 逐位不变,是安全的改造模式,移植成本低(A 半 13/20 次查分内完成全部验证)。
  5. proxy 侧重加权网格(heart_w∈{1.3,1.6,2.0}×edge_w∈{0.1,0.25,0.5},7 点)确认 (1.6,0.25) 已是最优,A 半 56.19–56.25,参数微调空间耗尽。
下一步建议
  1. 针对 proxy/proxy2 组:试输出细胞数 N_CELLS≠4000(如 max 5118 或 nodup 无放回变体),检验细胞数本身对分数的效应——这是 A 半一次查分即可判定的确定性杠杆。
  2. 针对 proxy 组:若要再动表达值,放弃 top-|Δ| 基因级选择,改用 prior/(Reactome/GO)通路级弱位移(限定通路内基因、α≤0.3),且必须先在 A 半证明能突破 56.25 才提交。
  3. 针对 X3 组:不再尝试位移;若 final 视图(官方 E8.5+E9.5,f≥0.5)请求细胞数>真实细胞数,可复用本节点 passthrough 的补齐逻辑,其余保持重加权路径不动。

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

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

分析员

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

工程师

角色工程师 alibaba-token-plan-cn/qwen3.8-max
调用次数1 次
轮数29
工具调用共 33 次:bash 23、edit 8、read 1、write 1
用时12 分
token 数输入 53,598 · 输出 9,568 · 思考 10,319
任务(第一行)按计划修改程序:X3 词表守卫直传 + top-K 基因限域保守两阶段位移(组合节点4/7与节点8部件)
最后的回答(摘录)
Done. Final state of `solution/`: vocabulary-guarded run.py (α=0 defaults) + METHOD.md; all three views pass `vec-check` with default args.

**做了什么**:移植词表守卫——官方标签视图(proxy/proxy2/final)逐位复现父节点心脏重加权路径;外来标签视图(X3,f=0)直传最新输入全部 2174 个真实细胞。实现了 PLAN-B 的 top-K 限域两阶段位移并实测两个网格点。

**查分结果**(A 半,用了 13/20 次):proxy 56.19(与父输出 md5 相同);X3 直传 50.00;X3 限域位移 α=0.5/K=500 → 48.66、α=0.3/K=200 → 48.93(连 de_recovery 都掉到 46.09,全面劣于直传,按止损规则默认关闭);proxy 重加权网格 7 点,(1.6,0.25) 仍最优。预期节点分 ≈ (56.2+56.2+50)/3 ≈ 54.1,超父节点 53.12,追平树内最佳 54.15。

**下一步最值得试**:X3 上位移已三度被否决(全局阻尼/全基因零保留/top-K 限域),50.0 疑为 copy_last 地板;剩余杠杆只在 proxy 侧——如 N_CELLS≠4000(max 5118)的细胞数效应、或基于 prior/(Reactome/GO)的通路级(而非 top-|Δ| 基因级)弱位移,后者需先在 A 半证明能突破 56.25。
原始记录位置/home/spark-longxinyang/vec/g23_wt/agent/runs/20261001-140531-search-t1-g23-spark/nodes/12/engineer.jsonl 150 KB
/home/spark-longxinyang/vec/g23_wt/agent/runs/20261001-140531-search-t1-g23-spark/nodes/12/engineer.stderr

调研员

角色调研员 alibaba-token-plan-cn/qwen3.8-max
调用次数1 次
轮数2
工具调用共 1 次:bash 1
用时1 分
token 数输入 15,953 · 输出 1,511 · 思考 4,165
任务(第一行)为节点 n12(改进,父节点 n8)写改进计划 PLAN.json
最后的回答(摘录)
 8 证明同数据集两阶段 per-type 零保留位移在 α_eff=2、全基因时使 X3 de_recovery +5.0(42.74→47.75)但 cell_state -2.4、covariation -1.6,净 +0.2——收益被过强位移对流形的扰动抵消。父节点 next_suggestions 第 1、2 条正指向此权衡。本方案把两个已验证部件组合:先用直传锁定 X3≥50 的地板收益(+3.1/3≈+1.05 榜分,确定性、超噪声),再用限域、缩小的位移去争取突破 50 的天花板,这是全树尚未试过的组合。",
  "approach": "基座 = 节点 8 的 run.py(保留 two_stage_deltas、prep_delta、apply_shift 零保留机制,外部锚 --alpha-ext 0 永久关闭)。改动分两步:\n【A. X3 直传守卫(必做,先落地)】移植节点 7 的词表守卫:最新输入阶段标签落在已知心脏词表(HEART∪EDGE∪DROP)的比例 f≥0.5 → 逐位复现父节点 heart_reweight 路径(proxy/proxy2 输出与节点 8 逐位相同,56.23 不动);f<0.5(X3 的 Qiu 标签,f=0)→ 原样输出最新输入全部真实细胞(clip 到 min/max_cells),不做有放回重采样。\n【B. 限域保守位移(叠加在直传之上,只对 f<0.5 且 ≥2 个同数据集输入的视图生效)】per-type 伪批量差 Δ=mean(last|t)−mean(prev|t),时间比 r=(t_target−t_last)/(t_last−t_prev)(X3=2),α_eff=α·r clip 到 [0,2];新增基因限域:取各类型 |Δ| 的逐基因最大值排名 top-K(K 初值 500),并剔除看家基因(Rpl*/Rps*/Actb/Gapdh/Actg1/Mt-*),限域外基因一律不动;winsorize ±1.0,MIN_DELTA 提到 0.05,零保留应用(只移非零项、clip≥0)。\n【查分流程(A 半,vec-score,预算 20 次,实跑 ~10 次)】每次运行 ~2 s:(1) α=0 纯直传,X3 应 ≈50(1 次,同时验证 proxy A 半 56.19 未破坏,1 次);(2) 网格 α∈{0.3,0.5,0.8}(α_eff∈{0.6,1.0,1.6})× K∈{200,500},先跑 (0.5,500) 与 (0.3,200) 两个最保守点,若任一 X3 A 半 >50.8 再补邻近点,否则立即止损(≤6 次);(3) 最优候选与 α=0 各复查 1 次确认稳定(输出对程序 seed 确定性,差异只来自评分侧)。提交规则:位移仅当 X3 A 半比直传高 ≥1 才启用,否则 α=0 提交纯直传(仍保底追平 54.15)。\n【单输入退路 / final 迁移】proxy 单输入无差可算,自动退化为父节点重加权输出(逐位相同)。final(官方 E8.5+E9.5,f≥0.5)走重加权路径;若 B 在 X3 上验证为正,final 用同一机制但 α_eff=α·1(r=1,天然减半),且直传守卫在 final 不触发(除非请求细胞数>真实细胞数,此时按节点 4 逻辑直传)。proxy2 的 Qiu E9.0 外部输入不参与位移(已证有害),只覆盖 27,887 基因的问题因锚关闭而不触及。",
  "expected_groups": ["de_recovery", "cell_state", "covariation"],
  "risks": "(1) 位移即使限域到 top-500、α_eff≤1 仍可能重演节点 8 的 cell_state/covariation 损失>de_recovery 收益——第一次网格查分(α=0.5,K=500)即可判定,X3 A 半 ≤50 立即回退 α=0,止损成本 2 次查分;(2) X3=50.00 可能恰是 copy_last 地板且位移无法真正超越——保底收益(榜分 +1.05,确定性)不受影响;(3) 词表守卫移植出错会破坏 proxy 逐位一致性——用 1 次 proxy A 半查分对照 56.19 验证,任何偏差先修守卫再谈位移;(4) A 半/B 半差异:直传部分输出确定性,B 半应稳定复现;位移带来的 <1 分增益可能不迁移,故提交阈值设在 ≥1 分;(5) 25 分钟时限紧——A 部分是小 diff(节点 7 已有现成逻辑可参考),B 只在 prep_delta 前加 top-K 掩码,先跑通 A 提交保底,再迭代 B。",
  "sources": []
}
```
原始记录位置/home/spark-longxinyang/vec/g23_wt/agent/runs/20261001-140531-search-t1-g23-spark/nodes/12/researcher.jsonl 7 KB
/home/spark-longxinyang/vec/g23_wt/agent/runs/20261001-140531-search-t1-g23-spark/nodes/12/researcher.stderr

审查员

角色审查员 alibaba-token-plan-cn/qwen3.8-max
调用次数1 次
轮数8
工具调用共 11 次:read 8、bash 2、write 1
用时1 分
token 数输入 22,139 · 输出 1,504 · 思考 1,709
任务(第一行)审查节点 n12 的程序是否越界读取、写死目标、钻评分器漏洞
最后的回答(摘录)
REVIEW.json written
原始记录位置/home/spark-longxinyang/vec/g23_wt/agent/runs/20261001-140531-search-t1-g23-spark/nodes/12/reviewer.jsonl 100 KB
/home/spark-longxinyang/vec/g23_wt/agent/runs/20261001-140531-search-t1-g23-spark/nodes/12/reviewer.stderr