# Adjustment Identification Distance: A ππππππ for Causal Structure Learning
This is an early release of ππππππ π₯ and feedback is very welcome!
Just [open an issue](https://github.com/CausalDisco/gadjid/issues/new/choose) on our github repository.
If you publish research using ππππππ, please cite
[our article](https://doi.org/10.48550/arXiv.2402.08616)
```bibtex
@article{henckel2024adjustment,
title = {{Adjustment Identification Distance: A gadjid for Causal Structure Learning}},
author = {Leonard Henckel and Theo WΓΌrtzen and Sebastian Weichwald},
journal = {{arXiv preprint arXiv:2402.08616}},
year = {2024},
doi = {10.48550/arXiv.2402.08616},
}
```
## Get Started Real Quick π β Introductory Example
Just `pip install gadjid` to install the latest release of ππππππ \
and run `python -c "import gadjid; help(gadjid)"` to get started
(or see [install alternatives](https://github.com/CausalDisco/gadjid#installation--python)).
```python
import gadjid
from gadjid import example, ancestor_aid, oset_aid, parent_aid, shd
import numpy as np
help(gadjid)
example.run_parent_aid()
Gtrue = np.array([
[0, 1, 1, 1, 1],
[0, 0, 1, 1, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]
], dtype=np.int8)
Gguess = np.array([
[0, 0, 1, 1, 1],
[1, 0, 1, 1, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]
], dtype=np.int8)
print(ancestor_aid(Gtrue, Gguess))
print(shd(Gtrue, Gguess))
```
---
ππππππ is implemented in Rust
and can conveniently be called from Python via our Python wrapper
(implemented using [maturin](https://www.maturin.rs/) and [PyO3](https://pyo3.rs/)).
> Evaluating graphs learned by causal discovery algorithms is difficult: The number of edges that differ between two graphs does not reflect how the graphs differ with respect to the identifying formulas they suggest for causal effects. We introduce a framework for developing causal distances between graphs which includes the
structural intervention distance for directed acyclic graphs as a special case. We use this framework to develop improved adjustment-based distances as well as extensions to completed partially directed acyclic graphs and causal orders. We develop polynomial-time reachability algorithms to compute the distances efficiently. In our package ππππππ, we provide implementations of our distances; they are orders of magnitude faster than the structural intervention distance and thereby provide a success metric for causal discovery that scales to graph sizes that were previously prohibitive.
## Implemented Distances
* `ancestor_aid(Gtrue, Gguess)`
* `oset_aid(Gtrue, Gguess)`
* `parent_aid(Gtrue, Gguess)`
* for convenience, the following distances are implemented, too
* `shd(Gtrue, Gguess)`
* `sid(Gtrue, Gguess)` β only for DAGs!
where Gtrue and Gguess are adjacency matrices of a DAG or CPDAG.
The functions are not symmetric in their input:
To calculate a distance,
identifying formulas for causal effects are inferred in the graph `Gguess`
and verified against the graph `Gtrue`.
Distances return a tuple `(normalised_distance, mistake_count)`
of the fraction of causal effects inferred in Gguess that are wrong relative to Gtrue, `normalised_distance`,
and the number of wrongly inferred causal effects, `mistake_count`.
There are $p(p-1)$ pairwise causal effects to infer in graphs with $p$ nodes
and we define normalisation as `normalised_distance = mistake_count / p(p-1)`.
All graphs are assumed simple, that is, at most one edge is allowed between any two nodes.
An adjacency matrix for a DAG may only contain 0s and 1s;
a `1` in row `s` and column `t` codes a directed edge `Xβ β Xβ`;
DAG inputs are validated for acyclicity.
An adjacency matrix for a CPDAG may only contain 0s, 1s and 2s;
a `2` in row `s` and column `t` codes a undirected edge `Xβ β Xβ`
(an additional `2` in row `t` and column `s` is ignored; only one of the two entries is required to code an undirected edge);
CPDAG inputs are not validated and __the user needs to ensure the adjacency matrix indeed codes a valid CPDAG (instead of just a PDAG)__.
You may also calculate the SID between DAGs via `parent_aid(DAGtrue, DAGguess)`,
but we recommend `ancestor_aid` and `oset_aid` and for CPDAG inputs our `parent_aid` does not coincide with the SID
(see also our accompanying article).
## Empirical Runtime Analysis
Experiments run on a laptop with 8 GB RAM and 4-core i5-8365U processor.
Here, for a graph with $p$ nodes,
sparse graphs have $10p$ edges in expectation,
dense graphs have $0.3p(p-1)/2$ edges in expectation,
and
sparse graphs have $0.75p$ edges in expectation.
__Maximum graph size feasible within 1 minute__
| Method | sparse | dense |
|--------------|-------:|------:|
| Parent-AID | 13005 | 960 |
| Ancestor-AID | 8200 | 932 |
| Oset-AID | 546 | 250 |
| SID in R | 255 | 239 |
__Average runtime__
| Method | x-sparse ($p=1000$) | sparse ($p=256$) | dense ($p=239$) |
|--------------|--------------------:|-----------------:|----------------:|
| Parent-AID | 6.3 ms | 22.8 ms | 189 ms |
| Ancestor-AID | 2.7 ms | 38.7 ms | 226 ms |
| Oset-AID | 3.2 ms | 4.69 s | 47.3 s |
| SID in R | ~1β2 h | ~60 s | ~60 s |
## LICENSE
ππππππ is available in source code form at <https://github.com/CausalDisco/gadjid>.
This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
See also the [MPL-2.0 FAQ](https://mozilla.org/MPL/2.0/FAQ).
Raw data
{
"_id": null,
"home_page": null,
"name": "gadjid",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": null,
"keywords": "causality,causal structure learning,graph distance,adjustment",
"author": "Theo W\u00fcrtzen, Sebastian Weichwald, Leonard Henckel",
"author_email": null,
"download_url": "https://files.pythonhosted.org/packages/01/09/d1fb8b763e496ba9776864aa29d8c5fe2ef5965ff222c98650131c7d0c7a/gadjid-0.0.1.tar.gz",
"platform": null,
"description": "# Adjustment Identification Distance: A \ud835\ude90\ud835\ude8a\ud835\ude8d\ud835\ude93\ud835\ude92\ud835\ude8d for Causal Structure Learning\n\nThis is an early release of \ud835\ude90\ud835\ude8a\ud835\ude8d\ud835\ude93\ud835\ude92\ud835\ude8d \ud83d\udc25 and feedback is very welcome!\nJust [open an issue](https://github.com/CausalDisco/gadjid/issues/new/choose) on our github repository.\n\nIf you publish research using \ud835\ude90\ud835\ude8a\ud835\ude8d\ud835\ude93\ud835\ude92\ud835\ude8d, please cite\n[our article](https://doi.org/10.48550/arXiv.2402.08616)\n```bibtex\n@article{henckel2024adjustment,\n title = {{Adjustment Identification Distance: A gadjid for Causal Structure Learning}},\n author = {Leonard Henckel and Theo W\u00fcrtzen and Sebastian Weichwald},\n journal = {{arXiv preprint arXiv:2402.08616}},\n year = {2024},\n doi = {10.48550/arXiv.2402.08616},\n}\n```\n\n\n## Get Started Real Quick \ud83d\ude80 \u2013 Introductory Example\n\nJust `pip install gadjid` to install the latest release of \ud835\ude90\ud835\ude8a\ud835\ude8d\ud835\ude93\ud835\ude92\ud835\ude8d \\\nand run `python -c \"import gadjid; help(gadjid)\"` to get started\n(or see [install alternatives](https://github.com/CausalDisco/gadjid#installation--python)).\n\n```python\nimport gadjid\nfrom gadjid import example, ancestor_aid, oset_aid, parent_aid, shd\nimport numpy as np\n\nhelp(gadjid)\n\nexample.run_parent_aid()\n\nGtrue = np.array([\n [0, 1, 1, 1, 1],\n [0, 0, 1, 1, 1],\n [0, 0, 0, 0, 0],\n [0, 0, 0, 0, 0],\n [0, 0, 0, 0, 0]\n], dtype=np.int8)\nGguess = np.array([\n [0, 0, 1, 1, 1],\n [1, 0, 1, 1, 1],\n [0, 0, 0, 0, 0],\n [0, 0, 0, 0, 0],\n [0, 0, 0, 0, 0]\n], dtype=np.int8)\n\nprint(ancestor_aid(Gtrue, Gguess))\nprint(shd(Gtrue, Gguess))\n```\n\n\n---\n\n\n\ud835\ude90\ud835\ude8a\ud835\ude8d\ud835\ude93\ud835\ude92\ud835\ude8d is implemented in Rust\nand can conveniently be called from Python via our Python wrapper\n(implemented using [maturin](https://www.maturin.rs/) and [PyO3](https://pyo3.rs/)).\n\n> Evaluating graphs learned by causal discovery algorithms is difficult: The number of edges that differ between two graphs does not reflect how the graphs differ with respect to the identifying formulas they suggest for causal effects. We introduce a framework for developing causal distances between graphs which includes the\nstructural intervention distance for directed acyclic graphs as a special case. We use this framework to develop improved adjustment-based distances as well as extensions to completed partially directed acyclic graphs and causal orders. We develop polynomial-time reachability algorithms to compute the distances efficiently. In our package \ud835\ude90\ud835\ude8a\ud835\ude8d\ud835\ude93\ud835\ude92\ud835\ude8d, we provide implementations of our distances; they are orders of magnitude faster than the structural intervention distance and thereby provide a success metric for causal discovery that scales to graph sizes that were previously prohibitive.\n\n\n## Implemented Distances\n\n* `ancestor_aid(Gtrue, Gguess)`\n* `oset_aid(Gtrue, Gguess)`\n* `parent_aid(Gtrue, Gguess)`\n* for convenience, the following distances are implemented, too\n * `shd(Gtrue, Gguess)`\n * `sid(Gtrue, Gguess)` \u2013 only for DAGs!\n\nwhere Gtrue and Gguess are adjacency matrices of a DAG or CPDAG.\nThe functions are not symmetric in their input:\nTo calculate a distance,\nidentifying formulas for causal effects are inferred in the graph `Gguess`\nand verified against the graph `Gtrue`.\nDistances return a tuple `(normalised_distance, mistake_count)`\nof the fraction of causal effects inferred in Gguess that are wrong relative to Gtrue, `normalised_distance`,\nand the number of wrongly inferred causal effects, `mistake_count`.\nThere are $p(p-1)$ pairwise causal effects to infer in graphs with $p$ nodes\nand we define normalisation as `normalised_distance = mistake_count / p(p-1)`.\n\nAll graphs are assumed simple, that is, at most one edge is allowed between any two nodes.\nAn adjacency matrix for a DAG may only contain 0s and 1s;\na `1` in row `s` and column `t` codes a directed edge `X\u209b \u2192 X\u209c`;\nDAG inputs are validated for acyclicity.\nAn adjacency matrix for a CPDAG may only contain 0s, 1s and 2s;\na `2` in row `s` and column `t` codes a undirected edge `X\u209b \u2014 X\u209c`\n(an additional `2` in row `t` and column `s` is ignored; only one of the two entries is required to code an undirected edge);\nCPDAG inputs are not validated and __the user needs to ensure the adjacency matrix indeed codes a valid CPDAG (instead of just a PDAG)__.\nYou may also calculate the SID between DAGs via `parent_aid(DAGtrue, DAGguess)`,\nbut we recommend `ancestor_aid` and `oset_aid` and for CPDAG inputs our `parent_aid` does not coincide with the SID\n(see also our accompanying article).\n\n\n## Empirical Runtime Analysis\n\nExperiments run on a laptop with 8 GB RAM and 4-core i5-8365U processor.\nHere, for a graph with $p$ nodes,\nsparse graphs have $10p$ edges in expectation,\ndense graphs have $0.3p(p-1)/2$ edges in expectation,\nand\nsparse graphs have $0.75p$ edges in expectation.\n\n__Maximum graph size feasible within 1 minute__\n\n| Method | sparse | dense |\n|--------------|-------:|------:|\n| Parent-AID | 13005 | 960 |\n| Ancestor-AID | 8200 | 932 |\n| Oset-AID | 546 | 250 |\n| SID in R | 255 | 239 |\n\n__Average runtime__\n| Method | x-sparse ($p=1000$) | sparse ($p=256$) | dense ($p=239$) |\n|--------------|--------------------:|-----------------:|----------------:|\n| Parent-AID | 6.3 ms | 22.8 ms | 189 ms |\n| Ancestor-AID | 2.7 ms | 38.7 ms | 226 ms |\n| Oset-AID | 3.2 ms | 4.69 s | 47.3 s |\n| SID in R | ~1\u20132 h | ~60 s | ~60 s |\n\n\n## LICENSE\n\n\ud835\ude90\ud835\ude8a\ud835\ude8d\ud835\ude93\ud835\ude92\ud835\ude8d is available in source code form at <https://github.com/CausalDisco/gadjid>.\n\nThis Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.\nIf a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.\n\nSee also the [MPL-2.0 FAQ](https://mozilla.org/MPL/2.0/FAQ).\n\n",
"bugtrack_url": null,
"license": "MPL-2.0",
"summary": "Adjustment Identification Distance: A \ud835\ude90\ud835\ude8a\ud835\ude8d\ud835\ude93\ud835\ude92\ud835\ude8d for Causal Structure Learning",
"version": "0.0.1",
"project_urls": {
"Bug Tracker": "https://github.com/CausalDisco/gadjid/issues",
"Source Code": "https://github.com/CausalDisco/gadjid",
"arXiv": "https://doi.org/10.48550/arXiv.2402.08616"
},
"split_keywords": [
"causality",
"causal structure learning",
"graph distance",
"adjustment"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "e4f5afeeaaac09fa9c6ac36862a6669d0c82ac039f1382f1af2738daee633261",
"md5": "da4e2915248f671a2e4fd823dd7d1f1f",
"sha256": "56a728b7987dcf5195fde19c78f9bc30a8714539b7f324aa2f0c4db6049ec382"
},
"downloads": -1,
"filename": "gadjid-0.0.1-cp38-abi3-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "da4e2915248f671a2e4fd823dd7d1f1f",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.8",
"size": 345961,
"upload_time": "2024-02-22T16:34:55",
"upload_time_iso_8601": "2024-02-22T16:34:55.780045Z",
"url": "https://files.pythonhosted.org/packages/e4/f5/afeeaaac09fa9c6ac36862a6669d0c82ac039f1382f1af2738daee633261/gadjid-0.0.1-cp38-abi3-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "d496595726b0c2467d309b32ccc5f5e8a618ab81f8108f1355b3da784996f747",
"md5": "3a3a1d19c30106316b535bd89a7ad782",
"sha256": "3a239106b0e02563782049ce3739f00f05e1d4c2f9dc15241bb4585979d3231d"
},
"downloads": -1,
"filename": "gadjid-0.0.1-cp38-abi3-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "3a3a1d19c30106316b535bd89a7ad782",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.8",
"size": 331652,
"upload_time": "2024-02-22T16:34:50",
"upload_time_iso_8601": "2024-02-22T16:34:50.989766Z",
"url": "https://files.pythonhosted.org/packages/d4/96/595726b0c2467d309b32ccc5f5e8a618ab81f8108f1355b3da784996f747/gadjid-0.0.1-cp38-abi3-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "b43e80bd98f8fd62970afe7e00edaa02c0fc625f6bc55ceba8a2487be80d2031",
"md5": "e5572419b3f8ffad07fba2c3dc596223",
"sha256": "a2e62f27aed06d831d617a4ee43680932e33a61e8db72efddac118ea3c5d2ee0"
},
"downloads": -1,
"filename": "gadjid-0.0.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "e5572419b3f8ffad07fba2c3dc596223",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.8",
"size": 744758,
"upload_time": "2024-02-22T16:34:34",
"upload_time_iso_8601": "2024-02-22T16:34:34.775476Z",
"url": "https://files.pythonhosted.org/packages/b4/3e/80bd98f8fd62970afe7e00edaa02c0fc625f6bc55ceba8a2487be80d2031/gadjid-0.0.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "591fa5349f91073baa4808f23d0bec25fc1c29f58e290708d31b0e277fd58824",
"md5": "23e84a1af17c87b521abf7769e1ba974",
"sha256": "cfc55a014e5bd8cfa3662fb1f3407a039c3b0beb1b735e8aee2368a18da6159b"
},
"downloads": -1,
"filename": "gadjid-0.0.1-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "23e84a1af17c87b521abf7769e1ba974",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.8",
"size": 742844,
"upload_time": "2024-02-22T16:34:43",
"upload_time_iso_8601": "2024-02-22T16:34:43.902055Z",
"url": "https://files.pythonhosted.org/packages/59/1f/a5349f91073baa4808f23d0bec25fc1c29f58e290708d31b0e277fd58824/gadjid-0.0.1-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "e9b81e0475a25053d15bbb0090e623fefc31749e70e28af5867e39cb6a9a9f2f",
"md5": "fa9a4d8beb23b08bfc826a6f17970f34",
"sha256": "641336e4e25059212780f5a12b8fa721c69d121a87e75919704d2c721ac8b1ef"
},
"downloads": -1,
"filename": "gadjid-0.0.1-cp38-abi3-musllinux_1_1_aarch64.whl",
"has_sig": false,
"md5_digest": "fa9a4d8beb23b08bfc826a6f17970f34",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.8",
"size": 916822,
"upload_time": "2024-02-22T16:34:42",
"upload_time_iso_8601": "2024-02-22T16:34:42.043960Z",
"url": "https://files.pythonhosted.org/packages/e9/b8/1e0475a25053d15bbb0090e623fefc31749e70e28af5867e39cb6a9a9f2f/gadjid-0.0.1-cp38-abi3-musllinux_1_1_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "ad53768492257d7d5d4475861e379842d7dfad7123ad1a72934c99e07dd41ff3",
"md5": "a5dde3323ceaf42b6782e7d562510e7c",
"sha256": "6596b1d96e22737e45756b44d1f5595bc1e8999af171c74ee106d84ee09558d3"
},
"downloads": -1,
"filename": "gadjid-0.0.1-cp38-abi3-musllinux_1_1_x86_64.whl",
"has_sig": false,
"md5_digest": "a5dde3323ceaf42b6782e7d562510e7c",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.8",
"size": 909021,
"upload_time": "2024-02-22T16:34:49",
"upload_time_iso_8601": "2024-02-22T16:34:49.046817Z",
"url": "https://files.pythonhosted.org/packages/ad/53/768492257d7d5d4475861e379842d7dfad7123ad1a72934c99e07dd41ff3/gadjid-0.0.1-cp38-abi3-musllinux_1_1_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "820b0101d3c31b00ed7e0adafa3ad8252af8a422c35bb0bbc54271752084f3ab",
"md5": "a08e0e31b176f7c79c7b49797944998e",
"sha256": "556bbeaa88cac71fa63b65a92e48a5d527fe24befebc66c09b16bbfc1a1542a5"
},
"downloads": -1,
"filename": "gadjid-0.0.1-cp38-abi3-win_amd64.whl",
"has_sig": false,
"md5_digest": "a08e0e31b176f7c79c7b49797944998e",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.8",
"size": 217910,
"upload_time": "2024-02-22T16:35:04",
"upload_time_iso_8601": "2024-02-22T16:35:04.799658Z",
"url": "https://files.pythonhosted.org/packages/82/0b/0101d3c31b00ed7e0adafa3ad8252af8a422c35bb0bbc54271752084f3ab/gadjid-0.0.1-cp38-abi3-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "778d981e8c534fe7e71325e51391b8b4eb0638dd38208313fa8c7795f7e05560",
"md5": "165b8c0c20f0fdcc930cf839dcace9fd",
"sha256": "c3496d747d137b7dccdcee6e793390288b46b7a552d0b55ae4a743e021fb85b9"
},
"downloads": -1,
"filename": "gadjid-0.0.1-cp38-abi3-win_arm64.whl",
"has_sig": false,
"md5_digest": "165b8c0c20f0fdcc930cf839dcace9fd",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.8",
"size": 203808,
"upload_time": "2024-02-22T16:35:03",
"upload_time_iso_8601": "2024-02-22T16:35:03.130764Z",
"url": "https://files.pythonhosted.org/packages/77/8d/981e8c534fe7e71325e51391b8b4eb0638dd38208313fa8c7795f7e05560/gadjid-0.0.1-cp38-abi3-win_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "14d33af083e1e4e49bd46b3b805dd9260511bbd1439d5c5a010c54379a88e51e",
"md5": "0e2f83cd2289d6c6e60138bf6cd8f49e",
"sha256": "48f1816916f1e438048858d16b869667fc259331d262c72ec7d248a8e41b00b1"
},
"downloads": -1,
"filename": "gadjid-0.0.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "0e2f83cd2289d6c6e60138bf6cd8f49e",
"packagetype": "bdist_wheel",
"python_version": "pp310",
"requires_python": ">=3.8",
"size": 345455,
"upload_time": "2024-02-22T16:34:57",
"upload_time_iso_8601": "2024-02-22T16:34:57.782308Z",
"url": "https://files.pythonhosted.org/packages/14/d3/3af083e1e4e49bd46b3b805dd9260511bbd1439d5c5a010c54379a88e51e/gadjid-0.0.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "11088d7a32be7c504e78ab1c8b254bc2ca9d1aeb185e466e00bdd14e307cb886",
"md5": "e162c8d9b80de9e5303eb475ab55a9ae",
"sha256": "4d06f6be98d38f23281cdd020aa045180b91662fa1f74cddde2ea6681bb02568"
},
"downloads": -1,
"filename": "gadjid-0.0.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "e162c8d9b80de9e5303eb475ab55a9ae",
"packagetype": "bdist_wheel",
"python_version": "pp310",
"requires_python": ">=3.8",
"size": 331254,
"upload_time": "2024-02-22T16:34:52",
"upload_time_iso_8601": "2024-02-22T16:34:52.637174Z",
"url": "https://files.pythonhosted.org/packages/11/08/8d7a32be7c504e78ab1c8b254bc2ca9d1aeb185e466e00bdd14e307cb886/gadjid-0.0.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "9683ca2321d2c9939f989b7bb946dc5200e233515f86db1e3ebe5024f89e1e0e",
"md5": "8c2002b6f04f6417143fd2d7f4e3c621",
"sha256": "772b1c2ebee44f9de75e18d3262683ea50d22e612732dfc0fb2293259331d080"
},
"downloads": -1,
"filename": "gadjid-0.0.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "8c2002b6f04f6417143fd2d7f4e3c621",
"packagetype": "bdist_wheel",
"python_version": "pp310",
"requires_python": ">=3.8",
"size": 744476,
"upload_time": "2024-02-22T16:34:37",
"upload_time_iso_8601": "2024-02-22T16:34:37.049776Z",
"url": "https://files.pythonhosted.org/packages/96/83/ca2321d2c9939f989b7bb946dc5200e233515f86db1e3ebe5024f89e1e0e/gadjid-0.0.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "cc81f808bffa4acebfc0b55c1dc96f2e29aa05c21b65f9d814975743d9e52ba3",
"md5": "4fc4bf4b98d63162f8db3404d1364564",
"sha256": "9e6b14664a6f7a3fc5da5f0a46e81a325cfe29b1952f4f437b806f8645503825"
},
"downloads": -1,
"filename": "gadjid-0.0.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "4fc4bf4b98d63162f8db3404d1364564",
"packagetype": "bdist_wheel",
"python_version": "pp310",
"requires_python": ">=3.8",
"size": 742598,
"upload_time": "2024-02-22T16:34:45",
"upload_time_iso_8601": "2024-02-22T16:34:45.615777Z",
"url": "https://files.pythonhosted.org/packages/cc/81/f808bffa4acebfc0b55c1dc96f2e29aa05c21b65f9d814975743d9e52ba3/gadjid-0.0.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "4ad3c7c78b50c6b874fdfb171f11f7ccfa39f715acae4e6d3e6c9c9716f57714",
"md5": "8def97bcbf1b99b80fe41df6a5cef426",
"sha256": "4efcb4418d58f4b96c723827f24172f6ca5bb3031b7fbae60a2a7b9f4926b82d"
},
"downloads": -1,
"filename": "gadjid-0.0.1-pp310-pypy310_pp73-win_amd64.whl",
"has_sig": false,
"md5_digest": "8def97bcbf1b99b80fe41df6a5cef426",
"packagetype": "bdist_wheel",
"python_version": "pp310",
"requires_python": ">=3.8",
"size": 217559,
"upload_time": "2024-02-22T16:35:06",
"upload_time_iso_8601": "2024-02-22T16:35:06.470096Z",
"url": "https://files.pythonhosted.org/packages/4a/d3/c7c78b50c6b874fdfb171f11f7ccfa39f715acae4e6d3e6c9c9716f57714/gadjid-0.0.1-pp310-pypy310_pp73-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "de2f8301d4f422aa9f31bd784363f3560511f139f80e33974762ad3c5b2d469b",
"md5": "19ca10af19e25af86c4925de4f6da891",
"sha256": "23399bc5899daf1de00b7980c195bf11b9e871802d1b1dcce8b6f27055be84e8"
},
"downloads": -1,
"filename": "gadjid-0.0.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "19ca10af19e25af86c4925de4f6da891",
"packagetype": "bdist_wheel",
"python_version": "pp39",
"requires_python": ">=3.8",
"size": 345427,
"upload_time": "2024-02-22T16:34:59",
"upload_time_iso_8601": "2024-02-22T16:34:59.483738Z",
"url": "https://files.pythonhosted.org/packages/de/2f/8301d4f422aa9f31bd784363f3560511f139f80e33974762ad3c5b2d469b/gadjid-0.0.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "05d4b52c1b11b4a83f7af43a3fe74e81ddc2f6737853418e81ce5691e0634476",
"md5": "d869602fcf521e946cc4698ef397502a",
"sha256": "b2284f9d7b83c4623b3ee34568d5e939d8c6029167a9c23850e0af1b591b8131"
},
"downloads": -1,
"filename": "gadjid-0.0.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "d869602fcf521e946cc4698ef397502a",
"packagetype": "bdist_wheel",
"python_version": "pp39",
"requires_python": ">=3.8",
"size": 331246,
"upload_time": "2024-02-22T16:34:54",
"upload_time_iso_8601": "2024-02-22T16:34:54.458347Z",
"url": "https://files.pythonhosted.org/packages/05/d4/b52c1b11b4a83f7af43a3fe74e81ddc2f6737853418e81ce5691e0634476/gadjid-0.0.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "81232d5f26d6d5f73b7565ac64f5929e927c64e03237101797b1a82a545fcf2c",
"md5": "3f42b4d2147210033e4073176fabc4d8",
"sha256": "bf20a4327cd630987814c7e92b77ff5c97c0ed6a93f686df090613bf5084a68c"
},
"downloads": -1,
"filename": "gadjid-0.0.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "3f42b4d2147210033e4073176fabc4d8",
"packagetype": "bdist_wheel",
"python_version": "pp39",
"requires_python": ">=3.8",
"size": 744468,
"upload_time": "2024-02-22T16:34:38",
"upload_time_iso_8601": "2024-02-22T16:34:38.863477Z",
"url": "https://files.pythonhosted.org/packages/81/23/2d5f26d6d5f73b7565ac64f5929e927c64e03237101797b1a82a545fcf2c/gadjid-0.0.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "fbe3124c1c6cbeabe241f2891f86cc010656288b261c0647aacb645e410bc886",
"md5": "7e07d1f2da66cc6762b5aae80eb8560a",
"sha256": "8da6c4743e03aaf3781944c6395a54f43760e4b0cc67a5111c702b283817a775"
},
"downloads": -1,
"filename": "gadjid-0.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "7e07d1f2da66cc6762b5aae80eb8560a",
"packagetype": "bdist_wheel",
"python_version": "pp39",
"requires_python": ">=3.8",
"size": 742595,
"upload_time": "2024-02-22T16:34:47",
"upload_time_iso_8601": "2024-02-22T16:34:47.363706Z",
"url": "https://files.pythonhosted.org/packages/fb/e3/124c1c6cbeabe241f2891f86cc010656288b261c0647aacb645e410bc886/gadjid-0.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "580ef8475f280b6f9af1d9449ab268821de13b9eea8773cc1da0e7a186b39cd3",
"md5": "c779ad1b0d128a10bce04704b22046ed",
"sha256": "f900bc26db6afcbb04ab2b5c8cb5c133ab00b64cd1aae0684cfaeede95b91705"
},
"downloads": -1,
"filename": "gadjid-0.0.1-pp39-pypy39_pp73-win_amd64.whl",
"has_sig": false,
"md5_digest": "c779ad1b0d128a10bce04704b22046ed",
"packagetype": "bdist_wheel",
"python_version": "pp39",
"requires_python": ">=3.8",
"size": 217541,
"upload_time": "2024-02-22T16:35:08",
"upload_time_iso_8601": "2024-02-22T16:35:08.188752Z",
"url": "https://files.pythonhosted.org/packages/58/0e/f8475f280b6f9af1d9449ab268821de13b9eea8773cc1da0e7a186b39cd3/gadjid-0.0.1-pp39-pypy39_pp73-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "0109d1fb8b763e496ba9776864aa29d8c5fe2ef5965ff222c98650131c7d0c7a",
"md5": "c62ddd9c3bf6d32b5ee1c88f2e1823c3",
"sha256": "aaf9783e9c55c2909d8730a5f122278ce661837c3965b128b9e7f15a53db535c"
},
"downloads": -1,
"filename": "gadjid-0.0.1.tar.gz",
"has_sig": false,
"md5_digest": "c62ddd9c3bf6d32b5ee1c88f2e1823c3",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 37025,
"upload_time": "2024-02-22T16:35:01",
"upload_time_iso_8601": "2024-02-22T16:35:01.164281Z",
"url": "https://files.pythonhosted.org/packages/01/09/d1fb8b763e496ba9776864aa29d8c5fe2ef5965ff222c98650131c7d0c7a/gadjid-0.0.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-02-22 16:35:01",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "CausalDisco",
"github_project": "gadjid",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "gadjid"
}