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.35.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.35-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl (1.1 MB view details)

Uploaded PyPymusllinux: musl 1.2+ x86-64

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

Uploaded PyPymusllinux: musl 1.2+ ARM64

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

Uploaded PyPymanylinux: glibc 2.17+ ARM64

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

Uploaded CPython 3.14tmusllinux: musl 1.2+ ARM64

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

Uploaded CPython 3.14Windows x86-64

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

Uploaded CPython 3.14musllinux: musl 1.2+ ARM64

rusket-0.1.35-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.35-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.35-cp314-cp314-macosx_11_0_arm64.whl (829.9 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

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

Uploaded CPython 3.14macOS 10.12+ x86-64

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

Uploaded CPython 3.13tmusllinux: musl 1.2+ ARM64

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

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.13musllinux: musl 1.2+ ARM64

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

Uploaded CPython 3.13macOS 11.0+ ARM64

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

Uploaded CPython 3.13macOS 10.12+ x86-64

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

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.12musllinux: musl 1.2+ ARM64

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

Uploaded CPython 3.12macOS 11.0+ ARM64

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

Uploaded CPython 3.12macOS 10.12+ x86-64

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

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.11musllinux: musl 1.2+ ARM64

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

Uploaded CPython 3.11macOS 11.0+ ARM64

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

Uploaded CPython 3.11macOS 10.12+ x86-64

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

Uploaded CPython 3.10Windows x86-64

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

Uploaded CPython 3.10musllinux: musl 1.2+ ARM64

rusket-0.1.35-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.35-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.35.tar.gz.

File metadata

  • Download URL: rusket-0.1.35.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.35.tar.gz
Algorithm Hash digest
SHA256 8830f687684629276af7cd9d3f542ad0499b60c3ed8cb4351cded84f2bca0cf1
MD5 82dafeb221c42f657448d420e8ad50f7
BLAKE2b-256 f4e9a6180d3ff846790ef11b95e79dfa4a364ef50ba269f20cdb063073e294cf

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.35-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 c1f5046cbc5632c763c4aa680fd600f0dfe8fb4581dc5bb2bf44d82857e4d052
MD5 d596669c2d823ea05bb6cf9aedbb24a5
BLAKE2b-256 43651fac025d450e4e1999307d11e5f9cd879e6351d4ebc3483d24b4707d77cf

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.35-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 eb996c6bdb77df48bbbc09fd50c9d175d6856fb278a2dab1f5791cb1a2ad12d7
MD5 614eac616a5dcf36534c88d463a548a8
BLAKE2b-256 67958bf1055e08143fd45e64c85ec54d7af6c2bb982f5beae5a5090d24658c93

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.35-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 471f438484f74fd67276dac13f86768360ed14e04248a6cc41d72a3fd20bc9d1
MD5 5c1116f3eed2905b84ec4888bf8ca72f
BLAKE2b-256 75ee430f36ea52cdfdc6ec30575a6268c3b0db0235c48d60a311d6ab7fc5d5a3

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.35-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 86f075b265aadc4ead2e598418da4c8f5843a5af4fa18db5acc39f5c00dbe13d
MD5 adcc53c515c59e8618f1eef908537e9a
BLAKE2b-256 f03599ab69d4617206dac0e4c817206b806e19983320fbe0e34df9e850901267

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.35-cp314-cp314t-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 9670ca9cabb4a557adae41e92a692cae2653f55d443dde2b1ece00d16120ed83
MD5 ae3da1b2a6dac8b562edf0815d2457e9
BLAKE2b-256 23225bfd17a19d03bbc7b139414d03d5a8c6d77a943c82f81b2da72436f95b96

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.35-cp314-cp314t-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 eb10516c251cb86e1afe9679beb6c335549a0588634a3ec58fc00311bb618a21
MD5 5a8a8a9d5114c16be538c5c466992227
BLAKE2b-256 7f22ca1eeb6b0e21526be1d4fa5434e2077fb638cfaa5948e550db4cfdb89bff

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: rusket-0.1.35-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.35-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 d4c79345a17e234047f36463e840673462733b0e5c12afddbea86fcd06851389
MD5 f5aed7eebb13bb8f17bc4bf597ab9f28
BLAKE2b-256 f99232307248f618b991f7e02ce036f3c0b9303dce6f34d40d24a1670ca1ea90

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.35-cp314-cp314-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 d5edaab06da8233aa11f94163fa726fc1491f38a89c417e40fe5a311b4df28c4
MD5 ca39058119cc1e2a9bc15741e5728e9f
BLAKE2b-256 02e77452263cffe290f4251081493332e050945d67c1d09630b2012bbc9bab0f

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.35-cp314-cp314-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 9cca60bf35697270f9cb5535f736d5f222ce08a10eef6446c9547e10896ac6ea
MD5 811500daced02bad403ca1e3fc5dd443
BLAKE2b-256 166b016397444303df0bf0fcc1d3dfd591fb4a9f0a5826fb6a0ac9ae094d22b3

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.35-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 61a9039ef06e2d6637a51c9e2e49eeb93daa5e061a28f5edd9750bd2a3aa2908
MD5 744023a875e7352e153960aa3c8a1b2e
BLAKE2b-256 5c7671560402e280a6a3ec308dca9a47f2c849169ad75715ffabf1e050867f82

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.35-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 5af333f743663d514af1aa8c2e5929d8c01b260be9d3278d1d9b42947172e642
MD5 300827a612a0a76d6e12bacbf2c537ab
BLAKE2b-256 5da61864767251041eecd402c200ed2db7e5cd0923a1a48cece6d0058cb8437b

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.35-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7527d01ae1def36c501031b579de0b9383d3fcb43e6614cfe9d72e7a378acf81
MD5 cd07a9ac33ceaead3f15eb7edd95f8c0
BLAKE2b-256 529ce2c2d50fdf2faa855585494ad15a4b0d05a09d3f61c96053c31a3dfd76bd

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.35-cp314-cp314-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 8543e968911a4ee9bee283be7ba770c5385fed8598b8a877885c1f8b1c6d484d
MD5 8f5e9d4bc8587d398bc655d9cd467d9a
BLAKE2b-256 e08485d06ed2fbb3355de60894eec508581ea2d732e04ecda980751866bca8a1

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.35-cp313-cp313t-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 1436a50c69b38e104827c0de9e735a60aa10a3f22dd1fae50617de0210b08f3a
MD5 0ce5821aa893cacd3eb5a25cb4ddf93a
BLAKE2b-256 138425ab68158d50df66730f2a2b11b5af33bcc80ee028f3e3bdb0eac7ce8c63

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.35-cp313-cp313t-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 487362f8eee47731dbaad9489ead489b6429433cd92bea3456fdc197a95619f3
MD5 b18158949ca858556c151aa59eb1bfd2
BLAKE2b-256 b1a0f96ec2b647f2bcecc942da1bab11d7183d6382b1fc0467538f1c7a19b428

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: rusket-0.1.35-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.35-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 b6f3d16197d43888515110d820ea6d9e727f34da13fc48e91fc82bf7004d4b5c
MD5 63f3e7e929e5936fc4831e05e61195b1
BLAKE2b-256 e40270981097b651b18303e48d9c3a520153f36981f8aff0671b8eb65eb76234

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.35-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 de878e6a1ef5448f278c22e43f7128e830e1153830fd6a72764e58cab194ec37
MD5 392c54600af760e85941837bad0b1161
BLAKE2b-256 af8619af2c8e95e80af9cddb77612b77d1db2b9d978f52f90809ff7abbdf13bd

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.35-cp313-cp313-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 8b9a72c5b6cf9feb354f9b427fa72ba52d80b4c0625c5d46d13e86eea63f275a
MD5 ceb4863a01246fb4617aab7e61666ac1
BLAKE2b-256 7eb4c6c8a1971982086d5874bf3579f545e0fa5eaf539c763af3f4936fe66be6

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.35-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ae9e2188e4069f2d0c2b940ed684671e3a4527c686b2314f9f355a29a142df38
MD5 a1a292f9b8e76569fed251e6d24e35e8
BLAKE2b-256 da13236e666be5d11a4e4c473078f91d744fa826656eb91ec15a48a829e3bdb4

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.35-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 29aef7486fd191444095e85e4f44d6782f91539eb449642c7bbbec3bc36acd31
MD5 8e5a1959051a49a8cb3d6b855e615fe9
BLAKE2b-256 0dcd7197ab478ee830cabe8b74ac34abeb7bbd4dfdd7e87cc5f9c3481ffc76e7

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.35-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 793feede15e90346214b882379f0384bfa226e642d47f1d58a277eca09180969
MD5 876bef80092307ed941cb4e489b9e726
BLAKE2b-256 12b4cc47562d59c54fa635861fa342c5832ae70d37f18c1446330caf88048d43

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.35-cp313-cp313-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 afe265fc0e9161eb490b6d2887d2fc32f4a87c3e5bf63ffc3754e951e7c3e798
MD5 243d2348495ef080024652d152f50ac1
BLAKE2b-256 2a34b17e98b5f34cba51b1fa86dc6b85ddce6fef0b7ac9bf3d1336a38b40a283

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: rusket-0.1.35-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.35-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 f04fb2ee5e9dbe940c92a29dac9de44830c10b9d8b77a163c5f11422fcf54b65
MD5 901023cba3eb123ec0d1cd5edc203fb2
BLAKE2b-256 40fad7b1d05f887dfab060c86f2a96c14b81a030a3f3db609dcfdb6c347458a1

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.35-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 b6773db1b2d91b2a528a2fb3ab5f6f0fe37d7a6b4da00da2249e491fe4846797
MD5 eaffbbd532c62fcf93a0023bf089f7b7
BLAKE2b-256 fbdac09fc4d174e5523620118287a41fa2294b3a9d54f64e4c6a8fb3039a1c02

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.35-cp312-cp312-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 2d4021944b68ad783ef8c771c99b5412777239e18551954fdddd653c79087a73
MD5 87b8e9df30692cee9f7d7a8ecc412c9d
BLAKE2b-256 66fc93f2401f3dfd65e00cfe21c1a8ef7bfffeabb27fe2f8ce5dced76e920848

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.35-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a5acd69d77b455a87aad8db861c9d27a0fd8614a3d1433f7313472ba8895937e
MD5 ec5ff4957fb3330dcb7815e5dedcf9f4
BLAKE2b-256 d441e0a80cfa3179375919162effe885a0948c0ed1a2bee8d21cfff28f7d301c

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.35-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 8d51c5a4e0eac0a37790acaf4be858f7bda5a75215fa04091c125f87ded76c4c
MD5 9bf91b5a97b51306784c3cade10b022c
BLAKE2b-256 318465f4c6326d6b9ede2e1017d790f6777115daddc884adc8311051b41e205b

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.35-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ba0a110aec15feed44cd9b5bc5cd9f7281f4893a3ea4054333d67d1dc4ffb0cc
MD5 07d6bfc30ac08ab76175e8aeb2a57b0b
BLAKE2b-256 5594223054e5b50d697159135625052ba503f0d54eb020e41a26d3dc8e9c5bca

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.35-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 07519bbb495faf747d216f871d3bf875183e56e642d34c79428869cd03aa0b78
MD5 639f9daca028126590abb52da4a76c9f
BLAKE2b-256 fb7aebcbfb9937b851037c43ebfd6cd2b3b164aa2b2dc883c96559a3f8d8d356

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: rusket-0.1.35-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.35-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 c0647ce977998b4e14efd5f9139b5c552097392d6aa9e494d7ac013bea0b3357
MD5 f9370398eaf035a592c29a3cb33325f2
BLAKE2b-256 47fdd3dff39778344d013cb9cedca2cdc86482f9250a1428ad7aeaf1cfd08c68

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.35-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 3ecc22fc8738772050978c4eb3d83e3cff1c65126c62d2a91178e10daaa68604
MD5 98a3e940514be949dceced58bfeba8c3
BLAKE2b-256 a6856dc1575756773917a366faad75dfbb7614a9cdba07fa3717c5cc23dd3ea7

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.35-cp311-cp311-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 503eebd2a5d860d8034b55352161b660660e6d6702e65761603b054051883b26
MD5 695e3d7e010673a8c4fc810ecfa79538
BLAKE2b-256 b62f7ed31c0bba95f87ed5328dfee95b04b421d57e05a88c942ef8e90efbd99e

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.35-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 71d43c753fe39aa5c48e0c55d97b97b7745003e7744dd6d6861e66df36ad3706
MD5 58ebb5cf6792950e572f1105d5f8de81
BLAKE2b-256 16932491dabfdad5f8e60c42196d350eadcd2c402d487601524377c7b66c0745

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.35-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 deedb41bd3c19f743bfbcd2196c82964fece82395379b3e66a5f7eefaf195a21
MD5 7e1652a4631578bbffe167aaada24f24
BLAKE2b-256 0a92195f83cadcbdec8ff9e4e03d42120c33a2a226660c27d1336bc268f117f4

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.35-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e9f4e19c6d8d456f025e4e68eb07ddf1d98f8f40b4e93a685e7a90e37f647755
MD5 01101b12291783cbc0421b99f3bd5e13
BLAKE2b-256 250eb52190c8ef8e357961fd18097a81e89fe3ccd247b26ce5f3b447262d6552

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.35-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 745398a8bbe43a1f9a7d9c7bfca42ad76fb8de6b5c83aafe7c0830ab471dcfd4
MD5 32244482ca014325789f6c423fab9ee2
BLAKE2b-256 f512a9b1fc0876576df1255e6c7369955ecbee4c5af5373e669704dc7b217aea

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: rusket-0.1.35-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.35-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 664cfe9c08ab46694c8e19861bd843c73446284a6ae418d1c71e2b2c368d6cc1
MD5 07d552a86a094a47b375ffaea58313fa
BLAKE2b-256 e086f53a601477c68ae4bf837e80194e0efc9c117fbea95177233f7006b86438

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.35-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 ebdfb0e0dc6f061311cdbe00aea5fb28c470be9b1f473eb3bab98aa3cce7542a
MD5 19c0b57f6ce8bce1cf77b76fa9c56ba3
BLAKE2b-256 d6cea9accd81a91cc9dee2b2c7ce63fda5b320188a3a6347838fd014f364e44d

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.35-cp310-cp310-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 51d7934752090d01cba384cac4b3a39a7663202fd6bf7ace05f95b804673c0c8
MD5 53ab7cfcb20da75286ef22ed1fa2f906
BLAKE2b-256 9efce40e69e4aa3726fd97f3ee23b3109dc48f9dcb361dd9d408e8218c8473d8

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.35-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ae4e80aae234974144e9202aaf12989058c2219bda65003d7130dd963856698d
MD5 b7c4e826142cbbd3ce15a63844c66c91
BLAKE2b-256 cedd059ef9d136537cc99271848cdc8c6983564bf62446eac14b8d0702c1cdae

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.35-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 6a6f654e8a0e0700df9c4c062239631ed2ecef11b93f1561d45a58de35d7124d
MD5 73c4ff0b68a71021268fac64ca7356e4
BLAKE2b-256 a58f252ab5e5957955689763a5c40c800faa3dce41fa6de421718f58027f54d9

See more details on using hashes here.

Provenance

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