renkin 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +125 -227
- package/package.json +3 -10
- package/renkin_bg.wasm +0 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 kent-tokyo
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,28 +1,67 @@
|
|
|
1
|
-
# RENKIN —
|
|
1
|
+
# RENKIN — **R**etrosynthetic **E**xploration **N**etwork for **K**nowledge-**I**nformed **N**avigation
|
|
2
2
|
|
|
3
3
|
> **Computer-Aided Synthesis Planning (CASP) · Pure Rust · WebAssembly · Python**
|
|
4
4
|
> Named after 錬金 (れんきん, *renkin*) — Japanese for alchemy: just as alchemists transformed base metals into gold, RENKIN transforms target molecules back into cheap starting materials.
|
|
5
5
|
|
|
6
|
+
[](https://github.com/kent-tokyo/renkin/actions/workflows/ci.yml)
|
|
6
7
|
[](https://crates.io/crates/renkin)
|
|
8
|
+
[](https://pypi.org/project/renkin/)
|
|
9
|
+
[](https://www.npmjs.com/package/renkin)
|
|
7
10
|
[](LICENSE)
|
|
8
|
-
[](https://
|
|
11
|
+
[](https://kent-tokyo.github.io/renkin/playground/)
|
|
9
12
|
[](https://www.rust-lang.org)
|
|
10
13
|
|
|
11
|
-
[日本語版 README](./README_ja.md)
|
|
14
|
+
[日本語版 README](./README_ja.md) · [**Documentation**](https://kent-tokyo.github.io/renkin/) · [**Live Demo →**](https://kent-tokyo.github.io/renkin/playground/)
|
|
12
15
|
|
|
13
16
|
---
|
|
14
17
|
|
|
15
18
|
## What is RENKIN?
|
|
16
19
|
|
|
17
|
-
RENKIN is an open-source **retrosynthesis engine** for **computer-aided synthesis planning (CASP)** that automatically discovers optimal chemical reaction routes from a target molecule back to cheap, commercially available starting materials
|
|
20
|
+
RENKIN is an open-source **retrosynthesis engine** for **computer-aided synthesis planning (CASP)** that automatically discovers optimal chemical reaction routes from a target molecule back to cheap, commercially available starting materials.
|
|
18
21
|
|
|
19
|
-
Built entirely in Rust with the [`chematic`](https://docs.rs/chematic/) cheminformatics crate
|
|
22
|
+
Built entirely in Rust with the [`chematic`](https://docs.rs/chematic/) cheminformatics crate. Zero C/C++ dependencies.
|
|
20
23
|
|
|
21
|
-
-
|
|
22
|
-
|
|
23
|
-
- **WASM module** — 493 KB bundle, runs in the browser with no server
|
|
24
|
+
**[→ Try the Live Playground](https://kent-tokyo.github.io/renkin/playground/)** — runs entirely in WebAssembly, no installation needed.
|
|
25
|
+
**[→ Full Documentation](https://kent-tokyo.github.io/renkin/)** — API reference, examples, benchmark.
|
|
24
26
|
|
|
25
|
-
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Installation
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
pip install renkin # Python
|
|
33
|
+
cargo add renkin # Rust
|
|
34
|
+
npm install renkin # JavaScript / Node.js
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Quick Start
|
|
40
|
+
|
|
41
|
+
```python
|
|
42
|
+
import renkin
|
|
43
|
+
|
|
44
|
+
result = renkin.find_routes(
|
|
45
|
+
"CC(=O)Oc1ccccc1C(=O)O", # Aspirin
|
|
46
|
+
depth=5,
|
|
47
|
+
max_routes=3,
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
for route in result["routes"]:
|
|
51
|
+
for step in route["steps"]:
|
|
52
|
+
print(f" {step['target']} → {' + '.join(step['precursors'])} [{step['rule']}]")
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
```javascript
|
|
56
|
+
import init, { find_routes } from './pkg/renkin.js';
|
|
57
|
+
await init();
|
|
58
|
+
const result = JSON.parse(find_routes("CC(=O)Oc1ccccc1C(=O)O", 5, 3, 0));
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
./target/release/renkin --target "CC(=O)Oc1ccccc1C(=O)O" --depth 5 \
|
|
63
|
+
--templates data/templates_extracted.smi
|
|
64
|
+
```
|
|
26
65
|
|
|
27
66
|
---
|
|
28
67
|
|
|
@@ -30,16 +69,48 @@ All from a single pure-Rust codebase with zero C/C++ dependencies.
|
|
|
30
69
|
|
|
31
70
|
| Feature | Detail |
|
|
32
71
|
|---|---|
|
|
33
|
-
| **Pure Rust** | Zero C/C++ dependencies
|
|
34
|
-
| **A\* / AND-OR Tree Search** | Retro\*-equivalent algorithm proven more efficient than MCTS
|
|
35
|
-
| **SA Score heuristic** |
|
|
36
|
-
| **Beam search** | `--beam-width N`
|
|
37
|
-
| **
|
|
38
|
-
| **
|
|
39
|
-
| **
|
|
40
|
-
| **
|
|
41
|
-
|
|
|
42
|
-
| **
|
|
72
|
+
| **Pure Rust** | Zero C/C++ dependencies — cross-platform with `cargo build` alone |
|
|
73
|
+
| **A\* / AND-OR Tree Search** | Retro\*-equivalent algorithm, proven more efficient than MCTS |
|
|
74
|
+
| **SA Score heuristic** | Admissible h = Σ(1 + 0.5·(sa−1)/9) guides toward accessible precursors |
|
|
75
|
+
| **Beam search** | `--beam-width N` for memory-bounded exploration |
|
|
76
|
+
| **314 reaction rules** | 31 hand-crafted + 283 auto-extracted from USPTO-50k via rdchiral |
|
|
77
|
+
| **Auto template extraction** | `scripts/extract_templates.py` — rdchiral + chematic-compatible simplification |
|
|
78
|
+
| **Graph-based biaryl cleavage** | Bridge-bond DFS for correct Suzuki disconnection |
|
|
79
|
+
| **Parallel rule application** | `rayon` on non-WASM; sequential fallback on wasm32 |
|
|
80
|
+
| **Python** | `pip install renkin` — pre-built wheels for Linux/macOS/Windows |
|
|
81
|
+
| **WASM** | ~500 KB bundle — runs in the browser at near-native speed |
|
|
82
|
+
| **463 building blocks** | Aryl halides, boronic acids, heterocycles, amines, acids, amino acids |
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## Benchmark
|
|
87
|
+
|
|
88
|
+
USPTO-50k test set (4,907 molecules, full evaluation):
|
|
89
|
+
|
|
90
|
+
| Config | Solved | Rate | BBs | Rules | depth |
|
|
91
|
+
|---|---|---|---|---|---|
|
|
92
|
+
| v0.1.0 initial | 366/4907 | 7.5% | 463 | 31 | 3 |
|
|
93
|
+
| + auto templates (top-300) | 1363/4907 | 27.8% | 463 | 222 | 3 |
|
|
94
|
+
| + depth=5, top-500 templates | **2315/4907** | **47.2%** | 463 | 314 | 5 |
|
|
95
|
+
|
|
96
|
+
Surpasses ASKCOS (41%) and reaches AiZynthFinder lower bound (45%) with only 463 curated BBs.
|
|
97
|
+
Competitor reference: AiZynthFinder 45–53% (depth≤5, 6M BBs, 50k templates).
|
|
98
|
+
[Full benchmark details →](https://kent-tokyo.github.io/renkin/benchmark/)
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## Competitive Landscape
|
|
103
|
+
|
|
104
|
+
| Tool | Language | License | WASM | Zero-dep | Algorithm | Template source | Stock |
|
|
105
|
+
|---|---|---|---|---|---|---|---|
|
|
106
|
+
| **ASKCOS** | Python | CC BY-NC | No | No (Docker, 64 GB) | MCTS + A\* | USPTO (ML) | ZINC |
|
|
107
|
+
| **AiZynthFinder** | Python | MIT | No | No (conda + model) | MCTS | USPTO (ML, ~50k) | eMolecules (~6M) |
|
|
108
|
+
| **SYNTHIA** | Closed | Proprietary | No | No | SMARTS + AND/OR | Manual curated | Sigma-Aldrich |
|
|
109
|
+
| **IBM RXN** | Closed | Cloud SaaS | No | No | Transformer | USPTO | — |
|
|
110
|
+
| **Retro\*** | Python | MIT | No | No (unmaintained) | A\* + AND/OR | USPTO (ML) | eMolecules |
|
|
111
|
+
| **★ RENKIN** | **Rust** | **MIT** | **Yes** | **Yes** | **A\* + AND/OR** | Hand-curated + rdchiral (314) | 463+ |
|
|
112
|
+
|
|
113
|
+
**RENKIN's goal**: match or exceed neural-network-based tools using only curated rules and auto-extracted SMIRKS templates — no GPU, no training data, no black boxes. At 47.2% USPTO-50k (surpassing ASKCOS and reaching AiZynthFinder's lower bound), RENKIN demonstrates that a transparent, rule-based engine in pure Rust can compete with deep-learning approaches. And it runs anywhere: browser, CLI, Python — single `cargo build`.
|
|
43
114
|
|
|
44
115
|
---
|
|
45
116
|
|
|
@@ -51,9 +122,9 @@ Target SMILES
|
|
|
51
122
|
▼
|
|
52
123
|
┌─────────────────────────┐
|
|
53
124
|
│ chem_env.rs │ ← chematic wrapper
|
|
54
|
-
│ - SMILES parse │
|
|
55
|
-
│ -
|
|
56
|
-
│ - Building block check │
|
|
125
|
+
│ - SMILES parse │ canonical-SMILES HashSet BB lookup (O(1))
|
|
126
|
+
│ - 314 retro rules │ fragment sanitization + ring-leak filter
|
|
127
|
+
│ - Building block check │ VF2 fallback for small sets
|
|
57
128
|
└────────────┬────────────┘
|
|
58
129
|
│ par_iter (rayon / sequential on WASM)
|
|
59
130
|
▼
|
|
@@ -77,193 +148,30 @@ Target SMILES
|
|
|
77
148
|
|
|
78
149
|
---
|
|
79
150
|
|
|
80
|
-
## Technology Stack
|
|
81
|
-
|
|
82
|
-
- **Language**: Rust (Edition 2024)
|
|
83
|
-
- **Cheminformatics**: [`chematic`](https://crates.io/crates/chematic) v0.4.9+
|
|
84
|
-
- `chematic-smiles` — SMILES parsing & canonical SMILES
|
|
85
|
-
- `chematic-smarts` — VF2 substructure matching (building block identity)
|
|
86
|
-
- `chematic-rxn` — SMIRKS reaction application (`run_reactants`)
|
|
87
|
-
- `chematic-chem` — SA Score, molecular weight, aromaticity descriptors
|
|
88
|
-
- **Search**: A\* + AND/OR Tree (Retro\* equivalent)
|
|
89
|
-
- **Parallelism**: [`rayon`](https://crates.io/crates/rayon) — parallel SMIRKS rule application
|
|
90
|
-
- **Python**: [`PyO3`](https://pyo3.rs) + [`maturin`](https://www.maturin.rs)
|
|
91
|
-
- **WASM**: [`wasm-bindgen`](https://rustwasm.github.io/wasm-bindgen/) + [`wasm-pack`](https://rustwasm.github.io/wasm-pack/)
|
|
92
|
-
|
|
93
|
-
---
|
|
94
|
-
|
|
95
|
-
## Installation
|
|
96
|
-
|
|
97
|
-
### As a library
|
|
98
|
-
|
|
99
|
-
```toml
|
|
100
|
-
# Cargo.toml
|
|
101
|
-
[dependencies]
|
|
102
|
-
renkin = "0.1"
|
|
103
|
-
```
|
|
104
|
-
|
|
105
|
-
### CLI (from source)
|
|
106
|
-
|
|
107
|
-
```bash
|
|
108
|
-
git clone https://github.com/kent-tokyo/renkin
|
|
109
|
-
cd renkin
|
|
110
|
-
cargo build --release
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
### Python
|
|
114
|
-
|
|
115
|
-
```bash
|
|
116
|
-
pip install maturin
|
|
117
|
-
git clone https://github.com/kent-tokyo/renkin && cd renkin
|
|
118
|
-
python -m venv .venv && source .venv/bin/activate
|
|
119
|
-
maturin develop --features python
|
|
120
|
-
```
|
|
121
|
-
|
|
122
|
-
---
|
|
123
|
-
|
|
124
|
-
## Getting Started
|
|
125
|
-
|
|
126
|
-
### CLI
|
|
127
|
-
|
|
128
|
-
```bash
|
|
129
|
-
# Retrosynthesis (Aspirin, depth 3)
|
|
130
|
-
./target/release/renkin --target "CC(=O)Oc1ccccc1C(=O)O" --depth 3
|
|
131
|
-
|
|
132
|
-
# With beam search (top-50 nodes)
|
|
133
|
-
./target/release/renkin --target "CC(=O)Oc1ccccc1C(=O)O" --depth 5 --beam-width 50
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
```
|
|
137
|
-
--target / -t Target molecule SMILES
|
|
138
|
-
--depth / -d Max retrosynthesis depth (default: 5)
|
|
139
|
-
--max-routes / -n Max routes to return (default: 5)
|
|
140
|
-
--beam-width / -w Beam search width, 0 = unlimited A* (default: 0)
|
|
141
|
-
--building-blocks Path to .smi file of commercial starting materials
|
|
142
|
-
```
|
|
143
|
-
|
|
144
|
-
### Python
|
|
145
|
-
|
|
146
|
-
```python
|
|
147
|
-
import renkin, json
|
|
148
|
-
|
|
149
|
-
routes = json.loads(renkin.find_routes(
|
|
150
|
-
"CC(=O)Oc1ccccc1C(=O)O", # Aspirin
|
|
151
|
-
depth=3,
|
|
152
|
-
max_routes=5,
|
|
153
|
-
))
|
|
154
|
-
print(routes["routes_found"]) # number of routes found
|
|
155
|
-
for r in routes["routes"]:
|
|
156
|
-
print(r["depth"], [s["rule"] for s in r["steps"]])
|
|
157
|
-
```
|
|
158
|
-
|
|
159
|
-
### WASM
|
|
160
|
-
|
|
161
|
-
```bash
|
|
162
|
-
wasm-pack build --target web --no-default-features
|
|
163
|
-
# Output: pkg/ (npm-ready package)
|
|
164
|
-
# Browser demo: python3 -m http.server 8080 → http://localhost:8080/demo/
|
|
165
|
-
```
|
|
166
|
-
|
|
167
|
-
```javascript
|
|
168
|
-
import init, { find_routes } from './pkg/renkin.js';
|
|
169
|
-
await init();
|
|
170
|
-
|
|
171
|
-
const result = JSON.parse(find_routes(
|
|
172
|
-
"CC(=O)Oc1ccccc1C(=O)O", // target SMILES
|
|
173
|
-
3, // depth
|
|
174
|
-
5, // max_routes
|
|
175
|
-
0, // beam_width (0 = unlimited A*)
|
|
176
|
-
));
|
|
177
|
-
console.log(result.routes_found);
|
|
178
|
-
```
|
|
179
|
-
|
|
180
|
-
### Benchmark
|
|
181
|
-
|
|
182
|
-
```bash
|
|
183
|
-
# Input: one SMILES per line, optional name after whitespace
|
|
184
|
-
./scripts/run_benchmark.sh --input data/benchmark_targets.smi --depth 5
|
|
185
|
-
```
|
|
186
|
-
|
|
187
|
-
```json
|
|
188
|
-
{
|
|
189
|
-
"total": 42, "solved": 37, "success_rate": 0.88,
|
|
190
|
-
"avg_depth": 1.05, "avg_time_ms": 2.5,
|
|
191
|
-
"results": [...]
|
|
192
|
-
}
|
|
193
|
-
```
|
|
194
|
-
|
|
195
|
-
---
|
|
196
|
-
|
|
197
|
-
## CLI Output Example
|
|
198
|
-
|
|
199
|
-
```json
|
|
200
|
-
{
|
|
201
|
-
"target": "CC(=O)Oc1ccccc1C(=O)O",
|
|
202
|
-
"routes_found": 2,
|
|
203
|
-
"routes": [
|
|
204
|
-
{
|
|
205
|
-
"steps": [
|
|
206
|
-
{
|
|
207
|
-
"rule": "ester_cleavage",
|
|
208
|
-
"target": "CC(=O)Oc1ccccc1C(=O)O",
|
|
209
|
-
"precursors": ["CC(=O)O", "Oc1ccccc1C(=O)O"]
|
|
210
|
-
}
|
|
211
|
-
],
|
|
212
|
-
"depth": 1
|
|
213
|
-
}
|
|
214
|
-
]
|
|
215
|
-
}
|
|
216
|
-
```
|
|
217
|
-
|
|
218
|
-
**depth: 0** means the target itself is a commercially available starting material (buy directly).
|
|
219
|
-
|
|
220
|
-
---
|
|
221
|
-
|
|
222
|
-
## Retro-Rules (14 total)
|
|
223
|
-
|
|
224
|
-
| Rule | Reaction type | Strategy |
|
|
225
|
-
|---|---|---|
|
|
226
|
-
| `ester_cleavage` | Ester → acid + alcohol | SMIRKS |
|
|
227
|
-
| `amide_cleavage` | Amide → acid + amine | SMIRKS |
|
|
228
|
-
| `friedel_crafts_acylation_retro` | Ar-C(=O)R → Ar-H + acyl chloride | SMIRKS |
|
|
229
|
-
| `aryl_carboxylation_retro` | Ar-COOH → Ar-H + CO₂ surrogate | SMIRKS |
|
|
230
|
-
| `aryl_amine_retro` | Ar-N → Ar-H + amine | SMIRKS |
|
|
231
|
-
| `buchwald_hartwig_retro` | Ar-N → Ar-Br + amine | SMIRKS |
|
|
232
|
-
| `aryl_ether_retro` | Ar-O → Ar-OH + fragment | SMIRKS |
|
|
233
|
-
| `suzuki_retro` | Ar-Ar → Ar-Br + Ar-H | Graph (bridge-bond DFS) |
|
|
234
|
-
| `cc_single_cleavage` | C–C → two fragments | SMIRKS |
|
|
235
|
-
| `wittig_retro` | C=C → C=O + C=O | SMIRKS |
|
|
236
|
-
| `reductive_amination_retro` | C–N → C=O + amine | SMIRKS |
|
|
237
|
-
| `cn_aliphatic_cleavage` | C–N → two fragments | SMIRKS |
|
|
238
|
-
| `co_aliphatic_cleavage` | C–O → two fragments | SMIRKS |
|
|
239
|
-
| `alcohol_oxidation_retro` | C–OH → C=O | SMIRKS |
|
|
240
|
-
|
|
241
|
-
`suzuki_retro` uses a graph-based bridge-bond algorithm instead of SMIRKS to correctly handle symmetric biaryls (biphenyl, 4-fluorobiphenyl, etc.) without the BFS leakage artifacts that affect SMIRKS-based approaches.
|
|
242
|
-
|
|
243
|
-
---
|
|
244
|
-
|
|
245
151
|
## Project Structure
|
|
246
152
|
|
|
247
153
|
```
|
|
248
154
|
renkin/
|
|
249
155
|
├── Cargo.toml
|
|
250
156
|
├── src/
|
|
251
|
-
│ ├── lib.rs
|
|
252
|
-
│ ├── main.rs
|
|
253
|
-
│ ├── bin/
|
|
254
|
-
│
|
|
255
|
-
│ ├──
|
|
256
|
-
│ ├──
|
|
257
|
-
│ ├──
|
|
258
|
-
│
|
|
259
|
-
│ └── wasm.rs # wasm-bindgen bindings (cfg = wasm32)
|
|
157
|
+
│ ├── lib.rs # public library
|
|
158
|
+
│ ├── main.rs # CLI binary (--templates flag)
|
|
159
|
+
│ ├── bin/benchmark.rs # renkin-bench binary (--templates flag)
|
|
160
|
+
│ ├── chem_env.rs # 314 retro rules, BB check, template loader
|
|
161
|
+
│ ├── score.rs # SA Score heuristic + step cost
|
|
162
|
+
│ ├── search.rs # A* / AND-OR tree engine + beam pruning
|
|
163
|
+
│ ├── python.rs # PyO3 bindings (--features python)
|
|
164
|
+
│ └── wasm.rs # wasm-bindgen bindings (cfg = wasm32)
|
|
260
165
|
├── data/
|
|
261
|
-
│ ├── building_blocks.smi
|
|
262
|
-
│
|
|
263
|
-
├──
|
|
264
|
-
│ └──
|
|
265
|
-
|
|
266
|
-
|
|
166
|
+
│ ├── building_blocks.smi # 463 curated commercial starting materials
|
|
167
|
+
│ ├── templates_extracted.smi # 283 auto-extracted SMIRKS templates (top-500)
|
|
168
|
+
│ ├── benchmark_targets.smi # internal benchmark set
|
|
169
|
+
│ └── bench_chunks/ # USPTO-50k per-chunk results
|
|
170
|
+
├── scripts/
|
|
171
|
+
│ ├── extract_templates.py # rdchiral template extraction pipeline
|
|
172
|
+
│ └── run_benchmark_chunks.sh # resumable chunked benchmark runner
|
|
173
|
+
├── docs/ # MkDocs source → kent-tokyo.github.io/renkin/
|
|
174
|
+
└── mkdocs.yml
|
|
267
175
|
```
|
|
268
176
|
|
|
269
177
|
---
|
|
@@ -272,31 +180,21 @@ renkin/
|
|
|
272
180
|
|
|
273
181
|
- [x] **Phase 1** — SMIRKS retro-reaction rules + fragment sanitization
|
|
274
182
|
- [x] **Phase 2** — A\* / AND-OR tree search, closed list, degenerate-route filter
|
|
275
|
-
- [x] **Phase 3** — SA Score heuristic + beam search
|
|
276
|
-
- [x] **Phase 4** — Parallel rule application (
|
|
277
|
-
- [x] **Phase 5** — Python bindings (PyO3 + maturin)
|
|
278
|
-
- [x] **Phase 6** — WASM build
|
|
279
|
-
- [x] **Phase 7** — Benchmark CLI (`renkin-bench`)
|
|
280
|
-
- [x] **Phase 8** —
|
|
281
|
-
- [x] **Phase 9** —
|
|
282
|
-
- [x] **Phase 10** — Graph-based biaryl cleavage
|
|
283
|
-
- [
|
|
284
|
-
- [
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
| Tool | Language | Algorithm | WASM | Zero-dep build |
|
|
291
|
-
|---|---|---|---|---|
|
|
292
|
-
| **ASKCOS** | Python | MCTS / A\* | No | No (Docker, 64 GB RAM) |
|
|
293
|
-
| **AiZynthFinder** | Python | MCTS primary | No | No (conda, model download) |
|
|
294
|
-
| **IBM RXN** | Closed | Transformer | No | No (cloud only) |
|
|
295
|
-
| **SYNTHIA** | Closed | SMARTS + AND/OR | No | No (proprietary) |
|
|
296
|
-
| **Retro\*** | Python | A\* + AND/OR | No | No (unmaintained) |
|
|
297
|
-
| **★ RENKIN** | **Rust** | **A\* + AND/OR** | **Yes** | **Yes (`cargo build`)** |
|
|
298
|
-
|
|
299
|
-
All existing open CASP tools are Python-based. RENKIN fills the vacant niche: Rust-native, WASM-deployable, zero-dependency, A\* search.
|
|
183
|
+
- [x] **Phase 3** — SA Score heuristic + beam search
|
|
184
|
+
- [x] **Phase 4** — Parallel rule application (rayon; sequential fallback on WASM)
|
|
185
|
+
- [x] **Phase 5** — Python bindings (PyO3 + maturin) · `pip install renkin`
|
|
186
|
+
- [x] **Phase 6** — WASM build · `npm install renkin`
|
|
187
|
+
- [x] **Phase 7** — Benchmark CLI (`renkin-bench`) + initial USPTO-50k evaluation
|
|
188
|
+
- [x] **Phase 8** — Unit tests · rules → 31 · building blocks → 463
|
|
189
|
+
- [x] **Phase 9** — WASM browser playground + i18n (EN/JA/ZH)
|
|
190
|
+
- [x] **Phase 10** — Graph-based biaryl cleavage · O(1) canonical-SMILES BB index
|
|
191
|
+
- [x] **Phase 11** — Published to crates.io / PyPI / npm · GitHub Actions CI/CD
|
|
192
|
+
- [x] **Phase 12** — MkDocs documentation site · GitHub Pages playground
|
|
193
|
+
- [x] **Phase 13** — Formal USPTO-50k benchmark: **7.5%** (depth=3, 31 rules)
|
|
194
|
+
- [x] **Phase 14** — Auto template extraction (rdchiral): **27.8%** (depth=3, 222 rules)
|
|
195
|
+
- [x] **Phase 17** — chematic 0.4.12: Bug #13 (BFS leakage) + Bug #14 (canonical SMILES) fixed
|
|
196
|
+
- [ ] **Phase 15** — Stereochemistry support (CIP SMIRKS)
|
|
197
|
+
- [ ] **Phase 16** — Large-scale building block DB integration
|
|
300
198
|
|
|
301
199
|
---
|
|
302
200
|
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "renkin",
|
|
3
3
|
"type": "module",
|
|
4
4
|
"description": "Ultra-fast retrosynthesis engine for computer-aided synthesis planning (CASP) — pure Rust, WASM-ready, Python bindings via PyO3",
|
|
5
|
-
"version": "0.1.
|
|
5
|
+
"version": "0.1.1",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"repository": {
|
|
8
8
|
"type": "git",
|
|
@@ -19,18 +19,11 @@
|
|
|
19
19
|
"sideEffects": [
|
|
20
20
|
"./snippets/*"
|
|
21
21
|
],
|
|
22
|
-
"bugs": {
|
|
23
|
-
"url": "https://github.com/kent-tokyo/renkin/issues"
|
|
24
|
-
},
|
|
25
22
|
"keywords": [
|
|
26
23
|
"retrosynthesis",
|
|
27
24
|
"cheminformatics",
|
|
28
25
|
"chemistry",
|
|
29
26
|
"wasm",
|
|
30
|
-
"
|
|
31
|
-
"drug-discovery",
|
|
32
|
-
"casp",
|
|
33
|
-
"smiles",
|
|
34
|
-
"synthesis-planning"
|
|
27
|
+
"drug-discovery"
|
|
35
28
|
]
|
|
36
|
-
}
|
|
29
|
+
}
|
package/renkin_bg.wasm
CHANGED
|
Binary file
|