Skip to main content

A high-performance, O(P) data structure for weighted random sampling of binned probabilities, ideal for large-scale simulations.

Project description

DigitBinIndex

A DigitBinIndex is a tree-based data structure designed for efficient weighted random selection and removal from large collections of items. It is optimized for scenarios involving millions of items where probabilities are approximate and high performance is critical, such as simulations for Wallenius' noncentral hypergeometric distribution or Fisher's noncentral hypergeometric distribution.

This library provides high-performance solutions for both major types of noncentral hypergeometric distributions:

  • Sequential Sampling (Wallenius'): Modeled by select_and_remove, where items are selected and removed one at a time.
  • Simultaneous Sampling (Fisher's): Modeled by select_many_and_remove, where a batch of unique items is selected and removed together.

The Core Problem

In simulations, forecasts, or statistical models (e.g., mortality models, Monte Carlo simulations, or machine learning sampling), managing a large, dynamic set of probabilities is common. A key task is to randomly select items based on their weights, often removing them afterward, and repeat this process efficiently. For datasets with millions of items, achieving high performance while maintaining reasonable accuracy is a significant challenge, especially for complex distributions like Wallenius' or Fisher's.

How It Works

DigitBinIndex is a radix tree that organizes items into bins based on the decimal digits of their rescaled probabilities, enabling fast weighted random selection and updates.

  1. Digit-based Tree Structure: Each level of the tree corresponds to a decimal place of the rescaled weight. For example, a weight of 0.543 at precision 3 is rescaled to 543 and placed by traversing the path: root -> child[5] -> child[4] -> child[3].

  2. Adaptive Bin Storage: Leaf nodes act as bins, storing item IDs in either a fast Vec<u32> (for small bins) or a compressed Roaring Bitmap (for large bins). The bin type is chosen automatically for optimal performance and memory use if a capacity hint is given.

  3. Accumulated Value Index: Each node tracks the accumulated_value (sum of weights beneath it), supporting O(P) weighted random selection, where P is the configured precision (number of decimal places).

Features

  • High Performance: Outperforms general-purpose data structures like Fenwick Trees for both sequential and simultaneous weighted sampling.
  • Dual-Model Support: Optimized methods for Wallenius' (select_and_remove) and Fisher's (select_many_and_remove) distributions.
  • O(P) Complexity: Core operations (add, remove, select) have a time complexity of O(P), where P is the fixed precision, effectively constant for a given configuration.
  • Memory Efficiency: Combines a sparse radix tree with Roaring Bitmaps for efficient storage, especially for sparse or clustered weight distributions.
  • Python Integration: Seamless Python bindings via pyo3 for cross-language support.

Performance

DigitBinIndex trades a small, controllable amount of precision by binning probabilities to achieve significant performance gains. The following benchmarks compare DigitBinIndex against an optimized FenwickTree implementation in a realistic, high-churn simulation.

The benchmark scenario starts with a large population (1M or 10M items), then simulates a high volume of activity:

  • Churn: A significant number of items are selected and removed.
  • Acquisition: New items are added to the population.

This measures the real-world throughput of both data structures under dynamic conditions. The tests were run on a standard desktop (Intel i7, 16GB RAM, Rust 1.75).


Wallenius' Draw (Sequential Churn)

This benchmark simulates sequential selection by removing 100,000 items one-by-one, then adding 110,000 new items. This is a common pattern in agent-based models or iterative simulations. DigitBinIndex's O(P) complexity gives it a decisive advantage as the population scales.

Scenario (N items) DigitBinIndex Time FenwickTree Time Speedup Factor
1 Million Items (p=3) ~27.5 ms ~82.2 ms ~3.0x faster
1 Million Items (p=5) ~39.7 ms ~77.7 ms ~2.0x faster
10 Million Items (p=3) ~551.0 ms ~1723.1 ms ~3.1x faster
  • Key Takeaway: DigitBinIndex is over 3.0 times faster than the FenwickTree for sequential operations on large datasets. Its performance is dependent on precision (P) and not the number of items (N), allowing it to scale far more effectively.

Fisher's Draw (Batch Churn)

This benchmark simulates simultaneous selection by removing a large batch of 100,000 unique items at once, followed by the acquisition of 110,000 new items. DigitBinIndex uses a highly optimized batch rejection sampling method.

Scenario (N items) DigitBinIndex Time FenwickTree Time Speedup Factor
1 Million Items (p=3) ~19.5 ms ~104.2 ms ~5.3x faster
1 Million Items (p=5) ~39.9 ms ~106.6 ms ~2.7x faster
10 Million Items (p=3) ~389.0 ms ~1649.9 ms ~4.2x faster

Key Takeaway: For batch selections, DigitBinIndex is even more efficient, performing up to 5.3 times faster. The batched nature of the operation further highlights the architectural advantages of the radix tree approach for this use case.


When to Choose DigitBinIndex

Use DigitBinIndex when:

  • You need high-performance sampling for Wallenius' or Fisher's distributions.
  • Your dataset is large (N > 100,000).
  • Probabilities are approximate, as is common in empirical data, simulations, or machine learning models.
  • Performance is more critical than perfect precision.

Consider a Fenwick Tree if you require exact precision and your weights differ only at high decimal places (e.g., 0.12345 vs. 0.12346), though this comes at the cost of O(log N) complexity and higher memory usage for large datasets.


Choosing a Precision

The precision parameter controls the radix tree's depth, balancing accuracy, performance, and memory. Higher precision improves sampling accuracy but increases memory usage (up to 10x per additional level) and slightly impacts runtime.

The Rule of Thumb

A precision of 3 or 4 (default: 3) is recommended for most applications. This captures sufficient detail for typical weight distributions while maintaining excellent performance and low memory usage.

The Mathematical Intuition

Each decimal place contributes exponentially less to a weight’s value. For a weight of 0.12345:

  • 1st digit (1): 0.1
  • 2nd digit (2): 0.02
  • 3rd digit (3): 0.003
  • 4th digit (4): 0.0004

Truncating at 3 digits limits the error per item to <0.001. In large populations, these errors average out, minimally affecting the selection distribution.

Guidance

Precision Typical Use Case Trade-offs
1-2 Maximum performance, minimal memory usage. Best for coarse weights (e.g., 0.1, 0.5). Loses accuracy with fine-grained data.
3-4 Recommended Default. Optimal for most scenarios. Captures sufficient detail for simulation or model data. Negligible performance/memory cost.
5+ High-fidelity scenarios with very close weights. Distinguishes weights like 0.12345 vs. 0.12346. Increases memory (up to 10x per level) and slightly impacts performance.

Internal Storage and Capacity

The DigitBinIndex is designed to handle a vast range of use cases, from a few thousand items to trillions, by automatically selecting the most appropriate internal storage engine.

Item Capacity

The index accepts u64 for individual item IDs. However, the internal storage of these IDs depends on the backend chosen.

[!WARNING] u64 ID Truncation: The Small (Vec<u32>) and Medium (RoaringBitmap) backends are optimized for u32 IDs. If you insert an ID that is larger than u32::MAX (4,294,967,295) into one of these backends, it will be silently truncated to a u32.

Only the Large (RoaringTreemap) backend provides full u64 ID support. The constructor with_precision_and_capacity attempts to guess if you need u64 support based on the total capacity. If you know you need to store u64 IDs, it is recommended to manually construct the Large variant:

use digit_bin_index::{DigitBinIndex, DigitBinIndexGeneric};
use roaring::RoaringTreemap;

// Manually create an index with full u64 support
let mut index = DigitBinIndex::Large(DigitBinIndexGeneric::<RoaringTreemap>::with_precision(3));

Automatic Engine Selection

To provide the best balance of performance and memory usage, the library's DigitBinIndex is an enum that automatically switches between three different backends (Small, Medium, and Large) when you use the with_precision_and_capacity() constructor.

The selection is based on a simple heuristic: the average number of items expected per bin, which is calculated as capacity / 10^precision.

  1. Small (Vec<u32>):

    • Trigger: Low average items per bin (<= 1,000).
    • Best for: Small to medium-sized problems where select_and_remove speed is the absolute priority (O(1) swap_remove).
    • Warning: Truncates u64 IDs. remove_many can be O(N) per bin.
  2. Medium (RoaringBitmap):

    • Trigger: Medium to large average items per bin (> 1,000).
    • Best for: Large-scale problems (millions to billions of items) where IDs fit within u32. Provides excellent memory compression and fast set operations (including remove_many).
    • Warning: Truncates u64 IDs.
  3. Large (RoaringTreemap):

    • Trigger: Extremely large average items per bin (> 1,000,000,000). This is used as a heuristic to detect that full u64 support is required.
    • Best for: Massive-scale simulations or any dataset that requires the full 64-bit ID space.

Examples of Engine Selection

Here are some practical examples of how calling with_precision_and_capacity translates into a specific internal engine.

Example 1: Small (Vec<u32>) is Chosen

You are simulating a population of 100,000 individuals with u32 IDs.

// Expecting 100,000 items with 3-digit precision
let index = DigitBinIndex::with_precision_and_capacity(3, 100_000);
  • Calculation: The number of bins is 10^3 = 1,000. The average items per bin is 100,000 / 1,000 = 100.
  • Result: Since 100 <= 1,000, the Small variant is chosen. This provides the fastest O(1) select_and_remove performance. (This would truncate u64 IDs).

Example 2: Medium (RoaringBitmap) is Chosen

You need to index 50 million product IDs, all of which fit within u32.

// Expecting 50 million items with 3-digit precision
let index = DigitBinIndex::with_precision_and_capacity(3, 50_000_000);
  • Calculation: The average items per bin is 50,000,000 / 1,000 = 50,000.
  • Result: This is > 1,000. The Medium variant is selected, using RoaringBitmap. This will be highly memory-efficient and very fast for all operations, including remove_many. (This would also truncate u64 IDs).

Example 3: Large (RoaringTreemap) is Chosen

You are working with a massive dataset where item IDs are 64-bit, and you expect trillions of entries.

// Expecting 5 trillion items with 3-digit precision
let index = DigitBinIndex::with_precision_and_capacity(3, 5_000_000_000_000);
  • Calculation: The average items per bin is 5_000_000_000_000 / 1,000 = 5,000,000,000.
  • Result: This is > 1,000,000,000. The Large variant is chosen. The heuristic correctly identifies this as a u64-scale problem and selects the only backend, RoaringTreemap, that provides full 64-bit ID support.

Usage & Installation

DigitBinIndex is available as a Python library on PyPI or as a Rust crate on Crates.io. Ensure Python 3.6+ for Python bindings or Rust 1.75+ for the Rust crate.

For Python 🐍

Install from PyPI:

pip install digit-bin-index

Example usage:

from digit_bin_index import DigitBinIndex

def main():
    # Create an index with precision 3 (default).
    index = DigitBinIndex()

    # With custom precision
    index_5 = DigitBinIndex.with_precision(5)

    # With custom precision and capacity hint for large datasets
    # This might choose a more memory-efficient internal storage.
    index_3_xl = DigitBinIndex.with_precision_and_capacity(3, 10_000_000)

    # Add items with IDs and weights.
    index.add(id=101, weight=0.123)  # Low weight
    index.add(id=202, weight=0.800)  # High weight
    index.add(id=303, weight=0.755)  # High weight
    index.add(id=404, weight=0.110)  # Low weight

    # Sequential (Wallenius') Draw: Select and remove one item.
    # Higher-weighted items (202, 303) are more likely.
    selected_item = index.select_and_remove()
    if selected_item:
        # The returned weight is a float, representing the bin's average weight
        item_id, weight = selected_item
        print(f"Wallenius draw: ID {item_id}, Weight ~{weight:.3f}")
    
    print(f"Items remaining: {index.count()}")  # 3

    # Simultaneous (Fisher's) Draw: Select and remove 2 unique items.
    selected_items = index.select_many_and_remove(2)
    if selected_items:
        print(f"Fisher's draw: {selected_items}")
    
    print(f"Items remaining: {index.count()}")  # 1

if __name__ == "__main__":
    main()

For Rust 🦀

Add to your Cargo.toml:

[dependencies]
digit-bin-index = "0.4.0" # Replace with the latest version from crates.io

Example usage:

use digit_bin_index::DigitBinIndex;

fn main() {
    // Create an index with precision 3.
    let mut index = DigitBinIndex::with_precision(3);

    // Add items with IDs and f64 weights.
    index.add(101, 0.123); // Low weight
    index.add(202, 0.800); // High weight
    index.add(303, 0.755); // High weight
    index.add(404, 0.110); // Low weight

    // Sequential (Wallenius') Draw: Select and remove one item.
    if let Some((id, weight)) = index.select_and_remove() {
        println!("Wallenius draw: ID {}, Weight ~{}", id, weight);
    }
    println!("Items remaining: {}", index.count()); // 3

    // Simultaneous (Fisher's) Draw: Select and remove 2 unique items.
    if let Some(items) = index.select_many_and_remove(2) {
        println!("Fisher's draw: {:?}", items);
    }
    println!("Items remaining: {}", index.count()); // 1
}

License

This project is licensed under the MIT License, a permissive open-source license allowing free use, modification, and distribution.

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

digit_bin_index-0.4.0.tar.gz (38.4 kB view details)

Uploaded Source

Built Distributions

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

digit_bin_index-0.4.0-cp38-abi3-win_amd64.whl (156.1 kB view details)

Uploaded CPython 3.8+Windows x86-64

digit_bin_index-0.4.0-cp38-abi3-win32.whl (154.9 kB view details)

Uploaded CPython 3.8+Windows x86

digit_bin_index-0.4.0-cp38-abi3-musllinux_1_2_x86_64.whl (453.5 kB view details)

Uploaded CPython 3.8+musllinux: musl 1.2+ x86-64

digit_bin_index-0.4.0-cp38-abi3-musllinux_1_2_i686.whl (484.7 kB view details)

Uploaded CPython 3.8+musllinux: musl 1.2+ i686

digit_bin_index-0.4.0-cp38-abi3-musllinux_1_2_armv7l.whl (559.4 kB view details)

Uploaded CPython 3.8+musllinux: musl 1.2+ ARMv7l

digit_bin_index-0.4.0-cp38-abi3-musllinux_1_2_aarch64.whl (454.8 kB view details)

Uploaded CPython 3.8+musllinux: musl 1.2+ ARM64

digit_bin_index-0.4.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (282.7 kB view details)

Uploaded CPython 3.8+manylinux: glibc 2.17+ x86-64

digit_bin_index-0.4.0-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl (322.0 kB view details)

Uploaded CPython 3.8+manylinux: glibc 2.17+ s390x

digit_bin_index-0.4.0-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (312.5 kB view details)

Uploaded CPython 3.8+manylinux: glibc 2.17+ ppc64le

digit_bin_index-0.4.0-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (295.5 kB view details)

Uploaded CPython 3.8+manylinux: glibc 2.17+ ARMv7l

digit_bin_index-0.4.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (274.7 kB view details)

Uploaded CPython 3.8+manylinux: glibc 2.17+ ARM64

digit_bin_index-0.4.0-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl (306.5 kB view details)

Uploaded CPython 3.8+manylinux: glibc 2.5+ i686

digit_bin_index-0.4.0-cp38-abi3-macosx_11_0_arm64.whl (248.3 kB view details)

Uploaded CPython 3.8+macOS 11.0+ ARM64

digit_bin_index-0.4.0-cp38-abi3-macosx_10_12_x86_64.whl (265.9 kB view details)

Uploaded CPython 3.8+macOS 10.12+ x86-64

File details

Details for the file digit_bin_index-0.4.0.tar.gz.

File metadata

  • Download URL: digit_bin_index-0.4.0.tar.gz
  • Upload date:
  • Size: 38.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.9.4

File hashes

Hashes for digit_bin_index-0.4.0.tar.gz
Algorithm Hash digest
SHA256 b20792c550c4199e5c37326280d5a64992899696f07bed1703cc924758b36d0c
MD5 068b62f527df980b530308f2e20c0dfc
BLAKE2b-256 bb9a954b640bffa68009d72bd4a182e933926d25ac29242c61d06c56041f27e0

See more details on using hashes here.

File details

Details for the file digit_bin_index-0.4.0-cp38-abi3-win_amd64.whl.

File metadata

File hashes

Hashes for digit_bin_index-0.4.0-cp38-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 ba1574f5fa7062bc7147dc2f270b12f5480964f5845cd61cedf4ff12052023db
MD5 c7cff92f3c56f31a24f581ccb732b160
BLAKE2b-256 9f17b99fe56c94195dac186186be1cb5c76a5ff84c67b0331a237c71f15ade4d

See more details on using hashes here.

File details

Details for the file digit_bin_index-0.4.0-cp38-abi3-win32.whl.

File metadata

File hashes

Hashes for digit_bin_index-0.4.0-cp38-abi3-win32.whl
Algorithm Hash digest
SHA256 b6878438b609cbcce969d048bab9aa9a6a1bb87e304d79b331cacd6ff48625d3
MD5 f6d478a6df4e65109fc22252bb5a17ea
BLAKE2b-256 fc19e78f34bddf7c702ef45d23095576544f9b670d0983fb874d389475e9af85

See more details on using hashes here.

File details

Details for the file digit_bin_index-0.4.0-cp38-abi3-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for digit_bin_index-0.4.0-cp38-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 edb45c971008694c4f59e60708de915bb8b6113881cf3528926e891ab09d3f4b
MD5 21df4cad1a3027c64d956ed6e83e42db
BLAKE2b-256 efb07d9134f89d86e984e489179720202e0778d399975b8e07bae1daad8ff581

See more details on using hashes here.

File details

Details for the file digit_bin_index-0.4.0-cp38-abi3-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for digit_bin_index-0.4.0-cp38-abi3-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 64eaafd328f655a59a018555948d2f0ed1ac45d9fa75a0a4e4bbf59b697b6b82
MD5 8cb506d96dbc34ad1619fa350d721053
BLAKE2b-256 fd2148d839e579e78edd2fc70bbfd424f5dc49ffbf46d241a90550d9c0718bc3

See more details on using hashes here.

File details

Details for the file digit_bin_index-0.4.0-cp38-abi3-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for digit_bin_index-0.4.0-cp38-abi3-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 7300f65a340a82e6ecb55e688799ac08598073b94b674528879dc213da3dd5b9
MD5 e8d89c944f209208edbffc89e1fde5c1
BLAKE2b-256 5c236b0c231c98e36a000bea40d66fa054cfadc5814f665e2694ac705fb6439f

See more details on using hashes here.

File details

Details for the file digit_bin_index-0.4.0-cp38-abi3-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for digit_bin_index-0.4.0-cp38-abi3-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 f8854e512e529598e2a8768e54e3594b71b8db0b67fb41f517ceabd7991d057e
MD5 54e2bd60bc121a3b08de52f99177bf8e
BLAKE2b-256 7fa1d19498bcaa392fb1f91e7f59f1801ac8ce5a159556393cb6ab903fd25dd9

See more details on using hashes here.

File details

Details for the file digit_bin_index-0.4.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for digit_bin_index-0.4.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3c6198c7224d8ef72a73bb406bad87d5bd92ae7d08a41d29849f621eebad5be2
MD5 011759ec1b595cc6c8fe6d7cf08e95a6
BLAKE2b-256 ff0b24a1020fbeb8e932a09cecb537a3d01e56d4ab40682b2caa32425fc4c7ff

See more details on using hashes here.

File details

Details for the file digit_bin_index-0.4.0-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl.

File metadata

File hashes

Hashes for digit_bin_index-0.4.0-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 cb6920c1840be7eef31c447b479bab5fa0da97efacab96b56ce269f6e0147448
MD5 bf92b75adc08d612d1263a853d19847e
BLAKE2b-256 d54e4791419035fc995a091ff7a547bc386c5675cf4098ce672bdebd5bad0562

See more details on using hashes here.

File details

Details for the file digit_bin_index-0.4.0-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl.

File metadata

File hashes

Hashes for digit_bin_index-0.4.0-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 8facb5cebdfd253951b1d80dea0556ef1e12a2dfd2a51b96b9159555086cfac6
MD5 29fa0e8d089fa2055b10a0193abc33a7
BLAKE2b-256 277b63f1e2c5f36562624f9266fc47620b00e203edd23e0ed1471e8d2040272e

See more details on using hashes here.

File details

Details for the file digit_bin_index-0.4.0-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for digit_bin_index-0.4.0-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 0b031e832cb7ec37e8ef2d3b84a229619d7b995534d3bcb90919eb52915ea1fe
MD5 b429fcc0691d1d1b84ab8deda2ba8c77
BLAKE2b-256 e195443b4cf8a371afcfae07bd5097200b45e2079aee5aff8ca32fdae9001ffd

See more details on using hashes here.

File details

Details for the file digit_bin_index-0.4.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for digit_bin_index-0.4.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 415154bf3e65b9b86ab0a1d3d162575e5eaafb3228c0d03e7eee6bf89659bac0
MD5 a27fdcb0413d812097c4eb714d071062
BLAKE2b-256 41b729e4155ac120f05d159dcd428943c82b486cc4ede417b27066203a1a2159

See more details on using hashes here.

File details

Details for the file digit_bin_index-0.4.0-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl.

File metadata

File hashes

Hashes for digit_bin_index-0.4.0-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl
Algorithm Hash digest
SHA256 9e31f085bd3565cf56054a39cfa65f095c99c3481f5049ef68197e931175ad1d
MD5 f3825df0db6625059df854ba520b3454
BLAKE2b-256 9b0e8c0aefce495404778524e824081ed07bed9f5c070bedb2452c4be1bb897f

See more details on using hashes here.

File details

Details for the file digit_bin_index-0.4.0-cp38-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for digit_bin_index-0.4.0-cp38-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f3bbb58cb602790e6ae1668b75509b957a6bb824f442e84e4e120b91915f1642
MD5 e36a3bd42d24dca00f57f04dd74d93da
BLAKE2b-256 7d8aaed042142939452b816f621edef5230b1da88a41562c32abef47994fdf89

See more details on using hashes here.

File details

Details for the file digit_bin_index-0.4.0-cp38-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for digit_bin_index-0.4.0-cp38-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 c3d16742539a26042cce1adf034e67f82d9edc110ce798afb32ec4caca5db94b
MD5 a7bdcc80d1341263b2c206ab6c9ef5fc
BLAKE2b-256 d9c8ac7f5f48756baad20002c29b15e6bb4c0ad6b2fc2d8eb0c32b7d56f2f336

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