From d8d85afd86efbc6165e858f63dfcf82d263f36bd Mon Sep 17 00:00:00 2001 From: Robert Osazuwa Ness Date: Thu, 27 Oct 2022 12:02:11 -0600 Subject: [PATCH 1/8] Create PC algo tutorial Signed-off-by: Robert Ness --- .gitignore | 4 + README.md | 3 + doc/conf.py | 4 + doc/index.rst | 4 +- doc/tutorials.rst | 12 - doc/tutorials/index.rst | 18 + doc/tutorials/markovian/example-pc-algo.ipynb | 475 ++++++++++++++++++ doc/use.rst | 2 +- doc/whats_new/v0.1.rst | 1 + pyproject.toml | 2 + 10 files changed, 510 insertions(+), 15 deletions(-) delete mode 100644 doc/tutorials.rst create mode 100644 doc/tutorials/index.rst create mode 100644 doc/tutorials/markovian/example-pc-algo.ipynb diff --git a/.gitignore b/.gitignore index 6ab30854..72a35bbe 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,10 @@ __pycache__/ # C extensions *.so +# possibly produced from drawing graphs +*.gv +*.png + junit-results.xml # Distribution / packaging diff --git a/README.md b/README.md index 48f4ea44..3d96ddab 100644 --- a/README.md +++ b/README.md @@ -49,5 +49,8 @@ To install the package from github, clone the repository and then `cd` into the # for graph functionality poetry install --extras graph_func + # to load datasets used in tutorials + poetry install --extras data + # if you would like an editable install of dodiscover for dev purposes pip install -e . diff --git a/doc/conf.py b/doc/conf.py index 18abf7a6..64ee47c8 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -263,6 +263,10 @@ "image_scrapers": scrapers, } +# prevent jupyter notebooks from being run even if empty cell +nbsphinx_execute = "never" +nbsphinx_allow_errors = True + # Custom sidebar templates, maps document names to template names. html_sidebars = { "index": ["search-field.html"], diff --git a/doc/index.rst b/doc/index.rst index f13a22dc..f068a093 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -15,13 +15,13 @@ Contents -------- .. toctree:: - :maxdepth: 1 + :maxdepth: 2 :caption: Getting started: installation api use - tutorials + tutorials/index whats_new .. toctree:: diff --git a/doc/tutorials.rst b/doc/tutorials.rst deleted file mode 100644 index 97ece826..00000000 --- a/doc/tutorials.rst +++ /dev/null @@ -1,12 +0,0 @@ -:orphan: - -******** -Tutorial -******** - -.. _dodiscover_tutorials: - -Using dodiscover -===================== -This tutorial shows how to use dodiscover - diff --git a/doc/tutorials/index.rst b/doc/tutorials/index.rst new file mode 100644 index 00000000..1416eb4c --- /dev/null +++ b/doc/tutorials/index.rst @@ -0,0 +1,18 @@ +********* +Tutorials +********* + +.. _models_tutorials: + +Basic causal discovery models without latent confounders +======================================================== +The first tutorial presents several algorithms for causal discovery without latent confounding: the Peters and Clarke (PC) algorithm. +These models provide a basis for learning causal structure from data when we make the **assumption** that there are +no latent confounders. + +.. toctree:: + :maxdepth: 1 + :titlesonly: + + markovian/pc + diff --git a/doc/tutorials/markovian/example-pc-algo.ipynb b/doc/tutorials/markovian/example-pc-algo.ipynb new file mode 100644 index 00000000..f49e4198 --- /dev/null +++ b/doc/tutorials/markovian/example-pc-algo.ipynb @@ -0,0 +1,475 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "3e91e320", + "metadata": {}, + "source": [ + "# PC algorithm for causal discovery from observational data without latent confounders\n", + "\n", + "In this tutorial, we will demonstrate how to use the PC algorithm to learn a causal graph structure.\n", + "\n", + "The PC algorithm works on observational data when there are no unobserved latent confounders." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "95e12b39", + "metadata": {}, + "outputs": [], + "source": [ + "import bnlearn as bn\n", + "import networkx as nx\n", + "import numpy as np\n", + "\n", + "from pywhy_graphs import CPDAG\n", + "from pywhy_graphs.viz import draw\n", + "from dodiscover import PC, make_context\n", + "from dodiscover.ci import GSquareCITest, Oracle" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "e77e7416", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[bnlearn] >Extracting files..\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ATSLBEXD
011011111
111110110
211110110
310010000
411110110
\n", + "
" + ], + "text/plain": [ + " A T S L B E X D\n", + "0 1 1 0 1 1 1 1 1\n", + "1 1 1 1 1 0 1 1 0\n", + "2 1 1 1 1 0 1 1 0\n", + "3 1 0 0 1 0 0 0 0\n", + "4 1 1 1 1 0 1 1 0" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Load example dataset\n", + "data = bn.import_example(data='asia')\n", + "data.rename(columns = {\n", + " 'tub': 'T',\n", + " 'lung': 'L',\n", + " 'bronc': 'B',\n", + " 'asia': 'A',\n", + " 'smoke': 'S',\n", + " 'either': 'E',\n", + " 'xray': 'X',\n", + " 'dysp': 'D'},\n", + " inplace=True\n", + ")\n", + "data.head()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "84323abd", + "metadata": {}, + "source": [ + "We'll use the PC algorithm to infer the ASIA network. The ASIA network is a case study of an expert system for diagnosing lung disease from Lauritzen and Spiegelhalter (1988). Given respiratory symptions and other evidence, the goal is to distinguish between tuberculosis, lung cancer or bronchitis in a given patient. The ground truth causal DAG is as follows:\n", + "\n", + "![asia](figures/asia.png)\n", + "\n", + "The variables in the DAG have the following interpretation:\n", + "\n", + "* T: Whether or not the patient has **tuberculosis**.\n", + "* L: Whether or not the patient has **lung cancer**.\n", + "* B: Whether or not the patient has **bronchitis**.\n", + "* A: Whether or not the patient has recently visited **Asia**.\n", + "* S: Whether or not the patient is a **smoker**.\n", + "* E: An indicator of whether the patient has either lung cancer or tuberculosis (or both).\n", + "* X: Whether or not a chest X-ray shows evidence of tuberculosis or lung cancer.\n", + "* D: Whether or not the patient has **dyspnoea** (difficulty breathing).\n", + "\n", + "Note we have three kinds of variables, diseases (B, L, T, and E which indicates one or more diseases), symptoms (X and D), and behaviors (S and A). The goal of the model is to use symptoms and behaviors to diagnose (i.e. infer) diseases. Further, note that diseases are causes of symptoms, and are effects of behaviors." + ] + }, + { + "cell_type": "markdown", + "id": "e5620376", + "metadata": {}, + "source": [ + "Our goal is to discover this graph structure from observational data. To this end, we'll use the dodiscover implementation of the PC algorithm. First, we'll implement the ground truth graph." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "33fa1389", + "metadata": {}, + "outputs": [], + "source": [ + "ground_truth_edges = [\n", + " (\"A\", \"T\"),\n", + " (\"T\", \"E\"),\n", + " (\"L\", \"E\"),\n", + " (\"S\", \"L\"),\n", + " (\"S\", \"B\"),\n", + " (\"B\", \"D\"),\n", + " (\"E\", \"D\"),\n", + " (\"E\", \"X\")\n", + " ]\n", + "\n", + "ground_truth = nx.DiGraph(ground_truth_edges)" + ] + }, + { + "cell_type": "markdown", + "id": "b769b7f1", + "metadata": {}, + "source": [ + "This is the ground truth, but ground truth is not learnable from observational data alone. We can only learn a CPDAG (complete partially directed acyclic graph), which has a mixture of directed and undirected graph. The undirected edges are edges where we cannot learn causal direction from observations alone.\n", + "\n", + "In technical terms, the CPDAG represents an equivalence class of DAGs. In other words, the CPDAG represents all the DAGs that we could create by orienting the undirected edges (except for those DAGs that would introduce new colliders), because each of those DAGs are equally probable given the data. " + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "30a29f1d", + "metadata": {}, + "outputs": [], + "source": [ + "cpdag_directed = [\n", + " (\"T\", \"E\"),\n", + " (\"L\", \"E\"),\n", + " (\"B\", \"D\"),\n", + " (\"E\", \"D\"),\n", + " (\"E\", \"X\")\n", + " ]\n", + "\n", + "cpdag_undirected = [\n", + " (\"A\", \"T\"),\n", + " (\"S\", \"L\"),\n", + " (\"S\", \"B\"),\n", + " ]\n", + "\n", + "ground_truth_cpdag = CPDAG(cpdag_directed, cpdag_undirected)" + ] + }, + { + "cell_type": "markdown", + "id": "5a9d2aae", + "metadata": {}, + "source": [ + "## Instantiate some conditional independence tests\n", + "\n", + "The PC algorithm is a constraint-based causal discovery algorithm, which means it uses statistical constraints induced by causal relationships to learn those causal relationships. The most commonly used constraint is conditional independence. Constraint-based algorithms run a series of statistical tests for conditional independence (CI) and construct a graph consistent with those assumptions.\n", + "\n", + "So we need a way to test for CI constraints. There are various options for tests. If we are applying the algorithm on real data, we would want to use the CI test that best suits the data. \n", + "\n", + "If we are interested in evaluating how the discovery algorithm works in an ideal setting, we can use an oracle, which is imbued with the ground-truth graph, which can query all the d-separation statements needed. This can help one determine in a simulation setting, what is the best case graph the PC algorithm can learn.\n", + "\n", + "**Warnings about statistical tests for independence**. \n", + "* Note that because of finite sample sizes, any CI test will sometimes make erroneous conclusions. Errors results in incorrect orientations and edges in the learned graph. Further, constraint-based algorithms run multiple tests in sequence, which causes those errors to accumulate. One might use adjustments for multiple comparisons to compensate.\n", + "* The standard statistical test has a null and alternative hypothesis. The alternative hypothesis should be the hypothesis that the thing one is looking for is present, while the null hypothesis is that thing is not present. In causal discovery, the thing we are looking for is causal structure, and conditional independence is evidence of causal structure. So arguably, the alternative hypothesis should be the hypothesis of conditional independence. However, most CI test implementations take the hypothesis of independence as the null hypothesis.\n", + "* The p-value decreases with the size of the data. So the more data is provided, the more likely the test will favor dependence. For large data sizes, use smaller significance thresholds.\n", + "\n", + "For these reasons, the user should view the results of the CI test more as a heuristic than a rigorous statistical test. " + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "902d126f", + "metadata": {}, + "outputs": [], + "source": [ + "oracle = Oracle(ground_truth)" + ] + }, + { + "cell_type": "markdown", + "id": "591c00cf", + "metadata": {}, + "source": [ + "## Define the context\n", + "\n", + "A common anti-pattern in causal discovery is encouraging the user to see the discovery algorithm as a philosopher's stone that converts data to causal relationships. In other words, discovery libraries tend to encourage users tend to surrender the task of providing domain-specific assumptions that enable identifiability to the algorithm. PyWhy's key strength is how it guides users to specifying domain assumptions up front (in the form of a DAG) before the data is added, and then addresses identifiability given those assumptions and data. \n", + "\n", + "To this end, we introduce the `context.Context` class, where users provide data as the primary input to a discovery algorithm. The Context class houses both data, a priori assumptions and other relevant data that may be used in downstream structure learning algorithms.\n", + "\n", + "In this example, we'll use the context object to specify some fixed edges in the graph." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "89a4f0af", + "metadata": {}, + "outputs": [], + "source": [ + "context = make_context().variables(data=data).build()" + ] + }, + { + "cell_type": "markdown", + "id": "efcf01c7", + "metadata": {}, + "source": [ + "## Run discovery algorithm\n", + "\n", + "Now we are ready to run the PC algorithm. First, we will show the output of the oracle, which is the best case scenario the PC algorithm can learn given an infinite amount of data." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "e5cba859", + "metadata": {}, + "outputs": [], + "source": [ + "pc = PC(ci_estimator=oracle)\n", + "pc.fit(data, context)" + ] + }, + { + "cell_type": "markdown", + "id": "ff7ebc10", + "metadata": {}, + "source": [ + "The resulting completely partially directed acyclic graph (CPDAG) that is learned is a \"Markov equivalence class\", which encodes all the conditional dependences that were learned from the data." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "918c6f5f", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": "\n\n\n\n\n\n\n\n\nT\n\nT\n\n\n\nX\n\nX\n\n\n\nT->X\n\n\n\n\n\nE\n\nE\n\n\n\nT->E\n\n\n\n\n\nA\n\nA\n\n\n\nT->A\n\n\n\n\nD\n\nD\n\n\n\nT->D\n\n\n\n\n\nL\n\nL\n\n\n\nL->X\n\n\n\n\n\nL->E\n\n\n\n\n\nL->D\n\n\n\n\n\nS\n\nS\n\n\n\nL->S\n\n\n\n\nE->X\n\n\n\n\n\nE->D\n\n\n\n\n\nB\n\nB\n\n\n\nB->D\n\n\n\n\n\nB->S\n\n\n\n\n", + "text/plain": [ + "" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "graph = pc.graph_\n", + "draw(graph)" + ] + }, + { + "cell_type": "markdown", + "id": "162d98be", + "metadata": {}, + "source": [ + "Compare this against the ground truth CPDAG." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "67d47367", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": "\n\n\n\n\n\n\n\n\nT\n\nT\n\n\n\nE\n\nE\n\n\n\nT->E\n\n\n\n\n\nD\n\nD\n\n\n\nT->D\n\n\n\n\n\nX\n\nX\n\n\n\nT->X\n\n\n\n\n\nE->D\n\n\n\n\n\nE->X\n\n\n\n\n\nL\n\nL\n\n\n\nL->E\n\n\n\n\n\nL->D\n\n\n\n\n\nL->X\n\n\n\n\n\nB\n\nB\n\n\n\nB->D\n\n\n\n\n\nA\n\nA\n\n\n\nA->T\n\n\n\n\nS\n\nS\n\n\n\nS->L\n\n\n\n\nS->B\n\n\n\n\n", + "text/plain": [ + "" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "draw(ground_truth_cpdag)" + ] + }, + { + "cell_type": "markdown", + "id": "db1ff244", + "metadata": {}, + "source": [ + "Now, we will show the output given a real CI test, which performs CI hypothesis testing to determine CI in the data. Due to finite data and the presence of noise, there is always a possibility that the CI test makes a mistake." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "5b80aeba", + "metadata": {}, + "outputs": [], + "source": [ + "ci_estimator = GSquareCITest(data_type=\"discrete\")\n", + "pc = PC(ci_estimator=ci_estimator)\n", + "pc.fit(data, context)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "c948064b", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": "\n\n\n\n\n\n\n\n\nT\n\nT\n\n\n\nL\n\nL\n\n\n\nL->T\n\n\n\n\n\nE\n\nE\n\n\n\nL->E\n\n\n\n\n\nS\n\nS\n\n\n\nL->S\n\n\n\n\n\nA\n\nA\n\n\n\nA->T\n\n\n\n\n\nE->T\n\n\n\n\n\nX\n\nX\n\n\n\nB\n\nB\n\n\n\nD\n\nD\n\n\n\nB->D\n\n\n\n\nB->S\n\n\n\n\n\n", + "text/plain": [ + "" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "graph = pc.graph_\n", + "draw(graph)" + ] + }, + { + "cell_type": "markdown", + "id": "ff0b314b", + "metadata": {}, + "source": [ + "The resulting graph captures some of the graph but not all of it. The problem here is a violation of the [faithfulness assumption](https://plato.stanford.edu/entries/causal-models/#MiniFaitCond); in the Asia data, it is very hard to detect the edge between E and X.\n", + "\n", + "Beyond faithfulness violations, in general causal discovery algorithms struggle when there is no user-provided causal knowledge to constrain the problem. A core philosophy of dodiscovery is that causal domain knowledge should be provided to constrain the problem, and providing it should be easy. For example, for this data, we know that smoking (S) causes both lung cancer (L) and bronchitis (B) and not the other way around.\n", + "\n", + "## References\n", + "\n", + "Lauritzen S, Spiegelhalter D (1988). \"Local Computation with Probabilities on Graphical Structures and their Application to Expert Systems (with discussion)\". Journal of the Royal Statistical Society: Series B, 50(2):157–224.\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "venv" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.9" + }, + "vscode": { + "interpreter": { + "hash": "83bc06ec5be13f4230f46a3f77f7cefbb44c2fa59a857bbc121b0c3cdb0063f8" + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/doc/use.rst b/doc/use.rst index 6aea93d8..78a74b93 100644 --- a/doc/use.rst +++ b/doc/use.rst @@ -3,7 +3,7 @@ Using dodiscover ===================== -To be able to effectively use dodiscover, look at some of the examples here +To be able to effectively use dodiscover, look at some of the basic examples here to learn everything you need! diff --git a/doc/whats_new/v0.1.rst b/doc/whats_new/v0.1.rst index 03343a54..2bb8cd56 100644 --- a/doc/whats_new/v0.1.rst +++ b/doc/whats_new/v0.1.rst @@ -37,6 +37,7 @@ Changelog - |Feature| Implement FCI algorithm, :class:`dodiscover.constraint.FCI` for learning causal structure from observational data with latent confounders under the ``dodiscover.constraint`` submodule, by `Adam Li`_ (:pr:`52`) - |Feature| Implement Structural Hamming Distance metric to compare directed graphs, :func:`dodiscover.metrics.structure_hamming_dist`, by `Adam Li`_ (:pr:`55`) - |Fix| Update dependency on networkx, which removes a PR branch dependency with pywhy-graphs having the MixedEdgeGraph class that was causing a dependency conflict, by `Adam Li`_ (:pr:`74`) +- |Chore| Add tutorial for PC algorithm with Asia data, by `Robert Osazuwa Ness`_ (:pr:`67`) Code and Documentation Contributors ----------------------------------- diff --git a/pyproject.toml b/pyproject.toml index b8c889e6..20d97b43 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -48,6 +48,7 @@ importlib-resources = { version = "*", python = "<3.9" } networkx = "^2.8.8" pywhy-graphs = { git = "https://github.com/py-why/pywhy-graphs.git", branch = 'main', optional = true } pygraphviz = { version = "*", optional = true } +bnlearn = { git = "https://github.com/erdogant/bnlearn.git", branch = 'master', optional = true } [tool.poetry.group.style] optional = true @@ -96,6 +97,7 @@ tqdm = { version = "^4.64.0" } # needed in dowhy's package [tool.poetry.extras] graph_func = ['pywhy-graphs'] viz = ['pygraphviz'] +data = ['bnlearn'] [tool.portray] output_dir = ['site'] From 596690b856bf35acad4bca0c916f8e19273aae73 Mon Sep 17 00:00:00 2001 From: Adam Li Date: Mon, 2 Jan 2023 19:48:29 -0500 Subject: [PATCH 2/8] Add updated poetry lock file Signed-off-by: Adam Li --- poetry.lock | 977 +++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 741 insertions(+), 236 deletions(-) diff --git a/poetry.lock b/poetry.lock index dff66254..b36ce27e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -10,7 +10,7 @@ python-versions = "*" name = "appnope" version = "0.1.3" description = "Disable App Nap on macOS >= 10.9" -category = "dev" +category = "main" optional = false python-versions = "*" @@ -45,7 +45,7 @@ pytz = ">=2015.7" name = "backcall" version = "0.2.0" description = "Specifications for callback functions passed in to an API" -category = "dev" +category = "main" optional = false python-versions = "*" @@ -123,6 +123,42 @@ webencodings = "*" css = ["tinycss2 (>=1.1.0,<1.2)"] dev = ["Sphinx (==4.3.2)", "black (==22.3.0)", "build (==0.8.0)", "flake8 (==4.0.1)", "hashin (==0.17.0)", "mypy (==0.961)", "pip-tools (==6.6.2)", "pytest (==7.1.2)", "tox (==3.25.0)", "twine (==4.0.1)", "wheel (==0.37.1)"] +[[package]] +name = "bnlearn" +version = "0.7.12" +description = "Python package for learning the graphical structure of Bayesian networks, parameter learning, inference and sampling methods." +category = "main" +optional = true +python-versions = ">=3" +develop = false + +[package.dependencies] +df2onehot = "*" +fsspec = "*" +funcsigs = "*" +ipywidgets = "*" +ismember = "*" +matplotlib = ">=3.3.4" +networkx = ">=2.7.1" +numpy = "*" +packaging = "*" +pandas = "*" +pgmpy = ">=0.1.18" +pypickle = "*" +python-louvain = "*" +pyvis = "*" +scikit-learn = "*" +statsmodels = "*" +tabulate = "*" +tqdm = "*" +wget = "*" + +[package.source] +type = "git" +url = "https://github.com/erdogant/bnlearn.git" +reference = 'master' +resolved_reference = "172c209d1d64278b0b58573910805aad167f37e0" + [[package]] name = "certifi" version = "2022.12.7" @@ -135,7 +171,7 @@ python-versions = ">=3.6" name = "cffi" version = "1.15.1" description = "Foreign Function Interface for Python calling C code." -category = "dev" +category = "main" optional = false python-versions = "*" @@ -181,15 +217,29 @@ toml = ["tomli"] name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." -category = "dev" +category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +[[package]] +name = "comm" +version = "0.1.2" +description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." +category = "main" +optional = true +python-versions = ">=3.6" + +[package.dependencies] +traitlets = ">=5.3" + +[package.extras] +test = ["pytest"] + [[package]] name = "contourpy" version = "1.0.6" description = "Python library for calculating contours of 2D quadrilateral grids" -category = "dev" +category = "main" optional = false python-versions = ">=3.7" @@ -205,7 +255,7 @@ test-no-codebase = ["Pillow", "matplotlib", "pytest"] [[package]] name = "coverage" -version = "7.0.1" +version = "7.0.2" description = "Code coverage measurement for Python" category = "dev" optional = false @@ -221,15 +271,23 @@ toml = ["tomli"] name = "cycler" version = "0.11.0" description = "Composable style cycles" -category = "dev" +category = "main" optional = false python-versions = ">=3.6" +[[package]] +name = "debugpy" +version = "1.6.4" +description = "An implementation of the Debug Adapter Protocol for Python" +category = "main" +optional = true +python-versions = ">=3.7" + [[package]] name = "decorator" version = "5.1.1" description = "Decorators for Humans" -category = "dev" +category = "main" optional = false python-versions = ">=3.5" @@ -241,6 +299,21 @@ category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +[[package]] +name = "df2onehot" +version = "1.0.2" +description = "Python package df2onehot is to convert a pandas dataframe into a stuctured dataframe." +category = "main" +optional = true +python-versions = ">=3" + +[package.dependencies] +numpy = "*" +pandas = "*" +scikit-learn = "*" +tqdm = "*" +wget = "*" + [[package]] name = "docstring-parser" version = "0.15" @@ -282,7 +355,7 @@ plotting = ["matplotlib"] name = "entrypoints" version = "0.4" description = "Discover and load entry points from installed packages." -category = "dev" +category = "main" optional = false python-versions = ">=3.6" @@ -341,7 +414,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" name = "fonttools" version = "4.38.0" description = "Tools to manipulate font files" -category = "dev" +category = "main" optional = false python-versions = ">=3.7" @@ -359,6 +432,45 @@ ufo = ["fs (>=2.2.0,<3)"] unicode = ["unicodedata2 (>=14.0.0)"] woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] +[[package]] +name = "fsspec" +version = "2022.11.0" +description = "File-system specification" +category = "main" +optional = true +python-versions = ">=3.7" + +[package.extras] +abfs = ["adlfs"] +adl = ["adlfs"] +arrow = ["pyarrow (>=1)"] +dask = ["dask", "distributed"] +dropbox = ["dropbox", "dropboxdrivefs", "requests"] +entrypoints = ["importlib-metadata"] +fuse = ["fusepy"] +gcs = ["gcsfs"] +git = ["pygit2"] +github = ["requests"] +gs = ["gcsfs"] +gui = ["panel"] +hdfs = ["pyarrow (>=1)"] +http = ["aiohttp (!=4.0.0a0,!=4.0.0a1)", "requests"] +libarchive = ["libarchive-c"] +oci = ["ocifs"] +s3 = ["s3fs"] +sftp = ["paramiko"] +smb = ["smbprotocol"] +ssh = ["paramiko"] +tqdm = ["tqdm"] + +[[package]] +name = "funcsigs" +version = "1.0.2" +description = "Python function signatures from PEP362 for Python 2.6, 2.7 and 3.2+" +category = "main" +optional = true +python-versions = "*" + [[package]] name = "ghp-import" version = "2.1.0" @@ -386,7 +498,7 @@ smmap = ">=3.0.1,<6" [[package]] name = "GitPython" -version = "3.1.29" +version = "3.1.30" description = "GitPython is a python library used to interact with Git repositories" category = "dev" optional = false @@ -438,7 +550,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "importlib-metadata" -version = "5.2.0" +version = "6.0.0" description = "Read metadata from Python packages" category = "dev" optional = false @@ -475,11 +587,38 @@ category = "dev" optional = false python-versions = "*" +[[package]] +name = "ipykernel" +version = "6.19.4" +description = "IPython Kernel for Jupyter" +category = "main" +optional = true +python-versions = ">=3.8" + +[package.dependencies] +appnope = {version = "*", markers = "platform_system == \"Darwin\""} +comm = ">=0.1.1" +debugpy = ">=1.0" +ipython = ">=7.23.1" +jupyter-client = ">=6.1.12" +matplotlib-inline = ">=0.1" +nest-asyncio = "*" +packaging = "*" +psutil = "*" +pyzmq = ">=17" +tornado = ">=6.1" +traitlets = ">=5.4.0" + +[package.extras] +cov = ["coverage[toml]", "curio", "matplotlib", "pytest-cov", "trio"] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinxcontrib-github-alt"] +test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio", "pytest-cov", "pytest-timeout"] + [[package]] name = "ipython" version = "7.34.0" description = "IPython: Productive Interactive Computing" -category = "dev" +category = "main" optional = false python-versions = ">=3.7" @@ -508,6 +647,35 @@ parallel = ["ipyparallel"] qtconsole = ["qtconsole"] test = ["ipykernel", "nbformat", "nose (>=0.10.1)", "numpy (>=1.17)", "pygments", "requests", "testpath"] +[[package]] +name = "ipywidgets" +version = "8.0.4" +description = "Jupyter interactive widgets" +category = "main" +optional = true +python-versions = ">=3.7" + +[package.dependencies] +ipykernel = ">=4.5.1" +ipython = ">=6.1.0" +jupyterlab-widgets = ">=3.0,<4.0" +traitlets = ">=4.3.1" +widgetsnbextension = ">=4.0,<5.0" + +[package.extras] +test = ["jsonschema", "pytest (>=3.6.0)", "pytest-cov", "pytz"] + +[[package]] +name = "ismember" +version = "1.0.2" +description = "Python package ismember returns array elements that are members of set array." +category = "main" +optional = true +python-versions = ">=3" + +[package.dependencies] +numpy = "*" + [[package]] name = "isort" version = "5.11.4" @@ -526,7 +694,7 @@ requirements-deprecated-finder = ["pip-api", "pipreqs"] name = "jedi" version = "0.18.2" description = "An autocompletion tool for Python that can be used for text editors." -category = "dev" +category = "main" optional = false python-versions = ">=3.6" @@ -542,7 +710,7 @@ testing = ["Django (<3.1)", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] name = "Jinja2" version = "3.1.2" description = "A very fast and expressive template engine." -category = "dev" +category = "main" optional = false python-versions = ">=3.7" @@ -560,6 +728,19 @@ category = "main" optional = false python-versions = ">=3.7" +[[package]] +name = "jsonpickle" +version = "3.0.1" +description = "Python library for serializing any arbitrary object graph into JSON" +category = "main" +optional = true +python-versions = ">=3.7" + +[package.extras] +docs = ["jaraco.packaging (>=3.2)", "rst.linker (>=1.9)", "sphinx"] +testing = ["ecdsa", "feedparser", "gmpy2", "numpy", "pandas", "pymongo", "pytest (>=3.5,!=3.7.3)", "pytest-black-multipy", "pytest-checkdocs (>=1.2.3)", "pytest-cov", "pytest-flake8 (>=1.1.1)", "scikit-learn", "sqlalchemy"] +"testing.libs" = ["simplejson", "ujson"] + [[package]] name = "jsonschema" version = "4.17.3" @@ -582,7 +763,7 @@ format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339- name = "jupyter-client" version = "7.4.8" description = "Jupyter protocol implementation and client libraries" -category = "dev" +category = "main" optional = false python-versions = ">=3.7" @@ -601,9 +782,9 @@ test = ["codecov", "coverage", "ipykernel (>=6.12)", "ipython", "mypy", "pre-com [[package]] name = "jupyter-core" -version = "5.1.1" +version = "5.1.2" description = "Jupyter core package. A base package on which Jupyter projects rely." -category = "dev" +category = "main" optional = false python-versions = ">=3.8" @@ -613,7 +794,7 @@ pywin32 = {version = ">=1.0", markers = "sys_platform == \"win32\" and platform_ traitlets = ">=5.3" [package.extras] -docs = ["myst-parser", "sphinxcontrib-github-alt", "traitlets"] +docs = ["myst-parser", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] [[package]] @@ -624,11 +805,19 @@ category = "dev" optional = false python-versions = ">=3.7" +[[package]] +name = "jupyterlab-widgets" +version = "3.0.5" +description = "Jupyter interactive widgets for JupyterLab" +category = "main" +optional = true +python-versions = ">=3.7" + [[package]] name = "kiwisolver" version = "1.4.4" description = "A fast implementation of the Cassowary constraint solver" -category = "dev" +category = "main" optional = false python-versions = ">=3.7" @@ -689,7 +878,7 @@ testing = ["coverage", "pyyaml"] name = "MarkupSafe" version = "2.1.1" description = "Safely add untrusted strings to HTML/XML markup." -category = "dev" +category = "main" optional = false python-versions = ">=3.7" @@ -697,7 +886,7 @@ python-versions = ">=3.7" name = "matplotlib" version = "3.6.2" description = "Python plotting package" -category = "dev" +category = "main" optional = false python-versions = ">=3.8" @@ -717,7 +906,7 @@ setuptools_scm = ">=7" name = "matplotlib-inline" version = "0.1.6" description = "Inline Matplotlib backend for Jupyter" -category = "dev" +category = "main" optional = false python-versions = ">=3.5" @@ -919,7 +1108,7 @@ test = ["pep440", "pre-commit", "pytest", "testpath"] [[package]] name = "nbsphinx" -version = "0.8.10" +version = "0.8.11" description = "Jupyter Notebook Tools for Sphinx" category = "dev" optional = false @@ -937,7 +1126,7 @@ traitlets = ">=5" name = "nest-asyncio" version = "1.5.6" description = "Patch asyncio to allow nested event loops" -category = "dev" +category = "main" optional = false python-versions = ">=3.5" @@ -979,11 +1168,74 @@ sphinx = ">=4.2" [package.extras] testing = ["matplotlib", "pytest", "pytest-cov"] +[[package]] +name = "nvidia-cublas-cu11" +version = "11.10.3.66" +description = "CUBLAS native runtime libraries" +category = "main" +optional = true +python-versions = ">=3" + +[package.dependencies] +setuptools = "*" +wheel = "*" + +[[package]] +name = "nvidia-cuda-nvrtc-cu11" +version = "11.7.99" +description = "NVRTC native runtime libraries" +category = "main" +optional = true +python-versions = ">=3" + +[package.dependencies] +setuptools = "*" +wheel = "*" + +[[package]] +name = "nvidia-cuda-runtime-cu11" +version = "11.7.99" +description = "CUDA Runtime native Libraries" +category = "main" +optional = true +python-versions = ">=3" + +[package.dependencies] +setuptools = "*" +wheel = "*" + +[[package]] +name = "nvidia-cudnn-cu11" +version = "8.5.0.96" +description = "cuDNN runtime libraries" +category = "main" +optional = true +python-versions = ">=3" + +[package.dependencies] +setuptools = "*" +wheel = "*" + +[[package]] +name = "opt-einsum" +version = "3.3.0" +description = "Optimizing numpys einsum function" +category = "main" +optional = true +python-versions = ">=3.5" + +[package.dependencies] +numpy = ">=1.7" + +[package.extras] +docs = ["numpydoc", "sphinx (==1.2.3)", "sphinx-rtd-theme", "sphinxcontrib-napoleon"] +tests = ["pytest", "pytest-cov", "pytest-pep8"] + [[package]] name = "packaging" version = "22.0" description = "Core utilities for Python packages" -category = "dev" +category = "main" optional = false python-versions = ">=3.7" @@ -1018,7 +1270,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" name = "parso" version = "0.8.3" description = "A Python Parser" -category = "dev" +category = "main" optional = false python-versions = ">=3.6" @@ -1046,7 +1298,7 @@ python-versions = ">=3.7" name = "patsy" version = "0.5.3" description = "A Python package for describing statistical models and for building design matrices." -category = "dev" +category = "main" optional = false python-versions = "*" @@ -1083,31 +1335,56 @@ Markdown = ">=3.0.0" name = "pexpect" version = "4.8.0" description = "Pexpect allows easy control of interactive console applications." -category = "dev" +category = "main" optional = false python-versions = "*" [package.dependencies] ptyprocess = ">=0.5" +[[package]] +name = "pgmpy" +version = "0.1.21" +description = "A library for Probabilistic Graphical Models" +category = "main" +optional = true +python-versions = "*" + +[package.dependencies] +joblib = "*" +networkx = "*" +numpy = "*" +opt-einsum = "*" +pandas = "*" +pyparsing = "*" +scikit-learn = "*" +scipy = "*" +statsmodels = "*" +torch = "*" +tqdm = "*" + +[package.extras] +all = ["black", "codecov", "coverage", "daft", "joblib", "mock", "networkx", "numpy", "opt-einsum", "pandas", "pyparsing", "pytest", "pytest-cov", "scikit-learn", "scipy", "statsmodels", "torch", "tqdm", "xdoctest"] +tests = ["black", "codecov", "coverage", "mock", "pytest", "pytest-cov", "xdoctest"] + [[package]] name = "pickleshare" version = "0.7.5" description = "Tiny 'shelve'-like database with concurrency support" -category = "dev" +category = "main" optional = false python-versions = "*" [[package]] name = "Pillow" -version = "9.3.0" +version = "9.4.0" description = "Python Imaging Library (Fork)" -category = "dev" +category = "main" optional = false python-versions = ">=3.7" [package.extras] -docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-issues (>=3.0.1)", "sphinx-removed-in", "sphinxext-opengraph"] +docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-issues (>=3.0.1)", "sphinx-removed-in", "sphinxext-opengraph"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] [[package]] @@ -1122,7 +1399,7 @@ python-versions = ">=3.6" name = "platformdirs" version = "2.6.2" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "dev" +category = "main" optional = false python-versions = ">=3.7" @@ -1180,7 +1457,7 @@ yaspin = ">=0.15.0,<3" name = "prompt-toolkit" version = "3.0.36" description = "Library for building powerful interactive command lines in Python" -category = "dev" +category = "main" optional = false python-versions = ">=3.6.2" @@ -1191,7 +1468,7 @@ wcwidth = "*" name = "psutil" version = "5.9.4" description = "Cross-platform lib for process and system monitoring in Python." -category = "dev" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -1202,7 +1479,7 @@ test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] name = "ptyprocess" version = "0.7.0" description = "Run a subprocess in a pseudo terminal" -category = "dev" +category = "main" optional = false python-versions = "*" @@ -1210,7 +1487,7 @@ python-versions = "*" name = "py" version = "1.11.0" description = "library with cross-python path, ini-parsing, io, code, log facilities" -category = "dev" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" @@ -1254,7 +1531,7 @@ python-versions = ">=3.6" name = "pycparser" version = "2.21" description = "C parser in Python" -category = "dev" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -1280,17 +1557,17 @@ test = ["pydata-sphinx-theme[doc]", "pytest"] [[package]] name = "pydocstyle" -version = "6.1.1" +version = "6.2.0" description = "Python docstring style checker" category = "dev" optional = false python-versions = ">=3.6" [package.dependencies] -snowballstemmer = "*" +snowballstemmer = ">=2.2.0" [package.extras] -toml = ["toml"] +toml = ["toml (>=0.10.2)"] [[package]] name = "pydot" @@ -1313,9 +1590,9 @@ python-versions = ">=3.6" [[package]] name = "Pygments" -version = "2.13.0" +version = "2.14.0" description = "Pygments is a syntax highlighting package written in Python." -category = "dev" +category = "main" optional = false python-versions = ">=3.6" @@ -1345,16 +1622,24 @@ markdown = ">=3.2" name = "pyparsing" version = "3.0.9" description = "pyparsing module - Classes and methods to define and execute parsing grammars" -category = "dev" +category = "main" optional = false python-versions = ">=3.6.8" [package.extras] diagrams = ["jinja2", "railroad-diagrams"] +[[package]] +name = "pypickle" +version = "1.1.0" +description = "pypickle is to save and load variables in/from pickle files" +category = "main" +optional = true +python-versions = ">=3" + [[package]] name = "pyrsistent" -version = "0.19.2" +version = "0.19.3" description = "Persistent/Functional/Immutable data structures" category = "dev" optional = false @@ -1406,6 +1691,18 @@ python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" [package.dependencies] six = ">=1.5" +[[package]] +name = "python-louvain" +version = "0.16" +description = "Louvain algorithm for community detection" +category = "main" +optional = true +python-versions = "*" + +[package.dependencies] +networkx = "*" +numpy = "*" + [[package]] name = "pytz" version = "2022.7" @@ -1414,6 +1711,20 @@ category = "main" optional = false python-versions = "*" +[[package]] +name = "pyvis" +version = "0.3.1" +description = "A Python network graph visualization library" +category = "main" +optional = true +python-versions = ">3.6" + +[package.dependencies] +ipython = ">=5.3.0" +jinja2 = ">=2.9.6" +jsonpickle = ">=1.4.1" +networkx = ">=1.11" + [[package]] name = "pywhy-graphs" version = "0.0.0" @@ -1442,7 +1753,7 @@ resolved_reference = "59246229b2f36a25a1dafbecaa346ab255cb15bb" name = "pywin32" version = "305" description = "Python for Window Extensions" -category = "dev" +category = "main" optional = false python-versions = "*" @@ -1469,7 +1780,7 @@ pyyaml = "*" name = "pyzmq" version = "24.0.1" description = "Python bindings for 0MQ" -category = "dev" +category = "main" optional = false python-versions = ">=3.6" @@ -1535,7 +1846,7 @@ test = ["asv", "gmpy2", "mpmath", "pytest", "pytest-cov", "pytest-xdist", "sciki name = "setuptools" version = "65.6.3" description = "Easily download, build, install, upgrade, and uninstall Python packages" -category = "dev" +category = "main" optional = false python-versions = ">=3.7" @@ -1548,7 +1859,7 @@ testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs ( name = "setuptools-scm" version = "7.1.0" description = "the blessed package to manage your versions by scm tags" -category = "dev" +category = "main" optional = false python-versions = ">=3.7" @@ -1773,7 +2084,7 @@ test = ["pytest"] name = "statsmodels" version = "0.13.2" description = "Statistical computations and models for Python" -category = "dev" +category = "main" optional = false python-versions = ">=3.7" @@ -1793,7 +2104,7 @@ docs = ["ipykernel", "jupyter_client", "matplotlib", "nbconvert", "nbformat", "n name = "statsmodels" version = "0.13.3" description = "Statistical computations and models for Python" -category = "dev" +category = "main" optional = false python-versions = ">=3.7" @@ -1813,7 +2124,7 @@ docs = ["ipykernel", "jupyter_client", "matplotlib", "nbconvert", "nbformat", "n name = "statsmodels" version = "0.13.4" description = "Statistical computations and models for Python" -category = "dev" +category = "main" optional = false python-versions = ">=3.7" @@ -1833,7 +2144,7 @@ docs = ["ipykernel", "jupyter_client", "matplotlib", "nbconvert", "nbformat", "n name = "statsmodels" version = "0.13.5" description = "Statistical computations and models for Python" -category = "dev" +category = "main" optional = false python-versions = ">=3.7" @@ -1874,6 +2185,17 @@ python-versions = ">=3.8" [package.dependencies] mpmath = ">=0.19" +[[package]] +name = "tabulate" +version = "0.9.0" +description = "Pretty-print tabular data" +category = "main" +optional = true +python-versions = ">=3.7" + +[package.extras] +widechars = ["wcwidth"] + [[package]] name = "termcolor-whl" version = "1.1.2" @@ -1925,15 +2247,33 @@ python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" name = "tomli" version = "2.0.1" description = "A lil' TOML parser" -category = "dev" +category = "main" optional = false python-versions = ">=3.7" +[[package]] +name = "torch" +version = "1.13.1" +description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" +category = "main" +optional = true +python-versions = ">=3.7.0" + +[package.dependencies] +nvidia-cublas-cu11 = {version = "11.10.3.66", markers = "platform_system == \"Linux\""} +nvidia-cuda-nvrtc-cu11 = {version = "11.7.99", markers = "platform_system == \"Linux\""} +nvidia-cuda-runtime-cu11 = {version = "11.7.99", markers = "platform_system == \"Linux\""} +nvidia-cudnn-cu11 = {version = "8.5.0.96", markers = "platform_system == \"Linux\""} +typing-extensions = "*" + +[package.extras] +opt-einsum = ["opt-einsum (>=3.3)"] + [[package]] name = "tornado" version = "6.2" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." -category = "dev" +category = "main" optional = false python-versions = ">= 3.7" @@ -1941,7 +2281,7 @@ python-versions = ">= 3.7" name = "tqdm" version = "4.64.1" description = "Fast, Extensible Progress Meter" -category = "dev" +category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" @@ -1958,7 +2298,7 @@ telegram = ["requests"] name = "traitlets" version = "5.8.0" description = "Traitlets Python configuration system" -category = "dev" +category = "main" optional = false python-versions = ">=3.7" @@ -1970,7 +2310,7 @@ test = ["argcomplete (>=2.0)", "pre-commit", "pytest", "pytest-mock"] name = "typing-extensions" version = "4.4.0" description = "Backported and Experimental Type Hints for Python 3.7+" -category = "dev" +category = "main" optional = false python-versions = ">=3.7" @@ -1989,7 +2329,7 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "watchdog" -version = "2.2.0" +version = "2.2.1" description = "Filesystem events monitoring" category = "dev" optional = false @@ -2002,7 +2342,7 @@ watchmedo = ["PyYAML (>=3.10)"] name = "wcwidth" version = "0.2.5" description = "Measures the displayed width of unicode strings in a terminal" -category = "dev" +category = "main" optional = false python-versions = "*" @@ -2014,6 +2354,33 @@ category = "dev" optional = false python-versions = "*" +[[package]] +name = "wget" +version = "3.2" +description = "pure python download utility" +category = "main" +optional = true +python-versions = "*" + +[[package]] +name = "wheel" +version = "0.38.4" +description = "A built-package format for Python" +category = "main" +optional = true +python-versions = ">=3.7" + +[package.extras] +test = ["pytest (>=3.0.0)"] + +[[package]] +name = "widgetsnbextension" +version = "4.0.5" +description = "Jupyter interactive widgets for Jupyter Notebook" +category = "main" +optional = true +python-versions = ">=3.7" + [[package]] name = "yaspin" version = "2.2.0" @@ -2038,13 +2405,14 @@ docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] [extras] +data = ["bnlearn"] graph_func = ["pywhy-graphs"] viz = ["pygraphviz"] [metadata] lock-version = "1.1" python-versions = ">=3.8,<3.11" -content-hash = "06fde37a5e8489a85b1fafb8307a87dc1984f2ad6dc68b0e3829fefdd259579e" +content-hash = "04f46cd30737462b965287f013d724bc0280c411923cb4b6de518960a5ee1e67" [metadata.files] alabaster = [ @@ -2093,6 +2461,7 @@ bleach = [ {file = "bleach-5.0.1-py3-none-any.whl", hash = "sha256:085f7f33c15bd408dd9b17a4ad77c577db66d76203e5984b1bd59baeee948b2a"}, {file = "bleach-5.0.1.tar.gz", hash = "sha256:0d03255c47eb9bd2f26aa9bb7f2107732e7e8fe195ca2f64709fcf3b0a4a085c"}, ] +bnlearn = [] certifi = [ {file = "certifi-2022.12.7-py3-none-any.whl", hash = "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18"}, {file = "certifi-2022.12.7.tar.gz", hash = "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3"}, @@ -2179,6 +2548,10 @@ colorama = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +comm = [ + {file = "comm-0.1.2-py3-none-any.whl", hash = "sha256:9f3abf3515112fa7c55a42a6a5ab358735c9dccc8b5910a9d8e3ef5998130666"}, + {file = "comm-0.1.2.tar.gz", hash = "sha256:3e2f5826578e683999b93716285b3b1f344f157bf75fa9ce0a797564e742f062"}, +] contourpy = [ {file = "contourpy-1.0.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:613c665529899b5d9fade7e5d1760111a0b011231277a0d36c49f0d3d6914bd6"}, {file = "contourpy-1.0.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:78ced51807ccb2f45d4ea73aca339756d75d021069604c2fccd05390dc3c28eb"}, @@ -2251,62 +2624,82 @@ contourpy = [ {file = "contourpy-1.0.6.tar.gz", hash = "sha256:6e459ebb8bb5ee4c22c19cc000174f8059981971a33ce11e17dddf6aca97a142"}, ] coverage = [ - {file = "coverage-7.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b3695c4f4750bca943b3e1f74ad4be8d29e4aeab927d50772c41359107bd5d5c"}, - {file = "coverage-7.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fa6a5a224b7f4cfb226f4fc55a57e8537fcc096f42219128c2c74c0e7d0953e1"}, - {file = "coverage-7.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74f70cd92669394eaf8d7756d1b195c8032cf7bbbdfce3bc489d4e15b3b8cf73"}, - {file = "coverage-7.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b66bb21a23680dee0be66557dc6b02a3152ddb55edf9f6723fa4a93368f7158d"}, - {file = "coverage-7.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d87717959d4d0ee9db08a0f1d80d21eb585aafe30f9b0a54ecf779a69cb015f6"}, - {file = "coverage-7.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:854f22fa361d1ff914c7efa347398374cc7d567bdafa48ac3aa22334650dfba2"}, - {file = "coverage-7.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:1e414dc32ee5c3f36544ea466b6f52f28a7af788653744b8570d0bf12ff34bc0"}, - {file = "coverage-7.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6c5ad996c6fa4d8ed669cfa1e8551348729d008a2caf81489ab9ea67cfbc7498"}, - {file = "coverage-7.0.1-cp310-cp310-win32.whl", hash = "sha256:691571f31ace1837838b7e421d3a09a8c00b4aac32efacb4fc9bd0a5c647d25a"}, - {file = "coverage-7.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:89caf4425fe88889e2973a8e9a3f6f5f9bbe5dd411d7d521e86428c08a873a4a"}, - {file = "coverage-7.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:63d56165a7c76265468d7e0c5548215a5ba515fc2cba5232d17df97bffa10f6c"}, - {file = "coverage-7.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4f943a3b2bc520102dd3e0bb465e1286e12c9a54f58accd71b9e65324d9c7c01"}, - {file = "coverage-7.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:830525361249dc4cd013652b0efad645a385707a5ae49350c894b67d23fbb07c"}, - {file = "coverage-7.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd1b9c5adc066db699ccf7fa839189a649afcdd9e02cb5dc9d24e67e7922737d"}, - {file = "coverage-7.0.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e00c14720b8b3b6c23b487e70bd406abafc976ddc50490f645166f111c419c39"}, - {file = "coverage-7.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6d55d840e1b8c0002fce66443e124e8581f30f9ead2e54fbf6709fb593181f2c"}, - {file = "coverage-7.0.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:66b18c3cf8bbab0cce0d7b9e4262dc830e93588986865a8c78ab2ae324b3ed56"}, - {file = "coverage-7.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:12a5aa77783d49e05439fbe6e6b427484f8a0f9f456b46a51d8aac022cfd024d"}, - {file = "coverage-7.0.1-cp311-cp311-win32.whl", hash = "sha256:b77015d1cb8fe941be1222a5a8b4e3fbca88180cfa7e2d4a4e58aeabadef0ab7"}, - {file = "coverage-7.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:fb992c47cb1e5bd6a01e97182400bcc2ba2077080a17fcd7be23aaa6e572e390"}, - {file = "coverage-7.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e78e9dcbf4f3853d3ae18a8f9272111242531535ec9e1009fa8ec4a2b74557dc"}, - {file = "coverage-7.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e60bef2e2416f15fdc05772bf87db06c6a6f9870d1db08fdd019fbec98ae24a9"}, - {file = "coverage-7.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9823e4789ab70f3ec88724bba1a203f2856331986cd893dedbe3e23a6cfc1e4e"}, - {file = "coverage-7.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9158f8fb06747ac17bd237930c4372336edc85b6e13bdc778e60f9d685c3ca37"}, - {file = "coverage-7.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:486ee81fa694b4b796fc5617e376326a088f7b9729c74d9defa211813f3861e4"}, - {file = "coverage-7.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1285648428a6101b5f41a18991c84f1c3959cee359e51b8375c5882fc364a13f"}, - {file = "coverage-7.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2c44fcfb3781b41409d0f060a4ed748537557de9362a8a9282182fafb7a76ab4"}, - {file = "coverage-7.0.1-cp37-cp37m-win32.whl", hash = "sha256:d6814854c02cbcd9c873c0f3286a02e3ac1250625cca822ca6bc1018c5b19f1c"}, - {file = "coverage-7.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:f66460f17c9319ea4f91c165d46840314f0a7c004720b20be58594d162a441d8"}, - {file = "coverage-7.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9b373c9345c584bb4b5f5b8840df7f4ab48c4cbb7934b58d52c57020d911b856"}, - {file = "coverage-7.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d3022c3007d3267a880b5adcf18c2a9bf1fc64469b394a804886b401959b8742"}, - {file = "coverage-7.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92651580bd46519067e36493acb394ea0607b55b45bd81dd4e26379ed1871f55"}, - {file = "coverage-7.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3cfc595d2af13856505631be072835c59f1acf30028d1c860b435c5fc9c15b69"}, - {file = "coverage-7.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b4b3a4d9915b2be879aff6299c0a6129f3d08a775d5a061f503cf79571f73e4"}, - {file = "coverage-7.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b6f22bb64cc39bcb883e5910f99a27b200fdc14cdd79df8696fa96b0005c9444"}, - {file = "coverage-7.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:72d1507f152abacea81f65fee38e4ef3ac3c02ff8bc16f21d935fd3a8a4ad910"}, - {file = "coverage-7.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0a79137fc99815fff6a852c233628e735ec15903cfd16da0f229d9c4d45926ab"}, - {file = "coverage-7.0.1-cp38-cp38-win32.whl", hash = "sha256:b3763e7fcade2ff6c8e62340af9277f54336920489ceb6a8cd6cc96da52fcc62"}, - {file = "coverage-7.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:09f6b5a8415b6b3e136d5fec62b552972187265cb705097bf030eb9d4ffb9b60"}, - {file = "coverage-7.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:978258fec36c154b5e250d356c59af7d4c3ba02bef4b99cda90b6029441d797d"}, - {file = "coverage-7.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:19ec666533f0f70a0993f88b8273057b96c07b9d26457b41863ccd021a043b9a"}, - {file = "coverage-7.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cfded268092a84605f1cc19e5c737f9ce630a8900a3589e9289622db161967e9"}, - {file = "coverage-7.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07bcfb1d8ac94af886b54e18a88b393f6a73d5959bb31e46644a02453c36e475"}, - {file = "coverage-7.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:397b4a923cc7566bbc7ae2dfd0ba5a039b61d19c740f1373791f2ebd11caea59"}, - {file = "coverage-7.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:aec2d1515d9d39ff270059fd3afbb3b44e6ec5758af73caf18991807138c7118"}, - {file = "coverage-7.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c20cfebcc149a4c212f6491a5f9ff56f41829cd4f607b5be71bb2d530ef243b1"}, - {file = "coverage-7.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:fd556ff16a57a070ce4f31c635953cc44e25244f91a0378c6e9bdfd40fdb249f"}, - {file = "coverage-7.0.1-cp39-cp39-win32.whl", hash = "sha256:b9ea158775c7c2d3e54530a92da79496fb3fb577c876eec761c23e028f1e216c"}, - {file = "coverage-7.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:d1991f1dd95eba69d2cd7708ff6c2bbd2426160ffc73c2b81f617a053ebcb1a8"}, - {file = "coverage-7.0.1-pp37.pp38.pp39-none-any.whl", hash = "sha256:3dd4ee135e08037f458425b8842d24a95a0961831a33f89685ff86b77d378f89"}, - {file = "coverage-7.0.1.tar.gz", hash = "sha256:a4a574a19eeb67575a5328a5760bbbb737faa685616586a9f9da4281f940109c"}, + {file = "coverage-7.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c1f02d016b9b6b5ad21949a21646714bfa7b32d6041a30f97674f05d6d6996e3"}, + {file = "coverage-7.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a2d4f68e4fa286fb6b00d58a1e87c79840e289d3f6e5dcb912ad7b0fbd9629fb"}, + {file = "coverage-7.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:426895ac9f2938bec193aa998e7a77a3e65d3e46903f348e794b4192b9a5b61e"}, + {file = "coverage-7.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dcb708ab06f3f4dfc99e9f84821c9120e5f12113b90fad132311a2cb97525379"}, + {file = "coverage-7.0.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8217f73faf08623acb25fb2affd5d20cbcd8185213db308e46a37e6fd6a56a49"}, + {file = "coverage-7.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:bcb57d175ff0cb4ff97fc547c74c1cb8d4c9612003f6d267ee78dad8f23d8b30"}, + {file = "coverage-7.0.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7d47d666e17e57ef65fefc87229fde262bd5c9039ae8424bc53aa2d8f07dc178"}, + {file = "coverage-7.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:321316a7b979892a13c148a9d37852b5a76f26717e4b911b606a649394629532"}, + {file = "coverage-7.0.2-cp310-cp310-win32.whl", hash = "sha256:420f10c852b9a489cf5a764534669a19f49732a0576c76d9489ebf287f81af6d"}, + {file = "coverage-7.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a27a8dca0dc6f0944ed9fd83c556d862e227a5cd4220e62af5d4c750389938f0"}, + {file = "coverage-7.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ac1033942851bf01f28c76318155ea92d6648aecb924cab81fa23781d095e9ab"}, + {file = "coverage-7.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:36c1a1b6d38ebf8a4335f65226ec36b5d6fd67743fdcbad5c52bdcd46c4f5842"}, + {file = "coverage-7.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5e1874c601128cf54c1d4b471e915658a334fbc56d7b3c324ddc7511597ea82"}, + {file = "coverage-7.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e133ca2f8141b415ff396ba789bdeffdea8ff9a5c7fc9996ccf591d7d40ee93"}, + {file = "coverage-7.0.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e97b21482aa5c21e049e4755c95955ad71fb54c9488969e2f17cf30922aa5f6"}, + {file = "coverage-7.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8bd466135fb07f693dbdd999a5569ffbc0590e9c64df859243162f0ebee950c8"}, + {file = "coverage-7.0.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:38f281bb9bdd4269c451fed9451203512dadefd64676f14ed1e82c77eb5644fc"}, + {file = "coverage-7.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7c669be1b01e4b2bf23aa49e987d9bedde0234a7da374a9b77ca5416d7c57002"}, + {file = "coverage-7.0.2-cp311-cp311-win32.whl", hash = "sha256:80583c536e7e010e301002088919d4ea90566d1789ee02551574fdf3faa275ae"}, + {file = "coverage-7.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:a7b018811a0e1d3869d8d0600849953acd355a3a29c6bee0fbd24d7772bcc0a2"}, + {file = "coverage-7.0.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e8931af864bd599c6af626575a02103ae626f57b34e3af5537d40b040d33d2ad"}, + {file = "coverage-7.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a613d60be1a02c7a5184ea5c4227f48c08e0635608b9c17ae2b17efef8f2501"}, + {file = "coverage-7.0.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3fbb59f84c8549113dcdce7c6d16c5731fe53651d0b46c0a25a5ebc7bb655869"}, + {file = "coverage-7.0.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d40ad86a348c79c614e2b90566267dd6d45f2e6b4d2bfb794d78ea4a4b60b63"}, + {file = "coverage-7.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7e184aa18f921b612ea08666c25dd92a71241c8ed40917f2824219c92289b8c7"}, + {file = "coverage-7.0.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:fd22ee7bff4b5c37bb6385efee1c501b75e29ca40286f037cb91c2182d1348ce"}, + {file = "coverage-7.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:3d72e3d20b03e63bd27b1c4d6b754cd93eca82ecc5dd77b99262d5f64862ca35"}, + {file = "coverage-7.0.2-cp37-cp37m-win32.whl", hash = "sha256:5f44ba7c07e0aa4a7a2723b426c254e952da82a33d65b4a52afae4bef74a4203"}, + {file = "coverage-7.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:efa9d943189321f67f71070c309aa6f6130fa1ec35c9dfd0da0ed238938ce573"}, + {file = "coverage-7.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:da458bdc9b0bcd9b8ca85bc73148631b18cc8ba03c47f29f4c017809990351aa"}, + {file = "coverage-7.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:87d95eea58fb71f69b4f1c761099a19e0e9cb27d45dc1cc7042523128ee56337"}, + {file = "coverage-7.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfafc350f43fd7dc67df18c940c3b7ed208ebb797abe9fb3047f0c65be8e4c0f"}, + {file = "coverage-7.0.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:46db409fc0c3ee5c859b84c7de9cb507166287d588390889fdf06a1afe452e16"}, + {file = "coverage-7.0.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8805673b1953313adfc487d5323b4c87864e77057944a0888c98dd2f7a6052f"}, + {file = "coverage-7.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:62e5b942378d5f0b87caace567a70dc634ddd4d219a236fa221dc97d2fc412c8"}, + {file = "coverage-7.0.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a99b2f2dd1236e8d9dc35974a3dc298a408cdfd512b0bb2451798cff1ce63408"}, + {file = "coverage-7.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:04691b8e832a900ed15f5bcccc2008fc2d1c8e7411251fd7d1422a84e1d72841"}, + {file = "coverage-7.0.2-cp38-cp38-win32.whl", hash = "sha256:b6936cd38757dd323fefc157823e46436610328f0feb1419a412316f24b77f36"}, + {file = "coverage-7.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:483e120ea324c7fced6126bb9bf0535c71e9233d29cbc7e2fc4560311a5f8a32"}, + {file = "coverage-7.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4438ba539bef21e288092b30ea2fc30e883d9af5b66ebeaf2fd7c25e2f074e39"}, + {file = "coverage-7.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3a2d81c95d3b02638ee6ae647edc79769fd29bf5e9e5b6b0c29040579f33c260"}, + {file = "coverage-7.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c40aaf7930680e0e5f3bd6d3d3dc97a7897f53bdce925545c4b241e0c5c3ca6a"}, + {file = "coverage-7.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b31f7f246dbff339b3b76ee81329e3eca5022ce270c831c65e841dbbb40115f"}, + {file = "coverage-7.0.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6e1c77ff6f10eab496fbbcdaa7dfae84968928a0aadc43ce3c3453cec29bd79"}, + {file = "coverage-7.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:8e6c0ca447b557a32642f22d0987be37950eda51c4f19fc788cebc99426284b6"}, + {file = "coverage-7.0.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9de96025ce25b9f4e744fbe558a003e673004af255da9b1f6ec243720ac5deeb"}, + {file = "coverage-7.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:312fd77258bf1044ef4faa82091f2e88216e4b62dcf1a461d3e917144c8b09b7"}, + {file = "coverage-7.0.2-cp39-cp39-win32.whl", hash = "sha256:4d7be755d7544dac2b9814e98366a065d15a16e13847eb1f5473bb714483391e"}, + {file = "coverage-7.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:b6eab230b18458707b5c501548e997e42934b1c189fb4d1b78bf5aacc1c6a137"}, + {file = "coverage-7.0.2-pp37.pp38.pp39-none-any.whl", hash = "sha256:1d732b5dcafed67d81c5b5a0c404c31a61e13148946a3b910a340f72fdd1ec95"}, + {file = "coverage-7.0.2.tar.gz", hash = "sha256:405d8528a0ea07ca516d9007ecad4e1bd10e2eeef27411c6188d78c4e2dfcddc"}, ] cycler = [ {file = "cycler-0.11.0-py3-none-any.whl", hash = "sha256:3a27e95f763a428a739d2add979fa7494c912a32c17c4c38c4d5f082cad165a3"}, {file = "cycler-0.11.0.tar.gz", hash = "sha256:9c87405839a19696e837b3b818fed3f5f69f16f1eec1a1ad77e043dcea9c772f"}, ] +debugpy = [ + {file = "debugpy-1.6.4-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:6ae238943482c78867ac707c09122688efb700372b617ffd364261e5e41f7a2f"}, + {file = "debugpy-1.6.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a39e7da178e1f22f4bc04b57f085e785ed1bcf424aaf318835a1a7129eefe35"}, + {file = "debugpy-1.6.4-cp310-cp310-win32.whl", hash = "sha256:143f79d0798a9acea21cd1d111badb789f19d414aec95fa6389cfea9485ddfb1"}, + {file = "debugpy-1.6.4-cp310-cp310-win_amd64.whl", hash = "sha256:563f148f94434365ec0ce94739c749aabf60bf67339e68a9446499f3582d62f3"}, + {file = "debugpy-1.6.4-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:1caee68f7e254267df908576c0d0938f8f88af16383f172cb9f0602e24c30c01"}, + {file = "debugpy-1.6.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40e2a83d31a16b83666f19fa06d97b2cc311af88e6266590579737949971a17e"}, + {file = "debugpy-1.6.4-cp37-cp37m-win32.whl", hash = "sha256:82229790442856962aec4767b98ba2559fe0998f897e9f21fb10b4fd24b6c436"}, + {file = "debugpy-1.6.4-cp37-cp37m-win_amd64.whl", hash = "sha256:67edf033f9e512958f7b472975ff9d9b7ff64bf4440f6f6ae44afdc66b89e6b6"}, + {file = "debugpy-1.6.4-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:4ab5e938925e5d973f567d6ef32751b17d10f3be3a8c4d73c52f53e727f69bf1"}, + {file = "debugpy-1.6.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8df268e9f72fc06efc2e75e8dc8e2b881d6a397356faec26efb2ee70b6863b7"}, + {file = "debugpy-1.6.4-cp38-cp38-win32.whl", hash = "sha256:86bd25f38f8b6c5d430a5e2931eebbd5f580c640f4819fcd236d0498790c7204"}, + {file = "debugpy-1.6.4-cp38-cp38-win_amd64.whl", hash = "sha256:62ba4179b372a62abf9c89b56997d70a4100c6dea6c2a4e0e4be5f45920b3253"}, + {file = "debugpy-1.6.4-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:d2968e589bda4e485a9c61f113754a28e48d88c5152ed8e0b2564a1fadbe50a5"}, + {file = "debugpy-1.6.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e62b8034ede98932b92268669318848a0d42133d857087a3b9cec03bb844c615"}, + {file = "debugpy-1.6.4-cp39-cp39-win32.whl", hash = "sha256:3d9c31baf64bf959a593996c108e911c5a9aa1693a296840e5469473f064bcec"}, + {file = "debugpy-1.6.4-cp39-cp39-win_amd64.whl", hash = "sha256:ea4bf208054e6d41749f17612066da861dff10102729d32c85b47f155223cf2b"}, + {file = "debugpy-1.6.4-py2.py3-none-any.whl", hash = "sha256:e886a1296cd20a10172e94788009ce74b759e54229ebd64a43fa5c2b4e62cd76"}, + {file = "debugpy-1.6.4.zip", hash = "sha256:d5ab9bd3f4e7faf3765fd52c7c43c074104ab1e109621dc73219099ed1a5399d"}, +] decorator = [ {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, @@ -2315,6 +2708,10 @@ defusedxml = [ {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, ] +df2onehot = [ + {file = "df2onehot-1.0.2-py3-none-any.whl", hash = "sha256:6e41e6ab760ae65ec5f762f7b17302e8e5aff6c35f0b928b659c950c2039d5d6"}, + {file = "df2onehot-1.0.2.tar.gz", hash = "sha256:2092ce9d0ea23b3904aaee78473966bf847aa8fb6bb71608b966fcce754b63e1"}, +] docstring-parser = [ {file = "docstring_parser-0.15-py3-none-any.whl", hash = "sha256:d1679b86250d269d06a99670924d6bce45adc00b08069dae8c47d98e89b667a9"}, {file = "docstring_parser-0.15.tar.gz", hash = "sha256:48ddc093e8b1865899956fcc03b03e66bb7240c310fac5af81814580c55bf682"}, @@ -2367,6 +2764,14 @@ fonttools = [ {file = "fonttools-4.38.0-py3-none-any.whl", hash = "sha256:820466f43c8be8c3009aef8b87e785014133508f0de64ec469e4efb643ae54fb"}, {file = "fonttools-4.38.0.zip", hash = "sha256:2bb244009f9bf3fa100fc3ead6aeb99febe5985fa20afbfbaa2f8946c2fbdaf1"}, ] +fsspec = [ + {file = "fsspec-2022.11.0-py3-none-any.whl", hash = "sha256:d6e462003e3dcdcb8c7aa84c73a228f8227e72453cd22570e2363e8844edfe7b"}, + {file = "fsspec-2022.11.0.tar.gz", hash = "sha256:259d5fd5c8e756ff2ea72f42e7613c32667dc2049a4ac3d84364a7ca034acb8b"}, +] +funcsigs = [ + {file = "funcsigs-1.0.2-py2.py3-none-any.whl", hash = "sha256:330cc27ccbf7f1e992e69fef78261dc7c6569012cf397db8d3de0234e6c937ca"}, + {file = "funcsigs-1.0.2.tar.gz", hash = "sha256:a7bb0f2cf3a3fd1ab2732cb49eba4252c2af4240442415b4abce3b87022a8f50"}, +] ghp-import = [ {file = "ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343"}, {file = "ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619"}, @@ -2376,8 +2781,8 @@ gitdb = [ {file = "gitdb-4.0.10.tar.gz", hash = "sha256:6eb990b69df4e15bad899ea868dc46572c3f75339735663b81de79b06f17eb9a"}, ] GitPython = [ - {file = "GitPython-3.1.29-py3-none-any.whl", hash = "sha256:41eea0deec2deea139b459ac03656f0dd28fc4a3387240ec1d3c259a2c47850f"}, - {file = "GitPython-3.1.29.tar.gz", hash = "sha256:cc36bfc4a3f913e66805a28e84703e419d9c264c1077e537b54f0e1af85dbefd"}, + {file = "GitPython-3.1.30-py3-none-any.whl", hash = "sha256:cd455b0000615c60e286208ba540271af9fe531fa6a87cc590a7298785ab2882"}, + {file = "GitPython-3.1.30.tar.gz", hash = "sha256:769c2d83e13f5d938b7688479da374c4e3d49f71549aaf462b646db9602ea6f8"}, ] graphviz = [ {file = "graphviz-0.20.1-py3-none-any.whl", hash = "sha256:587c58a223b51611c0cf461132da386edd896a029524ca61a1462b880bf97977"}, @@ -2396,8 +2801,8 @@ imagesize = [ {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, ] importlib-metadata = [ - {file = "importlib_metadata-5.2.0-py3-none-any.whl", hash = "sha256:0eafa39ba42bf225fc00e67f701d71f85aead9f878569caf13c3724f704b970f"}, - {file = "importlib_metadata-5.2.0.tar.gz", hash = "sha256:404d48d62bba0b7a77ff9d405efd91501bef2e67ff4ace0bed40a0cf28c3c7cd"}, + {file = "importlib_metadata-6.0.0-py3-none-any.whl", hash = "sha256:7efb448ec9a5e313a57655d35aa54cd3e01b7e1fbcf72dce1bf06119420f5bad"}, + {file = "importlib_metadata-6.0.0.tar.gz", hash = "sha256:e354bedeb60efa6affdcc8ae121b73544a7aa74156d047311948f6d711cd378d"}, ] importlib-resources = [ {file = "importlib_resources-5.10.2-py3-none-any.whl", hash = "sha256:7d543798b0beca10b6a01ac7cafda9f822c54db9e8376a6bf57e0cbd74d486b6"}, @@ -2407,10 +2812,22 @@ iniconfig = [ {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, ] +ipykernel = [ + {file = "ipykernel-6.19.4-py3-none-any.whl", hash = "sha256:0ecdae0060da61c5222ad221681f3b99b5bef739e11a3b1eb5778aa47f056f1f"}, + {file = "ipykernel-6.19.4.tar.gz", hash = "sha256:4140c282a6c71cdde59abe5eae2c71bf1eeb4a69316ab76e1c4c25150a49722b"}, +] ipython = [ {file = "ipython-7.34.0-py3-none-any.whl", hash = "sha256:c175d2440a1caff76116eb719d40538fbb316e214eda85c5515c303aacbfb23e"}, {file = "ipython-7.34.0.tar.gz", hash = "sha256:af3bdb46aa292bce5615b1b2ebc76c2080c5f77f54bda2ec72461317273e7cd6"}, ] +ipywidgets = [ + {file = "ipywidgets-8.0.4-py3-none-any.whl", hash = "sha256:ebb195e743b16c3947fe8827190fb87b4d00979c0fbf685afe4d2c4927059fa1"}, + {file = "ipywidgets-8.0.4.tar.gz", hash = "sha256:c0005a77a47d77889cafed892b58e33b4a2a96712154404c6548ec22272811ea"}, +] +ismember = [ + {file = "ismember-1.0.2-py3-none-any.whl", hash = "sha256:67319cd9f02d6f66124a22c16f42d174a4697aaaf23a931eff44fae4525ec493"}, + {file = "ismember-1.0.2.tar.gz", hash = "sha256:b1a784e45ba9d1fd18303fe3b829270a6922954cc5798f49fdf843758a8d0d10"}, +] isort = [ {file = "isort-5.11.4-py3-none-any.whl", hash = "sha256:c033fd0edb91000a7f09527fe5c75321878f98322a77ddcc81adbd83724afb7b"}, {file = "isort-5.11.4.tar.gz", hash = "sha256:6db30c5ded9815d813932c04c2f85a360bcdd35fed496f4d8f35495ef0a261b6"}, @@ -2427,6 +2844,10 @@ joblib = [ {file = "joblib-1.2.0-py3-none-any.whl", hash = "sha256:091138ed78f800342968c523bdde947e7a305b8594b910a0fea2ab83c3c6d385"}, {file = "joblib-1.2.0.tar.gz", hash = "sha256:e1cee4a79e4af22881164f218d4311f60074197fb707e082e803b61f6d137018"}, ] +jsonpickle = [ + {file = "jsonpickle-3.0.1-py2.py3-none-any.whl", hash = "sha256:130d8b293ea0add3845de311aaba55e6d706d0bb17bc123bd2c8baf8a39ac77c"}, + {file = "jsonpickle-3.0.1.tar.gz", hash = "sha256:032538804795e73b94ead410800ac387fdb6de98f8882ac957fcd247e3a85200"}, +] jsonschema = [ {file = "jsonschema-4.17.3-py3-none-any.whl", hash = "sha256:a870ad254da1a8ca84b6a2905cac29d265f805acc57af304784962a2aa6508f6"}, {file = "jsonschema-4.17.3.tar.gz", hash = "sha256:0f864437ab8b6076ba6707453ef8f98a6a0d512a80e93f8abdb676f737ecb60d"}, @@ -2436,13 +2857,17 @@ jupyter-client = [ {file = "jupyter_client-7.4.8.tar.gz", hash = "sha256:109a3c33b62a9cf65aa8325850a0999a795fac155d9de4f7555aef5f310ee35a"}, ] jupyter-core = [ - {file = "jupyter_core-5.1.1-py3-none-any.whl", hash = "sha256:f1038179d0f179b0e92c8fa2289c012b29dafdc9484b41821079f1a496f5a0f2"}, - {file = "jupyter_core-5.1.1.tar.gz", hash = "sha256:f342d29eb6edb06f8dffa69adea987b3a9ee2b6702338a8cb6911516ea0b432d"}, + {file = "jupyter_core-5.1.2-py3-none-any.whl", hash = "sha256:0f99cc639c8d00d591acfcc028aeea81473ea6c72fabe86426398220e2d91b1d"}, + {file = "jupyter_core-5.1.2.tar.gz", hash = "sha256:62b00d52f030643d29f86aafdfd9b36d42421823599a272eb4c2df1d1cc7f723"}, ] jupyterlab-pygments = [ {file = "jupyterlab_pygments-0.2.2-py2.py3-none-any.whl", hash = "sha256:2405800db07c9f770863bcf8049a529c3dd4d3e28536638bd7c1c01d2748309f"}, {file = "jupyterlab_pygments-0.2.2.tar.gz", hash = "sha256:7405d7fde60819d905a9fa8ce89e4cd830e318cdad22a0030f7a901da705585d"}, ] +jupyterlab-widgets = [ + {file = "jupyterlab_widgets-3.0.5-py3-none-any.whl", hash = "sha256:a04a42e50231b355b7087e16a818f541e53589f7647144ea0344c4bf16f300e5"}, + {file = "jupyterlab_widgets-3.0.5.tar.gz", hash = "sha256:eeaecdeaf6c03afc960ddae201ced88d5979b4ca9c3891bcb8f6631af705f5ef"}, +] kiwisolver = [ {file = "kiwisolver-1.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2f5e60fabb7343a836360c4f0919b8cd0d6dbf08ad2ca6b9cf90bf0c76a3c4f6"}, {file = "kiwisolver-1.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:10ee06759482c78bdb864f4109886dff7b8a56529bc1609d4f1112b93fe6423c"}, @@ -2690,8 +3115,8 @@ nbformat = [ {file = "nbformat-5.7.1.tar.gz", hash = "sha256:3810a0130453ed031970521d20989b8a592f3c2e73283a8280ae34ae1f75b3f8"}, ] nbsphinx = [ - {file = "nbsphinx-0.8.10-py3-none-any.whl", hash = "sha256:6076fba58020420927899362579f12779a43091eb238f414519ec25b4a8cfc96"}, - {file = "nbsphinx-0.8.10.tar.gz", hash = "sha256:a8d68046f8aab916e2940b9b3819bd3ef9ddce868aa38845ea366645cabb6254"}, + {file = "nbsphinx-0.8.11-py3-none-any.whl", hash = "sha256:e5c6c76b12fbc425d5538d4b8c0d6fb0c134c28459d4a1b54f41d704b34b4bd1"}, + {file = "nbsphinx-0.8.11.tar.gz", hash = "sha256:abe18c04b33d9bcdfb3d66f1195f6b0d51eeca463ecb07f6061de497e43316e4"}, ] nest-asyncio = [ {file = "nest_asyncio-1.5.6-py3-none-any.whl", hash = "sha256:b9a953fb40dceaa587d109609098db21900182b16440652454a146cffb06e8b8"}, @@ -2735,6 +3160,27 @@ numpydoc = [ {file = "numpydoc-1.5.0-py3-none-any.whl", hash = "sha256:c997759fb6fc32662801cece76491eedbc0ec619b514932ffd2b270ae89c07f9"}, {file = "numpydoc-1.5.0.tar.gz", hash = "sha256:b0db7b75a32367a0e25c23b397842c65e344a1206524d16c8069f0a1c91b5f4c"}, ] +nvidia-cublas-cu11 = [ + {file = "nvidia_cublas_cu11-11.10.3.66-py3-none-manylinux1_x86_64.whl", hash = "sha256:d32e4d75f94ddfb93ea0a5dda08389bcc65d8916a25cb9f37ac89edaeed3bded"}, + {file = "nvidia_cublas_cu11-11.10.3.66-py3-none-win_amd64.whl", hash = "sha256:8ac17ba6ade3ed56ab898a036f9ae0756f1e81052a317bf98f8c6d18dc3ae49e"}, +] +nvidia-cuda-nvrtc-cu11 = [ + {file = "nvidia_cuda_nvrtc_cu11-11.7.99-2-py3-none-manylinux1_x86_64.whl", hash = "sha256:9f1562822ea264b7e34ed5930567e89242d266448e936b85bc97a3370feabb03"}, + {file = "nvidia_cuda_nvrtc_cu11-11.7.99-py3-none-manylinux1_x86_64.whl", hash = "sha256:f7d9610d9b7c331fa0da2d1b2858a4a8315e6d49765091d28711c8946e7425e7"}, + {file = "nvidia_cuda_nvrtc_cu11-11.7.99-py3-none-win_amd64.whl", hash = "sha256:f2effeb1309bdd1b3854fc9b17eaf997808f8b25968ce0c7070945c4265d64a3"}, +] +nvidia-cuda-runtime-cu11 = [ + {file = "nvidia_cuda_runtime_cu11-11.7.99-py3-none-manylinux1_x86_64.whl", hash = "sha256:cc768314ae58d2641f07eac350f40f99dcb35719c4faff4bc458a7cd2b119e31"}, + {file = "nvidia_cuda_runtime_cu11-11.7.99-py3-none-win_amd64.whl", hash = "sha256:bc77fa59a7679310df9d5c70ab13c4e34c64ae2124dd1efd7e5474b71be125c7"}, +] +nvidia-cudnn-cu11 = [ + {file = "nvidia_cudnn_cu11-8.5.0.96-2-py3-none-manylinux1_x86_64.whl", hash = "sha256:402f40adfc6f418f9dae9ab402e773cfed9beae52333f6d86ae3107a1b9527e7"}, + {file = "nvidia_cudnn_cu11-8.5.0.96-py3-none-manylinux1_x86_64.whl", hash = "sha256:71f8111eb830879ff2836db3cccf03bbd735df9b0d17cd93761732ac50a8a108"}, +] +opt-einsum = [ + {file = "opt_einsum-3.3.0-py3-none-any.whl", hash = "sha256:2455e59e3947d3c275477df7f5205b30635e266fe6dc300e3d9f9646bfcea147"}, + {file = "opt_einsum-3.3.0.tar.gz", hash = "sha256:59f6475f77bbc37dcf7cd748519c0ec60722e91e63ca114e68821c0c54a46549"}, +] packaging = [ {file = "packaging-22.0-py3-none-any.whl", hash = "sha256:957e2148ba0e1a3b282772e791ef1d8083648bc131c8ab0c1feba110ce1146c3"}, {file = "packaging-22.0.tar.gz", hash = "sha256:2198ec20bd4c017b8f9717e00f0c8714076fc2fd93816750ab48e2c41de2cfd3"}, @@ -2800,72 +3246,78 @@ pexpect = [ {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, ] +pgmpy = [ + {file = "pgmpy-0.1.21-py3-none-any.whl", hash = "sha256:3c442320e7822892813b4eb56e048729d3bde053a707b5bb032685af6b372246"}, + {file = "pgmpy-0.1.21.tar.gz", hash = "sha256:90e9abf636629b6c1528df5847d2861b06220d103b5da414fcc74df0ee94cbf1"}, +] pickleshare = [ {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, ] Pillow = [ - {file = "Pillow-9.3.0-1-cp37-cp37m-win32.whl", hash = "sha256:e6ea6b856a74d560d9326c0f5895ef8050126acfdc7ca08ad703eb0081e82b74"}, - {file = "Pillow-9.3.0-1-cp37-cp37m-win_amd64.whl", hash = "sha256:32a44128c4bdca7f31de5be641187367fe2a450ad83b833ef78910397db491aa"}, - {file = "Pillow-9.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:0b7257127d646ff8676ec8a15520013a698d1fdc48bc2a79ba4e53df792526f2"}, - {file = "Pillow-9.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b90f7616ea170e92820775ed47e136208e04c967271c9ef615b6fbd08d9af0e3"}, - {file = "Pillow-9.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68943d632f1f9e3dce98908e873b3a090f6cba1cbb1b892a9e8d97c938871fbe"}, - {file = "Pillow-9.3.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:be55f8457cd1eac957af0c3f5ece7bc3f033f89b114ef30f710882717670b2a8"}, - {file = "Pillow-9.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d77adcd56a42d00cc1be30843d3426aa4e660cab4a61021dc84467123f7a00c"}, - {file = "Pillow-9.3.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:829f97c8e258593b9daa80638aee3789b7df9da5cf1336035016d76f03b8860c"}, - {file = "Pillow-9.3.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:801ec82e4188e935c7f5e22e006d01611d6b41661bba9fe45b60e7ac1a8f84de"}, - {file = "Pillow-9.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:871b72c3643e516db4ecf20efe735deb27fe30ca17800e661d769faab45a18d7"}, - {file = "Pillow-9.3.0-cp310-cp310-win32.whl", hash = "sha256:655a83b0058ba47c7c52e4e2df5ecf484c1b0b0349805896dd350cbc416bdd91"}, - {file = "Pillow-9.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:9f47eabcd2ded7698106b05c2c338672d16a6f2a485e74481f524e2a23c2794b"}, - {file = "Pillow-9.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:57751894f6618fd4308ed8e0c36c333e2f5469744c34729a27532b3db106ee20"}, - {file = "Pillow-9.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7db8b751ad307d7cf238f02101e8e36a128a6cb199326e867d1398067381bff4"}, - {file = "Pillow-9.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3033fbe1feb1b59394615a1cafaee85e49d01b51d54de0cbf6aa8e64182518a1"}, - {file = "Pillow-9.3.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22b012ea2d065fd163ca096f4e37e47cd8b59cf4b0fd47bfca6abb93df70b34c"}, - {file = "Pillow-9.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b9a65733d103311331875c1dca05cb4606997fd33d6acfed695b1232ba1df193"}, - {file = "Pillow-9.3.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:502526a2cbfa431d9fc2a079bdd9061a2397b842bb6bc4239bb176da00993812"}, - {file = "Pillow-9.3.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:90fb88843d3902fe7c9586d439d1e8c05258f41da473952aa8b328d8b907498c"}, - {file = "Pillow-9.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:89dca0ce00a2b49024df6325925555d406b14aa3efc2f752dbb5940c52c56b11"}, - {file = "Pillow-9.3.0-cp311-cp311-win32.whl", hash = "sha256:3168434d303babf495d4ba58fc22d6604f6e2afb97adc6a423e917dab828939c"}, - {file = "Pillow-9.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:18498994b29e1cf86d505edcb7edbe814d133d2232d256db8c7a8ceb34d18cef"}, - {file = "Pillow-9.3.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:772a91fc0e03eaf922c63badeca75e91baa80fe2f5f87bdaed4280662aad25c9"}, - {file = "Pillow-9.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa4107d1b306cdf8953edde0534562607fe8811b6c4d9a486298ad31de733b2"}, - {file = "Pillow-9.3.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b4012d06c846dc2b80651b120e2cdd787b013deb39c09f407727ba90015c684f"}, - {file = "Pillow-9.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77ec3e7be99629898c9a6d24a09de089fa5356ee408cdffffe62d67bb75fdd72"}, - {file = "Pillow-9.3.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:6c738585d7a9961d8c2821a1eb3dcb978d14e238be3d70f0a706f7fa9316946b"}, - {file = "Pillow-9.3.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:828989c45c245518065a110434246c44a56a8b2b2f6347d1409c787e6e4651ee"}, - {file = "Pillow-9.3.0-cp37-cp37m-win32.whl", hash = "sha256:82409ffe29d70fd733ff3c1025a602abb3e67405d41b9403b00b01debc4c9a29"}, - {file = "Pillow-9.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:41e0051336807468be450d52b8edd12ac60bebaa97fe10c8b660f116e50b30e4"}, - {file = "Pillow-9.3.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:b03ae6f1a1878233ac620c98f3459f79fd77c7e3c2b20d460284e1fb370557d4"}, - {file = "Pillow-9.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4390e9ce199fc1951fcfa65795f239a8a4944117b5935a9317fb320e7767b40f"}, - {file = "Pillow-9.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40e1ce476a7804b0fb74bcfa80b0a2206ea6a882938eaba917f7a0f004b42502"}, - {file = "Pillow-9.3.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a0a06a052c5f37b4ed81c613a455a81f9a3a69429b4fd7bb913c3fa98abefc20"}, - {file = "Pillow-9.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03150abd92771742d4a8cd6f2fa6246d847dcd2e332a18d0c15cc75bf6703040"}, - {file = "Pillow-9.3.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:15c42fb9dea42465dfd902fb0ecf584b8848ceb28b41ee2b58f866411be33f07"}, - {file = "Pillow-9.3.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:51e0e543a33ed92db9f5ef69a0356e0b1a7a6b6a71b80df99f1d181ae5875636"}, - {file = "Pillow-9.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3dd6caf940756101205dffc5367babf288a30043d35f80936f9bfb37f8355b32"}, - {file = "Pillow-9.3.0-cp38-cp38-win32.whl", hash = "sha256:f1ff2ee69f10f13a9596480335f406dd1f70c3650349e2be67ca3139280cade0"}, - {file = "Pillow-9.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:276a5ca930c913f714e372b2591a22c4bd3b81a418c0f6635ba832daec1cbcfc"}, - {file = "Pillow-9.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:73bd195e43f3fadecfc50c682f5055ec32ee2c933243cafbfdec69ab1aa87cad"}, - {file = "Pillow-9.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1c7c8ae3864846fc95f4611c78129301e203aaa2af813b703c55d10cc1628535"}, - {file = "Pillow-9.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e0918e03aa0c72ea56edbb00d4d664294815aa11291a11504a377ea018330d3"}, - {file = "Pillow-9.3.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0915e734b33a474d76c28e07292f196cdf2a590a0d25bcc06e64e545f2d146c"}, - {file = "Pillow-9.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af0372acb5d3598f36ec0914deed2a63f6bcdb7b606da04dc19a88d31bf0c05b"}, - {file = "Pillow-9.3.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:ad58d27a5b0262c0c19b47d54c5802db9b34d38bbf886665b626aff83c74bacd"}, - {file = "Pillow-9.3.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:97aabc5c50312afa5e0a2b07c17d4ac5e865b250986f8afe2b02d772567a380c"}, - {file = "Pillow-9.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9aaa107275d8527e9d6e7670b64aabaaa36e5b6bd71a1015ddd21da0d4e06448"}, - {file = "Pillow-9.3.0-cp39-cp39-win32.whl", hash = "sha256:bac18ab8d2d1e6b4ce25e3424f709aceef668347db8637c2296bcf41acb7cf48"}, - {file = "Pillow-9.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:b472b5ea442148d1c3e2209f20f1e0bb0eb556538690fa70b5e1f79fa0ba8dc2"}, - {file = "Pillow-9.3.0-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:ab388aaa3f6ce52ac1cb8e122c4bd46657c15905904b3120a6248b5b8b0bc228"}, - {file = "Pillow-9.3.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbb8e7f2abee51cef77673be97760abff1674ed32847ce04b4af90f610144c7b"}, - {file = "Pillow-9.3.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bca31dd6014cb8b0b2db1e46081b0ca7d936f856da3b39744aef499db5d84d02"}, - {file = "Pillow-9.3.0-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c7025dce65566eb6e89f56c9509d4f628fddcedb131d9465cacd3d8bac337e7e"}, - {file = "Pillow-9.3.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ebf2029c1f464c59b8bdbe5143c79fa2045a581ac53679733d3a91d400ff9efb"}, - {file = "Pillow-9.3.0-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b59430236b8e58840a0dfb4099a0e8717ffb779c952426a69ae435ca1f57210c"}, - {file = "Pillow-9.3.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12ce4932caf2ddf3e41d17fc9c02d67126935a44b86df6a206cf0d7161548627"}, - {file = "Pillow-9.3.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae5331c23ce118c53b172fa64a4c037eb83c9165aba3a7ba9ddd3ec9fa64a699"}, - {file = "Pillow-9.3.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:0b07fffc13f474264c336298d1b4ce01d9c5a011415b79d4ee5527bb69ae6f65"}, - {file = "Pillow-9.3.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:073adb2ae23431d3b9bcbcff3fe698b62ed47211d0716b067385538a1b0f28b8"}, - {file = "Pillow-9.3.0.tar.gz", hash = "sha256:c935a22a557a560108d780f9a0fc426dd7459940dc54faa49d83249c8d3e760f"}, + {file = "Pillow-9.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:2968c58feca624bb6c8502f9564dd187d0e1389964898f5e9e1fbc8533169157"}, + {file = "Pillow-9.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c5c1362c14aee73f50143d74389b2c158707b4abce2cb055b7ad37ce60738d47"}, + {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd752c5ff1b4a870b7661234694f24b1d2b9076b8bf337321a814c612665f343"}, + {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a3049a10261d7f2b6514d35bbb7a4dfc3ece4c4de14ef5876c4b7a23a0e566d"}, + {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16a8df99701f9095bea8a6c4b3197da105df6f74e6176c5b410bc2df2fd29a57"}, + {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:94cdff45173b1919350601f82d61365e792895e3c3a3443cf99819e6fbf717a5"}, + {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:ed3e4b4e1e6de75fdc16d3259098de7c6571b1a6cc863b1a49e7d3d53e036070"}, + {file = "Pillow-9.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5b2f8a31bd43e0f18172d8ac82347c8f37ef3e0b414431157718aa234991b28"}, + {file = "Pillow-9.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:09b89ddc95c248ee788328528e6a2996e09eaccddeeb82a5356e92645733be35"}, + {file = "Pillow-9.4.0-cp310-cp310-win32.whl", hash = "sha256:f09598b416ba39a8f489c124447b007fe865f786a89dbfa48bb5cf395693132a"}, + {file = "Pillow-9.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:f6e78171be3fb7941f9910ea15b4b14ec27725865a73c15277bc39f5ca4f8391"}, + {file = "Pillow-9.4.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:3fa1284762aacca6dc97474ee9c16f83990b8eeb6697f2ba17140d54b453e133"}, + {file = "Pillow-9.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:eaef5d2de3c7e9b21f1e762f289d17b726c2239a42b11e25446abf82b26ac132"}, + {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4dfdae195335abb4e89cc9762b2edc524f3c6e80d647a9a81bf81e17e3fb6f0"}, + {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6abfb51a82e919e3933eb137e17c4ae9c0475a25508ea88993bb59faf82f3b35"}, + {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:451f10ef963918e65b8869e17d67db5e2f4ab40e716ee6ce7129b0cde2876eab"}, + {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:6663977496d616b618b6cfa43ec86e479ee62b942e1da76a2c3daa1c75933ef4"}, + {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:60e7da3a3ad1812c128750fc1bc14a7ceeb8d29f77e0a2356a8fb2aa8925287d"}, + {file = "Pillow-9.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:19005a8e58b7c1796bc0167862b1f54a64d3b44ee5d48152b06bb861458bc0f8"}, + {file = "Pillow-9.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f715c32e774a60a337b2bb8ad9839b4abf75b267a0f18806f6f4f5f1688c4b5a"}, + {file = "Pillow-9.4.0-cp311-cp311-win32.whl", hash = "sha256:b222090c455d6d1a64e6b7bb5f4035c4dff479e22455c9eaa1bdd4c75b52c80c"}, + {file = "Pillow-9.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:ba6612b6548220ff5e9df85261bddc811a057b0b465a1226b39bfb8550616aee"}, + {file = "Pillow-9.4.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:5f532a2ad4d174eb73494e7397988e22bf427f91acc8e6ebf5bb10597b49c493"}, + {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dd5a9c3091a0f414a963d427f920368e2b6a4c2f7527fdd82cde8ef0bc7a327"}, + {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef21af928e807f10bf4141cad4746eee692a0dd3ff56cfb25fce076ec3cc8abe"}, + {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:847b114580c5cc9ebaf216dd8c8dbc6b00a3b7ab0131e173d7120e6deade1f57"}, + {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:653d7fb2df65efefbcbf81ef5fe5e5be931f1ee4332c2893ca638c9b11a409c4"}, + {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:46f39cab8bbf4a384ba7cb0bc8bae7b7062b6a11cfac1ca4bc144dea90d4a9f5"}, + {file = "Pillow-9.4.0-cp37-cp37m-win32.whl", hash = "sha256:7ac7594397698f77bce84382929747130765f66406dc2cd8b4ab4da68ade4c6e"}, + {file = "Pillow-9.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:46c259e87199041583658457372a183636ae8cd56dbf3f0755e0f376a7f9d0e6"}, + {file = "Pillow-9.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:0e51f608da093e5d9038c592b5b575cadc12fd748af1479b5e858045fff955a9"}, + {file = "Pillow-9.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:765cb54c0b8724a7c12c55146ae4647e0274a839fb6de7bcba841e04298e1011"}, + {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:519e14e2c49fcf7616d6d2cfc5c70adae95682ae20f0395e9280db85e8d6c4df"}, + {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d197df5489004db87d90b918033edbeee0bd6df3848a204bca3ff0a903bef837"}, + {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0845adc64fe9886db00f5ab68c4a8cd933ab749a87747555cec1c95acea64b0b"}, + {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:e1339790c083c5a4de48f688b4841f18df839eb3c9584a770cbd818b33e26d5d"}, + {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:a96e6e23f2b79433390273eaf8cc94fec9c6370842e577ab10dabdcc7ea0a66b"}, + {file = "Pillow-9.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7cfc287da09f9d2a7ec146ee4d72d6ea1342e770d975e49a8621bf54eaa8f30f"}, + {file = "Pillow-9.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d7081c084ceb58278dd3cf81f836bc818978c0ccc770cbbb202125ddabec6628"}, + {file = "Pillow-9.4.0-cp38-cp38-win32.whl", hash = "sha256:df41112ccce5d47770a0c13651479fbcd8793f34232a2dd9faeccb75eb5d0d0d"}, + {file = "Pillow-9.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:7a21222644ab69ddd9967cfe6f2bb420b460dae4289c9d40ff9a4896e7c35c9a"}, + {file = "Pillow-9.4.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0f3269304c1a7ce82f1759c12ce731ef9b6e95b6df829dccd9fe42912cc48569"}, + {file = "Pillow-9.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cb362e3b0976dc994857391b776ddaa8c13c28a16f80ac6522c23d5257156bed"}, + {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2e0f87144fcbbe54297cae708c5e7f9da21a4646523456b00cc956bd4c65815"}, + {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:28676836c7796805914b76b1837a40f76827ee0d5398f72f7dcc634bae7c6264"}, + {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0884ba7b515163a1a05440a138adeb722b8a6ae2c2b33aea93ea3118dd3a899e"}, + {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:53dcb50fbdc3fb2c55431a9b30caeb2f7027fcd2aeb501459464f0214200a503"}, + {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:e8c5cf126889a4de385c02a2c3d3aba4b00f70234bfddae82a5eaa3ee6d5e3e6"}, + {file = "Pillow-9.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6c6b1389ed66cdd174d040105123a5a1bc91d0aa7059c7261d20e583b6d8cbd2"}, + {file = "Pillow-9.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0dd4c681b82214b36273c18ca7ee87065a50e013112eea7d78c7a1b89a739153"}, + {file = "Pillow-9.4.0-cp39-cp39-win32.whl", hash = "sha256:6d9dfb9959a3b0039ee06c1a1a90dc23bac3b430842dcb97908ddde05870601c"}, + {file = "Pillow-9.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:54614444887e0d3043557d9dbc697dbb16cfb5a35d672b7a0fcc1ed0cf1c600b"}, + {file = "Pillow-9.4.0-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b9b752ab91e78234941e44abdecc07f1f0d8f51fb62941d32995b8161f68cfe5"}, + {file = "Pillow-9.4.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d3b56206244dc8711f7e8b7d6cad4663917cd5b2d950799425076681e8766286"}, + {file = "Pillow-9.4.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aabdab8ec1e7ca7f1434d042bf8b1e92056245fb179790dc97ed040361f16bfd"}, + {file = "Pillow-9.4.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:db74f5562c09953b2c5f8ec4b7dfd3f5421f31811e97d1dbc0a7c93d6e3a24df"}, + {file = "Pillow-9.4.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e9d7747847c53a16a729b6ee5e737cf170f7a16611c143d95aa60a109a59c336"}, + {file = "Pillow-9.4.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b52ff4f4e002f828ea6483faf4c4e8deea8d743cf801b74910243c58acc6eda3"}, + {file = "Pillow-9.4.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:575d8912dca808edd9acd6f7795199332696d3469665ef26163cd090fa1f8bfa"}, + {file = "Pillow-9.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3c4ed2ff6760e98d262e0cc9c9a7f7b8a9f61aa4d47c58835cdaf7b0b8811bb"}, + {file = "Pillow-9.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e621b0246192d3b9cb1dc62c78cfa4c6f6d2ddc0ec207d43c0dedecb914f152a"}, + {file = "Pillow-9.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:8f127e7b028900421cad64f51f75c051b628db17fb00e099eb148761eed598c9"}, + {file = "Pillow-9.4.0.tar.gz", hash = "sha256:a1c2d7780448eb93fbcc3789bf3916aa5720d942e37945f4056680317f1cd23e"}, ] pkgutil_resolve_name = [ {file = "pkgutil_resolve_name-1.3.10-py3-none-any.whl", hash = "sha256:ca27cc078d25c5ad71a9de0a7a330146c4e014c2462d9af19c6b828280649c5e"}, @@ -2936,8 +3388,8 @@ pydata-sphinx-theme = [ {file = "pydata_sphinx_theme-0.9.0.tar.gz", hash = "sha256:03598a86915b596f4bf80bef79a4d33276a83e670bf360def699dbb9f99dc57a"}, ] pydocstyle = [ - {file = "pydocstyle-6.1.1-py3-none-any.whl", hash = "sha256:6987826d6775056839940041beef5c08cc7e3d71d63149b48e36727f70144dc4"}, - {file = "pydocstyle-6.1.1.tar.gz", hash = "sha256:1d41b7c459ba0ee6c345f2eb9ae827cab14a7533a88c5c6f7e94923f72df92dc"}, + {file = "pydocstyle-6.2.0-py3-none-any.whl", hash = "sha256:39573fa08919ac492b063724af39a1afdcfea8cdaa2c7b8018ca0dfff5d7e36f"}, + {file = "pydocstyle-6.2.0.tar.gz", hash = "sha256:b2d280501a4c0d9feeb96e9171dc3f6f7d0064c55270f4c7b1baa18452019fd9"}, ] pydot = [ {file = "pydot-1.4.2-py2.py3-none-any.whl", hash = "sha256:66c98190c65b8d2e2382a441b4c0edfdb4f4c025ef9cb9874de478fb0793a451"}, @@ -2948,8 +3400,8 @@ pyflakes = [ {file = "pyflakes-2.5.0.tar.gz", hash = "sha256:491feb020dca48ccc562a8c0cbe8df07ee13078df59813b83959cbdada312ea3"}, ] Pygments = [ - {file = "Pygments-2.13.0-py3-none-any.whl", hash = "sha256:f643f331ab57ba3c9d89212ee4a2dabc6e94f117cf4eefde99a0574720d14c42"}, - {file = "Pygments-2.13.0.tar.gz", hash = "sha256:56a8508ae95f98e2b9bdf93a6be5ae3f7d8af858b43e02c5a2ff083726be40c1"}, + {file = "Pygments-2.14.0-py3-none-any.whl", hash = "sha256:fa7bd7bd2771287c0de303af8bfdfc731f51bd2c6a47ab69d117138893b82717"}, + {file = "Pygments-2.14.0.tar.gz", hash = "sha256:b3ed06a9e8ac9a9aae5a6f5dbe78a8a58655d17b43b93c078f094ddc476ae297"}, ] pygraphviz = [ {file = "pygraphviz-1.10.zip", hash = "sha256:457e093a888128903251a266a8cc16b4ba93f3f6334b3ebfed92c7471a74d867"}, @@ -2962,29 +3414,38 @@ pyparsing = [ {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, ] +pypickle = [ + {file = "pypickle-1.1.0-py3-none-any.whl", hash = "sha256:3f0454b36e7d833aa76c4b8495802a2369da488de585f97071dc99733982a273"}, + {file = "pypickle-1.1.0.tar.gz", hash = "sha256:431739b9e22cc7fd093f9f605660cdbb7a5582182ca44de1616c32b651f969ef"}, +] pyrsistent = [ - {file = "pyrsistent-0.19.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d6982b5a0237e1b7d876b60265564648a69b14017f3b5f908c5be2de3f9abb7a"}, - {file = "pyrsistent-0.19.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:187d5730b0507d9285a96fca9716310d572e5464cadd19f22b63a6976254d77a"}, - {file = "pyrsistent-0.19.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:055ab45d5911d7cae397dc418808d8802fb95262751872c841c170b0dbf51eed"}, - {file = "pyrsistent-0.19.2-cp310-cp310-win32.whl", hash = "sha256:456cb30ca8bff00596519f2c53e42c245c09e1a4543945703acd4312949bfd41"}, - {file = "pyrsistent-0.19.2-cp310-cp310-win_amd64.whl", hash = "sha256:b39725209e06759217d1ac5fcdb510e98670af9e37223985f330b611f62e7425"}, - {file = "pyrsistent-0.19.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2aede922a488861de0ad00c7630a6e2d57e8023e4be72d9d7147a9fcd2d30712"}, - {file = "pyrsistent-0.19.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:879b4c2f4d41585c42df4d7654ddffff1239dc4065bc88b745f0341828b83e78"}, - {file = "pyrsistent-0.19.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c43bec251bbd10e3cb58ced80609c5c1eb238da9ca78b964aea410fb820d00d6"}, - {file = "pyrsistent-0.19.2-cp37-cp37m-win32.whl", hash = "sha256:d690b18ac4b3e3cab73b0b7aa7dbe65978a172ff94970ff98d82f2031f8971c2"}, - {file = "pyrsistent-0.19.2-cp37-cp37m-win_amd64.whl", hash = "sha256:3ba4134a3ff0fc7ad225b6b457d1309f4698108fb6b35532d015dca8f5abed73"}, - {file = "pyrsistent-0.19.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a178209e2df710e3f142cbd05313ba0c5ebed0a55d78d9945ac7a4e09d923308"}, - {file = "pyrsistent-0.19.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e371b844cec09d8dc424d940e54bba8f67a03ebea20ff7b7b0d56f526c71d584"}, - {file = "pyrsistent-0.19.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:111156137b2e71f3a9936baf27cb322e8024dac3dc54ec7fb9f0bcf3249e68bb"}, - {file = "pyrsistent-0.19.2-cp38-cp38-win32.whl", hash = "sha256:e5d8f84d81e3729c3b506657dddfe46e8ba9c330bf1858ee33108f8bb2adb38a"}, - {file = "pyrsistent-0.19.2-cp38-cp38-win_amd64.whl", hash = "sha256:9cd3e9978d12b5d99cbdc727a3022da0430ad007dacf33d0bf554b96427f33ab"}, - {file = "pyrsistent-0.19.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f1258f4e6c42ad0b20f9cfcc3ada5bd6b83374516cd01c0960e3cb75fdca6770"}, - {file = "pyrsistent-0.19.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21455e2b16000440e896ab99e8304617151981ed40c29e9507ef1c2e4314ee95"}, - {file = "pyrsistent-0.19.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfd880614c6237243ff53a0539f1cb26987a6dc8ac6e66e0c5a40617296a045e"}, - {file = "pyrsistent-0.19.2-cp39-cp39-win32.whl", hash = "sha256:71d332b0320642b3261e9fee47ab9e65872c2bd90260e5d225dabeed93cbd42b"}, - {file = "pyrsistent-0.19.2-cp39-cp39-win_amd64.whl", hash = "sha256:dec3eac7549869365fe263831f576c8457f6c833937c68542d08fde73457d291"}, - {file = "pyrsistent-0.19.2-py3-none-any.whl", hash = "sha256:ea6b79a02a28550c98b6ca9c35b9f492beaa54d7c5c9e9949555893c8a9234d0"}, - {file = "pyrsistent-0.19.2.tar.gz", hash = "sha256:bfa0351be89c9fcbcb8c9879b826f4353be10f58f8a677efab0c017bf7137ec2"}, + {file = "pyrsistent-0.19.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:20460ac0ea439a3e79caa1dbd560344b64ed75e85d8703943e0b66c2a6150e4a"}, + {file = "pyrsistent-0.19.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c18264cb84b5e68e7085a43723f9e4c1fd1d935ab240ce02c0324a8e01ccb64"}, + {file = "pyrsistent-0.19.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b774f9288dda8d425adb6544e5903f1fb6c273ab3128a355c6b972b7df39dcf"}, + {file = "pyrsistent-0.19.3-cp310-cp310-win32.whl", hash = "sha256:5a474fb80f5e0d6c9394d8db0fc19e90fa540b82ee52dba7d246a7791712f74a"}, + {file = "pyrsistent-0.19.3-cp310-cp310-win_amd64.whl", hash = "sha256:49c32f216c17148695ca0e02a5c521e28a4ee6c5089f97e34fe24163113722da"}, + {file = "pyrsistent-0.19.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f0774bf48631f3a20471dd7c5989657b639fd2d285b861237ea9e82c36a415a9"}, + {file = "pyrsistent-0.19.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ab2204234c0ecd8b9368dbd6a53e83c3d4f3cab10ecaf6d0e772f456c442393"}, + {file = "pyrsistent-0.19.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e42296a09e83028b3476f7073fcb69ffebac0e66dbbfd1bd847d61f74db30f19"}, + {file = "pyrsistent-0.19.3-cp311-cp311-win32.whl", hash = "sha256:64220c429e42a7150f4bfd280f6f4bb2850f95956bde93c6fda1b70507af6ef3"}, + {file = "pyrsistent-0.19.3-cp311-cp311-win_amd64.whl", hash = "sha256:016ad1afadf318eb7911baa24b049909f7f3bb2c5b1ed7b6a8f21db21ea3faa8"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c4db1bd596fefd66b296a3d5d943c94f4fac5bcd13e99bffe2ba6a759d959a28"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aeda827381f5e5d65cced3024126529ddc4289d944f75e090572c77ceb19adbf"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:42ac0b2f44607eb92ae88609eda931a4f0dfa03038c44c772e07f43e738bcac9"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-win32.whl", hash = "sha256:e8f2b814a3dc6225964fa03d8582c6e0b6650d68a232df41e3cc1b66a5d2f8d1"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-win_amd64.whl", hash = "sha256:c9bb60a40a0ab9aba40a59f68214eed5a29c6274c83b2cc206a359c4a89fa41b"}, + {file = "pyrsistent-0.19.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a2471f3f8693101975b1ff85ffd19bb7ca7dd7c38f8a81701f67d6b4f97b87d8"}, + {file = "pyrsistent-0.19.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc5d149f31706762c1f8bda2e8c4f8fead6e80312e3692619a75301d3dbb819a"}, + {file = "pyrsistent-0.19.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3311cb4237a341aa52ab8448c27e3a9931e2ee09561ad150ba94e4cfd3fc888c"}, + {file = "pyrsistent-0.19.3-cp38-cp38-win32.whl", hash = "sha256:f0e7c4b2f77593871e918be000b96c8107da48444d57005b6a6bc61fb4331b2c"}, + {file = "pyrsistent-0.19.3-cp38-cp38-win_amd64.whl", hash = "sha256:c147257a92374fde8498491f53ffa8f4822cd70c0d85037e09028e478cababb7"}, + {file = "pyrsistent-0.19.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b735e538f74ec31378f5a1e3886a26d2ca6351106b4dfde376a26fc32a044edc"}, + {file = "pyrsistent-0.19.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99abb85579e2165bd8522f0c0138864da97847875ecbd45f3e7e2af569bfc6f2"}, + {file = "pyrsistent-0.19.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a8cb235fa6d3fd7aae6a4f1429bbb1fec1577d978098da1252f0489937786f3"}, + {file = "pyrsistent-0.19.3-cp39-cp39-win32.whl", hash = "sha256:c74bed51f9b41c48366a286395c67f4e894374306b197e62810e0fdaf2364da2"}, + {file = "pyrsistent-0.19.3-cp39-cp39-win_amd64.whl", hash = "sha256:878433581fc23e906d947a6814336eee031a00e6defba224234169ae3d3d6a98"}, + {file = "pyrsistent-0.19.3-py3-none-any.whl", hash = "sha256:ccf0d6bd208f8111179f0c26fdf84ed7c3891982f2edaeae7422575f47e66b64"}, + {file = "pyrsistent-0.19.3.tar.gz", hash = "sha256:1a2994773706bbb4995c31a97bc94f1418314923bd1048c6d964837040376440"}, ] pytest = [ {file = "pytest-7.2.0-py3-none-any.whl", hash = "sha256:892f933d339f068883b6fd5a459f03d85bfcb355e4981e146d2c7616c21fef71"}, @@ -2998,10 +3459,16 @@ python-dateutil = [ {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, ] +python-louvain = [ + {file = "python-louvain-0.16.tar.gz", hash = "sha256:b7ba2df5002fd28d3ee789a49532baad11fe648e4f2117cf0798e7520a1da56b"}, +] pytz = [ {file = "pytz-2022.7-py2.py3-none-any.whl", hash = "sha256:93007def75ae22f7cd991c84e02d434876818661f8df9ad5df9e950ff4e52cfd"}, {file = "pytz-2022.7.tar.gz", hash = "sha256:7ccfae7b4b2c067464a6733c6261673fdb8fd1be905460396b97a073e9fa683a"}, ] +pyvis = [ + {file = "pyvis-0.3.1.tar.gz", hash = "sha256:aa817caac54afc9a4df38ada6f46636b842a8bd57197bb6aca5084699da04307"}, +] pywhy-graphs = [] pywin32 = [ {file = "pywin32-305-cp310-cp310-win32.whl", hash = "sha256:421f6cd86e84bbb696d54563c48014b12a23ef95a14e0bdba526be756d89f116"}, @@ -3364,6 +3831,10 @@ sympy = [ {file = "sympy-1.11.1-py3-none-any.whl", hash = "sha256:938f984ee2b1e8eae8a07b884c8b7a1146010040fccddc6539c54f401c8f6fcf"}, {file = "sympy-1.11.1.tar.gz", hash = "sha256:e32380dce63cb7c0108ed525570092fd45168bdae2faa17e528221ef72e88658"}, ] +tabulate = [ + {file = "tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f"}, + {file = "tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c"}, +] termcolor-whl = [ {file = "termcolor_whl-1.1.2-py2.py3-none-any.whl", hash = "sha256:3e7eda7348bb90ddea2d7a2171df65ed4a37adf62574fbd5459198410fdba881"}, ] @@ -3387,6 +3858,29 @@ tomli = [ {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] +torch = [ + {file = "torch-1.13.1-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:fd12043868a34a8da7d490bf6db66991108b00ffbeecb034228bfcbbd4197143"}, + {file = "torch-1.13.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:d9fe785d375f2e26a5d5eba5de91f89e6a3be5d11efb497e76705fdf93fa3c2e"}, + {file = "torch-1.13.1-cp310-cp310-win_amd64.whl", hash = "sha256:98124598cdff4c287dbf50f53fb455f0c1e3a88022b39648102957f3445e9b76"}, + {file = "torch-1.13.1-cp310-none-macosx_10_9_x86_64.whl", hash = "sha256:393a6273c832e047581063fb74335ff50b4c566217019cc6ace318cd79eb0566"}, + {file = "torch-1.13.1-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:0122806b111b949d21fa1a5f9764d1fd2fcc4a47cb7f8ff914204fd4fc752ed5"}, + {file = "torch-1.13.1-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:22128502fd8f5b25ac1cd849ecb64a418382ae81dd4ce2b5cebaa09ab15b0d9b"}, + {file = "torch-1.13.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:76024be052b659ac1304ab8475ab03ea0a12124c3e7626282c9c86798ac7bc11"}, + {file = "torch-1.13.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:ea8dda84d796094eb8709df0fcd6b56dc20b58fdd6bc4e8d7109930dafc8e419"}, + {file = "torch-1.13.1-cp37-cp37m-win_amd64.whl", hash = "sha256:2ee7b81e9c457252bddd7d3da66fb1f619a5d12c24d7074de91c4ddafb832c93"}, + {file = "torch-1.13.1-cp37-none-macosx_10_9_x86_64.whl", hash = "sha256:0d9b8061048cfb78e675b9d2ea8503bfe30db43d583599ae8626b1263a0c1380"}, + {file = "torch-1.13.1-cp37-none-macosx_11_0_arm64.whl", hash = "sha256:f402ca80b66e9fbd661ed4287d7553f7f3899d9ab54bf5c67faada1555abde28"}, + {file = "torch-1.13.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:727dbf00e2cf858052364c0e2a496684b9cb5aa01dc8a8bc8bbb7c54502bdcdd"}, + {file = "torch-1.13.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:df8434b0695e9ceb8cc70650afc1310d8ba949e6db2a0525ddd9c3b2b181e5fe"}, + {file = "torch-1.13.1-cp38-cp38-win_amd64.whl", hash = "sha256:5e1e722a41f52a3f26f0c4fcec227e02c6c42f7c094f32e49d4beef7d1e213ea"}, + {file = "torch-1.13.1-cp38-none-macosx_10_9_x86_64.whl", hash = "sha256:33e67eea526e0bbb9151263e65417a9ef2d8fa53cbe628e87310060c9dcfa312"}, + {file = "torch-1.13.1-cp38-none-macosx_11_0_arm64.whl", hash = "sha256:eeeb204d30fd40af6a2d80879b46a7efbe3cf43cdbeb8838dd4f3d126cc90b2b"}, + {file = "torch-1.13.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:50ff5e76d70074f6653d191fe4f6a42fdbe0cf942fbe2a3af0b75eaa414ac038"}, + {file = "torch-1.13.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:2c3581a3fd81eb1f0f22997cddffea569fea53bafa372b2c0471db373b26aafc"}, + {file = "torch-1.13.1-cp39-cp39-win_amd64.whl", hash = "sha256:0aa46f0ac95050c604bcf9ef71da9f1172e5037fdf2ebe051962d47b123848e7"}, + {file = "torch-1.13.1-cp39-none-macosx_10_9_x86_64.whl", hash = "sha256:6930791efa8757cb6974af73d4996b6b50c592882a324b8fb0589c6a9ba2ddaf"}, + {file = "torch-1.13.1-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:e0df902a7c7dd6c795698532ee5970ce898672625635d885eade9976e5a04949"}, +] tornado = [ {file = "tornado-6.2-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:20f638fd8cc85f3cbae3c732326e96addff0a15e22d80f049e00121651e82e72"}, {file = "tornado-6.2-cp37-abi3-macosx_10_9_x86_64.whl", hash = "sha256:87dcafae3e884462f90c90ecc200defe5e580a7fbbb4365eda7c7c1eb809ebc9"}, @@ -3417,34 +3911,34 @@ urllib3 = [ {file = "urllib3-1.26.13.tar.gz", hash = "sha256:c083dd0dce68dbfbe1129d5271cb90f9447dea7d52097c6e0126120c521ddea8"}, ] watchdog = [ - {file = "watchdog-2.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ed91c3ccfc23398e7aa9715abf679d5c163394b8cad994f34f156d57a7c163dc"}, - {file = "watchdog-2.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:76a2743402b794629a955d96ea2e240bd0e903aa26e02e93cd2d57b33900962b"}, - {file = "watchdog-2.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:920a4bda7daa47545c3201a3292e99300ba81ca26b7569575bd086c865889090"}, - {file = "watchdog-2.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ceaa9268d81205876bedb1069f9feab3eccddd4b90d9a45d06a0df592a04cae9"}, - {file = "watchdog-2.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1893d425ef4fb4f129ee8ef72226836619c2950dd0559bba022b0818c63a7b60"}, - {file = "watchdog-2.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9e99c1713e4436d2563f5828c8910e5ff25abd6ce999e75f15c15d81d41980b6"}, - {file = "watchdog-2.2.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a5bd9e8656d07cae89ac464ee4bcb6f1b9cecbedc3bf1334683bed3d5afd39ba"}, - {file = "watchdog-2.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3a048865c828389cb06c0bebf8a883cec3ae58ad3e366bcc38c61d8455a3138f"}, - {file = "watchdog-2.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e722755d995035dd32177a9c633d158f2ec604f2a358b545bba5bed53ab25bca"}, - {file = "watchdog-2.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:af4b5c7ba60206759a1d99811b5938ca666ea9562a1052b410637bb96ff97512"}, - {file = "watchdog-2.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:619d63fa5be69f89ff3a93e165e602c08ed8da402ca42b99cd59a8ec115673e1"}, - {file = "watchdog-2.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1f2b0665c57358ce9786f06f5475bc083fea9d81ecc0efa4733fd0c320940a37"}, - {file = "watchdog-2.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:441024df19253bb108d3a8a5de7a186003d68564084576fecf7333a441271ef7"}, - {file = "watchdog-2.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1a410dd4d0adcc86b4c71d1317ba2ea2c92babaf5b83321e4bde2514525544d5"}, - {file = "watchdog-2.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:28704c71afdb79c3f215c90231e41c52b056ea880b6be6cee035c6149d658ed1"}, - {file = "watchdog-2.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2ac0bd7c206bb6df78ef9e8ad27cc1346f2b41b1fef610395607319cdab89bc1"}, - {file = "watchdog-2.2.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:27e49268735b3c27310883012ab3bd86ea0a96dcab90fe3feb682472e30c90f3"}, - {file = "watchdog-2.2.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:2af1a29fd14fc0a87fb6ed762d3e1ae5694dcde22372eebba50e9e5be47af03c"}, - {file = "watchdog-2.2.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:c7bd98813d34bfa9b464cf8122e7d4bec0a5a427399094d2c17dd5f70d59bc61"}, - {file = "watchdog-2.2.0-py3-none-manylinux2014_i686.whl", hash = "sha256:56fb3f40fc3deecf6e518303c7533f5e2a722e377b12507f6de891583f1b48aa"}, - {file = "watchdog-2.2.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:74535e955359d79d126885e642d3683616e6d9ab3aae0e7dcccd043bd5a3ff4f"}, - {file = "watchdog-2.2.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:cf05e6ff677b9655c6e9511d02e9cc55e730c4e430b7a54af9c28912294605a4"}, - {file = "watchdog-2.2.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:d6ae890798a3560688b441ef086bb66e87af6b400a92749a18b856a134fc0318"}, - {file = "watchdog-2.2.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:e5aed2a700a18c194c39c266900d41f3db0c1ebe6b8a0834b9995c835d2ca66e"}, - {file = "watchdog-2.2.0-py3-none-win32.whl", hash = "sha256:d0fb5f2b513556c2abb578c1066f5f467d729f2eb689bc2db0739daf81c6bb7e"}, - {file = "watchdog-2.2.0-py3-none-win_amd64.whl", hash = "sha256:1f8eca9d294a4f194ce9df0d97d19b5598f310950d3ac3dd6e8d25ae456d4c8a"}, - {file = "watchdog-2.2.0-py3-none-win_ia64.whl", hash = "sha256:ad0150536469fa4b693531e497ffe220d5b6cd76ad2eda474a5e641ee204bbb6"}, - {file = "watchdog-2.2.0.tar.gz", hash = "sha256:83cf8bc60d9c613b66a4c018051873d6273d9e45d040eed06d6a96241bd8ec01"}, + {file = "watchdog-2.2.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a09483249d25cbdb4c268e020cb861c51baab2d1affd9a6affc68ffe6a231260"}, + {file = "watchdog-2.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5100eae58133355d3ca6c1083a33b81355c4f452afa474c2633bd2fbbba398b3"}, + {file = "watchdog-2.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e618a4863726bc7a3c64f95c218437f3349fb9d909eb9ea3a1ed3b567417c661"}, + {file = "watchdog-2.2.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:102a60093090fc3ff76c983367b19849b7cc24ec414a43c0333680106e62aae1"}, + {file = "watchdog-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:748ca797ff59962e83cc8e4b233f87113f3cf247c23e6be58b8a2885c7337aa3"}, + {file = "watchdog-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6ccd8d84b9490a82b51b230740468116b8205822ea5fdc700a553d92661253a3"}, + {file = "watchdog-2.2.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:6e01d699cd260d59b84da6bda019dce0a3353e3fcc774408ae767fe88ee096b7"}, + {file = "watchdog-2.2.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8586d98c494690482c963ffb24c49bf9c8c2fe0589cec4dc2f753b78d1ec301d"}, + {file = "watchdog-2.2.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:adaf2ece15f3afa33a6b45f76b333a7da9256e1360003032524d61bdb4c422ae"}, + {file = "watchdog-2.2.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:83a7cead445008e880dbde833cb9e5cc7b9a0958edb697a96b936621975f15b9"}, + {file = "watchdog-2.2.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f8ac23ff2c2df4471a61af6490f847633024e5aa120567e08d07af5718c9d092"}, + {file = "watchdog-2.2.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d0f29fd9f3f149a5277929de33b4f121a04cf84bb494634707cfa8ea8ae106a8"}, + {file = "watchdog-2.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:967636031fa4c4955f0f3f22da3c5c418aa65d50908d31b73b3b3ffd66d60640"}, + {file = "watchdog-2.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:96cbeb494e6cbe3ae6aacc430e678ce4b4dd3ae5125035f72b6eb4e5e9eb4f4e"}, + {file = "watchdog-2.2.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:61fdb8e9c57baf625e27e1420e7ca17f7d2023929cd0065eb79c83da1dfbeacd"}, + {file = "watchdog-2.2.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4cb5ecc332112017fbdb19ede78d92e29a8165c46b68a0b8ccbd0a154f196d5e"}, + {file = "watchdog-2.2.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a480d122740debf0afac4ddd583c6c0bb519c24f817b42ed6f850e2f6f9d64a8"}, + {file = "watchdog-2.2.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:978a1aed55de0b807913b7482d09943b23a2d634040b112bdf31811a422f6344"}, + {file = "watchdog-2.2.1-py3-none-manylinux2014_armv7l.whl", hash = "sha256:8c28c23972ec9c524967895ccb1954bc6f6d4a557d36e681a36e84368660c4ce"}, + {file = "watchdog-2.2.1-py3-none-manylinux2014_i686.whl", hash = "sha256:c27d8c1535fd4474e40a4b5e01f4ba6720bac58e6751c667895cbc5c8a7af33c"}, + {file = "watchdog-2.2.1-py3-none-manylinux2014_ppc64.whl", hash = "sha256:d6b87477752bd86ac5392ecb9eeed92b416898c30bd40c7e2dd03c3146105646"}, + {file = "watchdog-2.2.1-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:cece1aa596027ff56369f0b50a9de209920e1df9ac6d02c7f9e5d8162eb4f02b"}, + {file = "watchdog-2.2.1-py3-none-manylinux2014_s390x.whl", hash = "sha256:8b5cde14e5c72b2df5d074774bdff69e9b55da77e102a91f36ef26ca35f9819c"}, + {file = "watchdog-2.2.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:e038be858425c4f621900b8ff1a3a1330d9edcfeaa1c0468aeb7e330fb87693e"}, + {file = "watchdog-2.2.1-py3-none-win32.whl", hash = "sha256:bc43c1b24d2f86b6e1cc15f68635a959388219426109233e606517ff7d0a5a73"}, + {file = "watchdog-2.2.1-py3-none-win_amd64.whl", hash = "sha256:17f1708f7410af92ddf591e94ae71a27a13974559e72f7e9fde3ec174b26ba2e"}, + {file = "watchdog-2.2.1-py3-none-win_ia64.whl", hash = "sha256:195ab1d9d611a4c1e5311cbf42273bc541e18ea8c32712f2fb703cfc6ff006f9"}, + {file = "watchdog-2.2.1.tar.gz", hash = "sha256:cdcc23c9528601a8a293eb4369cbd14f6b4f34f07ae8769421252e9c22718b6f"}, ] wcwidth = [ {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, @@ -3454,6 +3948,17 @@ webencodings = [ {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, ] +wget = [ + {file = "wget-3.2.zip", hash = "sha256:35e630eca2aa50ce998b9b1a127bb26b30dfee573702782aa982f875e3f16061"}, +] +wheel = [ + {file = "wheel-0.38.4-py3-none-any.whl", hash = "sha256:b60533f3f5d530e971d6737ca6d58681ee434818fab630c83a734bb10c083ce8"}, + {file = "wheel-0.38.4.tar.gz", hash = "sha256:965f5259b566725405b05e7cf774052044b1ed30119b5d586b2703aafe8719ac"}, +] +widgetsnbextension = [ + {file = "widgetsnbextension-4.0.5-py3-none-any.whl", hash = "sha256:eaaaf434fb9b08bd197b2a14ffe45ddb5ac3897593d43c69287091e5f3147bf7"}, + {file = "widgetsnbextension-4.0.5.tar.gz", hash = "sha256:003f716d930d385be3fd9de42dd9bf008e30053f73bddde235d14fbeaeff19af"}, +] yaspin = [ {file = "yaspin-2.2.0-py3-none-any.whl", hash = "sha256:a6948034483cb263a467bef5a564eb35458e950fcade2cd7ad1d7d4339db4711"}, {file = "yaspin-2.2.0.tar.gz", hash = "sha256:febdf35f3e0e45845dc2caa79a18780f9ec7a85a37a9a2c0389b314ba82d8912"}, From 2098cbec8ea195560dabe27da3ea26c19c25ed2f Mon Sep 17 00:00:00 2001 From: Adam Li Date: Mon, 2 Jan 2023 19:49:11 -0500 Subject: [PATCH 3/8] Fix index Signed-off-by: Adam Li --- doc/tutorials/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/tutorials/index.rst b/doc/tutorials/index.rst index 1416eb4c..46070e2f 100644 --- a/doc/tutorials/index.rst +++ b/doc/tutorials/index.rst @@ -14,5 +14,5 @@ no latent confounders. :maxdepth: 1 :titlesonly: - markovian/pc + markovian/example-pc-algo From af58427b523dc1fb808d49bd383063779e607195 Mon Sep 17 00:00:00 2001 From: Adam Li Date: Mon, 2 Jan 2023 19:52:48 -0500 Subject: [PATCH 4/8] fix circle ci Signed-off-by: Adam Li --- .circleci/config.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index bc6206b9..8ed2b40e 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -46,8 +46,10 @@ jobs: - run: name: Install the latest version of Poetry command: | - curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | POETRY_UNINSTALL=1 python - - curl -sSL https://install.python-poetry.org | python3 - --version 1.2.2 + export POETRY_HOME=/opt/poetry + # curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | POETRY_UNINSTALL=1 python - + curl -sSL https://install.python-poetry.org | python3 - --version 1.3.0 + $POETRY_HOME/bin/poetry --version - run: name: Set BASH_ENV command: | From 9156e564d74b1ad3007c87ee4cb36a3056117b80 Mon Sep 17 00:00:00 2001 From: Adam Li Date: Mon, 2 Jan 2023 19:53:59 -0500 Subject: [PATCH 5/8] Try again Signed-off-by: Adam Li --- .circleci/config.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 8ed2b40e..e9d6ec21 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -46,8 +46,6 @@ jobs: - run: name: Install the latest version of Poetry command: | - export POETRY_HOME=/opt/poetry - # curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | POETRY_UNINSTALL=1 python - curl -sSL https://install.python-poetry.org | python3 - --version 1.3.0 $POETRY_HOME/bin/poetry --version - run: From f52f1f3df4954a4aa8db4e6aab465bd7e0f46821 Mon Sep 17 00:00:00 2001 From: Adam Li Date: Mon, 2 Jan 2023 20:02:16 -0500 Subject: [PATCH 6/8] Try again Signed-off-by: Adam Li --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index e9d6ec21..c6a30af8 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -47,7 +47,7 @@ jobs: name: Install the latest version of Poetry command: | curl -sSL https://install.python-poetry.org | python3 - --version 1.3.0 - $POETRY_HOME/bin/poetry --version + poetry --version - run: name: Set BASH_ENV command: | From 45eeb1aa2dda399f76daa4508ec7716532e3825e Mon Sep 17 00:00:00 2001 From: Adam Li Date: Mon, 2 Jan 2023 23:11:51 -0500 Subject: [PATCH 7/8] Fix notebook and update docs for CI Signed-off-by: Adam Li --- doc/conf.py | 2 +- doc/tutorials/markovian/example-pc-algo.ipynb | 548 ++++++++++++++++-- doc/whats_new/_contributors.rst | 1 + doc/whats_new/v0.1.rst | 3 +- dodiscover/constraint/pcalg.py | 51 +- pyproject.toml | 3 +- 6 files changed, 516 insertions(+), 92 deletions(-) diff --git a/doc/conf.py b/doc/conf.py index 64ee47c8..c8b3b805 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -264,7 +264,7 @@ } # prevent jupyter notebooks from being run even if empty cell -nbsphinx_execute = "never" +# nbsphinx_execute = "never" nbsphinx_allow_errors = True # Custom sidebar templates, maps document names to template names. diff --git a/doc/tutorials/markovian/example-pc-algo.ipynb b/doc/tutorials/markovian/example-pc-algo.ipynb index f49e4198..d5fa254e 100644 --- a/doc/tutorials/markovian/example-pc-algo.ipynb +++ b/doc/tutorials/markovian/example-pc-algo.ipynb @@ -7,7 +7,7 @@ "source": [ "# PC algorithm for causal discovery from observational data without latent confounders\n", "\n", - "In this tutorial, we will demonstrate how to use the PC algorithm to learn a causal graph structure.\n", + "In this tutorial, we will demonstrate how to use the PC algorithm to learn a causal graph structure and highlight some of the common challenges in applying causal discovery algorithms to data.\n", "\n", "The PC algorithm works on observational data when there are no unobserved latent confounders." ] @@ -25,6 +25,7 @@ "\n", "from pywhy_graphs import CPDAG\n", "from pywhy_graphs.viz import draw\n", + "\n", "from dodiscover import PC, make_context\n", "from dodiscover.ci import GSquareCITest, Oracle" ] @@ -78,7 +79,7 @@ " 0\n", " 1\n", " 1\n", - " 0\n", + " 1\n", " 1\n", " 1\n", " 1\n", @@ -89,33 +90,33 @@ " 1\n", " 1\n", " 1\n", - " 1\n", - " 1\n", " 0\n", - " 1\n", - " 1\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", " 0\n", " \n", " \n", " 2\n", " 1\n", " 1\n", - " 1\n", + " 0\n", " 1\n", " 0\n", " 1\n", " 1\n", - " 0\n", + " 1\n", " \n", " \n", " 3\n", " 1\n", - " 0\n", - " 0\n", " 1\n", " 0\n", + " 1\n", " 0\n", - " 0\n", + " 1\n", + " 1\n", " 0\n", " \n", " \n", @@ -124,10 +125,10 @@ " 1\n", " 1\n", " 1\n", - " 0\n", " 1\n", " 1\n", - " 0\n", + " 1\n", + " 1\n", " \n", " \n", "\n", @@ -135,11 +136,11 @@ ], "text/plain": [ " A T S L B E X D\n", - "0 1 1 0 1 1 1 1 1\n", - "1 1 1 1 1 0 1 1 0\n", - "2 1 1 1 1 0 1 1 0\n", - "3 1 0 0 1 0 0 0 0\n", - "4 1 1 1 1 0 1 1 0" + "0 1 1 1 1 1 1 1 1\n", + "1 1 1 0 0 0 0 0 0\n", + "2 1 1 0 1 0 1 1 1\n", + "3 1 1 0 1 0 1 1 0\n", + "4 1 1 1 1 1 1 1 1" ] }, "execution_count": 2, @@ -165,27 +166,11 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "id": "84323abd", "metadata": {}, "source": [ - "We'll use the PC algorithm to infer the ASIA network. The ASIA network is a case study of an expert system for diagnosing lung disease from Lauritzen and Spiegelhalter (1988). Given respiratory symptions and other evidence, the goal is to distinguish between tuberculosis, lung cancer or bronchitis in a given patient. The ground truth causal DAG is as follows:\n", - "\n", - "![asia](figures/asia.png)\n", - "\n", - "The variables in the DAG have the following interpretation:\n", - "\n", - "* T: Whether or not the patient has **tuberculosis**.\n", - "* L: Whether or not the patient has **lung cancer**.\n", - "* B: Whether or not the patient has **bronchitis**.\n", - "* A: Whether or not the patient has recently visited **Asia**.\n", - "* S: Whether or not the patient is a **smoker**.\n", - "* E: An indicator of whether the patient has either lung cancer or tuberculosis (or both).\n", - "* X: Whether or not a chest X-ray shows evidence of tuberculosis or lung cancer.\n", - "* D: Whether or not the patient has **dyspnoea** (difficulty breathing).\n", - "\n", - "Note we have three kinds of variables, diseases (B, L, T, and E which indicates one or more diseases), symptoms (X and D), and behaviors (S and A). The goal of the model is to use symptoms and behaviors to diagnose (i.e. infer) diseases. Further, note that diseases are causes of symptoms, and are effects of behaviors." + "We'll use the PC algorithm to infer the ASIA network. The ASIA network is a case study of an expert system for diagnosing lung disease from Lauritzen and Spiegelhalter (1988). Given respiratory symptions and other evidence, the goal is to distinguish between tuberculosis, lung cancer or bronchitis in a given patient." ] }, { @@ -217,6 +202,55 @@ "ground_truth = nx.DiGraph(ground_truth_edges)" ] }, + { + "cell_type": "markdown", + "id": "de591d7c", + "metadata": {}, + "source": [ + "The ground truth DAG can be visualized and is seen as follows:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "d7815b62", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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WDooD2T/HoeIiIjI3JlkobSxUsLBzvqd27WZ6Ug6+hMsy3wG2y87AACUtvYo3tQTGTGXkHbzdK7HcLC3ho2VSa8LT0RERJQnJlkoAcClWul3rkP59ORGaFKTXtzVLVe8et22TntYlvkMT47+BG3mu+8SV8hlcKlaWu+ZiYiIiKTIZAtlr/oOOa5DmflPNFIu/wHbL76G1cdV39gmkytg13YYNGlP8fTkxnfuW6MV4NnAQe+ZiYiIiKRIJghCXlfYkRyvtSE4G5P43gXO80shl6FRJXts9OGzvImIiIgAEx6hBICgzk5Qvufxix9CKZchqLOTXvdJREREJGUmXSjL21ljmpujXvc53c0R5d9zww8RERGRuTHpQgkAHs4OGO1aNfc35kGAazX0cObcSSIiIqLXmfQcytdtC43FlH0RUGuFfM2pVMhlUMplmO7myDJJRERElAOzKZQAcC8pHYF7VDgVnQCFXPbeYvlye9PKJRHU2YmXuYmIiIjewawK5UtRj1OwOSQWwZFxiE1Mx+tfABleLFruUrU0PBs4oHJpW7FiEhEREUmCWRbK16VlqnEnMQ1Zai0slXJUtLfhE3CIiIiI8sHsCyURERER6cbk7/ImIiIiIsNioSQiIiIinbBQEhEREZFOWCiJiIiISCcslERERESkExZKIiIiItIJCyURERER6YSFkoiIiIh0wkJJRERERDphoSQiIiIinbBQEhEREZFOWCiJiIiISCcslERERESkExZKIiIiItIJCyURERER6YSFkoiIiIh0wkJJRERERDphoSQiIiIinbBQEhEREZFOWCiJiIiISCcslERERESkExZKIiIiItIJCyURERER6YSFkoiIiIh0wkJJRERERDphoSQiIiIinbBQEhEREZFOWCiJiIiISCcslERERESkExZKIiIiItIJCyURERER6YSFkoiIiIh0wkJJRERERDphoSQiIiIinbBQEhEREZFOWCiJiIiISCcslERERESkk/8DlIH8+cL3FkcAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "pos = nx.spring_layout(ground_truth, seed=1234)\n", + "nx.draw(ground_truth, with_labels=True, pos=pos)" + ] + }, + { + "cell_type": "markdown", + "id": "ec0242ea", + "metadata": {}, + "source": [ + "The variables in the DAG have the following interpretation:\n", + "\n", + "* T: Whether or not the patient has **tuberculosis**.\n", + "* L: Whether or not the patient has **lung cancer**.\n", + "* B: Whether or not the patient has **bronchitis**.\n", + "* A: Whether or not the patient has recently visited **Asia**.\n", + "* S: Whether or not the patient is a **smoker**.\n", + "* E: An indicator of whether the patient has either lung cancer or tuberculosis (or both).\n", + "* X: Whether or not a chest X-ray shows evidence of tuberculosis or lung cancer.\n", + "* D: Whether or not the patient has **dyspnoea** (difficulty breathing).\n", + "\n", + "Note we have three kinds of variables, diseases (B, L, T, and E which indicates one or more diseases), symptoms (X and D), and behaviors (S and A). The goal of the model is to use symptoms and behaviors to diagnose (i.e. infer) diseases. Further, note that diseases are causes of symptoms, and are effects of behaviors." + ] + }, { "cell_type": "markdown", "id": "b769b7f1", @@ -229,7 +263,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "id": "30a29f1d", "metadata": {}, "outputs": [], @@ -274,7 +308,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "id": "902d126f", "metadata": {}, "outputs": [], @@ -298,7 +332,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 4, "id": "89a4f0af", "metadata": {}, "outputs": [], @@ -318,7 +352,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 14, "id": "e5cba859", "metadata": {}, "outputs": [], @@ -337,25 +371,156 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 56, "id": "918c6f5f", "metadata": {}, "outputs": [ { "data": { - "image/svg+xml": "\n\n\n\n\n\n\n\n\nT\n\nT\n\n\n\nX\n\nX\n\n\n\nT->X\n\n\n\n\n\nE\n\nE\n\n\n\nT->E\n\n\n\n\n\nA\n\nA\n\n\n\nT->A\n\n\n\n\nD\n\nD\n\n\n\nT->D\n\n\n\n\n\nL\n\nL\n\n\n\nL->X\n\n\n\n\n\nL->E\n\n\n\n\n\nL->D\n\n\n\n\n\nS\n\nS\n\n\n\nL->S\n\n\n\n\nE->X\n\n\n\n\n\nE->D\n\n\n\n\n\nB\n\nB\n\n\n\nB->D\n\n\n\n\n\nB->S\n\n\n\n\n", + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "T\n", + "\n", + "T\n", + "\n", + "\n", + "\n", + "A\n", + "\n", + "A\n", + "\n", + "\n", + "\n", + "T->A\n", + "\n", + "\n", + "\n", + "\n", + "D\n", + "\n", + "D\n", + "\n", + "\n", + "\n", + "T->D\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "E\n", + "\n", + "E\n", + "\n", + "\n", + "\n", + "T->E\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "X\n", + "\n", + "X\n", + "\n", + "\n", + "\n", + "T->X\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "S\n", + "\n", + "S\n", + "\n", + "\n", + "\n", + "L\n", + "\n", + "L\n", + "\n", + "\n", + "\n", + "S->L\n", + "\n", + "\n", + "\n", + "\n", + "B\n", + "\n", + "B\n", + "\n", + "\n", + "\n", + "S->B\n", + "\n", + "\n", + "\n", + "\n", + "L->D\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "L->E\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "L->X\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "B->D\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "E->D\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "E->X\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], "text/plain": [ - "" + "" ] }, - "execution_count": 8, + "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "graph = pc.graph_\n", - "draw(graph)" + "\n", + "draw(graph, direction='TB')" ] }, { @@ -363,29 +528,182 @@ "id": "162d98be", "metadata": {}, "source": [ - "Compare this against the ground truth CPDAG." + "Compare this against the ground truth CPDAG, which should match exactly." ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 57, "id": "67d47367", "metadata": {}, "outputs": [ { "data": { - "image/svg+xml": "\n\n\n\n\n\n\n\n\nT\n\nT\n\n\n\nE\n\nE\n\n\n\nT->E\n\n\n\n\n\nD\n\nD\n\n\n\nT->D\n\n\n\n\n\nX\n\nX\n\n\n\nT->X\n\n\n\n\n\nE->D\n\n\n\n\n\nE->X\n\n\n\n\n\nL\n\nL\n\n\n\nL->E\n\n\n\n\n\nL->D\n\n\n\n\n\nL->X\n\n\n\n\n\nB\n\nB\n\n\n\nB->D\n\n\n\n\n\nA\n\nA\n\n\n\nA->T\n\n\n\n\nS\n\nS\n\n\n\nS->L\n\n\n\n\nS->B\n\n\n\n\n", + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "A\n", + "\n", + "A\n", + "\n", + "\n", + "\n", + "T\n", + "\n", + "T\n", + "\n", + "\n", + "\n", + "A->T\n", + "\n", + "\n", + "\n", + "\n", + "E\n", + "\n", + "E\n", + "\n", + "\n", + "\n", + "T->E\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "D\n", + "\n", + "D\n", + "\n", + "\n", + "\n", + "T->D\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "X\n", + "\n", + "X\n", + "\n", + "\n", + "\n", + "T->X\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "S\n", + "\n", + "S\n", + "\n", + "\n", + "\n", + "L\n", + "\n", + "L\n", + "\n", + "\n", + "\n", + "S->L\n", + "\n", + "\n", + "\n", + "\n", + "B\n", + "\n", + "B\n", + "\n", + "\n", + "\n", + "S->B\n", + "\n", + "\n", + "\n", + "\n", + "L->E\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "L->D\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "L->X\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "B->D\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "E->D\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "E->X\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], "text/plain": [ - "" + "" ] }, - "execution_count": 9, + "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "draw(ground_truth_cpdag)" + "draw(ground_truth_cpdag, direction='TB')" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "id": "0569e7c4-a571-484c-a07b-e6935c55fd39", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The oracle learned CPDAG via the PC algorithm matches the ground truth in directed edges: True \n", + "and matches the undirected edges: True\n" + ] + } + ], + "source": [ + "match_directed = nx.is_isomorphic(ground_truth_cpdag.sub_directed_graph(), graph.sub_directed_graph())\n", + "match_undirected = nx.is_isomorphic(ground_truth_cpdag.sub_undirected_graph(), graph.sub_undirected_graph())\n", + "\n", + "print(f'The oracle learned CPDAG via the PC algorithm matches the ground truth in directed edges: {match_directed} \\n'\n", + " f'and matches the undirected edges: {match_undirected}')" ] }, { @@ -393,18 +711,29 @@ "id": "db1ff244", "metadata": {}, "source": [ - "Now, we will show the output given a real CI test, which performs CI hypothesis testing to determine CI in the data. Due to finite data and the presence of noise, there is always a possibility that the CI test makes a mistake." + "Now, we will show the output given a real CI test, which performs CI hypothesis testing to determine CI in the data. Due to finite data and the presence of noise, there is always a possibility that the CI test makes a mistake. In order to maximize the chances that the graph is correct, you want to ensure that the CI test you are using matches the assumptions you have on your data. \n", + "\n", + "For example, the G^2 binary test is a well-suited test for binary data, which we validated is the type of data we have for the ASIA dataset." ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 9, "id": "5b80aeba", "metadata": {}, "outputs": [], "source": [ - "ci_estimator = GSquareCITest(data_type=\"discrete\")\n", - "pc = PC(ci_estimator=ci_estimator)\n", + "ci_estimator = GSquareCITest(data_type=\"binary\")\n", + "pc = PC(ci_estimator=ci_estimator, alpha=0.05)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "64a5d4a9-1e07-4282-813c-a080322eaff0", + "metadata": {}, + "outputs": [], + "source": [ "pc.fit(data, context)" ] }, @@ -416,9 +745,104 @@ "outputs": [ { "data": { - "image/svg+xml": "\n\n\n\n\n\n\n\n\nT\n\nT\n\n\n\nL\n\nL\n\n\n\nL->T\n\n\n\n\n\nE\n\nE\n\n\n\nL->E\n\n\n\n\n\nS\n\nS\n\n\n\nL->S\n\n\n\n\n\nA\n\nA\n\n\n\nA->T\n\n\n\n\n\nE->T\n\n\n\n\n\nX\n\nX\n\n\n\nB\n\nB\n\n\n\nD\n\nD\n\n\n\nB->D\n\n\n\n\nB->S\n\n\n\n\n\n", + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "B\n", + "\n", + "B\n", + "\n", + "\n", + "\n", + "S\n", + "\n", + "S\n", + "\n", + "\n", + "\n", + "B->S\n", + "\n", + "\n", + "\n", + "\n", + "D\n", + "\n", + "D\n", + "\n", + "\n", + "\n", + "B->D\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "L\n", + "\n", + "L\n", + "\n", + "\n", + "\n", + "L->S\n", + "\n", + "\n", + "\n", + "\n", + "E\n", + "\n", + "E\n", + "\n", + "\n", + "\n", + "L->E\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "X\n", + "\n", + "X\n", + "\n", + "\n", + "\n", + "X->D\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "T\n", + "\n", + "T\n", + "\n", + "\n", + "\n", + "T->E\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "A\n", + "\n", + "A\n", + "\n", + "\n", + "\n" + ], "text/plain": [ - "" + "" ] }, "execution_count": 11, @@ -428,7 +852,7 @@ ], "source": [ "graph = pc.graph_\n", - "draw(graph)" + "draw(graph, direction='TB')" ] }, { @@ -436,7 +860,7 @@ "id": "ff0b314b", "metadata": {}, "source": [ - "The resulting graph captures some of the graph but not all of it. The problem here is a violation of the [faithfulness assumption](https://plato.stanford.edu/entries/causal-models/#MiniFaitCond); in the Asia data, it is very hard to detect the edge between E and X.\n", + "The resulting graph captures some of the graph but not all of it. The problem here is a violation of the [faithfulness assumption](https://plato.stanford.edu/entries/causal-models/#MiniFaitCond); e.g. in the Asia data, it is very hard to detect the edge between E and X. This highlights a common problem with causal discovery, where the inability to detect certain edges may lead to incorrect orientations.\n", "\n", "Beyond faithfulness violations, in general causal discovery algorithms struggle when there is no user-provided causal knowledge to constrain the problem. A core philosophy of dodiscovery is that causal domain knowledge should be provided to constrain the problem, and providing it should be easy. For example, for this data, we know that smoking (S) causes both lung cancer (L) and bronchitis (B) and not the other way around.\n", "\n", @@ -448,9 +872,9 @@ ], "metadata": { "kernelspec": { - "display_name": "venv", + "display_name": "pywhy-discover", "language": "python", - "name": "venv" + "name": "pywhy-discover" }, "language_info": { "codemirror_mode": { @@ -462,11 +886,11 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.9" + "version": "3.9.13" }, "vscode": { "interpreter": { - "hash": "83bc06ec5be13f4230f46a3f77f7cefbb44c2fa59a857bbc121b0c3cdb0063f8" + "hash": "f69a7104467f431c4bacbebec40c4cb5787ef707a55bea5c5fb34f2af39396ab" } } }, diff --git a/doc/whats_new/_contributors.rst b/doc/whats_new/_contributors.rst index 14a98c41..4d8bbc02 100644 --- a/doc/whats_new/_contributors.rst +++ b/doc/whats_new/_contributors.rst @@ -22,3 +22,4 @@ .. _Adam Li: https://adam2392.github.io .. _Chris Trevino: https://py-why.github.io +.. _Robert Osazuwa Ness: https://py-why.github.io \ No newline at end of file diff --git a/doc/whats_new/v0.1.rst b/doc/whats_new/v0.1.rst index 2bb8cd56..269c8bfe 100644 --- a/doc/whats_new/v0.1.rst +++ b/doc/whats_new/v0.1.rst @@ -37,7 +37,7 @@ Changelog - |Feature| Implement FCI algorithm, :class:`dodiscover.constraint.FCI` for learning causal structure from observational data with latent confounders under the ``dodiscover.constraint`` submodule, by `Adam Li`_ (:pr:`52`) - |Feature| Implement Structural Hamming Distance metric to compare directed graphs, :func:`dodiscover.metrics.structure_hamming_dist`, by `Adam Li`_ (:pr:`55`) - |Fix| Update dependency on networkx, which removes a PR branch dependency with pywhy-graphs having the MixedEdgeGraph class that was causing a dependency conflict, by `Adam Li`_ (:pr:`74`) -- |Chore| Add tutorial for PC algorithm with Asia data, by `Robert Osazuwa Ness`_ (:pr:`67`) +- |Enhancement| Add tutorial for PC algorithm with Asia data, by `Robert Osazuwa Ness`_ (:pr:`67`) Code and Documentation Contributors ----------------------------------- @@ -47,3 +47,4 @@ the project since version inception, including: * `Adam Li`_ * `Chris Trevino`_ +* `Robert Osazuwa Ness`_ diff --git a/dodiscover/constraint/pcalg.py b/dodiscover/constraint/pcalg.py index e4b79603..ec9e6020 100644 --- a/dodiscover/constraint/pcalg.py +++ b/dodiscover/constraint/pcalg.py @@ -1,5 +1,5 @@ import logging -from itertools import combinations, permutations +from itertools import combinations from typing import Optional import networkx as nx @@ -134,37 +134,36 @@ def orient_edges(self, graph: EquivalenceClass) -> None: A skeleton graph. If ``None``, then will initialize PC using a complete graph. By default None. """ - node_ids = graph.nodes - # For all the combination of nodes i and j, apply the following # rules. idx = 0 finished = False while idx < self.max_iter and not finished: # type: ignore change_flag = False - for (i, j) in permutations(node_ids, 2): - if i == j: - continue - # Rule 1: Orient i-j into i->j whenever there is an arrow k->i - # such that k and j are nonadjacent. - r1_add = self._apply_meek_rule1(graph, i, j) - - # Rule 2: Orient i-j into i->j whenever there is a chain - # i->k->j. - r2_add = self._apply_meek_rule2(graph, i, j) - - # Rule 3: Orient i-j into i->j whenever there are two chains - # i-k->j and i-l->j such that k and l are nonadjacent. - r3_add = self._apply_meek_rule3(graph, i, j) - - # Rule 4: Orient i-j into i->j whenever there are two chains - # i-k->l and k->l->j such that k and j are nonadjacent. - # - # However, this rule is not necessary when the PC-algorithm - # is used to estimate a DAG. - - if any([r1_add, r2_add, r3_add]) and not change_flag: - change_flag = True + for i in graph.nodes: + for j in graph.neighbors(i): + if i == j: + continue + # Rule 1: Orient i-j into i->j whenever there is an arrow k->i + # such that k and j are nonadjacent. + r1_add = self._apply_meek_rule1(graph, i, j) + + # Rule 2: Orient i-j into i->j whenever there is a chain + # i->k->j. + r2_add = self._apply_meek_rule2(graph, i, j) + + # Rule 3: Orient i-j into i->j whenever there are two chains + # i-k->j and i-l->j such that k and l are nonadjacent. + r3_add = self._apply_meek_rule3(graph, i, j) + + # Rule 4: Orient i-j into i->j whenever there are two chains + # i-k->l and k->l->j such that k and j are nonadjacent. + # + # However, this rule is not necessary when the PC-algorithm + # is used to estimate a DAG. + + if any([r1_add, r2_add, r3_add]) and not change_flag: + change_flag = True if not change_flag: finished = True logger.info(f"Finished applying R1-3, with {idx} iterations") diff --git a/pyproject.toml b/pyproject.toml index 20d97b43..1f39eb94 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -48,7 +48,6 @@ importlib-resources = { version = "*", python = "<3.9" } networkx = "^2.8.8" pywhy-graphs = { git = "https://github.com/py-why/pywhy-graphs.git", branch = 'main', optional = true } pygraphviz = { version = "*", optional = true } -bnlearn = { git = "https://github.com/erdogant/bnlearn.git", branch = 'master', optional = true } [tool.poetry.group.style] optional = true @@ -89,6 +88,7 @@ sphinx_rtd_theme = { version = "^1.0.0" } graphviz = { version = "^0.20.1" } ipython = { version = "^7.4.0" } nbsphinx = { version = "^0.8" } +bnlearn = { git = "https://github.com/erdogant/bnlearn.git", branch = 'master', optional = true } dowhy = { version = "^0.8" } typing-extensions = { version = "*" } # needed in dowhy's package joblib = { version = "^1.1.0" } # needed in dowhy's package @@ -97,7 +97,6 @@ tqdm = { version = "^4.64.0" } # needed in dowhy's package [tool.poetry.extras] graph_func = ['pywhy-graphs'] viz = ['pygraphviz'] -data = ['bnlearn'] [tool.portray] output_dir = ['site'] From f34981d91d112792819604e154859956e0d94caa Mon Sep 17 00:00:00 2001 From: Adam Li Date: Mon, 2 Jan 2023 23:17:47 -0500 Subject: [PATCH 8/8] Fix code spell Signed-off-by: Adam Li --- .codespellignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.codespellignore b/.codespellignore index 77cb0080..e4ab998d 100644 --- a/.codespellignore +++ b/.codespellignore @@ -1 +1,2 @@ raison +wee \ No newline at end of file