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


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) as a high-performance, drop-in replacement for mlxtend. Both functional and OOP APIs are available for seamless integration.


✨ Highlights

rusket mlxtend implicit pyspark.ml
Core language Rust (PyO3) Pure Python Cython / C++ Scala / Java (JVM)
Algorithms ALS, BPR, PrefixSpan, FP-Growth, Eclat, HUPM FP-Growth, Apriori 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 ❌ Not supported ✅ (via PyArrow)
Pandas sparse input ✅ Zero-copy CSR → Rust ❌ Densifies first ✅ (CSR native) ❌ (Requires SparseVector)
Polars input ✅ Arrow zero-copy ❌ Not supported ❌ Not supported ❌ (conversion needed)
Spark / distributed mine_grouped, recommend_batches, etc. ✅ Native distributed
Parallel mining ✅ Rayon work-stealing ❌ Single-threaded ✅ OpenMP / Threads ✅ Spark Cluster
Memory Low (native Rust buffers) High (Python objects) Low (C++ arrays) High (JVM overhead)
API compatibility ✅ Drop-in replacement for mlxtend
Metrics 12 built-in metrics 9 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 from_pandas, from_polars

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

Spark is also supported: 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 rusket.mine(method="auto"). 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 method="auto"
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.


🔄 Migrating from mlxtend

rusket is a drop-in replacement. The only API difference is num_itemsets:

- from mlxtend.frequent_patterns import fpgrowth, association_rules
+ from rusket import mine, association_rules

- freq  = fpgrowth(df, min_support=0.05, use_colnames=True)
+ freq  = mine(df, min_support=0.05, use_colnames=True)

- rules = association_rules(freq, metric="lift", min_threshold=1.2)
+ rules = association_rules(freq, num_itemsets=len(df),             # ← add this
+                           metric="lift", min_threshold=1.2)

Why num_itemsets? This makes support calculation explicit and avoids a hidden internal pandas join that mlxtend performs.

Gotchas:

  1. Input must be bool or 0/1 integers — rusket warns if you pass floats
  2. Polars is supported natively — just pass the DataFrame directly
  3. Sparse pandas DataFrames work too — and use much less RAM

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

mine (functional)

rusket.mine(
    df,
    min_support: float = 0.5,
    null_values: bool = False,
    use_colnames: bool = False,
    max_len: int | None = None,
    method: str = "auto",
    verbose: int = 0,
) -> pd.DataFrame

Dynamically selects the optimal mining algorithm based on the dataset density heuristically. It's highly recommended to use this instead of fpgrowth or eclat directly. Equivalent to AutoMiner(...).mine().

Parameter Type Description
df pd.DataFrame | pl.DataFrame | np.ndarray One-hot encoded input (bool / 0-1). Dense, sparse, or Polars.
min_support float Minimum support threshold in (0, 1].
null_values bool Allow NaN values in df (pandas only).
use_colnames bool Return column names instead of integer indices in itemsets.
max_len int | None Maximum itemset length. None = unlimited.
method "auto" | "fpgrowth" | "eclat" Algorithm to use. "auto" selects Eclat for <0.15 density distributions.
verbose int Verbosity level.

Returns a pd.DataFrame with columns ['support', 'itemsets'].


fpgrowth (functional)

rusket.fpgrowth(
    df,
    min_support: float = 0.5,
    null_values: bool = False,
    use_colnames: bool = False,
    max_len: int | None = None,
    verbose: int = 0,
) -> pd.DataFrame

Equivalent to FPGrowth(...).mine(). See class table above.

Parameter Type Description
df pd.DataFrame | pl.DataFrame | np.ndarray One-hot encoded input (bool / 0-1). Dense, sparse, or Polars.
min_support float Minimum support threshold in (0, 1].
null_values bool Allow NaN values in df (pandas only).
use_colnames bool Return column names instead of integer indices in itemsets.
max_len int | None Maximum itemset length. None = unlimited.
verbose int Verbosity level (kept for API compatibility with mlxtend).

Returns a pd.DataFrame with columns ['support', 'itemsets'].


eclat (functional)

rusket.eclat(
    df,
    min_support: float = 0.5,
    null_values: bool = False,
    use_colnames: bool = False,
    max_len: int | None = None,
    verbose: int = 0,
) -> pd.DataFrame

Equivalent to Eclat(...).mine(). Same parameters as fpgrowth. Uses vertical bitset representation (Eclat algorithm) instead of FP-Tree.

Returns a pd.DataFrame with columns ['support', 'itemsets'].


association_rules (functional)

rusket.association_rules(
    df,
    num_itemsets: int,
    metric: str = "confidence",
    min_threshold: float = 0.8,
    support_only: bool = False,
    return_metrics: list[str] = [...],  # all 12 metrics by default
) -> pd.DataFrame

Alternatively, if you used the OOP API, call model.association_rules(metric=..., min_threshold=...) directly — num_itemsets is tracked automatically.

Parameter Type Description
df pd.DataFrame Output from fpgrowth().
num_itemsets int Number of transactions in the original dataset (len(df_original)).
metric str Metric to filter rules on (see table below).
min_threshold float Minimum value of metric to include a rule.
support_only bool Only compute support; fill other columns with NaN.
return_metrics list[str] Subset of metrics to include in the result.

Returns a pd.DataFrame with columns antecedents, consequents, plus all requested metric columns.

Available Metrics

Metric Formula / Description
support P(A ∪ B)
confidence P(B | A)
lift confidence / P(B)
leverage support − P(A)·P(B)
conviction (1 − P(B)) / (1 − confidence)
zhangs_metric Symmetrical correlation measure
jaccard Jaccard similarity between A and B
certainty Certainty factor
kulczynski Average of P(B|A) and P(A|B)
representativity Rule coverage across transactions
antecedent support P(A)
consequent support P(B)

from_transactions (functional)

rusket.from_transactions(
    data,
    transaction_col: str | None = None,
    item_col: str | None = None,
) -> pd.DataFrame

Converts long-format transactional data to a one-hot boolean matrix. Accepts Pandas DataFrames, Polars DataFrames, Spark DataFrames, or list[list[...]].

from_pandas / from_polars / from_spark

Explicit typed variants of from_transactions for specific DataFrame types:

rusket.from_pandas(df, transaction_col=None, item_col=None) -> pd.DataFrame
rusket.from_polars(df, transaction_col=None, item_col=None) -> pd.DataFrame
rusket.from_spark(df, transaction_col=None, item_col=None)  -> pd.DataFrame

🧠 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(als_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:

OOP Class API

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

Functional API

from rusket.prefixspan import sequences_from_event_log, prefixspan

sequences, mapping = sequences_from_event_log(
    df=subscription_events,
    user_col="customer_id",
    time_col="subscription_date",
    item_col="product_id",
)

freq_seqs = prefixspan(sequences, min_support=50, max_len=4)

🕸️ 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 rusket.export_item_factors.
  • Item-to-Item Similarity: Fast Cosine Similarity on embeddings using rusket.similar_items(als_model, 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 mlxtend Speedup
andi_data.txt 8,416 119 9.7 s (22.8M itemsets) TIMEOUT 💥
andi_data2.txt 540,455 2,603 7.9 s 16.2 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.

Project Structure

├── src/                          # Rust core (PyO3)
│   ├── lib.rs                    # Module root & Python bindings
│   ├── fpgrowth.rs               # FP-Tree construction + FP-Growth mining (Rayon parallel)
│   ├── eclat.rs                  # Eclat vertical mining (bitset intersection + popcnt)
│   ├── als.rs                    # ALS collaborative filtering (CG + Cholesky + Anderson)
│   ├── bpr.rs                    # Bayesian Personalized Ranking (Hogwild! SGD)
│   ├── hupm.rs                   # High-Utility Pattern Mining (EFIM algorithm)
│   ├── prefixspan.rs             # Sequential pattern mining (PrefixSpan)
│   └── association_rules.rs      # Rule generation + 12 metrics (Rayon parallel)
│
├── rusket/                       # Python wrappers & validation
│   ├── __init__.py               # Package root
│   ├── model.py                  # BaseModel / Miner / ImplicitRecommender / RuleMinerMixin
│   ├── fpgrowth.py               # FPGrowth class + fpgrowth() functional API
│   ├── eclat.py                  # Eclat class + eclat() functional API
│   ├── mine.py                   # AutoMiner class + mine() functional API
│   ├── als.py                    # ALS collaborative filtering model
│   ├── bpr.py                    # BPR collaborative filtering model
│   ├── hupm.py                   # HUPM class + hupm() / mine_hupm() functional API
│   ├── prefixspan.py             # PrefixSpan class + prefixspan() functional API
│   ├── recommend.py              # Recommender / NextBestAction / score_potential
│   ├── analytics.py              # find_substitutes / customer_saturation
│   ├── similarity.py             # similar_items()
│   ├── export.py                 # export_item_factors()
│   ├── streaming.py              # FPMiner / mine_duckdb / mine_spark
│   ├── spark.py                  # mine_grouped / prefixspan_grouped / hupm_grouped /
│   │                             #   rules_grouped / recommend_batches / to_spark
│   ├── transactions.py           # from_transactions / from_pandas / from_polars /
│   │                             #   from_spark / from_transactions_csr
│   ├── viz.py                    # to_networkx()
│   ├── _validation.py            # Input validation
│   └── _rusket.pyi               # Type stubs for Rust extension
│
├── tests/                        # Comprehensive test suite
├── benchmarks/                   # Real-world benchmark scripts
├── docs/                         # Zensical documentation
└── pyproject.toml                # Build config (maturin)

🧑‍💻 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

# mlxtend migration guide
uv run python examples/06_mlxtend_migration.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.39.tar.gz (124.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.39-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl (1.1 MB view details)

Uploaded PyPymusllinux: musl 1.2+ x86-64

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

Uploaded PyPymusllinux: musl 1.2+ ARM64

rusket-0.1.39-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (858.6 kB view details)

Uploaded PyPymanylinux: glibc 2.17+ x86-64

rusket-0.1.39-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (950.6 kB view details)

Uploaded PyPymanylinux: glibc 2.17+ ARM64

rusket-0.1.39-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.39-cp314-cp314t-musllinux_1_2_aarch64.whl (1.1 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.2+ ARM64

rusket-0.1.39-cp314-cp314-win_amd64.whl (706.0 kB view details)

Uploaded CPython 3.14Windows x86-64

rusket-0.1.39-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.39-cp314-cp314-musllinux_1_2_aarch64.whl (1.1 MB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ ARM64

rusket-0.1.39-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (856.2 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ x86-64

rusket-0.1.39-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (949.9 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ ARM64

rusket-0.1.39-cp314-cp314-macosx_11_0_arm64.whl (829.9 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

rusket-0.1.39-cp314-cp314-macosx_10_12_x86_64.whl (786.7 kB view details)

Uploaded CPython 3.14macOS 10.12+ x86-64

rusket-0.1.39-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.39-cp313-cp313t-musllinux_1_2_aarch64.whl (1.1 MB view details)

Uploaded CPython 3.13tmusllinux: musl 1.2+ ARM64

rusket-0.1.39-cp313-cp313-win_amd64.whl (707.9 kB view details)

Uploaded CPython 3.13Windows x86-64

rusket-0.1.39-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.39-cp313-cp313-musllinux_1_2_aarch64.whl (1.1 MB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ ARM64

rusket-0.1.39-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (858.1 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

rusket-0.1.39-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (951.1 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64

rusket-0.1.39-cp313-cp313-macosx_11_0_arm64.whl (830.2 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

rusket-0.1.39-cp313-cp313-macosx_10_12_x86_64.whl (787.0 kB view details)

Uploaded CPython 3.13macOS 10.12+ x86-64

rusket-0.1.39-cp312-cp312-win_amd64.whl (708.0 kB view details)

Uploaded CPython 3.12Windows x86-64

rusket-0.1.39-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.39-cp312-cp312-musllinux_1_2_aarch64.whl (1.1 MB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ ARM64

rusket-0.1.39-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (858.2 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

rusket-0.1.39-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (951.2 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

rusket-0.1.39-cp312-cp312-macosx_11_0_arm64.whl (830.4 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

rusket-0.1.39-cp312-cp312-macosx_10_12_x86_64.whl (787.1 kB view details)

Uploaded CPython 3.12macOS 10.12+ x86-64

rusket-0.1.39-cp311-cp311-win_amd64.whl (706.9 kB view details)

Uploaded CPython 3.11Windows x86-64

rusket-0.1.39-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.39-cp311-cp311-musllinux_1_2_aarch64.whl (1.1 MB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ ARM64

rusket-0.1.39-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (856.7 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

rusket-0.1.39-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (950.6 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64

rusket-0.1.39-cp311-cp311-macosx_11_0_arm64.whl (831.3 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

rusket-0.1.39-cp311-cp311-macosx_10_12_x86_64.whl (788.6 kB view details)

Uploaded CPython 3.11macOS 10.12+ x86-64

rusket-0.1.39-cp310-cp310-win_amd64.whl (707.0 kB view details)

Uploaded CPython 3.10Windows x86-64

rusket-0.1.39-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.39-cp310-cp310-musllinux_1_2_aarch64.whl (1.1 MB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ ARM64

rusket-0.1.39-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (856.8 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

rusket-0.1.39-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (950.9 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64

File details

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

File metadata

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

File hashes

Hashes for rusket-0.1.39.tar.gz
Algorithm Hash digest
SHA256 63d26d2c625f69c3eb63f8266372401c4ccc8bb9b5f226ca8fb0d9c409eeb27c
MD5 2d5195202f0b0337133e90a9af33b2a3
BLAKE2b-256 bd10ec21c64ebedc8e7132af0f9179adafa250198cf7b114f2d41d815b8bba0c

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.39-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 f34008a591d694d5e78e096cbc298495b6455728c7282fc3a8b40ad346b568a4
MD5 1b447826fc317c951e7f5aa249d39bf8
BLAKE2b-256 f24fd13c7440276626efdefa83f5722d8297f8c9e8e7bec9a64d4120f3722293

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.39-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 9c9ad6825c4f53c8f1bebfde24bae252b3ed57b7d581235df365321e46afc515
MD5 4c377366cc6c74ab1cf65146e5f712c9
BLAKE2b-256 38cc9e11af759f0e71e97f2196a57011b6d453a7dd4754b24f31cc09a60159b4

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.39-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 01c6698203191aebd7df92907dba607bed4d23a7723e5f9ea2e45daa67ac66fe
MD5 00b4f0ea1c167ae73165da91efe83a2d
BLAKE2b-256 cb9c5620eda82d0464cf325f11b0df60b152dd69a9fcc565022278fc98fa499f

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.39-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 137ed81d1fffaa6e625d87c919450daab6cfd94cd2f12e428c322824414504c1
MD5 a5b0e74e2a18910799ffaf032998d23c
BLAKE2b-256 bf9131de657fec7490e4bf7e78ebea72a25a9fc34c97f64d5569c7a1133dfd1c

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.39-cp314-cp314t-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 c4c2abbad8fb8c0dfa6ddfb4afc03f897fb935efd3602edf886df4f05cd5e915
MD5 a50e0b67ef09eb0013d00ca931122d21
BLAKE2b-256 0640c53ad99a300e04373fe10c802f0825df29fd9c14a3705e268a957255cf7d

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.39-cp314-cp314t-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 1716c2564b55357613da489f7399f11a669b3aee084dc2fc70533df5979c3c8c
MD5 e51d6575950a57cde1cc9d0d187f3fc1
BLAKE2b-256 2d5ced2d8d89819ace0f2334fb3ae1e2a6741c28b36d3360ae50a60a2b91c61c

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: rusket-0.1.39-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 706.0 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.39-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 78a0169ac96313357160efaa11be16693f75f3760e3e9bf91ba2537a93023c0c
MD5 6a341acb6d52c973b705410d4109d8ca
BLAKE2b-256 22cac2e2faebbb12603a553168b754763e97ae299db83e46f0261005d10e6077

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.39-cp314-cp314-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 b8f0427c091987ffbdb1ad771d1335c235e9bdbe35ade9369a183656c596c1a4
MD5 8cdba23de5a4faab0c70c7f653892c86
BLAKE2b-256 55a4e07baed2f110e1c7039883c2a381bfdef36a7113c10a5ae360fb122f0b47

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.39-cp314-cp314-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 6b94b48622b1fec19138906e223b57ce38dd5ad770d9cbb51d6b856163927d70
MD5 7e5ceca38ee2a04a8cf8042e0fcc7d04
BLAKE2b-256 a6ef96699089ea2190032c2139a81a8ef1d3c2b36019f33e36dda1adcf8df7d9

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.39-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9f6236c20a1a288593c1c5464fef0b44684bcff63a2c71b3634e5099b7d9ba89
MD5 de3724aa497e2f110ff90fde80eeb475
BLAKE2b-256 d82fdb09f4151e55b17bd14b9715e59766e4838660cb42c094e9037656ffc231

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.39-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 56b657ad5beb5d0dbe81bc0e8f480764de95f92505449a8e38ebc91401ccaf31
MD5 0789133bc4babfc6feb6d3782ea259f1
BLAKE2b-256 51a0aa89584c46278edeeb8a4d6dae8f4e51aa98b1b5ca294202c13b76aa012f

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.39-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 975240771ac0045e3198cd63960a23f37d38907f4cdca6536727a3cb8d9ff2b1
MD5 f7e75ecbfef5342bfd43dad6ba31dc67
BLAKE2b-256 a5ab7fa295afd7ece1d3352a41abfd9a84c8b0feb2da5c010c3d1876b55ce375

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.39-cp314-cp314-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 fe85e5b3171d2c27a0c92704e13c0ef538f476bdea8b1626e888a0cc5b097d6c
MD5 9f157850747304093a9fde049f25641a
BLAKE2b-256 2bd7b182bc635c00bc7c69298f47705b45b962634c3fd44a6509a1c9c5b863f0

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.39-cp313-cp313t-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 1ee9866f77a5b4ba6f5b7586b42c733baeacdd45c887395e535f410e23eedd91
MD5 932a57c56393c56508d26ea00e1c353c
BLAKE2b-256 dd8d887e2b285e11ac5ec8726c143e255fff96e2151a8b241089cea4c846032d

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.39-cp313-cp313t-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 8cae90ed098a7db41440ef8c2c563638983c706092e4ea0c29642dcedab6c434
MD5 eec203d2a836992923ad2b575cf8523b
BLAKE2b-256 a89f57fe720b2bb2407ea2feeecb82e4fc4038d3267255ad8ab1959d73636a3b

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: rusket-0.1.39-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 707.9 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.39-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 e3ddb172246cb4033f6d3c055fdf1643c6d47e31baa6d1116358d5d67a8bf55a
MD5 d9093aaac3e13c511eedab24c8835848
BLAKE2b-256 57ba8401108ec4fdd081910e1a424bb6110cd0f9c5a842f23ce8b9c8d55f3106

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.39-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 2c63742a4469dc7ba1de4f5fbea41e751e2e4a1438728b9c3e58da148780529a
MD5 632155b2fc1f52cf1cf0f8c2a398606f
BLAKE2b-256 9a8b587b7772007f6d3af6b285e8b6d03b663021de65e57c3c3979d5e0f68875

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.39-cp313-cp313-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 deb648ebda8a147aa77a5a35aa40af2c397f59c2cffa21e56283abe91298e202
MD5 e36db111b0f6342bc0498379465b2926
BLAKE2b-256 d8fc3b6ee19ed7cf1c93d038d710cb8f79432b203e1cb2c63f9b2a52492da5c7

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.39-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 837abb4ed153b1541cd38a9e4a063344cae7e96fa274b962c506c1b47d61eb3c
MD5 efdfb26acfa5f1d224ebbb576cac48d1
BLAKE2b-256 51fc488f843fe2950139c4e3b5fafbf34e189d3345c0e6e582f3ffae90e225ad

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.39-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 e9b3ad1cc33b348fcc1455ccbf150dc69f8d440c1af8385d69c04769eb553202
MD5 34f5843e308b03281791d8cc82b6491a
BLAKE2b-256 e1a4bc085c2031c96c2c0b278ad02e2476a1dfd22a2b758c22034b4fdd31bf2d

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.39-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7854dfaad42d080c210845805d7bd3c8b1250f97c54f875941ddcaa8ef6b96b6
MD5 171d5a068556f2a34a4a61de9c03981b
BLAKE2b-256 62866f8611d4e8a354475e033d0f2d4ead42c946aa982e6ff77a452e5a0252e3

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.39-cp313-cp313-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 63e08f4663bb3c52a7e18ec4d58e1539708495dd8b3a56341032caabee81d55d
MD5 7a0ad130a913f5742032c4ccbb0394ae
BLAKE2b-256 1e7b4448d372fa47806e05ba3facd7aa098671e499546742609312f249eac0e8

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: rusket-0.1.39-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 708.0 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.39-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 46042ddbd2f8b4f2cc98c24fcd5d810e8c125c178b67580b4e462b63b811f81f
MD5 5b0b02645d4a76c7c08abde9eb6e3699
BLAKE2b-256 653854dd7870b6723ce62e35c63453533b6e9282722e4847c035aa3e2d7f5599

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.39-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 5357c48e29185973959556c878e9531eff589035b088b34d24d364d16dad927e
MD5 39f71967afa4d424f507341b72b468f2
BLAKE2b-256 52d11e2bfef8efdf7e3ff1a37c5ad0141d5b62430bc7d5f3d7996596bd88c242

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.39-cp312-cp312-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 f305f21b9050978627661dfd39b29043ea436bd579f030c0328d2f3724264788
MD5 9b603ac1dc7bb0b6a0c62598ff05ff35
BLAKE2b-256 d6659de1e0994fe3d8fdbb7b51ff731389cfbb5754eb50cbc3157dfc62099904

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.39-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 004c93da5cedb4ca5956f36ca90fe37e9a1d21f205e91b22e0092ac548ccbc96
MD5 005bd2db5da33a4a8015d9fd3b75331d
BLAKE2b-256 f9974ce7a5f083026a8ae14e510280b497e69ca5fa1ac2d49d67fbcf76c8a92d

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.39-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 bdd9d10eacf482c8ff2853f1a84ebddc54816da5bd5283d262ee0bc6511391e4
MD5 17b214edb7d73d6f0136abe13f9818ad
BLAKE2b-256 6631d3c090c1c40da80aad56a40bac61eb2fc49cb8aa7104ec2dee85f7232a8f

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.39-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 779df81a4feaa25605330ceeba4fdef5431642a76a0e79ca1acfefa8f823b2b2
MD5 b7b738c5d18482a8ab56a1329ebb8c83
BLAKE2b-256 524e45833e02116def903d5c575f6fff8ff617c6dd155a0d639c75e32d6a8ad1

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.39-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 77aff5cc5b80d34489a71d5f7ae2fe2dc6ccd7fe325cefc5b5042e3c4444c4ae
MD5 9bbd9f0d4ae19dcf23c989d19d7b303f
BLAKE2b-256 94b220406363b38686776f4aa30fb2d4c9dc3bc1240193265c7e5bb27c7f6e69

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: rusket-0.1.39-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 706.9 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.39-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 063dc31f184f72f15747a26028a5a5617537c380c63eb04c45b860cdb5af8e68
MD5 6d4b31e2aef0b8f35614ca7ac689d2ce
BLAKE2b-256 276dade3dc1aaeec71df9b3a10e496eba471edc53d4da9ba907dbf9d9f47ddb6

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.39-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 90ec37adb675870bac6d932d78850712b154b20ebd11eec19e515f4191214d55
MD5 35dc8b80787b196ec1aa257d8362b331
BLAKE2b-256 ae9e619bf531e88c260702769c8de395450d17775cbb20a99e6eff82030e020b

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.39-cp311-cp311-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 2d5758022c2afe68aca4bef94417108eb5f72806a0e104e6f66c2a1f38a7f954
MD5 53d5c278d420da47e290de1aea70bf3d
BLAKE2b-256 f176c1058fd5460dfe1786809b9986d358f11c5886911de958eaf01bf1d82620

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.39-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1fd6ca6e3277a5e482577c64c395c7384f1542d9ebedc684735ca6171a15d44f
MD5 27d799808d8f08ab5518b1fa09486264
BLAKE2b-256 d09340cae9f8c196971fc6451e933a0f877c6e1cc70809274b195266fc70ce75

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.39-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 6dfc3e04c4769930320c53bf0d40115815a225bcc8a71b68a73148ab9b445784
MD5 eee9b8ffdc49597a1a851aded8f00d5c
BLAKE2b-256 e64b213a62cffb0f0393aadd929137a73857a64f03e2ab2b135585eecb7fe195

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.39-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 75e3f14a5fa7beb50c1f4a4752c0268e0c2d2ccccbea441843308110800614cf
MD5 54202bc0a610b1247e6c44d7b3c9f872
BLAKE2b-256 a2dfe8cd62067404024824ddeb7c2c127de8fe234bee5267e409c881e71bf958

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.39-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 3b804a7265cce2047d67ff39b89a9ab8f95cfd3595a90d9a93b62bfbe48b2cef
MD5 477e11217d8eb5e7ad6de6cfe2845c65
BLAKE2b-256 9393d1b43d541291bb20e950f6a909d76469f8c10ffb6a05c51dd4bcee737e40

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: rusket-0.1.39-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 707.0 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.39-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 f18a7931894ce71f5455e79eb2f63a29b25b4714004dff354214258eca6f2429
MD5 a3d566d48cb8d0ccfe812b5686bf5d25
BLAKE2b-256 09f37f1ba0ab3ef29ad68948c4af863c79f84357d4db3bdcc4fe0321822278c5

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.39-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 a22b08a09c3b73f7ec83875dfc6515deb85ebecfa93106cdaa815d5ac711b5e4
MD5 ee26e37ff0289066d1ffaf18cdff8e0c
BLAKE2b-256 6f2c919ed4a3694b6c503b6d84e138bd6c358a8e08d90e4da0485c2382ef8ed0

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.39-cp310-cp310-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 d110ed483b5fcc8eb09994bdfda34c4c3f430be97f458f2618225c1588c18627
MD5 44f9db3e029490e1616d0cd35ad113d1
BLAKE2b-256 7614fb3a515755594fd6a02574cbe75eb033e4710b62d1fc1027588f279ed535

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.39-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 15912905e3694c531b0b0cb2b87f44d16049f5449fc8d0a422b19a5a067e4aa1
MD5 2d75f1750f2caa68ed5c00156e21a8bf
BLAKE2b-256 e01057aaefd75ed7d20a7b7164c4e933f544fae35af0c33aa18ff38b80b8a759

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.39-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 2de51bbb64e26615550aaf07486aabd5d6e9a0208859d659b460fbcae845f2d2
MD5 463aa9abe47a6d5f857e49fb3e8c5515
BLAKE2b-256 6d0173698feb3d9a3bb23ed4e3a7a6fc1f991914555be6dc3b180b31913d2569

See more details on using hashes here.

Provenance

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