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.

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 mine, association_rules

# 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?
# method="auto" selects FP-Growth or Eclat based on catalogue density
freq = mine(receipts, min_support=0.4, use_colnames=True)

# Step 2 — keep rules with ≥60% confidence
rules = association_rules(
    freq,
    num_itemsets=len(receipts),
    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.

Functional API

import pandas as pd
from rusket import from_transactions, mine

# 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"],
})

# Convert long-format → one-hot boolean matrix, then mine
ohe  = from_transactions(orders, transaction_col="order_id", item_col="sku")
freq = mine(ohe, min_support=0.3, use_colnames=True)
print(freq)

OOP Class API

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

from rusket import FPGrowth, Eclat, AutoMiner

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, association_rules

# 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 fpgrowth, typically faster on sparse catalogues
freq  = eclat(baskets, min_support=0.4, use_colnames=True)
rules = association_rules(freq, num_itemsets=len(baskets), 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 mine, association_rules

# ── 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. Mine frequent combinations ────────────────────────────────────
freq = mine(baskets, min_support=0.02, use_colnames=True, max_len=3)
print(f"Found {len(freq):,} frequent itemsets")
print(freq.sort_values("support", ascending=False).head(10))

# ── 3. Generate cross-sell rules ────────────────────────────────────
rules = association_rules(freq, num_itemsets=len(baskets), 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.

OOP Class API

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

Functional API

from rusket import mine_hupm

high_margin = mine_hupm(
    data=orders,
    transaction_col="receipt_id",
    item_col="product",
    utility_col="margin",
    min_utility=20.0,
)
print(high_margin.head())

📊 Sparse Pandas Input

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

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

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

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

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

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

# Same API, same results — just faster and lighter
freq = mine(df_sparse, min_support=0.01, 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, mine, association_rules

# 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
freq  = mine(basket_ohe, min_support=0.01)
rules = association_rules(freq, num_itemsets=n_receipts)

# 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 mine

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

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 Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

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

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

Uploaded PyPymusllinux: musl 1.2+ x86-64

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

Uploaded PyPymusllinux: musl 1.2+ ARM64

rusket-0.1.25-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (837.5 kB view details)

Uploaded PyPymanylinux: glibc 2.17+ x86-64

rusket-0.1.25-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (935.5 kB view details)

Uploaded PyPymanylinux: glibc 2.17+ ARM64

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

Uploaded CPython 3.14tmusllinux: musl 1.2+ ARM64

rusket-0.1.25-cp314-cp314-win_amd64.whl (685.6 kB view details)

Uploaded CPython 3.14Windows x86-64

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

Uploaded CPython 3.14musllinux: musl 1.2+ ARM64

rusket-0.1.25-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (836.6 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ x86-64

rusket-0.1.25-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (931.5 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ ARM64

rusket-0.1.25-cp314-cp314-macosx_11_0_arm64.whl (810.7 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

rusket-0.1.25-cp314-cp314-macosx_10_12_x86_64.whl (765.8 kB view details)

Uploaded CPython 3.14macOS 10.12+ x86-64

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

Uploaded CPython 3.13tmusllinux: musl 1.2+ ARM64

rusket-0.1.25-cp313-cp313-win_amd64.whl (687.4 kB view details)

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.13musllinux: musl 1.2+ ARM64

rusket-0.1.25-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (838.5 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

rusket-0.1.25-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (932.7 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64

rusket-0.1.25-cp313-cp313-macosx_11_0_arm64.whl (811.1 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

rusket-0.1.25-cp313-cp313-macosx_10_12_x86_64.whl (765.8 kB view details)

Uploaded CPython 3.13macOS 10.12+ x86-64

rusket-0.1.25-cp312-cp312-win_amd64.whl (687.5 kB view details)

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.12musllinux: musl 1.2+ ARM64

rusket-0.1.25-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (838.5 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

rusket-0.1.25-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (932.9 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

rusket-0.1.25-cp312-cp312-macosx_11_0_arm64.whl (811.3 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

rusket-0.1.25-cp312-cp312-macosx_10_12_x86_64.whl (766.0 kB view details)

Uploaded CPython 3.12macOS 10.12+ x86-64

rusket-0.1.25-cp311-cp311-win_amd64.whl (686.2 kB view details)

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.11musllinux: musl 1.2+ ARM64

rusket-0.1.25-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (837.0 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

rusket-0.1.25-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (933.0 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64

rusket-0.1.25-cp311-cp311-macosx_11_0_arm64.whl (812.2 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

rusket-0.1.25-cp311-cp311-macosx_10_12_x86_64.whl (767.1 kB view details)

Uploaded CPython 3.11macOS 10.12+ x86-64

rusket-0.1.25-cp310-cp310-win_amd64.whl (686.3 kB view details)

Uploaded CPython 3.10Windows x86-64

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

Uploaded CPython 3.10musllinux: musl 1.2+ ARM64

rusket-0.1.25-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (837.1 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

rusket-0.1.25-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (933.2 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64

File details

Details for the file rusket-0.1.25-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for rusket-0.1.25-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 5eee05097f3b5d6d3a23edfad363953d515acf769cd06eaf63e17b885e2d3704
MD5 787a63dd1c1b6b8678396d9193e08959
BLAKE2b-256 25be786a57009a4848fcb5b46142b8ff23162b4b5603445dea58db4d54b260ed

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.25-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 09207b754d04d0a41db5651c6f47cc2e5a98528f1ea4705a4c652712b159837f
MD5 a838e22dd96a6e91f060343a2b683d46
BLAKE2b-256 4523530697461fbf864dc1796e926e6267abda6e51b42433cc200bfccb6f3081

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.25-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 318b5c0b6d1b40f6f709ed968da9047ac38ef49623f418d6813087a09aefa30e
MD5 4b054a048b66e698782f4b84a1ebdf51
BLAKE2b-256 22ecbf851ce583ae5469ddc353d76a9e531e53bbb53b867e868c9cff82e98272

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.25-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 40c26adc6144ff511289d126630858cf52293cf0a29cd1c5d3ab80a2bbf590a5
MD5 505288161f61c1149039cade64b14eaa
BLAKE2b-256 ad3006e84877c79cbcc0827aa8223ae7d325ff0ab3cd7e7c23265da571f34c8e

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.25-cp314-cp314t-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 6123ed5290004cc851fc9fc4aa5ddf68965638462848ad495fe587d83c5dfb74
MD5 22944bf25a782de629b24e73a9ed3acb
BLAKE2b-256 88b7c83d4ecb0d93a782cf6b0df4815f3da3756917faffbf0f052eca17950e0d

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.25-cp314-cp314t-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 ece40737f33726baec902fcc931743344e1ef5cf8bc4d6c68d462cf64bc0dc28
MD5 ec85459945f386eaa306d61aee2566dc
BLAKE2b-256 46644873570a73ca8651f7adc84c45556877b9af05d836f4f8e344dcbfaae2ff

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: rusket-0.1.25-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 685.6 kB
  • Tags: CPython 3.14, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for rusket-0.1.25-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 18cd4064e249c9ecf3c88a6237eb173220c61e1d1e5fe1dd28c2c349d8bfd9b3
MD5 daae1d01233ab11ab65c823bebe09a2a
BLAKE2b-256 b145bfe5e4886c255dec76570700f4c8541d31beba33e9b506c1818c72acd049

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.25-cp314-cp314-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 c69c2cbf7cd5c29d4327b618380f4e2f399c22ce6aa4b00484b8a6929a18839a
MD5 6f62d28f8e101b346dc4d1318fe6b9d4
BLAKE2b-256 b03f2d44395a9a9dac94283bc3fc9516ac46803ffaa861adfa7ee71c1e93eb51

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.25-cp314-cp314-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 a1f4b86f987579dfeecac86657075954da90d0d10499ffd391a62065b8fb0c04
MD5 4c7f500e5a0bed448fb0bd9f555daa50
BLAKE2b-256 a0e352dd128c56b4924fb4dd8d701ff799bee609db7ed9ac30ac4abebe0cc019

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.25-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ea0652b96e13ae608242569a17f02d98dd6cffbc5c7212164251e0258ed9c47a
MD5 717551e7c1bf513d72b0ff0db5d09eef
BLAKE2b-256 7375765c58f657f5984577d7c6271407ac612ce72fbbbfe0ab86f5df431575c6

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.25-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 126fe543df04fdc1e641460ded1e6344aa953472f2b7404d44a55e5ffb6f9033
MD5 4e9fff27e6921c256ac03b234d4095b2
BLAKE2b-256 a6bd2bf2745ac722614f5e29d54aa0f3067811540ae834dc9a0b4083fe321c8a

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.25-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 39bb728a0dfc9116c5b0f77ce5a9444d0da058d034db5c50d540512e04878b0e
MD5 a481f7524784a4992672b3e5be018efc
BLAKE2b-256 730fe75d524fe136c75274cf8f0bab53ac446556343029b47f3dad8e12f118e5

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.25-cp314-cp314-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 be1fca1e70cbbe9766f81d07a3538b211a0abacba79520a4280f1d02301006f1
MD5 159b987f578689b8d4d00f8e4d0589f0
BLAKE2b-256 7e808b457feff5e76bddb217dcc005236c4810298163255f45fc303035053e9d

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.25-cp313-cp313t-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 fbc5270e39d04b4548d0609fb9770ea31ae9c8dd6adda829121e32e17dd9feb9
MD5 6953bc4fbeccc860aee6b7ef24204dad
BLAKE2b-256 684e65de4f970d5f65c26a999e36ab6f461b1edc2e467ad656f135cdada49236

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.25-cp313-cp313t-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 c1dccacbdf25d64f4f035ebce7f1fabbb1c097cd18ee15ca1656143a583418b0
MD5 aa993f5d1817266ced229fd7dba6852f
BLAKE2b-256 cd7983ab42efaa8c50c52e07cb2b8201c934208a0c04e6a209b683b1b8d71de3

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: rusket-0.1.25-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 687.4 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.25-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 fb2814d8e10ef236babe3d8f569b4ee373f62c8960e975a25291bee1cc990c4c
MD5 0ff346d670a4e0bcd77fd488e2176bfb
BLAKE2b-256 6d536b9637ab87802647bfa07ac78332264ddebda860f1f5d50fe975c738c4b7

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.25-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 107b51d84db14ea1d7943ae3a44bd6436f892b0ea665843a4f1d12de3fc6aae1
MD5 77c2e9ac56427b3b179b1236979ff4de
BLAKE2b-256 e45cb947336acf43d3c4669bdeee474279ab72fc83e1654cfb30e1ad12186a6c

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.25-cp313-cp313-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 b4370429ca04155571d78dc39ab15a2677be361d77c370090eccbb435ed8a628
MD5 dfb24894aa337969f8a183c1bbf94ebd
BLAKE2b-256 935910fb3f987429a21be9f43b583085296101c03d4edb0fd67c69ee4891ebec

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.25-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 7330d0112384b88b75d8bdcbab4aeded82caa33066df3502692b68bebed756b6
MD5 248bc062f844a941107d0d306536279b
BLAKE2b-256 a03158b1f83878003eb24a867537def698a6a6c6cb647c8a8f150c05c81abf0a

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.25-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 4e4fd8c5fa7242add910a4b047463288e6712594ef69418ffda3d02451164e78
MD5 a4ae265f1024b40fe5329c0c223b4f7d
BLAKE2b-256 af9bc75c2f1e10fd81d3a9b501219b50101e825670115d4fa6a1e757428679fd

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.25-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d55097e405f6bdaf9a2292aeb275c259295fbb91a0f3033bec2748e971f58bb7
MD5 1ab63c839581a434dfd9035066a8a772
BLAKE2b-256 79f5d5351cdb9cd10bfc902ddf2172e023b0a9353ead97eb041223fbdd19cef4

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.25-cp313-cp313-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 4288c17c3cb7028e5d4f4584cbbf02d9dc212c86d5ad4478b2656946ccee9d8a
MD5 0e316f2c1747d6bfe80e03f6ca6f3ed6
BLAKE2b-256 0bfc895cb991e7ce9ac6030906f000ec7057d7392180b08b152cd85cf54e6e97

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: rusket-0.1.25-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 687.5 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for rusket-0.1.25-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 fd00ce14e37a7d26529acadc07f0c4ddd9bd2ee8ed9284cf5dc14b6b56069ec0
MD5 d526e249b59e128b589a6beb7162f89f
BLAKE2b-256 92cf85ee3dcd21a0b333ed92b848f3852707cbc6772fdcbe0e8e5e674de16949

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.25-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 6f94e568be278fa61c7f3d3c39b5d47939e80af5e5087b5f71150e742f37a632
MD5 d953b67a01ffc9f8118056c967e8baa7
BLAKE2b-256 3a35a9f5b57ccec1dc8be51e09f399537c17c3ab30d25483483ba2020e42c1a2

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.25-cp312-cp312-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 d6bc998c25301c83c44fe94e12388c6813ec070690f82ba7214936d45d52684d
MD5 c082666653d53a64946eeecdedabd7dc
BLAKE2b-256 ebf0abad67499cfaae641fc49fa39d4c4f8d750ca12f14f27fd016bd6371770f

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.25-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 74f7a48a4707315266b590ee1cc28738dd2f12c3781684e2a42c302db61bb9e8
MD5 d7e499dabfc479715a3be2489155bdcf
BLAKE2b-256 4a49c4579d336c4aab603813439452cf4bac15faf22314592392eb0ee74a69b4

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.25-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 4f739348e62cf77a97e6b6d8cad5cd811632e15e782f3bcf3bed175ce5f63518
MD5 6c54fedfcee8a9c54e4731094e566ee8
BLAKE2b-256 67f498219f2e53ef07dcd5df55d6973bcaac403d535525f790742a132a975c5d

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.25-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c71c52c50afd16debfe7c37adab4010a68443c0c263e2038995564ffde0bbb01
MD5 9966adae44d8ce2a91f8667aa0ade098
BLAKE2b-256 467a56d0478969753bf7bb1e1fab6a5c472e73887f485c43dc3b112a038c404e

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.25-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 4ab802ffe5f74f816aabc3331cf579339aea7d548d2dd9d39a1cfd7e19a86d97
MD5 533be4760877070ec2faf1dde2ff3fd2
BLAKE2b-256 c865832fbcfb712a7e55d94621a629d737c29bd7348da6479fbbc79030bc4dce

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: rusket-0.1.25-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 686.2 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.25-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 7699cdf4d76e6708e256eebfa3ce3ea670aace185b35166fd3b647f48cdb41c7
MD5 507f3feb3710679b1daf0ee848c4761f
BLAKE2b-256 ee422ab0aa97493ebcd47b83b2b1f9fc50b3258a7d3901fc8babdfe9ad6704f9

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.25-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 161ce4c02ef0c58696856af54b7aa42dc7bfa2c25ac22d7aadca660b8c4c3824
MD5 649dbcf1cc10b6a9d68b68bb643cb949
BLAKE2b-256 29a2eb42a34cae13e06259e7d05063b0b066b478eef76368c5b7abd3b291628d

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.25-cp311-cp311-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 81c811ba97488cb2c2d60612950e961f066a77e540c240d33513341da8e69289
MD5 fabb0d83253accf8a21a3d50e14f4fb9
BLAKE2b-256 dcd207f16517cba99e75204d62d147c97218d322175c1ed90c1ad4a153980313

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.25-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f12c6721af4f9f4b3662587535ccc34b5da58248ec7ca4d29b51833d0ca94cf5
MD5 af6af979df2001af0940ef45d1a6b28b
BLAKE2b-256 22f918a3731f3414ec0d684b9fc2b2c12be43a5eb138ad951eb956a80ef6dc6c

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.25-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 ae2eb6b31a2bcee3a3e8a290d5d2f417f168fea3f82f5c1e6a02eb132080f361
MD5 f6a2b97f05f4575c20bdce8795e83dd0
BLAKE2b-256 f162a4f514b7c0838889d2370b09292e1c6e6a2a02a6b03668c9bfac62b8b2d1

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.25-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 def245e829743c6d35f8735fd292c1c6b3513aa3c2ae426351e77cbfc71ba35a
MD5 6b2785417ea98720e64c64c07d3aeb1b
BLAKE2b-256 341b6d208fcf027dee912a1bf038defa652ac2d7c8cd904090fd17371b481053

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.25-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 afbc1bcae68a3f4aebabe2387170363e1c8cdd69fe37995695b16c68e5656b80
MD5 aa8e54c699c38b19fe93f770035a1392
BLAKE2b-256 859851454d7440a18c9afee6946408172e09c4078096a28b6bc76351ee6a67a9

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: rusket-0.1.25-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 686.3 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.25-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 677badb598e7fb8966e6408cfe608721baa4656b90af591c7987a61fb7c9d7c9
MD5 1ff249f2d9a333c562827226c3d5308c
BLAKE2b-256 c5d9c149c4e8dd801a456dd5d81ae7a800e8325a5e666f17aaf60b8731dc1276

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.25-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 109d45b4d2ddfd534567a1ae18281323ef8843b0fe54449e90012e52228ea72e
MD5 d8e38d5dbca5ac00f9174e5e04cb53d2
BLAKE2b-256 ff1e2d5584d189459150c243b4ee18419141583a864d0aa28e3a2edac840b06c

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.25-cp310-cp310-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 a45be1ae744edadea41e46d8fcea3d3c1ff633234fe4fc7673c1aa8264cd6759
MD5 8b7b7845e0b1dac8c2085f6948700b93
BLAKE2b-256 174a69b7dc01bd8a668ea713c416155d202a960dd178391dcb7dd78209b2a28f

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.25-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4fb4455a450f94b9d53ccfe87b690a33a3691a1eae5bf1946b6b9e9fe2545b48
MD5 844a1b5ef98960619a3be70e30aedd37
BLAKE2b-256 399c18581f2c6cb4ae6ef8b4c643c4dd30d8e57e77b268fa735ea44f78516c80

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rusket-0.1.25-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 379deae953debf0466ab6e14aed13bba58eb22a6353f1610feca142b438e6ff9
MD5 ee1eb5011b6bcf285346438033c33473
BLAKE2b-256 b08d6f68e80ff314f67212d5244e44f60b30c78d2649c5e82f52e413b2a1ec15

See more details on using hashes here.

Provenance

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