Skip to main content

Blazing-fast FP-Growth and Association Rules — pure Rust via PyO3

Project description

rusket logo

Blazing-fast Market Basket Analysis and Recommender Engines (ALS, BPR, FP-Growth, PrefixSpan) for Python, powered by Rust.
Made with ❤️ by the Data & AI Team.

PyPI Python Rust License Docs


rusket is a modern library for Market Basket Analysis and Recommender Engines. Arrow-backed, fully compatible with Spark, and written entirely in Rust (via PyO3), it delivers 2–15× speed-ups and dramatically lower memory usage compared to traditional Python implementations.

It features Alternating Least Squares (ALS) and Bayesian Personalized Ranking (BPR) for collaborative filtering, as well as FP-Growth (parallel via Rayon), Eclat (vertical bitset mining), HUPM (High-Utility Pattern Mining via EFIM), and PrefixSpan (sequential pattern mining). It serves as a drop-in replacement for mlxtend's APIs, natively supporting Pandas (including Arrow backend), Polars, and sparse DataFrames out of the box.

All algorithms expose both a functional API (mine(df, ...)) and an OOP class API (FPGrowth.from_transactions(df).mine()) that flows naturally from raw transaction logs.


✨ Highlights

rusket mlxtend
Core language Rust (PyO3) Pure Python
Algorithms ALS, BPR, PrefixSpan, FP-Growth, Eclat, HUPM FP-Growth only
Recommender API ✅ Hybrid Engine + i2i Similarity
Graph & Embeddings ✅ NetworkX Export, Vector DB Export
OOP class API FPGrowth.from_transactions(df).mine()
Pandas dense input ✅ C-contiguous np.uint8
Pandas Arrow backend ✅ Arrow zero-copy (pandas 2.0+) ❌ Not supported
Pandas sparse input ✅ Zero-copy CSR → Rust ❌ Densifies first
Polars input ✅ Arrow zero-copy ❌ Not supported
Spark / distributed mine_grouped, rules_grouped, prefixspan_grouped, hupm_grouped, recommend_batches
Parallel mining ✅ Rayon work-stealing ❌ Single-threaded
Memory Low (native Rust buffers) High (Python objects)
API compatibility ✅ Drop-in replacement
Metrics 12 built-in metrics 9

📦 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.37.tar.gz (124.2 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.37-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl (1.1 MB view details)

Uploaded PyPymusllinux: musl 1.2+ x86-64

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

Uploaded PyPymusllinux: musl 1.2+ ARM64

rusket-0.1.37-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.37-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (950.6 kB view details)

Uploaded PyPymanylinux: glibc 2.17+ ARM64

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

Uploaded CPython 3.14tmusllinux: musl 1.2+ ARM64

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

Uploaded CPython 3.14Windows x86-64

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

Uploaded CPython 3.14musllinux: musl 1.2+ ARM64

rusket-0.1.37-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.37-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (949.8 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ ARM64

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

Uploaded CPython 3.14macOS 11.0+ ARM64

rusket-0.1.37-cp314-cp314-macosx_10_12_x86_64.whl (786.6 kB view details)

Uploaded CPython 3.14macOS 10.12+ x86-64

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

Uploaded CPython 3.13tmusllinux: musl 1.2+ ARM64

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

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.13musllinux: musl 1.2+ ARM64

rusket-0.1.37-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.37-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.37-cp313-cp313-macosx_11_0_arm64.whl (830.2 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

rusket-0.1.37-cp313-cp313-macosx_10_12_x86_64.whl (786.9 kB view details)

Uploaded CPython 3.13macOS 10.12+ x86-64

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

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.12musllinux: musl 1.2+ ARM64

rusket-0.1.37-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.37-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.37-cp312-cp312-macosx_11_0_arm64.whl (830.4 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

rusket-0.1.37-cp312-cp312-macosx_10_12_x86_64.whl (787.0 kB view details)

Uploaded CPython 3.12macOS 10.12+ x86-64

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

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.11musllinux: musl 1.2+ ARM64

rusket-0.1.37-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (856.6 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

rusket-0.1.37-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.37-cp311-cp311-macosx_11_0_arm64.whl (831.3 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

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

Uploaded CPython 3.11macOS 10.12+ x86-64

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

Uploaded CPython 3.10Windows x86-64

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

Uploaded CPython 3.10musllinux: musl 1.2+ ARM64

rusket-0.1.37-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.37-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.37.tar.gz.

File metadata

  • Download URL: rusket-0.1.37.tar.gz
  • Upload date:
  • Size: 124.2 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.37.tar.gz
Algorithm Hash digest
SHA256 d858c9b400d23a2d57e7791b433cce27ddbff8f85c3efd75db740755bf151753
MD5 f51a5864e21a41ce3abeb9e9e15f8eda
BLAKE2b-256 125fec86af30631501579c9c6f84db7b36edb45cacb1f5ca0f0baf467dfd7948

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.37-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 35a0a1521008a0e92a85424b068641814a1d616e3d3a5e373e9c65f841816d00
MD5 fa741e1cd66f56fbfbb4c8ae23f70851
BLAKE2b-256 ac37dbd4363da7498a22b083a84b4f0414d24b5aa5a7b7b756c9a2bba5812f38

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.37-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 7a70d316d29760dc1ae0f84aa5267bca3c0c54c5f02a2b787e971f8f25399616
MD5 4dccdae2698fd3678bdfe59d44a26239
BLAKE2b-256 91f1890d0b6aa64aac2c2f01855fbf2d9ff4e79cb85737d628da3d01c0c28024

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.37-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3a6c6a573f2155520bd9815ad0b0ef22bc64f5d69e2d43fef7fc1a4619c1b191
MD5 7211ffe1700f29022216a9aec21de7ed
BLAKE2b-256 fdc967588b4d4273b4d50b041363acb9a309f6eaa08aca65876286d0a40c9579

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.37-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 b1480d4fcca94fc30bdc989832ed4f7029e9d0a38741cab66dc1f8acb2bac334
MD5 55a9b9dc84500a4cf635698786252d9a
BLAKE2b-256 0dd76d53c7e61acf5d36836a51193132f624c9c0c76b9e3776e99ebed3619c89

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.37-cp314-cp314t-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 9ef8038b258b0ba3a5a47f05b8084460774929347e6ab074940e224393a0bba6
MD5 9066041829619a625c2ac84d49dfe6da
BLAKE2b-256 14a2f69560209725209ab708e88736d5201d238d2e6ec1bd16afa74059cd7c7b

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.37-cp314-cp314t-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 ae1596cbf55d0d1929372cee037c715c248b1aed3ea2ab9bece832f104eb5db3
MD5 b26be6a499fbc7589d8d3894c161c6c4
BLAKE2b-256 1510e9bc461ec9fca6e3b81108ab9c4216e3095babdde880dc789c7299cd9b4c

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: rusket-0.1.37-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.37-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 4f8e9cf8094e3f5a27aabc2f70645fd14d7b3ff8a140018bfa6d1adf02bb2596
MD5 3af6ed26f8de4597d7f4f2be801ad58c
BLAKE2b-256 e407fbd1344fe34f5e6897e7a4683bbb0d96d3cf8110823d9c190ba00454d8cf

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.37-cp314-cp314-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 8af53c385f42da64ec3f56a8d3c08a0a47e861e20951e55c5918ecd124fb44a6
MD5 dc05cd1c8fdd18511f6ccd91091b83c9
BLAKE2b-256 6066ae4426e6d7d34afd1367a2f9680d87f08901584d33abce1132783495378a

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.37-cp314-cp314-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 6dcc38a59ff8e980dcac5cb3a9d7dfe61dd36691b33f1e6197041261f914da71
MD5 a76ce9c794a7eea82a0ca1f9fdca3f8a
BLAKE2b-256 e00a227e0b05ea83d45fcc7d2b0fee4caf08cdab4bdf6c22af78863f257cb55e

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.37-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0dab7cdbfe5567a53c46d1bca73cc50f33227bfad887dbc72945fe7a6058af6b
MD5 61af235b3cc601622d15b457f283f464
BLAKE2b-256 91b4c8c42aa51e8d4854c8d18b08784342eb7ba43dddaf3d4aab8b00a5fc95b5

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.37-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 cde58934246e190b289d0a79198289375df80f414d7cea02c9f15893f3106b6e
MD5 d9da7f66e1952a3d070f94156acd871e
BLAKE2b-256 de674e6ed601f4051cd2f0bcb17f2bef8f6a2a359475452bc51e4df5327f73b6

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.37-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4640e5cea64954a0290bb011e3d498e4dfda9d34059fecddcd649f77db2dfaa1
MD5 ec9c20eecf48165ce43ddb0c700992fd
BLAKE2b-256 3c58294837379219138091bd8b7389d2779b22f0f5b300ebaddd4dc4422cfe43

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.37-cp314-cp314-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 0a79da4998ea39372665fa2321c63e5d280ba8fb07ae1c98757cdd2ce2900430
MD5 04768aca9d6c290f085127fdb052f2b5
BLAKE2b-256 c05a3789febcadd8952922e8218275ed30fe4b172404eb270efba9a177ae6d1a

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.37-cp313-cp313t-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 669b65095faf8bee950f8ced46649eabd7b1255f4e85c75966940be4e3a838f7
MD5 ca4abadf807580aaa117a91f40c0bd15
BLAKE2b-256 9c0986467587e138851d2e669d9ac7cbf581ca1ce2b52cca053ddc3c9d145c84

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.37-cp313-cp313t-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 602696d04b28829a9cd5d9a7438a165fea14c3c5639f498914bf6567f86d70b4
MD5 5eade4d7c6e074c1ac4aeedb07af61c2
BLAKE2b-256 1a8203f0930410b4f65641a9f3f92956a88fbcdd7cbb89101ab14b41424f2055

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: rusket-0.1.37-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.37-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 6ed194a25a53c9bb833915b15a0c625d83a126ae37334dbe5080de6b30c379d9
MD5 aa2334f8acc50944aeeeaa0ceafaacee
BLAKE2b-256 6417780475b077619c783f40735dd969f4f5b1f9a4eb8cd25322d257b3299d3e

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.37-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 3762ccf1fcfd100640f264ca5c38d4a6df902be98259daf31cb81ae99c5afbd0
MD5 ba2a18eaae92dc87a2482ab3c2288169
BLAKE2b-256 a1585df4975e513c00f07d199646038d6bf1e05e8a510c7689fb1539c88d455f

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.37-cp313-cp313-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 16d9db09ff7acca003b5f88464ae308acc5ec95c590d65aba08f827220ee4841
MD5 2ee9012affc84ce033e8a7340328d409
BLAKE2b-256 45d3c11bb5d1dc90f52bbc22d339d6f1093002ce390d0dd69854ca3028a9e6a9

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.37-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 03d5573b4b436c86b3e1f5bbd89bbfd68239fca578ba7128b802bff85357d170
MD5 722710296a045eafacceb8e3098c25ca
BLAKE2b-256 aa9e17f61c4fc4da9a4d3fa49e1b57d3e70f32cc06f74a254a1a881ada9f020d

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.37-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 6e1f5d405a37a57923a561a8cfccc5c23ce4521f7046c38d9339ec69260e472b
MD5 837ff32a220d212340dc95660b58ec94
BLAKE2b-256 7246559ff72e2b6339c1d3815485e162f57d944101baf10cde97d75c4282f072

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.37-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 93c7966eb7d9e093e65289e2d09957fbd099104eda705bd08295cebe56b1627d
MD5 382f0a1e6e1755a76ff69a94d37e287b
BLAKE2b-256 520efcd94fc625f0a8b643912af83299bb6bfba7cbdda27683422daf5f64e213

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.37-cp313-cp313-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 c14e1b96e73ba6c46dc382b3e60e039e69773385efc757ec43320cefcff60575
MD5 32d2f7e1bf98e924ca2fce0fcaaa6251
BLAKE2b-256 0fcf3469e4c61df26e439a0f47c805eee3c6c702fe5553f23c2c94ff153f878c

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: rusket-0.1.37-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.37-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 63a1922d18c5fec89212d2bcd54ddb7b8f0273b0e72a91737ace7723d9c27486
MD5 3e5da9b04819f4569e7607d6c8e10073
BLAKE2b-256 4670083371e2daa29a97ce1cd7e41cca899ea0c202c5feb3c39f3adbd512a3d0

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.37-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 501ef944eb92a0680a7a3a2907fc6fb556ca9e4866ae3b5cb12deed92ed210aa
MD5 eecc079fbaa76bb84af0a53bbc967d0d
BLAKE2b-256 66411b09ed91bb3447bafdbc94d7dcdc7b60c74e700807a140cfe0711e333b83

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.37-cp312-cp312-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 4e2f26ae08d8c8d54d50bafa71607eec8cd915d73355cdebada546f9c76e2bad
MD5 dc46fed81a321bda5439de91cf58aee1
BLAKE2b-256 4a2964a20efc1c4612e42dffb2e7ad9a8656983a75e593f30ad3ca9ef7e807fb

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.37-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0877752b07b996cf7bb5a7eb8d4da064b2fdde01716b2d9c9f85fff3c30cfd87
MD5 78e8cdfae8cf2b5c5be99df3e498488c
BLAKE2b-256 92fbaaacfa7b138a38b489e49bfd4f78ddeb1aa373f5afb2b9d75b190de71dcd

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.37-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 c4fb7aa38ba9c9f7133cd8b09bcd0a7a5bba7cd60c93f12bbc4a24eac0f361c4
MD5 8a69de35062ab5ce4e8c9b0bc2aae6de
BLAKE2b-256 5bfd8a1e70ebb3462a23a743b21c5cb03a8079f63fc584eef82d0b59fe912f4d

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.37-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 85950a9bd554e5bf5c0dc648697f07b0ec2fed8b254656cc58ac40d637fb9119
MD5 54ee5c1c5d635b64dd4afe93cfe19230
BLAKE2b-256 5731654c6e1f2d7eba08be23934adf0a2639fca355257c81527d7c8ac9f93a02

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.37-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 be4dc0f792f2e48319e980877b6455daeb3b847909545f6d20840886b4605ac8
MD5 ac90b1e36a4c4fe073ee649248000781
BLAKE2b-256 89e22d850635340901075acff116da41d587ff1fac56a969d6c36f6b19d2ac1f

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: rusket-0.1.37-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.37-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 023d80f18292f5824f3fab2d2aec237d93aeb8afd54ecef54c2849cc29c3d1ce
MD5 e15f98c48f00bcd0d3bd3983c86f39d6
BLAKE2b-256 79ea592757eda01628bcd1ed6ad412635d8ddfdec4fe7247a4c921bf975bc743

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.37-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 fbe9a41b396e207662fbb6a53d2bc7ad2caab663b262bdff9331cd50f5de3231
MD5 2cdc917a16dfc5dbe030a9ad4d8c4af7
BLAKE2b-256 5cf08c4e3d4fc9f39689b00687bfb669f577fad734dceac7fd24251db91fbfa7

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.37-cp311-cp311-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 b5a7169cae303f1acb9bf01d1d970127384e734089ec2f3171026662f6d5d281
MD5 da7c11802acc3a5159fc3af84e1de19a
BLAKE2b-256 975ca967ef26f893a053923115a64248c3e2feb7e559e6d342b047e8690015d1

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.37-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 30bb8e9790216012e63b793948b6a4a76efbc3c44384a9cbac3eda3d81739ef9
MD5 5afde4f279c759b285dd32b715f1be19
BLAKE2b-256 3606c80ce9d8467146a1dba131d656b4ddd96af31a8fc86d69cbfaac6574dc9e

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.37-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 bc412cad108dd241f8efe75bc306b57f105c2dce16d0b49111070ea2558e359a
MD5 436690e0dabb6b462a59983f88a0b5c7
BLAKE2b-256 8dd3dc570e0e2771d6abce8824397b0d36cc6c0b3901e48fb0aa66f3d823d6f3

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.37-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 71cf9bb4f85945c0ec9ecb549db6b193eaab435ae44b6537dd764cd4e642b8cf
MD5 73d803475474757b9fcabbfdd2967663
BLAKE2b-256 1732443db12464af35a11e4fff324d5441e622053685c52369c794c199b50bd9

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.37-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 440ba783237ad65c3c516dee4548a0f9f5bcd35ba4303744ea187ec64ae61fa9
MD5 988c8ac35e3d2e5c36f45001fb591d87
BLAKE2b-256 863656d9f742c25c2cfae290afac8d4e2363c5fe6a3fb8d6f1ff89d5b5e61eab

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: rusket-0.1.37-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.37-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 9124f595ebdf24a1cce7d15b169e5c0ca56735d07e5282668309fb3a2e52cd65
MD5 9fa9e6e83845494a7042665f9db9fdb0
BLAKE2b-256 352699501209c25b10d7229ca8afb170a49255fa09cd249b6681f7cf5e7e02cf

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.37-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 acf45208ac1d29b2654cc59a0b16c16572d81ab5c0157be933012a2d43ff65b8
MD5 4e79edc71b3b6b7f084504d886abdbef
BLAKE2b-256 746e8cbb54812e8c14e65281960c8c80f82069d7dbeaeceabc4e28ff60300014

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.37-cp310-cp310-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 2336eaf237c04c8944bced088aaa8159d4060166fff067cb986bd0f070b0b3dc
MD5 3ee1b379e54fa1740ac140aab08b2627
BLAKE2b-256 e45da3f84be3faf63cab38fe31b2dcad175c1401cdd620c3410fa1446d0b1037

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.37-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a646e082eff412f22a89e7a9def574ac96fb1571f89743e35cf5eb2ca66e2065
MD5 2687c6b0cbf6dd993b5420d2c292cd39
BLAKE2b-256 c720cc46837f07cc3301be7d23d6d8c317939e10ca9ead725801e900b4fc1d28

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.37-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 ab9ab9345d3915feeed30b88a426d090a7c5d417f97d05d5582cbacb708fe255
MD5 d94c21ca81f4beb0985793db91eac45f
BLAKE2b-256 0ba4f2895a916369bfab6798ac263580a5d2d0eb3a00976dafb2ff5d920a4771

See more details on using hashes here.

Provenance

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