Skip to main content

A BPE (Byte Pair Encoding) tokenizer for molecular SMILES written in Rust with Python bindings

Project description

rustmolbpe

CI codecov

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 tokenizers tokenizer.json format for use with transformers
  • 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 four 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")
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.

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

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

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, 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

Project details


Download files

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

Source Distribution

rustmolbpe-0.3.0.tar.gz (106.6 kB view details)

Uploaded Source

Built Distributions

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

rustmolbpe-0.3.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.1 MB view details)

Uploaded PyPymanylinux: glibc 2.17+ x86-64

rustmolbpe-0.3.0-cp314-cp314-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.14Windows x86-64

rustmolbpe-0.3.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ x86-64

rustmolbpe-0.3.0-cp314-cp314-macosx_11_0_arm64.whl (1.0 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

rustmolbpe-0.3.0-cp314-cp314-macosx_10_12_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.14macOS 10.12+ x86-64

rustmolbpe-0.3.0-cp313-cp313-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.13Windows x86-64

rustmolbpe-0.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

rustmolbpe-0.3.0-cp313-cp313-macosx_11_0_arm64.whl (1.0 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

rustmolbpe-0.3.0-cp313-cp313-macosx_10_12_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.13macOS 10.12+ x86-64

rustmolbpe-0.3.0-cp312-cp312-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.12Windows x86-64

rustmolbpe-0.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

rustmolbpe-0.3.0-cp312-cp312-macosx_11_0_arm64.whl (1.0 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

rustmolbpe-0.3.0-cp312-cp312-macosx_10_12_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.12macOS 10.12+ x86-64

rustmolbpe-0.3.0-cp311-cp311-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.11Windows x86-64

rustmolbpe-0.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

rustmolbpe-0.3.0-cp311-cp311-macosx_11_0_arm64.whl (1.0 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

rustmolbpe-0.3.0-cp311-cp311-macosx_10_12_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.11macOS 10.12+ x86-64

rustmolbpe-0.3.0-cp310-cp310-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.10Windows x86-64

rustmolbpe-0.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

rustmolbpe-0.3.0-cp310-cp310-macosx_10_12_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.10macOS 10.12+ x86-64

rustmolbpe-0.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

File details

Details for the file rustmolbpe-0.3.0.tar.gz.

File metadata

  • Download URL: rustmolbpe-0.3.0.tar.gz
  • Upload date:
  • Size: 106.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: maturin/1.13.3

File hashes

Hashes for rustmolbpe-0.3.0.tar.gz
Algorithm Hash digest
SHA256 c0266fb15b451fcf819e1462e4f20518a2694939cfe7b5c85caebb2d15747472
MD5 b9be39dbed800552e6a0ad7319c2885a
BLAKE2b-256 7c933fdaf31854b80f50eb96afe7f371488c6c7214ff4219cfaf3390636e450a

See more details on using hashes here.

File details

Details for the file rustmolbpe-0.3.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rustmolbpe-0.3.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d3adc12ee4543d3a8551bd07963d757bd282db9196f62cd7351c310f4ace14fb
MD5 1eb46b20c9b8e1e008d4a0193b13ac86
BLAKE2b-256 0602243a7121452e3e4a52cea1fbbe551949d3360687b040be3279f693770493

See more details on using hashes here.

File details

Details for the file rustmolbpe-0.3.0-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for rustmolbpe-0.3.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 f16fe0da28023f0647fa859199487f337f5b52080592d475c18bee08461ad8fc
MD5 e1af78fd5b1ce68d77c3c62edc95166e
BLAKE2b-256 481996b037f929525dc742dc9daad52ec093e0555f4bc274f948926c184a8d2b

See more details on using hashes here.

File details

Details for the file rustmolbpe-0.3.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rustmolbpe-0.3.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 13f7794d7504c7592e717e9908c092113a0c02715e6cbb1d332d64d06823b877
MD5 0755a7369efe36f847e897065229516b
BLAKE2b-256 721760b0bfdb27108096cd902f3c0f051100761057d09a7961d7e5a206dc11d2

See more details on using hashes here.

File details

Details for the file rustmolbpe-0.3.0-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for rustmolbpe-0.3.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4cabcc58118377356ac0741786101c1451c879868ba48d112437e57e6f984e81
MD5 e9d6306ee67c5881cc56b0ebdf00466c
BLAKE2b-256 54ef2a971535570330347ec5aeb95d1c16aedd5a1847a26548d4543cd054068b

See more details on using hashes here.

File details

Details for the file rustmolbpe-0.3.0-cp314-cp314-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for rustmolbpe-0.3.0-cp314-cp314-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 075a480d67de5158eaf4d37bc23a0a6abafc92f5113a5e47b121b8b275bde93b
MD5 17e5af2b6a53e3fbba32d78e8c95f69a
BLAKE2b-256 8feed3738e34e3be071335726851bf4144d3a0a07e84ed26c4be5c9f36850f7e

See more details on using hashes here.

File details

Details for the file rustmolbpe-0.3.0-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for rustmolbpe-0.3.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 8fb1118c8011fe14d344e1b7306f6f66fe9fb39e626337540063bf690ca7dbd9
MD5 b3a098ada44ffe9b28fd9e1338e9d619
BLAKE2b-256 fadf6be05a4000214949110f691432c0f85159eec7434ba3ba5bcb196ba9ea45

See more details on using hashes here.

File details

Details for the file rustmolbpe-0.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rustmolbpe-0.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 99c7490ceb759c17b88514fdfbac576db0b14cbee9ee315ce1a8e7be55d1c3b5
MD5 88d20225bde68be0ba0d47acac49a0b1
BLAKE2b-256 b04441ee1f4e7afd99eb7bcc7c910fa98c4e435244baf3af83c498df223c7e8e

See more details on using hashes here.

File details

Details for the file rustmolbpe-0.3.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for rustmolbpe-0.3.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f56c3fe52b326471ea842cb60ddc6cc497880fb9cdb4f7e828edd8cb997ddf4f
MD5 60e7b703da7956f437b5c10405bf15fd
BLAKE2b-256 020d34d606cfede46f34ba37c80fdca8213a622eedb451e57b40201d66db37d0

See more details on using hashes here.

File details

Details for the file rustmolbpe-0.3.0-cp313-cp313-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for rustmolbpe-0.3.0-cp313-cp313-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 f50a25af5def2323083f880b9620c78d496c7f5b31702a8d5e8d7f8352c5a214
MD5 d711fdbb41bbc259fad6b49a428b08c7
BLAKE2b-256 d8771cd00ab9cdb8a170d49a883045846d80bdd9ff3e61c641f07ca493c13c04

See more details on using hashes here.

File details

Details for the file rustmolbpe-0.3.0-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for rustmolbpe-0.3.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 5168ee4fde36f9c745080a497be5a3b7c8ec93694c8912d7da833f44ae387684
MD5 4332aef5fcd4c2b2bb8ea8bc97b24cd1
BLAKE2b-256 1c99fe23a93df7e7949a994501cc5ebb70d93342602f2c650e3f4c4526481518

See more details on using hashes here.

File details

Details for the file rustmolbpe-0.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rustmolbpe-0.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b1ed53003f448e30b2fb10716b5a51ca30a2aef964f33cd8fcff2f46c58dbfe5
MD5 c04821fdd6e96c06174cdd1916d26c70
BLAKE2b-256 3b3a9b3f87dea133508cbab051e018fd79c47f36dc6c12669d007e28b41f14b7

See more details on using hashes here.

File details

Details for the file rustmolbpe-0.3.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for rustmolbpe-0.3.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 bf81d07a1b3d183d7c2a99156c8719c33da2e5bf481fc01e0a6e27e2f5de53ae
MD5 ef2f11fd6a45360478bb74405490aee8
BLAKE2b-256 b768f2a265c85fafb4cd93f75d52ef26fb5f71e445230b30e568c8b20719e242

See more details on using hashes here.

File details

Details for the file rustmolbpe-0.3.0-cp312-cp312-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for rustmolbpe-0.3.0-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 78aebf33b233f36481a3e7c56fe99159018614ee89bc5efbb843122bff72a21d
MD5 a000f7964f37b4caa63b7a8fe9cef477
BLAKE2b-256 01699f7ca91ecdd36a266fc49e80d3e9842d613c00608c16eccc488783e23e09

See more details on using hashes here.

File details

Details for the file rustmolbpe-0.3.0-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for rustmolbpe-0.3.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 9dae1b54f0e0591bebe294cd94d8fa5a6e48bee8f91999e3665a01389eda42e1
MD5 f9104caefbc336805d2edd1a1f8a296c
BLAKE2b-256 4ece076b58f7d867159a894d4e5f9baef61b9ecdf290ad82f190341e067982ae

See more details on using hashes here.

File details

Details for the file rustmolbpe-0.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rustmolbpe-0.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 87dd569d8e22435c02f8298208e32a5f7b9e3b6538ec3570250c79b45a7afdd0
MD5 a9f3c81a19735086891233d45d798ea9
BLAKE2b-256 5a1ea2b08280f0ae106a2c79845d1fac888731a1bd1af1cb75d9fe4199da96c5

See more details on using hashes here.

File details

Details for the file rustmolbpe-0.3.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for rustmolbpe-0.3.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 99193771d6a1a40f2d7aa4c299310c2a1ebe4fb7e67190885fc1139f8ad69112
MD5 1b12741a95aac5df8255c4d8e3e62926
BLAKE2b-256 0b8008ab08263afb98895c66c1c2d2d5bbae851266980ddc990b005a4f8454a7

See more details on using hashes here.

File details

Details for the file rustmolbpe-0.3.0-cp311-cp311-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for rustmolbpe-0.3.0-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 38390535d04b99bf24ae9fe90efad31fa9ff0f3de41bb1cd674b2146dd839cd4
MD5 42cc2216ebd10bfcbefec86ccd619e5b
BLAKE2b-256 2ee00fe5454c642d2980a5c1d6ea35f3fa6c87c4f44e537181eb19ee5ba8b461

See more details on using hashes here.

File details

Details for the file rustmolbpe-0.3.0-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for rustmolbpe-0.3.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 dea138f42a8e607121ee5ffcffed3919f89efd51a7e381f225f218f40476f4c5
MD5 dfb6595d04b0b8d914d78d34d875a61f
BLAKE2b-256 8ec43320992b921c001817efa477000dc6b77fde91e6115f46f6d700da553980

See more details on using hashes here.

File details

Details for the file rustmolbpe-0.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rustmolbpe-0.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c9920f91cd31a7812ee33b9ad0a7b823307ab45187e3205cc407166a8fbb2065
MD5 56c1f3f3bcd98f7ee84ff79b9c1f067b
BLAKE2b-256 89cf99254df02813b21d3c704a04c2b046f15154b5e38724b083b057f7e52eb9

See more details on using hashes here.

File details

Details for the file rustmolbpe-0.3.0-cp310-cp310-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for rustmolbpe-0.3.0-cp310-cp310-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 08d5d59a25e4b555aa12ff9e0aebd764fe0851a174700403472adb133467e080
MD5 09b3731561b1f76866552076f02fb247
BLAKE2b-256 cae9dd3dcded0fbe40b704446e7038c6caf5264803a32e308af3705fce0200f1

See more details on using hashes here.

File details

Details for the file rustmolbpe-0.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rustmolbpe-0.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 14707589356fe6eeac895bbce58c424c27474a2e733e21dd8cf4626b522826e6
MD5 2c58e7f25d85a56dde04ed51fb58d1a5
BLAKE2b-256 1c342172eac189edbfa8b95605e4186c87d123ddf7983193a25aa5787012ca1a

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page