rustmolbpe
A high-performance BPE (Byte Pair Encoding) tokenizer for molecular SMILES written in Rust with Python bindings.
Features
- Four tokenizers, one API: from a plain character-level tokenizer up to atom-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
- 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/load vocabulary
tokenizer.save_vocabulary("my_vocab.txt")
tokenizer.load_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
pickle 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 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.
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, 7,715 merges)pubchem_10M_vocab.txt- Trained on PubChem (10M diverse molecules, 6,385 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.4.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.4.0.tar.gz | 112.7 kB | Details |
Built distributions (wheels)
Total release size: 24.5 MB
Release files / rustmolbpe-0.4.0.tar.gz
| Download URL | rustmolbpe-0.4.0.tar.gz |
|---|---|
| Size | 112.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f3d164fcee94f30cf6d04ef9c98edcb012e69ac30377bad8fc9795f074a7d644
|
|
BLAKE2b-256 checksum How to use checksums |
20a230f0bfe58990302b9ec201fdbf74b347b6c4827aee1ee4ccca56a1db92e9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|
Release files / rustmolbpe-0.4.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | rustmolbpe-0.4.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 |
4de826f49fb4971e20445db97bfa36a79758330c2bc43691b63f7bb2f2b1226d
|
|
BLAKE2b-256 checksum How to use checksums |
c52ee6334cb1727102b218c692fa048b4a13a367421474957bbe0ee91fd77f71
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|
Release files / rustmolbpe-0.4.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | rustmolbpe-0.4.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 |
fc5632b3e4ecf32b4e8dcfef8960da51f134521050ead78dce50aad3fc74db42
|
|
BLAKE2b-256 checksum How to use checksums |
08977fa885b324ea4be9c6b87b939c3ca633ce0faa279efca1b316901584423a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|
Release files / rustmolbpe-0.4.0-cp314-cp314-win_amd64.whl
| Download URL | rustmolbpe-0.4.0-cp314-cp314-win_amd64.whl |
|---|---|
| Size | 1.1 MB |
| Tags | CPython 3.14 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
6f14b195480acbb7523a9b326eb1640ad12dfe656016e9b918815100b9ac4f50
|
|
BLAKE2b-256 checksum How to use checksums |
9ed3abee14833680d760949fc55d8f8b2cfe5e19cb46dc56166da829bf2e7760
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|
Release files / rustmolbpe-0.4.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | rustmolbpe-0.4.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 |
d87255292f270f9064d500e58312344210c4a7e550f052c88f5a607f7b6173c2
|
|
BLAKE2b-256 checksum How to use checksums |
3c8cb7189828e86c5f4f54e894b272b50d611e39d6b9db0441ac844844b8bc54
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|
Release files / rustmolbpe-0.4.0-cp314-cp314-macosx_11_0_arm64.whl
| Download URL | rustmolbpe-0.4.0-cp314-cp314-macosx_11_0_arm64.whl |
|---|---|
| Size | 1.0 MB |
| Tags | CPython 3.14 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
c22fdd66c9e2dae5e4d1f66b80e295f2602a770f826f87bc8a236f300a78f741
|
|
BLAKE2b-256 checksum How to use checksums |
151fc0136672a74903af9c439d8d4c23568bf04b20bd6f3b310f4a7fb4655620
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|
Release files / rustmolbpe-0.4.0-cp314-cp314-macosx_10_12_x86_64.whl
| Download URL | rustmolbpe-0.4.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 |
e25e16d72eecc610438a008d679106739cd911d9d6f06c92b5d627944b497718
|
|
BLAKE2b-256 checksum How to use checksums |
f984c297d22dca41751aea0ecfcbfb07de0825ae98741509ce2f575bd9b7b8cb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|
Release files / rustmolbpe-0.4.0-cp313-cp313-win_amd64.whl
| Download URL | rustmolbpe-0.4.0-cp313-cp313-win_amd64.whl |
|---|---|
| Size | 1.1 MB |
| Tags | CPython 3.13 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
da41cde61cb9cda2f2f7afdd5809c10dd6b357bde04e27e65376ba5c161eb744
|
|
BLAKE2b-256 checksum How to use checksums |
688b0258bbc020507bd68b56c84dc253e838efe6df9b23e6a10429cc6fe198e8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|
Release files / rustmolbpe-0.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | rustmolbpe-0.4.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 |
38a16f2ec01cb106d7e9da008e898f339d6d65c9f4d31cb6955cb8ab2890bee5
|
|
BLAKE2b-256 checksum How to use checksums |
0e4f6cfe28a87d210fefb47a36a2fe266b02a44a042ddb299dafd66719e3a21e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|
Release files / rustmolbpe-0.4.0-cp313-cp313-macosx_11_0_arm64.whl
| Download URL | rustmolbpe-0.4.0-cp313-cp313-macosx_11_0_arm64.whl |
|---|---|
| Size | 1.0 MB |
| Tags | CPython 3.13 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
1ab7027fa121056f1bd9c655a6aedc122da7c15eefbe4fd84eb30ac5029cedd7
|
|
BLAKE2b-256 checksum How to use checksums |
8fa2832dda400960314613d92475084e6501898a3ad252831c416137142a91bc
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|
Release files / rustmolbpe-0.4.0-cp313-cp313-macosx_10_12_x86_64.whl
| Download URL | rustmolbpe-0.4.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 |
11d06938eefb502d8bbc88630c4275fa8418646a3c2966f4d57daafba597f4bf
|
|
BLAKE2b-256 checksum How to use checksums |
4559f62f351b525938942bebfafb2784cb7a590d2f05693154e7dd2993e8d976
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|
Release files / rustmolbpe-0.4.0-cp312-cp312-win_amd64.whl
| Download URL | rustmolbpe-0.4.0-cp312-cp312-win_amd64.whl |
|---|---|
| Size | 1.1 MB |
| Tags | CPython 3.12 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
3d6c967a446987149d0b0d2b53fc0b4f164a0b311c08da65b823a66816b401fa
|
|
BLAKE2b-256 checksum How to use checksums |
2e0759f141a77a16208d8fe614743c8e3a0be643c1fb97fdceb8d9aa57289623
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|
Release files / rustmolbpe-0.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | rustmolbpe-0.4.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 |
1cab4b8881a27407f7700f29001f27f233da6ffc2a9406d097b4ee424bb5ba23
|
|
BLAKE2b-256 checksum How to use checksums |
e9f7ab35fd85d1e5168960aa85f42b047c3ae4a2c01739475c8664f0a938e95d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|
Release files / rustmolbpe-0.4.0-cp312-cp312-macosx_11_0_arm64.whl
| Download URL | rustmolbpe-0.4.0-cp312-cp312-macosx_11_0_arm64.whl |
|---|---|
| Size | 1.0 MB |
| Tags | CPython 3.12 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
cfbc42dd2625c0189ed8581100359797e03d67fefb32ef33d69ae273fd6facc0
|
|
BLAKE2b-256 checksum How to use checksums |
f178bec53894dcb7ecec001f35a216128b501f4765f94e5133f691bd79d6a4b4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|
Release files / rustmolbpe-0.4.0-cp312-cp312-macosx_10_12_x86_64.whl
| Download URL | rustmolbpe-0.4.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 |
995cb2252c0d0b3715ca95b9c92ca5edfab25bdd82c3b638574fd21f6b4d7167
|
|
BLAKE2b-256 checksum How to use checksums |
a26002d284bc99f8e9921160d909396b9ff9b76db0771931ca84e3c71662066d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|
Release files / rustmolbpe-0.4.0-cp311-cp311-win_amd64.whl
| Download URL | rustmolbpe-0.4.0-cp311-cp311-win_amd64.whl |
|---|---|
| Size | 1.1 MB |
| Tags | CPython 3.11 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
63236d761937d618066583a7c65c55bb601b05f79eadc7c45d5edb041d4b7f39
|
|
BLAKE2b-256 checksum How to use checksums |
028c5ea57d98f6e260ecfeb30ba1fd0cd235a29dadb102a17f220cf759802829
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|
Release files / rustmolbpe-0.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | rustmolbpe-0.4.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 |
ea1583d56c8d7fb26bd1166a386f56ef483366066e1180dd0ed1b5479aa2496a
|
|
BLAKE2b-256 checksum How to use checksums |
dc55dc5d7f14c1b43f07c21bdeb84ad6c7f382c2276788053d7dffd3fceb390b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|
Release files / rustmolbpe-0.4.0-cp311-cp311-macosx_11_0_arm64.whl
| Download URL | rustmolbpe-0.4.0-cp311-cp311-macosx_11_0_arm64.whl |
|---|---|
| Size | 1.0 MB |
| Tags | CPython 3.11 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
e76b7994fdd6a4240b961d8569cd3424f7ddcc2e300f42c9128c00807289c2ae
|
|
BLAKE2b-256 checksum How to use checksums |
fcded93c258cc8b7d123f3f331ca6d337106a93e8f717de251f526290e431bd8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|
Release files / rustmolbpe-0.4.0-cp311-cp311-macosx_10_12_x86_64.whl
| Download URL | rustmolbpe-0.4.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 |
30aea49264c33003b856882e152b7d299ddf58b6836b60a3484282a0aa449d4a
|
|
BLAKE2b-256 checksum How to use checksums |
7310d890c44039ed2d5b2cf59cb34e3d93158b7b6bdbfcfa3aae0c759ba834ee
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|
Release files / rustmolbpe-0.4.0-cp310-cp310-win_amd64.whl
| Download URL | rustmolbpe-0.4.0-cp310-cp310-win_amd64.whl |
|---|---|
| Size | 1.1 MB |
| Tags | CPython 3.10 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
16f1b3d3509b20d49edc7f17a00d0916f915c0dde4fee9938bec4d34d6895c3a
|
|
BLAKE2b-256 checksum How to use checksums |
f1af9015252539887cc1c8a487df0f590e9afb247cc67d39cb0943205db65951
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|
Release files / rustmolbpe-0.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | rustmolbpe-0.4.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 |
0fe515fa5ed316015e2f991bac9eebca1dab81f94e0dc695a0e177f83157acb5
|
|
BLAKE2b-256 checksum How to use checksums |
96fa9f891cc9bd502bd0a66c390236ca2ac1b1748872c3f47228fb128f1c6d20
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|
Release files / rustmolbpe-0.4.0-cp310-cp310-macosx_10_12_x86_64.whl
| Download URL | rustmolbpe-0.4.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 |
1162d50e0c7da78d1af0298b63f6fa10e968eea91ea52b1047fece7981181b7e
|
|
BLAKE2b-256 checksum How to use checksums |
e589838f54db55f7692b78bb9fe2dd73b46f7403ee31427f573075176e526893
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|
Release files / rustmolbpe-0.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | rustmolbpe-0.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 1.2 MB |
| Tags | CPython 3.9 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
2a8b3bec90f4aa390c49c277520348b7725dd8e426b6263b80e57b49ed86b9a8
|
|
BLAKE2b-256 checksum How to use checksums |
ef736202b92ac2a6ef4637ac615b9235cb38f1464d9b9c1852947dc5dacfc61c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.15.0
|