gadjid


Namegadjid JSON
Version 0.1.0 PyPI version JSON
download
home_pageNone
SummaryAdjustment Identification Distance: A πšπšŠπšπš“πš’πš for Causal Structure Learning
upload_time2024-07-11 15:43:32
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 github.

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, edge_direction="from row to column"))
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 new reachability algorithms to compute the distances efficiently and to prove their low polynomial time complexity. In our package gadjid, we provide implementations of our distances; they are orders of magnitude faster with proven lower time complexity than the structural intervention distance and thereby provide a success metric for causal discovery that scales to graph sizes that were previously prohibitive.


### Parallelism – setting the number of threads

πšπšŠπšπš“πš’πš uses [rayon](https://docs.rs/rayon/latest/rayon/) for parallelism
using, per default, as many threads as there are physical CPU cores.
The number of threads to use can be set via the environment variable `RAYON_NUM_THREADS`.
We recommend to do so and to set the number of threads manually,
not least to be explicit and to avoid the small runtime overhead for determining the number of physical CPU cores.


## Implemented Distances

* `ancestor_aid(Gtrue, Gguess, edge_direction)`
* `oset_aid(Gtrue, Gguess, edge_direction)`
* `parent_aid(Gtrue, Gguess, edge_direction)`
* for convenience, the following distances are implemented, too
    * `shd(Gtrue, Gguess)`
    * `sid(Gtrue, Gguess, edge_direction)` – only for DAGs!

where `Gtrue` and `Gguess` are adjacency matrices of a DAG or CPDAG
and `edge_direction` determines whether a `1` at r-th row and c-th column of an adjacency matrix
codes the edge `r β†’ c` (`edge_direction="from row to column"`) or `c β†’ r` (`edge_direction="from column to row"`).
The functions are not symmetric in their inputs:
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)`.

You may also calculate the SID between DAGs via `parent_aid(DAGtrue, DAGguess, edge_direction)`,
but we recommend `ancestor_aid` and `oset_aid` and for CPDAG inputs the `parent_aid` does not coincide with the SID
(see also our accompanying article).

If `edge_direction="from row to column"`, then
a `1` in row `r` and column `c` codes a directed edge `r β†’ c`;
if `edge_direction="from column to row"`, then
a `1` in row `r` and column `c` codes a directed edge `c β†’ r`;
for either setting of `edge_direction`,
a `2` in row `r` and column `c` codes an undirected edge `r – c`
(an additional `2` in row `c` and column `r` is ignored;
one of the two entries is sufficient to code an undirected edge).

An adjacency matrix for a DAG may only contain 0s and 1s.
An adjacency matrix for a CPDAG may only contain 0s, 1s and 2s.
DAG and CPDAG inputs are validated for acyclicity.
However, for CPDAG inputs, __the user needs to ensure the adjacency
matrix indeed codes a valid CPDAG (instead of just a PDAG)__.


## 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
x-sparse graphs have $0.75p$ edges in expectation.

__Maximum graph size feasible within 1 minute__

| Method       | sparse | dense |
|--------------|-------:|------:|
| Parent-AID   |  13601 |   962 |
| Ancestor-AID |   8211 |   932 |
| Oset-AID     |   1105 |   508 |
| SID in R     |    256 |   239 |

Results obtained with πšπšŠπšπš“πš’πš v0.1.0 using the Python interface
and the SID R package v1.1 from CRAN.

__Average runtime__
| Method       | x-sparse ($p=1000$) | sparse ($p=256$) | dense ($p=239$) |
|--------------|--------------------:|-----------------:|----------------:|
| Parent-AID   |              7.3 ms |          30.5 ms |          173 ms |
| Ancestor-AID |              3.4 ms |          40.9 ms |          207 ms |
| Oset-AID     |              5.0 ms |           567 ms |         1.68 s  |
| SID in R     |             ~1–2 h  |           ~60 s  |          ~60 s  |

Results obtained with πšπšŠπšπš“πš’πš v0.1.0 using the Python interface
and the SID R package v1.1 from CRAN.


## 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/fe/db/f85da1d0aeaf34d3c5ff00485c35f359cc96c4ca9263e42b1a4fc10a55f9/gadjid-0.1.0.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 github.\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, edge_direction=\"from row to column\"))\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 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 new reachability algorithms to compute the distances efficiently and to prove their low polynomial time complexity. In our package gadjid, we provide implementations of our distances; they are orders of magnitude faster with proven lower time complexity 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### Parallelism \u2013 setting the number of threads\n\n\ud835\ude90\ud835\ude8a\ud835\ude8d\ud835\ude93\ud835\ude92\ud835\ude8d uses [rayon](https://docs.rs/rayon/latest/rayon/) for parallelism\nusing, per default, as many threads as there are physical CPU cores.\nThe number of threads to use can be set via the environment variable `RAYON_NUM_THREADS`.\nWe recommend to do so and to set the number of threads manually,\nnot least to be explicit and to avoid the small runtime overhead for determining the number of physical CPU cores.\n\n\n## Implemented Distances\n\n* `ancestor_aid(Gtrue, Gguess, edge_direction)`\n* `oset_aid(Gtrue, Gguess, edge_direction)`\n* `parent_aid(Gtrue, Gguess, edge_direction)`\n* for convenience, the following distances are implemented, too\n    * `shd(Gtrue, Gguess)`\n    * `sid(Gtrue, Gguess, edge_direction)` \u2013 only for DAGs!\n\nwhere `Gtrue` and `Gguess` are adjacency matrices of a DAG or CPDAG\nand `edge_direction` determines whether a `1` at r-th row and c-th column of an adjacency matrix\ncodes the edge `r \u2192 c` (`edge_direction=\"from row to column\"`) or `c \u2192 r` (`edge_direction=\"from column to row\"`).\nThe functions are not symmetric in their inputs:\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\nYou may also calculate the SID between DAGs via `parent_aid(DAGtrue, DAGguess, edge_direction)`,\nbut we recommend `ancestor_aid` and `oset_aid` and for CPDAG inputs the `parent_aid` does not coincide with the SID\n(see also our accompanying article).\n\nIf `edge_direction=\"from row to column\"`, then\na `1` in row `r` and column `c` codes a directed edge `r \u2192 c`;\nif `edge_direction=\"from column to row\"`, then\na `1` in row `r` and column `c` codes a directed edge `c \u2192 r`;\nfor either setting of `edge_direction`,\na `2` in row `r` and column `c` codes an undirected edge `r \u2013 c`\n(an additional `2` in row `c` and column `r` is ignored;\none of the two entries is sufficient to code an undirected edge).\n\nAn adjacency matrix for a DAG may only contain 0s and 1s.\nAn adjacency matrix for a CPDAG may only contain 0s, 1s and 2s.\nDAG and CPDAG inputs are validated for acyclicity.\nHowever, for CPDAG inputs, __the user needs to ensure the adjacency\nmatrix indeed codes a valid CPDAG (instead of just a PDAG)__.\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\nx-sparse 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   |  13601 |   962 |\n| Ancestor-AID |   8211 |   932 |\n| Oset-AID     |   1105 |   508 |\n| SID in R     |    256 |   239 |\n\nResults obtained with \ud835\ude90\ud835\ude8a\ud835\ude8d\ud835\ude93\ud835\ude92\ud835\ude8d v0.1.0 using the Python interface\nand the SID R package v1.1 from CRAN.\n\n__Average runtime__\n| Method       | x-sparse ($p=1000$) | sparse ($p=256$) | dense ($p=239$) |\n|--------------|--------------------:|-----------------:|----------------:|\n| Parent-AID   |              7.3 ms |          30.5 ms |          173 ms |\n| Ancestor-AID |              3.4 ms |          40.9 ms |          207 ms |\n| Oset-AID     |              5.0 ms |           567 ms |         1.68 s  |\n| SID in R     |             ~1\u20132 h  |           ~60 s  |          ~60 s  |\n\nResults obtained with \ud835\ude90\ud835\ude8a\ud835\ude8d\ud835\ude93\ud835\ude92\ud835\ude8d v0.1.0 using the Python interface\nand the SID R package v1.1 from CRAN.\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.1.0",
    "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": "1618e0f14798a1fb70b1c001f7c76e38a529af2c75d5ee693a05596d281848a8",
                "md5": "1382d2d22d10529677d4b33523daeaaf",
                "sha256": "fc237ad67c4bef18752700b861c3e47346b64579f132b33e4ea9504d60378ca7"
            },
            "downloads": -1,
            "filename": "gadjid-0.1.0-cp38-abi3-macosx_10_12_x86_64.whl",
            "has_sig": false,
            "md5_digest": "1382d2d22d10529677d4b33523daeaaf",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 324661,
            "upload_time": "2024-07-11T15:43:26",
            "upload_time_iso_8601": "2024-07-11T15:43:26.344190Z",
            "url": "https://files.pythonhosted.org/packages/16/18/e0f14798a1fb70b1c001f7c76e38a529af2c75d5ee693a05596d281848a8/gadjid-0.1.0-cp38-abi3-macosx_10_12_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "32daf863cefd025484f242b292d9d70d85bbdd3af027ad3681aa50c80009597b",
                "md5": "ebfa6ac0a5bcbc651349c985fb65db27",
                "sha256": "18c70e77af471c7d885c9e721b1755065733c82602fc897fcdb981e0e92f0752"
            },
            "downloads": -1,
            "filename": "gadjid-0.1.0-cp38-abi3-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "ebfa6ac0a5bcbc651349c985fb65db27",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 311081,
            "upload_time": "2024-07-11T15:43:21",
            "upload_time_iso_8601": "2024-07-11T15:43:21.065014Z",
            "url": "https://files.pythonhosted.org/packages/32/da/f863cefd025484f242b292d9d70d85bbdd3af027ad3681aa50c80009597b/gadjid-0.1.0-cp38-abi3-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "81dc87938a5abe33c557d57cbd5804b35c76e42ebefcaaf3f77dee09da3fa4f7",
                "md5": "204f711df2d84d3797ed4f1f0852e66c",
                "sha256": "ffa49fe6fd891f1200d4d07ed6a6475ba485c1f28a3e78a8e59201687471dc75"
            },
            "downloads": -1,
            "filename": "gadjid-0.1.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "204f711df2d84d3797ed4f1f0852e66c",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 371449,
            "upload_time": "2024-07-11T15:43:05",
            "upload_time_iso_8601": "2024-07-11T15:43:05.618704Z",
            "url": "https://files.pythonhosted.org/packages/81/dc/87938a5abe33c557d57cbd5804b35c76e42ebefcaaf3f77dee09da3fa4f7/gadjid-0.1.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "ccea0bfd2c3211fad72934dc70e6d899f9aa74d728d19d3f1eb2d7256e9ec74b",
                "md5": "82b86d2c93ce59f299a6d36d30f247ec",
                "sha256": "3d734b47d544a466b16f0a64370d28df771e8d86e9ab074f3aae40fb19a13689"
            },
            "downloads": -1,
            "filename": "gadjid-0.1.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "82b86d2c93ce59f299a6d36d30f247ec",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 369436,
            "upload_time": "2024-07-11T15:43:13",
            "upload_time_iso_8601": "2024-07-11T15:43:13.901664Z",
            "url": "https://files.pythonhosted.org/packages/cc/ea/0bfd2c3211fad72934dc70e6d899f9aa74d728d19d3f1eb2d7256e9ec74b/gadjid-0.1.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "a389bf47e9ac904b96fd9a2920084928de77fc134ee5fbcada281b6a6cf573e4",
                "md5": "52f27c085b395ac2dd2fb42ce2e67b61",
                "sha256": "936513302decb33831d9403d7d21f0dc1f995d739ddc1e1984960c35e1737d2e"
            },
            "downloads": -1,
            "filename": "gadjid-0.1.0-cp38-abi3-musllinux_1_1_aarch64.whl",
            "has_sig": false,
            "md5_digest": "52f27c085b395ac2dd2fb42ce2e67b61",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 549281,
            "upload_time": "2024-07-11T15:43:11",
            "upload_time_iso_8601": "2024-07-11T15:43:11.872665Z",
            "url": "https://files.pythonhosted.org/packages/a3/89/bf47e9ac904b96fd9a2920084928de77fc134ee5fbcada281b6a6cf573e4/gadjid-0.1.0-cp38-abi3-musllinux_1_1_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "aed2a851c5f685d6f61a445a44f5019076a3f77c0070dbd3a2c9b76e6eba2e15",
                "md5": "639b5beb26ec71d04ee4c4caf0b101ca",
                "sha256": "d9310080a90fc4aaded93d081023b5bb9080590c0df24c66439cda178d003288"
            },
            "downloads": -1,
            "filename": "gadjid-0.1.0-cp38-abi3-musllinux_1_1_x86_64.whl",
            "has_sig": false,
            "md5_digest": "639b5beb26ec71d04ee4c4caf0b101ca",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 539293,
            "upload_time": "2024-07-11T15:43:18",
            "upload_time_iso_8601": "2024-07-11T15:43:18.688627Z",
            "url": "https://files.pythonhosted.org/packages/ae/d2/a851c5f685d6f61a445a44f5019076a3f77c0070dbd3a2c9b76e6eba2e15/gadjid-0.1.0-cp38-abi3-musllinux_1_1_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "07e1f27eb262ebc05837202d40d6dc93853649d03ffcc57272d64207c7d93608",
                "md5": "7bc8116a41ee33dbf2f89f9c07b262c6",
                "sha256": "551e132268ffac3215c920032112ace7ed39436f369e170e43fa126d694486c8"
            },
            "downloads": -1,
            "filename": "gadjid-0.1.0-cp38-abi3-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "7bc8116a41ee33dbf2f89f9c07b262c6",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 232186,
            "upload_time": "2024-07-11T15:43:35",
            "upload_time_iso_8601": "2024-07-11T15:43:35.721155Z",
            "url": "https://files.pythonhosted.org/packages/07/e1/f27eb262ebc05837202d40d6dc93853649d03ffcc57272d64207c7d93608/gadjid-0.1.0-cp38-abi3-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "a500864fef364c43cfa2690f7eb093a254bb17ceb3eb213a8642b8404e0e4dea",
                "md5": "7d8c1581b18d2f30c05f52eb8c3b8942",
                "sha256": "1f45ff3032f7e80b04cd83bace38c4dad935ae7ae0dc52271a4e91d1b397a162"
            },
            "downloads": -1,
            "filename": "gadjid-0.1.0-cp38-abi3-win_arm64.whl",
            "has_sig": false,
            "md5_digest": "7d8c1581b18d2f30c05f52eb8c3b8942",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 220084,
            "upload_time": "2024-07-11T15:43:33",
            "upload_time_iso_8601": "2024-07-11T15:43:33.776533Z",
            "url": "https://files.pythonhosted.org/packages/a5/00/864fef364c43cfa2690f7eb093a254bb17ceb3eb213a8642b8404e0e4dea/gadjid-0.1.0-cp38-abi3-win_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "0d644871e4215c8f3a1656c5a88b295a59330589b12d672577c4c6cf15251d6e",
                "md5": "87f0cda09a7d244d1349502c41125aea",
                "sha256": "49ec4c724b05d8ad1eb55d405734a87e025147289f2d92499de0312a0a5831a3"
            },
            "downloads": -1,
            "filename": "gadjid-0.1.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl",
            "has_sig": false,
            "md5_digest": "87f0cda09a7d244d1349502c41125aea",
            "packagetype": "bdist_wheel",
            "python_version": "pp310",
            "requires_python": ">=3.8",
            "size": 324436,
            "upload_time": "2024-07-11T15:43:28",
            "upload_time_iso_8601": "2024-07-11T15:43:28.310552Z",
            "url": "https://files.pythonhosted.org/packages/0d/64/4871e4215c8f3a1656c5a88b295a59330589b12d672577c4c6cf15251d6e/gadjid-0.1.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "856c460fd1ebe9996d56d00781c774cbf8cd84a8bc8a0e7c8ccf63edb6044337",
                "md5": "2c41f0563778fdf84e6346fc92d80457",
                "sha256": "b26dee51744893bc9b62549f40fbdf62d7458652d8eb3c030ffc5dd74929a0b6"
            },
            "downloads": -1,
            "filename": "gadjid-0.1.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "2c41f0563778fdf84e6346fc92d80457",
            "packagetype": "bdist_wheel",
            "python_version": "pp310",
            "requires_python": ">=3.8",
            "size": 310235,
            "upload_time": "2024-07-11T15:43:22",
            "upload_time_iso_8601": "2024-07-11T15:43:22.776661Z",
            "url": "https://files.pythonhosted.org/packages/85/6c/460fd1ebe9996d56d00781c774cbf8cd84a8bc8a0e7c8ccf63edb6044337/gadjid-0.1.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "24ebacf7474953b28ca5e4bb9b145daee2385914100d98c8c67b28c683bf9a2f",
                "md5": "53a81e8475ddb03c33cfebba3dd48d21",
                "sha256": "233f0938afeb3221a304984e8d42724f98bd8663ef149d9b6b2c88ac62e077b5"
            },
            "downloads": -1,
            "filename": "gadjid-0.1.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "53a81e8475ddb03c33cfebba3dd48d21",
            "packagetype": "bdist_wheel",
            "python_version": "pp310",
            "requires_python": ">=3.8",
            "size": 370836,
            "upload_time": "2024-07-11T15:43:08",
            "upload_time_iso_8601": "2024-07-11T15:43:08.003951Z",
            "url": "https://files.pythonhosted.org/packages/24/eb/acf7474953b28ca5e4bb9b145daee2385914100d98c8c67b28c683bf9a2f/gadjid-0.1.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "a6b703786cbf7b835a30dc1e1d84735969f517a3d47efe7ad3e5f8957581e66a",
                "md5": "86d84e6d729a3abdfbb4aa96b79724af",
                "sha256": "0957e4f563ad915ec92b86b0ef7a3e9a4729275900de0e2d49a1a5106cc86553"
            },
            "downloads": -1,
            "filename": "gadjid-0.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "86d84e6d729a3abdfbb4aa96b79724af",
            "packagetype": "bdist_wheel",
            "python_version": "pp310",
            "requires_python": ">=3.8",
            "size": 368921,
            "upload_time": "2024-07-11T15:43:15",
            "upload_time_iso_8601": "2024-07-11T15:43:15.389728Z",
            "url": "https://files.pythonhosted.org/packages/a6/b7/03786cbf7b835a30dc1e1d84735969f517a3d47efe7ad3e5f8957581e66a/gadjid-0.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "d34c10529ef353f4e10201fe275603f65c91e90dba1bdf691637ac4f79ceffc5",
                "md5": "77daaeec5c4154e82c76fc9d24dc2c3f",
                "sha256": "98e9491e54238ed0199b012223cbbbf7ec9d052ab92be1f4b718c6047b4c6639"
            },
            "downloads": -1,
            "filename": "gadjid-0.1.0-pp310-pypy310_pp73-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "77daaeec5c4154e82c76fc9d24dc2c3f",
            "packagetype": "bdist_wheel",
            "python_version": "pp310",
            "requires_python": ">=3.8",
            "size": 230771,
            "upload_time": "2024-07-11T15:43:37",
            "upload_time_iso_8601": "2024-07-11T15:43:37.179955Z",
            "url": "https://files.pythonhosted.org/packages/d3/4c/10529ef353f4e10201fe275603f65c91e90dba1bdf691637ac4f79ceffc5/gadjid-0.1.0-pp310-pypy310_pp73-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "fbd136cc0822e63e75a2050e0d220124212d02493348ce3d19f24f1bc9e0ffbd",
                "md5": "cc1961b2fbd7b03d10b1dc2b28244ee0",
                "sha256": "10ca98e04f129c6410eb7620edf7cbdd46637e53844084bf5e428284ae854416"
            },
            "downloads": -1,
            "filename": "gadjid-0.1.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl",
            "has_sig": false,
            "md5_digest": "cc1961b2fbd7b03d10b1dc2b28244ee0",
            "packagetype": "bdist_wheel",
            "python_version": "pp39",
            "requires_python": ">=3.8",
            "size": 324428,
            "upload_time": "2024-07-11T15:43:30",
            "upload_time_iso_8601": "2024-07-11T15:43:30.504323Z",
            "url": "https://files.pythonhosted.org/packages/fb/d1/36cc0822e63e75a2050e0d220124212d02493348ce3d19f24f1bc9e0ffbd/gadjid-0.1.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "d896bd24333ac74e013048c1b0dd07599b3cee16c8e03e9c3b578a4d220b40f6",
                "md5": "3926c3a7307f4826f2bd28726d19b47a",
                "sha256": "3bce721d9de32fec20821e3d3cd5d342324ba72e395caf3dcb6eab0b6780458c"
            },
            "downloads": -1,
            "filename": "gadjid-0.1.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "3926c3a7307f4826f2bd28726d19b47a",
            "packagetype": "bdist_wheel",
            "python_version": "pp39",
            "requires_python": ">=3.8",
            "size": 310228,
            "upload_time": "2024-07-11T15:43:24",
            "upload_time_iso_8601": "2024-07-11T15:43:24.749684Z",
            "url": "https://files.pythonhosted.org/packages/d8/96/bd24333ac74e013048c1b0dd07599b3cee16c8e03e9c3b578a4d220b40f6/gadjid-0.1.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "9b6c7e23a5bf5851966aad69a8bd69d05bc2d9f656011627eb67957fc1ca2390",
                "md5": "51cb2a0460c7420d4dfd961ea0a06a65",
                "sha256": "ba289c6db73e0347978609475dbf6d655afb1153793a69e745e55f2f142402ae"
            },
            "downloads": -1,
            "filename": "gadjid-0.1.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "51cb2a0460c7420d4dfd961ea0a06a65",
            "packagetype": "bdist_wheel",
            "python_version": "pp39",
            "requires_python": ">=3.8",
            "size": 370831,
            "upload_time": "2024-07-11T15:43:10",
            "upload_time_iso_8601": "2024-07-11T15:43:10.160809Z",
            "url": "https://files.pythonhosted.org/packages/9b/6c/7e23a5bf5851966aad69a8bd69d05bc2d9f656011627eb67957fc1ca2390/gadjid-0.1.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "bb6ae40aa34237ee47ca114aaed3ec1b9eb8dcf5038273a0d549f0d24dcde57e",
                "md5": "15e20336c116342827fa796a1e0eb2e5",
                "sha256": "aebb0c97e2062619b7967a54913f75d44facf678de2e5b69ce5803198932f0eb"
            },
            "downloads": -1,
            "filename": "gadjid-0.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "15e20336c116342827fa796a1e0eb2e5",
            "packagetype": "bdist_wheel",
            "python_version": "pp39",
            "requires_python": ">=3.8",
            "size": 368919,
            "upload_time": "2024-07-11T15:43:17",
            "upload_time_iso_8601": "2024-07-11T15:43:17.198644Z",
            "url": "https://files.pythonhosted.org/packages/bb/6a/e40aa34237ee47ca114aaed3ec1b9eb8dcf5038273a0d549f0d24dcde57e/gadjid-0.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "c1ddced718adf6558d5230c3eb10287d1c30d022b8465303948e3b5f9b290492",
                "md5": "4042afb238cff743995af8175be8725e",
                "sha256": "f70c8d9f372f779d89c1677ebc32ff09cfde71451a0fb448b319b2beaef61df3"
            },
            "downloads": -1,
            "filename": "gadjid-0.1.0-pp39-pypy39_pp73-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "4042afb238cff743995af8175be8725e",
            "packagetype": "bdist_wheel",
            "python_version": "pp39",
            "requires_python": ">=3.8",
            "size": 230754,
            "upload_time": "2024-07-11T15:43:39",
            "upload_time_iso_8601": "2024-07-11T15:43:39.394715Z",
            "url": "https://files.pythonhosted.org/packages/c1/dd/ced718adf6558d5230c3eb10287d1c30d022b8465303948e3b5f9b290492/gadjid-0.1.0-pp39-pypy39_pp73-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "fedbf85da1d0aeaf34d3c5ff00485c35f359cc96c4ca9263e42b1a4fc10a55f9",
                "md5": "1f0b11794087c811f561c627bc095f7b",
                "sha256": "3a74c07960ee92b42ffc342dfd25a3c48cbbc2a375881401f83b223a8af93959"
            },
            "downloads": -1,
            "filename": "gadjid-0.1.0.tar.gz",
            "has_sig": false,
            "md5_digest": "1f0b11794087c811f561c627bc095f7b",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 45542,
            "upload_time": "2024-07-11T15:43:32",
            "upload_time_iso_8601": "2024-07-11T15:43:32.514026Z",
            "url": "https://files.pythonhosted.org/packages/fe/db/f85da1d0aeaf34d3c5ff00485c35f359cc96c4ca9263e42b1a4fc10a55f9/gadjid-0.1.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-07-11 15:43:32",
    "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.27321s