From de2e69dd1ff53e442c7687a36ce222f3de63d2ad Mon Sep 17 00:00:00 2001 From: Adam Li Date: Mon, 9 Jan 2023 12:00:00 -0500 Subject: [PATCH] [ENH] Adding integration test with causal learn (#54) * Adding integration test with causal learn for FCI and PC algorithm * Fix CI Signed-off-by: Adam Li --- .github/workflows/main.yml | 36 +- dodiscover/metrics.py | 3 +- poetry.lock | 465 +++++++++--------- pyproject.toml | 9 +- tests/integration_tests/__init__.py | 0 .../constraint/test_fci_causal_learn.py | 154 ++++++ .../constraint/test_pc_causal_learn.py | 158 ++++++ 7 files changed, 600 insertions(+), 225 deletions(-) delete mode 100644 tests/integration_tests/__init__.py create mode 100644 tests/integration_tests/constraint/test_fci_causal_learn.py create mode 100644 tests/integration_tests/constraint/test_pc_causal_learn.py diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index e206a463..9393905d 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -124,7 +124,7 @@ jobs: python-version: [3.8, "3.10"] # oldest and newest supported versions poetry-version: [1.3.0] networkx: [stable, main] - name: pytest ${{ matrix.os }} - py${{ matrix.python-version }} - Networkx ${{ matrix.networkx }} + name: Unit-test ${{ matrix.os }} - py${{ matrix.python-version }} - Networkx ${{ matrix.networkx }} runs-on: ${{ matrix.os }}-latest defaults: run: @@ -159,6 +159,40 @@ jobs: fail_ci_if_error: true verbose: true + integration_test: + timeout-minutes: 30 + strategy: + fail-fast: false + matrix: + os: [ubuntu] + python-version: ["3.10"] # oldest and newest supported versions + poetry-version: [1.3.0] + networkx: [main] + name: Integration test ${{ matrix.os }} - py${{ matrix.python-version }} - Networkx ${{ matrix.networkx }} + runs-on: ${{ matrix.os }}-latest + defaults: + run: + shell: bash + steps: + - name: Checkout repository + uses: actions/checkout@v3 + - name: Setup Python ${{ matrix.python-version }} + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version }} + architecture: 'x64' + - name: Install Poetry ${{ matrix.poetry-version }} + uses: abatilo/actions-poetry@v2.2.0 + with: + poetry-version: ${{ matrix.poetry-version }} + - name: Install Poetry Dynamic Versioning Plugin + run: pip install poetry-dynamic-versioning + - name: Install packages via poetry + run: | + poetry install --with test,docs --extras graph_func + - name: Run pytest # headless via Xvfb on linux + run: poetry run poe integration_test + # release is ran when a release is made on Github release: name: Release diff --git a/dodiscover/metrics.py b/dodiscover/metrics.py index c8a2a659..28d683ef 100644 --- a/dodiscover/metrics.py +++ b/dodiscover/metrics.py @@ -6,8 +6,9 @@ from sklearn.metrics import confusion_matrix from sklearn.preprocessing import LabelBinarizer +from dodiscover.typing import NetworkxGraph + from ._protocol import Graph -from .typing import NetworkxGraph def confusion_matrix_networks( diff --git a/poetry.lock b/poetry.lock index b36ce27e..94cffb32 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 = "main" +category = "dev" 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 = "main" +category = "dev" optional = false python-versions = "*" @@ -127,10 +127,9 @@ dev = ["Sphinx (==4.3.2)", "black (==22.3.0)", "build (==0.8.0)", "flake8 (==4.0 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 +category = "dev" +optional = false python-versions = ">=3" -develop = false [package.dependencies] df2onehot = "*" @@ -153,11 +152,25 @@ tabulate = "*" tqdm = "*" wget = "*" -[package.source] -type = "git" -url = "https://github.com/erdogant/bnlearn.git" -reference = 'master' -resolved_reference = "172c209d1d64278b0b58573910805aad167f37e0" +[[package]] +name = "causal-learn" +version = "0.1.3.1" +description = "causal-learn Python Package" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +graphviz = "*" +matplotlib = "*" +networkx = "*" +numpy = "*" +pandas = "*" +pydot = "*" +scikit-learn = "*" +scipy = "*" +statsmodels = "*" +tqdm = "*" [[package]] name = "certifi" @@ -171,7 +184,7 @@ python-versions = ">=3.6" name = "cffi" version = "1.15.1" description = "Foreign Function Interface for Python calling C code." -category = "main" +category = "dev" optional = false python-versions = "*" @@ -217,7 +230,7 @@ toml = ["tomli"] name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." -category = "main" +category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" @@ -225,8 +238,8 @@ python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7 name = "comm" version = "0.1.2" description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." -category = "main" -optional = true +category = "dev" +optional = false python-versions = ">=3.6" [package.dependencies] @@ -239,7 +252,7 @@ test = ["pytest"] name = "contourpy" version = "1.0.6" description = "Python library for calculating contours of 2D quadrilateral grids" -category = "main" +category = "dev" optional = false python-versions = ">=3.7" @@ -255,7 +268,7 @@ test-no-codebase = ["Pillow", "matplotlib", "pytest"] [[package]] name = "coverage" -version = "7.0.2" +version = "7.0.3" description = "Code coverage measurement for Python" category = "dev" optional = false @@ -271,23 +284,23 @@ toml = ["tomli"] name = "cycler" version = "0.11.0" description = "Composable style cycles" -category = "main" +category = "dev" optional = false python-versions = ">=3.6" [[package]] name = "debugpy" -version = "1.6.4" +version = "1.6.5" description = "An implementation of the Debug Adapter Protocol for Python" -category = "main" -optional = true +category = "dev" +optional = false python-versions = ">=3.7" [[package]] name = "decorator" version = "5.1.1" description = "Decorators for Humans" -category = "main" +category = "dev" optional = false python-versions = ">=3.5" @@ -303,8 +316,8 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" name = "df2onehot" version = "1.0.2" description = "Python package df2onehot is to convert a pandas dataframe into a stuctured dataframe." -category = "main" -optional = true +category = "dev" +optional = false python-versions = ">=3" [package.dependencies] @@ -355,7 +368,7 @@ plotting = ["matplotlib"] name = "entrypoints" version = "0.4" description = "Discover and load entry points from installed packages." -category = "main" +category = "dev" optional = false python-versions = ">=3.6" @@ -414,7 +427,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 = "main" +category = "dev" optional = false python-versions = ">=3.7" @@ -436,8 +449,8 @@ woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] name = "fsspec" version = "2022.11.0" description = "File-system specification" -category = "main" -optional = true +category = "dev" +optional = false python-versions = ">=3.7" [package.extras] @@ -467,8 +480,8 @@ tqdm = ["tqdm"] 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 +category = "dev" +optional = false python-versions = "*" [[package]] @@ -591,8 +604,8 @@ python-versions = "*" name = "ipykernel" version = "6.19.4" description = "IPython Kernel for Jupyter" -category = "main" -optional = true +category = "dev" +optional = false python-versions = ">=3.8" [package.dependencies] @@ -618,7 +631,7 @@ test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio" name = "ipython" version = "7.34.0" description = "IPython: Productive Interactive Computing" -category = "main" +category = "dev" optional = false python-versions = ">=3.7" @@ -651,8 +664,8 @@ test = ["ipykernel", "nbformat", "nose (>=0.10.1)", "numpy (>=1.17)", "pygments" name = "ipywidgets" version = "8.0.4" description = "Jupyter interactive widgets" -category = "main" -optional = true +category = "dev" +optional = false python-versions = ">=3.7" [package.dependencies] @@ -669,8 +682,8 @@ test = ["jsonschema", "pytest (>=3.6.0)", "pytest-cov", "pytz"] name = "ismember" version = "1.0.2" description = "Python package ismember returns array elements that are members of set array." -category = "main" -optional = true +category = "dev" +optional = false python-versions = ">=3" [package.dependencies] @@ -694,7 +707,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 = "main" +category = "dev" optional = false python-versions = ">=3.6" @@ -710,7 +723,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 = "main" +category = "dev" optional = false python-versions = ">=3.7" @@ -732,8 +745,8 @@ python-versions = ">=3.7" name = "jsonpickle" version = "3.0.1" description = "Python library for serializing any arbitrary object graph into JSON" -category = "main" -optional = true +category = "dev" +optional = false python-versions = ">=3.7" [package.extras] @@ -763,7 +776,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 = "main" +category = "dev" optional = false python-versions = ">=3.7" @@ -784,7 +797,7 @@ test = ["codecov", "coverage", "ipykernel (>=6.12)", "ipython", "mypy", "pre-com name = "jupyter-core" version = "5.1.2" description = "Jupyter core package. A base package on which Jupyter projects rely." -category = "main" +category = "dev" optional = false python-versions = ">=3.8" @@ -809,15 +822,15 @@ python-versions = ">=3.7" name = "jupyterlab-widgets" version = "3.0.5" description = "Jupyter interactive widgets for JupyterLab" -category = "main" -optional = true +category = "dev" +optional = false python-versions = ">=3.7" [[package]] name = "kiwisolver" version = "1.4.4" description = "A fast implementation of the Cassowary constraint solver" -category = "main" +category = "dev" optional = false python-versions = ">=3.7" @@ -878,7 +891,7 @@ testing = ["coverage", "pyyaml"] name = "MarkupSafe" version = "2.1.1" description = "Safely add untrusted strings to HTML/XML markup." -category = "main" +category = "dev" optional = false python-versions = ">=3.7" @@ -886,7 +899,7 @@ python-versions = ">=3.7" name = "matplotlib" version = "3.6.2" description = "Python plotting package" -category = "main" +category = "dev" optional = false python-versions = ">=3.8" @@ -906,7 +919,7 @@ setuptools_scm = ">=7" name = "matplotlib-inline" version = "0.1.6" description = "Inline Matplotlib backend for Jupyter" -category = "main" +category = "dev" optional = false python-versions = ">=3.5" @@ -1126,7 +1139,7 @@ traitlets = ">=5" name = "nest-asyncio" version = "1.5.6" description = "Patch asyncio to allow nested event loops" -category = "main" +category = "dev" optional = false python-versions = ">=3.5" @@ -1172,8 +1185,8 @@ testing = ["matplotlib", "pytest", "pytest-cov"] name = "nvidia-cublas-cu11" version = "11.10.3.66" description = "CUBLAS native runtime libraries" -category = "main" -optional = true +category = "dev" +optional = false python-versions = ">=3" [package.dependencies] @@ -1184,8 +1197,8 @@ wheel = "*" name = "nvidia-cuda-nvrtc-cu11" version = "11.7.99" description = "NVRTC native runtime libraries" -category = "main" -optional = true +category = "dev" +optional = false python-versions = ">=3" [package.dependencies] @@ -1196,8 +1209,8 @@ wheel = "*" name = "nvidia-cuda-runtime-cu11" version = "11.7.99" description = "CUDA Runtime native Libraries" -category = "main" -optional = true +category = "dev" +optional = false python-versions = ">=3" [package.dependencies] @@ -1208,8 +1221,8 @@ wheel = "*" name = "nvidia-cudnn-cu11" version = "8.5.0.96" description = "cuDNN runtime libraries" -category = "main" -optional = true +category = "dev" +optional = false python-versions = ">=3" [package.dependencies] @@ -1220,8 +1233,8 @@ wheel = "*" name = "opt-einsum" version = "3.3.0" description = "Optimizing numpys einsum function" -category = "main" -optional = true +category = "dev" +optional = false python-versions = ">=3.5" [package.dependencies] @@ -1235,7 +1248,7 @@ tests = ["pytest", "pytest-cov", "pytest-pep8"] name = "packaging" version = "22.0" description = "Core utilities for Python packages" -category = "main" +category = "dev" optional = false python-versions = ">=3.7" @@ -1270,7 +1283,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" name = "parso" version = "0.8.3" description = "A Python Parser" -category = "main" +category = "dev" optional = false python-versions = ">=3.6" @@ -1298,7 +1311,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 = "main" +category = "dev" optional = false python-versions = "*" @@ -1335,7 +1348,7 @@ Markdown = ">=3.0.0" name = "pexpect" version = "4.8.0" description = "Pexpect allows easy control of interactive console applications." -category = "main" +category = "dev" optional = false python-versions = "*" @@ -1346,8 +1359,8 @@ ptyprocess = ">=0.5" name = "pgmpy" version = "0.1.21" description = "A library for Probabilistic Graphical Models" -category = "main" -optional = true +category = "dev" +optional = false python-versions = "*" [package.dependencies] @@ -1371,7 +1384,7 @@ tests = ["black", "codecov", "coverage", "mock", "pytest", "pytest-cov", "xdocte name = "pickleshare" version = "0.7.5" description = "Tiny 'shelve'-like database with concurrency support" -category = "main" +category = "dev" optional = false python-versions = "*" @@ -1379,7 +1392,7 @@ python-versions = "*" name = "Pillow" version = "9.4.0" description = "Python Imaging Library (Fork)" -category = "main" +category = "dev" optional = false python-versions = ">=3.7" @@ -1399,7 +1412,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 = "main" +category = "dev" optional = false python-versions = ">=3.7" @@ -1457,7 +1470,7 @@ yaspin = ">=0.15.0,<3" name = "prompt-toolkit" version = "3.0.36" description = "Library for building powerful interactive command lines in Python" -category = "main" +category = "dev" optional = false python-versions = ">=3.6.2" @@ -1468,7 +1481,7 @@ wcwidth = "*" name = "psutil" version = "5.9.4" description = "Cross-platform lib for process and system monitoring in Python." -category = "main" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -1479,7 +1492,7 @@ test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] name = "ptyprocess" version = "0.7.0" description = "Run a subprocess in a pseudo terminal" -category = "main" +category = "dev" optional = false python-versions = "*" @@ -1487,7 +1500,7 @@ python-versions = "*" name = "py" version = "1.11.0" description = "library with cross-python path, ini-parsing, io, code, log facilities" -category = "main" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" @@ -1531,7 +1544,7 @@ python-versions = ">=3.6" name = "pycparser" version = "2.21" description = "C parser in Python" -category = "main" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -1557,7 +1570,7 @@ test = ["pydata-sphinx-theme[doc]", "pytest"] [[package]] name = "pydocstyle" -version = "6.2.0" +version = "6.2.2" description = "Python docstring style checker" category = "dev" optional = false @@ -1567,7 +1580,7 @@ python-versions = ">=3.6" snowballstemmer = ">=2.2.0" [package.extras] -toml = ["toml (>=0.10.2)"] +toml = ["tomli (>=1.2.3)"] [[package]] name = "pydot" @@ -1592,7 +1605,7 @@ python-versions = ">=3.6" name = "Pygments" version = "2.14.0" description = "Pygments is a syntax highlighting package written in Python." -category = "main" +category = "dev" optional = false python-versions = ">=3.6" @@ -1622,7 +1635,7 @@ markdown = ">=3.2" name = "pyparsing" version = "3.0.9" description = "pyparsing module - Classes and methods to define and execute parsing grammars" -category = "main" +category = "dev" optional = false python-versions = ">=3.6.8" @@ -1633,8 +1646,8 @@ diagrams = ["jinja2", "railroad-diagrams"] name = "pypickle" version = "1.1.0" description = "pypickle is to save and load variables in/from pickle files" -category = "main" -optional = true +category = "dev" +optional = false python-versions = ">=3" [[package]] @@ -1695,8 +1708,8 @@ six = ">=1.5" name = "python-louvain" version = "0.16" description = "Louvain algorithm for community detection" -category = "main" -optional = true +category = "dev" +optional = false python-versions = "*" [package.dependencies] @@ -1715,8 +1728,8 @@ python-versions = "*" name = "pyvis" version = "0.3.1" description = "A Python network graph visualization library" -category = "main" -optional = true +category = "dev" +optional = false python-versions = ">3.6" [package.dependencies] @@ -1737,8 +1750,8 @@ develop = false [package.dependencies] importlib-resources = {version = "*", markers = "python_version < \"3.9\""} networkx = "^2.8.8" -numpy = "^1.23.0" -scipy = "^1.9.0" +numpy = "^1.21.0" +scipy = "^1.8.0" [package.extras] viz = ["pygraphviz"] @@ -1747,13 +1760,13 @@ viz = ["pygraphviz"] type = "git" url = "https://github.com/py-why/pywhy-graphs.git" reference = 'main' -resolved_reference = "59246229b2f36a25a1dafbecaa346ab255cb15bb" +resolved_reference = "1b36ef87a753a6061a4d0b7e90d3eac0b725f8f1" [[package]] name = "pywin32" version = "305" description = "Python for Window Extensions" -category = "main" +category = "dev" optional = false python-versions = "*" @@ -1780,7 +1793,7 @@ pyyaml = "*" name = "pyzmq" version = "24.0.1" description = "Python bindings for 0MQ" -category = "main" +category = "dev" optional = false python-versions = ">=3.6" @@ -1828,25 +1841,25 @@ tests = ["black (>=22.3.0)", "flake8 (>=3.8.2)", "matplotlib (>=3.1.3)", "mypy ( [[package]] name = "scipy" -version = "1.9.3" +version = "1.10.0" description = "Fundamental algorithms for scientific computing in Python" category = "main" optional = false -python-versions = ">=3.8" +python-versions = "<3.12,>=3.8" [package.dependencies] -numpy = ">=1.18.5,<1.26.0" +numpy = ">=1.19.5,<1.27.0" [package.extras] -dev = ["flake8", "mypy", "pycodestyle", "typing_extensions"] -doc = ["matplotlib (>2)", "numpydoc", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-panels (>=0.5.2)", "sphinx-tabs"] -test = ["asv", "gmpy2", "mpmath", "pytest", "pytest-cov", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] +dev = ["click", "doit (>=0.36.0)", "flake8", "mypy", "pycodestyle", "pydevtool", "rich-click", "typing_extensions"] +doc = ["matplotlib (>2)", "numpydoc", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] +test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] [[package]] name = "setuptools" version = "65.6.3" description = "Easily download, build, install, upgrade, and uninstall Python packages" -category = "main" +category = "dev" optional = false python-versions = ">=3.7" @@ -1859,7 +1872,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 = "main" +category = "dev" optional = false python-versions = ">=3.7" @@ -2084,7 +2097,7 @@ test = ["pytest"] name = "statsmodels" version = "0.13.2" description = "Statistical computations and models for Python" -category = "main" +category = "dev" optional = false python-versions = ">=3.7" @@ -2104,7 +2117,7 @@ docs = ["ipykernel", "jupyter_client", "matplotlib", "nbconvert", "nbformat", "n name = "statsmodels" version = "0.13.3" description = "Statistical computations and models for Python" -category = "main" +category = "dev" optional = false python-versions = ">=3.7" @@ -2124,7 +2137,7 @@ docs = ["ipykernel", "jupyter_client", "matplotlib", "nbconvert", "nbformat", "n name = "statsmodels" version = "0.13.4" description = "Statistical computations and models for Python" -category = "main" +category = "dev" optional = false python-versions = ">=3.7" @@ -2144,7 +2157,7 @@ docs = ["ipykernel", "jupyter_client", "matplotlib", "nbconvert", "nbformat", "n name = "statsmodels" version = "0.13.5" description = "Statistical computations and models for Python" -category = "main" +category = "dev" optional = false python-versions = ">=3.7" @@ -2189,20 +2202,23 @@ mpmath = ">=0.19" name = "tabulate" version = "0.9.0" description = "Pretty-print tabular data" -category = "main" -optional = true +category = "dev" +optional = false python-versions = ">=3.7" [package.extras] widechars = ["wcwidth"] [[package]] -name = "termcolor-whl" -version = "1.1.2" -description = "ANSI Color formatting for output in terminal, successor to termcolor (has wheels!)" +name = "termcolor" +version = "2.2.0" +description = "ANSI color formatting for output in terminal" category = "dev" optional = false -python-versions = ">=2.6" +python-versions = ">=3.7" + +[package.extras] +tests = ["pytest", "pytest-cov"] [[package]] name = "threadpoolctl" @@ -2247,7 +2263,7 @@ python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" name = "tomli" version = "2.0.1" description = "A lil' TOML parser" -category = "main" +category = "dev" optional = false python-versions = ">=3.7" @@ -2255,8 +2271,8 @@ python-versions = ">=3.7" name = "torch" version = "1.13.1" description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" -category = "main" -optional = true +category = "dev" +optional = false python-versions = ">=3.7.0" [package.dependencies] @@ -2273,7 +2289,7 @@ opt-einsum = ["opt-einsum (>=3.3)"] name = "tornado" version = "6.2" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." -category = "main" +category = "dev" optional = false python-versions = ">= 3.7" @@ -2281,7 +2297,7 @@ python-versions = ">= 3.7" name = "tqdm" version = "4.64.1" description = "Fast, Extensible Progress Meter" -category = "main" +category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" @@ -2298,7 +2314,7 @@ telegram = ["requests"] name = "traitlets" version = "5.8.0" description = "Traitlets Python configuration system" -category = "main" +category = "dev" optional = false python-versions = ">=3.7" @@ -2310,7 +2326,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 = "main" +category = "dev" optional = false python-versions = ">=3.7" @@ -2342,7 +2358,7 @@ watchmedo = ["PyYAML (>=3.10)"] name = "wcwidth" version = "0.2.5" description = "Measures the displayed width of unicode strings in a terminal" -category = "main" +category = "dev" optional = false python-versions = "*" @@ -2358,16 +2374,16 @@ python-versions = "*" name = "wget" version = "3.2" description = "pure python download utility" -category = "main" -optional = true +category = "dev" +optional = false python-versions = "*" [[package]] name = "wheel" version = "0.38.4" description = "A built-package format for Python" -category = "main" -optional = true +category = "dev" +optional = false python-versions = ">=3.7" [package.extras] @@ -2377,20 +2393,20 @@ test = ["pytest (>=3.0.0)"] name = "widgetsnbextension" version = "4.0.5" description = "Jupyter interactive widgets for Jupyter Notebook" -category = "main" -optional = true +category = "dev" +optional = false python-versions = ">=3.7" [[package]] name = "yaspin" -version = "2.2.0" +version = "2.3.0" description = "Yet Another Terminal Spinner" category = "dev" optional = false python-versions = ">=3.7.2,<4.0.0" [package.dependencies] -termcolor-whl = "1.1.2" +termcolor = ">=2.2,<3.0" [[package]] name = "zipp" @@ -2405,14 +2421,13 @@ 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 = "04f46cd30737462b965287f013d724bc0280c411923cb4b6de518960a5ee1e67" +content-hash = "a3344f33f579e305ced7458b46ab483ceca598ea2c71922a12230284a8c6d94e" [metadata.files] alabaster = [ @@ -2461,7 +2476,14 @@ bleach = [ {file = "bleach-5.0.1-py3-none-any.whl", hash = "sha256:085f7f33c15bd408dd9b17a4ad77c577db66d76203e5984b1bd59baeee948b2a"}, {file = "bleach-5.0.1.tar.gz", hash = "sha256:0d03255c47eb9bd2f26aa9bb7f2107732e7e8fe195ca2f64709fcf3b0a4a085c"}, ] -bnlearn = [] +bnlearn = [ + {file = "bnlearn-0.7.12-py3-none-any.whl", hash = "sha256:ed69fb1170fa6048c8fb0ea7b123e36db7eb51fc2840295717299c62e752b68a"}, + {file = "bnlearn-0.7.12.tar.gz", hash = "sha256:7eb04bcb0da8f527c0a8a1a80a92aab782cff69835ddb7580ab947f11a84edf5"}, +] +causal-learn = [ + {file = "causal-learn-0.1.3.1.tar.gz", hash = "sha256:0345affa8bc9236c6f8fa1adc45e0e9b7bddf8e54ebb8e08d421a3e4754faf85"}, + {file = "causal_learn-0.1.3.1-py3-none-any.whl", hash = "sha256:6aa4a66f2231d425801562ac142da33054e3ee4cc8d10e9e04695cb4af172db2"}, +] certifi = [ {file = "certifi-2022.12.7-py3-none-any.whl", hash = "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18"}, {file = "certifi-2022.12.7.tar.gz", hash = "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3"}, @@ -2624,81 +2646,81 @@ contourpy = [ {file = "contourpy-1.0.6.tar.gz", hash = "sha256:6e459ebb8bb5ee4c22c19cc000174f8059981971a33ce11e17dddf6aca97a142"}, ] coverage = [ - {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"}, + {file = "coverage-7.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f7c51b6074a8a3063c341953dffe48fd6674f8e4b1d3c8aa8a91f58d6e716a8"}, + {file = "coverage-7.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:628f47eaf66727fc986d3b190d6fa32f5e6b7754a243919d28bc0fd7974c449f"}, + {file = "coverage-7.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e89d5abf86c104de808108a25d171ad646c07eda96ca76c8b237b94b9c71e518"}, + {file = "coverage-7.0.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:75e43c6f4ea4d122dac389aabdf9d4f0e160770a75e63372f88005d90f5bcc80"}, + {file = "coverage-7.0.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49da0ff241827ebb52d5d6d5a36d33b455fa5e721d44689c95df99fd8db82437"}, + {file = "coverage-7.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0bce4ad5bdd0b02e177a085d28d2cea5fc57bb4ba2cead395e763e34cf934eb1"}, + {file = "coverage-7.0.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:f79691335257d60951638dd43576b9bcd6f52baa5c1c2cd07a509bb003238372"}, + {file = "coverage-7.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5722269ed05fbdb94eef431787c66b66260ff3125d1a9afcc00facff8c45adf9"}, + {file = "coverage-7.0.3-cp310-cp310-win32.whl", hash = "sha256:bdbda870e0fda7dd0fe7db7135ca226ec4c1ade8aa76e96614829b56ca491012"}, + {file = "coverage-7.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:e56fae4292e216b8deeee38ace84557b9fa85b52db005368a275427cdabb8192"}, + {file = "coverage-7.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b82343a5bc51627b9d606f0b6b6b9551db7b6311a5dd920fa52a94beae2e8959"}, + {file = "coverage-7.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fd0a8aa431f9b7ad9eb8264f55ef83cbb254962af3775092fb6e93890dea9ca2"}, + {file = "coverage-7.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:112cfead1bd22eada8a8db9ed387bd3e8be5528debc42b5d3c1f7da4ffaf9fb5"}, + {file = "coverage-7.0.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:af87e906355fa42447be5c08c5d44e6e1c005bf142f303f726ddf5ed6e0c8a4d"}, + {file = "coverage-7.0.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f30090e22a301952c5abd0e493a1c8358b4f0b368b49fa3e4568ed3ed68b8d1f"}, + {file = "coverage-7.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ae871d09901911eedda1981ea6fd0f62a999107293cdc4c4fd612321c5b34745"}, + {file = "coverage-7.0.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:ed7c9debf7bfc63c9b9f8b595409237774ff4b061bf29fba6f53b287a2fdeab9"}, + {file = "coverage-7.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:13121fa22dcd2c7b19c5161e3fd725692448f05377b788da4502a383573227b3"}, + {file = "coverage-7.0.3-cp311-cp311-win32.whl", hash = "sha256:037b51ee86bc600f99b3b957c20a172431c35c2ef9c1ca34bc813ab5b51fd9f5"}, + {file = "coverage-7.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:25fde928306034e8deecd5fc91a07432dcc282c8acb76749581a28963c9f4f3f"}, + {file = "coverage-7.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7e8b0642c38b3d3b3c01417643ccc645345b03c32a2e84ef93cdd6844d6fe530"}, + {file = "coverage-7.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18b09811f849cc958d23f733a350a66b54a8de3fed1e6128ba55a5c97ffb6f65"}, + {file = "coverage-7.0.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:349d0b545520e8516f7b4f12373afc705d17d901e1de6a37a20e4ec9332b61f7"}, + {file = "coverage-7.0.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b5b38813eee5b4739f505d94247604c72eae626d5088a16dd77b08b8b1724ab3"}, + {file = "coverage-7.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ba9af1218fa01b1f11c72271bc7290b701d11ad4dbc2ae97c445ecacf6858dba"}, + {file = "coverage-7.0.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c5648c7eec5cf1ba5db1cf2d6c10036a582d7f09e172990474a122e30c841361"}, + {file = "coverage-7.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d0df04495b76a885bfef009f45eebe8fe2fbf815ad7a83dabcf5aced62f33162"}, + {file = "coverage-7.0.3-cp37-cp37m-win32.whl", hash = "sha256:af6cef3796b8068713a48dd67d258dc9a6e2ebc3bd4645bfac03a09672fa5d20"}, + {file = "coverage-7.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:62ef3800c4058844e2e3fa35faa9dd0ccde8a8aba6c763aae50342e00d4479d4"}, + {file = "coverage-7.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:acef7f3a3825a2d218a03dd02f5f3cc7f27aa31d882dd780191d1ad101120d74"}, + {file = "coverage-7.0.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a530663a361eb27375cec28aea5cd282089b5e4b022ae451c4c3493b026a68a5"}, + {file = "coverage-7.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c58cd6bb46dcb922e0d5792850aab5964433d511b3a020867650f8d930dde4f4"}, + {file = "coverage-7.0.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f918e9ef4c98f477a5458238dde2a1643aed956c7213873ab6b6b82e32b8ef61"}, + {file = "coverage-7.0.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b865aa679bee7fbd1c55960940dbd3252621dd81468268786c67122bbd15343"}, + {file = "coverage-7.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c5d9b480ebae60fc2cbc8d6865194136bc690538fa542ba58726433bed6e04cc"}, + {file = "coverage-7.0.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:985ad2af5ec3dbb4fd75d5b0735752c527ad183455520055a08cf8d6794cabfc"}, + {file = "coverage-7.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ca15308ef722f120967af7474ba6a453e0f5b6f331251e20b8145497cf1bc14a"}, + {file = "coverage-7.0.3-cp38-cp38-win32.whl", hash = "sha256:c1cee10662c25c94415bbb987f2ec0e6ba9e8fce786334b10be7e6a7ab958f69"}, + {file = "coverage-7.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:44d6a556de4418f1f3bfd57094b8c49f0408df5a433cf0d253eeb3075261c762"}, + {file = "coverage-7.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e6dcc70a25cb95df0ae33dfc701de9b09c37f7dd9f00394d684a5b57257f8246"}, + {file = "coverage-7.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bf76d79dfaea802f0f28f50153ffbc1a74ae1ee73e480baeda410b4f3e7ab25f"}, + {file = "coverage-7.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88834e5d56d01c141c29deedacba5773fe0bed900b1edc957595a8a6c0da1c3c"}, + {file = "coverage-7.0.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef001a60e888f8741e42e5aa79ae55c91be73761e4df5e806efca1ddd62fd400"}, + {file = "coverage-7.0.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4959dc506be74e4963bd2c42f7b87d8e4b289891201e19ec551e64c6aa5441f8"}, + {file = "coverage-7.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b791beb17b32ac019a78cfbe6184f992b6273fdca31145b928ad2099435e2fcb"}, + {file = "coverage-7.0.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b07651e3b9af8f1a092861d88b4c74d913634a7f1f2280fca0ad041ad84e9e96"}, + {file = "coverage-7.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:55e46fa4168ccb7497c9be78627fcb147e06f474f846a10d55feeb5108a24ef0"}, + {file = "coverage-7.0.3-cp39-cp39-win32.whl", hash = "sha256:e3f1cd1cd65695b1540b3cf7828d05b3515974a9d7c7530f762ac40f58a18161"}, + {file = "coverage-7.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:d8249666c23683f74f8f93aeaa8794ac87cc61c40ff70374a825f3352a4371dc"}, + {file = "coverage-7.0.3-pp37.pp38.pp39-none-any.whl", hash = "sha256:b1ffc8f58b81baed3f8962e28c30d99442079b82ce1ec836a1f67c0accad91c1"}, + {file = "coverage-7.0.3.tar.gz", hash = "sha256:d5be4e93acce64f516bf4fd239c0e6118fc913c93fa1a3f52d15bdcc60d97b2d"}, ] 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"}, + {file = "debugpy-1.6.5-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:696165f021a6a17da08163eaae84f3faf5d8be68fb78cd78488dd347e625279c"}, + {file = "debugpy-1.6.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17039e392d6f38388a68bd02c5f823b32a92142a851e96ba3ec52aeb1ce9d900"}, + {file = "debugpy-1.6.5-cp310-cp310-win32.whl", hash = "sha256:62a06eb78378292ba6c427d861246574dc8b84471904973797b29dd33c7c2495"}, + {file = "debugpy-1.6.5-cp310-cp310-win_amd64.whl", hash = "sha256:9984fc00ab372c97f63786c400107f54224663ea293daab7b365a5b821d26309"}, + {file = "debugpy-1.6.5-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:048368f121c08b00bbded161e8583817af5055982d2722450a69efe2051621c2"}, + {file = "debugpy-1.6.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74e4eca42055759032e3f1909d1374ba1d729143e0c2729bb8cb5e8b5807c458"}, + {file = "debugpy-1.6.5-cp37-cp37m-win32.whl", hash = "sha256:0f9afcc8cad6424695f3356dc9a7406d5b18e37ee2e73f34792881a44b02cc50"}, + {file = "debugpy-1.6.5-cp37-cp37m-win_amd64.whl", hash = "sha256:b5a74ecebe5253344501d9b23f74459c46428b30437fa9254cfb8cb129943242"}, + {file = "debugpy-1.6.5-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:9e809ef787802c808995e5b6ade714a25fa187f892b41a412d418a15a9c4a432"}, + {file = "debugpy-1.6.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:947c686e8adb46726f3d5f19854f6aebf66c2edb91225643c7f44b40b064a235"}, + {file = "debugpy-1.6.5-cp38-cp38-win32.whl", hash = "sha256:377391341c4b86f403d93e467da8e2d05c22b683f08f9af3e16d980165b06b90"}, + {file = "debugpy-1.6.5-cp38-cp38-win_amd64.whl", hash = "sha256:286ae0c2def18ee0dc8a61fa76d51039ca8c11485b6ed3ef83e3efe8a23926ae"}, + {file = "debugpy-1.6.5-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:500dd4a9ff818f5c52dddb4a608c7de5371c2d7d905c505eb745556c579a9f11"}, + {file = "debugpy-1.6.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f3fab217fe7e2acb2d90732af1a871947def4e2b6654945ba1ebd94bd0bea26"}, + {file = "debugpy-1.6.5-cp39-cp39-win32.whl", hash = "sha256:15bc5febe0edc79726517b1f8d57d7ac7c784567b5ba804aab8b1c9d07a57018"}, + {file = "debugpy-1.6.5-cp39-cp39-win_amd64.whl", hash = "sha256:7e84d9e4420122384cb2cc762a00b4e17cbf998022890f89b195ce178f78ff47"}, + {file = "debugpy-1.6.5-py2.py3-none-any.whl", hash = "sha256:8116e40a1cd0593bd2aba01d4d560ee08f018da8e8fbd4cbd24ff09b5f0e41ef"}, + {file = "debugpy-1.6.5.zip", hash = "sha256:5e55e6c79e215239dd0794ee0bf655412b934735a58e9d705e5c544f596f1603"}, ] decorator = [ {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, @@ -3388,8 +3410,8 @@ pydata-sphinx-theme = [ {file = "pydata_sphinx_theme-0.9.0.tar.gz", hash = "sha256:03598a86915b596f4bf80bef79a4d33276a83e670bf360def699dbb9f99dc57a"}, ] pydocstyle = [ - {file = "pydocstyle-6.2.0-py3-none-any.whl", hash = "sha256:39573fa08919ac492b063724af39a1afdcfea8cdaa2c7b8018ca0dfff5d7e36f"}, - {file = "pydocstyle-6.2.0.tar.gz", hash = "sha256:b2d280501a4c0d9feeb96e9171dc3f6f7d0064c55270f4c7b1baa18452019fd9"}, + {file = "pydocstyle-6.2.2-py3-none-any.whl", hash = "sha256:021b33525927b43b4469c2715694c38082cb98146b52342df652b30806e3cb61"}, + {file = "pydocstyle-6.2.2.tar.gz", hash = "sha256:5714e3a96f6ece848a1c35f581e89f3164867733609f0dd8a99f7e7c6b526bdd"}, ] pydot = [ {file = "pydot-1.4.2-py2.py3-none-any.whl", hash = "sha256:66c98190c65b8d2e2382a441b4c0edfdb4f4c025ef9cb9874de478fb0793a451"}, @@ -3629,27 +3651,27 @@ scikit-learn = [ {file = "scikit_learn-1.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:ceb0008f345188aa236e49c973dc160b9ed504a3abd7b321a0ecabcb669be0bd"}, ] scipy = [ - {file = "scipy-1.9.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1884b66a54887e21addf9c16fb588720a8309a57b2e258ae1c7986d4444d3bc0"}, - {file = "scipy-1.9.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:83b89e9586c62e787f5012e8475fbb12185bafb996a03257e9675cd73d3736dd"}, - {file = "scipy-1.9.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a72d885fa44247f92743fc20732ae55564ff2a519e8302fb7e18717c5355a8b"}, - {file = "scipy-1.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d01e1dd7b15bd2449c8bfc6b7cc67d630700ed655654f0dfcf121600bad205c9"}, - {file = "scipy-1.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:68239b6aa6f9c593da8be1509a05cb7f9efe98b80f43a5861cd24c7557e98523"}, - {file = "scipy-1.9.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b41bc822679ad1c9a5f023bc93f6d0543129ca0f37c1ce294dd9d386f0a21096"}, - {file = "scipy-1.9.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:90453d2b93ea82a9f434e4e1cba043e779ff67b92f7a0e85d05d286a3625df3c"}, - {file = "scipy-1.9.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83c06e62a390a9167da60bedd4575a14c1f58ca9dfde59830fc42e5197283dab"}, - {file = "scipy-1.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abaf921531b5aeaafced90157db505e10345e45038c39e5d9b6c7922d68085cb"}, - {file = "scipy-1.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:06d2e1b4c491dc7d8eacea139a1b0b295f74e1a1a0f704c375028f8320d16e31"}, - {file = "scipy-1.9.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5a04cd7d0d3eff6ea4719371cbc44df31411862b9646db617c99718ff68d4840"}, - {file = "scipy-1.9.3-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:545c83ffb518094d8c9d83cce216c0c32f8c04aaf28b92cc8283eda0685162d5"}, - {file = "scipy-1.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d54222d7a3ba6022fdf5773931b5d7c56efe41ede7f7128c7b1637700409108"}, - {file = "scipy-1.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cff3a5295234037e39500d35316a4c5794739433528310e117b8a9a0c76d20fc"}, - {file = "scipy-1.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:2318bef588acc7a574f5bfdff9c172d0b1bf2c8143d9582e05f878e580a3781e"}, - {file = "scipy-1.9.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d644a64e174c16cb4b2e41dfea6af722053e83d066da7343f333a54dae9bc31c"}, - {file = "scipy-1.9.3-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:da8245491d73ed0a994ed9c2e380fd058ce2fa8a18da204681f2fe1f57f98f95"}, - {file = "scipy-1.9.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4db5b30849606a95dcf519763dd3ab6fe9bd91df49eba517359e450a7d80ce2e"}, - {file = "scipy-1.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c68db6b290cbd4049012990d7fe71a2abd9ffbe82c0056ebe0f01df8be5436b0"}, - {file = "scipy-1.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:5b88e6d91ad9d59478fafe92a7c757d00c59e3bdc3331be8ada76a4f8d683f58"}, - {file = "scipy-1.9.3.tar.gz", hash = "sha256:fbc5c05c85c1a02be77b1ff591087c83bc44579c6d2bd9fb798bb64ea5e1a027"}, + {file = "scipy-1.10.0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:b901b423c91281a974f6cd1c36f5c6c523e665b5a6d5e80fcb2334e14670eefd"}, + {file = "scipy-1.10.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:16ba05d3d1b9f2141004f3f36888e05894a525960b07f4c2bfc0456b955a00be"}, + {file = "scipy-1.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:151f066fe7d6653c3ffefd489497b8fa66d7316e3e0d0c0f7ff6acca1b802809"}, + {file = "scipy-1.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f9ea0a37aca111a407cb98aa4e8dfde6e5d9333bae06dfa5d938d14c80bb5c3"}, + {file = "scipy-1.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:27e548276b5a88b51212b61f6dda49a24acf5d770dff940bd372b3f7ced8c6c2"}, + {file = "scipy-1.10.0-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:42ab8b9e7dc1ebe248e55f54eea5307b6ab15011a7883367af48dd781d1312e4"}, + {file = "scipy-1.10.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:e096b062d2efdea57f972d232358cb068413dc54eec4f24158bcbb5cb8bddfd8"}, + {file = "scipy-1.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4df25a28bd22c990b22129d3c637fd5c3be4b7c94f975dca909d8bab3309b694"}, + {file = "scipy-1.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ad449db4e0820e4b42baccefc98ec772ad7818dcbc9e28b85aa05a536b0f1a2"}, + {file = "scipy-1.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:6faf86ef7717891195ae0537e48da7524d30bc3b828b30c9b115d04ea42f076f"}, + {file = "scipy-1.10.0-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:4bd0e3278126bc882d10414436e58fa3f1eca0aa88b534fcbf80ed47e854f46c"}, + {file = "scipy-1.10.0-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:38bfbd18dcc69eeb589811e77fae552fa923067fdfbb2e171c9eac749885f210"}, + {file = "scipy-1.10.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ab2a58064836632e2cec31ca197d3695c86b066bc4818052b3f5381bfd2a728"}, + {file = "scipy-1.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5cd7a30970c29d9768a7164f564d1fbf2842bfc77b7d114a99bc32703ce0bf48"}, + {file = "scipy-1.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:9b878c671655864af59c108c20e4da1e796154bd78c0ed6bb02bc41c84625686"}, + {file = "scipy-1.10.0-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:3afcbddb4488ac950ce1147e7580178b333a29cd43524c689b2e3543a080a2c8"}, + {file = "scipy-1.10.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:6e4497e5142f325a5423ff5fda2fff5b5d953da028637ff7c704378c8c284ea7"}, + {file = "scipy-1.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:441cab2166607c82e6d7a8683779cb89ba0f475b983c7e4ab88f3668e268c143"}, + {file = "scipy-1.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0490dc499fe23e4be35b8b6dd1e60a4a34f0c4adb30ac671e6332446b3cbbb5a"}, + {file = "scipy-1.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:954ff69d2d1bf666b794c1d7216e0a746c9d9289096a64ab3355a17c7c59db54"}, + {file = "scipy-1.10.0.tar.gz", hash = "sha256:c8b3cbc636a87a89b770c6afc999baa6bcbb01691b5ccbbc1b1791c7c0a07540"}, ] setuptools = [ {file = "setuptools-65.6.3-py3-none-any.whl", hash = "sha256:57f6f22bde4e042978bcd50176fdb381d7c21a9efa4041202288d3737a0c6a54"}, @@ -3835,8 +3857,9 @@ 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"}, +termcolor = [ + {file = "termcolor-2.2.0-py3-none-any.whl", hash = "sha256:91ddd848e7251200eac969846cbae2dacd7d71c2871e92733289e7e3666f48e7"}, + {file = "termcolor-2.2.0.tar.gz", hash = "sha256:dfc8ac3f350788f23b2947b3e6cfa5a53b630b612e6cd8965a015a776020b99a"}, ] threadpoolctl = [ {file = "threadpoolctl-3.1.0-py3-none-any.whl", hash = "sha256:8b99adda265feb6773280df41eece7b2e6561b772d21ffd52e372f999024907b"}, @@ -3960,8 +3983,8 @@ widgetsnbextension = [ {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"}, + {file = "yaspin-2.3.0-py3-none-any.whl", hash = "sha256:17b5548479b3d5b30adec7a87ffcdcddb403d14a2bb86fbcee97f37951e13427"}, + {file = "yaspin-2.3.0.tar.gz", hash = "sha256:547afd1a9700ac3a29a9f5591c70343bef186ed5dfb5e545a9bb0c77e561a1c9"}, ] zipp = [ {file = "zipp-3.11.0-py3-none-any.whl", hash = "sha256:83a28fcb75844b5c0cdaf5aa4003c2d728c77e05f5aeabe8e95e56727005fbaa"}, diff --git a/pyproject.toml b/pyproject.toml index 1f39eb94..c16e394d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -70,6 +70,12 @@ pytest = "^7.1.2" pytest-cov = "^3.0.0" memory_profiler = { version = "^0.60.0" } flaky = "^3.7.0" +causal-learn = "^0.1.3.1" # these packages are only needed for integration testing +bnlearn = "^0.7.12" +dowhy = { version = "^0.8" } +typing-extensions = { version = "*" } # needed in dowhy's package +joblib = { version = "^1.1.0" } # needed in dowhy's package +tqdm = { version = "^4.64.0" } # needed in dowhy's package [tool.poetry.group.docs] optional = true @@ -88,7 +94,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 } +bnlearn = { version = "^0.7.12" } dowhy = { version = "^0.8" } typing-extensions = { version = "*" } # needed in dowhy's package joblib = { version = "^1.1.0" } # needed in dowhy's package @@ -141,7 +147,6 @@ integration_test = 'pytest tests/integration_tests' build_docs = 'make -C doc clean html' [[tool.poe.tasks.clean]] -# '_clean_cache', '_clean_pyc', '_clean_so' sequence = ['_clean_cache', '_clean_pyc', '_clean_so', '_clean_build', '_clean_ctags', '_clean_test'] ignore_fail = 'return_non_zero' diff --git a/tests/integration_tests/__init__.py b/tests/integration_tests/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/integration_tests/constraint/test_fci_causal_learn.py b/tests/integration_tests/constraint/test_fci_causal_learn.py new file mode 100644 index 00000000..585e53cf --- /dev/null +++ b/tests/integration_tests/constraint/test_fci_causal_learn.py @@ -0,0 +1,154 @@ +import networkx as nx +import numpy as np +import pandas as pd +from causallearn.search.ConstraintBased.FCI import fci +from dowhy import gcm +from dowhy.gcm.util.general import set_random_seed +from pywhy_graphs.array.export import clearn_arr_to_graph +from scipy import stats + +from dodiscover import FCI, make_context +from dodiscover.ci import FisherZCITest, GSquareCITest, Oracle +from dodiscover.metrics import confusion_matrix_networks, structure_hamming_dist + + +def simulate_gcm(): + # set a random seed to make example reproducible + seed = 12345 + rng = np.random.RandomState(seed=seed) + # set a random seed to make example reproducible + set_random_seed(1234) + + class MyCustomModel(gcm.PredictionModel): + def __init__(self, coefficient): + self.coefficient = coefficient + + def fit(self, X, Y): + # Nothing to fit here, since we know the ground truth. + pass + + def predict(self, X): + return self.coefficient * X + + def clone(self): + # We don't really need this actually. + return MyCustomModel(self.coefficient) + + # construct a causal graph that will result in + # x -> y <- z -> w + edge_list = [ + ("x4", "x1"), + ("x2", "x5"), + ("x3", "x2"), + ("x3", "x4"), + ("x2", "x6"), + ("x3", "x6"), + ("x4", "x6"), + ("x5", "x6"), + ] + latent_edge_list = [("x12", "x1"), ("x12", "x2"), ("x45", "x4"), ("x45", "x5")] + G = nx.DiGraph(edge_list + latent_edge_list) + + causal_model = gcm.ProbabilisticCausalModel(G) + + for node in G.nodes: + parents = set(G.predecessors(node)) + + # root node + random_mean = rng.normal() + random_scale = rng.uniform() + gcm_distrib = gcm.ScipyDistribution(stats.norm, loc=random_mean, scale=random_scale) + + p = 0.5 + gcm_distrib = gcm.ScipyDistribution(stats.binom, n=1, p=p) + + weight_model = rng.normal() + weight_model = rng.binomial(n=1, p=p) + + if len(parents) == 0: + causal_model.set_causal_mechanism(node, gcm_distrib) + else: + causal_model.set_causal_mechanism( + node, + gcm.AdditiveNoiseModel( + prediction_model=MyCustomModel(weight_model), noise_model=gcm_distrib + ), + ) + + # Fit here would not really fit parameters, since we don't do anything in the fit method. + # Here, we only need this to ensure that each FCM has the correct local hash (i.e., we + # get an inconsistency error if we would modify the graph afterwards without updating + # the FCMs). Having an empty data set is a small workaround, since all models are + # pre-defined. + gcm.fit(causal_model, pd.DataFrame(columns=G.nodes)) + + return causal_model + + +def test_fci_against_causallearn(): + n_samples = 2000 + alpha = 0.05 + causal_model = simulate_gcm() + + # sample the observational data + data = gcm.draw_samples(causal_model, num_samples=n_samples) + + # drop latent confounders + data.drop(["x45", "x12"], axis=1, inplace=True) + + # setup input data for algorithms + data_arr = data.to_numpy() + context = make_context().variables(data=data).build() + + # obtain the PAG that we should get using an oracle + oracle = Oracle(causal_model.graph) + fci_alg = FCI(ci_estimator=oracle) + fci_alg.fit(data, context) + # true_pag = fci_alg.graph_ + + ci_test = FisherZCITest() + ci_test = GSquareCITest(data_type="discrete") + clearn_ci_test = "gsq" + + # First run causallearn + clearn_graph, edges = fci(data_arr, independence_test_method=clearn_ci_test, alpha=alpha) + + # Second run FCI + fci_alg = FCI(ci_estimator=ci_test, alpha=alpha) + fci_alg.fit(data, context) + dodiscover_graph = fci_alg.graph_ + + # first compare the adjacency structure + clearn_graph = clearn_arr_to_graph(clearn_graph.graph, arr_idx=data.columns, graph_type="pag") + cm = confusion_matrix_networks(dodiscover_graph, clearn_graph) + + dia = np.diag_indices(cm.shape[0]) # indices of diagonal elements + dia_sum = sum(cm[dia]) # sum of diagonal elements + off_dia_sum = np.sum(cm) - dia_sum # subtract the diagonal sum from total array sum + + print(cm) + assert off_dia_sum == 0 + + # compare the SHD against the ground-truth graph + assert ( + structure_hamming_dist( + dodiscover_graph.sub_directed_graph(), clearn_graph.sub_directed_graph() + ) + == 0 + ) + assert ( + structure_hamming_dist( + dodiscover_graph.sub_bidirected_graph(), clearn_graph.sub_bidirected_graph() + ) + == 0 + ) + assert ( + structure_hamming_dist( + dodiscover_graph.sub_undirected_graph(), clearn_graph.sub_undirected_graph() + ) + == 0 + ) + assert ( + structure_hamming_dist(dodiscover_graph.sub_circle_graph(), clearn_graph.sub_circle_graph()) + == 0 + ) diff --git a/tests/integration_tests/constraint/test_pc_causal_learn.py b/tests/integration_tests/constraint/test_pc_causal_learn.py new file mode 100644 index 00000000..6e277c75 --- /dev/null +++ b/tests/integration_tests/constraint/test_pc_causal_learn.py @@ -0,0 +1,158 @@ +import bnlearn +import networkx as nx +import pytest +from causallearn.search.ConstraintBased.PC import pc_alg +from pywhy_graphs.array.export import clearn_arr_to_graph +from sklearn.preprocessing import LabelEncoder + +from dodiscover import PC, make_context +from dodiscover.ci import GSquareCITest, KernelCITest +from dodiscover.metrics import structure_hamming_dist + + +# TODO: investigate why FisherZ test is different between causal-learn and dodiscover +# TODO: investigate why G^2 test for discrete data is different between causal-learn and +# XXX: dodiscover possibly from an error in our impleemntation? +@pytest.mark.parametrize( + ["dataset", "ci_estimator", "clearn_test", "col_names", "categorical_cols"], + [ + # [ + # "titanic", + # FisherZCITest(), + # "fisherz", + # ["Survived", "Pclass", "Sex", "Age", "SibSp", "Parch", "Fare", "Embarked"], + # ["Sex", "Embarked"], + # ], + # [ + # "sachs", + # FisherZCITest(), + # "fisherz", + # ["Erk", "Akt", "PKA", "Mek", "Jnk", "PKC", "Raf", "P38", "PIP3", "PIP2", "Plcg"], + # [], + # ], + # [ + # "water", + # GSquareCITest("discrete"), + # "gsq", + # [ + # "C_NI_12_00", + # "C_NI_12_15", + # "CKNI_12_00", + # "CKNI_12_15", + # "CBODD_12_15", + # "CBODD_12_00", + # "CNOD_12_00", + # "CBODN_12_00", + # "CKND_12_15", + # "CKND_12_00", + # "CKNN_12_00", + # "CNOD_12_15", + # "CNON_12_00", + # "CBODN_12_15", + # "CKNN_12_15", + # "CNON_12_15", + # "C_NI_12_30", + # "CKNI_12_30", + # "CBODD_12_30", + # "CKND_12_30", + # "CNOD_12_30", + # "CBODN_12_30", + # "CKNN_12_30", + # "CNON_12_30", + # "C_NI_12_45", + # "CKNI_12_45", + # "CBODD_12_45", + # "CKND_12_45", + # "CNOD_12_45", + # "CBODN_12_45", + # "CKNN_12_45", + # "CNON_12_45", + # ], + # [], + # ], + [ + "sprinkler", + GSquareCITest("binary"), + "gsq", + ["Cloudy", "Sprinkler", "Rain", "Wet_Grass"], + [], + ], + [ + "asia", + GSquareCITest("binary"), + "gsq", + ["asia", "tub", "smoke", "lung", "bronc", "either", "xray", "dysp"], + [], + ], + [ + "stormofswords", + KernelCITest(), + "kci", + ["source", "target", "weight"], + ["source", "target"], + ], # discrete and categorical + ["random", GSquareCITest("binary"), "gsq", ["A", "B", "C", "D", "E"], []], + ], +) +def test_pc_against_causallearn(dataset, ci_estimator, clearn_test, col_names, categorical_cols): + df = bnlearn.import_example(dataset, n=1000, verbose=False) + + # only keep non-nan rows + print(df.columns) + df = df[col_names] + df.dropna(inplace=True) + print(df.shape) + print(df.head(3)) + + # run encoder + enc = LabelEncoder() + for col in categorical_cols: + df[col] = enc.fit_transform(df[[col]].to_numpy().ravel()) + + # make context and setup for dodiscover + alpha = 0.05 + context = make_context().variables(data=df).build() + + pcalg = PC(ci_estimator=ci_estimator, alpha=alpha) + pcalg.fit(df, context) + pywhy_graph = pcalg.graph_ + + # now run causal-learn + data = df.to_numpy() + nodes = df.columns.tolist() + clearn_graph = pc_alg( + data, + node_names=nodes, + alpha=alpha, + indep_test=clearn_test, + stable=True, + uc_rule=0, + uc_priority=-1, + ) + + # convert to pywhy graph + nodes = [node.get_name() for node in clearn_graph.G.nodes] + clearn_pywhy_graph = clearn_arr_to_graph( + clearn_graph.G.graph, arr_idx=nodes, graph_type="cpdag" + ) + print(pywhy_graph) + print(clearn_pywhy_graph) + print(clearn_graph.G.graph) + + print(pywhy_graph.sub_directed_graph()) + print(clearn_pywhy_graph.sub_directed_graph()) + print(pywhy_graph.sub_undirected_graph()) + print(clearn_pywhy_graph.sub_undirected_graph()) + + shd = structure_hamming_dist( + clearn_pywhy_graph.sub_directed_graph(), pywhy_graph.sub_directed_graph() + ) + + # now we will compare the two graphs + assert nx.is_isomorphic( + clearn_pywhy_graph.sub_directed_graph(), pywhy_graph.sub_directed_graph() + ) + assert shd == 0 + assert nx.is_isomorphic( + clearn_pywhy_graph.sub_undirected_graph(), pywhy_graph.sub_undirected_graph() + )