总览 · ← 返回运行 20261002-135403-search-t1-x3-era-mechcheck
节点 n24
每细胞进度调制的加法位移(β=1 增益):alpha_i 由细胞在类型 delta 方向的秩百分位决定(GAMMA=6,均值仍 0.4),更新 x'=clip(x+alpha_i·delta·(1+x),0) 只作用于非零元。
| 运行?一次完整的自动搜索或 Agent 会话,有自己的锁定配置和证据包。 | 20261002-135403-search-t1-x3-era-mechcheck |
|---|---|
| 父节点 | n22 |
| 子节点 | — |
| 操作?种子:人写的起点;改进:在父节点上改;草稿:从头写;修复:修父节点的报错。 | 改进 |
| 状态 | 已打分 |
| 分数 | 搜索目标分 49.29(+0.0) · X3 49.29(+0.0) · 3 次复测均分 49.46 |
| 审查 | 通过 1 越界读取:未发现问题——run.py 仅通过 src.task1_temporal.view_io 的 load_manifest/inputs_by_time/read_stage/panel_genes 访问 args.data 提供的输入阶段(run.py:37-45,127-136),无绝对路径、'..'、external/prior、打分器路径或联网代码。; 2 硬编码目标统计量:未发现问题——常量仅 ALPHA/GAMMA/BETA/BLOCK 方法超参(run.py:47-51),delta_c 由最后两个输入阶段现场计算(type_deltas, run.py:54-63… |
| 用时?从运行开始到结束(或到现在)的挂钟时间。 | 18 分 |
| 程序版本 | 7f0c9161710bea87fedb3991796543bf08cd81ec (programs.git) |
方法说明?节点程序自带的 METHOD.md:这个程序做了什么、为什么。
来自 programs.git 7f0c916171:solution/METHOD.md
每细胞进度调制的加法位移(β=1 增益):alpha_i 由细胞在类型 delta 方向的秩百分位决定(GAMMA=6,均值仍 0.4),更新 x'=clip(x+alpha_i·delta·(1+x),0) 只作用于非零元。
方法
与父节点 22 相同的框架,只换表达更新式:
- ≥2 输入阶段时对共有类型 c 计算 log1p 伪批量差
delta_c = mean(last|c) − mean(prev|c); - 从 last 阶段按
[min_cells, max_cells]抽样(rng 顺序与父节点一致); - 每细胞进度调制不变:
proj_i= 细胞类型内中心化表达与delta_c的余弦,r_i= 类型内秩百分位,alpha_i = clip(0.4·(1+6·(r_i−0.5)), 0, 0.8)(对称饱和 ⇒ mean(alpha_i)=0.4,伪批量位移不变); - 更新式改为:
x' = clip(x + alpha_i·delta_c·(1+BETA·x), 0),BETA=1.0,只作用于稀疏矩阵已存非零元 (dropout 结构完全保留)。BETA=1 是父节点乘法式(1+x)·exp(alpha·δ)−1的一阶线性化:保留 de_recovery 所需的轻度表达依赖增益,去掉指数放大对基因共变结构的扭曲; - 单输入阶段或无共享类型退化为 copy_last;无绝对时间/视图路径/阶段名/细胞数硬编码,对 seed 确定。
实测(X3 A 半,vec-score --task X3_qiu_heart_early,seed 0)
| 方案 | board | de_rec | dir | cell_state | covar |
|---|---|---|---|---|---|
| 父节点 mult g4 a0.4 | 48.815 | 47.75 | 48.86 | 50.50 | 47.56 |
| mult g6 a0.4 | 48.856 | 47.75 | 48.86 | 50.64 | 47.56 |
| 纯加法 add g4 a0.4 (β=0) | 47.862 | 44.17 | 48.95 | 49.83 | 48.17 |
| add g4 a1.0 β=0 | 48.558 | 46.90 | 48.84 | 50.25 | 47.73 |
| add g4 a1.4 β=0 | 48.793 | 47.75 | 48.90 | 50.48 | 47.42 |
| add β=0.3 a0.4 g4 | 48.483 | 46.49 | 48.97 | 50.03 | 48.04 |
| add β=1.0 a0.4 g4 | 48.927 | 48.18 | 48.86 | 50.41 | 47.72 |
| add β=1.0 a0.4 g5 | 48.954 | 48.18 | 48.86 | 50.49 | 47.73 |
| add β=1.0 a0.4 g6(提交) | 48.968 | 48.18 | 48.86 | 50.53 | 47.73 |
| add β=1.0 a0.4 g8 | 48.878 | 47.75 | 48.86 | 50.59 | 47.75 |
| add β=1.3 a0.4 g4 | 48.833 | 47.75 | 48.91 | 50.53 | 47.54 |
| add β=1.0 a0.45/a0.5 g4 | 48.825/48.833 | 47.75 | 48.89/48.92 | 50.49/50.57 | 47.60/47.48 |
| add β=1.0 a0.4 g2 | 48.731 | 48.18 | 48.88 | 49.76 | 47.68 |
3 种子配对(A 半,seed 0/1/2):
| 方案 | s0 | s1 | s2 | 均值 |
|---|---|---|---|---|
| 父 mult g4 | 48.815 | 49.142 | 49.490 | 49.149 |
| add β=1 g6 | 48.968 | 49.303 | 49.544 | 49.271 |
三个种子配对差均为正(+0.15/+0.16/+0.05),方向一致但幅度远小于 T1 约 2 分的噪声判据,不是确定进步;
分组结构上比父节点好在 de_recovery(48.18 vs 47.75,回到不饱和档)与 covariation(47.72–47.75 vs 47.56),
cell_state 略低(50.41–50.53 vs 50.50,噪声内)。solution/run.py 输出与打分变体逐位一致,seed 0 复跑
逐位相同,vec-check 通过,CPU 运行约 4 s。
结论与教训(供后续节点)
- 纯加法(β=0)在 X3 上不可行:de_recovery 随位移幅度单调(44.17@α0.4 → 46.90@α1.0 → 47.75@α1.4), 即使 α 加大到 1.4 也只追平父节点的 de_rec,且 covariation 反被大 α 拉低——PLAN 风险 1 成真, 但 β=1 的线性化增益完全修复了它(de_rec 48.18,比父节点的乘法指数式还高一档)。
- de_recovery 是分档的(44.17/46.49/46.90/47.75/48.18),档间由有效位移幅度决定; 48.18 ↔ 47.75 的边界很陡:β=1.0 时 α=0.45、0.5、1.3、GAMMA=8 都掉档,只有 (α0.4, β1.0, γ≤6) 保住 48.18。 这个边界在不同 seed 上会移动(提交配置 s1 de_rec=46.09、s2=46.9,靠 direction/cell_state/covar 补偿), 说明单一配置骑在档位边缘,B 半上可能落回父节点水平。
- GAMMA 在 β=1 支上 4→5→6 单调微升、8 掉档(de_rec 47.75),最优 γ 随更新式的强度移动:乘法支 γ=4 饱和最优, 线性化支 γ=6 最优。
- covariation 在 β=0→1 时从 48.17 降到 47.72:表达依赖增益(无论线性还是指数)本身就会压 covariation, 与「乘法扭曲共变」的 PLAN 假设部分一致,但纯加法的 covar 优势(+0.6)不足以抵 de_rec 损失(−4)。
没验证的
- B 半与 final 视图(间隔为 X3 的 4 倍,delta 更大):β=1 线性化在大 delta 下与指数式偏离更大 (exp(αδ)−1 ≈ αδ + (αδ)²/2),final 上可能需要重扫 β/α;de_rec 档位边界在 B 半的位置未知。
- 提交配置骑在 de_rec 48.18 档边缘(α=0.45 即掉档),seed 间 de_rec 波动大(46.09–48.18), 正式分(B 半 seed 0)存在掉档风险;3 种子 A 半均值 +0.12 小于噪声,改进置信度低。
- 未试:β 按 dt 自适应、非对称 GAMMA、调制用于抽样权重。
生物学知识来源
仅通用机制知识:发育异步性(同类型细胞群沿轨迹异步推进,领先个体位移更大),与父节点相同;
更新式的 (1+x) 增益是对 log1p 计数空间的数学线性化,不依赖任何保留阶段/基因型的测量。
未读 uns.celltype_palette,未使用 external/、prior/。
调研员的计划
| 名称 | Per-cell progress-modulated additive shift: preserving within-type covariance |
|---|---|
| 动机 | Node 22's weakest group is covariation (47.40), ~1.2 points below copy_last (48.59) and 2.4 points below the additive Top-K EB family (node 5/17: 49.76). The multiplicative update x'=(1+x)·exp(α_i·δ)−1 creates expression-dependent amplification that distorts gene-gene correlations: genes with large |δ| and high x get disproportionately scaled, injecting spurious correlations. Switching to additive form x'=x+α_i·δ (a per-gene translation) removes this distortion by construction while the per-cell modulation (GAMMA) still differentiates cells for cell_state. Node 22 proved GAMMA>0 modulation boosts cell_state (+2.44); node 17 proved additive+modulation preserves covariation (49.76). No node has combined full-delta additive shift + rank-percentile modulation. |
| 做法 | 1) Replace the multiplicative update with additive nnz-only shift: for each sampled cell i of type c, x'_g = max(x_g + alpha_i · delta_c[g], 0) applied only to stored nonzeros (preserves sparsity/dropout exactly as parent). 2) Keep the per-cell progress modulation from node 22 unchanged: proj_i = cosine(x_i − mean_type, delta_c), r_i = within-type rank percentile, alpha_i = clip(ALPHA·(1+GAMMA·(r_i−0.5)), 0, 2·ALPHA). 3) Compute delta_c identically (log1p pseudobulk difference of shared types between last two input stages). 4) Parameter scan on X3 A-half (vec-score): GAMMA ∈ {2, 3, 4, 6}, ALPHA ∈ {0.3, 0.4, 0.5}; primary selection criterion = board score, secondary = covariation ≥ 48.0. Expect GAMMA=4 ALPHA=0.4 as starting point. 5) If additive+GAMMA4 recovers covariation to ≥48.5 while keeping cell_state ≥50, submit. If covariation still <48, try a 'soft additive' variant: x'_g = x_g + alpha_i·delta_g·w_g where w_g = δ_g²/(δ_g²+σ²) is a mild per-gene EB shrinkage weight (σ² = median of δ², no external data), which down-weights noisy genes without the hard Top-K cutoff. 6) Single-input fallback: copy_last (identical to parent). Proxy2: delta from E8.5 vs Qiu E9.0; genes missing in… |
| 风险 | 1) Additive shift may underperform multiplicative on cell_state because it lacks the (1+x) amplification that makes high-expression genes move more; if cell_state drops >1.5 points vs node 22, try a compromise: x' = x + alpha_i·delta_g·(1+beta·x_g) with beta∈{0.1,0.3} (mild expression-dependent gain without full multiplicative distortion). Detect early by checking cell_state in the first seed-0 scan. 2) The rank-1 covariance addition delta·delta^T·var(alpha) from per-cell modulation could still slightly perturb covariation; if covariation < 48, reduce GAMMA to 2 (less var(alpha)). 3) Clipping at 0 for genes near zero introduces mild nonlinearity; if >10% of shifted values are clipped, consider allowing small negatives (floor at −0.1) as a variant. 4) Full delta (no Top-K) may let noisy genes add covariation noise; the soft EB weight w_g addresses this if needed. 5) Score differences <2 points are within noise; require consistent direction across seeds 0/1/2 before concluding improvement. |
代码改动?这个节点的程序和父节点程序的逐行差别:绿色是新增,红色是删除。
对比:父节点版本 99f95f3855。改动的文件:solution/METHOD.md +56 −74、solution/README.md +5 −4、solution/run.py +24 −10
diff --git a/solution/METHOD.md b/solution/METHOD.mdindex 5ae1c59..bc0a131 100644--- a/solution/METHOD.md+++ b/solution/METHOD.md@@ -1,90 +1,72 @@-每细胞进度调制的乘法位移:把细胞在自己类型 delta 方向上的秩百分位映射成 alpha_i(均值仍 0.4),领先细胞位移更大、落后细胞更小。+每细胞进度调制的加法位移(β=1 增益):alpha_i 由细胞在类型 delta 方向的秩百分位决定(GAMMA=6,均值仍 0.4),更新 x'=clip(x+alpha_i·delta·(1+x),0) 只作用于非零元。 -## 提交的方法+## 方法 -- 读全部输入阶段(`inputs_by_time`)。≥2 个阶段时取最后两个 prev、last,对同时出现在- 两阶段的每个细胞类型 c 计算 log1p 伪批量差 `delta_c = mean(last|c) - mean(prev|c)`- (与父节点 6 完全相同)。-- 从 last 阶段按 `[min_cells, max_cells]` 抽样(`sample_rows`,与父节点相同的 rng 顺序)。-- **新增:每细胞进度调制。** 对每个抽到的、类型为 c 的细胞 i:- - `proj_i = <x_i - mean_type_c, delta_c> / (||x_i - mean_type_c|| · ||delta_c||)`- (细胞在该类型时间方向上的余弦进度;按 1024 行分块稠密化,全程 float64,内存 O(nnz));- - `r_i = proj_i` 在该类型内的秩百分位(`(rank+0.5)/n`,均匀分布在 [0,1]);- - `alpha_i = clip(ALPHA · (1 + GAMMA·(r_i − 0.5)), 0, 2·ALPHA)`,`ALPHA=0.4`、`GAMMA=4.0`。- 对称饱和保证 `mean(alpha_i) = ALPHA`:伪批量位移与父节点相同,只改变细胞间的位移差异。- GAMMA=4 + 饱和 ⇒ 后 25% 细胞不位移、前 25% 位移 alpha=0.8、中间线性。-- 表达更新只作用于稀疏矩阵已存非零元(稀疏结构/dropout 完全保留):- `x' = clip((1+x)·exp(alpha_i·delta_c) − 1, 0)`。-- 仅在 last 出现的类型不位移;单输入阶段或无共享类型时自动退化为 copy_last。-- 不含任何绝对时间、视图路径、阶段名、细胞数硬编码;`np.random.default_rng(seed)`,- 秩用 `argsort(kind="stable")`,对 seed 确定。+与父节点 22 相同的框架,只换表达更新式: -## 与 PLAN 的差别(重要)+- ≥2 输入阶段时对共有类型 c 计算 log1p 伪批量差 `delta_c = mean(last|c) − mean(prev|c)`;+- 从 last 阶段按 `[min_cells, max_cells]` 抽样(rng 顺序与父节点一致);+- 每细胞进度调制不变:`proj_i` = 细胞类型内中心化表达与 `delta_c` 的余弦,`r_i` = 类型内秩百分位,+ `alpha_i = clip(0.4·(1+6·(r_i−0.5)), 0, 0.8)`(对称饱和 ⇒ mean(alpha_i)=0.4,伪批量位移不变);+- **更新式改为**:`x' = clip(x + alpha_i·delta_c·(1+BETA·x), 0)`,`BETA=1.0`,只作用于稀疏矩阵已存非零元+ (dropout 结构完全保留)。BETA=1 是父节点乘法式 `(1+x)·exp(alpha·δ)−1` 的一阶线性化:保留 de_recovery+ 所需的轻度表达依赖增益,去掉指数放大对基因共变结构的扭曲;+- 单输入阶段或无共享类型退化为 copy_last;无绝对时间/视图路径/阶段名/细胞数硬编码,对 seed 确定。 -PLAN 的 `p_i = (clip(proj_i, 0.05, 0.95) − 0.05)/0.9` 假设 proj∈[0,1],但实测-proj 是余弦值(各类型 std 仅 0.035–0.05,绝大多数 < 0.05),下界 0.05 把几乎所有-细胞截成 p=0:`std(p_i)` 只有 0.003–0.018(PLAN 风险 1 的退化情形),alpha_i 实际-落在 [0.55, 0.60],等于「均匀 alpha≈0.6」——已知更差(47.83)。改成**类型内秩百分位**-后 `std(p_i)=0.289`,alpha 真正铺开 [0, 0.8],调制才生效。PLAN 假设「落后细胞需要更多-位移」(GAMMA<0)也被数据否定:GAMMA<0 一律更差,**领先细胞位移更大**才对(与节点 17-在加法 Top-K EB 支上 γ=−1 的最优符号一致,跨家族复现)。--## 实测(X3 A 半,`vec-score --task X3_qiu_heart_early`,board = 4 组均值)--seed 0 扫描(均为 mult 支、ALPHA=0.4):+## 实测(X3 A 半,`vec-score --task X3_qiu_heart_early`,seed 0) | 方案 | board | de_rec | dir | cell_state | covar | |---|---|---|---|---|---|-| GAMMA=0(= 父节点 6,已核对逐组一致) | 48.288 | 48.18 | 48.97 | 48.20 | 47.70 |-| GAMMA=−1(PLAN 原设想的方向) | 48.098 | 48.18 | 49.02 | 47.46 | 47.80 |-| GAMMA=−2 | 47.811 | 47.75 | 49.05 | 46.76 | 47.92 |-| GAMMA=+1 | 48.496 | 48.18 | 48.90 | 49.01 | 47.61 |-| GAMMA=+1.5 | 48.609 | 48.18 | 48.89 | 49.42 | 47.58 |-| GAMMA=+2(不饱和上限) | 48.726 | 48.18 | 48.87 | 49.85 | 47.54 |-| GAMMA=+3(饱和) | 48.762 | 47.75 | 48.86 | 50.33 | 47.54 |-| **GAMMA=+4(饱和,提交)** | **48.815** | 47.75 | 48.86 | 50.50 | 47.56 |-| GAMMA=2, ALPHA=0.35 / 0.45 | 48.637 / 48.604 | 47.75 | 48.86 / 48.92 | 49.82 / 49.87 | 47.68 / 47.39 |-| proj 只取 Top-500 |δ| 基因(GAMMA=−1) | 48.097 | 48.18 | 49.03 | 47.45 | 47.80 |--3 种子配对(seed 0/1/2,A 半):+| 父节点 mult g4 a0.4 | 48.815 | 47.75 | 48.86 | 50.50 | 47.56 |+| mult g6 a0.4 | 48.856 | 47.75 | 48.86 | 50.64 | 47.56 |+| 纯加法 add g4 a0.4 (β=0) | 47.862 | 44.17 | 48.95 | 49.83 | 48.17 |+| add g4 a1.0 β=0 | 48.558 | 46.90 | 48.84 | 50.25 | 47.73 |+| add g4 a1.4 β=0 | 48.793 | 47.75 | 48.90 | 50.48 | 47.42 |+| add β=0.3 a0.4 g4 | 48.483 | 46.49 | 48.97 | 50.03 | 48.04 |+| add β=1.0 a0.4 g4 | 48.927 | 48.18 | 48.86 | 50.41 | 47.72 |+| add β=1.0 a0.4 g5 | 48.954 | 48.18 | 48.86 | 50.49 | 47.73 |+| **add β=1.0 a0.4 g6(提交)** | **48.968** | 48.18 | 48.86 | 50.53 | 47.73 |+| add β=1.0 a0.4 g8 | 48.878 | 47.75 | 48.86 | 50.59 | 47.75 |+| add β=1.3 a0.4 g4 | 48.833 | 47.75 | 48.91 | 50.53 | 47.54 |+| add β=1.0 a0.45/a0.5 g4 | 48.825/48.833 | 47.75 | 48.89/48.92 | 50.49/50.57 | 47.60/47.48 |+| add β=1.0 a0.4 g2 | 48.731 | 48.18 | 48.88 | 49.76 | 47.68 |++3 种子配对(A 半,seed 0/1/2): | 方案 | s0 | s1 | s2 | 均值 | |---|---|---|---|---|-| GAMMA=0(父) | 48.288 | 48.587 | 48.826 | 48.567 |-| GAMMA=+2 | 48.726 | 48.953 | 49.289 | 48.989 |-| **GAMMA=+4** | **48.815** | **49.142** | **49.490** | **49.149** |--GAMMA=+4 在三个种子上配对差都为正(+0.53 / +0.56 / +0.66),一致性支持不是单种子噪声,-但幅度(+0.58)远小于 T1 约 2 分的噪声判据,**不能当作确定进步**;采纳它的理由是三个-种子方向一致且机理与节点 17 独立复现。`solution/run.py` 的输出与打分用的 GAMMA=4 变体-逐位一致(seed 0 board 48.8151 复现),`vec-check` 通过,运行 2.1 s。--## 机理结论(供后续节点)--1. **均值保持的 per-cell alpha 调制是「只动分布、不动伪批量」的杠杆**:GAMMA 从 0→2 时- de_recovery 锁死 48.18、direction 只动 ±0.1,全部增益来自 cell_state(48.20→49.85),- covariation 仅 −0.16。父节点 METHOD 里「乘法项同时带来 de_recovery 收益和- cell_state/covariation 损失、无法解耦」的结论**被推翻**:解耦办法是保持 mean(alpha)- 不变、只让 alpha 在细胞间铺开。-2. 正确的调制符号是**领先细胞位移更大**(正反馈式异步发育),不是 PLAN 设想的追赶式。- GAMMA 越大越好直到饱和把 alpha 压到 [0, 0.8] 两端;GAMMA>2 后 de_recovery 掉到 47.75- (离散跳变,0.35/0.45 的 alpha 也落到 47.75,说明该指标对小幅变化是分档的),- 但 cell_state 的增益(+0.65)大于 de_recovery 的损失(−0.43)。-3. 余弦进度的绝对尺度极小(|δ| 中位 0.0009,proj std≈0.05),任何假定 proj∈[0,1] 的- 归一化都会退化;必须用秩或 z 分数。+| 父 mult g4 | 48.815 | 49.142 | 49.490 | 49.149 |+| **add β=1 g6** | **48.968** | **49.303** | **49.544** | **49.271** |++三个种子配对差均为正(+0.15/+0.16/+0.05),方向一致但幅度远小于 T1 约 2 分的噪声判据,**不是确定进步**;+分组结构上比父节点好在 de_recovery(48.18 vs 47.75,回到不饱和档)与 covariation(47.72–47.75 vs 47.56),+cell_state 略低(50.41–50.53 vs 50.50,噪声内)。`solution/run.py` 输出与打分变体逐位一致,seed 0 复跑+逐位相同,`vec-check` 通过,CPU 运行约 4 s。++## 结论与教训(供后续节点)++1. **纯加法(β=0)在 X3 上不可行**:de_recovery 随位移幅度单调(44.17@α0.4 → 46.90@α1.0 → 47.75@α1.4),+ 即使 α 加大到 1.4 也只追平父节点的 de_rec,且 covariation 反被大 α 拉低——PLAN 风险 1 成真,+ 但 β=1 的线性化增益完全修复了它(de_rec 48.18,比父节点的乘法指数式还高一档)。+2. de_recovery 是**分档**的(44.17/46.49/46.90/47.75/48.18),档间由有效位移幅度决定;+ 48.18 ↔ 47.75 的边界很陡:β=1.0 时 α=0.45、0.5、1.3、GAMMA=8 都掉档,只有 (α0.4, β1.0, γ≤6) 保住 48.18。+ 这个边界在不同 seed 上会移动(提交配置 s1 de_rec=46.09、s2=46.9,靠 direction/cell_state/covar 补偿),+ 说明单一配置骑在档位边缘,B 半上可能落回父节点水平。+3. GAMMA 在 β=1 支上 4→5→6 单调微升、8 掉档(de_rec 47.75),最优 γ 随更新式的强度移动:乘法支 γ=4 饱和最优,+ 线性化支 γ=6 最优。+4. covariation 在 β=0→1 时从 48.17 降到 47.72:表达依赖增益(无论线性还是指数)本身就会压 covariation,+ 与「乘法扭曲共变」的 PLAN 假设部分一致,但纯加法的 covar 优势(+0.6)不足以抵 de_rec 损失(−4)。 ## 没验证的 -- B 半与 final 视图(阶段间隔是 X3 的 4 倍)上 GAMMA=4 是否仍最优:final 上 delta 更大、- proj 分布更宽,饱和阈值可能需要重扫;GAMMA 是常数超参,不随间隔自适应(按视图无关- 规则不能用绝对时间,但**可以**用 `dt = target − last` 或两输入之差做自适应,未试)。-- covariation 仍比 copy_last 低约 1 分(47.56 vs 48.59),未找到同时抬两组的办法。-- 未试:秩百分位换成 z 分数/非线性映射、按 `dt` 缩放 GAMMA、把调制同时用到抽样权重。+- B 半与 final 视图(间隔为 X3 的 4 倍,delta 更大):β=1 线性化在大 delta 下与指数式偏离更大+ (exp(αδ)−1 ≈ αδ + (αδ)²/2),final 上可能需要重扫 β/α;de_rec 档位边界在 B 半的位置未知。+- 提交配置骑在 de_rec 48.18 档边缘(α=0.45 即掉档),seed 间 de_rec 波动大(46.09–48.18),+ 正式分(B 半 seed 0)存在掉档风险;3 种子 A 半均值 +0.12 小于噪声,改进置信度低。+- 未试:β 按 dt 自适应、非对称 GAMMA、调制用于抽样权重。 ## 生物学知识来源 -只用了通用机制知识(不针对禁窗阶段):同一类型的细胞群在发育时间上是**异步**推进的,-处于轨迹更前端的个体细胞对群体平均位移的贡献应更大(发育异步性 / 谱系推进的一般性质,-见方法卡 §5「可以用的:不针对禁窗阶段的通用机制知识」)。未使用任何保留阶段或保留基因型-的测量、比例、标记基因或类型清单;未读 `uns.celltype_palette`;`external/`、`prior/`-本节点均未使用。+仅通用机制知识:发育异步性(同类型细胞群沿轨迹异步推进,领先个体位移更大),与父节点相同;+更新式的 (1+x) 增益是对 log1p 计数空间的数学线性化,不依赖任何保留阶段/基因型的测量。+未读 `uns.celltype_palette`,未使用 `external/`、`prior/`。diff --git a/solution/README.md b/solution/README.mdindex b8274f9..76d7d37 100644--- a/solution/README.md+++ b/solution/README.md@@ -1,5 +1,6 @@-# 保守 per-type 乘法位移(mult shift, alpha=0.4)+# 每细胞进度调制的加法位移(β=1 线性化增益) -≥2 输入阶段时:对两阶段共有类型 c 计算 log1p 伪批量差 delta_c,把最后阶段-抽样细胞的非零元按 x' = clip((1+x)*exp(0.4*delta_c)-1, 0) 缩放(保稀疏)。-单输入阶段退化为 copy_last。详见 METHOD.md。+≥2 输入阶段时:对两阶段共有类型 c 计算 log1p 伪批量差 delta_c;抽样细胞的+alpha_i = clip(0.4·(1+6·(r_i−0.5)), 0, 0.8),r_i 为细胞在 delta_c 方向余弦进度的类型内秩百分位;+非零元按 x' = clip(x + alpha_i·delta_c·(1+x), 0) 更新(保稀疏)。单输入退化为 copy_last。+详见 METHOD.md。diff --git a/solution/run.py b/solution/run.pyindex 3dd3427..7aaabba 100644--- a/solution/run.py+++ b/solution/run.py@@ -1,13 +1,13 @@ #!/usr/bin/env python3-"""Per-cell progress-modulated conservative temporal shift (sparsity preserving).+"""Per-cell progress-modulated additive temporal shift (sparsity preserving). With >=2 input stages: delta_c = mean(last|c) - mean(prev|c) in log1p space for every cell type present in both stages. Each sampled cell of the last stage gets its own shift strength alpha_i, derived from how far the cell already lies along its type's temporal direction: - proj_i = <x_i - mean_type_c, delta_c> / (||x_i - mean_type_c|| * ||delta_c||)- r_i = rank-percentile of proj_i inside type c (uniform in [0,1])+ proj_i = <x_i - mean_type_c, delta_c> / (||x_i - mean_type_c|| * ||delta_c||)+ r_i = rank-percentile of proj_i inside type c (uniform in [0,1]) alpha_i = clip(ALPHA * (1 + GAMMA * (r_i - 0.5)), 0, 2*ALPHA) GAMMA > 0 means cells already pointing along the E(prev)->E(last) change are@@ -17,7 +17,13 @@ DE-level metrics it drives) is unchanged while within-type heterogeneity is preserved/expanded instead of uniformly compressed. Expression update (stored nonzeros only, so the dropout pattern is preserved):- x' = clip((1 + x) * exp(alpha_i * delta_c) - 1, 0)+ x' = clip(x + alpha_i * delta_c * (1 + BETA * x), 0), BETA = 1.0++BETA=0 is a pure per-gene translation (preserves covariation best but loses+too much de_recovery); BETA=1 is the linearisation of the multiplicative+(1+x)*exp(alpha*delta)-1 update and keeps the mild expression-dependent gain+that DE genes need, while avoiding the full exponential amplification that+distorts gene-gene covariance. With a single input stage (or no shared types) this reduces to copy_last. """@@ -39,7 +45,9 @@ from src.task1_temporal.view_io import ( ) ALPHA = 0.4-GAMMA = 4.0+GAMMA = 6.0+MODE = "add"+BETA = 1.0 BLOCK = 1024 @@ -85,7 +93,7 @@ def _alphas(proj: np.ndarray, alpha: float, gamma: float) -> np.ndarray: return np.clip(a, 0.0, 2.0 * alpha) -def mult_shift(X, labels, deltas, alpha, gamma):+def apply_shift(X, labels, deltas, alpha, gamma, mode, beta=0.0): X = X.tocsr().astype(np.float32).copy() for t in np.unique(labels): if str(t) not in deltas:@@ -93,9 +101,15 @@ def mult_shift(X, labels, deltas, alpha, gamma): idx = np.flatnonzero(labels == t) sub = X[idx] a = _alphas(_progress(sub, deltas[str(t)]), alpha, gamma)- newvals = (sub.data.astype(np.float64) + 1.0) * np.exp(- np.clip(np.repeat(a, np.diff(sub.indptr)) * deltas[str(t)].astype(np.float64)[sub.indices], -10, 10)- ) - 1.0+ a_cell = np.repeat(a, np.diff(sub.indptr))+ d_nnz = deltas[str(t)].astype(np.float64)[sub.indices]+ if mode == "mult":+ newvals = (sub.data.astype(np.float64) + 1.0) * np.exp(np.clip(a_cell * d_nnz, -10, 10)) - 1.0+ elif beta > 0.0:+ xd = sub.data.astype(np.float64)+ newvals = xd + a_cell * d_nnz * (1.0 + beta * xd)+ else:+ newvals = sub.data.astype(np.float64) + a_cell * d_nnz np.maximum(newvals, 0.0, out=newvals) out = sub.copy() out.data = newvals.astype(np.float32)@@ -124,7 +138,7 @@ def main() -> None: labels_last = last.obs["celltype"].astype(str).to_numpy() deltas = type_deltas(prev.X, labels_prev, last.X, labels_last) if deltas:- X = mult_shift(X, labels_last[rows], deltas, ALPHA, GAMMA)+ X = apply_shift(X, labels_last[rows], deltas, ALPHA, GAMMA, MODE, BETA) write_prediction(X, genes, args.out, seed=args.seed)
调研来源?调研员查到并用到的知识条目和文献检索结果(只列标题和编号)。
用到的知识库条目
| 编号 | 标题 | 出处 |
|---|---|---|
| k018 | Damped per-type shift: shrinkage alpha on the observed delta | notes/plan/cards/T1.md |
| k041 | Within-stage pseudotime and graph toolkit offline: scanpy DPT/PAGA/Leiden, Palantir, CellRank 2 | 10.1186/s13059-019-1663-x (PAGA); 10.1038/s41587-019-0068-4 (Palantir); 10.1038/s41592-024-02303-9 (CellRank 2) |
| k031 | Offline OT toolkit in the sandbox: moscot TemporalProblem, wot OTModel, POT, geomloss | 10.1038/s41586-024-08453-2 (moscot); 10.1016/j.cell.2019.01.006 (Waddington-OT) |
分析结果?分析员写的 ANALYSIS.json:改了什么、各组分数怎么变、假设是否成立、经验和下一步建议。
| 改了什么 | 把父节点22的乘法更新 (1+x)·exp(α_i·δ)−1 换成加法带线性化增益 x'=clip(x+α_i·δ·(1+x),0)(β=1),per-cell 秩百分位调制框架不变,GAMMA 由 4 重扫为 6、ALPHA=0.4。PLAN 原定的纯加法(β=0)因 de_recovery 崩溃(A半 44.17)被弃用,实际提交的是折中变体。 |
|---|---|
| 各组分数的变化 | cell_state:噪声内:50.81→50.84(+0.03)。 covariation:噪声内偏正:47.40→47.57(+0.17),远小于 T1 约 2 分噪声,仍低于 copy_last(约48.6)约 1 分。 de_recovery:噪声内:49.12→49.12(+0.00)。Engineer 称 de_rec 回到更高档(48.18 vs 47.75)是 X3 A 半的扫描结果,榜上无变化,且其自述提交配置在 s1/s2 上 de_rec 波动到 46.09/46.9。 direction:噪声内:48.95→48.96(+0.01)。 overall:榜分 49.24→49.29(+0.05),在噪声内;耗时 3.8s→2.8s,内存不变 0.53GB。 |
| 假设是否成立 | 否 |
| 经验 |
|
| 下一步建议 |
|
对话摘要?每个角色和大模型对话的统计:轮数、工具调用、用时、token 数和最后的回答摘录;原始记录只给路径。
只给统计和最后回答的摘录;完整对话请到原始记录位置里列出的文件看。
分析员
| 角色?调研员写计划、工程师改代码、分析员解读分数、审查员检查作弊。 | 分析员 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数?大模型一共回复了几轮(每轮可以调用多个工具)。 | 4 |
| 工具调用?大模型调用读文件、执行命令等工具的次数,按工具名统计。 | 共 3 次:bash 2、write 1 |
| 用时 | 不到 1 分 |
| token 数?输入 / 输出(含思考)的 token 数,来自接口返回的用量。 | 输入 12,692 · 输出 1,201 · 思考 1,013 |
| 任务(第一行) | 分析节点 n24 的打分结果,写 ANALYSIS.json |
| 最后的回答(摘录) | ANALYSIS.json written |
| 原始记录位置?完整对话记录在 Spark 上的文件路径;看板不复制原始内容。 | /home/spark-longxinyang/vec/runs/formal/20261002-135403-search-t1-x3-era-mechcheck/nodes/24/analyst.jsonl 8 KB /home/spark-longxinyang/vec/runs/formal/20261002-135403-search-t1-x3-era-mechcheck/nodes/24/analyst.stderr |
工程师
| 角色 | 工程师 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数 | 19 |
| 工具调用 | 共 24 次:bash 16、edit 4、write 3、read 1 |
| 用时 | 14 分 |
| token 数 | 输入 45,475 · 输出 9,198 · 思考 7,123 |
| 任务(第一行) | 按计划修改程序:Per-cell progress-modulated additive shift: preserving within-type covariance |
| 最后的回答(摘录) | **节点 24 完成。** - **做了什么**:按 PLAN 把父节点 22 的乘法位移换成加法位移并扫描。纯加法(β=0)在 X3 上 de_recovery 崩到 44.17(PLAN 风险 1 成真),改用线性化增益 `x' = clip(x + alpha_i·delta·(1+x), 0)`(β=1)完全修复:de_rec 回到 48.18(比父高一档)、covar +0.17。GAMMA 在 β=1 支上重扫,最优 γ=6(父乘法支为 4)。 - **查分结果**(X3 A 半):提交配置 seed 0/1/2 = 48.968 / 49.303 / 49.544(均值 49.271),对父节点 48.815 / 49.142 / 49.490(均值 49.149)三种子配对全正,但幅度 +0.12 远小于噪声;de_rec 骑在档位边缘(α=0.45 即掉档),B 半有回落风险。vec-check 通过、seed 0 复跑逐位确定、纯 CPU ~4s。 - **下一步最值得试**:① de_recovery 是分档指标且档位边界随 seed 移动——按 dt 缩放 α/β 使 final 视图(delta 大 4 倍)不落出 48.18 档;② 把 β=1 线性化增益嫁接到树上最强的 Top-K EB 家族(节点 17,covar 49.76),有望同时抬 de_rec 与 covar;③ 调制用于抽样权重(未试)。 |
| 原始记录位置 | /home/spark-longxinyang/vec/runs/formal/20261002-135403-search-t1-x3-era-mechcheck/nodes/24/engineer.jsonl 102 KB /home/spark-longxinyang/vec/runs/formal/20261002-135403-search-t1-x3-era-mechcheck/nodes/24/engineer.stderr |
调研员
| 角色 | 调研员 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数 | 1 |
| 工具调用 | 共 0 次:— |
| 用时 | 2 分 |
| token 数 | 输入 14,622 · 输出 1,001 · 思考 4,665 |
| 任务(第一行) | 为节点 n24(改进,父节点 n22)写改进计划 PLAN.json |
| 最后的回答(摘录) | {2, 3, 4, 6}, ALPHA ∈ {0.3, 0.4, 0.5}; primary selection criterion = board score, secondary = covariation ≥ 48.0. Expect GAMMA=4 ALPHA=0.4 as starting point. 5) If additive+GAMMA4 recovers covariation to ≥48.5 while keeping cell_state ≥50, submit. If covariation still <48, try a 'soft additive' variant: x'_g = x_g + alpha_i·delta_g·w_g where w_g = δ_g²/(δ_g²+σ²) is a mild per-gene EB shrinkage weight (σ² = median of δ², no external data), which down-weights noisy genes without the hard Top-K cutoff. 6) Single-input fallback: copy_last (identical to parent). Proxy2: delta from E8.5 vs Qiu E9.0; genes missing in Qiu have delta=0 → no shift. Final: delta from E8.5→E9.5 (larger δ); additive form scales linearly (more conservative than exp), no special handling needed. 7) Runtime: additive shift is cheaper than multiplicative (no exp), expect <2 s. Use vec-score on seed 0 first; if board ≥ 49.0, confirm with seeds 1,2.",
"expected_groups": ["covariation", "cell_state"],
"risks": "1) Additive shift may underperform multiplicative on cell_state because it lacks the (1+x) amplification that makes high-expression genes move more; if cell_state drops >1.5 points vs node 22, try a compromise: x' = x + alpha_i·delta_g·(1+beta·x_g) with beta∈{0.1,0.3} (mild expression-dependent gain without full multiplicative distortion). Detect early by checking cell_state in the first seed-0 scan. 2) The rank-1 covariance addition delta·delta^T·var(alpha) from per-cell modulation could still slightly perturb covariation; if covariation < 48, reduce GAMMA to 2 (less var(alpha)). 3) Clipping at 0 for genes near zero introduces mild nonlinearity; if >10% of shifted values are clipped, consider allowing small negatives (floor at −0.1) as a variant. 4) Full delta (no Top-K) may let noisy genes add covariation noise; the soft EB weight w_g addresses this if needed. 5) Score differences <2 points are within noise; require consistent direction across seeds 0/1/2 before concluding improvement."
} |
| 原始记录位置 | /home/spark-longxinyang/vec/runs/formal/20261002-135403-search-t1-x3-era-mechcheck/nodes/24/researcher.jsonl 4 KB /home/spark-longxinyang/vec/runs/formal/20261002-135403-search-t1-x3-era-mechcheck/nodes/24/researcher.stderr |
审查员
| 角色 | 审查员 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数 | 6 |
| 工具调用 | 共 9 次:read 6、bash 2、write 1 |
| 用时 | 1 分 |
| token 数 | 输入 20,434 · 输出 1,207 · 思考 2,962 |
| 任务(第一行) | 审查节点 n24 的程序是否越界读取、写死目标、钻评分器漏洞 |
| 最后的回答(摘录) | REVIEW.json written |
| 原始记录位置 | /home/spark-longxinyang/vec/runs/formal/20261002-135403-search-t1-x3-era-mechcheck/nodes/24/reviewer.jsonl 77 KB /home/spark-longxinyang/vec/runs/formal/20261002-135403-search-t1-x3-era-mechcheck/nodes/24/reviewer.stderr |