gadjid


Namegadjid JSON
Version 0.0.1 PyPI version JSON
download
home_pageNone
SummaryAdjustment Identification Distance: A πšπšŠπšπš“πš’πš for Causal Structure Learning
upload_time2024-02-22 16:35:01
maintainerNone
docs_urlNone
authorTheo WΓΌrtzen, Sebastian Weichwald, Leonard Henckel
requires_python>=3.8
licenseMPL-2.0
keywords causality causal structure learning graph distance adjustment
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # 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"
}
        
Elapsed time: 0.18643s