Skip to main content

SynRXN

SynRXN logo

PyPI version Release Last Commit Zenodo CI Stars

SynRXN is an open reaction benchmark repository for reproducible reaction-informatics evaluation.

SynRXN collects curated reaction datasets, canonical task folders, versioned data releases, and lightweight loading utilities for benchmarking atom-atom mapping, reaction classification, property prediction, reaction balancing, and synthesis/retrosynthesis workflows.

SynRXN Workflow

Highlights

  • Five task families: aam, classification, property, rbl, and synthesis.
  • Consistent tabular format: each dataset is a compressed CSV under Data/<task>/<name>.csv.gz.
  • Stable identifiers: most curated rows use r_id; task-specific columns store reactions, labels, targets, splits, mappings, or references.
  • Version-aware access: load data from Zenodo releases, GitHub tags, or exact Git commits.
  • Reproducible benchmarking: use published splits when present, or generate deterministic repeated k-fold splits through synrxn.split.

Installation

SynRXN requires Python 3.11 or later.

pip install synrxn

Install optional dependencies when you need the broader tooling stack:

pip install "synrxn[all]"
pip install "synrxn[query]"    # PyArrow + embedded DuckDB
pip install "synrxn[service]"  # optional read-only HTTP API

For development:

git clone https://github.com/TieuLongPhan/SynRXN.git
cd SynRXN
python -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"

Quick Start

from pathlib import Path
from synrxn.data import DataLoader

dl = DataLoader(
    task="classification",
    source="zenodo",
    version="1.2.1",
    cache_dir=Path("~/.cache/synrxn").expanduser(),
)

print(dl.available_names())
df = dl.load("schneider_b")
print(df.shape)
print(df.columns.tolist())

Browse the interactive Dataset Catalog to compare task, split, target, provenance, and reaction previews. It opens with the split-bearing classification/schneider_b benchmark as a concrete example. The same metadata is available in Python, including when working from a local checkout without a network request:

from synrxn import DataLoader, DatasetCatalog

catalog = DatasetCatalog()
print([item.name for item in catalog.list(task="property", has_split=True)])

local = DataLoader(task="classification", source="local", data_dir="Data")
sample = local.load(
    "schneider_b",
    columns=["r_id", "label", "split"],
    filters={"split": "test"},
    nrows=1_000,
)

Use an exact commit for development snapshots you want to reproduce later:

from pathlib import Path
from synrxn.data import DataLoader

dl = DataLoader(
    task="property",
    source="commit",
    version="3e1612e2199e8b0e369fce3ed9aff3dda68e4c32",
    cache_dir=Path("~/.cache/synrxn").expanduser(),
    gh_enable=True,
)

df = dl.load("b97xd3")
print(df[["r_id", "ea", "dh"]].head())

Data Concept

The public data lives in Data/ and is grouped by benchmark task:

Folder Purpose Example datasets Core columns
Data/aam/ Atom-atom mapping comparison uspto_3k, golden, ecoli ground_truth, mapper outputs, rxn
Data/classification/ Reaction class, template, and enzyme classification uspto_50k_b, tpl_u, ecreact rxn, labels, optional split
Data/property/ Reaction property prediction b97xd3, rgd1, sn2 aam or rxn, target values, optional split
Data/rbl/ Reaction balancing and rebalancing mos, mnc, mbs, complex unbalanced rxn, balanced ground_truth
Data/synthesis/ Synthesis and retrosynthesis datasets uspto_mit, uspto_50k, da reactions, split/source metadata, optional reagents

Reproducible Splits

from pathlib import Path
from synrxn.data import DataLoader
from synrxn.split.repeated_kfold import RepeatedKFoldsSplitter

dl = DataLoader(
    task="property",
    source="zenodo",
    version="1.2.1",
    cache_dir=Path("~/.cache/synrxn").expanduser(),
)
df = dl.load("b97xd3")

splitter = RepeatedKFoldsSplitter(
    n_splits=5,
    n_repeats=2,
    ratio=(8, 1, 1),
    shuffle=True,
    random_state=1,
)
splitter.prepare_splits(df, stratify=None)
train_df, val_df, test_df = splitter.get_split(0, 0, as_frame=True)
print(len(train_df), len(val_df), len(test_df))

Validate a Checkout

Release integrity and catalog metadata can be checked through the installed CLI:

synrxn verify-manifest --manifest manifest.json --root Data
synrxn validate --data-dir Data --metadata Data/metadata.yaml --manifest manifest.json
synrxn datasets list --task property --has-split
synrxn datasets describe property rgd1

The first command verifies every declared size and SHA-256 checksum. The second checks catalog coverage, observed schemas, row identifiers, published split values, and manifest row counts.

Query Layer and Optional Service

SynRXN does not migrate its immutable benchmark records to a relational database. Compressed CSV remains the canonical release format. Deterministic Parquet derivatives add typed, projected access, and embedded DuckDB provides SQL execution behind an allowlisted Python API without operating a database server.

synrxn parquet build --data-dir Data --output-dir Parquet
synrxn parquet verify --data-dir Data --parquet-dir Parquet
loader = DataLoader(
    task="classification",
    source="local",
    data_dir="Data",
    parquet_dir="Parquet",
)
with loader.scan("schneider_b") as scan:
    page = scan.collect(
        columns=["r_id", "label", "split"],
        filters={"split": "test"},
        limit=100,
    )

Run synrxn-service only when a deployed client needs remote, record-level pagination. It validates the derived release index before startup and exposes a bounded read-only API with OpenAPI documentation. PostgreSQL becomes useful only for future mutable shared state such as user accounts, annotations, curation workflows, or benchmark submissions—not for the release datasets.

pip install "synrxn[service]"
SYNRXN_PARQUET_DIR=Parquet SYNRXN_MANIFEST=manifest.json synrxn-service

# In a second terminal: inspect a bounded, projected page of the benchmark.
curl 'http://127.0.0.1:8000/v1/datasets/classification/schneider_b/rows?columns=r_id,label,split&filter=split%3Dtest&limit=5'

The interactive OpenAPI interface is available at http://127.0.0.1:8000/docs. The service is read-only and rejects releases whose Parquet index does not match the canonical manifest.

AAM Validation

SynRXN now requires synkit>=1.5.0,<1.6.0, and acc_aam uses SynKit's 1.5 AAMValidator. Keep its default strip_unbalanced_maps=True to reproduce the historical SynRXN metric. A full RC and ITS comparison across 5,904 reactions and four mapper outputs produced zero differences in 47,232 row-level decisions.

python script/compare_aam_validators.py --methods RC ITS --n-jobs -1

Documentation

Citation

If you use SynRXN in your research, please cite:

Tieu-Long Phan, Nhu-Ngoc Nguyen Song, and Peter F. Stadler. SynRXN: An Open Benchmark and Curated Dataset for Computational Reaction Modeling. Scientific Data 13, 625 (2026). https://doi.org/10.1038/s41597-026-07260-w

@article{phan2026synrxn,
  title = {SynRXN: An Open Benchmark and Curated Dataset for Computational Reaction Modeling},
  author = {Phan, Tieu-Long and Nguyen Song, Nhu-Ngoc and Stadler, Peter F.},
  journal = {Scientific Data},
  volume = {13},
  pages = {625},
  year = {2026},
  doi = {10.1038/s41597-026-07260-w},
  url = {https://www.nature.com/articles/s41597-026-07260-w}
}

License

This project is licensed under the MIT License. Dataset-specific terms are summarized in Data/LICENSE when applicable.

Acknowledgments

This project has received funding from the European Union's Horizon Europe Doctoral Network programme under the Marie Sklodowska-Curie grant agreement No. 101072930 (TACsy).

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

synrxn-1.2.1.tar.gz (117.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

synrxn-1.2.1-py3-none-any.whl (137.7 kB view details)

Uploaded Python 3

File details

Details for the file synrxn-1.2.1.tar.gz.

File metadata

  • Download URL: synrxn-1.2.1.tar.gz
  • Upload date:
  • Size: 117.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for synrxn-1.2.1.tar.gz
Algorithm Hash digest
SHA256 a53ef3afba0860d653130ca386b39547be68bf9104c388fabd3742ef8d2c70a7
MD5 6a09b1c74703679276584921a27c2e75
BLAKE2b-256 a79fc859b943df63e9bafaea081ae2b9d31f0425a254f5671f92a5ef36a7efe4

See more details on using hashes here.

Provenance

The following attestation bundles were made for synrxn-1.2.1.tar.gz:

Publisher: publish-package.yml on TieuLongPhan/SynRXN

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file synrxn-1.2.1-py3-none-any.whl.

File metadata

  • Download URL: synrxn-1.2.1-py3-none-any.whl
  • Upload date:
  • Size: 137.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for synrxn-1.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 d6b2ecbe988d18967668d25b87ace2563510989e6e25a65ccc468513199f27d6
MD5 eea0dd611d2e9d2c4d90509640657454
BLAKE2b-256 3f5a5484f85f07b798a8df3fe74b9e89a17add710061742f31eb42cc9d6f76b2

See more details on using hashes here.

Provenance

The following attestation bundles were made for synrxn-1.2.1-py3-none-any.whl:

Publisher: publish-package.yml on TieuLongPhan/SynRXN

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

1.2.1 This release

2 files

1.1.1

2 files

1.0.0

2 files

0.0.8

2 files

0.0.7

2 files

0.0.6

2 files

0.0.5

2 files

0.0.4

2 files

0.0.3

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page