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


⚠️ 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.

It features Collaborative Filtering (ALS, BPR) and Pattern Mining (FP-Growth, Eclat, HUPM, PrefixSpan) with high performance and low memory footprints. Both functional and OOP APIs are available for seamless integration.


✨ Highlights

rusket implicit pyspark.ml
Core language Rust (PyO3) Cython / C++ Scala / Java (JVM)
Algorithms ALS, BPR, PrefixSpan, FP-Growth, Eclat, HUPM ALS, BPR ALS, FP-Growth, PrefixSpan
Recommender API ✅ Hybrid Engine + i2i Similarity ✅ (ALS only)
Graph & Embeddings ✅ NetworkX Export, Vector DB Export
OOP class API FPGrowth.from_transactions(df).mine()
Pandas dense input ✅ C-contiguous np.uint8 ❌ (requires CSR/COO) ❌ (requires Spark DF)
Pandas Arrow backend ✅ Arrow zero-copy (pandas 2.0+) ❌ Not supported ✅ (via PyArrow)
Pandas sparse input ✅ Zero-copy CSR → Rust ✅ (CSR native) ❌ (Requires SparseVector)
Polars input ✅ Arrow zero-copy ❌ Not supported ❌ (conversion needed)
Spark / distributed mine_grouped, recommend_batches, etc. ✅ Native distributed
Parallel mining ✅ Rayon work-stealing ✅ OpenMP / Threads ✅ Spark Cluster
Memory Low (native Rust buffers) Low (C++ arrays) High (JVM overhead)
Metrics 12 built-in metrics N/A Limited

📦 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 AutoMiner

# 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?
# AutoMiner selects FP-Growth or Eclat based on catalogue density
model = AutoMiner(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 AutoMiner

# 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 = AutoMiner.from_transactions(
    orders,
    transaction_col="order_id",
    item_col="sku",
    min_support=0.3,
)

freq  = model.mine(use_colnames=True)
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 AutoMiner

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

Spark is also supported: AutoMiner.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 AutoMiner, 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 AutoMiner. 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 AutoMiner
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 AutoMiner

# ── 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 AutoMiner (zero-copy from Polars) ─────────────────
model = AutoMiner(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 AutoMiner

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 = AutoMiner(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
    method="auto",       # auto-selects FP-Growth or Eclat
)
# 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(factors=64, iterations=15).from_transactions(
    events_pd,
    user_col="user_id",
    item_col="item_id",
)

# 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
AutoMiner Miner, RuleMinerMixin Auto-selects FP-Growth or Eclat
HUPM Miner High-Utility Pattern Mining (EFIM)
PrefixSpan Miner Sequential pattern mining
ALS ImplicitRecommender Alternating Least Squares CF
BPR ImplicitRecommender Bayesian Personalized Ranking CF

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

model  = AutoMiner.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) expose:

model = ALS(factors=64, iterations=15).fit(user_item_csr)
# — or directly from an event log —
model = ALS(factors=64).from_transactions(df, user_col="user_id", item_col="item_id")

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

🧠 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"
)

# 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, AutoMiner

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

🔍 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

Scale Benchmarks (1M → 200M rows)

Scale from_transactions → fpgrowth Direct CSR → Rust Speedup
1M rows 5.0s 0.1s 50×
10M rows 24.4s 1.2s 20×
50M rows 63.1s 4.0s 15×
100M rows (20M txns × 200k items) 134.2s 10.1s 13×
200M rows (40M txns × 200k items) 246.8s 17.6s 14×

Power-user path: Direct CSR → Rust

import numpy as np
from scipy import sparse as sp
from rusket import AutoMiner

# 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 = AutoMiner(csr, item_names=item_names).mine(
    min_support=0.001, max_len=3, use_colnames=True
)

At 100M rows, the mining step takes 1.3 seconds — the bottleneck is entirely the CSR build.

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 python benchmarks/bench_scale.py       # Scale benchmark + Plotly chart
uv run python benchmarks/bench_realworld.py   # Real-world datasets
uv run pytest tests/test_benchmark.py -v -s   # pytest-benchmark

🏗 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.46.tar.gz (126.8 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

rusket-0.1.46-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl (1.1 MB view details)

Uploaded PyPymusllinux: musl 1.2+ x86-64

rusket-0.1.46-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl (1.1 MB view details)

Uploaded PyPymusllinux: musl 1.2+ ARM64

rusket-0.1.46-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (860.3 kB view details)

Uploaded PyPymanylinux: glibc 2.17+ x86-64

rusket-0.1.46-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (952.0 kB view details)

Uploaded PyPymanylinux: glibc 2.17+ ARM64

rusket-0.1.46-cp314-cp314t-musllinux_1_2_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.2+ x86-64

rusket-0.1.46-cp314-cp314t-musllinux_1_2_aarch64.whl (1.1 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.2+ ARM64

rusket-0.1.46-cp314-cp314-win_amd64.whl (708.6 kB view details)

Uploaded CPython 3.14Windows x86-64

rusket-0.1.46-cp314-cp314-musllinux_1_2_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ x86-64

rusket-0.1.46-cp314-cp314-musllinux_1_2_aarch64.whl (1.1 MB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ ARM64

rusket-0.1.46-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (858.0 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ x86-64

rusket-0.1.46-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (948.8 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ ARM64

rusket-0.1.46-cp314-cp314-macosx_11_0_arm64.whl (829.6 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

rusket-0.1.46-cp314-cp314-macosx_10_12_x86_64.whl (788.2 kB view details)

Uploaded CPython 3.14macOS 10.12+ x86-64

rusket-0.1.46-cp313-cp313t-musllinux_1_2_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.13tmusllinux: musl 1.2+ x86-64

rusket-0.1.46-cp313-cp313t-musllinux_1_2_aarch64.whl (1.1 MB view details)

Uploaded CPython 3.13tmusllinux: musl 1.2+ ARM64

rusket-0.1.46-cp313-cp313-win_amd64.whl (710.5 kB view details)

Uploaded CPython 3.13Windows x86-64

rusket-0.1.46-cp313-cp313-musllinux_1_2_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

rusket-0.1.46-cp313-cp313-musllinux_1_2_aarch64.whl (1.1 MB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ ARM64

rusket-0.1.46-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (860.4 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

rusket-0.1.46-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (950.8 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64

rusket-0.1.46-cp313-cp313-macosx_11_0_arm64.whl (829.9 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

rusket-0.1.46-cp313-cp313-macosx_10_12_x86_64.whl (788.5 kB view details)

Uploaded CPython 3.13macOS 10.12+ x86-64

rusket-0.1.46-cp312-cp312-win_amd64.whl (710.5 kB view details)

Uploaded CPython 3.12Windows x86-64

rusket-0.1.46-cp312-cp312-musllinux_1_2_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

rusket-0.1.46-cp312-cp312-musllinux_1_2_aarch64.whl (1.1 MB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ ARM64

rusket-0.1.46-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (860.5 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

rusket-0.1.46-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (951.0 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

rusket-0.1.46-cp312-cp312-macosx_11_0_arm64.whl (830.2 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

rusket-0.1.46-cp312-cp312-macosx_10_12_x86_64.whl (788.7 kB view details)

Uploaded CPython 3.12macOS 10.12+ x86-64

rusket-0.1.46-cp311-cp311-win_amd64.whl (710.1 kB view details)

Uploaded CPython 3.11Windows x86-64

rusket-0.1.46-cp311-cp311-musllinux_1_2_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

rusket-0.1.46-cp311-cp311-musllinux_1_2_aarch64.whl (1.1 MB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ ARM64

rusket-0.1.46-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (858.6 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

rusket-0.1.46-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (950.5 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64

rusket-0.1.46-cp311-cp311-macosx_11_0_arm64.whl (830.5 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

rusket-0.1.46-cp311-cp311-macosx_10_12_x86_64.whl (789.9 kB view details)

Uploaded CPython 3.11macOS 10.12+ x86-64

rusket-0.1.46-cp310-cp310-win_amd64.whl (710.2 kB view details)

Uploaded CPython 3.10Windows x86-64

rusket-0.1.46-cp310-cp310-musllinux_1_2_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ x86-64

rusket-0.1.46-cp310-cp310-musllinux_1_2_aarch64.whl (1.1 MB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ ARM64

rusket-0.1.46-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (858.7 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

rusket-0.1.46-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (950.7 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64

File details

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

File metadata

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

File hashes

Hashes for rusket-0.1.46.tar.gz
Algorithm Hash digest
SHA256 fb18ba87ba7c28374334809cfad965fc000cab2d5b2081ec7cb640fefaaa3358
MD5 31f0073c681ddd14f703fb88931c9df9
BLAKE2b-256 19cd74b290b3bdf8246214ce5cc7bae7646e245acb568adf1236176863fb4ff8

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.46-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 2833483f080135a085a652b26d4bdacc757565ffa008ce5ede1139878b42f938
MD5 e4f9060e3b3e02f2868295e199fed309
BLAKE2b-256 67ae60c0adae665ecccf837ee7a52204a3ff3c41a9266c943efe40c68e0a7f43

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.46-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 f5867b676b4fcad1bd75fc09374f282a4d53392a62220d997252effe355591ba
MD5 f54cafbeb0f18ac7da39681f8f0d140c
BLAKE2b-256 346e0dd734a34e739ca21974bbe0446e7e3d3db4f5493209e3f55279895be6b3

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.46-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 10e2ce8513da018255139a72b9d3060c7f977ba521a85c359910f5e5b7a34cda
MD5 7d01fee3c5e884dcea97498e8e33828d
BLAKE2b-256 eef152bd7f1f47eb09672c939f3d7557ec950ca754a47f662838a8a31f73fc73

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.46-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 01b6042f14014859c078eaf4d9c95e00087c415e49a3542d4265ecd2b2285490
MD5 760f79920295f46b9dbc1344422577ae
BLAKE2b-256 93f9c556b8d8a60250b0522fe366c777da5e52b391e3f64bec3ab5d1c3368bb6

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.46-cp314-cp314t-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 f8b241b4082ebadbbcbd2c333c1bacf2ea68b2d719e4d4c0a7152ea56125f6f3
MD5 2df0fe8cac9d1e367f17230186211519
BLAKE2b-256 9688ec68f807d61bc9e62da8b143a58606d08a73df63458eabef2daef8997705

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.46-cp314-cp314t-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 0d19b7c24377564d9555845c9099f7f808f76d7b466c03920e684dd2e3f950a9
MD5 8b9d4b3fa6d3a46b53d58d195ac51340
BLAKE2b-256 51e3b375958b1f5f503ed973e7e49b685f750420e668a0ec35de25c8634384a6

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: rusket-0.1.46-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 708.6 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.46-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 b208383abe26db8fda63d87d1332f5c253a6d30eb37b96eccdd628b5d46f9431
MD5 3e73259da4a3accfb046b78614aa9aa3
BLAKE2b-256 04134446ef760fc163aace6c30be05b36874d4108ef4422167c61c199a6961ef

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.46-cp314-cp314-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 b3eb0ef2ff579a182887aaf6d7d8068b9749f51f6b763336801cf591a949273c
MD5 c65a539836bb98e8831863ce006bcb23
BLAKE2b-256 e346f48ac45cfc33871ecf36394dda642b9b3dd02c62a7d215b41c4e79c8b99f

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.46-cp314-cp314-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 86c1fb6528dfd9166af354c913b8dba699a12d44815db8a144c15142d94fa5b3
MD5 50b273a7d146530fa1dbc80c0da8cad1
BLAKE2b-256 ae17d74a6e991060ad7017e91317b9b45b8d567175b1dd393c350a2140a0731c

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.46-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ded41b1f2f25c7d217d5f1874d46dac5cdc3b5b75776b58ebb62140656e34ee7
MD5 a7f16af5d3310c3b9e7098c1df2fbe9a
BLAKE2b-256 81c33154505be230437c5f4099cd647781d1353dbda422074936b90fd3e51f3a

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.46-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 93f23bfc3539a30c9a0b0017c2e5b3a86f0fa28674582ae63f70fdd08fd8a35d
MD5 004d4fb81c035e2b1b4eb6053a77b37c
BLAKE2b-256 f075e114c0c826e2f9fa8da8d944a13df6591910338a8e6b38926bb195527403

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.46-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 51e2e4c53b996910532cd9989d59dd9abd511a29110c77cabd68794d673d1715
MD5 a14f1882bed9f54130c09abca064c3e5
BLAKE2b-256 3085fd2b41dfb91ae080a3c38a7e11fcbcc1419236a77402cd6f230b766b7e68

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.46-cp314-cp314-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 79b79ec2af22eff91ad440730f71d81ac03ef7b7d3325ab463684687f3cfb848
MD5 96c67d94d41e54623ebe02cb1e292dff
BLAKE2b-256 eeefec1d87f2cad83a1bf51f9aa8610731cf759bf09cf9d79f45a117b8205f66

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.46-cp313-cp313t-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 a1f2c30b6ef9a4f685a0b7064b8b432a57d8b8f68aef0e4660306279940df2fa
MD5 c2481ce66c0515c281e46599cf8b6172
BLAKE2b-256 43712fa956feea47a08a6d9d399309594ea633385dfee4e31393a4ee7172c912

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.46-cp313-cp313t-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 098851905fa2b421c0d90e6db0b8103935a0ebc6f6e590206be34849359486c2
MD5 db258e9543a455afe262089dec1563c8
BLAKE2b-256 33797d57b2b7dcf1bf60aa236e65e5e1c6ea8eca4ce21a28b36207dc1ec362f3

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: rusket-0.1.46-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 710.5 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.46-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 a6303332ba1741f964c6116dfe9c5f178fa2e353745a472f60e3d8f9552e0a4d
MD5 14a79cd473b1d9015ee74d88aa566c67
BLAKE2b-256 1d086cdbe6e98c6d17f0b2176a2bcd4decdc8e4fa62bb15e2918c591d410c97b

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.46-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 3566f10cb148a799744681390c6426c460a8727fba9fed86585a340febbe14c0
MD5 0c90bc4d4d5d06fb70676718bc013057
BLAKE2b-256 95c0139e53b82b9d06a8527d93abac00acc781fc12d1133f7144efd055513d9f

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.46-cp313-cp313-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 31917791001bc4d6b32990ce76f43090a2d55c70380a71491fa660c9520d9030
MD5 ba3e1a527448fd81e4bca5bc36bb7ae1
BLAKE2b-256 fddc3dcad00612b1ba9cc26aa1e445524fbd5306fd68848d3a5a66b107c01e96

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.46-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a2b8f6c24872ee826a00a10537b038528b4ae584380e38f60a4c9f9dfd387ce2
MD5 db35d06a320dcfb588dacdb777fb714a
BLAKE2b-256 179945e8f1fc793e180f000ebb1806bfb6b4b944f03f26853593daffaa7d254c

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.46-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 ba60c93f98001e1872c387a3b6e71190bf2bf8c096a6c6abe7f5d8bb753a3bb4
MD5 1c6de4463210d19d758cdfa8721ce5f0
BLAKE2b-256 f64d68aeb0ab05f3829becbaa24a83d8900d16df4fcdf109936b0556a7161890

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.46-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4550ced43a090f70c216a89f0703f03cb3c637e359d579320a485bd9c6bcea91
MD5 4c4eb48f83dd1a7f6ab873904ee6cf45
BLAKE2b-256 581be9ca783f98544e1eb4872b571ced1254666e1ad40624b13559b84d20ad72

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.46-cp313-cp313-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 ccf527922e7b972840bf4ee10d03a6812006bd93b74d82d66416bcbdd232249d
MD5 b43c801370fdacd16c29eadabed52c7a
BLAKE2b-256 0dfa0343408964e04358e9c3e74206ff1ea8a0404ed54e5d2e78ba88f6d1cfcb

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: rusket-0.1.46-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 710.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.46-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 070a547622ef20c9617ff61a6d549cb50ea88faf613f5d82604b3362d2986f8c
MD5 955ed9aaaa60eabe4b263245be60898b
BLAKE2b-256 a5658f7280cb8c76908f975aa7649a7cd375c02dad738e2acb49aa8f1370a86d

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.46-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 e64f6ba21ada51c0b5c23ddc4d78c1599f080e99ff608d1003b856dec9cd805d
MD5 d0993fd18ced5b7f33f04cae9635b0df
BLAKE2b-256 4b866b3ac59f0b1677eb3ff7707d41da25771501f247b13a170fdccc5540ef76

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.46-cp312-cp312-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 5e420061fb6646579f1b3bd002a299af595dead4debb0d3aca94a53bbc1638e0
MD5 59e1c5cd62481a71e45d82297cb1894e
BLAKE2b-256 3013d6d83dded5c1f5fdbbf045b4f8bbd0c4950c54c877ca3c4d33d527fd7f20

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.46-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 db395208093a9495b9d158eb8e03d5be3e23f9e9b259ae88eb993395ea1abde6
MD5 dbf1f2518d225102fdb359de99337f1d
BLAKE2b-256 5f9e08d2195540fb0498e9b134341588d470a1ef0acecc001271f54513eec952

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.46-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 07924d0a1c249fc90b08179bb3c91a5a69b3bc275bece432f2a71ff9295f8c7e
MD5 63bcfabb4bc0816803a35a90f39bf238
BLAKE2b-256 11accc200b4522891503101e8dd246933035da0d4dc9391b3e20d2ca991a043e

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.46-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 931069f5983b808f93a2da33a46739e8726f4166b8697d40414a27eaf53b72a9
MD5 1aa833faa4898600b99b47975f595192
BLAKE2b-256 11a9e1849a44a19ce5acb2d8e616654969c0fd7a3a57355014469375e2671b71

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.46-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 74dae4617433e3e5eafbd0033524fb62ec9e3800ceeb5bd0d32c1c315b31d018
MD5 10d2edc8cf71032ce40797b23d9f75db
BLAKE2b-256 9b44e2a4206745aa6fa7bd0ef1991126621a5491f1945578e0c5d76e1dd92ef1

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: rusket-0.1.46-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 710.1 kB
  • 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.46-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 6ebf31976d5fbcf37e52c98e07346d3eb62244a0f25e2c52f103fa29bb0dae1b
MD5 6f38fbcdad4eaca791f7c48903883b90
BLAKE2b-256 47cb4989eec696011c3e229aeb629d77efe283e55ce4094b7428c214caa30259

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.46-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 fd12c7c54c602fe4537faa1d60e68f96ea0db723b005d6b586e806d1e22f303e
MD5 078173932de80bcc2c139268e2fdd3c7
BLAKE2b-256 a680f655e2d012fa8d72ae085fc83adf7f88e2bf6f10cdc63abed0c15bf92e5e

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.46-cp311-cp311-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 ebb4ebacc65470f8209b3f2389cf193db9cd49724b324e598b997e2a6a1fbcaf
MD5 507da01c2850232bd4dc448ed2ea3f96
BLAKE2b-256 519f2bd9d08be8bae3490fdcab6225761534683f81267b600687544c806109ca

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.46-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 da3ac765a9b08c2e30979499a36f65db0659ac899cd97180be08ef28f8a6bc5f
MD5 8a93b4a1255738a9678255058e18324c
BLAKE2b-256 15409b35c6eaa3ead00ea9c2e62aa4f698f006bb104f14692e75bb884ab45458

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.46-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 b179965f60112cd530d6cbdc3cdd749cd465d5c64113b116c71c59dc0c418b88
MD5 163a59ebdeb18fd48d0e788091886cdd
BLAKE2b-256 4cf0aaec261f1cb6cee26c7f21475dc41044a025ed6ad09327400f011c73afc3

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.46-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 de3e3857c718b0f5038959f2e5df836e262602aa8df961627df10e13087b82e5
MD5 665a968ee179d90c2fc0b63b3fe862e2
BLAKE2b-256 68beaf728e5d9e55eeac5bd3162b3c960544c014d66c582052edb05be2d8d23e

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.46-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 4ec466c329dc64bd09b13295188affc72e83038b4cd53389010dc85012bec38e
MD5 ef0b4d618cccd000d99d789778d63630
BLAKE2b-256 3b1ad15a335abb128edfbc5ae37c72aecb7b1e734df0af099d98891fe970d0f0

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: rusket-0.1.46-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 710.2 kB
  • 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.46-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 99b16c1bf815700401267659e579530e81a3f5b11332b6cc5ecbde9b43d417e4
MD5 26b61c233652e0573e965dad4838bed5
BLAKE2b-256 bd1bc2f7dcf35a33c35b5935c643d87cc6f7dd67fae9ab2c44be8151109c001e

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.46-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 08794ffbc60a467da91c4564a2ed550be48468f901596d32081d581f4b7bc788
MD5 6f2827bd4d6a264f75b6b5734849794b
BLAKE2b-256 fdf07c4257463daff2da18f546dc62da85336055dae2fd88d9e6c6822046bc3f

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.46-cp310-cp310-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 0a72fd282e5e57708d54636892cb3cded25fb648d00e7648b2c48fbeec1940df
MD5 a3cc38245c97da47574c015805351606
BLAKE2b-256 a58f1346cfd23be70328589e3aa9dfc17f2edf6598c0e3add836f92c8629f22b

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.46-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 7de2e63ce05172d31765c65ad17c397537dc65b8ba6eb5c591b2bc8b1c155314
MD5 51d2cd72384eda7d8b900dc4781db83f
BLAKE2b-256 5393916efdcb087cc459b504aa365a6167bdd768b1244ddb0be409ad65650212

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.46-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 e064f253652ef4f43745b5d9fca9cc46d8f54a1f834e524c25b42f0792713f9c
MD5 8486db648ff0b63320522bd926d091e9
BLAKE2b-256 2bd82e697f09dbf3e163f00b80bbbbdfec84023c32c08c508e284b021c9aa587

See more details on using hashes here.

Provenance

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