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


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

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

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

# 2. Compose the Pipeline (Retrieve from ALS, rerank with deeper BPR vectors)
pipeline = Pipeline(
    retrieve=[als, bpr],
    merge_strategy="max",  # how to combine candidate scores
    rerank=bpr,
)

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

๐Ÿ”ฌ Hyperparameter Tuning (Optuna + MLflow)

Built-in Bayesian hyperparameter optimisation using Optuna's TPE sampler. For ALS/eALS models, each trial runs the Rust-native cross-validation backend โ€” making the entire search blazingly fast.

import rusket
from rusket import OptunaSearchSpace

# โ”€โ”€ Quick 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.73.tar.gz (207.3 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.73-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl (1.4 MB view details)

Uploaded PyPymusllinux: musl 1.2+ x86-64

rusket-0.1.73-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl (1.4 MB view details)

Uploaded PyPymusllinux: musl 1.2+ ARM64

rusket-0.1.73-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.2 MB view details)

Uploaded PyPymanylinux: glibc 2.17+ x86-64

rusket-0.1.73-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.2 MB view details)

Uploaded PyPymanylinux: glibc 2.17+ ARM64

rusket-0.1.73-cp314-cp314t-musllinux_1_2_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.2+ x86-64

rusket-0.1.73-cp314-cp314t-musllinux_1_2_aarch64.whl (1.4 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.2+ ARM64

rusket-0.1.73-cp314-cp314-win_amd64.whl (1.0 MB view details)

Uploaded CPython 3.14Windows x86-64

rusket-0.1.73-cp314-cp314-musllinux_1_2_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ x86-64

rusket-0.1.73-cp314-cp314-musllinux_1_2_aarch64.whl (1.4 MB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ ARM64

rusket-0.1.73-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ x86-64

rusket-0.1.73-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ ARM64

rusket-0.1.73-cp314-cp314-macosx_11_0_arm64.whl (1.1 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

rusket-0.1.73-cp314-cp314-macosx_10_12_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.14macOS 10.12+ x86-64

rusket-0.1.73-cp313-cp313t-musllinux_1_2_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.13tmusllinux: musl 1.2+ x86-64

rusket-0.1.73-cp313-cp313t-musllinux_1_2_aarch64.whl (1.4 MB view details)

Uploaded CPython 3.13tmusllinux: musl 1.2+ ARM64

rusket-0.1.73-cp313-cp313-win_amd64.whl (1.0 MB view details)

Uploaded CPython 3.13Windows x86-64

rusket-0.1.73-cp313-cp313-musllinux_1_2_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

rusket-0.1.73-cp313-cp313-musllinux_1_2_aarch64.whl (1.4 MB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ ARM64

rusket-0.1.73-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

rusket-0.1.73-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64

rusket-0.1.73-cp313-cp313-macosx_11_0_arm64.whl (1.1 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

rusket-0.1.73-cp313-cp313-macosx_10_12_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.13macOS 10.12+ x86-64

rusket-0.1.73-cp312-cp312-win_amd64.whl (1.0 MB view details)

Uploaded CPython 3.12Windows x86-64

rusket-0.1.73-cp312-cp312-musllinux_1_2_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

rusket-0.1.73-cp312-cp312-musllinux_1_2_aarch64.whl (1.4 MB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ ARM64

rusket-0.1.73-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

rusket-0.1.73-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

rusket-0.1.73-cp312-cp312-macosx_11_0_arm64.whl (1.1 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

rusket-0.1.73-cp312-cp312-macosx_10_12_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.12macOS 10.12+ x86-64

rusket-0.1.73-cp311-cp311-win_amd64.whl (1.0 MB view details)

Uploaded CPython 3.11Windows x86-64

rusket-0.1.73-cp311-cp311-musllinux_1_2_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

rusket-0.1.73-cp311-cp311-musllinux_1_2_aarch64.whl (1.4 MB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ ARM64

rusket-0.1.73-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

rusket-0.1.73-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64

rusket-0.1.73-cp311-cp311-macosx_11_0_arm64.whl (1.1 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

rusket-0.1.73-cp311-cp311-macosx_10_12_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.11macOS 10.12+ x86-64

rusket-0.1.73-cp310-cp310-win_amd64.whl (1.0 MB view details)

Uploaded CPython 3.10Windows x86-64

rusket-0.1.73-cp310-cp310-musllinux_1_2_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ x86-64

rusket-0.1.73-cp310-cp310-musllinux_1_2_aarch64.whl (1.4 MB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ ARM64

rusket-0.1.73-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

rusket-0.1.73-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64

File details

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

File metadata

  • Download URL: rusket-0.1.73.tar.gz
  • Upload date:
  • Size: 207.3 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.73.tar.gz
Algorithm Hash digest
SHA256 4a4961325376082a23a8e5e5dd3848cd06fa5ee795a19cd43c4421da63b29ec4
MD5 f903cc1127476ef1755b5eece9d36fd5
BLAKE2b-256 f24837d5c843b57aa59225bec9d7d21e93f75fd0b4ecf725ced39c45ee45ac49

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.73-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 2da1047d3b6079698f4d9c7933da4794d6dad9d302a6a560d0168457838caf3f
MD5 d6796a4acf64f579cff9468f0fe45819
BLAKE2b-256 305c779564673319ac62f188c175d76660dd78b89449975d394d9c7e5f16afb9

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.73-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 3c805780256788a940b219f02727b012b4ade702d4fd49958ae38630d437d995
MD5 73e31363d9b513419db1ab35fb0c2a15
BLAKE2b-256 f36bbcc66becd18c304a2ddcc80a74d44450590e731ba432030f693ab512858c

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.73-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 eb71bf1b843b2c29bbd49bdb59b9a307e13b6b8b0e0904768deffe74d22b27aa
MD5 7a66d2e957f059ef7cb0615f8837994e
BLAKE2b-256 0fc0aa619d663cfd054a54976d700cc1e860eb9d9101160e8373092f80836ad8

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.73-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 77fc8c4d17a0c86031a16f294d71cee763bb93f8b9bc9c532479da5b7a59849e
MD5 cc2ed25b3088d9f6594bda0bba16e646
BLAKE2b-256 b7e0c76a2a0a2c0bdfc640ed6be4dd270ea42aa4f32e921908ac692d01eaad99

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.73-cp314-cp314t-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 943baa212895779e275ee21f30b40ad18836aadb1206de249498dfd45426cc18
MD5 5461f69dbcab104003affe03c0621013
BLAKE2b-256 1d062b49d39d88609a6fe945c768a6e1952966428a05c827a77601d3f4de94fd

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.73-cp314-cp314t-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 93bf9e47c0e36db7e97205fb3edf1153414787877234191684909d0b9e5a0013
MD5 361ca523f9fadf253a098e6f3df5ca63
BLAKE2b-256 2cf45458cc9a2c93e28eb03b9f863e3f169327e3e9a131ca1695a111992b2484

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: rusket-0.1.73-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 1.0 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.73-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 627043cfa00544971e27dc940ef8937e55e518b6e039c9243fb6b69a21256d6f
MD5 5cf01a7473242660f558e3a93d84c753
BLAKE2b-256 2ea6db9bd0aceb488b563618b1339a0b7b6edfa33a24abd7e902cac1aa88a7a2

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.73-cp314-cp314-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 ceb0255e0ec7bf955928f6773077e95660d5099c316ce10bb37ca80118175412
MD5 78505d36f7044af99b0b86d32a1af0b2
BLAKE2b-256 70e79655957cc4fc6bc2f8ce8ba8daf037374d3119894ced69a2d8ab18a153e5

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.73-cp314-cp314-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 b31f66336893b358b11d6da7d188e37a8b4dbfcf9d255ced2b00103be2768952
MD5 c37ca3a52ad4ecad20faf49b6385615d
BLAKE2b-256 3cbb4c35893f14c4ba493fd95409a2bb0f9b1ea40be5adbcac37aa695c2fe13b

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.73-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 28589f67974d00862aa7b32a97b8286247b3b013d746c9acf6552d42628fc0b4
MD5 d9cfae8ffbca38fd5ea26b72dff4406d
BLAKE2b-256 c78da61f689dd77ea6330e187b855543890d80998d27182b60b3378a68977f18

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.73-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 a0c8a935f2dace4f445e445a2500e8f9684ca3f42e417ba1f1acbb0359e3213c
MD5 06862a34bb432b0e357a593d53769603
BLAKE2b-256 4d751f75c52a11306eb0c8b480306a237af048400c9c25b79c405f0bd934a22a

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.73-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b1b5985a09b8b80621a98d83fbdb7775276745245ec1ff0b95907ac291cdd720
MD5 63f6cc2132e0c9c3756eafc566883fa2
BLAKE2b-256 5c2f91f3a230f429c170dfb714efcd96a2825ba732744654299e7c8ecd507312

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.73-cp314-cp314-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 c8a43f52c54d8db868e9ac6a52cc8faea7ca3f7b1eb7175f27b1efa0d84202d3
MD5 6aa8c4de217617a4886e4f0b9efb2788
BLAKE2b-256 c9b050030807b2ef3524da6d1124c9832344852dfe50f5864be8da23542d8178

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.73-cp313-cp313t-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 029fb36057fead4c536c1bfd71fb05ca7601fb05274fed9463352744b636a835
MD5 833112d907425a10169d061c84bdfc3d
BLAKE2b-256 24885d986f8d41b3f54c622f0e1153e23794c4ac430ec4e05d3162f7df0be842

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.73-cp313-cp313t-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 956b7112c2492a88adecf61f9a098048496f8583b8fafb56037885d91a81e5be
MD5 13163390367632fc363e3b9bd19f03a4
BLAKE2b-256 4321be72cdef3fad63326440a311028c232f71088180395c4e46ad560df10333

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: rusket-0.1.73-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 1.0 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.73-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 06b92e7841c6a611fd708167c9d44f65ecb7b5630a6be1271e1d76e34a16a528
MD5 b2c3cad54563f8e6d48eae9a2e5c4492
BLAKE2b-256 f3c65d78520c1b45b0d6ad66a47cfca85e90e30fda79fb767369cc65d315f3c8

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.73-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 f3933709b8f484459b291f2ed23e00d6c2d1748367a619af7787048f6cf0e066
MD5 6f237574b55cb72bf03f0a8208ec6bca
BLAKE2b-256 c84e1f96e9074dfa9264f56cb265f7c893cc4808fb8c0019a21ab1417196e674

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.73-cp313-cp313-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 8a574e0145f604b04ca317f890923e4e213c151c35e33ddb3467f9274179499b
MD5 08de49097eb3b0107705b0f6624b392c
BLAKE2b-256 ffa42ab00c2ce0b788d7f1b1fb9c0436c5900d868755ba5b608a3e18c0085284

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.73-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a867e10c0866b5811901c663efc3a9f503b664d5118aaf7c48d1f5cd04602f56
MD5 dc02be0b074b8a6b9c2a12d97eead4ca
BLAKE2b-256 924f85ff622d50e8d19dd1d30bf152559af8fa064fc4b1659379eac004128b62

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.73-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 525e297eb4697efeccd037496ad56b333c7ad08ce3caccb3bcbad47002681364
MD5 c495c9ff194f7630f48d49081e2fb673
BLAKE2b-256 223216fcd617f3296e55973ccbdddb8a0c61d990e39d127ddaa27e3644c3a660

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.73-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4a56d4afeb1f4d0058448a8b5741b3d2dce4b46a05f208bec3791710942e2964
MD5 cb06926f171da3fa0dc36a4e35945150
BLAKE2b-256 a0c9142955da188009171da0e012221033bccfc2f678aa31135e292f5d097fe2

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.73-cp313-cp313-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 e675cd98b27379178dfeaa3a14bf8d9408f1e382684798e3447446736e2b0704
MD5 bd7085420918a5ed1b1352b36647b19d
BLAKE2b-256 916b1e84e4f8a7d200e7414fe51a40721b9f85e218b95307137d2dada4136734

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: rusket-0.1.73-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 1.0 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.73-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 fd5c04f2d76da3d616cb07aed374b12372ec083e62d25331364232f6901f9bac
MD5 b5fd92b069c31f9a3ce9a2b44429a224
BLAKE2b-256 0cccd9fbe006b7d8b8ad34cf1eba5d3a2f3b5fa2d500127591c326d24da08f1f

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.73-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 cd15ffa0e635a2747ac72f449efa2daf2973d070bc2b5197c9587ce88277351f
MD5 5072f44747ddd4c9819a7478204700d6
BLAKE2b-256 de1b6a53d03447f4f8c54276415685ce1c8dda62d74ceb5fbb9a08c7cc15888b

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.73-cp312-cp312-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 16d44efabd08cec43753b0476a89320472a54fa4b1afa20e0ac0e6f46e1ea5a6
MD5 001af83f934ef4860cb7842226328f1b
BLAKE2b-256 b2dd34110292d0373245068b2b72480e78ec395fe57b43e2d307c36de56753d5

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.73-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 cd6d5492b3cdbe0af3a7f493f3909ec2613418d9f14af5c144d4299abc2dc3d9
MD5 a52367beffec05599a3723753687ea68
BLAKE2b-256 d4247950ced265506fb03ed1062822b45759c5405885f2940a4455c5ba1808b0

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.73-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 e16fc12e59c8b6392984c9a6b5e4d6f987e23c90e34cf03312e00316fcc05101
MD5 7db70e88fec0420f661d76085a95315d
BLAKE2b-256 3c4ba220e2ab44847f937a730e5925c15396d27ea4b13bfdbbd75a241dc54782

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.73-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9d108f288cb9c567a639ffb3797fb4211b0a5c1914635c5798282af1a8a20db7
MD5 b4d3aa5f4b9f6604af2160a354573d84
BLAKE2b-256 ae56524ecd930a9ada6f6cb30558ad3e4b45f237854a9fff97a59d01ab11e754

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.73-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 a9b0dc8dcc30326784d5d4d81f8198797bb70a9ad25f7f6c3284eb48aad4a59b
MD5 2456cbb13be60aebb689b3b7bc4fbde9
BLAKE2b-256 a8abb26f9ca06f9658a50d078dd85d15eff4520b132dd79fc572eaf5fd1ea298

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: rusket-0.1.73-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 1.0 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.73-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 7b23e0fd1e2a9eafea28a69fa6ac3ea01bcd77a3c0003445c6ae3190a8cb7c00
MD5 7b0804590bd06fddc1b052fb3feecff7
BLAKE2b-256 f6837a549acc1381610af93bc4468d266e7d0f893d8125f3ceb5624824421a59

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.73-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 bc0a6395e9625f154dac7a26b28c90f22ff5809d3df3d548ca5e5d9cd6a26a10
MD5 7701b207aba2e03398c2f7d6633c072f
BLAKE2b-256 d5ac3819cf1330b40639c1e26fc12bd2d57514207309cd5188e70647121f98e0

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.73-cp311-cp311-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 8bc8476187690dd6c1a123c0d1d29f44a7cd5251d22fc464f77c5321d2e9cb4e
MD5 7dd9b8d906cdaace485a65eabb2394d8
BLAKE2b-256 7fe47ef00e448732a7ab78d77e05e30ed51bf60f511958c8ed22734e47d1b405

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.73-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 53f38581779b41caa029019d4338f6d30180ed266b850996e6463380b06dbd4b
MD5 26876f5f2166b33ee11bb947cb69334b
BLAKE2b-256 c2f1ed82e7c4745c3c4ef5ca10d016e07a2d2be694b3a7066bccbc88e732e5d0

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.73-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 ba8366d48a48afeffd22fffaecfaa87cfc21e5a46d67459d8bfc8a17824c38b1
MD5 e3ce87dfdcccc45bc5cf87b1fe5f084d
BLAKE2b-256 ba681488e32164eef0eb96b47b7debe2bc64b922b19c7f2cc83341c216352978

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.73-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3e5264146efd4f5636b3d90d0d24c87c01578246459affb25bda59389e264b05
MD5 546b4bdaf4d9e3fb0a1e389aa2e4e5ef
BLAKE2b-256 10d6607272ec0346ab59ed52bc1dc7e825f145cccd9992e0111b042fd72d7017

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.73-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 70e80d5ca752ccc09923fe7c4a805426b31b2ffc830d979ae2159005fb119492
MD5 c4b198d5896a58a8c8b4d48c618a984f
BLAKE2b-256 dc9178b0da29ceee79eda68711169d17114b34f8e8b4995d93bdfab6ab17ea40

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: rusket-0.1.73-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 1.0 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.73-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 fb14dda7ad383be2eff82e063c1a4702aadd0265d965240d7da9bca64c499df5
MD5 5b3f2dec2332f36793bebd8f194a165f
BLAKE2b-256 27cc0c838d863852d110117882c3b672ac4df1d6f66f6c4650e333c6198f4827

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.73-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 a85596add72ba86fbc01483122cf29f9d08882313e624921e23ff17fd9338d59
MD5 fee4a32e3190b2f80d4f4b3fb1cdadc3
BLAKE2b-256 8f293d90a900988dc4aa92eb86a60fcb902bd64a3cd43b5f43d073bb3521984b

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.73-cp310-cp310-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 a4742eca1815be4ccc082efb754410f7e4c5ac9d8199a29cd5a4dd4954946dec
MD5 f9ec105220276afb8e732138397da1f2
BLAKE2b-256 b928cc8e760ea0fb3c273d47f0b397f9213d09065b2f90d373ef7a4fd720c343

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.73-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0a0c45e4a96f5481f00ecbc1a4028370468f9a8848650ba11023d25790426c88
MD5 6b752b3a2dfe2cf5f2e974a00745270b
BLAKE2b-256 1873332f09037d4ff3d62ee78793d7d1eacb1dce154c1343a40dab8ac3519404

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.73-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 ddae2f722b5507b2988a1ec1fdd53ebd42ad59f447d7c5ad64726e16cad47959
MD5 2893f9ba585d37a74b26f36661aafd41
BLAKE2b-256 3207500de8760fd653d090fbde6fece684855035caa83cf6955826d7383ae364

See more details on using hashes here.

Provenance

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