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 11ร—, and FP-Growth is 140ร— faster than PySpark.
๐Ÿ“ฆ 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, UserKNN, EASE), Sequential Recommendation (FPMC, SASRec), Context-aware Prediction (FM), Pattern Mining (FP-Growth, Eclat, FIN, LCM, HUPM, PrefixSpan), and built-in Hyperparameter Tuning (Optuna + MLflow tracking) 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, UserKNN, EASE, FM, FPMC, SASRec, FP-Growth, Eclat, FIN, LCM, 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 FPGrowth

# 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?

model = FPGrowth(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 FPGrowth

# 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 = FPGrowth.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 FPGrowth

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

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


๐Ÿปโ€โ„๏ธ 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 FPGrowth

# โ”€โ”€ 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 FPGrowth (zero-copy from Polars) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
model = FPGrowth(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 FPGrowth

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 = FPGrowth(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

)
# 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
FPGrowth Miner, RuleMinerMixin Frequent Pattern Growth algorithm
FIN Miner, RuleMinerMixin FP-tree Node-list intersection mining
LCM Miner, RuleMinerMixin Linear-time Closed itemset Mining
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
UserKNN ImplicitRecommender User-based k-NN CF
EASE ImplicitRecommender Embarrassingly Shallow Autoencoders
FM BaseModel Factorization Machines (CTR prediction)
FPMC SequentialRecommender Factorizing Personalized Markov Chains
SASRec SequentialRecommender Self-Attentive Sequential Recommendation

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) additionally expose RuleMinerMixin, giving a fluent pipeline:

model  = FPGrowth.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, UserKNN, EASE) follow the scikit-learn fit()/predict() pattern. SequentialRecommender subclasses (FPMC, SASRec) use from_transactions(..., time_col=...).fit() for sequential next-item prediction:

# 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.

๐ŸŽฏ ItemKNN & UserKNN โ€” Nearest-Neighbor Collaborative Filtering

Two complementary memory-based methods that consistently rank among the top performers in academic benchmarks (see Anelli et al. 2022).

  • ItemKNN โ€” Finds items similar to what the user already liked. Fast, stable, and scales well with pre-computed item-item similarity.
  • UserKNN โ€” Finds users similar to the target user and recommends what they liked. Often more serendipitous and performs particularly well on dense datasets.

Both support BM25, TF-IDF, Cosine, and raw Count weighting, with the top-K neighbor pruning running in parallel Rust.

from rusket import ItemKNN, UserKNN

# โ”€โ”€ Item-based: "Customers who bought X also bought Y" โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
item_knn = ItemKNN.from_transactions(
    purchases, user_col="user_id", item_col="item_id",
    method="bm25", k=100,
).fit()
items, scores = item_knn.recommend_items(user_id=42, n=10)

# โ”€โ”€ User-based: "Users similar to you enjoyed these items" โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
user_knn = UserKNN.from_transactions(
    purchases, user_col="user_id", item_col="item_id",
    method="cosine", k=50,
).fit()
items, scores = user_knn.recommend_items(user_id=42, n=10)

Which one to choose? Start with ItemKNN(method="bm25") โ€” it's the fastest and most stable. Switch to UserKNN if you have a dense dataset or want more diverse recommendations. In production, try both and evaluate with rusket.evaluate().

๐ŸŽฏ 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, FPGrowth

# 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 = FPGrowth(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)

๐ŸŽฏ Multi-Stage Recommendation Pipeline

For production systems requiring advanced retrieval and ranking, use the Pipeline class. This mirrors the "retrieve โ†’ rerank โ†’ filter" paradigm used by Twitter/X and modern ML stacks.

It chains multiple models together:

  1. Retrieve: Candidate generation
  2. Rerank: Re-score candidates using a heavier scoring function
  3. Filter: Apply business rules (e.g. exclude out-of-stock items, diversify)
from rusket import ALS, BPR, Pipeline, RuleBasedRecommender
import pandas as pd

# 1. Train multiple base models
als = ALS(factors=64).fit(interactions)
bpr = BPR(factors=128).fit(interactions)

# 2. Define explicit business rules (e.g. promoting warranties with laptops)
rules_df = pd.DataFrame({
    "antecedent": ["102"],   # Laptop SKU
    "consequent": ["999"],   # Warranty SKU
    "score": [2.0]
})
rules = RuleBasedRecommender.from_transactions(
    interactions, rules=rules_df, user_col="user", item_col="item"
).fit()

# 3. Compose the Pipeline (Retrieve from ALS, rerank with deeper BPR vectors)
# Items from the `rules` model receive an artificial +1,000,000 score 
# ensuring they rank at the top *after* the algorithmic reranking.
pipeline = Pipeline(
    retrieve=[als, bpr],
    merge_strategy="max",  # how to combine candidate scores
    rerank=bpr,
    rules=rules, 
)

# Recommend for a user
items, scores = pipeline.recommend(user_id=42, n=10, exclude_seen=True)

# Blazing-fast Batch Scoring utilizing Rust inner loops
batch_recs = pipeline.recommend_batch(
    user_ids=[1, 2, 3],
    n=10,
    format="polars"  # Returns a native Polars DataFrame instantly
)

๐Ÿ’พ Saving, Loading and Serving (LanceDB / Vector DBs)

rusket models use a unified BaseModel that provides .save() and .load() functionality. You can also export trained models to a Vector Database for fast, real-time serving in production. We even provide load_model which automatically infers the model architecture from the pickle file.

import rusket

# 1. Train the model
model = rusket.ALS(factors=32).fit(interactions)

# 2. Save your trained model to disk
model.save("my_als_model.pkl")

# 3. Load it back using the generic loader
loaded_model = rusket.load_model("my_als_model.pkl")

# 4. Export the embeddings for a Vector Database
items_df = rusket.export_item_factors(
    loaded_model, 
    normalize=True,     # Best for Cosine Similarity search
    format="pandas"
)

# 5. Serve it in real-time (Example using LanceDB)
import lancedb

# Create a local vector database
db = lancedb.connect("./lancedb_store")
table = db.create_table("items", data=items_df)

# Query the table with a specific user's latent factors
user_emb = loaded_model.user_factors[0]

# Retrieve top 5 item recommendations for this user using L2-normalized vector search!
results = table.search(user_emb).limit(5).to_pandas()

๐Ÿ” 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).

๐Ÿ”ฌ MLOps: MLflow Tracking & Hyperparameter Tuning

rusket has built-in support for MLflow experiment tracking, mlflow.pyfunc packaging, and Bayesian hyperparameter optimisation using Optuna's TPE sampler. For ALS/eALS models, each Optuna trial runs the Rust-native cross-validation backend โ€” making the entire search blazingly fast.

import rusket
import rusket.mlflow
from rusket import OptunaSearchSpace

# โ”€โ”€ 1. Enable MLflow Autologging โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
rusket.mlflow.autolog()

# โ”€โ”€ 2. Train a single model with automatic tracking โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
# Hyperparameters (factors, iterations) and training_duration_seconds are logged!
import mlflow
with mlflow.start_run():
    model = rusket.ALS(factors=64, iterations=15).fit(df)

# Save/Load models as native MLflow pyfunc artifacts for easy deployment
rusket.mlflow.save_model(model, "my_als_model")
loaded_model = mlflow.pyfunc.load_model("my_als_model")  # Has a .predict(df) method

# โ”€โ”€ 3. Quick hyperparameter search with sensible defaults โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
result = rusket.optuna_optimize(
    rusket.ALS,
    df,
    user_col="user_id",
    item_col="item_id",
    n_trials=50,
    metric="ndcg",
    k=10,
)
print(f"Best ndcg@10: {result.best_score:.4f}")
print(f"Best params:  {result.best_params}")

# โ”€โ”€ Custom search space + refit best model โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
result = rusket.optuna_optimize(
    rusket.eALS,
    df,
    user_col="user_id",
    item_col="item_id",
    search_space=[
        OptunaSearchSpace.int("factors", 16, 256, log=True),
        OptunaSearchSpace.float("alpha", 1.0, 100.0, log=True),
        OptunaSearchSpace.float("regularization", 1e-4, 1.0, log=True),
        OptunaSearchSpace.int("iterations", 5, 30),
    ],
    n_trials=100,
    n_folds=3,
    metric="precision",
    refit_best=True,  # best model is already fitted
)
items, scores = result.best_model.recommend_items(user_id=42, n=10)

# โ”€โ”€ MLflow experiment tracking โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
# pip install mlflow optuna-integration
import mlflow

mlflow.set_tracking_uri("http://localhost:5000")
mlflow.set_experiment("als-tuning")

result = rusket.optuna_optimize(
    rusket.ALS, df,
    user_col="user_id", item_col="item_id",
    n_trials=50, metric="ndcg",
    mlflow_tracking=True,   # โ† every trial logged to MLflow
)

# โ”€โ”€ Custom callbacks โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
result = rusket.optuna_optimize(
    rusket.ALS, df,
    user_col="user_id", item_col="item_id",
    n_trials=50,
    callbacks=[my_custom_callback],  # any Optuna-compatible callback
)

โšก 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 FPGrowth

# 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 = FPGrowth(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 (Cholesky) (64 factors, 15 epochs) 427 ms 1,324 ms 3.1ร—
ALS (eALS) (64 factors, 15 epochs) 360 ms N/A โ€”
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.81.tar.gz (229.8 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.81-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl (1.5 MB view details)

Uploaded PyPymusllinux: musl 1.2+ x86-64

rusket-0.1.81-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl (1.5 MB view details)

Uploaded PyPymusllinux: musl 1.2+ ARM64

rusket-0.1.81-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB view details)

Uploaded PyPymanylinux: glibc 2.17+ x86-64

rusket-0.1.81-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.3 MB view details)

Uploaded PyPymanylinux: glibc 2.17+ ARM64

rusket-0.1.81-cp314-cp314t-musllinux_1_2_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.2+ x86-64

rusket-0.1.81-cp314-cp314t-musllinux_1_2_aarch64.whl (1.5 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.2+ ARM64

rusket-0.1.81-cp314-cp314-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.14Windows x86-64

rusket-0.1.81-cp314-cp314-musllinux_1_2_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ x86-64

rusket-0.1.81-cp314-cp314-musllinux_1_2_aarch64.whl (1.5 MB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ ARM64

rusket-0.1.81-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ x86-64

rusket-0.1.81-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.3 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ ARM64

rusket-0.1.81-cp314-cp314-macosx_11_0_arm64.whl (1.2 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

rusket-0.1.81-cp314-cp314-macosx_10_12_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.14macOS 10.12+ x86-64

rusket-0.1.81-cp313-cp313t-musllinux_1_2_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.13tmusllinux: musl 1.2+ x86-64

rusket-0.1.81-cp313-cp313t-musllinux_1_2_aarch64.whl (1.5 MB view details)

Uploaded CPython 3.13tmusllinux: musl 1.2+ ARM64

rusket-0.1.81-cp313-cp313-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.13Windows x86-64

rusket-0.1.81-cp313-cp313-musllinux_1_2_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

rusket-0.1.81-cp313-cp313-musllinux_1_2_aarch64.whl (1.5 MB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ ARM64

rusket-0.1.81-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

rusket-0.1.81-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.3 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64

rusket-0.1.81-cp313-cp313-macosx_11_0_arm64.whl (1.2 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

rusket-0.1.81-cp313-cp313-macosx_10_12_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.13macOS 10.12+ x86-64

rusket-0.1.81-cp312-cp312-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.12Windows x86-64

rusket-0.1.81-cp312-cp312-musllinux_1_2_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

rusket-0.1.81-cp312-cp312-musllinux_1_2_aarch64.whl (1.5 MB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ ARM64

rusket-0.1.81-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

rusket-0.1.81-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.3 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

rusket-0.1.81-cp312-cp312-macosx_11_0_arm64.whl (1.2 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

rusket-0.1.81-cp312-cp312-macosx_10_12_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.12macOS 10.12+ x86-64

rusket-0.1.81-cp311-cp311-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.11Windows x86-64

rusket-0.1.81-cp311-cp311-musllinux_1_2_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

rusket-0.1.81-cp311-cp311-musllinux_1_2_aarch64.whl (1.5 MB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ ARM64

rusket-0.1.81-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

rusket-0.1.81-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.3 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64

rusket-0.1.81-cp311-cp311-macosx_11_0_arm64.whl (1.2 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

rusket-0.1.81-cp311-cp311-macosx_10_12_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.11macOS 10.12+ x86-64

rusket-0.1.81-cp310-cp310-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.10Windows x86-64

rusket-0.1.81-cp310-cp310-musllinux_1_2_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ x86-64

rusket-0.1.81-cp310-cp310-musllinux_1_2_aarch64.whl (1.5 MB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ ARM64

rusket-0.1.81-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

rusket-0.1.81-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.3 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64

File details

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

File metadata

  • Download URL: rusket-0.1.81.tar.gz
  • Upload date:
  • Size: 229.8 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.81.tar.gz
Algorithm Hash digest
SHA256 027c6ba9f641d469202316af8af0e642af1ad3f31d8cc7db31cec8b0d86f2a6e
MD5 67dc3860251437cfe7c5764caa50aa29
BLAKE2b-256 2676a1f1c8cd9b76ed6010636743dab2dddf9ef24eb596f43bc6f65f8a9f4ef3

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.81.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.81-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for rusket-0.1.81-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 eb96c8ac77fcb7c08b96edc6bb53a296bc4d1416c3e189f4e49b22b000a58ca1
MD5 1e8f9968292e65505146771448e04890
BLAKE2b-256 8a767d30bd3eef2ea94b8801732abacc9b018498aa3bbc924cb04fc17abda1e3

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.81-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.81-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for rusket-0.1.81-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 4ecd03493acbf0ec903e02cb630467a55fff7aeb267a2b79f7aa478c3f14ac47
MD5 49959d4fb7950d58efeb0d21b8bd9cbd
BLAKE2b-256 dd2290bfec9f86fd717bab2122d6f517d0cc9b25323f6bed5795abc7ab2d956a

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.81-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.81-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rusket-0.1.81-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 bf487fe7462adce8916c8233de067e1a101b3067fe778a1375986d2c1aa1a7e0
MD5 464f6832efe2da075a3f75d942288119
BLAKE2b-256 c4dcd5eb3e17d616af731258d969b040cbebaca7500c9370e452aee57489ecc2

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.81-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.81-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for rusket-0.1.81-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 ada80afca41c90d04d6e65335912bc00cddd99ecac83ae33c6720d6457bda7ec
MD5 faf85ca7fdaddc81326ca37c4b17c138
BLAKE2b-256 b33f77685e3a358eefa28b5cbdaef499819f89669bc64777069fd5a154f98553

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.81-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.81-cp314-cp314t-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for rusket-0.1.81-cp314-cp314t-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 925f991182e1e924880c80870921ba5129245a4ddfe1d02f448773cfe63758a0
MD5 013de48183079fcaccd46338cdb04803
BLAKE2b-256 3e5060e7af2711d2b047707382526e6ed86e217772dcb718c4be041478678a84

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.81-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.81-cp314-cp314t-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for rusket-0.1.81-cp314-cp314t-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 6321d0f40db8020095bf105e50302f3689527338b3e5e1928472351110269afb
MD5 2d10a55582b2f16c70d451d2dff15f70
BLAKE2b-256 acad831f249d7ac1fc8c4721b1c96c8fee9bec3f004bbedaf96a5d5066763f3b

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.81-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.81-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: rusket-0.1.81-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 1.1 MB
  • 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.81-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 1bb394e8878505a51a9432a51f4f1fdcc75e4f46832799e8af655426103e85bb
MD5 c2d8e83e7f393ec1473088015c4987bc
BLAKE2b-256 841cbde999054b855c5f33c7f811329936494a2726963add0a6621c456706f96

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.81-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.81-cp314-cp314-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for rusket-0.1.81-cp314-cp314-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 79932dffcdffbdc8c613f84c8876d2f30864fbb398fda15030fbc3bd00bef964
MD5 8e904ddbc2dca0aa0f8387089ef084cf
BLAKE2b-256 e9720fa5dcebe2dbf25c0fcf2ea6af25e21555c6f808a13d92c6093e3dd0547e

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.81-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.81-cp314-cp314-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for rusket-0.1.81-cp314-cp314-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 19ad0c5bfc0eadf7f9ccccb023419bfa83bfc0a65d7b109011ec80aefea21667
MD5 5001a65e5af2f36f11c8cae3745cd516
BLAKE2b-256 9644db63bd48c0e74d43d3c9a3d636f8e5a2bd32d4d3271545b03b9009766264

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.81-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.81-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rusket-0.1.81-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1687d2d4e71b84f86e56b75aa06e41d7ef253b998ef978d07c110bd58a741646
MD5 bd29ad18593508aa1cc62553d83bce14
BLAKE2b-256 66a3b2fe17eecc4e17435793ab1c0424cdbadb3d1dd8b5203df9b755989bae04

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.81-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.81-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for rusket-0.1.81-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 520ac48a72ecdfd35218045455f0239e2988c086637b061bb0896feaaa2953f7
MD5 be94bf282a34992476036fba84b5a326
BLAKE2b-256 19ca3672873943654dad310a19116f1b88751eaaace41f3a4f53fe4df5c16d12

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.81-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.81-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for rusket-0.1.81-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 aa71e5cb3647a5cf4730edf049544e551fb7d0e00b35bf964a8cdb5c42adf079
MD5 6f3fcf94adfa6bc70b1d3b306f89bee8
BLAKE2b-256 b37efb2415692961fefe5532950fd3590c6ead0a98b444f869bcb0bb167f8c32

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.81-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.81-cp314-cp314-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for rusket-0.1.81-cp314-cp314-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 115aea0eb3a1e57156e0ee41d426c9ad65a61e2678af370c0a706c472e6f341f
MD5 308d1de84612c85e9ad681970ce12bae
BLAKE2b-256 3a12b775acaff81f30d07922ce1f7bf94d3514ab363c6a1b208cbba0ca9f027b

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.81-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.81-cp313-cp313t-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for rusket-0.1.81-cp313-cp313t-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 0fd11b9ea295c42719040cd0816b27e6c83550dbb4fa50be5dadbd65577b5d40
MD5 e7ed31d36bbb49b713bc0423a3b128f0
BLAKE2b-256 76eb35d90d800aee330f6bbcaeed34997e35060caa0ef1e11035c95555e19449

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.81-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.81-cp313-cp313t-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for rusket-0.1.81-cp313-cp313t-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 b8a2875d0de83d572bbe7f3b49483659b2e23ca65d036da37a21f003fd0008af
MD5 05f3d2b10f90cb9d0e0e4c95679da45d
BLAKE2b-256 5fe0c053aa7b77ba4d76d9525d514bf15aa152eaf69b2d2ed82c2b7e96d63635

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.81-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.81-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: rusket-0.1.81-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 1.1 MB
  • 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.81-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 c3443f96f42d1ea5dcac5e751b68733b53c676acaad7d69adfc351de482b02f9
MD5 3a9b0dbbd7e154a60a21d37979972f50
BLAKE2b-256 be04df3b3204cdac9736e15a5dc4ba7386cc2209cd0b9e67d600179e1af60c4b

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.81-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.81-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for rusket-0.1.81-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 970b63386985fb0c6d041234ce6d592edfb6740343c68fbce97589ea2eb994a8
MD5 52be18e42298ef71ce83bbf177ac7f3c
BLAKE2b-256 987b60c6deeb2ba6ca12f29d5264d47fb546f903895f6e51f6afad615f6a2ccb

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.81-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.81-cp313-cp313-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for rusket-0.1.81-cp313-cp313-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 17bc6fe87525f93f5f1af94087946c5bb82904381ceb92b685c86c17da7aca2a
MD5 783893e23118e87d518bbf36a4a0dea2
BLAKE2b-256 67d087e327572c84efb32564a94edc344760a197761cd5d3c9fa943d054eb842

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.81-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.81-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rusket-0.1.81-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 96e436ff3cb10509283540c075f2afc7fa195b0b7142f9e496b6953c3397df79
MD5 99ea9a3110786d7f81c4490f811c7a4d
BLAKE2b-256 0133ef5ed1f1d6229da2052d447f656e304cf6477fadbaae3b7327f2cc533aae

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.81-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.81-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for rusket-0.1.81-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 5fe93c0632196d5c4e8ca84161e5cba579f97dca71a203eb7a39e7e291dc4c10
MD5 705e3745336c98aff84cb7154706e31f
BLAKE2b-256 c05758243d86d2acb771a06203abe87231adf019ccacf12dc7dc5739d92162bd

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.81-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.81-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for rusket-0.1.81-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7607ccb638dec0fdc5a1de317b2f243a369fb8784ea661adfdaaee83ed89358f
MD5 ff61adbf3f4234b31ef1041c4e6ff14d
BLAKE2b-256 b84bd15a0b0d6fe33736d9e44d5652201a95c6050fb958cc937cc462243f63fa

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.81-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.81-cp313-cp313-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for rusket-0.1.81-cp313-cp313-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 e1b5b25cd34ea7de366c17105f7a5fc800de38f8620b648785df6c34a93a4852
MD5 b87b18a41f8561db270a3f8fca71034c
BLAKE2b-256 9de1a986570b25bcd757808f386406ca0f5f79f9410367116428e7fd64399123

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.81-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.81-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: rusket-0.1.81-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 1.1 MB
  • 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.81-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 b3631159f6d0175499ce2087d006dee96dac63a6ad0036f20e19c15fa7eb472d
MD5 f1e2338ca302a21ff38acf8bde4f6a5e
BLAKE2b-256 4d8ea68e182315655dba07107d52756bb9bd72be322b6964142eb9f5bea692fa

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.81-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.81-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for rusket-0.1.81-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 cfd1929271d769706d77ada0870b093def5aea8dfd6a533276454fd92e2286de
MD5 c6713c60ce6554858b3c49762efe1220
BLAKE2b-256 4a7ba1b16e1aa59a8561c03b92bfd5cace6642983fa1ff59f3ba90e94ec8f51b

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.81-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.81-cp312-cp312-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for rusket-0.1.81-cp312-cp312-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 13491fbdb53fa082b527911e58f6734e5bbcbfcfbc409c6d7d75cd5946ea5d68
MD5 ab46eca28643e3dc2dc88920006c4c82
BLAKE2b-256 a0c77f94c92964e4e0f6ef7fff147940d803d6ca76a7155635b119e06cc647a4

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.81-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.81-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rusket-0.1.81-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 811a4862c7d063a589a1edc580d220fc42077f916206ff16ef68a5614685e9d7
MD5 afb415d8f85168cdbd549444c3c9806a
BLAKE2b-256 9f4e90f1c6983a1fd03576e5ad490fe2766f2198263eb65515a5d7e198d70935

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.81-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.81-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for rusket-0.1.81-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 1a32ede90c9a278349b50237429624543d1f54fd8e25dfbbf7c95790a0484bc9
MD5 b6870b88553a3311d209f72900b16ac0
BLAKE2b-256 335125db5226f697b8491136162e5c8988f0f23f76ebd58c09eb7059319f3492

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.81-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.81-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for rusket-0.1.81-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 439cccf97c925b2578a7368f71e408070217cafb62f5c917d8e4fd877fb06650
MD5 31454a1593e163e89c4bf6c1bf59b713
BLAKE2b-256 eec44ce8f0d3956e5d9dd9b37cf264c1148aff7fb59a8ed15175b0f8c9934c75

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.81-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.81-cp312-cp312-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for rusket-0.1.81-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 5f985e72f9fbf995596eeba8bb7d8d2c40ebdd4b5230c52830229058a7742819
MD5 855550b7c16b2f09e779b3499c4c219c
BLAKE2b-256 0902548c9182c499d295cf69cb417ab1790c49dea67a61a3992e890130ee5d9f

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.81-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.81-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: rusket-0.1.81-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 1.1 MB
  • 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.81-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 6e753e698631168b5942b08905726a4676af010bb87483bf8f57ff6d85a9a3af
MD5 650cc64b337c10168557d19ac2e409a5
BLAKE2b-256 c00a2c027eccd584461c150cefc53515aaf6460afac8399a50826e344f4e3a0c

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.81-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.81-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for rusket-0.1.81-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 2e63f2c8f170821989cffada8e91ca1a34d25a1e97ae7e9cc04875d810cb3982
MD5 7317b540aaa521594cd3ec2528f93f4c
BLAKE2b-256 4926129ba3cbeabe140d79d22947ed7ce2ec42ef2cd0848f928523b8a3658fe2

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.81-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.81-cp311-cp311-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for rusket-0.1.81-cp311-cp311-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 6d130ebe8c8851a84f86ee8b430f72568c4632b90ae2db1207f605fdee841f94
MD5 6bdb7a0882800b969321ecd0b244a0cc
BLAKE2b-256 71920961cbec069196531e7aa89d5ac16a48e2633df2c30cea4f4628bb0c9852

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.81-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.81-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rusket-0.1.81-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 336144ebf406258fc2a78d5b03250148f26a31744292d24bb257b1ca64eed4a8
MD5 5ad79b11c1dfbbcd334b5684d43b28aa
BLAKE2b-256 9a4e4521334cef6a89f25cb27355266b4847405ae6c6feca10a95309e308f4b0

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.81-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.81-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for rusket-0.1.81-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 84d01e7d573fb348668a6456e3be342ce656b1e1432109731cfcd0c28b286b18
MD5 7d952d7252f97b03c5901604ec8c9784
BLAKE2b-256 3a08af2259b5703ef7a13f165982f710d0bee9c49d49f730fb2f42ede4caed31

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.81-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.81-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for rusket-0.1.81-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 93b01275596186436fe5d6ed40a0ab3e843a59a7a4ffe2b563be953a1256466c
MD5 c7fd95997c64b589af436b2ee5e07845
BLAKE2b-256 7b129e8fe94c19e1c751c120fb97ec28a452b6a38a2aa9f546c4da8a91d7ab27

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.81-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.81-cp311-cp311-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for rusket-0.1.81-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 7ccf17e15fa837f2ea0e9c0640911d48fd1e5854867ac926ce58a4bd6ce322f7
MD5 19b243b471ca13b559b6b74e6120d586
BLAKE2b-256 ab2987901dd07312e03f8ea5e21a105c951bd2c1db268be8bc393e2a88b7c04e

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.81-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.81-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: rusket-0.1.81-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 1.1 MB
  • 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.81-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 dc7c015122205f3f041d0e515a312297ecc964b030b97128d5dc7914732231aa
MD5 a9d77db223ad8c5d876eef85374ba459
BLAKE2b-256 35d7a1c12beb2adb85938cb920552c29f02a105b99762c0e2700edffa4089902

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.81-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.81-cp310-cp310-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for rusket-0.1.81-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 bd21f236ad888f10dd21aa046ae236109ffe54b01d8a51c06936a7cb5985c731
MD5 458a471a8bfd1e95599f20502db4ae66
BLAKE2b-256 f454886dacc57b10287205c5b4b197e2ed1eaba21a863493176c2801c703b044

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.81-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.81-cp310-cp310-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for rusket-0.1.81-cp310-cp310-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 69f20a4f18fe865f45925437fd6ef067fa5ae0f621f1d49042e4634e9a90e8fb
MD5 d2258972ca0b71a685b010dbf8e68094
BLAKE2b-256 a6af341f9d32f44c6f901b54cf469fdb46825809c886ac78b6b67354d9849575

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.81-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.81-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rusket-0.1.81-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f4f5ea8bba6dda382b127a678eab06e80bc532094ba0e72aa436943733947e10
MD5 f0cb03b597910ae9cbf75118b185195a
BLAKE2b-256 a0ec57866e297d2189ccc515638b0ff56e675c6694c95921da60545bcdc47cbc

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.81-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.81-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for rusket-0.1.81-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 11f30b6e3eef07fb01cc67250dafd7e17adc0c5136a74c84c038fefe6fc07372
MD5 ccabbd989836ac8d8f3f4dba312ed49d
BLAKE2b-256 df79e2cdd74c1f6326bc502b99deb2916dcc7ea493380450bcecd857d60c1774

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.81-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