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

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

节点 n5

mix 后加两遍阻尼 NN 坐标位移:全局 kNN(α=0.3) 收缩两朵云 + 同型 kNN(α2=3.0,k=10) 把同类型跨阶段细胞共位化,表达不动,位移后 RMS 偏离目标 >5% 才重缩放。

运行?一次完整的自动搜索或 Agent 会话,有自己的锁定配置和证据包。20261003-094241-search-t2-heart-interp-g24-D-s2
父节点n2
子节点n8
操作?种子:人写的起点;改进:在父节点上改;草稿:从头写;修复:修父节点的报错。改进
状态已打分
分数搜索目标分 60.30(+0.8) · proxy 60.30(+0.8) · 3 次复测均分 59.88
审查通过 1 越界读取:未发现问题——run.py 只经 --data 参数走框架 API(load_manifest/read_stage/panel_genes,run.py:124-135),全文无 open()/绝对路径/../、无 data/raw、无 src/common/evaluation、无网络或权重下载(grep 命中仅 os.environ 与 --seed)。; 2 硬编码目标统计量:未发现问题——常量只有方法超参 PARAMS={align:procrustes, scale_damp:1.0}、ALPHA=0.3、K=10、ALPHA2=3.0 和 0.05 的 RMS 死…
用时?从运行开始到结束(或到现在)的挂钟时间。20 分
程序版本599d1d8e9a2fb24822d3114d6c16c1a31bf1696b (programs.git)

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

来自 programs.git 599d1d8e9a:solution/METHOD.md

mix 后加两遍阻尼 NN 坐标位移:全局 kNN(α=0.3) 收缩两朵云 + 同型 kNN(α2=3.0,k=10) 把同类型跨阶段细胞共位化,表达不动,位移后 RMS 偏离目标 >5% 才重缩放。

方法(family T2HI-02,PLAN 的 NN 位移,加了同型配对分支)

  1. 母节点 mix 管线原样保留:procrustes(共有类型质心 Kabsch,z 保持切片轴只定号)→ 两朵云缩放到 log 线性目标 RMS → 按 (1−t, t) 分型分层抽真实细胞,表达和坐标一起走。
  2. 新增位移(nn_displace,scipy cKDTree):
    • 第一遍(全局):每个 A 细胞向选中 B 细胞的 k=10 近邻质心位移 α·t·(nn_mean−pos),B 细胞对称位移 α·(1−t),α=0.3;
    • 第二遍(同型):在位移后的云上,每个细胞只向同 celltype 的对侧细胞 kNN 质心位移,α2=3.0;对侧没有该类型(或该型细胞数为 0)的细胞不动。同型质心用逐类型 cKDTree 计算,标签由复现 mix_indices(seed) 得到(与 interpolate 内部选择逐位一致,有 assert 保护)。
    • 表达完全不动,每个细胞保留真实测量向量。
  3. 位移后 |log(RMS_out/RMS_target)|>0.05 时统一重缩放回目标 RMS(本次运行 RMS 346.3→331.3,log 差 0.044,未触发重缩放)。
  4. 单输入退路:b 为 None 时完全跳过位移,与母节点相同。
  5. 确定性:cKDTree 查询确定,rng 只来自 --seed;seed 7 复跑逐位一致(已验证)。

机制生效证据(α=0.3/α2=3.0/k=10,proxy seed 0)

  • 位移非零且空间异质:A 细胞平均位移 33.7、B 细胞 86.4 个坐标单位(云 RMS 346),是同型跨阶段距离驱动的逐细胞向量,不是每型一个常向量(同型第二遍内每个细胞的位移取决于自己的 kNN 几何)。
  • RMS 346.3→331.3,向真值方向(proxy 真值 E8.75 RMS≈217,log 比 0.47→0.41)移动。
  • neighborhood_mmd raw 0.08286→0.0789(本节点所有配置中同型强位移一致改善:α2=2.0 时 0.0784);local_spatial 组 54.03→54.85。
  • d2_shape 0.0401→0.0369、occupancy_dice 0.834→0.841、shape_scale 组 53.37→54.67。
  • 表达四项(de_score/de_direction/mmd_u/variogram)raw 与母节点一致(组内差异仅评分器抽样噪声),证实表达未被触碰。

机制关闭对照(mechanism_off_control)

T2_NN_ALPHA=0 → 位移向量全零,输出与母节点预测逐位相同(np.array_equal 验证过 X 与坐标),即对照分 = 母节点 59.50。差 0 分 < 1 分,管线无 bug。开关为环境变量,提交默认打开(α=0.3, α2=3.0)。

vec-score 网格(proxy,A 半,seed 0;噪声约 ±1)

配置榜分local_spatialshape_scalenbd raw
母节点 mix(=α=0 对照)59.5054.0353.370.08286
全局 α=0.1 / 0.359.14 / 59.3553.17 / 52.5553.65 / 55.100.0844 / 0.0865
同型 α=0.3 / 0.6 / 1.0 (k=5)59.18 / 59.22 / 59.0053.7~53.30.0826
全局0.3+同型0.3 (k=10)59.3352.8154.750.0856
全局0.3+同型1.0 (k=10)59.4253.5054.420.0833
全局0.3+同型2.0 (k=10)59.5155.0153.280.0784
全局0.3+同型3.0 (k=10)59.8254.8554.670.0789
全局0.3+同型4.0 (k=10)58.3052.8650.580.0854

验证过 / 没验证

  • 验证过:α=0 对照逐位复现母节点;seed 确定性(seed 0/7);vec-check 通过;上表 9 个查分。
  • 没验证:k 在最优 α2 下的敏感性(只测了 k=5/10);多 seed 稳定性(59.82 比 59.50 高 0.32,在 ±1 噪声内,但 local_spatial +0.8、shape +1.3 两组同向改善,且 nbd raw 改善方向在同型家族里一致);final 视图(E8.25+E8.75→E8.5,31 个共有类型,同型配对会更可靠、位移场更平滑)。
  • 风险:α2=3.0 时 B 细胞平均位移 86(云 RMS 的 25%),同型跨阶段错位大时可能把细胞推过对侧;α2=4.0 已崩(58.3),最优点在过冲边缘。final 上类型更多、跨阶段同型距离更小,位移会更温和,方向应一致。
  • 生物学依据:同型细胞跨阶段共位化对应"同一谱系/类型区域在发育中保持空间毗邻"的通用组织学知识;未使用任何保留阶段数据、比例或标记基因(来源:无外部文献,仅评分反馈驱动的参数选择)。

调研员的计划

名称mix + damped NN coordinate displacement (keep real expression)
动机Node 2 mix scores 59.50. neighborhood_mmd skill is 0.540 (13.51/25, only 1.01 above floor 12.50); d2_shape skill 0.536, occupancy_dice 0.553, scale_log_ratio 0.512 — all barely above floor. The mix method places real cells at their original E8.25/E9.5 positions, so the output cloud is spatially bimodal rather than intermediate. Expression metrics are fine (de_direction 0.675, variogram 0.692), confirming real cells are good; the structural problem is coordinates, not expression.
做法Keep the entire mix pipeline (Procrustes alignment via shared-type Kabsch on xy, log-linear RMS rescaling, stratified type sampling) unchanged. Add one step after sampling: for every selected cell from stage A, query a cKDTree built on the selected stage B cells for k=5 nearest neighbours; displace the cell's coordinates by alpha·t·(mean_nn_pos − cell_pos). Symmetrically, displace each selected stage B cell by alpha·(1−t) toward its k-NN mean in stage A. Expression is NOT touched — each cell keeps its real expression vector. alpha initial 0.3; grid-search alpha ∈ {0.1, 0.2, 0.3, 0.5} on vec-score. k fixed at 5 (optionally try 3, 10 if time permits). After displacement, recompute RMS and, if |log(RMS_out/RMS_target)| > 0.05, uniformly rescale coordinates to restore the log-linear target RMS (this keeps scale_log_ratio neutral). Single-input fallback: if b is None, skip displacement entirely (identical to current fallback). Use scipy.spatial.cKDTree; total added time < 2 s for 17k cells. Quick screen: run alpha=0 (must reproduce parent score ±1) then alpha=0.3; if neighborhood_mmd raw drops (improves), commit; else try alpha=0.1 before concluding failure.
风险1) Displacement may pair cells with expression-incompatible neighbours, worsening neighborhood_mmd if alpha is too large — Engineer should check alpha=0.1 first and compare neighborhood_mmd raw value before running full grid. 2) The NN match is local and may not capture global OT structure; if small alpha shows no gain, a Sinkhorn OT coupling (epsilon = median pairwise distance / 10, 50 iters, subsample to 5000 per side for speed) can replace NN as the matching step. 3) Displacement changes pairwise distances, potentially hurting d2_shape if the target shape is not between the two stages — check d2_shape raw alongside neighborhood. 4) Score noise ~1 point: any improvement < 2 points on a single query is unreliable; re-query best config twice.

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

对比:父节点版本 80df7fc802。改动的文件:solution/EXECUTION.json +1 −0、solution/METHOD.md +44 −0、solution/run.py +109 −10

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..34cb3ea--- /dev/null+++ b/solution/METHOD.md@@ -0,0 +1,44 @@+mix 后加两遍阻尼 NN 坐标位移:全局 kNN(α=0.3) 收缩两朵云 + 同型 kNN(α2=3.0,k=10) 把同类型跨阶段细胞共位化,表达不动,位移后 RMS 偏离目标 >5% 才重缩放。++## 方法(family T2HI-02,PLAN 的 NN 位移,加了同型配对分支)++1. 母节点 mix 管线原样保留:procrustes(共有类型质心 Kabsch,z 保持切片轴只定号)→ 两朵云缩放到 log 线性目标 RMS → 按 (1−t, t) 分型分层抽真实细胞,表达和坐标一起走。+2. 新增位移(`nn_displace`,scipy cKDTree):+   - 第一遍(全局):每个 A 细胞向选中 B 细胞的 k=10 近邻质心位移 α·t·(nn_mean−pos),B 细胞对称位移 α·(1−t),α=0.3;+   - 第二遍(同型):在位移后的云上,每个细胞只向**同 celltype** 的对侧细胞 kNN 质心位移,α2=3.0;对侧没有该类型(或该型细胞数为 0)的细胞不动。同型质心用逐类型 cKDTree 计算,标签由复现 `mix_indices(seed)` 得到(与 interpolate 内部选择逐位一致,有 assert 保护)。+   - 表达完全不动,每个细胞保留真实测量向量。+3. 位移后 |log(RMS_out/RMS_target)|>0.05 时统一重缩放回目标 RMS(本次运行 RMS 346.3→331.3,log 差 0.044,未触发重缩放)。+4. 单输入退路:b 为 None 时完全跳过位移,与母节点相同。+5. 确定性:cKDTree 查询确定,rng 只来自 --seed;seed 7 复跑逐位一致(已验证)。++## 机制生效证据(α=0.3/α2=3.0/k=10,proxy seed 0)++- 位移非零且空间异质:A 细胞平均位移 33.7、B 细胞 86.4 个坐标单位(云 RMS 346),是同型跨阶段距离驱动的逐细胞向量,不是每型一个常向量(同型第二遍内每个细胞的位移取决于自己的 kNN 几何)。+- RMS 346.3→331.3,向真值方向(proxy 真值 E8.75 RMS≈217,log 比 0.47→0.41)移动。+- neighborhood_mmd raw 0.08286→0.0789(本节点所有配置中同型强位移一致改善:α2=2.0 时 0.0784);local_spatial 组 54.03→54.85。+- d2_shape 0.0401→0.0369、occupancy_dice 0.834→0.841、shape_scale 组 53.37→54.67。+- 表达四项(de_score/de_direction/mmd_u/variogram)raw 与母节点一致(组内差异仅评分器抽样噪声),证实表达未被触碰。++## 机制关闭对照(mechanism_off_control)++`T2_NN_ALPHA=0` → 位移向量全零,输出与母节点预测**逐位相同**(`np.array_equal` 验证过 X 与坐标),即对照分 = 母节点 59.50。差 0 分 < 1 分,管线无 bug。开关为环境变量,提交默认打开(α=0.3, α2=3.0)。++## vec-score 网格(proxy,A 半,seed 0;噪声约 ±1)++| 配置 | 榜分 | local_spatial | shape_scale | nbd raw |+|---|---:|---:|---:|---:|+| 母节点 mix(=α=0 对照) | 59.50 | 54.03 | 53.37 | 0.08286 |+| 全局 α=0.1 / 0.3 | 59.14 / 59.35 | 53.17 / 52.55 | 53.65 / 55.10 | 0.0844 / 0.0865 |+| 同型 α=0.3 / 0.6 / 1.0 (k=5) | 59.18 / 59.22 / 59.00 | 53.7 | ~53.3 | 0.0826 |+| 全局0.3+同型0.3 (k=10) | 59.33 | 52.81 | 54.75 | 0.0856 |+| 全局0.3+同型1.0 (k=10) | 59.42 | 53.50 | 54.42 | 0.0833 |+| 全局0.3+同型2.0 (k=10) | 59.51 | 55.01 | 53.28 | 0.0784 |+| **全局0.3+同型3.0 (k=10)** | **59.82** | 54.85 | 54.67 | 0.0789 |+| 全局0.3+同型4.0 (k=10) | 58.30 | 52.86 | 50.58 | 0.0854 |++## 验证过 / 没验证++- 验证过:α=0 对照逐位复现母节点;seed 确定性(seed 0/7);vec-check 通过;上表 9 个查分。+- 没验证:k 在最优 α2 下的敏感性(只测了 k=5/10);多 seed 稳定性(59.82 比 59.50 高 0.32,在 ±1 噪声内,但 local_spatial +0.8、shape +1.3 两组同向改善,且 nbd raw 改善方向在同型家族里一致);final 视图(E8.25+E8.75→E8.5,31 个共有类型,同型配对会更可靠、位移场更平滑)。+- 风险:α2=3.0 时 B 细胞平均位移 86(云 RMS 的 25%),同型跨阶段错位大时可能把细胞推过对侧;α2=4.0 已崩(58.3),最优点在过冲边缘。final 上类型更多、跨阶段同型距离更小,位移会更温和,方向应一致。+- 生物学依据:同型细胞跨阶段共位化对应"同一谱系/类型区域在发育中保持空间毗邻"的通用组织学知识;未使用任何保留阶段数据、比例或标记基因(来源:无外部文献,仅评分反馈驱动的参数选择)。diff --git a/solution/run.py b/solution/run.pyindex 8c61767..1d71332 100644--- a/solution/run.py+++ b/solution/run.py@@ -1,28 +1,117 @@ #!/usr/bin/env python3-"""mix (T2 interpolation): real cells from both bracketing inputs, drawn (1−t, t).--Brackets the target with the nearest inputs before and after it, puts both in-one frame (``ALIGN``), rescales both clouds to the log-linear RMS-exp(log r_a + SCALE_DAMP·t·Δlog r), and draws cells stratified by type:-round(t·n) from the later stage, the rest from the earlier one. Expression and-coordinates travel together. n is log-linear in t, clipped to the board range.-Parameters are the T2 card's choice for this board (selected_params.json).-If the target is not bracketed, falls back to the latest input before it.+"""mix + damped NN coordinate displacement (T2 interpolation).++Same as the parent mix: brackets the target with the nearest inputs before and+after it, aligns both clouds in one frame (``ALIGN`` = procrustes on shared-type+centroids, z held), rescales to the log-linear RMS, draws cells stratified by+type ((1−t, t)), expression and coordinates travel together.++New step after sampling (two damped NN-displacement passes on coordinates):+pass 1 (global, alpha=0.3): each stage-A cell is displaced by alpha·t·(kNN+centroid in stage B − pos), stage-B cells symmetrically by alpha·(1−t). Pass 2+(same-type, alpha2=3.0): same displacement but the kNN centroid is taken only+over other-stage cells of the SAME celltype (per-type cKDTree; cells whose type+is absent on the other side do not move). k=10. Expression is NOT touched —+every cell keeps its real measured profile. After displacement, coordinates are+rescaled to the log-linear target RMS only when |log(RMS_out/RMS_target)|>0.05,+keeping scale_log_ratio neutral.++Mechanism off-control: set env T2_NN_ALPHA=0 — all displacement vectors become+zero and the pipeline is bit-identical to the parent mix (verified). Overrides:+T2_NN_ALPHA2, T2_NN_K, T2_NN_SAME_TYPE (0=global only, 1=same-type only,+2=both, default 2). Single-input fallback (b is None): no displacement. """  from __future__ import annotations  import argparse import json+import os import sys  import numpy as np +from src.task2_spatial.frame import rms_radius, scale_to_rms from src.task2_spatial.methods import interpolate from src.task2_spatial.sample import take from src.task2_spatial.view_io import board_params, interp_bracket, load_manifest, panel_genes, read_stage, write_t2  PARAMS = {"align": "procrustes", "scale_damp": 1.0}+ALPHA = float(os.environ.get("T2_NN_ALPHA", "0.3"))+K = int(os.environ.get("T2_NN_K", "10"))+ALPHA2 = float(os.environ.get("T2_NN_ALPHA2", "3.0"))+++SAME_TYPE = bool(int(os.environ.get("T2_NN_SAME_TYPE", "2")))+++def _nn_mean(src_pts, src_lab, query_pts, query_lab, k, same_type):+    """k-NN centroid of each query point in src; per-type trees when same_type."""+    from scipy.spatial import cKDTree++    if not same_type:+        kk = max(1, min(k, src_pts.shape[0]))+        idx = np.atleast_1d(cKDTree(src_pts).query(query_pts, k=kk)[1]).reshape(query_pts.shape[0], kk)+        return src_pts[idx].mean(axis=1)+    out = np.array(query_pts, dtype=np.float64)+    src_lab = np.asarray(src_lab).astype(str)+    query_lab = np.asarray(query_lab).astype(str)+    trees = {}+    for lab in np.unique(src_lab):+        m = np.flatnonzero(src_lab == lab)+        if m.size:+            trees[lab] = (m, cKDTree(src_pts[m]))+    for lab in np.unique(query_lab):+        if lab not in trees:+            continue+        qm = np.flatnonzero(query_lab == lab)+        m, tree = trees[lab]+        kk = max(1, min(k, m.size))+        idx = np.atleast_1d(tree.query(query_pts[qm], k=kk)[1]).reshape(qm.size, kk)+        out[qm] = src_pts[m][idx].mean(axis=1)+    return out+++def nn_displace(coords, n_a, t, alpha, k, target_rms, labels=None):+    """Displace each cell a damped fraction toward its k-NN centroid in the other stage.++    SAME_TYPE=1: per-type k-NN centroids; SAME_TYPE=2: global first, then a+    second pass with per-type k-NN centroids on the displaced cloud.+    """+    ca = np.asarray(coords[:n_a], dtype=np.float64)+    cb = np.asarray(coords[n_a:], dtype=np.float64)+    out = np.array(coords, dtype=np.float64)+    disp_a_norm = disp_b_norm = 0.0+    rms_pre = rms_radius(out)+    lab_a = labels[:n_a] if labels is not None else None+    lab_b = labels[n_a:] if labels is not None else None+    mode = int(os.environ.get("T2_NN_SAME_TYPE", "2"))+    if alpha > 0.0 and ca.shape[0] > 0 and cb.shape[0] > 0:+        passes = {0: [(False, alpha)], 1: [(True, alpha)], 2: [(False, alpha), (True, ALPHA2)]}[mode]+        for same_type, al in passes:+            a2 = out[:n_a]+            b2 = out[n_a:]+            m2 = _nn_mean(b2, lab_b, a2, lab_a, k, same_type)+            out[:n_a] = a2 + al * t * (m2 - a2)+            m2 = _nn_mean(a2, lab_a, b2, lab_b, k, same_type)+            out[n_a:] = b2 + al * (1.0 - t) * (m2 - b2)+        disp_a_norm = float(np.linalg.norm(out[:n_a] - ca, axis=1).mean())+        disp_b_norm = float(np.linalg.norm(out[n_a:] - cb, axis=1).mean())+    rms_post = rms_radius(out)+    rescaled = abs(np.log(max(rms_post, 1e-8) / max(target_rms, 1e-8))) > 0.05+    if rescaled:+        out = scale_to_rms(out, target_rms)+    info = {+        "nn_alpha": alpha,+        "nn_k": k,+        "disp_a_mean": disp_a_norm,+        "disp_b_mean": disp_b_norm,+        "rms_pre_disp": rms_pre,+        "rms_post_disp": rms_post,+        "rms_rescaled": bool(rescaled),+        "rms_final": rms_radius(out),+    }+    return out, info   def main() -> None:@@ -45,8 +134,18 @@ def main() -> None:     stage_b = read_stage(args.data, b, genes)     params = board_params(manifest, "mix", PARAMS, args.seed)     expr, coords, info = interpolate(stage_a, stage_b, t, params)+    n_a = int(info["n_from_a"])+    sel_labels = None+    if SAME_TYPE:+        from src.task2_spatial.sample import mix_indices++        rng = np.random.default_rng(int(params["seed"]))+        ia, ib = mix_indices(stage_a.labels, stage_b.labels, t, int(info["n"]), rng)+        assert ia.size == n_a, "selection replay mismatch"+        sel_labels = np.concatenate([np.asarray(stage_a.labels)[ia], np.asarray(stage_b.labels)[ib]])+    coords, disp_info = nn_displace(coords, n_a, t, ALPHA, K, float(info["target_rms"]), sel_labels)     keep = {k: info.get(k) for k in ("t", "n", "rms_a", "rms_b", "out_rms", "n_shared_types", "z_dot", "z_flipped", "align")}-    print(json.dumps({"bracket": [a["stage"], b["stage"]], **keep}, default=float), file=sys.stderr)+    print(json.dumps({"bracket": [a["stage"], b["stage"]], **keep, **disp_info}, default=float), file=sys.stderr)     write_t2(args.out, expr, coords, genes, seed=args.seed)  

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

用到的知识库条目

编号标题出处
k027Joint expression-geometry generation with relative geometrynotes/competition/03_solution_landscape.md
k003Fused Gromov-Wasserstein mapping for spatial snapshots10.1038/s41586-024-08453-2
k007Interval staging and held-out-window filtering of external datanotes/official/来件/virtualembryo.ai/rules.md

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

改了什么在父节点 mix(procrustes 对齐 + log 线性 RMS + 分型分层抽真实细胞)之后加两遍只动坐标的 kNN 位移:全局 kNN 收缩 alpha=0.3,再同型(celltype 相同的对侧细胞)kNN 共位化 alpha2=3.0、k=10(逐类型 cKDTree,标签由复现 mix_indices 得到);表达完全不动,位移后 |log(RMS/target)|>0.05 才重缩放(本次 log 差 0.044,未触发)。T2_NN_ALPHA=0 为关闭对照,输出与父节点逐位相同。
各组分数的变化cell_state:不变:mmd_u raw 0.03221→0.03221(得分 8.03 +0.00)、variogram 0.02542→0.02542(得分 8.64 +0.00)。
expression_change:不变:de_score raw 0.3298→0.3298、de_direction 0.5159→0.5159,得分 7.53/8.44 均 +0.00,证实表达确实未被触碰(不是噪声内波动,是完全相同)。
local_spatial:变好 +1.36(54.03→55.39):neighborhood_mmd raw 0.08286→0.07847(−5.3%),skill 0.540→0.554,得分 13.51→13.85。
shape_scale:变好 +1.82(53.37→55.19):主要来自 d2_shape raw 0.04013→0.0351,skill 0.536→0.572,得分 +0.30;scale_log_ratio raw 0.4688→0.4244(向真值方向,RMS 346→331),skill 0.512→0.536,得分 +0.21;occupancy_dice raw 0.8342→0.8318,得分 −0.05(噪声内)。邻域 skill 0.554>0.5,结构门=1,形状增益不是门带来的。
family_idT2HI-02
假设是否成立unclear
经验
  1. 只改坐标、保留真实表达,可以同时改善 neighborhood_mmd 和形状三项,而表达两组 raw 逐位不变——坐标类改动是 T2 上与 DE/细胞状态解耦的独立收益通道。
  2. 在 mix(两侧真实细胞混合)上,单纯全局 kNN 收缩(alpha=0.1/0.3,无同型约束)反而把 local_spatial 从 54.03 拉到 53.17/52.55;加上同型跨阶段配对后 local_spatial 才回到 54.85——全局收缩会打乱表达与位置的配对,配对信息必须来自同一 celltype。
  3. 同型位移的 alpha2 存在过冲悬崖:alpha2=2.0/3.0 得 59.51/59.82,4.0 崩到 58.30,最优点在 B 细胞平均位移已达云 RMS 约 25% 的边缘,参数扫描必须带上崩溃一侧的检查点。
  4. 位移本身让 RMS 346→331、scale_log_ratio raw 0.4688→0.4244 变好,而 0.05 的重缩放阈值未触发——当位移方向天然指向真值尺度时,重缩放保护是冗余的,不要为了保 scale_log_ratio 而强行拉回 log 线性目标。
  5. 用环境变量做 alpha=0 关闭对照并验证 np.array_equal 逐位复现父节点,是排除对齐/抽样/输出管线 bug 的最便宜手段;本节点对照差 0 分,因此 +0.80 可以确定归因于位移机制本身。
  6. Engineer 报告的网格最优(59.82,nbd raw 0.0789、d2_shape 0.0369)与实际计分运行(60.30,nbd raw 0.07847、d2_shape 0.0351)不一致,单 seed/单视图的网格数值不能直接当作榜分预测,读数一律以变化量表为准。
  7. 本节点总分 +0.80 小于 T2 约 1 分的噪声,两组同向改善(shape +1.82、local +1.36)方向可信但幅度未被证实;邻域 skill 0.554 只比门的地板 0.5 高 0.054,任何让 neighborhood_mmd 回退的改动都会经结构门二次扣形状分。
mechanism_active是
下一步建议
  1. 先把 alpha2=3.0/k=10 这套配置做多 seed 复评(至少 3 个 seed,proxy 与 final 视图各一次),只有当榜分增量在多数 seed 上 >1 分才认定收益;同时细扫 alpha2 ∈ {2.0, 2.5, 3.0, 3.5},针对 local_spatial + shape_scale。
  2. 给同型位移加过冲截断:把每个细胞的位移范数上限设为它到对侧同型 kNN 质心的距离(等价于 alpha2 ≤ 1 的逐细胞自适应),或按同型跨阶段质心距的中位数做全局 clip,然后再放开 alpha2 到 3–5 看 local_spatial(neighborhood_mmd skill 仅 0.554,是权重 25 分项里离地板最近、headroom 最大的一项)。
  3. 把同型 kNN 配对换成类型内软配对/OT(每型内 Sinkhorn,epsilon = 该型跨阶段点对距离中位数 / 10,50 次迭代,每型超过 2000 细胞时先分层抽样),期望位移场更平滑、不依赖最近邻的偶发性;在 final 视图(31 个共有类型)上同型配对密度更高,应比 heart_interp 更受益。
  4. 在 alpha2 扫描时同时记录 occupancy_dice raw(本节点 0.8342→0.8318 略降)与位移后云的主轴各向异性,若 dice 继续下滑就把同型位移限制在 xy 平面或按型内质心距加权衰减,避免为了 neighborhood_mmd 牺牲占据形状。

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

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

分析员

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

工程师

角色工程师 alibaba-token-plan-cn/qwen3.8-max
调用次数1 次
轮数37
工具调用共 40 次:bash 26、edit 12、write 2
用时16 分
token 数输入 74,988 · 输出 14,021 · 思考 16,954
任务(第一行)按计划修改程序:mix + damped NN coordinate displacement (keep real expression)
最后的回答(摘录)
**做了什么**:在父节点 mix 管线上按 PLAN 加了 kNN 坐标位移(表达不动),扩展为两遍:全局 kNN 收缩(α=0.3)+ 同型跨阶段 kNN 共位化(α2=3.0,k=10,逐类型 cKDTree,标签由复现 mix_indices 得到)。α2 网格 {0.3→4.0}、模式 {全局/同型/两遍},共 9 次查分。

**查分结果**:最优(全局0.3+同型3.0, k=10)= **59.82**(母 59.50);local_spatial 54.03→54.85(nbd raw 0.08286→0.0789),shape_scale 53.37→54.67,表达四项 raw 不变。对照 T2_NN_ALPHA=0 与母节点输出逐位相同。α2=4.0 过冲崩到 58.30。seed 确定、vec-check 通过、EXECUTION.json gpu=false。

**下一步最值得试**:(1) 在最优 α2 附近细扫(2.5/3.5)+ 多 seed 确认 59.8 不是噪声;(2) 同型位移的过冲保护——把位移截断到跨阶段同型质心距(B 细胞平均位移已达云 RMS 的 25%);(3) 同型配对换成类型内 OT/软配对,final 上 31 个共有类型时该机制应更平滑。
原始记录位置/home/spark-longxinyang/vec/runs/formal/20261003-094241-search-t2-heart-interp-g24-D-s2/nodes/5/engineer.jsonl 209 KB
/home/spark-longxinyang/vec/runs/formal/20261003-094241-search-t2-heart-interp-g24-D-s2/nodes/5/engineer.stderr

调研员

角色调研员 alibaba-token-plan-cn/qwen3.8-max
调用次数1 次
轮数1
工具调用共 0 次:—
用时3 分
token 数输入 9,279 · 输出 1,189 · 思考 7,359
任务(第一行)为节点 n5(改进,父节点 n2)写改进计划 PLAN.json
最后的回答(摘录)
 replace NN as the matching step. 3) Displacement changes pairwise distances, potentially hurting d2_shape if the target shape is not between the two stages — check d2_shape raw alongside neighborhood. 4) Score noise ~1 point: any improvement < 2 points on a single query is unreliable; re-query best config twice.",
  "family_id": "T2HI-02",
  "mechanism": "After mix sampling, displace each selected cell's coordinates a damped fraction toward its nearest-neighbour centroid in the other stage, using real (un-interpolated) expression. This shifts the cloud toward intermediate spatial positions while preserving each cell's real expression profile, improving expression–position pairing and overall shape.",
  "vs_constant_shift": "A per-type constant shift moves every cell of a type by the same vector, preserving all within-type relative geometry. Here each cell gets an individual displacement proportional to its local cross-stage spatial correspondence (distance and direction to its NN in the other stage). The displacement field is spatially varying and cell-specific, not a single vector per type.",
  "mechanism_evidence": "1) Mean and std of displacement vectors should be > 0 and spatially heterogeneous (not a single constant vector); report per-cell displacement histogram. 2) Output RMS radius should move toward the truth's RMS compared to the undisplaced mix. 3) neighborhood_mmd raw value should decrease (improve) relative to parent's 0.08286. 4) d2_shape and occupancy_dice raw values should also improve. 5) Expression metrics (de_score, de_direction, mmd_u, variogram) should remain unchanged (±noise), confirming expression was untouched.",
  "mechanism_off_control": "Set alpha = 0. All displacement vectors become zero; the pipeline is identical to the parent mix method. Score should reproduce node 2 within ±1 point. Any difference > 1 point indicates a bug in the plumbing (alignment, sampling, or output) rather than the displacement mechanism.",
  "sources": []
}
```
原始记录位置/home/spark-longxinyang/vec/runs/formal/20261003-094241-search-t2-heart-interp-g24-D-s2/nodes/5/researcher.jsonl 6 KB
/home/spark-longxinyang/vec/runs/formal/20261003-094241-search-t2-heart-interp-g24-D-s2/nodes/5/researcher.stderr

审查员

角色审查员 alibaba-token-plan-cn/qwen3.8-max
调用次数1 次
轮数14
工具调用共 13 次:bash 7、read 5、write 1
用时3 分
token 数输入 30,643 · 输出 2,193 · 思考 7,412
任务(第一行)审查节点 n5 的程序是否越界读取、写死目标、钻评分器漏洞
最后的回答(摘录)
REVIEW.json written
原始记录位置/home/spark-longxinyang/vec/runs/formal/20261003-094241-search-t2-heart-interp-g24-D-s2/nodes/5/reviewer.jsonl 90 KB
/home/spark-longxinyang/vec/runs/formal/20261003-094241-search-t2-heart-interp-g24-D-s2/nodes/5/reviewer.stderr