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), and Pattern Mining (FP-Growth, Eclat, FIN, LCM, HUPM, PrefixSpan) with high performance and low memory footprints. Both functional and OOP APIs are available for seamless integration.


โœจ Highlights

rusket LibRecommender implicit pyspark.ml
Core language Rust (PyO3) TF + PyTorch + Cython Cython / C++ Scala / Java (JVM)
Runtime deps 0 TF + PyTorch + gensim (~2 GB) OpenBLAS / MKL JVM + Spark
Install size ~3 MB ~2 GB ~50 MB ~300 MB
Algorithms ALS, BPR, SVD, LightGCN, ItemKNN, EASE, 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).

โšก 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.66.tar.gz (194.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.66-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl (1.4 MB view details)

Uploaded PyPymusllinux: musl 1.2+ x86-64

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

Uploaded PyPymusllinux: musl 1.2+ ARM64

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

Uploaded PyPymanylinux: glibc 2.17+ ARM64

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

Uploaded CPython 3.14tmusllinux: musl 1.2+ ARM64

rusket-0.1.66-cp314-cp314-win_amd64.whl (998.2 kB view details)

Uploaded CPython 3.14Windows x86-64

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

Uploaded CPython 3.14musllinux: musl 1.2+ ARM64

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

Uploaded CPython 3.14macOS 11.0+ ARM64

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

Uploaded CPython 3.14macOS 10.12+ x86-64

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

Uploaded CPython 3.13tmusllinux: musl 1.2+ ARM64

rusket-0.1.66-cp313-cp313-win_amd64.whl (999.1 kB view details)

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.13musllinux: musl 1.2+ ARM64

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

Uploaded CPython 3.13macOS 11.0+ ARM64

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

Uploaded CPython 3.13macOS 10.12+ x86-64

rusket-0.1.66-cp312-cp312-win_amd64.whl (999.5 kB view details)

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.12musllinux: musl 1.2+ ARM64

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

Uploaded CPython 3.12macOS 11.0+ ARM64

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

Uploaded CPython 3.12macOS 10.12+ x86-64

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

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.11musllinux: musl 1.2+ ARM64

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

Uploaded CPython 3.11macOS 11.0+ ARM64

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

Uploaded CPython 3.11macOS 10.12+ x86-64

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

Uploaded CPython 3.10Windows x86-64

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

Uploaded CPython 3.10musllinux: musl 1.2+ ARM64

rusket-0.1.66-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.66-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.66.tar.gz.

File metadata

  • Download URL: rusket-0.1.66.tar.gz
  • Upload date:
  • Size: 194.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.66.tar.gz
Algorithm Hash digest
SHA256 956d444e00e7bdbdb2fbde47c434c96f09f579722638f307ed74770d2159585c
MD5 4fba355ed37c775cd41ccfebec500f5c
BLAKE2b-256 55dc1abfe68a18b6f090c803fc97a6420f67c0f63814f2d304d07a131ab4fb87

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.66-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 5e69964e048f9218b6fd33753888ffcc68ca596bbfef56885f7d9c6cf61f07a3
MD5 0f3d9fbac25b91cf8e997a1a828b2bdf
BLAKE2b-256 e1ae01c66152f4ffea6751a14323ec966722a2baabcaac3607f21cc530f55925

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.66-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 d01a4d0d88b9524809ecee03b3d2e364fa3b84d524396b87771be9f8f45f365d
MD5 42fdff098af6bb8033595a6ea2dae39b
BLAKE2b-256 b9cd4fc2a12e0bcca5bf4474439343acac874f0de1a16383eedad7de244afbde

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.66-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 244edcb9d94f4a5ca364b0af4406ef78671c3d169a24dc7d60c3fcb1209abdc5
MD5 bcdc762404374f65680c4985a1f6392c
BLAKE2b-256 b82809e92b865f3eb784b414753b1f2d46dc0c80bbb09dcd163ce083ae8af812

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.66-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 f8f1d6d70661fa230af8d68c3792128a67bddb9365a91aba108c3f753c98b96b
MD5 fa5c8367e04e3ed62c3b56e49e5bdf0d
BLAKE2b-256 157941fcbebee428923ddb0daf12f9f512f6d1f8263e648b78862b401cd4a4e4

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.66-cp314-cp314t-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 11778147596bf065db5d4a00996a7f56bcb12ad091a844842b5c6db725f68dc7
MD5 100b9743d701f64cc3734c63dad1651a
BLAKE2b-256 6af8b83a8d0d30414cd6a6a7340cac08ec17bc183097ca12f93ec1e37de14a9f

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.66-cp314-cp314t-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 06c9c5667e7401473ee3cf5b42d487cb78d722177793f124c9ac863993c30f67
MD5 d487e8e13f8b9e7e97f173b810d63a0d
BLAKE2b-256 3ad55825424f92dccbab32c31124cfde290cf8bed1dcde1d13ea59b1469d3f39

See more details on using hashes here.

Provenance

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

File metadata

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

File hashes

Hashes for rusket-0.1.66-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 3a835c1592190ac0a18a139f17b8a167883f1be9e43c8685ad961ba9eab462be
MD5 aec120f2b33f591175056de67f567ebe
BLAKE2b-256 877b0846e24e44a65f446278f24d4f4fb5e4dd823f6a05d07255a911afbc2757

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.66-cp314-cp314-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 30dfbf0c914aa68c0cd4e797ef514ed1fcbe8bac99a1b25388d89df15f7bcb07
MD5 3b1ee8a3a7b77b01ac43cf7c1ff8bf41
BLAKE2b-256 f1c492199e6dfff786f6f5d90f89a21d477d3d7bec70100c7d551d40faab05f7

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.66-cp314-cp314-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 4846d3e19831201a43d144dd673c00e8b1c22f6a315bb18169d33dc5621ef1e2
MD5 842128e886e369d212a2801842e3b51a
BLAKE2b-256 808cb1ae11f62c35b1c749f17ec7d404a779680bfc6be6c724e4036994ff9e0b

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.66-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2ab058703584f29caa0437026f7af70d7deb8f371199a24ce1602d3442d69215
MD5 6c8b272e5f8ad85dce28ca01e9dff715
BLAKE2b-256 5b14a368518394bcd7025a7ca33ff25c0fd58040d45adedabc400f4b5ba1c618

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.66-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 c421225bf8306038eb320320de45f9716cf7a41937e3cc3c2f22839f5b81655f
MD5 2612d3b1467db22b44d0bf635b140362
BLAKE2b-256 8b59aadbcc4eac641d7fe311489c7394f98e6b028ab0718857c88a696944bf82

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.66-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c12d1cf8b3b7194b8ed931b40a2826cfa69ff5314043fb86d0abbfd81d5e1179
MD5 6a54161fea931107fa19278bfb45691f
BLAKE2b-256 bc826018bc9ba0d0f98f0d4c96919bdb299da469c266c4f42afdabfc6ee50163

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.66-cp314-cp314-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 df13fc49aa847a4fe5ec7df914049e7f3f5566fc08aedd349b52111b873e1696
MD5 91e1244f76f7123f2837d4c1e2dd88db
BLAKE2b-256 cefc5060589604d731f592325127d50907cc832a0684129294863e1ff296faab

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.66-cp313-cp313t-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 c2b65ceaaf3463da82f7cabffacd938ca76fb13c61b59fe898076f7c9f222424
MD5 6aaa34546058d1475fdf1e1d25cddca7
BLAKE2b-256 fc36dd5969a717d7f7be6fff451b54adc4d8409f26dff3601ab81c7452bce6fa

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.66-cp313-cp313t-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 627a8080d324d62433a1a813d408b16b26a1eb5c5e80f3f03faa668d5bc29fb7
MD5 e6095a01bc7daf8cc665cbccdfbb9f20
BLAKE2b-256 6a113be2d98dd70858b497deab8ba010dc40bb5096cbcb026235e1c6bae8d335

See more details on using hashes here.

Provenance

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

File metadata

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

File hashes

Hashes for rusket-0.1.66-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 52ad6ce68d50cc339101296abb6a653b6d6fc08eb54f9065326a15e27f261616
MD5 50576e7d3f5f9c3ee22ac9b6b8982cef
BLAKE2b-256 15636e1c8864b04f880ae88f3d8f1f5251102682e2f1157dc9e1cad50febc024

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.66-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 50736f3351ad03458ae0caff200dfcd0db610c426b2b7dfdc37e457b376a78ee
MD5 cf71f746611477378e8413459d42d511
BLAKE2b-256 5e57506173b68960b5966a2bcef75fc81008f648f7293111d516aea07f0aa9ef

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.66-cp313-cp313-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 932eaa6f06c13e358e8b1cd66333a85ae47051bf6b3d72654a12a1f67f3e8f4b
MD5 5a050dcd827e3f2a75d9800ca558238a
BLAKE2b-256 ea7b425f0b97f731fb518e4bda511aa528f794357e69680a587b4ef81e1d36c2

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.66-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 75e6dfe0cb7d0a49b4bdc274d3fe508b6d9f7c18f06891400baff73911405452
MD5 63ced8e1109694cec0a60e55bfcdeb0a
BLAKE2b-256 39971b0c22bb8b21e8a3bb6b988e6f5eb62cfe81f185f3d92b47b485a8b70625

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.66-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 013b7d1ed31f9c0114227381993c41512bd6af356a99ac4f3c9e3da572e863f3
MD5 fc3ba24e5a543954c4510caff26ba7a0
BLAKE2b-256 9bf46d0b639ba02f9b8dcbe50b404607df37e73b99b35c1a08a96aa4b89fec05

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.66-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f7946a791edc16e0a9c321c49b4598ae39ea7737c61d2379b7339a39f2a3dc41
MD5 cb2cab0b84556fe0a70004c0bbd4f518
BLAKE2b-256 d6ee3b91046990c2197e4fd2fb2cda9201cd7a59ae8fc5f5afa1bffda71d6906

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.66-cp313-cp313-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 a1013f0f133b10d7e0d76e7bd13bd5928d46d24ec53499d2551d7b885a6b7663
MD5 b01fa46cdd558f2e23e96fb523254bc5
BLAKE2b-256 153d25742c70d55441e7b95ced38972281933acdb18be812c32526b8d737af61

See more details on using hashes here.

Provenance

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

File metadata

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

File hashes

Hashes for rusket-0.1.66-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 6a834c2f740296b7c23304cceb09bdcba80add598bc00afd6544dab6be58647e
MD5 55dda82aa4a33d3833d106c238bb665a
BLAKE2b-256 4c6c438a807d66c7421494d83d3d6d2c90dfe331033b12a9707a2e9c1996a82d

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.66-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 6b53dc0ab76ca0d018a5b046debf4b2bbfa539b05943f214d758217097faa2b4
MD5 461a823c29ae2f7978864d8204a1531c
BLAKE2b-256 904048bc511cc21a696f095614771f934bbc4f149510f6d92e6fc11f9ecf7045

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.66-cp312-cp312-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 f2c8efcdd2ee79e3a4dfb6cc5fde333aaa8a14a84150da7ea379f2d07501f8de
MD5 aeefd1b10e8e367daa0aac8d9fb633f0
BLAKE2b-256 0efe4b9433e40cac11bf545dc7d6f557492ea223d5320f52e84d029984ef2cee

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.66-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a5f31c2460f504873b457bd591bea4a2c6c9cf66a558acda462e32aab3be3f59
MD5 399b29bdaa4e50df0e226cf32a741279
BLAKE2b-256 e5668543ec7c707b1daebe5ff0d0fda7298c92098a491d7d68ba46610249fd30

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.66-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 1c3b69355d9a7acf8620c39f5f91b96e41099ef0b57822fe452faaf27d413b2f
MD5 d0bc27544e3eb50757841c85aa8c8948
BLAKE2b-256 9a23a02cc6f96cadd8d47735a37deeb062b67359b953c4191ed2fc9ab5ffd5d8

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.66-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1e436da12357b91edc0a644e13504ec90244b6ee6e6768d208aaa885eef5124c
MD5 007e3e1b55e3e872ed3d314c0fb3496a
BLAKE2b-256 ba16ddc857d45960c2b3bdbcf9a4ae7bb46b2f5ba39a7f3c6fd828083e32c2d1

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.66-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 0cbd87fbda12880d1e8b0fbc4f49714bfafc353548b255a2d575ac40c9411f2f
MD5 300790b38c36eaa492f87a0d1a3a6f34
BLAKE2b-256 885b2ac24513622268c237861fb9cbf723ebba174fc3f75b184f5a1e8745eff1

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: rusket-0.1.66-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.66-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 10cbb5b800d3a269930acbb64b87aecfaf05416abf0e1720e74dfc08c9f56044
MD5 5456229552098382682a051a8145630c
BLAKE2b-256 96e7191b6c830422a274869df4dbf5d5c10c02697f64542eecbb2d28df690cbb

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.66-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 a363f86d2439a7bd567c223c1f013678f585895f3eb3a96a1fe150be01767585
MD5 0e50a7e3d94a4b7b448f1d5ba5839220
BLAKE2b-256 ad5c5f37e652cf2e4a4debc101f51c35802dde97cfa63e88cca848f798ee2a25

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.66-cp311-cp311-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 89cd01ada71a7227934ecfdb2dbc35f12e222cec078abfd077478aedbe909eb3
MD5 946432ed5c2076d72bd39d59a27b1d37
BLAKE2b-256 cba37485e5174b1b97a7b2ca070e224c6d46f75f1daf688b30e4c12641ab3ab7

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.66-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3a7daec6fbdba2451d1452b38d8fb0a22a0a5a1979977b3c01c59bc86a2cc500
MD5 34ce5f1802d48526ae16619d6c687dd5
BLAKE2b-256 1fea9feae07d8f0cb100361a7eea37828aa71a1e96e64a01a19ed83b19a61148

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.66-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 1ae67caf25d1782788119e3adfb518da0f9b1a8553873555e3da688caa22c1f1
MD5 76049d710c580056fd220584242426b1
BLAKE2b-256 6d5f23632c4ca474d3ca8e8cc7547594cd24e70eaeaeaa712b8a2cf18447b2a4

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.66-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c623f33a2ccb4362d5862465c7a58f2a3a5ea13c49cf4b686ea8651fb316d1e0
MD5 4d62b9d117e4cbb2451c5417694ee09d
BLAKE2b-256 1f1be31edba9757915ed4c9f422cd78b590d32ab90128564a8a4bd683d4f6dda

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.66-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 de7e3a2b34a1a72c2cb848e5fc96d810d974a713c3338b567a5c0d800970d9b5
MD5 5c7eba3ab33e476f95827b9c4dadac2a
BLAKE2b-256 ef5bbbe7ca7a9b3579c20e105089e41facbf252a8913d2afd0da1526e971a28a

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: rusket-0.1.66-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.66-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 fd8a2c4fcaba05f9c5c927ab12200e91d40dda39772e4beb201c90ed9f549206
MD5 281ecde40f64940382972521c5b13ff2
BLAKE2b-256 4b8158e5384ba3007d3248b9544d0d208f94d10961df39affccd94d0a7380160

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.66-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 6da15348597c67163505f2145e70f3a901b30eb5a6daabe3a271ef344ba09f1b
MD5 25d2fd8f3a394e40b6c916727b9cd0d9
BLAKE2b-256 e84d68aef40b204a7feb46b72a99be07d229d32672fdff9b7029781923e7e9f0

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.66-cp310-cp310-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 3fb8942187c810781e8f8871f2eadab51403db55a395eed2153b5d95e4aea8a1
MD5 aa3134a0c6b9d2f6bc5605e0100bbf25
BLAKE2b-256 45bfe5baebd8e3640ac35fd1b6a9c4c430f12e2717c75a530c06a8f5fcd2abfa

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.66-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 da97b9273d5b994378d4668f69a26072cb7bd028ea508b82d060839e80ba6b09
MD5 3174196a9ab2434534c00d1ec4924b70
BLAKE2b-256 318d57980cfe76a19dbc13dcbbc59a52c57abd48db30822caa6a6dc4943f305c

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.66-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 9333d9a93514e8fdc666c92ef3c6db5d1478adea41e4cc47d879e207afcdea09
MD5 96fe16b407f0cf22764096505f03271c
BLAKE2b-256 b9a3f47e5b5548520945b8279efdd51c364b0ebe247206fdd40991c6eeffd061

See more details on using hashes here.

Provenance

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