renkin 0.15.0

Ultra-fast retrosynthesis engine for computer-aided synthesis planning (CASP) — pure Rust, WASM-ready, Python bindings via PyO3
Documentation
# Quick Start

## Python

```python
import renkin

# Find retrosynthetic routes for Aspirin
result = renkin.find_routes(
    smiles="CC(=O)Oc1ccccc1C(=O)O",
    depth=5,
    max_routes=3,
)

print(f"Found {result['routes_found']} routes")

for i, route in enumerate(result["routes"]):
    print(f"\nRoute {i+1} (depth {route['depth']}):")
    for step in route["steps"]:
        precursors = " + ".join(step["precursors"])
        print(f"  {step['target']}")
        print(f"  → {precursors}  [{step['rule']}]")
```

Output:
```
Found 2 routes

Route 1 (depth 2):
  CC(=O)Oc1ccccc1C(=O)O
  → CC(=O)O + Oc1ccccc1C(=O)O  [ester_cleavage]

Route 2 (depth 2):
  CC(=O)Oc1ccccc1C(=O)O
  → CC(=O)Cl + Oc1ccccc1C(=O)O  [ester_acyl_chloride]
```

## Custom Building Blocks

You can supply your own building block library:

```python
import renkin

# List of SMILES strings
my_stock = [
    "CC(=O)O",      # acetic acid
    "Oc1ccccc1",    # phenol
    "c1ccccc1",     # benzene
    "Brc1ccccc1",   # bromobenzene
    "OB(O)c1ccccc1", # phenylboronic acid
]

result = renkin.find_routes(
    smiles="c1ccc(-c2ccccc2)cc1",  # biphenyl
    building_blocks=my_stock,
    depth=3,
)
```

## Rust

```rust
use renkin::{
    chem_env::{ChemEnv, default_rules},
    search::{SearchConfig, find_routes},
};

fn main() -> anyhow::Result<()> {
    // Load building blocks from a SMILES file
    let env = ChemEnv::load("data/building_blocks.smi")?;
    
    let config = SearchConfig {
        max_depth: 5,
        max_routes: 3,
        beam_width: 0,  // 0 = unlimited A*
    };
    
    let routes = find_routes("CC(=O)Oc1ccccc1C(=O)O", &env, &config)?;
    
    println!("Found {} routes", routes.len());
    for (i, route) in routes.iter().enumerate() {
        println!("Route {} (depth {}):", i + 1, route.depth());
    }
    
    Ok(())
}
```

## CLI Benchmark

```bash
# Run retrosynthesis on a list of targets
renkin-bench \
    --input targets.smi \
    --building-blocks data/building_blocks.smi \
    --depth 3 \
    --beam-width 50 \
    > results.json
```

The input file should be a SMILES file (one SMILES per line, optional name after whitespace).

## SMILES File Format

Building blocks and target files use the standard `.smi` format:

```
CC(=O)O         acetic_acid
c1ccccc1        benzene
# Comments start with #
Brc1ccccc1      bromobenzene
```