总览 · ← 返回运行 20261003-043412-search-t2-heart-interp-g24-D-s1
节点 n28
实现 PLAN 的类型内表达方差时间插值(每个同名共有类型逐基因把源侧细胞的型内残差按 std_t=(1−λw)std_src+λw·std_other 缩放,clip [0.5,2],min_mean>2 过滤)并做 ON/OFF 对照;代理上 λ=1.0/0.5 均未达 PLAN 保留判据(expr>67.5 且 board≥68.0),按步骤 6 提交关闭态,输出与父节点 21/19 逐位一
| 运行?一次完整的自动搜索或 Agent 会话,有自己的锁定配置和证据包。 | 20261003-043412-search-t2-heart-interp-g24-D-s1 |
|---|---|
| 父节点 | n21 |
| 子节点 | — |
| 操作?种子:人写的起点;改进:在父节点上改;草稿:从头写;修复:修父节点的报错。 | 改进 |
| 状态 | 已打分 |
| 分数 | 搜索目标分 68.38(+0.0) · proxy 68.38(+0.0) · 3 次复测均分 66.96 |
| 审查 | 通过 1 越界读取:未发现问题——solution 三个 .py 无任何 open()/网络/绝对路径/'..' 访问,数据只经框架 src.task2_spatial.view_io(load_manifest/read_stage,run.py:297-307)从 --data 视图读取;README.md:5 提到的 data/processed 路径仅为文档说明,代码不读取。; 2 硬编码目标统计量:未发现问题——所有型均值/型内 std/配额均在运行时从视图输入计算(run.py:133-157 type_pseudobulk_stds/means,cluster_sample.py:1… |
| 用时?从运行开始到结束(或到现在)的挂钟时间。 | 12 分 |
| 程序版本 | 6f727dbe2332771692f4ad0ea2e656e4869262e4 (programs.git) |
方法说明?节点程序自带的 METHOD.md:这个程序做了什么、为什么。
来自 programs.git 6f727dbe23:solution/METHOD.md
实现 PLAN 的类型内表达方差时间插值(每个同名共有类型逐基因把源侧细胞的型内残差按 std_t=(1−λw)std_src+λw·std_other 缩放,clip [0.5,2],min_mean>2 过滤)并做 ON/OFF 对照;代理上 λ=1.0/0.5 均未达 PLAN 保留判据(expr>67.5 且 board≥68.0),按步骤 6 提交关闭态,输出与父节点 21/19 逐位一致。
提交配置(family T2HI-01 improve,机制=型内方差时间插值,状态:已实现、对照后关闭)
提交 = 父节点 21(=19)全部路径逐位不动:matched-align Procrustes 对齐(r≥0.3 贪心、保 z)、K=0.62 压实尺度、固定簇抽样(k=25、每型 n_clusters=10、random 播种、jitter 0.02)、类型级表达均值时间插值(同名共有类型、min_mean=2、γ=2)。默认环境变量下(T2_VAR_INTERP 缺省=0)实测输出与本节点关闭态预测 X(data/indices/indptr) 与 spatial_3D 全部 np.array_equal,并通过 vec-check(status ok)。单输入阶段退路(b is None)同父,不经过该机制。
机制实现(PLAN approach 步骤 1–5)
run.py::apply_type_mean_shift内、均值平移之后逐类型对执行:对每个同名共有类型对 (c,c) 与满足 max(mean_a,mean_b)>2 的基因,用稀疏安全的 E[x²]−E[x]²(含 n/(n−1) 修正)从视图现场计算 std_a[g,c]、std_b[g,c](type_pseudobulk_stds,无任何硬编码统计量);std_t = std_src + λ·w·(std_b−std_a),a 侧 w=t、b 侧 w=−(1−t);比值 clip 到 [T2_VAR_CLIP_LO=0.5, T2_VAR_CLIP_HI=2.0],std 分母下限 1e−2。- 缩放作用于残差:block −= 该侧选中细胞的(平移后)经验型均值,×ratio,+= 均值——经验均值逐位保留,不与 γ=2 均值平移叠加/重复移动均值(PLAN 风险 3 的处理)。
- 环境变量:T2_VAR_INTERP(提交默认 0=关)、T2_VAR_LAM、T2_VAR_CLIP_LO/HI。
- 机制生效证据(stderr 诊断,λ=1.0 开启时):5 个同名共有类型、313 个 kept 基因参与;std_b/std_a 比值中位数 1.061、q10–q90=[0.85,1.31]、73.8% 落在 [0.8,1.2]、2.2% 被 clip——两阶段型内方差确有系统差异(中位数≠1),机制有靶点;开启后输出 nnz 结构改变(1095143→1095367),差异呈逐细胞、逐基因异质(按偏离幅度缩放),非常数位移。
机制关闭对照(PLAN mechanism_off_control)
T2_VAR_INTERP=0(提交默认)时完全跳过 std 计算与缩放,代码路径与父节点 21 相同;关闭态与默认态输出逐位一致(np.array_equal 验证),A 半四组分数与父相同(board 67.79,expr 66.13 / cell_state 67.10 / local 66.92 / shape 71.01)。
代理查分结果(T2:heart:val_interp A 半,seed 0,共 5 次)
| 配置 | board | expr | cell_state | local | shape |
|---|---|---|---|---|---|
| OFF(=提交,=父) | 67.79 | 66.13 | 67.10 | 66.92 | 71.01 |
| λ=1.0, clip[0.5,2] | 67.72 | 65.90 | 67.05 | 66.93 | 71.01 |
| λ=0.5, clip[0.5,2] | 67.84 | 66.34 | 67.07 | 66.92 | 71.01 |
结论:PLAN 假设(型内方差未插值导致 expression_change 弱)在代理上不成立——λ=1.0 反而微伤 expr(65.90),λ=0.5 仅 +0.21(远小于 ~2 分噪声),cell_state/local/shape 全部噪声内不动。未达 PLAN 保留判据(expression_change>67.5 且 board≥68.0),风险 2(伤 cell_state)轻微应验、风险 1 部分应验(74% 基因比值在 [0.8,1.2],效应弱)。按步骤 6 回退关闭态提交,零分损失。未再扫 CLIP/λ 网格:λ 从 1.0→0.5 的变化方向单调趋向父值,外推 λ→0 即 OFF,更大网格无信息。
验证过 / 没验证
- 验证过:默认态=关闭态逐位一致、vec-check ok、A 半 3 个配置查分、机制诊断(比值分布、nnz 变化)。
- 没验证:clip 边界 {0.3}/{3.0} 与 λ=0.75(方向已单调,按预算放弃);代理只有 5 个同名共有类型,final 括号有 31 个,方差插值在 final 上靶点更多,但代理无提升即无证据支持开启。
- 知识来源:无外部生物知识;全部统计量(型均值、型内 std、比值分布)由视图输入阶段现场计算。
教训与下一步
- 表达侧的「均值平移(γ=2,节点 19 有效)之后再做二阶矩(方差)插值」在代理上是中性的:打分器 expression_change 对型内分布宽度的敏感度低于对型均值的敏感度。表达侧至此已试遍 kNN 平滑(23)、信噪比收缩(24)、自适应 γ(25)、跨类型匹配位移(26)、方差插值(28),全部不超节点 19;表达维度饱和。
- 下一步最值得试:local_spatial(67.32)的坐标侧改动而非表达侧——节点 21 证明簇粒度双向饱和,可试簇的空间覆盖均衡(体素配额抽样)或在保持大簇连续性的前提下对簇间做 Delaunay/边界感知的配额分配;以及 shape_scale(71.58)对 CONTRACT_K 的细扫(0.58–0.66)。
调研员的计划
| 名称 | 类型内表达方差时间插值(variance interpolation)改善 expression_change |
|---|---|
| 动机 | expression_change 是最弱分组(66.67),当前管线(节点 19/21)只做类型级均值平移(γ=2),型内方差结构完全保留为源阶段的值。若目标阶段的型内方差与源不同(分化过程中基因表达离散度变化),预测的表达式分布宽度就不匹配。节点 23(kNN 平滑)、24(基因收缩)、25(自适应 γ)均已证伪表达侧的其他改法,但型内方差/离散度的时间插值从未尝试。local_spatial 67.32 也可能因表达分布更准确而间接获益(neighborhood_mmd 含表达距离)。 |
| 做法 | 步骤:1) 在 apply_type_mean_shift 之后(或同一函数内),对每个同名共有类型 c 和满足 min_mean>2 的基因 g,计算源侧 std_a[g,c]、对侧 std_b[g,c](运行时从视图计算)。2) 目标方差 std_t[g,c]=(1-t)std_a+tstd_b。3) 对 a 侧细胞:x_new[i,g]=mean_target[g,c]+(x[i,g]-mean_a_shifted[g,c])*(std_t/std_a);b 侧类似用 std_b 作分母。4) 比值 clip 到 [CLIP_LO, CLIP_HI](初始 0.5–2.0),防止小样本噪声。5) 环境变量 T2_VAR_INTERP=0 时跳过,输出逐位等于父。6) 用 vec-score A 半先跑 λ=1.0(完全插值)和 λ=0.5(半阻尼)各 1 次;若 expression_change>67.5 且 board≥68.0 则保留最优配置提交,否则回退关闭态。参数搜索范围:CLIP_LO∈{0.3,0.5}, CLIP_HI∈{2.0,3.0}, λ∈{0.5,0.75,1.0},最多 6 次查分。单输入阶段退路:b is None 时无 std_b,跳过方差插值(与均值平移同逻辑)。 |
| 风险 | 1) 型内方差估计噪声大(小类型细胞少),比值极端→用 clip 和 min_mean 过滤,Engineer 打印比值分布直方图(>50% 基因比值在 [0.8,1.2] 说明机制效应弱)。2) 方差插值改变表达后可能伤 cell_state(若打分器侧重分布形状)→第 1 次查分即看 cell_state 是否 <67.0,若是则 λ 减半重试一次后仍差即回退。3) 与已有均值平移叠加后过校正→实现时方差插值在均值平移之后执行,作用于残差(x-mean_target),不重复移动均值。 |
代码改动?这个节点的程序和父节点程序的逐行差别:绿色是新增,红色是删除。
对比:父节点版本 8463a4e50c。改动的文件:solution/METHOD.md +19 −22、solution/run.py +74 −3
diff --git a/solution/METHOD.md b/solution/METHOD.mdindex 0a455a5..3826f8b 100644--- a/solution/METHOD.md+++ b/solution/METHOD.md@@ -1,40 +1,37 @@-实现 PLAN 的逐类型自适应簇粒度(n_clusters_c=clip(n_cells_c/TCS,3,25)、k_c 同步自适应)并做 ON/OFF 对照;代理上 4 档 TCS 全部低于父配置(local_spatial 66.92→64.7–66.3),按 PLAN 步骤 5 提交关闭态,输出与父节点 19 逐位一致。+实现 PLAN 的类型内表达方差时间插值(每个同名共有类型逐基因把源侧细胞的型内残差按 std_t=(1−λw)std_src+λw·std_other 缩放,clip [0.5,2],min_mean>2 过滤)并做 ON/OFF 对照;代理上 λ=1.0/0.5 均未达 PLAN 保留判据(expr>67.5 且 board≥68.0),按步骤 6 提交关闭态,输出与父节点 21/19 逐位一致。 -## 提交配置(family T2HI-04,机制=自适应簇粒度,状态:已实现、对照后关闭)+## 提交配置(family T2HI-01 improve,机制=型内方差时间插值,状态:已实现、对照后关闭) -提交 = 父节点 19 全部路径逐位不动:matched-align Procrustes 对齐(r≥0.3 贪心、保 z)、K=0.62 压实尺度、固定簇抽样(k=25、每型 n_clusters=10、random 播种、jitter 0.02)、类型级表达均值时间插值(同名共有类型、min_mean=2、γ=2)。单输入阶段退路(b is None)同父,不经过簇抽样。+提交 = 父节点 21(=19)全部路径逐位不动:matched-align Procrustes 对齐(r≥0.3 贪心、保 z)、K=0.62 压实尺度、固定簇抽样(k=25、每型 n_clusters=10、random 播种、jitter 0.02)、类型级表达均值时间插值(同名共有类型、min_mean=2、γ=2)。默认环境变量下(T2_VAR_INTERP 缺省=0)实测输出与本节点关闭态预测 X(data/indices/indptr) 与 spatial_3D 全部 np.array_equal,并通过 vec-check(status ok)。单输入阶段退路(b is None)同父,不经过该机制。 -## 机制实现(PLAN approach 步骤 1–3、6)+## 机制实现(PLAN approach 步骤 1–5) -- `cluster_sample.py::cluster_take` 新增 `adaptive` 参数:每类型 n_clusters_c = clip(round(n_cells_c / TARGET_CLUSTER_SIZE), MIN_CLUSTERS=3, MAX_CLUSTERS=25),n_cells_c 为该类型在源阶段的实测细胞数(现场计算,非硬编码);k_c = clip(round(TCS/5), 10, 40)(T2_ADAPTIVE_K=0 可固定 k=25)。-- `run.py` 环境变量:T2_ADAPTIVE_CLUSTERS(提交默认 0=关)、T2_TARGET_CLUSTER_SIZE、T2_MIN_CLUSTERS、T2_MAX_CLUSTERS、T2_ADAPTIVE_K。新增逻辑全在 `if adaptive is not None` 块内。-- 机制生效证据(TCS=120 开启时 stderr 打印逐类型诊断):大类型簇确实变小(EXE-Endoderm 8063 细胞 quota1452:父 10 簇×~145 → 自适应 25 簇×59),小类型不再过碎(Forebrain 631:父 10 簇×~12 → 自适应 5 簇×23),k=24。即机制按设计改变了抽样粒度。+- `run.py::apply_type_mean_shift` 内、均值平移之后逐类型对执行:对每个同名共有类型对 (c,c) 与满足 max(mean_a,mean_b)>2 的基因,用稀疏安全的 E[x²]−E[x]²(含 n/(n−1) 修正)从视图现场计算 std_a[g,c]、std_b[g,c](`type_pseudobulk_stds`,无任何硬编码统计量);std_t = std_src + λ·w·(std_b−std_a),a 侧 w=t、b 侧 w=−(1−t);比值 clip 到 [T2_VAR_CLIP_LO=0.5, T2_VAR_CLIP_HI=2.0],std 分母下限 1e−2。+- 缩放作用于残差:block −= 该侧选中细胞的(平移后)经验型均值,×ratio,+= 均值——经验均值逐位保留,不与 γ=2 均值平移叠加/重复移动均值(PLAN 风险 3 的处理)。+- 环境变量:T2_VAR_INTERP(提交默认 0=关)、T2_VAR_LAM、T2_VAR_CLIP_LO/HI。+- 机制生效证据(stderr 诊断,λ=1.0 开启时):5 个同名共有类型、313 个 kept 基因参与;std_b/std_a 比值中位数 1.061、q10–q90=[0.85,1.31]、73.8% 落在 [0.8,1.2]、2.2% 被 clip——两阶段型内方差确有系统差异(中位数≠1),机制有靶点;开启后输出 nnz 结构改变(1095143→1095367),差异呈逐细胞、逐基因异质(按偏离幅度缩放),非常数位移。 ## 机制关闭对照(PLAN mechanism_off_control) -T2_ADAPTIVE_CLUSTERS=0 时 n_clusters 固定 10、k 固定 25,代码路径与父节点 19 完全相同;实测输出与父配置 h5ad 逐位一致(X data/indices/indptr 与 spatial_3D 全部 np.array_equal),即四组分数与父相同(A 半 seed 0:board 67.79,expr 66.13 / cell_state 67.10 / local 66.92 / shape 71.01)。+T2_VAR_INTERP=0(提交默认)时完全跳过 std 计算与缩放,代码路径与父节点 21 相同;关闭态与默认态输出逐位一致(np.array_equal 验证),A 半四组分数与父相同(board 67.79,expr 66.13 / cell_state 67.10 / local 66.92 / shape 71.01)。 ## 代理查分结果(T2:heart:val_interp A 半,seed 0,共 5 次) | 配置 | board | expr | cell_state | local | shape | |---|---:|---:|---:|---:|---:|-| 父配置(OFF,=提交) | **67.79** | 66.13 | 67.10 | **66.92** | 71.01 |-| 自适应 TCS=120, k=24 | 67.05 | 65.58 | 66.97 | 64.71 | 70.94 |-| 自适应 TCS=200, k=40 | 66.80 | 65.36 | 66.26 | 66.32 | 69.26 |-| 自适应 TCS=300, k=40 | 66.39 | 65.15 | 66.48 | 66.18 | 67.75 |-| 自适应 TCS=200, k=25 | 66.82 | 65.36 | 66.24 | 66.29 | 69.41 |+| OFF(=提交,=父) | **67.79** | 66.13 | 67.10 | 66.92 | 71.01 |+| λ=1.0, clip[0.5,2] | 67.72 | 65.90 | 67.05 | 66.93 | 71.01 |+| λ=0.5, clip[0.5,2] | 67.84 | 66.34 | 67.07 | 66.92 | 71.01 | -结论:PLAN 假设(固定 10 簇使大类型簇过大、邻域被平均化)被证伪——把大类型的大块连续簇打碎(25 簇)对 neighborhood_mmd 的伤害(0.0476→0.0490–0.0525)远大于小类型去碎片化的收益;k 固定与否不改变方向。local_spatial 在所有档位都 ≤ 66.32 < 67.32+1,触发 PLAN 步骤 5 的回退判据(步骤 4 的筛选条件 local_spatial>67.5 亦未满足),且风险 1(收益已饱和)应验。shape_scale 随 TCS 增大而单调下降(大簇提供的空间覆盖更连续),说明父的固定粒度同时是 shape 的最优附近。+结论:PLAN 假设(型内方差未插值导致 expression_change 弱)在代理上不成立——λ=1.0 反而微伤 expr(65.90),λ=0.5 仅 +0.21(远小于 ~2 分噪声),cell_state/local/shape 全部噪声内不动。未达 PLAN 保留判据(expression_change>67.5 且 board≥68.0),风险 2(伤 cell_state)轻微应验、风险 1 部分应验(74% 基因比值在 [0.8,1.2],效应弱)。按步骤 6 回退关闭态提交,零分损失。未再扫 CLIP/λ 网格:λ 从 1.0→0.5 的变化方向单调趋向父值,外推 λ→0 即 OFF,更大网格无信息。 ## 验证过 / 没验证 -- 验证过:提交配置在 proxy 视图 seed 0 复跑确定且与父逐位一致;vec-check 通过;耗时 ~4s、内存 <0.5GB(远低于 limits 28GB/30min);机制 ON 的诊断输出证明自适应逻辑本身按 PLAN 工作。-- 没验证:TCS<120(更小簇)——TCS=120 已使 local_spatial 掉 2.2,方向单调向下,无必要;final 视图(E8.25+E8.75→E8.5)不可用于本 run 查分,但提交配置与父逐位相同,父在 final 的行为即本节点行为。+- 验证过:默认态=关闭态逐位一致、vec-check ok、A 半 3 个配置查分、机制诊断(比值分布、nnz 变化)。+- 没验证:clip 边界 {0.3}/{3.0} 与 λ=0.75(方向已单调,按预算放弃);代理只有 5 个同名共有类型,final 括号有 31 个,方差插值在 final 上靶点更多,但代理无提升即无证据支持开启。+- 知识来源:无外部生物知识;全部统计量(型均值、型内 std、比值分布)由视图输入阶段现场计算。 -## 知识来源与合规+## 教训与下一步 -无新增外部知识;全部统计量(类型细胞数、簇参数、均值)运行时从 view 现场计算。TCS 网格用 vec-score A 半标定(允许通道),提交取回退态故不引入新超参。视图无关:不读 board/路径/绝对时间,时间平移不变。--## 下一步建议--- local_spatial 的簇粒度维度已双向探明饱和(父固定 10 簇是局部最优;更细碎有害)。剩余空间更可能在 neighborhood 的表达侧(如型内 kNN 局部平滑 vs 全局均值平移)或 shape 与 local 的联合(簇的空间覆盖均衡化)。+- 表达侧的「均值平移(γ=2,节点 19 有效)之后再做二阶矩(方差)插值」在代理上是中性的:打分器 expression_change 对型内分布宽度的敏感度低于对型均值的敏感度。表达侧至此已试遍 kNN 平滑(23)、信噪比收缩(24)、自适应 γ(25)、跨类型匹配位移(26)、方差插值(28),全部不超节点 19;表达维度饱和。+- 下一步最值得试:local_spatial(67.32)的坐标侧改动而非表达侧——节点 21 证明簇粒度双向饱和,可试簇的空间覆盖均衡(体素配额抽样)或在保持大簇连续性的前提下对簇间做 Delaunay/边界感知的配额分配;以及 shape_scale(71.58)对 CONTRACT_K 的细扫(0.58–0.66)。diff --git a/solution/run.py b/solution/run.pyindex 3d2e4c2..fa7b8fc 100644--- a/solution/run.py+++ b/solution/run.py@@ -107,6 +107,44 @@ EXPR_GAMMA = float(os.environ.get("T2_EXPR_GAMMA", "2.0")) # gene-relative pattern is biological signal worth interpolating). EXPR_CENTER = os.environ.get("T2_EXPR_CENTER", "0") == "1" +# --- node 28: within-type expression variance interpolation (PLAN T2HI-01) ---+# After the type-level mean shift, each shared type's within-type dispersion is+# still the source stage's. If dispersion changes over development, the+# predicted distribution width is mismatched. For every shared type pair and+# every gene passing the min_mean filter, compute source stds std_a[g,c],+# std_b[g,c] from the view, interpolate std_t = std_a + lam*w*(std_b-std_a)+# (w = t on the a side, -(1-t) on the b side), and rescale each selected cell's+# residual around its side's shifted empirical type mean by ratio = std_t/std,+# clipped to [CLIP_LO, CLIP_HI]. The empirical mean is preserved exactly (the+# shift is not re-applied); only within-type spread changes, per cell+# proportionally to its deviation -- not a constant shift. T2_VAR_INTERP=0+# skips the step entirely (bit-identical to parent node 21/19).+# Proxy A-half (seed 0): OFF 67.79 (expr 66.13); lam=1.0 67.72 (expr 65.90);+# lam=0.5 67.84 (expr 66.34) -- no config meets the PLAN keep criterion+# (expression_change > 67.5 and board >= 68.0); all deltas are within noise,+# so per PLAN step 6 the mechanism ships OFF. T2_VAR_INTERP=1 re-enables it.+VAR_INTERP = os.environ.get("T2_VAR_INTERP", "0") != "0"+VAR_LAM = float(os.environ.get("T2_VAR_LAM", "1.0"))+VAR_CLIP_LO = float(os.environ.get("T2_VAR_CLIP_LO", "0.5"))+VAR_CLIP_HI = float(os.environ.get("T2_VAR_CLIP_HI", "2.0"))+VAR_STD_EPS = 1e-2+++def type_pseudobulk_stds(X, labels):+ """Dict type -> dense per-gene std over that type's cells (sparse-safe)."""+ out = {}+ for c in np.unique(labels):+ mask = labels == c+ n_c = int(mask.sum())+ if n_c < 2:+ continue+ Xc = X[mask]+ m1 = np.asarray(Xc.mean(axis=0), dtype=np.float64).ravel()+ m2 = np.asarray(Xc.power(2).mean(axis=0), dtype=np.float64).ravel()+ var = np.maximum(m2 - m1 * m1, 0.0) * (n_c / (n_c - 1.0))+ out[c] = np.sqrt(var)+ return out+ def type_pseudobulk_means(X, labels): """Dict type -> dense per-gene mean over that type's cells."""@@ -130,9 +168,12 @@ def apply_type_mean_shift(expr, labels_a_sel, labels_b_sel, stage_a, stage_b, t, mean_b = type_pseudobulk_means(stage_b.X, stage_b.labels) if pairs is None: pairs = [(c, c) for c in mean_a if c in mean_b]+ std_a = type_pseudobulk_stds(stage_a.X, stage_a.labels) if VAR_INTERP else {}+ std_b = type_pseudobulk_stds(stage_b.X, stage_b.labels) if VAR_INTERP else {} na = int(labels_a_sel.shape[0]) part_a, part_b = expr[:na], expr[na:] n_shared = 0+ ratio_log = [] for ca_, cb_ in pairs: ma = mean_a.get(ca_) mb = mean_b.get(cb_)@@ -142,16 +183,46 @@ def apply_type_mean_shift(expr, labels_a_sel, labels_b_sel, stage_a, stage_b, t, if EXPR_CENTER: delta = delta - delta.mean() delta = EXPR_GAMMA * delta- if EXPR_MIN_MEAN > 0.0:- keep = np.maximum(ma, mb) > EXPR_MIN_MEAN- delta = np.where(keep, delta, 0.0)+ keep = np.maximum(ma, mb) > EXPR_MIN_MEAN if EXPR_MIN_MEAN > 0.0 else np.ones_like(ma, dtype=bool)+ delta = np.where(keep, delta, 0.0) sel_a = labels_a_sel == ca_ if sel_a.any(): part_a[sel_a] += (t * delta).astype(np.float32) sel_b = labels_b_sel == cb_ if sel_b.any(): part_b[sel_b] += (-(1.0 - t) * delta).astype(np.float32)+ if VAR_INTERP:+ sa_ = std_a.get(ca_)+ sb_ = std_b.get(cb_)+ if sa_ is not None and sb_ is not None:+ d = sb_ - sa_+ for part, sel, s_src, w in ((part_a, sel_a, sa_, VAR_LAM * t),+ (part_b, sel_b, sb_, -VAR_LAM * (1.0 - t))):+ if not sel.any():+ continue+ ratio = (s_src + w * d) / np.maximum(s_src, VAR_STD_EPS)+ ratio = np.clip(ratio, VAR_CLIP_LO, VAR_CLIP_HI)+ ratio = np.where(keep, ratio, 1.0).astype(np.float32)+ block = part[sel]+ m_sel = block.mean(axis=0, keepdims=True)+ block -= m_sel+ block *= ratio+ block += m_sel+ part[sel] = block+ if sel is sel_a:+ ratio_log.append(ratio[keep]) n_shared += 1+ if VAR_INTERP and ratio_log:+ rr = np.concatenate(ratio_log)+ print(json.dumps({+ "var_interp": {"lam": VAR_LAM, "clip": [VAR_CLIP_LO, VAR_CLIP_HI],+ "n_types": len(ratio_log), "n_genes_kept": int(rr.size),+ "ratio_median": float(np.median(rr)),+ "ratio_q10": float(np.quantile(rr, 0.10)),+ "ratio_q90": float(np.quantile(rr, 0.90)),+ "frac_in_0.8_1.2": float(np.mean((rr > 0.8) & (rr < 1.2))),+ "frac_clipped": float(np.mean((rr <= VAR_CLIP_LO) | (rr >= VAR_CLIP_HI)))},+ }, default=float), file=sys.stderr) np.clip(expr, 0.0, None, out=expr) return n_shared
调研来源?调研员查到并用到的知识条目和文献检索结果(只列标题和编号)。
用到的知识库条目
| 编号 | 标题 | 出处 |
|---|---|---|
| k007 | Interval staging and held-out-window filtering of external data | notes/official/来件/virtualembryo.ai/rules.md |
| k025 | Spateo: rigid + non-rigid alignment and morphometric vector fields | 10.1016/j.cell.2024.10.011 |
| k003 | Fused Gromov-Wasserstein mapping for spatial snapshots | 10.1038/s41586-024-08453-2 |
分析结果?分析员写的 ANALYSIS.json:改了什么、各组分数怎么变、假设是否成立、经验和下一步建议。
| 改了什么 | 在父节点 21 的类型级均值平移后实现了类型内表达方差时间插值(逐同名共有类型、逐基因残差按 std_t=std_src+λw(std_b-std_a) 缩放,clip[0.5,2],min_mean>2,环境变量 T2_VAR_INTERP 开关);代理查分未达保留判据,提交为关闭态,输出与父逐位一致。 |
|---|---|
| 各组分数的变化 | cell_state:噪声内(+0.00,67.95=父);开启态代理 67.05–67.07 vs OFF 67.10,均不动 expression_change:噪声内(+0.00,66.67=父)——提交为关闭态;机制开启时代理 A 半 expr:λ=1.0 → 65.90(微降),λ=0.5 → 66.34(+0.21,远小于 ~1 分噪声) local_spatial:噪声内(+0.00,67.32=父);开启态代理 66.92–66.93 与 OFF 相同 shape_scale:噪声内(+0.00,71.58=父);开启态代理 71.01 与 OFF 完全相同 |
| family_id | T2HI-01 |
| 假设是否成立 | 否 |
| 经验 |
|
| mechanism_active | 否 |
| 下一步建议 |
|
对话摘要?每个角色和大模型对话的统计:轮数、工具调用、用时、token 数和最后的回答摘录;原始记录只给路径。
只给统计和最后回答的摘录;完整对话请到原始记录位置里列出的文件看。
分析员
| 角色?调研员写计划、工程师改代码、分析员解读分数、审查员检查作弊。 | 分析员 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数?大模型一共回复了几轮(每轮可以调用多个工具)。 | 2 |
| 工具调用?大模型调用读文件、执行命令等工具的次数,按工具名统计。 | 共 1 次:write 1 |
| 用时 | 不到 1 分 |
| token 数?输入 / 输出(含思考)的 token 数,来自接口返回的用量。 | 输入 9,813 · 输出 973 · 思考 827 |
| 任务(第一行) | 分析节点 n28 的打分结果,写 ANALYSIS.json |
| 最后的回答(摘录) | ANALYSIS.json written |
| 原始记录位置?完整对话记录在 Spark 上的文件路径;看板不复制原始内容。 | /home/spark-longxinyang/vec/runs/formal/20261003-043412-search-t2-heart-interp-g24-D-s1/nodes/28/analyst.jsonl 5 KB /home/spark-longxinyang/vec/runs/formal/20261003-043412-search-t2-heart-interp-g24-D-s1/nodes/28/analyst.stderr |
工程师
| 角色 | 工程师 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数 | 16 |
| 工具调用 | 共 17 次:bash 12、edit 3、read 1、write 1 |
| 用时 | 6 分 |
| token 数 | 输入 43,629 · 输出 6,784 · 思考 4,949 |
| 任务(第一行) | 按计划修改程序:类型内表达方差时间插值(variance interpolation)改善 expression_change |
| 最后的回答(摘录) | Done. Final state verified: default run = OFF state, bit-identical X/coords, `vec-check` ok. **Summary** - 做了什么:按 PLAN 在父节点 21 的均值平移后实现类型内表达方差时间插值(逐类型逐基因 std_t=(1−t)std_a+t·std_b,残差缩放、clip [0.5,2]、min_mean>2,T2_VAR_INTERP 开关),带诊断输出。 - 机制有靶点但无效:比值中位数 1.061、73.8% 在 [0.8,1.2];A 半查分 λ=1.0 → 67.72(expr 65.90↓),λ=0.5 → 67.84(expr 66.34,+0.21 噪声内),均未达 PLAN 保留判据(expr>67.5 且 board≥68.0),按步骤 6 提交关闭态(=父,逐位一致,board 67.79 A 半 / 68.38 正式)。查分 5/20。 - 下一步最值得试:表达侧二阶矩已证伪(23/24/25/26/28 全饱和);转坐标侧 local_spatial——簇空间覆盖均衡(体素配额),及 CONTRACT_K∈[0.58,0.66] 细扫 shape_scale。 |
| 原始记录位置 | /home/spark-longxinyang/vec/runs/formal/20261003-043412-search-t2-heart-interp-g24-D-s1/nodes/28/engineer.jsonl 107 KB /home/spark-longxinyang/vec/runs/formal/20261003-043412-search-t2-heart-interp-g24-D-s1/nodes/28/engineer.stderr |
调研员
| 角色 | 调研员 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 2 次 |
| 轮数 | 2 |
| 工具调用 | 共 0 次:— |
| 用时 | 5 分 |
| token 数 | 输入 14,402 · 输出 2,148 · 思考 10,571 |
| 任务(第一行) | 为节点 n28(改进,父节点 n21)写改进计划 PLAN.json |
| 最后的回答(摘录) | {"name":"类型内表达方差时间插值(variance interpolation)改善 expression_change","motivation":"expression_change 是最弱分组(66.67),当前管线(节点 19/21)只做类型级均值平移(γ=2),型内方差结构完全保留为源阶段的值。若目标阶段的型内方差与源不同(分化过程中基因表达离散度变化),预测的表达式分布宽度就不匹配。节点 23(kNN 平滑)、24(基因收缩)、25(自适应 γ)均已证伪表达侧的其他改法,但型内方差/离散度的时间插值从未尝试。local_spatial 67.32 也可能因表达分布更准确而间接获益(neighborhood_mmd 含表达距离)。","approach":"步骤:1) 在 apply_type_mean_shift 之后(或同一函数内),对每个同名共有类型 c 和满足 min_mean>2 的基因 g,计算源侧 std_a[g,c]、对侧 std_b[g,c](运行时从视图计算)。2) 目标方差 std_t[g,c]=(1-t)*std_a+t*std_b。3) 对 a 侧细胞:x_new[i,g]=mean_target[g,c]+(x[i,g]-mean_a_shifted[g,c])*(std_t/std_a);b 侧类似用 std_b 作分母。4) 比值 clip 到 [CLIP_LO, CLIP_HI](初始 0.5–2.0),防止小样本噪声。5) 环境变量 T2_VAR_INTERP=0 时跳过,输出逐位等于父。6) 用 vec-score A 半先跑 λ=1.0(完全插值)和 λ=0.5(半阻尼)各 1 次;若 expression_change>67.5 且 board≥68.0 则保留最优配置提交,否则回退关闭态。参数搜索范围:CLIP_LO∈{0.3,0.5}, CLIP_HI∈{2.0,3.0}, λ∈{0.5,0.75,1.0},最多 6 次查分。单输入阶段退路:b is None 时无 std_b,跳过方差插值(与均值平移同逻辑)。","expected_groups":["expression_change","local_spatial"],"risks":"1) 型内方差估计噪声大(小类型细胞少),比值极端→用 clip 和 min_mean 过滤,Engineer 打印比值分布直方图(>50% 基因比值在 [0.8,1.2] 说明机制效应弱)。2) 方差插值改变表达后可能伤 cell_state(若打分器侧重分布形状)→第 1 次查分即看 cell_state 是否 <67.0,若是则 λ 减半重试一次后仍差即回退。3) 与已有均值平移叠加后过校正→实现时方差插值在均值平移之后执行,作用于残差(x-mean_target),不重复移动均值。","family_id":"T2HI-01","mechanism":"对每个共有类型的每个基因,把源侧细胞偏离型均值的幅度按时间比例插值到目标侧的型内标准差,使预测的型内表达离散度匹配时间插值轨迹。","vs_constant_shift":"常数均值平移对所有细胞加同一向量,不改变型内离散度;本机制按每个细胞偏离均值的比例缩放,高偏离细胞变化大、低偏离细胞变化小,改变的是型内分布的宽度/形状而非位置。","mechanism_evidence":"Engineer 打印:(1) 各类型各基因的 std_b/std_a 比值分布(若中位数显著≠1 说明两阶段方差确实不同,机制有靶点);(2) 开启后输出矩阵与关闭态的逐基因差异统计(应呈型内异质性,非常数);(3) expression_change 和 cell_state 分组分的独立变化。","mechanism_off_control":"T2_VAR_INTERP=0 时完全跳过方差缩放步骤,代码路径与父节点 21 相同,输出逐位一致(np.array_equal 验证),四组分数不变。","sources":[]} |
| 原始记录位置 | /home/spark-longxinyang/vec/runs/formal/20261003-043412-search-t2-heart-interp-g24-D-s1/nodes/28/researcher.jsonl 5 KB /home/spark-longxinyang/vec/runs/formal/20261003-043412-search-t2-heart-interp-g24-D-s1/nodes/28/researcher.1.jsonl 4 KB /home/spark-longxinyang/vec/runs/formal/20261003-043412-search-t2-heart-interp-g24-D-s1/nodes/28/researcher.stderr |
审查员
| 角色 | 审查员 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数 | 10 |
| 工具调用 | 共 16 次:read 9、bash 5、glob 1、write 1 |
| 用时 | 3 分 |
| token 数 | 输入 36,068 · 输出 1,892 · 思考 6,328 |
| 任务(第一行) | 审查节点 n28 的程序是否越界读取、写死目标、钻评分器漏洞 |
| 最后的回答(摘录) | REVIEW.json written |
| 原始记录位置 | /home/spark-longxinyang/vec/runs/formal/20261003-043412-search-t2-heart-interp-g24-D-s1/nodes/28/reviewer.jsonl 150 KB /home/spark-longxinyang/vec/runs/formal/20261003-043412-search-t2-heart-interp-g24-D-s1/nodes/28/reviewer.stderr |