分子图模型:以原子数组 + 键列表描述的共价分子(可含多个连通分量)。
Molecule
00 Remarks
- 原子以 0 基索引标识,四个平行数组 、、 与键列表 共同构成分子;
- 氢以"隐式 + 显式"两段表示:隐式氢由价态与已用键级反推(见 ),
显式氢用于括号内写出的 [NH3+] 之类记号;
- 不感知芳香性——芳香体系一律以 Kekulé 式的单/双键表达;不感知立体化学。
该模型是整个搜索的化学基座:Molecule.MolKey() 提供同构无关的规范指纹, 用于搜索去重与汇集合判定。
01 Syntax
02 Methods
| Name | Overloads | Summary |
|---|---|---|
| .ctor | 1 | 创建一个不含任何原子与键的空分子。 |
| InvalidateStructure | 1 | 作废全部派生缓存(邻接表 / Morgan 秩 / 分子指纹)。 任何改动元素、电荷、显式氢或键表的操作都必须调用它。 |
| Adjacency | 1 | 邻接表(惰性构建,O(键数)):每个原子一个 (邻居索引, 键级) 列表。 |
| NumAtoms | 1 | 分子中的原子总数(含氢以外的全部显式原子)。 |
| Neighbors | 1 | 取某原子的全部邻接原子及其键级。 |
| Degree | 1 | 某原子的重原子度(与之成键的原子个数,键级不参与计数)。 |
| BondOrder | 1 | 查询两个原子之间的键级。 |
| SetBondOrder | 1 | 修改已存在键的键级(如单键改双键);键不存在时静默忽略。 |
| RemoveBond | 1 | 删除两个原子之间的键(若存在)。断键后两者可能落入不同连通分量。 |
| AddBond | 1 | 追加一条键(唯一推荐的"加键"入口,会自动作废派生缓存)。 |
| SetElement | 1 | 修改某个原子的元素符号(会作废派生缓存)。 |
| SetCharge | 1 | 修改某个原子的形式电荷(会作废派生缓存)。 |
| SetExplicitH | 1 | 修改某个原子的显式氢数(会作废派生缓存)。 |
| AddAtom | 1 | 向分子追加一个原子(不带任何键),返回其索引。 |
| Copy | 1 | 深拷贝当前分子(元素/电荷/显式氢/键均为新列表,改动互不影响)。 |
| ImplicitH | 1 | 计算某原子的隐式氢数:max(0, 价态 − Σ键级 − 显式氢)。 |
| TotalH | 1 | 某原子上的氢总数 = 显式氢 + 隐式氢(模式匹配中的 Hn 约束即与此值比较)。 |
| ValenceViolations | 1 | 价态校验:返回价态超限(已成键级 + 显式氢 > 容许价态)的原子列表。 |
| Components | 1 | 计算连通分量,即把多组分分子(如 "A.B.C")拆成若干个独立片段的原子集合。 |
| SplitComponents | 1 | 把每个连通分量提取成独立的 Molecule 实例(原子索引重新编号)。 |
| MorganRanks | 1 | 计算 Morgan/扩展连通性(EC)迭代精化标签:以原子化学环境为初值反复用邻居 标签精化,直到分区数不再增长(或达到轮数上限)。 |
| MolKey | 1 | 分子规范指纹:同构的分子必然得到相同字符串,异构分子(几乎必然)得到不同字符串。 |
03 Properties
04 Fields
| Name | Overloads | Summary |
|---|---|---|
| _adjacency | 1 | 邻接表缓存(惰性构建):每个原子一个 (邻居索引, 键级) 列表。 |
| _morgan | 1 | Morgan 秩缓存(惰性构建)。 |
| _molKey | 1 | Molecule.MolKey() 结果缓存(惰性构建)。 |
05 Members
创建一个不含任何原子与键的空分子。
作废全部派生缓存(邻接表 / Morgan 秩 / 分子指纹)。 任何改动元素、电荷、显式氢或键表的操作都必须调用它。
邻接表(惰性构建,O(键数)):每个原子一个 (邻居索引, 键级) 列表。
原先 Molecule.Neighbors() 每次调用都要扫描整张键表并新建一个列表, 在 Morgan 迭代(每原子 × 多轮)、价态校验、连通分量里被反复调用, 实际复杂度退化到 O(原子数 × 键数 × 轮数)。热路径统一走这里。
长度等于原子数的邻接表。
分子中的原子总数(含氢以外的全部显式原子)。
原子个数。
Int32)取某原子的全部邻接原子及其键级。
| Name | Type | Description |
|---|---|---|
a | Int32 | 原子索引。 |
邻居列表,每项为 (邻接原子索引, 键级);无邻居时返回空列表。
Int32)某原子的重原子度(与之成键的原子个数,键级不参与计数)。
| Name | Type | Description |
|---|---|---|
a | Int32 | 原子索引。 |
邻居原子个数。
Int32, Int32)查询两个原子之间的键级。
| Name | Type | Description |
|---|---|---|
a | Int32 | 第一个原子索引。 |
b | Int32 | 第二个原子索引。 |
键级 1/2/3;两原子间无键时返回 0。
Int32, Int32, Int32)修改已存在键的键级(如单键改双键);键不存在时静默忽略。
| Name | Type | Description |
|---|---|---|
a | Int32 | 键一端原子索引。 |
b | Int32 | 键另一端原子索引。 |
newOrder | Int32 | 新的键级(1/2/3)。 |
Int32, Int32)删除两个原子之间的键(若存在)。断键后两者可能落入不同连通分量。
| Name | Type | Description |
|---|---|---|
a | Int32 | 键一端原子索引。 |
b | Int32 | 键另一端原子索引。 |
Int32, Int32, Int32)追加一条键(唯一推荐的"加键"入口,会自动作废派生缓存)。
| Name | Type | Description |
|---|---|---|
a | Int32 | 键一端原子索引。 |
b | Int32 | 键另一端原子索引。 |
order | Int32 | 键级 1/2/3。 |
Int32, String)修改某个原子的元素符号(会作废派生缓存)。
Int32, Int32)修改某个原子的形式电荷(会作废派生缓存)。
Int32, Int32)修改某个原子的显式氢数(会作废派生缓存)。
String, Int32)向分子追加一个原子(不带任何键),返回其索引。
| Name | Type | Description |
|---|---|---|
el | String | 元素符号,须能被价态模型识别(如 "C"、"N"、"O"、"P"、"S")。 |
charge | Int32 | 形式电荷。 |
新原子的索引(等于追加前的原子总数)。
深拷贝当前分子(元素/电荷/显式氢/键均为新列表,改动互不影响)。
与当前分子结构相同的新 Molecule 实例。
Int32)计算某原子的隐式氢数:max(0, 价态 − Σ键级 − 显式氢)。
| Name | Type | Description |
|---|---|---|
a | Int32 | 原子索引。 |
隐式氢个数。
Int32)某原子上的氢总数 = 显式氢 + 隐式氢(模式匹配中的 Hn 约束即与此值比较)。
| Name | Type | Description |
|---|---|---|
a | Int32 | 原子索引。 |
氢总数。
价态校验:返回价态超限(已成键级 + 显式氢 > 容许价态)的原子列表。
这是规则应用的"化学合理性闸门"——变换后价态非法的产物一律被丢弃。
违规原子索引列表;为空表示全分子价态合法。
计算连通分量,即把多组分分子(如 "A.B.C")拆成若干个独立片段的原子集合。
每个分量一个原子索引列表(内部已按索引升序排列)。
把每个连通分量提取成独立的 Molecule 实例(原子索引重新编号)。
独立分子列表;单组分分子返回仅含自身的列表。
Int32)计算 Morgan/扩展连通性(EC)迭代精化标签:以原子化学环境为初值反复用邻居 标签精化,直到分区数不再增长(或达到轮数上限)。
初值为 (元素, 电荷, 氢总数, 重原子度, 邻接键级多重集);迭代式为 (旧标签, 邻居(标签, 键级) 多重集)。这是 Molecule.MolKey() 与 SMILES 确定性写出的排序依据。
| Name | Type | Description |
|---|---|---|
rounds | Int32 | 最大迭代轮数;分区数收敛时会提前退出。 |
每个原子一个标签字符串;标签相同表示化学环境等价(用于规范化排序与指纹)。
分子规范指纹:同构的分子必然得到相同字符串,异构分子(几乎必然)得到不同字符串。
搜索用它做三件事:状态去重、循环消除、以及判定某个化合物是否属于底盘汇集合。 注意它并非严格的规范 SMILES——正则图的极端情形下理论上存在碰撞,但在代谢物 尺度可忽略。
指纹一律采用"氢总数"(Molecule.TotalH() = 显式 + 隐式)而非"显式氢":对价态合法的 原子,氢总数由元素、电荷与键级唯一决定,而显式氢数只反映 SMILES 的书写方式。若用 显式氢,同一个分子写成 N 还是 [NH3+] 会得到两个不同的指纹,导致规则 逆向生成的化合物与库里的同一化合物对不上(通路无法在起点 A 处收束)。
由 Morgan 秩编号后的原子不变量与键三元组拼成的确定性字符串。
各原子的元素符号(如 "C"、"N"、"O"、"Cl")。
长度等于 Molecule.NumAtoms() 的元素符号列表,下标即原子索引。
各原子的形式电荷(如羧基氧为 -1、铵根氮为 +1)。
长度等于 Molecule.NumAtoms() 的电荷列表。
各原子的显式氢数目(来自 [NH3+] 这类括号记号;隐式氢不计入此处)。
长度等于 Molecule.NumAtoms() 的显式氢计数列表。
化学键列表,每项为 (a, b, order),其中 order 取 1/2/3(单/双/三键)。
请优先使用 Molecule.AddBond()、Molecule.SetBondOrder()、Molecule.RemoveBond() 修改键表:直接改这个列表会让下面几个派生缓存失效不了,从而读到陈旧结果。
分子内全部共价键。
邻接表缓存(惰性构建):每个原子一个 (邻居索引, 键级) 列表。
Morgan 秩缓存(惰性构建)。
Molecule.MolKey() 结果缓存(惰性构建)。