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

总览 · ← 返回运行 20261003-171955-search-t2-embryo-interp-chain-12h

节点 n15

型内伪时间进度加权混抽(PLAN T2EI-01)已实现并对照:进度偏向有小幅 mmd_u 收益,但 variogram 与坐标重抽样噪声净亏,提交时机制关闭(与父节点13逐位一致)。

运行?一次完整的自动搜索或 Agent 会话,有自己的锁定配置和证据包。20261003-171955-search-t2-embryo-interp-chain-12h
父节点n13
子节点n17
操作?种子:人写的起点;改进:在父节点上改;草稿:从头写;修复:修父节点的报错。改进
状态已打分
分数搜索目标分 62.52(+0.0) · proxy 62.52(+0.0)
审查通过 1 越界读取:未发现问题——run.py 全部数据访问经 --data 与 src.task2_spatial.view_io(load_manifest/panel_genes/read_stage,run.py:540-551),无绝对路径、'..'、/mnt、/home、评分器路径或网络调用;导入的 src.task2_spatial 为任务框架库而非 src/common/evaluation。; 2 硬编码目标统计量:未发现问题——常量仅为算法超参(α=5、λ=6、β=0.2、ANISO_DAMP=1.25 等,run.py:62-140),类型集合、Δ、型均值、展幅、细胞数均现场…
用时?从运行开始到结束(或到现在)的挂钟时间。31 分
程序版本5f08c0c52ebe8fbba96a1f0410ddbde5654d9bc6 (programs.git)
导入自20261003-094242-search-t2-embryo-interp-g24-D-s2#15
备注re-scored at launch (origin 20261003-094242-search-t2-embryo-interp-g24-D-s2 node 15, score there 62.52)

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

来自 programs.git 5f08c0c52e:solution/METHOD.md

型内伪时间进度加权混抽(PLAN T2EI-01)已实现并对照:进度偏向有小幅 mmd_u 收益,但 variogram 与坐标重抽样噪声净亏,提交时机制关闭(与父节点13逐位一致)。

方法(family T2EI-01,PLAN:进度加权分层混抽)

在父节点 13 全部管线(mix 分层混抽、procrustes3d 对齐、α=5 收敛位移、λ=6 投影加权、β=0.2 配对收缩、各向异性坐标整形、jitter、RMS 回缩)之上,新增细胞选择机制,两种模式(环境变量切换):

  1. 进度分数:对每个共有类型(两侧各 ≥10 细胞),Δ = μ_b − μ_a(只留 |Δ| ≥ 0.25 的 DE 基因,复用收敛位移的 Δ)。a 侧细胞 s = clip((x−μ_a)·Δ/(Δ·Δ+ε), 0, 1)(ε=1.0),b 侧 s = clip((μ_b−x)·Δ/(Δ·Δ+ε), 0, 1)。a 侧目标 t、b 侧目标 1−t。
  2. redraw 模式(PLAN 原方案,T2_PROG_MODE=redraw):保持 mix_indices 的每类型名额不变,型内按 p ∝ exp(−κ(s−target)²) 加权无放回重抽(T2_PROG_KAPPA,扫了 0.5/1/2;κ=0 跳过)。
  3. swap 模式(结构修复尝试,T2_PROG_MODE=swap,T2_PROG_FRAC):完全保留父节点的分层抽样和 rng 流(jitter 逐位不变),每类型只把 |s−target| 最大的 frac·k 个已抽细胞换成未抽池中 |s−target| 最小的细胞(仅在严格更近时换)。frac=0 → 父节点逐位。
  4. 单输入阶段退路:无括号时 main() 提前 return 分层复制,机制不执行(与父节点相同)。
  5. 表达值在本机制中不做任何修改;每类型抽取数不变 → 类型组成不变(PLAN evidence 4 已验证:prog 开关下每类型计数一致)。

知识来源:仅使用视图内两个括号阶段自身的测量(型均值差 Δ、型内投影),无保留阶段/基因型信息,无外部文献数据。伪时间投影(细胞沿群体均值差方向的进度)是通用机制做法。

机制生效证据(seed 0,proxy E6.75+E8.0→E7.25,t=0.4)

  • 进度分数分布(10 个共有类型):连续右偏而非 0/1 双峰,a 侧均值 0.026–0.05、b 侧 0.058–0.19(Unknown),q90 达 0.08–0.52,~55% 细胞恰在 0(clip 下界);PLAN 风险 1 的停止条件(全双峰)未触发。
  • redraw κ=2:选中细胞进度均值 a 侧 0.0464(池 0.0436)、b 侧 0.1066(池 0.0812)——偏向确实把选中细胞推向目标方向(但幅度小:池分布整体远离 t=0.4/0.6,单细胞噪声 ≫ 时间信号)。
  • swap frac=0.15:实际交换 462/5000 细胞(frac=0.3 → 938),每类型计数与组成不变,rng 流不消费(jitter 逐位同父节点)。
  • 表达矩阵:机制只改选中的细胞索引,不改任何表达值;后续 α/λ/β 管线照常作用于新选细胞(因此下游指标随之变化)。

关闭对照(mechanism_off_control)

T2_PROG_ENABLE=0(提交默认)与 T2_PROG_KAPPA=0(redraw)/ T2_PROG_FRAC=0(swap):输出与父节点 13 在相同 seed 下逐位相同(X 与 spatial_3D array_equal 已验证)。开启后输出改变(X nnz 146836→147068),机制确实生效。

查分结果(同日 A 半锚点,seed 0;关闭 = 61.45)

配置榜分cell_stateshape_scalemmd_u rawvariogram rawocc raw
off(=父节点13,当日锚点)61.4548.9377.750.011640.014420.8066
redraw κ=0.560.9149.0376.580.011410.014590.7981
redraw κ=161.1049.5676.100.010930.014560.7906
redraw κ=260.6548.8075.410.011360.014940.7830
redraw κ=0.001(均匀重抽对照)60.6649.2175.860.011410.014370.7840
swap frac=0.1561.3648.7477.340.011500.014830.7991
swap frac=0.3060.7648.2276.170.011760.015150.7808

结论:

  1. 偏向本身有微弱真效应:κ=1 对比同为重抽的均匀对照,cell_state +0.35、mmd_u 0.01141→0.01093、shape +0.24——方向与 PLAN 预期一致,但幅度 ≪ 噪声(~1 分)。
  2. 重抽样代价占主导:任何全量重抽(连 κ=0.001 的均匀重抽)都比父节点的特定抽样掉 ~0.8 分,几乎全部来自坐标侧(occupancy 0.807→0.784、d2 0.0047→0.0057)——细胞身份换了,坐标云的抽样噪声就换了,与偏向无关。swap 模式保坐标后 shape 只掉 0.4,但偏向收益也随之消失(只换 9% 细胞,且换上的是进度尾部=分布极端细胞,variogram 反而变差 0.01442→0.01483)。
  3. variogram 对沿 Δ 偏向选择系统性变差(redraw κ2、swap 两档全部劣于 off):进度尾部细胞的基因偏差相关,破坏共变结构。型内进度异质性更像噪声/极端细胞而非可利用的时间梯度。

验证过 / 没验证

  • 验证:off 逐位复现父节点(seed 0);redraw/swap 两模式全网格如上(9 次查分);vec-check 通过(seed 0/1);运行 ~14s、内存 <1GB;κ=0/frac=0 退路。
  • 没验证:seed 1/2 的完整网格(off 结论基于 seed 0 同日锚点);真实括号(E7.25+E8.0→E7.5? 实际 final 视图)上的行为——但机制默认关闭,提交程序与父节点逐位相同,父节点在 final 的行为即本节点行为;PROG_MIN_CELLS / ε 未扫(机制净负,无必要)。

提交状态与下一步

提交默认 T2_PROG_ENABLE=0:程序行为与父节点 13 完全一致(预期分数 ≈ 父节点)。代码保留全部机制与开关,供后续节点复用。下一步最值得试:(a) cell_state 的改善不要走"换细胞"路线(坐标抽样噪声 ±0.8 淹没一切 <0.5 的表达侧收益),应在固定父节点抽样的前提下改表达值本身(如按进度连续的型内插值生成中间态细胞,同时接管其坐标=原细胞坐标,保 pairing);(b) 任何声称 <1 分的改善必须与"同抽样、同 rng 流"的对照比,不能与父节点的具体抽样比。

调研员的计划

名称进度加权分层混抽:利用型内伪时间异质性改善细胞状态分布
动机cell_state组50.31是最弱分组,其中variogram skill 0.389(得分4.87/12.5)是全部8项指标中最大失分项。父节点ANALYSIS明确指出'纯表达侧压缩已到上限,需组成层面改动'。当前混抽按(1-t,t)均匀随机抽取,忽略型内时间异质性:同一类型内不同细胞处于不同的a→b进度,均匀采样使输出包含过多'远离目标时间'的端点细胞,导致细胞状态分布和基因共变结构偏离目标。节点2→5→8→11的表达侧机制已将variogram从skill 0.228推到0.389,但节点8(λ加权)和11(β收缩)均未能进一步提升(±0.003),确认表达侧到顶。
做法在父节点13全部管线(mix分层混抽、procrustes3d对齐、α=5收敛位移、λ=6投影加权、β=0.2配对收缩、各向异性坐标整形)之上,修改混抽的细胞选择策略:

1. 进度分数计算(在mix_indices之后、位移之前):对每个共有类型(≥T2_PROG_MIN_CELLS=10细胞/侧),利用已有的DE基因子集(|Δ|≥0.25),计算每个细胞的伪时间进度:a侧 s_i = clip((x_i−μ_a)·Δ/(Δ·Δ+ε), 0, 1),b侧 s_i = clip((μ_b−x_i)·Δ/(Δ·Δ+ε), 0, 1)。进度衡量细胞在a→b表达方向上已走了多远。

2. 加权采样:a侧细胞被选中的权重 w_i = exp(−κ·(s_i−t)²),b侧 w_i = exp(−κ·(s_i−(1−t))²)。权重使进度接近目标时间分数t的细胞优先被选中。用numpy.random.choice的p参数实现加权无放回采样,保持每类型的总抽取数不变(即仍按(1−t,t)比例分配名额,只改变型内哪些细胞被选中)。

3. 后续管线完全不变:选中的细胞进入α/λ/β位移→坐标组装→各向异性整形→jitter→RMS回缩。

4. 参数:T2_PROG_KAPPA默认2.0,搜索{0.5,1.0,2.0,4.0,8.0};T2_PROG_ENABLE默认1;T2_PROG_MIN_CELLS默认10;进度分数计算的ε=1.0(与CONVERGE_EPS一致)。

5. 单输入阶段退路:无括号时无法计算Δ和进度分数,直接退化为均匀采样(与当前行为一致)。

6. vec-score快速筛选:先跑κ=0(off)确认与父节点逐位一致,再跑κ=2.0看方向,若mmd_u或variogram任一改善则扫κ={0.5,1.0,4.0},否则停止。预计查分≤5次。
风险1. 进度分数不准确:如果型内异质性不沿Δ方向(如存在亚型分化而非时间梯度),进度分数无意义,加权采样可能选错细胞。Engineer应检查进度分数的分布——若大量细胞集中在0或1(双峰而非连续),说明型内异质性不是时间梯度,应停止。2. κ过大导致多样性丧失:选中细胞过度集中,mmd_u反而变差。从κ=0.5开始扫,监控mmd_u是否恶化。3. 改善幅度在噪声内(<1分):进度加权可能只微调组成,效果有限。若κ=2.0时榜分变化<0.5且mmd_u/variogram无方向性改善,停止搜索。4. neighborhood_mmd下降:虽然不改变表达和坐标,但选择了不同的细胞,若新选细胞在原位置上的表达-位置配对较差,邻域项会降。监控neighborhood_mmd skill不低于0.58。

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

对比:父节点版本 a54054257d。改动的文件:solution/METHOD.md +35 −44、solution/run.py +195 −16

diff --git a/solution/METHOD.md b/solution/METHOD.mdindex 7f826e5..5fa153c 100644--- a/solution/METHOD.md+++ b/solution/METHOD.md@@ -1,59 +1,50 @@-在父节点11全部表达管线之上,新增坐标各向异性整形:沿对齐括号合并云的PCA主轴,把输出云每轴展幅向 log 插值目标(γ=damp×t,damp=1.25)缩放,再均匀回缩到原目标RMS,表达逐位不动。+型内伪时间进度加权混抽(PLAN T2EI-01)已实现并对照:进度偏向有小幅 mmd_u 收益,但 variogram 与坐标重抽样噪声净亏,提交时机制关闭(与父节点13逐位一致)。 -## 方法(family T2EI-06,PLAN:各向异性PCA坐标整形修复occupancy_dice)+## 方法(family T2EI-01,PLAN:进度加权分层混抽) -保留父节点 11 全部管线(mix 分层混抽、procrustes3d 对齐、scale_damp=0.5、α=5 类型级收敛位移、λ=6 投影加权、β=0.2 型内配对收缩),在坐标组装后、jitter 与最终 RMS 回缩之前新增:+在父节点 13 全部管线(mix 分层混抽、procrustes3d 对齐、α=5 收敛位移、λ=6 投影加权、β=0.2 配对收缩、各向异性坐标整形、jitter、RMS 回缩)之上,新增细胞选择机制,两种模式(环境变量切换): -1. 对齐后的两括号阶段坐标(`align_pair` 输出,同一帧、各自原生尺度)合并做 PCA,取 3 根主轴(协方差 `eigh`,按特征值降序)。-2. 计算 stage_a、stage_b 在每根主轴上的投影 std:spread_a[k]、spread_b[k]。-3. 目标展幅 target[k] = exp(log spread_a[k] + γ·(log spread_b[k] − log spread_a[k])),γ = T2_ANISO_DAMP × t(t 为插值时间分数,只用时间差,视图无关)。-4. 输出细胞坐标去中心后投影到主轴,每轴乘 factor[k] = clip(target[k]/cur[k], 0.3, 3.0)(cur 为输出云该轴投影 std),再逆旋转回原坐标系。-5. 整形后照旧走 `_jitter` + `scale_to_rms(target_rms)`:均匀回缩保证 scale_log_ratio 与 RMS 完全不变(已验证 raw 逐位不变)。-6. 环境变量:T2_ANISO_DAMP(默认 **1.25**,非 PLAN 初始 2.5——网格显示 2.5 处 d2_shape 崩塌快于 occupancy 收益,见下)、T2_ANISO_ENABLE(默认 1)、T2_ANISO_CLIP_LO/HI(0.3/3.0)。-7. 单输入阶段退路:`interp_bracket` 无 b 时提前 return 分层复制,整形不执行(与 PLAN 一致)。+1. **进度分数**:对每个共有类型(两侧各 ≥10 细胞),Δ = μ_b − μ_a(只留 |Δ| ≥ 0.25 的 DE 基因,复用收敛位移的 Δ)。a 侧细胞 s = clip((x−μ_a)·Δ/(Δ·Δ+ε), 0, 1)(ε=1.0),b 侧 s = clip((μ_b−x)·Δ/(Δ·Δ+ε), 0, 1)。a 侧目标 t、b 侧目标 1−t。+2. **redraw 模式**(PLAN 原方案,T2_PROG_MODE=redraw):保持 mix_indices 的每类型名额不变,型内按 p ∝ exp(−κ(s−target)²) 加权无放回重抽(T2_PROG_KAPPA,扫了 0.5/1/2;κ=0 跳过)。+3. **swap 模式**(结构修复尝试,T2_PROG_MODE=swap,T2_PROG_FRAC):完全保留父节点的分层抽样和 rng 流(jitter 逐位不变),每类型只把 |s−target| 最大的 frac·k 个已抽细胞换成未抽池中 |s−target| 最小的细胞(仅在严格更近时换)。frac=0 → 父节点逐位。+4. 单输入阶段退路:无括号时 main() 提前 return 分层复制,机制不执行(与父节点相同)。+5. 表达值在本机制中不做任何修改;每类型抽取数不变 → 类型组成不变(PLAN evidence 4 已验证:prog 开关下每类型计数一致)。 -## 机制生效证据(seed 0,proxy E6.75+E8.0→E7.25,t=0.4,γ=0.5)+知识来源:仅使用视图内两个括号阶段自身的测量(型均值差 Δ、型内投影),无保留阶段/基因型信息,无外部文献数据。伪时间投影(细胞沿群体均值差方向的进度)是通用机制做法。 -- 三主轴展幅(std):stage_a [60.8, 63.6, 85.5],stage_b [226.5, 202.1, 120.4],整形前输出云 [88.0, 83.4, 87.3](纵横比 [1.02, 0.97, 1.01],接近各向同性——混抽+等RMS缩放抹掉了括号形状差),目标 [117.3, 113.4, 101.5],整形后纵横比 [1.06, 1.02, 0.92],factor [1.33, 1.36, 1.16]。轴比确实改变(PLAN 风险 1 排除:输出轴比≈1 而括号轴比差异大,头寸存在)。-- occupancy_dice raw 0.7765→0.8066(seed0)、0.7806→0.7953(seed1),skill 0.369→0.421 / 0.375→0.400,预期方向上升。-- scale_log_ratio raw 0.0162 逐位不变(均匀回缩正确),out_rms 149.228 与关闭时相同。-- expression_change 与 cell_state 全部 4 项指标 raw/skill/points 逐位不变(de_score 0.2500、de_direction 0.3853、mmd_u 0.0116、variogram 0.0144),且 X 矩阵 array_equal=True——整形只动坐标。-- d2_shape raw 0.0063→0.0047(不降反升为 skill 0.954→0.979:目标展幅插值同时改善了归一化距离分布);neighborhood_mmd 0.0552→0.0551/0.0557→0.0553,噪声内不动,结构门不受影响(nbr skill 0.58 > 0.5)。+## 机制生效证据(seed 0,proxy E6.75+E8.0→E7.25,t=0.4) -## 关闭对照(mechanism_off_control)--T2_ANISO_ENABLE=0:整形代码不执行,输出与父节点 11 管线逐位相同(代码路径完全一致;同日 off 查分 seed0=60.79 / seed1=60.63,即父节点管线在当日锚点上的基线)。开启(γ=0.5)后 occupancy_dice/d2_shape 均改变,机制生效。+- 进度分数分布(10 个共有类型):连续右偏而非 0/1 双峰,a 侧均值 0.026–0.05、b 侧 0.058–0.19(Unknown),q90 达 0.08–0.52,~55% 细胞恰在 0(clip 下界);PLAN 风险 1 的停止条件(全双峰)未触发。+- redraw κ=2:选中细胞进度均值 a 侧 0.0464(池 0.0436)、b 侧 0.1066(池 0.0812)——偏向确实把选中细胞推向目标方向(但幅度小:池分布整体远离 t=0.4/0.6,单细胞噪声 ≫ 时间信号)。+- swap frac=0.15:实际交换 462/5000 细胞(frac=0.3 → 938),每类型计数与组成不变,rng 流不消费(jitter 逐位同父节点)。+- 表达矩阵:机制只改选中的细胞索引,不改任何表达值;后续 α/λ/β 管线照常作用于新选细胞(因此下游指标随之变化)。 -## 查分结果(同日 A 半锚点,seed0;base=off 60.79)--| T2_ANISO_DAMP | γ | 榜分 | occupancy skill | d2 skill | 备注 |-|---:|---:|---:|---:|---:|---|-| off | — | 60.79 | 0.369 | 0.954 | =父节点11管线 |-| 0.5 | 0.2 | 60.26 | 0.366 | 0.894 | d2 变差 |-| 1.0 | 0.4 | 61.09 | 0.387 | 0.971 | |-| 1.1 | 0.44 | 61.15 | 0.389 | 0.978 | |-| **1.25** | **0.5** | **61.45** | **0.421** | **0.979** | **提交(seed1: 61.07 vs base 60.63,+0.44)** |-| 1.4 | 0.56 | 61.14 | 0.395 | 0.966 | |-| 1.5 | 0.6 | 61.00 | 0.394 | 0.951 | |-| 1.75 | 0.7 | 61.03 | 0.452 | 0.895 | d2 开始崩 |-| 2.0 | 0.8 | 60.40 | 0.441 | 0.830 | |-| 2.5 | 1.0 | 59.75 | 0.495 | 0.704 | occupancy 最高但净亏 |-| 3.0/3.5 | 1.2/1.4 | 58.81/59.13 | 0.431/0.434 | 0.654/0.690 | clip 生效、过冲 |+## 关闭对照(mechanism_off_control) -如实结论:occupancy_dice 随 γ 升到 ~1.0 才饱和,但 d2_shape 从 γ≈0.6 起加速恶化(两项同权 8.33),净榜分峰值在 γ=0.5(damp=1.25),两 seed 一致 +0.4~+0.7,在 T2 约 1 分噪声边缘、方向一致且机制指标(occupancy↑、d2↑、nbr 平、scale/表达逐位不变)全部按 PLAN 预期。PLAN 初始 damp=2.5 在本管线上净亏 1 分,未采用(PLAN 授权网格内取优)。+T2_PROG_ENABLE=0(提交默认)与 T2_PROG_KAPPA=0(redraw)/ T2_PROG_FRAC=0(swap):输出与父节点 13 在相同 seed 下**逐位相同**(X 与 spatial_3D array_equal 已验证)。开启后输出改变(X nnz 146836→147068),机制确实生效。 -- 已验证:damp∈{0.5,1.0,1.1,1.25,1.4,1.5,1.75,2.0,2.5,3.0,3.5} 网格(seed0);提交配置 seed0+seed1 双查;off 对照 seed0+seed1;同 seed 两次运行逐位相同(无新增随机源,PCA 为确定性 eigh);默认参数输出与网格最优文件逐位一致;vec-check 通过;n=5000 在 [583, 5000] 内。-- 未验证:真实括号(E7.25+E8.0→目标,t=1/3 时 γ=0.417,比 proxy 的 0.5 更保守,方向相同);damp∈(1.25,1.4) 细扫(差异在噪声内);seed≥2。+## 查分结果(同日 A 半锚点,seed 0;关闭 = 61.45) -## 视图无关性+| 配置 | 榜分 | cell_state | shape_scale | mmd_u raw | variogram raw | occ raw |+|---|---:|---:|---:|---:|---:|---:|+| off(=父节点13,当日锚点) | **61.45** | 48.93 | 77.75 | 0.01164 | 0.01442 | 0.8066 |+| redraw κ=0.5 | 60.91 | 49.03 | 76.58 | 0.01141 | 0.01459 | 0.7981 |+| redraw κ=1 | 61.10 | **49.56** | 76.10 | **0.01093** | 0.01456 | 0.7906 |+| redraw κ=2 | 60.65 | 48.80 | 75.41 | 0.01136 | 0.01494 | 0.7830 |+| redraw κ=0.001(均匀重抽对照) | 60.66 | 49.21 | 75.86 | 0.01141 | 0.01437 | 0.7840 |+| swap frac=0.15 | 61.36 | 48.74 | 77.34 | 0.01150 | 0.01483 | 0.7991 |+| swap frac=0.30 | 60.76 | 48.22 | 76.17 | 0.01176 | 0.01515 | 0.7808 | -整形只依赖:对齐坐标(数据)、t(由 manifest 时间差计算,平移不变)、seed(不新增随机源)。无绝对时间、无路径/文件名/board 字段、无硬编码统计量。+结论:+1. **偏向本身有微弱真效应**:κ=1 对比同为重抽的均匀对照,cell_state +0.35、mmd_u 0.01141→0.01093、shape +0.24——方向与 PLAN 预期一致,但幅度 ≪ 噪声(~1 分)。+2. **重抽样代价占主导**:任何全量重抽(连 κ=0.001 的均匀重抽)都比父节点的特定抽样掉 ~0.8 分,几乎全部来自坐标侧(occupancy 0.807→0.784、d2 0.0047→0.0057)——细胞身份换了,坐标云的抽样噪声就换了,与偏向无关。swap 模式保坐标后 shape 只掉 0.4,但偏向收益也随之消失(只换 9% 细胞,且换上的是进度尾部=分布极端细胞,variogram 反而变差 0.01442→0.01483)。+3. **variogram 对沿 Δ 偏向选择系统性变差**(redraw κ2、swap 两档全部劣于 off):进度尾部细胞的基因偏差相关,破坏共变结构。型内进度异质性更像噪声/极端细胞而非可利用的时间梯度。 -## 知识来源+## 验证过 / 没验证 -未使用新的生物学知识。展幅、主轴、γ 插值全部由 view 内两个输入阶段坐标现场计算。+- 验证:off 逐位复现父节点(seed 0);redraw/swap 两模式全网格如上(9 次查分);vec-check 通过(seed 0/1);运行 ~14s、内存 <1GB;κ=0/frac=0 退路。+- 没验证:seed 1/2 的完整网格(off 结论基于 seed 0 同日锚点);真实括号(E7.25+E8.0→E7.5? 实际 final 视图)上的行为——但机制默认关闭,提交程序与父节点逐位相同,父节点在 final 的行为即本节点行为;PROG_MIN_CELLS / ε 未扫(机制净负,无必要)。 -## 下一步建议+## 提交状态与下一步 -- occupancy_dice skill 仍只有 0.42(真值天花板对应 raw≈0.9+):γ=0.5 的保守值受 d2_shape 牵制,可试「整形后对每细胞坐标加沿主轴的小幅噪声/重排」在不动展幅分布均值的前提下改善占据格点匹配,或按类型分别整形(不同类型的空间占据不同,整体 PCA 三轴可能不是占据形状的自由度)。-- 表达侧权衡已到上限(父节点教训):cell_state 组 variogram skill 0.37 仍是最大单项失分,需组成层面改动(类型比例插值生成中间态细胞)而非方差压缩。+提交默认 T2_PROG_ENABLE=0:程序行为与父节点 13 完全一致(预期分数 ≈ 父节点)。代码保留全部机制与开关,供后续节点复用。下一步最值得试:(a) cell_state 的改善不要走"换细胞"路线(坐标抽样噪声 ±0.8 淹没一切 <0.5 的表达侧收益),应在**固定父节点抽样**的前提下改表达值本身(如按进度连续的型内插值生成中间态细胞,同时接管其坐标=原细胞坐标,保 pairing);(b) 任何声称 <1 分的改善必须与"同抽样、同 rng 流"的对照比,不能与父节点的具体抽样比。diff --git a/solution/run.py b/solution/run.pyindex c1b126e..7301483 100644--- a/solution/run.py+++ b/solution/run.py@@ -99,6 +99,39 @@ PAIR_DE_ONLY = os.environ.get("T2_PAIR_DE_ONLY", "1") == "1" # target RMS (scale_log_ratio untouched, expression untouched). ANISO_ENABLE=0 # skips the step and reproduces the parent bit-for-bit. ANISO_ENABLE = os.environ.get("T2_ANISO_ENABLE", "1") == "1"+# Progress-weighted stratified reselection (family T2EI-01, this node): within+# each shared type, cells differ in how far they already sit along the temporal+# change direction Δ = μ_b − μ_a (DE genes only, |Δ| ≥ CONVERGE_MIN_DELTA).+# Progress of an a-side cell s = clip((x − μ_a)·Δ / (Δ·Δ + ε), 0, 1); for a+# b-side cell s = clip((μ_b − x)·Δ / (Δ·Δ + ε), 0, 1) (how far it has receded+# toward the earlier state). The stratified per-type draw counts are kept+# exactly as mix_indices produced them, but within each shared type the cells+# are redrawn without replacement with weights exp(−κ·(s − t)²) on the a side+# and exp(−κ·(s − (1−t))²) on the b side, favouring cells whose intrinsic+# progress already sits near the target time fraction. Expression values are+# untouched by this step; κ = 0 (or PROG_ENABLE = 0) reproduces the parent+# bit-for-bit (uniform draw, same rng consumption order).+# NOTE (submitted default): the mechanism measured net-negative on the proxy+# at every strength tried (redraw κ∈{0.5,1,2}: 60.65–61.10 vs off 61.45;+# swap frac∈{0.15,0.3}: 60.76/61.36; same-day A-half anchor, seed 0). The+# bias itself gave a small cell_state gain in redraw mode (mmd_u 0.01164 →+# 0.01093 at κ=1), but selecting progress-tail cells degraded variogram and+# the coordinate-side metrics, and uniform-redraw control (κ=0.001, 60.66)+# showed full resampling alone costs ~0.8 board points of coordinate sample+# noise. Submitted DISABLED (bit-identical to parent node 13); env switches+# kept for follow-up nodes. See METHOD.md.+PROG_ENABLE = os.environ.get("T2_PROG_ENABLE", "0") == "1"+PROG_KAPPA = float(os.environ.get("T2_PROG_KAPPA", "2.0"))+PROG_MIN_CELLS = int(os.environ.get("T2_PROG_MIN_CELLS", "10"))+# Deterministic swap mode (default): keep the parent's stratified draw (and its+# rng stream, so jitter/coordinates of non-swapped cells are bit-identical) and+# replace the PROG_FRAC worst-progress drawn cells of each shared type with the+# best-progress UNDRAWN pool cells, only where |s_new − target| < |s_old −+# target|. Full weighted redraw (mode=redraw) resamples every cell, and on the+# proxy its coordinate-side sample noise (−0.8 board) swamps the bias gain+# (+0.4 cell_state); the swap touches only ~frac of cells. FRAC=0 → parent.+PROG_MODE = os.environ.get("T2_PROG_MODE", "swap")+PROG_FRAC = float(os.environ.get("T2_PROG_FRAC", "0.15")) # damp=1.25 (γ=0.5 at t=0.4) is the proxy-grid optimum: occupancy_dice and # d2_shape both improve; γ≥0.6 keeps buying occupancy but d2_shape collapses # faster (weight-for-weight), net board score peaks at γ≈0.5.@@ -142,6 +175,126 @@ def aniso_reshape(coords, aligned_a, aligned_b, t: float, damp: float):     return out, info  +def compute_delta(stage_a, stage_b, min_cells: int):+    """Per-shared-type DE-thresholded temporal change vector Δ = μ_b − μ_a."""+    means_a = type_means(stage_a.X, stage_a.labels)+    means_b = type_means(stage_b.X, stage_b.labels)+    la = np.asarray(stage_a.labels).astype(str)+    lb = np.asarray(stage_b.labels).astype(str)+    cnt_a = {k: int((la == k).sum()) for k in means_a}+    cnt_b = {k: int((lb == k).sum()) for k in means_b}+    shared = sorted(k for k in set(means_a) & set(means_b)+                    if cnt_a[k] >= min_cells and cnt_b[k] >= min_cells)+    delta = {}+    for lab in shared:+        d = (means_b[lab] - means_a[lab]).astype(np.float32)+        if CONVERGE_MIN_DELTA > 0:+            d = np.where(np.abs(d) >= CONVERGE_MIN_DELTA, d, np.float32(0.0)).astype(np.float32)+        delta[lab] = d+    return means_a, means_b, shared, delta+++def progress_reselect(stage, idx, labels, means, delta, target_s, kappa, rng):+    """Redraw the per-type picks of `idx` with progress weights; counts unchanged.++    For each shared type with a nonzero Δ, the progress of pool cell x is+    s = clip((x − μ_own)·Δ / (Δ·Δ + ε), 0, 1) measured toward the other stage+    (the caller passes means/delta already oriented per side via `target_s`).+    Cells are redrawn without replacement with p ∝ exp(−κ·(s − target_s)²),+    keeping the exact number of cells the stratified draw allocated per type,+    so the type composition of the output is untouched.+    """+    labs_sel = np.asarray(labels).astype(str)[idx]+    new_idx = idx.copy()+    sel_all, pool_all = [], []+    n_types = 0+    for lab in sorted(delta):+        d = delta[lab]+        dd = float(np.dot(d.astype(np.float64), d.astype(np.float64)))+        if dd <= 0.0:+            continue+        m = labs_sel == lab+        k = int(m.sum())+        pool = np.flatnonzero(np.asarray(labels).astype(str) == lab)+        if k <= 0 or k >= pool.size:+            continue+        x = as_dense(stage.X, pool).astype(np.float64)+        mu = np.asarray(means[lab], dtype=np.float64)+        dm = d.astype(np.float64)+        s = np.clip((x - mu) @ dm / (dd + CONVERGE_EPS), 0.0, 1.0)+        w = np.exp(-kappa * (s - target_s) ** 2)+        p = w / w.sum()+        picks = rng.choice(pool.size, k, replace=False, p=p)+        new_idx[np.where(m)[0]] = pool[picks]+        sel_all.append(s[picks])+        pool_all.append(s)+        n_types += 1+    info = {"n_types": n_types}+    if sel_all:+        info["sel_mean"] = float(np.concatenate(sel_all).mean())+        info["pool_mean"] = float(np.concatenate(pool_all).mean())+    return new_idx, info+++def progress_swap(stage, idx, labels, means, delta, target_s, frac):+    """Deterministic worst→best progress swap; no rng consumed, counts unchanged.++    Keeps the parent's stratified draw for (1 − frac) of each shared type's+    cells and replaces the frac·k drawn cells whose progress s is FARTHEST from+    the target time fraction with the UNDRAWN pool cells whose s is CLOSEST to+    it, pairing swaps only while |s_new − target| < |s_old − target|. Type+    composition, per-type counts and the rng stream are untouched. frac = 0 is+    a no-op (parent bit-for-bit).+    """+    labs_all = np.asarray(labels).astype(str)+    labs_sel = labs_all[idx]+    new_idx = idx.copy()+    sel_s, n_swaps, n_types = [], 0, 0+    for lab in sorted(delta):+        d = delta[lab]+        dd = float(np.dot(d.astype(np.float64), d.astype(np.float64)))+        if dd <= 0.0:+            continue+        pos = np.where(labs_sel == lab)[0]+        k = int(pos.size)+        pool = np.flatnonzero(labs_all == lab)+        if k <= 0 or k >= pool.size:+            continue+        x = as_dense(stage.X, pool).astype(np.float64)+        mu = np.asarray(means[lab], dtype=np.float64)+        dm = d.astype(np.float64)+        s = np.clip((x - mu) @ dm / (dd + CONVERGE_EPS), 0.0, 1.0)+        # drawn[p] = pool position of the cell at output slot pos[p] (order-aligned)+        drawn = np.searchsorted(pool, idx[pos])+        mask = np.ones(pool.size, dtype=bool)+        mask[drawn] = False+        undrawn = np.flatnonzero(mask)+        if undrawn.size == 0:+            continue+        n_swap = int(np.floor(frac * k))+        if n_swap <= 0:+            n_types += 1+            sel_s.append(s[drawn])+            continue+        d_drawn = np.abs(s[drawn] - target_s)+        d_undr = np.abs(s[undrawn] - target_s)+        w_order = np.argsort(-d_drawn)[:n_swap]+        b_order = np.argsort(d_undr)[:n_swap]+        new_drawn = drawn.copy()+        for wi, bi in zip(w_order, b_order):+            if d_undr[bi] < d_drawn[wi]:+                sel_pos = pos[wi]+                new_idx[sel_pos] = pool[bi]+                new_drawn[wi] = bi+                n_swaps += 1+        sel_s.append(s[new_drawn])+        n_types += 1+    info = {"n_types": n_types, "n_swaps": n_swaps}+    if sel_s:+        info["sel_mean"] = float(np.concatenate(sel_s).mean())+    return new_idx, info++ def mix_converge(stage_a, stage_b, t: float, params: dict, alpha: float):     t = float(t)     damp = float(params.get("scale_damp", 1.0))@@ -158,6 +311,38 @@ def mix_converge(stage_a, stage_b, t: float, params: dict, alpha: float):                      float(params.get("count_damp", 1.0)))     ia, ib = mix_indices(stage_a.labels, stage_b.labels, t, n, rng) +    # Progress-weighted reselection (this node): keeps per-type counts, changes+    # only WHICH cells of each shared type are drawn. Skipped entirely when+    # disabled so the rng consumption order matches the parent bit-for-bit.+    means_a = means_b = None+    shared = []+    delta = {}+    prog_info = {"prog_mode": PROG_MODE if PROG_ENABLE else "off",+                 "prog_kappa": PROG_KAPPA if PROG_ENABLE else 0.0,+                 "prog_frac": PROG_FRAC if (PROG_ENABLE and PROG_MODE == "swap") else 0.0,+                 "prog_n_types_a": 0, "prog_n_types_b": 0, "prog_n_swaps": 0,+                 "prog_sel_mean_a": None, "prog_pool_mean_a": None,+                 "prog_sel_mean_b": None, "prog_pool_mean_b": None}+    prog_on = PROG_ENABLE and ((PROG_MODE == "swap" and PROG_FRAC > 0.0)+                               or (PROG_MODE != "swap" and PROG_KAPPA != 0.0))+    need_delta = (alpha != 0.0 or prog_on) and ia.size and ib.size+    if need_delta:+        means_a, means_b, shared, delta = compute_delta(stage_a, stage_b, 10)+    if prog_on and ia.size and ib.size and delta:+        # b-side progress toward a: (μ_b − x)·Δ = (x − μ_b)·(−Δ), so reuse the+        # same helper with negated Δ and target 1 − t.+        delta_neg = {k: (-v).astype(np.float32) for k, v in delta.items()}+        if PROG_MODE == "swap":+            ia, pa = progress_swap(stage_a, ia, stage_a.labels, means_a, delta, t, PROG_FRAC)+            ib, pb = progress_swap(stage_b, ib, stage_b.labels, means_b, delta_neg, 1.0 - t, PROG_FRAC)+            prog_info["prog_n_swaps"] = int(pa.get("n_swaps", 0) + pb.get("n_swaps", 0))+        else:+            ia, pa = progress_reselect(stage_a, ia, stage_a.labels, means_a, delta, t, PROG_KAPPA, rng)+            ib, pb = progress_reselect(stage_b, ib, stage_b.labels, means_b, delta_neg, 1.0 - t, PROG_KAPPA, rng)+        prog_info.update({"prog_n_types_a": pa["n_types"], "prog_n_types_b": pb["n_types"],+                          "prog_sel_mean_a": pa.get("sel_mean"), "prog_pool_mean_a": pa.get("pool_mean"),+                          "prog_sel_mean_b": pb.get("sel_mean"), "prog_pool_mean_b": pb.get("pool_mean")})+     xa = as_dense(stage_a.X, ia) if ia.size else np.zeros((0, len(stage_a.genes)), np.float32)     xb = as_dense(stage_b.X, ib) if ib.size else np.zeros((0, len(stage_b.genes)), np.float32) @@ -165,19 +350,8 @@ def mix_converge(stage_a, stage_b, t: float, params: dict, alpha: float):             "between_type_mean_dist_rel": None, "lambda": CONVERGE_LAMBDA,             "weight_mean": None, "weight_std": None}     if alpha != 0.0 and ia.size and ib.size:-        means_a = type_means(stage_a.X, stage_a.labels)-        means_b = type_means(stage_b.X, stage_b.labels)-        la = np.asarray(stage_a.labels).astype(str)-        lb = np.asarray(stage_b.labels).astype(str)-        cnt_a = {k: int((la == k).sum()) for k in means_a}-        cnt_b = {k: int((lb == k).sum()) for k in means_b}-        shared = sorted(k for k in set(means_a) & set(means_b) if cnt_a[k] >= 10 and cnt_b[k] >= 10)-        delta = {}-        for lab in shared:-            d = (means_b[lab] - means_a[lab]).astype(np.float32)-            if CONVERGE_MIN_DELTA > 0:-                d = np.where(np.abs(d) >= CONVERGE_MIN_DELTA, d, np.float32(0.0)).astype(np.float32)-            delta[lab] = d+        if not shared:+            means_a, means_b, shared, delta = compute_delta(stage_a, stage_b, 10)         if shared:             before = np.vstack([xa, xb]).astype(np.float64)             labs_a = np.asarray(stage_a.labels).astype(str)[ia]@@ -351,6 +525,7 @@ def mix_converge(stage_a, stage_b, t: float, params: dict, alpha: float):     info.update(         t=t, n=int(expr.shape[0]), rms_a=rms_a, rms_b=rms_b, target_rms=target_rms,         out_rms=rms_radius(coords), n_from_a=int(ia.size), n_from_b=int(ib.size), **conv, **pair_info,+        **prog_info,     )     return expr, coords.astype(np.float32), info @@ -381,9 +556,13 @@ def main() -> None:                                       "lambda", "weight_mean", "weight_std",                                        "pair_beta", "n_paired_types", "n_pairs", "pair_within_std_rel",                                        "pair_orth_var_rel", "pair_dist_over_diam",-                                       "aniso_enable", "aniso_damp", "aniso_gamma", "aniso_spread_a",-                                       "aniso_spread_b", "aniso_spread_cur", "aniso_spread_target",-                                       "aniso_factor", "aniso_aspect_in", "aniso_aspect_out")}+                                        "aniso_enable", "aniso_damp", "aniso_gamma", "aniso_spread_a",+                                        "aniso_spread_b", "aniso_spread_cur", "aniso_spread_target",+                                        "aniso_factor", "aniso_aspect_in", "aniso_aspect_out",+                                        "prog_kappa", "prog_mode", "prog_frac", "prog_n_swaps",+                                        "prog_n_types_a", "prog_n_types_b",+                                        "prog_sel_mean_a", "prog_pool_mean_a",+                                        "prog_sel_mean_b", "prog_pool_mean_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
k026Canonicalise predicted 3D coordinates before submissionnotes/pitfalls/04_scorer_invariance.md
k024World-model evaluation dimensions for state-transition predictorsnotes/competition/07_biomedical_world_models.md

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

改了什么在父节点13管线上实现了型内伪时间进度加权的细胞重选(redraw κ加权重抽 + swap 保rng流定换两种模式),proxy网格9次查分全部不优于off对照(60.65–61.36 vs 61.45),故提交默认T2_PROG_ENABLE=0,输出与父节点13逐位相同,榜分62.52完全不变。
各组分数的变化cell_state:不变(50.31,+0.00):提交关闭机制;开发期redraw κ=1的mmd_u 0.01164→0.01093(cell_state +0.35)在噪声内,且variogram系统性变差(0.01442→0.01456~0.01515)
expression_change:不变(62.11,+0.00):提交与父节点逐位一致,de_score 0.3103、de_direction 0.3986原样
local_spatial:不变(60.34,+0.00):提交关闭机制,neighborhood_mmd 0.05112原样
shape_scale:不变(77.31,+0.00):提交关闭机制;开发期全量重抽使occupancy_dice 0.807→0.784、d2_shape变差,坐标抽样噪声净亏~0.8分
family_idT2EI-01
假设是否成立否
经验
  1. 在mix混抽管线上,任何改变'哪些细胞被选中'的操作(连κ=0.001的均匀重抽)都会重掷坐标云的抽样噪声,实测净亏~0.8榜分(occupancy 0.807→0.784),淹没一切<0.5的表达侧收益——改组成必须固定父节点抽样和rng流。
  2. 型内沿Δ的进度分数在本数据上更像噪声而非时间梯度:~55%细胞进度恰在clip下界0,选中细胞进度均值仅从0.044推到0.046;按进度偏向选择使variogram在所有强度下一致变差(进度尾部细胞的基因偏差相关,破坏共变结构)。
  3. 评估<1分(T2噪声级)的机制改动时,对照必须是'同抽样、同rng流'的off版本(本节点的swap模式做法正确),与父节点的具体抽样比会把坐标重抽样噪声误算进机制效应。
  4. 机制net-negative时默认关闭提交(与父节点逐位一致)是正确止损:保住62.52不亏,代码和开关保留供后续复用。
mechanism_active否
下一步建议
  1. 针对cell_state:放弃'换细胞'路线,在固定父节点抽样(细胞身份、坐标、rng流全不动)的前提下直接改表达值,例如按每个细胞的进度分数s做连续的型内插值生成中间态表达(x' = x + f(s,t)·Δ型内修正),坐标沿用原细胞以保neighborhood配对。
  2. 针对variogram(skill 0.389,最大单项失分):表达侧的λ投影加权和β配对收缩已到顶(节点8/11证实±0.003),且进度偏向选择系统性劣化它;可试在固定抽样下对型内残差做保共变的重排(如按对侧阶段细胞的协方差结构做小幅 whitening-recolor),而非选细胞。
  3. 针对shape_scale的occupancy_dice(skill 0.424):在不动细胞身份的前提下微调坐标(父节点13各向异性整形γ=0.5已是最优,可试按类型分别整形或在主轴方向小幅重排坐标),注意任何坐标改动的收益需>1分噪声才可信。

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

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

分析员

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

工程师

角色工程师 alibaba-token-plan-cn/qwen3.8-max
调用次数1 次
轮数36
工具调用共 40 次:—
用时23 分
token 数输入 87,938 · 输出 16,401 · 思考 20,366
任务(第一行)按计划修改程序:进度加权分层混抽:利用型内伪时间异质性改善细胞状态分布
最后的回答(摘录)
完成。

**做了什么**:按 PLAN 实现型内伪时间进度加权混抽(T2EI-01),两种模式:redraw(κ 加权重抽,κ∈{0.5,1,2})和 swap(保留父节点抽样与 rng 流、只换最差 frac 细胞,frac∈{0.15,0.3}),off 对照与父节点 13 逐位相同。

**查分结果**(9 次,同日 A 半锚点,off=61.45):所有开启配置均 ≤ off(redraw 60.65–61.10,swap 60.76–61.36)。κ=0.001 均匀重抽对照(60.66)证明损失主要来自坐标重抽样噪声(~0.8 分),偏向本身只有 +0.35 cell_state 的微弱真效应;variogram 对进度偏向系统性变差。提交默认关闭(与父节点逐位一致,vec-check 通过),METHOD.md 记录完整负结果。

**下一步最值得试**:cell_state 改善必须走"固定父节点抽样、只改表达值"的路线(换细胞的坐标抽样噪声 ±0.8 淹没一切 <0.5 的收益);任何 <1 分的声称改善要与同抽样同 rng 流的对照比,而非父节点的具体抽样。
原始记录位置/home/spark-longxinyang/vec/runs/formal/20261003-171955-search-t2-embryo-interp-chain-12h/nodes/15/engineer.jsonl (文件不在)

调研员

角色调研员 alibaba-token-plan-cn/qwen3.8-max
调用次数1 次
轮数1
工具调用共 0 次:—
用时7 分
token 数输入 16,837 · 输出 10,564 · 思考 8,192
任务(第一行)为节点 n15(改进,父节点 n13)写改进计划 PLAN.json
最后的回答(摘录)
一步提升(±0.003),确认表达侧到顶。",
  "approach": "在父节点13全部管线(mix分层混抽、procrustes3d对齐、α=5收敛位移、λ=6投影加权、β=0.2配对收缩、各向异性坐标整形)之上,修改混抽的细胞选择策略:\n\n1. 进度分数计算(在mix_indices之后、位移之前):对每个共有类型(≥T2_PROG_MIN_CELLS=10细胞/侧),利用已有的DE基因子集(|Δ|≥0.25),计算每个细胞的伪时间进度:a侧 s_i = clip((x_i−μ_a)·Δ/(Δ·Δ+ε), 0, 1),b侧 s_i = clip((μ_b−x_i)·Δ/(Δ·Δ+ε), 0, 1)。进度衡量细胞在a→b表达方向上已走了多远。\n\n2. 加权采样:a侧细胞被选中的权重 w_i = exp(−κ·(s_i−t)²),b侧 w_i = exp(−κ·(s_i−(1−t))²)。权重使进度接近目标时间分数t的细胞优先被选中。用numpy.random.choice的p参数实现加权无放回采样,保持每类型的总抽取数不变(即仍按(1−t,t)比例分配名额,只改变型内哪些细胞被选中)。\n\n3. 后续管线完全不变:选中的细胞进入α/λ/β位移→坐标组装→各向异性整形→jitter→RMS回缩。\n\n4. 参数:T2_PROG_KAPPA默认2.0,搜索{0.5,1.0,2.0,4.0,8.0};T2_PROG_ENABLE默认1;T2_PROG_MIN_CELLS默认10;进度分数计算的ε=1.0(与CONVERGE_EPS一致)。\n\n5. 单输入阶段退路:无括号时无法计算Δ和进度分数,直接退化为均匀采样(与当前行为一致)。\n\n6. vec-score快速筛选:先跑κ=0(off)确认与父节点逐位一致,再跑κ=2.0看方向,若mmd_u或variogram任一改善则扫κ={0.5,1.0,4.0},否则停止。预计查分≤5次。",
  "expected_groups": ["cell_state"],
  "risks": "1. 进度分数不准确:如果型内异质性不沿Δ方向(如存在亚型分化而非时间梯度),进度分数无意义,加权采样可能选错细胞。Engineer应检查进度分数的分布——若大量细胞集中在0或1(双峰而非连续),说明型内异质性不是时间梯度,应停止。2. κ过大导致多样性丧失:选中细胞过度集中,mmd_u反而变差。从κ=0.5开始扫,监控mmd_u是否恶化。3. 改善幅度在噪声内(<1分):进度加权可能只微调组成,效果有限。若κ=2.0时榜分变化<0.5且mmd_u/variogram无方向性改善,停止搜索。4. neighborhood_mmd下降:虽然不改变表达和坐标,但选择了不同的细胞,若新选细胞在原位置上的表达-位置配对较差,邻域项会降。监控neighborhood_mmd skill不低于0.58。",
  "family_id": "T2EI-01",
  "mechanism": "利用型内表达异质性估计每个细胞在a→b伪时间轴上的进度,按进度与目标时间的接近度做加权采样,使输出细胞组成更接近目标阶段的真实状态分布,而非均匀随机混合两个端点。",
  "vs_constant_shift": "常数位移对同一类型所有细胞施加相同的表达偏移向量,不区分细胞个体差异,也不改变哪些细胞被选中。本机制不修改任何细胞的表达值,只改变采样概率——它利用型内已有的表达异质性(哪些细胞已经更接近目标状态)来指导细胞选择,是组成层面的结构性改动而非表达值的平移。",
  "mechanism_evidence": "Engineer应验证:(1) 进度分数分布:在典型类型上,a侧进度应主要在[0,0.5]、b侧在[0.5,1],有连续分布而非全部为0/1;(2) 选中细胞的进度集中度:κ=2时,a侧选中细胞的进度均值应比均匀采样时更接近t(例如从0.25→0.35),b侧更接近1−t;(3) mmd_u和variogram的raw值变化方向(预期下降);(4) 表达矩阵在进度加权后、位移前的类型组成是否改变(应不变,只改了具体选中了哪些细胞)。",
  "mechanism_off_control": "T2_PROG_ENABLE=0或T2_PROG_KAPPA=0:所有细胞权重相等,加权采样退化为均匀随机采样,与父节点13在相同seed下逐位相同(使用numpy随机数生成器,κ=0时p参数全等,等价于无放回均匀采样)。预期差别:关闭后mmd_u和variogram回到父节点水平(raw 0.01123/0.01392),开启后这两项应下降(改善)。",
  "sources": []
}
```
原始记录位置/home/spark-longxinyang/vec/runs/formal/20261003-171955-search-t2-embryo-interp-chain-12h/nodes/15/researcher.jsonl (文件不在)

审查员

角色审查员 alibaba-token-plan-cn/qwen3.8-max
调用次数1 次
轮数7
工具调用共 10 次:—
用时2 分
token 数输入 30,024 · 输出 1,469 · 思考 3,852
任务(第一行)审查节点 n15 的程序是否越界读取、写死目标、钻评分器漏洞
最后的回答(摘录)
REVIEW.json written
原始记录位置/home/spark-longxinyang/vec/runs/formal/20261003-171955-search-t2-embryo-interp-chain-12h/nodes/15/reviewer.jsonl (文件不在)