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

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

节点 n16

mix+扭曲组成之上加"成熟度选择":按 t_draw=t^1.75 分层抽取时,a 端偏向沿型 a→b 轴更超前的细胞、b 端偏向更落后的细胞(SEL=16,只选细胞不改表达),PLAN 的 RMS 扭曲已实现但对照证明有害,默认关闭。

运行?一次完整的自动搜索或 Agent 会话,有自己的锁定配置和证据包。20261003-004922-search-t2-embryo-interp-g24-D
父节点n12
子节点n18
操作?种子:人写的起点;改进:在父节点上改;草稿:从头写;修复:修父节点的报错。改进
状态已打分
分数搜索目标分 62.07(+1.1) · proxy 62.07(+1.1) · 3 次复测均分 61.75
审查通过 1 越界读取:未发现问题——run.py 仅通过 load_manifest/read_stage(args.data) 读取视图数据(run.py:305-316),imports 均为提供的 src.task2_spatial 库(run.py:32-37),无绝对路径、..、/mnt、downloads、打分器路径,无联网。; 2 硬编码目标统计量:未发现问题——GAMMA=1.75、SEL=16、scale_damp=0.5、MIN_TYPE_CELLS=10(run.py:39-45,102)是标量超参数;型比例、型均值、RMS、细胞数全部从输入阶段现场计算(mix_type_sh…
用时?从运行开始到结束(或到现在)的挂钟时间。26 分
程序版本907b2c5da5b4747a84a85a929c786c932bcf5d3f (programs.git)

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

来自 programs.git 907b2c5da5:solution/METHOD.md

mix+扭曲组成之上加"成熟度选择":按 t_draw=t^1.75 分层抽取时,a 端偏向沿型 a→b 轴更超前的细胞、b 端偏向更落后的细胞(SEL=16,只选细胞不改表达),PLAN 的 RMS 扭曲已实现但对照证明有害,默认关闭。

方法(family T2EI-05 的实现与偏离)

基座 = 父节点 12:procrustes3d 对齐、scale_damp=0.5、target_rms=log 线性、t_draw=t^GAMMA (GAMMA=1.75) 分层混抽真实细胞(表达+坐标同行)。本节点新增:

  1. PLAN 机制(T2EI_RMS_WARP,默认 0=关闭):target_rms 用 t_draw 而非 t 插值。对照结果:off 60.12(与父逐位相同)vs on 58.06(shape_scale 67.9→59.7,scale_log_ratio +0.016→−0.081)。机制生效(target_rms 149.2→135.4,更靠近 rms_a=122.7)但假设被否证:真实目标 RMS≈147,父节点 damp=0.5 已近最优,shape_scale 的损失来自 d2_shape(点云形状,0.006→0.029),不是尺度失配。按 PLAN 风险条款回退。
  2. 成熟度选择(T2EI_SEL,默认 16,提交生效的机制):对两端共有型(各 ≥10 细胞),算型轴 d_c=m_b(c)−m_a(c),a 端细胞权重 exp(+κ·z)、b 端 exp(−κ·z),z=(x−m_self)·d/|d|²,按权重做同配额分层无放回抽样(配额与父节点 stratified_choice 完全一致,只改型内选哪些细胞)。不改任何表达值,保持型内真实多样性——与父节点已否证的 alpha 型均值位移本质不同。依据是通用谱系知识:中间时刻每个型横跨一段成熟度谱,应偏向谱的中间段。
  3. 另试并放弃(各 1 次查分,均默认关闭):b 端按型锚回 a 端领地(B_ANCHOR,59.22,d2_shape 反升 0.042);表达组成与坐标组成解耦(COORD_T,坐标用线性 t 混、按型配对:d2_shape 修复 0.029→0.008 但 neighborhood_mmd 0.053→0.101,总分 55.1,证明表达-坐标耦合不能拆)。

结果(proxy A 半,seed 0,GAMMA=1.75 固定)

SEL (κ)榜分cell_stateexpr_changeshapelocal_spatial
0(=父节点,逐位相同)60.1253.2760.2767.9159.04
260.2152.8060.2969.2758.50
460.4354.3760.2268.4158.71
860.7254.8161.4168.2258.45
16(提交)61.0455.4561.6068.0659.05
3260.6054.7160.6868.6058.40

κ=16 峰:mmd_u 0.0113→0.0107、de_direction 0.354→0.382、variogram 微降,d2_shape 略好(0.0287→0.0257)。

机制对照证据

  • off(SEL=0)与父节点 12 输出逐位相同(X 与 spatial_3D 全等,已本地验证);on(SEL=16)改变了型内被抽中的细胞(同配额、不同个体),四组分变化:cell_state +2.2、expression_change +1.3、local_spatial 0.0、shape_scale +0.15(A 半)。
  • 局限:A 半增益 +0.9(60.12→61.04)在 T2 噪声(~1)边缘,但 κ 曲线 2→16 单调、各组方向一致,且机制只重排真实细胞、不引入新自由度,迁移风险低。未跑 seed 1/2(时限 30 分钟用尽);未验证 final 括号(t=1/3, t_draw=0.146),逻辑与 t 单调相关、视图无关(只用时间差与视图内数据,无绝对时间/路径依赖)。

验证过 / 没验证过

  • 验证过:默认参数输出与 SEL=16 试跑逐位一致;SEL=0 逐位复现父节点;vec-check 通过;n=5000、498 基因、~2s、纯 CPU、seed 确定(default_rng(seed))。
  • 没验证过:seed 1/2 复跑;final 括号;SEL×GAMMA 交互(GAMMA 固定 1.75,κ 增大后最优 GAMMA 可能略移)。
  • 知识来源:仅通用发育生物学(型内成熟度谱系连续),无保留阶段/基因型信息,无外部数据,无 prior 文件。
  • 查分:9/20。

调研员的计划

名称mix+时间扭曲:RMS插值参数与t_draw对齐修复shape_scale
动机节点12用t_draw=t^1.75拉组成向早端,cell_state +17.12(37.49→54.61),但shape_scale -5.40(74.43→69.03,d2_shape 0.006→0.029)。原因是组成已偏向早端(t_draw=0.201),而target RMS仍按线性t插值(log_interp(rms_a,rms_b,t,damp)),导致点云尺度与组成不匹配:抽了80%早端细胞却用50%的尺度目标。ANALYSIS明确建议'把target RMS的插值参数与t_draw对齐'。
做法在父节点12的run.py基础上只改一行:将 target_rms = log_interp(rms_a, rms_b, t, damp) 改为 target_rms = log_interp(rms_a, rms_b, t_draw, damp)。这样RMS目标与组成抽取使用同一个扭曲时间,几何尺度与细胞来源一致。

步骤:
1. 复制父节点12的solution/,修改mix_type_shift函数中target_rms计算,用t_draw替代t。
2. 先跑seed 0一次vec-score确认方向(预期shape_scale回升≥3分,cell_state基本不变±1分)。
3. 若shape回升但总分未超61,做scale_damp小网格{0.35,0.5,0.65}×固定GAMMA=1.75,各1次vec-score,选最优。
4. 最优配置跑3 seeds取均值确认>61.5(超噪声1分)。
5. 单输入阶段退路:无括号时copy_last,不涉及log_interp,逻辑不变。

关键参数:GAMMA=1.75(不变),damp=0.5(初始),搜索范围0.35-0.65。t_draw=0.201时target_rms更靠近rms_a,符合早端主导的组成。
风险1. RMS对齐后若早端rms_a远小于目标真实尺度,可能过度缩小点云,反而让shape更差——Engineer第一次vec-score若shape_scale<69应立即回退并尝试damp=0.35(减弱缩放幅度)。2. local_spatial可能因坐标缩放变化而波动±1-2分,需观察。3. 30分钟时限内最多做6-8次vec-score,不要做全网格。

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

对比:父节点版本 727300143b。改动的文件:solution/METHOD.md +22 −35、solution/run.py +171 −8

diff --git a/solution/METHOD.md b/solution/METHOD.mdindex 0b8d5cb..6075488 100644--- a/solution/METHOD.md+++ b/solution/METHOD.md@@ -1,47 +1,34 @@-mix+时间扭曲组成:按 t_draw=t^1.75 而非线性 t 从括号两端分层抽真实细胞(表达、坐标同行),专攻最弱的 cell_state 组。+mix+扭曲组成之上加"成熟度选择":按 t_draw=t^1.75 分层抽取时,a 端偏向沿型 a→b 轴更超前的细胞、b 端偏向更落后的细胞(SEL=16,只选细胞不改表达),PLAN 的 RMS 扭曲已实现但对照证明有害,默认关闭。 -## 方法+## 方法(family T2EI-05 的实现与偏离) -在父节点 2(mix:procrustes3d 对齐、scale_damp=0.5、细胞数 log 线性夹到 [min,max]、按 (1−t, t) 分层抽真实细胞)之上,只改**抽取比例**:+基座 = 父节点 12:procrustes3d 对齐、scale_damp=0.5、target_rms=log 线性、t_draw=t^GAMMA (GAMMA=1.75) 分层混抽真实细胞(表达+坐标同行)。本节点新增: -- 组成扭曲:`t_draw = t**GAMMA`,GAMMA=1.75(默认常量,可用环境变量 `T2EI_GAMMA` 覆盖)。代理 t=0.4 → t_draw=0.201(5000 个细胞中 3994 来自 E6.75、1006 来自 E8.0)。-- 坐标、target RMS(log 线性 + scale_damp=0.5)、细胞数 n、表达全部沿用父节点逻辑,逐位不变;只有"从哪端抽多少细胞"变了。-- 生物学依据(通用机制知识,非保留阶段测量):早期胚胎在单位时间内细胞类型/状态扩张极快,后期阶段的细胞群与更早阶段差异远大于线性时间比例的假设,故线性 t 混抽会**过采晚端**细胞;对 t 做单调幂变换把组成拉向早端。t_draw 只由 manifest 的时间差算出,视图无关、时间平移不变。+1. **PLAN 机制(T2EI_RMS_WARP,默认 0=关闭)**:target_rms 用 t_draw 而非 t 插值。对照结果:off 60.12(与父逐位相同)vs on **58.06**(shape_scale 67.9→59.7,scale_log_ratio +0.016→−0.081)。机制生效(target_rms 149.2→135.4,更靠近 rms_a=122.7)但假设被否证:真实目标 RMS≈147,父节点 damp=0.5 已近最优,shape_scale 的损失来自 d2_shape(点云形状,0.006→0.029),不是尺度失配。按 PLAN 风险条款回退。+2. **成熟度选择(T2EI_SEL,默认 16,提交生效的机制)**:对两端共有型(各 ≥10 细胞),算型轴 d_c=m_b(c)−m_a(c),a 端细胞权重 exp(+κ·z)、b 端 exp(−κ·z),z=(x−m_self)·d/|d|²,按权重做同配额分层无放回抽样(配额与父节点 stratified_choice 完全一致,只改型内选哪些细胞)。**不改任何表达值**,保持型内真实多样性——与父节点已否证的 alpha 型均值位移本质不同。依据是通用谱系知识:中间时刻每个型横跨一段成熟度谱,应偏向谱的中间段。+3. 另试并放弃(各 1 次查分,均默认关闭):b 端按型锚回 a 端领地(B_ANCHOR,59.22,d2_shape 反升 0.042);表达组成与坐标组成解耦(COORD_T,坐标用线性 t 混、按型配对:d2_shape 修复 0.029→0.008 但 neighborhood_mmd 0.053→0.101,总分 55.1,证明表达-坐标耦合不能拆)。 -## PLAN(T2EI-01 型均值表达位移):已实现、机制对照已做,但方向有害,提交时关闭(ALPHA=0)+## 结果(proxy A 半,seed 0,GAMMA=1.75 固定) -run.py 内完整实现了 PLAN 的型均值位移:共有型(两端各 ≥10 个细胞)按 `delta_c = mean_b(c) − mean_a(c)`,a 端细胞 `x += alpha·t·delta_c`,b 端 `x −= alpha·(1−t)·delta_c`,单端型不动,负值裁剪为 0;开关 `T2EI_ALPHA`(默认 0.0)。--机制生效证据(alpha=1,代理 E6.75+E8.0→E7.25):10 个型被位移,位移向量 L2 范数 min/med/max = 13.6/21.8/26.1(>0 且型间有差异);各型均值与中间均值 (1−t)m_a+t·m_b 的余弦从两端间 0.613 升到 0.994;43% 的表达矩阵元素被改变,坐标不变。--机制对照(同程序 alpha=0 vs alpha=1,各 1 次 vec-score):--| 配置 | A半榜分 | cell_state | expr_change | shape | local_spatial |+| SEL (κ) | 榜分 | cell_state | expr_change | shape | local_spatial | |---|---:|---:|---:|---:|---:|-| alpha=0(=父节点,逐位相同) | 56.42 | 36.23 | 59.80 | 75.17 | 54.48 |-| alpha=0.5 | 52.80 | 27.34 | 59.69 | 74.57 | 49.60 |-| alpha=1.0 | 48.43 | 23.45 | 59.45 | 66.57 | 44.28 |+| 0(=父节点,逐位相同) | 60.12 | 53.27 | 60.27 | 67.91 | 59.04 |+| 2 | 60.21 | 52.80 | 60.29 | 69.27 | 58.50 |+| 4 | 60.43 | 54.37 | 60.22 | 68.41 | 58.71 |+| 8 | 60.72 | 54.81 | 61.41 | 68.22 | 58.45 |+| **16(提交)** | **61.04** | **55.45** | **61.60** | 68.06 | 59.05 |+| 32 | 60.60 | 54.71 | 60.68 | 68.60 | 58.40 | -alpha 越大 cell_state、local_spatial 越差(mmd_u 0.017→0.028,variogram 0.031→0.102):把端点细胞推到"两端型均值的凸组合"反而离真实中间阶段的细胞状态分布更远。PLAN 预期的 cell_state 增益没有出现(不是升 <2 分,是降 13 分),故按事实提交 alpha=0。alpha=1 与 GAMMA=1.75 组合也测过:56.27,同样差,排除"扭曲后再位移"的补救。+κ=16 峰:mmd_u 0.0113→0.0107、de_direction 0.354→0.382、variogram 微降,d2_shape 略好(0.0287→0.0257)。 -## 结果(proxy A 半,vec-score)+## 机制对照证据 -| GAMMA(t_draw) | 榜分 | cell_state | expr_change | shape | local_spatial |-|---|---:|---:|---:|---:|---:|-| 1.0(父节点) | 56.42 | 36.23 | 59.80 | 75.17 | 54.48 |-| 1.5(0.253) | 59.35 | 48.42 | 60.20 | 70.14 | 58.64 |-| **1.75(0.201,提交)** | **60.12** | 53.27 | 60.27 | 67.91 | 59.04 |-| 2.0(0.160) | 59.57 | 54.50 | 59.96 | 66.85 | 56.96 |-| 2.5(0.101) | 58.48 | 55.58 | 59.42 | 64.86 | 54.04 |--种子稳健性(GAMMA=1.75):seed 0/1/2 = 60.12 / 59.72 / 59.63,均值 59.82,比父节点高 ~3.4(>噪声 2)。cell_state 从 36 升到 ~53;代价是 shape_scale 75→68(d2_shape 0.006→0.029,a 端主导后点云形状略偏离),总分仍净增。+- off(SEL=0)与父节点 12 输出**逐位相同**(X 与 spatial_3D 全等,已本地验证);on(SEL=16)改变了型内被抽中的细胞(同配额、不同个体),四组分变化:cell_state +2.2、expression_change +1.3、local_spatial 0.0、shape_scale +0.15(A 半)。+- 局限:A 半增益 +0.9(60.12→61.04)在 T2 噪声(~1)边缘,但 κ 曲线 2→16 单调、各组方向一致,且机制只重排真实细胞、不引入新自由度,迁移风险低。未跑 seed 1/2(时限 30 分钟用尽);未验证 final 括号(t=1/3, t_draw=0.146),逻辑与 t 单调相关、视图无关(只用时间差与视图内数据,无绝对时间/路径依赖)。  ## 验证过 / 没验证过 -- 验证过:GAMMA=1.0 且 ALPHA=0 时输出与父节点**逐位相同**(X 与 spatial_3D 全等);seed 0 重跑逐位一致;vec-check 通过;n=5000、498 基因、runtime ~2s、纯 CPU(EXECUTION.json gpu=false)。-- 没验证过:真实 final 括号(E7.25+E8.0→E7.5,t=1/3 → t_draw=0.146)上的效果——扭曲是 t 的单调函数、只依赖时间差,逻辑上同样成立,但最优 GAMMA 可能随括号不同;代理只有一个括号,GAMMA=1.75 是在其上调的点估计(1.5–2.0 都在 59+,峰较宽)。-- 无括号退路(copy_last 式整段照抄+分层抽样)保留父节点原逻辑,未在本视图触发。--## 知识来源--未使用任何保留阶段/基因型的测量信息;未用外部数据(external 为空);未用 prior 文件。唯一生物学假设(早期发育细胞状态扩张快于线性时间)为通用发育生物学常识,且只通过 t 的单调变换进入程序。查分共 11 次(配额 20)。+- 验证过:默认参数输出与 SEL=16 试跑逐位一致;SEL=0 逐位复现父节点;vec-check 通过;n=5000、498 基因、~2s、纯 CPU、seed 确定(default_rng(seed))。+- 没验证过:seed 1/2 复跑;final 括号;SEL×GAMMA 交互(GAMMA 固定 1.75,κ 增大后最优 GAMMA 可能略移)。+- 知识来源:仅通用发育生物学(型内成熟度谱系连续),无保留阶段/基因型信息,无外部数据,无 prior 文件。+- 查分:9/20。diff --git a/solution/run.py b/solution/run.pyindex 3a4fe74..5b3e60d 100644--- a/solution/run.py+++ b/solution/run.py@@ -40,23 +40,168 @@ PARAMS = {"align": "procrustes3d", "scale_damp": 0.5} MIN_TYPE_CELLS = 10 ALPHA = float(os.environ.get("T2EI_ALPHA", "0.0")) GAMMA = float(os.environ.get("T2EI_GAMMA", "1.75"))+RMS_WARP = os.environ.get("T2EI_RMS_WARP", "0") == "1"+B_ANCHOR = os.environ.get("T2EI_B_ANCHOR", "0") == "1"+SHAPE_FILL = os.environ.get("T2EI_SHAPE_FILL", "0") == "1"+COORD_T = os.environ.get("T2EI_COORD_T", "")  -def mix_type_shift(stage_a, stage_b, t: float, params: dict, alpha: float, gamma: float = 1.0):+def _pair_by_label(labels_expr: np.ndarray, labels_coord: np.ndarray, rng: np.random.Generator) -> np.ndarray:+    """perm[i] = index of the coord slot assigned to expression cell i, matching cell types first."""+    from collections import defaultdict++    buckets: dict = defaultdict(list)+    for j, lab in enumerate(labels_coord):+        buckets[lab].append(j)+    perm = -np.ones(len(labels_expr), dtype=np.int64)+    for i, lab in enumerate(labels_expr):+        if buckets.get(lab):+            perm[i] = buckets[lab].pop()+    rem_expr = np.flatnonzero(perm < 0)+    rem_coord = np.array([j for lab in sorted(buckets) for j in buckets[lab]], dtype=np.int64)+    rng.shuffle(rem_coord)+    perm[rem_expr] = rem_coord[: rem_expr.size]+    return perm+DAMP = os.environ.get("T2EI_DAMP", "")+++def _anchor_b_to_a(ca: np.ndarray, aligned_b: np.ndarray, labels_a: np.ndarray, labels_b: np.ndarray, target_rms: float, rms_b: float) -> np.ndarray:+    """Place b-side cells at the a-side territory of their own cell type.++    For each type shared by both stages, the b cells of that type keep their+    within-type relative offsets (scaled by the global target_rms/rms_b factor)+    but are re-centred on the centroid of the same type in the scaled a cloud.+    Types seen only in b keep their global relative offsets around the a cloud+    centre. This is a lineage-continuity prior (general developmental+    knowledge: a type's spatial territory at the intermediate time lies near+    where that type already sits at the earlier bracket stage), not a+    measurement from any reserved stage.+    """+    la = np.asarray(labels_a).astype(str)+    lb = np.asarray(labels_b).astype(str)+    k = float(target_rms) / max(float(rms_b), 1e-8)+    b_all = np.asarray(aligned_b, dtype=np.float64)+    cb = b_all - b_all.mean(axis=0)+    out = k * cb+    cent_a_all = np.asarray(ca, dtype=np.float64).mean(axis=0)+    a_all = np.asarray(ca, dtype=np.float64)+    shared = sorted(set(la.tolist()) & set(lb.tolist()))+    n_anchored = 0+    for c in shared:+        ma = la == c+        mb = lb == c+        if ma.sum() == 0 or mb.sum() == 0:+            continue+        ca_c = a_all[ma].mean(axis=0)+        cb_c = b_all[mb].mean(axis=0)+        out[mb] = ca_c + k * (b_all[mb] - cb_c)+        n_anchored += int(mb.sum())+    return out, n_anchored+++SEL = float(os.environ.get("T2EI_SEL", "16"))+++def _weighted_stratified(labels: np.ndarray, n: int, rng: np.random.Generator, weights: np.ndarray) -> np.ndarray:+    """Same allocation as stratified_choice, but within-type draws use per-cell weights."""+    labels = np.asarray(labels).astype(str)+    n = int(min(max(n, 1), len(labels)))+    if n >= len(labels):+        return np.arange(len(labels))+    types, counts = np.unique(labels, return_counts=True)+    raw = counts / counts.sum() * n+    alloc = np.floor(raw).astype(int)+    rem = int(n - alloc.sum())+    order = np.argsort(-(raw - alloc))+    for i in range(rem):+        alloc[order[i % len(order)]] += 1+    alloc = np.minimum(alloc, counts)+    deficit = int(n - alloc.sum())+    if deficit > 0:+        spare = counts - alloc+        for i in np.argsort(-spare):+            k = int(min(deficit, spare[i]))+            alloc[i] += k+            deficit -= k+            if deficit == 0:+                break+    picks = []+    for lab, k in zip(types, alloc):+        if k <= 0:+            continue+        idx = np.flatnonzero(labels == lab)+        w = np.asarray(weights, dtype=np.float64)[idx]+        w = np.clip(w, 1e-12, None)+        w = w / w.sum()+        picks.append(rng.choice(idx, int(k), replace=False, p=w))+    return np.concatenate(picks)+++def _selection_weights(X, labels: np.ndarray, means_self: dict, means_other: dict, cnt_self: dict, cnt_other: dict, kappa: float, toward_other_is_advanced: bool) -> np.ndarray:+    """Weight cells by their position along their type's a->b axis.++    a-side cells ahead of their type mean (towards the later stage) get higher+    weight, b-side cells behind their type mean (towards the earlier stage) get+    higher weight; within-type diversity is preserved (real cells are selected,+    expression values are never modified). Lineage-continuity prior: at an+    intermediate time each type spans a range of maturities, so the drawn+    subset should be biased towards the intermediate part of that range.+    """+    labels = np.asarray(labels).astype(str)+    w = np.ones(len(labels), dtype=np.float64)+    for c in sorted(set(means_self) & set(means_other)):+        if cnt_self.get(c, 0) < MIN_TYPE_CELLS or cnt_other.get(c, 0) < MIN_TYPE_CELLS:+            continue+        idx = np.flatnonzero(labels == c)+        if idx.size == 0:+            continue+        if toward_other_is_advanced:+            d = (means_other[c] - means_self[c]).astype(np.float64)+        else:+            d = (means_self[c] - means_other[c]).astype(np.float64)+        nrm = float(d @ d)+        if nrm < 1e-9:+            continue+        base = float(np.asarray(means_self[c], dtype=np.float64) @ d)+        rows = np.asarray(X[idx].todense() if hasattr(X[idx], "todense") else X[idx], dtype=np.float64)+        z = (rows @ d - base) / nrm+        w[idx] = np.exp(np.clip(kappa * z, -10.0, 10.0))+    return w+++def mix_type_shift(stage_a, stage_b, t: float, params: dict, alpha: float, gamma: float = 1.0, rms_warp: bool = False, b_anchor: bool = False):     t = float(t)     t_draw = float(np.clip(t ** gamma, 0.0, 1.0)) if gamma != 1.0 else t-    damp = float(params.get("scale_damp", 1.0))+    damp = float(DAMP) if DAMP else float(params.get("scale_damp", 1.0))     align = str(params.get("align", "procrustes"))     rng = np.random.default_rng(int(params.get("seed", 0)))      aligned_a, aligned_b, info = align_pair(stage_a.coords, stage_b.coords, stage_a.labels, stage_b.labels, align)     rms_a = rms_radius(stage_a.coords)     rms_b = rms_radius(stage_b.coords)-    target_rms = log_interp(rms_a, rms_b, t, damp)+    target_rms = log_interp(rms_a, rms_b, t_draw if rms_warp else t, damp)     ca = scale_to_rms(aligned_a, target_rms)-    cb = scale_to_rms(aligned_b, target_rms)+    if b_anchor:+        cb, n_anchored = _anchor_b_to_a(ca, aligned_b, stage_a.labels, stage_b.labels, target_rms, rms_b)+    else:+        cb = scale_to_rms(aligned_b, target_rms)+        n_anchored = 0     n = _limits(params, stage_a.n, stage_b.n, t, "interp")-    ia, ib = mix_indices(stage_a.labels, stage_b.labels, t_draw, n, rng)+    if SEL > 0.0:+        la_s = np.asarray(stage_a.labels).astype(str)+        lb_s = np.asarray(stage_b.labels).astype(str)+        cnt_a = {k: int(v) for k, v in zip(*np.unique(la_s, return_counts=True))}+        cnt_b = {k: int(v) for k, v in zip(*np.unique(lb_s, return_counts=True))}+        means_a = type_means(stage_a.X, la_s)+        means_b = type_means(stage_b.X, lb_s)+        n_b = int(np.clip(int(round(t_draw * n)), 0, n))+        n_a = int(n) - n_b+        wa = _selection_weights(stage_a.X, la_s, means_a, means_b, cnt_a, cnt_b, SEL, True)+        wb = _selection_weights(stage_b.X, lb_s, means_b, means_a, cnt_b, cnt_a, -SEL, False)+        ia = _weighted_stratified(la_s, n_a, rng, wa)+        ib = _weighted_stratified(lb_s, n_b, rng, wb)+    else:+        ia, ib = mix_indices(stage_a.labels, stage_b.labels, t_draw, n, rng)      xa = as_dense(stage_a.X, ia)     xb = as_dense(stage_b.X, ib)@@ -95,7 +240,20 @@ def mix_type_shift(stage_a, stage_b, t: float, params: dict, alpha: float, gamma             }      expr = np.clip(np.vstack([p for p in (xa, xb) if p.size]), 0.0, None).astype(np.float32)-    coords = np.vstack([p for p in (ca[ia], cb[ib]) if len(p)])+    n_coord_from_b = int(ib.size)+    if COORD_T:+        ct = float(np.clip(float(COORD_T), 0.0, 1.0))+        ja, jb = mix_indices(stage_a.labels, stage_b.labels, ct, n, rng)+        la_s = np.asarray(stage_a.labels).astype(str)+        lb_s = np.asarray(stage_b.labels).astype(str)+        lab_e = np.concatenate([la_s[ia], lb_s[ib]])+        lab_c = np.concatenate([la_s[ja], lb_s[jb]])+        C = np.vstack([p for p in (ca[ja], cb[jb]) if len(p)])+        perm = _pair_by_label(lab_e, lab_c, rng)+        coords = C[perm]+        n_coord_from_b = int(jb.size)+    else:+        coords = np.vstack([p for p in (ca[ia], cb[ib]) if len(p)])     coords = _jitter(coords, rng)     coords = scale_to_rms(coords, target_rms)     info.update(@@ -107,9 +265,14 @@ def mix_type_shift(stage_a, stage_b, t: float, params: dict, alpha: float, gamma         out_rms=rms_radius(coords),         alpha=alpha,         gamma=gamma,+        rms_warp=int(rms_warp),+        b_anchor=int(b_anchor),+        n_anchored=int(n_anchored),+        damp=damp,         t_draw=t_draw,         n_from_a=int(ia.size),         n_from_b=int(ib.size),+        n_coord_from_b=n_coord_from_b,         **shift_stats,     )     return expr, coords.astype(np.float32), info@@ -151,8 +314,8 @@ def main() -> None:     stage_a = read_stage(args.data, a, genes)     stage_b = read_stage(args.data, b, genes)     params = board_params(manifest, "mix", PARAMS, args.seed)-    expr, coords, info = mix_type_shift(stage_a, stage_b, t, params, ALPHA, GAMMA)-    keep = {k: info.get(k) for k in ("t", "t_draw", "gamma", "n", "rms_a", "rms_b", "out_rms", "n_shared_types", "z_dot", "z_flipped", "align", "alpha", "n_types_shifted", "delta_norm_min", "delta_norm_med", "delta_norm_max", "cos_ab_before", "cos_to_mid_after", "n_from_a", "n_from_b")}+    expr, coords, info = mix_type_shift(stage_a, stage_b, t, params, ALPHA, GAMMA, RMS_WARP, B_ANCHOR)+    keep = {k: info.get(k) for k in ("t", "t_draw", "gamma", "rms_warp", "target_rms", "n", "rms_a", "rms_b", "out_rms", "n_shared_types", "z_dot", "z_flipped", "align", "alpha", "n_types_shifted", "delta_norm_min", "delta_norm_med", "delta_norm_max", "cos_ab_before", "cos_to_mid_after", "n_from_a", "n_from_b")}     print(json.dumps({"bracket": [a["stage"], b["stage"]], **keep}, default=float), file=sys.stderr)     write_t2(args.out, expr, coords, genes, seed=args.seed) 

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

用到的知识库条目

编号标题出处
k007Interval staging and held-out-window filtering of external datanotes/official/来件/virtualembryo.ai/rules.md
k024World-model evaluation dimensions for state-transition predictorsnotes/competition/07_biomedical_world_models.md
k008Navigo: iterative rectified flow matching on snapshot time series10.64898/2026.06.18.733286

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

改了什么PLAN 的 RMS-warp(target_rms 用 t_draw 插值)已实现但对照证明有害,默认关闭(T2EI_RMS_WARP=0);实际提交的机制是新增的"成熟度选择"(T2EI_SEL=16):在 t_draw=t^1.75 的同配额分层抽样内,a 端偏向沿型轴 a→b 更超前、b 端偏向更落后的真实细胞,只改抽中哪些细胞、不改任何表达值。另实现并放弃 b-anchor 与表达-坐标解耦(COORD_T),均默认关闭。
各组分数的变化cell_state:变好 +2.17(54.61→56.78,超噪声)
expression_change:变好 +1.86(60.13→61.99,超 T2 噪声~1)
local_spatial:噪声内 +0.34(60.31→60.65)
shape_scale:噪声内 -0.16(69.03→68.87)
榜分:+1.06(61.02→62.07),略超噪声边缘,方向与 A 半 κ 曲线单调趋势(60.12→61.04)一致
family_idother
假设是否成立否
经验
  1. 在 t_draw 扭曲组成的 mix 基座上,把 target_rms 的插值参数也从 t 换成 t_draw(RMS-warp):target_rms 149.2→135.4 更靠近 rms_a=122.7,但榜分 60.12→58.06、shape_scale 67.9→59.7(scale_log_ratio +0.016→−0.081)——真实中间时刻的目标 RMS≈147,父节点 damp=0.5 已近最优;node 12 的 shape_scale 损失来自 d2_shape(点云形状 0.006→0.029),不是尺度失配,'组成-尺度对齐'假设被否证。
  2. 把表达组成与坐标组成解耦(坐标按线性 t 混、按型配对)能修复 d2_shape(0.029→0.008)但 neighborhood_mmd 0.053→0.101、总分跌到 55.1——表达与坐标同行耦合是 local_spatial/neighborhood 指标的前提,不能拆开换 shape。
  3. b 端细胞按型锚回 a 端领地(B_ANCHOR)使 d2_shape 反升到 0.042、总分 59.22——强行施加领地先验破坏 b 端自身的空间结构。
  4. 不改表达值、只在型内按成熟度轴重排被抽中的真实细胞(a 端选超前、b 端选落后,κ=16)可小幅提升 cell_state 与 expression_change 且不伤 shape:κ 曲线 0/2/4/8/16/32 → 60.12/60.21/60.43/60.72/61.04/60.60,峰在 16,mmd_u 0.0113→0.0107、de_direction 0.354→0.382;与已否证的 alpha 型均值位移(改表达值,cell_state −13)形成对照——选真实细胞优于合成位移。
  5. 方法学:每个新机制都带环境变量开关并做 off=逐位复现父节点的对照,能在 9/20 次查分配额内快速否证 3 个方向并保留 1 个有效方向。
mechanism_active是
下一步建议
  1. 针对 cell_state/expression_change:做 SEL(κ)×GAMMA 二维小网格(κ∈{8,16,24}×GAMMA∈{1.75,2.0,2.25},各 1 次查分),κ 增大后最优 GAMMA 可能右移;先跑 seed 1/2 确认 +1.06 超噪声再花配额。
  2. 针对 cell_state:在 κ=16 附近细扫 {12,20,24} 并检查权重是否应改用型内 rank/z 截断(当前 clip ±10 已近硬选择,κ=32 回落说明过尖)。
  3. 针对 shape_scale(仍是 d2_shape 0.029 的形状损失而非尺度):不要动 target_rms 或拆表达-坐标耦合,改试在保持同行耦合前提下对抽中细胞坐标做型内轻微向型质心收缩的小系数(如 0.05-0.1)网格。

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

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

分析员

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

工程师

角色工程师 alibaba-token-plan-cn/qwen3.8-max
调用次数1 次
轮数47
工具调用共 53 次:bash 30、edit 20、read 2、write 1
用时21 分
token 数输入 84,552 · 输出 12,234 · 思考 20,669
任务(第一行)按计划修改程序:mix+时间扭曲:RMS插值参数与t_draw对齐修复shape_scale
最后的回答(摘录)
**完成。**

- **做了什么**:PLAN 的 RMS-warp 机制已实现并对照(T2EI_RMS_WARP 开关),off 逐位复现父节点 60.12,on 得 58.06 —— 假设被否证(真实 RMS≈147,父节点已近最优;shape 损失来自点云形状 d2_shape 而非尺度),按 PLAN 风险条款回退。改提交**成熟度选择**机制(T2EI_SEL=16):在 t_draw=t^1.75 的同配额分层抽样内,a 端偏向沿型轴 a→b 更超前、b 端偏向更落后的真实细胞,只选不改表达。
- **查分**(proxy A 半,9/20 次):SEL 0/2/4/8/16/32 → 60.12/60.21/60.43/60.72/**61.04**/60.60,κ=16 峰,cell_state 53.3→55.5、expr 60.3→61.6。另试 b-anchor(59.22)与表达-坐标解耦(55.1,证明 neighborhood 依赖耦合,shape 修复换不回来)均放弃并默认关闭。vec-check 通过、seed 确定、纯 CPU ~2s。
- **下一步最值得试**:SEL=16 与 GAMMA 的二维小网格(κ 增大后最优 GAMMA 可能 >1.75,可望再拿 cell_state);seed 1/2 复跑确认 +0.9 超噪声;把 SEL 机制带到心脏插值榜验证迁移。
原始记录位置/home/spark-longxinyang/vec/runs/formal/20261003-004922-search-t2-embryo-interp-g24-D/nodes/16/engineer.jsonl 223 KB
/home/spark-longxinyang/vec/runs/formal/20261003-004922-search-t2-embryo-interp-g24-D/nodes/16/engineer.stderr

调研员

角色调研员 alibaba-token-plan-cn/qwen3.8-max
调用次数2 次
轮数2
工具调用共 0 次:—
用时4 分
token 数输入 12,046 · 输出 967 · 思考 9,285
任务(第一行)为节点 n16(改进,父节点 n12)写改进计划 PLAN.json
最后的回答(摘录)
```json
{
  "name": "mix+时间扭曲:RMS插值参数与t_draw对齐修复shape_scale",
  "motivation": "节点12用t_draw=t^1.75拉组成向早端,cell_state +17.12(37.49→54.61),但shape_scale -5.40(74.43→69.03,d2_shape 0.006→0.029)。原因是组成已偏向早端(t_draw=0.201),而target RMS仍按线性t插值(log_interp(rms_a,rms_b,t,damp)),导致点云尺度与组成不匹配:抽了80%早端细胞却用50%的尺度目标。ANALYSIS明确建议'把target RMS的插值参数与t_draw对齐'。",
  "approach": "在父节点12的run.py基础上只改一行:将 target_rms = log_interp(rms_a, rms_b, t, damp) 改为 target_rms = log_interp(rms_a, rms_b, t_draw, damp)。这样RMS目标与组成抽取使用同一个扭曲时间,几何尺度与细胞来源一致。\n\n步骤:\n1. 复制父节点12的solution/,修改mix_type_shift函数中target_rms计算,用t_draw替代t。\n2. 先跑seed 0一次vec-score确认方向(预期shape_scale回升≥3分,cell_state基本不变±1分)。\n3. 若shape回升但总分未超61,做scale_damp小网格{0.35,0.5,0.65}×固定GAMMA=1.75,各1次vec-score,选最优。\n4. 最优配置跑3 seeds取均值确认>61.5(超噪声1分)。\n5. 单输入阶段退路:无括号时copy_last,不涉及log_interp,逻辑不变。\n\n关键参数:GAMMA=1.75(不变),damp=0.5(初始),搜索范围0.35-0.65。t_draw=0.201时target_rms更靠近rms_a,符合早端主导的组成。",
  "expected_groups": ["shape_scale"],
  "risks": "1. RMS对齐后若早端rms_a远小于目标真实尺度,可能过度缩小点云,反而让shape更差——Engineer第一次vec-score若shape_scale<69应立即回退并尝试damp=0.35(减弱缩放幅度)。2. local_spatial可能因坐标缩放变化而波动±1-2分,需观察。3. 30分钟时限内最多做6-8次vec-score,不要做全网格。",
  "family_id": "T2EI-05",
  "mechanism": "将RMS目标的插值参数从线性t替换为组成扭曲后的t_draw,使点云几何尺度与实际抽取的细胞组成(偏向早端)保持一致,消除组成-尺度失配。",
  "vs_constant_shift": "常数位移对每个细胞型加相同向量,不改变点云尺度;本方案改变的是整个点云的目标RMS(各向同性缩放参数),且缩放幅度由组成扭曲程度(t_draw)决定而非固定常数,是组成-几何耦合的结构性修复。",
  "mechanism_evidence": "Engineer应对比:(1) target_rms数值变化(用t时=某值,用t_draw时应更靠近rms_a);(2) 输出坐标的RMS与d2_shape指标;(3) 四组分各自变化,预期shape_scale回升≥3分而cell_state变化<1分(因表达未动)。若shape_scale未回升说明失配不是主因。",
  "mechanism_off_control": "关闭机制=使用t而非t_draw做log_interp(即父节点12的原始行为)。同一程序设环境变量T2EI_RMS_WARP=0时用t,=1时用t_draw。预期:off时输出与父节点12逐位相同(坐标、表达全等),on时shape_scale应回升而cell_state不变。"
}
```
原始记录位置/home/spark-longxinyang/vec/runs/formal/20261003-004922-search-t2-embryo-interp-g24-D/nodes/16/researcher.jsonl 1 KB
/home/spark-longxinyang/vec/runs/formal/20261003-004922-search-t2-embryo-interp-g24-D/nodes/16/researcher.1.jsonl 4 KB
/home/spark-longxinyang/vec/runs/formal/20261003-004922-search-t2-embryo-interp-g24-D/nodes/16/researcher.stderr

审查员

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