跳转至

可合成性评分 SynScore

做什么:给一个目标分子打一个连续的可合成性分数 SynScore,用来对一批分子按"好不好合成" 排序。它在内部跑一次多步规划(可购原料库可切换、可自定义,见商业原料库),再把结果折成分数。分数定义与操作点见 研究报告 · 可合成性评分 SynScore;安装见安装与总览

\[\mathrm{SynScore} = \frac{1}{(U+1)^{U}}\]

U = 最优路线里不可购起始物的个数:全可购(U=0)→1.0,U=1→0.5,U=2→0.11,U=3→0.016,完全找 不到路线→0。缺得越多、掉得越狠,所以它能把"完全解出 / 差几个砌块 / 差很多"清晰分开。

命令行

# 默认用简化约束模型 @ 扩展宽度 k=10(评分推荐配置),--original 换原始模型
synomega score --targets targets.smi --out scores.jsonl

Python

import synomega

scorer = synomega.load_default_scorer()              # 默认 simplify=True, k=10
r = scorer.score("CC(=O)Nc1ccccc1O", max_steps=5)
print(r.as_dict())
# {'smiles': ..., 'solved': True, 'score': 1.0, 'bb_coverage': 1.0,
#  'min_steps': 2, 'min_route_depth': 2, 'num_leaves': 2,
#  'num_purchasable_leaves': 2, 'expansions': ..., 'terminated_by': 'solved', ...}

# 批量:每行一个 SMILES
report = scorer.score_batch(open("targets.smi").read().split())
print(report.solve_rate, report.mean_bb_coverage)
print(report.describe())
df = report.to_dataframe()                            # 每分子一行(需要 pandas)

单分子返回 MoleculeReport.score / .solved / .bb_coverage / .min_steps / .num_unpurchasable_leaves(=U)/ .as_dict());批量返回 BatchReport.solve_rate / .mean_bb_coverage / .describe() / .to_dataframe() / .to_json())。

读分数

情况 U SynScore
全部起始物可购(solved) 0 1.0
差 1 个砌块 1 0.5
差 2 个 2 0.11
完全无路线 0

solved 是二元的"能不能在深度内全叶可购",用来和文献 solve_rate 对比;SynScore 是连续、 近失敏感、可排序的版本,用来对一批分子排序。

参数

参数(CLI / Python) 默认 含义
--targets 必填 每行一个 SMILES
--original / simplify= 默认简化模型 换回原始单步模型打分
--max-steps / max_steps= 5 路线深度上限
--exclude-target 把目标本身当不可购(避免可买目标 0 步满分)