rustmolbpe
A high-performance BPE (Byte Pair Encoding) tokenizer for molecular SMILES written in Rust with Python bindings.
Features
- Five tokenizers, one API: from a plain character-level tokenizer up to atom-level and byte-level BPE — pick the granularity you need and compare them directly
- SMILES-aware tokenization: atom-level pre-tokenization correctly handles multi-character atoms (Br, Cl), bracket atoms ([C@@H], [N+]), ring closures, and stereochemistry
- Fast training: Parallel processing with Rayon for efficient training on large molecular datasets
- Streaming support: Train on datasets of any size with configurable buffer sizes
- SMILESPE compatibility: Load and save vocabularies in SMILESPE format
- Lossless save/load:
save()/from_file()persist any tokenizer with identical token IDs - HuggingFace interop: Export to / import from the
tokenizerstokenizer.jsonformat for use withtransformers - Python bindings: Seamless integration with Python via PyO3
Installation
From PyPI (Recommended)
pip install rustmolbpe
From source (requires Rust toolchain)
# Clone the repository
git clone https://github.com/HFooladi/rustmolbpe.git
cd rustmolbpe
# Create virtual environment with uv
uv venv .venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
# Install build dependencies and build
uv pip install maturin
maturin develop --release
Development install
# Create virtual environment with uv
uv venv .venv
source .venv/bin/activate
# Install dev dependencies
uv pip install maturin pytest pytest-cov
# Development build (faster, unoptimized)
maturin develop
Quick Start
import rustmolbpe
# Create a tokenizer
tokenizer = rustmolbpe.SmilesTokenizer()
# Train on SMILES data
smiles_data = [
"CCO", # ethanol
"c1ccccc1", # benzene
"CC(=O)O", # acetic acid
# ... more SMILES
]
tokenizer.train_from_iterator(iter(smiles_data), vocab_size=1000)
# Encode SMILES
ids = tokenizer.encode("CCO")
print(ids) # e.g., [42, 15]
# Decode back to SMILES
smiles = tokenizer.decode(ids)
print(smiles) # "CCO"
# Batch encode (parallelized)
all_ids = tokenizer.batch_encode(["CCO", "c1ccccc1", "CC(=O)O"])
# Save and reload the complete tokenizer (identical token IDs)
tokenizer.save("smiles_tokenizer.json")
tokenizer = rustmolbpe.SmilesTokenizer.from_file("smiles_tokenizer.json")
# Or exchange merge rules in the SMILESPE format (IDs are reassigned on load)
tokenizer.save_vocabulary("my_vocab.txt")
Tokenizers
rustmolbpe provides five tokenizers spanning a ladder from simplest to most
advanced. They share an identical API, so you can swap one for another and
compare their behavior:
| Class | Granularity | Learns merges | Description |
|---|---|---|---|
CharTokenizer |
character | no | Splits a SMILES string into individual characters |
AtomTokenizer |
atom (regex) | no | Splits into atoms/structural tokens (Br, Cl, [C@@H] kept whole) |
CharBPETokenizer |
character | yes | BPE merges learned on top of character splitting |
SmilesTokenizer |
atom (regex) | yes | BPE merges learned on top of atom splitting ("SPE") |
ByteBPETokenizer |
byte (UTF-8) | yes | BPE merges on raw bytes; never emits <unk>, lossless round-trip |
SmilesTokenizeris also exported asAtomBPETokenizer— an exact alias of the same class (AtomBPETokenizer is SmilesTokenizer), named to match theCharBPETokenizer/ByteBPETokenizerpattern.
import rustmolbpe
char = rustmolbpe.CharTokenizer()
atom = rustmolbpe.AtomTokenizer()
# Character-level: "Cl" is two tokens ('C', 'l')
len(char.encode("CCl")) # 3
# Atom-level: chlorine "Cl" is a single token
len(atom.encode("CCl")) # 2
# BPE tokenizers are trained to merge frequent units
char_bpe = rustmolbpe.CharBPETokenizer()
char_bpe.train_from_iterator(iter(smiles_data), vocab_size=1000)
CharTokenizer and AtomTokenizer have no merges: train_from_iterator only
builds the base vocabulary (vocab_size is ignored), num_merges is always 0,
and vocabulary file I/O is not supported. Use has_vocabulary() to check
whether a base vocabulary has been built and is_trained() to check for merges.
ByteBPETokenizer pre-tokenizes on raw UTF-8 bytes. Its base alphabet is always
the 256 byte values (base_vocab_size == 260, including the 4 special tokens),
so any input is representable: it never emits <unk> and encode/decode is a
guaranteed lossless round-trip. SMILESPE and HuggingFace file I/O are not
supported (those formats store chemically-readable tokens, not raw bytes) — use
save() / from_file() to persist a byte-level tokenizer.
Comparing tokenizers on ChEMBL
tokenizer_stats.py runs every tokenizer over the ChEMBL 36 dataset and reports
per-molecule token-count statistics (mean, median, std, percentiles) as a
console table, a CSV, and a histogram figure:
pip install rustmolbpe[stats] # numpy + matplotlib
python tokenizer_stats.py # full ChEMBL 36
python tokenizer_stats.py --limit 100000 # quick sample
Special Tokens
The tokenizer includes special tokens for sequence modeling, always at fixed IDs:
| Token | ID | Purpose |
|---|---|---|
<pad> |
0 | Padding for batch processing |
<unk> |
1 | Unknown/out-of-vocabulary atoms |
<bos> |
2 | Beginning of sequence |
<eos> |
3 | End of sequence |
import rustmolbpe
tokenizer = rustmolbpe.SmilesTokenizer()
tokenizer.load_vocabulary("vocab.txt")
# Access special token IDs
print(tokenizer.pad_token_id) # 0
print(tokenizer.unk_token_id) # 1
print(tokenizer.bos_token_id) # 2
print(tokenizer.eos_token_id) # 3
# Encode with BOS/EOS tokens
ids = tokenizer.encode("CCO", add_special_tokens=True)
# [2, 667, 3] -> [<bos>, CCO, <eos>]
# Unknown atoms are encoded as UNK
ids = tokenizer.encode("C[Xx]C") # Unknown atom [Xx]
# Contains unk_token_id for unknown atoms
Batch Padding
For training transformer models, sequences need to be padded to equal length:
import rustmolbpe
tokenizer = rustmolbpe.SmilesTokenizer()
tokenizer.load_vocabulary("vocab.txt")
# Encode and pad in one step
smiles_list = ["CCO", "c1ccccc1", "CC(=O)Nc1ccc(O)cc1"]
result = tokenizer.encode_batch_padded(
smiles_list,
max_length=10, # Pad/truncate to this length
padding="right", # "right" or "left"
truncation=True, # Truncate sequences longer than max_length
add_special_tokens=True, # Add BOS/EOS tokens
return_attention_mask=True
)
print(result["input_ids"]) # [[2, 667, 3, 0, 0, ...], ...]
print(result["attention_mask"]) # [[1, 1, 1, 0, 0, ...], ...]
# Or pad pre-encoded sequences
sequences = tokenizer.batch_encode(smiles_list)
result = tokenizer.pad(
sequences,
max_length=10,
padding="right",
truncation=True,
return_attention_mask=True
)
Atom-level Tokenization
The tokenizer first splits SMILES into atom-level tokens:
import rustmolbpe
# Simple molecule
tokens = rustmolbpe.atomwise_tokenize("CCO")
# ['C', 'C', 'O']
# Halogen atoms
tokens = rustmolbpe.atomwise_tokenize("CBr")
# ['C', 'Br']
# Bracket atoms with charges/stereochemistry
tokens = rustmolbpe.atomwise_tokenize("[C@@H](O)C")
# ['[C@@H]', '(', 'O', ')', 'C']
# Aromatic rings
tokens = rustmolbpe.atomwise_tokenize("c1ccccc1")
# ['c', '1', 'c', 'c', 'c', 'c', 'c', '1']
API Reference
SmilesTokenizer
Also available as AtomBPETokenizer — an exact alias of this class.
class SmilesTokenizer:
def __init__(self) -> None:
"""Create a new tokenizer with special tokens initialized."""
def train_from_iterator(
self,
iterator: Iterator[str],
vocab_size: int,
buffer_size: int = 8192,
min_frequency: int = 2
) -> None:
"""Train the tokenizer from a SMILES iterator."""
def load_vocabulary(self, path: str) -> None:
"""Load vocabulary from SMILESPE format file."""
def save_vocabulary(self, path: str) -> None:
"""Save vocabulary to SMILESPE format file."""
def save(self, path: str) -> None:
"""Save the complete tokenizer to a lossless JSON file."""
@classmethod
def from_file(cls, path: str) -> "SmilesTokenizer":
"""Load a tokenizer saved with save() (identical token IDs)."""
def encode(self, smiles: str, add_special_tokens: bool = False) -> List[int]:
"""Encode a SMILES string to token IDs.
Args:
smiles: SMILES string to encode
add_special_tokens: If True, add BOS/EOS tokens
"""
def decode(self, ids: List[int]) -> str:
"""Decode token IDs back to SMILES string."""
def batch_encode(self, smiles_list: List[str], add_special_tokens: bool = False) -> List[List[int]]:
"""Encode multiple SMILES in parallel."""
def batch_decode(self, ids_list: List[List[int]]) -> List[str]:
"""Decode multiple token sequences in parallel."""
def pad(
self,
sequences: List[List[int]],
max_length: Optional[int] = None,
padding: str = "right",
truncation: bool = False,
return_attention_mask: bool = True
) -> Dict[str, List[List[int]]]:
"""Pad sequences to equal length.
Args:
sequences: List of token ID sequences
max_length: Target length (default: longest sequence)
padding: "right" or "left"
truncation: If True, truncate sequences longer than max_length
return_attention_mask: If True, include attention_mask in result
Returns:
Dict with "input_ids" and optionally "attention_mask"
"""
def encode_batch_padded(
self,
smiles_list: List[str],
max_length: Optional[int] = None,
padding: str = "right",
truncation: bool = False,
add_special_tokens: bool = False,
return_attention_mask: bool = True
) -> Dict[str, List[List[int]]]:
"""Encode multiple SMILES and pad to equal length.
Convenience method combining batch_encode and pad.
"""
# Vocabulary properties
@property
def vocab_size(self) -> int:
"""Total vocabulary size (special + base atoms + merges)."""
@property
def base_vocab_size(self) -> int:
"""Number of base atom tokens."""
@property
def num_merges(self) -> int:
"""Number of learned merge operations."""
# Special token properties
@property
def pad_token_id(self) -> int:
"""PAD token ID (always 0)."""
@property
def unk_token_id(self) -> int:
"""UNK token ID (always 1)."""
@property
def bos_token_id(self) -> int:
"""BOS token ID (always 2)."""
@property
def eos_token_id(self) -> int:
"""EOS token ID (always 3)."""
@property
def pad_token(self) -> str:
"""PAD token string ('<pad>')."""
@property
def unk_token(self) -> str:
"""UNK token string ('<unk>')."""
@property
def bos_token(self) -> str:
"""BOS token string ('<bos>')."""
@property
def eos_token(self) -> str:
"""EOS token string ('<eos>')."""
# Vocabulary access
def get_vocabulary(self) -> List[Tuple[str, int]]:
"""Get vocabulary as (token, id) pairs."""
def id_to_token(self, id: int) -> str:
"""Convert token ID to token string."""
def token_to_id(self, token: str) -> int:
"""Convert token string to token ID."""
# State inspection
def is_trained(self) -> bool:
"""Check if tokenizer has been trained or has vocabulary loaded."""
def get_merges(self) -> List[Tuple[str, str, str]]:
"""Get merge rules as (left, right, merged) tuples."""
# Pickle support (for serialization and multiprocessing)
# Implements __reduce__ and __setstate__ for full pickle compatibility
Utility Functions
def atomwise_tokenize(smiles: str) -> List[str]:
"""Tokenize SMILES into atom-level tokens."""
Vocabulary Format
The vocabulary file format is compatible with SMILESPE:
c c
C C
O )
c 1
= O
...
Each line contains two space-separated tokens representing a merge operation.
The file stores merge rules only, in priority order. Loading it assigns token
IDs that generally differ from the tokenizer that saved it, and base tokens that
never took part in a merge are not included. To persist a tokenizer together
with a trained model, use save() / from_file(), which restores identical IDs.
HuggingFace Interop
Export a trained tokenizer to the HuggingFace tokenizers tokenizer.json
format and use it anywhere in the HuggingFace ecosystem:
import rustmolbpe
tok = rustmolbpe.CharBPETokenizer()
tok.train_from_iterator(smiles_generator("chembl.smi"), vocab_size=8000)
tok.save_huggingface("tokenizer.json")
# Load it back into rustmolbpe...
restored = rustmolbpe.CharBPETokenizer.from_huggingface("tokenizer.json")
# ...or use it from `transformers`:
from transformers import PreTrainedTokenizerFast
hf = PreTrainedTokenizerFast(tokenizer_file="tokenizer.json")
Which tokenizers can be exported, and how they map onto HuggingFace's models:
| Class | HuggingFace representation | Fidelity |
|---|---|---|
CharTokenizer |
BPE model, no merges |
exact |
CharBPETokenizer |
BPE model with character merges |
see note |
AtomTokenizer |
WordLevel model + atom-regex Split |
exact |
SmilesTokenizer |
not supported — raises NotImplementedError |
— |
ByteBPETokenizer |
not yet supported — raises NotImplementedError |
— |
Notes:
SmilesTokenizer(atom-level BPE) cannot be expressed as a stock HuggingFace fast tokenizer: HuggingFace'sBPEmodel only merges single characters within a pre-token, so it cannot treat a multi-character atom such as[C@@H]as an atomic unit.save_huggingfaceraisesNotImplementedErrorfor it — usesave_vocabulary(SMILESPE format) instead, orCharBPETokenizerfor an exportable BPE tokenizer.- For
CharBPETokenizerthe vocabulary and merges transfer exactly, but HuggingFace applies merge-order BPE while rustmolbpe uses greedy longest-match, so individual token sequences may occasionally differ. from_huggingfaceaccepts files matching the calling class's granularity and merge profile; a mismatch raisesValueError.
Training on Large Datasets
For large datasets like ChEMBL or ZINC:
import rustmolbpe
def smiles_generator(filepath):
with open(filepath) as f:
for line in f:
yield line.strip()
tokenizer = rustmolbpe.SmilesTokenizer()
tokenizer.train_from_iterator(
smiles_generator("chembl.smi"),
vocab_size=8000,
buffer_size=16384 # Larger buffer for streaming
)
tokenizer.save_vocabulary("chembl_vocab.txt")
Running Tests
# Create venv and install dependencies
uv venv .venv
source .venv/bin/activate
uv pip install maturin pytest
# Build and run tests
maturin develop
cargo test # Rust tests
pytest tests/python/ -v # Python tests
Performance
rustmolbpe is significantly faster than the original Python SMILESPE implementation.
Benchmark Results
Benchmarks performed on ChEMBL 36 (~2.8M drug-like molecules) and PubChem (~123M diverse molecules).
Encoding Speed (100k SMILES)
| Tokenizer | Dataset | Speed (SMILES/sec) | Avg Tokens | Speedup |
|---|---|---|---|---|
| SMILESPE | ChEMBL | 5,583 | 9.3 | 1x |
| rustmolbpe | ChEMBL | 196,964 | 7.6 | 35x |
| SMILESPE | PubChem | 11,110 | 11.7 | 1x |
| rustmolbpe | PubChem | 279,834 | 6.2 | 25x |
Compression (characters per token, higher = better)
| Tokenizer | ChEMBL | PubChem |
|---|---|---|
| SMILESPE | 6.26 | 3.34 |
| rustmolbpe (ChEMBL vocab) | 8.16 | 3.69 |
| rustmolbpe (PubChem vocab) | 4.57 | 5.74 |
Training Speed (50k SMILES, vocab_size=1000)
| Dataset | SMILESPE | rustmolbpe | Speedup |
|---|---|---|---|
| ChEMBL | 16.8s | 0.96s | 18x |
| PubChem | 11.1s | 0.70s | 16x |
Large-Scale Training
| Dataset | Molecules | Training Time | Vocab Size |
|---|---|---|---|
| ChEMBL 36 | 2.8M | 102s | 8,000 |
| PubChem | 10M | 407s (~7 min) | 8,000 |
Pre-trained Vocabularies
Pre-trained vocabularies are available in the data/ directory:
chembl36_vocab.txt- Trained on ChEMBL 36 (2.8M drug-like molecules, 3,807 merges)pubchem_10M_vocab.txt- Trained on PubChem (10M diverse molecules, 2,410 merges)
import rustmolbpe
# Load pre-trained ChEMBL vocabulary
tokenizer = rustmolbpe.SmilesTokenizer()
tokenizer.load_vocabulary("data/chembl36_vocab.txt")
# Encode drug molecules efficiently
ids = tokenizer.encode("CC(=O)Nc1ccc(O)cc1") # paracetamol
Running Benchmarks
# Run the benchmark script
python benchmark.py
Datasets
Downloading Training Data
ChEMBL (drug-like molecules):
wget https://ftp.ebi.ac.uk/pub/databases/chembl/ChEMBLdb/releases/chembl_36/chembl_36_chemreps.txt.gz
gunzip chembl_36_chemreps.txt.gz
PubChem (diverse molecules):
wget https://ftp.ncbi.nlm.nih.gov/pubchem/Compound/Extras/CID-SMILES.gz
Troubleshooting
Installation Issues
"maturin not found"
uv pip install maturin
"Rust compiler not found" Install Rust from https://rustup.rs/:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
"uv not found" Install uv from https://docs.astral.sh/uv/:
curl -LsSf https://astral.sh/uv/install.sh | sh
Build fails with "VIRTUAL_ENV and CONDA_PREFIX both set"
unset CONDA_PREFIX && maturin develop --release
Runtime Issues
"Unknown token" error when decoding The token ID is not in the vocabulary. This can happen if:
- You're using a different vocabulary than the one used for encoding
- The ID is out of range
# Check vocabulary size
print(tokenizer.vocab_size)
# Verify token exists
try:
token = tokenizer.id_to_token(some_id)
except ValueError:
print(f"ID {some_id} not in vocabulary")
Unknown atoms encoded as UNK Atoms not seen during training are encoded as UNK (ID 1). Train on a larger/more diverse dataset or use a pre-trained vocabulary.
# Check if a SMILES contains unknown atoms
ids = tokenizer.encode("C[Xe]C") # Xenon might be unknown
if tokenizer.unk_token_id in ids:
print("Contains unknown atoms")
Pickle/multiprocessing errors Ensure you're using rustmolbpe >= 0.2.0 which includes pickle support.
Citation
If you use rustmolbpe in your research, please cite it:
@software{rustmolbpe,
author = {Fooladi, Hosein},
title = {rustmolbpe: A High-Performance BPE Tokenizer for Molecular SMILES},
url = {https://github.com/HFooladi/rustmolbpe},
year = {2026}
}
License
MIT
Metadata
Release files for rustmolbpe 0.5.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| rustmolbpe-0.5.0.tar.gz | 147.7 kB | Details |
Built distributions (wheels)
Total release size: 23.8 MB
Release files / rustmolbpe-0.5.0.tar.gz
| Download URL | rustmolbpe-0.5.0.tar.gz |
|---|---|
| Size | 147.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
262cf5cf050026b623605ed556e1cffebc31e6d324b4d640e1fb8792d12de8e0
|
|
BLAKE2b-256 checksum How to use checksums |
f702419b42c42c4d96e00229c3a461eda6f8e1608ca55c53899243a18918f06e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|
Release files / rustmolbpe-0.5.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | rustmolbpe-0.5.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 1.2 MB |
| Tags | Linux glibc 2.17+ x86-64 PyPy 3.11 PyPy 3.11 7.3 |
|
SHA-256 checksum How to use checksums |
12bdb2a166a8e09d4886e5f8d00acf68bbc839c09964557e0d741c351b07761b
|
|
BLAKE2b-256 checksum How to use checksums |
04e0b83233066b63548ae4228d068587003aac643b417b5441b7ea32917024ce
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|
Release files / rustmolbpe-0.5.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | rustmolbpe-0.5.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 1.2 MB |
| Tags | CPython 3.14 CPython 3.14 free-threading Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
4ff123a25b2e31d554269ed31407f1686c9769d65a0e7f03586b8fba156f7439
|
|
BLAKE2b-256 checksum How to use checksums |
e3b50bece32fdd7fe3842c3ad60000459f858ffd3de67c73ff5d1bbce4fdd8fa
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|
Release files / rustmolbpe-0.5.0-cp314-cp314-win_amd64.whl
| Download URL | rustmolbpe-0.5.0-cp314-cp314-win_amd64.whl |
|---|---|
| Size | 1.1 MB |
| Tags | CPython 3.14 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
6e43025242d8f3468d90adfe74d2ac2d8d5326891d2bb7a6f77354ca9774733b
|
|
BLAKE2b-256 checksum How to use checksums |
f10a660e894ded1f803ce481f72acc407d23ccd13fbb56e8bbda25feab8ab592
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|
Release files / rustmolbpe-0.5.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | rustmolbpe-0.5.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 1.2 MB |
| Tags | CPython 3.14 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
ae55cd4635468692aaf2ffb467896970fa0ff642fc2859ef6aaa5eef5379aa36
|
|
BLAKE2b-256 checksum How to use checksums |
15d841eb16d61a5a43da1209713d0cf2470a29df570d64359b5a63252042c331
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|
Release files / rustmolbpe-0.5.0-cp314-cp314-macosx_11_0_arm64.whl
| Download URL | rustmolbpe-0.5.0-cp314-cp314-macosx_11_0_arm64.whl |
|---|---|
| Size | 1.1 MB |
| Tags | CPython 3.14 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
67e1df3f7b810bbefb853f779a375b90bf98f5c199731906575e071714668753
|
|
BLAKE2b-256 checksum How to use checksums |
87f2847537688e86eb9aaaa87c1074cbc814a67b9bff3aae15b043bfd23a671a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|
Release files / rustmolbpe-0.5.0-cp314-cp314-macosx_10_12_x86_64.whl
| Download URL | rustmolbpe-0.5.0-cp314-cp314-macosx_10_12_x86_64.whl |
|---|---|
| Size | 1.1 MB |
| Tags | CPython 3.14 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
70b6c08c869e32c58d932947c7f3948dd63d00393bdd01fcffb649513f96e6bc
|
|
BLAKE2b-256 checksum How to use checksums |
f03fef3fa939c4c9cb8fc6f0c1dacbee8d9d10ba2111839ff26cca7bd1475c53
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|
Release files / rustmolbpe-0.5.0-cp313-cp313-win_amd64.whl
| Download URL | rustmolbpe-0.5.0-cp313-cp313-win_amd64.whl |
|---|---|
| Size | 1.1 MB |
| Tags | CPython 3.13 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
aaa601bb795b26c6015d57ab31e5c65d859e4849b169878cb13898078be5b1c3
|
|
BLAKE2b-256 checksum How to use checksums |
0168a7ac4099a88fd3945e5c7dc3396a991b56e110651baf7285f71321a5b23d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|
Release files / rustmolbpe-0.5.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | rustmolbpe-0.5.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 1.2 MB |
| Tags | CPython 3.13 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
c7725d770031340f44574fcb6d57e38c920efa31d9bd78de6304c2d704bc3674
|
|
BLAKE2b-256 checksum How to use checksums |
0968cdd44d873207e8a65d488724920a8d0387dd4a59886957171cc93d041e27
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|
Release files / rustmolbpe-0.5.0-cp313-cp313-macosx_11_0_arm64.whl
| Download URL | rustmolbpe-0.5.0-cp313-cp313-macosx_11_0_arm64.whl |
|---|---|
| Size | 1.1 MB |
| Tags | CPython 3.13 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
80f738c024beaa8eac472b3febbf8383c74eb1ab57a1c799d6e52e6122a73e68
|
|
BLAKE2b-256 checksum How to use checksums |
d7d31cb478e52d32c78078897022a9f397ffb4eb895299de99d13b303a3f616e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|
Release files / rustmolbpe-0.5.0-cp313-cp313-macosx_10_12_x86_64.whl
| Download URL | rustmolbpe-0.5.0-cp313-cp313-macosx_10_12_x86_64.whl |
|---|---|
| Size | 1.1 MB |
| Tags | CPython 3.13 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
53b3a86338e2d4cc42291e5d58655e1f4b4af47051ee4fbaf39c4373e7c230fe
|
|
BLAKE2b-256 checksum How to use checksums |
d6bad2050320138aa0280ef2abbde92ef319abe3d989c5d8b0d13b1be084aaf9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|
Release files / rustmolbpe-0.5.0-cp312-cp312-win_amd64.whl
| Download URL | rustmolbpe-0.5.0-cp312-cp312-win_amd64.whl |
|---|---|
| Size | 1.1 MB |
| Tags | CPython 3.12 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
6aff234b1681617a949c603f2b0041218b7e3207ed6ad09802e7dd77c93afd2d
|
|
BLAKE2b-256 checksum How to use checksums |
ac5f96924215fe5606b7a7ca4ceab830d98009775d854e3f180a0205af6505f4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|
Release files / rustmolbpe-0.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | rustmolbpe-0.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 1.2 MB |
| Tags | CPython 3.12 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
4ec246b246c2255b0f33ecd78d859781f849390a1ee795320f6d34e70a70a048
|
|
BLAKE2b-256 checksum How to use checksums |
2c0d427219bceb2deb0b93f17efaccda19afd00326c751e25ef09f636de85bfd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|
Release files / rustmolbpe-0.5.0-cp312-cp312-macosx_11_0_arm64.whl
| Download URL | rustmolbpe-0.5.0-cp312-cp312-macosx_11_0_arm64.whl |
|---|---|
| Size | 1.1 MB |
| Tags | CPython 3.12 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
faee4c3aea56cee4937afa6aa2aea3dbe5b40b59402457bb9b68c00cae75e3d8
|
|
BLAKE2b-256 checksum How to use checksums |
7fdcf24820f9137d80a42dc930cbc7f1e49be03d5c2d2aaa10a9ce4a412cc3c3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|
Release files / rustmolbpe-0.5.0-cp312-cp312-macosx_10_12_x86_64.whl
| Download URL | rustmolbpe-0.5.0-cp312-cp312-macosx_10_12_x86_64.whl |
|---|---|
| Size | 1.1 MB |
| Tags | CPython 3.12 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
c17ddfe7723fa45e2cbc3395c469f3a00d76fd8991b9dbc0027816a937b71b3a
|
|
BLAKE2b-256 checksum How to use checksums |
34d89ad67c6dccd3721386d1d21c67c1d517970ec8acbd7335ac5a96933b1201
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|
Release files / rustmolbpe-0.5.0-cp311-cp311-win_amd64.whl
| Download URL | rustmolbpe-0.5.0-cp311-cp311-win_amd64.whl |
|---|---|
| Size | 1.1 MB |
| Tags | CPython 3.11 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
2e7246afcafd43e2ab562bf5c19e083c60cc397f1c1073f7dfdde12720d9fff7
|
|
BLAKE2b-256 checksum How to use checksums |
c8900fabb4d12133479dcfd29e6d3c13918d49c881682310c872ce32b2c3d693
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|
Release files / rustmolbpe-0.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | rustmolbpe-0.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 1.2 MB |
| Tags | CPython 3.11 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
f312fc0249770c613130116e4ff8b19e97cef90492f6bcc16b8d09c2ba17ad80
|
|
BLAKE2b-256 checksum How to use checksums |
5ededaa1e886e1ce3b44878bc1eec29e192ca0d0c5e7f2b7b157b597e3d72592
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|
Release files / rustmolbpe-0.5.0-cp311-cp311-macosx_11_0_arm64.whl
| Download URL | rustmolbpe-0.5.0-cp311-cp311-macosx_11_0_arm64.whl |
|---|---|
| Size | 1.1 MB |
| Tags | CPython 3.11 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
36510d940419c9e6fa40b2a8c1ac9f371328c07c05a8390bb4fa103442e38ea3
|
|
BLAKE2b-256 checksum How to use checksums |
08ecbf64582772723ad7cbf06d5da13166bd243a7943be2bcb0c63e18f2b53f4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|
Release files / rustmolbpe-0.5.0-cp311-cp311-macosx_10_12_x86_64.whl
| Download URL | rustmolbpe-0.5.0-cp311-cp311-macosx_10_12_x86_64.whl |
|---|---|
| Size | 1.1 MB |
| Tags | CPython 3.11 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
9c413b57c8a0a5b36c0c9dc8820918bce300f95b9a37f7fcedc96b0f6234b9d9
|
|
BLAKE2b-256 checksum How to use checksums |
ffddb4449a5daa40d53d95e3a21c3ff7c425d69615afa4f3d86f176c6007fd5c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|
Release files / rustmolbpe-0.5.0-cp310-cp310-win_amd64.whl
| Download URL | rustmolbpe-0.5.0-cp310-cp310-win_amd64.whl |
|---|---|
| Size | 1.1 MB |
| Tags | CPython 3.10 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
b1344b6c6ab948bbb0d4ee77dd6d98a081d70b57b3f4b78c07f48576f20dba52
|
|
BLAKE2b-256 checksum How to use checksums |
3b62a4f425ab291bcb75ed8f76605bd854aa6ab008da554d0d1062acf8846481
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|
Release files / rustmolbpe-0.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | rustmolbpe-0.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 1.2 MB |
| Tags | CPython 3.10 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
2cf9a47248532923cebb8d4bcb60a2f837d4da3f0d9d09e68c42f44864665c7e
|
|
BLAKE2b-256 checksum How to use checksums |
387a5118bc1aedf43e6a5d05a437b68f6fd3f0b17c1c2e773a1ef88033bb02e6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|
Release files / rustmolbpe-0.5.0-cp310-cp310-macosx_10_12_x86_64.whl
| Download URL | rustmolbpe-0.5.0-cp310-cp310-macosx_10_12_x86_64.whl |
|---|---|
| Size | 1.1 MB |
| Tags | CPython 3.10 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
8bd50eb7cfad5e8b8484cd0ddd9f3dad7d57b90271d4ef08ebf3930af8641c8c
|
|
BLAKE2b-256 checksum How to use checksums |
2cccbce87ab787c69d05aa3f7ee55948449e51ee2a50990a224441e13c887269
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|