From 04cbe33804dddba9f8eed6b930bf653a0473392a Mon Sep 17 00:00:00 2001 From: aktersnurra Date: Wed, 3 Jun 2020 23:50:13 +0200 Subject: EMNIST dataset working. --- .gitignore | 8 + data/EMNIST/raw/metadata.toml | 3 + poetry.lock | 835 ++++++++++++++++++++++++- pyproject.toml | 5 + src/notebooks/01-look-at-emnist.ipynb | 284 +++++++++ src/text_recognizer/datasets/emnist_dataset.py | 12 + 6 files changed, 1144 insertions(+), 3 deletions(-) create mode 100644 data/EMNIST/raw/metadata.toml create mode 100644 src/notebooks/01-look-at-emnist.ipynb diff --git a/.gitignore b/.gitignore index b6e4761..6b4dac1 100644 --- a/.gitignore +++ b/.gitignore @@ -127,3 +127,11 @@ dmypy.json # Pyre type checker .pyre/ + +!data +data/* +!data/EMNIST +data/EMNIST/* +!data/EMNIST/raw +data/EMNIST/raw/* +!data/EMNIST/raw/metadata.toml diff --git a/data/EMNIST/raw/metadata.toml b/data/EMNIST/raw/metadata.toml new file mode 100644 index 0000000..10304ce --- /dev/null +++ b/data/EMNIST/raw/metadata.toml @@ -0,0 +1,3 @@ +filename = 'gzip.zip' +md5 = '58c8d27c78d21e728a6bc7b3cc06412e' +url = 'http://www.itl.nist.gov/iaui/vip/cs_links/EMNIST/gzip.zip' diff --git a/poetry.lock b/poetry.lock index 002e344..94c0a91 100644 --- a/poetry.lock +++ b/poetry.lock @@ -14,6 +14,15 @@ optional = false python-versions = "*" version = "1.4.4" +[[package]] +category = "dev" +description = "Disable App Nap on OS X 10.9" +marker = "sys_platform == \"darwin\" or platform_system == \"Darwin\" or python_version >= \"3.3\" and sys_platform == \"darwin\"" +name = "appnope" +optional = false +python-versions = "*" +version = "0.1.0" + [[package]] category = "dev" description = "Atomic file writes." @@ -48,6 +57,14 @@ version = "2.8.0" [package.dependencies] pytz = ">=2015.7" +[[package]] +category = "dev" +description = "Specifications for callback functions passed in to an API" +name = "backcall" +optional = false +python-versions = "*" +version = "0.1.0" + [[package]] category = "dev" description = "Security oriented static analyser for python code." @@ -83,6 +100,19 @@ typed-ast = ">=1.4.0" [package.extras] d = ["aiohttp (>=3.3.2)", "aiohttp-cors"] +[[package]] +category = "dev" +description = "An easy safelist-based HTML-sanitizing tool." +name = "bleach" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "3.1.5" + +[package.dependencies] +packaging = "*" +six = ">=1.9.0" +webencodings = "*" + [[package]] category = "main" description = "When they're not builtins, they're boltons." @@ -118,7 +148,7 @@ version = "7.1.2" [[package]] category = "main" description = "Cross-platform colored terminal text." -marker = "sys_platform == \"win32\" or platform_system == \"Windows\"" +marker = "sys_platform == \"win32\" or platform_system == \"Windows\" or python_version >= \"3.3\" and sys_platform == \"win32\"" name = "colorama" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" @@ -152,6 +182,17 @@ version = "*" [package.extras] toml = ["toml"] +[[package]] +category = "main" +description = "Composable style cycles" +name = "cycler" +optional = false +python-versions = "*" +version = "0.10.0" + +[package.dependencies] +six = "*" + [[package]] category = "main" description = "A utility for ensuring Google-style docstrings stay up to date with the source code." @@ -171,12 +212,19 @@ version = "0.6" [[package]] category = "dev" description = "Decorators for Humans" -marker = "python_version == \"3.7\"" name = "decorator" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*" version = "4.4.2" +[[package]] +category = "dev" +description = "XML bomb protection for Python stdlib modules" +name = "defusedxml" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "0.6.0" + [[package]] category = "main" description = "Deserialize to objects while staying DRY" @@ -229,6 +277,14 @@ toml = "*" [package.extras] pipenv = ["pipenv"] +[[package]] +category = "dev" +description = "Discover and load entry points from installed packages." +name = "entrypoints" +optional = false +python-versions = ">=2.7" +version = "0.3" + [[package]] category = "main" description = "the modular source code checker: pep8 pyflakes and co" @@ -451,6 +507,100 @@ zipp = ">=0.5" docs = ["sphinx", "rst.linker"] testing = ["packaging", "importlib-resources"] +[[package]] +category = "dev" +description = "IPython Kernel for Jupyter" +name = "ipykernel" +optional = false +python-versions = ">=3.5" +version = "5.3.0" + +[package.dependencies] +appnope = "*" +ipython = ">=5.0.0" +jupyter-client = "*" +tornado = ">=4.2" +traitlets = ">=4.1.0" + +[package.extras] +test = ["pytest (!=5.3.4)", "pytest-cov", "flaky", "nose"] + +[[package]] +category = "dev" +description = "IPython: Productive Interactive Computing" +name = "ipython" +optional = false +python-versions = ">=3.6" +version = "7.15.0" + +[package.dependencies] +appnope = "*" +backcall = "*" +colorama = "*" +decorator = "*" +jedi = ">=0.10" +pexpect = "*" +pickleshare = "*" +prompt-toolkit = ">=2.0.0,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.1.0" +pygments = "*" +setuptools = ">=18.5" +traitlets = ">=4.2" + +[package.extras] +all = ["Sphinx (>=1.3)", "ipykernel", "ipyparallel", "ipywidgets", "nbconvert", "nbformat", "nose (>=0.10.1)", "notebook", "numpy (>=1.14)", "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.14)"] + +[[package]] +category = "dev" +description = "Vestigial utilities from IPython" +name = "ipython-genutils" +optional = false +python-versions = "*" +version = "0.2.0" + +[[package]] +category = "dev" +description = "IPython HTML widgets for Jupyter" +name = "ipywidgets" +optional = false +python-versions = "*" +version = "7.5.1" + +[package.dependencies] +ipykernel = ">=4.5.1" +nbformat = ">=4.2.0" +traitlets = ">=4.3.1" +widgetsnbextension = ">=3.5.0,<3.6.0" + +[package.dependencies.ipython] +python = ">=3.3" +version = ">=4.0.0" + +[package.extras] +test = ["pytest (>=3.6.0)", "pytest-cov", "mock"] + +[[package]] +category = "dev" +description = "An autocompletion tool for Python that can be used for text editors." +name = "jedi" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "0.17.0" + +[package.dependencies] +parso = ">=0.7.0" + +[package.extras] +qa = ["flake8 (3.7.9)"] +testing = ["colorama", "docopt", "pytest (>=3.9.0,<5.0.0)"] + [[package]] category = "main" description = "A very fast and expressive template engine." @@ -465,6 +615,115 @@ MarkupSafe = ">=0.23" [package.extras] i18n = ["Babel (>=0.8)"] +[[package]] +category = "dev" +description = "An implementation of JSON Schema validation for Python" +name = "jsonschema" +optional = false +python-versions = "*" +version = "3.2.0" + +[package.dependencies] +attrs = ">=17.4.0" +pyrsistent = ">=0.14.0" +setuptools = "*" +six = ">=1.11.0" + +[package.dependencies.importlib-metadata] +python = "<3.8" +version = "*" + +[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]] +category = "dev" +description = "Jupyter metapackage. Install all the Jupyter components in one go." +name = "jupyter" +optional = false +python-versions = "*" +version = "1.0.0" + +[package.dependencies] +ipykernel = "*" +ipywidgets = "*" +jupyter-console = "*" +nbconvert = "*" +notebook = "*" +qtconsole = "*" + +[[package]] +category = "dev" +description = "Jupyter protocol implementation and client libraries" +name = "jupyter-client" +optional = false +python-versions = ">=3.5" +version = "6.1.3" + +[package.dependencies] +jupyter-core = ">=4.6.0" +python-dateutil = ">=2.1" +pyzmq = ">=13" +tornado = ">=4.1" +traitlets = "*" + +[package.extras] +test = ["ipykernel", "ipython", "mock", "pytest"] + +[[package]] +category = "dev" +description = "Jupyter terminal console" +name = "jupyter-console" +optional = false +python-versions = ">=3.5" +version = "6.1.0" + +[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]] +category = "dev" +description = "Jupyter core package. A base package on which Jupyter projects rely." +name = "jupyter-core" +optional = false +python-versions = "!=3.0,!=3.1,!=3.2,!=3.3,!=3.4,>=2.7" +version = "4.6.3" + +[package.dependencies] +pywin32 = ">=1.0" +traitlets = "*" + +[[package]] +category = "main" +description = "A fast implementation of the Cassowary constraint solver" +name = "kiwisolver" +optional = false +python-versions = ">=3.6" +version = "1.2.0" + +[[package]] +category = "main" +description = "Python logging made (stupidly) simple" +name = "loguru" +optional = false +python-versions = ">=3.5" +version = "0.5.0" + +[package.dependencies] +colorama = ">=0.3.4" +win32-setctime = ">=1.0.0" + +[package.extras] +dev = ["codecov (>=2.0.15)", "colorama (>=0.3.4)", "flake8 (>=3.7.7)", "isort (>=4.3.20)", "tox (>=3.9.0)", "tox-travis (>=0.12)", "pytest (>=4.6.2)", "pytest-cov (>=2.7.1)", "Sphinx (>=2.2.1)", "sphinx-autobuild (>=0.7.1)", "sphinx-rtd-theme (>=0.4.3)", "black (>=19.3b0)"] + [[package]] category = "main" description = "Safely add untrusted strings to HTML/XML markup." @@ -487,6 +746,21 @@ docs = ["sphinx (3.0.3)", "sphinx-issues (1.2.0)", "alabaster (0.7.12)", "sphinx lint = ["mypy (0.770)", "flake8 (3.7.9)", "flake8-bugbear (20.1.4)", "pre-commit (>=1.20,<3.0)"] tests = ["pytest", "pytz", "simplejson"] +[[package]] +category = "main" +description = "Python plotting package" +name = "matplotlib" +optional = false +python-versions = ">=3.6" +version = "3.2.1" + +[package.dependencies] +cycler = ">=0.10" +kiwisolver = ">=1.0.1" +numpy = ">=1.11" +pyparsing = ">=2.0.1,<2.0.4 || >2.0.4,<2.1.2 || >2.1.2,<2.1.6 || >2.1.6" +python-dateutil = ">=2.1" + [[package]] category = "main" description = "McCabe checker, plugin for flake8" @@ -495,6 +769,14 @@ optional = false python-versions = "*" version = "0.6.1" +[[package]] +category = "dev" +description = "The fastest markdown parser in pure Python" +name = "mistune" +optional = false +python-versions = "*" +version = "0.8.4" + [[package]] category = "dev" description = "More routines for operating on iterables, beyond itertools" @@ -527,6 +809,51 @@ optional = false python-versions = "*" version = "0.4.3" +[[package]] +category = "dev" +description = "Converting Jupyter Notebooks" +name = "nbconvert" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "5.6.1" + +[package.dependencies] +bleach = "*" +defusedxml = "*" +entrypoints = ">=0.2.2" +jinja2 = ">=2.4" +jupyter-core = "*" +mistune = ">=0.8.1,<2" +nbformat = ">=4.4" +pandocfilters = ">=1.4.1" +pygments = "*" +testpath = "*" +traitlets = ">=4.2" + +[package.extras] +all = ["pytest", "pytest-cov", "ipykernel", "jupyter-client (>=5.3.1)", "ipywidgets (>=7)", "pebble", "tornado (>=4.0)", "sphinx (>=1.5.1)", "sphinx-rtd-theme", "nbsphinx (>=0.2.12)", "sphinxcontrib-github-alt", "ipython", "mock"] +docs = ["sphinx (>=1.5.1)", "sphinx-rtd-theme", "nbsphinx (>=0.2.12)", "sphinxcontrib-github-alt", "ipython", "jupyter-client (>=5.3.1)"] +execute = ["jupyter-client (>=5.3.1)"] +serve = ["tornado (>=4.0)"] +test = ["pytest", "pytest-cov", "ipykernel", "jupyter-client (>=5.3.1)", "ipywidgets (>=7)", "pebble", "mock"] + +[[package]] +category = "dev" +description = "The Jupyter Notebook format" +name = "nbformat" +optional = false +python-versions = ">=3.5" +version = "5.0.6" + +[package.dependencies] +ipython-genutils = "*" +jsonschema = ">=2.4,<2.5.0 || >2.5.0" +jupyter-core = "*" +traitlets = ">=4.1" + +[package.extras] +test = ["testpath", "pytest", "pytest-cov"] + [[package]] category = "dev" description = "Python package for creating and manipulating graphs and networks" @@ -561,6 +888,32 @@ optional = false python-versions = "*" version = "1.9.0.post1" +[[package]] +category = "dev" +description = "A web-based notebook environment for interactive computing" +name = "notebook" +optional = false +python-versions = ">=3.5" +version = "6.0.3" + +[package.dependencies] +Send2Trash = "*" +ipykernel = "*" +ipython-genutils = "*" +jinja2 = "*" +jupyter-client = ">=5.3.4" +jupyter-core = ">=4.6.1" +nbconvert = "*" +nbformat = "*" +prometheus-client = "*" +pyzmq = ">=17" +terminado = ">=0.8.1" +tornado = ">=5.0" +traitlets = ">=4.2.1" + +[package.extras] +test = ["nose", "coverage", "requests", "nose-warnings-filters", "nbval", "nose-exclude", "selenium", "pytest", "pytest-cov", "nose-exclude"] + [[package]] category = "main" description = "NumPy is the fundamental package for array computing with Python." @@ -589,6 +942,25 @@ version = "20.4" pyparsing = ">=2.0.2" six = "*" +[[package]] +category = "dev" +description = "Utilities for writing pandoc filters in python" +name = "pandocfilters" +optional = false +python-versions = "*" +version = "1.4.2" + +[[package]] +category = "dev" +description = "A Python Parser" +name = "parso" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "0.7.0" + +[package.extras] +testing = ["docopt", "pytest (>=3.0.7)"] + [[package]] category = "dev" description = "Utility library for gitignore style pattern matching of file paths." @@ -613,6 +985,26 @@ optional = false python-versions = "*" version = "5.4.5" +[[package]] +category = "dev" +description = "Pexpect allows easy control of interactive console applications." +marker = "python_version >= \"3.3\" and sys_platform != \"win32\" or sys_platform != \"win32\"" +name = "pexpect" +optional = false +python-versions = "*" +version = "4.8.0" + +[package.dependencies] +ptyprocess = ">=0.5" + +[[package]] +category = "dev" +description = "Tiny 'shelve'-like database with concurrency support" +name = "pickleshare" +optional = false +python-versions = "*" +version = "0.7.5" + [[package]] category = "main" description = "Python Imaging Library (Fork)" @@ -637,6 +1029,17 @@ version = ">=0.12" [package.extras] dev = ["pre-commit", "tox"] +[[package]] +category = "dev" +description = "Python client for the Prometheus monitoring system." +name = "prometheus-client" +optional = false +python-versions = "*" +version = "0.8.0" + +[package.extras] +twisted = ["twisted"] + [[package]] category = "main" description = "Promises/A+ implementation for Python" @@ -651,6 +1054,17 @@ six = "*" [package.extras] test = ["pytest (>=2.7.3)", "pytest-cov", "coveralls", "futures", "pytest-benchmark", "mock"] +[[package]] +category = "dev" +description = "Library for building powerful interactive command lines in Python" +name = "prompt-toolkit" +optional = false +python-versions = ">=3.6.1" +version = "3.0.5" + +[package.dependencies] +wcwidth = "*" + [[package]] category = "main" description = "Cross-platform lib for process and system monitoring in Python." @@ -662,6 +1076,15 @@ version = "5.7.0" [package.extras] enum = ["enum34"] +[[package]] +category = "dev" +description = "Run a subprocess in a pseudo terminal" +marker = "python_version >= \"3.3\" and sys_platform != \"win32\" or sys_platform != \"win32\" or os_name != \"nt\" or python_version >= \"3.3\" and sys_platform != \"win32\" and (python_version >= \"3.3\" and sys_platform != \"win32\" or sys_platform != \"win32\")" +name = "ptyprocess" +optional = false +python-versions = "*" +version = "0.6.0" + [[package]] category = "dev" description = "library with cross-python path, ini-parsing, io, code, log facilities" @@ -713,6 +1136,17 @@ optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" version = "2.4.7" +[[package]] +category = "dev" +description = "Persistent/Functional/Immutable data structures" +name = "pyrsistent" +optional = false +python-versions = "*" +version = "0.16.0" + +[package.dependencies] +six = "*" + [[package]] category = "dev" description = "pytest: simple powerful testing with Python" @@ -804,6 +1238,24 @@ optional = false python-versions = "*" version = "2020.1" +[[package]] +category = "dev" +description = "Python for Window Extensions" +marker = "sys_platform == \"win32\"" +name = "pywin32" +optional = false +python-versions = "*" +version = "227" + +[[package]] +category = "dev" +description = "Python bindings for the winpty library" +marker = "os_name == \"nt\"" +name = "pywinpty" +optional = false +python-versions = "*" +version = "0.5.7" + [[package]] category = "main" description = "YAML parser and emitter for Python" @@ -812,6 +1264,44 @@ optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" version = "5.3.1" +[[package]] +category = "dev" +description = "Python bindings for 0MQ" +name = "pyzmq" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*" +version = "19.0.1" + +[[package]] +category = "dev" +description = "Jupyter Qt console" +name = "qtconsole" +optional = false +python-versions = "*" +version = "4.7.4" + +[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 = ["pytest", "mock"] + +[[package]] +category = "dev" +description = "Provides an abstraction layer on top of the various Qt bindings (PyQt5, PyQt4 and PySide) and additional custom QWidgets." +name = "qtpy" +optional = false +python-versions = "*" +version = "1.9.0" + [[package]] category = "dev" description = "Alternative regular expression module, to replace re." @@ -853,6 +1343,14 @@ packaging = "*" requests = "*" setuptools = "*" +[[package]] +category = "dev" +description = "Send file to trash natively under Mac OS X, Windows and Linux." +name = "send2trash" +optional = false +python-versions = "*" +version = "1.5.0" + [[package]] category = "main" description = "Python client for Sentry (https://getsentry.com)" @@ -1060,6 +1558,30 @@ optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, <4" version = "3.5.4" +[[package]] +category = "dev" +description = "Terminals served to xterm.js using Tornado websockets" +name = "terminado" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "0.8.3" + +[package.dependencies] +ptyprocess = "*" +pywinpty = ">=0.5" +tornado = ">=4" + +[[package]] +category = "dev" +description = "Test utilities for code working with files and commands" +name = "testpath" +optional = false +python-versions = "*" +version = "0.4.4" + +[package.extras] +test = ["pathlib2"] + [[package]] category = "main" description = "Python Library for Tom's Obvious, Minimal Language" @@ -1104,6 +1626,30 @@ torch = "1.5.0" [package.extras] scipy = ["scipy"] +[[package]] +category = "dev" +description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." +name = "tornado" +optional = false +python-versions = ">= 3.5" +version = "6.0.4" + +[[package]] +category = "dev" +description = "Traitlets Python config system" +name = "traitlets" +optional = false +python-versions = "*" +version = "4.3.3" + +[package.dependencies] +decorator = "*" +ipython-genutils = "*" +six = "*" + +[package.extras] +test = ["pytest", "mock"] + [[package]] category = "main" description = "a fork of Python 2 and 3 ast modules with type comment support" @@ -1207,6 +1753,37 @@ optional = false python-versions = "*" version = "0.1.9" +[[package]] +category = "dev" +description = "Character encoding aliases for legacy web content" +name = "webencodings" +optional = false +python-versions = "*" +version = "0.5.1" + +[[package]] +category = "dev" +description = "IPython HTML widgets for Jupyter" +name = "widgetsnbextension" +optional = false +python-versions = "*" +version = "3.5.1" + +[package.dependencies] +notebook = ">=4.4.1" + +[[package]] +category = "main" +description = "A small Python utility to set file creation time on Windows" +marker = "sys_platform == \"win32\"" +name = "win32-setctime" +optional = false +python-versions = ">=3.5" +version = "1.0.1" + +[package.extras] +dev = ["pytest (>=4.6.2)", "black (>=19.3b0)"] + [[package]] category = "dev" description = "A rewrite of the builtin doctest module" @@ -1237,7 +1814,7 @@ docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] testing = ["jaraco.itertools", "func-timeout"] [metadata] -content-hash = "28a1306f655411236197f65d0115edb67622686cd094fc7ef17ef434de8951b1" +content-hash = "baea2d4b995e2da9a1f07764142a9fef50bee4b61f2e041c8a05001f25cbc878" python-versions = "^3.7" [metadata.files] @@ -1249,6 +1826,10 @@ appdirs = [ {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, ] +appnope = [ + {file = "appnope-0.1.0-py2.py3-none-any.whl", hash = "sha256:5b26757dc6f79a3b7dc9fab95359328d5747fcb2409d331ea66d0272b90ab2a0"}, + {file = "appnope-0.1.0.tar.gz", hash = "sha256:8b995ffe925347a2138d7ac0fe77155e4311a0ea6d6da4f5128fe4b3cbe5ed71"}, +] atomicwrites = [ {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, @@ -1261,6 +1842,10 @@ babel = [ {file = "Babel-2.8.0-py2.py3-none-any.whl", hash = "sha256:d670ea0b10f8b723672d3a6abeb87b565b244da220d76b4dba1b66269ec152d4"}, {file = "Babel-2.8.0.tar.gz", hash = "sha256:1aac2ae2d0d8ea368fa90906567f5c08463d98ade155c0c4bfedd6a0f7160e38"}, ] +backcall = [ + {file = "backcall-0.1.0.tar.gz", hash = "sha256:38ecd85be2c1e78f77fd91700c76e14667dc21e2713b63876c0eb901196e01e4"}, + {file = "backcall-0.1.0.zip", hash = "sha256:bbbf4b1e5cd2bdb08f915895b51081c041bac22394fdfcfdfbe9f14b77c08bf2"}, +] bandit = [ {file = "bandit-1.6.2-py2.py3-none-any.whl", hash = "sha256:336620e220cf2d3115877685e264477ff9d9abaeb0afe3dc7264f55fa17a3952"}, {file = "bandit-1.6.2.tar.gz", hash = "sha256:41e75315853507aa145d62a78a2a6c5e3240fe14ee7c601459d0df9418196065"}, @@ -1269,6 +1854,10 @@ black = [ {file = "black-19.10b0-py36-none-any.whl", hash = "sha256:1b30e59be925fafc1ee4565e5e08abef6b03fe455102883820fe5ee2e4734e0b"}, {file = "black-19.10b0.tar.gz", hash = "sha256:c2edb73a08e9e0e6f65a0e6af18b059b8b1cdd5bef997d7a0b181df93dc81539"}, ] +bleach = [ + {file = "bleach-3.1.5-py2.py3-none-any.whl", hash = "sha256:2bce3d8fab545a6528c8fa5d9f9ae8ebc85a56da365c7f85180bfe96a35ef22f"}, + {file = "bleach-3.1.5.tar.gz", hash = "sha256:3c4c520fdb9db59ef139915a5db79f8b51bc2a7257ea0389f30c846883430a4b"}, +] boltons = [ {file = "boltons-20.1.0-py2.py3-none-any.whl", hash = "sha256:b3fc2b711f50cd975e726324d98e0bd5a324dd7e3b81d5e6a1b03c542d0c66c4"}, {file = "boltons-20.1.0.tar.gz", hash = "sha256:6e890b173c5f2dcb4ec62320b3799342ecb1a6a0b2253014455387665d62c213"}, @@ -1326,6 +1915,10 @@ coverage = [ {file = "coverage-5.1-cp39-cp39-win_amd64.whl", hash = "sha256:bb28a7245de68bf29f6fb199545d072d1036a1917dca17a1e75bbb919e14ee8e"}, {file = "coverage-5.1.tar.gz", hash = "sha256:f90bfc4ad18450c80b024036eaf91e4a246ae287701aaa88eaebebf150868052"}, ] +cycler = [ + {file = "cycler-0.10.0-py2.py3-none-any.whl", hash = "sha256:1d8a5ae1ff6c5cf9b93e8811e581232ad8920aeec647c37316ceac982b08cb2d"}, + {file = "cycler-0.10.0.tar.gz", hash = "sha256:cd7b2d1018258d7247a71425e9f26463dfb444d411c39569972f4ce586b0c9d8"}, +] darglint = [ {file = "darglint-1.3.1-py3-none-any.whl", hash = "sha256:77f2184ce05b585400f03c207168474081d080ad10bbdfca4762854bca76bfd7"}, {file = "darglint-1.3.1.tar.gz", hash = "sha256:6b62feb47f5d918eeb1a0eb6edf5ef96f4c302a1b3478e84a27ddfa11d05ec5b"}, @@ -1338,6 +1931,10 @@ decorator = [ {file = "decorator-4.4.2-py2.py3-none-any.whl", hash = "sha256:41fa54c2a0cc4ba648be4fd43cff00aedf5b9465c9bf18d64325bc225f08f760"}, {file = "decorator-4.4.2.tar.gz", hash = "sha256:e3a62f0520172440ca0dcc823749319382e377f37f140a0b99ef45fecb84bfe7"}, ] +defusedxml = [ + {file = "defusedxml-0.6.0-py2.py3-none-any.whl", hash = "sha256:6687150770438374ab581bb7a1b327a847dd9c5749e396102de3fad4e8a3ef93"}, + {file = "defusedxml-0.6.0.tar.gz", hash = "sha256:f684034d135af4c6cbb949b8a4d2ed61634515257a67299e5f940fbaa34377f5"}, +] desert = [ {file = "desert-2020.1.6-py2.py3-none-any.whl", hash = "sha256:190ab1c690472ab1c1ef7614f9a73171c1e911cef42d7b45a67f9b7d6900763d"}, {file = "desert-2020.1.6.tar.gz", hash = "sha256:e64cd61e16607bb3096ab1b1763c9f229ebcf8b3f871f4db52fb803e1c000385"}, @@ -1354,6 +1951,10 @@ dparse = [ {file = "dparse-0.5.1-py3-none-any.whl", hash = "sha256:e953a25e44ebb60a5c6efc2add4420c177f1d8404509da88da9729202f306994"}, {file = "dparse-0.5.1.tar.gz", hash = "sha256:a1b5f169102e1c894f9a7d5ccf6f9402a836a5d24be80a986c7ce9eaed78f367"}, ] +entrypoints = [ + {file = "entrypoints-0.3-py2.py3-none-any.whl", hash = "sha256:589f874b313739ad35be6e0cd7efde2a4e9b6fea91edcc34e58ecbb8dbe56d19"}, + {file = "entrypoints-0.3.tar.gz", hash = "sha256:c70dd71abe5a8c85e55e12c19bd91ccfeec11a6e99044204511f9ed547d48451"}, +] flake8 = [ {file = "flake8-3.8.2-py2.py3-none-any.whl", hash = "sha256:ccaa799ef9893cebe69fdfefed76865aeaefbb94cb8545617b2298786a4de9a5"}, {file = "flake8-3.8.2.tar.gz", hash = "sha256:c69ac1668e434d37a2d2880b3ca9aafd54b3a10a3ac1ab101d22f29e29cf8634"}, @@ -1447,10 +2048,73 @@ importlib-metadata = [ {file = "importlib_metadata-1.6.0-py2.py3-none-any.whl", hash = "sha256:2a688cbaa90e0cc587f1df48bdc97a6eadccdcd9c35fb3f976a09e3b5016d90f"}, {file = "importlib_metadata-1.6.0.tar.gz", hash = "sha256:34513a8a0c4962bc66d35b359558fd8a5e10cd472d37aec5f66858addef32c1e"}, ] +ipykernel = [ + {file = "ipykernel-5.3.0-py3-none-any.whl", hash = "sha256:a8362e3ae365023ca458effe93b026b8cdadc0b73ff3031472128dd8a2cf0289"}, + {file = "ipykernel-5.3.0.tar.gz", hash = "sha256:731adb3f2c4ebcaff52e10a855ddc87670359a89c9c784d711e62d66fccdafae"}, +] +ipython = [ + {file = "ipython-7.15.0-py3-none-any.whl", hash = "sha256:1b85d65632211bf5d3e6f1406f3393c8c429a47d7b947b9a87812aa5bce6595c"}, + {file = "ipython-7.15.0.tar.gz", hash = "sha256:0ef1433879816a960cd3ae1ae1dc82c64732ca75cec8dab5a4e29783fb571d0e"}, +] +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.5.1-py2.py3-none-any.whl", hash = "sha256:13ffeca438e0c0f91ae583dc22f50379b9d6b28390ac7be8b757140e9a771516"}, + {file = "ipywidgets-7.5.1.tar.gz", hash = "sha256:e945f6e02854a74994c596d9db83444a1850c01648f1574adf144fbbabe05c97"}, +] +jedi = [ + {file = "jedi-0.17.0-py2.py3-none-any.whl", hash = "sha256:cd60c93b71944d628ccac47df9a60fec53150de53d42dc10a7fc4b5ba6aae798"}, + {file = "jedi-0.17.0.tar.gz", hash = "sha256:df40c97641cb943661d2db4c33c2e1ff75d491189423249e989bcea4464f3030"}, +] jinja2 = [ {file = "Jinja2-2.11.2-py2.py3-none-any.whl", hash = "sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035"}, {file = "Jinja2-2.11.2.tar.gz", hash = "sha256:89aab215427ef59c34ad58735269eb58b1a5808103067f7bb9d5836c651b3bb0"}, ] +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.1.3-py3-none-any.whl", hash = "sha256:cde8e83aab3ec1c614f221ae54713a9a46d3bf28292609d2db1b439bef5a8c8e"}, + {file = "jupyter_client-6.1.3.tar.gz", hash = "sha256:3a32fa4d0b16d1c626b30c3002a62dfd86d6863ed39eaba3f537fade197bb756"}, +] +jupyter-console = [ + {file = "jupyter_console-6.1.0-py2.py3-none-any.whl", hash = "sha256:b392155112ec86a329df03b225749a0fa903aa80811e8eda55796a40b5e470d8"}, + {file = "jupyter_console-6.1.0.tar.gz", hash = "sha256:6f6ead433b0534909df789ea64f0a14cdf9b6b2360757756f08182be4b9e431b"}, +] +jupyter-core = [ + {file = "jupyter_core-4.6.3-py2.py3-none-any.whl", hash = "sha256:a4ee613c060fe5697d913416fc9d553599c05e4492d58fac1192c9a6844abb21"}, + {file = "jupyter_core-4.6.3.tar.gz", hash = "sha256:394fd5dd787e7c8861741880bdf8a00ce39f95de5d18e579c74b882522219e7e"}, +] +kiwisolver = [ + {file = "kiwisolver-1.2.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:443c2320520eda0a5b930b2725b26f6175ca4453c61f739fef7a5847bd262f74"}, + {file = "kiwisolver-1.2.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:efcf3397ae1e3c3a4a0a0636542bcad5adad3b1dd3e8e629d0b6e201347176c8"}, + {file = "kiwisolver-1.2.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:fccefc0d36a38c57b7bd233a9b485e2f1eb71903ca7ad7adacad6c28a56d62d2"}, + {file = "kiwisolver-1.2.0-cp36-none-win32.whl", hash = "sha256:60a78858580761fe611d22127868f3dc9f98871e6fdf0a15cc4203ed9ba6179b"}, + {file = "kiwisolver-1.2.0-cp36-none-win_amd64.whl", hash = "sha256:556da0a5f60f6486ec4969abbc1dd83cf9b5c2deadc8288508e55c0f5f87d29c"}, + {file = "kiwisolver-1.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7cc095a4661bdd8a5742aaf7c10ea9fac142d76ff1770a0f84394038126d8fc7"}, + {file = "kiwisolver-1.2.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:c955791d80e464da3b471ab41eb65cf5a40c15ce9b001fdc5bbc241170de58ec"}, + {file = "kiwisolver-1.2.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:603162139684ee56bcd57acc74035fceed7dd8d732f38c0959c8bd157f913fec"}, + {file = "kiwisolver-1.2.0-cp37-none-win32.whl", hash = "sha256:03662cbd3e6729f341a97dd2690b271e51a67a68322affab12a5b011344b973c"}, + {file = "kiwisolver-1.2.0-cp37-none-win_amd64.whl", hash = "sha256:4eadb361baf3069f278b055e3bb53fa189cea2fd02cb2c353b7a99ebb4477ef1"}, + {file = "kiwisolver-1.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c31bc3c8e903d60a1ea31a754c72559398d91b5929fcb329b1c3a3d3f6e72113"}, + {file = "kiwisolver-1.2.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:d52b989dc23cdaa92582ceb4af8d5bcc94d74b2c3e64cd6785558ec6a879793e"}, + {file = "kiwisolver-1.2.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:e586b28354d7b6584d8973656a7954b1c69c93f708c0c07b77884f91640b7657"}, + {file = "kiwisolver-1.2.0-cp38-none-win32.whl", hash = "sha256:d069ef4b20b1e6b19f790d00097a5d5d2c50871b66d10075dab78938dc2ee2cf"}, + {file = "kiwisolver-1.2.0-cp38-none-win_amd64.whl", hash = "sha256:18d749f3e56c0480dccd1714230da0f328e6e4accf188dd4e6884bdd06bf02dd"}, + {file = "kiwisolver-1.2.0.tar.gz", hash = "sha256:247800260cd38160c362d211dcaf4ed0f7816afb5efe56544748b21d6ad6d17f"}, +] +loguru = [ + {file = "loguru-0.5.0-py3-none-any.whl", hash = "sha256:4688d9e1f31d70e1ec7ccce5305967bc28f377eb1048d009108c11faebe05bcf"}, + {file = "loguru-0.5.0.tar.gz", hash = "sha256:1e0e6ff59be5e22f863d909ca989e34bb14c21b374f6af45281e603d003dbb96"}, +] 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"}, @@ -1490,10 +2154,30 @@ marshmallow = [ {file = "marshmallow-3.6.0-py2.py3-none-any.whl", hash = "sha256:f88fe96434b1f0f476d54224d59333eba8ca1a203a2695683c1855675c4049a7"}, {file = "marshmallow-3.6.0.tar.gz", hash = "sha256:c2673233aa21dde264b84349dc2fd1dce5f30ed724a0a00e75426734de5b84ab"}, ] +matplotlib = [ + {file = "matplotlib-3.2.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e06304686209331f99640642dee08781a9d55c6e32abb45ed54f021f46ccae47"}, + {file = "matplotlib-3.2.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:ce378047902b7a05546b6485b14df77b2ff207a0054e60c10b5680132090c8ee"}, + {file = "matplotlib-3.2.1-cp36-cp36m-win32.whl", hash = "sha256:2466d4dddeb0f5666fd1e6736cc5287a4f9f7ae6c1a9e0779deff798b28e1d35"}, + {file = "matplotlib-3.2.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f4412241e32d0f8d3713b68d3ca6430190a5e8a7c070f1c07d7833d8c5264398"}, + {file = "matplotlib-3.2.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e20ba7fb37d4647ac38f3c6d8672dd8b62451ee16173a0711b37ba0ce42bf37d"}, + {file = "matplotlib-3.2.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:282b3fc8023c4365bad924d1bb442ddc565c2d1635f210b700722776da466ca3"}, + {file = "matplotlib-3.2.1-cp37-cp37m-win32.whl", hash = "sha256:c1cf735970b7cd424502719b44288b21089863aaaab099f55e0283a721aaf781"}, + {file = "matplotlib-3.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:56d3147714da5c7ac4bc452d041e70e0e0b07c763f604110bd4e2527f320b86d"}, + {file = "matplotlib-3.2.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:af14e77829c5b5d5be11858d042d6f2459878f8e296228c7ea13ec1fd308eb68"}, + {file = "matplotlib-3.2.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:aae7d107dc37b4bb72dcc45f70394e6df2e5e92ac4079761aacd0e2ad1d3b1f7"}, + {file = "matplotlib-3.2.1-cp38-cp38-win32.whl", hash = "sha256:d35891a86a4388b6965c2d527b9a9f9e657d9e110b0575ca8a24ba0d4e34b8fc"}, + {file = "matplotlib-3.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:4bb50ee4755271a2017b070984bcb788d483a8ce3132fab68393d1555b62d4ba"}, + {file = "matplotlib-3.2.1-pp373-pypy36_pp73-win32.whl", hash = "sha256:7a9baefad265907c6f0b037c8c35a10cf437f7708c27415a5513cf09ac6d6ddd"}, + {file = "matplotlib-3.2.1.tar.gz", hash = "sha256:ffe2f9cdcea1086fc414e82f42271ecf1976700b8edd16ca9d376189c6d93aee"}, +] mccabe = [ {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, ] +mistune = [ + {file = "mistune-0.8.4-py2.py3-none-any.whl", hash = "sha256:88a1051873018da288eee8538d476dffe1262495144b33ecb586c4ab266bb8d4"}, + {file = "mistune-0.8.4.tar.gz", hash = "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e"}, +] more-itertools = [ {file = "more-itertools-8.3.0.tar.gz", hash = "sha256:558bb897a2232f5e4f8e2399089e35aecb746e1f9191b6584a151647e89267be"}, {file = "more_itertools-8.3.0-py3-none-any.whl", hash = "sha256:7818f596b1e87be009031c7653d01acc46ed422e6656b394b0f765ce66ed4982"}, @@ -1518,6 +2202,14 @@ mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, ] +nbconvert = [ + {file = "nbconvert-5.6.1-py2.py3-none-any.whl", hash = "sha256:f0d6ec03875f96df45aa13e21fd9b8450c42d7e1830418cccc008c0df725fcee"}, + {file = "nbconvert-5.6.1.tar.gz", hash = "sha256:21fb48e700b43e82ba0e3142421a659d7739b65568cc832a13976a77be16b523"}, +] +nbformat = [ + {file = "nbformat-5.0.6-py3-none-any.whl", hash = "sha256:276343c78a9660ab2a63c28cc33da5f7c58c092b3f3a40b6017ae2ce6689320d"}, + {file = "nbformat-5.0.6.tar.gz", hash = "sha256:049af048ed76b95c3c44043620c17e56bc001329e07f83fec4f177f0e3d7b757"}, +] networkx = [ {file = "networkx-2.4-py3-none-any.whl", hash = "sha256:cdfbf698749a5014bf2ed9db4a07a5295df1d3a53bf80bf3cbd61edf9df05fa1"}, {file = "networkx-2.4.tar.gz", hash = "sha256:f8f4ff0b6f96e4f9b16af6b84622597b5334bf9cae8cf9b2e42e7985d5c95c64"}, @@ -1535,6 +2227,10 @@ ninja = [ {file = "ninja-1.9.0.post1-py3-none-win_amd64.whl", hash = "sha256:db31cef1eb979e4fe4539046cf04311e00f271f8687bde7dfb64d85f4e4d2b1e"}, {file = "ninja-1.9.0.post1.tar.gz", hash = "sha256:6ef795816ef3cd3a2def4c4b8e5f1fb7e470bb913c0bae7bb38afe498d0075aa"}, ] +notebook = [ + {file = "notebook-6.0.3-py3-none-any.whl", hash = "sha256:3edc616c684214292994a3af05eaea4cc043f6b4247d830f3a2f209fa7639a80"}, + {file = "notebook-6.0.3.tar.gz", hash = "sha256:47a9092975c9e7965ada00b9a20f0cf637d001db60d241d479f53c0be117ad48"}, +] numpy = [ {file = "numpy-1.18.4-cp35-cp35m-macosx_10_9_intel.whl", hash = "sha256:efdba339fffb0e80fcc19524e4fdbda2e2b5772ea46720c44eaac28096d60720"}, {file = "numpy-1.18.4-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:2b573fcf6f9863ce746e4ad00ac18a948978bb3781cffa4305134d31801f3e26"}, @@ -1565,6 +2261,13 @@ packaging = [ {file = "packaging-20.4-py2.py3-none-any.whl", hash = "sha256:998416ba6962ae7fbd6596850b80e17859a5753ba17c32284f67bfff33784181"}, {file = "packaging-20.4.tar.gz", hash = "sha256:4357f74f47b9c12db93624a82154e9b120fa8293699949152b22065d556079f8"}, ] +pandocfilters = [ + {file = "pandocfilters-1.4.2.tar.gz", hash = "sha256:b3dd70e169bb5449e6bc6ff96aea89c5eea8c5f6ab5e207fc2f521a2cf4a0da9"}, +] +parso = [ + {file = "parso-0.7.0-py2.py3-none-any.whl", hash = "sha256:158c140fc04112dc45bca311633ae5033c2c2a7b732fa33d0955bad8152a8dd0"}, + {file = "parso-0.7.0.tar.gz", hash = "sha256:908e9fae2144a076d72ae4e25539143d40b8e3eafbaeae03c1bfe226f4cdf12c"}, +] pathspec = [ {file = "pathspec-0.8.0-py2.py3-none-any.whl", hash = "sha256:7d91249d21749788d07a2d0f94147accd8f845507400749ea19c1ec9054a12b0"}, {file = "pathspec-0.8.0.tar.gz", hash = "sha256:da45173eb3a6f2a5a487efba21f050af2b41948be6ab52b6a1e3ff22bb8b7061"}, @@ -1576,6 +2279,14 @@ pbr = [ {file = "pbr-5.4.5-py2.py3-none-any.whl", hash = "sha256:579170e23f8e0c2f24b0de612f71f648eccb79fb1322c814ae6b3c07b5ba23e8"}, {file = "pbr-5.4.5.tar.gz", hash = "sha256:07f558fece33b05caf857474a366dfcc00562bca13dd8b47b2b3e22d9f9bf55c"}, ] +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-7.1.2-cp35-cp35m-macosx_10_10_intel.whl", hash = "sha256:ae2b270f9a0b8822b98655cb3a59cdb1bd54a34807c6c56b76dd2e786c3b7db3"}, {file = "Pillow-7.1.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:d23e2aa9b969cf9c26edfb4b56307792b8b374202810bd949effd1c6e11ebd6d"}, @@ -1605,9 +2316,17 @@ pluggy = [ {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, ] +prometheus-client = [ + {file = "prometheus_client-0.8.0-py2.py3-none-any.whl", hash = "sha256:983c7ac4b47478720db338f1491ef67a100b474e3bc7dafcbaefb7d0b8f9b01c"}, + {file = "prometheus_client-0.8.0.tar.gz", hash = "sha256:c6e6b706833a6bd1fd51711299edee907857be10ece535126a158f911ee80915"}, +] promise = [ {file = "promise-2.3.tar.gz", hash = "sha256:dfd18337c523ba4b6a58801c164c1904a9d4d1b1747c7d5dbf45b693a49d93d0"}, ] +prompt-toolkit = [ + {file = "prompt_toolkit-3.0.5-py3-none-any.whl", hash = "sha256:df7e9e63aea609b1da3a65641ceaf5bc7d05e0a04de5bd45d05dbeffbabf9e04"}, + {file = "prompt_toolkit-3.0.5.tar.gz", hash = "sha256:563d1a4140b63ff9dd587bda9557cffb2fe73650205ab6f4383092fb882e7dc8"}, +] psutil = [ {file = "psutil-5.7.0-cp27-none-win32.whl", hash = "sha256:298af2f14b635c3c7118fd9183843f4e73e681bb6f01e12284d4d70d48a60953"}, {file = "psutil-5.7.0-cp27-none-win_amd64.whl", hash = "sha256:75e22717d4dbc7ca529ec5063000b2b294fc9a367f9c9ede1f65846c7955fd38"}, @@ -1621,6 +2340,10 @@ psutil = [ {file = "psutil-5.7.0-cp38-cp38-win_amd64.whl", hash = "sha256:d84029b190c8a66a946e28b4d3934d2ca1528ec94764b180f7d6ea57b0e75e26"}, {file = "psutil-5.7.0.tar.gz", hash = "sha256:685ec16ca14d079455892f25bd124df26ff9137664af445563c1bd36629b5e0e"}, ] +ptyprocess = [ + {file = "ptyprocess-0.6.0-py2.py3-none-any.whl", hash = "sha256:d7cc528d76e76342423ca640335bd3633420dc1366f258cb31d05e865ef5ca1f"}, + {file = "ptyprocess-0.6.0.tar.gz", hash = "sha256:923f299cc5ad920c68f2bc0bc98b75b9f838b93b599941a6b63ddbc2476394c0"}, +] py = [ {file = "py-1.8.1-py2.py3-none-any.whl", hash = "sha256:c20fdd83a5dbc0af9efd622bee9a5564e278f6380fffcacc43ba6f43db2813b0"}, {file = "py-1.8.1.tar.gz", hash = "sha256:5e27081401262157467ad6e7f851b7aa402c5852dbcb3dae06768434de5752aa"}, @@ -1645,6 +2368,9 @@ 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.16.0.tar.gz", hash = "sha256:28669905fe725965daa16184933676547c5bb40a5153055a8dee2a4bd7933ad3"}, +] pytest = [ {file = "pytest-5.4.2-py3-none-any.whl", hash = "sha256:95c710d0a72d91c13fae35dce195633c929c3792f54125919847fdcdf7caa0d3"}, {file = "pytest-5.4.2.tar.gz", hash = "sha256:eb2b5e935f6a019317e455b6da83dd8650ac9ffd2ee73a7b657a30873d67a698"}, @@ -1668,6 +2394,32 @@ pytz = [ {file = "pytz-2020.1-py2.py3-none-any.whl", hash = "sha256:a494d53b6d39c3c6e44c3bec237336e14305e4f29bbf800b599253057fbb79ed"}, {file = "pytz-2020.1.tar.gz", hash = "sha256:c35965d010ce31b23eeb663ed3cc8c906275d6be1a34393a1d73a41febf4a048"}, ] +pywin32 = [ + {file = "pywin32-227-cp27-cp27m-win32.whl", hash = "sha256:371fcc39416d736401f0274dd64c2302728c9e034808e37381b5e1b22be4a6b0"}, + {file = "pywin32-227-cp27-cp27m-win_amd64.whl", hash = "sha256:4cdad3e84191194ea6d0dd1b1b9bdda574ff563177d2adf2b4efec2a244fa116"}, + {file = "pywin32-227-cp35-cp35m-win32.whl", hash = "sha256:f4c5be1a293bae0076d93c88f37ee8da68136744588bc5e2be2f299a34ceb7aa"}, + {file = "pywin32-227-cp35-cp35m-win_amd64.whl", hash = "sha256:a929a4af626e530383a579431b70e512e736e9588106715215bf685a3ea508d4"}, + {file = "pywin32-227-cp36-cp36m-win32.whl", hash = "sha256:300a2db938e98c3e7e2093e4491439e62287d0d493fe07cce110db070b54c0be"}, + {file = "pywin32-227-cp36-cp36m-win_amd64.whl", hash = "sha256:9b31e009564fb95db160f154e2aa195ed66bcc4c058ed72850d047141b36f3a2"}, + {file = "pywin32-227-cp37-cp37m-win32.whl", hash = "sha256:47a3c7551376a865dd8d095a98deba954a98f326c6fe3c72d8726ca6e6b15507"}, + {file = "pywin32-227-cp37-cp37m-win_amd64.whl", hash = "sha256:31f88a89139cb2adc40f8f0e65ee56a8c585f629974f9e07622ba80199057511"}, + {file = "pywin32-227-cp38-cp38-win32.whl", hash = "sha256:7f18199fbf29ca99dff10e1f09451582ae9e372a892ff03a28528a24d55875bc"}, + {file = "pywin32-227-cp38-cp38-win_amd64.whl", hash = "sha256:7c1ae32c489dc012930787f06244426f8356e129184a02c25aef163917ce158e"}, + {file = "pywin32-227-cp39-cp39-win32.whl", hash = "sha256:c054c52ba46e7eb6b7d7dfae4dbd987a1bb48ee86debe3f245a2884ece46e295"}, + {file = "pywin32-227-cp39-cp39-win_amd64.whl", hash = "sha256:f27cec5e7f588c3d1051651830ecc00294f90728d19c3bf6916e6dba93ea357c"}, +] +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"}, +] pyyaml = [ {file = "PyYAML-5.3.1-cp27-cp27m-win32.whl", hash = "sha256:74809a57b329d6cc0fdccee6318f44b9b8649961fa73144a98735b0aaf029f1f"}, {file = "PyYAML-5.3.1-cp27-cp27m-win_amd64.whl", hash = "sha256:240097ff019d7c70a4922b6869d8a86407758333f02203e0fc6ff79c5dcede76"}, @@ -1681,6 +2433,44 @@ pyyaml = [ {file = "PyYAML-5.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:95f71d2af0ff4227885f7a6605c37fd53d3a106fcab511b8860ecca9fcf400ee"}, {file = "PyYAML-5.3.1.tar.gz", hash = "sha256:b8eac752c5e14d3eca0e6dd9199cd627518cb5ec06add0de9d32baeee6fe645d"}, ] +pyzmq = [ + {file = "pyzmq-19.0.1-cp27-cp27m-macosx_10_9_intel.whl", hash = "sha256:58688a2dfa044fad608a8e70ba8d019d0b872ec2acd75b7b5e37da8905605891"}, + {file = "pyzmq-19.0.1-cp27-cp27m-win32.whl", hash = "sha256:87c78f6936e2654397ca2979c1d323ee4a889eef536cc77a938c6b5be33351a7"}, + {file = "pyzmq-19.0.1-cp27-cp27m-win_amd64.whl", hash = "sha256:97b6255ae77328d0e80593681826a0479cb7bac0ba8251b4dd882f5145a2293a"}, + {file = "pyzmq-19.0.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:15b4cb21118f4589c4db8be4ac12b21c8b4d0d42b3ee435d47f686c32fe2e91f"}, + {file = "pyzmq-19.0.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:931339ac2000d12fe212e64f98ce291e81a7ec6c73b125f17cf08415b753c087"}, + {file = "pyzmq-19.0.1-cp35-cp35m-macosx_10_9_intel.whl", hash = "sha256:2a88b8fabd9cc35bd59194a7723f3122166811ece8b74018147a4ed8489e6421"}, + {file = "pyzmq-19.0.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:bafd651b557dd81d89bd5f9c678872f3e7b7255c1c751b78d520df2caac80230"}, + {file = "pyzmq-19.0.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:8952f6ba6ae598e792703f3134af5a01af8f5c7cf07e9a148f05a12b02412cea"}, + {file = "pyzmq-19.0.1-cp35-cp35m-win32.whl", hash = "sha256:54aa24fd60c4262286fc64ca632f9e747c7cc3a3a1144827490e1dc9b8a3a960"}, + {file = "pyzmq-19.0.1-cp35-cp35m-win_amd64.whl", hash = "sha256:dcbc3f30c11c60d709c30a213dc56e88ac016fe76ac6768e64717bd976072566"}, + {file = "pyzmq-19.0.1-cp36-cp36m-macosx_10_9_intel.whl", hash = "sha256:6ca519309703e95d55965735a667809bbb65f52beda2fdb6312385d3e7a6d234"}, + {file = "pyzmq-19.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:4ee0bfd82077a3ff11c985369529b12853a4064320523f8e5079b630f9551448"}, + {file = "pyzmq-19.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:ba6f24431b569aec674ede49cad197cad59571c12deed6ad8e3c596da8288217"}, + {file = "pyzmq-19.0.1-cp36-cp36m-win32.whl", hash = "sha256:956775444d01331c7eb412c5fb9bb62130dfaac77e09f32764ea1865234e2ca9"}, + {file = "pyzmq-19.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b08780e3a55215873b3b8e6e7ca8987f14c902a24b6ac081b344fd430d6ca7cd"}, + {file = "pyzmq-19.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:21f7d91f3536f480cb2c10d0756bfa717927090b7fb863e6323f766e5461ee1c"}, + {file = "pyzmq-19.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:bfff5ffff051f5aa47ba3b379d87bd051c3196b0c8a603e8b7ed68a6b4f217ec"}, + {file = "pyzmq-19.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:07fb8fe6826a229dada876956590135871de60dbc7de5a18c3bcce2ed1f03c98"}, + {file = "pyzmq-19.0.1-cp37-cp37m-win32.whl", hash = "sha256:342fb8a1dddc569bc361387782e8088071593e7eaf3e3ecf7d6bd4976edff112"}, + {file = "pyzmq-19.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:faee2604f279d31312bc455f3d024f160b6168b9c1dde22bf62d8c88a4deca8e"}, + {file = "pyzmq-19.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5b9d21fc56c8aacd2e6d14738021a9d64f3f69b30578a99325a728e38a349f85"}, + {file = "pyzmq-19.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:af0c02cf49f4f9eedf38edb4f3b6bb621d83026e7e5d76eb5526cc5333782fd6"}, + {file = "pyzmq-19.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:5f1f2eb22aab606f808163eb1d537ac9a0ba4283fbeb7a62eb48d9103cf015c2"}, + {file = "pyzmq-19.0.1-cp38-cp38-win32.whl", hash = "sha256:f9d7e742fb0196992477415bb34366c12e9bb9a0699b8b3f221ff93b213d7bec"}, + {file = "pyzmq-19.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:5b99c2ae8089ef50223c28bac57510c163bfdff158c9e90764f812b94e69a0e6"}, + {file = "pyzmq-19.0.1-pp27-pypy_73-macosx_10_9_x86_64.whl", hash = "sha256:cf5d689ba9513b9753959164cf500079383bc18859f58bf8ce06d8d4bef2b054"}, + {file = "pyzmq-19.0.1-pp36-pypy36_pp73-macosx_10_9_x86_64.whl", hash = "sha256:aaa8b40b676576fd7806839a5de8e6d5d1b74981e6376d862af6c117af2a3c10"}, + {file = "pyzmq-19.0.1.tar.gz", hash = "sha256:13a5638ab24d628a6ade8f794195e1a1acd573496c3b85af2f1183603b7bf5e0"}, +] +qtconsole = [ + {file = "qtconsole-4.7.4-py2.py3-none-any.whl", hash = "sha256:89442727940126c65c2f94a058f1b4693a0f5d4c4b192fd6518ba3b11f4791aa"}, + {file = "qtconsole-4.7.4.tar.gz", hash = "sha256:fd48bf1051d6e69cec1f9e2596cfaa94e3c726c70c5d848681ebce10c029f5fd"}, +] +qtpy = [ + {file = "QtPy-1.9.0-py2.py3-none-any.whl", hash = "sha256:fa0b8363b363e89b2a6f49eddc162a04c0699ae95e109a6be3bb145a913190ea"}, + {file = "QtPy-1.9.0.tar.gz", hash = "sha256:2db72c44b55d0fe1407be8fba35c838ad0d6d3bb81f23007886dc1fc0f459c8d"}, +] regex = [ {file = "regex-2020.5.14-cp27-cp27m-win32.whl", hash = "sha256:e565569fc28e3ba3e475ec344d87ed3cd8ba2d575335359749298a0899fe122e"}, {file = "regex-2020.5.14-cp27-cp27m-win_amd64.whl", hash = "sha256:d466967ac8e45244b9dfe302bbe5e3337f8dc4dec8d7d10f5e950d83b140d33a"}, @@ -1712,6 +2502,10 @@ safety = [ {file = "safety-1.9.0-py2.py3-none-any.whl", hash = "sha256:86c1c4a031fe35bd624fce143fbe642a0234d29f7cbf7a9aa269f244a955b087"}, {file = "safety-1.9.0.tar.gz", hash = "sha256:23bf20690d4400edc795836b0c983c2b4cbbb922233108ff925b7dd7750f00c9"}, ] +send2trash = [ + {file = "Send2Trash-1.5.0-py3-none-any.whl", hash = "sha256:f1691922577b6fa12821234aeb57599d887c4900b9ca537948d2dac34aea888b"}, + {file = "Send2Trash-1.5.0.tar.gz", hash = "sha256:60001cc07d707fe247c94f74ca6ac0d3255aabcb930529690897ca2a39db28b2"}, +] sentry-sdk = [ {file = "sentry-sdk-0.14.4.tar.gz", hash = "sha256:0e5e947d0f7a969314aa23669a94a9712be5a688ff069ff7b9fc36c66adc160c"}, {file = "sentry_sdk-0.14.4-py2.py3-none-any.whl", hash = "sha256:799a8bf76b012e3030a881be00e97bc0b922ce35dde699c6537122b751d80e2c"}, @@ -1776,6 +2570,14 @@ subprocess32 = [ {file = "subprocess32-3.5.4-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:88e37c1aac5388df41cc8a8456bb49ebffd321a3ad4d70358e3518176de3a56b"}, {file = "subprocess32-3.5.4.tar.gz", hash = "sha256:eb2937c80497978d181efa1b839ec2d9622cf9600a039a79d0e108d1f9aec79d"}, ] +terminado = [ + {file = "terminado-0.8.3-py2.py3-none-any.whl", hash = "sha256:a43dcb3e353bc680dd0783b1d9c3fc28d529f190bc54ba9a229f72fe6e7a54d7"}, + {file = "terminado-0.8.3.tar.gz", hash = "sha256:4804a774f802306a7d9af7322193c5390f1da0abb429e082a10ef1d46e6fb2c2"}, +] +testpath = [ + {file = "testpath-0.4.4-py2.py3-none-any.whl", hash = "sha256:bfcf9411ef4bf3db7579063e0546938b1edda3d69f4e1fb8756991f5951f85d4"}, + {file = "testpath-0.4.4.tar.gz", hash = "sha256:60e0a3261c149755f4399a1fff7d37523179a70fdc3abdf78de9fc2604aeec7e"}, +] toml = [ {file = "toml-0.10.1-py2.py3-none-any.whl", hash = "sha256:bda89d5935c2eac546d648028b9901107a595863cb36bae0c73ac804a9b4ce88"}, {file = "toml-0.10.1.tar.gz", hash = "sha256:926b612be1e5ce0634a2ca03470f95169cf16f939018233a670519cb4ac58b0f"}, @@ -1805,6 +2607,21 @@ torchvision = [ {file = "torchvision-0.6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:691d68f3726b7392fe37db7184aef8a6b6f7cf6ff38fae769b287b3d6e1eb69a"}, {file = "torchvision-0.6.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:ea39bed9e9497a67c5f66e37d3d5a663a0284868ae8616de81f65c66d9ad802b"}, ] +tornado = [ + {file = "tornado-6.0.4-cp35-cp35m-win32.whl", hash = "sha256:5217e601700f24e966ddab689f90b7ea4bd91ff3357c3600fa1045e26d68e55d"}, + {file = "tornado-6.0.4-cp35-cp35m-win_amd64.whl", hash = "sha256:c98232a3ac391f5faea6821b53db8db461157baa788f5d6222a193e9456e1740"}, + {file = "tornado-6.0.4-cp36-cp36m-win32.whl", hash = "sha256:5f6a07e62e799be5d2330e68d808c8ac41d4a259b9cea61da4101b83cb5dc673"}, + {file = "tornado-6.0.4-cp36-cp36m-win_amd64.whl", hash = "sha256:c952975c8ba74f546ae6de2e226ab3cc3cc11ae47baf607459a6728585bb542a"}, + {file = "tornado-6.0.4-cp37-cp37m-win32.whl", hash = "sha256:2c027eb2a393d964b22b5c154d1a23a5f8727db6fda837118a776b29e2b8ebc6"}, + {file = "tornado-6.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:5618f72e947533832cbc3dec54e1dffc1747a5cb17d1fd91577ed14fa0dc081b"}, + {file = "tornado-6.0.4-cp38-cp38-win32.whl", hash = "sha256:22aed82c2ea340c3771e3babc5ef220272f6fd06b5108a53b4976d0d722bcd52"}, + {file = "tornado-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:c58d56003daf1b616336781b26d184023ea4af13ae143d9dda65e31e534940b9"}, + {file = "tornado-6.0.4.tar.gz", hash = "sha256:0fe2d45ba43b00a41cd73f8be321a44936dc1aba233dee979f17a042b83eb6dc"}, +] +traitlets = [ + {file = "traitlets-4.3.3-py2.py3-none-any.whl", hash = "sha256:70b4c6a1d9019d7b4f6846832288f86998aa3b9207c6821f3578a6a6a467fe44"}, + {file = "traitlets-4.3.3.tar.gz", hash = "sha256:d023ee369ddd2763310e4c3eae1ff649689440d4ae59d7485eb4cfbbe3e359f7"}, +] typed-ast = [ {file = "typed_ast-1.4.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:73d785a950fc82dd2a25897d525d003f6378d1cb23ab305578394694202a58c3"}, {file = "typed_ast-1.4.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:aaee9905aee35ba5905cfb3c62f3e83b3bec7b39413f0a7f19be4e547ea01ebb"}, @@ -1857,6 +2674,18 @@ wcwidth = [ {file = "wcwidth-0.1.9-py2.py3-none-any.whl", hash = "sha256:cafe2186b3c009a04067022ce1dcd79cb38d8d65ee4f4791b8888d6599d1bbe1"}, {file = "wcwidth-0.1.9.tar.gz", hash = "sha256:ee73862862a156bf77ff92b09034fc4825dd3af9cf81bc5b360668d425f3c5f1"}, ] +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"}, +] +win32-setctime = [ + {file = "win32_setctime-1.0.1-py3-none-any.whl", hash = "sha256:568fd636c68350bcc54755213fe01966fe0a6c90b386c0776425944a0382abef"}, + {file = "win32_setctime-1.0.1.tar.gz", hash = "sha256:b47e5023ec7f0b4962950902b15bc56464a380d869f59d27dbf9ab423b23e8f9"}, +] xdoctest = [ {file = "xdoctest-0.12.0-py2.py3-none-any.whl", hash = "sha256:82424d2cc4b6d6b96b7b7134c81e97a4594c536547c1954533128a6a26cf1cb2"}, {file = "xdoctest-0.12.0.tar.gz", hash = "sha256:2d985d8d78d4444079d3b072965327ab06a5e6dcb4882f3561d7596eb4da6b13"}, diff --git a/pyproject.toml b/pyproject.toml index f8cd8b4..a1eff2e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -26,6 +26,8 @@ toml = "^0.10.1" torch = "^1.5.0" torchvision = "^0.6.0" torchsummary = "^1.5.1" +loguru = "^0.5.0" +matplotlib = "^3.2.1" [tool.poetry.dev-dependencies] pytest = "^5.4.2" @@ -44,9 +46,12 @@ pytype = {version = "^2020.5.13", python = "3.7"} typeguard = "^2.7.1" xdoctest = "^0.12.0" sphinx = "^3.0.4" +jupyter = "^1.0.0" [tool.coverage.report] fail_under = 50 +[tool.poetry.scripts] +download-emnist = "text_recognizer.datasets.emnist_dataset:download_emnist" [build-system] requires = ["poetry>=0.12"] build-backend = "poetry.masonry.api" diff --git a/src/notebooks/01-look-at-emnist.ipynb b/src/notebooks/01-look-at-emnist.ipynb new file mode 100644 index 0000000..403d4a7 --- /dev/null +++ b/src/notebooks/01-look-at-emnist.ipynb @@ -0,0 +1,284 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The autoreload extension is already loaded. To reload it, use:\n", + " %reload_ext autoreload\n" + ] + } + ], + "source": [ + "%load_ext autoreload\n", + "%autoreload 2\n", + "\n", + "%matplotlib inline\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "from importlib.util import find_spec\n", + "from torchvision.transforms import ToTensor\n", + "if find_spec(\"text_recognizer\") is None:\n", + " import sys\n", + " sys.path.append('..')" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + " from text_recognizer.datasets.emnist_dataset import fetch_dataloader" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": {}, + "outputs": [], + "source": [ + "from torchvision.datasets import EMNIST" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "data_dir = \"/home/akternurra/Documents/projects/quest-for-general-artifical-intelligence/projects/text-recognizer/data\"" + ] + }, + { + "cell_type": "code", + "execution_count": 106, + "metadata": {}, + "outputs": [], + "source": [ + "dl = fetch_dataloader(root=data_dir, train=True, split=\"byclass\", download=False, batch_size=1, transform=ToTensor())" + ] + }, + { + "cell_type": "code", + "execution_count": 123, + "metadata": {}, + "outputs": [], + "source": [ + "dataset = EMNIST(\n", + " root=data_dir,\n", + " split=\"byclass\",\n", + " train=True,\n", + " download=False,\n", + " transform=ToTensor())" + ] + }, + { + "cell_type": "code", + "execution_count": 119, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "697932" + ] + }, + "execution_count": 119, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(dataset)" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [], + "source": [ + "data = next(iter(dl))" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "metadata": {}, + "outputs": [], + "source": [ + "emnist_essentials = {\"mapping\": [[0, \"0\"], [1, \"1\"], [2, \"2\"], [3, \"3\"], [4, \"4\"], [5, \"5\"], [6, \"6\"], [7, \"7\"], [8, \"8\"], [9, \"9\"], [10, \"A\"], [11, \"B\"], [12, \"C\"], [13, \"D\"], [14, \"E\"], [15, \"F\"], [16, \"G\"], [17, \"H\"], [18, \"I\"], [19, \"J\"], [20, \"K\"], [21, \"L\"], [22, \"M\"], [23, \"N\"], [24, \"O\"], [25, \"P\"], [26, \"Q\"], [27, \"R\"], [28, \"S\"], [29, \"T\"], [30, \"U\"], [31, \"V\"], [32, \"W\"], [33, \"X\"], [34, \"Y\"], [35, \"Z\"], [36, \"a\"], [37, \"b\"], [38, \"c\"], [39, \"d\"], [40, \"e\"], [41, \"f\"], [42, \"g\"], [43, \"h\"], [44, \"i\"], [45, \"j\"], [46, \"k\"], [47, \"l\"], [48, \"m\"], [49, \"n\"], [50, \"o\"], [51, \"p\"], [52, \"q\"], [53, \"r\"], [54, \"s\"], [55, \"t\"], [56, \"u\"], [57, \"v\"], [58, \"w\"], [59, \"x\"], [60, \"y\"], [61, \"z\"]], \"input_shape\": [28, 28]}\n" + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'0'" + ] + }, + "execution_count": 78, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "emnist_essentials[\"mapping\"][0][-1]" + ] + }, + { + "cell_type": "code", + "execution_count": 124, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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sce6LKqFadOy7WodNZVdddVVFd03au6tRZNauYbBTb311ltVP3YzirbXLrc997p161wW1Wsket0qfS074rnnnnPZhRde6LLofe/JJ5902SuvvOKyVatWhcemKRMAAKBCTCgAAEBmTCgAAEBmTCgAAEBm7XbNmNk1ko6TtCSlNLaUXSzpHyV9sP/xN1JKLD+XQ++++67LFixY4LKo6WjSpEkuO/74410WNWrNnTs3HE/U6FUPzVDHu+yyS0VZ9L2PGsjqpRavedS0t9tuu1X9OHlS7xp+5513XBat0itJb7/9tst69+7d6WNHr29Hti+PrF271mWPPfaYy3r16uWyaJvzNWvWuKyrNF+WU8kZimslHRXk30spjSv9yu2bMFByrahjFNu1ooaRY+1OKFJKD0ry0zOgQKhjFB01jLzL0kNxjpnNNrNrzGxguRuZ2WQzm2lmMzMcC6iVduuYGkbOUcPIhc5OKH4qaTtJ4yS1SvpOuRumlKaklManlPwWl0BjVVTH1DByjBpGbnRqpcyU0uIPvjazqyXdVrURldGtW7cwjxp1osaYrtosEz3vqMHojjvucNmECRNc1q9fP5f179+/k6NrrEbUcRYnnHCCy6IGsttvv91ljWqGrZWoaW/XXXdtwEgaq5Y1HG3Z/dRTT4W3ffXVV102dOjQio4zcKA/qTJu3DiXjR492mXRluRSvE16lC1btqySIaJCnTpDYWYbr006SdKc6gwHqB/qGEVHDSNPKrls9HpJB0saYmYLJV0k6WAzGycpSWqRdGYNxwhkRh2j6Khh5F27E4qU0ilB/MsajAWoGeoYRUcNI+9YKRMAAGSWy+3LBw0a5LK//du/DW/bo0cPl0Vbdt9zzz0ue++99zoxuuKLGlmHDBniss0339xlNLzWR/Qabbnlli7bsGGDy2bNmlWTMeVJ1GAXrQa63Xbb1WM4TSlq5G1tbQ1ve++997ps7NixLuvZs6fLBg8e7LLDDz/cZRdddJHLrrzyynA80TjfeOMNl0V1hM7jDAUAAMiMCQUAAMiMCQUAAMiMCQUAAMiMCQUAAMisMFd5fPGLXwxv+5GPfMRlr7/+ussuu+wylz344IMui7qDo27nqLteyt8VD9ESxdFSt5/85CddFj2XRx991GXRVQV5+z4UTbTM8OTJk10WLXl855131mRMeRJ1569ataoBI+la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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig = plt.figure(figsize=(9, 9))\n", + "for i in range(9):\n", + " x, y = dataset[i]\n", + " ax = fig.add_subplot(3, 3, i + 1)\n", + " ax.imshow(x.reshape(28, 28).T, cmap='gray')\n", + " ax.set_title(emnist_essentials[\"mapping\"][int(y)][-1])" + ] + }, + { + "cell_type": "code", + "execution_count": 125, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + ":4: MatplotlibDeprecationWarning: Adding an axes using the same arguments as a previous axes currently reuses the earlier instance. In a future version, a new instance will always be created and returned. Meanwhile, this warning can be suppressed, and the future behavior ensured, by passing a unique label to each axes instance.\n", + " ax = fig.add_subplot(3, 3, i % 9 + 1)\n" + ] + }, + { + "data": { + "image/png": "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kstasfksL2pVw1GzZbSSameaIAcNGuSyqI4qFa1MGTVGStKll17qsuh1L1rt9Z133nFZtEJotHrs5MmTw/F8/etfd9maNWvC2xZZVUcozGzwTt+eI2l+bYYDNA51jKKjhpEnlZw2erekUyQNMLPlkr4l6RQzGy0pSWqTdHEdxwhkRh2j6Khh5F2HE4qU0gVBfGsdxgLUDXWMoqOGkXeslAkAADLrMpcvj5qJDjjgAJedddZZLoua3MqJGtCi1eEeffRRl0WXfr733ntd9ud//ucuO+aYY8LxDBkyxGV77723y6KGpT/84Q8ua6WmzFYQNd2ee+65Lrv66qtdNnz48PAxo4bhn/70py6bPn26y7jkfTFFr1tLliyp+P5RI++AAQNctnr1apcNHjzYZWPHjnXZN7/5TZdFr29S/LyI9udb3/qWyxYtWuSyW265xWVHHXWUy84///xwPH37+rN5/+Ef/qGibUeXPo/271Of+pTLDjnkkHA80f5Ez/vO4ggFAADIjAkFAADIjAkFAADIjAkFAADIjAkFAADIrMuc5RF12UbLTQ8dOjTTdnbs2OGyJ5980mU333yzy1544QWXRUvDHnvssS7r169fpUMMz9SYPXu2y6KObDRPtDzy4Ycf7rIrr7zSZVG397Jly8LtTJs2zWW33367y95+++3w/mgN0dlp0RkHUnymRnRWRnQWwymnnOKygw46yGXRWSPlRGcb3XbbbS677777XBad8fLYY4+5LDrLIzr7QpI++9nPuiw6y+rxxx93WXQJhGgp8PHjx7ts4MCB4XheeeUVlz300EMui/49+zAcoQAAAJkxoQAAAJkxoQAAAJkxoQAAAJl1mabMnj17uixqiunVq1em7URNlL/97W9dNm/ePJe98cYbLuvTp4/LDjzwQJd179690iGGjVVvvvmmy6KmLDRPtDx61ID50Y9+1GVRA2XUfClJ119/vcui+kBri5qyV65cGd42avqNGhGjJr/osgiVeuutt8I8uoxBtNx09LzYbTf//+yHH37YZZ///OddVm45+27durksauocNWpUeP9KRL/HqMFUkkaMGOGyqOm7szhCAQAAMmNCAQAAMmNCAQAAMmNCAQAAMuuwG8bMhkr6qaRBkpKkqSmlfzKzfpJ+Lmm4pDZJ56WUNtRvqNlEDSvRamOdaW6MvPbaay6bPn26y6LV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AAAgsy59+fKokTHKokbLkSNHho8ZrTIYrVJ4xBFHuKx///4VZVGTWrnLfb/zzjsu+/d//3eXRQ1tTz75pMteffVVl23YsMFl27ZtC8eD6u29994ui+rtyiuvdNlRRx3lsqiOynn33Xdd9tprr7ns+eefd9myZctcdvLJJ7ts+PDh4bb79u3rsmjF1gsvvNBljz/+uMtWrFgRbgco56yzznLZjTfe2ISR5BtHKAAAQGZMKAAAQGZMKAAAQGZMKAAAQGaFb8qMmiijVfiGDh3qsqOP9qduR81r++yzj8tOPfXUcDwf/ehHKxpPuZUtK8+d/XsAACAASURBVLF+/XqXRQ2UUryK5fTp010WNc7RWNkYUXPksGHDXBZdtv5LX/qSy6Lmxs408i5dutRld955p8tmzJjhsqhpN6qjWbNmueyKK64Ix3P88ce77L333nNZtIpr9FwBOqt3797NHkIhcIQCAABkxoQCAABkxoQCAABkxoQCAABkVpimzGiVQEm6/PLLXRatmBc1uUWXfo6aJaPLL5draIsa0KJVBqNGz8iaNWtcdumll7rsvvvuC+8fXU4a+bLffvu57Fvf+pbLPv/5z7usZ8+eFW0jqsFHH300vG10qfNoxcmoMbJfv34uO/vss102efJkl0WXXZfihtJolc5f/OIXLov2G0B9cIQCAABkxoQCAABkxoQCAABkxoQCAABk1mFTppndJulMSWtSSkeWsn6Sfi5puKQ2SeellPw1rGvomGOOCfOo4euQQw5xWdREGa0OuXXrVpdt3rzZZdHlviVp48aNLovGHo07auh8+OGHXRatMkjz5YfLQx336NEjzE866SSXnX766S6rtAEzaiKOVkf97ne/G94/quHDDjvMZZ/85Cdd9olPfMJlJ554osuiRtRyl1OP9id6DkTP51aShxoGPkwlRyimSTptl2yKpCdSSiMlPVH6HsizaaKOUWzTRA0jxzqcUKSUZkl6fZd4vKTbS1/fLmlCjccF1BR1jKKjhpF31a5DMSiltLL09SpJg8rd0MwmSZpU5XaAeqqojqlh5Bg1jNzIvLBVSimZmX+T8z9/PlXSVEn6sNsBzfRhdUwNowioYTRbtWd5rDazwZJU+uyXcwTyjzpG0VHDyI1qj1DMkDRR0nWlzw/UbERlLFy4MMy///3vu+zII4902ZtvvumyqFN806ZN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evXq5bL58+M/wezZs122du3aisbY6opYx3kSPaeieosag6NVC6PLWEtxg94RRxzhsl/+8pcumzdvnstaaTXPvNRwVAsvvviiyxYsWOCys88+22VRLUTNkoMGDQrHc+yxx7pswoQJLjv55JNdFjVgRs2S77zzjstmzZoVjqetrc1lrbjicYcTCjO7W9IpkgaY2XJJ35J0ipmNlpQktUm6uI5jBDKjjlF01DDyrsMJRUrJn/Mo3VqHsQB1Qx2j6Khh5B0rZQIAgMyYUAAAgMxa8vLl0cp8UdNitKpfdCndaJXNqHGnnKjhMWpK22uvvVy23377uSxapTNaeVOSHn74YZddc801LnvttddcFjUdIV8++9nPumzlypUuK1cfkai2oya3SPT8+da3vuWyaNzRKrOS1K9fP5e99957LosusX7WWWe5LGoSRe1FjYxR82YkWp04eh0usV31WAAACq9JREFU1xx/yimnuCxq6oxehyMbNmxw2YoVK1z2xz/+Mbx/pftddByhAAAAmTGhAAAAmTGhAAAAmTGhAAAAmTGhAAAAmbXkWR5RR+4LL7zgsqVLl7ps7733dlnPnj1dVm6p6qg7OcoilS5/3b17d5dFnfCSdN5557ks6mx+5JFHXHbvvfe6bMuWLS7rist2N0N09sVVV13lssGDB7ss63LT0bLwUdf92LFjXXbCCSe4rNLljaV4uebp06e77I477nDZ669zte8iimorWo77tNNOC+8fLal94IEHVrTtd99912W33HKLy6LXzDlz4muvcZYHAABAhZhQAACAzJhQAACAzJhQAACAzFqyKTNqgImWHo6W4+7Tp4/LRowY4bJyjZZRg2KlTZmRqJkuWia7nP33399lH//4xyu679NPP+2yaFnnqFETtRc1LX7lK19x2Y9//GOXRUsUR7Uuxc1vUSNwVOvRc+/FF190WdRA+atf/SocT3T/qHEOrSNqyoyWdb/sssvC+0fN9VEzelTDL7/8ssv+9V//1WWLFi1yWVd/LeQIBQAAyIwJBQAAyIwJBQAAyKzDCYWZDTWzX5nZi2a2wMwuL+X9zGymmS0qffZvvAI5QA2jFVDHyLtKmjK3SboipfScme0j6Vkzmynpv0l6IqV0nZlNkTRF0tfrN9TKRY1h69evd9m1117rsuOOO85lf/d3f+eyww8/PNx2jx49KhlixY2aa9ascdn3v//9iu4rxSspHnLIIS6Lmjeff/55l0UrFL7yyisVj6dJClfDlYpWgD3++OMrum/UfClJxxxzjMseeughly1btsxlF198scueeuopl9FUWZWWreNKRK+ZvXv3zvSYa9euddlNN93ksqhRs6s3YEY6PEKRUlqZUnqu9PVmSQslDZE0XtLtpZvdLmlCvQYJZEENoxVQx8i7Tp02ambDJR0j6XeSBqWU3j+HcJWkQWXuM0nSpOqHCNQONYxW0Nk6pobRCBU3ZZpZL0n3SpqcUvrAog6p/WTe8ApRKaWpKaUxKaUxmUYKZEQNoxVUU8fUMBqhogmFmXVXewHflVK6rxSvNrPBpZ8PluTf7AdyghpGK6COkWcdvuVh7Z0wt0pamFK6YacfzZA0UdJ1pc8P1GWENRKtiBY1Ey5fvtxl0Up9V155Zbid//Jf/ovLDj74YJdFl2+ODBw40GVRk2hn7h81N+21114u+8QnPuGy6HfW1tbmsjxdrrdVarhS27Ztq+h2UaOyJPXs2dNlUc08++yzLouaRGnArI2uVMeVNq1Hr+uduW208m/UjP7ee+9VvJ2urJIeihMkXShpnpm9/5u+Su3F+3/N7CJJSyWdV58hAplRw2gF1DFyrcMJRUrpKUnlpoufru1wgNqjhtEKqGPkHStlAgCAzJhQAACAzFry8uWVipp0otXPosvUPvLII+FjRg1x0Wpu0aV4o0bN6LLRBx54YLjtSKXNn9Hlgg866CCXDRs2zGVZLs+O5hkwYECYf+ELX3BZ1JR2zTXXuCxaeRDorM40W0beeecdl7322msui1Ydfumll2o+nq6CIxQAACAzJhQAACAzJhQAACAzJhQAACCzLt2UWam3337bZf/2b/8W3nbmzJkue/DBB112/vnnu2zkyJEVZVGjZjlRk2jUYBQ13c2fP99lf/rTnyp6POTfhRdeGOann366y6JLlS9cuLDmY0LriF573njjDZdFDZTRyr3R68yGDRvCbT/88MMue+yxx1x2//33u4zLklePIxQAACAzJhQAACAzJhQAACAzJhQAACAzmjKrVK5xZ82aNS6LGn9mz57tsv33399ln/60v+ZPtPJmZ0SXFn/zzTddNn36dJetWrWqosdDvkSrYp500knhbXv06OGy3/zmNy7bvn179oGhZUWXBo9eUyLRa1z0OhM1jkvS008/7bJNmza5jAbM2uIIBQAAyIwJBQAAyIwJBQAAyIwJBQAAyKzDCYWZDTWzX5nZi2a2wMwuL+VXm9kKM3u+9HFG/YcLdB41jKKjhlEE1tGyyWY2WNLglNJzZraPpGclTZB0nqQ3U0o/qHhjZqzRXNKtWzeXRUtqR2d+7L577U/OiZbJjbq0oyW6G7j09rMppTGdvVNXq+HddvP/Txg7dqzLfvCDeLc3b97ssjPPPNNl0ZL06FCXqWEzc1l0BtHgwYNdVulrXHTmhiS9/vrrLuOspJopW8Md/tVSSislrSx9vdnMFkoaUtvxAfVDDaPoqGEUQad6KMxsuKRjJP2uFF1qZnPN7DYz61vmPpPMbI6Zzck0UqAGqGEUHTWMvKp4QmFmvSTdK2lySukNST+SNELSaLXPnK+P7pdSmppSGlPNYT6glqhhFB01jDyraEJhZt3VXsR3pZTuk6SU0uqU0vaU0g5JP5Z0XP2GCWRDDaPoqGHkXYc9FNbeWXOrpIUppRt2ygeX3teTpHMkxWugIhQ1CEVZW1tbA0bT2rpaDUdLFD/55JMu+8QnPhHeP2qypaGtuYpYw1EdRUtd8xrXOipppT1B0oWS5pnZ86XsKkkXmNloSUlSm6SL6zJCIDtqGEVHDSP3OjxttKYbK8Apd8i1qk65q6VWquFyp+ZxhKKuqGEUXdkaZqVMAACQGRMKAACQWe2XXARQCNHqqABQLY5QAACAzJhQAACAzJhQAACAzJhQAACAzBrdlLlO0tLS1wNK37cC9qUxhjV7AKKGiyKv+0MN108r7YuU3/0pW8MNXdjqAxs2m9PsBV5qhX3pmlrpd9VK+yK13v7USyv9nlppX6Ri7g9veQAAgMyYUAAAgMyaOaGY2sRt1xr70jW10u+qlfZFar39qZdW+j210r5IBdyfpvVQAACA1sFbHgAAILOGTyjM7DQze9nMFpvZlEZvPyszu83M1pjZ/J2yfmY208wWlT73beYYK2VmQ83sV2b2opktMLPLS3kh96dRqOH8oIarV+Q6pobzqaETCjPrJumHkk6XNErSBWY2qpFjqIFpkk7bJZsi6YmU0khJT5S+L4Jtkq5IKY2S9HFJl5T+HkXdn7qjhnOHGq5CC9TxNFHDudPoIxTHSVqcUnolpfSepHskjW/wGDJJKc2S9Pou8XhJt5e+vl3ShIYOqkoppZUppedKX2+WtFDSEBV0fxqEGs4Rarhqha5jajifGj2hGCLp1Z2+X17Kim5QSmll6etVkgY1czDVMLPhko6R9Du1wP7UETWcU9Rwp7RiHRf+b170GqYps8ZS+2kzhTp1xsx6SbpX0uSU0hs7/6yI+4Nsivg3p4axsyL+zVuhhhs9oVghaehO3x9YyoputZkNlqTS5zVNHk/FzKy72ov4rpTSfaW4sPvTANRwzlDDVWnFOi7s37xVarjRE4rfSxppZgebWQ9J50ua0eAx1MMMSRNLX0+U9EATx1IxMzNJt0pamFK6YacfFXJ/GoQazhFquGqtWMeF/Ju3VA2nlBr6IekMSX+U9CdJf9/o7ddg/HdLWilpq9rfd7xIUn+1d+EukvS4pH7NHmeF+3Ki2g+jzZX0fOnjjKLuTwN/b9RwTj6o4Uy/u8LWMTWczw9WygQAAJnRlAkAADJjQgEAADJjQgEAADJjQgEAADJjQgEAADJjQgEAADJjQgEAADJjQgEAADL7f6JlPvTmWtEOAAAAAElFTkSuQmCC\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig = plt.figure(figsize=(9, 9))\n", + "for i in range(9, 19):\n", + " x, y = dataset[i]\n", + " ax = fig.add_subplot(3, 3, i % 9 + 1)\n", + " ax.imshow(x.reshape(28, 28).T, cmap='gray')\n", + " ax.set_title(emnist_essentials[\"mapping\"][int(y)][-1])" + ] + }, + { + "cell_type": "code", + "execution_count": 126, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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i6bZrly5MnzMa665xmXLly+vaD0fhCMUAAAgMzYUAAAgMzYUAAAgMzYUAAAgs626KTNqyKm0AbNcU+buu+/usqixMuvktUrV+tLiUfNnv379XHbkkUeG948maNKUWX9RbZWblBldlvyJJ55w2WuvveayaNprVDPRc5RrEo2azaLmz1tvvdVltZ5QiNrr1auXy372s5+57PDDD3fZQw89FD7mLbfc4rJjjjnGZUOHDnVZ1JQZ/bci+pmKprVK0g477OCyqDHyS1/6ksuOO+44lw0YMMBlO+64o8sWLlwYruepp55y2X333eeyqAn/g3CEAgAAZMaGAgAAZMaGAgAAZMaGAgAAZNZqU6aZXSvpWElLU0pDSlkvSTdJGihpnqSTU0pv1m+ZbWNmLttpp51cNnLkSJedc845Lttzzz1dVu7y5ZWKGiOjBrKoyWfJkiUuK9fYOGfOUQMtkgAAEUhJREFUnIqyaD29e/d22SmnnOKyqKnqE5/4RLieaELosmXLwtvWUhHruJai2rrpppvC25533nku+8IXvuCyI444wmV9+vRxWdZpr9Gllr/61a+67Oabb67oeYqqvdZw9P4RvTdHjZFRw64kHXLIIS7r1q2by6Kmwzff9N++pUuXuixqjIyajSXpsMMOc1k0ffPv//7vXRZNsFyzZo3LoonM7777brieN954w2VtbcCMVHKEYqKko7bIxkm6P6W0u6T7S18DeTZR1DGKbaKoYeRYqxuKlNJUSVsORj9B0qTSnydJGlXjdQE1RR2j6Khh5F21cyj6pJQWlf68WJI/zlliZmMlja3yeYB6qqiOqWHkGDWM3Mg82CqllMys7IcvKaUJkiZI0gfdDmimD6pjahhFQA2j2ao9y2OJmfWVpNLvvmMFyD/qGEVHDSM3qj1CcaukMZIuLf3++5qtqI2iDvK9997bZdHZG1EncXQ2SHTWSDlRR/rrr7/ushkzZrhs3rx5LotGp06dOtVlq1atCtezevVql0UdwlGndTTytRadwDmSmzpuhl/+8pdhPmjQIJedfPLJLotGrkfd8DvvvLPLPvShD7ms3Jjse+65x2WTJ092WfSztxUoVA1HZ0FEZ35Ft4veh6M6KpfPnTvXZVOmTHHZY4895rJo1Pvtt9/usnJneXzyk590WfReOnv2bJf927/9m8ui9+sf/ehHLiv3M/XWW2+F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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig = plt.figure(figsize=(9, 9))\n", + "for i in range(20, 29):\n", + " x, y = dataset[i]\n", + " ax = fig.add_subplot(3, 3, i % 9 + 1)\n", + " ax.imshow(x.reshape(28, 28).T, cmap='gray')\n", + " ax.set_title(emnist_essentials[\"mapping\"][int(y)][-1])" + ] + }, + { + "cell_type": "code", + "execution_count": 127, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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Stkbo5555hmXrV27NvNxUFvDhg1z2SWXXOKyk08+2WXdunXLfJyotvM03kb1/5Of/MRlV1xxRXj/O++802VlmFxYdtHrTPR6JMUNk1EdRV+3J5980mXRa1TepsxoPW+//bbL7ruveb3Z0ffZTTfd5LJVq1a5bPbs2S6LPrdSPDm3FjhDAQAAcmNDAQAAcmNDAQAAcmNDAQAAcmNDAQAAcivNuzwGDRoU5tHo7WiEdfQujwMOOMBle+21l8uijto1a9aE69ljjz1cdtxxx7ls6NChLuvZs6fLou78qFt5xYoV4Xq22WabMN/U1KlTXRaNba327hbUVjSufezYsS476aSTXJb1a75u3bowf/nll1328MMPuyz6nurRo4fLojVG72j6zne+E65nxowZLps2bZrLqM3a6t27t8uid9B1xIIFC1z2+OOPd/rxqo2QjsZQR++Ei+5ftHcQRe/e+Pd//3eXRe+MafTIcM5QAACA3NhQAACA3NhQAACA3NhQAACA3ErTlBk1qUlxI2M0pjsaI/v973/fZdF412gcatT0I8VNaR0Ze7ypqEEoapqbOHFieP+vfvWrLhswYIDLouYdmtyKpVevXi7beuutO/14s2bNCvOzzz7bZc8995zLou+LaPT8888/77JLL73UZbvuumu4nvPOO89l3/3ud122cOHC8P6oHTPLnEevH0uXLs2URaJ6+5d/+Zfwtl/5yldcNnz48Ez3nzdvXqb1NFOeUfj1xBkKAACQGxsKAACQGxsKAACQGxsKAACQW7tNmWY2VNKNkgZJSpImpJR+bmb9JN0uabik2ZJOSSktq9dCqzWhRBMiowmAUVNnNAkur6zNSVGz5bvvvuuyBx54wGXRlLRqDW1RQ2jUUFpt0mYrKEoN5xV9jaI6imo9qsFFixaFx1m8eLHLsjaBRc29r7zyisuiKazDhg0LH/OYY45xWdSEfM8992RaT1nVs46jZvRo6m90u2qimrn//vtdNnfu3MyPualqzej33Xefy6LX5mrN9eicLNWxXtL5KaXdJO0n6Wwz203SBZIeTSmNlPRo5WOgiKhhtALqGIXW7oYipTQvpTSl8ueVkl6SNETSiZJuqNzsBkl+YD9QANQwWgF1jKLr0BwKMxsuaS9Jz0galFL66A2789V2Gi66z3hJ4zu/RKB2qGG0go7WMTWMRsj8AzEz6yHpd5LOSyn9xQ9zU9sPaMMpSCmlCSmlfVJK++RaKZATNYxW0Jk6pobRCJnOUJhZV7UV8C0ppTsr8QIzG5xSmmdmgyXVdUzd/Pnzw/zee+91WdSUNnr0aJdVm/qWR9QQGk2Ci5otH3vssUy3iy65G10iXYond0afy+gSwkWdxtYZRajhjog+93fddZfL9t57b5dFlwvv3r27y/bbb7/w2JdffrnLosvbR6LjHHXUUS6LmoirfT/27dvXZdHlz6PXglZqypTqV8dRs2X0Oa7WlBk1/UZZVNf1mMjbal/3smj3DIW1fZf/StJLKaWfbPRXEyWdXvnz6ZJ8izVQANQwWgF1jKLLcobiQEmnSXrBzD76b8qFki6TdIeZnSHpTUmn1GeJQG7UMFoBdYxCa3dDkVL6k6RqPxs4srbLAWqPGkYroI5RdEzKBAAAuZXm8uVRs6Mk/fnPf3bZiBEjXPbJT37SZdGln7NOuqy2nujSt1OmTHHZ3Xff7bIXXnjBZUuWLMm0xo5MsIvWvmrVqsz3R3NE0yUvvvhil7366qsuO+2001xWbTJl1OAbTavMKmqS7oiokY96rb/oc1ztdS9yxx13uOymm25yWSs1f2/uOEMBAAByY0MBAAByY0MBAAByY0MBAAByK01TZrXLzD700EMuixo1p02b5rIddtjBZf3793dZdDnnd955J1xPNHHyrbfeclk0PTPrpXQ70uQWNVa98cYbLlu5cmXmx0RzRM3Bs2fPdtmVV17psmjS5Ve/+tXwONFky2222cZlHWkE3lTUiLdsWXzF7enTp7vs4YcfzvSYyCbrZNZo8m41UQNm1FiM1sEZCgAAkBsbCgAAkBsbCgAAkBsbCgAAkJvV49KxVQ9m1riDbSJqZIyybt26uWzNmjUuq9YA1ojGsC5durjs61//enjb//W//pfLJk+e7LJ//ud/dll0mfQmey6ltE8zF9DMGs4jqplqkzLHjh3rsv33399lu+++u8uiRs0VK1a47LHHHnPZU089Fa7n+eefd9ncuXNd1pEpjk1U6hruSEM4TbItq2oNc4YCAADkxoYCAADkxoYCAADkxoYCAADk1u6GwsyGmtkfzWyGmU03s3Mr+SVmNtfMplZ+HVv/5QIdRw2j7KhhlEG77/Iws8GSBqeUpphZT0nPSTpJ0imSVqWUrsp8sJJ2yJdBv379wrxXr14ui8ZxL1myxGWNfAdQRp3qkKeGOybq5O/bt6/Levfunenxom7/BQsWuOyDDz4I7//hhx9mOk5JUMMou6o13O57gFJK8yTNq/x5pZm9JGlIbdcH1A81jLKjhlEGHeqhMLPhkvaS9Ewl+oaZTTOz68zM/xcGKBhqGGVHDaOoMm8ozKyHpN9JOi+ltELStZJ2ljRGbTvnH1e533gzm2xmfpoS0EDUMMqOGkaRZdpQmFlXtRXxLSmlOyUppbQgpbQhpfShpF9K2je6b0ppQkppn2ZPh8PmjRpG2VHDKLp2eyjMzCT9StJLKaWfbJQPrvxcT5LGSnqxPktEFkuXLu1QvjmhhjsmaqJctGhRpgz1QQ2jDLIMZj9Q0mmSXjCzqZXsQkmnmtkYSUnSbEln1WWFQH7UMMqOGkbhbTYXB0NLKPWFlQBRwyg/Lg4GAADqhw0FAADIjQ0FAADIjQ0FAADIjQ0FAADIjQ0FAADIjQ0FAADILctgq1paLOnNyp/7Vz5uBTyXxhjW7AWIGi6Loj4farh+Wum5SMV9PlVruKGDrf7iwGaTmz3gpVZ4LpunVvpctdJzkVrv+dRLK32eWum5SOV8PvzIAwAA5MaGAgAA5NbMDcWEJh671ngum6dW+ly10nORWu/51EsrfZ5a6blIJXw+TeuhAAAArYMfeQAAgNzYUAAAgNwavqEws6PNbKaZvWpmFzT6+HmZ2XVmttDMXtwo62dmD5vZK5Xf+zZzjVmZ2VAz+6OZzTCz6WZ2biUv5fNpFGq4OKjhzitzHVPDxdTQDYWZdZF0jaRjJO0m6VQz262Ra6iB6yUdvUl2gaRHU0ojJT1a+bgM1ks6P6W0m6T9JJ1d+XqU9fnUHTVcONRwJ7RAHV8varhwGn2GYl9Jr6aUXk8prZX0G0knNngNuaSUJklaukl8oqQbKn++QdJJDV1UJ6WU5qWUplT+vFLSS5KGqKTPp0Go4QKhhjut1HVMDRdTozcUQyS9tdHHb1eyshuUUppX+fN8SYOauZjOMLPhkvaS9Ixa4PnUETVcUNRwh7RiHZf+a172GqYps8ZS2/twS/VeXDPrIel3ks5LKa3Y+O/K+HyQTxm/5tQwNlbGr3kr1HCjNxRzJQ3d6OMdK1nZLTCzwZJU+X1hk9eTmZl1VVsR35JSurMSl/b5NAA1XDDUcKe0Yh2X9mveKjXc6A3Fs5JGmtkIM9tK0jhJExu8hnqYKOn0yp9Pl3RPE9eSmZmZpF9Jeiml9JON/qqUz6dBqOECoYY7rRXruJRf85aq4ZRSQ39JOlbSLEmvSbqo0cevwfpvkzRP0jq1/dzxDEnbqa0L9xVJj0jq18HHfEzSGkmrKr9mNui5HKS202jTJE2t/Do27/Np9V/UsHu8rdX2gvimpJWVOjqmQc+FGu785660dVyn1+HZklZv9Dq8StIODXguLVPDjN4uADN7TNLNKaX/bPZagI4ys+6Svq22t/LNUduL4W2S9kgpzW7eyoDszGy2pL9PKT3S7LWU1ZbNXgCAckspvSfpko2i+8zsDUmfUdv/+gBsBniXR3H8HzNbbGZPmtlhzV4M0FlmNkjSLpKmN3stABqHH3kUgJn9laQZktaqrTnqakljUkqvNXVhQAdVutUfkPRaSumsZq8HyKryI4/+aptcKUmPpZQKP0yqSNhQFJCZPSjp/pTSvzd7LUBWZraFpFsl9ZJ0YkppXZOXBGRGD0V+9FAUU5JkzV4EkNVGb30bJOlYNhPA5oceiiYzsz5m9gUz62ZmW5rZlyUdIunBZq8N6IBrJX1a0gkppdXNXgyAxuMMRfN1lfQjSZ+StEHSy5JOSinNauqqgIzMbJiksyR9IGl+28kKSdJZKaVbmrYwAA1FDwUAAMiNH3kAAIDc2FAAAIDc2FAAAIDccm0ozOxoM5tpZq+a2QW1WhTQSNQxyo4aRhF0uinTzLqo7Up1n1Pb1d6elXRqSmnGx9yHDlDksTilNKCWD9jROqaGkRM1jLKrWsN5zlDsK+nVlNLrKaW1kn4j6cQcjwe05806PCZ1jEaihlF2VWs4z4ZiiKS3Nvr47UoGlAl1jLKjhlEIdR9sZWbjJY2v93GAeqGGUXbUMBohz4ZirqShG328YyX7CymlCZImSPzsDoXUbh1Twyg4ahiFkGdD8aykkWY2Qm3FO07SX9dkVUDjUMcoO2q4hW2xhe9MiLIPP/wwU1ZPnd5QpJTWm9k3JD0kqYuk61JK02u2MqABqGOUHTWMomjotTw41Yacnksp7dPMBVDDyIkaRocU8AxF1RpmUiYAAMiNDQUAAMit7m8bBYBa69atm8u23357l61atcplS5YscVkjf/QLSNKWW/p/fj/xiU+47LLLLnPZHnvs4bInnnjCZd/73vfCYy9cuDDLEjuMMxQAACA3NhQAACA3NhQAACA3NhQAACA3mjIhKft7nc3MZX369HFZr169wuMsXbrUZcuWLcuyRLS4qN4kqX///i4744wzXDZ27FiXTZ/u5ztdffXVLps9e7bLouZNoDN69OjhsokTJ7ps1KhRLovqP7Ljjju6bMaM8Ar2+tnPfpbpMTuKMxQAACA3NhQAACA3NhQAACA3NhQAACA3NhQAACA33uVRY/369cuUNVPUcTxixAiX7bTTTi6L3r2x++67u2zQoEHhsb///e+77LHHHnMZo5BbR/TOoAEDBrjswAMPDO9/6KGHumzcuHGZHhsLzMkAACAASURBVDMaURwd59e//rXLfv7zn4fref/998MciF4zJem0005z2f777++yaBz33LlzXRa98yOqyzfffDNcT71whgIAAOTGhgIAAOTGhgIAAOSWq4fCzGZLWilpg6T1KaV9arEooJGoY5QdNYwiqEVT5uEppcU1eJxSGThwYJh/7Wtfc9mXvvQll0XNN40SHTtq1Iyyrl27ZjrGq6++2vGFNddmWceNsN1227nsRz/6kcu++MUvhvePmpqzfv9svfXWLtt5551dFo3yfvHFF8PHvP/++1324YcfZlpPnVHDDbTnnnu67MEHHwxvG/17sXDhQpf9x3/8h8tuvvlml1177bUuGzZsmMteeOGFcD31wo88AABAbnk3FEnS783sOTMbH93AzMab2WQzm5zzWEC9fGwdU8MoAWoYTZf3vPtBKaW5ZjZQ0sNm9nJKadLGN0gpTZA0QZLMjOECKKKPrWNqGCVADaPpcp2hSCnNrfy+UNJdkvatxaKARqKOUXbUMIqg02cozKy7pC1SSisrf/68pEtrtrIC6dKli8uOO+648LZnnnmmy4YMGVLzNeURNZBFWTStctmyZS6LprFdffXV4bH//Oc/ZzpOo2xOddwsUVPlIYcc4rJqjc5ZrVmzxmXz5893WTTtdejQoS6L1ihJjzzyiMtWr16dZYl1QQ3XX/RvwHnnneeyahOCP/jgA5ddcMEFLosafj/xiU+4LJrIuWHDhvDYjZTnRx6DJN1VGau7paRbU0pxiytQXNQxyo4aRiF0ekORUnpdkn/fDFAi1DHKjhpGUfC2UQAAkBsbCgAAkBuXL88gairr06dPeNtoumTUkDNv3jyXrVu3zmXRpZ+jBqFqokadadOmuWz6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O4a3jb5/xo0b57Ljjz/eZb169XJZ9C6PHj16uKzauzweeughl5199tku62gNc4YCAADkxoYCAADkxoYCAADklquHwsxmS1opaYOk9SmlfWqxKKCRqGOUHTWMIqhFU+bhKaXFNXicUqnWFBY16hx88MEuO+uss1wWNVZGTZXR6O1oRHc1AwYMcNmIESNcdvjhh7vstddec9nSpUtd9j//8z/hsdetW5dlic2w2dVxVKtSXF/HHHOMy8477zyXRY2a0TjuyIYNG8J85cqVLlu7dq3LovHZUfNa1BAdfT8PGzYsXM+YMWNc9sADD7isCU2Zm10N10PUHNy3b1+XnXbaaS6LGi2luLEyem3P+r0SieqtWpNo9HxqgR95AACA3PJuKJKk35vZc2Y2PrqBmY03s8lmNjnnsYB6+dg6poZRAtQwmi7vjzwOSinNNbOBkh42s5dTSn8xvCClNEHSBEkyM/9mb6D5PraOqWGUADWMpst1hiKlNLfy+0JJd0natxaLAhqJOkbZUcMogk6foTCz7pK2SCmtrPz585IurdnKCiS6Hn3UuCbFTWBRU+ZBBx3kst69e7ssmrBW6ymB1R5zm222cdmQIUNcduSRR7rspZdeCo+zfPlylzVzouDmUsdRw280wVKS9t9/f5dF9Ro190bfK2vWrHHZO++847IpU6aE63niiSdctmzZMpdNnuzP5h966KEu+9GPfuSyqFGzLDaXGo4az6s1zu65554uGz16tMui6cTRtMqoiTGq/2qi17homvDrr7/usrvvvttlUaPytGnTXBZNQJakRYsWZVpjR+X5kccgSXdVXkC2lHRrSunB3CsCGos6RtlRwyiETm8oUkqvS/LbQKBEqGOUHTWMouBtowAAIDc2FAAAIDcuX76JqKksami76KKLwvvvscceLhs+fLjL8jSBRc08UZOOJL333nsu23777V0WTYeLmqCiZtQvfelLLrv11lvD9USXTucyz7UV1duPf/xjlx111FHh/aNm3Khpd/369S6bM2eOy26++WaXTZw40WVvvfVWuJ6otqPLjUeTP6OJmpHo8aqtZ+rUqS6jhmsreu259tprXfblL385vH+eZvaorqMJv7NmzXLZvffeGz7mU0895bLnn3/eZdHlxlevXh0+ZhFxhgIAAOTGhgIAAOTGhgIAAOTGhgIAAOS2WTdlbrvtti7b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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig = plt.figure(figsize=(9, 9))\n", + "for i in range(30, 39):\n", + " x, y = dataset[i]\n", + " ax = fig.add_subplot(3, 3, i % 9 + 1)\n", + " ax.imshow(x.reshape(28, 28).T, cmap='gray')\n", + " ax.set_title(emnist_essentials[\"mapping\"][int(y)][-1])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "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.8.2" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/src/text_recognizer/datasets/emnist_dataset.py b/src/text_recognizer/datasets/emnist_dataset.py index 84d316a..cf81b5d 100644 --- a/src/text_recognizer/datasets/emnist_dataset.py +++ b/src/text_recognizer/datasets/emnist_dataset.py @@ -1,10 +1,22 @@ """Fetches a DataLoader with the EMNIST dataset with PyTorch.""" +from pathlib import Path from typing import Callable +import click +from loguru import logger from torch.utils.data import DataLoader from torchvision.datasets import EMNIST +@click.command() +@click.option("--split", "-s", default="byclass") +def download_emnist(split: str) -> None: + """Download the EMNIST dataset via the PyTorch class.""" + data_dir = Path(__file__).resolve().parents[3] / "data" + logger.debug(f"Data directory is: {data_dir}") + EMNIST(root=data_dir, split=split, download=True) + + def fetch_dataloader( root: str, split: str, -- cgit v1.2.3-70-g09d2