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

总览 · ← 返回运行 20261003-094242-search-t2-embryo-interp-g24-D-s2

节点 n4

伪时间方向推进(乘法折叠变化)+ 坐标尺度校正

运行?一次完整的自动搜索或 Agent 会话,有自己的锁定配置和证据包。20261003-094242-search-t2-embryo-interp-g24-D-s2
父节点n1
子节点n6、n7
操作?种子:人写的起点;改进:在父节点上改;草稿:从头写;修复:修父节点的报错。改进
状态已打分
分数搜索目标分 56.38(+7.2) · proxy 56.38(+7.2) · 3 次复测均分 56.77
审查未审查
用时?从运行开始到结束(或到现在)的挂钟时间。16 分
程序版本76a8f6e14008beb4ffcbb7c1beccaf77f3c9ef9d (programs.git)

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

来自 programs.git 76a8f6e140:solution/METHOD.md

伪时间方向推进(乘法折叠变化)+ 坐标尺度校正

在 copy_last 锚阶段细胞上,沿两括号阶段伪批量差方向施加与细胞自身伪时间位置成正比的乘法表达推进(保零、保 CP10k 总量),并按括号 RMS 对数插值(damp 0.5)缩放坐标。proxy 56.5–57.0(父 49.13)。

方法(family T2EI-09,PLAN 指定的伪时间方向微扰 + 坐标尺度校正)

  1. interp_bracket 取目标两侧输入 (a, b, t);单输入时退路为锚阶段 PCA1 方向(幂迭代)、t=0.5(proxy/final 都走括号分支,退路未实测)。
  2. 轴方向 d = pb(b) − pb(a)(498 基因,log1p 单位)。每细胞投影 p_i = x_i·d̂,z_i = clip((p_i − median)/std, ±3)。
  3. 推进系数 coef_i = base_gain·t + spread·z_i(非均匀:轴上前端的细胞多推进、后端少推进甚至滞后)。
  4. 关键实现修正(相对 PLAN 原文):PLAN 写的是加性位移 x + α·(p−median)·d。实测加性位移在 97% 稀疏的 log1p 数据上灾难性:d 均值 +0.42,加常数位移把 92% 的零元素填成非零,variogram skill 从 0.50 崩到 0.05,总分 47–49。改为乘法折叠变化:计数空间 E=(exp X −1)·exp(clip(coef_i·d_j, ±3)),再逐细胞恢复 CP10k 总量后取 log1p。零保持零,稀疏/共变结构保留。
  5. 坐标:cloud RMS 按 log_interp(rms_a, rms_b, t, damp=0.5) 缩放(数据驱动,非写死;damp 由代理网格选出)。细胞数 log 插值后夹到 [min, max],分层无放回抽样(sample.take),表达坐标同源,保持表达-位置配对。

参数(默认写在 run.py,环境变量可覆盖)

  • T2_SPREAD=0.10(α,非均匀成分)、T2_BASE_GAIN=1.2、T2_SCALE_DAMP=0.5、T2_MECH_OFF(对照开关)。
  • 网格(proxy,seed 0):spread 0 / 0.1 / 0.3 / 0.6 → 56.50 / 56.51 / 56.47 / 56.26;base_gain 0.7 / 1.0 / 1.2 / 1.4 / 1.8 → 56.16 / 56.50 / 56.51 / 56.56 / 56.42;scale_damp 0.4 / 0.5 / 0.7 → 56.23 / 56.50 / 54.32。全部在噪声(~1 分)内的平台上;spread>0.3 和 gain>1.4 开始伤 local_spatial(表达-位置配对)。选平台中心的 spread=0.1、gain=1.2、damp=0.5。

机制生效证据(PLAN mechanism_off_control)

同一程序 T2_MECH_OFF=1(α=0 且无平均推进,仅坐标缩放)对照:

对照机制开
榜分52.8056.51
expression_change48.6855.39
cell_state49.2253.31
shape_scale64.0565.05
local_spatial49.2352.27
  • 表达推进改变了 99.1% 的细胞,每细胞 L1 位移均值 6.9、std 4.8(>0.01,远非常数位移);de_direction raw −0.054 → +0.35(skill 0.485 → 0.62)。
  • 坐标缩放单独贡献 shape_scale 49.7 → 64.1(scale_log_ratio skill 0.50 → 0.92)。
  • 对照与 PLAN 预期一致:α=0 时表达/状态组回到 copy_last 水平(~48–49),仅形状组因尺度校正提升。

验证过 / 未验证

  • 验证:proxy 视图 seed 0/1(56.51 / 56.97);seed 0 双跑逐位相同(确定性);vec-check 通过;机制对照。
  • 未验证:单输入退路分支(PCA1 方向,proxy/final 均不触发);final 视图(括号 E7.25↔E8.0,共有类型更多、t=1/3,参数应可迁移:方向与尺度全部现场从输入计算,无写死阶段名/细胞数/统计量;时间平移不变,输出只依赖时间差)。
  • 风险:base_gain·t 假定伪批量随时间近似线性;若真实 E7.25→E7.75 段非线性,gain=1.2 的最优点可能偏移,但 1.0–1.4 平台平坦,风险小。
  • 生物学知识来源:仅用了"胚胎此阶段整体尺度随时间增长、转录组沿分化方向连续推进"的通用机制知识;方向与幅度全部由 view 内已发布阶段数据现场计算。

调研员的计划

名称伪时间方向微扰+坐标尺度校正(单快照内推进)
动机父节点 1(copy_last)全部指标在地板附近(49.13),expression_change 48.38 甚至低于地板(DE 两项 skill 0.482/0.485),原因是照抄参考阶段+抽样噪声。节点 2(mix)证明表达变化组可升至 59.72、形状组可升至 74.43,但 cell_state 崩到 37.49(双峰分布被 mmd_u 惩罚)。父节点的结构问题:假设 0.5 天内无任何变化,忽略了胚胎生长(尺度)和细胞沿分化轴的定向推进。本方案用单快照内的主梯度作为伪时间方向,对每个细胞施加与该细胞在轴上位置成正比的表达微移,同时校正坐标尺度,既捕获变化方向又不产生双峰。
做法步骤:
1. 读取 anchor 阶段(proxy E6.75 / final E7.25)。若 manifest 中有目标之后的阶段(插值榜),也读入作为方向参考;若只有单阶段,用快照内 PCA 第一轴作为伪时间。
2. 计算方向向量:对表达矩阵做 PCA(取前 5 个 PC),以第一主成分方向 d 作为分化主轴。若有两阶段,方向 = mean(after) − mean(before) 在 PC 空间投影后的前 3 个 PC 加权方向。
3. 对每个细胞 i,计算其沿轴的投影位置 p_i = (x_i − mean)·d / ||d||。标准化到 [0,1]。施加表达微移:x'_i = x_i + α·(p_i − median_p)·d,其中 α 初始 0.08,搜索范围 [0.03, 0.20]。这使轴上靠前(已分化)的细胞表达进一步偏移、靠后的少偏移,产生非均匀形变而非平移。
4. 坐标尺度校正:乘以因子 s,初始 1.08,搜索范围 [1.02, 1.15](胚胎 0.5 天增长约 5–15%)。坐标直接乘 s,保持局部拓扑不变。
5. 抽样:若细胞数 > max_cells,按原标签分层抽样(与 copy_last 相同逻辑)。
6. 用 vec-score 快速筛选:先只开尺度(α=0)确认 shape_scale 提升;再开表达微移确认 DE 提升且 cell_state/local_spatial 不崩。
7. 单输入阶段退路:若只有单阶段,方向完全来自快照内 PCA1,α 取较小值(0.05)避免过拟合噪声方向。
8. 关键参数搜索:α ∈ {0.03, 0.05, 0.08, 0.12, 0.20},s ∈ {1.02, 1.05, 1.08, 1.12, 1.15},共 25 组合,每组 < 1 s,30 min 内足够。
风险1) PCA1 方向可能不是时间方向而是空间/批次方向——Engineer 应检查 α=0.08 时 de_direction 是否 > 0,若 < 0 则反向;2) 尺度因子过大导致 scale_log_ratio 反向偏离——先跑 s=1.05 确认方向再扩大;3) 表达微移过强导致 cell_state 下降——监控 mmd_u skill 不低于 0.48;4) 邻域指标对坐标尺度不变(MMD 在 PCA 空间),但对表达-位置配对敏感——若 neighborhood_mmd skill 降至 < 0.48 则减小 α。尽早在第一次 vec-score 时同时看四组分。

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

对比:父节点版本 c8941cb1e7。改动的文件:solution/EXECUTION.json +1 −0、solution/METHOD.md +39 −0、solution/README.md +2 −3、solution/run.py +112 −14

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..e6fe17a--- /dev/null+++ b/solution/METHOD.md@@ -0,0 +1,39 @@+# 伪时间方向推进(乘法折叠变化)+ 坐标尺度校正++在 copy_last 锚阶段细胞上,沿两括号阶段伪批量差方向施加与细胞自身伪时间位置成正比的乘法表达推进(保零、保 CP10k 总量),并按括号 RMS 对数插值(damp 0.5)缩放坐标。proxy 56.5–57.0(父 49.13)。++## 方法(family T2EI-09,PLAN 指定的伪时间方向微扰 + 坐标尺度校正)++1. `interp_bracket` 取目标两侧输入 (a, b, t);单输入时退路为锚阶段 PCA1 方向(幂迭代)、t=0.5(proxy/final 都走括号分支,退路未实测)。+2. 轴方向 d = pb(b) − pb(a)(498 基因,log1p 单位)。每细胞投影 p_i = x_i·d̂,z_i = clip((p_i − median)/std, ±3)。+3. 推进系数 coef_i = base_gain·t + spread·z_i(**非均匀**:轴上前端的细胞多推进、后端少推进甚至滞后)。+4. **关键实现修正(相对 PLAN 原文)**:PLAN 写的是加性位移 x + α·(p−median)·d。实测加性位移在 97% 稀疏的 log1p 数据上灾难性:d 均值 +0.42,加常数位移把 92% 的零元素填成非零,variogram skill 从 0.50 崩到 0.05,总分 47–49。改为**乘法折叠变化**:计数空间 E=(exp X −1)·exp(clip(coef_i·d_j, ±3)),再逐细胞恢复 CP10k 总量后取 log1p。零保持零,稀疏/共变结构保留。+5. 坐标:cloud RMS 按 log_interp(rms_a, rms_b, t, damp=0.5) 缩放(数据驱动,非写死;damp 由代理网格选出)。细胞数 log 插值后夹到 [min, max],分层无放回抽样(`sample.take`),表达坐标同源,保持表达-位置配对。++## 参数(默认写在 run.py,环境变量可覆盖)++- `T2_SPREAD=0.10`(α,非均匀成分)、`T2_BASE_GAIN=1.2`、`T2_SCALE_DAMP=0.5`、`T2_MECH_OFF`(对照开关)。+- 网格(proxy,seed 0):spread 0 / 0.1 / 0.3 / 0.6 → 56.50 / 56.51 / 56.47 / 56.26;base_gain 0.7 / 1.0 / 1.2 / 1.4 / 1.8 → 56.16 / 56.50 / 56.51 / 56.56 / 56.42;scale_damp 0.4 / 0.5 / 0.7 → 56.23 / 56.50 / 54.32。全部在噪声(~1 分)内的平台上;spread>0.3 和 gain>1.4 开始伤 local_spatial(表达-位置配对)。选平台中心的 spread=0.1、gain=1.2、damp=0.5。++## 机制生效证据(PLAN mechanism_off_control)++同一程序 `T2_MECH_OFF=1`(α=0 且无平均推进,仅坐标缩放)对照:++| | 对照 | 机制开 |+|---|---:|---:|+| 榜分 | 52.80 | 56.51 |+| expression_change | 48.68 | 55.39 |+| cell_state | 49.22 | 53.31 |+| shape_scale | 64.05 | 65.05 |+| local_spatial | 49.23 | 52.27 |++- 表达推进改变了 99.1% 的细胞,每细胞 L1 位移均值 6.9、**std 4.8**(>0.01,远非常数位移);de_direction raw −0.054 → +0.35(skill 0.485 → 0.62)。+- 坐标缩放单独贡献 shape_scale 49.7 → 64.1(scale_log_ratio skill 0.50 → 0.92)。+- 对照与 PLAN 预期一致:α=0 时表达/状态组回到 copy_last 水平(~48–49),仅形状组因尺度校正提升。++## 验证过 / 未验证++- 验证:proxy 视图 seed 0/1(56.51 / 56.97);seed 0 双跑逐位相同(确定性);vec-check 通过;机制对照。+- 未验证:单输入退路分支(PCA1 方向,proxy/final 均不触发);final 视图(括号 E7.25↔E8.0,共有类型更多、t=1/3,参数应可迁移:方向与尺度全部现场从输入计算,无写死阶段名/细胞数/统计量;时间平移不变,输出只依赖时间差)。+- 风险:base_gain·t 假定伪批量随时间近似线性;若真实 E7.25→E7.75 段非线性,gain=1.2 的最优点可能偏移,但 1.0–1.4 平台平坦,风险小。+- 生物学知识来源:仅用了"胚胎此阶段整体尺度随时间增长、转录组沿分化方向连续推进"的通用机制知识;方向与幅度全部由 view 内已发布阶段数据现场计算。diff --git a/solution/README.md b/solution/README.mdindex b1479e4..0c6b0e4 100644--- a/solution/README.md+++ b/solution/README.md@@ -1,4 +1,3 @@-# copy_last(T2:embryo:val_interp)+# 伪时间方向推进 + 坐标尺度校正(T2:embryo:val_interp) -输出目标之前最近的输入阶段(proxy:E6.75;final:E7.25),表达和坐标原样,按细胞类型分层无放回抽到榜上限 5,000(E6.75 有 7,093,E7.25 有 13,295)。-proxy 预期 ≈ 49.2(seed 0 实测 49.17;表达 48.5 / 状态 49.3 / 形状 49.8 / 邻域 49.1)。低于 50 的原因同心脏:地板是整份参考阶段(de_score 恰为 0),抽样子集带来假差异。+锚阶段分层抽样 + 沿括号伪批量差方向的乘法表达推进(per-cell 非均匀,coef = 1.2·t + 0.1·z)+ RMS 对数插值坐标缩放(damp 0.5)。详见 METHOD.md。proxy:seed 0 = 56.51,seed 1 = 56.97;机制关(T2_MECH_OFF=1)= 52.80。diff --git a/solution/run.py b/solution/run.pyindex 0595dc9..dc82572 100644--- a/solution/run.py+++ b/solution/run.py@@ -1,20 +1,47 @@ #!/usr/bin/env python3-"""copy_last (T2): the latest input at or before the target, with its own coordinates.+"""Pseudotime-directed non-uniform expression shift + coordinate scale correction. -Interpolation boards take the lower bracket stage, extrapolation boards the-last input; this is the floor's reference stage on the proxy. Cells are drawn-stratified by cell type only when the stage exceeds the board's max_cells.-Expression and coordinates are unchanged.+Base: copy_last (anchor stage cells, stratified subsample to max_cells).+Mechanism (family T2EI-09): take the principal expression gradient as a+pseudotime axis -- the pseudobulk mean difference between the two bracketing+input stages when the target is bracketed, else PC1 of the anchor stage --+and advance each anchor cell along that axis by an amount proportional to its+own position on the axis (cells ahead on the trajectory move more), producing+a non-uniform deformation instead of a constant shift.+Coordinates are scaled so the cloud RMS follows the log-linear interpolation+of the bracketing stages' RMS (damped), matching embryonic growth.++Env switches (for the mechanism-off control and the parameter grid):+  T2_MECH_OFF=1   -> spread=0 and base=0: no expression shift at all,+                     only the coordinate scaling remains (PLAN control).+  T2_SPREAD       -> alpha, strength of the position-proportional (non-uniform)+                     part of the shift, in units of the axis direction vector.+  T2_BASE_GAIN    -> multiplier on the mean shift t*(pb_after - pb_before).+  T2_SCALE_DAMP   -> damping of the log-linear RMS interpolation (default 0.5). """  from __future__ import annotations  import argparse+import os  import numpy as np -from src.task2_spatial.sample import take-from src.task2_spatial.view_io import anchor_entry, load_manifest, panel_genes, read_stage, write_t2+from src.task2_spatial.frame import log_interp, rms_radius+from src.task2_spatial.sample import clip_n, take+from src.task2_spatial.view_io import (+    anchor_entry,+    interp_bracket,+    load_manifest,+    panel_genes,+    read_stage,+    write_t2,+)+++def _env_float(name: str, default: float) -> float:+    v = os.environ.get(name)+    return float(v) if v not in (None, "") else default   def main() -> None:@@ -24,16 +51,87 @@ def main() -> None:     parser.add_argument("--seed", type=int, default=0)     args = parser.parse_args() +    mech_off = os.environ.get("T2_MECH_OFF", "0") == "1"+    spread = 0.0 if mech_off else _env_float("T2_SPREAD", 0.10)+    base_gain = 0.0 if mech_off else _env_float("T2_BASE_GAIN", 1.2)+    scale_damp = _env_float("T2_SCALE_DAMP", 0.5)+     manifest = load_manifest(args.data)     genes = panel_genes(args.data, manifest)-    stage = read_stage(args.data, anchor_entry(manifest), genes)-    n = int(np.clip(stage.n, manifest["min_cells"], manifest["max_cells"]))+    a_entry, b_entry, t = interp_bracket(manifest)+    stage_a = read_stage(args.data, a_entry, genes)++    # ---- pseudotime axis -------------------------------------------------+    if b_entry is not None:+        stage_b = read_stage(args.data, b_entry, genes)+        pb_a = np.asarray(stage_a.X.mean(axis=0)).ravel()+        pb_b = np.asarray(stage_b.X.mean(axis=0)).ravel()+        d = pb_b - pb_a  # bracket pseudobulk difference, log1p units+    else:+        # single input: fallback to PC1 of the anchor stage+        stage_b = None+        X = stage_a.X.toarray()+        X = X - X.mean(axis=0)+        # power iteration on the covariance for the leading direction+        rng_pca = np.random.default_rng(args.seed)+        v = rng_pca.normal(size=X.shape[1])+        for _ in range(30):+            v = X.T @ (X @ v)+            nv = np.linalg.norm(v)+            if nv < 1e-12:+                break+            v /= nv+        d = v+        t = 0.5+    dnorm = float(np.linalg.norm(d))+    if dnorm < 1e-9:+        d_unit = np.zeros_like(d)+    else:+        d_unit = d / dnorm++    # ---- cells: stratified subsample of the anchor stage ------------------+    lo, hi = int(manifest["min_cells"]), int(manifest["max_cells"])+    if stage_b is not None:+        n = clip_n(log_interp(stage_a.n, stage_b.n, t), lo, hi)+    else:+        n = clip_n(stage_a.n, lo, hi)     rng = np.random.default_rng(args.seed)-    if n <= stage.n:-        rows = np.sort(take(stage.labels, n, rng))-    else:  # fewer cells than min_cells: resample with replacement-        rows = np.sort(rng.choice(stage.n, size=n, replace=True))-    write_t2(args.out, stage.X[rows].toarray(), stage.coords[rows], genes, seed=args.seed)+    if n <= stage_a.n:+        rows = np.sort(take(stage_a.labels, n, rng))+    else:+        rows = np.sort(rng.choice(stage_a.n, size=n, replace=True))++    # ---- expression shift along the pseudotime axis -----------------------+    # Additive shifts are destructive on 97%-sparse log1p data (filling zeros),+    # so the shift is applied multiplicatively as a per-gene fold change+    # exp(coef_i * d): zeros stay zeros, and the per-cell total is restored+    # afterwards so only relative gene proportions change. coef_i grows with+    # the cell's position on the pseudotime axis (non-uniform advance).+    X = stage_a.X[rows].toarray().astype(np.float64)+    if base_gain > 0.0 or spread > 0.0:+        p = X @ d_unit  # per-cell position on the axis+        z = p - np.median(p)+        sd = float(z.std())+        if sd > 1e-9:+            z = np.clip(z / sd, -3.0, 3.0)+        else:+            z = np.zeros_like(p)+        coef = base_gain * float(t) + spread * z  # cells may advance or lag+        ex = np.clip(coef[:, None] * d[None, :], -3.0, 3.0)  # per-gene log fold change+        E = np.exp(X) - 1.0+        tot0 = E.sum(axis=1, keepdims=True)+        E *= np.exp(ex)+        E *= tot0 / np.maximum(E.sum(axis=1, keepdims=True), 1e-9)  # keep CP10k total+        X = np.log1p(E)++    # ---- coordinate scale correction --------------------------------------+    coords = np.asarray(stage_a.coords[rows], dtype=np.float64)[:, :3].copy()+    rms_a = rms_radius(coords)+    if stage_b is not None and rms_a > 1e-8:+        rms_t = log_interp(rms_a, rms_radius(stage_b.coords), t, damp=scale_damp)+        coords = coords * (rms_t / rms_a)++    write_t2(args.out, X.astype(np.float32), coords, genes, seed=args.seed)   if __name__ == "__main__":

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

用到的知识库条目

编号标题出处
k007Interval staging and held-out-window filtering of external datanotes/official/来件/virtualembryo.ai/rules.md
k016Degenerate-solution checks for population predictionsnotes/handover/02_知识学习路线.md
k023Time-split validation with a held-out intermediate or next time pointnotes/handover/02_知识学习路线.md

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

改了什么在 copy_last(锚阶段分层抽样)基础上:1) 沿括号两阶段伪批量差方向 d 做逐细胞乘法表达推进(计数空间 fold change exp(coef_i·d),coef_i = 1.2·t + 0.1·z_i 随细胞轴上位置非均匀,恢复 CP10k 总量后 log1p);2) 坐标按括号 RMS 对数插值缩放(damp=0.5),细胞数也做 log 插值。相对 PLAN 的关键改动:加性位移改为乘法折叠变化。
各组分数的变化cell_state:变好 +4.25(49.29→53.54):mmd_u raw 0.01885→0.01465,skill 0.489→0.552,得分 +0.79;variogram raw 0.00914→0.00840,skill 0.497→0.519,得分 +0.28。非均匀推进未造成 mix 式双峰崩塌。
expression_change:变好 +6.01(48.38→54.39):de_score raw -0.069→0.172,skill 0.482→0.551,得分 +0.86;de_direction raw -0.054→0.123,skill 0.485→0.537,得分 +0.64。机制关对照时本组回到 48.68,提升确由表达推进而来。
local_spatial:变好 +3.88(49.16→53.04):neighborhood_mmd raw 0.0800→0.0686,skill 0.492→0.530,得分 +0.97;表达推进与坐标缩放同源抽样、配对保持,未被惩罚。
shape_scale:变好 +14.86(49.68→64.54):几乎全部来自 scale_log_ratio raw -0.184→0.012,skill 0.503→0.924,得分 +3.57;d2_shape(0.05732)和 occupancy_dice(0.8442)raw 与父完全相同(均匀缩放对尺度不变项无影响),各 +0.07 是结构门随邻域 skill 越过 0.5 的微小松动。
family_idT2EI-09
假设是否成立是
经验
  1. 在 ~97% 稀疏的 log1p 表达数据上,沿任意方向的加性位移会把大量零填成非零、摧毁 variogram(skill 0.50→0.05,总分跌回 47–49);改用计数空间乘法折叠变化 exp(coef·d) 并逐细胞恢复 CP10k 总量,可保零、保稀疏/共变结构。
  2. 坐标尺度校正是 T2 插值榜上最便宜的收益:按括号阶段 RMS 做对数插值缩放(damp=0.5),scale_log_ratio skill 0.503→0.924(+3.57 分),且 d2_shape/occupancy_dice 对均匀缩放完全不变、无风险。
  3. 沿括号伪批量差方向的逐细胞非均匀推进(coef 随轴上 z 位置变化)能同时抬升 DE 两项、mmd_u 和 neighborhood_mmd(本节点四组全升),而整细胞混抽(node 2)虽然表达/形状更高但 cell_state 崩到 37——分布级指标和均值级指标必须分开监控。
  4. 参数在平台上不敏感:spread 0–0.3、base_gain 1.0–1.4 全在 ~1 分噪声内;spread>0.3 或 gain>1.4 开始伤 local_spatial(表达-位置配对),应选平台中心而非边缘。
  5. 机制关对照(T2_MECH_OFF=1,52.80 vs 56.51)确认:形状组提升来自坐标缩放(64.05 单独可达),表达/状态/邻域三组提升来自表达推进;两者可独立归因、可叠加。
mechanism_active是
下一步建议
  1. 针对 shape_scale 组:d2_shape 和 occupancy_dice 的 skill 仍只有 ~0.51(raw 与 copy_last 完全相同),是本方法剩余最大空间——在均匀缩放之外加各向异性形状形变(把锚阶段云的主轴长宽比向 b 阶段云的形状插值),或把乘法表达推进嫁接到按比例混抽+对齐的坐标上,同时保住 cell_state 53+ 和邻域 53+。
  2. 针对 expression_change 组:de_score/de_direction skill 仅 0.55/0.54,可在保持 local_spatial 不降的前提下细化推进方向——如按基因分组(上调/下调)用不同的 clip 或非线性 gain 曲线替代全局 clip(±3),或在 spread 0.1–0.3、gain 1.2–1.4 内做更密网格(每组 <1s,成本低)。
  3. 针对 final 视图:本节点方向和尺度全部现场从输入计算(无写死阶段名),迁移风险低,但 base_gain·t 假定线性推进,final 的 t=1/3 且区间更长,建议先在 final 上验证 seed 0 再决定是否重搜 gain。

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

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

分析员

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

工程师

角色工程师 alibaba-token-plan-cn/qwen3.8-max
调用次数1 次
轮数28
工具调用共 28 次:bash 21、edit 4、write 3
用时12 分
token 数输入 57,767 · 输出 9,000 · 思考 13,351
任务(第一行)按计划修改程序:伪时间方向微扰+坐标尺度校正(单快照内推进)
最后的回答(摘录)
完成。总结:

**做了什么**:在父节点 copy_last 基础上实现 PLAN 方法族 T2EI-09(伪时间方向非均匀推进 + 坐标尺度校正)。关键结构修正:PLAN 的加性位移在 97% 稀疏数据上把 variogram 打崩(skill 0.05),改为计数空间乘法折叠变化(保零、保 CP10k 总量);坐标按括号 RMS 对数插值缩放(damp=0.5,数据驱动)。参数经网格选在平台中心(base_gain=1.2, spread=0.1)。

**查分**(9 次):proxy seed 0 = **56.51**、seed 1 = **56.97**(父 49.13,树最佳 rank3 57.47);机制关对照 = 52.80,机制使 expression 48.7→55.4、cell_state 49.2→53.3、local 49.2→52.3。确定性、vec-check 均通过。

**下一步最值得试**:d2_shape/occupancy(skill 仅 ~0.51)是最大剩余空间——把本方法的表达推进嫁接到 mix 的坐标(两侧真实细胞按比例混抽 + procrustes3d 对齐)上,或按类型做组成插值,可能同时保住 cell_state 53+ 和 mix 的 shape 70+。
原始记录位置/home/spark-longxinyang/vec/runs/formal/20261003-094242-search-t2-embryo-interp-g24-D-s2/nodes/4/engineer.jsonl 119 KB
/home/spark-longxinyang/vec/runs/formal/20261003-094242-search-t2-embryo-interp-g24-D-s2/nodes/4/engineer.stderr

调研员

角色调研员 alibaba-token-plan-cn/qwen3.8-max
调用次数1 次
轮数1
工具调用共 0 次:—
用时2 分
token 数输入 8,756 · 输出 1,260 · 思考 5,964
任务(第一行)为节点 n4(改进,父节点 n1)写改进计划 PLAN.json
最后的回答(摘录)
mmd_u 惩罚)。父节点的结构问题:假设 0.5 天内无任何变化,忽略了胚胎生长(尺度)和细胞沿分化轴的定向推进。本方案用单快照内的主梯度作为伪时间方向,对每个细胞施加与该细胞在轴上位置成正比的表达微移,同时校正坐标尺度,既捕获变化方向又不产生双峰。","approach":"步骤:\n1. 读取 anchor 阶段(proxy E6.75 / final E7.25)。若 manifest 中有目标之后的阶段(插值榜),也读入作为方向参考;若只有单阶段,用快照内 PCA 第一轴作为伪时间。\n2. 计算方向向量:对表达矩阵做 PCA(取前 5 个 PC),以第一主成分方向 d 作为分化主轴。若有两阶段,方向 = mean(after) − mean(before) 在 PC 空间投影后的前 3 个 PC 加权方向。\n3. 对每个细胞 i,计算其沿轴的投影位置 p_i = (x_i − mean)·d / ||d||。标准化到 [0,1]。施加表达微移:x'_i = x_i + α·(p_i − median_p)·d,其中 α 初始 0.08,搜索范围 [0.03, 0.20]。这使轴上靠前(已分化)的细胞表达进一步偏移、靠后的少偏移,产生非均匀形变而非平移。\n4. 坐标尺度校正:乘以因子 s,初始 1.08,搜索范围 [1.02, 1.15](胚胎 0.5 天增长约 5–15%)。坐标直接乘 s,保持局部拓扑不变。\n5. 抽样:若细胞数 > max_cells,按原标签分层抽样(与 copy_last 相同逻辑)。\n6. 用 vec-score 快速筛选:先只开尺度(α=0)确认 shape_scale 提升;再开表达微移确认 DE 提升且 cell_state/local_spatial 不崩。\n7. 单输入阶段退路:若只有单阶段,方向完全来自快照内 PCA1,α 取较小值(0.05)避免过拟合噪声方向。\n8. 关键参数搜索:α ∈ {0.03, 0.05, 0.08, 0.12, 0.20},s ∈ {1.02, 1.05, 1.08, 1.12, 1.15},共 25 组合,每组 < 1 s,30 min 内足够。","expected_groups":["expression_change","shape_scale"],"risks":"1) PCA1 方向可能不是时间方向而是空间/批次方向——Engineer 应检查 α=0.08 时 de_direction 是否 > 0,若 < 0 则反向;2) 尺度因子过大导致 scale_log_ratio 反向偏离——先跑 s=1.05 确认方向再扩大;3) 表达微移过强导致 cell_state 下降——监控 mmd_u skill 不低于 0.48;4) 邻域指标对坐标尺度不变(MMD 在 PCA 空间),但对表达-位置配对敏感——若 neighborhood_mmd skill 降至 < 0.48 则减小 α。尽早在第一次 vec-score 时同时看四组分。","family_id":"T2EI-09","mechanism":"以快照内主表达梯度(PCA1 或两阶段均值差方向)为伪时间轴,对每个细胞施加与其轴上位置成正比的非均匀表达微移,模拟 0.5 天内细胞沿分化轨迹的推进;同时全局缩放坐标以匹配胚胎生长。","vs_constant_shift":"常数位移对所有细胞施加同一向量,不改变分布形状,DE 的 chance 校正和偏相关会将其抵消;本方案的位移量与每个细胞的伪时间位置成正比(前端多移、后端少移),产生分布的非均匀拉伸,改变基因排序和方差结构,因此能通过 DE 和 mmd_u 检测到真实信号。","mechanism_evidence":"1) 各细胞的位移向量应有非零离散度(std of per-cell shift > 0.01),若全部相同则退化为常数位移;2) de_direction 和 de_score 应从负值(0.482/0.485)升至 > 0.5;3) cell_state 组(mmd_u)skill 应保持在 0.47 以上(分布未崩塌);4) 对比 α=0(关闭表达微移)和 α=0.08:若四组分无差异,机制未生效。","mechanism_off_control":"同一程序设 α=0(不做表达微移),仅保留坐标缩放。预期:shape_scale 仍有提升(来自尺度校正),但 expression_change 和 cell_state 回到 copy_last 水平(~48–49)。若 α=0 和 α=0.08 的 expression_change 无差异,说明机制未运行,需检查方向向量是否退化。"}
原始记录位置/home/spark-longxinyang/vec/runs/formal/20261003-094242-search-t2-embryo-interp-g24-D-s2/nodes/4/researcher.jsonl 5 KB
/home/spark-longxinyang/vec/runs/formal/20261003-094242-search-t2-embryo-interp-g24-D-s2/nodes/4/researcher.stderr