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

๐Ÿ”ฌ 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.74.tar.gz (207.7 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.74-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl (1.4 MB view details)

Uploaded PyPymusllinux: musl 1.2+ x86-64

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

Uploaded PyPymusllinux: musl 1.2+ ARM64

rusket-0.1.74-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.74-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.2 MB view details)

Uploaded PyPymanylinux: glibc 2.17+ ARM64

rusket-0.1.74-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.74-cp314-cp314t-musllinux_1_2_aarch64.whl (1.4 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.2+ ARM64

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

Uploaded CPython 3.14Windows x86-64

rusket-0.1.74-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.74-cp314-cp314-musllinux_1_2_aarch64.whl (1.4 MB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ ARM64

rusket-0.1.74-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.74-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.74-cp314-cp314-macosx_11_0_arm64.whl (1.1 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

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

Uploaded CPython 3.14macOS 10.12+ x86-64

rusket-0.1.74-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.74-cp313-cp313t-musllinux_1_2_aarch64.whl (1.4 MB view details)

Uploaded CPython 3.13tmusllinux: musl 1.2+ ARM64

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

Uploaded CPython 3.13Windows x86-64

rusket-0.1.74-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.74-cp313-cp313-musllinux_1_2_aarch64.whl (1.4 MB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ ARM64

rusket-0.1.74-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.74-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.74-cp313-cp313-macosx_11_0_arm64.whl (1.1 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

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

Uploaded CPython 3.13macOS 10.12+ x86-64

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

Uploaded CPython 3.12Windows x86-64

rusket-0.1.74-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.74-cp312-cp312-musllinux_1_2_aarch64.whl (1.4 MB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ ARM64

rusket-0.1.74-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.74-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.74-cp312-cp312-macosx_11_0_arm64.whl (1.1 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

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

Uploaded CPython 3.12macOS 10.12+ x86-64

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

Uploaded CPython 3.11Windows x86-64

rusket-0.1.74-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.74-cp311-cp311-musllinux_1_2_aarch64.whl (1.4 MB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ ARM64

rusket-0.1.74-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.74-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.74-cp311-cp311-macosx_11_0_arm64.whl (1.1 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

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

Uploaded CPython 3.11macOS 10.12+ x86-64

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

Uploaded CPython 3.10Windows x86-64

rusket-0.1.74-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.74-cp310-cp310-musllinux_1_2_aarch64.whl (1.4 MB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ ARM64

rusket-0.1.74-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.74-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.74.tar.gz.

File metadata

  • Download URL: rusket-0.1.74.tar.gz
  • Upload date:
  • Size: 207.7 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.74.tar.gz
Algorithm Hash digest
SHA256 eb0e3f48cd110638bb7c724499e3e1facb41513ab24408306243018f24bbd63a
MD5 14e0931f7e30ba6eb4fd964a135395f7
BLAKE2b-256 047914d41abeffcd4b9ab5525417686272f41074f2a02507d6c6f2bbe96556d4

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.74-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 ab94d49ad727526ee37825c9bea917a44fe900f0ea2eaf823096333bfd5fbfd6
MD5 e3231f835c2758c5c9feaf6b7ac70629
BLAKE2b-256 dcc36092161b45d6b0c55603220335acac5732ff3775c34833e2bb05efb31270

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.74-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 3d5f92db07af95785ce9399d1c79f86cd83723e8aff0205dc822ef53fe70aa58
MD5 3e54751593d08123fa63fa6e80f4555a
BLAKE2b-256 63813dbd5a9c530209911e572fe4ca2ae5fd07c18e9891e89b950b09da889f61

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.74-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 84e54b623c042e5fc39bf02ee32be74323bbe48f3545880582d28d1f2fa65fbe
MD5 2205bd72c02cb430ef80d2ead28222a5
BLAKE2b-256 f74687af053aca61ec218f25e2f640fbf772538fad412897f56098ae1b947916

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.74-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 076e88190e474d52a0446a77aa47e84b9809b382bca91163951bfd81a266bcb4
MD5 4d6fe77a86190d06d9ca3b0d5f79329b
BLAKE2b-256 b6480572280bc4285ff5e8f17dc633f8230a8a31dab04fe6fe55c0265bf6d6f6

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.74-cp314-cp314t-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 5f6408e8639abe54206b2798f2fd877d8ca4f502943f317a1011bbe04dea1f11
MD5 36ab0ce1c91529b8ceeb265203319068
BLAKE2b-256 0f06561326816153da57060b7b1bc7ecbeffeb34698196850ce1c8db03ad6398

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.74-cp314-cp314t-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 5cdc67055646709ed28c0d80895de5832c2698b5b65465f2669351fccc38a9ea
MD5 31697cef180cfd17085ab106cedfde6e
BLAKE2b-256 c8fedcf2e9dcf781e5a1ece8dbe03add2c50a942e9fb3104bf73503d1b5c18d5

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: rusket-0.1.74-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.74-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 22c4b56f50e0c0157c55ee85b181bb0a904b3641448632192434936495710dac
MD5 7993e106d1bb46d1c7aad980b97686dd
BLAKE2b-256 11479df35cfcfcf4cfdccb88b5e43b1231cd56cae29f3617ebf7e7ba23569b7d

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.74-cp314-cp314-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 0db79682eb092d98b24fa1292d004d297060a2d7be9ed66cdc106ccf4d32571e
MD5 398af2179cfb37125d2d7fc93af5b42d
BLAKE2b-256 903872a9375848d08111a96b86e02d329be883fe24cb53f5a00b62bc0aeb2a15

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.74-cp314-cp314-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 013ed8e5205e929e8aa756b18a39b75b12a79f35caa23f741563bf83fd31d8b4
MD5 9a7204436fc253c7260e02ecf684c89b
BLAKE2b-256 56302aeb90553cfca6f2aed95ddf5a147932b0e4b84634bcb4601d27d09dbee6

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.74-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 894cb3931219d420d686246b163213c90f05469a8e882fadfe4d102938af417c
MD5 fe157986ad5dc900f5ba5b3386ed1fdc
BLAKE2b-256 346a08714cab340aa4e760605c36ac7422f8dc528d34ea3ce85252117c1cb7d1

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.74-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 8b3e6e228777fbd46433902b66cc753a18119a54901b36b975ab0889bbcb6d91
MD5 50fd1d0be9f6c1da93dec3f8a52aeae9
BLAKE2b-256 437934ef5e502a26074d81185afc24cd19ecba1f6272878090184048c6f7a13f

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.74-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d11970f3b13a34b99c12834520b28dd4724b2e2a310dbb18cf80d9055cdde179
MD5 8b17e0345f2cfe63b55eecbab55ccaa6
BLAKE2b-256 e7e2b025cd86f2e76a345d64581e4e5da885d1c80b73617637e6eab36a631774

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.74-cp314-cp314-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 73c1251239badbbb1bbadeb11903c94b784468a6d82648f2ce86115ecf6a5536
MD5 243ca222c56845786d2bb5c784d13586
BLAKE2b-256 2c168b5792070c51860e9553c8438e09285e366ab0c3bbbfbab693cc8e2e2744

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.74-cp313-cp313t-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 199a2c50ca5e8f0a872f4f4c108871e1428d61edb4b660d069adede5f5641d57
MD5 e75c79067fe78ecc60e5eae21274c758
BLAKE2b-256 f28e4dec416109c8a1a26b5d2cf799acf6828cd29ec0e42f0e2408ad6c3cee1f

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.74-cp313-cp313t-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 d44837629ed61d9acca895538685be4c0e9dd5c2d0e6a39aea3c1826a0cb11fd
MD5 0a0e48879637799e2001004d9f53b2b9
BLAKE2b-256 414c7c9ac70e5d5c2a96d8cb41fa651c8e2dd97b8d17f7df296f20a876fe110b

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: rusket-0.1.74-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.74-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 893a09f8cab85eaf7c92c93f449d14feaf32d47cbf432adcf3481b8ed12b98c7
MD5 11cb7674702d13677e96171126e87d77
BLAKE2b-256 0ff9b1c2399a123111530407e1a9a1ddc223a4964af84c525b3683ac1ef44f36

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.74-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 2328eb9df2cebce0850025c37f5f64c09e3cbed501d58c8755e416b5c8a316d4
MD5 2e745bf77117c895df195ced880e7378
BLAKE2b-256 3582fe64fadff73506ec5bfcd2b0fcee0335acad267528199d179ce7d9fc3feb

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.74-cp313-cp313-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 74d00fcabb2e86378833e00234bfcdca27d14122c75a25521fdfdf2c77146333
MD5 d4a2d07219d14bcf61bd70fbbfecab71
BLAKE2b-256 2750a63835f70db362deff700e2e1294a2824a90ea5d864ac34b024d5336723d

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.74-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e70629061f0e15f8654f81db9ced3baecf29d4c2dc03195c79e7c17e3c59b9b0
MD5 75ad48dbe8d7dc8482996ebf41cbe99b
BLAKE2b-256 e5bb8344dc60a670e710afad0e5f080d268fe608cc8978ba6cfb3fd93dde5463

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.74-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 1d0b79cc609a04fb6e33f859f5626ac4132c096419fa4ea95df2e1e3faa63313
MD5 15ecfeaeb4207c3d56996fea0f31c0ba
BLAKE2b-256 fe472b24f657fdff751488cdfc294283a872f5e6ecf2af0dc436cc10884015d0

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.74-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 fb33d28b510a14748b892af96cb9745639edf30741e6205fc1ffe5f6b76ffdb9
MD5 aab2aa2e768376251a649486ebbdc448
BLAKE2b-256 cbbf6ba3eec944946f32457ad52adc18beb66a3604ea652b36cb32c9a6d4efe7

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.74-cp313-cp313-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 181b308619cff8272925a7ac12a534cdb17a9c3dcf4b7d6e3827e6078eb21005
MD5 669c0cfcc8970b15fcbc16bf63c5b746
BLAKE2b-256 f603da5641654f749e681c080220a45c94a0cf708abd11b3650c755fcadfcda0

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: rusket-0.1.74-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.74-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 73ceba44179ece43fe8beddd1d2dfb7bf48ebea42a9a16657dbda181c50fcd93
MD5 dc7d4cabdaaa4809695ff00532cd31d3
BLAKE2b-256 33c59a77a2c52cdb432de3e35e50bb87437fdf75ee8224649e3cef358876a3ad

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.74-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 c71a0f3ca44f2c9f5ae833a35f0ce6ab68185ad4b21305b983aca57f3f42aa81
MD5 5b28b88bcdb586b9186d3be8e2e87b92
BLAKE2b-256 c35364fb84d7ca11978c08eac44facf54cf54573e737e5a15ef97908292363a9

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.74-cp312-cp312-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 e31c305624bbb7219560a195ad0e1a333f6c250d2193a7265f1cd423f7315396
MD5 788a3d3b440bd3b75cd9908a4ce7aa63
BLAKE2b-256 34b01ef71ec9e156fe3377bcc7c9097c0699776c133ea7eb87d19f70a9520ffb

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.74-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 db6f98664daf872b099dc64cc5498ed4fb159f75cd1d05578415a41ad7ce25af
MD5 2e75ea0af2e3fd1bd74d15aa07ca17c6
BLAKE2b-256 90c8a6c59bdfe93d027bca386229a9da171d91c037f2a20cb7d63528b23aa63b

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.74-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 df4e1f51301e2d50ebb75943a92096acbec4b6831afc940b184fae7f511e3879
MD5 7097a35f0cf6224da9a1b37ba72d03e4
BLAKE2b-256 b90a587cddf0531728a8910fe181af03ee48eff20c64b107bf661c8a54be3396

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.74-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 bf6b3a4b024374bd877dfc099c774ca1937411c616b71873c878aa5f9edcb252
MD5 93345a7ae33fc96d77b0ae8772762078
BLAKE2b-256 3f82d8b202473a572ebca69752abdf47f6f747beca2ecd224e3ac445b546217b

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.74-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 04eb8933b69a3207c481ff73a515744c89160083bd6d4e8efd3aec09c523aee4
MD5 dcb37373343fd904958f6b3357efc1d0
BLAKE2b-256 ee7460f1bc464d6ee4847c3ea1a17dbd23f1541f1507bafa7d8a6e42731ec2a3

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: rusket-0.1.74-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.74-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 396940f4babab4d8ca9fd4dceef324f502cf14206330de6fbccfd8b0f83a301d
MD5 582fb58a3c415e4725166fb175487866
BLAKE2b-256 6a2c890dd855ddbdc1bbb3aff7fb38a5dcac778c828d5f007b3c35770c762012

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.74-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 ec46393c881aefe4c21cb5a77b2a03ce7fee703cbc27b2054511ef9b822e015e
MD5 0c8d43e8fbfb6a61137f3f9fc0e28458
BLAKE2b-256 f0e129deeff9347bd54f924846e04991454a3f0492f85d12db176a7755069281

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.74-cp311-cp311-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 c63ede984d596ee5d0acec2af05475b2df6a331ce7d66d9982008135c93f3207
MD5 e5b1f3e61bc0bd7615ef8323f2f85c10
BLAKE2b-256 b9c52bf141f914403fdb0d9073e444cf1bdd17e9510cde09369ed3005c6e570a

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.74-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 de2ca5f4b3d38fe5e72e374047aa4a86debc3446d0deb92f707adabf0df4bf9f
MD5 4c4314efe76c28ba4f362304ef053c3c
BLAKE2b-256 cba64a3110a2f7fb946f212b63a6a971269f30a77a046af41dbed467f7a25701

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.74-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 cd18bcb25d69ddb74028dbc0819c91453adda99910cf1813b89f13bab11ff139
MD5 776fa62826cb45ff2ac70a5fcdcc081d
BLAKE2b-256 5dfffb132aae4116a118a6df614076a8c2153a3d6df26004f41098319a19abce

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.74-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 cdb6085d433c9cbcf6d2b9ba658b1ab508ff3822252df802e5b6f24b081df0d8
MD5 5ccd262a7c7ce31289224f77c4c8ab75
BLAKE2b-256 7a63cf64863828e4f631849431ccdf9ae7a22e38102760c81b73099af9af4646

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.74-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 68a20526270fa045ed94bdd3b76a97170512538e8492cc6f67aef44b553b90cd
MD5 33b551f9e9b94ecc9aa56c60a8bf2853
BLAKE2b-256 9e4bad4a36502c95aeb98e86f2954029b718ca53d00438eda4a025436db7b3ba

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: rusket-0.1.74-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.74-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 3c223a5b58556002f68df53f951d6604cdbe018992b3217ddeec1b1b471492d9
MD5 c0fd8a8708ac7105e6cb32fa57a65bc5
BLAKE2b-256 00dbcd58178369ffb34fca9044822b7ac7bc497e28bd80c5a51c88114034b458

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.74-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 a3aef220be5f638aa1083e1ddb141a1b98e82a2e90733be9873a39d0fd4c7a0c
MD5 2db2d2c98feb5f023e09cec7e24ca178
BLAKE2b-256 bdfc1c11c0d6f8c8f3c6fe3f4dd0a96958109058153127eff217c829a3d421cb

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.74-cp310-cp310-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 9b459201f74ea68990153a268aca1f8d278f7726fb3447c74afbd62ea07f6a29
MD5 19a5dad65e9401f2f70920bcf9663fd9
BLAKE2b-256 a8401b61f4f05c9252689108ea6910eb3a5041533c30384292a762d062bd4834

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.74-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 092da8da60e22e0f278b53aeebb555a93624bd8dae4ff27883751fe0c67f1612
MD5 16ed287235f2a8ff6ff49eeecb5b3825
BLAKE2b-256 ded820c36794dd2fa0440381c799a0b5403156b568044ab4f8c0c6ea067d9525

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.74-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 949004b759fde3da2984ea39801bf528f0ba768f66619b852146b99ddad650e9
MD5 6cb8a5cfc040171b0a549c32bd0ad646
BLAKE2b-256 79055a77c76134fc0cd2492ebb4f856a846f4a2e13156ff9fc770e06df1edd73

See more details on using hashes here.

Provenance

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