pylmcf: min-cost-flow solvers for Python and C++
Overview
pylmcf ships two independent deliverables from one source tree:
- A Python extension — fast min-cost flow via LEMON's solvers, with a stateful object API that warm-restarts on re-solve.
- A header-only C++ include tree — LEMON extended with warm-restart machinery, plus pylmcf's own solvers: a link-cut tree, two link-cut-tree network simplex variants, and a specialised 1D-chain solver. Downstream C++ code compiles against it directly.
It is used by wnet (efficient Wasserstein and Truncated Wasserstein distance between multidimensional distributions) and wnetalign (alignment of MS or NMR spectra). Both re-solve the same graph hundreds of times with one thing moved, which is what most of the machinery here exists to make cheap.
The LCT simplex variants and 1D chain solver are also available from Python; see the Python solver APIs.
Features
- Fast min-cost flow computation using a C++ backend (LEMON's Network Simplex by default)
- Warm restarts: re-solving after changing supplies, capacities or costs reuses the retained spanning-tree basis instead of rebuilding one — docs
- Multiple solver variants: Network Simplex, Cycle Canceling, Cost Scaling, Capacity Scaling
- Supports capacities, costs, supplies/demands, and per-edge lower bounds (minimum flow)
- NetworkX integration: construct from
nx.DiGraphor convert results back for visualization - Free-threaded CPython support (a separate
cp315-abi3twheel) - A C++ header tree for downstream packages, including the standalone link-cut-tree data structure
Documentation
See the changelog for release notes and migration details.
| Warm restarts | How re-solving reuses the basis, the repair strategies, the counters and the two policy knobs. Start here — it is on by default and affects every re-solve. |
| The C++ header tree | Consuming src/pylmcf/cpp/ from your own C++, what is in it, and why the vendored LEMON must not be replaced wholesale. |
| Link-cut trees | LinkCutTree<Val> — a standalone Sleator–Tarjan link-cut tree with path-sum, path-min-with-argmin and lazy path-add. |
| LCT network simplex | NetworkSimplexLCT and the experimental NetworkSimplexLCTDyn, plus the adapter that A/B-tests them against real LEMON. |
| The 1D chain solver | ChainSolver1D — successive shortest paths specialised to the 1D-chain LP. |
| Build modes and threading | nanobind split vs linked, free-threading, what is and is not thread-safe, wheels. |
| Testing and diagnostics | The two test suites (the C++ one runs in CI under five sanitizer lanes), and the diagnostic build flags. |
Installation
pip install pylmcf
Optional extras for NetworkX support and visualization:
pip install pylmcf[extras]
Usage
Basic usage
import numpy as np
import pylmcf
# 3-node graph with edges 0→1, 0→2, 1→2
# Edges must be sorted by (start, end)
G = pylmcf.Graph(3,
edge_starts=np.array([0, 0, 1]),
edge_ends=np.array([1, 2, 2]))
G.set_node_supply(np.array([5, 0, -5])) # node 0 supplies 5, node 2 demands 5
G.set_edge_costs(np.array([1, 3, 5]))
G.set_edge_capacities(np.array([3, 3, 5]))
G.solve()
G.result() # np.array([2, 3, 2]) — flow on each edge
G.total_cost() # 21
G.potentials() # np.array([-6, -5, 0]) — node potentials (dual solution)
For performance-sensitive dual consumers, use raw_potentials(),
dual_values() or allocation-free dual_values_into(). These are also exposed
on both LCT variants. See Fast dual certificates.
potentials() returns the dual solution in LEMON's convention: the reduced cost
of edge (u, v) is cost + pi[u] - pi[v], and complementary slackness holds
against result() (reduced cost > 0 ⇒ flow at its minimum, < 0 ⇒ flow at
capacity). Potentials are not unique, so pylmcf returns a canonical choice: of
all potentials optimal for the returned flows, the pointwise-largest with
pi <= 0 (the smallest with pi >= 0 under "leq" supply, below). Its values
are bounded by path costs — LEMON's raw tree potentials can instead carry its
internal 2^62 artificial cost on some nodes.
Input arrays may be writable or read-only (including read-only NumPy memory maps); they must be contiguous and aligned to their element size. Returned flow and potential arrays are writable and own their data.
All integer arrays in the OO API are int64, and the dtype is not converted for
you — a mismatched array raises TypeError. Costs and minimums must be
non-negative, costs at most 2^62 − 1 (network simplex's artificial arcs cost
2^62 and must stay dearer than any real arc), supplies greater than the
dtype's minimum (LEMON negates them), and the graph must be feasible (see
below for unbalanced supply) or solve() raises RuntimeError: INFEASIBLE.
A rejected setter leaves the graph unchanged. As in the functional API below, the
value range is unchecked: total supply and every flow must fit in int64 with
room to spare, a capacity of INT64_MAX means unbounded, and the total cost
must fit in int64.
LCT and 1D-chain solvers
from pylmcf import NetworkSimplexLCT, lmcf_lct, lmcf_lct_dyn, solve_chain_1d
# Same five int64 arrays as the functional LEMON API; arbitrary edge order.
flows = lmcf_lct(supply, starts, ends, capacities, costs)
# lmcf_lct_dyn(...) selects the experimental dynamic-tree variant.
solver = NetworkSimplexLCT(supply, starts, ends, capacities, costs)
solver.solve()
solver.set_node_supply(new_supply)
solver.solve() # warm restart, with automatic cold fallback
chain = solve_chain_1d(
np.array([0, 10], dtype=np.int64),
np.array([5, 0], dtype=np.int64), # empirical masses
np.array([0, 5], dtype=np.int64), # theoretical masses
kappa=3,
)
chain["total_cost"] # 15: trash is cheaper than transport
These solvers require contiguous int64 arrays. LCT solvers require balanced supplies, non-negative costs, finite capacities, and zero lower bounds. Costs and topology are fixed on a stateful LCT instance. See Python solver APIs for return values, counters, validation, and the chain's SimpleTrash semantics.
Per-edge lower bounds (minimum flow)
G.set_edge_minimums(np.array([3, 0, 0])) # edge 0→1 must carry at least 3 units
G.solve()
G.result() # np.array([3, 2, 3])
G.total_cost() # 24
Unbalanced supply, and why a problem is infeasible
When total supply and demand differ, the supply type says which side may fall
short (LEMON's SupplyType; with balanced supply both mean equality):
G.set_supply_type("geq") # default: out - in >= supply. Every supply is shipped,
# demands may go unmet; needs sum(supply) <= 0.
G.set_supply_type("leq") # out - in <= supply. Every demand is met, supplies
# may go unused; needs sum(supply) >= 0.
Unbalanced re-solves do not warm-restart. When solve() raises INFEASIBLE,
infeasibility_cut() says why: a boolean mask of nodes B that must push out
more than the edges leaving B can carry (under "leq": must take in more than
the edges entering B can deliver). It returns None when the problem is
feasible, and does not need or disturb a solve.
G.set_node_supply(np.array([9, 0, -9]))
G.infeasibility_cut() # array([ True, False, False]) — node 0's out-edges carry at most 6
Re-solving: warm restarts
Changing supplies, capacities or costs and calling solve() again reuses the
basis from the previous solve. Nothing to switch on:
H = pylmcf.Graph(3,
edge_starts=np.array([0, 0, 1]),
edge_ends=np.array([1, 2, 2]))
H.set_edge_costs(np.array([1, 3, 5]))
H.set_edge_capacities(np.array([3, 3, 5]))
for d in (5, 4, 6, 2):
H.set_node_supply(np.array([d, 0, -d]))
H.solve()
print(d, H.result(), H.total_cost())
H.warm_start_count() # 2
H.cold_start_count() # 0
H.dual_repair_count() # 1
5 [2 3 2] 21
4 [1 3 1] 15
6 [3 3 3] 27
2 [0 2 0] 6
The first solve() is always cold and is not counted. The counters are how you
tell whether warm restarts are actually firing — a regression that silently routes
every re-solve through a cold rebuild still gives correct answers. Nonzero lower
bounds force a cold solve.
The pivot rule (set_pivot_rule(): "block_search" by default, or
"first_eligible", "best_eligible", "candidate_list", "altering_list"), the
warm-repair strategy (set_warm_repair(): "dual" by default, or
"repair_only", "primal", "dual_ratio", "dual_greedy") and the repair time
budget (set_warm_repair_budget()) are configurable; the defaults are what
you want unless you are benchmarking. Full details, the repair strategies, the set_warm_violation_limit() policy and
the C++ API: Warm restarts.
Constructing from a NetworkX graph
Note:
Graph.FromNX()iterates over graph elements in Python and is significantly slower than constructingGraphdirectly from numpy arrays. Prefer the direct API for performance-sensitive code.
import networkx as nx
G_nx = nx.DiGraph()
G_nx.add_edge(0, 1, weight=1, capacity=3)
G_nx.add_edge(0, 2, weight=3, capacity=3)
G_nx.add_edge(1, 2, weight=5, capacity=5)
G_nx.nodes[0]["demand"] = -5
G_nx.nodes[2]["demand"] = 5
G = pylmcf.Graph.FromNX(G_nx)
G.solve()
G.result() # np.array([2, 3, 2])
Alternative solvers
The default solver is LEMON's Network Simplex. Three alternatives are available via the low-level functional API:
from pylmcf import pylmcf_cpp
import numpy as np
a = lambda x: np.array(x, dtype=np.int64)
supply = a([5, 0, -5])
starts = a([0, 0, 1])
ends = a([1, 2, 2])
caps = a([3, 3, 5])
costs = a([1, 3, 5])
flows = pylmcf_cpp.lmcf(supply, starts, ends, caps, costs) # Network Simplex (default)
flows = pylmcf_cpp.lmcf_cycle_canceling(supply, starts, ends, caps, costs)
flows = pylmcf_cpp.lmcf_cost_scaling(supply, starts, ends, caps, costs) # int32/int64 only
flows = pylmcf_cpp.lmcf_capacity_scaling(supply, starts, ends, caps, costs) # int32/int64 only
Pass return_potentials=True to get (flows, potentials) instead; potentials
are always int64 and canonical as above, so every solver returning the same
flows returns the same potentials.
The functional API is stateless and has no warm restart. It is duck-typed over int8/16/32/64 (cost and capacity scaling excepted, which need the wider range), and each function has a with- and without-minimums overload.
Value range is the caller's responsibility, at every width. Supplies,
capacities, minimums and flows are computed in the input dtype (costs and the
objective in int64), and nothing checks that intermediate values fit — that is
what keeps the narrow types small. The sum of the positive supplies, the
magnitude of the sum of the negative ones, and therefore every arc's flow must
fit the dtype with room to spare: at the exact limit some solvers already
overflow internally. Outside that range, int8/int16 return wrong results
without an error (a feasible problem reported INFEASIBLE, say), and
int32/int64 is undefined behaviour. A capacity equal to the dtype's maximum
(127 for int8, 32767 for int16, …) means unbounded, not that number. The
total cost must fit in int64.
Visualization
G.show() # display with matplotlib
G.show("graph.png") # save to file
Threading
Independent Graph objects may be solved concurrently, including on
free-threaded CPython — tests/test_free_threading.py hammers 8 threads against
a serial oracle. A single Graph must not be driven from two threads at once:
solve() mutates the instance, takes no lock, and no binding releases the GIL.
See Build modes and threading.
Using the C++ solvers
python -m pylmcf --include
prints the include root; there is nothing to link.
g++ -I$(python -m pylmcf --include) -std=c++20 -O2 mycode.cpp -o mycode
Beyond LEMON, the tree carries pylmcf's own header-only solvers — LinkCutTree,
NetworkSimplexLCT, the experimental NetworkSimplexLCTDyn, a
lemon::NetworkSimplex-compatible adapter, and ChainSolver1D. None of these
have a Python binding. See
The C++ header tree.
Requirements
- Python 3.10+
- For a build from source (sdist, or a local checkout): a C++20 compiler
Licence
pylmcf is published under the Boost Software Licence.
src/pylmcf/cpp/lemon is a modified copy of the LEMON graph library, also
covered by the Boost Software Licence. lemon/network_simplex.h in particular
carries substantial pylmcf-specific work that upstream does not have — the entire
warm-restart machinery — so it must not be replaced with a stock LEMON
release. Diff, do not overwrite; see
the header-tree docs.
Citation
If you use this software, please cite:
Król J, Bochenek M, Jopa S, Kazimierczuk K, Gambin A, Startek MP (2026). WNetAlign: fast and accurate spectra alignment using truncated Wasserstein distance and network simplex. Briefings in Bioinformatics, 27(3), bbag247. https://doi.org/10.1093/bib/bbag247
@article{krol2026wnetalign,
title = {WNetAlign: fast and accurate spectra alignment using truncated Wasserstein distance and network simplex},
author = {Kr{\'o}l, Justyna and Bochenek, Maria and Jopa, Sylwia and Kazimierczuk, Krzysztof and Gambin, Anna and Startek, Micha{\l} Piotr},
journal = {Briefings in Bioinformatics},
volume = {27},
number = {3},
pages = {bbag247},
year = {2026},
doi = {10.1093/bib/bbag247}
}
References
- LEMON Graph Library
- wnet package
- wnetalign package
- Min Cost Flow Problem
- Sleator, D. D. and Tarjan, R. E. (1983). A data structure for dynamic trees. Journal of Computer and System Sciences 26(3), 362–391.
- Cunningham, W. H. (1976). A network simplex method. Mathematical Programming 11(1), 105–116. — the strongly-feasible-basis anti-cycling rule both LCT solvers reproduce.
Metadata
Release files for pylmcf 1.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| pylmcf-1.3.0.tar.gz | 339.3 kB | Details |
Built distributions (wheels)
Total release size: 8.6 MB
Release files / pylmcf-1.3.0.tar.gz
| Download URL | pylmcf-1.3.0.tar.gz |
|---|---|
| Size | 339.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
6b43ee0e2c574ac207104f3a2a4addb73a95a075f947b3732e499aca04a1457c
|
|
BLAKE2b-256 checksum How to use checksums |
3c4053b7560423e1e6e4a4e33ee2f64ecafdf90934ab3af4c47781c87cf914f9
|
| 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 9, 2026.
Transparency logRelease files / pylmcf-1.3.0-cp315-abi3t-win_arm64.whl
| Download URL | pylmcf-1.3.0-cp315-abi3t-win_arm64.whl |
|---|---|
| Size | 872.8 kB |
| Tags | CPython 3.15 Windows ARM64 abi3t |
|
SHA-256 checksum How to use checksums |
192d8a28cc326d90d3a0eb299ec90e05793fe03c30fd2106aad7e441211ec13a
|
|
BLAKE2b-256 checksum How to use checksums |
59964f17a1ed5b0e1354770ceb6bf537a469f7c69320ea7efe25a4bf1b6baf06
|
| 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 9, 2026.
Transparency logRelease files / pylmcf-1.3.0-cp315-abi3t-win_amd64.whl
| Download URL | pylmcf-1.3.0-cp315-abi3t-win_amd64.whl |
|---|---|
| Size | 712.1 kB |
| Tags | CPython 3.15 Windows x86-64 abi3t |
|
SHA-256 checksum How to use checksums |
f97b14b62b34d2af184544f2822c2d87d31e0665b9691d4d10c37805a99c4054
|
|
BLAKE2b-256 checksum How to use checksums |
86f336daa9e77045ca226e36f6b44003c6e6a61256362c2f0a5dc13876df35cf
|
| 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 9, 2026.
Transparency logRelease files / pylmcf-1.3.0-cp315-abi3t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
| Download URL | pylmcf-1.3.0-cp315-abi3t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 656.7 kB |
| Tags | CPython 3.15 Linux glibc 2.24+ x86-64 Linux glibc 2.28+ x86-64 abi3t |
|
SHA-256 checksum How to use checksums |
24869ee9d15617709384d24a39f03795f6ec66e9204d372e69cdf35bc7e1f6c6
|
|
BLAKE2b-256 checksum How to use checksums |
1a94644dbd85cd7d3f159f710ab46ad6e2c5b92c4522be62293dc558630e330b
|
| 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 9, 2026.
Transparency logRelease files / pylmcf-1.3.0-cp315-abi3t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
| Download URL | pylmcf-1.3.0-cp315-abi3t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 622.9 kB |
| Tags | CPython 3.15 Linux glibc 2.24+ ARM64 Linux glibc 2.28+ ARM64 abi3t |
|
SHA-256 checksum How to use checksums |
130d1ac4c8521fd7951a35cc2ded003c733ce1ee9634892535881bc365436160
|
|
BLAKE2b-256 checksum How to use checksums |
f15d117ce829904e46651900e0cd706656b818b725c668dc9609b14ba12fd8aa
|
| 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 9, 2026.
Transparency logRelease files / pylmcf-1.3.0-cp315-abi3t-macosx_11_0_arm64.whl
| Download URL | pylmcf-1.3.0-cp315-abi3t-macosx_11_0_arm64.whl |
|---|---|
| Size | 607.2 kB |
| Tags | CPython 3.15 abi3t macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
4927932d81c392e92fa0288f0f4d67fd05002abc8991551f93391ebc359c2e37
|
|
BLAKE2b-256 checksum How to use checksums |
11b17ed0291d63d45568f4c87610031d2a97c63dc6cc71c4cb4e757903ba2b2a
|
| 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 9, 2026.
Transparency logRelease files / pylmcf-1.3.0-cp315-abi3t-macosx_10_15_x86_64.whl
| Download URL | pylmcf-1.3.0-cp315-abi3t-macosx_10_15_x86_64.whl |
|---|---|
| Size | 669.5 kB |
| Tags | CPython 3.15 abi3t macOS 10.15+ x86-64 |
|
SHA-256 checksum How to use checksums |
d81cc238d3169fe056a8826f29ba3b76276b082b7caf7d7a5790b3b5e01f3237
|
|
BLAKE2b-256 checksum How to use checksums |
4fde681b145faf93bdfd2a5c29d0f17c67067588e75a599a34a8eba4045f66ce
|
| 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 9, 2026.
Transparency logRelease files / pylmcf-1.3.0-cp310-abi3-win_arm64.whl
| Download URL | pylmcf-1.3.0-cp310-abi3-win_arm64.whl |
|---|---|
| Size | 855.2 kB |
| Tags | CPython 3.10 Windows ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
55ea17bf50394526ba70b6bf9762b525d2bdc412ee99259da72e6e309643941d
|
|
BLAKE2b-256 checksum How to use checksums |
d73990d6ea2ed890fb5ddcda299de37cff2ea591b519a20d020da1ec30c3d225
|
| 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 9, 2026.
Transparency logRelease files / pylmcf-1.3.0-cp310-abi3-win_amd64.whl
| Download URL | pylmcf-1.3.0-cp310-abi3-win_amd64.whl |
|---|---|
| Size | 700.5 kB |
| Tags | CPython 3.10 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
52c14e909f760d6378b29e68ab38ea4cf57bf0c5d6db4740763624a31f3267ec
|
|
BLAKE2b-256 checksum How to use checksums |
b65763f6a46e727326319fba27e3f29822aefa0fbe3b43b2cff926b147d30af0
|
| 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 9, 2026.
Transparency logRelease files / pylmcf-1.3.0-cp310-abi3-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
| Download URL | pylmcf-1.3.0-cp310-abi3-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 656.3 kB |
| Tags | CPython 3.10 Linux glibc 2.24+ x86-64 Linux glibc 2.28+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
c9dd21aa8141b03e685dbf71a90f6361930a05ab7fc7c761c2ea5e591d7e1cfc
|
|
BLAKE2b-256 checksum How to use checksums |
57169e376b4cc4464cf31d23954a795b2652a1119e7462770e14785d748c9bed
|
| 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 9, 2026.
Transparency logRelease files / pylmcf-1.3.0-cp310-abi3-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
| Download URL | pylmcf-1.3.0-cp310-abi3-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 621.8 kB |
| Tags | CPython 3.10 Linux glibc 2.24+ ARM64 Linux glibc 2.28+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
8bb66383c5bca957bacece7325e3ba6adfd95bb121802c6eedc4693e3aaf39a4
|
|
BLAKE2b-256 checksum How to use checksums |
ea9014bdd0fb9aede726ad1c369edefbb8a78b9f479cef21396eebdfda8a5c80
|
| 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 9, 2026.
Transparency logRelease files / pylmcf-1.3.0-cp310-abi3-macosx_11_0_arm64.whl
| Download URL | pylmcf-1.3.0-cp310-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 607.7 kB |
| Tags | CPython 3.10 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
4926f11b00879750fc5addb0e364024a81e5580422cfbd715f7344745a00d60d
|
|
BLAKE2b-256 checksum How to use checksums |
e3e61f837261b3e554d87e53d1ea0cee15baf59dc82d2673780bd05dd3d0b159
|
| 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 9, 2026.
Transparency logRelease files / pylmcf-1.3.0-cp310-abi3-macosx_10_15_x86_64.whl
| Download URL | pylmcf-1.3.0-cp310-abi3-macosx_10_15_x86_64.whl |
|---|---|
| Size | 669.2 kB |
| Tags | CPython 3.10 abi3 macOS 10.15+ x86-64 |
|
SHA-256 checksum How to use checksums |
9479337b24aea9e18bf856a7c471da6a489fde5695ac54d10666446824de1264
|
|
BLAKE2b-256 checksum How to use checksums |
d9123a8be7e1601a278d1afb82474c618293ac71f2787ca16004f42ba54847d8
|
| 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 9, 2026.
Transparency log