Skip to main content

rustmolbpe

CI codecov

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 tokenizers tokenizer.json format for use with transformers
  • Python bindings: Seamless integration with Python via PyO3

Installation

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

SmilesTokenizer is also exported as AtomBPETokenizer — an exact alias of the same class (AtomBPETokenizer is SmilesTokenizer), named to match the CharBPETokenizer / ByteBPETokenizer pattern.

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's BPE model 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_huggingface raises NotImplementedError for it — use save_vocabulary (SMILESPE format) instead, or CharBPETokenizer for an exportable BPE tokenizer.
  • For CharBPETokenizer the 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_huggingface accepts files matching the calling class's granularity and merge profile; a mismatch raises ValueError.

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)

Source distribution for rustmolbpe 0.5.0
File Size Uploaded
rustmolbpe-0.5.0.tar.gz 147.7 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for rustmolbpe 0.5.0
File
rustmolbpe-0.5.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl PyPy 3.11 PyPy 3.11 7.3 Linux glibc 2.17+ x86-64 Details
rustmolbpe-0.5.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.14 CPython 3.14 free-threading Linux glibc 2.17+ x86-64 Details
rustmolbpe-0.5.0-cp314-cp314-win_amd64.whl CPython 3.14 CPython 3.14 Windows x86-64 Details
rustmolbpe-0.5.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.14 CPython 3.14 Linux glibc 2.17+ x86-64 Details
rustmolbpe-0.5.0-cp314-cp314-macosx_11_0_arm64.whl CPython 3.14 CPython 3.14 macOS 11.0+ ARM64 Details
rustmolbpe-0.5.0-cp314-cp314-macosx_10_12_x86_64.whl CPython 3.14 CPython 3.14 macOS 10.12+ x86-64 Details
rustmolbpe-0.5.0-cp313-cp313-win_amd64.whl CPython 3.13 CPython 3.13 Windows x86-64 Details
rustmolbpe-0.5.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.13 CPython 3.13 Linux glibc 2.17+ x86-64 Details
rustmolbpe-0.5.0-cp313-cp313-macosx_11_0_arm64.whl CPython 3.13 CPython 3.13 macOS 11.0+ ARM64 Details
rustmolbpe-0.5.0-cp313-cp313-macosx_10_12_x86_64.whl CPython 3.13 CPython 3.13 macOS 10.12+ x86-64 Details
rustmolbpe-0.5.0-cp312-cp312-win_amd64.whl CPython 3.12 CPython 3.12 Windows x86-64 Details
rustmolbpe-0.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.12 CPython 3.12 Linux glibc 2.17+ x86-64 Details
rustmolbpe-0.5.0-cp312-cp312-macosx_11_0_arm64.whl CPython 3.12 CPython 3.12 macOS 11.0+ ARM64 Details
rustmolbpe-0.5.0-cp312-cp312-macosx_10_12_x86_64.whl CPython 3.12 CPython 3.12 macOS 10.12+ x86-64 Details
rustmolbpe-0.5.0-cp311-cp311-win_amd64.whl CPython 3.11 CPython 3.11 Windows x86-64 Details
rustmolbpe-0.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.11 CPython 3.11 Linux glibc 2.17+ x86-64 Details
rustmolbpe-0.5.0-cp311-cp311-macosx_11_0_arm64.whl CPython 3.11 CPython 3.11 macOS 11.0+ ARM64 Details
rustmolbpe-0.5.0-cp311-cp311-macosx_10_12_x86_64.whl CPython 3.11 CPython 3.11 macOS 10.12+ x86-64 Details
rustmolbpe-0.5.0-cp310-cp310-win_amd64.whl CPython 3.10 CPython 3.10 Windows x86-64 Details
rustmolbpe-0.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.10 CPython 3.10 Linux glibc 2.17+ x86-64 Details
rustmolbpe-0.5.0-cp310-cp310-macosx_10_12_x86_64.whl CPython 3.10 CPython 3.10 macOS 10.12+ x86-64 Details

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

Release history Release notifications | RSS feed

This release

0.5.0 This release

22 release files

0.4.0

23 release files

0.3.0

22 release 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