总览 · ← 返回运行 20261003-172000-search-t2-heart-extrap-chain-12h
节点 n4
按基因型间方差占比 w_g=B_g/(B_g+W_g) 收缩按型伪批量位移(damped_shift 家族 T2HX-01),α=0.05,坐标/组成/细胞数照抄末输入。
| 运行?一次完整的自动搜索或 Agent 会话,有自己的锁定配置和证据包。 | 20261003-172000-search-t2-heart-extrap-chain-12h |
|---|---|
| 父节点 | n2 |
| 子节点 | n5 |
| 操作?种子:人写的起点;改进:在父节点上改;草稿:从头写;修复:修父节点的报错。 | 改进 |
| 状态 | 已打分 |
| 分数 | 搜索目标分 49.89(+0.4) · proxy_noscale 49.89(+0.4) · 3 次复测均分 49.90 |
| 审查 | 未审查 |
| 用时?从运行开始到结束(或到现在)的挂钟时间。 | 17 分 |
| 程序版本 | f75a404e0f6e83e3b685b552607600f9efd367f3 (programs.git) |
| 导入自 | 20261003-105537-search-t2-heart-extrap-g24-D#4 |
| 备注 | re-scored at launch (origin 20261003-105537-search-t2-heart-extrap-g24-D node 4, score there 49.89) |
方法说明?节点程序自带的 METHOD.md:这个程序做了什么、为什么。
来自 programs.git f75a404e0f:solution/METHOD.md
按基因型间方差占比 w_g=B_g/(B_g+W_g) 收缩按型伪批量位移(damped_shift 家族 T2HX-01),α=0.05,坐标/组成/细胞数照抄末输入。
方法
父节点(damped_shift α=0.1,49.51)基础上,对每个类型 t 的位移向量 delta_t = mean(last|t) − mean(prev|t) 逐基因乘权重 w_g:
- w_g = B_g / (B_g + W_g + 1e-8),B_g = 末输入阶段按细胞数加权的型间方差,W_g = 池内(型内)方差;只在末输入阶段数据上现场计算,无任何硬编码统计量。
- 末阶段细胞数 < 10 的类型回退 w=1(本视图无此类,两输入各 33 型、最小 18 细胞;final 上由程序现场判断)。
- shift = α·w_g·delta_t,clip ≥ 0;α=0.05。
- 坐标 = 末阶段自己的坐标(β=0,仅按 rms_last 归一,n=末阶段细胞数时等同原样);组成不动(α_comp=0);n = 末阶段细胞数夹到 [min,max](本视图 24826 ≤ 25179,全量输出,无抽样 → 输出对 seed 不变,仅文件元数据含 seed)。
- 单输入退路:copy_last(与父节点相同)。
- 机制开关:环境变量
T2HX_VARW=0强制 w≡1(退化为父节点的均匀按型位移);T2HX_WMODE=cons是试验过的另一权重(未采用);T2HX_ALPHA覆盖 α。提交默认:VARW 开、WMODE=bt、α=0.05。
机制证据(proxy_noscale,A 半,seed 0)
| 配置 | 榜分 | cell_state | expression_change | local_spatial | variogram skill | de_score skill |
|---|---|---|---|---|---|---|
| 父 α=0.1 均匀 | 49.51 | 48.41 | 49.35 | 50.27 | 0.468 | 0.489 |
| w 开 α=0.15 | 49.59 | 49.20 | 49.12 | 50.05 | 0.484 | 0.479 |
| w 关 α=0.15(对照) | 49.39 | 48.06 | 49.16 | 50.35 | 0.460 | 0.486 |
| w 开 α=0.05(提交) | 49.89 | 49.55 | 50.00 | 50.02 | 0.491 | 0.500* |
- 开/关对照(同 α=0.15):加权使 variogram 0.460→0.484、cell_state 48.06→49.20,差异集中在 cell_state 组,符合 PLAN 预期机制方向;证明权重实际生效(w_mean=0.121,p10=0.004,p90=0.374;加权后位移 L2 为均匀的 23.4%,低于 PLAN 风险 1 的 30% 阈值——即权重同时把有效幅度压小,α=0.15 加权的收益部分来自更小的有效位移)。
- α=0 对照:代码路径输出 = 末阶段原样(alpha32=0 时
clip(block+0·dw)=block),即 copy_last。 - 所有 33 个共有类型的全部 24826 个细胞都收到位移(本视图两阶段类型完全同名);被压缩最多的是低 B/T(型内异质性主导)基因。
- \*α=0.05 时 DE 两项 skill 恰为 0.500:位移已小到触发无变化保护(std(dp) < 1%·std(dt) → DE 记 0,与地板同),即提交配置在 DE 组上等同 copy_last,只在 variogram(0.491,略低于地板 0.5)上有可测差异。
结论(如实报告,PLAN 风险 3 成立)
- 在 proxy_noscale 上,任何 α>0 都 ≤ copy_last(50.00):α 越大越差(0.05→49.89,0.1→49.51,0.15→49.59/关 49.39,与方法卡"skill 随 α 单调下降"一致)。方差加权确实按设计减轻了损伤(同 α 下 on > off),但没有把外推变成正收益。
- 另试的型间符号一致性权重(w_g=|Σc_t δ_tg|/Σc_t|δ_tg|,α=0.15/0.5):49.52 / 49.49,de_score 反降至 0.476,未采用。
- 提交 α=0.05 而非 α=0:本尺子上 −0.11(噪声内),但保留机制——若 final(E9.5→E10.5,步长比 4/3)的上一步方向正确,微小加权位移有正收益空间;若方向错误,损伤被限制在 ~0.1 分且 DE 触发无变化保护。这一点无法在代理上验证(方法卡:代理上一步是缩小,真实是长大;外推榜本地分历史上高估官网分)。
- 终选护栏(>copy_last+1)本节点达不到,预期终选回退基线。
验证过 / 未验证
- 验证过:proxy 视图格式(vec-check ok)、seed 0/1/2 内容与分数一致(输出对 seed 不变)、机制开关对照、α∈{0.05,0.15,0.5}×两种权重、运行 ~6 s / <1 GB。
- 未验证:真实括号(final)上的方向与幅度;伪装视图重跑(代码无路径/绝对时间依赖,所有统计现场从 manifest 输入计算,预期通过);
w_g在 final 末两阶段类型交集很小时的稳定性(回退 w=1 逻辑未在实际小交集数据上跑过)。
知识来源
无外部生物学知识、无文献/数据库数值。全部统计量(类型均值、方差、权重、RMS、细胞数)从视图 manifest 指向的两个输入阶段现场计算。
调研员的计划
| 名称 | 基因方差加权收缩的按型伪批量位移(修复 variogram 下降) |
|---|---|
| 动机 | 父节点 2(damped_shift α=0.1)得分 49.51,低于 copy_last 基线(节点 1,50.00)。最弱组 cell_state=48.41,其中 variogram skill 仅 0.468(地板 0.5),是唯一显著低于地板的指标。原因:父节点对全部 500 个基因施加相同的按型均值位移,高型内方差基因的型内协方差结构被平移打乱,导致跨细胞对距离分布(variogram 度量的 E|xi−xj|^0.5)失真。de_score skill 0.489 也略低于地板,说明位移方向对部分基因不正确。 |
| 做法 | 在父节点 run.py 的 damped_shift 调用之前,增加一步基因权重计算: 1. 对 last 阶段,按细胞类型分组,计算每个基因 g 的型间方差 B_g 和总方差 T_g(型间+型内),权重 w_g = B_g / (T_g + eps),eps=1e-8。仅在 last 阶段数据上计算,不引入外部统计量。 2. 将父节点的按型位移向量 delta_t(每个类型一个 500 维向量)逐基因乘以 w_g,即 shift_{t,g} = α · w_g · delta_{t,g}。α 初始 0.15(略高于父节点 0.1,因为权重会缩小有效位移),搜索范围 [0.05, 0.3],步长 0.05。 3. 夹到 ≥0 的逻辑不变;坐标、组成、time_scale 均与父节点相同(β=0, α_comp=0, time_scale=False)。 4. 单输入阶段退路:若 prev 为 None,直接 copy_last,与父节点一致。 5. 用 vec-score 在 proxy_noscale 上查分;先跑 α=0(应等于 copy_last,验证权重不引入 bug)和 α=0.15,比较 variogram skill 是否回到 ≥0.50。若 α=0.15 的 variogram 改善但 de_score 下降,降到 α=0.10。最多查 6 次分。 6. 实现改动量:约 20 行 numpy 代码(方差计算 + 权重乘法),30 分钟内可完成。 |
| 风险 | 1) 权重可能过度抑制有效位移,使输出趋近 copy_last(α 有效值太小);Engineer 应检查加权后位移的 L2 范数是否仍为父节点的 30%以上。2) 型间方差估计在小类型上噪声大;若某类型细胞数 <10,该类型回退到不加权(w=1)。3) 外推方向本身可能错误(METHOD.md 已警告),此时任何 α>0 都不如 α=0;若所有 α>0 的查分均 ≤ copy_last,应如实报告失败。4) 分数噪声约 1 分,差距 <1 分不算改善,需至少两次查分确认。 |
代码改动?这个节点的程序和父节点程序的逐行差别:绿色是新增,红色是删除。
对比:父节点版本 0a69ad9676。改动的文件:solution/EXECUTION.json +1 −0、solution/METHOD.md +42 −0、solution/README.md +2 −5、solution/run.py +122 −19
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..f6c941e--- /dev/null+++ b/solution/METHOD.md@@ -0,0 +1,42 @@+按基因型间方差占比 w_g=B_g/(B_g+W_g) 收缩按型伪批量位移(damped_shift 家族 T2HX-01),α=0.05,坐标/组成/细胞数照抄末输入。++## 方法++父节点(damped_shift α=0.1,49.51)基础上,对每个类型 t 的位移向量 delta_t = mean(last|t) − mean(prev|t) 逐基因乘权重 w_g:++- w_g = B_g / (B_g + W_g + 1e-8),B_g = 末输入阶段按细胞数加权的型间方差,W_g = 池内(型内)方差;**只在末输入阶段数据上现场计算**,无任何硬编码统计量。+- 末阶段细胞数 < 10 的类型回退 w=1(本视图无此类,两输入各 33 型、最小 18 细胞;final 上由程序现场判断)。+- shift = α·w_g·delta_t,clip ≥ 0;α=0.05。+- 坐标 = 末阶段自己的坐标(β=0,仅按 rms_last 归一,n=末阶段细胞数时等同原样);组成不动(α_comp=0);n = 末阶段细胞数夹到 [min,max](本视图 24826 ≤ 25179,全量输出,无抽样 → 输出对 seed 不变,仅文件元数据含 seed)。+- 单输入退路:copy_last(与父节点相同)。+- 机制开关:环境变量 `T2HX_VARW=0` 强制 w≡1(退化为父节点的均匀按型位移);`T2HX_WMODE=cons` 是试验过的另一权重(未采用);`T2HX_ALPHA` 覆盖 α。提交默认:VARW 开、WMODE=bt、α=0.05。++## 机制证据(proxy_noscale,A 半,seed 0)++| 配置 | 榜分 | cell_state | expression_change | local_spatial | variogram skill | de_score skill |+|---|---:|---:|---:|---:|---:|---:|+| 父 α=0.1 均匀 | 49.51 | 48.41 | 49.35 | 50.27 | 0.468 | 0.489 |+| w 开 α=0.15 | 49.59 | 49.20 | 49.12 | 50.05 | 0.484 | 0.479 |+| **w 关 α=0.15(对照)** | **49.39** | **48.06** | **49.16** | **50.35** | **0.460** | 0.486 |+| w 开 α=0.05(提交) | 49.89 | 49.55 | 50.00 | 50.02 | 0.491 | 0.500* |++- 开/关对照(同 α=0.15):加权使 variogram 0.460→0.484、cell_state 48.06→49.20,差异集中在 cell_state 组,符合 PLAN 预期机制方向;证明权重实际生效(w_mean=0.121,p10=0.004,p90=0.374;加权后位移 L2 为均匀的 23.4%,低于 PLAN 风险 1 的 30% 阈值——即权重同时把有效幅度压小,α=0.15 加权的收益部分来自更小的有效位移)。+- α=0 对照:代码路径输出 = 末阶段原样(alpha32=0 时 `clip(block+0·dw)=block`),即 copy_last。+- 所有 33 个共有类型的全部 24826 个细胞都收到位移(本视图两阶段类型完全同名);被压缩最多的是低 B/T(型内异质性主导)基因。+- \*α=0.05 时 DE 两项 skill 恰为 0.500:位移已小到触发无变化保护(std(dp) < 1%·std(dt) → DE 记 0,与地板同),即提交配置在 DE 组上等同 copy_last,只在 variogram(0.491,略低于地板 0.5)上有可测差异。++## 结论(如实报告,PLAN 风险 3 成立)++- 在 proxy_noscale 上,**任何 α>0 都 ≤ copy_last(50.00)**:α 越大越差(0.05→49.89,0.1→49.51,0.15→49.59/关 49.39,与方法卡"skill 随 α 单调下降"一致)。方差加权确实按设计减轻了损伤(同 α 下 on > off),但没有把外推变成正收益。+- 另试的型间符号一致性权重(w_g=|Σc_t δ_tg|/Σc_t|δ_tg|,α=0.15/0.5):49.52 / 49.49,de_score 反降至 0.476,未采用。+- 提交 α=0.05 而非 α=0:本尺子上 −0.11(噪声内),但保留机制——若 final(E9.5→E10.5,步长比 4/3)的上一步方向正确,微小加权位移有正收益空间;若方向错误,损伤被限制在 ~0.1 分且 DE 触发无变化保护。**这一点无法在代理上验证**(方法卡:代理上一步是缩小,真实是长大;外推榜本地分历史上高估官网分)。+- 终选护栏(>copy_last+1)本节点达不到,预期终选回退基线。++## 验证过 / 未验证++- 验证过:proxy 视图格式(vec-check ok)、seed 0/1/2 内容与分数一致(输出对 seed 不变)、机制开关对照、α∈{0.05,0.15,0.5}×两种权重、运行 ~6 s / <1 GB。+- 未验证:真实括号(final)上的方向与幅度;伪装视图重跑(代码无路径/绝对时间依赖,所有统计现场从 manifest 输入计算,预期通过);`w_g` 在 final 末两阶段类型交集很小时的稳定性(回退 w=1 逻辑未在实际小交集数据上跑过)。++## 知识来源++无外部生物学知识、无文献/数据库数值。全部统计量(类型均值、方差、权重、RMS、细胞数)从视图 manifest 指向的两个输入阶段现场计算。diff --git a/solution/README.md b/solution/README.mdindex 55efcde..424574a 100644--- a/solution/README.md+++ b/solution/README.md@@ -1,6 +1,3 @@-# damped_shift(T2:heart:val_extrap)+# damped_shift + 基因型间方差加权收缩(T2:heart:val_extrap) -最新两个输入 (prev, last);last 的每个细胞加 α·(mean(last|类型) − mean(prev|类型)),只对两阶段同名的类型,夹到 ≥0。α=0.1,β=0(坐标就是 last 自己的,不缩放),α_comp=0(组成不动),time_scale 关(不乘步长比)。这是方法卡网格里最好的非平凡点;方法卡最终提交的 α=0 等于 `copy_last`。-proxy(两个较早的已发布心脏阶段 → 第三个,步长比 1.5)预期 49.47(seed 0 实测 49.475,与网格 `damp_a010_c0` 一致;表达 49.2 / 状态 48.5 / 形状 50.0 / 邻域 50.3)。-final(最新两个已发布心脏阶段 → E10.5,步长比 4/3):n = 榜上限,坐标原尺度;末步同名类型少,分型位移在 final 上基本空转(同名类型数由程序从输入算)。-已知弱点:代理与真实的上一步尺寸走向可能相反,α、β 的方向在代理上验证不了。这是起点,不是方案。各阶段的尺寸、细胞数不在这里给出(2026-10-03 泄漏审计:每个已发布心脏阶段都是某个本地尺子的目标)。+末输入全量输出;每个共有类型加 α·w_g·(mean(last|t) − mean(prev|t)),w_g = B_g/(B_g+W_g)(末阶段型间方差占比,现场计算),α=0.05,clip≥0;坐标/组成/细胞数照抄末输入。机制开关 `T2HX_VARW=0`(关=均匀位移)、`T2HX_ALPHA`、`T2HX_WMODE`。详见 METHOD.md(含开/关对照与查分结果)。diff --git a/solution/run.py b/solution/run.pyindex d62b7bc..b664330 100644--- a/solution/run.py+++ b/solution/run.py@@ -1,30 +1,81 @@ #!/usr/bin/env python3-"""damped_shift (T2 extrapolation): last input + α·per-type pseudobulk delta of the last step.+"""Variance-weighted damped_shift (T2 extrapolation), family T2HX-01. -Takes the two latest inputs (prev, last). Each last-stage cell of a type that-also exists in prev gets α·(mean(last|type) − mean(prev|type)), clipped at 0.-Coordinates are the last stage's own, rescaled by exp(β·Δlog RMS) (β=0 keeps-the scale); composition moves by α_comp·Δfraction (0 keeps it). Cell count is-the last stage's, clipped to the board range. ``time_scale`` is off, so the-step ratio (target − last)/(last − prev) is not applied.+Same skeleton as the parent (last input + alpha * per-type pseudobulk delta of+the last step, coords/counts/composition held), but the per-type delta is+shrunk gene-wise by w_g = B_g / (B_g + W_g + eps): B_g is the between-type+(count-weighted) variance of the last stage's type means, W_g the pooled+within-type variance, both computed on the last input only. Genes whose+last-stage variation is mostly within-type heterogeneity move less, protecting+the gene-gene covariance structure the variogram metric scores. -ALPHA=0.1 is the best non-trivial point of the T2 card's grid (proxy 49.47);-α=0 is copy_last, the card's submitted choice. With one input, copy the last.+Types with fewer than MIN_TYPE_CELLS cells in the last stage fall back to the+unweighted delta (their variance estimates are too noisy). With one input the+program copies the last stage, as the parent does.++Mechanism switch: T2HX_VARW=0 forces w_g = 1 for every gene, which reduces the+program to the parent's uniform per-type shift at the same alpha (control). """ from __future__ import annotations import argparse import json+import os import sys import numpy as np -from src.task2_spatial.methods import damped_shift-from src.task2_spatial.sample import take-from src.task2_spatial.view_io import board_params, extrap_step, load_manifest, panel_genes, read_stage, write_t2+from src.task2_spatial.frame import rms_radius, scale_to_rms+from src.task2_spatial.sample import extrap_count, take+from src.task2_spatial.shift import type_means+from src.task2_spatial.transport import as_dense+from src.task2_spatial.view_io import extrap_step, load_manifest, panel_genes, read_stage, write_t2++ALPHA = float(os.environ.get("T2HX_ALPHA", "0.05"))+VARW = os.environ.get("T2HX_VARW", "1") != "0"+WMODE = os.environ.get("T2HX_WMODE", "bt")+MIN_TYPE_CELLS = 10+EPS = 1e-8+ -PARAMS = {"alpha": 0.1, "beta": 0.0, "alpha_comp": 0.0, "n_damp": 0.0, "time_scale": False}+def consistency_weights(deltas: dict[str, np.ndarray], counts: dict[str, int]) -> np.ndarray:+ """w_g = |sum_t c_t delta_tg| / sum_t c_t |delta_tg|: sign-consistency of the per-type step."""+ labs = list(deltas)+ D = np.stack([deltas[t].astype(np.float64) for t in labs])+ C = np.array([counts[t] for t in labs], dtype=np.float64)+ C = C / max(C.sum(), 1.0)+ num = np.abs((C[:, None] * D).sum(axis=0))+ den = (C[:, None] * np.abs(D)).sum(axis=0) + EPS+ return (num / den).astype(np.float32)+++def gene_type_weights(X, labels: np.ndarray) -> tuple[np.ndarray, set[str]]:+ """Per-gene between-type variance share w_g = B_g / (B_g + W_g + eps) of the last stage."""+ labels = np.asarray(labels).astype(str)+ types, counts = np.unique(labels, return_counts=True)+ n_genes = int(X.shape[1])+ grand = as_dense(X, np.arange(len(labels))).mean(axis=0).astype(np.float64)+ B = np.zeros(n_genes, dtype=np.float64)+ W = np.zeros(n_genes, dtype=np.float64)+ ntot = 0+ small: set[str] = set()+ for t, c in zip(types.tolist(), counts.tolist()):+ if c < MIN_TYPE_CELLS:+ small.add(t)+ continue+ d = as_dense(X, np.flatnonzero(labels == t)).astype(np.float64)+ mu = d.mean(axis=0)+ var = d.var(axis=0)+ B += c * (mu - grand) ** 2+ W += c * var+ ntot += c+ if ntot == 0:+ return np.ones(n_genes, dtype=np.float32), set(types.tolist())+ B /= ntot+ W /= ntot+ w = (B / (B + W + EPS)).astype(np.float32)+ return w, small def main() -> None:@@ -38,17 +89,69 @@ def main() -> None: genes = panel_genes(args.data, manifest) prev, last, ratio = extrap_step(manifest) stage_last = read_stage(args.data, last, genes)+ lo, hi = int(manifest["min_cells"]), int(manifest["max_cells"])+ if prev is None:- n = int(np.clip(stage_last.n, manifest["min_cells"], manifest["max_cells"]))+ n = int(np.clip(stage_last.n, lo, hi)) rows = np.sort(take(stage_last.labels, min(n, stage_last.n), np.random.default_rng(args.seed))) write_t2(args.out, stage_last.X[rows].toarray(), stage_last.coords[rows], genes, seed=args.seed) return+ stage_prev = read_stage(args.data, prev, genes)- params = board_params(manifest, "damped_shift", PARAMS, args.seed)- expr, coords, info = damped_shift(stage_prev, stage_last, ratio, params)- keep = {k: info.get(k) for k in ("alpha", "beta", "dt_ratio", "n", "rms_prev", "rms_last", "out_rms", "n_shared_types")}- print(json.dumps({"step": [prev["stage"], last["stage"]], **keep}, default=float), file=sys.stderr)- write_t2(args.out, expr, coords, genes, seed=args.seed)+ rng = np.random.default_rng(args.seed)+ n = int(np.clip(extrap_count(stage_prev.n, stage_last.n, 0.0, lo, hi), lo, hi))+ idx = np.arange(stage_last.n) if n >= stage_last.n else take(stage_last.labels, n, rng)++ means_prev = type_means(stage_prev.X, stage_prev.labels)+ means_last = type_means(stage_last.X, stage_last.labels)+ w, small = gene_type_weights(stage_last.X, stage_last.labels)+ if WMODE == "cons":+ labs = np.asarray(stage_last.labels).astype(str)+ counts = {t: int((labs == t).sum()) for t in means_last}+ big = {t: (means_last[t] - means_prev[t]).astype(np.float32) for t in means_last if t in means_prev and counts[t] >= MIN_TYPE_CELLS}+ w = consistency_weights(big, counts) if big else np.ones_like(w)+ if not VARW:+ w = np.ones_like(w)++ block = as_dense(stage_last.X, idx)+ out = block.copy()+ sub_labels = np.asarray(stage_last.labels).astype(str)[idx]+ alpha32 = np.float32(ALPHA)+ norm_w = 0.0+ norm_u = 0.0+ n_shared = 0+ for lab, mu in means_last.items():+ if lab not in means_prev:+ continue+ n_shared += 1+ d = (mu - means_prev[lab]).astype(np.float32)+ dw = d if lab in small else w * d+ norm_w += float(np.dot(dw, dw))+ norm_u += float(np.dot(d, d))+ mask = sub_labels == lab+ if not mask.any():+ continue+ out[mask] = np.clip(block[mask] + alpha32 * dw, 0.0, None)++ rms_last = rms_radius(stage_last.coords)+ coords = scale_to_rms(stage_last.coords[idx], rms_last)+ expr = np.clip(out, 0.0, None).astype(np.float32)++ info = {+ "method": "damped_shift_varw",+ "alpha": ALPHA,+ "varw": VARW, "wmode": WMODE,+ "n": int(expr.shape[0]),+ "n_shared_types": n_shared,+ "w_mean": float(w.mean()),+ "w_p10": float(np.quantile(w, 0.10)),+ "w_p90": float(np.quantile(w, 0.90)),+ "shift_l2_ratio": float(np.sqrt(norm_w / max(norm_u, 1e-12))),+ "rms_last": float(rms_last),+ "out_rms": float(rms_radius(coords)),+ }+ print(json.dumps({"step": [prev["stage"], last["stage"]], **info}, default=float), file=sys.stderr)+ write_t2(args.out, expr, coords.astype(np.float32), genes, seed=args.seed) if __name__ == "__main__":
调研来源?调研员查到并用到的知识条目和文献检索结果(只列标题和编号)。
用到的知识库条目
| 编号 | 标题 | 出处 |
|---|---|---|
| k016 | Degenerate-solution checks for population predictions | notes/handover/02_知识学习路线.md |
| k007 | Interval staging and held-out-window filtering of external data | notes/official/来件/virtualembryo.ai/rules.md |
| k021 | Low-rank covariance residuals to avoid mean collapse | notes/guides/modeling_and_evaluation_guide.html |
分析结果?分析员写的 ANALYSIS.json:改了什么、各组分数怎么变、假设是否成立、经验和下一步建议。
| 改了什么 | 在父节点 damped_shift 骨架上,把按型伪批量位移 delta_t 逐基因乘以末阶段现场计算的型间方差占比 w_g=B_g/(B_g+W_g)(<10 细胞的类型回退 w=1),并把 α 从 0.1 降到 0.05;坐标/组成/细胞数照抄末输入。实现为 run.py 内联(+环境变量开关 T2HX_VARW / T2HX_ALPHA / T2HX_WMODE),另试的型间符号一致性权重未采用。 |
|---|---|
| 各组分数的变化 | cell_state:49.55(+1.14,略高于 T2 约 1 分噪声)——全部来自 variogram:原始 0.06601→0.06016,skill 0.468→0.491,+0.29 分;mmd_u 不动(0.05821→0.05832,skill 0.500,−0.01 分)。variogram 仍未回到地板 0.500,PLAN 的 ≥0.50 判据未达。 expression_change:50.00(+0.65)——但不是 DE 预测变好:de_score 原始 −0.0417→0、de_direction −0.0091→0,两项 skill 同时回到 0.500(=地板),是位移小到触发无变化保护(std(dp)<1%·std(dt) → DE 记 0),该组实质退化为 copy_last。 local_spatial:50.02(−0.25)——neighborhood_mmd 0.1114→0.1125,skill 0.503→0.500,在噪声内;结构门未触发(邻域 skill ≥0.5)。 shape_scale:50.00(+0.00)——三项原始值与父节点完全相同(d2_shape 0.04911、occupancy_dice 0.8066、scale_log_ratio −0.4334),坐标没动,符合设计。 |
| family_id | T2HX-01 |
| 假设是否成立 | unclear |
| 经验 |
|
| mechanism_active | 是 |
| 下一步建议 |
|
对话摘要?每个角色和大模型对话的统计:轮数、工具调用、用时、token 数和最后的回答摘录;原始记录只给路径。
只给统计和最后回答的摘录;完整对话请到原始记录位置里列出的文件看。
分析员
| 角色?调研员写计划、工程师改代码、分析员解读分数、审查员检查作弊。 | 分析员 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数?大模型一共回复了几轮(每轮可以调用多个工具)。 | 4 |
| 工具调用?大模型调用读文件、执行命令等工具的次数,按工具名统计。 | 共 4 次:— |
| 用时 | 1 分 |
| token 数?输入 / 输出(含思考)的 token 数,来自接口返回的用量。 | 输入 16,696 · 输出 1,648 · 思考 1,590 |
| 任务(第一行) | 分析节点 n4 的打分结果,写 ANALYSIS.json |
| 最后的回答(摘录) | ANALYSIS.json written |
| 原始记录位置?完整对话记录在 Spark 上的文件路径;看板不复制原始内容。 | /home/spark-longxinyang/vec/runs/formal/20261003-172000-search-t2-heart-extrap-chain-12h/nodes/4/analyst.jsonl (文件不在) |
工程师
| 角色 | 工程师 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数 | 30 |
| 工具调用 | 共 33 次:— |
| 用时 | 12 分 |
| token 数 | 输入 63,672 · 输出 8,783 · 思考 11,927 |
| 任务(第一行) | 按计划修改程序:基因方差加权收缩的按型伪批量位移(修复 variogram 下降) |
| 最后的回答(摘录) | **做了什么**:按 PLAN 实现基因型间方差加权收缩的按型位移(w_g=B_g/(B_g+W_g),末阶段现场计算,α=0.05),含机制开关与单输入退路;另试了型间符号一致性权重(失败,未采用)。查分 6 次。 **查分结果**(proxy_noscale,A 半):提交配置 49.89(seed 0/1 一致,vec-check ok),父节点 49.51;机制开/关对照(同 α=0.15)49.59 vs 49.39,variogram 0.460→0.484——机制按设计生效但仍是减损,不是收益。PLAN 风险 3 成立:本尺子上任何 α>0 都 ≤ copy_last(50.00),METHOD.md 已如实记录;提交 α=0.05 保留机制(DE 触发无变化保护,损伤 ~0.1),预期达不到终选 +1 护栏。 **下一步最值得试**:外推方向在本代理上不可验证(代理上一步是缩小、真实是长大),继续在 α/权重上网格没有空间;更有希望的是换信息源——用 `prior/`(TF regulons、Reactome)或允许的外部数据构造与阶段趋势一致性更高的位移方向,或转向组成/邻域结构(local_spatial 是唯一 >0.5 的组,neighborhood 0.503–0.512 随位移增大而升,值得单独探索大 α+保结构权重)。 |
| 原始记录位置 | /home/spark-longxinyang/vec/runs/formal/20261003-172000-search-t2-heart-extrap-chain-12h/nodes/4/engineer.jsonl (文件不在) |
调研员
| 角色 | 调研员 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 2 次 |
| 轮数 | 2 |
| 工具调用 | 共 0 次:— |
| 用时 | 3 分 |
| token 数 | 输入 9,534 · 输出 2,175 · 思考 6,852 |
| 任务(第一行) | 为节点 n4(改进,父节点 n2)写改进计划 PLAN.json |
| 最后的回答(摘录) | {
"name": "基因方差加权收缩的按型伪批量位移(修复 variogram 下降)",
"motivation": "父节点 2(damped_shift α=0.1)得分 49.51,低于 copy_last 基线(节点 1,50.00)。最弱组 cell_state=48.41,其中 variogram skill 仅 0.468(地板 0.5),是唯一显著低于地板的指标。原因:父节点对全部 500 个基因施加相同的按型均值位移,高型内方差基因的型内协方差结构被平移打乱,导致跨细胞对距离分布(variogram 度量的 E|xi−xj|^0.5)失真。de_score skill 0.489 也略低于地板,说明位移方向对部分基因不正确。",
"approach": "在父节点 run.py 的 damped_shift 调用之前,增加一步基因权重计算:\n1. 对 last 阶段,按细胞类型分组,计算每个基因 g 的型间方差 B_g 和总方差 T_g(型间+型内),权重 w_g = B_g / (T_g + eps),eps=1e-8。仅在 last 阶段数据上计算,不引入外部统计量。\n2. 将父节点的按型位移向量 delta_t(每个类型一个 500 维向量)逐基因乘以 w_g,即 shift_{t,g} = α · w_g · delta_{t,g}。α 初始 0.15(略高于父节点 0.1,因为权重会缩小有效位移),搜索范围 [0.05, 0.3],步长 0.05。\n3. 夹到 ≥0 的逻辑不变;坐标、组成、time_scale 均与父节点相同(β=0, α_comp=0, time_scale=False)。\n4. 单输入阶段退路:若 prev 为 None,直接 copy_last,与父节点一致。\n5. 用 vec-score 在 proxy_noscale 上查分;先跑 α=0(应等于 copy_last,验证权重不引入 bug)和 α=0.15,比较 variogram skill 是否回到 ≥0.50。若 α=0.15 的 variogram 改善但 de_score 下降,降到 α=0.10。最多查 6 次分。\n6. 实现改动量:约 20 行 numpy 代码(方差计算 + 权重乘法),30 分钟内可完成。",
"expected_groups": ["cell_state", "expression_change"],
"risks": "1) 权重可能过度抑制有效位移,使输出趋近 copy_last(α 有效值太小);Engineer 应检查加权后位移的 L2 范数是否仍为父节点的 30%以上。2) 型间方差估计在小类型上噪声大;若某类型细胞数 <10,该类型回退到不加权(w=1)。3) 外推方向本身可能错误(METHOD.md 已警告),此时任何 α>0 都不如 α=0;若所有 α>0 的查分均 ≤ copy_last,应如实报告失败。4) 分数噪声约 1 分,差距 <1 分不算改善,需至少两次查分确认。",
"family_id": "T2HX-01",
"mechanism": "按基因型间方差占比对按型伪批量位移做逐基因收缩:高型内方差基因(其变异主要反映型内异质性而非阶段趋势)的位移被压小,从而保护 variogram 度量的基因共变结构。",
"vs_constant_shift": "父节点对全部基因施加相同的 α·delta(每型一个常向量);本方案将位移乘以逐基因权重 w_g = B_g/T_g,使位移在基因维度上非均匀——型间差异小的基因几乎不移,型间差异大的基因才移。这不是全局组成重加权(不改类型比例),也不是单纯缩小 α(α 仍控制幅度,权重控制方向选择性)。",
"mechanism_evidence": "1) 打印加权前后位移向量的每基因幅度分布,确认低 B/T 基因的位移被显著压缩;2) 比较 variogram skill:父节点 0.468,本方案应 ≥0.50;3) 检查 mmd_u skill 不恶化(≥0.500);4) 对比加权与不加权(全 w=1)在相同 α 下的四组分差异,差异应集中在 cell_state 组。",
"mechanism_off_control": "将权重数组全部设为 1.0(即 w_g=1 对所有基因),此时退化为父节点的均匀按型位移;预期输出与父节点完全相同(相同 α 下)。若关闭后输出不变,说明权重计算未生效。另一对照:α=0,输出应等于 copy_last。",
"sources": []
} |
| 原始记录位置 | /home/spark-longxinyang/vec/runs/formal/20261003-172000-search-t2-heart-extrap-chain-12h/nodes/4/researcher.jsonl (文件不在) /home/spark-longxinyang/vec/runs/formal/20261003-172000-search-t2-heart-extrap-chain-12h/nodes/4/researcher.1.jsonl (文件不在) |