This release is a pre-release and may not be stable for production use.
Hedonic
hedonic detects communities in igraph graphs as a
hedonic game: wrap a graph in Game and call community_hedonic(), which
returns a disjoint partition at a Nash equilibrium of the game.
The detector is a small C core compiled into the package (hedonic._core).
The only dependencies are the standard igraph
package and NumPy, so hedonic installs next to any igraph 1.x you already
use. Python 3.12 or newer.
Overlapping communities (covers) are hedonic 2.
TL;DR
pip install hedonic # the library
pip install "hedonic[cli]" # plus the command line that reproduces the paper
from hedonic import Game
h = Game(g) # g: an igraph graph (convert NetworkX, edge lists, ... through igraph)
partition = h.community_hedonic(seed=0) # an igraph.VertexClustering
from hedonic import Gameis the public API.- Each vertex ends in exactly one community; the result is an
igraph.VertexClustering. - Every call runs until no vertex can certainly improve by moving: the result
is an equilibrium of the game, with a certified bound on what any vertex
could still gain (
equilibrium_slack). There is nothing to tune: no iteration budget, no round cap, no tolerance. - Every call starts afresh: from singletons, unless you pass
initial_membership(or ask for a random start withmax_communities, or set a community-count limit). The result is also stored inh.memberships; passinitial_membership=h.membershipsto continue from it (see Start states).
What this is
A hedonic game is a coalition-formation game: each vertex is a player, each community is a coalition, and a player prefers the coalition that improves its payoff. Here the payoff is the Constant Potts Model (CPM) score at a resolution γ (by default, the weighted density: the total edge weight over the number of vertex pairs): a vertex gains from its neighbours inside a community and pays γ for every member.
community_hedonic() visits the vertices in random order and lets each one
take its best response: move to the community it prefers. After a move
it revisits the vertex's neighbours, and it stops only when every vertex has
been visited, without moving, since the last move. That is a Nash
equilibrium: no vertex can improve its payoff alone. It is the equilibrium
this process reaches from its start, not necessarily the partition of highest
potential, and another seed can reach another one.
The computation is in floating point, so the core proves each step instead
of trusting it: every payoff it compares carries a rigorous bound of its
rounding error, and a vertex moves only when its computed gain exceeds that
bound. Every move therefore raises the exact CPM potential, and the process
always stops. The result reports equilibrium_slack in
result._hedonic_provenance: no vertex can raise its exact payoff by more
than the slack times the total edge weight (normalized like the quality). It
is exactly 0 whenever no deviation's exact gain can be positive: always when
the arithmetic is exact (for instance unit weights at resolution 0, 1/2 or
1), and often otherwise (with integer weights, for instance, when every
vertex's best deviation is certainly worse). The result is then an exact Nash
equilibrium. On complete DBLP and Amazon it is about 1e-21.
native/README.md
gives the bounds and the termination argument.
Game is an igraph.Graph subclass: after wrapping, the usual igraph API
(h.vcount(), h.density(), shortest paths, and so on) is still available.
Installation
python -m pip install hedonic
That is the library alone (igraph and NumPy). Two extras add more:
python -m pip install "hedonic[metrics]"adds SciPy, which the scores built on a one-to-one matching need (see Scoring against a reference).python -m pip install "hedonic[cli]"adds the command line (hedonicandhedonic-exp) and what its experiments need (SciPy, pandas, Matplotlib, PyArrow, DuckDB and tqdm). The command line runs on macOS and Linux; on Windows the package installs the library alone.
With uv:
uv add hedonic
Wheels are built for Linux (x86_64, aarch64), macOS (x86_64, arm64) and Windows (AMD64, ARM64). Elsewhere pip builds the C core from the source distribution, which needs a C11 compiler.
Tutorial
1. Wrap a graph as a Game
Game copies an existing igraph.Graph, or is constructed the same way as an
igraph graph. Other libraries convert through igraph first.
import igraph as ig
from hedonic import Game
# Famous example graph (Zachary's karate club)
h = Game(ig.Graph.Famous("Zachary"))
# Equivalent shortcut: Graph class methods return a Game
h = Game.Famous("Zachary")
# Edge list
h = Game(n=4, edges=[(0, 1), (1, 2), (2, 3), (3, 0)])
# Adjacency matrix
h = Game(ig.Graph.Adjacency([[0, 1, 1], [1, 0, 1], [1, 1, 0]], mode="undirected"))
# NetworkX (networkx is not a dependency)
import networkx as nx
h = Game(ig.Graph.from_networkx(nx.karate_club_graph()))
Wrapping preserves the graph's directionality and its vertex, edge and graph
attributes, and to_igraph() preserves them on the way back. The detector
requires an undirected graph without self-loops, so a directed input or a
loop is rejected explicitly rather than silently converted
(h.simplify(multiple=False, loops=True) removes the loops). Parallel edges
are accepted and count as one edge whose weight is their sum.
2. Detect communities
h = Game.Famous("Zachary")
partition = h.community_hedonic(seed=0)
print(partition.membership[:8]) # one community id per vertex
print(partition.sizes()) # community sizes
for community in partition: # communities as lists of vertex ids
print(list(community))
Start states
initial_membership |
Start state |
|---|---|
None (default) |
singletons; a random start with max_communities; a feasible start under count limits |
| one label per vertex | that partition |
| one list of labels per vertex | each vertex keeps the label it prefers (below) |
Labels are non-negative integers; a start whose labels have gaps
([5, 9, 5]) is renumbered in label order ([0, 1, 0]). An igraph
VertexClustering (or VertexCover) of a graph with the same vertices is
accepted too.
Every call stores its result in h.memberships, one list of labels per
vertex, and never reads it back by itself. To continue from the last
equilibrium, pass it:
h.community_hedonic(seed=0)
again = h.community_hedonic(initial_membership=h.memberships, seed=1)
When a start gives a vertex more than one label, the vertex keeps the one it
prefers (ranked by the payoff of each community on the start, ties to the
larger community, then the smaller label) and the game runs to an
equilibrium from there. _hedonic_provenance["projected_vertices"] counts
the vertices that had to choose.
3. Parameters
| Parameter | Default | Role |
|---|---|---|
initial_membership |
None |
The start; see Start states |
max_memberships |
1 |
Communities per vertex; 1 (a partition) is the only value hedonic 1 accepts |
resolution |
weighted density | CPM γ: total edge weight over the number of vertex pairs (the density of an unweighted graph). Smaller γ gives larger communities |
allow_isolation |
False |
Allow a vertex to open a new, empty community |
max_communities |
None |
Random start over [0, max_communities) when no start is given; without isolation the result then has at most that many communities |
edge_weights |
unweighted | Edge weights (sequence or edge-attribute name; an attribute called weight is used only when named) |
node_weights |
unweighted | Vertex weights (sequence or vertex-attribute name) in the crowding term γ w_u w_v |
max_total_communities |
None |
At most K occupied communities, in the result and in every state visited |
n_communities |
None |
Exactly K occupied communities |
seed |
None |
Seed of the visiting order (see below) |
Everything after initial_membership is keyword-only.
Reproducible runs. With seed=, the visiting order is drawn from
random.Random(seed), so the same graph, parameters, start and seed give the
same result:
a = h.community_hedonic(seed=7)
b = h.community_hedonic(seed=7)
assert a.membership == b.membership
Without a seed, the order is drawn from Python's random module, which is
also python-igraph's default generator, so random.seed(...) before the call
makes it repeatable too.
Community-count limits. max_total_communities=K keeps the number of
occupied communities at most K, and n_communities=K keeps it exactly K:
two = h.community_hedonic(n_communities=2)
few = h.community_hedonic(max_total_communities=4)
Both must be positive integers, and n_communities must not exceed
max_total_communities. Without a start state, a deterministic feasible start
is built; a supplied start that violates a limit (after each vertex keeps one
label) is rejected, never silently repaired. The result is then an
equilibrium over the moves the limit allows.
What the result carries. Besides the communities, a result has
_hedonic_provenance (versions, effective parameters, count mode, and
equilibrium_slack) and _hedonic_native_quality, the quality of the
returned state: (Φ − γ Σ_v n_v² / 2) / W for its exact potential Φ (a
sum over pairs of vertices), the vertex weights n_v and the total edge
weight W; the constant term is each vertex's own crowding, the same for
every state.
4. Scoring against a reference
evaluate_against scores the stored result against a known partition or
list of communities:
h = Game.Famous("Zachary")
h.community_hedonic(seed=0)
truth = [0] * 17 + [1] * 17 # a flat partition, a list of communities or a VertexClustering
print(h.evaluate_against(truth, method="f1"))
Methods: f1 (symmetric best match), one_to_one_f1, jaccard, omega,
node_micro_f1 and size_weighted_community_f1; the two built on a
one-to-one matching (one_to_one_f1, node_micro_f1) need SciPy (the
metrics extra). omega is exact when the graph has at most 100,000 vertex
pairs and otherwise estimated from that many sampled pairs
(omega_sample_size, omega_seed). A flat reference may use any hashable
labels, but every vertex needs one (None and NaN are refused); a list of
lists is read as communities, each a list of vertices of the graph, and the
communities may overlap. Communities with the same members count once, on
both sides.
A reference that labels only part of the graph is scored against the whole
result by default. restrict_to_reference=True first drops the vertices the
reference does not contain from every detected community
(hedonic.metrics.restrict_cover), the usual convention for partial ground
truth:
h.evaluate_against([[0, 1, 2], [33, 32]], method="f1", restrict_to_reference=True)
The underlying functions are in hedonic.metrics (also reachable as
hedonic.metrics after import hedonic).
5. Worked example
import igraph as ig
from hedonic import Game
h = Game(ig.Graph.Famous("Zachary"))
partition = h.community_hedonic(seed=0)
print(f"{h.vcount()} vertices, {h.ecount()} edges")
print(f"communities: {len(partition)}, sizes {partition.sizes()}")
print(f"equilibrium slack: {partition._hedonic_provenance['equilibrium_slack']}")
Command line: reproducing the disjoint paper
pip install "hedonic[cli]" installs two commands. hedonic is the front
door for runs; hedonic-exp list names the analysis and utility commands.
hedonic guide # where you are, what to do next, and the topics
hedonic show disjoint # the presets: grids, methods, time and disk estimates
The paper's experiment is the stochastic block model (SBM) benchmark: 5 community counts × 10 within-community edge probabilities × 10 difficulties × 100 network seeds = 50,000 graphs of 1,020 vertices, each started from noisy partitions at 5 noise levels × 10 seeds, with 10 seeded restarts of Leiden and Hedonic per start.
hedonic run disjoint --preset smoke # the whole pipeline in seconds
hedonic run disjoint --preset paper --dry-run # the paper's plan, time and disk
hedonic run disjoint --preset paper # durable and resumable, about a day on 8 workers
hedonic run queue disjoint --dry-run # the queue's plan and what is already done
hedonic run queue disjoint # the same as a queue: the smoke run, then the paper's grid
Every grid value is also a flag (--nodes, --communities, --p-in,
--difficulty, --seeds, --noises, --partition-seeds, --methods,
--restarts, --workers, --partitions); hedonic run disjoint --help
lists them, and hedonic run disjoint alone opens a wizard in a terminal.
Its methods are Hedonic (this package's detector), stock igraph's CPM Leiden
(community_leiden, the paper's full Leiden), and four references (ground
truth, Mirror, One Pass, spectral). Graphs are regenerated from their seeds
and never stored, so nothing is downloaded.
The store, the statistics and the figures. A run writes a Parquet result
store (one shard per graph, one row per detector run), then the logical-cell
table (plot_table.parquet), the paper's five figures (figures/:
gt_robustness, noise, n_communities, acc_robustness,
acc_efficiency) and every statistic of the paper's Empirical Analysis
(stats/: summary.md, paper_stats.json, tables.tex and CSV tables).
The same steps are available one at a time:
hedonic-exp disjoint-store STORE --progress # shards, rate, ETA, disk
hedonic-exp disjoint-store STORE --sql "SELECT method, noise, avg(adjusted_rand) FROM cells GROUP BY ALL ORDER BY ALL"
hedonic-exp disjoint-store STORE --verify # regenerate graphs and replay sampled rows from their seeds
hedonic-exp disjoint-stats --data STORE # the paper's statistics
hedonic-exp plots --data STORE/plot_table.parquet --output_dir FIGURES
Each method's results carry their own identity (its call, parameters,
restarts and the build that computes it), so a store that already holds some
methods keeps them and runs only the missing or changed ones; a store made by
another build is refused before anything is written, and --rerun METHOD or
--reuse-from STORE (which first replays a sample with this build) says
what to do with it.
Runs. Runs execute detached (tmux when available, else a background
process; on macOS under caffeinate -i), so closing the terminal or pressing
Ctrl-C does not stop them: hedonic run list, status, attach, logs,
stop NAME and resume NAME manage them, and hedonic run check NAME
replays a sample of a run's rows from their seeds and compares them. A queue
skips what its files show as finished and resumes the rest, so running it
again continues it. Runs go to ~/Databases/Hedonic/Disjoint
(HEDONIC_DISJOINT_OUTPUT_DIR, or hedonic config set disjoint_output_root PATH), a queue to <disjoint_output_root>/disjoint-queue (--root DIR),
and the registry of runs to ~/.cache/hedonic/runs (HEDONIC_RUNS_DIR).
hedonic config example prints every setting, and hedonic update compares
the installed version with PyPI (it upgrades only with --yes).
Interactive explainer
The web/ directory contains an educational website that explains the
disjoint hedonic game visually: friends and strangers on a balance scale, the
resolution parameter, the Familiarity Index, the decision tree, the metagraph
of all partitions of a four-vertex graph, and better-response walks to a
stable equilibrium. It also hosts documentation generated from this package's
source. It is a small browser-side teaching model, not a replacement for the
detector. From the repository root:
npm install
npm run dev
The GitHub Actions workflow .github/workflows/pages.yml tests, builds and
publishes it to GitHub Pages; see
web/README.md
for details.
Development
git clone https://github.com/lucaslopes/hedonic.git
cd hedonic
python -m pip install -e ".[cli]" pytest
python -m pytest
make -C native test # the C core's own tests (sanitizers)
python tools/native_tests.py # bit-level pins, as the wheel builds run them
The C core lives in native/ (include/hedonic_core.h is its API,
native/README.md
its design) and is compiled by setup.py into hedonic._core. Rounding is
fixed by the source (explicit fused multiply-adds, computed by the
instruction or the core's own correctly rounded soft fma, never the C
library's; no contraction), so results are identical across platforms; the
wheel workflow (.github/workflows/wheels.yml) checks this on every platform
it builds for.
Citation
The game and the SBM benchmark are those of:
Lucas Lopes Felipe, Konstantin Avrachenkov and Daniel Sadoc Menasché. From Leiden to Pleasure Island: The Constant Potts Model for community detection as a hedonic game. Physica A: Statistical Mechanics and its Applications 680, 130989 (2025). Preprint: arXiv:2509.03834.
@article{felipe2025leiden,
title = {From Leiden to Pleasure Island: The Constant Potts Model for community detection as a hedonic game},
author = {Felipe, Lucas Lopes and Avrachenkov, Konstantin and Menasch{\'e}, Daniel Sadoc},
journal = {Physica A: Statistical Mechanics and its Applications},
volume = {680},
pages = {130989},
year = {2025}
}
License
This project is distributed under the GNU General Public License, version 3 or
later. See LICENSE.
The C core was written for this package and contains no code from igraph or
other libraries; the binding implements the MT19937 generator step (Matsumoto
and Nishimura) as CPython's random module does, so that seeded runs draw
exactly what random.Random would.
Metadata
Release files for hedonic 1.0.0rc1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| hedonic-1.0.0rc1.tar.gz | 312.6 kB | With provenance | Details |
Built distributions (wheels)
Total release size: 7.2 MB
Release files / hedonic-1.0.0rc1.tar.gz
| Download URL | hedonic-1.0.0rc1.tar.gz |
|---|---|
| Size | 312.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c31573675d731be86a36f142aaee28412e594d4f711cac9ce18794228e16100f
|
|
BLAKE2b-256 checksum How to use checksums |
3637e481d268a91141e25a01b64fe1456450353f1321101fd28156296c610d38
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.
Transparency logRelease files / hedonic-1.0.0rc1-cp314-cp314-win_arm64.whl
| Download URL | hedonic-1.0.0rc1-cp314-cp314-win_arm64.whl |
|---|---|
| Size | 273.7 kB |
| Tags | CPython 3.14 Windows ARM64 |
|
SHA-256 checksum How to use checksums |
5f58347f316d0c741ed44af2078af2333b67adc6ecbfa8b86c6b52757d68088b
|
|
BLAKE2b-256 checksum How to use checksums |
c9c9483583ee924c6e205eaa7ef214fb49868417c36e2e52c88fff3a8ebaeda3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.
Transparency logRelease files / hedonic-1.0.0rc1-cp314-cp314-win_amd64.whl
| Download URL | hedonic-1.0.0rc1-cp314-cp314-win_amd64.whl |
|---|---|
| Size | 290.2 kB |
| Tags | CPython 3.14 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
98cbc5eb4ae5c577c8832d4d1a9aacfaf534d9612094d6297f55666657d70633
|
|
BLAKE2b-256 checksum How to use checksums |
71e834f09683b72daac916f821487884a187d4eb055697e3ef1deaf48d43e8e2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.
Transparency logRelease files / hedonic-1.0.0rc1-cp314-cp314-musllinux_1_2_x86_64.whl
| Download URL | hedonic-1.0.0rc1-cp314-cp314-musllinux_1_2_x86_64.whl |
|---|---|
| Size | 317.7 kB |
| Tags | CPython 3.14 Linux musl 1.2+ x86-64 |
|
SHA-256 checksum How to use checksums |
3824dadc06c2f9d59b15955493fa6764599b776c0ad06c81e7d5fc4c9c12c981
|
|
BLAKE2b-256 checksum How to use checksums |
5313b9bd813528c5cffd00fa1fd41a0dae3d0c490ef0a3447e77243763913fda
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.
Transparency logRelease files / hedonic-1.0.0rc1-cp314-cp314-musllinux_1_2_aarch64.whl
| Download URL | hedonic-1.0.0rc1-cp314-cp314-musllinux_1_2_aarch64.whl |
|---|---|
| Size | 278.5 kB |
| Tags | CPython 3.14 Linux musl 1.2+ ARM64 |
|
SHA-256 checksum How to use checksums |
40a72ca99dfbea02a162d2091bc050222f7ff2fc2568120d9c7253b713c2e78f
|
|
BLAKE2b-256 checksum How to use checksums |
e72a0fb27d813e032c02bb1f01b9c429031da35b379ea39a9a933e90666edcbe
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.
Transparency logRelease files / hedonic-1.0.0rc1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
| Download URL | hedonic-1.0.0rc1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 317.0 kB |
| Tags | CPython 3.14 Linux glibc 2.17+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
58bc2e945b8b41208a8b8571d51bc73a97b46a0695c3fc63e63dd5c78c25f3f4
|
|
BLAKE2b-256 checksum How to use checksums |
de423baa5083b0dbb71b9f70c98833f6f7f798ede64abb32e9e14c5cae28eec1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.
Transparency logRelease files / hedonic-1.0.0rc1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
| Download URL | hedonic-1.0.0rc1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 278.8 kB |
| Tags | CPython 3.14 Linux glibc 2.17+ ARM64 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
73d100f5e3ab045e14f775add0a98a25de056de7bfc2d431031cae16147fbc76
|
|
BLAKE2b-256 checksum How to use checksums |
9f1e5ebe8f8912a65389fc54f836c5f3869df9ceb5a399c4db8c1b0dba210fe8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.
Transparency logRelease files / hedonic-1.0.0rc1-cp314-cp314-macosx_11_0_x86_64.whl
| Download URL | hedonic-1.0.0rc1-cp314-cp314-macosx_11_0_x86_64.whl |
|---|---|
| Size | 285.2 kB |
| Tags | CPython 3.14 macOS 11.0+ x86-64 |
|
SHA-256 checksum How to use checksums |
3d4d8a94fc84292a1252fe5ef083bc17b0e3a57955e023cb81525c4a4c7cdd67
|
|
BLAKE2b-256 checksum How to use checksums |
4cb9cfbed27b5aa84ba6847f25423a19af191d3687a5cb75b535078d2076de04
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.
Transparency logRelease files / hedonic-1.0.0rc1-cp314-cp314-macosx_11_0_arm64.whl
| Download URL | hedonic-1.0.0rc1-cp314-cp314-macosx_11_0_arm64.whl |
|---|---|
| Size | 270.0 kB |
| Tags | CPython 3.14 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
bb8f5b2aadfacfc00dc3620b7d2b171f9d2c4fd23b6a6b1d9f40f42721308234
|
|
BLAKE2b-256 checksum How to use checksums |
8b09f20bb1df22a4ddafa25be4fb3ac689e49fc0c7bee8b112cf2eb15f37107f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.
Transparency logRelease files / hedonic-1.0.0rc1-cp313-cp313-win_arm64.whl
| Download URL | hedonic-1.0.0rc1-cp313-cp313-win_arm64.whl |
|---|---|
| Size | 271.6 kB |
| Tags | CPython 3.13 Windows ARM64 |
|
SHA-256 checksum How to use checksums |
a73e34380dfdd76d4b6deedc7e1a8bfc86ed3c91149598ff434a01b365afffc2
|
|
BLAKE2b-256 checksum How to use checksums |
4c5da4e213c6a613de839cb2db19b4e2a1a5bb97a9afb62c6fd28678f3a6a76e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.
Transparency logRelease files / hedonic-1.0.0rc1-cp313-cp313-win_amd64.whl
| Download URL | hedonic-1.0.0rc1-cp313-cp313-win_amd64.whl |
|---|---|
| Size | 288.5 kB |
| Tags | CPython 3.13 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
13a717d8ee5b5266d13fe9d73768ad0e277ea6c5ef2b5066d1cf79d1a032a02f
|
|
BLAKE2b-256 checksum How to use checksums |
fb920685c9067e6d60b7e2940150eb355f89756834cde66906178b3e30fd595b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.
Transparency logRelease files / hedonic-1.0.0rc1-cp313-cp313-musllinux_1_2_x86_64.whl
| Download URL | hedonic-1.0.0rc1-cp313-cp313-musllinux_1_2_x86_64.whl |
|---|---|
| Size | 317.6 kB |
| Tags | CPython 3.13 Linux musl 1.2+ x86-64 |
|
SHA-256 checksum How to use checksums |
c91cc1a2d7a1b44e5760df354f9cbc94005a7e6b54922326cad1ffebea415a6b
|
|
BLAKE2b-256 checksum How to use checksums |
21f78d4bdca4c76e9a1604cdf0d4449170deb7309eef64b90ca95a08434df4da
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.
Transparency logRelease files / hedonic-1.0.0rc1-cp313-cp313-musllinux_1_2_aarch64.whl
| Download URL | hedonic-1.0.0rc1-cp313-cp313-musllinux_1_2_aarch64.whl |
|---|---|
| Size | 278.5 kB |
| Tags | CPython 3.13 Linux musl 1.2+ ARM64 |
|
SHA-256 checksum How to use checksums |
980dfda5f1d31bdf9501939d2c34ef6d889ec998cd0574e4e6f2cedb0924e8b9
|
|
BLAKE2b-256 checksum How to use checksums |
b89027e2d9e41feef7565ab3a15dc7256a1de26d6730e156515e9ad3c9b02e04
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.
Transparency logRelease files / hedonic-1.0.0rc1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
| Download URL | hedonic-1.0.0rc1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 317.0 kB |
| Tags | CPython 3.13 Linux glibc 2.17+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
e92289af635df9bbf8dd6976e874a87b8983d1036f6d2e7aac23a3fc6fe2ca8d
|
|
BLAKE2b-256 checksum How to use checksums |
9e77f5b8bb45bcc0e50e637472e610a3bb6371af83a438143b09878c52489788
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.
Transparency logRelease files / hedonic-1.0.0rc1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
| Download URL | hedonic-1.0.0rc1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 278.7 kB |
| Tags | CPython 3.13 Linux glibc 2.17+ ARM64 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
f0012c359cb618bcfb8575f13e65acf8d41b622d5720c297af7f7fdc953fcfb8
|
|
BLAKE2b-256 checksum How to use checksums |
6d2cc87eb5e2d31582ae553e3a747cabf7fa720d4521afa395bdb89803f951f5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.
Transparency logRelease files / hedonic-1.0.0rc1-cp313-cp313-macosx_11_0_x86_64.whl
| Download URL | hedonic-1.0.0rc1-cp313-cp313-macosx_11_0_x86_64.whl |
|---|---|
| Size | 285.2 kB |
| Tags | CPython 3.13 macOS 11.0+ x86-64 |
|
SHA-256 checksum How to use checksums |
02ba1c3fc14fa77d6d7d573411768a91bd80c81e9fd75ea0a648be2378917ede
|
|
BLAKE2b-256 checksum How to use checksums |
8abc38adc6a1f80669fc799deccb59131e8db797cec647be6e152e422197f538
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.
Transparency logRelease files / hedonic-1.0.0rc1-cp313-cp313-macosx_11_0_arm64.whl
| Download URL | hedonic-1.0.0rc1-cp313-cp313-macosx_11_0_arm64.whl |
|---|---|
| Size | 270.0 kB |
| Tags | CPython 3.13 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
f001d67600153db5b56fa3326abcaec7a1da467b52d2d523ba49175b55ff1505
|
|
BLAKE2b-256 checksum How to use checksums |
5debde00548521319eb37c96bc0df04d4a054b8000d2de23b28f8f2ebbe2a3a4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.
Transparency logRelease files / hedonic-1.0.0rc1-cp312-cp312-win_arm64.whl
| Download URL | hedonic-1.0.0rc1-cp312-cp312-win_arm64.whl |
|---|---|
| Size | 271.6 kB |
| Tags | CPython 3.12 Windows ARM64 |
|
SHA-256 checksum How to use checksums |
d18c0515fb3c6b031ab98f530fec3e8c6218ece647cf93871f9bd9159de09f59
|
|
BLAKE2b-256 checksum How to use checksums |
7a3b87988e387ebad63656b6d658a9f1bc2bd0f9d3a1bd9fb90995b1efe28847
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.
Transparency logRelease files / hedonic-1.0.0rc1-cp312-cp312-win_amd64.whl
| Download URL | hedonic-1.0.0rc1-cp312-cp312-win_amd64.whl |
|---|---|
| Size | 288.5 kB |
| Tags | CPython 3.12 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
3a2fc4d91419af66ff30c79662b3bc1e9e5be062e079439b2b2d793266ddd4a3
|
|
BLAKE2b-256 checksum How to use checksums |
bdbeb476421d30dd1174f57fb5ccb28f52d2579985fbd3dc6b1e6cd3ad5a565e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.
Transparency logRelease files / hedonic-1.0.0rc1-cp312-cp312-musllinux_1_2_x86_64.whl
| Download URL | hedonic-1.0.0rc1-cp312-cp312-musllinux_1_2_x86_64.whl |
|---|---|
| Size | 317.7 kB |
| Tags | CPython 3.12 Linux musl 1.2+ x86-64 |
|
SHA-256 checksum How to use checksums |
6d4cad1771b9faa9b1bad6a5d3f9bbdf79b60a29cc9ce393a4f20460854e7b25
|
|
BLAKE2b-256 checksum How to use checksums |
6718b7603179c2ef40488786b168089654b332684657fd77f19de7c4e72bcecf
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.
Transparency logRelease files / hedonic-1.0.0rc1-cp312-cp312-musllinux_1_2_aarch64.whl
| Download URL | hedonic-1.0.0rc1-cp312-cp312-musllinux_1_2_aarch64.whl |
|---|---|
| Size | 278.5 kB |
| Tags | CPython 3.12 Linux musl 1.2+ ARM64 |
|
SHA-256 checksum How to use checksums |
3aa5a7972e306175bb28fe091bbdb0a683fe697723e72fafcfeb579d66cd7643
|
|
BLAKE2b-256 checksum How to use checksums |
14a448605eca51a933cad983652b27a8ef915f2039ed89fbb7a09ef6066f00da
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.
Transparency logRelease files / hedonic-1.0.0rc1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
| Download URL | hedonic-1.0.0rc1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 317.0 kB |
| Tags | CPython 3.12 Linux glibc 2.17+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
842166e621aa218a13ded2138c6b604cd9a8ef7722c73e4713fd51349668445f
|
|
BLAKE2b-256 checksum How to use checksums |
0a229aeacf47cd9451b5d37aad21003e056220ab0b92cd3570edc32ff859c6b8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.
Transparency logRelease files / hedonic-1.0.0rc1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
| Download URL | hedonic-1.0.0rc1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 278.8 kB |
| Tags | CPython 3.12 Linux glibc 2.17+ ARM64 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
a4ea523ced68ea86f91740e51931c0d362b9e9478c129e81b6f44acf3852aa35
|
|
BLAKE2b-256 checksum How to use checksums |
18e3f7ae5ef324fd763f1474fb6e6436f6752ff3fda57952cc975961cfcfff4d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.
Transparency logRelease files / hedonic-1.0.0rc1-cp312-cp312-macosx_11_0_x86_64.whl
| Download URL | hedonic-1.0.0rc1-cp312-cp312-macosx_11_0_x86_64.whl |
|---|---|
| Size | 285.2 kB |
| Tags | CPython 3.12 macOS 11.0+ x86-64 |
|
SHA-256 checksum How to use checksums |
2c5209bf02a3add331848fb8bcd2165b9013add8a76b1ba340411a11956b3b3e
|
|
BLAKE2b-256 checksum How to use checksums |
2e5be9abcf5d252c7dae91b3865942bfb9d440834dea455d5cf0ef50e40ef16f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.
Transparency logRelease files / hedonic-1.0.0rc1-cp312-cp312-macosx_11_0_arm64.whl
| Download URL | hedonic-1.0.0rc1-cp312-cp312-macosx_11_0_arm64.whl |
|---|---|
| Size | 270.0 kB |
| Tags | CPython 3.12 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
95361cfdd824a896007297b4167ecaa274258472c4613b6461aac36d409bc619
|
|
BLAKE2b-256 checksum How to use checksums |
93a58de3372156f1279d74376f826432dfa6d28c04ad4033f8357690dd83321f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.
Transparency logSecurity for hedonic 1.0.0rc1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 25 files in this release have been uploaded with provenance metadata.
Attestation for hedonic-1.0.0rc1.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.