Skip to main content

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

Project description

rusket logo

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

PyPI Python Rust License Docs


๐ŸŽฏ Goals

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

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

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

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

It features Collaborative Filtering (ALS, BPR, SVD, LightGCN, ItemKNN, UserKNN, EASE), Sequential Recommendation (FPMC, SASRec), Context-aware Prediction (FM), Pattern Mining (FP-Growth, Eclat, FIN, LCM, HUPM, PrefixSpan), and built-in Hyperparameter Tuning (Optuna + MLflow tracking) with high performance and low memory footprints. Both functional and OOP APIs are available for seamless integration.


โœจ Highlights

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

๐Ÿ“ฆ Installation

pip install rusket
# or with uv:
uv add rusket

Optional extras:

# Polars support
pip install "rusket[polars]"

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

๐Ÿš€ Quick Start

"Frequently Bought Together" โ€” Grocery Checkout Data

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

import pandas as pd
from rusket import FPGrowth

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

# Step 1 โ€” which SKU combinations appear in โ‰ฅ40% of receipts?

model = FPGrowth(receipts, min_support=0.4)
freq = model.mine(use_colnames=True)

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

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

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

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

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

import pandas as pd
from rusket import FPGrowth

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

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

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

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

Or use the explicit type variants:

from rusket import FPGrowth

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

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


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

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

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

import polars as pl
from rusket import FPGrowth

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

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

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

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

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


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

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

import pandas as pd
from rusket import HUPM

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

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

๐Ÿ“Š Sparse Pandas Input

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

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

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

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

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

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

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

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


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

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

import numpy as np
from rusket import FPMiner

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

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

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

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


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

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

How it works

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

Full Example โ€” Retail Basket Analysis per Store

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

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

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

# โ”€โ”€ 2. Mine frequent itemsets per store in parallel โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
#    Each Spark task calls the Rust FP-Growth/Eclat engine on its Arrow batch.
freq_df = mine_grouped(
    spark_df,
    group_col="store_id",
    min_support=0.05,    # 5% support per store

)
# freq_df schema: store_id | support (double) | itemsets (array<string>)

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

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

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

Sequential Patterns per Category

from rusket.spark import prefixspan_grouped

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

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

High-Utility Patterns per Region

from rusket.spark import hupm_grouped

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

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

Batch Recommendations across the Cluster

from rusket.spark import recommend_batches
from rusket import ALS

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

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

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

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


๐Ÿ“– API Reference

OOP Class API

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

Class Inherits from Description
FPGrowth Miner, RuleMinerMixin FP-Tree parallel mining
Eclat Miner, RuleMinerMixin Vertical bitset mining
FPGrowth Miner, RuleMinerMixin Frequent Pattern Growth algorithm
FIN Miner, RuleMinerMixin FP-tree Node-list intersection mining
LCM Miner, RuleMinerMixin Linear-time Closed itemset Mining
HUPM Miner High-Utility Pattern Mining (EFIM)
PrefixSpan Miner Sequential pattern mining
ALS ImplicitRecommender Alternating Least Squares CF
BPR ImplicitRecommender Bayesian Personalized Ranking CF
SVD ImplicitRecommender Funk SVD (biased SGD)
LightGCN ImplicitRecommender Graph Convolutional CF
ItemKNN ImplicitRecommender Item-based k-NN CF
UserKNN ImplicitRecommender User-based k-NN CF
EASE ImplicitRecommender Embarrassingly Shallow Autoencoders
FM BaseModel Factorization Machines (CTR prediction)
FPMC SequentialRecommender Factorizing Personalized Markov Chains
SASRec SequentialRecommender Self-Attentive Sequential Recommendation
HybridEmbeddingIndex โ€” CF + semantic embedding fusion

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

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

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

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

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

ImplicitRecommender subclasses (ALS, BPR, SVD, LightGCN, ItemKNN, UserKNN, EASE) follow the scikit-learn fit()/predict() pattern. SequentialRecommender subclasses (FPMC, SASRec) use from_transactions(..., time_col=...).fit() for sequential next-item prediction:

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

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

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

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

๐Ÿง  Advanced Pattern & Recommendation Algorithms

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

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

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

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

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

from rusket import ItemKNN, UserKNN

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

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

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

๐ŸŽฏ ALS & BPR Collaborative Filtering

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

from rusket import ALS, BPR

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

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

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

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

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

๐ŸŽฏ Hybrid Recommender API

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

from rusket import ALS, Recommender, FPGrowth

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

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

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

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

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

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

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

๐Ÿงฌ Hybrid Embedding Fusion โ€” CF + Semantic in One Vector Space

Collaborative filtering embeddings capture behavioral signals (who bought what); semantic text embeddings capture content meaning (product descriptions). Fusing them into a single vector space lets you do ANN retrieval, vector DB export, and clustering in one shot.

import rusket

# 1. Train ALS on implicit feedback
als = rusket.ALS(factors=64, iterations=15).fit(interactions)

# 2. Get semantic embeddings (e.g. from sentence-transformers)
from sentence_transformers import SentenceTransformer
encoder = SentenceTransformer("all-MiniLM-L6-v2")
text_vectors = encoder.encode(product_descriptions)  # (n_items, 384)

# 3. Fuse into a single hybrid vector space
hybrid = rusket.HybridEmbeddingIndex(
    cf_embeddings=als.item_factors,       # (n_items, 64)
    semantic_embeddings=text_vectors,      # (n_items, 384)
    strategy="weighted_concat",            # "concat" | "weighted_concat" | "projection"
    alpha=0.6,                             # 60% CF, 40% semantic
)

# 4. Similar items via cosine on the fused space
ids, scores = hybrid.query(item_id=42, n=10)

# 5. Build an ANN index for sub-millisecond retrieval
ann = hybrid.build_ann_index(backend="native")  # or "faiss"

# 6. Export to a vector DB for production serving
hybrid.export_vectors(qdrant_client, collection_name="hybrid_items")

# 7. Or export as separate named vectors for DB-side fusion
hybrid.export_vectors(qdrant_client, mode="multi", collection_name="hybrid_items")
# โ†’ Qdrant/Meilisearch/Weaviate store "cf" and "semantic" as separate named vectors

Three fusion strategies:

Strategy Description Use Case
"concat" L2-normalise each space, concatenate Equal importance, no tuning
"weighted_concat" Scale by ฮฑ / 1โˆ’ฮฑ, then concat Default โ€” tune alpha to balance CF vs semantic
"projection" Concat + PCA to projection_dim Compact vectors for large-scale deployment

Standalone function: If you just need the fused matrix without an index, use rusket.fuse_embeddings(cf, sem, strategy="weighted_concat", alpha=0.6).

๐ŸŽฏ Multi-Stage Recommendation Pipeline

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

It chains multiple models together:

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

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

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

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

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

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

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

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

import rusket

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

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

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

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

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

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

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

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

๐Ÿ” Analytics Helpers

from rusket import find_substitutes, customer_saturation

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

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

๐Ÿ“ˆ BPR & Sequential Patterns

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

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

from rusket import PrefixSpan

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

๐Ÿ•ธ๏ธ Graph Analytics & Embeddings

Integrate natively with the modern GenAI/LLM stack:

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

๐Ÿ”ฌ MLOps: MLflow Tracking & Hyperparameter Tuning

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

import rusket
import rusket.mlflow
from rusket import OptunaSearchSpace

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

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

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

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

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

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

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

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

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

๐Ÿš€ GPU Acceleration (CUDA)

rusket supports optional GPU acceleration via CuPy or PyTorch CUDA for models that benefit from large matrix operations. Enable it globally with a single call โ€” no need to pass use_gpu=True to every model.

import rusket

# Enable GPU globally โ€” every model created after this uses CUDA
rusket.enable_gpu()

# All models now default to GPU
als = rusket.ALS(factors=128, iterations=20).fit(interactions)
ease = rusket.EASE(regularization=500).fit(interactions)
bpr = rusket.BPR(factors=64).fit(interactions)

# Per-model override: force a specific model to CPU
small_model = rusket.SVD(factors=16, use_gpu=False)

# Turn it off globally
rusket.disable_gpu()

# Check the current state
rusket.is_gpu_enabled()  # โ†’ False

Supported Models

All 12 recommender models respect the global GPU flag:

Model GPU-accelerated operations
ALS / eALS Gramian, Cholesky solve, batch scoring
BPR SGD updates, batch recommend
SVD Factor updates, batch scoring
EASE Gram matrix inversion
ItemKNN / UserKNN Similarity scoring
LightGCN Graph convolution, scoring
FM Prediction
FPMC Factor updates
SASRec / BERT4Rec Attention forward pass
NMF Multiplicative updates

Installation

# CuPy (recommended โ€” fastest)
pip install cupy-cuda12x

# Or PyTorch
pip install torch

No GPU? No problem. rusket auto-detects whether a GPU backend is available. If neither CuPy nor PyTorch CUDA is installed, enable_gpu() will still succeed but models will raise an ImportError at fit-time. Use rusket.check_gpu_available() to test beforehand.


โšก 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.94.tar.gz (259.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.94-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl (1.8 MB view details)

Uploaded PyPymusllinux: musl 1.2+ x86-64

rusket-0.1.94-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl (1.7 MB view details)

Uploaded PyPymusllinux: musl 1.2+ ARM64

rusket-0.1.94-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.5 MB view details)

Uploaded PyPymanylinux: glibc 2.17+ x86-64

rusket-0.1.94-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.5 MB view details)

Uploaded PyPymanylinux: glibc 2.17+ ARM64

rusket-0.1.94-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.15tmanylinux: glibc 2.17+ x86-64

rusket-0.1.94-cp315-cp315t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.5 MB view details)

Uploaded CPython 3.15tmanylinux: glibc 2.17+ ARM64

rusket-0.1.94-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.15manylinux: glibc 2.17+ x86-64

rusket-0.1.94-cp315-cp315-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.5 MB view details)

Uploaded CPython 3.15manylinux: glibc 2.17+ ARM64

rusket-0.1.94-cp314-cp314t-musllinux_1_2_x86_64.whl (1.7 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.2+ x86-64

rusket-0.1.94-cp314-cp314t-musllinux_1_2_aarch64.whl (1.7 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.2+ ARM64

rusket-0.1.94-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.17+ x86-64

rusket-0.1.94-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.5 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.17+ ARM64

rusket-0.1.94-cp314-cp314-win_amd64.whl (1.4 MB view details)

Uploaded CPython 3.14Windows x86-64

rusket-0.1.94-cp314-cp314-musllinux_1_2_x86_64.whl (1.8 MB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ x86-64

rusket-0.1.94-cp314-cp314-musllinux_1_2_aarch64.whl (1.7 MB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ ARM64

rusket-0.1.94-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ x86-64

rusket-0.1.94-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.5 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ ARM64

rusket-0.1.94-cp314-cp314-macosx_11_0_arm64.whl (1.4 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

rusket-0.1.94-cp314-cp314-macosx_10_12_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.14macOS 10.12+ x86-64

rusket-0.1.94-cp313-cp313-win_amd64.whl (1.4 MB view details)

Uploaded CPython 3.13Windows x86-64

rusket-0.1.94-cp313-cp313-musllinux_1_2_x86_64.whl (1.8 MB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

rusket-0.1.94-cp313-cp313-musllinux_1_2_aarch64.whl (1.7 MB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ ARM64

rusket-0.1.94-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

rusket-0.1.94-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.5 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64

rusket-0.1.94-cp313-cp313-macosx_11_0_arm64.whl (1.4 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

rusket-0.1.94-cp313-cp313-macosx_10_12_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.13macOS 10.12+ x86-64

rusket-0.1.94-cp312-cp312-win_amd64.whl (1.4 MB view details)

Uploaded CPython 3.12Windows x86-64

rusket-0.1.94-cp312-cp312-musllinux_1_2_x86_64.whl (1.8 MB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

rusket-0.1.94-cp312-cp312-musllinux_1_2_aarch64.whl (1.7 MB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ ARM64

rusket-0.1.94-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

rusket-0.1.94-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.5 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

rusket-0.1.94-cp312-cp312-macosx_11_0_arm64.whl (1.4 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

rusket-0.1.94-cp312-cp312-macosx_10_12_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.12macOS 10.12+ x86-64

rusket-0.1.94-cp311-cp311-win_amd64.whl (1.4 MB view details)

Uploaded CPython 3.11Windows x86-64

rusket-0.1.94-cp311-cp311-musllinux_1_2_x86_64.whl (1.8 MB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

rusket-0.1.94-cp311-cp311-musllinux_1_2_aarch64.whl (1.7 MB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ ARM64

rusket-0.1.94-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

rusket-0.1.94-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.5 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64

rusket-0.1.94-cp311-cp311-macosx_11_0_arm64.whl (1.4 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

rusket-0.1.94-cp311-cp311-macosx_10_12_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.11macOS 10.12+ x86-64

rusket-0.1.94-cp310-cp310-win_amd64.whl (1.4 MB view details)

Uploaded CPython 3.10Windows x86-64

rusket-0.1.94-cp310-cp310-musllinux_1_2_x86_64.whl (1.8 MB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ x86-64

rusket-0.1.94-cp310-cp310-musllinux_1_2_aarch64.whl (1.7 MB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ ARM64

rusket-0.1.94-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

rusket-0.1.94-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.5 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64

File details

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

File metadata

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

File hashes

Hashes for rusket-0.1.94.tar.gz
Algorithm Hash digest
SHA256 3b60c4b06ab11fa4d187d2d952f95dfffcd6de57a3474d785aeb76c90bc9e8d5
MD5 7efbcae1000e175b23dce873376f5e7a
BLAKE2b-256 1b07cee7897b381fde061177158bc6467006231410eb9f0069d3803cccc813ca

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.94-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 aabade6bf1c39c11cee59e1e4cad6bf7d5d2d5133b8fb48c5eed1ae56532232a
MD5 96c94bc691a344615f80c3386986bb7c
BLAKE2b-256 de40b3f6d34264a12beb903b971c5d32f929f045684cb09630bba3e233b23e84

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.94-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 ccf27981ab051b160df4bade3c2211c50c099594f079dff9145256b6584cc9d6
MD5 a990c021c627875b2902ab237f5d8f09
BLAKE2b-256 f0636fbf31657a1aceaf82ffcb68ac8ede7f64baa21fbb57eb1a7adc0a5c3075

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.94-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 523854d9fd6b57879e98efb616d0352071812061fd5bcdec481120039266366b
MD5 ca05f09b707243369c45f545136944bd
BLAKE2b-256 0b3811d44d887c461ccf2ab070bf494ce60adcfff98be7e82e88e4afc97b31cc

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.94-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 c995d84086c8b346cded026988f673a126884a0ba32e3790c34a9a7309477047
MD5 2caed31899be870466110a492dbc4c58
BLAKE2b-256 508f06d7051cde932c8ec62ddde94cd19b203df2f420b4021aa90268358d1153

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.94-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.94-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rusket-0.1.94-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 aadac2265c5c9023280c4c481923c6ff3846e5ae34974ffebfafab9d47fa6cee
MD5 e09a403a5cf64a2b79e90176be1b79ba
BLAKE2b-256 28ea13ab30698db4752cc6ed0849cfc2e6a087084335e511a7d6101d45ec1a17

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.94-cp315-cp315t-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.94-cp315-cp315t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for rusket-0.1.94-cp315-cp315t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 a35c2acdcc7c7d740425695edf1c03e915518295cfe172d3ab75ae1d7bd060ba
MD5 b061709e583cc340141c14e01e128ad8
BLAKE2b-256 6218963d6d9c07e421b678ebfeaf36390e2736ce9cbba725ef4f6d7de54280da

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.94-cp315-cp315t-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.94-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rusket-0.1.94-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 af7c5e6c0d01df7118d09f1168e66f69abcaaadbce31ccfd28a6d18eb76e4632
MD5 cf3df9383c7ab0e03549f305a6d6d033
BLAKE2b-256 de2310fe5d7bcb89fff6dbc68d80146e1f82322f217ab4d4bfb9dc89ae41810b

See more details on using hashes here.

Provenance

The following attestation bundles were made for rusket-0.1.94-cp315-cp315-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.94-cp315-cp315-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for rusket-0.1.94-cp315-cp315-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 50daa7a04fdd0a16e4f1f48b35e3df6312e4e2a132e5af0bc605c1eded850af9
MD5 644fb2a31f3186ec6e22e95bdee09bae
BLAKE2b-256 7b04ba8e6a22ee552be1f95715a212abb6145e78775a153497268d65cdab983a

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.94-cp314-cp314t-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 1d7b15ae0ab27528c3de2cf79dee7dca4fb7ef68bbff6b760e7dfef814b76ea6
MD5 5ee40c544d5411df380518bd568bf0c1
BLAKE2b-256 d14eb08f07fd81c6c7e84ee963b13821297f251b565088e0e08faa635be5378a

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.94-cp314-cp314t-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 6baccce5e83d280412d827209b987a166aee09eecd566f95b752978ca14acbc3
MD5 0ad193ceb307606618068b577ffc1545
BLAKE2b-256 a8b7261920b6c865dbcd7001f2710a14249bf99f7cafec0ba0cc642d3e44c618

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.94-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e4bdb367005413c120d3601b3a2345b011f2d7e2341a84284b0f8db6c6c59e4a
MD5 1b9f238ef8360af6029d476f97a217f4
BLAKE2b-256 44e7f6df259bbdae391e74a3afaa39606e9311833de07d702cf77ec9f14b1dc0

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.94-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 6695a01c0a68c27e91c9d660c20a12ce11fe33b5c1ec9c1082cece356dd61407
MD5 ee72ca165f3dcd053121c3a67152bbba
BLAKE2b-256 edb6e88a4110894353881fca63722b9b9e6e62c7f70dffddfc5fc1c0db1b05d0

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: rusket-0.1.94-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 1.4 MB
  • Tags: CPython 3.14, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for rusket-0.1.94-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 7ac34f04dfead7e775b9e02e22628d54683451e2197fc87055bceb4650b9d0cd
MD5 38b27b5d8474bc250490705bf157cc99
BLAKE2b-256 add5c03026f018b41af0f5d1bd91b3d4d49f1e0ee9b92d956d34ea59be16a017

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.94-cp314-cp314-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 24cb3baa5b0537be6b18cfc8a24dec9424a48563fadb14b065c4274d531e587d
MD5 9d4839c614f621e487786f4787f8108c
BLAKE2b-256 0b363a67afc0da7c42679ba33b318dceeaa343a0de8d9b6a442d9df53a188459

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.94-cp314-cp314-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 f3b0e5bd47f60f90688fe86f2396ab32237f4e12815473707f77b1cb64f6e9ab
MD5 cad1cb9bd243f0e9769d2f42cd84e5ce
BLAKE2b-256 b0627a57856bca7f7887d39a08159c71944e5da98e4622d23be450b5c0c0b546

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.94-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a698cc8b1e35af43323dc368a5feeffb73e1039082deb3ff39159d87fc771236
MD5 51858990a6da39f5d11a22d1bab2170a
BLAKE2b-256 60ed35f9dd4201d37dc29061077af045bb17f16cbe26d6e45af663e3d8d57395

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.94-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 3970d23f0624eab3becfaede2a0c0a2b99fae617214a379af33e87920e6fa886
MD5 aac4404c5940f13b26b2694e0ce0aea8
BLAKE2b-256 9289969601151b0fb47e285a754ebe23deb93e976ca781519adbba4f77f94a57

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.94-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 34a2f1e7dd49958653b85255f553c6bc39da3f5e408e4959b923d7d10a32753d
MD5 867b73b3b46dd0c8dc5639e530a6646e
BLAKE2b-256 e0c52c33c09308b0ac488405e6d320c44f64eba2c62560beedbff283b95dbbbb

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.94-cp314-cp314-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 347388eef6d4610ac6d7f027bd2da9bde7cabc15d33885b43b22b84ea1984b21
MD5 0c04be6d3be6d7b5f403687f1b349300
BLAKE2b-256 ae6f9638ecde4c2176bc626cbeed737694e6589a7603290f4bf149f9bc9b4c1a

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: rusket-0.1.94-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 1.4 MB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for rusket-0.1.94-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 63120537729b04bd24959026b65b1c9a8202af8775af5a8bfd792076816363d9
MD5 66c0eca50047bc1c3ae050a9cbca11a8
BLAKE2b-256 040e74c8e4bde760e0c9cb797e68b41968ca525142d22e03ae198644d7eced9f

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.94-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 569a9f17e75996e5f7833051cf9d6389efbf18c07ba493f27df47aa8b36133a8
MD5 43c9634bd6bf7a0d2e2cec9ee8ca656f
BLAKE2b-256 b5b7b4520da297877abd3bfd035e9acf56be6b8f5ddc8c10cfa7f6136f725c0c

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.94-cp313-cp313-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 42555e78d05102ecb335d06ea04e413ebf9ca85bea1648e09203b8eb4fe39341
MD5 904568278395e4ded3942f80d33116ee
BLAKE2b-256 6372247bbfd987c9dd1ff7a6644e6c0f9c8128c2307a5fc58f0e132d4b18d995

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.94-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2131028e42edf2da8e054786a0c896750324ae6804340410235cbf19ec4df434
MD5 c2f20513368bd9da86eab78bc59087ad
BLAKE2b-256 f053c7b73a5c9747227d1dfa5bd6d0980e12e2ad942774399cc5bb32a4360013

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.94-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 fa607d231b3252c85c66debdac4b7528e3ac4d82677fb888560bb925c488ff12
MD5 42b8d3179b180ec4c706e396fa233d76
BLAKE2b-256 044e4817eb0c6b96757866c0d9c694463ca3f2863f045cc1473c38ceb71c54d7

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.94-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1a6903b081361a343b2383b5eff6943b82c6155ccb005da7a6b2071b7f318bea
MD5 1138eba41b7a0c089137fa86289ee950
BLAKE2b-256 f0e19562f3709a9202484cac3ff7bf94c5c1faff9df504f71b55252dee174f47

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.94-cp313-cp313-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 b4e970809226076878c586e46688a746611010d0cabf95f1852fb10ca1a66885
MD5 b6ffd893a1111236262ec7fd00cbcca9
BLAKE2b-256 ebe3423b89d46a2ba1474ebe2cffbe7450c5a6c2f7f321b1a6b77ee02fa07c94

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: rusket-0.1.94-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 1.4 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for rusket-0.1.94-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 ebc0daa94a37b28f00e3588726c59e36ef9a9ac3f6e105c99938b7168542b8f1
MD5 e835ed6b0138072899e201602b50c17a
BLAKE2b-256 293da026cb5fed36e85ae5d2bcc8b24fe384f3185aaaf3edd0a599168975059c

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.94-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 0016675efc50b914ff06791011c4603a10d478e8961c89c938c66e99e361c00a
MD5 005062272b09ddba5f3efc43eb82cf5e
BLAKE2b-256 a9aa155685d2755d570f33765037640a50b2591f86b1930658c1cc4ffdf22a3c

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.94-cp312-cp312-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 69ce644d714c5ea1ac02c314a14f732a65c4b7e7955f8a9d12c15125d6206dce
MD5 d5af71508b6b357e24e6e55368bd730d
BLAKE2b-256 3e9bb47f182fbb1466015a0caf795faaf81e09a806ba28e819d6a03e6b1c6559

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.94-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4fd4dabbc52b8b5a31c276d6daeb4275af84a1177a032876a5b5268bcd10b0a8
MD5 30c2c33601cfc3efbe85fc1fd666ace2
BLAKE2b-256 ca1d51aae53a074ccb1cb8049f9c9769a7519cd013882f7b29e8594ed5c25dec

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.94-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 39864aca08eb421248f6763d1d81c82a22061e211c43620b992e585b4d135269
MD5 6ce074d3a941d5c7a912f449f38cbcb1
BLAKE2b-256 34bdacd26831a0938c1bd03359a3fdca82ad123a68d540699c30d82bcef8bd15

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.94-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b6357471b554e36ec3e9390c298980974932e1bb15c6ea6f76b8f4bc0dc3b877
MD5 bb1f54e695c1a9ff2d74dc9143637aa2
BLAKE2b-256 ffc737313b27418321dc344215cc21b4b62ca239530c30f9f7481f0f29376c8a

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.94-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 d7ad22e926a848a0a30fd39943ca3f9191f698eb15045a91c2976450379bbf91
MD5 007fa5cc5d15985fe6b2e3b4d559c221
BLAKE2b-256 70a235b860f355263d6f69afffd9afe6d48098e58418b6a69c72f24f9b734398

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: rusket-0.1.94-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 1.4 MB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for rusket-0.1.94-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 c7b6c447cb3a09cca60fc1e5f4a12f0f5f96a48c41e815382f2189e71831be7a
MD5 cf6173082bfb3f82172d9c8f1cb95dca
BLAKE2b-256 496cd877ef171266519b4411dd77d7705ebcf118e93fdf6cc0bf2430798fbae3

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.94-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 aec58d22ea86b495ac6e5314a15a97b599e7e23b38b23e6eef2a6c885d9d6fca
MD5 35315f5c42df6d8aea7dc5e9d58a4df1
BLAKE2b-256 a1d0b49fbc720442f6f3078f14c7b8ab86f7424fa7b53257afd7d224e9eb7a6a

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.94-cp311-cp311-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 01a95e1e7df4c064672584319989788803a3624d6a135663ca33d0a7b9fcceb8
MD5 2b63398b064d46f1980bf477647e5567
BLAKE2b-256 e4d3634162fdb6a71e267a2da135fb605461c3d19879555f961bedd9c652e481

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.94-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 7ab3f578ab048b0e54fbb74508ec2eba8fc75f2bddbbd3cb535ca1bac9e1b680
MD5 6b64863a8fefa69459eee4d8796fe3d9
BLAKE2b-256 eabe7ac0265d6626fc111bdfe5fe1f37d663fb2a705c42f5172e66ad77a2f8a4

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.94-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 661d3a3ca9d089f02d55ca46047c46eedad7e58caa82d5b76b4507f7876cf0ac
MD5 13276eeb419d8111acc8190aef6e67a7
BLAKE2b-256 c333daacadc4085d5d7d00285a3ac58f03454139d0aca368acd3ce3a257df7b6

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.94-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 90b8da7f186a4bbba264363a03761c957aca743215a96cdd6362ac803fa82f74
MD5 bb42d921ee57b348f4b6ef7df8c219cb
BLAKE2b-256 73092fc918de007206224d1328046a7887ac32632d3815871de5b96a1d141edd

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.94-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 591d69cfe21350e5c689304e54b3f5a80948ee491f994b5d5633532816bbee99
MD5 c4711fe82369476f59a0d662579e934b
BLAKE2b-256 137c6edef212d0e5c4c28722750301f308834b2b58229700f9a566ec9b11de38

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: rusket-0.1.94-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 1.4 MB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for rusket-0.1.94-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 8e6622ee21fd1621234968e46f15e0f1d79fbe1d60cae800deb0de219db099a1
MD5 7778570ae4ec8e1bb5420a238b9ea291
BLAKE2b-256 c7ea64c5b7143d230c4ef1fe69d58d8bedff67e20a94403bac7fa16e5271fc81

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.94-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 e2e1c4799a9b208bd34097faf92562d803d2a9c88efc6f53b04125dd0cb692d2
MD5 cf4fad67747ef7cc7b44150c0ddbe6e4
BLAKE2b-256 ff8e199180af7c6410710b4efe5a3e14ee291eb6223cfb8876a6b33c9fb652eb

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.94-cp310-cp310-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 91d123d6e56a0484fd1ab8057961bd2d2127c697554fecd54b93dc19d05d53f7
MD5 8f3282abe7b2916beb9e0280e786e6f4
BLAKE2b-256 0fa664ba346131727cff16efd07454f8fee4107dec9002e0979df2512c1792c4

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.94-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c0374b745038980414ddced165374ea00e72712a1407f4681bfd56de77b30649
MD5 68ebb515e5ef66e09d612292a0d9bc3a
BLAKE2b-256 5b5c14d05dfddb226174f506914e0716d691060fa4d3ffed35f354bc0f4c0727

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.94-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 1b7607e7d0133794a5bdb1475367ae7c9e4257ac4e7c63d6a461bd2af975e8e0
MD5 e2f8a28afdc7949dbf5d105b81b6a0ef
BLAKE2b-256 b819fa28a022b376dbcaca8b28564571f4a466c6ca04933812440fd0ffe9bbef

See more details on using hashes here.

Provenance

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