omgkit_match/lib.rs
1//! # omgkit-match
2//!
3//! omgkit 的 L5 层:子结构匹配。
4//!
5//! 给一个 SMARTS 查询和一个净化过的分子,找出所有能把查询原子映射到分子原子、
6//! 且保持连接关系与全部查询条件的映射。
7//!
8//! ```no_run
9//! use omgkit_match::{substructure_matches, MolProps};
10//!
11//! let mut mol = omgkit_io::smiles::parse("c1ccccc1O").unwrap();
12//! // ... 净化 ...
13//! let props = MolProps::compute(&mol);
14//! let query = omgkit_io::smarts::parse("c[OH]").unwrap();
15//! let hits = substructure_matches(&query, &mol, &props, Default::default());
16//! ```
17//!
18//! ## 为什么必须自己写
19//!
20//! 通用图同构库解不了这里的问题:查询原子的条件是一棵**表达式树**,不是一个
21//! 可比较的标签。而且化学特化(按元素稀有度给查询原子排序、按预先算好的
22//! 原子性质一次性筛出候选)恰恰是这里最大的性能来源 —— 通用库拿不到这些信息。
23
24pub mod byproduct;
25pub mod matcher;
26pub mod props;
27pub mod react;
28
29pub use byproduct::{reconstruct as reconstruct_byproducts, Byproducts};
30pub use matcher::{substructure_matches, substructure_matches_counted, MatchOptions, SearchStats};
31pub use props::MolProps;
32pub use react::{run_on_substrate, run_reactants, Outcome, ProductSet};