尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗Rough estimates of the number of chemically stable molecules made of a given set of elements, for every size up to a maximum number of heavy atoms. Counting follows GDB conventions:
pip install -e ".[test]"
python -m chemuniverse --max-atoms 11 --elements C N O F --exact-up-to 6 --samples 10 --seed 0
n molecules ± SE mode cumulative
1 4 exact 4
...
6 8738 exact 1.027e+04
7 6.695e+04 2.1e+03 estimate 7.722e+04
...
11 5.73e+08 4.2e+07 estimate 6.291e+08
total: 6.291e+08 ± 4.2e+07 (95.7 s)
From Python: chemuniverse.estimate(max_atoms, elements, RuleConfig(...), k_exact, samples, seed, method, jobs) returns one result per size.
--jobs N runs exact subtrees and sampling passes in N worker processes, or N threads with the Rust core. The results are identical for any N.
rust/ is a Rust port of the hot paths: tree, canonical labeling, payload and SMILES. It produces exactly the same tree, counts, SMILES and estimates as the Python code.
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh # once, if Rust is not installed
pip install ./rust # builds and installs chemuniverse-core
CHEMUNIVERSE_BACKEND=python forces the pure-Python code.--jobs 10.design/prd/0002-performance.md.Any run can be split into independent shards for a task farm. The reduced result is identical to a single-machine run.
python -m chemuniverse shard plan runs/cnof12 --kind exact --max-atoms 12 --elements C N O F --shards 4000
python -m chemuniverse shard run runs/cnof12 --jobs 10 # locally, or one task per shard on a cluster
python -m chemuniverse shard reduce runs/cnof12
--kind is exact, export (SMILES) or passes (stratified sampling, with one shard per pass).scripts/hpc/run_ensemble.py runs the shards with ensemble_launcher.scripts/hpc/crux/iri_job.py. See ADR 0012.Exact enumeration builds every molecule exactly once, so it can write them out as a GDB-style dataset:
python -m chemuniverse export --max-atoms 9 --elements C N O F --out data/cnof9 --jobs 10
n{size}_part{k}.smi.gz, with one Kekulé SMILES per line, plus a manifest.json that records the elements, the rules and the count per size.docs/ is a static page, published with GitHub Pages: https://autonomous-scientific-agents.github.io/Chemical-Universe/
chemuniverse results: exact, or sampled with ±2 SE.A step-by-step guide to the method (graphs, stability rules, canonical augmentation and tree sampling) is at https://autonomous-scientific-agents.github.io/Chemical-Universe/method/
The data in docs/data.js is generated by:
python scripts/build_site_data.py --max-atoms 17 --samples 12 --jobs 10 # ~25 min with the Rust core
All halogens obey the same rules, so the 128 possible element choices reduce to 40 runs. Each run is cached in build/site/, so an interrupted build resumes.
design/ holds the reasons behind the code:
design/adr/;design/prd/;design/README.md.The AI coding sessions that built this project are archived in agent-traces/. Their replays are published at https://autonomous-scientific-agents.github.io/Chemical-Universe/agent-traces/
Skeleton tree. The nodes are connected graphs whose vertices are labeled by element.
Payload. For each skeleton, the program:
(element, H) labelings up to symmetry.Resonance/Kekulé structures (e.g. benzene) therefore count once.
Exact counts up to --exact-up-to heavy atoms come from a full traversal of the tree.
Estimates for larger sizes come from sampling the tree below the exact frontier.
--samples passes.--method knuth): random root-to-leaf walks, each weighted by the product of branching factors along the way.
Each group can be turned off from the command line.
| Group | Rules | Flag |
|---|---|---|
| Valence | C4, N3, O2, S2, P3, Si4, B3, halogens 1; optional S 4/6 and P 5 | --hypervalent |
| Bond orders | ≤ 3; no triple bonds on O, S or halogens | --no-bond-order-limits |
| Strain | no triple bond in a ring < 8 atoms; no double bond in a 3- or 4-membered ring; no cumulated bonds at an atom in a ring < 9; Bredt (no multiple bond at a bridgehead of rings ≤ 7) | --no-strain |
| Heteroatoms | no O–O, N–O or halogen–(N, O, S, halogen) bonds; no enols; no hemiacetals, hemiaminals or gem-diols | --no-heteroatom, --allow-n-o |
| Validation | acyclic only / single bonds only | --no-rings, --no-multiple-bonds |
Strict tier (--rules strict, off by default) | S1 no heteroatom chains X–X–X; S2 no S–O; S3 no 3/4-ring with ≥ 2 heteroatoms; S4 no enethiols, NH-enamines, ynols/ynamines, imidic/thiono acids, ketenes; S5 no hemithioacetals; S6 no thioaldehydes/thioketones. Keeps 24% of C,N,O,S and 56% of C,N,O,F molecules at 8 atoms (ADR 0015) | --no-hetero-chains, --allow-s-o, --no-small-ring-heteroatoms, --no-tautomer-filter, --no-thio-gem, --no-thiocarbonyl-filter |
pytest checks:
With C, N, O, F up to 11 atoms there are exactly 698,073,917 molecules (6.98×10⁸; 8,303,267,373 up to 12 atoms). This is about 27× GDB-11 (2.6×10⁷), which uses much stricter functional-group and ring filters.
Exact C, N, O, F counts per size, computed on ALCF Crux (sizes 10–12 for the first time; 12 atoms took 86 core-hours on 4 nodes):
| n | 7 | 8 | 9 | 10 | 11 | 12 |
|---|---|---|---|---|---|---|
| molecules | 67,403 | 583,112 | 5,526,145 | 56,997,371 | 634,889,614 | 7,605,193,456 |
Exact C, N, O, S counts (exported as a dataset; see below):
| n | 7 | 8 | 9 | 10 | 11 | 12 |
|---|---|---|---|---|---|---|
| molecules | 219,566 | 2,129,403 | 22,382,806 | 253,018,485 | 3,057,059,302 | 39,320,382,465 |
| Dataset | Molecules | Size | Manifest |
|---|---|---|---|
chemuniverse-CNOS-le12: all C, N, O, S molecules up to 12 heavy atoms, basic rules | 42,655,220,742 | 132 GB (74 gzip SMILES chunks) | results/chemuniverse-CNOS-le12/manifest.json |
chemuniverse-CNOS-le12-strict: the same with the strict tier (ADR 0015) | 8,060,129,218 | 26 GB (23 chunks) | results/chemuniverse-CNOS-le12-strict/manifest.json |