commit 1837b7f661a88ebdd81214340bab68681f218a23 Author: Ruben van de Ven Date: Tue Apr 13 17:32:51 2021 +0200 Interactive graph using PC1 and PC2 diff --git a/.python-version b/.python-version new file mode 100644 index 0000000..2009c7d --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.9.2 diff --git a/README.md b/README.md new file mode 100644 index 0000000..b6b080d --- /dev/null +++ b/README.md @@ -0,0 +1,22 @@ +## About + +Runs PCA on poses on MPII Human Pose Dataset. Inspired by [Moretti & Impett's Totentanz (2017)](https://newleftreview.org/issues/ii107/articles/franco-moretti-leonardo-impett-totentanz). + +Pose extraction based on [meghshukla](http://github.com/meghshukla/MPII-Human-Pose-Visualization). + +## Setup + +Install dependencies: + +``` +poetry install +wget https://datasets.d2.mpi-inf.mpg.de/andriluka14cvpr/mpii_human_pose_v1_u12_2.zip +unzip mpii_human_pose_v1_u12_2.zip +``` + +To install jupyter kernel & run notebook: + +```bash +poetry run ipython kernel install --user --name=mpii +poetry run jupyter notebook +``` diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..d82c6a9 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,1487 @@ +[[package]] +name = "adjusttext" +version = "0.7.3" +description = "Iteratively adjust text position in matplotlib plots to minimize overlaps" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +matplotlib = "*" +numpy = "*" + +[[package]] +name = "appnope" +version = "0.1.2" +description = "Disable App Nap on macOS >= 10.9" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "argon2-cffi" +version = "20.1.0" +description = "The secure Argon2 password hashing algorithm." +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +cffi = ">=1.0.0" +six = "*" + +[package.extras] +dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pytest", "sphinx", "wheel", "pre-commit"] +docs = ["sphinx"] +tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pytest"] + +[[package]] +name = "async-generator" +version = "1.10" +description = "Async generators and context managers for Python 3.5+" +category = "dev" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "attrs" +version = "20.3.0" +description = "Classes Without Boilerplate" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.extras] +dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "furo", "sphinx", "pre-commit"] +docs = ["furo", "sphinx", "zope.interface"] +tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"] +tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six"] + +[[package]] +name = "backcall" +version = "0.2.0" +description = "Specifications for callback functions passed in to an API" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "bleach" +version = "3.3.0" +description = "An easy safelist-based HTML-sanitizing tool." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.dependencies] +packaging = "*" +six = ">=1.9.0" +webencodings = "*" + +[[package]] +name = "cffi" +version = "1.14.5" +description = "Foreign Function Interface for Python calling C code." +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "colorama" +version = "0.4.4" +description = "Cross-platform colored terminal text." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "cycler" +version = "0.10.0" +description = "Composable style cycles" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +six = "*" + +[[package]] +name = "decorator" +version = "5.0.6" +description = "Decorators for Humans" +category = "dev" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "defusedxml" +version = "0.7.1" +description = "XML bomb protection for Python stdlib modules" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "entrypoints" +version = "0.3" +description = "Discover and load entry points from installed packages." +category = "dev" +optional = false +python-versions = ">=2.7" + +[[package]] +name = "ipykernel" +version = "5.5.3" +description = "IPython Kernel for Jupyter" +category = "dev" +optional = false +python-versions = ">=3.5" + +[package.dependencies] +appnope = {version = "*", markers = "platform_system == \"Darwin\""} +ipython = ">=5.0.0" +jupyter-client = "*" +tornado = ">=4.2" +traitlets = ">=4.1.0" + +[package.extras] +test = ["pytest (!=5.3.4)", "pytest-cov", "flaky", "nose", "jedi (<=0.17.2)"] + +[[package]] +name = "ipython" +version = "7.22.0" +description = "IPython: Productive Interactive Computing" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +appnope = {version = "*", markers = "sys_platform == \"darwin\""} +backcall = "*" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +decorator = "*" +jedi = ">=0.16" +pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} +pickleshare = "*" +prompt-toolkit = ">=2.0.0,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.1.0" +pygments = "*" +traitlets = ">=4.2" + +[package.extras] +all = ["Sphinx (>=1.3)", "ipykernel", "ipyparallel", "ipywidgets", "nbconvert", "nbformat", "nose (>=0.10.1)", "notebook", "numpy (>=1.16)", "pygments", "qtconsole", "requests", "testpath"] +doc = ["Sphinx (>=1.3)"] +kernel = ["ipykernel"] +nbconvert = ["nbconvert"] +nbformat = ["nbformat"] +notebook = ["notebook", "ipywidgets"] +parallel = ["ipyparallel"] +qtconsole = ["qtconsole"] +test = ["nose (>=0.10.1)", "requests", "testpath", "pygments", "nbformat", "ipykernel", "numpy (>=1.16)"] + +[[package]] +name = "ipython-genutils" +version = "0.2.0" +description = "Vestigial utilities from IPython" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "ipywidgets" +version = "7.6.3" +description = "IPython HTML widgets for Jupyter" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +ipykernel = ">=4.5.1" +ipython = {version = ">=4.0.0", markers = "python_version >= \"3.3\""} +jupyterlab-widgets = {version = ">=1.0.0", markers = "python_version >= \"3.6\""} +nbformat = ">=4.2.0" +traitlets = ">=4.3.1" +widgetsnbextension = ">=3.5.0,<3.6.0" + +[package.extras] +test = ["pytest (>=3.6.0)", "pytest-cov", "mock"] + +[[package]] +name = "jedi" +version = "0.18.0" +description = "An autocompletion tool for Python that can be used for text editors." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +parso = ">=0.8.0,<0.9.0" + +[package.extras] +qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] +testing = ["Django (<3.1)", "colorama", "docopt", "pytest (<6.0.0)"] + +[[package]] +name = "jinja2" +version = "2.11.3" +description = "A very fast and expressive template engine." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.dependencies] +MarkupSafe = ">=0.23" + +[package.extras] +i18n = ["Babel (>=0.8)"] + +[[package]] +name = "joblib" +version = "1.0.1" +description = "Lightweight pipelining with Python functions" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "jsonschema" +version = "3.2.0" +description = "An implementation of JSON Schema validation for Python" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +attrs = ">=17.4.0" +pyrsistent = ">=0.14.0" +six = ">=1.11.0" + +[package.extras] +format = ["idna", "jsonpointer (>1.13)", "rfc3987", "strict-rfc3339", "webcolors"] +format_nongpl = ["idna", "jsonpointer (>1.13)", "webcolors", "rfc3986-validator (>0.1.0)", "rfc3339-validator"] + +[[package]] +name = "jupyter" +version = "1.0.0" +description = "Jupyter metapackage. Install all the Jupyter components in one go." +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +ipykernel = "*" +ipywidgets = "*" +jupyter-console = "*" +nbconvert = "*" +notebook = "*" +qtconsole = "*" + +[[package]] +name = "jupyter-client" +version = "6.2.0" +description = "Jupyter protocol implementation and client libraries" +category = "dev" +optional = false +python-versions = ">=3.6.1" + +[package.dependencies] +jupyter-core = ">=4.6.0" +nest-asyncio = ">=1.5" +python-dateutil = ">=2.1" +pyzmq = ">=13" +tornado = ">=4.1" +traitlets = "*" + +[package.extras] +doc = ["sphinx (>=1.3.6)", "sphinx-rtd-theme", "sphinxcontrib-github-alt"] +test = ["async-generator", "ipykernel", "ipython", "mock", "pytest-asyncio", "pytest-timeout", "pytest", "mypy", "pre-commit", "jedi (<0.18)"] + +[[package]] +name = "jupyter-console" +version = "6.4.0" +description = "Jupyter terminal console" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +ipykernel = "*" +ipython = "*" +jupyter-client = "*" +prompt-toolkit = ">=2.0.0,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.1.0" +pygments = "*" + +[package.extras] +test = ["pexpect"] + +[[package]] +name = "jupyter-core" +version = "4.7.1" +description = "Jupyter core package. A base package on which Jupyter projects rely." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +pywin32 = {version = ">=1.0", markers = "sys_platform == \"win32\""} +traitlets = "*" + +[[package]] +name = "jupyterlab-pygments" +version = "0.1.2" +description = "Pygments theme using JupyterLab CSS variables" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +pygments = ">=2.4.1,<3" + +[[package]] +name = "jupyterlab-widgets" +version = "1.0.0" +description = "A JupyterLab extension." +category = "dev" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "kiwisolver" +version = "1.3.1" +description = "A fast implementation of the Cassowary constraint solver" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "markupsafe" +version = "1.1.1" +description = "Safely add untrusted strings to HTML/XML markup." +category = "dev" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + +[[package]] +name = "matplotlib" +version = "3.4.1" +description = "Python plotting package" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +cycler = ">=0.10" +kiwisolver = ">=1.0.1" +numpy = ">=1.16" +pillow = ">=6.2.0" +pyparsing = ">=2.2.1" +python-dateutil = ">=2.7" + +[[package]] +name = "mistune" +version = "0.8.4" +description = "The fastest markdown parser in pure Python" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "nbclient" +version = "0.5.3" +description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." +category = "dev" +optional = false +python-versions = ">=3.6.1" + +[package.dependencies] +async-generator = "*" +jupyter-client = ">=6.1.5" +nbformat = ">=5.0" +nest-asyncio = "*" +traitlets = ">=4.2" + +[package.extras] +dev = ["codecov", "coverage", "ipython", "ipykernel", "ipywidgets", "pytest (>=4.1)", "pytest-cov (>=2.6.1)", "check-manifest", "flake8", "mypy", "tox", "bumpversion", "xmltodict", "pip (>=18.1)", "wheel (>=0.31.0)", "setuptools (>=38.6.0)", "twine (>=1.11.0)", "black"] +sphinx = ["Sphinx (>=1.7)", "sphinx-book-theme", "mock", "moto", "myst-parser"] +test = ["codecov", "coverage", "ipython", "ipykernel", "ipywidgets", "pytest (>=4.1)", "pytest-cov (>=2.6.1)", "check-manifest", "flake8", "mypy", "tox", "bumpversion", "xmltodict", "pip (>=18.1)", "wheel (>=0.31.0)", "setuptools (>=38.6.0)", "twine (>=1.11.0)", "black"] + +[[package]] +name = "nbconvert" +version = "6.0.7" +description = "Converting Jupyter Notebooks" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +bleach = "*" +defusedxml = "*" +entrypoints = ">=0.2.2" +jinja2 = ">=2.4" +jupyter-core = "*" +jupyterlab-pygments = "*" +mistune = ">=0.8.1,<2" +nbclient = ">=0.5.0,<0.6.0" +nbformat = ">=4.4" +pandocfilters = ">=1.4.1" +pygments = ">=2.4.1" +testpath = "*" +traitlets = ">=4.2" + +[package.extras] +all = ["pytest", "pytest-cov", "pytest-dependency", "ipykernel", "ipywidgets (>=7)", "pyppeteer (==0.2.2)", "tornado (>=4.0)", "sphinx (>=1.5.1)", "sphinx-rtd-theme", "nbsphinx (>=0.2.12)", "ipython"] +docs = ["sphinx (>=1.5.1)", "sphinx-rtd-theme", "nbsphinx (>=0.2.12)", "ipython"] +serve = ["tornado (>=4.0)"] +test = ["pytest", "pytest-cov", "pytest-dependency", "ipykernel", "ipywidgets (>=7)", "pyppeteer (==0.2.2)"] +webpdf = ["pyppeteer (==0.2.2)"] + +[[package]] +name = "nbformat" +version = "5.1.3" +description = "The Jupyter Notebook format" +category = "dev" +optional = false +python-versions = ">=3.5" + +[package.dependencies] +ipython-genutils = "*" +jsonschema = ">=2.4,<2.5.0 || >2.5.0" +jupyter-core = "*" +traitlets = ">=4.1" + +[package.extras] +fast = ["fastjsonschema"] +test = ["check-manifest", "fastjsonschema", "testpath", "pytest", "pytest-cov"] + +[[package]] +name = "nest-asyncio" +version = "1.5.1" +description = "Patch asyncio to allow nested event loops" +category = "dev" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "notebook" +version = "6.3.0" +description = "A web-based notebook environment for interactive computing" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +argon2-cffi = "*" +ipykernel = "*" +ipython-genutils = "*" +jinja2 = "*" +jupyter-client = ">=5.3.4" +jupyter-core = ">=4.6.1" +nbconvert = "*" +nbformat = "*" +prometheus-client = "*" +pyzmq = ">=17" +Send2Trash = ">=1.5.0" +terminado = ">=0.8.3" +tornado = ">=6.1" +traitlets = ">=4.2.1" + +[package.extras] +docs = ["sphinx", "nbsphinx", "sphinxcontrib-github-alt", "sphinx-rtd-theme"] +json-logging = ["json-logging"] +test = ["pytest", "coverage", "requests", "nbval", "selenium", "pytest-cov", "requests-unixsocket"] + +[[package]] +name = "numpy" +version = "1.20.2" +description = "NumPy is the fundamental package for array computing with Python." +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "packaging" +version = "20.9" +description = "Core utilities for Python packages" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.dependencies] +pyparsing = ">=2.0.2" + +[[package]] +name = "pandocfilters" +version = "1.4.3" +description = "Utilities for writing pandoc filters in python" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "parso" +version = "0.8.2" +description = "A Python Parser" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] +testing = ["docopt", "pytest (<6.0.0)"] + +[[package]] +name = "pexpect" +version = "4.8.0" +description = "Pexpect allows easy control of interactive console applications." +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +ptyprocess = ">=0.5" + +[[package]] +name = "pickleshare" +version = "0.7.5" +description = "Tiny 'shelve'-like database with concurrency support" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "pillow" +version = "8.2.0" +description = "Python Imaging Library (Fork)" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "prometheus-client" +version = "0.10.1" +description = "Python client for the Prometheus monitoring system." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.extras] +twisted = ["twisted"] + +[[package]] +name = "prompt-toolkit" +version = "3.0.18" +description = "Library for building powerful interactive command lines in Python" +category = "dev" +optional = false +python-versions = ">=3.6.1" + +[package.dependencies] +wcwidth = "*" + +[[package]] +name = "ptyprocess" +version = "0.7.0" +description = "Run a subprocess in a pseudo terminal" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "py" +version = "1.10.0" +description = "library with cross-python path, ini-parsing, io, code, log facilities" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "pycparser" +version = "2.20" +description = "C parser in Python" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "pygments" +version = "2.8.1" +description = "Pygments is a syntax highlighting package written in Python." +category = "dev" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "pyparsing" +version = "2.4.7" +description = "Python parsing module" +category = "main" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "pyrsistent" +version = "0.17.3" +description = "Persistent/Functional/Immutable data structures" +category = "dev" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "python-dateutil" +version = "2.8.1" +description = "Extensions to the standard Python datetime module" +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "pywin32" +version = "300" +description = "Python for Window Extensions" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "pywinpty" +version = "0.5.7" +description = "Python bindings for the winpty library" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "pyzmq" +version = "22.0.3" +description = "Python bindings for 0MQ" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +cffi = {version = "*", markers = "implementation_name == \"pypy\""} +py = {version = "*", markers = "implementation_name == \"pypy\""} + +[[package]] +name = "qtconsole" +version = "5.0.3" +description = "Jupyter Qt console" +category = "dev" +optional = false +python-versions = ">= 3.6" + +[package.dependencies] +ipykernel = ">=4.1" +ipython-genutils = "*" +jupyter-client = ">=4.1" +jupyter-core = "*" +pygments = "*" +pyzmq = ">=17.1" +qtpy = "*" +traitlets = "*" + +[package.extras] +doc = ["Sphinx (>=1.3)"] +test = ["flaky", "pytest", "pytest-qt"] + +[[package]] +name = "qtpy" +version = "1.9.0" +description = "Provides an abstraction layer on top of the various Qt bindings (PyQt5, PyQt4 and PySide) and additional custom QWidgets." +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "scikit-learn" +version = "0.24.1" +description = "A set of python modules for machine learning and data mining" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +joblib = ">=0.11" +numpy = ">=1.13.3" +scipy = ">=0.19.1" +threadpoolctl = ">=2.0.0" + +[package.extras] +benchmark = ["matplotlib (>=2.1.1)", "pandas (>=0.25.0)", "memory-profiler (>=0.57.0)"] +docs = ["matplotlib (>=2.1.1)", "scikit-image (>=0.13)", "pandas (>=0.25.0)", "seaborn (>=0.9.0)", "memory-profiler (>=0.57.0)", "sphinx (>=3.2.0)", "sphinx-gallery (>=0.7.0)", "numpydoc (>=1.0.0)", "Pillow (>=7.1.2)", "sphinx-prompt (>=1.3.0)"] +examples = ["matplotlib (>=2.1.1)", "scikit-image (>=0.13)", "pandas (>=0.25.0)", "seaborn (>=0.9.0)"] +tests = ["matplotlib (>=2.1.1)", "scikit-image (>=0.13)", "pandas (>=0.25.0)", "pytest (>=5.0.1)", "pytest-cov (>=2.9.0)", "flake8 (>=3.8.2)", "mypy (>=0.770)", "pyamg (>=4.0.0)"] + +[[package]] +name = "scipy" +version = "1.6.2" +description = "SciPy: Scientific Library for Python" +category = "main" +optional = false +python-versions = ">=3.7,<3.10" + +[package.dependencies] +numpy = ">=1.16.5,<1.23.0" + +[[package]] +name = "send2trash" +version = "1.5.0" +description = "Send file to trash natively under Mac OS X, Windows and Linux." +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "six" +version = "1.15.0" +description = "Python 2 and 3 compatibility utilities" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "sklearn" +version = "0.0" +description = "A set of python modules for machine learning and data mining" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +scikit-learn = "*" + +[[package]] +name = "terminado" +version = "0.9.4" +description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +ptyprocess = {version = "*", markers = "os_name != \"nt\""} +pywinpty = {version = ">=0.5", markers = "os_name == \"nt\""} +tornado = ">=4" + +[package.extras] +test = ["pytest"] + +[[package]] +name = "testpath" +version = "0.4.4" +description = "Test utilities for code working with files and commands" +category = "dev" +optional = false +python-versions = "*" + +[package.extras] +test = ["pathlib2"] + +[[package]] +name = "threadpoolctl" +version = "2.1.0" +description = "threadpoolctl" +category = "main" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "tk" +version = "0.1.0" +description = "TensorKit is a deep learning helper between Python and C++." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "tornado" +version = "6.1" +description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." +category = "dev" +optional = false +python-versions = ">= 3.5" + +[[package]] +name = "tqdm" +version = "4.60.0" +description = "Fast, Extensible Progress Meter" +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" + +[package.extras] +dev = ["py-make (>=0.1.0)", "twine", "wheel"] +notebook = ["ipywidgets (>=6)"] +telegram = ["requests"] + +[[package]] +name = "traitlets" +version = "5.0.5" +description = "Traitlets Python configuration system" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +ipython-genutils = "*" + +[package.extras] +test = ["pytest"] + +[[package]] +name = "wcwidth" +version = "0.2.5" +description = "Measures the displayed width of unicode strings in a terminal" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "webencodings" +version = "0.5.1" +description = "Character encoding aliases for legacy web content" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "widgetsnbextension" +version = "3.5.1" +description = "IPython HTML widgets for Jupyter" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +notebook = ">=4.4.1" + +[metadata] +lock-version = "1.1" +python-versions = ">=3.9,<3.10" +content-hash = "ff48dc5576da2373a03763d5ed8e7a0e8aca758df435e8f46a83da81af5f15b5" + +[metadata.files] +adjusttext = [ + {file = "adjustText-0.7.3.tar.gz", hash = "sha256:b90e275a95b4d980cbbac7967914b8d66477c09bc346a0b3c9e2125bba664b06"}, +] +appnope = [ + {file = "appnope-0.1.2-py2.py3-none-any.whl", hash = "sha256:93aa393e9d6c54c5cd570ccadd8edad61ea0c4b9ea7a01409020c9aa019eb442"}, + {file = "appnope-0.1.2.tar.gz", hash = "sha256:dd83cd4b5b460958838f6eb3000c660b1f9caf2a5b1de4264e941512f603258a"}, +] +argon2-cffi = [ + {file = "argon2-cffi-20.1.0.tar.gz", hash = "sha256:d8029b2d3e4b4cea770e9e5a0104dd8fa185c1724a0f01528ae4826a6d25f97d"}, + {file = "argon2_cffi-20.1.0-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:6ea92c980586931a816d61e4faf6c192b4abce89aa767ff6581e6ddc985ed003"}, + {file = "argon2_cffi-20.1.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:05a8ac07c7026542377e38389638a8a1e9b78f1cd8439cd7493b39f08dd75fbf"}, + {file = "argon2_cffi-20.1.0-cp27-cp27m-win32.whl", hash = "sha256:0bf066bc049332489bb2d75f69216416329d9dc65deee127152caeb16e5ce7d5"}, + {file = "argon2_cffi-20.1.0-cp27-cp27m-win_amd64.whl", hash = "sha256:57358570592c46c420300ec94f2ff3b32cbccd10d38bdc12dc6979c4a8484fbc"}, + {file = "argon2_cffi-20.1.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:7d455c802727710e9dfa69b74ccaab04568386ca17b0ad36350b622cd34606fe"}, + {file = "argon2_cffi-20.1.0-cp35-abi3-manylinux1_x86_64.whl", hash = "sha256:b160416adc0f012fb1f12588a5e6954889510f82f698e23ed4f4fa57f12a0647"}, + {file = "argon2_cffi-20.1.0-cp35-cp35m-win32.whl", hash = "sha256:9bee3212ba4f560af397b6d7146848c32a800652301843df06b9e8f68f0f7361"}, + {file = "argon2_cffi-20.1.0-cp35-cp35m-win_amd64.whl", hash = "sha256:392c3c2ef91d12da510cfb6f9bae52512a4552573a9e27600bdb800e05905d2b"}, + {file = "argon2_cffi-20.1.0-cp36-cp36m-win32.whl", hash = "sha256:ba7209b608945b889457f949cc04c8e762bed4fe3fec88ae9a6b7765ae82e496"}, + {file = "argon2_cffi-20.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:da7f0445b71db6d3a72462e04f36544b0de871289b0bc8a7cc87c0f5ec7079fa"}, + {file = "argon2_cffi-20.1.0-cp37-abi3-macosx_10_6_intel.whl", hash = "sha256:cc0e028b209a5483b6846053d5fd7165f460a1f14774d79e632e75e7ae64b82b"}, + {file = "argon2_cffi-20.1.0-cp37-cp37m-win32.whl", hash = "sha256:18dee20e25e4be86680b178b35ccfc5d495ebd5792cd00781548d50880fee5c5"}, + {file = "argon2_cffi-20.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:6678bb047373f52bcff02db8afab0d2a77d83bde61cfecea7c5c62e2335cb203"}, + {file = "argon2_cffi-20.1.0-cp38-cp38-win32.whl", hash = "sha256:77e909cc756ef81d6abb60524d259d959bab384832f0c651ed7dcb6e5ccdbb78"}, + {file = "argon2_cffi-20.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:9dfd5197852530294ecb5795c97a823839258dfd5eb9420233c7cfedec2058f2"}, + {file = "argon2_cffi-20.1.0-cp39-cp39-win32.whl", hash = "sha256:e2db6e85c057c16d0bd3b4d2b04f270a7467c147381e8fd73cbbe5bc719832be"}, + {file = "argon2_cffi-20.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:8a84934bd818e14a17943de8099d41160da4a336bcc699bb4c394bbb9b94bd32"}, +] +async-generator = [ + {file = "async_generator-1.10-py3-none-any.whl", hash = "sha256:01c7bf666359b4967d2cda0000cc2e4af16a0ae098cbffcb8472fb9e8ad6585b"}, + {file = "async_generator-1.10.tar.gz", hash = "sha256:6ebb3d106c12920aaae42ccb6f787ef5eefdcdd166ea3d628fa8476abe712144"}, +] +attrs = [ + {file = "attrs-20.3.0-py2.py3-none-any.whl", hash = "sha256:31b2eced602aa8423c2aea9c76a724617ed67cf9513173fd3a4f03e3a929c7e6"}, + {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, +] +backcall = [ + {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, + {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, +] +bleach = [ + {file = "bleach-3.3.0-py2.py3-none-any.whl", hash = "sha256:6123ddc1052673e52bab52cdc955bcb57a015264a1c57d37bea2f6b817af0125"}, + {file = "bleach-3.3.0.tar.gz", hash = "sha256:98b3170739e5e83dd9dc19633f074727ad848cbedb6026708c8ac2d3b697a433"}, +] +cffi = [ + {file = "cffi-1.14.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:bb89f306e5da99f4d922728ddcd6f7fcebb3241fc40edebcb7284d7514741991"}, + {file = "cffi-1.14.5-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:34eff4b97f3d982fb93e2831e6750127d1355a923ebaeeb565407b3d2f8d41a1"}, + {file = "cffi-1.14.5-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:99cd03ae7988a93dd00bcd9d0b75e1f6c426063d6f03d2f90b89e29b25b82dfa"}, + {file = "cffi-1.14.5-cp27-cp27m-win32.whl", hash = "sha256:65fa59693c62cf06e45ddbb822165394a288edce9e276647f0046e1ec26920f3"}, + {file = "cffi-1.14.5-cp27-cp27m-win_amd64.whl", hash = "sha256:51182f8927c5af975fece87b1b369f722c570fe169f9880764b1ee3bca8347b5"}, + {file = "cffi-1.14.5-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:43e0b9d9e2c9e5d152946b9c5fe062c151614b262fda2e7b201204de0b99e482"}, + {file = "cffi-1.14.5-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:cbde590d4faaa07c72bf979734738f328d239913ba3e043b1e98fe9a39f8b2b6"}, + {file = "cffi-1.14.5-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:5de7970188bb46b7bf9858eb6890aad302577a5f6f75091fd7cdd3ef13ef3045"}, + {file = "cffi-1.14.5-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:a465da611f6fa124963b91bf432d960a555563efe4ed1cc403ba5077b15370aa"}, + {file = "cffi-1.14.5-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:d42b11d692e11b6634f7613ad8df5d6d5f8875f5d48939520d351007b3c13406"}, + {file = "cffi-1.14.5-cp35-cp35m-win32.whl", hash = "sha256:72d8d3ef52c208ee1c7b2e341f7d71c6fd3157138abf1a95166e6165dd5d4369"}, + {file = "cffi-1.14.5-cp35-cp35m-win_amd64.whl", hash = "sha256:29314480e958fd8aab22e4a58b355b629c59bf5f2ac2492b61e3dc06d8c7a315"}, + {file = "cffi-1.14.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:3d3dd4c9e559eb172ecf00a2a7517e97d1e96de2a5e610bd9b68cea3925b4892"}, + {file = "cffi-1.14.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:48e1c69bbacfc3d932221851b39d49e81567a4d4aac3b21258d9c24578280058"}, + {file = "cffi-1.14.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:69e395c24fc60aad6bb4fa7e583698ea6cc684648e1ffb7fe85e3c1ca131a7d5"}, + {file = "cffi-1.14.5-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:9e93e79c2551ff263400e1e4be085a1210e12073a31c2011dbbda14bda0c6132"}, + {file = "cffi-1.14.5-cp36-cp36m-win32.whl", hash = "sha256:58e3f59d583d413809d60779492342801d6e82fefb89c86a38e040c16883be53"}, + {file = "cffi-1.14.5-cp36-cp36m-win_amd64.whl", hash = "sha256:005a36f41773e148deac64b08f233873a4d0c18b053d37da83f6af4d9087b813"}, + {file = "cffi-1.14.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2894f2df484ff56d717bead0a5c2abb6b9d2bf26d6960c4604d5c48bbc30ee73"}, + {file = "cffi-1.14.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:0857f0ae312d855239a55c81ef453ee8fd24136eaba8e87a2eceba644c0d4c06"}, + {file = "cffi-1.14.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:cd2868886d547469123fadc46eac7ea5253ea7fcb139f12e1dfc2bbd406427d1"}, + {file = "cffi-1.14.5-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:35f27e6eb43380fa080dccf676dece30bef72e4a67617ffda586641cd4508d49"}, + {file = "cffi-1.14.5-cp37-cp37m-win32.whl", hash = "sha256:9ff227395193126d82e60319a673a037d5de84633f11279e336f9c0f189ecc62"}, + {file = "cffi-1.14.5-cp37-cp37m-win_amd64.whl", hash = "sha256:9cf8022fb8d07a97c178b02327b284521c7708d7c71a9c9c355c178ac4bbd3d4"}, + {file = "cffi-1.14.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8b198cec6c72df5289c05b05b8b0969819783f9418e0409865dac47288d2a053"}, + {file = "cffi-1.14.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:ad17025d226ee5beec591b52800c11680fca3df50b8b29fe51d882576e039ee0"}, + {file = "cffi-1.14.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6c97d7350133666fbb5cf4abdc1178c812cb205dc6f41d174a7b0f18fb93337e"}, + {file = "cffi-1.14.5-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8ae6299f6c68de06f136f1f9e69458eae58f1dacf10af5c17353eae03aa0d827"}, + {file = "cffi-1.14.5-cp38-cp38-win32.whl", hash = "sha256:b85eb46a81787c50650f2392b9b4ef23e1f126313b9e0e9013b35c15e4288e2e"}, + {file = "cffi-1.14.5-cp38-cp38-win_amd64.whl", hash = "sha256:1f436816fc868b098b0d63b8920de7d208c90a67212546d02f84fe78a9c26396"}, + {file = "cffi-1.14.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1071534bbbf8cbb31b498d5d9db0f274f2f7a865adca4ae429e147ba40f73dea"}, + {file = "cffi-1.14.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:9de2e279153a443c656f2defd67769e6d1e4163952b3c622dcea5b08a6405322"}, + {file = "cffi-1.14.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:6e4714cc64f474e4d6e37cfff31a814b509a35cb17de4fb1999907575684479c"}, + {file = "cffi-1.14.5-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:158d0d15119b4b7ff6b926536763dc0714313aa59e320ddf787502c70c4d4bee"}, + {file = "cffi-1.14.5-cp39-cp39-win32.whl", hash = "sha256:afb29c1ba2e5a3736f1c301d9d0abe3ec8b86957d04ddfa9d7a6a42b9367e396"}, + {file = "cffi-1.14.5-cp39-cp39-win_amd64.whl", hash = "sha256:f2d45f97ab6bb54753eab54fffe75aaf3de4ff2341c9daee1987ee1837636f1d"}, + {file = "cffi-1.14.5.tar.gz", hash = "sha256:fd78e5fee591709f32ef6edb9a015b4aa1a5022598e36227500c8f4e02328d9c"}, +] +colorama = [ + {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, + {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, +] +cycler = [ + {file = "cycler-0.10.0-py2.py3-none-any.whl", hash = "sha256:1d8a5ae1ff6c5cf9b93e8811e581232ad8920aeec647c37316ceac982b08cb2d"}, + {file = "cycler-0.10.0.tar.gz", hash = "sha256:cd7b2d1018258d7247a71425e9f26463dfb444d411c39569972f4ce586b0c9d8"}, +] +decorator = [ + {file = "decorator-5.0.6-py3-none-any.whl", hash = "sha256:d9f2d2863183a3c0df05f4b786f2e6b8752c093b3547a558f287bf3022fd2bf4"}, + {file = "decorator-5.0.6.tar.gz", hash = "sha256:f2e71efb39412bfd23d878e896a51b07744f2e2250b2e87d158e76828c5ae202"}, +] +defusedxml = [ + {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, + {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, +] +entrypoints = [ + {file = "entrypoints-0.3-py2.py3-none-any.whl", hash = "sha256:589f874b313739ad35be6e0cd7efde2a4e9b6fea91edcc34e58ecbb8dbe56d19"}, + {file = "entrypoints-0.3.tar.gz", hash = "sha256:c70dd71abe5a8c85e55e12c19bd91ccfeec11a6e99044204511f9ed547d48451"}, +] +ipykernel = [ + {file = "ipykernel-5.5.3-py3-none-any.whl", hash = "sha256:21abd584543759e49010975a4621603b3cf871b1039cb3879a14094717692614"}, + {file = "ipykernel-5.5.3.tar.gz", hash = "sha256:a682e4f7affd86d9ce9b699d21bcab6d5ec9fbb2bfcb194f2706973b252bc509"}, +] +ipython = [ + {file = "ipython-7.22.0-py3-none-any.whl", hash = "sha256:c0ce02dfaa5f854809ab7413c601c4543846d9da81010258ecdab299b542d199"}, + {file = "ipython-7.22.0.tar.gz", hash = "sha256:9c900332d4c5a6de534b4befeeb7de44ad0cc42e8327fa41b7685abde58cec74"}, +] +ipython-genutils = [ + {file = "ipython_genutils-0.2.0-py2.py3-none-any.whl", hash = "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8"}, + {file = "ipython_genutils-0.2.0.tar.gz", hash = "sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8"}, +] +ipywidgets = [ + {file = "ipywidgets-7.6.3-py2.py3-none-any.whl", hash = "sha256:e6513cfdaf5878de30f32d57f6dc2474da395a2a2991b94d487406c0ab7f55ca"}, + {file = "ipywidgets-7.6.3.tar.gz", hash = "sha256:9f1a43e620530f9e570e4a493677d25f08310118d315b00e25a18f12913c41f0"}, +] +jedi = [ + {file = "jedi-0.18.0-py2.py3-none-any.whl", hash = "sha256:18456d83f65f400ab0c2d3319e48520420ef43b23a086fdc05dff34132f0fb93"}, + {file = "jedi-0.18.0.tar.gz", hash = "sha256:92550a404bad8afed881a137ec9a461fed49eca661414be45059329614ed0707"}, +] +jinja2 = [ + {file = "Jinja2-2.11.3-py2.py3-none-any.whl", hash = "sha256:03e47ad063331dd6a3f04a43eddca8a966a26ba0c5b7207a9a9e4e08f1b29419"}, + {file = "Jinja2-2.11.3.tar.gz", hash = "sha256:a6d58433de0ae800347cab1fa3043cebbabe8baa9d29e668f1c768cb87a333c6"}, +] +joblib = [ + {file = "joblib-1.0.1-py3-none-any.whl", hash = "sha256:feeb1ec69c4d45129954f1b7034954241eedfd6ba39b5e9e4b6883be3332d5e5"}, + {file = "joblib-1.0.1.tar.gz", hash = "sha256:9c17567692206d2f3fb9ecf5e991084254fe631665c450b443761c4186a613f7"}, +] +jsonschema = [ + {file = "jsonschema-3.2.0-py2.py3-none-any.whl", hash = "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163"}, + {file = "jsonschema-3.2.0.tar.gz", hash = "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a"}, +] +jupyter = [ + {file = "jupyter-1.0.0-py2.py3-none-any.whl", hash = "sha256:5b290f93b98ffbc21c0c7e749f054b3267782166d72fa5e3ed1ed4eaf34a2b78"}, + {file = "jupyter-1.0.0.tar.gz", hash = "sha256:d9dc4b3318f310e34c82951ea5d6683f67bed7def4b259fafbfe4f1beb1d8e5f"}, + {file = "jupyter-1.0.0.zip", hash = "sha256:3e1f86076bbb7c8c207829390305a2b1fe836d471ed54be66a3b8c41e7f46cc7"}, +] +jupyter-client = [ + {file = "jupyter_client-6.2.0-py3-none-any.whl", hash = "sha256:9715152067e3f7ea3b56f341c9a0f9715c8c7cc316ee0eb13c3c84f5ca0065f5"}, + {file = "jupyter_client-6.2.0.tar.gz", hash = "sha256:e2ab61d79fbf8b56734a4c2499f19830fbd7f6fefb3e87868ef0545cb3c17eb9"}, +] +jupyter-console = [ + {file = "jupyter_console-6.4.0-py3-none-any.whl", hash = "sha256:7799c4ea951e0e96ba8260575423cb323ea5a03fcf5503560fa3e15748869e27"}, + {file = "jupyter_console-6.4.0.tar.gz", hash = "sha256:242248e1685039cd8bff2c2ecb7ce6c1546eb50ee3b08519729e6e881aec19c7"}, +] +jupyter-core = [ + {file = "jupyter_core-4.7.1-py3-none-any.whl", hash = "sha256:8c6c0cac5c1b563622ad49321d5ec47017bd18b94facb381c6973a0486395f8e"}, + {file = "jupyter_core-4.7.1.tar.gz", hash = "sha256:79025cb3225efcd36847d0840f3fc672c0abd7afd0de83ba8a1d3837619122b4"}, +] +jupyterlab-pygments = [ + {file = "jupyterlab_pygments-0.1.2-py2.py3-none-any.whl", hash = "sha256:abfb880fd1561987efaefcb2d2ac75145d2a5d0139b1876d5be806e32f630008"}, + {file = "jupyterlab_pygments-0.1.2.tar.gz", hash = "sha256:cfcda0873626150932f438eccf0f8bf22bfa92345b814890ab360d666b254146"}, +] +jupyterlab-widgets = [ + {file = "jupyterlab_widgets-1.0.0-py3-none-any.whl", hash = "sha256:caeaf3e6103180e654e7d8d2b81b7d645e59e432487c1d35a41d6d3ee56b3fef"}, + {file = "jupyterlab_widgets-1.0.0.tar.gz", hash = "sha256:5c1a29a84d3069208cb506b10609175b249b6486d6b1cbae8fcde2a11584fb78"}, +] +kiwisolver = [ + {file = "kiwisolver-1.3.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:fd34fbbfbc40628200730bc1febe30631347103fc8d3d4fa012c21ab9c11eca9"}, + {file = "kiwisolver-1.3.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:d3155d828dec1d43283bd24d3d3e0d9c7c350cdfcc0bd06c0ad1209c1bbc36d0"}, + {file = "kiwisolver-1.3.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:5a7a7dbff17e66fac9142ae2ecafb719393aaee6a3768c9de2fd425c63b53e21"}, + {file = "kiwisolver-1.3.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:f8d6f8db88049a699817fd9178782867bf22283e3813064302ac59f61d95be05"}, + {file = "kiwisolver-1.3.1-cp36-cp36m-manylinux2014_ppc64le.whl", hash = "sha256:5f6ccd3dd0b9739edcf407514016108e2280769c73a85b9e59aa390046dbf08b"}, + {file = "kiwisolver-1.3.1-cp36-cp36m-win32.whl", hash = "sha256:225e2e18f271e0ed8157d7f4518ffbf99b9450fca398d561eb5c4a87d0986dd9"}, + {file = "kiwisolver-1.3.1-cp36-cp36m-win_amd64.whl", hash = "sha256:cf8b574c7b9aa060c62116d4181f3a1a4e821b2ec5cbfe3775809474113748d4"}, + {file = "kiwisolver-1.3.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:232c9e11fd7ac3a470d65cd67e4359eee155ec57e822e5220322d7b2ac84fbf0"}, + {file = "kiwisolver-1.3.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:b38694dcdac990a743aa654037ff1188c7a9801ac3ccc548d3341014bc5ca278"}, + {file = "kiwisolver-1.3.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:ca3820eb7f7faf7f0aa88de0e54681bddcb46e485beb844fcecbcd1c8bd01689"}, + {file = "kiwisolver-1.3.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:c8fd0f1ae9d92b42854b2979024d7597685ce4ada367172ed7c09edf2cef9cb8"}, + {file = "kiwisolver-1.3.1-cp37-cp37m-manylinux2014_ppc64le.whl", hash = "sha256:1e1bc12fb773a7b2ffdeb8380609f4f8064777877b2225dec3da711b421fda31"}, + {file = "kiwisolver-1.3.1-cp37-cp37m-win32.whl", hash = "sha256:72c99e39d005b793fb7d3d4e660aed6b6281b502e8c1eaf8ee8346023c8e03bc"}, + {file = "kiwisolver-1.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:8be8d84b7d4f2ba4ffff3665bcd0211318aa632395a1a41553250484a871d454"}, + {file = "kiwisolver-1.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:31dfd2ac56edc0ff9ac295193eeaea1c0c923c0355bf948fbd99ed6018010b72"}, + {file = "kiwisolver-1.3.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:563c649cfdef27d081c84e72a03b48ea9408c16657500c312575ae9d9f7bc1c3"}, + {file = "kiwisolver-1.3.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:78751b33595f7f9511952e7e60ce858c6d64db2e062afb325985ddbd34b5c131"}, + {file = "kiwisolver-1.3.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:a357fd4f15ee49b4a98b44ec23a34a95f1e00292a139d6015c11f55774ef10de"}, + {file = "kiwisolver-1.3.1-cp38-cp38-manylinux2014_ppc64le.whl", hash = "sha256:5989db3b3b34b76c09253deeaf7fbc2707616f130e166996606c284395da3f18"}, + {file = "kiwisolver-1.3.1-cp38-cp38-win32.whl", hash = "sha256:c08e95114951dc2090c4a630c2385bef681cacf12636fb0241accdc6b303fd81"}, + {file = "kiwisolver-1.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:44a62e24d9b01ba94ae7a4a6c3fb215dc4af1dde817e7498d901e229aaf50e4e"}, + {file = "kiwisolver-1.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:50af681a36b2a1dee1d3c169ade9fdc59207d3c31e522519181e12f1b3ba7000"}, + {file = "kiwisolver-1.3.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:a53d27d0c2a0ebd07e395e56a1fbdf75ffedc4a05943daf472af163413ce9598"}, + {file = "kiwisolver-1.3.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:834ee27348c4aefc20b479335fd422a2c69db55f7d9ab61721ac8cd83eb78882"}, + {file = "kiwisolver-1.3.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:5c3e6455341008a054cccee8c5d24481bcfe1acdbc9add30aa95798e95c65621"}, + {file = "kiwisolver-1.3.1-cp39-cp39-manylinux2014_ppc64le.whl", hash = "sha256:acef3d59d47dd85ecf909c359d0fd2c81ed33bdff70216d3956b463e12c38a54"}, + {file = "kiwisolver-1.3.1-cp39-cp39-win32.whl", hash = "sha256:c5518d51a0735b1e6cee1fdce66359f8d2b59c3ca85dc2b0813a8aa86818a030"}, + {file = "kiwisolver-1.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:b9edd0110a77fc321ab090aaa1cfcaba1d8499850a12848b81be2222eab648f6"}, + {file = "kiwisolver-1.3.1-pp36-pypy36_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0cd53f403202159b44528498de18f9285b04482bab2a6fc3f5dd8dbb9352e30d"}, + {file = "kiwisolver-1.3.1-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:33449715e0101e4d34f64990352bce4095c8bf13bed1b390773fc0a7295967b3"}, + {file = "kiwisolver-1.3.1-pp36-pypy36_pp73-win32.whl", hash = "sha256:401a2e9afa8588589775fe34fc22d918ae839aaaf0c0e96441c0fdbce6d8ebe6"}, + {file = "kiwisolver-1.3.1.tar.gz", hash = "sha256:950a199911a8d94683a6b10321f9345d5a3a8433ec58b217ace979e18f16e248"}, +] +markupsafe = [ + {file = "MarkupSafe-1.1.1-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161"}, + {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7"}, + {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183"}, + {file = "MarkupSafe-1.1.1-cp27-cp27m-win32.whl", hash = "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b"}, + {file = "MarkupSafe-1.1.1-cp27-cp27m-win_amd64.whl", hash = "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e"}, + {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f"}, + {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1"}, + {file = "MarkupSafe-1.1.1-cp34-cp34m-macosx_10_6_intel.whl", hash = "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5"}, + {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1"}, + {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735"}, + {file = "MarkupSafe-1.1.1-cp34-cp34m-win32.whl", hash = "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21"}, + {file = "MarkupSafe-1.1.1-cp34-cp34m-win_amd64.whl", hash = "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235"}, + {file = "MarkupSafe-1.1.1-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b"}, + {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f"}, + {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905"}, + {file = "MarkupSafe-1.1.1-cp35-cp35m-win32.whl", hash = "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1"}, + {file = "MarkupSafe-1.1.1-cp35-cp35m-win_amd64.whl", hash = "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d53bc011414228441014aa71dbec320c66468c1030aae3a6e29778a3382d96e5"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:3b8a6499709d29c2e2399569d96719a1b21dcd94410a586a18526b143ec8470f"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:84dee80c15f1b560d55bcfe6d47b27d070b4681c699c572af2e3c7cc90a3b8e0"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:b1dba4527182c95a0db8b6060cc98ac49b9e2f5e64320e2b56e47cb2831978c7"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-win32.whl", hash = "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:bf5aa3cbcfdf57fa2ee9cd1822c862ef23037f5c832ad09cfea57fa846dec193"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:6fffc775d90dcc9aed1b89219549b329a9250d918fd0b8fa8d93d154918422e1"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:a6a744282b7718a2a62d2ed9d993cad6f5f585605ad352c11de459f4108df0a1"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:195d7d2c4fbb0ee8139a6cf67194f3973a6b3042d742ebe0a9ed36d8b6f0c07f"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-win32.whl", hash = "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:acf08ac40292838b3cbbb06cfe9b2cb9ec78fce8baca31ddb87aaac2e2dc3bc2"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d9be0ba6c527163cbed5e0857c451fcd092ce83947944d6c14bc95441203f032"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:caabedc8323f1e93231b52fc32bdcde6db817623d33e100708d9a68e1f53b26b"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-win32.whl", hash = "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d73a845f227b0bfe8a7455ee623525ee656a9e2e749e4742706d80a6065d5e2c"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:98bae9582248d6cf62321dcb52aaf5d9adf0bad3b40582925ef7c7f0ed85fceb"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:2beec1e0de6924ea551859edb9e7679da6e4870d32cb766240ce17e0a0ba2014"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:7fed13866cf14bba33e7176717346713881f56d9d2bcebab207f7a036f41b850"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:6f1e273a344928347c1290119b493a1f0303c52f5a5eae5f16d74f48c15d4a85"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:feb7b34d6325451ef96bc0e36e1a6c0c1c64bc1fbec4b854f4529e51887b1621"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-win32.whl", hash = "sha256:22c178a091fc6630d0d045bdb5992d2dfe14e3259760e713c490da5323866c39"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:b7d644ddb4dbd407d31ffb699f1d140bc35478da613b441c582aeb7c43838dd8"}, + {file = "MarkupSafe-1.1.1.tar.gz", hash = "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b"}, +] +matplotlib = [ + {file = "matplotlib-3.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7a54efd6fcad9cb3cd5ef2064b5a3eeb0b63c99f26c346bdcf66e7c98294d7cc"}, + {file = "matplotlib-3.4.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:86dc94e44403fa0f2b1dd76c9794d66a34e821361962fe7c4e078746362e3b14"}, + {file = "matplotlib-3.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:574306171b84cd6854c83dc87bc353cacc0f60184149fb00c9ea871eca8c1ecb"}, + {file = "matplotlib-3.4.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:84a10e462120aa7d9eb6186b50917ed5a6286ee61157bfc17c5b47987d1a9068"}, + {file = "matplotlib-3.4.1-cp37-cp37m-win32.whl", hash = "sha256:81e6fe8b18ef5be67f40a1d4f07d5a4ed21d3878530193898449ddef7793952f"}, + {file = "matplotlib-3.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:c45e7bf89ea33a2adaef34774df4e692c7436a18a48bcb0e47a53e698a39fa39"}, + {file = "matplotlib-3.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1f83a32e4b6045191f9d34e4dc68c0a17c870b57ef9cca518e516da591246e79"}, + {file = "matplotlib-3.4.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:a18cc1ab4a35b845cf33b7880c979f5c609fd26c2d6e74ddfacb73dcc60dd956"}, + {file = "matplotlib-3.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:ac2a30a09984c2719f112a574b6543ccb82d020fd1b23b4d55bf4759ba8dd8f5"}, + {file = "matplotlib-3.4.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:a97781453ac79409ddf455fccf344860719d95142f9c334f2a8f3fff049ffec3"}, + {file = "matplotlib-3.4.1-cp38-cp38-win32.whl", hash = "sha256:2eee37340ca1b353e0a43a33da79d0cd4bcb087064a0c3c3d1329cdea8fbc6f3"}, + {file = "matplotlib-3.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:90dbc007f6389bcfd9ef4fe5d4c78c8d2efe4e0ebefd48b4f221cdfed5672be2"}, + {file = "matplotlib-3.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7f16660edf9a8bcc0f766f51c9e1b9d2dc6ceff6bf636d2dbd8eb925d5832dfd"}, + {file = "matplotlib-3.4.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:a989022f89cda417f82dbf65e0a830832afd8af743d05d1414fb49549287ff04"}, + {file = "matplotlib-3.4.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:be4430b33b25e127fc4ea239cc386389de420be4d63e71d5359c20b562951ce1"}, + {file = "matplotlib-3.4.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:7561fd541477d41f3aa09457c434dd1f7604f3bd26d7858d52018f5dfe1c06d1"}, + {file = "matplotlib-3.4.1-cp39-cp39-win32.whl", hash = "sha256:9f374961a3996c2d1b41ba3145462c3708a89759e604112073ed6c8bdf9f622f"}, + {file = "matplotlib-3.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:53ceb12ef44f8982b45adc7a0889a7e2df1d758e8b360f460e435abe8a8cd658"}, + {file = "matplotlib-3.4.1.tar.gz", hash = "sha256:84d4c4f650f356678a5d658a43ca21a41fca13f9b8b00169c0b76e6a6a948908"}, +] +mistune = [ + {file = "mistune-0.8.4-py2.py3-none-any.whl", hash = "sha256:88a1051873018da288eee8538d476dffe1262495144b33ecb586c4ab266bb8d4"}, + {file = "mistune-0.8.4.tar.gz", hash = "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e"}, +] +nbclient = [ + {file = "nbclient-0.5.3-py3-none-any.whl", hash = "sha256:e79437364a2376892b3f46bedbf9b444e5396cfb1bc366a472c37b48e9551500"}, + {file = "nbclient-0.5.3.tar.gz", hash = "sha256:db17271330c68c8c88d46d72349e24c147bb6f34ec82d8481a8f025c4d26589c"}, +] +nbconvert = [ + {file = "nbconvert-6.0.7-py3-none-any.whl", hash = "sha256:39e9f977920b203baea0be67eea59f7b37a761caa542abe80f5897ce3cf6311d"}, + {file = "nbconvert-6.0.7.tar.gz", hash = "sha256:cbbc13a86dfbd4d1b5dee106539de0795b4db156c894c2c5dc382062bbc29002"}, +] +nbformat = [ + {file = "nbformat-5.1.3-py3-none-any.whl", hash = "sha256:eb8447edd7127d043361bc17f2f5a807626bc8e878c7709a1c647abda28a9171"}, + {file = "nbformat-5.1.3.tar.gz", hash = "sha256:b516788ad70771c6250977c1374fcca6edebe6126fd2adb5a69aa5c2356fd1c8"}, +] +nest-asyncio = [ + {file = "nest_asyncio-1.5.1-py3-none-any.whl", hash = "sha256:76d6e972265063fe92a90b9cc4fb82616e07d586b346ed9d2c89a4187acea39c"}, + {file = "nest_asyncio-1.5.1.tar.gz", hash = "sha256:afc5a1c515210a23c461932765691ad39e8eba6551c055ac8d5546e69250d0aa"}, +] +notebook = [ + {file = "notebook-6.3.0-py3-none-any.whl", hash = "sha256:cb271af1e8134e3d6fc6d458bdc79c40cbfc84c1eb036a493f216d58f0880e92"}, + {file = "notebook-6.3.0.tar.gz", hash = "sha256:cbc9398d6c81473e9cdb891d2cae9c0d3718fca289dda6d26df5cb660fcadc7d"}, +] +numpy = [ + {file = "numpy-1.20.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e9459f40244bb02b2f14f6af0cd0732791d72232bbb0dc4bab57ef88e75f6935"}, + {file = "numpy-1.20.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:a8e6859913ec8eeef3dbe9aed3bf475347642d1cdd6217c30f28dee8903528e6"}, + {file = "numpy-1.20.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:9cab23439eb1ebfed1aaec9cd42b7dc50fc96d5cd3147da348d9161f0501ada5"}, + {file = "numpy-1.20.2-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:9c0fab855ae790ca74b27e55240fe4f2a36a364a3f1ebcfd1fb5ac4088f1cec3"}, + {file = "numpy-1.20.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:61d5b4cf73622e4d0c6b83408a16631b670fc045afd6540679aa35591a17fe6d"}, + {file = "numpy-1.20.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:d15007f857d6995db15195217afdbddfcd203dfaa0ba6878a2f580eaf810ecd6"}, + {file = "numpy-1.20.2-cp37-cp37m-win32.whl", hash = "sha256:d76061ae5cab49b83a8cf3feacefc2053fac672728802ac137dd8c4123397677"}, + {file = "numpy-1.20.2-cp37-cp37m-win_amd64.whl", hash = "sha256:bad70051de2c50b1a6259a6df1daaafe8c480ca98132da98976d8591c412e737"}, + {file = "numpy-1.20.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:719656636c48be22c23641859ff2419b27b6bdf844b36a2447cb39caceb00935"}, + {file = "numpy-1.20.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:aa046527c04688af680217fffac61eec2350ef3f3d7320c07fd33f5c6e7b4d5f"}, + {file = "numpy-1.20.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:2428b109306075d89d21135bdd6b785f132a1f5a3260c371cee1fae427e12727"}, + {file = "numpy-1.20.2-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:e8e4fbbb7e7634f263c5b0150a629342cc19b47c5eba8d1cd4363ab3455ab576"}, + {file = "numpy-1.20.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:edb1f041a9146dcf02cd7df7187db46ab524b9af2515f392f337c7cbbf5b52cd"}, + {file = "numpy-1.20.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:c73a7975d77f15f7f68dacfb2bca3d3f479f158313642e8ea9058eea06637931"}, + {file = "numpy-1.20.2-cp38-cp38-win32.whl", hash = "sha256:6c915ee7dba1071554e70a3664a839fbc033e1d6528199d4621eeaaa5487ccd2"}, + {file = "numpy-1.20.2-cp38-cp38-win_amd64.whl", hash = "sha256:471c0571d0895c68da309dacee4e95a0811d0a9f9f532a48dc1bea5f3b7ad2b7"}, + {file = "numpy-1.20.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4703b9e937df83f5b6b7447ca5912b5f5f297aba45f91dbbbc63ff9278c7aa98"}, + {file = "numpy-1.20.2-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:abc81829c4039e7e4c30f7897938fa5d4916a09c2c7eb9b244b7a35ddc9656f4"}, + {file = "numpy-1.20.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:377751954da04d4a6950191b20539066b4e19e3b559d4695399c5e8e3e683bf6"}, + {file = "numpy-1.20.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:6e51e417d9ae2e7848314994e6fc3832c9d426abce9328cf7571eefceb43e6c9"}, + {file = "numpy-1.20.2-cp39-cp39-win32.whl", hash = "sha256:780ae5284cb770ade51d4b4a7dce4faa554eb1d88a56d0e8b9f35fca9b0270ff"}, + {file = "numpy-1.20.2-cp39-cp39-win_amd64.whl", hash = "sha256:924dc3f83de20437de95a73516f36e09918e9c9c18d5eac520062c49191025fb"}, + {file = "numpy-1.20.2-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:97ce8b8ace7d3b9288d88177e66ee75480fb79b9cf745e91ecfe65d91a856042"}, + {file = "numpy-1.20.2.zip", hash = "sha256:878922bf5ad7550aa044aa9301d417e2d3ae50f0f577de92051d739ac6096cee"}, +] +packaging = [ + {file = "packaging-20.9-py2.py3-none-any.whl", hash = "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a"}, + {file = "packaging-20.9.tar.gz", hash = "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5"}, +] +pandocfilters = [ + {file = "pandocfilters-1.4.3.tar.gz", hash = "sha256:bc63fbb50534b4b1f8ebe1860889289e8af94a23bff7445259592df25a3906eb"}, +] +parso = [ + {file = "parso-0.8.2-py2.py3-none-any.whl", hash = "sha256:a8c4922db71e4fdb90e0d0bc6e50f9b273d3397925e5e60a717e719201778d22"}, + {file = "parso-0.8.2.tar.gz", hash = "sha256:12b83492c6239ce32ff5eed6d3639d6a536170723c6f3f1506869f1ace413398"}, +] +pexpect = [ + {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, + {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, +] +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-8.2.0-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:dc38f57d8f20f06dd7c3161c59ca2c86893632623f33a42d592f097b00f720a9"}, + {file = "Pillow-8.2.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:a013cbe25d20c2e0c4e85a9daf438f85121a4d0344ddc76e33fd7e3965d9af4b"}, + {file = "Pillow-8.2.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:8bb1e155a74e1bfbacd84555ea62fa21c58e0b4e7e6b20e4447b8d07990ac78b"}, + {file = "Pillow-8.2.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:c5236606e8570542ed424849f7852a0ff0bce2c4c8d0ba05cc202a5a9c97dee9"}, + {file = "Pillow-8.2.0-cp36-cp36m-win32.whl", hash = "sha256:12e5e7471f9b637762453da74e390e56cc43e486a88289995c1f4c1dc0bfe727"}, + {file = "Pillow-8.2.0-cp36-cp36m-win_amd64.whl", hash = "sha256:5afe6b237a0b81bd54b53f835a153770802f164c5570bab5e005aad693dab87f"}, + {file = "Pillow-8.2.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:cb7a09e173903541fa888ba010c345893cd9fc1b5891aaf060f6ca77b6a3722d"}, + {file = "Pillow-8.2.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:0d19d70ee7c2ba97631bae1e7d4725cdb2ecf238178096e8c82ee481e189168a"}, + {file = "Pillow-8.2.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:083781abd261bdabf090ad07bb69f8f5599943ddb539d64497ed021b2a67e5a9"}, + {file = "Pillow-8.2.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:c6b39294464b03457f9064e98c124e09008b35a62e3189d3513e5148611c9388"}, + {file = "Pillow-8.2.0-cp37-cp37m-win32.whl", hash = "sha256:01425106e4e8cee195a411f729cff2a7d61813b0b11737c12bd5991f5f14bcd5"}, + {file = "Pillow-8.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:3b570f84a6161cf8865c4e08adf629441f56e32f180f7aa4ccbd2e0a5a02cba2"}, + {file = "Pillow-8.2.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:031a6c88c77d08aab84fecc05c3cde8414cd6f8406f4d2b16fed1e97634cc8a4"}, + {file = "Pillow-8.2.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:66cc56579fd91f517290ab02c51e3a80f581aba45fd924fcdee01fa06e635812"}, + {file = "Pillow-8.2.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6c32cc3145928c4305d142ebec682419a6c0a8ce9e33db900027ddca1ec39178"}, + {file = "Pillow-8.2.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:624b977355cde8b065f6d51b98497d6cd5fbdd4f36405f7a8790e3376125e2bb"}, + {file = "Pillow-8.2.0-cp38-cp38-win32.whl", hash = "sha256:5cbf3e3b1014dddc45496e8cf38b9f099c95a326275885199f427825c6522232"}, + {file = "Pillow-8.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:463822e2f0d81459e113372a168f2ff59723e78528f91f0bd25680ac185cf797"}, + {file = "Pillow-8.2.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:95d5ef984eff897850f3a83883363da64aae1000e79cb3c321915468e8c6add5"}, + {file = "Pillow-8.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b91c36492a4bbb1ee855b7d16fe51379e5f96b85692dc8210831fbb24c43e484"}, + {file = "Pillow-8.2.0-cp39-cp39-manylinux1_i686.whl", hash = "sha256:d68cb92c408261f806b15923834203f024110a2e2872ecb0bd2a110f89d3c602"}, + {file = "Pillow-8.2.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f217c3954ce5fd88303fc0c317af55d5e0204106d86dea17eb8205700d47dec2"}, + {file = "Pillow-8.2.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:5b70110acb39f3aff6b74cf09bb4169b167e2660dabc304c1e25b6555fa781ef"}, + {file = "Pillow-8.2.0-cp39-cp39-win32.whl", hash = "sha256:a7d5e9fad90eff8f6f6106d3b98b553a88b6f976e51fce287192a5d2d5363713"}, + {file = "Pillow-8.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:238c197fc275b475e87c1453b05b467d2d02c2915fdfdd4af126145ff2e4610c"}, + {file = "Pillow-8.2.0-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:0e04d61f0064b545b989126197930807c86bcbd4534d39168f4aa5fda39bb8f9"}, + {file = "Pillow-8.2.0-pp36-pypy36_pp73-manylinux2010_i686.whl", hash = "sha256:63728564c1410d99e6d1ae8e3b810fe012bc440952168af0a2877e8ff5ab96b9"}, + {file = "Pillow-8.2.0-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:c03c07ed32c5324939b19e36ae5f75c660c81461e312a41aea30acdd46f93a7c"}, + {file = "Pillow-8.2.0-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:4d98abdd6b1e3bf1a1cbb14c3895226816e666749ac040c4e2554231068c639b"}, + {file = "Pillow-8.2.0-pp37-pypy37_pp73-manylinux2010_i686.whl", hash = "sha256:aac00e4bc94d1b7813fe882c28990c1bc2f9d0e1aa765a5f2b516e8a6a16a9e4"}, + {file = "Pillow-8.2.0-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:22fd0f42ad15dfdde6c581347eaa4adb9a6fc4b865f90b23378aa7914895e120"}, + {file = "Pillow-8.2.0-pp37-pypy37_pp73-win32.whl", hash = "sha256:e98eca29a05913e82177b3ba3d198b1728e164869c613d76d0de4bde6768a50e"}, + {file = "Pillow-8.2.0.tar.gz", hash = "sha256:a787ab10d7bb5494e5f76536ac460741788f1fbce851068d73a87ca7c35fc3e1"}, +] +prometheus-client = [ + {file = "prometheus_client-0.10.1-py2.py3-none-any.whl", hash = "sha256:030e4f9df5f53db2292eec37c6255957eb76168c6f974e4176c711cf91ed34aa"}, + {file = "prometheus_client-0.10.1.tar.gz", hash = "sha256:b6c5a9643e3545bcbfd9451766cbaa5d9c67e7303c7bc32c750b6fa70ecb107d"}, +] +prompt-toolkit = [ + {file = "prompt_toolkit-3.0.18-py3-none-any.whl", hash = "sha256:bf00f22079f5fadc949f42ae8ff7f05702826a97059ffcc6281036ad40ac6f04"}, + {file = "prompt_toolkit-3.0.18.tar.gz", hash = "sha256:e1b4f11b9336a28fa11810bc623c357420f69dfdb6d2dac41ca2c21a55c033bc"}, +] +ptyprocess = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] +py = [ + {file = "py-1.10.0-py2.py3-none-any.whl", hash = "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a"}, + {file = "py-1.10.0.tar.gz", hash = "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3"}, +] +pycparser = [ + {file = "pycparser-2.20-py2.py3-none-any.whl", hash = "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705"}, + {file = "pycparser-2.20.tar.gz", hash = "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0"}, +] +pygments = [ + {file = "Pygments-2.8.1-py3-none-any.whl", hash = "sha256:534ef71d539ae97d4c3a4cf7d6f110f214b0e687e92f9cb9d2a3b0d3101289c8"}, + {file = "Pygments-2.8.1.tar.gz", hash = "sha256:2656e1a6edcdabf4275f9a3640db59fd5de107d88e8663c5d4e9a0fa62f77f94"}, +] +pyparsing = [ + {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, + {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, +] +pyrsistent = [ + {file = "pyrsistent-0.17.3.tar.gz", hash = "sha256:2e636185d9eb976a18a8a8e96efce62f2905fea90041958d8cc2a189756ebf3e"}, +] +python-dateutil = [ + {file = "python-dateutil-2.8.1.tar.gz", hash = "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c"}, + {file = "python_dateutil-2.8.1-py2.py3-none-any.whl", hash = "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a"}, +] +pywin32 = [ + {file = "pywin32-300-cp35-cp35m-win32.whl", hash = "sha256:1c204a81daed2089e55d11eefa4826c05e604d27fe2be40b6bf8db7b6a39da63"}, + {file = "pywin32-300-cp35-cp35m-win_amd64.whl", hash = "sha256:350c5644775736351b77ba68da09a39c760d75d2467ecec37bd3c36a94fbed64"}, + {file = "pywin32-300-cp36-cp36m-win32.whl", hash = "sha256:a3b4c48c852d4107e8a8ec980b76c94ce596ea66d60f7a697582ea9dce7e0db7"}, + {file = "pywin32-300-cp36-cp36m-win_amd64.whl", hash = "sha256:27a30b887afbf05a9cbb05e3ffd43104a9b71ce292f64a635389dbad0ed1cd85"}, + {file = "pywin32-300-cp37-cp37m-win32.whl", hash = "sha256:d7e8c7efc221f10d6400c19c32a031add1c4a58733298c09216f57b4fde110dc"}, + {file = "pywin32-300-cp37-cp37m-win_amd64.whl", hash = "sha256:8151e4d7a19262d6694162d6da85d99a16f8b908949797fd99c83a0bfaf5807d"}, + {file = "pywin32-300-cp38-cp38-win32.whl", hash = "sha256:fbb3b1b0fbd0b4fc2a3d1d81fe0783e30062c1abed1d17c32b7879d55858cfae"}, + {file = "pywin32-300-cp38-cp38-win_amd64.whl", hash = "sha256:60a8fa361091b2eea27f15718f8eb7f9297e8d51b54dbc4f55f3d238093d5190"}, + {file = "pywin32-300-cp39-cp39-win32.whl", hash = "sha256:638b68eea5cfc8def537e43e9554747f8dee786b090e47ead94bfdafdb0f2f50"}, + {file = "pywin32-300-cp39-cp39-win_amd64.whl", hash = "sha256:b1609ce9bd5c411b81f941b246d683d6508992093203d4eb7f278f4ed1085c3f"}, +] +pywinpty = [ + {file = "pywinpty-0.5.7-cp27-cp27m-win32.whl", hash = "sha256:b358cb552c0f6baf790de375fab96524a0498c9df83489b8c23f7f08795e966b"}, + {file = "pywinpty-0.5.7-cp27-cp27m-win_amd64.whl", hash = "sha256:1e525a4de05e72016a7af27836d512db67d06a015aeaf2fa0180f8e6a039b3c2"}, + {file = "pywinpty-0.5.7-cp35-cp35m-win32.whl", hash = "sha256:2740eeeb59297593a0d3f762269b01d0285c1b829d6827445fcd348fb47f7e70"}, + {file = "pywinpty-0.5.7-cp35-cp35m-win_amd64.whl", hash = "sha256:33df97f79843b2b8b8bc5c7aaf54adec08cc1bae94ee99dfb1a93c7a67704d95"}, + {file = "pywinpty-0.5.7-cp36-cp36m-win32.whl", hash = "sha256:e854211df55d107f0edfda8a80b39dfc87015bef52a8fe6594eb379240d81df2"}, + {file = "pywinpty-0.5.7-cp36-cp36m-win_amd64.whl", hash = "sha256:dbd838de92de1d4ebf0dce9d4d5e4fc38d0b7b1de837947a18b57a882f219139"}, + {file = "pywinpty-0.5.7-cp37-cp37m-win32.whl", hash = "sha256:5fb2c6c6819491b216f78acc2c521b9df21e0f53b9a399d58a5c151a3c4e2a2d"}, + {file = "pywinpty-0.5.7-cp37-cp37m-win_amd64.whl", hash = "sha256:dd22c8efacf600730abe4a46c1388355ce0d4ab75dc79b15d23a7bd87bf05b48"}, + {file = "pywinpty-0.5.7-cp38-cp38-win_amd64.whl", hash = "sha256:8fc5019ff3efb4f13708bd3b5ad327589c1a554cb516d792527361525a7cb78c"}, + {file = "pywinpty-0.5.7.tar.gz", hash = "sha256:2d7e9c881638a72ffdca3f5417dd1563b60f603e1b43e5895674c2a1b01f95a0"}, +] +pyzmq = [ + {file = "pyzmq-22.0.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c0cde362075ee8f3d2b0353b283e203c2200243b5a15d5c5c03b78112a17e7d4"}, + {file = "pyzmq-22.0.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:ff1ea14075bbddd6f29bf6beb8a46d0db779bcec6b9820909584081ec119f8fd"}, + {file = "pyzmq-22.0.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:26380487eae4034d6c2a3fb8d0f2dff6dd0d9dd711894e8d25aa2d1938950a33"}, + {file = "pyzmq-22.0.3-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:3e29f9cf85a40d521d048b55c63f59d6c772ac1c4bf51cdfc23b62a62e377c33"}, + {file = "pyzmq-22.0.3-cp36-cp36m-win32.whl", hash = "sha256:4f34a173f813b38b83f058e267e30465ed64b22cd0cf6bad21148d3fa718f9bb"}, + {file = "pyzmq-22.0.3-cp36-cp36m-win_amd64.whl", hash = "sha256:30df70f81fe210506aa354d7fd486a39b87d9f7f24c3d3f4f698ec5d96b8c084"}, + {file = "pyzmq-22.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7026f0353977431fc884abd4ac28268894bd1a780ba84bb266d470b0ec26d2ed"}, + {file = "pyzmq-22.0.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6d4163704201fff0f3ab0cd5d7a0ea1514ecfffd3926d62ec7e740a04d2012c7"}, + {file = "pyzmq-22.0.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:763c175294d861869f18eb42901d500eda7d3fa4565f160b3b2fd2678ea0ebab"}, + {file = "pyzmq-22.0.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:61e4bb6cd60caf1abcd796c3f48395e22c5b486eeca6f3a8797975c57d94b03e"}, + {file = "pyzmq-22.0.3-cp37-cp37m-win32.whl", hash = "sha256:b25e5d339550a850f7e919fe8cb4c8eabe4c917613db48dab3df19bfb9a28969"}, + {file = "pyzmq-22.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:3ef50d74469b03725d781a2a03c57537d86847ccde587130fe35caafea8f75c6"}, + {file = "pyzmq-22.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:60e63577b85055e4cc43892fecd877b86695ee3ef12d5d10a3c5d6e77a7cc1a3"}, + {file = "pyzmq-22.0.3-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:f5831eff6b125992ec65d973f5151c48003b6754030094723ac4c6e80a97c8c4"}, + {file = "pyzmq-22.0.3-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:9221783dacb419604d5345d0e097bddef4459a9a95322de6c306bf1d9896559f"}, + {file = "pyzmq-22.0.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:b62ea18c0458a65ccd5be90f276f7a5a3f26a6dea0066d948ce2fa896051420f"}, + {file = "pyzmq-22.0.3-cp38-cp38-win32.whl", hash = "sha256:81e7df0da456206201e226491aa1fc449da85328bf33bbeec2c03bb3a9f18324"}, + {file = "pyzmq-22.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:f52070871a0fd90a99130babf21f8af192304ec1e995bec2a9533efc21ea4452"}, + {file = "pyzmq-22.0.3-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:c5e29fe4678f97ce429f076a2a049a3d0b2660ada8f2c621e5dc9939426056dd"}, + {file = "pyzmq-22.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d18ddc6741b51f3985978f2fda57ddcdae359662d7a6b395bc8ff2292fca14bd"}, + {file = "pyzmq-22.0.3-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4231943514812dfb74f44eadcf85e8dd8cf302b4d0bce450ce1357cac88dbfdc"}, + {file = "pyzmq-22.0.3-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:23a74de4b43c05c3044aeba0d1f3970def8f916151a712a3ac1e5cd9c0bc2902"}, + {file = "pyzmq-22.0.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:532af3e6dddea62d9c49062ece5add998c9823c2419da943cf95589f56737de0"}, + {file = "pyzmq-22.0.3-cp39-cp39-win32.whl", hash = "sha256:33acd2b9790818b9d00526135acf12790649d8d34b2b04d64558b469c9d86820"}, + {file = "pyzmq-22.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:a558c5bc89d56d7253187dccc4e81b5bb0eac5ae9511eb4951910a1245d04622"}, + {file = "pyzmq-22.0.3-pp36-pypy36_pp73-macosx_10_9_x86_64.whl", hash = "sha256:581787c62eaa0e0db6c5413cedc393ebbadac6ddfd22e1cf9a60da23c4f1a4b2"}, + {file = "pyzmq-22.0.3-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:38e3dca75d81bec4f2defa14b0a65b74545812bb519a8e89c8df96bbf4639356"}, + {file = "pyzmq-22.0.3-pp36-pypy36_pp73-win32.whl", hash = "sha256:2f971431aaebe0a8b54ac018e041c2f0b949a43745444e4dadcc80d0f0ef8457"}, + {file = "pyzmq-22.0.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:da7d4d4c778c86b60949d17531e60c54ed3726878de8a7f8a6d6e7f8cc8c3205"}, + {file = "pyzmq-22.0.3-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:13465c1ff969cab328bc92f7015ce3843f6e35f8871ad79d236e4fbc85dbe4cb"}, + {file = "pyzmq-22.0.3-pp37-pypy37_pp73-win32.whl", hash = "sha256:279cc9b51db48bec2db146f38e336049ac5a59e5f12fb3a8ad864e238c1c62e3"}, + {file = "pyzmq-22.0.3.tar.gz", hash = "sha256:f7f63ce127980d40f3e6a5fdb87abf17ce1a7c2bd8bf2c7560e1bbce8ab1f92d"}, +] +qtconsole = [ + {file = "qtconsole-5.0.3-py3-none-any.whl", hash = "sha256:4a38053993ca2da058f76f8d75b3d8906efbf9183de516f92f222ac8e37d9614"}, + {file = "qtconsole-5.0.3.tar.gz", hash = "sha256:c091a35607d2a2432e004c4a112d241ce908086570cf68594176dd52ccaa212d"}, +] +qtpy = [ + {file = "QtPy-1.9.0-py2.py3-none-any.whl", hash = "sha256:fa0b8363b363e89b2a6f49eddc162a04c0699ae95e109a6be3bb145a913190ea"}, + {file = "QtPy-1.9.0.tar.gz", hash = "sha256:2db72c44b55d0fe1407be8fba35c838ad0d6d3bb81f23007886dc1fc0f459c8d"}, +] +scikit-learn = [ + {file = "scikit-learn-0.24.1.tar.gz", hash = "sha256:a0334a1802e64d656022c3bfab56a73fbd6bf4b1298343f3688af2151810bbdf"}, + {file = "scikit_learn-0.24.1-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:9bed8a1ef133c8e2f13966a542cb8125eac7f4b67dcd234197c827ba9c7dd3e0"}, + {file = "scikit_learn-0.24.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:a36e159a0521e13bbe15ca8c8d038b3a1dd4c7dad18d276d76992e03b92cf643"}, + {file = "scikit_learn-0.24.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:c658432d8a20e95398f6bb95ff9731ce9dfa343fdf21eea7ec6a7edfacd4b4d9"}, + {file = "scikit_learn-0.24.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:9dfa564ef27e8e674aa1cc74378416d580ac4ede1136c13dd555a87996e13422"}, + {file = "scikit_learn-0.24.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:9c6097b6a9b2bafc5e0f31f659e6ab5e131383209c30c9e978c5b8abdac5ed2a"}, + {file = "scikit_learn-0.24.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:5580eba7345a4d3b097be2f067cc71a306c44bab19e8717a30361f279c929bea"}, + {file = "scikit_learn-0.24.1-cp36-cp36m-win32.whl", hash = "sha256:7b04691eb2f41d2c68dbda8d1bd3cb4ef421bdc43aaa56aeb6c762224552dfb6"}, + {file = "scikit_learn-0.24.1-cp36-cp36m-win_amd64.whl", hash = "sha256:1adf483e91007a87171d7ce58c34b058eb5dab01b5fee6052f15841778a8ecd8"}, + {file = "scikit_learn-0.24.1-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:ddb52d088889f5596bc4d1de981f2eca106b58243b6679e4782f3ba5096fd645"}, + {file = "scikit_learn-0.24.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:a29460499c1e62b7a830bb57ca42e615375a6ab1bcad053cd25b493588348ea8"}, + {file = "scikit_learn-0.24.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:0567a2d29ad08af98653300c623bd8477b448fe66ced7198bef4ed195925f082"}, + {file = "scikit_learn-0.24.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:99349d77f54e11f962d608d94dfda08f0c9e5720d97132233ebdf35be2858b2d"}, + {file = "scikit_learn-0.24.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:83b21ff053b1ff1c018a2d24db6dd3ea339b1acfbaa4d9c881731f43748d8b3b"}, + {file = "scikit_learn-0.24.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:abe835a851610f87201819cb315f8d554e1a3e8128912783a31e87264ba5ffb7"}, + {file = "scikit_learn-0.24.1-cp37-cp37m-win32.whl", hash = "sha256:c3deb3b19dd9806acf00cf0d400e84562c227723013c33abefbbc3cf906596e9"}, + {file = "scikit_learn-0.24.1-cp37-cp37m-win_amd64.whl", hash = "sha256:d54dbaadeb1425b7d6a66bf44bee2bb2b899fe3e8850b8e94cfb9c904dcb46d0"}, + {file = "scikit_learn-0.24.1-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:3c4f07f47c04e81b134424d53c3f5e16dfd7f494e44fd7584ba9ce9de2c5e6c1"}, + {file = "scikit_learn-0.24.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:c13ebac42236b1c46397162471ea1c46af68413000e28b9309f8c05722c65a09"}, + {file = "scikit_learn-0.24.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:4ddd2b6f7449a5d539ff754fa92d75da22de261fd8fdcfb3596799fadf255101"}, + {file = "scikit_learn-0.24.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:826b92bf45b8ad80444814e5f4ac032156dd481e48d7da33d611f8fe96d5f08b"}, + {file = "scikit_learn-0.24.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:259ec35201e82e2db1ae2496f229e63f46d7f1695ae68eef9350b00dc74ba52f"}, + {file = "scikit_learn-0.24.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:9599a3f3bf33f73fed0fe06d1dfa4e6081365a58c1c807acb07271be0dce9733"}, + {file = "scikit_learn-0.24.1-cp38-cp38-win32.whl", hash = "sha256:8772b99d683be8f67fcc04789032f1b949022a0e6880ee7b75a7ec97dbbb5d0b"}, + {file = "scikit_learn-0.24.1-cp38-cp38-win_amd64.whl", hash = "sha256:ed9d65594948678827f4ff0e7ae23344e2f2b4cabbca057ccaed3118fdc392ca"}, + {file = "scikit_learn-0.24.1-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:8aa1b3ac46b80eaa552b637eeadbbce3be5931e4b5002b964698e33a1b589e1e"}, + {file = "scikit_learn-0.24.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:c7f4eb77504ac586d8ac1bde1b0c04b504487210f95297235311a0ab7edd7e38"}, + {file = "scikit_learn-0.24.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:087dfede39efb06ab30618f9ab55a0397f29c38d63cd0ab88d12b500b7d65fd7"}, + {file = "scikit_learn-0.24.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:895dbf2030aa7337649e36a83a007df3c9811396b4e2fa672a851160f36ce90c"}, + {file = "scikit_learn-0.24.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:9a24d1ccec2a34d4cd3f2a1f86409f3f5954cc23d4d2270ba0d03cf018aa4780"}, + {file = "scikit_learn-0.24.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:54be0a60a5a35005ad69c75902e0f5c9f699db4547ead427e97ef881c3242e6f"}, + {file = "scikit_learn-0.24.1-cp39-cp39-win32.whl", hash = "sha256:fab31f48282ebf54dd69f6663cd2d9800096bad1bb67bbc9c9ac84eb77b41972"}, + {file = "scikit_learn-0.24.1-cp39-cp39-win_amd64.whl", hash = "sha256:4562dcf4793e61c5d0f89836d07bc37521c3a1889da8f651e2c326463c4bd697"}, +] +scipy = [ + {file = "scipy-1.6.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:77f7a057724545b7e097bfdca5c6006bed8580768cd6621bb1330aedf49afba5"}, + {file = "scipy-1.6.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:e547f84cd52343ac2d56df0ab08d3e9cc202338e7d09fafe286d6c069ddacb31"}, + {file = "scipy-1.6.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:bc52d4d70863141bb7e2f8fd4d98e41d77375606cde50af65f1243ce2d7853e8"}, + {file = "scipy-1.6.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:adf7cee8e5c92b05f2252af498f77c7214a2296d009fc5478fc432c2f8fb953b"}, + {file = "scipy-1.6.2-cp37-cp37m-win32.whl", hash = "sha256:e3e9742bad925c421d39e699daa8d396c57535582cba90017d17f926b61c1552"}, + {file = "scipy-1.6.2-cp37-cp37m-win_amd64.whl", hash = "sha256:ffdfb09315896c6e9ac739bb6e13a19255b698c24e6b28314426fd40a1180822"}, + {file = "scipy-1.6.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6ca1058cb5bd45388041a7c3c11c4b2bd58867ac9db71db912501df77be2c4a4"}, + {file = "scipy-1.6.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:993c86513272bc84c451349b10ee4376652ab21f312b0554fdee831d593b6c02"}, + {file = "scipy-1.6.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:37f4c2fb904c0ba54163e03993ce3544c9c5cde104bcf90614f17d85bdfbb431"}, + {file = "scipy-1.6.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:96620240b393d155097618bcd6935d7578e85959e55e3105490bbbf2f594c7ad"}, + {file = "scipy-1.6.2-cp38-cp38-win32.whl", hash = "sha256:03f1fd3574d544456325dae502facdf5c9f81cbfe12808a5e67a737613b7ba8c"}, + {file = "scipy-1.6.2-cp38-cp38-win_amd64.whl", hash = "sha256:0c81ea1a95b4c9e0a8424cf9484b7b8fa7ef57169d7bcc0dfcfc23e3d7c81a12"}, + {file = "scipy-1.6.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c1d3f771c19af00e1a36f749bd0a0690cc64632783383bc68f77587358feb5a4"}, + {file = "scipy-1.6.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:50e5bcd9d45262725e652611bb104ac0919fd25ecb78c22f5282afabd0b2e189"}, + {file = "scipy-1.6.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:816951e73d253a41fa2fd5f956f8e8d9ac94148a9a2039e7db56994520582bf2"}, + {file = "scipy-1.6.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:1fba8a214c89b995e3721670e66f7053da82e7e5d0fe6b31d8e4b19922a9315e"}, + {file = "scipy-1.6.2-cp39-cp39-win32.whl", hash = "sha256:e89091e6a8e211269e23f049473b2fde0c0e5ae0dd5bd276c3fc91b97da83480"}, + {file = "scipy-1.6.2-cp39-cp39-win_amd64.whl", hash = "sha256:d744657c27c128e357de2f0fd532c09c84cd6e4933e8232895a872e67059ac37"}, + {file = "scipy-1.6.2.tar.gz", hash = "sha256:e9da33e21c9bc1b92c20b5328adb13e5f193b924c9b969cd700c8908f315aa59"}, +] +send2trash = [ + {file = "Send2Trash-1.5.0-py3-none-any.whl", hash = "sha256:f1691922577b6fa12821234aeb57599d887c4900b9ca537948d2dac34aea888b"}, + {file = "Send2Trash-1.5.0.tar.gz", hash = "sha256:60001cc07d707fe247c94f74ca6ac0d3255aabcb930529690897ca2a39db28b2"}, +] +six = [ + {file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"}, + {file = "six-1.15.0.tar.gz", hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"}, +] +sklearn = [ + {file = "sklearn-0.0.tar.gz", hash = "sha256:e23001573aa194b834122d2b9562459bf5ae494a2d59ca6b8aa22c85a44c0e31"}, +] +terminado = [ + {file = "terminado-0.9.4-py3-none-any.whl", hash = "sha256:daed77f9fad7b32558fa84b226a76f45a02242c20813502f36c4e1ade6d8f1ad"}, + {file = "terminado-0.9.4.tar.gz", hash = "sha256:9a7dbcfbc2778830eeb70261bf7aa9d98a3eac8631a3afe3febeb57c12f798be"}, +] +testpath = [ + {file = "testpath-0.4.4-py2.py3-none-any.whl", hash = "sha256:bfcf9411ef4bf3db7579063e0546938b1edda3d69f4e1fb8756991f5951f85d4"}, + {file = "testpath-0.4.4.tar.gz", hash = "sha256:60e0a3261c149755f4399a1fff7d37523179a70fdc3abdf78de9fc2604aeec7e"}, +] +threadpoolctl = [ + {file = "threadpoolctl-2.1.0-py3-none-any.whl", hash = "sha256:38b74ca20ff3bb42caca8b00055111d74159ee95c4370882bbff2b93d24da725"}, + {file = "threadpoolctl-2.1.0.tar.gz", hash = "sha256:ddc57c96a38beb63db45d6c159b5ab07b6bced12c45a1f07b2b92f272aebfa6b"}, +] +tk = [ + {file = "tk-0.1.0-py3-none-any.whl", hash = "sha256:703a69ff0d5ba2bd2f7440582ad10160e4a6561595d33457dc6caa79b9bf4930"}, + {file = "tk-0.1.0.tar.gz", hash = "sha256:60bc8923d5d35f67f5c6bd93d4f0c49d2048114ec077768f959aef36d4ed97f8"}, +] +tornado = [ + {file = "tornado-6.1-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:d371e811d6b156d82aa5f9a4e08b58debf97c302a35714f6f45e35139c332e32"}, + {file = "tornado-6.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:0d321a39c36e5f2c4ff12b4ed58d41390460f798422c4504e09eb5678e09998c"}, + {file = "tornado-6.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9de9e5188a782be6b1ce866e8a51bc76a0fbaa0e16613823fc38e4fc2556ad05"}, + {file = "tornado-6.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:61b32d06ae8a036a6607805e6720ef00a3c98207038444ba7fd3d169cd998910"}, + {file = "tornado-6.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:3e63498f680547ed24d2c71e6497f24bca791aca2fe116dbc2bd0ac7f191691b"}, + {file = "tornado-6.1-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:6c77c9937962577a6a76917845d06af6ab9197702a42e1346d8ae2e76b5e3675"}, + {file = "tornado-6.1-cp35-cp35m-win32.whl", hash = "sha256:6286efab1ed6e74b7028327365cf7346b1d777d63ab30e21a0f4d5b275fc17d5"}, + {file = "tornado-6.1-cp35-cp35m-win_amd64.whl", hash = "sha256:fa2ba70284fa42c2a5ecb35e322e68823288a4251f9ba9cc77be04ae15eada68"}, + {file = "tornado-6.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0a00ff4561e2929a2c37ce706cb8233b7907e0cdc22eab98888aca5dd3775feb"}, + {file = "tornado-6.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:748290bf9112b581c525e6e6d3820621ff020ed95af6f17fedef416b27ed564c"}, + {file = "tornado-6.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:e385b637ac3acaae8022e7e47dfa7b83d3620e432e3ecb9a3f7f58f150e50921"}, + {file = "tornado-6.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:25ad220258349a12ae87ede08a7b04aca51237721f63b1808d39bdb4b2164558"}, + {file = "tornado-6.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:65d98939f1a2e74b58839f8c4dab3b6b3c1ce84972ae712be02845e65391ac7c"}, + {file = "tornado-6.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:e519d64089b0876c7b467274468709dadf11e41d65f63bba207e04217f47c085"}, + {file = "tornado-6.1-cp36-cp36m-win32.whl", hash = "sha256:b87936fd2c317b6ee08a5741ea06b9d11a6074ef4cc42e031bc6403f82a32575"}, + {file = "tornado-6.1-cp36-cp36m-win_amd64.whl", hash = "sha256:cc0ee35043162abbf717b7df924597ade8e5395e7b66d18270116f8745ceb795"}, + {file = "tornado-6.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7250a3fa399f08ec9cb3f7b1b987955d17e044f1ade821b32e5f435130250d7f"}, + {file = "tornado-6.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:ed3ad863b1b40cd1d4bd21e7498329ccaece75db5a5bf58cd3c9f130843e7102"}, + {file = "tornado-6.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:dcef026f608f678c118779cd6591c8af6e9b4155c44e0d1bc0c87c036fb8c8c4"}, + {file = "tornado-6.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:70dec29e8ac485dbf57481baee40781c63e381bebea080991893cd297742b8fd"}, + {file = "tornado-6.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:d3f7594930c423fd9f5d1a76bee85a2c36fd8b4b16921cae7e965f22575e9c01"}, + {file = "tornado-6.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:3447475585bae2e77ecb832fc0300c3695516a47d46cefa0528181a34c5b9d3d"}, + {file = "tornado-6.1-cp37-cp37m-win32.whl", hash = "sha256:e7229e60ac41a1202444497ddde70a48d33909e484f96eb0da9baf8dc68541df"}, + {file = "tornado-6.1-cp37-cp37m-win_amd64.whl", hash = "sha256:cb5ec8eead331e3bb4ce8066cf06d2dfef1bfb1b2a73082dfe8a161301b76e37"}, + {file = "tornado-6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:20241b3cb4f425e971cb0a8e4ffc9b0a861530ae3c52f2b0434e6c1b57e9fd95"}, + {file = "tornado-6.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:c77da1263aa361938476f04c4b6c8916001b90b2c2fdd92d8d535e1af48fba5a"}, + {file = "tornado-6.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:fba85b6cd9c39be262fcd23865652920832b61583de2a2ca907dbd8e8a8c81e5"}, + {file = "tornado-6.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:1e8225a1070cd8eec59a996c43229fe8f95689cb16e552d130b9793cb570a288"}, + {file = "tornado-6.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d14d30e7f46a0476efb0deb5b61343b1526f73ebb5ed84f23dc794bdb88f9d9f"}, + {file = "tornado-6.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8f959b26f2634a091bb42241c3ed8d3cedb506e7c27b8dd5c7b9f745318ddbb6"}, + {file = "tornado-6.1-cp38-cp38-win32.whl", hash = "sha256:34ca2dac9e4d7afb0bed4677512e36a52f09caa6fded70b4e3e1c89dbd92c326"}, + {file = "tornado-6.1-cp38-cp38-win_amd64.whl", hash = "sha256:6196a5c39286cc37c024cd78834fb9345e464525d8991c21e908cc046d1cc02c"}, + {file = "tornado-6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0ba29bafd8e7e22920567ce0d232c26d4d47c8b5cf4ed7b562b5db39fa199c5"}, + {file = "tornado-6.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:33892118b165401f291070100d6d09359ca74addda679b60390b09f8ef325ffe"}, + {file = "tornado-6.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7da13da6f985aab7f6f28debab00c67ff9cbacd588e8477034c0652ac141feea"}, + {file = "tornado-6.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:e0791ac58d91ac58f694d8d2957884df8e4e2f6687cdf367ef7eb7497f79eaa2"}, + {file = "tornado-6.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:66324e4e1beede9ac79e60f88de548da58b1f8ab4b2f1354d8375774f997e6c0"}, + {file = "tornado-6.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:a48900ecea1cbb71b8c71c620dee15b62f85f7c14189bdeee54966fbd9a0c5bd"}, + {file = "tornado-6.1-cp39-cp39-win32.whl", hash = "sha256:d3d20ea5782ba63ed13bc2b8c291a053c8d807a8fa927d941bd718468f7b950c"}, + {file = "tornado-6.1-cp39-cp39-win_amd64.whl", hash = "sha256:548430be2740e327b3fe0201abe471f314741efcb0067ec4f2d7dcfb4825f3e4"}, + {file = "tornado-6.1.tar.gz", hash = "sha256:33c6e81d7bd55b468d2e793517c909b139960b6c790a60b7991b9b6b76fb9791"}, +] +tqdm = [ + {file = "tqdm-4.60.0-py2.py3-none-any.whl", hash = "sha256:daec693491c52e9498632dfbe9ccfc4882a557f5fa08982db1b4d3adbe0887c3"}, + {file = "tqdm-4.60.0.tar.gz", hash = "sha256:ebdebdb95e3477ceea267decfc0784859aa3df3e27e22d23b83e9b272bf157ae"}, +] +traitlets = [ + {file = "traitlets-5.0.5-py3-none-any.whl", hash = "sha256:69ff3f9d5351f31a7ad80443c2674b7099df13cc41fc5fa6e2f6d3b0330b0426"}, + {file = "traitlets-5.0.5.tar.gz", hash = "sha256:178f4ce988f69189f7e523337a3e11d91c786ded9360174a3d9ca83e79bc5396"}, +] +wcwidth = [ + {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, + {file = "wcwidth-0.2.5.tar.gz", hash = "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"}, +] +webencodings = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, +] +widgetsnbextension = [ + {file = "widgetsnbextension-3.5.1-py2.py3-none-any.whl", hash = "sha256:bd314f8ceb488571a5ffea6cc5b9fc6cba0adaf88a9d2386b93a489751938bcd"}, + {file = "widgetsnbextension-3.5.1.tar.gz", hash = "sha256:079f87d87270bce047512400efd70238820751a11d2d8cb137a5a5bdbaf255c7"}, +] diff --git a/pose_ordering.ipynb b/pose_ordering.ipynb new file mode 100644 index 0000000..8b6bd97 --- /dev/null +++ b/pose_ordering.ipynb @@ -0,0 +1,1668 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "e7f2abd1", + "metadata": {}, + "source": [ + "To install kernel run:\n", + "\n", + "```\n", + "poetry run ipython kernel install --user --name=mpii\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 296, + "id": "8b90027a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using matplotlib backend: nbAgg\n" + ] + } + ], + "source": [ + "# imports\n", + "import os\n", + "from pathlib import Path\n", + "from scipy.io import loadmat\n", + "import scipy\n", + "import tqdm\n", + "import pickle\n", + "import logging\n", + "import time\n", + "import gc\n", + "%matplotlib\n", + "%matplotlib notebook\n", + "import matplotlib\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "from PIL import Image\n", + "from threading import Lock\n" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "f5818c76", + "metadata": {}, + "outputs": [], + "source": [ + "# logging\n", + "logging.basicConfig(level=logging.WARNING)\n", + "logger = logging.getLogger('pose_ordering')\n", + "logger.setLevel(logging.INFO)" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "7f6fe12f", + "metadata": {}, + "outputs": [], + "source": [ + "# config\n", + "\n", + "mpii_idx_to_jnt = {0: 'rankl', 1: 'rknee', 2: 'rhip', 5: 'lankl', 4: 'lknee', 3: 'lhip',\n", + " 6: 'pelvis', 7: 'thorax', 8: 'upper_neck', 11: 'relb', 10: 'rwri', 9: 'head',\n", + " 12: 'rsho', 13: 'lsho', 14: 'lelb', 15: 'lwri'}\n", + "\n", + "angles = [\n", + " ['rwri', 'relb', 'rsho'],\n", + " ['relb', 'rsho','thorax'],\n", + " ['rsho','thorax', 'pelvis'],\n", + " ['thorax','pelvis', 'rhip'],\n", + " ['pelvis', 'rhip', 'rknee'],\n", + " [ 'rhip', 'rknee', 'rankl'],\n", + " ['rsho','thorax','upper_neck'],\n", + " ['lwri', 'lelb', 'lsho'],\n", + " ['lelb', 'lsho','thorax'],\n", + " ['lsho','thorax','pelvis'],\n", + " ['thorax','pelvis','lhip'],\n", + " ['pelvis','lhip', 'lknee'],\n", + " ['lhip', 'lknee', 'lankl'],\n", + " ['lsho','thorax','upper_neck'],\n", + " ['thorax','upper_neck', 'head'],\n", + "]\n", + "\n", + "bones = [\n", + " ['rankl', 'rknee', 'orange'],\n", + " ['rknee', 'rhip', 'orange'],\n", + " ['rhip','pelvis', 'orange'],\n", + " ['lankl', 'lknee', 'yellow'],\n", + " ['lknee', 'lhip', 'yellow'],\n", + " ['lhip','pelvis', 'yellow'],\n", + "\n", + " ['rwri', 'relb', 'red'],\n", + " ['relb','rsho', 'red'],\n", + " ['rsho','thorax', 'red'],\n", + " ['lwri', 'lelb', 'blue'],\n", + " ['lelb','lsho', 'blue'],\n", + " ['lsho','thorax', 'blue'],\n", + "\n", + " ['thorax','upper_neck', 'pink'],\n", + " ['upper_neck','head', 'pink'],\n", + " ['thorax','pelvis', 'green'],\n", + "]\n", + "\n", + "\n", + "filename = 'mpii_human_pose_v1_u12_2/mpii_human_pose_v1_u12_1.mat'\n", + "\n", + "\n", + "#matplotlib plot size\n", + "default_dpi = matplotlib.rcParamsDefault['figure.dpi']\n", + "matplotlib.rcParams['figure.dpi'] = default_dpi*2\n" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "3d511d3a", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "DEBUG:pose_ordering:Loading pickled version\n" + ] + } + ], + "source": [ + "%timeit\n", + "if os.path.exists(filename + '.p'):\n", + " with open(filename + '.p', 'rb') as fp:\n", + " gc.disable() # speeds up pickle.load by ~30%\n", + " logger.debug('Loading pickled version')\n", + " mat = pickle.load(fp)\n", + " gc.enable()\n", + "else:\n", + " logger.debug(f'Loading {filename}')\n", + " mat = loadmat(filename)\n", + " with open(filename + '.p', 'wb') as fp:\n", + " pickle.dump(mat, fp)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "4abd4ab9", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "24987" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "mpii = mat['RELEASE'][0,0]\n", + "num_images = mpii['annolist'][0].shape[0]\n", + "\n", + "num_images" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "7c985ce9", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot([1,2], [-1,4]) \n", + " \n", + "# function to show the plot \n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 233, + "id": "9b5f975e", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 0%| | 0/24987 [00:00:43: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n", + " vis = point['is_visible'].flatten() if 'is_visible' in point else []\n", + "100%|██████████| 24987/24987 [00:19<00:00, 1282.47it/s]\n" + ] + } + ], + "source": [ + "has_values = 0\n", + "visualise = False\n", + "\n", + "vectors = []\n", + "vector_points = []\n", + "\n", + "for idx in tqdm.tqdm(range(num_images)):\n", + "# for idx in range(num_images):\n", + " # # is_training = mpii['img_train'][0,idx] # whether in train or test set\n", + " # person_ids = mpii['single_person'][idx][0].flatten()\n", + "\n", + " # if not len(person_ids):\n", + " # # skip, because not enough persons\n", + " # continue\n", + " \n", + " annotations = mpii['annolist'][0,idx]\n", + " anno_file = str(annotations[0]['name'][0][0][0])\n", + " filename = '/home/ruben/Documents/Projecten/2020/Security Vision/tryouts/MPII Human Pose Dataset/images/'+anno_file\n", + " logger.debug(filename)\n", + " \n", + " if visualise:\n", + " image = Image.open(filename)\n", + "\n", + " if not len(annotations['annorect']):\n", + " continue\n", + "\n", + " for annotation in annotations['annorect'][0]:\n", + " # TODO : We might need to mirror the objects following a particular rule (see also Impett & Moretti)\n", + " try:\n", + " annotation_points = annotation['annopoints'][0,0]['point'][0]\n", + " except Exception as e:\n", + " # no points tagged for this one\n", + " continue\n", + "\n", + " # logger.debug(points.shape[0])\n", + "\n", + " points = {}\n", + "\n", + " for point in annotation_points:\n", + " x = float(point['x'].flatten()[0])\n", + " y = float(point['y'].flatten()[0])\n", + " id_ = point['id'][0][0]\n", + " vis = point['is_visible'].flatten() if 'is_visible' in point else []\n", + " joint = mpii_idx_to_jnt[id_]\n", + " vis = int(vis[0]) if len(vis) else 0\n", + " points[joint] = np.array([x,y, vis])\n", + "\n", + " \n", + " if not all([joint in points for joint in mpii_idx_to_jnt.values()]):\n", + " logger.debug(f\"Not enough points: {points=}\")\n", + " break\n", + "\n", + "# if 'rhip' not in points or 'lhip' not in points or 'thorax' not in points:\n", + "# logger.info(f\"Not enough points: {points=}\")\n", + "# continue\n", + " \n", + "\n", + " visible_joints = [joint for joint in mpii_idx_to_jnt.values() if joint in points]\n", + " \n", + " if visualise:\n", + " plt.imshow(image)\n", + " plt.plot(np.array([points[joint][0] for joint in visible_joints]), np.array([points[joint][1] for joint in visible_joints]), 'o')\n", + " \n", + " for bone in bones:\n", + " if not all([bone[0] in points, bone[1] in points]):\n", + " continue\n", + " \n", + " if visualise:\n", + " plt.plot([points[bone[0]][0], points[bone[1]][0]], [points[bone[0]][1], points[bone[1]][1]], color=bone[2])\n", + "\n", + " \n", + " annotation_vector = []\n", + "\n", + " for joints in angles:\n", + " if not all([p in points for p in joints]):\n", + " # check if all points to calculate joints are available \n", + " annotation_vector.append(None) # CHOICE store null\n", + " continue\n", + " \n", + " v1 = points[joints[0]] - points[joints[1]]\n", + " v2 = points[joints[2]] - points[joints[1]]\n", + "\n", + " angle = np.arctan2(v2[1], v2[0]) - np.arctan2(v1[1], v1[0])\n", + " annotation_vector.append(angle*angle) # CHOICE squared angle?\n", + " if visualise:\n", + " plt.text(int(points[joints[1]][0]), int(points[joints[1]][1]), f\"{angle:.4}\")\n", + " \n", + " vector_points.append(points)\n", + " vectors.append([annotation_vector, idx, len(vector_points)-1])\n", + " \n", + " \n", + " has_values += 1\n", + "# print(annotations)\n", + "# break\n", + " if visualise:\n", + " plt.show() # show image\n", + " if has_values > 2:\n", + " break\n" + ] + }, + { + "cell_type": "code", + "execution_count": 144, + "id": "41c21986", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "17969 [[10.301455313174841, 0.8738769777401664, 7.932846045996372, 33.90556982877595, 4.788006833143501, 11.579460281021154, 6.330558392334423, 0.590823723139596, 5.670376354016367, 0.10566517419166079, 7.019067218895686, 0.9921823387865951, 7.12304248234401, 0.39129098417224434, 2.9091346049064142e-11], 4] [[2.199207456110774, 1.3408538112736343, 0.9907647738998692, 3.8666010567179896, 0.42119523559718064, 2.7174019285215865, 2.563494948040972, 1.3928467439375065, 2.901393929071837, 4.646466934360204, 27.37712157435963, 2.2728260851251068, 7.166142323804702, 22.581788879995116, 9.869588546386826], 24984]\n" + ] + } + ], + "source": [ + "\n", + "print(len(vectors), vectors[1], vectors[-1])" + ] + }, + { + "cell_type": "code", + "execution_count": 118, + "id": "6a91c2d3", + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.preprocessing import StandardScaler\n" + ] + }, + { + "cell_type": "code", + "execution_count": 145, + "id": "b9478c7a", + "metadata": {}, + "outputs": [], + "source": [ + "values = [v[0] for v in vectors]" + ] + }, + { + "cell_type": "code", + "execution_count": 265, + "id": "6e8d9b47", + "metadata": {}, + "outputs": [], + "source": [ + "x = StandardScaler().fit_transform(values) # normalizing the features\n" + ] + }, + { + "cell_type": "code", + "execution_count": 266, + "id": "821f483d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(2.7179541485275698e-15, 1.0)" + ] + }, + "execution_count": 266, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "x.mean(), np.std(x)" + ] + }, + { + "cell_type": "code", + "execution_count": 267, + "id": "e6b5e4ef", + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.decomposition import PCA" + ] + }, + { + "cell_type": "code", + "execution_count": 268, + "id": "2ee95e88", + "metadata": {}, + "outputs": [], + "source": [ + "# If 0 < n_components < 1 and svd_solver == 'full', select the number of components such that the amount of variance that needs to be explained is greater than the percentage specified by n_components.: https://medium.com/@ansjin/dimensionality-reduction-using-pca-on-multivariate-timeseries-data-b5cc07238dc4\n", + "pca = PCA(n_components=None)\n", + "principalComponents = pca.fit_transform(x)" + ] + }, + { + "cell_type": "code", + "execution_count": 269, + "id": "0d54404f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([0.1947121 , 0.14030244, 0.13287677, 0.09570534, 0.07844851,\n", + " 0.06633996, 0.06156485, 0.0560413 , 0.04303254, 0.03463799,\n", + " 0.02883156, 0.02305097, 0.01668491, 0.015404 , 0.01236676])" + ] + }, + "execution_count": 269, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pca.explained_variance_ratio_" + ] + }, + { + "cell_type": "code", + "execution_count": 270, + "id": "515999d3", + "metadata": {}, + "outputs": [], + "source": [ + "# pca.components_\n", + "# pca.get_precision()\n", + "\n", + "plt.plot(np.cumsum(pca.explained_variance_ratio_))\n", + "plt.xlabel('number of components')\n", + "plt.ylabel('cumulative explained variance');" + ] + }, + { + "cell_type": "code", + "execution_count": 271, + "id": "8519803d", + "metadata": {}, + "outputs": [], + "source": [ + "def get_catname(act) -> str:\n", + " return str(act['cat_name'][0][0]) if len(act['cat_name'][0]) else 'unknown'" + ] + }, + { + "cell_type": "code", + "execution_count": 294, + "id": "17631429", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[-2.35999232, 0.69057281],\n", + " [-0.61853026, 1.07182264],\n", + " [-1.18063219, -0.16670125],\n", + " ...,\n", + " [ 1.95397646, -2.77908482],\n", + " [ 1.47253967, -0.71394096],\n", + " [ 1.82195482, -2.03658075]])" + ] + }, + "execution_count": 294, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# cats = [mpii['act'][v[1]]['cat_name'][0] for v in vectors]\n", + "cats= np.unique([get_catname(act) for act in mpii['act']]).tolist()\n", + "cats" + ] + }, + { + "cell_type": "code", + "execution_count": 326, + "id": "b0a25c9c", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "application/javascript": [ + "/* Put everything inside the global mpl namespace */\n", + "/* global mpl */\n", + "window.mpl = {};\n", + "\n", + "mpl.get_websocket_type = function () {\n", + " if (typeof WebSocket !== 'undefined') {\n", + " return WebSocket;\n", + " } else if (typeof MozWebSocket !== 'undefined') {\n", + " return MozWebSocket;\n", + " } else {\n", + " alert(\n", + " 'Your browser does not have WebSocket support. ' +\n", + " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", + " 'Firefox 4 and 5 are also supported but you ' +\n", + " 'have to enable WebSockets in about:config.'\n", + " );\n", + " }\n", + "};\n", + "\n", + "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n", + " this.id = figure_id;\n", + "\n", + " this.ws = websocket;\n", + "\n", + " this.supports_binary = this.ws.binaryType !== undefined;\n", + "\n", + " if (!this.supports_binary) {\n", + " var warnings = document.getElementById('mpl-warnings');\n", + " if (warnings) {\n", + " warnings.style.display = 'block';\n", + " warnings.textContent =\n", + " 'This browser does not support binary websocket messages. ' +\n", + " 'Performance may be slow.';\n", + " }\n", + " }\n", + "\n", + " this.imageObj = new Image();\n", + "\n", + " this.context = undefined;\n", + " this.message = undefined;\n", + " this.canvas = undefined;\n", + " this.rubberband_canvas = undefined;\n", + " this.rubberband_context = undefined;\n", + " this.format_dropdown = undefined;\n", + "\n", + " this.image_mode = 'full';\n", + "\n", + " this.root = document.createElement('div');\n", + " this.root.setAttribute('style', 'display: inline-block');\n", + " this._root_extra_style(this.root);\n", + "\n", + " parent_element.appendChild(this.root);\n", + "\n", + " this._init_header(this);\n", + " this._init_canvas(this);\n", + " this._init_toolbar(this);\n", + "\n", + " var fig = this;\n", + "\n", + " this.waiting = false;\n", + "\n", + " this.ws.onopen = function () {\n", + " fig.send_message('supports_binary', { value: fig.supports_binary });\n", + " fig.send_message('send_image_mode', {});\n", + " if (fig.ratio !== 1) {\n", + " fig.send_message('set_dpi_ratio', { dpi_ratio: fig.ratio });\n", + " }\n", + " fig.send_message('refresh', {});\n", + " };\n", + "\n", + " this.imageObj.onload = function () {\n", + " if (fig.image_mode === 'full') {\n", + " // Full images could contain transparency (where diff images\n", + " // almost always do), so we need to clear the canvas so that\n", + " // there is no ghosting.\n", + " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", + " }\n", + " fig.context.drawImage(fig.imageObj, 0, 0);\n", + " };\n", + "\n", + " this.imageObj.onunload = function () {\n", + " fig.ws.close();\n", + " };\n", + "\n", + " this.ws.onmessage = this._make_on_message_function(this);\n", + "\n", + " this.ondownload = ondownload;\n", + "};\n", + "\n", + "mpl.figure.prototype._init_header = function () {\n", + " var titlebar = document.createElement('div');\n", + " titlebar.classList =\n", + " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n", + " var titletext = document.createElement('div');\n", + " titletext.classList = 'ui-dialog-title';\n", + " titletext.setAttribute(\n", + " 'style',\n", + " 'width: 100%; text-align: center; padding: 3px;'\n", + " );\n", + " titlebar.appendChild(titletext);\n", + " this.root.appendChild(titlebar);\n", + " this.header = titletext;\n", + "};\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n", + "\n", + "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n", + "\n", + "mpl.figure.prototype._init_canvas = function () {\n", + " var fig = this;\n", + "\n", + " var canvas_div = (this.canvas_div = document.createElement('div'));\n", + " canvas_div.setAttribute(\n", + " 'style',\n", + " 'border: 1px solid #ddd;' +\n", + " 'box-sizing: content-box;' +\n", + " 'clear: both;' +\n", + " 'min-height: 1px;' +\n", + " 'min-width: 1px;' +\n", + " 'outline: 0;' +\n", + " 'overflow: hidden;' +\n", + " 'position: relative;' +\n", + " 'resize: both;'\n", + " );\n", + "\n", + " function on_keyboard_event_closure(name) {\n", + " return function (event) {\n", + " return fig.key_event(event, name);\n", + " };\n", + " }\n", + "\n", + " canvas_div.addEventListener(\n", + " 'keydown',\n", + " on_keyboard_event_closure('key_press')\n", + " );\n", + " canvas_div.addEventListener(\n", + " 'keyup',\n", + " on_keyboard_event_closure('key_release')\n", + " );\n", + "\n", + " this._canvas_extra_style(canvas_div);\n", + " this.root.appendChild(canvas_div);\n", + "\n", + " var canvas = (this.canvas = document.createElement('canvas'));\n", + " canvas.classList.add('mpl-canvas');\n", + " canvas.setAttribute('style', 'box-sizing: content-box;');\n", + "\n", + " this.context = canvas.getContext('2d');\n", + "\n", + " var backingStore =\n", + " this.context.backingStorePixelRatio ||\n", + " this.context.webkitBackingStorePixelRatio ||\n", + " this.context.mozBackingStorePixelRatio ||\n", + " this.context.msBackingStorePixelRatio ||\n", + " this.context.oBackingStorePixelRatio ||\n", + " this.context.backingStorePixelRatio ||\n", + " 1;\n", + "\n", + " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n", + "\n", + " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n", + " 'canvas'\n", + " ));\n", + " rubberband_canvas.setAttribute(\n", + " 'style',\n", + " 'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n", + " );\n", + "\n", + " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n", + " if (this.ResizeObserver === undefined) {\n", + " if (window.ResizeObserver !== undefined) {\n", + " this.ResizeObserver = window.ResizeObserver;\n", + " } else {\n", + " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n", + " this.ResizeObserver = obs.ResizeObserver;\n", + " }\n", + " }\n", + "\n", + " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n", + " var nentries = entries.length;\n", + " for (var i = 0; i < nentries; i++) {\n", + " var entry = entries[i];\n", + " var width, height;\n", + " if (entry.contentBoxSize) {\n", + " if (entry.contentBoxSize instanceof Array) {\n", + " // Chrome 84 implements new version of spec.\n", + " width = entry.contentBoxSize[0].inlineSize;\n", + " height = entry.contentBoxSize[0].blockSize;\n", + " } else {\n", + " // Firefox implements old version of spec.\n", + " width = entry.contentBoxSize.inlineSize;\n", + " height = entry.contentBoxSize.blockSize;\n", + " }\n", + " } else {\n", + " // Chrome <84 implements even older version of spec.\n", + " width = entry.contentRect.width;\n", + " height = entry.contentRect.height;\n", + " }\n", + "\n", + " // Keep the size of the canvas and rubber band canvas in sync with\n", + " // the canvas container.\n", + " if (entry.devicePixelContentBoxSize) {\n", + " // Chrome 84 implements new version of spec.\n", + " canvas.setAttribute(\n", + " 'width',\n", + " entry.devicePixelContentBoxSize[0].inlineSize\n", + " );\n", + " canvas.setAttribute(\n", + " 'height',\n", + " entry.devicePixelContentBoxSize[0].blockSize\n", + " );\n", + " } else {\n", + " canvas.setAttribute('width', width * fig.ratio);\n", + " canvas.setAttribute('height', height * fig.ratio);\n", + " }\n", + " canvas.setAttribute(\n", + " 'style',\n", + " 'width: ' + width + 'px; height: ' + height + 'px;'\n", + " );\n", + "\n", + " rubberband_canvas.setAttribute('width', width);\n", + " rubberband_canvas.setAttribute('height', height);\n", + "\n", + " // And update the size in Python. We ignore the initial 0/0 size\n", + " // that occurs as the element is placed into the DOM, which should\n", + " // otherwise not happen due to the minimum size styling.\n", + " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n", + " fig.request_resize(width, height);\n", + " }\n", + " }\n", + " });\n", + " this.resizeObserverInstance.observe(canvas_div);\n", + "\n", + " function on_mouse_event_closure(name) {\n", + " return function (event) {\n", + " return fig.mouse_event(event, name);\n", + " };\n", + " }\n", + "\n", + " rubberband_canvas.addEventListener(\n", + " 'mousedown',\n", + " on_mouse_event_closure('button_press')\n", + " );\n", + " rubberband_canvas.addEventListener(\n", + " 'mouseup',\n", + " on_mouse_event_closure('button_release')\n", + " );\n", + " rubberband_canvas.addEventListener(\n", + " 'dblclick',\n", + " on_mouse_event_closure('dblclick')\n", + " );\n", + " // Throttle sequential mouse events to 1 every 20ms.\n", + " rubberband_canvas.addEventListener(\n", + " 'mousemove',\n", + " on_mouse_event_closure('motion_notify')\n", + " );\n", + "\n", + " rubberband_canvas.addEventListener(\n", + " 'mouseenter',\n", + " on_mouse_event_closure('figure_enter')\n", + " );\n", + " rubberband_canvas.addEventListener(\n", + " 'mouseleave',\n", + " on_mouse_event_closure('figure_leave')\n", + " );\n", + "\n", + " canvas_div.addEventListener('wheel', function (event) {\n", + " if (event.deltaY < 0) {\n", + " event.step = 1;\n", + " } else {\n", + " event.step = -1;\n", + " }\n", + " on_mouse_event_closure('scroll')(event);\n", + " });\n", + "\n", + " canvas_div.appendChild(canvas);\n", + " canvas_div.appendChild(rubberband_canvas);\n", + "\n", + " this.rubberband_context = rubberband_canvas.getContext('2d');\n", + " this.rubberband_context.strokeStyle = '#000000';\n", + "\n", + " this._resize_canvas = function (width, height, forward) {\n", + " if (forward) {\n", + " canvas_div.style.width = width + 'px';\n", + " canvas_div.style.height = height + 'px';\n", + " }\n", + " };\n", + "\n", + " // Disable right mouse context menu.\n", + " this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n", + " event.preventDefault();\n", + " return false;\n", + " });\n", + "\n", + " function set_focus() {\n", + " canvas.focus();\n", + " canvas_div.focus();\n", + " }\n", + "\n", + " window.setTimeout(set_focus, 100);\n", + "};\n", + "\n", + "mpl.figure.prototype._init_toolbar = function () {\n", + " var fig = this;\n", + "\n", + " var toolbar = document.createElement('div');\n", + " toolbar.classList = 'mpl-toolbar';\n", + " this.root.appendChild(toolbar);\n", + "\n", + " function on_click_closure(name) {\n", + " return function (_event) {\n", + " return fig.toolbar_button_onclick(name);\n", + " };\n", + " }\n", + "\n", + " function on_mouseover_closure(tooltip) {\n", + " return function (event) {\n", + " if (!event.currentTarget.disabled) {\n", + " return fig.toolbar_button_onmouseover(tooltip);\n", + " }\n", + " };\n", + " }\n", + "\n", + " fig.buttons = {};\n", + " var buttonGroup = document.createElement('div');\n", + " buttonGroup.classList = 'mpl-button-group';\n", + " for (var toolbar_ind in mpl.toolbar_items) {\n", + " var name = mpl.toolbar_items[toolbar_ind][0];\n", + " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", + " var image = mpl.toolbar_items[toolbar_ind][2];\n", + " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", + "\n", + " if (!name) {\n", + " /* Instead of a spacer, we start a new button group. */\n", + " if (buttonGroup.hasChildNodes()) {\n", + " toolbar.appendChild(buttonGroup);\n", + " }\n", + " buttonGroup = document.createElement('div');\n", + " buttonGroup.classList = 'mpl-button-group';\n", + " continue;\n", + " }\n", + "\n", + " var button = (fig.buttons[name] = document.createElement('button'));\n", + " button.classList = 'mpl-widget';\n", + " button.setAttribute('role', 'button');\n", + " button.setAttribute('aria-disabled', 'false');\n", + " button.addEventListener('click', on_click_closure(method_name));\n", + " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n", + "\n", + " var icon_img = document.createElement('img');\n", + " icon_img.src = '_images/' + image + '.png';\n", + " icon_img.srcset = '_images/' + image + '_large.png 2x';\n", + " icon_img.alt = tooltip;\n", + " button.appendChild(icon_img);\n", + "\n", + " buttonGroup.appendChild(button);\n", + " }\n", + "\n", + " if (buttonGroup.hasChildNodes()) {\n", + " toolbar.appendChild(buttonGroup);\n", + " }\n", + "\n", + " var fmt_picker = document.createElement('select');\n", + " fmt_picker.classList = 'mpl-widget';\n", + " toolbar.appendChild(fmt_picker);\n", + " this.format_dropdown = fmt_picker;\n", + "\n", + " for (var ind in mpl.extensions) {\n", + " var fmt = mpl.extensions[ind];\n", + " var option = document.createElement('option');\n", + " option.selected = fmt === mpl.default_extension;\n", + " option.innerHTML = fmt;\n", + " fmt_picker.appendChild(option);\n", + " }\n", + "\n", + " var status_bar = document.createElement('span');\n", + " status_bar.classList = 'mpl-message';\n", + " toolbar.appendChild(status_bar);\n", + " this.message = status_bar;\n", + "};\n", + "\n", + "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n", + " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n", + " // which will in turn request a refresh of the image.\n", + " this.send_message('resize', { width: x_pixels, height: y_pixels });\n", + "};\n", + "\n", + "mpl.figure.prototype.send_message = function (type, properties) {\n", + " properties['type'] = type;\n", + " properties['figure_id'] = this.id;\n", + " this.ws.send(JSON.stringify(properties));\n", + "};\n", + "\n", + "mpl.figure.prototype.send_draw_message = function () {\n", + " if (!this.waiting) {\n", + " this.waiting = true;\n", + " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n", + " }\n", + "};\n", + "\n", + "mpl.figure.prototype.handle_save = function (fig, _msg) {\n", + " var format_dropdown = fig.format_dropdown;\n", + " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n", + " fig.ondownload(fig, format);\n", + "};\n", + "\n", + "mpl.figure.prototype.handle_resize = function (fig, msg) {\n", + " var size = msg['size'];\n", + " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n", + " fig._resize_canvas(size[0], size[1], msg['forward']);\n", + " fig.send_message('refresh', {});\n", + " }\n", + "};\n", + "\n", + "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n", + " var x0 = msg['x0'] / fig.ratio;\n", + " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n", + " var x1 = msg['x1'] / fig.ratio;\n", + " var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n", + " x0 = Math.floor(x0) + 0.5;\n", + " y0 = Math.floor(y0) + 0.5;\n", + " x1 = Math.floor(x1) + 0.5;\n", + " y1 = Math.floor(y1) + 0.5;\n", + " var min_x = Math.min(x0, x1);\n", + " var min_y = Math.min(y0, y1);\n", + " var width = Math.abs(x1 - x0);\n", + " var height = Math.abs(y1 - y0);\n", + "\n", + " fig.rubberband_context.clearRect(\n", + " 0,\n", + " 0,\n", + " fig.canvas.width / fig.ratio,\n", + " fig.canvas.height / fig.ratio\n", + " );\n", + "\n", + " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n", + "};\n", + "\n", + "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n", + " // Updates the figure title.\n", + " fig.header.textContent = msg['label'];\n", + "};\n", + "\n", + "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n", + " var cursor = msg['cursor'];\n", + " switch (cursor) {\n", + " case 0:\n", + " cursor = 'pointer';\n", + " break;\n", + " case 1:\n", + " cursor = 'default';\n", + " break;\n", + " case 2:\n", + " cursor = 'crosshair';\n", + " break;\n", + " case 3:\n", + " cursor = 'move';\n", + " break;\n", + " }\n", + " fig.rubberband_canvas.style.cursor = cursor;\n", + "};\n", + "\n", + "mpl.figure.prototype.handle_message = function (fig, msg) {\n", + " fig.message.textContent = msg['message'];\n", + "};\n", + "\n", + "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n", + " // Request the server to send over a new figure.\n", + " fig.send_draw_message();\n", + "};\n", + "\n", + "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n", + " fig.image_mode = msg['mode'];\n", + "};\n", + "\n", + "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n", + " for (var key in msg) {\n", + " if (!(key in fig.buttons)) {\n", + " continue;\n", + " }\n", + " fig.buttons[key].disabled = !msg[key];\n", + " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n", + " }\n", + "};\n", + "\n", + "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n", + " if (msg['mode'] === 'PAN') {\n", + " fig.buttons['Pan'].classList.add('active');\n", + " fig.buttons['Zoom'].classList.remove('active');\n", + " } else if (msg['mode'] === 'ZOOM') {\n", + " fig.buttons['Pan'].classList.remove('active');\n", + " fig.buttons['Zoom'].classList.add('active');\n", + " } else {\n", + " fig.buttons['Pan'].classList.remove('active');\n", + " fig.buttons['Zoom'].classList.remove('active');\n", + " }\n", + "};\n", + "\n", + "mpl.figure.prototype.updated_canvas_event = function () {\n", + " // Called whenever the canvas gets updated.\n", + " this.send_message('ack', {});\n", + "};\n", + "\n", + "// A function to construct a web socket function for onmessage handling.\n", + "// Called in the figure constructor.\n", + "mpl.figure.prototype._make_on_message_function = function (fig) {\n", + " return function socket_on_message(evt) {\n", + " if (evt.data instanceof Blob) {\n", + " var img = evt.data;\n", + " if (img.type !== 'image/png') {\n", + " /* FIXME: We get \"Resource interpreted as Image but\n", + " * transferred with MIME type text/plain:\" errors on\n", + " * Chrome. But how to set the MIME type? It doesn't seem\n", + " * to be part of the websocket stream */\n", + " img.type = 'image/png';\n", + " }\n", + "\n", + " /* Free the memory for the previous frames */\n", + " if (fig.imageObj.src) {\n", + " (window.URL || window.webkitURL).revokeObjectURL(\n", + " fig.imageObj.src\n", + " );\n", + " }\n", + "\n", + " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", + " img\n", + " );\n", + " fig.updated_canvas_event();\n", + " fig.waiting = false;\n", + " return;\n", + " } else if (\n", + " typeof evt.data === 'string' &&\n", + " evt.data.slice(0, 21) === 'data:image/png;base64'\n", + " ) {\n", + " fig.imageObj.src = evt.data;\n", + " fig.updated_canvas_event();\n", + " fig.waiting = false;\n", + " return;\n", + " }\n", + "\n", + " var msg = JSON.parse(evt.data);\n", + " var msg_type = msg['type'];\n", + "\n", + " // Call the \"handle_{type}\" callback, which takes\n", + " // the figure and JSON message as its only arguments.\n", + " try {\n", + " var callback = fig['handle_' + msg_type];\n", + " } catch (e) {\n", + " console.log(\n", + " \"No handler for the '\" + msg_type + \"' message type: \",\n", + " msg\n", + " );\n", + " return;\n", + " }\n", + "\n", + " if (callback) {\n", + " try {\n", + " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n", + " callback(fig, msg);\n", + " } catch (e) {\n", + " console.log(\n", + " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n", + " e,\n", + " e.stack,\n", + " msg\n", + " );\n", + " }\n", + " }\n", + " };\n", + "};\n", + "\n", + "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n", + "mpl.findpos = function (e) {\n", + " //this section is from http://www.quirksmode.org/js/events_properties.html\n", + " var targ;\n", + " if (!e) {\n", + " e = window.event;\n", + " }\n", + " if (e.target) {\n", + " targ = e.target;\n", + " } else if (e.srcElement) {\n", + " targ = e.srcElement;\n", + " }\n", + " if (targ.nodeType === 3) {\n", + " // defeat Safari bug\n", + " targ = targ.parentNode;\n", + " }\n", + "\n", + " // pageX,Y are the mouse positions relative to the document\n", + " var boundingRect = targ.getBoundingClientRect();\n", + " var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n", + " var y = e.pageY - (boundingRect.top + document.body.scrollTop);\n", + "\n", + " return { x: x, y: y };\n", + "};\n", + "\n", + "/*\n", + " * return a copy of an object with only non-object keys\n", + " * we need this to avoid circular references\n", + " * http://stackoverflow.com/a/24161582/3208463\n", + " */\n", + "function simpleKeys(original) {\n", + " return Object.keys(original).reduce(function (obj, key) {\n", + " if (typeof original[key] !== 'object') {\n", + " obj[key] = original[key];\n", + " }\n", + " return obj;\n", + " }, {});\n", + "}\n", + "\n", + "mpl.figure.prototype.mouse_event = function (event, name) {\n", + " var canvas_pos = mpl.findpos(event);\n", + "\n", + " if (name === 'button_press') {\n", + " this.canvas.focus();\n", + " this.canvas_div.focus();\n", + " }\n", + "\n", + " var x = canvas_pos.x * this.ratio;\n", + " var y = canvas_pos.y * this.ratio;\n", + "\n", + " this.send_message(name, {\n", + " x: x,\n", + " y: y,\n", + " button: event.button,\n", + " step: event.step,\n", + " guiEvent: simpleKeys(event),\n", + " });\n", + "\n", + " /* This prevents the web browser from automatically changing to\n", + " * the text insertion cursor when the button is pressed. We want\n", + " * to control all of the cursor setting manually through the\n", + " * 'cursor' event from matplotlib */\n", + " event.preventDefault();\n", + " return false;\n", + "};\n", + "\n", + "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n", + " // Handle any extra behaviour associated with a key event\n", + "};\n", + "\n", + "mpl.figure.prototype.key_event = function (event, name) {\n", + " // Prevent repeat events\n", + " if (name === 'key_press') {\n", + " if (event.key === this._key) {\n", + " return;\n", + " } else {\n", + " this._key = event.key;\n", + " }\n", + " }\n", + " if (name === 'key_release') {\n", + " this._key = null;\n", + " }\n", + "\n", + " var value = '';\n", + " if (event.ctrlKey && event.key !== 'Control') {\n", + " value += 'ctrl+';\n", + " }\n", + " else if (event.altKey && event.key !== 'Alt') {\n", + " value += 'alt+';\n", + " }\n", + " else if (event.shiftKey && event.key !== 'Shift') {\n", + " value += 'shift+';\n", + " }\n", + "\n", + " value += 'k' + event.key;\n", + "\n", + " this._key_event_extra(event, name);\n", + "\n", + " this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n", + " return false;\n", + "};\n", + "\n", + "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n", + " if (name === 'download') {\n", + " this.handle_save(this, null);\n", + " } else {\n", + " this.send_message('toolbar_button', { name: name });\n", + " }\n", + "};\n", + "\n", + "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n", + " this.message.textContent = tooltip;\n", + "};\n", + "\n", + "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n", + "// prettier-ignore\n", + "var _JSXTOOLS_RESIZE_OBSERVER=function(A){var t,i=new WeakMap,n=new WeakMap,a=new WeakMap,r=new WeakMap,o=new Set;function s(e){if(!(this instanceof s))throw new TypeError(\"Constructor requires 'new' operator\");i.set(this,e)}function h(){throw new TypeError(\"Function is not a constructor\")}function c(e,t,i,n){e=0 in arguments?Number(arguments[0]):0,t=1 in arguments?Number(arguments[1]):0,i=2 in arguments?Number(arguments[2]):0,n=3 in arguments?Number(arguments[3]):0,this.right=(this.x=this.left=e)+(this.width=i),this.bottom=(this.y=this.top=t)+(this.height=n),Object.freeze(this)}function d(){t=requestAnimationFrame(d);var s=new WeakMap,p=new Set;o.forEach((function(t){r.get(t).forEach((function(i){var r=t instanceof window.SVGElement,o=a.get(t),d=r?0:parseFloat(o.paddingTop),f=r?0:parseFloat(o.paddingRight),l=r?0:parseFloat(o.paddingBottom),u=r?0:parseFloat(o.paddingLeft),g=r?0:parseFloat(o.borderTopWidth),m=r?0:parseFloat(o.borderRightWidth),w=r?0:parseFloat(o.borderBottomWidth),b=u+f,F=d+l,v=(r?0:parseFloat(o.borderLeftWidth))+m,W=g+w,y=r?0:t.offsetHeight-W-t.clientHeight,E=r?0:t.offsetWidth-v-t.clientWidth,R=b+v,z=F+W,M=r?t.width:parseFloat(o.width)-R-E,O=r?t.height:parseFloat(o.height)-z-y;if(n.has(t)){var k=n.get(t);if(k[0]===M&&k[1]===O)return}n.set(t,[M,O]);var S=Object.create(h.prototype);S.target=t,S.contentRect=new c(u,d,M,O),s.has(i)||(s.set(i,[]),p.add(i)),s.get(i).push(S)}))})),p.forEach((function(e){i.get(e).call(e,s.get(e),e)}))}return s.prototype.observe=function(i){if(i instanceof window.Element){r.has(i)||(r.set(i,new Set),o.add(i),a.set(i,window.getComputedStyle(i)));var n=r.get(i);n.has(this)||n.add(this),cancelAnimationFrame(t),t=requestAnimationFrame(d)}},s.prototype.unobserve=function(i){if(i instanceof window.Element&&r.has(i)){var n=r.get(i);n.has(this)&&(n.delete(this),n.size||(r.delete(i),o.delete(i))),n.size||r.delete(i),o.size||cancelAnimationFrame(t)}},A.DOMRectReadOnly=c,A.ResizeObserver=s,A.ResizeObserverEntry=h,A}; // eslint-disable-line\n", + "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", + "\n", + "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n", + "\n", + "mpl.default_extension = \"png\";/* global mpl */\n", + "\n", + "var comm_websocket_adapter = function (comm) {\n", + " // Create a \"websocket\"-like object which calls the given IPython comm\n", + " // object with the appropriate methods. Currently this is a non binary\n", + " // socket, so there is still some room for performance tuning.\n", + " var ws = {};\n", + "\n", + " ws.binaryType = comm.kernel.ws.binaryType;\n", + " ws.readyState = comm.kernel.ws.readyState;\n", + " function updateReadyState(_event) {\n", + " if (comm.kernel.ws) {\n", + " ws.readyState = comm.kernel.ws.readyState;\n", + " } else {\n", + " ws.readyState = 3; // Closed state.\n", + " }\n", + " }\n", + " comm.kernel.ws.addEventListener('open', updateReadyState);\n", + " comm.kernel.ws.addEventListener('close', updateReadyState);\n", + " comm.kernel.ws.addEventListener('error', updateReadyState);\n", + "\n", + " ws.close = function () {\n", + " comm.close();\n", + " };\n", + " ws.send = function (m) {\n", + " //console.log('sending', m);\n", + " comm.send(m);\n", + " };\n", + " // Register the callback with on_msg.\n", + " comm.on_msg(function (msg) {\n", + " //console.log('receiving', msg['content']['data'], msg);\n", + " var data = msg['content']['data'];\n", + " if (data['blob'] !== undefined) {\n", + " data = {\n", + " data: new Blob(msg['buffers'], { type: data['blob'] }),\n", + " };\n", + " }\n", + " // Pass the mpl event to the overridden (by mpl) onmessage function.\n", + " ws.onmessage(data);\n", + " });\n", + " return ws;\n", + "};\n", + "\n", + "mpl.mpl_figure_comm = function (comm, msg) {\n", + " // This is the function which gets called when the mpl process\n", + " // starts-up an IPython Comm through the \"matplotlib\" channel.\n", + "\n", + " var id = msg.content.data.id;\n", + " // Get hold of the div created by the display call when the Comm\n", + " // socket was opened in Python.\n", + " var element = document.getElementById(id);\n", + " var ws_proxy = comm_websocket_adapter(comm);\n", + "\n", + " function ondownload(figure, _format) {\n", + " window.open(figure.canvas.toDataURL());\n", + " }\n", + "\n", + " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n", + "\n", + " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n", + " // web socket which is closed, not our websocket->open comm proxy.\n", + " ws_proxy.onopen();\n", + "\n", + " fig.parent_element = element;\n", + " fig.cell_info = mpl.find_output_cell(\"
\");\n", + " if (!fig.cell_info) {\n", + " console.error('Failed to find cell for figure', id, fig);\n", + " return;\n", + " }\n", + " fig.cell_info[0].output_area.element.on(\n", + " 'cleared',\n", + " { fig: fig },\n", + " fig._remove_fig_handler\n", + " );\n", + "};\n", + "\n", + "mpl.figure.prototype.handle_close = function (fig, msg) {\n", + " var width = fig.canvas.width / fig.ratio;\n", + " fig.cell_info[0].output_area.element.off(\n", + " 'cleared',\n", + " fig._remove_fig_handler\n", + " );\n", + " fig.resizeObserverInstance.unobserve(fig.canvas_div);\n", + "\n", + " // Update the output cell to use the data from the current canvas.\n", + " fig.push_to_output();\n", + " var dataURL = fig.canvas.toDataURL();\n", + " // Re-enable the keyboard manager in IPython - without this line, in FF,\n", + " // the notebook keyboard shortcuts fail.\n", + " IPython.keyboard_manager.enable();\n", + " fig.parent_element.innerHTML =\n", + " '';\n", + " fig.close_ws(fig, msg);\n", + "};\n", + "\n", + "mpl.figure.prototype.close_ws = function (fig, msg) {\n", + " fig.send_message('closing', msg);\n", + " // fig.ws.close()\n", + "};\n", + "\n", + "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n", + " // Turn the data on the canvas into data in the output cell.\n", + " var width = this.canvas.width / this.ratio;\n", + " var dataURL = this.canvas.toDataURL();\n", + " this.cell_info[1]['text/html'] =\n", + " '';\n", + "};\n", + "\n", + "mpl.figure.prototype.updated_canvas_event = function () {\n", + " // Tell IPython that the notebook contents must change.\n", + " IPython.notebook.set_dirty(true);\n", + " this.send_message('ack', {});\n", + " var fig = this;\n", + " // Wait a second, then push the new image to the DOM so\n", + " // that it is saved nicely (might be nice to debounce this).\n", + " setTimeout(function () {\n", + " fig.push_to_output();\n", + " }, 1000);\n", + "};\n", + "\n", + "mpl.figure.prototype._init_toolbar = function () {\n", + " var fig = this;\n", + "\n", + " var toolbar = document.createElement('div');\n", + " toolbar.classList = 'btn-toolbar';\n", + " this.root.appendChild(toolbar);\n", + "\n", + " function on_click_closure(name) {\n", + " return function (_event) {\n", + " return fig.toolbar_button_onclick(name);\n", + " };\n", + " }\n", + "\n", + " function on_mouseover_closure(tooltip) {\n", + " return function (event) {\n", + " if (!event.currentTarget.disabled) {\n", + " return fig.toolbar_button_onmouseover(tooltip);\n", + " }\n", + " };\n", + " }\n", + "\n", + " fig.buttons = {};\n", + " var buttonGroup = document.createElement('div');\n", + " buttonGroup.classList = 'btn-group';\n", + " var button;\n", + " for (var toolbar_ind in mpl.toolbar_items) {\n", + " var name = mpl.toolbar_items[toolbar_ind][0];\n", + " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", + " var image = mpl.toolbar_items[toolbar_ind][2];\n", + " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", + "\n", + " if (!name) {\n", + " /* Instead of a spacer, we start a new button group. */\n", + " if (buttonGroup.hasChildNodes()) {\n", + " toolbar.appendChild(buttonGroup);\n", + " }\n", + " buttonGroup = document.createElement('div');\n", + " buttonGroup.classList = 'btn-group';\n", + " continue;\n", + " }\n", + "\n", + " button = fig.buttons[name] = document.createElement('button');\n", + " button.classList = 'btn btn-default';\n", + " button.href = '#';\n", + " button.title = name;\n", + " button.innerHTML = '';\n", + " button.addEventListener('click', on_click_closure(method_name));\n", + " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n", + " buttonGroup.appendChild(button);\n", + " }\n", + "\n", + " if (buttonGroup.hasChildNodes()) {\n", + " toolbar.appendChild(buttonGroup);\n", + " }\n", + "\n", + " // Add the status bar.\n", + " var status_bar = document.createElement('span');\n", + " status_bar.classList = 'mpl-message pull-right';\n", + " toolbar.appendChild(status_bar);\n", + " this.message = status_bar;\n", + "\n", + " // Add the close button to the window.\n", + " var buttongrp = document.createElement('div');\n", + " buttongrp.classList = 'btn-group inline pull-right';\n", + " button = document.createElement('button');\n", + " button.classList = 'btn btn-mini btn-primary';\n", + " button.href = '#';\n", + " button.title = 'Stop Interaction';\n", + " button.innerHTML = '';\n", + " button.addEventListener('click', function (_evt) {\n", + " fig.handle_close(fig, {});\n", + " });\n", + " button.addEventListener(\n", + " 'mouseover',\n", + " on_mouseover_closure('Stop Interaction')\n", + " );\n", + " buttongrp.appendChild(button);\n", + " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n", + " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n", + "};\n", + "\n", + "mpl.figure.prototype._remove_fig_handler = function (event) {\n", + " var fig = event.data.fig;\n", + " if (event.target !== this) {\n", + " // Ignore bubbled events from children.\n", + " return;\n", + " }\n", + " fig.close_ws(fig, {});\n", + "};\n", + "\n", + "mpl.figure.prototype._root_extra_style = function (el) {\n", + " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n", + "};\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function (el) {\n", + " // this is important to make the div 'focusable\n", + " el.setAttribute('tabindex', 0);\n", + " // reach out to IPython and tell the keyboard manager to turn it's self\n", + " // off when our div gets focus\n", + "\n", + " // location in version 3\n", + " if (IPython.notebook.keyboard_manager) {\n", + " IPython.notebook.keyboard_manager.register_events(el);\n", + " } else {\n", + " // location in version 2\n", + " IPython.keyboard_manager.register_events(el);\n", + " }\n", + "};\n", + "\n", + "mpl.figure.prototype._key_event_extra = function (event, _name) {\n", + " var manager = IPython.notebook.keyboard_manager;\n", + " if (!manager) {\n", + " manager = IPython.keyboard_manager;\n", + " }\n", + "\n", + " // Check for shift+enter\n", + " if (event.shiftKey && event.which === 13) {\n", + " this.canvas_div.blur();\n", + " // select the cell after this one\n", + " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n", + " IPython.notebook.select(index + 1);\n", + " }\n", + "};\n", + "\n", + "mpl.figure.prototype.handle_save = function (fig, _msg) {\n", + " fig.ondownload(fig, null);\n", + "};\n", + "\n", + "mpl.find_output_cell = function (html_output) {\n", + " // Return the cell and output element which can be found *uniquely* in the notebook.\n", + " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", + " // IPython event is triggered only after the cells have been serialised, which for\n", + " // our purposes (turning an active figure into a static one), is too late.\n", + " var cells = IPython.notebook.get_cells();\n", + " var ncells = cells.length;\n", + " for (var i = 0; i < ncells; i++) {\n", + " var cell = cells[i];\n", + " if (cell.cell_type === 'code') {\n", + " for (var j = 0; j < cell.output_area.outputs.length; j++) {\n", + " var data = cell.output_area.outputs[j];\n", + " if (data.data) {\n", + " // IPython >= 3 moved mimebundle to data attribute of output\n", + " data = data.data;\n", + " }\n", + " if (data['text/html'] === html_output) {\n", + " return [cell, data, j];\n", + " }\n", + " }\n", + " }\n", + " }\n", + "};\n", + "\n", + "// Register the function which deals with the matplotlib target/channel.\n", + "// The kernel may be null if the page has been refreshed.\n", + "if (IPython.notebook.kernel !== null) {\n", + " IPython.notebook.kernel.comm_manager.register_target(\n", + " 'matplotlib',\n", + " mpl.mpl_figure_comm\n", + " );\n", + "}\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 326, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# t = [mpii['act'][v[1]]['act_id'][0][0] for v in vectors]\n", + "t = [cats.index(get_catname(mpii['act'][v[1]])) for v in vectors]\n", + "\n", + "fig = plt.figure()\n", + "ax = fig.add_subplot(1,3,(1,2))\n", + "ax_figures = fig.add_subplot(1,3,3)\n", + "\n", + "kdtree= scipy.spatial.KDTree(principalComponents[:,[0,1]]) # CHOICE only consider first two dimensions...\n", + "\n", + "\n", + "def show_closest(event):\n", + " closest = kdtree.query([event.xdata, event.ydata], workers=-1)\n", + " ax_figures.clear()\n", + " \n", + " distance, vector_idx = closest\n", + " annotation_idx = vectors[vector_idx][1]\n", + " points_idx = vectors[vector_idx][2]\n", + " anno_points = np.array(list(vector_points[points_idx].values()))\n", + " ax_figures.plot(anno_points[:,0], anno_points[:,1]*-1, 'o')\n", + " \n", + " for bone in bones:\n", + " if not all([bone[0] in vector_points[points_idx], bone[1] in vector_points[points_idx]]):\n", + " continue\n", + " ax_figures.plot([vector_points[points_idx][bone[0]][0], vector_points[points_idx][bone[1]][0]], [-vector_points[points_idx][bone[0]][1], -vector_points[points_idx][bone[1]][1]], color=bone[2])\n", + "\n", + "# ax_figures.plot(np.random.rand(10))\n", + "\n", + "\n", + "def onclick(event):\n", + " show_closest(event)\n", + "\n", + "processing = Lock()\n", + "def onmove(event):\n", + " if not event.xdata or not event.ydata:\n", + " return\n", + " \n", + " if processing.acquire(blocking=False):\n", + " try:\n", + " show_closest(event)\n", + " finally:\n", + " processing.release()\n", + " \n", + "\n", + "cid = fig.canvas.mpl_connect('motion_notify_event', onmove)\n", + "cid = fig.canvas.mpl_connect('button_press_event', onclick)\n", + "\n", + "ax.scatter(principalComponents[:,0], principalComponents[:,1], c=t, cmap=\"viridis\",alpha=.3, marker='x', linewidth=.5)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 308, + "id": "618794d1", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(17486, 17486)" + ] + }, + "execution_count": 308, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "closest[1], closest_old[1]" + ] + }, + { + "cell_type": "code", + "execution_count": 321, + "id": "660af381", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[[18.323586368221292,\n", + " 20.398791852918905,\n", + " 4.987799082127334,\n", + " 0.40959807507019436,\n", + " 12.429795844069234,\n", + " 16.96079790482587,\n", + " 5.768238809731072,\n", + " 3.234665667673784,\n", + " 2.764261279400277,\n", + " 28.889880637691366,\n", + " 6.257973328552808,\n", + " 0.954098950748553,\n", + " 11.425504813879593,\n", + " 30.728268671099034,\n", + " 7.83325651958665e-12],\n", + " 579,\n", + " 379]" + ] + }, + "execution_count": 321, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import random" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "33a24435", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "nr = random.randint(0, len(vectors)-1)\n", + "\n", + "imgidx = vectors[nr][1]\n", + "principalComponents[nr]\n", + "# vectors[6]\n", + "annotations = mpii['annolist'][0,imgidx]\n", + "anno_file = str(annotations[0]['name'][0][0][0])\n", + "filename = '/home/ruben/Documents/Projecten/2020/Security Vision/tryouts/MPII Human Pose Dataset/images/'+anno_file\n", + "print(mpii['act'][imgidx]['cat_name'],\n", + "mpii['act'][imgidx]['act_name'], mpii['act'][imgidx]['act_id'],\n", + "int(mpii['act'][imgidx]['act_id'][0][0])\n", + " )\n", + "Image.open(filename)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c02cb9d3", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "mpii", + "language": "python", + "name": "mpii" + }, + "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.9.2" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..946712a --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,24 @@ +[tool.poetry] +name = "pose sorting" +version = "0.1.0" +description = "" +authors = ["Ruben van de Ven "] + +[tool.poetry.dependencies] +python = ">=3.9,<3.10" +numpy = "^1.20.2" +matplotlib = "^3.4.1" +scipy = "^1.6.2" +adjustText = "^0.7.3" +tqdm = "^4.60.0" +tk = "^0.1.0" +sklearn = "^0.0" + +[tool.poetry.dev-dependencies] +ipython = "^7.22.0" +tk = "^0.1.0" +jupyter = "^1.0.0" + +[build-system] +requires = ["poetry-core>=1.0.0"] +build-backend = "poetry.core.masonry.api"