OT-LiNGAM
Optimal Transport LiNGAM.
Scikit-learn-compatible causal discovery for linear non-Gaussian systems.
otlingam is a Python package for causal discovery in linear non-Gaussian structural equation models. It learns causal orders by maximizing the Wasserstein non-Gaussianity of standardized regression residuals and estimates edge weights with adaptive Lasso.
✨ Features
- Exhaustive causal-order learning:
ExhaustiveOTLiNGAMuses subset dynamic programming to find a globally optimal order. - Scalable greedy learning:
GreedyOTLiNGAMconstructs an order by sequentially selecting the most non-Gaussian residual. - Optimal transport ICA:
OTICALiNGAMusesOTICAwith FastICA initialization in the classical ICA-LiNGAM pipeline. - Exact empirical criterion: Computes one-dimensional Wasserstein scores directly from ordered residuals and Gaussian quantiles.
- LiNGAM integration: Exposes causal orders and weighted adjacency matrices through the established LiNGAM estimator API.
- scikit-learn integration: Native
BaseEstimatorintegration with familiarfit,get_params,set_params, andclonesupport.
⚡ Method
The estimators assume the linear structural equation model
$$ X_j = \sum_{k \in \mathrm{Pa}(j)} B_{jk} X_k + \varepsilon_j, $$
where the graph is acyclic and the structural noises are mutually independent, centered, and have finite nonzero variances. Causal-order identification additionally requires at most one Gaussian structural noise.
For a candidate order $\sigma$, let $R_j(\sigma)$ be the population residual obtained by regressing $X_j$ on its predecessors under $\sigma$. The oracle Wasserstein order objective is
$$ G(\sigma) = \sum_{j = 1}^{d} \mathcal{W}_2\left( \mathrm{std}(R_j(\sigma)), \mathcal{N}(0, 1) \right)^2. $$
Given $n$ observations, let $\widehat{R}_j^{(i)}(\sigma)$ be the ordinary least-squares residual for observation $i$. OTLiNGAM maximizes the empirical order objective
$$ \widehat{G}n(\sigma) = \sum{j = 1}^{d} \mathcal{W}2\left( \mathrm{std}\left( \frac{1}{n} \sum{i = 1}^{n} \delta_{\widehat{R}_j^{(i)}(\sigma)} \right), \mathcal{N}(0, 1) \right)^2. $$
At the population level, the maximizers of $G$ are exactly the topological orders under the stated assumptions. A topological order exposes the independent structural noises as regression residuals, whereas an incorrect order may mix several noises and reduce the total objective. Each empirical one-dimensional Wasserstein distance is evaluated exactly by sorting the standardized residuals and comparing them with the Gaussian reference quantiles.
🚀 Installation
python -m pip install otlingam
🔧 Usage
Example
The following example simulates a linear non-Gaussian structural equation model, learns a causal order with GreedyOTLiNGAM, and compares the true and estimated weighted adjacency matrices.
import matplotlib.pyplot as plt
import numpy as np
from otlingam import GreedyOTLiNGAM, disorder
rng = np.random.default_rng(42)
n_samples = 5000
adjacency_matrix = np.array(
[
[0.0, 0.0, 0.0, 0.0, 0.0],
[0.8, 0.0, 0.0, 0.0, 0.0],
[0.0, -0.7, 0.0, 0.0, 0.0],
[0.5, 0.0, 0.9, 0.0, 0.0],
[0.0, -0.6, 0.0, 0.7, 0.0],
]
)
noise = rng.uniform(-1.0, 1.0, size=(n_samples, 5))
X = noise @ np.linalg.inv(np.eye(5) - adjacency_matrix).T
model = GreedyOTLiNGAM().fit(X)
print("Estimated causal order:", model.causal_order_)
print("Disorder:", disorder(model.causal_order_, adjacency_matrix))
fig, axes = plt.subplots(1, 2, figsize=(10, 4), layout="constrained")
matrices = (adjacency_matrix, model.adjacency_matrix_)
titles = ("True adjacency matrix", "Estimated adjacency matrix")
for ax, matrix, title in zip(axes, matrices, titles, strict=True):
image = ax.imshow(matrix, cmap="RdBu_r", vmin=-1.0, vmax=1.0)
ax.set_title(title)
ax.set_xlabel("Parent")
ax.set_ylabel("Child")
fig.colorbar(image, ax=axes, label="Edge weight")
plt.show()
ExhaustiveOTLiNGAM provides global order optimization at an exponential cost in the number of variables. GreedyOTLiNGAM provides a quadratic-time alternative. Set fit_intercept=False when the observations are already centered. The default fit_intercept=True centers the data and exposes the fitted intercepts through intercept_.
📊 Reproducing Results
Clone the repository, create and activate a virtual environment, then install the exact package versions used for the paper:
python -m pip install -r scripts/requirements.txt
Keep the repository folder layout unchanged: do not move, rename, or flatten its folders, because the experiment scripts resolve paths relative to their file locations.
Run the experiment scripts from the repository root:
python scripts/statistical-performance.py --nd
python scripts/statistical-performance.py --heterogeneity
python scripts/statistical-performance.py --k
python scripts/runtime-scaling.py
Alternatively, run all experiments sequentially on Windows, Linux, or macOS:
python run-all.py
The runner uses the active Python interpreter and stops if an experiment fails.
These commands write varying-nd-disorder.pdf, noise-heterogeneity-disorder.pdf, varying-k-performance.pdf, and runtime-scaling.pdf to figures/. The paper settings (including random seed 42, sample sizes, dimensions, graph configurations, and run counts) are defined as constants near the top of each script.
Release files for otlingam 0.5.8
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distributions (wheels)
Total release size: 10.7 MB
Release files / otlingam-0.5.8-cp314-cp314-win_arm64.whl
| Download URL | otlingam-0.5.8-cp314-cp314-win_arm64.whl |
|---|---|
| Size | 660.8 kB |
| Tags | CPython 3.14 Windows ARM64 |
|
SHA-256 checksum How to use checksums |
05413163765eea1df25d78936c9d7625cb1e33e3fb19d1a60d821aca4d46425a
|
|
BLAKE2b-256 checksum How to use checksums |
871606003a949a28ac7d5298b44bd57bfa56f010ea4a5de2cecc35d46846bca0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / otlingam-0.5.8-cp314-cp314-win_amd64.whl
| Download URL | otlingam-0.5.8-cp314-cp314-win_amd64.whl |
|---|---|
| Size | 1.3 MB |
| Tags | CPython 3.14 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
732c03ca5fe4baeb4b0c081777b885df6f26a04b764962b1df496ae6e5be33da
|
|
BLAKE2b-256 checksum How to use checksums |
e8a8fa5c2b43958f48c68cdc086dff36ea491d92d62fa2b027c40dff29030588
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / otlingam-0.5.8-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl
| Download URL | otlingam-0.5.8-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 239.4 kB |
| Tags | CPython 3.14 Linux glibc 2.26+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
7dd7948d9bd8da4c9042157c702cd9fccccf550f1a2ae3246604cce33fbf7cab
|
|
BLAKE2b-256 checksum How to use checksums |
3902f8e3009230a9246ba77ca706a600df62974975de62a1ceae2c9120539267
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / otlingam-0.5.8-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
| Download URL | otlingam-0.5.8-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 188.0 kB |
| Tags | CPython 3.14 Linux glibc 2.26+ ARM64 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
3aa3fab4aa075296f39e9a5dd4c92906ee34e92de9a1cabde2c4aa76a87011d4
|
|
BLAKE2b-256 checksum How to use checksums |
c23bc51c0fb0b7e5af170d9e3dc9c539618b8fe3f9d1b2df32ed16d2df33fef6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / otlingam-0.5.8-cp314-cp314-macosx_11_0_arm64.whl
| Download URL | otlingam-0.5.8-cp314-cp314-macosx_11_0_arm64.whl |
|---|---|
| Size | 134.7 kB |
| Tags | CPython 3.14 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
aed16cb59f670b7896f981d2fccefa403972ac0bdb99538f7e528b85e4098105
|
|
BLAKE2b-256 checksum How to use checksums |
9b442d9d9522ce046c38b4f621f77ee192427ee41989dae519df9419cad5b170
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / otlingam-0.5.8-cp314-cp314-macosx_10_15_x86_64.whl
| Download URL | otlingam-0.5.8-cp314-cp314-macosx_10_15_x86_64.whl |
|---|---|
| Size | 182.3 kB |
| Tags | CPython 3.14 macOS 10.15+ x86-64 |
|
SHA-256 checksum How to use checksums |
226a23ef0d6e1844edba57db7e4c68272b815ddf53ddd1b79ab263f6ba97344e
|
|
BLAKE2b-256 checksum How to use checksums |
20f29affef5523638b930338cfd1d1f2a2ae20b86c80431e166a501c33646d4c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / otlingam-0.5.8-cp313-cp313-win_arm64.whl
| Download URL | otlingam-0.5.8-cp313-cp313-win_arm64.whl |
|---|---|
| Size | 640.5 kB |
| Tags | CPython 3.13 Windows ARM64 |
|
SHA-256 checksum How to use checksums |
383ba3c7592a2988990a88ffe66b9852fb43e54d8de4ada6ebc24faa42e005d9
|
|
BLAKE2b-256 checksum How to use checksums |
9b1750da62905ea49c1389c78ec24a53acc49c382a981dc4134a760c80ebb371
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / otlingam-0.5.8-cp313-cp313-win_amd64.whl
| Download URL | otlingam-0.5.8-cp313-cp313-win_amd64.whl |
|---|---|
| Size | 1.3 MB |
| Tags | CPython 3.13 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
38fcf3cd6b818f2feeaaaba76d7bc311569689b656f539643c06807bda80c8aa
|
|
BLAKE2b-256 checksum How to use checksums |
0ba6c22e20599d21e0ed96b5cbb8f9022fb2956cd4ec96620322e4eee1f9b8c8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / otlingam-0.5.8-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl
| Download URL | otlingam-0.5.8-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 239.3 kB |
| Tags | CPython 3.13 Linux glibc 2.26+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
507452f370cd2404a8ab220b0f56f927994049cbd833f9930580bfd622c5537f
|
|
BLAKE2b-256 checksum How to use checksums |
7b05962b95d6b534eb76bc41287180f5a647c606a9fbd449f3991003d1a8ac7b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / otlingam-0.5.8-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
| Download URL | otlingam-0.5.8-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 187.6 kB |
| Tags | CPython 3.13 Linux glibc 2.26+ ARM64 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
6eb1dc2d8fc4de8b422b07389b93e1f6c60bdf1febf7afd4aeed7e1fc5db248e
|
|
BLAKE2b-256 checksum How to use checksums |
96c4a041ecc94d4b2faca0d7bf484195c971fbd79ed425f0311f03214fcc59be
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / otlingam-0.5.8-cp313-cp313-macosx_11_0_arm64.whl
| Download URL | otlingam-0.5.8-cp313-cp313-macosx_11_0_arm64.whl |
|---|---|
| Size | 134.7 kB |
| Tags | CPython 3.13 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
0b6f75b9515de0c8273860149ea7b83dfe966bd6d30340df93931291ebd9f791
|
|
BLAKE2b-256 checksum How to use checksums |
fc96aee417a6aed11a3187a101900cda12b175b384d79b946235cd7627258950
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / otlingam-0.5.8-cp313-cp313-macosx_10_13_x86_64.whl
| Download URL | otlingam-0.5.8-cp313-cp313-macosx_10_13_x86_64.whl |
|---|---|
| Size | 182.2 kB |
| Tags | CPython 3.13 macOS 10.13+ x86-64 |
|
SHA-256 checksum How to use checksums |
d266185a27213436cfbaad47cc1acf81750e8494ea43c2d592c1fc6353beda04
|
|
BLAKE2b-256 checksum How to use checksums |
815fda8f62ca09ec1cb5b8cc935407b5f4d603bc5008c19ea9931320e778b481
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / otlingam-0.5.8-cp312-cp312-win_arm64.whl
| Download URL | otlingam-0.5.8-cp312-cp312-win_arm64.whl |
|---|---|
| Size | 640.2 kB |
| Tags | CPython 3.12 Windows ARM64 |
|
SHA-256 checksum How to use checksums |
e18cf14cb8d6f415cd8b67ed3615ab56cdfaca2c96a4c49500e21d6b235d26c8
|
|
BLAKE2b-256 checksum How to use checksums |
5e283485202a7b4c322c8cac951489995109eace178929163eb5ecfbcdfad7b8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / otlingam-0.5.8-cp312-cp312-win_amd64.whl
| Download URL | otlingam-0.5.8-cp312-cp312-win_amd64.whl |
|---|---|
| Size | 1.3 MB |
| Tags | CPython 3.12 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
113145105142be425adf2cd0bcb4e6e6c4f7e38d20147c729cf3ec387c172674
|
|
BLAKE2b-256 checksum How to use checksums |
d4acbe621b469e58ba265bc538260fa6745047efcb92d8811cbc561915f074ec
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / otlingam-0.5.8-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl
| Download URL | otlingam-0.5.8-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 239.4 kB |
| Tags | CPython 3.12 Linux glibc 2.26+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
1643a755fc54960c68b80dbbf5f0dcb619a77b12cc4b15e84592f06fff0be6d4
|
|
BLAKE2b-256 checksum How to use checksums |
9cee3da5054ccdbd2fb3d4aadab0b40169e8fd68df3a8da5595caaaf5f0d8c07
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / otlingam-0.5.8-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
| Download URL | otlingam-0.5.8-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 187.6 kB |
| Tags | CPython 3.12 Linux glibc 2.26+ ARM64 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
ac74308d235d8e1ebb72e1167b1d51f77bef06b340f685c907c3ff283366127c
|
|
BLAKE2b-256 checksum How to use checksums |
b5b525e6bfdf22c1658ba7295e9d4491a350e0f3402aa6131978f300e2643a20
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / otlingam-0.5.8-cp312-cp312-macosx_11_0_arm64.whl
| Download URL | otlingam-0.5.8-cp312-cp312-macosx_11_0_arm64.whl |
|---|---|
| Size | 134.6 kB |
| Tags | CPython 3.12 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
2ce6ff475f09cc3a0a9a7fa10fdce2d3c2ee1811df9a5a7083932182deb9755c
|
|
BLAKE2b-256 checksum How to use checksums |
d9f371a5312cf32235b73d2ad792062ae6b86088d2b7b5f411ef40577a5619d6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / otlingam-0.5.8-cp312-cp312-macosx_10_13_x86_64.whl
| Download URL | otlingam-0.5.8-cp312-cp312-macosx_10_13_x86_64.whl |
|---|---|
| Size | 182.1 kB |
| Tags | CPython 3.12 macOS 10.13+ x86-64 |
|
SHA-256 checksum How to use checksums |
66376a5d69185f202368c37af2dab02092fa9fc9de007dbab232485a5cab2abd
|
|
BLAKE2b-256 checksum How to use checksums |
8b3a43f2adccf8ba56b271961930cc9e9cf707ff25a0368eb7b91f32a285a6a3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / otlingam-0.5.8-cp311-cp311-win_arm64.whl
| Download URL | otlingam-0.5.8-cp311-cp311-win_arm64.whl |
|---|---|
| Size | 638.8 kB |
| Tags | CPython 3.11 Windows ARM64 |
|
SHA-256 checksum How to use checksums |
8285d24d783ab104ae8ec112012a18aeee967b17aa6eebcf689ac7500f71166c
|
|
BLAKE2b-256 checksum How to use checksums |
7ae189e60917c5b1740c46c86fa948156083d464d8df81145c27395e0267355d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / otlingam-0.5.8-cp311-cp311-win_amd64.whl
| Download URL | otlingam-0.5.8-cp311-cp311-win_amd64.whl |
|---|---|
| Size | 1.3 MB |
| Tags | CPython 3.11 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
bbfee0d7efeece9b793395aad647014c5ff5ff0823d633731098157176814372
|
|
BLAKE2b-256 checksum How to use checksums |
933505dc28a9842a693639862b000089dc366ba559dfb6c9067feb137f3cd6e4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / otlingam-0.5.8-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl
| Download URL | otlingam-0.5.8-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 237.2 kB |
| Tags | CPython 3.11 Linux glibc 2.26+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
1776a234775af77427039c7335218a0acd11d75ff97d06f466dfdcb689dd1d23
|
|
BLAKE2b-256 checksum How to use checksums |
5757a6cdbe9a543db5adf2f0445822f8fd5b30686aed4cd7a6b6e125dbf2e498
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / otlingam-0.5.8-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
| Download URL | otlingam-0.5.8-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 186.1 kB |
| Tags | CPython 3.11 Linux glibc 2.26+ ARM64 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
017a31336b33e58e89b6f7dc8509474823f2a229de682bf70360f7da732b83e9
|
|
BLAKE2b-256 checksum How to use checksums |
1fe1ab558655975f607cb5195ad6f1cf55575a8b322c326f4b1de7a052f14f13
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / otlingam-0.5.8-cp311-cp311-macosx_11_0_arm64.whl
| Download URL | otlingam-0.5.8-cp311-cp311-macosx_11_0_arm64.whl |
|---|---|
| Size | 132.5 kB |
| Tags | CPython 3.11 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
5a495c4b870e3fcdc2e0a8b63fd22a6ae260010793d721023f4f06a2b5436da5
|
|
BLAKE2b-256 checksum How to use checksums |
e3a54680ffdf78e0386db94e2ac96131281975d8f4fb396fca1555de09ee1a25
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / otlingam-0.5.8-cp311-cp311-macosx_10_9_x86_64.whl
| Download URL | otlingam-0.5.8-cp311-cp311-macosx_10_9_x86_64.whl |
|---|---|
| Size | 182.6 kB |
| Tags | CPython 3.11 macOS 10.9+ x86-64 |
|
SHA-256 checksum How to use checksums |
f21e34e22455da727f9ae1b1867e5cff60e113c5106e0b91c0c8972ca59f2a1f
|
|
BLAKE2b-256 checksum How to use checksums |
71e3087af3dacb5e8d12d59b89c708585f9318e3038bdd3b6c2b25fa776c598d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|