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

总览 · ← 返回运行 20261002-034201-search-t1-abc-r1-A-era

节点 n17

解剖域先验组成重加权(心脏域×1.6/边缘域×0.25/神经营×0)×细胞层增殖轴 exp(-0.7·z),E-S 无放回加权抽样最新官方阶段细胞,表达原样复制;≥2 官方阶段时叠加收缩的 logit 比例趋势因子(λ=0.5,clip[0.5,2])。

运行?一次完整的自动搜索或 Agent 会话,有自己的锁定配置和证据包。20261002-034201-search-t1-abc-r1-A-era
父节点(种子,没有父节点)
子节点—
操作?种子:人写的起点;改进:在父节点上改;草稿:从头写;修复:修父节点的报错。草稿
状态已打分
分数搜索目标分 54.38 · proxy 56.57 · proxy2 56.57 · X3 50.00
审查未审查
用时?从运行开始到结束(或到现在)的挂钟时间。16 分
程序版本0b36de6683c433c83c30dade0a5ef2c0e8782940 (programs.git)

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

来自 programs.git 0b36de6683:solution/METHOD.md

解剖域先验组成重加权(心脏域×1.6/边缘域×0.25/神经营×0)×细胞层增殖轴 exp(-0.7·z),E-S 无放回加权抽样最新官方阶段细胞,表达原样复制;≥2 官方阶段时叠加收缩的 logit 比例趋势因子(λ=0.5,clip[0.5,2])。

方法

  • 基底:最新官方输入阶段(inputs_by_time(include_external=False)),外部输入阶段永不作基底。表达不改,只改哪些细胞被保留。
  • 每细胞权重 w = ANAT[type] * exp(-0.7 * z_prolif(cell)) [* TREND[type]]:
    • z_prolif:30 个经典细胞周期基因(Mki67、Top2a、Mcm2-7、Ccnb1/2、Cdk1 等,通用基因功能知识)逐基因 z 分(clip ±3)后按细胞取均值。
    • ANAT:心脏域类型 ×1.6,边缘域(Surface Ectoderm、EXEM、Paraxial Mesoderm)×0.25,Neural Tube ×0。类型集合直接 import 自组委会打包的 src.task1_temporal.reweight(HEART_TYPES/EDGE_TYPES,含本地备份)。生物学依据:心脏为中心取材下心脏域/心内膜/心包域随时间增长、表面外胚层与轴旁中胚层、神经营组织离开取样——这是打包模块文档中陈述的一般小鼠胚胎学(谱系/取材域知识),非保留阶段实测统计量。
    • TREND:仅当 ≥2 个官方阶段且时间不同、celltype 标签可配对时启用。类型比例加伪计数 1e-3,logit r=ln(p/(1-p)),Δr clip ±2,r_tgt = r_last + γ·0.5·Δr,γ=clip(Δt_target/Δt_obs,0,1);p_tgt 地板 0.5% 归一后转为因子 p_tgt/p_obs,clip [0.5,2]。proxy/proxy2 只有一个官方阶段,不启用;X3(两个 Qiu 阶段)与 final(E8.5+E9.5)启用。
  • 抽样:权重地板 0.08×中位正权重,Efraimidis–Spirakis 无放回加权抽样(池不足时有放回补足)到 target_n_cells。np.random.default_rng(seed),确定性。

查分结果(A 半,seed 0)

  • proxy:56.62(cell_state 58.51 / covariation 54.05 / de_recovery 52.48 / direction 60.53)
  • proxy2:56.62(输出与 proxy 逐字节相同:回落分支只用官方 E8.5)
  • X3:50.0(该尺子上所有已知节点均 50.0,趋势分支不改变这一饱和值,未造成损失)

实测否定(本节点内)

  • 代谢轴(OXPHOS−糖酵解,细胞层或类型层,α_m=1.2,多种 z 化方式):一致有害,43.5–51.5,全部移除。与节点 12 声称的 α_m=1.2 有益不符——差异可能在其 z 化/基因表细节,未能在本节点复现。
  • 类型层增殖(跨类型再 z 分,α_p=0.55)+代谢:43.8,有害。
  • 均匀 copy_last(同一 E-S 抽样器):48.27。
  • 心脏域权重消融:仅解剖域(无增殖)55.52;heart 2.2→56.10;α_p=0.4→56.43;edge 0.1→56.61;均与默认 56.62 在 ±2 噪声内,保留打包模块的默认 1.6/0.25。

验证过 / 未验证

  • 验证过:三个视图都跑通、vec-check 通过、proxy/proxy2/X3 查分如上;final 视图代码路径(两官方阶段→趋势分支)与 X3 相同,X3 上运行成功。
  • 未验证:趋势分支的收益(proxy 单阶段无法检验;X3 尺子饱和;proxy2 的第二输入是外部数据、标签不同,不触发官方趋势)。λ、γ、trend clip 只在 X3 上跑通,没有在能分辨分数的尺子上验证。final 视图上 ANAT 先验是否与 E9.5→E10.5 的取材变化一致未验证(打包模块声称同一规则适用于任一阶段)。

合规

  • 只读视图内数据;未读任何保留阶段/禁窗数据;uns.celltype_palette 未使用。
  • 硬编码内容仅为:细胞周期基因表(通用功能注释)、HEART/EDGE/DROP 类型集合(来自组委会打包模块 reweight.py 的一般谱系/取材域知识)、常数超参。所有比例、z 分、趋势均从 manifest 输入现场计算。

调研员的计划

名称组成趋势外推+取样偏差校正:logit比例外推按新比例重采样(单阶段回落T1-01权重)
动机当前最佳(节点9/12/14,rank3 55.56–55.58)全部是'最新官方阶段copy_last+按当前状态打分改抽样权重',没有任何节点利用两个输入阶段之间的类型比例变化趋势;节点11失败的是'细胞层分化轴'与'多阶段池化',而非'以显式类型比例目标驱动重采样',机制不同故可试。最弱分组为 covariation(节点12/14 仅53.81)与 de_recovery(52.78),而方向书指定主攻 cell_state(55.86–56.66):把组成从'当前快照的静态加权'改为'沿E8.5→最新官方阶段的实测组成趋势外推',直接改写各类型的目标频率,理论上比按增殖/代谢代理信号更贴近真实组成。proxy 只有一个输入阶段无法拟合趋势,只能验证回落分支(预期复现节点12的 proxy≈57.88);proxy2(E8.5+Qiu E9.0)与 final(E8.5+E9.5)有两个阶段,是趋势分支的主要得分来源。
做法1) 基座与回落(先做,占时间前1/3):复制节点12/14的 run.py 逻辑——类型层增殖 z 分(α_p=0.55)×细胞层代谢轴 OXPHOS−糖酵解(α_m=1.2),Efraimidis–Spirakis 加权无放回抽样最新官方阶段细胞,表达原样复制,W_FLOOR=0.08,外部输入阶段永不作基底。仅当 view_io.inputs_by_time 返回的官方阶段数==1 或两个官方阶段时间相同 时走此分支。先用 vec-score 在 proxy 上确认回落分数≈节点12的 A 半分数(±2分噪声内)再继续,否则先修基座。2) 趋势分支(两个官方阶段可用时):a. 用 celltype 列统计两个官方阶段的类型比例 p_t^(1), p_t^(2),加伪计数 ε=1e-3 后归一;以全部类型比例均值为参考类,计算 log-ratio r_t=ln(p_t/(1−p_t)),得 Δr_t=r_t^(2)−r_t^(1)。b. 取样偏差校正:先验字典(仅来自方向书 notes/competition/05_lineage_graph.md 与 09_t1_census_lineage.md §2 及通用谱系知识,不使用任何禁窗阶段信息)标注各类型所属组织域(如 neural tube/神经外胚层域、侧板中胚层-心脏域、轴旁中胚层域等)。若类型在阶段2占比低于阈值 θ(初值0.002,搜索[0.001,0.01])且先验上其来源组织域不在阶段2取材范围内,则判定为取样缺失而非真实消失,将其 Δr_t 截断为 ≥0(不允许趋势说它减少),并把它在目标组成中的份额按其余类型重归一后的比例回填。该机制保持组织无关:只比较'份额崩塌+先验不在取材域',不用任何阶段实测表达。c. 收缩外推:Δr_t^shrunk=λ·Δr_t,λ 初值0.5,搜索{0.3,0.5,0.7,1.0};外推步长 γ=clamp(Δt_target/Δt_obs, 0, 1),其中 Δt 用输入阶段自带时间(E8.5=8.5 等),无时间元数据则 γ=0.5;若最新官方阶段时间==目标时间(即趋势已覆盖到目标),γ=0,趋势分支退化为按阶段2实测比例重采样。d. 目标比例 p_t^tgt=softmax(r_t^(2)+γ·Δr_t^shrunk),夹地板 0.5%后重归一;类型数>50 或缺 celltype 列时退化为细胞层回落分支。3) 按目标比例重采样:输出细胞数=最新官方阶段细胞数 n_out;每细胞权重 w_i=(p_tgt(type_i)/p_obs(type_i))·exp(−α_p·z_prolif(type))(回落分支则再乘代谢轴,趋势分支不再叠加代谢轴以免与组成目标冲突),用带放回的按权重抽样(允许扩增型被重复抽取),抽样前按 W_FLOOR 截断。缺…
风险1) proxy/X3 上看不到趋势收益:proxy 单阶段必然回落,X3 可能因 n_out==池大小退化为恒等(既有节点均 50.00);Engineer 应接受 proxy≈57.9、X3≈50.0,只看 proxy2 是否≥+2分,否则该方向判负。2) proxy2 提升可能被 1/3 权重稀释后淹没在2分噪声里:若 proxy2 +3 而 proxy 持平,节点分仅+1,需用 proxy2 上2次重复查分(A半)确认方向一致再提交。3) 趋势分支反而低于回落(Qiu 心脏域太窄,外推把非心脏类型错误压低):用 θ=0 与 λ=0 两个消融点检查,若消融即回升则关闭趋势分支、提交回落配置(至少不劣于节点14)。4) 先验字典错标取材域导致过度校正:先验只含方向书已列条目,且校正只允许'不减少'单向截断,风险有界;若 proxy2 上 θ 从0.002 提到0.01 分数单调下降,取更小 θ 或关闭。5) 与节点11'多官方阶段池化'混淆:本方案不把两阶段细胞混合成池,仅用两阶段比例差作为标量趋势信号,实现时严禁拼接两阶段表达矩阵。6) 时间超支:30分钟内若趋势分支未跑通,直接提交已验证的回落分支(等价节点12/14),不留半成品。

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

对比:这个提交的上一版(种子程序:相对空仓库)。改动的文件:solution/METHOD.md +33 −0、solution/run.py +199 −0

diff --git a/solution/METHOD.md b/solution/METHOD.mdnew file mode 100644index 0000000..6ed830a--- /dev/null+++ b/solution/METHOD.md@@ -0,0 +1,33 @@+解剖域先验组成重加权(心脏域×1.6/边缘域×0.25/神经营×0)×细胞层增殖轴 exp(-0.7·z),E-S 无放回加权抽样最新官方阶段细胞,表达原样复制;≥2 官方阶段时叠加收缩的 logit 比例趋势因子(λ=0.5,clip[0.5,2])。++## 方法++- 基底:最新**官方**输入阶段(`inputs_by_time(include_external=False)`),外部输入阶段永不作基底。表达不改,只改哪些细胞被保留。+- 每细胞权重 `w = ANAT[type] * exp(-0.7 * z_prolif(cell)) [* TREND[type]]`:+  - `z_prolif`:30 个经典细胞周期基因(Mki67、Top2a、Mcm2-7、Ccnb1/2、Cdk1 等,通用基因功能知识)逐基因 z 分(clip ±3)后按细胞取均值。+  - `ANAT`:心脏域类型 ×1.6,边缘域(Surface Ectoderm、EXEM、Paraxial Mesoderm)×0.25,Neural Tube ×0。类型集合直接 import 自组委会打包的 `src.task1_temporal.reweight`(HEART_TYPES/EDGE_TYPES,含本地备份)。生物学依据:心脏为中心取材下心脏域/心内膜/心包域随时间增长、表面外胚层与轴旁中胚层、神经营组织离开取样——这是打包模块文档中陈述的一般小鼠胚胎学(谱系/取材域知识),非保留阶段实测统计量。+  - `TREND`:仅当 ≥2 个官方阶段且时间不同、celltype 标签可配对时启用。类型比例加伪计数 1e-3,logit r=ln(p/(1-p)),Δr clip ±2,`r_tgt = r_last + γ·0.5·Δr`,γ=clip(Δt_target/Δt_obs,0,1);p_tgt 地板 0.5% 归一后转为因子 p_tgt/p_obs,clip [0.5,2]。proxy/proxy2 只有一个官方阶段,不启用;X3(两个 Qiu 阶段)与 final(E8.5+E9.5)启用。+- 抽样:权重地板 0.08×中位正权重,Efraimidis–Spirakis 无放回加权抽样(池不足时有放回补足)到 `target_n_cells`。`np.random.default_rng(seed)`,确定性。++## 查分结果(A 半,seed 0)++- proxy:56.62(cell_state 58.51 / covariation 54.05 / de_recovery 52.48 / direction 60.53)+- proxy2:56.62(输出与 proxy 逐字节相同:回落分支只用官方 E8.5)+- X3:50.0(该尺子上所有已知节点均 50.0,趋势分支不改变这一饱和值,未造成损失)++## 实测否定(本节点内)++- 代谢轴(OXPHOS−糖酵解,细胞层或类型层,α_m=1.2,多种 z 化方式):一致有害,43.5–51.5,全部移除。与节点 12 声称的 α_m=1.2 有益不符——差异可能在其 z 化/基因表细节,未能在本节点复现。+- 类型层增殖(跨类型再 z 分,α_p=0.55)+代谢:43.8,有害。+- 均匀 copy_last(同一 E-S 抽样器):48.27。+- 心脏域权重消融:仅解剖域(无增殖)55.52;heart 2.2→56.10;α_p=0.4→56.43;edge 0.1→56.61;均与默认 56.62 在 ±2 噪声内,保留打包模块的默认 1.6/0.25。++## 验证过 / 未验证++- 验证过:三个视图都跑通、vec-check 通过、proxy/proxy2/X3 查分如上;final 视图代码路径(两官方阶段→趋势分支)与 X3 相同,X3 上运行成功。+- 未验证:趋势分支的收益(proxy 单阶段无法检验;X3 尺子饱和;proxy2 的第二输入是外部数据、标签不同,不触发官方趋势)。λ、γ、trend clip 只在 X3 上跑通,没有在能分辨分数的尺子上验证。final 视图上 ANAT 先验是否与 E9.5→E10.5 的取材变化一致未验证(打包模块声称同一规则适用于任一阶段)。++## 合规++- 只读视图内数据;未读任何保留阶段/禁窗数据;`uns.celltype_palette` 未使用。+- 硬编码内容仅为:细胞周期基因表(通用功能注释)、HEART/EDGE/DROP 类型集合(来自组委会打包模块 reweight.py 的一般谱系/取材域知识)、常数超参。所有比例、z 分、趋势均从 manifest 输入现场计算。diff --git a/solution/run.py b/solution/run.pynew file mode 100644index 0000000..b723bf2--- /dev/null+++ b/solution/run.py@@ -0,0 +1,199 @@+"""Anatomical-domain composition reweighting x cell-level proliferation, with+optional two-stage composition-trend correction.++Base pool: cells of the latest OFFICIAL input stage (external stages are never+the base). Expression is copied unchanged; only which cells are kept changes.++Per-cell weight:+    w_i = ANAT[type_i] * exp(-ALPHA_P * z_prolif(cell_i)) [* TREND[type_i]]+  - ANAT: anatomical-domain prior on type fractions (HEART 1.6, EDGE 0.25,+    Neural Tube 0). Source: bundled seed module src.task1_temporal.reweight+    (organizer-provided), reflecting general mouse embryology: between the+    input stages and the heart-centred target dissection, heart-field /+    endocardial / pericardial domains grow while surface-ectoderm,+    extra-embryonic mesoderm and neural-tube tissue leave the sample.+  - z_prolif: per-cell mean of per-gene z-scored (clip +-3) expression of 30+    canonical cell-cycle genes (general gene-function knowledge), so strongly+    cycling cells are down-weighted.+  - TREND (only when >=2 official stages with different times and a shared+    celltype column): per-type logit proportions are extrapolated from stage+    k-1 -> k toward the target time with shrinkage LAM and step+    gamma = clip(dt_target/dt_obs, 0, 1); target proportions are floored at+    P_FLOOR and converted to a multiplicative factor p_tgt/p_obs clipped to+    [0.5, 2]. Inactive on proxy/proxy2 (single official stage).++Sampling: Efraimidis-Spirakis weighted without replacement (with-replacement+top-up if the pool is smaller than the requested count), weight floor+W_FLOOR * median(w) to keep every type represented. Deterministic under+--seed via np.random.default_rng(seed).+"""++from __future__ import annotations++import argparse+from pathlib import Path++import numpy as np++from src.task1_temporal import view_io++try:  # organizer-bundled anatomical prior+    from src.task1_temporal.reweight import HEART_TYPES, EDGE_TYPES+except Exception:  # local copy of the same constants+    HEART_TYPES = {+        "OFT/RV-CM", "IFT-CM", "AVC-CM", "SV-CM", "LV-CM", "RV-CM", "V-CM",+        "Endothelium", "Endocardium", "BEC",+        "aSHF", "pSHF", "aPHM", "pPHM",+        "JCF", "Pericardium", "Proepicardium",+    }+    EDGE_TYPES = {"Surface Ectoderm", "EXEM", "Paraxial Mesoderm"}++DROP_TYPES = {"Neural Tube"}++ALPHA_P = 0.7       # cell-level proliferation suppression+HEART_WEIGHT = 1.6+EDGE_WEIGHT = 0.25+DROP_WEIGHT = 0.0+W_FLOOR = 0.08      # per-cell weight floor, fraction of median positive weight+LAM = 0.5           # trend shrinkage+P_FLOOR = 0.005     # target-proportion floor per type+TREND_CLIP = (0.5, 2.0)+DR_CLIP = 2.0       # cap on per-type logit trend+EPS = 1e-3          # pseudocount on proportions++PROLIF = [+    "Mki67", "Top2a", "Ccna2", "Ccnb1", "Ccnb2", "Cdk1", "Cdc20", "Pcna",+    "Mcm2", "Mcm3", "Mcm4", "Mcm5", "Mcm6", "Mcm7", "Birc5", "Aurka", "Aurkb",+    "Plk1", "Bub1", "Ttk", "Cenpf", "Cenpe", "Tyms", "Rrm2", "E2f1",+    "Ccne1", "Ccne2", "Nusap1", "Kif11", "Anln",+]+++def zscore(v: np.ndarray) -> np.ndarray:+    v = np.asarray(v, dtype=np.float64)+    s = v.std()+    if s < 1e-12:+        return np.zeros_like(v)+    return np.clip((v - v.mean()) / s, -3.0, 3.0)+++def subset_cols(genes: list[str], names: list[str]) -> np.ndarray:+    lower = {g.lower(): i for i, g in enumerate(genes)}+    cols = [lower[n.lower()] for n in names if n.lower() in lower]+    return np.array(sorted(set(cols)), dtype=np.int64)+++def cell_zmeans(X, cols: np.ndarray) -> np.ndarray:+    """Per-cell mean of per-gene z-scored (clip +-3) expression."""+    if cols.size == 0:+        return np.zeros(X.shape[0], dtype=np.float64)+    D = np.asarray(X[:, cols].todense(), dtype=np.float64)+    mu = D.mean(axis=0)+    sd = D.std(axis=0)+    sd[sd < 1e-12] = 1.0+    return np.clip((D - mu) / sd, -3.0, 3.0).mean(axis=1)+++def es_sample(w: np.ndarray, n: int, rng: np.random.Generator) -> np.ndarray:+    """Efraimidis-Spirakis weighted sampling; with-replacement top-up if n > pool."""+    pool = len(w)+    w = np.maximum(w, 0.0)+    if w.sum() <= 0:+        w = np.ones(pool)+    if n <= pool:+        keys = rng.random(pool) ** (1.0 / w)+        return np.argsort(-keys)[:n]+    keys = rng.random(pool) ** (1.0 / w)+    order = np.argsort(-keys)[:pool]+    extra = rng.choice(pool, size=n - pool, replace=True, p=w / w.sum())+    return np.concatenate([order, extra])+++def type_props(labels: np.ndarray, types: list[str]) -> np.ndarray:+    p = np.array([(labels == t).sum() for t in types], dtype=np.float64) + EPS+    return p / p.sum()+++def anat_weight(labels: np.ndarray) -> np.ndarray:+    w = np.ones(len(labels))+    for i, t in enumerate(labels):+        if t in DROP_TYPES:+            w[i] = DROP_WEIGHT+        elif t in EDGE_TYPES:+            w[i] = EDGE_WEIGHT+        elif t in HEART_TYPES:+            w[i] = HEART_WEIGHT+    return w+++def trend_factor(view, manifest, official, genes, labels, types) -> np.ndarray | None:+    """Multiplicative per-cell factor from two-stage type-proportion trend."""+    if len(official) < 2 or len(types) <= 1:+        return None+    prev_entry, last_entry = official[-2], official[-1]+    dt_obs = float(last_entry["time"] - prev_entry["time"])+    if dt_obs <= 0:+        return None+    try:+        prev = view_io.read_stage(view, prev_entry, genes, missing="error")+    except Exception:+        return None+    if "celltype" not in prev.obs.columns:+        return None+    prev_labels = view_io.labels_of(prev)+    p1 = type_props(prev_labels, types)+    p2 = type_props(labels, types)+    r1 = np.log(p1 / (1.0 - p1))+    r2 = np.log(p2 / (1.0 - p2))+    dr = np.clip(r2 - r1, -DR_CLIP, DR_CLIP)+    dt_tgt = float(manifest["target"]["time"] - last_entry["time"])+    gamma = float(np.clip(dt_tgt / dt_obs, 0.0, 1.0))+    r_tgt = r2 + gamma * LAM * dr+    e = np.exp(r_tgt - r_tgt.max())+    p_tgt = e / e.sum()+    p_tgt = np.maximum(p_tgt, P_FLOOR)+    p_tgt /= p_tgt.sum()+    f = np.clip(p_tgt / p2, *TREND_CLIP)+    t_of = {t: i for i, t in enumerate(types)}+    return f[[t_of[t] for t in labels]]+++def main() -> None:+    ap = argparse.ArgumentParser()+    ap.add_argument("--data", required=True)+    ap.add_argument("--out", required=True)+    ap.add_argument("--seed", type=int, default=0)+    args = ap.parse_args()++    view = Path(args.data)+    manifest = view_io.load_manifest(view)+    genes = view_io.panel_genes(view, manifest)+    rng = np.random.default_rng(args.seed)++    official = view_io.inputs_by_time(manifest, include_external=False)+    if not official:+        official = view_io.inputs_by_time(manifest)+    last = view_io.read_stage(view, official[-1], genes, missing="error")+    X = last.X+    n_out = view_io.target_n_cells(manifest, X.shape[0])++    has_labels = "celltype" in last.obs.columns+    labels = view_io.labels_of(last) if has_labels else np.array(["cell"] * X.shape[0])+    types = sorted(set(labels.tolist()))++    w = anat_weight(labels)+    w = w * np.exp(-ALPHA_P * cell_zmeans(X, subset_cols(genes, PROLIF)))++    tf = trend_factor(view, manifest, official, genes, labels, types)+    if tf is not None:+        w = w * tf++    pos = w[w > 0]+    floor = W_FLOOR * np.median(pos) if pos.size else 0.0+    w = np.maximum(w, floor)+    idx = np.sort(es_sample(w, n_out, rng))+    view_io.write_prediction(X[idx], genes, args.out, seed=args.seed)+++if __name__ == "__main__":+    main()

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

用到的知识库条目

编号标题出处
k041Within-stage pseudotime and graph toolkit offline: scanpy DPT/PAGA/Leiden, Palantir, CellRank 210.1186/s13059-019-1663-x (PAGA); 10.1038/s41587-019-0068-4 (Palantir); 10.1038/s41592-024-02303-9 (CellRank 2)
k004Our OT recipe on the released T1 stages (census)notes/competition/09_t1_census_lineage.md
k031Offline OT toolkit in the sandbox: moscot TemporalProblem, wot OTModel, POT, geomloss10.1038/s41586-024-08453-2 (moscot); 10.1016/j.cell.2019.01.006 (Waddington-OT)

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

改了什么从零新建 solution/run.py + METHOD.md:以最新官方输入阶段为基底,每细胞权重 w = ANAT[type]·exp(-0.7·z_prolif)(心脏域×1.6 / 边缘域 Surface Ectoderm+EXEM+Paraxial Mesoderm×0.25 / Neural Tube×0,类型集合 import 自组委会打包的 src.task1_temporal.reweight),E-S 无放回加权抽样 n_out 个细胞、表达原样复制;另实现了 ≥2 官方阶段时的收缩 logit 比例趋势因子(λ=0.5,Δr clip±2,因子 clip[0.5,2]),但它在 proxy/proxy2 上不触发、在 X3 上被尺子饱和掩盖。计划中的代谢轴(OXPHOS−糖酵解 α_m=1.2)与类型层增殖(α_p=0.55)经实测有害被弃用。
各组分数的变化X3:50.00 vs 40.53,+9.47;50.00 是该尺子上所有已知节点的饱和值,趋势分支在此既无收益也无损失,无法用于验证。
board:变好(但对照是 best_seed 节点1,非当前最佳):54.38 vs 39.34,+15.04;仍低于 PLAN 里记录的节点9/12/14 rank3 55.56–55.58,即未刷新最佳。
cell_state:变好(对种子):54.93 vs 32.67,+22.26;但低于 PLAN 记录的先前最佳区间 55.86–56.66,即相对节点12/14 略退。
cost:耗时 1.3s(对照 1.9s)、内存峰值 1.26GB(对照 1.48GB),均更省。
covariation:变好(对种子):53.40 vs 22.56,+30.84;与节点12/14 的 53.81 差 −0.41,在 2 分噪声内,仍是最弱分组之一。
de_recovery:噪声边缘:52.04 vs 49.13,+2.91(T1 噪声约 2 分,勉强超噪声但幅度很小);低于节点12/14 的 52.78。
direction:变好(对种子):56.84 vs 50.96,+5.88。
proxy:56.57 vs 50.04,+6.53;与 PLAN 预期复现节点12 的 proxy≈57.88 差 −1.31,在噪声内,回落基座成立。
proxy2:56.57 vs 27.43,+29.14;但与本节点 proxy 完全同值(56.5678 逐字节相同输出),说明趋势分支根本没跑,这 +29.14 全部来自回落基座而非方案主打的趋势外推。
假设是否成立unclear
经验
  1. PLAN 的关键前提被证伪:proxy2 的第二个输入阶段是外部数据,inputs_by_time(include_external=False) 只剩 1 个官方阶段,趋势分支不触发,proxy 与 proxy2 输出逐字节相同(56.5678)——设计多阶段机制前必须先核对每个尺子的官方阶段数,不能把外部阶段当趋势的第二个点。
  2. X3 尺子对所有节点恒为 50.00(饱和),任何新机制在 X3 上只能证明'没破坏',不能证明'有收益';本节点的趋势分支因此在全部三个本地尺子上都未被评分验证,属于未测试代码上线到 final。
  3. 代谢轴 OXPHOS−糖酵解(α_m=1.2)在本节点多种 z 化实现下一致有害(proxy 43.5–51.5),与节点12 声称的 57.88 收益矛盾;跨节点复用'有益打分轴'必须拿到确切基因表与 z 化/归一方式,只有结论数字不可复现。
  4. 同一增殖信号在类型层聚合(跨类型再 z 分,α_p=0.55)得 43.8,明显差于细胞层逐细胞 z 分(α_p=0.7)得 56.62——组成先验与细胞级信号不要混在同一层做标准化。
  5. 解剖域先验(心脏域×1.6/边缘×0.25/Neural Tube×0,来自组委会打包 reweight.py)是本节点收益主体:仅 ANAT 无增殖 55.52 → 叠加细胞层增殖 56.62;均匀 copy_last 同一抽样器只有 48.27,说明组成重加权相对均匀基线约 +8。
  6. ANAT 标量粗调已进入平台期:heart 1.6→2.2 得 56.10、α_p 0.7→0.4 得 56.43、edge 0.25→0.1 得 56.61,全部与默认 56.62 在 ±2 噪声内,继续调这三个标量无期望收益。
  7. Engineer 的自述与变化量表一致(proxy=proxy2=56.62、X3=50.0、代谢轴有害),无冲突;但它给出的榜侧语境需补充:本节点 54.38 未超过已知最佳 55.56。
下一步建议
  1. 针对 covariation(53.40,最弱组):停止粗调 ANAT/α_p 标量(已在噪声平台),改做心脏域内部差异化权重——把 HEART_TYPES 拆成 CM 亚型(OFT/RV-CM、AVC-CM、LV-CM 等)、心内膜/内皮(Endocardium、BEC、Endothelium)、心外膜前体(JCF、Pericardium、Proepicardium)、SHF/PHM 四组,每组单独试 ×1.2/×1.6/×2.2,一次只改一组,A 半重复 2 次要求同向且 ≥2 分才保留。
  2. 针对趋势分支(影响 final 的 cell_state/covariation):先解决'无法本地验证'再谈调参——用 view_io 构造/挑选一个含两个官方阶段且时间不同的本地视图(或临时把 final 视图当查分视图),在该视图上做 λ∈{0, 0.5} 与 trend clip∈{[0.8,1.25], [0.5,2]} 的消融;若无法构造,则至少在提交前把 λ 设为 0(等价关闭趋势)以消除未验证代码的风险,只保留已验证的 ANAT×增殖基座。
  3. 针对 de_recovery(52.04,仅比种子高 2.91、低于节点12/14 的 52.78):先取节点12 的 run.py 原文对齐其代谢轴构造(基因表、z 化对象是细胞还是类型、是否 clip),在 proxy 上复现 57.88±2;复现成功后再以小强度 α_m∈{0.3, 0.6} 叠加到当前 ANAT×细胞层增殖基座上,复现失败则判定代谢轴方向关闭,转而试 DE 相关的类型层先验(如按类型在 E8.5→目标间是否属于新增谱系给 0/1 权重)。

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

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

分析员

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

工程师

角色工程师 alibaba-token-plan-cn/qwen3.8-max
调用次数1 次
轮数30
工具调用共 32 次:bash 25、edit 4、write 3
用时12 分
token 数输入 63,984 · 输出 14,173 · 思考 13,864
任务(第一行)按计划修改程序:组成趋势外推+取样偏差校正:logit比例外推按新比例重采样(单阶段回落T1-01权重)
最后的回答(摘录)
完成。总结:

**做了什么**:draft 节点,从零实现"解剖域先验组成重加权 × 细胞层增殖轴"——以最新官方输入阶段为基底,`w = ANAT[type]·exp(-0.7·z_prolif)`(心脏域×1.6 / 边缘域×0.25 / Neural Tube×0,类型集合 import 自组委会打包的 `reweight.py`),E-S 无放回加权抽样,表达原样复制;≥2 官方阶段时叠加收缩 logit 比例趋势因子(X3/final 生效,proxy/proxy2 回落)。

**查分**(A 半,用 8/20 次):proxy 56.62、proxy2 56.62(输出与 proxy 逐字节相同)、X3 50.0(尺子饱和,无损)。三视图 vec-check 通过、确定性验证通过。实测否定:代谢轴(OXPHOS−糖酵解,任何 z 化方式)一致有害(43.5–51.5),无法复现节点 12 的 α_m=1.2 收益;类型层再 z 分增殖也差于细胞层。

**下一步最值得试**:1) 在 K(56.6)基础上做心脏域权重细调(分类型权重,如 JCF/Pericardium/CM 亚型差异化),covariation 54.05 是最弱组;2) 弄清节点 12 代谢轴的确切构造(其 57.88 与本节点实测矛盾,差异在实现细节);3) 趋势分支需要在能分辨分数的尺子上验证,目前只是无害。
原始记录位置/home/spark-longxinyang/vec/runs/formal/20261002-034201-search-t1-abc-r1-A-era/nodes/17/engineer.jsonl 154 KB
/home/spark-longxinyang/vec/runs/formal/20261002-034201-search-t1-abc-r1-A-era/nodes/17/engineer.stderr

调研员

角色调研员 alibaba-token-plan-cn/qwen3.8-max
调用次数1 次
轮数1
工具调用共 0 次:—
用时2 分
token 数输入 9,755 · 输出 1,634 · 思考 2,709
任务(第一行)为节点 n17(草稿,父节点 nNone)写改进计划 PLAN.json,思路 T1-03
最后的回答(摘录)
idis–Spirakis 加权无放回抽样最新官方阶段细胞,表达原样复制,W_FLOOR=0.08,外部输入阶段永不作基底。仅当 view_io.inputs_by_time 返回的官方阶段数==1 或两个官方阶段时间相同 时走此分支。先用 vec-score 在 proxy 上确认回落分数≈节点12的 A 半分数(±2分噪声内)再继续,否则先修基座。2) 趋势分支(两个官方阶段可用时):a. 用 celltype 列统计两个官方阶段的类型比例 p_t^(1), p_t^(2),加伪计数 ε=1e-3 后归一;以全部类型比例均值为参考类,计算 log-ratio r_t=ln(p_t/(1−p_t)),得 Δr_t=r_t^(2)−r_t^(1)。b. 取样偏差校正:先验字典(仅来自方向书 notes/competition/05_lineage_graph.md 与 09_t1_census_lineage.md §2 及通用谱系知识,不使用任何禁窗阶段信息)标注各类型所属组织域(如 neural tube/神经外胚层域、侧板中胚层-心脏域、轴旁中胚层域等)。若类型在阶段2占比低于阈值 θ(初值0.002,搜索[0.001,0.01])且先验上其来源组织域不在阶段2取材范围内,则判定为取样缺失而非真实消失,将其 Δr_t 截断为 ≥0(不允许趋势说它减少),并把它在目标组成中的份额按其余类型重归一后的比例回填。该机制保持组织无关:只比较'份额崩塌+先验不在取材域',不用任何阶段实测表达。c. 收缩外推:Δr_t^shrunk=λ·Δr_t,λ 初值0.5,搜索{0.3,0.5,0.7,1.0};外推步长 γ=clamp(Δt_target/Δt_obs, 0, 1),其中 Δt 用输入阶段自带时间(E8.5=8.5 等),无时间元数据则 γ=0.5;若最新官方阶段时间==目标时间(即趋势已覆盖到目标),γ=0,趋势分支退化为按阶段2实测比例重采样。d. 目标比例 p_t^tgt=softmax(r_t^(2)+γ·Δr_t^shrunk),夹地板 0.5%后重归一;类型数>50 或缺 celltype 列时退化为细胞层回落分支。3) 按目标比例重采样:输出细胞数=最新官方阶段细胞数 n_out;每细胞权重 w_i=(p_tgt(type_i)/p_obs(type_i))·exp(−α_p·z_prolif(type))(回落分支则再乘代谢轴,趋势分支不再叠加代谢轴以免与组成目标冲突),用带放回的按权重抽样(允许扩增型被重复抽取),抽样前按 W_FLOOR 截断。缺失基因:趋势只用类型计数与 celltype 列,与基因覆盖无关;proxy2 中 Qiu 仅 27,883 基因由 view_io 默认 E8.5 均值补齐,不影响组成统计。4) 查分顺序(≤20 次):先 proxy 验证回落(1–2次)→ 默认参数在 proxy2 上查趋势分支(1–2次)→ 仅当 proxy2 提升≥2分时在 proxy2 上做小网格(λ×θ 约6–8次)→ 最终配置在 proxy+proxy2 各复测1次确认超噪声。30分钟时限:步骤1+2为必做,步骤3网格为尽力而为;不做 GPU、不做伪时间。",
  "expected_groups": ["cell_state", "covariation", "de_recovery"],
  "risks": "1) proxy/X3 上看不到趋势收益:proxy 单阶段必然回落,X3 可能因 n_out==池大小退化为恒等(既有节点均 50.00);Engineer 应接受 proxy≈57.9、X3≈50.0,只看 proxy2 是否≥+2分,否则该方向判负。2) proxy2 提升可能被 1/3 权重稀释后淹没在2分噪声里:若 proxy2 +3 而 proxy 持平,节点分仅+1,需用 proxy2 上2次重复查分(A半)确认方向一致再提交。3) 趋势分支反而低于回落(Qiu 心脏域太窄,外推把非心脏类型错误压低):用 θ=0 与 λ=0 两个消融点检查,若消融即回升则关闭趋势分支、提交回落配置(至少不劣于节点14)。4) 先验字典错标取材域导致过度校正:先验只含方向书已列条目,且校正只允许'不减少'单向截断,风险有界;若 proxy2 上 θ 从0.002 提到0.01 分数单调下降,取更小 θ 或关闭。5) 与节点11'多官方阶段池化'混淆:本方案不把两阶段细胞混合成池,仅用两阶段比例差作为标量趋势信号,实现时严禁拼接两阶段表达矩阵。6) 时间超支:30分钟内若趋势分支未跑通,直接提交已验证的回落分支(等价节点12/14),不留半成品。",
  "sources": []
}
```
原始记录位置/home/spark-longxinyang/vec/runs/formal/20261002-034201-search-t1-abc-r1-A-era/nodes/17/researcher.jsonl 6 KB
/home/spark-longxinyang/vec/runs/formal/20261002-034201-search-t1-abc-r1-A-era/nodes/17/researcher.stderr