Skip to main content

Ultra-fast Recommender Engines & Market Basket Analysis for Python, written in Rust.

Project description

rusket logo

Ultra-fast Recommender Engines & Market Basket Analysis for Python, written in Rust.
Made with โค๏ธ by the Data & AI Team.

PyPI Python Rust License Docs


๐ŸŽฏ Goals

Goal Details
โšก Blazing fast All algorithms run in compiled Rust (via PyO3) with multi-threaded Rayon parallelism and SIMD-accelerated kernels. ALS is 3ร—, BPR 20ร— faster than Python alternatives.
๐Ÿ“ฆ Zero dependencies No TensorFlow, no PyTorch, no JVM. A single ~3 MB wheel is all you need โ€” pip install rusket and go.
๐Ÿง‘โ€๐Ÿ’ป Easy to use Common cases are one-liners: model.recommend_items(user_id), model.recommend_users(item_id), model.export_item_factors() for vector/embedding export. No boilerplate.
๐Ÿ—๏ธ Modern data stack Native Pandas, Polars, and Apache Spark support with zero-copy Arrow transfers. Works seamlessly with Delta Lake, Databricks, Snowflake, and any dbt/Parquet pipeline.

โš ๏ธ Note: rusket is currently under heavy construction. The API will probably change in upcoming versions.

rusket is a modern, Rust-powered library for Market Basket Analysis and Recommender Engines. It delivers significant speed-ups and lower memory usage compared to traditional Python implementations, while natively supporting Pandas, Polars, and Spark out of the box.

Zero runtime dependencies. No TensorFlow, no PyTorch, no JVM โ€” just pip install rusket and go. The entire engine is compiled Rust, distributed as a single ~3 MB wheel.

It features Collaborative Filtering (ALS, BPR, SVD, LightGCN, ItemKNN, EASE) and Pattern Mining (FP-Growth, Eclat, HUPM, PrefixSpan) with high performance and low memory footprints. Both functional and OOP APIs are available for seamless integration.


โœจ Highlights

rusket LibRecommender implicit pyspark.ml
Core language Rust (PyO3) TF + PyTorch + Cython Cython / C++ Scala / Java (JVM)
Runtime deps 0 TF + PyTorch + gensim (~2 GB) OpenBLAS / MKL JVM + Spark
Install size ~3 MB ~2 GB ~50 MB ~300 MB
Algorithms ALS, BPR, SVD, LightGCN, ItemKNN, EASE, FP-Growth, Eclat, HUPM, PrefixSpan ALS, BPR, SVD, LightGCN, ItemCF, FM, DeepFM, ... ALS, BPR ALS, FP-Growth, PrefixSpan
Recommender API โœ… Hybrid Engine + i2i Similarity โœ… โœ… โœ… (ALS only)
Graph & Embeddings โœ… NetworkX Export, Vector DB Export โŒ โŒ โŒ
OOP class API โœ… ALS.from_transactions(df).fit() โœ… โœ… โœ…
Pandas / Polars / Spark โœ… / โœ… / โœ… โœ… / โŒ / โŒ โŒ / โŒ / โŒ โŒ / โŒ / โœ…
Parallel execution โœ… Rayon work-stealing โœ… TF/PyTorch threads โœ… OpenMP โœ… Spark Cluster
Memory Low (native Rust buffers) High (TF/PyTorch graphs) Low (C++ arrays) High (JVM overhead)

๐Ÿ“ฆ Installation

pip install rusket
# or with uv:
uv add rusket

Optional extras:

# Polars support
pip install "rusket[polars]"

# Pandas/NumPy support (usually already installed)
pip install "rusket[pandas]"

๐Ÿš€ Quick Start

"Frequently Bought Together" โ€” Grocery Checkout Data

Identify which products co-occur most in customer baskets โ€” the foundation of cross-sell widgets, promotional bundles, and shelf placement decisions.

import pandas as pd
from rusket import AutoMiner

# One week of supermarket checkout data (1 row = 1 receipt, 1 col = 1 SKU)
receipts = pd.DataFrame({
    "milk":         [1, 1, 0, 1, 1, 0, 1],
    "bread":        [1, 0, 1, 1, 0, 1, 1],
    "butter":       [1, 0, 1, 0, 0, 1, 0],
    "eggs":         [0, 1, 1, 0, 1, 0, 1],
    "coffee":       [0, 1, 0, 0, 1, 1, 0],
    "orange_juice": [1, 0, 0, 1, 0, 0, 1],
}, dtype=bool)

# Step 1 โ€” which SKU combinations appear in โ‰ฅ40% of receipts?
# AutoMiner selects FP-Growth or Eclat based on catalogue density
model = AutoMiner(receipts, min_support=0.4)
freq = model.mine(use_colnames=True)

# Step 2 โ€” keep rules with โ‰ฅ60% confidence
rules = model.association_rules(metric="confidence", min_threshold=0.6)

# Lift > 1 means customers buy these together more than chance alone
print(rules[["antecedents", "consequents", "support", "confidence", "lift"]]
      .sort_values("lift", ascending=False))

๐Ÿ›’ E-Commerce Order Lines (Long Format)

Real-world data arrives as (order_id, sku) rows from a database โ€” not one-hot matrices.

All mining algorithms expose a class-based API that goes straight from order lines to recommendations:

import pandas as pd
from rusket import AutoMiner

# Order line export from your e-commerce backend
orders = pd.DataFrame({
    "order_id": [1001, 1001, 1001, 1002, 1002, 1003, 1003],
    "sku":      ["HDPHONES", "USB_DAC", "AUX_CABLE",
                 "HDPHONES", "CARRY_CASE",
                 "USB_DAC",  "AUX_CABLE"],
})

model = AutoMiner.from_transactions(
    orders,
    transaction_col="order_id",
    item_col="sku",
    min_support=0.3,
)

freq  = model.mine(use_colnames=True)              # Miner classes: mine() never auto-fits
rules = model.association_rules(metric="confidence", min_threshold=0.6)

# Which accessories should be suggested when headphones are in the cart?
suggestions = model.recommend_items(["HDPHONES"], n=3)
# โ†’ e.g. ["USB_DAC", "AUX_CABLE", "CARRY_CASE"]

Or use the explicit type variants:

from rusket import AutoMiner

ohe = AutoMiner.from_pandas(orders, transaction_col="order_id", item_col="sku")
ohe = AutoMiner.from_polars(pl_orders, transaction_col="order_id", item_col="sku")
ohe = AutoMiner.from_transactions([["HDPHONES", "USB_DAC"], ["HDPHONES", "CARRY_CASE"]])  # list of lists

Spark is also supported: AutoMiner.from_spark(spark_df) calls .toPandas() internally.


โšก Eclat โ€” Large SKU Catalogues

eclat uses vertical bitset representation + hardware popcnt for fast support counting. Ideal for large SKU catalogues where baskets contain only a handful of items out of thousands (low density, typically < 0.15).

import pandas as pd
from rusket import Eclat

# Fashion e-tailer: 5 receipts, basket contains only a subset of the catalogue
baskets = pd.DataFrame({
    "jeans":    [True, True, False, True, True],
    "t_shirt":  [True, False, True,  True, False],
    "sneakers": [True, True, True,  False, True],
    "belt":     [False, True, True,  False, True],
})

# Eclat โ€” same API as AutoMiner, typically faster on sparse catalogues
model = Eclat(baskets, min_support=0.4)
freq  = model.mine(use_colnames=True)
rules = model.association_rules(min_threshold=0.6)
print(rules)

When to use which?

You almost always want to use AutoMiner. This evaluates the density of your dataset nnz / (rows * cols) using the Borgelt heuristic (2003) to pick the best algorithm under the hood:

Scenario Algorithm chosen by AutoMiner
Large SKU catalogue, small basket size (density < 0.15) Eclat (bitset/SIMD intersections)
Smaller catalogue, dense baskets (density > 0.15) FPGrowth (FP-tree traversals)

๐Ÿปโ€โ„๏ธ Polars Input โ€” Reading from Data Lake Parquet

For teams running a modern data stack with Parquet files on S3/GCS/Azure Blob, rusket natively accepts Polars DataFrames. Data is transferred via Arrow zero-copy buffers โ€” no conversion overhead.

The fastest path from a data lake to "Frequently Bought Together" rules:

import polars as pl
from rusket import AutoMiner

# โ”€โ”€ 1. Read a one-hot basket matrix directly from S3/GCS/local Parquet โ”€โ”€
# Columns = SKUs (bool), rows = receipts โ€” produced by your dbt or Spark pipeline
baskets = pl.read_parquet("s3://data-lake/gold/basket_ohe.parquet")
print(f"Loaded {baskets.shape[0]:,} receipts ร— {baskets.shape[1]} SKUs")

# โ”€โ”€ 2. Instantiate AutoMiner (zero-copy from Polars) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
model = AutoMiner(baskets, min_support=0.02, max_len=3)

# โ”€โ”€ 3. Mine frequent combinations โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
freq = model.mine(use_colnames=True)
print(f"Found {len(freq):,} frequent itemsets")
print(freq.sort_values("support", ascending=False).head(10))

# โ”€โ”€ 4. Generate cross-sell rules โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
rules = model.association_rules(metric="lift", min_threshold=1.2)
print(f"Rules with lift > 1.2: {len(rules):,}")
print(
    rules[["antecedents", "consequents", "confidence", "lift"]]
    .sort_values("lift", ascending=False)
    .head(8)
)

How it works under the hood:
Polars โ†’ Arrow buffer โ†’ np.uint8 (zero-copy) โ†’ Rust fpgrowth_from_dense


๐Ÿ’Ž High-Utility Pattern Mining (HUPM) โ€” Profit-Driven Bundle Discovery

Frequent items aren't always the most profitable. HUPM finds product combinations that generate the highest total gross margin โ€” even if they appear rarely. rusket implements the state-of-the-art EFIM algorithm in Rust.

import pandas as pd
from rusket import HUPM

# Specialty foods retailer: receipt line items with gross margin per unit sold
orders = pd.DataFrame({
    "receipt_id": [1, 1, 1, 2, 2, 3, 3],
    "product": ["aged_cheese", "wine_flight", "charcuterie",
                "aged_cheese", "charcuterie",
                "wine_flight", "charcuterie"],
    "margin": [8.50, 12.00, 6.50,   # receipt 1 โ€” margin per item
               8.50, 6.50,           # receipt 2
               12.00, 6.50],         # receipt 3
})

# Find all product bundles generating โ‰ฅ โ‚ฌ20 total margin across all receipts
high_margin = HUPM.from_transactions(
    orders,
    transaction_col="receipt_id",
    item_col="product",
    utility_col="margin",
    min_utility=20.0,
).mine()
print(high_margin.head())
# e.g. aged_cheese + wine_flight + charcuterie โ†’ total margin 81.0

๐Ÿ“Š Sparse Pandas Input

For very sparse datasets (e.g. e-commerce with thousands of SKUs), use Pandas SparseDtype to minimize memory. rusket passes the raw CSR arrays straight to Rust โ€” no densification ever happens.

import pandas as pd
import numpy as np
from rusket import AutoMiner

rng = np.random.default_rng(7)
n_rows, n_cols = 30_000, 500

# Very sparse: average basket size โ‰ˆ 3 items out of 500
p_buy = 3 / n_cols
matrix = rng.random((n_rows, n_cols)) < p_buy
products = [f"sku_{i:04d}" for i in range(n_cols)]

df_dense = pd.DataFrame(matrix.astype(bool), columns=products)
df_sparse = df_dense.astype(pd.SparseDtype("bool", fill_value=False))

dense_mb = df_dense.memory_usage(deep=True).sum() / 1e6
sparse_mb = df_sparse.memory_usage(deep=True).sum() / 1e6
print(f"Dense  memory: {dense_mb:.1f} MB")
print(f"Sparse memory: {sparse_mb:.1f} MB  ({dense_mb / sparse_mb:.1f}ร— smaller)")

# Same API, same results โ€” just faster and lighter
freq = AutoMiner(df_sparse, min_support=0.01).mine(use_colnames=True)
print(f"Frequent itemsets: {len(freq):,}")

How it works under the hood:
Sparse DataFrame โ†’ COO โ†’ CSR โ†’ (indptr, indices) โ†’ Rust fpgrowth_from_csr


๐ŸŒŠ Out-of-Core Processing (FPMiner Streaming)

For datasets scaling to Billion-row sizes that don't fit in memory, use the FPMiner accumulator. It accepts chunks of (txn_id, item_id) pairs, sorting them in-place immediately, and uses a memory-safe k-way merge across all chunks to build the CSR matrix on the fly avoiding massive memory spikes.

import numpy as np
from rusket import FPMiner

n_items = 5_000
miner = FPMiner(n_items=n_items)

# Feed chunks incrementally (e.g. from Parquet/CSV/SQL)
for chunk in dataset:
    txn_ids = chunk["txn_id"].to_numpy(dtype=np.int64)
    item_ids = chunk["item_id"].to_numpy(dtype=np.int32)
    
    # Fast O(k log k) per-chunk sort
    miner.add_chunk(txn_ids, item_ids)

# Stream k-way merge and mine in one pass!
# Returns a DataFrame with 'support' and 'itemsets' just like fpgrowth()
freq = miner.mine(min_support=0.001, max_len=3)

Memory efficiency: The peak memory overhead at mine() time is just $O(k)$ for the cursors (where $k$ is the number of chunks), plus the final compressed CSR allocation.


๐ŸŒฉ๏ธ Distributed Computing with Apache Spark

rusket ships a full Spark integration layer in rusket.spark. All algorithms run as Native Arrow UDFs via applyInArrow โ€” Rust is called directly on each executor, with zero Python overhead per row.

How it works

PySpark DataFrame
  โ””โ”€โ–บ groupby(group_col).applyInArrow(...)
        โ””โ”€โ–บ Arrow Table (per partition / per group)
              โ””โ”€โ–บ Polars zero-copy conversion
                    โ””โ”€โ–บ rusket Rust extension (on the executor)
                          โ””โ”€โ–บ results โ†’ PyArrow โ†’ PySpark DataFrame

Full Example โ€” Retail Basket Analysis per Store

from pyspark.sql import SparkSession
from rusket.spark import mine_grouped, rules_grouped

spark = SparkSession.builder.appName("rusket-demo").getOrCreate()

# โ”€โ”€ 1. Load your OHE transaction table (one row = one basket) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
#    Schema: store_id (string), bread (bool), butter (bool), milk (bool), ...
spark_df = spark.read.parquet("s3://data/baskets/")

# โ”€โ”€ 2. Mine frequent itemsets per store in parallel โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
#    Each Spark task calls the Rust FP-Growth/Eclat engine on its Arrow batch.
freq_df = mine_grouped(
    spark_df,
    group_col="store_id",
    min_support=0.05,    # 5% support per store
    method="auto",       # auto-selects FP-Growth or Eclat
)
# freq_df schema: store_id | support (double) | itemsets (array<string>)

# โ”€โ”€ 3. Count transactions per store (needed for rule support) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
from pyspark.sql import functions as F
counts = (
    spark_df.groupby("store_id")
    .agg(F.count("*").alias("n"))
    .rdd.collectAsMap()          # {"store_1": 12000, "store_2": 8500, ...}
)

# โ”€โ”€ 4. Generate association rules per store โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
rules_df = rules_grouped(
    freq_df,
    group_col="store_id",
    num_itemsets=counts,         # pass per-group counts as a dict
    metric="confidence",
    min_threshold=0.6,
)
# rules_df schema: store_id | antecedents | consequents | confidence | lift | ...

rules_df.orderBy("lift", ascending=False).show(10, truncate=False)

Sequential Patterns per Category

from rusket.spark import prefixspan_grouped

# event_log schema: category_id, user_id, item_id, event_ts
event_log = spark.read.parquet("s3://data/events/")

seq_df = prefixspan_grouped(
    event_log,
    group_col="category_id",   # mine independently per product category
    user_col="user_id",        # sequence identifier within the group
    time_col="event_ts",       # ordering column
    item_col="item_id",
    min_support=50,            # absolute count: pattern must appear in โ‰ฅ50 sessions
    max_len=4,
)
# seq_df schema: category_id | support (long) | sequence (array<string>)
seq_df.show(5, truncate=False)

High-Utility Patterns per Region

from rusket.spark import hupm_grouped

# profit_log schema: region_id, txn_id, item_id, profit
profit_log = spark.read.parquet("s3://data/profit/")

utility_df = hupm_grouped(
    profit_log,
    group_col="region_id",
    transaction_col="txn_id",
    item_col="item_id",
    utility_col="profit",
    min_utility=500.0,         # only itemsets with combined profit โ‰ฅ โ‚ฌ500
)
# utility_df schema: region_id | utility (double) | itemset (array<long>)
utility_df.show(5, truncate=False)

Batch Recommendations across the Cluster

from rusket.spark import recommend_batches
from rusket import ALS

# 1. Train an ALS model locally (or load a pre-trained one)
als = ALS.from_transactions(
    events_pd,
    user_col="user_id",
    item_col="item_id",
).fit()  # โ† always call .fit() after from_transactions()

# 2. Scale-out scoring: one recommendation row per user
user_df = spark.read.parquet("s3://data/users/").select("user_id")

recs_df = recommend_batches(user_df, model=als, user_col="user_id", k=10)
# recs_df schema: user_id (string) | recommended_items (array<int>)
recs_df.show(5, truncate=False)

Tip โ€” Databricks / Delta Lake: All functions return a standard PySpark DataFrame, so you can write results back with .write.format("delta").save(...) or .saveAsTable(...) directly.


๐Ÿ“– API Reference

OOP Class API

Every algorithm in rusket exposes a class-based API in addition to the functional helpers. All classes share a unified interface inherited from BaseModel:

Class Inherits from Description
FPGrowth Miner, RuleMinerMixin FP-Tree parallel mining
Eclat Miner, RuleMinerMixin Vertical bitset mining
AutoMiner Miner, RuleMinerMixin Auto-selects FP-Growth or Eclat
HUPM Miner High-Utility Pattern Mining (EFIM)
PrefixSpan Miner Sequential pattern mining
ALS ImplicitRecommender Alternating Least Squares CF
BPR ImplicitRecommender Bayesian Personalized Ranking CF
SVD ImplicitRecommender Funk SVD (biased SGD)
LightGCN ImplicitRecommender Graph Convolutional CF
ItemKNN ImplicitRecommender Item-based k-NN CF
EASE ImplicitRecommender Embarrassingly Shallow Autoencoders

All classes share the following data-ingestion class methods inherited from BaseModel:

# Load from long-format (transaction_id, item_id) DataFrame or list of lists
model = FPGrowth.from_transactions(df, transaction_col="order_id", item_col="item", min_support=0.3)

# Typed convenience aliases โ€” same result
model = FPGrowth.from_pandas(df,  ...)
model = FPGrowth.from_polars(pl_df, ...)
model = FPGrowth.from_spark(spark_df, ...)

Miner subclasses (FPGrowth, Eclat, AutoMiner) additionally expose RuleMinerMixin, giving a fluent pipeline:

model  = AutoMiner.from_transactions(df, min_support=0.3)
freq   = model.mine(use_colnames=True)             # pd.DataFrame [support, itemsets]
rules  = model.association_rules(metric="lift")    # pd.DataFrame [antecedents, consequents, ...]
recs   = model.recommend_items(["bread", "milk"])  # list of suggested items

ImplicitRecommender subclasses (ALS, BPR, SVD, LightGCN, ItemKNN, EASE) follow the scikit-learn fit()/predict() pattern:

# Option A โ€” construct then fit with a sparse matrix
model = ALS(factors=64, iterations=15)
model.fit(user_item_csr)

# Option B โ€” from event log, then explicit .fit()
model = ALS(factors=64).from_transactions(
    df, user_col="user_id", item_col="item_id"
).fit()  # โ† .fit() is always required

# Predict / recommend
items, scores = model.recommend_items(user_id=42, n=10, exclude_seen=True)
users, scores = model.recommend_users(item_id=99, n=5)

Breaking change vs older versions: from_transactions() no longer auto-fits. Always chain .fit() after it.

๐Ÿง  Advanced Pattern & Recommendation Algorithms

rusket provides more than just basic market basket analysis. It includes an entire suite of modern algorithms and a high-level Business Recommender API.

๐ŸŽฏ ALS & BPR Collaborative Filtering

Both models learn user and item embeddings from implicit feedback (purchases, clicks, plays) and power personalised recommendations at scale. Use ALS for broad serendipitous discovery; use BPR when you care only about top-N ranking.

from rusket import ALS, BPR

# โ”€โ”€ "For You" homepage โ€” music streaming platform โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
# event log: user_id | track_id | plays (optional weight)
plays = pd.DataFrame({
    "user_id":  [101, 101, 102, 102, 103, 103, 103],
    "track_id": ["T01", "T03", "T01", "T05", "T02", "T03", "T05"],
    "plays":    [12, 5, 8, 3, 20, 1, 7],  # play count as confidence weight
})

als = ALS(factors=64, iterations=15, alpha=40.0).from_transactions(
    plays, user_col="user_id", item_col="track_id", rating_col="plays"
).fit()  # โ† always call .fit() after from_transactions()

# Top-10 tracks for user 101, excluding already-played tracks
tracks, scores = als.recommend_items(user_id=101, n=10, exclude_seen=True)

# Which users are most likely to enjoy track T05? โ€” useful for email campaigns
users, scores = als.recommend_users(item_id="T05", n=50)

# BPR โ€” optimise ranking directly rather than reconstruction
bpr = BPR(factors=64, learning_rate=0.05, iterations=150).fit(user_item_csr)

๐ŸŽฏ Hybrid Recommender API

Combine Collaborative Filtering (ALS/BPR) with Frequent Pattern Mining to cover every placement surface โ€” personalised homepage ("For You") and active cart ("Frequently Bought Together") โ€” in a single engine.

from rusket import ALS, Recommender, AutoMiner

# 1. Train on purchase history (implicit feedback)
als = ALS(factors=64, iterations=15).fit(user_item_csr)

# 2. Mine co-purchase rules from basket data
miner = AutoMiner(basket_ohe, min_support=0.01)
freq  = miner.mine()
rules = miner.association_rules()

# 3. Create the Hybrid Engine
rec = Recommender(model=als, rules_df=rules)

# "For You" homepage โ€” personalised for customer 1001
items, scores = rec.recommend_for_user(user_id=1001, n=5)

# Blend CF + product embeddings (e.g. from a PIM or sentence-transformer)
items, scores = rec.recommend_for_user(user_id=1001, n=5, alpha=0.7,
                                       target_item_for_semantic="HDPHONES")

# Active cart cross-sell โ€” "Frequently Bought Together"
add_ons = rec.recommend_for_cart(["USB_DAC", "AUX_CABLE"], n=3)

# Overnight batch โ€” score all customers, write to CRM
batch_df = rec.predict_next_chunk(user_history_df, user_col="customer_id", k=5)

๐Ÿ” Analytics Helpers

from rusket import find_substitutes, customer_saturation

# Identify cannibalizing SKUs (lift < 1.0) for assortment rationalisation
subs = find_substitutes(rules_df, max_lift=0.8)
#  antecedents  consequents  lift
#  (Cola A,)    (Cola B,)    0.61   โ† these products hurt each other's sales

# Segment customers by category penetration (decile 10 = buy everything; 1 = barely engaged)
saturation = customer_saturation(
    purchases_df, user_col="customer_id", category_col="category_id"
)

๐Ÿ“ˆ BPR & Sequential Patterns

  • BPR (Bayesian Personalized Ranking): Directly optimises ranking of positive interactions over negative ones โ€” ideal for newsfeeds, playlists, and app recommendation surfaces that prioritise top-N precision.
  • Sequential Pattern Mining (PrefixSpan): Discovers ordered patterns across time (e.g., "Subscriber signed up for broadband โ†’ mobile plan โ†’ premium bundle" or "Customer viewed Camera โ†’ 2 weeks later bought Lens").

rusket natively extracts PrefixSpan sequences from Pandas, Polars, and PySpark event logs with zero-copy Arrow mapping:

from rusket import PrefixSpan

# Telco product adoption journeys โ€” what sequence of subscriptions do customers follow?
# df: customer_id | subscription_date | product_id
model = PrefixSpan.from_transactions(
    subscription_events,
    transaction_col="customer_id",
    item_col="product_id",
    time_col="subscription_date",
    min_support=50,    # at least 50 customers follow this path
    max_len=4,
)
freq_seqs = model.mine()
# e.g. [broadband] โ†’ [mobile] โ†’ [tv_bundle] appears in 312 journeys

๐Ÿ•ธ๏ธ Graph Analytics & Embeddings

Integrate natively with the modern GenAI/LLM stack:

  • Vector Export: Export user/item factors to a Pandas DataFrame ready for FAISS/Qdrant using model.export_item_factors().
  • Item-to-Item Similarity: Fast Cosine Similarity on embeddings using model.similar_items(item_id).
  • Graph Generation: Automatically convert association rules into a networkx directed Graph for community detection using rusket.viz.to_networkx(rules).

โšก Benchmarks

Benchmark environment: Apple Silicon MacBook Air (M-series, arm64, 8 GB RAM). All timings are single-run wall-clock measurements.

Scale Benchmarks (1M โ†’ 200M rows)

What's measured: from_transactions() converts long-format (txn_id, item_id) rows into a sparse OHE matrix. fpgrowth() then mines that matrix. Both steps have the same Rust mining cost โ€” the only difference at large scale is whether you pay the conversion cost upfront.

Scale from_transactions (conversion) fpgrowth (mining) Total
1M rows 4.9s 0.1s 5.0s
10M rows 23.2s 1.2s 24.4s
50M rows 59.1s 4.0s 63.1s
100M rows (20M txns ร— 200k items) 124.1s 10.1s 134.2s
200M rows (40M txns ร— 200k items) 229.2s 17.6s 246.8s

The mining step is fast โ€” the bottleneck at scale is the long-format โ†’ sparse-matrix conversion. If your pipeline already produces a CSR/sparse matrix (e.g., from a Parquet/warehouse export), you skip the conversion entirely and only pay the mining cost.

Power-user path: Direct CSR โ†’ Rust

import numpy as np
from scipy import sparse as sp
from rusket import AutoMiner

# Build CSR directly from integer IDs (no pandas!)
csr = sp.csr_matrix(
    (np.ones(len(txn_ids), dtype=np.int8), (txn_ids, item_ids)),
    shape=(n_transactions, n_items),
)
freq = AutoMiner(csr, item_names=item_names).mine(
    min_support=0.001, max_len=3, use_colnames=True
)

At 100M rows, the mining step itself takes 10.1 seconds. Building the CSR directly skips the from_transactions conversion cost (~124s) but does not change the mining time.

Real-World Datasets

Dataset Transactions Items rusket
andi_data.txt 8,416 119 9.7 s (22.8M itemsets)
andi_data2.txt 540,455 2,603 7.9 s

Run benchmarks yourself:

uv run pytest benchmarks/bench_scale.py -v -s   # Scale benchmark
uv run python benchmarks/bench_realworld.py     # Real-world datasets
uv run pytest tests/test_benchmark.py -v -s      # pytest-benchmark

Recommender Benchmarks vs LibRecommender

Measured with pytest-benchmark (5 rounds, warmed up, GC disabled). MovieLens 100k dataset (943 users, 1,682 items, 100k ratings). Only model.fit() is timed โ€” no startup or data loading overhead.

Benchmark rusket LibRecommender Speedup
ALS (64 factors, 15 epochs) 427 ms 1,324 ms 3.1ร—
BPR (64 factors, 10 epochs) 33 ms 681 ms 20.4ร—
ItemKNN (k=100) 55 ms 287 ms 5.2ร—
SVD (64 factors, 20 epochs) 55 ms โŒ TF-only (broken) โ€”
EASE 71 ms N/A โ€”

Note: LibRecommender requires TensorFlow + PyTorch + gensim + Cython (~2 GB of dependencies). rusket has zero runtime dependencies.

uv run pytest benchmarks/bench_pytest_librecommender.py -v --benchmark-columns=mean,stddev,rounds

๐Ÿ— Architecture

Data Flow

pandas dense         โ”€โ”€โ–บ np.uint8 array (C-contiguous)  โ”€โ”€โ–บ Rust fpgrowth_from_dense
pandas Arrow backend โ”€โ”€โ–บ Arrow โ†’ np.uint8 (zero-copy)   โ”€โ”€โ–บ Rust fpgrowth_from_dense
pandas sparse        โ”€โ”€โ–บ CSR int32 arrays               โ”€โ”€โ–บ Rust fpgrowth_from_csr
polars               โ”€โ”€โ–บ Arrow โ†’ np.uint8 (zero-copy)   โ”€โ”€โ–บ Rust fpgrowth_from_dense
numpy ndarray        โ”€โ”€โ–บ np.uint8 (C-contiguous)        โ”€โ”€โ–บ Rust fpgrowth_from_dense

All mining and rule generation happens inside Rust. No Python loops, no round-trips.

The 1 Billion Row Architecture

To pass the "1 Billion Row" threshold without OOM crashes, rusket employs a zero-allocation mining loop:

  • Eclat Scratch Buffers: intersect_count_into writes intersections directly into thread-local pre-allocated memory bytes and computes popcnt in a single pass. It implements early-exit loop termination the moment it proves a combination cannot reach min_support.
  • FPGrowth Parallel Tree Build: Conditional FP-trees are collected concurrently inside the rayon parallel mining step, replacing the standard sequential loop and eliminating memory contention bottlenecks.
  • AHashMap Deduplication: Extremely fast O(N) duplicate basket counting replaces standard O(N log N) unstable sorts in the core pipeline.

๐Ÿง‘โ€๐Ÿ’ป Development

Prerequisites

  • Rust 1.83+ (rustup update)
  • Python 3.10+
  • uv (recommended package manager)

Getting Started

# Clone
git clone https://github.com/bmsuisse/rusket.git
cd rusket

# Build Rust extension in dev mode
uv run maturin develop --release

# Run the full test suite
uv run pytest tests/ -x -q

# Type-check the Python layer
uv run pyright rusket/

# Cargo check (Rust)
cargo check

Run Examples

# Getting started
uv run python examples/01_getting_started.py

# Market basket analysis with Faker
uv run python examples/02_market_basket_faker.py

# Polars input
uv run python examples/03_polars_input.py

# Sparse input
uv run python examples/04_sparse_input.py

# Large-scale mining (100k+ rows)
uv run python examples/05_large_scale.py

๐Ÿค– AI Disclosure

A large part of this library โ€” including the Rust core algorithms, the Python wrappers, the OOP class hierarchy, and the Spark integration layer โ€” was written with substantial assistance from AI pair-programming tools (specifically Google Gemini / Antigravity). Human review, benchmarking, and architectural decisions were applied throughout.

We believe in transparency about AI-assisted development. The algorithms are correct, the tests pass, and the performance numbers are real โ€” but if you find a bug or a piece of "AI slop", please open an issue!


๐Ÿ“œ License

MIT License

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

rusket-0.1.49.tar.gz (146.1 kB view details)

Uploaded Source

Built Distributions

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

rusket-0.1.49-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl (1.1 MB view details)

Uploaded PyPymusllinux: musl 1.2+ x86-64

rusket-0.1.49-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl (1.2 MB view details)

Uploaded PyPymusllinux: musl 1.2+ ARM64

rusket-0.1.49-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (955.1 kB view details)

Uploaded PyPymanylinux: glibc 2.17+ x86-64

rusket-0.1.49-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (986.9 kB view details)

Uploaded PyPymanylinux: glibc 2.17+ ARM64

rusket-0.1.49-cp314-cp314t-musllinux_1_2_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.2+ x86-64

rusket-0.1.49-cp314-cp314t-musllinux_1_2_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.2+ ARM64

rusket-0.1.49-cp314-cp314-win_amd64.whl (808.4 kB view details)

Uploaded CPython 3.14Windows x86-64

rusket-0.1.49-cp314-cp314-musllinux_1_2_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ x86-64

rusket-0.1.49-cp314-cp314-musllinux_1_2_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ ARM64

rusket-0.1.49-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (951.3 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ x86-64

rusket-0.1.49-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (979.9 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ ARM64

rusket-0.1.49-cp314-cp314-macosx_11_0_arm64.whl (925.5 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

rusket-0.1.49-cp314-cp314-macosx_10_12_x86_64.whl (879.7 kB view details)

Uploaded CPython 3.14macOS 10.12+ x86-64

rusket-0.1.49-cp313-cp313t-musllinux_1_2_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.13tmusllinux: musl 1.2+ x86-64

rusket-0.1.49-cp313-cp313t-musllinux_1_2_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.13tmusllinux: musl 1.2+ ARM64

rusket-0.1.49-cp313-cp313-win_amd64.whl (810.1 kB view details)

Uploaded CPython 3.13Windows x86-64

rusket-0.1.49-cp313-cp313-musllinux_1_2_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

rusket-0.1.49-cp313-cp313-musllinux_1_2_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ ARM64

rusket-0.1.49-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (953.7 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

rusket-0.1.49-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (981.3 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64

rusket-0.1.49-cp313-cp313-macosx_11_0_arm64.whl (925.4 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

rusket-0.1.49-cp313-cp313-macosx_10_12_x86_64.whl (880.0 kB view details)

Uploaded CPython 3.13macOS 10.12+ x86-64

rusket-0.1.49-cp312-cp312-win_amd64.whl (810.1 kB view details)

Uploaded CPython 3.12Windows x86-64

rusket-0.1.49-cp312-cp312-musllinux_1_2_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

rusket-0.1.49-cp312-cp312-musllinux_1_2_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ ARM64

rusket-0.1.49-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (954.1 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

rusket-0.1.49-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (981.4 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

rusket-0.1.49-cp312-cp312-macosx_11_0_arm64.whl (925.7 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

rusket-0.1.49-cp312-cp312-macosx_10_12_x86_64.whl (880.2 kB view details)

Uploaded CPython 3.12macOS 10.12+ x86-64

rusket-0.1.49-cp311-cp311-win_amd64.whl (810.5 kB view details)

Uploaded CPython 3.11Windows x86-64

rusket-0.1.49-cp311-cp311-musllinux_1_2_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

rusket-0.1.49-cp311-cp311-musllinux_1_2_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ ARM64

rusket-0.1.49-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (953.6 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

rusket-0.1.49-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (984.1 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64

rusket-0.1.49-cp311-cp311-macosx_11_0_arm64.whl (922.0 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

rusket-0.1.49-cp311-cp311-macosx_10_12_x86_64.whl (839.2 kB view details)

Uploaded CPython 3.11macOS 10.12+ x86-64

rusket-0.1.49-cp310-cp310-win_amd64.whl (810.5 kB view details)

Uploaded CPython 3.10Windows x86-64

rusket-0.1.49-cp310-cp310-musllinux_1_2_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ x86-64

rusket-0.1.49-cp310-cp310-musllinux_1_2_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ ARM64

rusket-0.1.49-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (953.8 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

rusket-0.1.49-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (984.2 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64

File details

Details for the file rusket-0.1.49.tar.gz.

File metadata

  • Download URL: rusket-0.1.49.tar.gz
  • Upload date:
  • Size: 146.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for rusket-0.1.49.tar.gz
Algorithm Hash digest
SHA256 ba180b669b1356466050724d6ca83b5026b1dd884aff6ba9a37b1361cc5cce0c
MD5 5705df7939807ec3b1c6e3f12f38d347
BLAKE2b-256 82a49f105dbfea41a860e8579c36ec30ed07e67ed3d61d398654188300438709

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.49.tar.gz:

Publisher: ci.yml on bmsuisse/rusket

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rusket-0.1.49-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for rusket-0.1.49-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 9e177ee0ca40d223e0f7c37bb86fae7126abbce5e08c9b7df1462c9d3e9eec65
MD5 4accef17be3b13c76a5e3ed4aa31c3dd
BLAKE2b-256 8b975640f3c0365ed56438f31d06da8d08e78671e1be98a21bd7388a5891c39d

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.49-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl:

Publisher: ci.yml on bmsuisse/rusket

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rusket-0.1.49-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for rusket-0.1.49-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 5a581541c0a8d15ec47fd0db007ba96df7b22d64a53aef452c68f9afd603ccb4
MD5 d5c87e2fae9420a5d681f973790f0dc8
BLAKE2b-256 5246c0d05d616141c5508b789e03113419dc85eb839655e0de56fda7ec5d3803

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.49-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl:

Publisher: ci.yml on bmsuisse/rusket

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rusket-0.1.49-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rusket-0.1.49-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 084a7487352f1d7c459d527e52e116eb774dfb1791cc555b579e8057b985c11b
MD5 c3bded5b91c2cf2071ebd045d43c849d
BLAKE2b-256 af8d88fdc14b5d95458ab7f6b8650321b2637bbd34dd1395ff789f2b1773a05b

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.49-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: ci.yml on bmsuisse/rusket

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rusket-0.1.49-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for rusket-0.1.49-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 62cdac37218faab4daa772c42bf6bc1d03eb62ec21d414ddf01a2b3a96e15fcb
MD5 24a3beb66f20784eb47f1ed0595bb5dc
BLAKE2b-256 248c9cfd02c2dd72cc0d3d238292f14cdd093c5adedb9ffe68101ab275d23a60

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.49-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: ci.yml on bmsuisse/rusket

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rusket-0.1.49-cp314-cp314t-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for rusket-0.1.49-cp314-cp314t-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 eea119e660e3682477ed8bda578679c26ec5e29c975a20b4e4e13aa88576a57d
MD5 059b6666c58eb266a07eb28258432747
BLAKE2b-256 9eb61c7bf67b81bea93dbb2a5ef0f369adbb7a7ed0c527b23f54bcfc0ea0da6b

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.49-cp314-cp314t-musllinux_1_2_x86_64.whl:

Publisher: ci.yml on bmsuisse/rusket

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rusket-0.1.49-cp314-cp314t-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for rusket-0.1.49-cp314-cp314t-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 3c269c13b6075226a48dc4126ba74e59a8570ae41f010b65098236e6d57a0d40
MD5 692cb5ed3f00635c8aa2fa9ff52c59cf
BLAKE2b-256 4557341a417ff73c2516b74bda738d87bdab91a21e94ddc5b86aefa0edfa84c8

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.49-cp314-cp314t-musllinux_1_2_aarch64.whl:

Publisher: ci.yml on bmsuisse/rusket

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rusket-0.1.49-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: rusket-0.1.49-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 808.4 kB
  • Tags: CPython 3.14, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for rusket-0.1.49-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 edd047105b33230cfcc0f3196d74929f39a2850294c9c18f85178de5e94cd5ca
MD5 265a692c6b68e0d32ae7b557071f5d45
BLAKE2b-256 d0d2876cd1413f74e8e390de3b0e1aa444020e33a717727ca1bc6f4e8e05b6ec

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.49-cp314-cp314-win_amd64.whl:

Publisher: ci.yml on bmsuisse/rusket

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rusket-0.1.49-cp314-cp314-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for rusket-0.1.49-cp314-cp314-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 7c391eec0e9fbf2165d84b49ecba29e49e93850b3a72ae3c0e1e42cb06237bd8
MD5 e09030f41c3ef4068ce9691baa3c5f42
BLAKE2b-256 89f7f0a9a03f19b063182115cbc0a12c8ea0e376defdf7737216177f815fdb73

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.49-cp314-cp314-musllinux_1_2_x86_64.whl:

Publisher: ci.yml on bmsuisse/rusket

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rusket-0.1.49-cp314-cp314-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for rusket-0.1.49-cp314-cp314-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 12c2929c7c74fc1b7ff5f0d623a54f7b6acec940cc9b614b88b8a0b50348ca9f
MD5 c87ac645287d3a5473533a66faab5232
BLAKE2b-256 f1704d43c3eaae78c794856d1115a983916cb88b6dc4fbd058def08f5a1ee4b6

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.49-cp314-cp314-musllinux_1_2_aarch64.whl:

Publisher: ci.yml on bmsuisse/rusket

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rusket-0.1.49-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rusket-0.1.49-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2b5417a11aa52ecf889e82c1c86f2b65868ad7163ac18ffd6845b4064189edda
MD5 1994488ec0c0f9566a4549cbbf9d7ded
BLAKE2b-256 902de82fc0d16c3db76d79962a46579ed01b013319d91fecc61b1bf17cc95869

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.49-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: ci.yml on bmsuisse/rusket

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rusket-0.1.49-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for rusket-0.1.49-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 ed57937fb699687f115c1a83369a0b6a8e078f764c29229cdb0f8b69e213348e
MD5 0634ca88059d4dcd74ce7a26b0cf682f
BLAKE2b-256 5a0c8f4c895dff46ca843830f0ccaf92459d85ee2eed077531dc14127bf4b38c

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.49-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: ci.yml on bmsuisse/rusket

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rusket-0.1.49-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for rusket-0.1.49-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2cd60b3920d4df4122b1c3b6c42fd3a2b66b1268825f114332702dd0bf6c0975
MD5 b6a6201271c63e428ebf946f9bbe1b20
BLAKE2b-256 b210e7fda2d28f5637c492bfc0e9c123eef1bbe2f57970f008336e0c869c6efe

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.49-cp314-cp314-macosx_11_0_arm64.whl:

Publisher: ci.yml on bmsuisse/rusket

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rusket-0.1.49-cp314-cp314-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for rusket-0.1.49-cp314-cp314-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 e18e6e7054d49d280f2648969185e6c565ebd5f4f102a8641d81136df5b7b23a
MD5 9ae2df7b521221f15f93c6f9b067f087
BLAKE2b-256 5126643c0042dc98821efe7dfd0d8447c47cc0f635649e55849ccd5b2a585ca9

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.49-cp314-cp314-macosx_10_12_x86_64.whl:

Publisher: ci.yml on bmsuisse/rusket

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rusket-0.1.49-cp313-cp313t-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for rusket-0.1.49-cp313-cp313t-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 548ab146c44a397ab537be08d4b9e8b4651fb941cc5f29a2f66426d8cf4c0793
MD5 8f39cf11e889169b9e66d72ca69f04ff
BLAKE2b-256 5af82e40bb2fbd350431c13d88ab4fb8c533e12c051a5997d3c01a2bf20d583d

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.49-cp313-cp313t-musllinux_1_2_x86_64.whl:

Publisher: ci.yml on bmsuisse/rusket

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rusket-0.1.49-cp313-cp313t-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for rusket-0.1.49-cp313-cp313t-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 8371af208fdd74f1f1faa992fcbaa2039a45e56e7561e808abfc39c9545efb46
MD5 f8e5502942defceffc6487ac9ff7db96
BLAKE2b-256 bd631bf99039899fcb039e005fffada4cf145f286b9d804c26be862cbb74f43f

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.49-cp313-cp313t-musllinux_1_2_aarch64.whl:

Publisher: ci.yml on bmsuisse/rusket

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rusket-0.1.49-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: rusket-0.1.49-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 810.1 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for rusket-0.1.49-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 ea70e12aeb8a74f49734dd15789a303ec7affced8d266ac1afd0749d0c40b471
MD5 6ca107b1c0dab9e0eafef6c6d0210442
BLAKE2b-256 be35d003e0947d266a941404d53b0a0375d6eddc55fe884a2802cb7173770e8f

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.49-cp313-cp313-win_amd64.whl:

Publisher: ci.yml on bmsuisse/rusket

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rusket-0.1.49-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for rusket-0.1.49-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 25bcec3b3afa51ff9af853fa9333246be9f427bbf44093d40f52a3297eaff804
MD5 25c74630670eb396b913c60a4c32ec66
BLAKE2b-256 e7333db2c40ebd81e2a9f345525f3f8ce8cdf51a61c369c26228fc332a3c4cbc

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.49-cp313-cp313-musllinux_1_2_x86_64.whl:

Publisher: ci.yml on bmsuisse/rusket

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rusket-0.1.49-cp313-cp313-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for rusket-0.1.49-cp313-cp313-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 9df0a0c759667f757cf3fd4ed27b69e16d771d27b9f26288a8ed81e4dc905f57
MD5 58586265512083fd5e48d38f138ba80c
BLAKE2b-256 0cfdfc2de7f0360148a34aaf3e0991e84ce565cb02c7187266b1b0752f1287dc

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.49-cp313-cp313-musllinux_1_2_aarch64.whl:

Publisher: ci.yml on bmsuisse/rusket

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rusket-0.1.49-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rusket-0.1.49-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 37310cbd9963dd5a1ab260cd21b70502251f486e39f193d5b96876dd8d8abec4
MD5 0d50ce1f3183646cf9d9ddf5c897cb72
BLAKE2b-256 8fb2d4080a5cf8a0138af5ad056a475153e3b4f15963b857aa3abaf4c767aac5

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.49-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: ci.yml on bmsuisse/rusket

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rusket-0.1.49-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for rusket-0.1.49-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 d5df0daac0741a8787f3463e3690aca4c9cab02e26c8ec2bc57bfb943da01bdb
MD5 e580e434ce8a70deddef0e68056392dc
BLAKE2b-256 a7c62e6cf28e2f4559f507827db6c000f869c5aa40ff01c272909af8d19d7bf0

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.49-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: ci.yml on bmsuisse/rusket

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rusket-0.1.49-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for rusket-0.1.49-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 56642d496bb63bdd1101add5cd67a468b22c1177820a1bab40aed25490c24c28
MD5 154fc8ba7a0c325a8f3f84589dfc0093
BLAKE2b-256 62f60d15b293b66bfa3ef2349f26f8ff8ed5bd7a4c03203cebb8b759b2faa0a3

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.49-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: ci.yml on bmsuisse/rusket

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rusket-0.1.49-cp313-cp313-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for rusket-0.1.49-cp313-cp313-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 09c24480cb4b47d6e5e80f997e0bc770b43b8eaeeb35299364879d317394cc31
MD5 b31690570ab08c7b299274a57b714214
BLAKE2b-256 377dfc227a001a18d9b03d6ecd921c474b8e1f652a5f3640d50667a68470f192

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.49-cp313-cp313-macosx_10_12_x86_64.whl:

Publisher: ci.yml on bmsuisse/rusket

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rusket-0.1.49-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: rusket-0.1.49-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 810.1 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for rusket-0.1.49-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 d29f0a9c2e9e9fe861d8b964677d88c2fb0bdbb72e48a349dd62c2aa8871eb89
MD5 52b77f05fa5fd44407d89e91f183e3ae
BLAKE2b-256 80607d1c63e74dd83197da7043f013b3a4c090718c74fea5ed2780a9d6ae7f6f

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.49-cp312-cp312-win_amd64.whl:

Publisher: ci.yml on bmsuisse/rusket

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rusket-0.1.49-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for rusket-0.1.49-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 49eee1b613eba436fe786e79da42de99179b99c64cfd9b13e706a1a711c409da
MD5 e5fefdc675ad6d6775faf8f12b89ad81
BLAKE2b-256 a1a42b5ffaff8384eefe455650b7e8e71c869e9d6f3c611572486996a02992ed

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.49-cp312-cp312-musllinux_1_2_x86_64.whl:

Publisher: ci.yml on bmsuisse/rusket

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rusket-0.1.49-cp312-cp312-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for rusket-0.1.49-cp312-cp312-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 31b57f4e899396260bf78ba46e1d9975041d38b952527bd209ba2856c153333e
MD5 102d28de16eccfe18ea5f588fcd02c2c
BLAKE2b-256 0dbc341b9ee1fbb567c002d598869546b1395469f0cd6e7dc9373db754928bb5

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.49-cp312-cp312-musllinux_1_2_aarch64.whl:

Publisher: ci.yml on bmsuisse/rusket

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rusket-0.1.49-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rusket-0.1.49-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ddf9624e28925e3e0249160b574bb3e1b64985b69d85d00c5c2e2f799b52f67d
MD5 7c691bf5809edfea2007a147b235fbd8
BLAKE2b-256 8231a07138861ff9e4d202d08277217f5d58dee96569783c5cdfd67ff62e1784

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.49-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: ci.yml on bmsuisse/rusket

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rusket-0.1.49-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for rusket-0.1.49-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 46fcf42494e3d07a6ac10334ad93ec4447e800bde92be275ff1c0a144e9610d8
MD5 b51447dfbe6c03926dea6cc19ae99342
BLAKE2b-256 dbc9060a537044e58afbf4ea47bcd3031c0bfddf3ad17e64e4268fd91217a6e1

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.49-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: ci.yml on bmsuisse/rusket

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rusket-0.1.49-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for rusket-0.1.49-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4c283ca7b231e4a0f85ceedd8d0f41477235ee20fee3a74558d68adc8c1dbfbc
MD5 6da789eaa5a26f7e1101843340fc1018
BLAKE2b-256 f46f2cd98ff602f157e1d3161462244214fd16ee6a581947e2bb4a1baacdd4f5

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.49-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: ci.yml on bmsuisse/rusket

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rusket-0.1.49-cp312-cp312-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for rusket-0.1.49-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 b6fc53863cff8993e3065079e5753aafa7a01180a3bcefd272b277a3eef978a9
MD5 e1f00aecbe28a2a53c458dcb8f609464
BLAKE2b-256 ca411825d4a67814548ceaade9e7f709dfe45a9fb842c742d84f2ded02ad6840

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.49-cp312-cp312-macosx_10_12_x86_64.whl:

Publisher: ci.yml on bmsuisse/rusket

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rusket-0.1.49-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: rusket-0.1.49-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 810.5 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for rusket-0.1.49-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 1dfc01899cf5761848409f13cad7a388da2007672e0038121ac426361e9c3d41
MD5 3e45e86cc0878c7659e82a1be15a3273
BLAKE2b-256 1ce450a22d2fd01ba8f56a15c3628c969a2c30e83457fc664dbf0c537dd5d873

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.49-cp311-cp311-win_amd64.whl:

Publisher: ci.yml on bmsuisse/rusket

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rusket-0.1.49-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for rusket-0.1.49-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 a6e3107ef284ec984ea2d7a015da382e501ef4aef7cf566f11b4e342a3e6f620
MD5 4f4f8a49482967052da9185dfcfa9d0b
BLAKE2b-256 50daa6cf3baa3be8fa473721a20ebaf5d0b6b908e278b8c15625cd6e4766974b

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.49-cp311-cp311-musllinux_1_2_x86_64.whl:

Publisher: ci.yml on bmsuisse/rusket

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rusket-0.1.49-cp311-cp311-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for rusket-0.1.49-cp311-cp311-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 1bb21a3c167a17e4023edb7675b1e5ab15bed1039a36c39c762c9c668a5a26db
MD5 c001395d3ae5990e87e94a5cff2bf35b
BLAKE2b-256 71dd5aaf087258bd30fce6278bb0a9aec347e5ff9115fbcb323e0072278629cb

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.49-cp311-cp311-musllinux_1_2_aarch64.whl:

Publisher: ci.yml on bmsuisse/rusket

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rusket-0.1.49-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rusket-0.1.49-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 acb69df4e68623431629c03ee6143e9baadb42edef3df6984a63021a653153ec
MD5 3de430300a4e7a27dd73e9055b71eb4a
BLAKE2b-256 d1152b77c9ef874d1a87f7bcf3f198197b12073dd908cea17382e72305726fc1

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.49-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: ci.yml on bmsuisse/rusket

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rusket-0.1.49-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for rusket-0.1.49-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 5d01b8919fd8fbe01ac2cae6bf83de2ab2b6700d7c1d91c2c259c42542e938c5
MD5 54385b337dec5d8479e70078ae019591
BLAKE2b-256 d6c28f9fed1e56e481abfef897ac4b1e70de704efb92540fed41716c06fa9106

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.49-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: ci.yml on bmsuisse/rusket

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rusket-0.1.49-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for rusket-0.1.49-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 28ba42e4c2b381de093e3cef094877a91d3cf603cb1c5afc9f7e006f92b112f3
MD5 b871189eb47f6a448194b0a081147107
BLAKE2b-256 0836af578d8068ef8a307d796ff5073cccf06d93b3bef129b08bef854472c84e

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.49-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: ci.yml on bmsuisse/rusket

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rusket-0.1.49-cp311-cp311-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for rusket-0.1.49-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 b73b5f99d1b7aba807a4cb04bbbcb414873665b4b662ca4eb46ef17af8a743c6
MD5 9409caed4fe3ff8f6c0f9fe8fca24044
BLAKE2b-256 bdcc5d3084feef9b06380569eb903072e84d3e803b46a77b75257df1c84da3ff

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.49-cp311-cp311-macosx_10_12_x86_64.whl:

Publisher: ci.yml on bmsuisse/rusket

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rusket-0.1.49-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: rusket-0.1.49-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 810.5 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for rusket-0.1.49-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 d6ee649085119fa4c6e5c5bbb1abf92f31b233f329422f09b659360dd6b3af28
MD5 e1d0d4054321491b0ba822bcb3a855b2
BLAKE2b-256 5d90805d9e8a6bee56f2f2987a4091e940da20afb629da4fdbadc73632f57175

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.49-cp310-cp310-win_amd64.whl:

Publisher: ci.yml on bmsuisse/rusket

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rusket-0.1.49-cp310-cp310-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for rusket-0.1.49-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 dd4f158ee151d5c45c012d947e1fa6e56f4233aa260a9659aa7ad08996a32878
MD5 b61a8e1a3a7f6182edb9ad7191e6a914
BLAKE2b-256 68634e1bf0cbd1389abe195c38b819cbf7b8de26edf9c3645df97a8ef70ac33f

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.49-cp310-cp310-musllinux_1_2_x86_64.whl:

Publisher: ci.yml on bmsuisse/rusket

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rusket-0.1.49-cp310-cp310-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for rusket-0.1.49-cp310-cp310-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 3de83e733b141ccb1bdc32daab0e73edb1092c55b936ba37dce63e86c2d61318
MD5 ac35d5898fe7b6fbc2e1ee561d3ca7e3
BLAKE2b-256 7737a4ef88687e485362150d1f67fba5fc3541be247b0effdf528a051d1f591e

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.49-cp310-cp310-musllinux_1_2_aarch64.whl:

Publisher: ci.yml on bmsuisse/rusket

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rusket-0.1.49-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rusket-0.1.49-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 eea28b6172bc82e56a8ced2832493afdce1cac5e1dfb6947cfc0204f69f5f0a5
MD5 fe088458ff6284bde4e32d71d2535e4e
BLAKE2b-256 68ec92e2e975ea78c42257b38deea4cbfdeda2caa2e95bed8d900af7b98f6faf

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.49-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: ci.yml on bmsuisse/rusket

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rusket-0.1.49-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for rusket-0.1.49-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 eb9f4228d9af95beb9a675fbe9d03ef9a75af42761e5e01a21a6b34c57925540
MD5 e8b33e9b7996491b970f048be006956c
BLAKE2b-256 1af42ea0a93367fc0c738a5e68b93cfb48b99948905b93ee4aaf5ca4bf3005f6

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.49-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: ci.yml on bmsuisse/rusket

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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