diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml
new file mode 100644
index 0000000..2a3585f
--- /dev/null
+++ b/.github/workflows/docs.yml
@@ -0,0 +1,100 @@
+name: docs
+permissions:
+ contents: write
+ pull-requests: write
+
+on:
+ push:
+ branches:
+ - main
+ paths:
+ - .pre-commit-config.yaml
+ - .github/workflows/docs.yml
+ - '**.py'
+ - '**.ipynb'
+ - '**.html'
+ - '**.js'
+ - '**.md'
+ - uv.lock
+ - pyproject.toml
+ - mkdocs.yml
+ - '**.png'
+ - '**.svg'
+ pull_request:
+ branches:
+ - main
+ paths:
+ - .pre-commit-config.yaml
+ - .github/workflows/docs.yml
+ - '**.py'
+ - '**.ipynb'
+ - '**.js'
+ - '**.html'
+ - uv.lock
+ - pyproject.toml
+ - '**.md'
+ - mkdocs.yml
+ - '**.png'
+ - '**.svg'
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4.2.2
+
+ - name: Install uv
+ uses: astral-sh/setup-uv@0c5e2b8115b80b4c7c5ddf6ffdd634974642d182
+ with:
+ version: "0.5.21"
+ enable-cache: true
+
+ - name: Set up Python
+ uses: actions/setup-python@8d9ed9ac5c53483de85588cdf95a591a75ab9f55
+ with:
+ python-version-file: ".python-version"
+
+ - name: Install the project
+ run: uv sync --all-extras --all-groups
+
+ - name: Build docs
+ run: uv run mkdocs build
+
+ - name: Create .nojekyll file
+ run: touch site/.nojekyll
+
+ - name: Upload artifact
+ uses: actions/upload-artifact@v4
+ with:
+ name: docs-site
+ path: site/
+ retention-days: 1
+
+ deploy:
+ needs: build
+ if: github.event_name == 'push' && github.ref == 'refs/heads/main'
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4.2.2
+
+ - name: Configure Git Credentials
+ run: |
+ git config user.name github-actions[bot]
+ git config user.email 41898282+github-actions[bot]@users.noreply.github.com
+
+ - name: Download artifact
+ uses: actions/download-artifact@v4
+ with:
+ name: docs-site
+ path: site
+
+ - name: Ensure .nojekyll exists
+ run: touch site/.nojekyll
+
+ - name: Deploy to Github pages
+ uses: JamesIves/github-pages-deploy-action@6c2d9db40f9296374acc17b90404b6e8864128c8
+ with:
+ branch: github_pages
+ folder: site
diff --git a/.github/workflows/docs_build.yml b/.github/workflows/docs_build.yml
deleted file mode 100644
index b882880..0000000
--- a/.github/workflows/docs_build.yml
+++ /dev/null
@@ -1,41 +0,0 @@
-name: docs (build)
-
-on:
- pull_request:
- branches:
- - main
- paths:
- - .pre-commit-config.yaml
- - .github/workflows/docs_build.yml
- - '**.py'
- - '**.ipynb'
- - '**.js'
- - '**.html'
- - uv.lock
- - pyproject.toml
- - '**.rst'
- - '**.md'
-
-jobs:
- build:
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v4.2.2
-
- - name: Install uv
- uses: astral-sh/setup-uv@0c5e2b8115b80b4c7c5ddf6ffdd634974642d182
- with:
- # Install a specific version of uv.
- version: "0.5.21"
- enable-cache: true
-
- - name: "Set up Python"
- uses: actions/setup-python@8d9ed9ac5c53483de85588cdf95a591a75ab9f55
- with:
- python-version-file: ".python-version"
-
- - name: Install the project
- run: uv sync --all-extras --all-groups
-
- - name: Build docs
- run: cd docs && rm -rf source/reference/api/_autosummary && uv run make html
diff --git a/.github/workflows/docs_deploy.yml b/.github/workflows/docs_deploy.yml
deleted file mode 100644
index 4f0ec5c..0000000
--- a/.github/workflows/docs_deploy.yml
+++ /dev/null
@@ -1,56 +0,0 @@
-name: docs
-
-on:
- push:
- branches:
- - main
- paths:
- - .pre-commit-config.yaml
- - .github/workflows/code_checks.yml
- - .github/workflows/docs_build.yml
- - .github/workflows/docs_deploy.yml
- - .github/workflows/integration_tests.yml
- - '**.py'
- - '**.ipynb'
- - '**.html'
- - '**.js'
- - uv.lock
- - pyproject.toml
- - '**.rst'
- - '**.md'
-
-jobs:
- deploy:
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v4.2.2
- with:
- submodules: 'true'
-
- - name: Install uv
- uses: astral-sh/setup-uv@0c5e2b8115b80b4c7c5ddf6ffdd634974642d182
- with:
- # Install a specific version of uv.
- version: "0.5.21"
- enable-cache: true
-
- - name: "Set up Python"
- uses: actions/setup-python@8d9ed9ac5c53483de85588cdf95a591a75ab9f55
- with:
- python-version-file: ".python-version"
-
- - name: Install the project
- run: uv sync --all-extras --all-groups
-
- - name: Build docs
- run: |
- cd docs
- rm -rf source/reference/api/_autosummary
- uv run make html
- touch build/html/.nojekyll
-
- - name: Deploy to Github pages
- uses: JamesIves/github-pages-deploy-action@6c2d9db40f9296374acc17b90404b6e8864128c8
- with:
- branch: github_pages
- folder: docs/build/html
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 9414adb..5937b69 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -12,7 +12,11 @@ repos:
- id: mixed-line-ending
args: [--fix=lf]
- id: detect-private-key
+ - id: check-byte-order-marker
+ - id: check-merge-conflict
+ - id: check-symlinks
- id: check-yaml
+ args: [--unsafe]
- id: check-toml
- repo: https://github.com/astral-sh/uv-pre-commit
diff --git a/docs/Makefile b/docs/Makefile
deleted file mode 100644
index d0c3cbf..0000000
--- a/docs/Makefile
+++ /dev/null
@@ -1,20 +0,0 @@
-# Minimal makefile for Sphinx documentation
-#
-
-# You can set these variables from the command line, and also
-# from the environment for the first two.
-SPHINXOPTS ?=
-SPHINXBUILD ?= sphinx-build
-SOURCEDIR = source
-BUILDDIR = build
-
-# Put it first so that "make" without argument is like "make help".
-help:
- @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
-
-.PHONY: help Makefile
-
-# Catch-all target: route all unknown targets to Sphinx using the new
-# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
-%: Makefile
- @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
diff --git a/docs/api.md b/docs/api.md
new file mode 100644
index 0000000..4819166
--- /dev/null
+++ b/docs/api.md
@@ -0,0 +1,104 @@
+# API Reference
+
+## Top Level Module
+
+::: mmlearn
+ options:
+ show_root_heading: true
+ show_root_full_path: true
+
+## CLI Module
+
+::: mmlearn.cli
+ options:
+ show_root_heading: true
+ show_root_full_path: true
+
+## Configuration Module
+
+::: mmlearn.conf
+ options:
+ show_root_heading: true
+ show_root_full_path: true
+
+## Datasets Module
+
+::: mmlearn.datasets
+ options:
+ show_root_heading: true
+ show_root_full_path: true
+
+### Core Datasets Components
+
+::: mmlearn.datasets.core
+ options:
+ show_root_heading: true
+ show_root_full_path: true
+
+### Dataset Processors
+
+::: mmlearn.datasets.processors
+ options:
+ show_root_heading: true
+ show_root_full_path: true
+
+## Modules
+
+::: mmlearn.modules
+ options:
+ show_root_heading: true
+ show_root_full_path: true
+
+### Encoders
+
+::: mmlearn.modules.encoders
+ options:
+ show_root_heading: true
+ show_root_full_path: true
+
+### Layers
+
+::: mmlearn.modules.layers
+ options:
+ show_root_heading: true
+ show_root_full_path: true
+
+### Losses
+
+::: mmlearn.modules.losses
+ options:
+ show_root_heading: true
+ show_root_full_path: true
+
+### Learning Rate Schedulers
+
+::: mmlearn.modules.lr_schedulers
+ options:
+ show_root_heading: true
+ show_root_full_path: true
+
+### Metrics
+
+::: mmlearn.modules.metrics
+ options:
+ show_root_heading: true
+ show_root_full_path: true
+
+## Tasks
+
+::: mmlearn.tasks
+ options:
+ show_root_heading: true
+ show_root_full_path: true
+
+## Utilities
+
+::: mmlearn.hf_utils
+ options:
+ show_root_heading: true
+ show_root_full_path: true
+
+::: mmlearn.constants
+ options:
+ show_root_heading: true
+ show_root_full_path: true
diff --git a/docs/assets/favicon-48x48.svg b/docs/assets/favicon-48x48.svg
new file mode 100644
index 0000000..3cd92e5
--- /dev/null
+++ b/docs/assets/favicon-48x48.svg
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/docs/assets/favicon.ico b/docs/assets/favicon.ico
new file mode 100644
index 0000000..3076237
Binary files /dev/null and b/docs/assets/favicon.ico differ
diff --git a/docs/assets/vector-logo.svg b/docs/assets/vector-logo.svg
new file mode 100644
index 0000000..8dd76b5
--- /dev/null
+++ b/docs/assets/vector-logo.svg
@@ -0,0 +1,172 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/contributing.md b/docs/contributing.md
new file mode 100644
index 0000000..c1a5162
--- /dev/null
+++ b/docs/contributing.md
@@ -0,0 +1,117 @@
+# Contributing to mmlearn
+
+Thanks for your interest in contributing to mmlearn!
+
+To submit PRs, please fill out the PR template along with the PR. If the PR fixes an issue, please include a link to the
+PR to the issue. Below are some details around important things to consider before contributing to the library. A table
+of contents also appears below for navigation.
+
+- [Development Practices](#development-practices)
+- [Development Requirements](#development-requirements)
+- [Coding Guidelines, Formatters, and Checks](#coding-guidelines-formatters-and-checks)
+- [Code Documentation](#code-documentation)
+- [Tests](#tests)
+
+## Development Practices
+
+We use the standard git development flow of branch and merge to main with PRs on GitHub. At least one member of the core
+team needs to approve a PR before it can be merged into main. As mentioned above, tests are run automatically on PRs with
+a merge target of main. Furthermore, a suite of static code checkers and formatters are also run on said PRs. These also
+need to pass for a PR to be eligible for merging into the main branch of the library. Currently, such checks run on python3.9.
+
+## Development Requirements
+
+For development and testing, we use [uv](https://github.com/astral-sh/uv?tab=readme-ov-file#installation) for dependency
+management. The library dependencies and those for development and testing are listed in the `pyproject.toml` file.
+You may use whatever virtual environment management tool that you would like.
+These include uv, conda, and virtualenv.
+
+The easiest way to create and activate a virtual environment for development using uv is:
+```bash
+uv sync --dev --all-extras
+```
+
+Note that the with command is installing all libraries required for the full development workflow. See the `pyproject.toml`
+file for additional details as to what is installed with each of these options.
+
+If you need to update the environment libraries, you should change the requirements in the `pyproject.toml` and then update
+the `uv.lock` using the command `uv lock`.
+
+## Coding Guidelines, Formatters, and Checks
+
+For code style, we recommend the [PEP 8 style guide](https://peps.python.org/pep-0008/).
+
+We use [ruff](https://docs.astral.sh/ruff/) for code formatting and static code analysis. Ruff checks various rules including
+[flake8](https://docs.astral.sh/ruff/faq/#how-does-ruff-compare-to-flake8). The pre-commit hooks show errors which you need
+to fix before submitting a PR.
+
+Last but not least, we use type hints in our code which are checked using [mypy](https://mypy.readthedocs.io/en/stable/).
+The mypy checks are strictly enforced. That is, all mypy checks must pass or the associated PR will not be merge-able.
+
+The settings for `mypy` and `ruff` can be found the `pyproject.toml` files and some standard checks are defined directly
+in the `.pre-commit-config.yaml` settings.
+
+All of these checks and formatters are invoked by pre-commit hooks. These hooks are run remotely on GitHub. In order to
+ensure that your code conforms to these standards, and, therefore, passes the remote checks, you can install the pre-commit
+hooks to be run locally. This is done by running (with your environment active)
+
+```bash
+pre-commit install
+```
+
+To run the checks, some of which will automatically re-format your code to fit the standards, you can run
+```bash
+pre-commit run --all-files
+```
+It can also be run on a subset of files by omitting the `--all-files` option and pointing to specific files or folders.
+
+If you're using VS Code for development, pre-commit should setup git hooks that execute the pre-commit checks each time
+you check code into your branch through the integrated source-control as well. This will ensure that each of your commits
+conform to the desired format before they are run remotely and without needing to remember to run the checks before pushing
+to a remote. If this isn't done automatically, you can find instructions for setting up these hooks manually online.
+
+## Code Documentation
+
+For code documentation, we try to adhere to the [numpy format](https://numpydoc.readthedocs.io/en/latest/format.html).
+For development, __any non-trivial or non-obvious methods added to the library should have a doc string__. For our library
+this applies only to code added to the main library in `mmlearn`. Code outside the core library folder, such as tests,
+need not incorporate the strict rules of documentation, though clarifying and helpful comments in that code is also
+__strongly encouraged__.
+
+__NOTE__: As a matter of convention choice, classes are documented at the "class" level rather than through their `__init__`
+functions.
+
+If you are using VS Code a very helpful integration is available to facilitate the creation of properly formatted doc-strings
+called autoDocstring [VS Code Page](https://marketplace.visualstudio.com/items?itemName=njpwerner.autodocstring) and
+[Documentation](https://github.com/NilsJPWerner/autoDocstring). This tool will automatically generate a docstring template
+when starting a docstring with triple quotation marks (`"""`). To get the correct format, the following settings should
+be prescribed in your VS Code settings JSON:
+
+```json
+{
+ "autoDocstring.customTemplatePath": "",
+ "autoDocstring.docstringFormat": "numpy",
+ "autoDocstring.generateDocstringOnEnter": true,
+ "autoDocstring.guessTypes": true,
+ "autoDocstring.includeExtendedSummary": false,
+ "autoDocstring.includeName": false,
+ "autoDocstring.logLevel": "Info",
+ "autoDocstring.quoteStyle": "\"\"\"",
+ "autoDocstring.startOnNewLine": true
+}
+```
+
+## Tests
+
+All tests for the library are housed in the `tests` folder. The unit and integration tests are run using `pytest`. These
+tests are automatically run through GitHub integrations on PRs to the main branch of this repository. PRs that fail any
+of the tests will not be eligible to be merged until they are fixed.
+
+To run all tests in the tests folder one only needs to run (with the venv active)
+```bash
+pytest .
+```
+To run a specific test with pytest, one runs
+```bash
+pytest tests/datasets/test_combined_dataset.py
+```
diff --git a/docs/source/index.rst b/docs/index.md
similarity index 52%
rename from docs/source/index.rst
rename to docs/index.md
index 8e2a187..7d47792 100644
--- a/docs/source/index.rst
+++ b/docs/index.md
@@ -1,17 +1,11 @@
-mmlearn documentation
-=====================
+# mmlearn documentation
*mmlearn* aims at enabling the evaluation of existing multimodal representation learning methods, as well as facilitating
experimentation and research for new techniques.
+## Contents
-Contents
---------
-
-.. toctree::
- :maxdepth: 2
-
- installation
- user_guide
- contributing
- api
+- [Installation](installation.md)
+- [User Guide](user_guide.md)
+- [Contributing](contributing.md)
+- [API Reference](api.md)
diff --git a/docs/installation.md b/docs/installation.md
new file mode 100644
index 0000000..8dbc1c8
--- /dev/null
+++ b/docs/installation.md
@@ -0,0 +1,54 @@
+# Installation
+
+!!! tip "Prerequisites"
+ For local development, it is generally recommended to install *mmlearn* in a non-global environment (e.g. venv or conda).
+ This will allow you to use different versions of *mmlearn* for different projects.
+
+ You can create a virtual environment using venv with the following command:
+ ```bash
+ python3 -m venv /path/to/new/virtual/environment
+ source /path/to/new/virtual/environment/bin/activate
+ ```
+
+## Installing from PyPI
+
+mmlearn is published on the [Python Package Index](https://pypi.org/project/mmlearn/) and can be installed using pip.
+
+Run the following command to install the library:
+
+```bash
+python3 -m pip install mmlearn
+```
+
+!!! note
+ `mmlearn` has several optional dependencies that are used for specific functionality.
+ For example, the [peft](https://huggingface.co/docs/peft/index) library for parameter-efficient finetuning.
+ Hence, `peft` can be installed using:
+
+ ```bash
+ python3 -m pip install mmlearn[peft]
+ ```
+
+ Specific sets of dependencies are listed below.
+
+ | Dependency | pip extra | Notes |
+ |------------|-----------|-------|
+ | torchvision, timm, opencv-python | vision | Allows use of computer vision models and image processing functionality |
+ | torchaudio | audio | Allows use of audio processing and audio model functionality |
+ | peft | peft | Allows use of parameter-efficient fine-tuning methods |
+
+## Installing from source
+
+You can install mmlearn directly from a clone of the Git repository.
+This can be done either by cloning the repo and installing from the local clone,
+or simply installing directly via git.
+
+```bash
+git clone https://github.com/VectorInstitute/mmlearn.git
+cd mmlearn
+python3 -m pip install -e .
+```
+
+```bash
+pip install git+https://github.com/VectorInstitute/mmlearn.git
+```
diff --git a/docs/make.bat b/docs/make.bat
deleted file mode 100644
index dc1312a..0000000
--- a/docs/make.bat
+++ /dev/null
@@ -1,35 +0,0 @@
-@ECHO OFF
-
-pushd %~dp0
-
-REM Command file for Sphinx documentation
-
-if "%SPHINXBUILD%" == "" (
- set SPHINXBUILD=sphinx-build
-)
-set SOURCEDIR=source
-set BUILDDIR=build
-
-%SPHINXBUILD% >NUL 2>NUL
-if errorlevel 9009 (
- echo.
- echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
- echo.installed, then set the SPHINXBUILD environment variable to point
- echo.to the full path of the 'sphinx-build' executable. Alternatively you
- echo.may add the Sphinx directory to PATH.
- echo.
- echo.If you don't have Sphinx installed, grab it from
- echo.https://www.sphinx-doc.org/
- exit /b 1
-)
-
-if "%1" == "" goto help
-
-%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
-goto end
-
-:help
-%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
-
-:end
-popd
diff --git a/docs/overrides/partials/copyright.html b/docs/overrides/partials/copyright.html
new file mode 100644
index 0000000..776166c
--- /dev/null
+++ b/docs/overrides/partials/copyright.html
@@ -0,0 +1,22 @@
+
+
+ {% if config.copyright %}
+
{{ config.copyright }}
+ {% endif %} {% if not config.extra.generator == false %} Made with
+
+ Material for MkDocs
+
+ {% endif %}
+
diff --git a/docs/overrides/partials/logo.html b/docs/overrides/partials/logo.html
new file mode 100644
index 0000000..2ed1c76
--- /dev/null
+++ b/docs/overrides/partials/logo.html
@@ -0,0 +1,5 @@
+{% if config.theme.logo %}
+
+{% else %}
+
+{% endif %}
diff --git a/docs/source/_static/custom.js b/docs/source/_static/custom.js
deleted file mode 100644
index 738d145..0000000
--- a/docs/source/_static/custom.js
+++ /dev/null
@@ -1,6 +0,0 @@
-requirejs.config({
- paths: {
- base: '/static/base',
- plotly: 'https://cdn.plot.ly/plotly-2.30.0.min.js?noext',
- },
-});
diff --git a/docs/source/_static/logos/vector_logo.png b/docs/source/_static/logos/vector_logo.png
deleted file mode 100644
index 3d9b106..0000000
Binary files a/docs/source/_static/logos/vector_logo.png and /dev/null differ
diff --git a/docs/source/_static/require.min.js b/docs/source/_static/require.min.js
deleted file mode 100644
index 73dbde8..0000000
--- a/docs/source/_static/require.min.js
+++ /dev/null
@@ -1 +0,0 @@
-var requirejs,require,define;!function(global,setTimeout){var req,s,head,baseElement,dataMain,src,interactiveScript,currentlyAddingScript,mainScript,subPath,version="2.3.6",commentRegExp=/\/\*[\s\S]*?\*\/|([^:"'=]|^)\/\/.*$/gm,cjsRequireRegExp=/[^.]\s*require\s*\(\s*["']([^'"\s]+)["']\s*\)/g,jsSuffixRegExp=/\.js$/,currDirRegExp=/^\.\//,op=Object.prototype,ostring=op.toString,hasOwn=op.hasOwnProperty,isBrowser=!("undefined"==typeof window||"undefined"==typeof navigator||!window.document),isWebWorker=!isBrowser&&"undefined"!=typeof importScripts,readyRegExp=isBrowser&&"PLAYSTATION 3"===navigator.platform?/^complete$/:/^(complete|loaded)$/,defContextName="_",isOpera="undefined"!=typeof opera&&"[object Opera]"===opera.toString(),contexts={},cfg={},globalDefQueue=[],useInteractive=!1;function commentReplace(e,t){return t||""}function isFunction(e){return"[object Function]"===ostring.call(e)}function isArray(e){return"[object Array]"===ostring.call(e)}function each(e,t){var i;if(e)for(i=0;i
-
-
- {%- block site_meta -%}
-
-
-
-
-
- {%- if metatags %}{{ metatags }}{% endif -%}
-
- {# Make sure all pages have a description or Bing does not like us #}
- {% if 'name="description"' not in metatags %}
-
- {% endif %}
-
- {%- block linktags %}
- {%- if hasdoc('about') -%}
-
- {%- endif -%}
- {%- if hasdoc('genindex') -%}
-
- {%- endif -%}
- {%- if hasdoc('search') -%}
-
- {%- endif -%}
- {%- if hasdoc('copyright') -%}
-
- {%- endif -%}
- {%- if next -%}
-
- {%- endif -%}
- {%- if prev -%}
-
- {%- endif -%}
- {#- rel="canonical" (set by html_baseurl) -#}
- {%- if pageurl %}
-
- {%- endif %}
- {%- endblock linktags %}
-
- {# Favicon #}
- {%- if favicon_url -%}
-
- {%- endif -%}
-
- {#- Generator banner -#}
-
-
- {# Bing webmasters meta tag #}
-
-
- {%- endblock site_meta -%}
-
- {#- Site title -#}
- {%- block htmltitle -%}
- {# See Sphinx monkey patch in conf.py #}
- {% if 'title' in metas %}
- {{ metas.title }}
- {% elif not docstitle %}
- {{ title|striptags|e }}
- {% elif pagename == master_doc %}
- {{ docstitle|striptags|e }}
- {% else %}
- {{ title|striptags|e }} - {{ docstitle|striptags|e }}
- {% endif %}
- {%- endblock -%}
-
- {%- block styles -%}
-
- {# Custom stylesheets #}
- {%- block regular_styles -%}
- {%- for css in css_files -%}
- {% if css|attr("filename") -%}
- {{ css_tag(css) }}
- {%- else -%}
-
- {%- endif %}
- {% endfor -%}
- {%- endblock regular_styles -%}
-
- {#- Theme-related stylesheets -#}
- {%- block theme_styles %}
- {% include "partials/_head_css_variables.html" with context %}
- {%- endblock -%}
-
- {%- block extra_styles %}
- {%- endblock -%}
-
- {%- endblock styles -%}
-
- {#- Custom front matter #}
- {%- block extrahead -%}{%- endblock -%}
-
- {# Custom JS #}
- {%- block regular_scripts -%}
- {% for path in script_files -%}
- {{ js_tag(path) }}
- {% endfor -%}
- {%- endblock regular_scripts -%}
-
- {# Theme-related JavaScript code #}
- {%- block theme_scripts -%}
- {%- endblock -%}
-
- {# Footer icons #}
-
-
-
-
- {% block body %}
-
- {% endblock %}
-
- {%- block scripts -%}
- {%- endblock scripts -%}
-
-
diff --git a/docs/source/_templates/custom-class-template.rst b/docs/source/_templates/custom-class-template.rst
deleted file mode 100644
index 43864c8..0000000
--- a/docs/source/_templates/custom-class-template.rst
+++ /dev/null
@@ -1,29 +0,0 @@
-{{ fullname | escape | underline}}
-
-.. currentmodule:: {{ module }}
-
-.. autoclass:: {{ objname }}
- :members:
- :show-inheritance:
- :inherited-members:
- :special-members: __call__, __getitem__, __iter__
-
- {% block methods %}
- {% if methods %}
- .. rubric:: {{ _('Methods') }}
-
- {% for item in methods %}
- .. automethod:: ~{{ name }}.{{ item }}
- {%- endfor %}
- {% endif %}
- {% endblock %}
-
- {% block attributes %}
- {% if attributes %}
- .. rubric:: {{ _('Attributes') }}
-
- {% for item in attributes %}
- .. autoattribute:: ~{{ name }}.{{ item }}
- {%- endfor %}
- {% endif %}
- {% endblock %}
diff --git a/docs/source/_templates/custom-module-template.rst b/docs/source/_templates/custom-module-template.rst
deleted file mode 100644
index 1db765a..0000000
--- a/docs/source/_templates/custom-module-template.rst
+++ /dev/null
@@ -1,60 +0,0 @@
-{{ fullname | escape | underline}}
-
-.. automodule:: {{ fullname }}
-
- {% block attributes %}
- {% if attributes %}
- .. rubric:: Module attributes
-
- {% for item in attributes %}
- .. autodata:: {{ item }}
- {%- endfor %}
- {% endif %}
- {% endblock %}
-
- {% block functions %}
- {% if functions %}
- .. rubric:: {{ _('Functions') }}
-
- {% for item in functions %}
- .. autofunction:: {{ item }}
- {%- endfor %}
- {% endif %}
- {% endblock %}
-
- {% block classes %}
- {% if classes %}
- .. rubric:: {{ _('Classes') }}
-
- .. autosummary::
- :toctree:
- :hidden:
- :template: custom-class-template.rst
- :nosignatures:
- {% for item in classes %}
- {{ item }}
- {%- endfor %}
- {% endif %}
- {% endblock %}
-
- {% block exceptions %}
- {% if exceptions %}
- .. rubric:: {{ _('Exceptions') }}
-
- {% for item in exceptions %}
- .. autoexception:: {{ item }}
- {%- endfor %}
- {% endif %}
- {% endblock %}
-
-{% block modules %}
-{% if modules %}
-.. autosummary::
- :toctree:
- :template: custom-module-template.rst
- :recursive:
-{% for item in modules %}
- {{ item }}
-{%- endfor %}
-{% endif %}
-{% endblock %}
diff --git a/docs/source/_templates/page.html b/docs/source/_templates/page.html
deleted file mode 100644
index 81b2131..0000000
--- a/docs/source/_templates/page.html
+++ /dev/null
@@ -1,219 +0,0 @@
-{% extends "base.html" %}
-
-{% block body -%}
-{{ super() }}
-{% include "partials/icons.html" %}
-
-
-
-
-
- Hide table of contents sidebar
-
-
-{% if theme_announcement -%}
-
-
- {% block announcement %} {{ theme_announcement }} {% endblock announcement %}
-
-
-{%- endif %}
-
-
-
-
-
-
-
-
-
-
-
- {% trans %}Back to top{% endtrans %}
-
-
- {% if theme_top_of_page_button == "edit" -%}
- {%- include "components/edit-this-page.html" with context -%}
- {%- elif theme_top_of_page_button != None -%}
- {{ warning("Got an unsupported value for 'top_of_page_button'") }}
- {%- endif -%}
- {#- Theme toggle -#}
-
-
- Toggle Light / Dark / Auto color theme
-
-
-
-
-
-
- Toggle table of contents sidebar
-
-
-
-
- {% block content %}{{ body }}{% endblock %}
-
-
-
-
-
-
-
-{%- endblock %}
diff --git a/docs/source/api.rst b/docs/source/api.rst
deleted file mode 100644
index c641f9a..0000000
--- a/docs/source/api.rst
+++ /dev/null
@@ -1,13 +0,0 @@
-API Reference
-=============
-
-.. autosummary::
- :toctree: reference/api
- :template: custom-module-template.rst
- :recursive:
-
- mmlearn.conf
- mmlearn.datasets
- mmlearn.hf_utils
- mmlearn.modules
- mmlearn.tasks
diff --git a/docs/source/conf.py b/docs/source/conf.py
deleted file mode 100644
index 3228a71..0000000
--- a/docs/source/conf.py
+++ /dev/null
@@ -1,102 +0,0 @@
-"""Configuration file for the Sphinx documentation builder."""
-
-# For the full list of built-in configuration values, see the documentation:
-# https://www.sphinx-doc.org/en/master/usage/configuration.html
-import os
-import sys
-
-
-sys.path.insert(0, os.path.abspath("../.."))
-sys.path.insert(0, os.path.abspath("./_ext"))
-
-# -- Project information -----------------------------------------------------
-# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information
-
-project = "mmlearn"
-copyright = "2024, Vector AI Engineering" # noqa: A001
-author = "Vector AI Engineering"
-release = "0.1.0b2"
-
-# -- General configuration ---------------------------------------------------
-# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration
-
-extensions = [
- "sphinx.ext.autodoc",
- "sphinx.ext.autosectionlabel",
- "sphinx.ext.autosummary",
- "sphinx.ext.intersphinx",
- "sphinx.ext.napoleon",
- "sphinx.ext.viewcode",
- "sphinx_autodoc_typehints",
- "sphinx_copybutton",
- "sphinx_design",
- "sphinxcontrib.apidoc",
- "myst_parser",
-]
-add_module_names = False
-apidoc_module_dir = "../../mmlearn"
-apidoc_output_dir = "reference/api"
-apidoc_excluded_paths = ["tests"]
-apidoc_separate_modules = True
-apidoc_module_first = True
-autoclass_content = "class"
-autodoc_default_options = {
- "members": True,
- "undoc-members": False,
- "private-members": False,
- "special-members": "__call__,__getitem__,__iter__,__len__",
- "inherited-members": False,
- "ignore-module-all": True,
-}
-autodoc_inherit_docstrings = True
-autosectionlabel_prefix_document = True
-autosummary_generate = True
-copybutton_prompt_text = r">>> |\.\.\. "
-copybutton_prompt_is_regexp = True
-intersphinx_mapping = {
- "python": ("https://docs.python.org/3.10/", None),
- "numpy": ("http://docs.scipy.org/doc/numpy/", None),
- "pandas": ("https://pandas.pydata.org/docs/", None),
- "torch": ("https://pytorch.org/docs/stable/", None),
- "torchvision": ("https://pytorch.org/vision/stable/", None),
- "torchaudio": ("https://pytorch.org/audio/stable/", None),
- "hydra-zen": ("https://mit-ll-responsible-ai.github.io/hydra-zen/", None),
- "pillow": ("https://pillow.readthedocs.io/en/stable/", None),
- "lightning": ("https://lightning.ai/docs/pytorch/stable/", None),
- "torchmetrics": ("https://lightning.ai/docs/torchmetrics/stable/", None),
- "Pillow": ("https://pillow.readthedocs.io/en/latest/", None),
- "transformers": ("https://huggingface.co/docs/transformers/en/", None),
-}
-napoleon_google_docstring = False
-napoleon_numpy_docstring = True
-napoleon_include_init_with_doc = True
-napoleon_attr_annotations = True
-set_type_checking_flag = True
-templates_path = ["_templates"]
-
-# -- Options for HTML output -------------------------------------------------
-# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output
-
-html_theme = "furo"
-html_static_path = ["_static"]
-html_js_files = ["require.min.js", "custom.js"]
-html_additional_pages = {"page": "page.html"}
-html_theme_options = {
- "dark_css_variables": {
- "color-brand-primary": "#faad1a",
- "color-brand-content": "#eb088a",
- "color-foreground-secondary": "#52c7de",
- },
- "footer_icons": [
- {
- "name": "GitHub",
- "url": "https://github.com/VectorInstitute/mmlearn",
- "html": """
-
-
-
- """,
- "class": "",
- },
- ],
-}
diff --git a/docs/source/contributing.rst b/docs/source/contributing.rst
deleted file mode 100644
index 7a661a3..0000000
--- a/docs/source/contributing.rst
+++ /dev/null
@@ -1,2 +0,0 @@
-.. include:: ../../CONTRIBUTING.md
- :parser: myst_parser.sphinx_
diff --git a/docs/source/installation.rst b/docs/source/installation.rst
deleted file mode 100644
index c4c9652..0000000
--- a/docs/source/installation.rst
+++ /dev/null
@@ -1,67 +0,0 @@
-Installation
-============
-
-.. :toctree::
-
-
-.. tip:: **Prerequisites**
-
- For local development, it is generally recommended to install *mmlearn* in a non-global environment (e.g. venv or conda)
- This will allow you to use different versions of *mmlearn* for different projects.
-
- You can create a virtual environment using venv with the following command:
-
- .. code:: bash
-
- python3 -m venv /path/to/new/virtual/environment
- source /path/to/new/virtual/environment/bin/activate
-
-
-Installing from PyPI
----------------------
-
-mmlearn is published on the `Python Package Index `__ and can be installed using pip.
-
-Run the following command to install the library:
-
-.. code:: bash
-
- python3 -m pip install mmlearn
-
-.. note::
- ``mmlearn`` has several optional dependencies that are used for specific functionality.
- For example, the `peft `__ library for parameter-efficient finetuning.
- Hence, `peft` can be installed using:
-
- .. code:: bash
-
- python3 -m pip install mmlearn[peft]
-
- Specific sets of dependencies are listed below.
-
- +-----------------------------------+--------------------------+---------------------------------------------------------------------------------------------------------------+
- | Dependency | pip extra | Notes |
- +===================================+==========================+===============================================================================================================+
- | torchvision, timm, opencv-python | vision | Allows use of computer vision models and image processing functionality |
- +-----------------------------------+--------------------------+---------------------------------------------------------------------------------------------------------------+
- | torchaudio | audio | Allows use of audio processing and audio model functionality |
- +-----------------------------------+--------------------------+---------------------------------------------------------------------------------------------------------------+
- | peft | peft | Allows use of parameter-efficient fine-tuning methods |
- +-----------------------------------+--------------------------+---------------------------------------------------------------------------------------------------------------+
-
-Installing from source
-----------------------
-
-You can install mmlearn directly from a clone of the Git repository.
-This can be done either by cloning the repo and installing from the local clone,
-on simply installing directly via git.
-
-.. code:: bash
-
- git clone https://github.com/VectorInstitute/mmlearn.git
- cd mmlearn
- python3 -m pip install -e .
-
-.. code:: bash
-
- pip install git+https://github.com/VectorInstitute/mmlearn.git
diff --git a/docs/source/user_guide.rst b/docs/source/user_guide.rst
deleted file mode 100644
index 7b911ed..0000000
--- a/docs/source/user_guide.rst
+++ /dev/null
@@ -1,587 +0,0 @@
-User Guide
-==========
-*mmlearn* contains a collection of tools and utilities to help researchers and practitioners easily set up and run training
-or evaluation experiments for multimodal representation learning methods. The toolkit is designed to be modular and extensible.
-We aim to provide a high degree of flexibility in using existing methods, while also allowing users to easily add support
-for new modalities of data, datasets, models and pretraining or evaluation methods.
-
-Much of the power and flexibility of *mmlearn* comes from building on top of the `PyTorch Lightning `_
-framework and using `Hydra `_ and `hydra-zen `_
-for configuration management. Together, these tools make it easy to define and run experiments with different configurations,
-and to scale up experiments to run on a SLURM cluster.
-
-The goal of this guide is to give you a brief overview of what *mmlearn* is and how you can get started using it.
-
-.. note::
- *mmlearn* currently only supports training and evaluation of encoder-only models.
-
- For more detailed information on the features and capabilities of *mmlearn*, please refer to the :doc:`API Reference `.
-
-
-Defining a Dataset
-------------------
-Datasets in *mmlearn* can be defined using PyTorch's :class:`~torch.utils.data.Dataset` or :class:`~torch.utils.data.IterableDataset`
-classes. However, there are two additional requirements for datasets in *mmlearn*:
-
-1. The dataset must return an instance of :class:`~mmlearn.datasets.core.example.Example` from the :meth:`~torch.utils.data.Dataset.__getitem__`
- method or the :meth:`~torch.utils.data.IterableDataset.__iter__` method.
-2. The :class:`~mmlearn.datasets.core.example.Example` object returned by the dataset must contain the key ``'example_index'``
- and use modality-specific keys from the :class:`Modalities ` registry
- to store the data.
-
-**Example 1**: Defining a map-style dataset in *mmlearn*:
-
-.. code-block:: python
-
- from torch.utils.data.dataset import Dataset
-
- from mmlearn.datasets.core import Example, Modalities
- from mmlearn.constants import EXAMPLE_INDEX_KEY
-
-
- class MyMapStyleDataset(Dataset[Example]):
- ...
- def __getitem__(self, idx: int) -> Example:
- ...
- return Example(
- {
- EXAMPLE_INDEX_KEY: idx,
- Modalities.TEXT.name: ...,
- Modalities.RGB.name: ...,
- Modalities.RGB.target: ...,
- Modalities.TEXT.mask: ...,
- ...
- }
- )
-
-**Example 2**: Defining an iterable-style dataset in *mmlearn*:
-
-.. code-block:: python
-
- from torch.utils.data.dataset import IterableDataset
-
- from mmlearn.datasets.core import Example, Modalities
- from mmlearn.constants import EXAMPLE_INDEX_KEY
-
-
- class MyIterableStyleDataset(IterableDataset[Example]):
- ...
- def __iter__(self) -> Generator[Example, None, None]:
- ...
- idx = 0
- for item in items:
- yield Example(
- {
- EXAMPLE_INDEX_KEY: idx,
- Modalities.TEXT.name: ...,
- Modalities.AUDIO.name: ...,
- Modalities.TEXT.mask: ...,
- Modalities.AUDIO.mask: ...,
- ...
- }
- )
- idx += 1
-
-The :class:`~mmlearn.datasets.core.example.Example` class represents a single example in the dataset and all the attributes
-associated with it. The class is an extension of the :class:`~collections.OrderedDict` class that provides attribute-style access
-to the dictionary values and handles the creation of the ``'example_ids'`` tuple, combining the ``'example_index'`` and
-``'dataset_index'`` values. The ``'example_index'`` key is created by the dataset object for each example returned by the
-dataset. On the other hand, the ``'dataset_index'`` key is created by the :class:`~mmlearn.datasets.core.combined_dataset.CombinedDataset`
-each :class:`~mmlearn.datasets.core.example.Example` object returned by the dataset.
-
-.. note::
- All dataset objects in *mmlearn* are wrapped in the :class:`~mmlearn.datasets.core.combined_dataset.CombinedDataset` class,
- which is a subclass of :class:`torch.utils.data.Dataset`. As such, the user almost never has to add/define the ``'dataset_index'``
- key explicitly.
-
- Since batching typically combines data from the same modality into one tensor, both the ``'example_index'`` and ``'dataset_index'``
- keys are essential for uniquely identifying paired examples across different modalities from the same dataset. The
- :func:`~mmlearn.datasets.core.example.find_matching_indices` function does exactly this by finding the indices of the
- examples in a batch that have the same ``'example_ids'`` tuple.
-
-:py:data:`~mmlearn.datasets.core.modalities.Modalities` is an instance of :class:`~mmlearn.datasets.core.modalities.ModalityRegistry`
-singleton class that serves as a global registry for all the modalities supported by *mmlearn*. It allows dot-style access
-registered modalities and their properties. For example, the ``'RGB'`` modality can be accessed using :py:data:`Modalities.RGB`
-(returns string ``'rgb'``) and the ``'target'`` property of the ``'RGB'`` modality can be accessed using :py:data:`Modalities.RGB.target`
-(returns the string ``'rgb_target'``). It also provides a method to register new modalities and their properties. For example,
-the following code snippet shows how to register a new ``'DNA'`` modality:
-
-.. code-block:: python
-
- from mmlearn.datasets.core import Modalities
-
- Modalities.register_modality("dna")
-
-
-Adding New Modules
-------------------
-Modules are building blocks for models and tasks in *mmlearn*. They can be anything from encoders, layers, losses, optimizers,
-learning rate schedulers, metrics, etc. Modules in *mmlearn* are generally defined by extending PyTorch's :class:`nn.Module `
-class.
-
-Users have the flexibility to design new modules according to their requirements, with the exception of encoder modules
-and modules associated with specific pre-defined tasks (e.g., loss functions for the :class:`~mmlearn.tasks.contrastive_pretraining.ContrastivePretraining` task).
-The forward method of encoder modules must accept a dictionary as input, where the keys are the names of the modalities
-and the values are the corresponding (batched) tensors/data. This format makes it easier to reuse the encoder with different
-modalities and different tasks. In addition, the forward method must return a list-like object where the first element is
-the last layer's output. The following code snippet shows how to define a new text encoder module:
-
-.. code-block:: python
-
- import torch
- from torch import nn
-
- from mmlearn.datasets.core import Modalities
-
-
- class MyTextEncoder(nn.Module):
- def __init__(self, input_dim: int, output_dim: int):
- super().__init__()
- self.encoder = ...
-
- def forward(self, inputs: dict[str, torch.Tensor]) -> tuple[torch.Tensor]:
- out = self.encoder(
- inputs[Modalities.TEXT.name],
- inputs.get(
- "attention_mask", inputs.get(Modalities.TEXT.attention_mask, None)
- ),
- )
- return (out,)
-
-For modules associated with pre-defined tasks, the new modules must adhere to the same function signature as the existing
-modules for that task. For instance, the forward method of a new loss function for the :class:`~mmlearn.tasks.contrastive_pretraining.ContrastivePretraining`
-task must have the following signature to be compatible with the existing loss functions for the task:
-
-.. code-block:: python
-
- import torch
-
- from mmlearn.tasks.contrastive_pretraining import LossPairSpec
-
- def my_contrastive_loss(
- embeddings: dict[str, torch.Tensor],
- example_ids: dict[str, torch.Tensor],
- logit_scale: torch.Tensor,
- modality_loss_pairs: list[LossPairSpec],
- ) -> torch.Tensor:
- ...
-
-
-Adding New Tasks
-----------------
-Tasks in *mmlearn* represent the different training and/or evaluation objectives that can be performed on the data using
-the different modules. Tasks that require training should extend the :class:`~mmlearn.tasks.base.TrainingTask` class, while tasks
-involving only evaluation should extend the :class:`~mmlearn.tasks.hooks.EvaluationHooks` class.
-
-Training Tasks
-~~~~~~~~~~~~~~
-The :class:`~mmlearn.tasks.base.TrainingTask` class is an extension of the :class:`~lightning.pytorch.core.LightningModule`
-class, which itself is an extension of the :class:`~torch.nn.Module` class. The class provides a common interface for training
-tasks in *mmlearn*. It allows users to define the training loop, validation loop, test loop, and the setup for the model,
-optimizer, learning rate scheduler and loss function, all in one place (a functionality inherited from PyTorch Lightning).
-The class also provides hooks for customizing the training loop, validation loop, and test loop, as well as a suite of
-other functionalities like logging, checkpointing and handling distributed training.
-
-.. seealso::
- For more information on the features and capabilities of the :class:`~mmlearn.tasks.base.TrainingTask` class inherited
- from PyTorch Lightning, please refer to the PyTorch Lightning `documentation `_.
-
-To be used with the PyTorch Lightning Trainer, extensions of the :class:`~mmlearn.tasks.base.TrainingTask` class must define
-a `training_step` method. The following code snippet shows the minimum requirements for defining a new task in *mmlearn*:
-
-.. code-block:: python
-
- from typing import Any, Optional, Union
- from functools import partial
-
- import torch
-
- from mmlearn.tasks.base import TrainingTask
-
- class MyTask(TrainingTask):
- def __init__(
- self,
- optimizer: Optional[partial[torch.optim.Optimizer]],
- loss_fn: Optional[torch.nn.Module],
- lr_scheduler: Optional[
- Union[
- dict[str, Union[partial[torch.optim.lr_scheduler.LRScheduler], Any]],
- partial[torch.optim.lr_scheduler.LRScheduler],
- ]
- ] = None,
- ) -> None:
- super().__init__(optimizer=optimizer, loss_fn=loss_fn, lr_scheduler=lr_scheduler)
-
- # Since this class also inherits from torch.nn.Module, we can define the
- # model and its components directly in the constructor and also define
- # a forward method for the model as an instance method of this class.
- # Alternatively, we can pass the model as an argument to the constructor
- # and assign it to an instance variable.
- self.model = ...
-
- def training_step(self, batch: dict[str, Any], batch_idx: int) -> torch.Tensor:
- outputs = self.model(batch) # or self(batch) if a forward method is defined in this class
-
- # maybe process outputs here
-
- loss = self.loss_fn(outputs, ...)
- return loss
-
-Evaluation Tasks
-~~~~~~~~~~~~~~~~
-The :class:`~mmlearn.tasks.hooks.EvaluationHooks` class is intended to be used for evaluation tasks that don't require training,
-e.g. zero-shot evaluation tasks (as opposed to evaluation tasks like linear probing, which require training). The class provides
-an interface for defining and customizing the evaluation loop.
-
-Classes that inherit from :class:`~mmlearn.tasks.hooks.EvaluationHooks` cannot be run/used on their own. They must be used
-in conjunction with a training task, which will call the hooks defined in the evaluation task during the evaluation phase.
-This way, multiple evaluation tasks can be defined and used with the same training task. The model to be evaluated is
-provided by the training task to the evaluation task.
-
-Training tasks that wish to use one or more evaluation tasks must accept an instance of the evaluation task(s) as an argument
-to the constructor and must define a ``validation_step`` and/or ``test_step`` method that calls the ``evaluation_step`` method
-of the evaluation task(s).
-
-
-Creating and Configuring a Project
-----------------------------------
-A project in *mmlearn* can be thought of as a collection of related experiments. Within a project, you can reuse components
-from *mmlearn* (e.g., datasets, models, tasks) or define new ones and use them all together for experiments.
-
-To create a new project, create a new directory following the structure below:
-
-.. code-block:: bash
-
- my_project/
- ├── configs/
- │ ├── __init__.py
- │ └── experiment/
- │ ├── my_experiment.yaml
- ├── README.md (optional)
- ├── requirements.txt (optional)
-
-The ``configs/`` directory contains all the configurations, both `structured configs `_
-and YAML config files for the experiments in the project. The ``configs/experiment/`` directory contains the `.yaml` files
-for the experiments associated with the project. These `.yaml` files use the `Hydra configuration format `_,
-which also allows overriding the configuration options/values from the command line.
-
-The ``__init__.py`` file in the ``configs/`` directory is required to make the ``configs/`` directory a Python package,
-allowing hydra to compose configurations from `.yaml` files as well as structured configs from python modules. More on this
-in the next section.
-
-Optionally, you can also include a ``README.md`` file with a brief description of the project and a ``requirements.txt`` file
-with the dependencies required to run the project.
-
-Specifying Configurable Components
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-One of the key features of the Hydra configuration system is the ability to compose configurations from multiple sources,
-including the command line, `.yaml` files and structured configs from Python modules. `Structured Configs `_
-in Hydra use Python :func:`~dataclasses.dataclass` to define the configuration schema. This allows for both static and runtime type-checking
-of the configuration. `Hydra-zen `_ extends Hydra to makes it easy
-to dynamically generate dataclass-backed configurations for any class or function simply by adding a decorator to the class
-or function.
-
-*mmlearn* provides a pre-populated `config store `_,
-:py:data:`~mmlearn.conf.external_store`, which can be used as a decorator to register configurable components. This config
-store already contains configurations for common components like PyTorch :py:mod:`optimizers `,
-:py:mod:`learning rate schedulers `, loss functions and samplers,
-as well as PyTorch Lightning's Trainer :py:mod:`callbacks ` and :py:mod:`loggers `.
-To dynamically add new configurable components to the store, simply add the :py:data:`~mmlearn.conf.external_store` decorator
-to the class or function definition.
-
-For example, the following code snippet shows how to register a new dataset class:
-
-.. code-block:: python
-
- from torch.utils.data.dataset import Dataset
-
- from mmlearn.conf import external_store
- from mmlearn.constants import EXAMPLE_INDEX_KEY
- from mmlearn.datasets.core import Example, Modalities
-
-
- @external_store(group="datasets")
- class MyMapStyleDataset(Dataset[Example]):
- ...
- def __getitem__(self, idx: int) -> Example:
- ...
- return Example(
- {
- EXAMPLE_INDEX_KEY: idx,
- Modalities.TEXT.name: ...,
- Modalities.RGB.name: ...,
- Modalities.RGB.target: ...,
- Modalities.TEXT.mask: ...,
- ...
- }
- )
-
-The :py:data:`~mmlearn.conf.external_store` decorator immediately add the class to the config store once the Python interpreter
-loads the module containing the class. This is why the ``configs/`` directory must be a Python package and why modules
-containing user-defined configurable components must be imported in the ``configs/__init__.py`` file.
-
-The ``group`` argument specifies the `config group `_
-under which the configurable component will be registered. This allows users to easily reference the component in the
-configurations using the group name and the class name. The available config groups in *mmlearn* are:
-
-- ``datasets``: Contains all the dataset classes.
-- ``datasets/masking``: Contains all the configurable classes and functions for masking input data.
-- ``datasets/tokenizers``: Contains all the configurable classes and functions for converting raw inputs to tokens.
-- ``datasets/transforms``: Contains all the configurable classes and functions for transforming input data.
-- ``dataloader/sampler``: Contains all the dataloader sampler classes.
-- ``modules/encoders``: Contains all the encoder modules.
-- ``modules/layers``: For layers that can be used independent of the model.
-- ``modules/losses``: Contains all the loss functions.
-- ``modules/optimizers``: Contains all the optimizers.
-- ``modules/lr_schedulers``: Contains all the learning rate schedulers.
-- ``modules/metrics``: Contains all the evaluation metrics.
-- ``tasks``: Contains all the task classes.
-- ``trainer/callbacks``: Contains all the PyTorch Lightning Trainer callbacks.
-- ``trainer/logger``: Contains all the PyTorch Lightning Trainer loggers.
-
-
-The Base Configuration
-~~~~~~~~~~~~~~~~~~~~~~~
-The base configuration for all experiments in *mmlearn* are defined in the :class:`~mmlearn.conf.MMLearnConf`
-dataclass. This serves as the base configuration for all experiments and can be extended to include additional configuration
-options, following Hydra's `override syntax `_.
-
-The base configuration for *mmlearn* is shown below:
-
-.. code-block:: yaml
-
- experiment_name: ???
- job_type: train
- seed: null
- datasets:
- train: null
- val: null
- test: null
- dataloader:
- train:
- _target_: torch.utils.data.dataloader.DataLoader
- _convert_: object
- dataset: ???
- batch_size: 1
- shuffle: null
- sampler: null
- batch_sampler: null
- num_workers: 0
- collate_fn:
- _target_: mmlearn.datasets.core.data_collator.DefaultDataCollator
- batch_processors: null
- pin_memory: true
- drop_last: false
- timeout: 0.0
- worker_init_fn: null
- multiprocessing_context: null
- generator: null
- prefetch_factor: null
- persistent_workers: false
- pin_memory_device: ''
- val:
- _target_: torch.utils.data.dataloader.DataLoader
- _convert_: object
- dataset: ???
- batch_size: 1
- shuffle: null
- sampler: null
- batch_sampler: null
- num_workers: 0
- collate_fn:
- _target_: mmlearn.datasets.core.data_collator.DefaultDataCollator
- batch_processors: null
- pin_memory: true
- drop_last: false
- timeout: 0.0
- worker_init_fn: null
- multiprocessing_context: null
- generator: null
- prefetch_factor: null
- persistent_workers: false
- pin_memory_device: ''
- test:
- _target_: torch.utils.data.dataloader.DataLoader
- _convert_: object
- dataset: ???
- batch_size: 1
- shuffle: null
- sampler: null
- batch_sampler: null
- num_workers: 0
- collate_fn:
- _target_: mmlearn.datasets.core.data_collator.DefaultDataCollator
- batch_processors: null
- pin_memory: true
- drop_last: false
- timeout: 0.0
- worker_init_fn: null
- multiprocessing_context: null
- generator: null
- prefetch_factor: null
- persistent_workers: false
- pin_memory_device: ''
- task: ???
- trainer:
- _target_: lightning.pytorch.trainer.trainer.Trainer
- accelerator: auto
- strategy: auto
- devices: auto
- num_nodes: 1
- precision: null
- logger: null
- callbacks: null
- fast_dev_run: false
- max_epochs: null
- min_epochs: null
- max_steps: -1
- min_steps: null
- max_time: null
- limit_train_batches: null
- limit_val_batches: null
- limit_test_batches: null
- limit_predict_batches: null
- overfit_batches: 0.0
- val_check_interval: null
- check_val_every_n_epoch: 1
- num_sanity_val_steps: null
- log_every_n_steps: null
- enable_checkpointing: true
- enable_progress_bar: true
- enable_model_summary: true
- accumulate_grad_batches: 1
- gradient_clip_val: null
- gradient_clip_algorithm: null
- deterministic: null
- benchmark: null
- inference_mode: true
- use_distributed_sampler: true
- profiler: null
- detect_anomaly: false
- barebones: false
- plugins: null
- sync_batchnorm: false
- reload_dataloaders_every_n_epochs: 0
- default_root_dir: ${hydra:runtime.output_dir}/checkpoints
- tags:
- - ${experiment_name}
- resume_from_checkpoint: null
- strict_loading: true
- torch_compile_kwargs:
- disable: true
- fullgraph: false
- dynamic: null
- backend: inductor
- mode: null
- options: null
-
-The config keys with a value of ``???`` are placeholders that must be overridden in the experiment configurations. While
-the ``dataset`` key in the ``dataloader`` group is also a placeholder, it should not be provided as it will be automatically
-filled in from the ``datasets`` group.
-
-Configuring an Experiment
-~~~~~~~~~~~~~~~~~~~~~~~~~
-To configure an experiment, create a new `.yaml` file in the ``configs/experiment/`` directory of the project. The configuration
-file should define the experiment-specific configuration options and override the base configuration options as needed.
-Configurable components from the config store can be referenced by name in the configuration file under the
-`defaults list `_. The following code snippet shows an example configuration
-file for an experiment:
-
-.. code-block:: yaml
-
- # @package _global_
-
- defaults:
- - /datasets@datasets.train.my_iterable: MyIterableStyleDataset
- - /datasets@datasets.train.my_map: MyMapStyleDataset
- - /modules/encoders@task.encoders.text: MyTextEncoder
- - /modules/encoders@task.encoders.rgb: MyRGBEncoder
- - /modules/losses@task.loss: ContrastiveLoss
- - /modules/optimizers@task.optimizer: AdamW
- - /modules/lr_schedulers@task.lr_scheduler.scheduler: CosineAnnealingLR
- - /eval_task@task.evaluation_tasks.retrieval.task: ZeroShotCrossModalRetrieval
- - /trainer/callbacks@trainer.callbacks.lr_monitor: LearningRateMonitor
- - /trainer/callbacks@trainer.callbacks.model_checkpoint: ModelCheckpoint
- - /trainer/callbacks@trainer.callbacks.early_stopping: EarlyStopping
- - /trainer/callbacks@trainer.callbacks.model_summary: ModelSummary
- - /trainer/logger@trainer.logger.wandb: WandbLogger
- - override /task: ContrastivePretraining
- - _self_
-
- seed: 42
-
- datasets:
- train:
- my_iterable:
- my_iterable_arg1: ...
- my_map:
- my_map_arg1: ...
-
- dataloader:
- train:
- batch_size: 64
-
- task:
- encoders:
- text:
- text_arg1: ...
- rgb:
- rgb_arg1: ...
- evaluation_tasks:
- retrieval:
- task:
- task_specs:
- - query_modality: text
- target_modality: rgb
- top_k: [10, 200]
- - query_modality: rgb
- target_modality: text
- top_k: [10, 200]
- run_on_validation: false
- run_on_test: true
-
-Running an Experiment
----------------------
-To run an experiment locally, use the following command:
-
-.. code:: bash
-
- mmlearn_run 'hydra.searchpath=[pkg://path.to.my_project.configs]' \
- +experiment=my_experiment \
- experiment_name=my_experiment_name
-
-.. tip::
- You can see the full config for an experiment without running it by adding the ``--help`` flag to the command.
-
- .. code:: bash
-
- mmlearn_run 'hydra.searchpath=[pkg://path.to.my_project.configs]' \
- +experiment=my_experiment \
- experiment_name=my_experiment_name \
- task=my_task \ # required for the command to run
- --help
-
-To run the experiment on a SLURM cluster, use the following command:
-
-.. code:: bash
-
- mmlearn_run --multirun \
- hydra.launcher.mem_per_cpu=5G \
- hydra.launcher.qos=your_qos \
- hydra.launcher.partition=your_partition \
- hydra.launcher.gres=gpu:4 \
- hydra.launcher.cpus_per_task=8 \
- hydra.launcher.tasks_per_node=4 \
- hydra.launcher.nodes=1 \
- hydra.launcher.stderr_to_stdout=true \
- hydra.launcher.timeout_min=720 \
- 'hydra.searchpath=[pkg://path.to.my_project.configs]' \
- +experiment=my_experiment \
- experiment_name=my_experiment_name
-
-This uses the `submitit launcher `_ plugin built into Hydra to submit
-the experiment to the SLURM scheduler with the specified resources.
-
-.. note::
- After the job is submitted, it is okay to cancel the program with ``Ctrl+C``. The job will continue running on
- the cluster. You can also add ``&`` at the end of the command to run it in the background.
diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css
new file mode 100644
index 0000000..4ab12ac
--- /dev/null
+++ b/docs/stylesheets/extra.css
@@ -0,0 +1,91 @@
+[data-md-color-primary="vector"] {
+ --md-primary-fg-color: #eb088a;
+ --md-primary-fg-color--light: #f252a5;
+ --md-primary-fg-color--dark: #b00068;
+ --md-primary-bg-color: hsla(0, 0%, 100%, 1);
+ --md-primary-bg-color--light: hsla(0, 0%, 100%, 0.7);
+}
+
+[data-md-color-primary="black"] {
+ --md-primary-fg-color: #181818;
+ --md-primary-fg-color--light: #f252a5;
+ --md-primary-fg-color--dark: #b00068;
+ --md-primary-bg-color: #eb088a;
+}
+
+[data-md-color-accent="vector-teal"] {
+ --md-accent-fg-color: #48c0d9;
+ --md-accent-fg-color--transparent: #526cfe1a;
+ --md-accent-bg-color: #fff;
+ --md-accent-bg-color--light: #ffffffb3;
+}
+
+[data-md-color-scheme="slate"][data-md-color-primary="black"] {
+ --md-typeset-a-color: #eb088a;
+}
+
+[data-md-color-scheme="default"] {
+ /* Default light mode styling */
+}
+
+[data-md-color-scheme="slate"] {
+ --md-typeset-a-color: #eb088a;
+ /* Dark mode styling */
+}
+
+/* Vector logo css styling to match overrides/partial/copyright.html */
+.md-footer-vector {
+ display: flex;
+ align-items: center;
+ padding: 0 0.6rem;
+}
+
+.md-footer-vector img {
+ height: 24px; /* Reduce height to a fixed value */
+ width: auto; /* Maintain aspect ratio */
+ transition: opacity 0.25s;
+ opacity: 0.7;
+}
+
+.md-footer-vector img:hover {
+ opacity: 1;
+}
+
+/* Make the inner footer grid elements distribute evenly */
+.md-footer-meta__inner {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+}
+
+/* To make socials and Vector logo not stack when viewing on mobile */
+@media screen and (max-width: 76.234375em) {
+ .md-footer-meta__inner.md-grid {
+ flex-direction: row;
+ justify-content: space-between;
+ align-items: center;
+ }
+
+ .md-copyright,
+ .md-social {
+ width: auto;
+ max-width: 49%;
+ }
+
+ /* Prevent margin that causes stacking */
+ .md-social {
+ margin: 0;
+ }
+}
+
+/* Reduce margins for h2 when using grid cards */
+.grid.cards h2 {
+ margin-top: 0; /* Remove top margin completely in cards */
+ margin-bottom: 0.5rem; /* Smaller bottom margin in cards */
+}
+
+.vector-icon {
+ color: #eb088a;
+ opacity: 0.7;
+ margin-right: 0.2em;
+}
diff --git a/docs/user_guide.md b/docs/user_guide.md
new file mode 100644
index 0000000..c61e7bc
--- /dev/null
+++ b/docs/user_guide.md
@@ -0,0 +1,582 @@
+# User Guide
+
+*mmlearn* contains a collection of tools and utilities to help researchers and practitioners easily set up and run training
+or evaluation experiments for multimodal representation learning methods. The toolkit is designed to be modular and extensible.
+We aim to provide a high degree of flexibility in using existing methods, while also allowing users to easily add support
+for new modalities of data, datasets, models and pretraining or evaluation methods.
+
+Much of the power and flexibility of *mmlearn* comes from building on top of the [PyTorch Lightning](https://lightning.ai/docs/pytorch/stable/)
+framework and using [Hydra](https://hydra.cc/docs/intro/) and [hydra-zen](https://mit-ll-responsible-ai.github.io/hydra-zen/)
+for configuration management. Together, these tools make it easy to define and run experiments with different configurations,
+and to scale up experiments to run on a SLURM cluster.
+
+The goal of this guide is to give you a brief overview of what *mmlearn* is and how you can get started using it.
+
+!!! note
+ *mmlearn* currently only supports training and evaluation of encoder-only models.
+
+ For more detailed information on the features and capabilities of *mmlearn*, please refer to the [API Reference](api.md).
+
+## Defining a Dataset
+
+Datasets in *mmlearn* can be defined using PyTorch's `torch.utils.data.Dataset` or `torch.utils.data.IterableDataset`
+classes. However, there are two additional requirements for datasets in *mmlearn*:
+
+1. The dataset must return an instance of `mmlearn.datasets.core.example.Example` from the `__getitem__`
+ method or the `__iter__` method.
+2. The `Example` object returned by the dataset must contain the key `'example_index'`
+ and use modality-specific keys from the `Modalities` registry
+ to store the data.
+
+**Example 1**: Defining a map-style dataset in *mmlearn*:
+
+```python
+from torch.utils.data.dataset import Dataset
+
+from mmlearn.datasets.core import Example, Modalities
+from mmlearn.constants import EXAMPLE_INDEX_KEY
+
+
+class MyMapStyleDataset(Dataset[Example]):
+ ...
+ def __getitem__(self, idx: int) -> Example:
+ ...
+ return Example(
+ {
+ EXAMPLE_INDEX_KEY: idx,
+ Modalities.TEXT.name: ...,
+ Modalities.RGB.name: ...,
+ Modalities.RGB.target: ...,
+ Modalities.TEXT.mask: ...,
+ ...
+ }
+ )
+```
+
+**Example 2**: Defining an iterable-style dataset in *mmlearn*:
+
+```python
+from torch.utils.data.dataset import IterableDataset
+
+from mmlearn.datasets.core import Example, Modalities
+from mmlearn.constants import EXAMPLE_INDEX_KEY
+
+
+class MyIterableStyleDataset(IterableDataset[Example]):
+ ...
+ def __iter__(self) -> Generator[Example, None, None]:
+ ...
+ idx = 0
+ for item in items:
+ yield Example(
+ {
+ EXAMPLE_INDEX_KEY: idx,
+ Modalities.TEXT.name: ...,
+ Modalities.AUDIO.name: ...,
+ Modalities.TEXT.mask: ...,
+ Modalities.AUDIO.mask: ...,
+ ...
+ }
+ )
+ idx += 1
+```
+
+The `Example` class represents a single example in the dataset and all the attributes
+associated with it. The class is an extension of the `collections.OrderedDict` class that provides attribute-style access
+to the dictionary values and handles the creation of the `'example_ids'` tuple, combining the `'example_index'` and
+`'dataset_index'` values. The `'example_index'` key is created by the dataset object for each example returned by the
+dataset. On the other hand, the `'dataset_index'` key is created by the `CombinedDataset`
+each `Example` object returned by the dataset.
+
+!!! note
+ All dataset objects in *mmlearn* are wrapped in the `CombinedDataset` class,
+ which is a subclass of `torch.utils.data.Dataset`. As such, the user almost never has to add/define the `'dataset_index'`
+ key explicitly.
+
+ Since batching typically combines data from the same modality into one tensor, both the `'example_index'` and `'dataset_index'`
+ keys are essential for uniquely identifying paired examples across different modalities from the same dataset. The
+ `find_matching_indices` function does exactly this by finding the indices of the
+ examples in a batch that have the same `'example_ids'` tuple.
+
+`Modalities` is an instance of `ModalityRegistry`
+singleton class that serves as a global registry for all the modalities supported by *mmlearn*. It allows dot-style access
+registered modalities and their properties. For example, the `'RGB'` modality can be accessed using `Modalities.RGB`
+(returns string `'rgb'`) and the `'target'` property of the `'RGB'` modality can be accessed using `Modalities.RGB.target`
+(returns the string `'rgb_target'`). It also provides a method to register new modalities and their properties. For example,
+the following code snippet shows how to register a new `'DNA'` modality:
+
+```python
+from mmlearn.datasets.core import Modalities
+
+Modalities.register_modality("dna")
+```
+
+## Adding New Modules
+
+Modules are building blocks for models and tasks in *mmlearn*. They can be anything from encoders, layers, losses, optimizers,
+learning rate schedulers, metrics, etc. Modules in *mmlearn* are generally defined by extending PyTorch's `torch.nn.Module`
+class.
+
+Users have the flexibility to design new modules according to their requirements, with the exception of encoder modules
+and modules associated with specific pre-defined tasks (e.g., loss functions for the `ContrastivePretraining` task).
+The forward method of encoder modules must accept a dictionary as input, where the keys are the names of the modalities
+and the values are the corresponding (batched) tensors/data. This format makes it easier to reuse the encoder with different
+modalities and different tasks. In addition, the forward method must return a list-like object where the first element is
+the last layer's output. The following code snippet shows how to define a new text encoder module:
+
+```python
+import torch
+from torch import nn
+
+from mmlearn.datasets.core import Modalities
+
+
+class MyTextEncoder(nn.Module):
+ def __init__(self, input_dim: int, output_dim: int):
+ super().__init__()
+ self.encoder = ...
+
+ def forward(self, inputs: dict[str, torch.Tensor]) -> tuple[torch.Tensor]:
+ out = self.encoder(
+ inputs[Modalities.TEXT.name],
+ inputs.get(
+ "attention_mask", inputs.get(Modalities.TEXT.attention_mask, None)
+ ),
+ )
+ return (out,)
+```
+
+For modules associated with pre-defined tasks, the new modules must adhere to the same function signature as the existing
+modules for that task. For instance, the forward method of a new loss function for the `ContrastivePretraining`
+task must have the following signature to be compatible with the existing loss functions for the task:
+
+```python
+import torch
+
+from mmlearn.tasks.contrastive_pretraining import LossPairSpec
+
+def my_contrastive_loss(
+ embeddings: dict[str, torch.Tensor],
+ example_ids: dict[str, torch.Tensor],
+ logit_scale: torch.Tensor,
+ modality_loss_pairs: list[LossPairSpec],
+) -> torch.Tensor:
+ ...
+```
+
+## Adding New Tasks
+
+Tasks in *mmlearn* represent the different training and/or evaluation objectives that can be performed on the data using
+the different modules. Tasks that require training should extend the `TrainingTask` class, while tasks
+involving only evaluation should extend the `EvaluationHooks` class.
+
+### Training Tasks
+
+The `TrainingTask` class is an extension of the `lightning.pytorch.core.LightningModule`
+class, which itself is an extension of the `torch.nn.Module` class. The class provides a common interface for training
+tasks in *mmlearn*. It allows users to define the training loop, validation loop, test loop, and the setup for the model,
+optimizer, learning rate scheduler and loss function, all in one place (a functionality inherited from PyTorch Lightning).
+The class also provides hooks for customizing the training loop, validation loop, and test loop, as well as a suite of
+other functionalities like logging, checkpointing and handling distributed training.
+
+!!! seealso
+ For more information on the features and capabilities of the `TrainingTask` class inherited
+ from PyTorch Lightning, please refer to the PyTorch Lightning [documentation](https://lightning.ai/docs/pytorch/stable/).
+
+To be used with the PyTorch Lightning Trainer, extensions of the `TrainingTask` class must define
+a `training_step` method. The following code snippet shows the minimum requirements for defining a new task in *mmlearn*:
+
+```python
+from typing import Any, Optional, Union
+from functools import partial
+
+import torch
+
+from mmlearn.tasks.base import TrainingTask
+
+class MyTask(TrainingTask):
+ def __init__(
+ self,
+ optimizer: Optional[partial[torch.optim.Optimizer]],
+ loss_fn: Optional[torch.nn.Module],
+ lr_scheduler: Optional[
+ Union[
+ dict[str, Union[partial[torch.optim.lr_scheduler.LRScheduler], Any]],
+ partial[torch.optim.lr_scheduler.LRScheduler],
+ ]
+ ] = None,
+ ) -> None:
+ super().__init__(optimizer=optimizer, loss_fn=loss_fn, lr_scheduler=lr_scheduler)
+
+ # Since this class also inherits from torch.nn.Module, we can define the
+ # model and its components directly in the constructor and also define
+ # a forward method for the model as an instance method of this class.
+ # Alternatively, we can pass the model as an argument to the constructor
+ # and assign it to an instance variable.
+ self.model = ...
+
+ def training_step(self, batch: dict[str, Any], batch_idx: int) -> torch.Tensor:
+ outputs = self.model(batch) # or self(batch) if a forward method is defined in this class
+
+ # maybe process outputs here
+
+ loss = self.loss_fn(outputs, ...)
+ return loss
+```
+
+### Evaluation Tasks
+
+The `EvaluationHooks` class is intended to be used for evaluation tasks that don't require training,
+e.g. zero-shot evaluation tasks (as opposed to evaluation tasks like linear probing, which require training). The class provides
+an interface for defining and customizing the evaluation loop.
+
+Classes that inherit from `EvaluationHooks` cannot be run/used on their own. They must be used
+in conjunction with a training task, which will call the hooks defined in the evaluation task during the evaluation phase.
+This way, multiple evaluation tasks can be defined and used with the same training task. The model to be evaluated is
+provided by the training task to the evaluation task.
+
+Training tasks that wish to use one or more evaluation tasks must accept an instance of the evaluation task(s) as an argument
+to the constructor and must define a `validation_step` and/or `test_step` method that calls the `evaluation_step` method
+of the evaluation task(s).
+
+## Creating and Configuring a Project
+
+A project in *mmlearn* can be thought of as a collection of related experiments. Within a project, you can reuse components
+from *mmlearn* (e.g., datasets, models, tasks) or define new ones and use them all together for experiments.
+
+To create a new project, create a new directory following the structure below:
+
+```bash
+my_project/
+├── configs/
+│ ├── __init__.py
+│ └── experiment/
+│ ├── my_experiment.yaml
+├── README.md (optional)
+├── requirements.txt (optional)
+```
+
+The `configs/` directory contains all the configurations, both [structured configs](https://hydra.cc/docs/tutorials/structured_config/intro/)
+and YAML config files for the experiments in the project. The `configs/experiment/` directory contains the `.yaml` files
+for the experiments associated with the project. These `.yaml` files use the [Hydra configuration format](https://hydra.cc/docs/tutorials/basic/your_first_app/composition/),
+which also allows overriding the configuration options/values from the command line.
+
+The `__init__.py` file in the `configs/` directory is required to make the `configs/` directory a Python package,
+allowing hydra to compose configurations from `.yaml` files as well as structured configs from python modules. More on this
+in the next section.
+
+Optionally, you can also include a `README.md` file with a brief description of the project and a `requirements.txt` file
+with the dependencies required to run the project.
+
+### Specifying Configurable Components
+
+One of the key features of the Hydra configuration system is the ability to compose configurations from multiple sources,
+including the command line, `.yaml` files and structured configs from Python modules. [Structured Configs](https://hydra.cc/docs/tutorials/structured_config/intro/)
+in Hydra use Python `dataclasses.dataclass` to define the configuration schema. This allows for both static and runtime type-checking
+of the configuration. [Hydra-zen](https://mit-ll-responsible-ai.github.io/hydra-zen/) extends Hydra to makes it easy
+to dynamically generate dataclass-backed configurations for any class or function simply by adding a decorator to the class
+or function.
+
+*mmlearn* provides a pre-populated [config store](https://hydra.cc/docs/tutorials/structured_config/config_store/),
+`mmlearn.conf.external_store`, which can be used as a decorator to register configurable components. This config
+store already contains configurations for common components like PyTorch optimizers,
+learning rate schedulers, loss functions and samplers,
+as well as PyTorch Lightning's Trainer callbacks and loggers.
+To dynamically add new configurable components to the store, simply add the `mmlearn.conf.external_store` decorator
+to the class or function definition.
+
+For example, the following code snippet shows how to register a new dataset class:
+
+```python
+from torch.utils.data.dataset import Dataset
+
+from mmlearn.conf import external_store
+from mmlearn.constants import EXAMPLE_INDEX_KEY
+from mmlearn.datasets.core import Example, Modalities
+
+
+@external_store(group="datasets")
+class MyMapStyleDataset(Dataset[Example]):
+ ...
+ def __getitem__(self, idx: int) -> Example:
+ ...
+ return Example(
+ {
+ EXAMPLE_INDEX_KEY: idx,
+ Modalities.TEXT.name: ...,
+ Modalities.RGB.name: ...,
+ Modalities.RGB.target: ...,
+ Modalities.TEXT.mask: ...,
+ ...
+ }
+ )
+```
+
+The `mmlearn.conf.external_store` decorator immediately add the class to the config store once the Python interpreter
+loads the module containing the class. This is why the `configs/` directory must be a Python package and why modules
+containing user-defined configurable components must be imported in the `configs/__init__.py` file.
+
+The `group` argument specifies the [config group](https://hydra.cc/docs/tutorials/basic/your_first_app/config_groups/)
+under which the configurable component will be registered. This allows users to easily reference the component in the
+configurations using the group name and the class name. The available config groups in *mmlearn* are:
+
+- `datasets`: Contains all the dataset classes.
+- `datasets/masking`: Contains all the configurable classes and functions for masking input data.
+- `datasets/tokenizers`: Contains all the configurable classes and functions for converting raw inputs to tokens.
+- `datasets/transforms`: Contains all the configurable classes and functions for transforming input data.
+- `dataloader/sampler`: Contains all the dataloader sampler classes.
+- `modules/encoders`: Contains all the encoder modules.
+- `modules/layers`: For layers that can be used independent of the model.
+- `modules/losses`: Contains all the loss functions.
+- `modules/optimizers`: Contains all the optimizers.
+- `modules/lr_schedulers`: Contains all the learning rate schedulers.
+- `modules/metrics`: Contains all the evaluation metrics.
+- `tasks`: Contains all the task classes.
+- `trainer/callbacks`: Contains all the PyTorch Lightning Trainer callbacks.
+- `trainer/logger`: Contains all the PyTorch Lightning Trainer loggers.
+
+### The Base Configuration
+
+The base configuration for all experiments in *mmlearn* are defined in the `MMLearnConf`
+dataclass. This serves as the base configuration for all experiments and can be extended to include additional configuration
+options, following Hydra's [override syntax](https://hydra.cc/docs/advanced/override_grammar/basic/).
+
+The base configuration for *mmlearn* is shown below:
+
+```yaml
+experiment_name: ???
+job_type: train
+seed: null
+datasets:
+ train: null
+ val: null
+ test: null
+dataloader:
+ train:
+ _target_: torch.utils.data.dataloader.DataLoader
+ _convert_: object
+ dataset: ???
+ batch_size: 1
+ shuffle: null
+ sampler: null
+ batch_sampler: null
+ num_workers: 0
+ collate_fn:
+ _target_: mmlearn.datasets.core.data_collator.DefaultDataCollator
+ batch_processors: null
+ pin_memory: true
+ drop_last: false
+ timeout: 0.0
+ worker_init_fn: null
+ multiprocessing_context: null
+ generator: null
+ prefetch_factor: null
+ persistent_workers: false
+ pin_memory_device: ''
+ val:
+ _target_: torch.utils.data.dataloader.DataLoader
+ _convert_: object
+ dataset: ???
+ batch_size: 1
+ shuffle: null
+ sampler: null
+ batch_sampler: null
+ num_workers: 0
+ collate_fn:
+ _target_: mmlearn.datasets.core.data_collator.DefaultDataCollator
+ batch_processors: null
+ pin_memory: true
+ drop_last: false
+ timeout: 0.0
+ worker_init_fn: null
+ multiprocessing_context: null
+ generator: null
+ prefetch_factor: null
+ persistent_workers: false
+ pin_memory_device: ''
+ test:
+ _target_: torch.utils.data.dataloader.DataLoader
+ _convert_: object
+ dataset: ???
+ batch_size: 1
+ shuffle: null
+ sampler: null
+ batch_sampler: null
+ num_workers: 0
+ collate_fn:
+ _target_: mmlearn.datasets.core.data_collator.DefaultDataCollator
+ batch_processors: null
+ pin_memory: true
+ drop_last: false
+ timeout: 0.0
+ worker_init_fn: null
+ multiprocessing_context: null
+ generator: null
+ prefetch_factor: null
+ persistent_workers: false
+ pin_memory_device: ''
+task: ???
+trainer:
+ _target_: lightning.pytorch.trainer.trainer.Trainer
+ accelerator: auto
+ strategy: auto
+ devices: auto
+ num_nodes: 1
+ precision: null
+ logger: null
+ callbacks: null
+ fast_dev_run: false
+ max_epochs: null
+ min_epochs: null
+ max_steps: -1
+ min_steps: null
+ max_time: null
+ limit_train_batches: null
+ limit_val_batches: null
+ limit_test_batches: null
+ limit_predict_batches: null
+ overfit_batches: 0.0
+ val_check_interval: null
+ check_val_every_n_epoch: 1
+ num_sanity_val_steps: null
+ log_every_n_steps: null
+ enable_checkpointing: true
+ enable_progress_bar: true
+ enable_model_summary: true
+ accumulate_grad_batches: 1
+ gradient_clip_val: null
+ gradient_clip_algorithm: null
+ deterministic: null
+ benchmark: null
+ inference_mode: true
+ use_distributed_sampler: true
+ profiler: null
+ detect_anomaly: false
+ barebones: false
+ plugins: null
+ sync_batchnorm: false
+ reload_dataloaders_every_n_epochs: 0
+ default_root_dir: ${hydra:runtime.output_dir}/checkpoints
+tags:
+ - ${experiment_name}
+resume_from_checkpoint: null
+strict_loading: true
+torch_compile_kwargs:
+ disable: true
+ fullgraph: false
+ dynamic: null
+ backend: inductor
+ mode: null
+ options: null
+```
+
+The config keys with a value of `???` are placeholders that must be overridden in the experiment configurations. While
+the `dataset` key in the `dataloader` group is also a placeholder, it should not be provided as it will be automatically
+filled in from the `datasets` group.
+
+### Configuring an Experiment
+
+To configure an experiment, create a new `.yaml` file in the `configs/experiment/` directory of the project. The configuration
+file should define the experiment-specific configuration options and override the base configuration options as needed.
+Configurable components from the config store can be referenced by name in the configuration file under the
+[defaults list](https://hydra.cc/docs/advanced/defaults_list/). The following code snippet shows an example configuration
+file for an experiment:
+
+```yaml
+# @package _global_
+
+defaults:
+- /datasets@datasets.train.my_iterable: MyIterableStyleDataset
+- /datasets@datasets.train.my_map: MyMapStyleDataset
+- /modules/encoders@task.encoders.text: MyTextEncoder
+- /modules/encoders@task.encoders.rgb: MyRGBEncoder
+- /modules/losses@task.loss: ContrastiveLoss
+- /modules/optimizers@task.optimizer: AdamW
+- /modules/lr_schedulers@task.lr_scheduler.scheduler: CosineAnnealingLR
+- /eval_task@task.evaluation_tasks.retrieval.task: ZeroShotCrossModalRetrieval
+- /trainer/callbacks@trainer.callbacks.lr_monitor: LearningRateMonitor
+- /trainer/callbacks@trainer.callbacks.model_checkpoint: ModelCheckpoint
+- /trainer/callbacks@trainer.callbacks.early_stopping: EarlyStopping
+- /trainer/callbacks@trainer.callbacks.model_summary: ModelSummary
+- /trainer/logger@trainer.logger.wandb: WandbLogger
+- override /task: ContrastivePretraining
+- _self_
+
+seed: 42
+
+datasets:
+ train:
+ my_iterable:
+ my_iterable_arg1: ...
+ my_map:
+ my_map_arg1: ...
+
+dataloader:
+ train:
+ batch_size: 64
+
+task:
+ encoders:
+ text:
+ text_arg1: ...
+ rgb:
+ rgb_arg1: ...
+ evaluation_tasks:
+ retrieval:
+ task:
+ task_specs:
+ - query_modality: text
+ target_modality: rgb
+ top_k: [10, 200]
+ - query_modality: rgb
+ target_modality: text
+ top_k: [10, 200]
+ run_on_validation: false
+ run_on_test: true
+```
+
+## Running an Experiment
+
+To run an experiment locally, use the following command:
+
+```bash
+mmlearn_run 'hydra.searchpath=[pkg://path.to.my_project.configs]' \
+ +experiment=my_experiment \
+ experiment_name=my_experiment_name
+```
+
+!!! tip
+ You can see the full config for an experiment without running it by adding the `--help` flag to the command.
+
+ ```bash
+ mmlearn_run 'hydra.searchpath=[pkg://path.to.my_project.configs]' \
+ +experiment=my_experiment \
+ experiment_name=my_experiment_name \
+ task=my_task \ # required for the command to run
+ --help
+ ```
+
+To run the experiment on a SLURM cluster, use the following command:
+
+```bash
+mmlearn_run --multirun \
+ hydra.launcher.mem_per_cpu=5G \
+ hydra.launcher.qos=your_qos \
+ hydra.launcher.partition=your_partition \
+ hydra.launcher.gres=gpu:4 \
+ hydra.launcher.cpus_per_task=8 \
+ hydra.launcher.tasks_per_node=4 \
+ hydra.launcher.nodes=1 \
+ hydra.launcher.stderr_to_stdout=true \
+ hydra.launcher.timeout_min=720 \
+ 'hydra.searchpath=[pkg://path.to.my_project.configs]' \
+ +experiment=my_experiment \
+ experiment_name=my_experiment_name
+```
+
+This uses the [submitit launcher](https://hydra.cc/docs/plugins/submitit_launcher/) plugin built into Hydra to submit
+the experiment to the SLURM scheduler with the specified resources.
+
+!!! note
+ After the job is submitted, it is okay to cancel the program with `Ctrl+C`. The job will continue running on
+ the cluster. You can also add `&` at the end of the command to run it in the background.
diff --git a/mkdocs.yml b/mkdocs.yml
new file mode 100644
index 0000000..9c48018
--- /dev/null
+++ b/mkdocs.yml
@@ -0,0 +1,85 @@
+extra_css:
+ - stylesheets/extra.css
+extra:
+ generator: false
+ social:
+ - icon: fontawesome/brands/github
+ link: https://github.com/VectorInstitute/mmlearn
+markdown_extensions:
+ - attr_list
+ - admonition
+ - md_in_html
+ - pymdownx.highlight:
+ anchor_linenums: true
+ line_spans: __span
+ pygments_lang_class: true
+ - pymdownx.inlinehilite
+ - pymdownx.details
+ - pymdownx.snippets
+ - pymdownx.superfences
+ - pymdownx.emoji:
+ emoji_index: !!python/name:material.extensions.emoji.twemoji
+ emoji_generator: !!python/name:material.extensions.emoji.to_svg
+ - toc:
+ permalink: true
+nav:
+ - Home: index.md
+ - Installation: installation.md
+ - User Guide: user_guide.md
+ - API Reference: api.md
+ - Contributing: contributing.md
+plugins:
+ - search
+ - autorefs
+ - include-markdown
+ - mkdocstrings:
+ handlers:
+ python:
+ options:
+ docstring_style: numpy
+ members_order: source
+ separate_signature: true
+ show_overloads: true
+ show_submodules: true
+ show_root_heading: false
+ show_root_full_path: true
+ show_root_toc_entry: false
+ show_symbol_type_heading: true
+ show_symbol_type_toc: true
+repo_url: https://github.com/VectorInstitute/mmlearn
+repo_name: VectorInstitute/mmlearn
+site_name: mmlearn
+theme:
+ custom_dir: docs/overrides
+ favicon: assets/favicon-48x48.svg
+ features:
+ - content.code.annotate
+ - content.code.copy
+ - navigation.footer
+ - navigation.indexes
+ - navigation.instant
+ - navigation.tabs
+ - navigation.top
+ - search.suggest
+ - search.highlight
+ - toc.follow
+ icon:
+ repo: fontawesome/brands/github
+ logo: assets/vector-logo.svg
+ logo_footer: assets/vector-logo.svg
+ name: material
+ palette:
+ - media: "(prefers-color-scheme: light)"
+ scheme: default
+ primary: vector
+ accent: vector-teal
+ toggle:
+ icon: material/brightness-7
+ name: Switch to dark mode
+ - media: "(prefers-color-scheme: dark)"
+ scheme: slate
+ primary: black
+ accent: vector-teal
+ toggle:
+ icon: material/brightness-4
+ name: Switch to light mode
diff --git a/mmlearn/datasets/chexpert.py b/mmlearn/datasets/chexpert.py
index 34bc480..ff14961 100644
--- a/mmlearn/datasets/chexpert.py
+++ b/mmlearn/datasets/chexpert.py
@@ -46,7 +46,7 @@ class CheXpert(Dataset[Example]):
Parameters
----------
- data_root : str
+ root_dir : str
Directory which contains `.json` files stating all dataset entries.
split : {"train", "valid"}
Dataset split.
diff --git a/mmlearn/datasets/nyuv2.py b/mmlearn/datasets/nyuv2.py
index 9bc54a9..9a871d8 100644
--- a/mmlearn/datasets/nyuv2.py
+++ b/mmlearn/datasets/nyuv2.py
@@ -85,8 +85,8 @@ class NYUv2Dataset(Dataset[Example]):
- `"disparity"`: Return the depth image as disparity map.
- `"image"`: Return the depth image as a 3-channel image.
rgb_transform: Callable[[PIL.Image], torch.Tensor], default=None
- A callable that takes in an RGB PIL image and returns a transformed version
- of the image as a PyTorch tensor.
+ A callable that takes in an RGB PIL image and returns a transformed version
+ of the image as a PyTorch tensor.
depth_transform: Callable[[PIL.Image], torch.Tensor], default=None
A callable that takes in a depth PIL image and returns a transformed version
of the image as a PyTorch tensor.
diff --git a/mmlearn/datasets/sunrgbd.py b/mmlearn/datasets/sunrgbd.py
index 30befe0..50e8f07 100644
--- a/mmlearn/datasets/sunrgbd.py
+++ b/mmlearn/datasets/sunrgbd.py
@@ -124,8 +124,8 @@ class SUNRGBDDataset(Dataset[Example]):
converted to disparity similar to the ImageBind implementation.
Otherwise, return the depth image as a 3-channel image.
rgb_transform: Callable[[PIL.Image], torch.Tensor], default=None
- A callable that takes in an RGB PIL image and returns a transformed version
- of the image as a PyTorch tensor.
+ A callable that takes in an RGB PIL image and returns a transformed version
+ of the image as a PyTorch tensor.
depth_transform: Callable[[PIL.Image], torch.Tensor], default=None
A callable that takes in a depth PIL image and returns a transformed version
of the image as a PyTorch tensor.
diff --git a/mmlearn/modules/encoders/vision.py b/mmlearn/modules/encoders/vision.py
index d882ac8..b525190 100644
--- a/mmlearn/modules/encoders/vision.py
+++ b/mmlearn/modules/encoders/vision.py
@@ -215,8 +215,6 @@ class VisionTransformer(nn.Module):
Normalization layer to use.
init_std : float, optional, default=0.02
Standard deviation for weight initialization.
- **kwargs : dict
- Additional keyword arguments.
"""
def __init__(
@@ -430,8 +428,6 @@ class VisionTransformerPredictor(nn.Module):
Normalization layer to use.
init_std : float, optional, default=0.02
Standard deviation for weight initialization.
- **kwargs : dict
- Additional keyword arguments.
"""
def __init__(
diff --git a/mmlearn/modules/layers/logit_scaling.py b/mmlearn/modules/layers/logit_scaling.py
index 74ddd3e..437110d 100644
--- a/mmlearn/modules/layers/logit_scaling.py
+++ b/mmlearn/modules/layers/logit_scaling.py
@@ -12,7 +12,7 @@ class LearnableLogitScaling(torch.nn.Module):
Parameters
----------
- logit_scale_init : float, optional, default=1/0.07
+ init_logit_scale : float, optional, default=1/0.07
Initial value of the logit scale.
learnable : bool, optional, default=True
If True, the logit scale is learnable. Otherwise, it is fixed.
diff --git a/pyproject.toml b/pyproject.toml
index 345d37c..3e76f50 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -50,19 +50,17 @@ dev = [
]
docs = [
+ "mkdocs>=1.6.0,<2.0.0",
+ "mkdocs-material>=9.5.13,<10.0.0",
+ "mkdocstrings>=0.25.0,<0.26.0",
+ "mkdocstrings-python>=1.9.0,<2.0.0",
+ "mkdocs-autorefs>=1.0.0,<2.0.0",
+ "pymdown-extensions>=10.9.0,<11.0.0",
+ "mkdocs-include-markdown-plugin>=6.0.4,<7.0.0",
"numpydoc>=1.8.0,<2.0.0",
- "sphinx>=8.1.3,<9.0.0",
- "sphinxcontrib-apidoc>=0.5.0,<0.6.0",
- "sphinx-autodoc-typehints>=2.5.0,<3.0.0",
- "myst-parser>=4.0.0,<5.0.0",
- "sphinx-design>=0.6.1,<0.7.0",
- "sphinx-copybutton>=0.5.2,<0.6.0",
- "sphinx-autoapi>=3.4.0,<4.0.0",
- "nbsphinx>=0.9.5,<0.10.0",
"ipython>=8.32.0,<9.0.0",
"ipykernel>=6.29.5,<7.0.0",
- "furo>=2024.8.6,<2025.0.0",
- "sphinx-autobuild==2024.10.3"
+ "black>=24.3.0,<25.0.0"
]
[project.scripts]
diff --git a/uv.lock b/uv.lock
index b66c5d9..2be6297 100644
--- a/uv.lock
+++ b/uv.lock
@@ -144,21 +144,6 @@ version = "4.9.3"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/3e/38/7859ff46355f76f8d19459005ca000b6e7012f2f1ca597746cbcd1fbfe5e/antlr4-python3-runtime-4.9.3.tar.gz", hash = "sha256:f224469b4168294902bb1efa80a8bf7855f24c99aef99cbefc1bcd3cce77881b", size = 117034 }
-[[package]]
-name = "anyio"
-version = "4.8.0"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "exceptiongroup", marker = "python_full_version < '3.11'" },
- { name = "idna" },
- { name = "sniffio" },
- { name = "typing-extensions" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/a3/73/199a98fc2dae33535d6b8e8e6ec01f8c1d76c9adb096c6b7d64823038cde/anyio-4.8.0.tar.gz", hash = "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a", size = 181126 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/46/eb/e7f063ad1fec6b3178a3cd82d1a3c4de82cccf283fc42746168188e1cdd5/anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a", size = 96041 },
-]
-
[[package]]
name = "appnope"
version = "0.1.4"
@@ -168,18 +153,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c", size = 4321 },
]
-[[package]]
-name = "astroid"
-version = "3.3.8"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "typing-extensions", marker = "python_full_version < '3.11'" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/80/c5/5c83c48bbf547f3dd8b587529db7cf5a265a3368b33e85e76af8ff6061d3/astroid-3.3.8.tar.gz", hash = "sha256:a88c7994f914a4ea8572fac479459f4955eeccc877be3f2d959a33273b0cf40b", size = 398196 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/07/28/0bc8a17d6cd4cc3c79ae41b7105a2b9a327c110e5ddd37a8a27b29a5c8a2/astroid-3.3.8-py3-none-any.whl", hash = "sha256:187ccc0c248bfbba564826c26f070494f7bc964fd286b6d9fff4420e55de828c", size = 275153 },
-]
-
[[package]]
name = "asttokens"
version = "3.0.0"
@@ -217,33 +190,45 @@ wheels = [
]
[[package]]
-name = "beautifulsoup4"
-version = "4.13.3"
+name = "backrefs"
+version = "5.8"
source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "soupsieve" },
- { name = "typing-extensions" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/f0/3c/adaf39ce1fb4afdd21b611e3d530b183bb7759c9b673d60db0e347fd4439/beautifulsoup4-4.13.3.tar.gz", hash = "sha256:1bd32405dacc920b42b83ba01644747ed77456a65760e285fbc47633ceddaf8b", size = 619516 }
+sdist = { url = "https://files.pythonhosted.org/packages/6c/46/caba1eb32fa5784428ab401a5487f73db4104590ecd939ed9daaf18b47e0/backrefs-5.8.tar.gz", hash = "sha256:2cab642a205ce966af3dd4b38ee36009b31fa9502a35fd61d59ccc116e40a6bd", size = 6773994 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/f9/49/6abb616eb3cbab6a7cca303dc02fdf3836de2e0b834bf966a7f5271a34d8/beautifulsoup4-4.13.3-py3-none-any.whl", hash = "sha256:99045d7d3f08f91f0d656bc9b7efbae189426cd913d830294a15eefa0ea4df16", size = 186015 },
+ { url = "https://files.pythonhosted.org/packages/bf/cb/d019ab87fe70e0fe3946196d50d6a4428623dc0c38a6669c8cae0320fbf3/backrefs-5.8-py310-none-any.whl", hash = "sha256:c67f6638a34a5b8730812f5101376f9d41dc38c43f1fdc35cb54700f6ed4465d", size = 380337 },
+ { url = "https://files.pythonhosted.org/packages/a9/86/abd17f50ee21b2248075cb6924c6e7f9d23b4925ca64ec660e869c2633f1/backrefs-5.8-py311-none-any.whl", hash = "sha256:2e1c15e4af0e12e45c8701bd5da0902d326b2e200cafcd25e49d9f06d44bb61b", size = 392142 },
+ { url = "https://files.pythonhosted.org/packages/b3/04/7b415bd75c8ab3268cc138c76fa648c19495fcc7d155508a0e62f3f82308/backrefs-5.8-py312-none-any.whl", hash = "sha256:bbef7169a33811080d67cdf1538c8289f76f0942ff971222a16034da88a73486", size = 398021 },
+ { url = "https://files.pythonhosted.org/packages/0c/37/fb6973edeb700f6e3d6ff222400602ab1830446c25c7b4676d8de93e65b8/backrefs-5.8-py39-none-any.whl", hash = "sha256:a66851e4533fb5b371aa0628e1fee1af05135616b86140c9d787a2ffdf4b8fdc", size = 380336 },
]
[[package]]
-name = "bleach"
-version = "6.2.0"
+name = "black"
+version = "24.10.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
- { name = "webencodings" },
+ { name = "click" },
+ { name = "mypy-extensions" },
+ { name = "packaging" },
+ { name = "pathspec" },
+ { name = "platformdirs" },
+ { name = "tomli", marker = "python_full_version < '3.11'" },
+ { name = "typing-extensions", marker = "python_full_version < '3.11'" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/76/9a/0e33f5054c54d349ea62c277191c020c2d6ef1d65ab2cb1993f91ec846d1/bleach-6.2.0.tar.gz", hash = "sha256:123e894118b8a599fd80d3ec1a6d4cc7ce4e5882b1317a7e1ba69b56e95f991f", size = 203083 }
+sdist = { url = "https://files.pythonhosted.org/packages/d8/0d/cc2fb42b8c50d80143221515dd7e4766995bd07c56c9a3ed30baf080b6dc/black-24.10.0.tar.gz", hash = "sha256:846ea64c97afe3bc677b761787993be4991810ecc7a4a937816dd6bddedc4875", size = 645813 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/fc/55/96142937f66150805c25c4d0f31ee4132fd33497753400734f9dfdcbdc66/bleach-6.2.0-py3-none-any.whl", hash = "sha256:117d9c6097a7c3d22fd578fcd8d35ff1e125df6736f554da4e432fdd63f31e5e", size = 163406 },
-]
-
-[package.optional-dependencies]
-css = [
- { name = "tinycss2" },
+ { url = "https://files.pythonhosted.org/packages/a3/f3/465c0eb5cddf7dbbfe1fecd9b875d1dcf51b88923cd2c1d7e9ab95c6336b/black-24.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6668650ea4b685440857138e5fe40cde4d652633b1bdffc62933d0db4ed9812", size = 1623211 },
+ { url = "https://files.pythonhosted.org/packages/df/57/b6d2da7d200773fdfcc224ffb87052cf283cec4d7102fab450b4a05996d8/black-24.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1c536fcf674217e87b8cc3657b81809d3c085d7bf3ef262ead700da345bfa6ea", size = 1457139 },
+ { url = "https://files.pythonhosted.org/packages/6e/c5/9023b7673904a5188f9be81f5e129fff69f51f5515655fbd1d5a4e80a47b/black-24.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:649fff99a20bd06c6f727d2a27f401331dc0cc861fb69cde910fe95b01b5928f", size = 1753774 },
+ { url = "https://files.pythonhosted.org/packages/e1/32/df7f18bd0e724e0d9748829765455d6643ec847b3f87e77456fc99d0edab/black-24.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:fe4d6476887de70546212c99ac9bd803d90b42fc4767f058a0baa895013fbb3e", size = 1414209 },
+ { url = "https://files.pythonhosted.org/packages/c2/cc/7496bb63a9b06a954d3d0ac9fe7a73f3bf1cd92d7a58877c27f4ad1e9d41/black-24.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5a2221696a8224e335c28816a9d331a6c2ae15a2ee34ec857dcf3e45dbfa99ad", size = 1607468 },
+ { url = "https://files.pythonhosted.org/packages/2b/e3/69a738fb5ba18b5422f50b4f143544c664d7da40f09c13969b2fd52900e0/black-24.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f9da3333530dbcecc1be13e69c250ed8dfa67f43c4005fb537bb426e19200d50", size = 1437270 },
+ { url = "https://files.pythonhosted.org/packages/c9/9b/2db8045b45844665c720dcfe292fdaf2e49825810c0103e1191515fc101a/black-24.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4007b1393d902b48b36958a216c20c4482f601569d19ed1df294a496eb366392", size = 1737061 },
+ { url = "https://files.pythonhosted.org/packages/a3/95/17d4a09a5be5f8c65aa4a361444d95edc45def0de887810f508d3f65db7a/black-24.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:394d4ddc64782e51153eadcaaca95144ac4c35e27ef9b0a42e121ae7e57a9175", size = 1423293 },
+ { url = "https://files.pythonhosted.org/packages/90/04/bf74c71f592bcd761610bbf67e23e6a3cff824780761f536512437f1e655/black-24.10.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b5e39e0fae001df40f95bd8cc36b9165c5e2ea88900167bddf258bacef9bbdc3", size = 1644256 },
+ { url = "https://files.pythonhosted.org/packages/4c/ea/a77bab4cf1887f4b2e0bce5516ea0b3ff7d04ba96af21d65024629afedb6/black-24.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d37d422772111794b26757c5b55a3eade028aa3fde43121ab7b673d050949d65", size = 1448534 },
+ { url = "https://files.pythonhosted.org/packages/4e/3e/443ef8bc1fbda78e61f79157f303893f3fddf19ca3c8989b163eb3469a12/black-24.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:14b3502784f09ce2443830e3133dacf2c0110d45191ed470ecb04d0f5f6fcb0f", size = 1761892 },
+ { url = "https://files.pythonhosted.org/packages/52/93/eac95ff229049a6901bc84fec6908a5124b8a0b7c26ea766b3b8a5debd22/black-24.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:30d2c30dc5139211dda799758559d1b049f7f14c580c409d6ad925b74a4208a8", size = 1434796 },
+ { url = "https://files.pythonhosted.org/packages/8d/a7/4b27c50537ebca8bec139b872861f9d2bf501c5ec51fcf897cb924d9e264/black-24.10.0-py3-none-any.whl", hash = "sha256:3bb2b7a1f7b685f85b11fed1ef10f8a9148bceb49853e47a294a3dd963c1dd7d", size = 206898 },
]
[[package]]
@@ -287,6 +272,15 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/22/25/908b75a329a05b82d717661aa95a1968d9dae0e68c654d5e16bfe0d6fbb6/Bottleneck-1.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:48c6b9d9287c4102b803fcb01ae66ae7ef6b310b711b4b7b7e23bf952894dc05", size = 111766 },
]
+[[package]]
+name = "bracex"
+version = "2.5.post1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d6/6c/57418c4404cd22fe6275b8301ca2b46a8cdaa8157938017a9ae0b3edf363/bracex-2.5.post1.tar.gz", hash = "sha256:12c50952415bfa773d2d9ccb8e79651b8cdb1f31a42f6091b804f6ba2b4a66b6", size = 26641 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/4b/02/8db98cdc1a58e0abd6716d5e63244658e6e63513c65f469f34b6f1053fd0/bracex-2.5.post1-py3-none-any.whl", hash = "sha256:13e5732fec27828d6af308628285ad358047cec36801598368cb28bc631dbaf6", size = 11558 },
+]
+
[[package]]
name = "cachecontrol"
version = "0.14.2"
@@ -595,15 +589,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/7b/8f/c4d9bafc34ad7ad5d8dc16dd1347ee0e507a52c3adb6bfa8887e1c6a26ba/executing-2.2.0-py2.py3-none-any.whl", hash = "sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa", size = 26702 },
]
-[[package]]
-name = "fastjsonschema"
-version = "2.21.1"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/8b/50/4b769ce1ac4071a1ef6d86b1a3fb56cdc3a37615e8c5519e1af96cdac366/fastjsonschema-2.21.1.tar.gz", hash = "sha256:794d4f0a58f848961ba16af7b9c85a3e88cd360df008c59aac6fc5ae9323b5d4", size = 373939 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/90/2b/0817a2b257fe88725c25589d89aec060581aabf668707a8d03b2e9e0cb2a/fastjsonschema-2.21.1-py3-none-any.whl", hash = "sha256:c9e5b7e908310918cf494a434eeb31384dd84a98b57a30bcb1f535015b554667", size = 23924 },
-]
-
[[package]]
name = "filelock"
version = "3.17.0"
@@ -682,18 +667,15 @@ http = [
]
[[package]]
-name = "furo"
-version = "2024.8.6"
+name = "ghp-import"
+version = "2.1.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
- { name = "beautifulsoup4" },
- { name = "pygments" },
- { name = "sphinx" },
- { name = "sphinx-basic-ng" },
+ { name = "python-dateutil" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/a0/e2/d351d69a9a9e4badb4a5be062c2d0e87bd9e6c23b5e57337fef14bef34c8/furo-2024.8.6.tar.gz", hash = "sha256:b63e4cee8abfc3136d3bc03a3d45a76a850bada4d6374d24c1716b0e01394a01", size = 1661506 }
+sdist = { url = "https://files.pythonhosted.org/packages/d9/29/d40217cbe2f6b1359e00c6c307bb3fc876ba74068cbab3dde77f03ca0dc4/ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343", size = 10943 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/27/48/e791a7ed487dbb9729ef32bb5d1af16693d8925f4366befef54119b2e576/furo-2024.8.6-py3-none-any.whl", hash = "sha256:6cd97c58b47813d3619e63e9081169880fbe331f0ca883c871ff1f3f11814f5c", size = 341333 },
+ { url = "https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619", size = 11034 },
]
[[package]]
@@ -721,12 +703,15 @@ wheels = [
]
[[package]]
-name = "h11"
-version = "0.14.0"
+name = "griffe"
+version = "1.7.2"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/f5/38/3af3d3633a34a3316095b39c8e8fb4853a28a536e55d347bd8d8e9a14b03/h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", size = 100418 }
+dependencies = [
+ { name = "colorama" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/59/08/7df7e90e34d08ad890bd71d7ba19451052f88dc3d2c483d228d1331a4736/griffe-1.7.2.tar.gz", hash = "sha256:98d396d803fab3b680c2608f300872fd57019ed82f0672f5b5323a9ad18c540c", size = 394919 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", size = 58259 },
+ { url = "https://files.pythonhosted.org/packages/b1/5e/38b408f41064c9fcdbb0ea27c1bd13a1c8657c4846e04dab9f5ea770602c/griffe-1.7.2-py3-none-any.whl", hash = "sha256:1ed9c2e338a75741fc82083fe5a1bc89cb6142efe126194cc313e34ee6af5423", size = 129187 },
]
[[package]]
@@ -919,33 +904,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/91/29/df4b9b42f2be0b623cbd5e2140cafcaa2bef0759a00b7b70104dcfe2fb51/joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6", size = 301817 },
]
-[[package]]
-name = "jsonschema"
-version = "4.23.0"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "attrs" },
- { name = "jsonschema-specifications" },
- { name = "referencing" },
- { name = "rpds-py" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/38/2e/03362ee4034a4c917f697890ccd4aec0800ccf9ded7f511971c75451deec/jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4", size = 325778 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/69/4a/4f9dbeb84e8850557c02365a0eee0649abe5eb1d84af92a25731c6c0f922/jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566", size = 88462 },
-]
-
-[[package]]
-name = "jsonschema-specifications"
-version = "2024.10.1"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "referencing" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/10/db/58f950c996c793472e336ff3655b13fbcf1e3b359dcf52dcf3ed3b52c352/jsonschema_specifications-2024.10.1.tar.gz", hash = "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272", size = 15561 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/d1/0f/8910b19ac0670a0f80ce1008e5e751c4a57e14d2c4c13a482aa6079fa9d6/jsonschema_specifications-2024.10.1-py3-none-any.whl", hash = "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf", size = 18459 },
-]
-
[[package]]
name = "jupyter-client"
version = "8.6.3"
@@ -976,15 +934,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/c9/fb/108ecd1fe961941959ad0ee4e12ee7b8b1477247f30b1fdfd83ceaf017f0/jupyter_core-5.7.2-py3-none-any.whl", hash = "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409", size = 28965 },
]
-[[package]]
-name = "jupyterlab-pygments"
-version = "0.3.0"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/90/51/9187be60d989df97f5f0aba133fa54e7300f17616e065d1ada7d7646b6d6/jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d", size = 512900 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780", size = 15884 },
-]
-
[[package]]
name = "jupyterlab-widgets"
version = "3.0.13"
@@ -1040,6 +989,15 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/50/8d/da77ceb92ed674da93959184a2777d08ccbd872559fb52aba16b91686b7e/lightning_utilities-0.12.0-py3-none-any.whl", hash = "sha256:b827f5768607e81ccc7b2ada1f50628168d1cc9f839509c7e87c04b59079e66c", size = 28487 },
]
+[[package]]
+name = "markdown"
+version = "3.7"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/54/28/3af612670f82f4c056911fbbbb42760255801b3068c48de792d354ff4472/markdown-3.7.tar.gz", hash = "sha256:2ae2471477cfd02dbbf038d5d9bc226d40def84b4fe2986e49b59b6b472bbed2", size = 357086 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/3f/08/83871f3c50fc983b88547c196d11cf8c3340e37c32d2e9d6152abe2c61f7/Markdown-3.7-py3-none-any.whl", hash = "sha256:7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803", size = 106349 },
+]
+
[[package]]
name = "markdown-it-py"
version = "3.0.0"
@@ -1103,36 +1061,150 @@ wheels = [
]
[[package]]
-name = "mdit-py-plugins"
-version = "0.4.2"
+name = "mdurl"
+version = "0.1.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 },
+]
+
+[[package]]
+name = "mergedeep"
+version = "1.3.4"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/3a/41/580bb4006e3ed0361b8151a01d324fb03f420815446c7def45d02f74c270/mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8", size = 4661 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307", size = 6354 },
+]
+
+[[package]]
+name = "mkdocs"
+version = "1.6.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "click" },
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+ { name = "ghp-import" },
+ { name = "jinja2" },
+ { name = "markdown" },
+ { name = "markupsafe" },
+ { name = "mergedeep" },
+ { name = "mkdocs-get-deps" },
+ { name = "packaging" },
+ { name = "pathspec" },
+ { name = "pyyaml" },
+ { name = "pyyaml-env-tag" },
+ { name = "watchdog" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/bc/c6/bbd4f061bd16b378247f12953ffcb04786a618ce5e904b8c5a01a0309061/mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2", size = 3889159 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e", size = 3864451 },
+]
+
+[[package]]
+name = "mkdocs-autorefs"
+version = "1.4.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
- { name = "markdown-it-py" },
+ { name = "markdown" },
+ { name = "markupsafe" },
+ { name = "mkdocs" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/19/03/a2ecab526543b152300717cf232bb4bb8605b6edb946c845016fa9c9c9fd/mdit_py_plugins-0.4.2.tar.gz", hash = "sha256:5f2cd1fdb606ddf152d37ec30e46101a60512bc0e5fa1a7002c36647b09e26b5", size = 43542 }
+sdist = { url = "https://files.pythonhosted.org/packages/c2/44/140469d87379c02f1e1870315f3143718036a983dd0416650827b8883192/mkdocs_autorefs-1.4.1.tar.gz", hash = "sha256:4b5b6235a4becb2b10425c2fa191737e415b37aa3418919db33e5d774c9db079", size = 4131355 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/a7/f7/7782a043553ee469c1ff49cfa1cdace2d6bf99a1f333cf38676b3ddf30da/mdit_py_plugins-0.4.2-py3-none-any.whl", hash = "sha256:0c673c3f889399a33b95e88d2f0d111b4447bdfea7f237dab2d488f459835636", size = 55316 },
+ { url = "https://files.pythonhosted.org/packages/f8/29/1125f7b11db63e8e32bcfa0752a4eea30abff3ebd0796f808e14571ddaa2/mkdocs_autorefs-1.4.1-py3-none-any.whl", hash = "sha256:9793c5ac06a6ebbe52ec0f8439256e66187badf4b5334b5fde0b128ec134df4f", size = 5782047 },
]
[[package]]
-name = "mdurl"
-version = "0.1.2"
+name = "mkdocs-get-deps"
+version = "0.2.0"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729 }
+dependencies = [
+ { name = "mergedeep" },
+ { name = "platformdirs" },
+ { name = "pyyaml" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/98/f5/ed29cd50067784976f25ed0ed6fcd3c2ce9eb90650aa3b2796ddf7b6870b/mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c", size = 10239 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 },
+ { url = "https://files.pythonhosted.org/packages/9f/d4/029f984e8d3f3b6b726bd33cafc473b75e9e44c0f7e80a5b29abc466bdea/mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134", size = 9521 },
]
[[package]]
-name = "mistune"
-version = "3.1.2"
+name = "mkdocs-include-markdown-plugin"
+version = "6.2.2"
source = { registry = "https://pypi.org/simple" }
dependencies = [
- { name = "typing-extensions", marker = "python_full_version < '3.11'" },
+ { name = "mkdocs" },
+ { name = "wcmatch" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/ee/fe/4bb438d0f58995f81e2616d640f7efe0df9b1f992cba706a9453676c9140/mkdocs_include_markdown_plugin-6.2.2.tar.gz", hash = "sha256:f2bd5026650492a581d2fd44be6c22f90391910d76582b96a34c264f2d17875d", size = 21045 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/50/d9/7b2b09b4870a2cd5a80628c74553307205a8474aabe128b66e305b56ac30/mkdocs_include_markdown_plugin-6.2.2-py3-none-any.whl", hash = "sha256:d293950f6499d2944291ca7b9bc4a60e652bbfd3e3a42b564f6cceee268694e7", size = 24643 },
+]
+
+[[package]]
+name = "mkdocs-material"
+version = "9.6.11"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "babel" },
+ { name = "backrefs" },
+ { name = "colorama" },
+ { name = "jinja2" },
+ { name = "markdown" },
+ { name = "mkdocs" },
+ { name = "mkdocs-material-extensions" },
+ { name = "paginate" },
+ { name = "pygments" },
+ { name = "pymdown-extensions" },
+ { name = "requests" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/80/f7/f6d06304c61c2a73213c0a4815280f70d985429cda26272f490e42119c1a/mistune-3.1.2.tar.gz", hash = "sha256:733bf018ba007e8b5f2d3a9eb624034f6ee26c4ea769a98ec533ee111d504dff", size = 94613 }
+sdist = { url = "https://files.pythonhosted.org/packages/5b/7e/c65e330e99daa5813e7594e57a09219ad041ed631604a72588ec7c11b34b/mkdocs_material-9.6.11.tar.gz", hash = "sha256:0b7f4a0145c5074cdd692e4362d232fb25ef5b23328d0ec1ab287af77cc0deff", size = 3951595 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/12/92/30b4e54c4d7c48c06db61595cffbbf4f19588ea177896f9b78f0fbe021fd/mistune-3.1.2-py3-none-any.whl", hash = "sha256:4b47731332315cdca99e0ded46fc0004001c1299ff773dfb48fbe1fd226de319", size = 53696 },
+ { url = "https://files.pythonhosted.org/packages/19/91/79a15a772151aca0d505f901f6bbd4b85ee1fe54100256a6702056bab121/mkdocs_material-9.6.11-py3-none-any.whl", hash = "sha256:47f21ef9cbf4f0ebdce78a2ceecaa5d413581a55141e4464902224ebbc0b1263", size = 8703720 },
+]
+
+[[package]]
+name = "mkdocs-material-extensions"
+version = "1.3.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/79/9b/9b4c96d6593b2a541e1cb8b34899a6d021d208bb357042823d4d2cabdbe7/mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443", size = 11847 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/5b/54/662a4743aa81d9582ee9339d4ffa3c8fd40a4965e033d77b9da9774d3960/mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31", size = 8728 },
+]
+
+[[package]]
+name = "mkdocstrings"
+version = "0.25.2"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "click" },
+ { name = "jinja2" },
+ { name = "markdown" },
+ { name = "markupsafe" },
+ { name = "mkdocs" },
+ { name = "mkdocs-autorefs" },
+ { name = "platformdirs" },
+ { name = "pymdown-extensions" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/24/a6/d544fae9749b19e23fb590f6344f9eae3a312323065070b4874236bb0e04/mkdocstrings-0.25.2.tar.gz", hash = "sha256:5cf57ad7f61e8be3111a2458b4e49c2029c9cb35525393b179f9c916ca8042dc", size = 91796 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/2b/86/ee2aef075cc9a62a4f087c3c3f4e3e8a8318afe05a92f8f8415f1bf1af64/mkdocstrings-0.25.2-py3-none-any.whl", hash = "sha256:9e2cda5e2e12db8bb98d21e3410f3f27f8faab685a24b03b06ba7daa5b92abfc", size = 29289 },
+]
+
+[[package]]
+name = "mkdocstrings-python"
+version = "1.10.9"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "griffe" },
+ { name = "mkdocs-autorefs" },
+ { name = "mkdocstrings" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/d8/df/c0c09bf79f1329da2422b5d1d2d4d84070aee7cf7f99df98d7b78be066a9/mkdocstrings_python-1.10.9.tar.gz", hash = "sha256:f344aaa47e727d8a2dc911e063025e58e2b7fb31a41110ccc3902aa6be7ca196", size = 162070 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/87/45/35c2ade06b6dfd383795008260405a47e10aba74e2c9594741a1a1f034b0/mkdocstrings_python-1.10.9-py3-none-any.whl", hash = "sha256:cbe98710a6757dfd4dff79bf36cb9731908fb4c69dd2736b15270ae7a488243d", size = 108360 },
]
[[package]]
@@ -1181,19 +1253,17 @@ dev = [
{ name = "wandb" },
]
docs = [
- { name = "furo" },
+ { name = "black" },
{ name = "ipykernel" },
{ name = "ipython" },
- { name = "myst-parser" },
- { name = "nbsphinx" },
+ { name = "mkdocs" },
+ { name = "mkdocs-autorefs" },
+ { name = "mkdocs-include-markdown-plugin" },
+ { name = "mkdocs-material" },
+ { name = "mkdocstrings" },
+ { name = "mkdocstrings-python" },
{ name = "numpydoc" },
- { name = "sphinx" },
- { name = "sphinx-autoapi" },
- { name = "sphinx-autobuild" },
- { name = "sphinx-autodoc-typehints" },
- { name = "sphinx-copybutton" },
- { name = "sphinx-design" },
- { name = "sphinxcontrib-apidoc" },
+ { name = "pymdown-extensions" },
]
[package.metadata]
@@ -1233,19 +1303,17 @@ dev = [
{ name = "wandb", specifier = ">=0.19.6,<0.20.0" },
]
docs = [
- { name = "furo", specifier = ">=2024.8.6,<2025.0.0" },
+ { name = "black", specifier = ">=24.3.0,<25.0.0" },
{ name = "ipykernel", specifier = ">=6.29.5,<7.0.0" },
{ name = "ipython", specifier = ">=8.32.0,<9.0.0" },
- { name = "myst-parser", specifier = ">=4.0.0,<5.0.0" },
- { name = "nbsphinx", specifier = ">=0.9.5,<0.10.0" },
+ { name = "mkdocs", specifier = ">=1.6.0,<2.0.0" },
+ { name = "mkdocs-autorefs", specifier = ">=1.0.0,<2.0.0" },
+ { name = "mkdocs-include-markdown-plugin", specifier = ">=6.0.4,<7.0.0" },
+ { name = "mkdocs-material", specifier = ">=9.5.13,<10.0.0" },
+ { name = "mkdocstrings", specifier = ">=0.25.0,<0.26.0" },
+ { name = "mkdocstrings-python", specifier = ">=1.9.0,<2.0.0" },
{ name = "numpydoc", specifier = ">=1.8.0,<2.0.0" },
- { name = "sphinx", specifier = ">=8.1.3,<9.0.0" },
- { name = "sphinx-autoapi", specifier = ">=3.4.0,<4.0.0" },
- { name = "sphinx-autobuild", specifier = "==2024.10.3" },
- { name = "sphinx-autodoc-typehints", specifier = ">=2.5.0,<3.0.0" },
- { name = "sphinx-copybutton", specifier = ">=0.5.2,<0.6.0" },
- { name = "sphinx-design", specifier = ">=0.6.1,<0.7.0" },
- { name = "sphinxcontrib-apidoc", specifier = ">=0.5.0,<0.6.0" },
+ { name = "pymdown-extensions", specifier = ">=10.9.0,<11.0.0" },
]
[[package]]
@@ -1414,95 +1482,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", size = 4695 },
]
-[[package]]
-name = "myst-parser"
-version = "4.0.1"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "docutils" },
- { name = "jinja2" },
- { name = "markdown-it-py" },
- { name = "mdit-py-plugins" },
- { name = "pyyaml" },
- { name = "sphinx" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/66/a5/9626ba4f73555b3735ad86247a8077d4603aa8628537687c839ab08bfe44/myst_parser-4.0.1.tar.gz", hash = "sha256:5cfea715e4f3574138aecbf7d54132296bfd72bb614d31168f48c477a830a7c4", size = 93985 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/5f/df/76d0321c3797b54b60fef9ec3bd6f4cfd124b9e422182156a1dd418722cf/myst_parser-4.0.1-py3-none-any.whl", hash = "sha256:9134e88959ec3b5780aedf8a99680ea242869d012e8821db3126d427edc9c95d", size = 84579 },
-]
-
-[[package]]
-name = "nbclient"
-version = "0.10.2"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "jupyter-client" },
- { name = "jupyter-core" },
- { name = "nbformat" },
- { name = "traitlets" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/87/66/7ffd18d58eae90d5721f9f39212327695b749e23ad44b3881744eaf4d9e8/nbclient-0.10.2.tar.gz", hash = "sha256:90b7fc6b810630db87a6d0c2250b1f0ab4cf4d3c27a299b0cde78a4ed3fd9193", size = 62424 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/34/6d/e7fa07f03a4a7b221d94b4d586edb754a9b0dc3c9e2c93353e9fa4e0d117/nbclient-0.10.2-py3-none-any.whl", hash = "sha256:4ffee11e788b4a27fabeb7955547e4318a5298f34342a4bfd01f2e1faaeadc3d", size = 25434 },
-]
-
-[[package]]
-name = "nbconvert"
-version = "7.16.6"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "beautifulsoup4" },
- { name = "bleach", extra = ["css"] },
- { name = "defusedxml" },
- { name = "jinja2" },
- { name = "jupyter-core" },
- { name = "jupyterlab-pygments" },
- { name = "markupsafe" },
- { name = "mistune" },
- { name = "nbclient" },
- { name = "nbformat" },
- { name = "packaging" },
- { name = "pandocfilters" },
- { name = "pygments" },
- { name = "traitlets" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/a3/59/f28e15fc47ffb73af68a8d9b47367a8630d76e97ae85ad18271b9db96fdf/nbconvert-7.16.6.tar.gz", hash = "sha256:576a7e37c6480da7b8465eefa66c17844243816ce1ccc372633c6b71c3c0f582", size = 857715 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/cc/9a/cd673b2f773a12c992f41309ef81b99da1690426bd2f96957a7ade0d3ed7/nbconvert-7.16.6-py3-none-any.whl", hash = "sha256:1375a7b67e0c2883678c48e506dc320febb57685e5ee67faa51b18a90f3a712b", size = 258525 },
-]
-
-[[package]]
-name = "nbformat"
-version = "5.10.4"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "fastjsonschema" },
- { name = "jsonschema" },
- { name = "jupyter-core" },
- { name = "traitlets" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/6d/fd/91545e604bc3dad7dca9ed03284086039b294c6b3d75c0d2fa45f9e9caf3/nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a", size = 142749 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b", size = 78454 },
-]
-
-[[package]]
-name = "nbsphinx"
-version = "0.9.7"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "docutils" },
- { name = "jinja2" },
- { name = "nbconvert" },
- { name = "nbformat" },
- { name = "sphinx" },
- { name = "traitlets" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/1e/84/b1856b7651ac34e965aa567a158714c7f3bd42a1b1ce76bf423ffb99872c/nbsphinx-0.9.7.tar.gz", hash = "sha256:abd298a686d55fa894ef697c51d44f24e53aa312dadae38e82920f250a5456fe", size = 180479 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/49/2d/8c8e635bcc6757573d311bb3c5445426382f280da32b8cd6d82d501ef4a4/nbsphinx-0.9.7-py3-none-any.whl", hash = "sha256:7292c3767fea29e405c60743eee5393682a83982ab202ff98f5eb2db02629da8", size = 31660 },
-]
-
[[package]]
name = "nest-asyncio"
version = "1.6.0"
@@ -1734,6 +1713,15 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 },
]
+[[package]]
+name = "paginate"
+version = "0.5.7"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/ec/46/68dde5b6bc00c1296ec6466ab27dddede6aec9af1b99090e1107091b3b84/paginate-0.5.7.tar.gz", hash = "sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945", size = 19252 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591", size = 13746 },
+]
+
[[package]]
name = "pandas"
version = "2.2.3"
@@ -1769,15 +1757,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/29/d4/1244ab8edf173a10fd601f7e13b9566c1b525c4f365d6bee918e68381889/pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13", size = 11504248 },
]
-[[package]]
-name = "pandocfilters"
-version = "1.5.1"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/70/6f/3dd4940bbe001c06a65f88e36bad298bc7a0de5036115639926b0c5c0458/pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e", size = 8454 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc", size = 8663 },
-]
-
[[package]]
name = "parso"
version = "0.8.4"
@@ -1788,15 +1767,12 @@ wheels = [
]
[[package]]
-name = "pbr"
-version = "6.1.1"
+name = "pathspec"
+version = "0.12.1"
source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "setuptools" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/01/d2/510cc0d218e753ba62a1bc1434651db3cd797a9716a0a66cc714cb4f0935/pbr-6.1.1.tar.gz", hash = "sha256:93ea72ce6989eb2eed99d0f75721474f69ad88128afdef5ac377eb797c4bf76b", size = 125702 }
+sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/47/ac/684d71315abc7b1214d59304e23a982472967f6bf4bde5a98f1503f648dc/pbr-6.1.1-py2.py3-none-any.whl", hash = "sha256:38d4daea5d9fa63b3f626131b9d34947fd0c8be9b05a29276870580050a25a76", size = 108997 },
+ { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191 },
]
[[package]]
@@ -2221,6 +2197,19 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293 },
]
+[[package]]
+name = "pymdown-extensions"
+version = "10.14.3"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "markdown" },
+ { name = "pyyaml" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/7c/44/e6de2fdc880ad0ec7547ca2e087212be815efbc9a425a8d5ba9ede602cbb/pymdown_extensions-10.14.3.tar.gz", hash = "sha256:41e576ce3f5d650be59e900e4ceff231e0aed2a88cf30acaee41e02f063a061b", size = 846846 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/eb/f5/b9e2a42aa8f9e34d52d66de87941ecd236570c7ed2e87775ed23bbe4e224/pymdown_extensions-10.14.3-py3-none-any.whl", hash = "sha256:05e0bee73d64b9c71a4ae17c72abc2f700e8bc8403755a00580b49a4e9f189e9", size = 264467 },
+]
+
[[package]]
name = "pyparsing"
version = "3.2.1"
@@ -2338,6 +2327,18 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338 },
]
+[[package]]
+name = "pyyaml-env-tag"
+version = "0.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pyyaml" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/fb/8e/da1c6c58f751b70f8ceb1eb25bc25d524e8f14fe16edcce3f4e3ba08629c/pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb", size = 5631 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/5a/66/bbb1dd374f5c870f59c5bb1db0e18cbe7fa739415a24cbd95b2d1f5ae0c4/pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069", size = 3911 },
+]
+
[[package]]
name = "pyzmq"
version = "26.2.1"
@@ -2390,20 +2391,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/e3/fe/72e7e166bda3885810bee7b23049133e142f7c80c295bae02c562caeea16/pyzmq-26.2.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:bd8fdee945b877aa3bffc6a5a8816deb048dab0544f9df3731ecd0e54d8c84c9", size = 556563 },
]
-[[package]]
-name = "referencing"
-version = "0.36.2"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "attrs" },
- { name = "rpds-py" },
- { name = "typing-extensions" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/2f/db/98b5c277be99dd18bfd91dd04e1b759cad18d1a338188c936e92f921c7e2/referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa", size = 74744 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/c1/b1/3baf80dc6d2b7bc27a95a67752d0208e410351e3feb4eb78de5f77454d8d/referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0", size = 26775 },
-]
-
[[package]]
name = "regex"
version = "2024.11.6"
@@ -2487,65 +2474,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/19/71/39c7c0d87f8d4e6c020a393182060eaefeeae6c01dab6a84ec346f2567df/rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90", size = 242424 },
]
-[[package]]
-name = "rpds-py"
-version = "0.23.1"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/0a/79/2ce611b18c4fd83d9e3aecb5cba93e1917c050f556db39842889fa69b79f/rpds_py-0.23.1.tar.gz", hash = "sha256:7f3240dcfa14d198dba24b8b9cb3b108c06b68d45b7babd9eefc1038fdf7e707", size = 26806 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/34/fe/e5326459863bd525122f4e9c80ac8d7c6cfa171b7518d04cc27c12c209b0/rpds_py-0.23.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2a54027554ce9b129fc3d633c92fa33b30de9f08bc61b32c053dc9b537266fed", size = 372123 },
- { url = "https://files.pythonhosted.org/packages/f9/db/f10a3795f7a89fb27594934012d21c61019bbeb516c5bdcfbbe9e9e617a7/rpds_py-0.23.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b5ef909a37e9738d146519657a1aab4584018746a18f71c692f2f22168ece40c", size = 356778 },
- { url = "https://files.pythonhosted.org/packages/21/27/0d3678ad7f432fa86f8fac5f5fc6496a4d2da85682a710d605219be20063/rpds_py-0.23.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ee9d6f0b38efb22ad94c3b68ffebe4c47865cdf4b17f6806d6c674e1feb4246", size = 385775 },
- { url = "https://files.pythonhosted.org/packages/99/a0/1786defa125b2ad228027f22dff26312ce7d1fee3c7c3c2682f403db2062/rpds_py-0.23.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f7356a6da0562190558c4fcc14f0281db191cdf4cb96e7604c06acfcee96df15", size = 391181 },
- { url = "https://files.pythonhosted.org/packages/f1/5c/1240934050a7ffd020a915486d0cc4c7f6e7a2442a77aedf13664db55d36/rpds_py-0.23.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9441af1d25aed96901f97ad83d5c3e35e6cd21a25ca5e4916c82d7dd0490a4fa", size = 444607 },
- { url = "https://files.pythonhosted.org/packages/b7/1b/cee6905b47817fd0a377716dbe4df35295de46df46ee2ff704538cc371b0/rpds_py-0.23.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d8abf7896a91fb97e7977d1aadfcc2c80415d6dc2f1d0fca5b8d0df247248f3", size = 445550 },
- { url = "https://files.pythonhosted.org/packages/54/f7/f0821ca34032892d7a67fcd5042f50074ff2de64e771e10df01085c88d47/rpds_py-0.23.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b08027489ba8fedde72ddd233a5ea411b85a6ed78175f40285bd401bde7466d", size = 386148 },
- { url = "https://files.pythonhosted.org/packages/eb/ef/2afe53bc857c4bcba336acfd2629883a5746e7291023e017ac7fc98d85aa/rpds_py-0.23.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fee513135b5a58f3bb6d89e48326cd5aa308e4bcdf2f7d59f67c861ada482bf8", size = 416780 },
- { url = "https://files.pythonhosted.org/packages/ae/9a/38d2236cf669789b8a3e1a014c9b6a8d7b8925b952c92e7839ae2749f9ac/rpds_py-0.23.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:35d5631ce0af26318dba0ae0ac941c534453e42f569011585cb323b7774502a5", size = 558265 },
- { url = "https://files.pythonhosted.org/packages/e6/0a/f2705530c42578f20ed0b5b90135eecb30eef6e2ba73e7ba69087fad2dba/rpds_py-0.23.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:a20cb698c4a59c534c6701b1c24a968ff2768b18ea2991f886bd8985ce17a89f", size = 585270 },
- { url = "https://files.pythonhosted.org/packages/29/4e/3b597dc84ed82c3d757ac9aa620de224a94e06d2e102069795ae7e81c015/rpds_py-0.23.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e9c206a1abc27e0588cf8b7c8246e51f1a16a103734f7750830a1ccb63f557a", size = 553850 },
- { url = "https://files.pythonhosted.org/packages/00/cc/6498b6f79e4375e6737247661e52a2d18f6accf4910e0c8da978674b4241/rpds_py-0.23.1-cp310-cp310-win32.whl", hash = "sha256:d9f75a06ecc68f159d5d7603b734e1ff6daa9497a929150f794013aa9f6e3f12", size = 220660 },
- { url = "https://files.pythonhosted.org/packages/17/2b/08db023d23e8c7032c99d8d2a70d32e450a868ab73d16e3ff5290308a665/rpds_py-0.23.1-cp310-cp310-win_amd64.whl", hash = "sha256:f35eff113ad430b5272bbfc18ba111c66ff525828f24898b4e146eb479a2cdda", size = 232551 },
- { url = "https://files.pythonhosted.org/packages/1c/67/6e5d4234bb9dee062ffca2a5f3c7cd38716317d6760ec235b175eed4de2c/rpds_py-0.23.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:b79f5ced71efd70414a9a80bbbfaa7160da307723166f09b69773153bf17c590", size = 372264 },
- { url = "https://files.pythonhosted.org/packages/a7/0a/3dedb2daee8e783622427f5064e2d112751d8276ee73aa5409f000a132f4/rpds_py-0.23.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c9e799dac1ffbe7b10c1fd42fe4cd51371a549c6e108249bde9cd1200e8f59b4", size = 356883 },
- { url = "https://files.pythonhosted.org/packages/ed/fc/e1acef44f9c24b05fe5434b235f165a63a52959ac655e3f7a55726cee1a4/rpds_py-0.23.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:721f9c4011b443b6e84505fc00cc7aadc9d1743f1c988e4c89353e19c4a968ee", size = 385624 },
- { url = "https://files.pythonhosted.org/packages/97/0a/a05951f6465d01622720c03ef6ef31adfbe865653e05ed7c45837492f25e/rpds_py-0.23.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f88626e3f5e57432e6191cd0c5d6d6b319b635e70b40be2ffba713053e5147dd", size = 391500 },
- { url = "https://files.pythonhosted.org/packages/ea/2e/cca0583ec0690ea441dceae23c0673b99755710ea22f40bccf1e78f41481/rpds_py-0.23.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:285019078537949cecd0190f3690a0b0125ff743d6a53dfeb7a4e6787af154f5", size = 444869 },
- { url = "https://files.pythonhosted.org/packages/cc/e6/95cda68b33a6d814d1e96b0e406d231ed16629101460d1740e92f03365e6/rpds_py-0.23.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b92f5654157de1379c509b15acec9d12ecf6e3bc1996571b6cb82a4302060447", size = 444930 },
- { url = "https://files.pythonhosted.org/packages/5f/a7/e94cdb73411ae9c11414d3c7c9a6ad75d22ad4a8d094fb45a345ba9e3018/rpds_py-0.23.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e768267cbe051dd8d1c5305ba690bb153204a09bf2e3de3ae530de955f5b5580", size = 386254 },
- { url = "https://files.pythonhosted.org/packages/dd/c5/a4a943d90a39e85efd1e04b1ad5129936786f9a9aa27bb7be8fc5d9d50c9/rpds_py-0.23.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c5334a71f7dc1160382d45997e29f2637c02f8a26af41073189d79b95d3321f1", size = 417090 },
- { url = "https://files.pythonhosted.org/packages/0c/a0/80d0013b12428d1fce0ab4e71829400b0a32caec12733c79e6109f843342/rpds_py-0.23.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d6adb81564af0cd428910f83fa7da46ce9ad47c56c0b22b50872bc4515d91966", size = 557639 },
- { url = "https://files.pythonhosted.org/packages/a6/92/ec2e6980afb964a2cd7a99cbdef1f6c01116abe94b42cbe336ac93dd11c2/rpds_py-0.23.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:cafa48f2133d4daa028473ede7d81cd1b9f9e6925e9e4003ebdf77010ee02f35", size = 584572 },
- { url = "https://files.pythonhosted.org/packages/3d/ce/75b6054db34a390789a82523790717b27c1bd735e453abb429a87c4f0f26/rpds_py-0.23.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0fced9fd4a07a1ded1bac7e961ddd9753dd5d8b755ba8e05acba54a21f5f1522", size = 553028 },
- { url = "https://files.pythonhosted.org/packages/cc/24/f45abe0418c06a5cba0f846e967aa27bac765acd927aabd857c21319b8cc/rpds_py-0.23.1-cp311-cp311-win32.whl", hash = "sha256:243241c95174b5fb7204c04595852fe3943cc41f47aa14c3828bc18cd9d3b2d6", size = 220862 },
- { url = "https://files.pythonhosted.org/packages/2d/a6/3c0880e8bbfc36451ef30dc416266f6d2934705e468db5d21c8ba0ab6400/rpds_py-0.23.1-cp311-cp311-win_amd64.whl", hash = "sha256:11dd60b2ffddba85715d8a66bb39b95ddbe389ad2cfcf42c833f1bcde0878eaf", size = 232953 },
- { url = "https://files.pythonhosted.org/packages/f3/8c/d17efccb9f5b9137ddea706664aebae694384ae1d5997c0202093e37185a/rpds_py-0.23.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3902df19540e9af4cc0c3ae75974c65d2c156b9257e91f5101a51f99136d834c", size = 364369 },
- { url = "https://files.pythonhosted.org/packages/6e/c0/ab030f696b5c573107115a88d8d73d80f03309e60952b64c584c70c659af/rpds_py-0.23.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:66f8d2a17e5838dd6fb9be6baaba8e75ae2f5fa6b6b755d597184bfcd3cb0eba", size = 349965 },
- { url = "https://files.pythonhosted.org/packages/b3/55/b40170f5a079c4fb0b6a82b299689e66e744edca3c3375a8b160fb797660/rpds_py-0.23.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:112b8774b0b4ee22368fec42749b94366bd9b536f8f74c3d4175d4395f5cbd31", size = 389064 },
- { url = "https://files.pythonhosted.org/packages/ab/1c/b03a912c59ec7c1e16b26e587b9dfa8ddff3b07851e781e8c46e908a365a/rpds_py-0.23.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e0df046f2266e8586cf09d00588302a32923eb6386ced0ca5c9deade6af9a149", size = 397741 },
- { url = "https://files.pythonhosted.org/packages/52/6f/151b90792b62fb6f87099bcc9044c626881fdd54e31bf98541f830b15cea/rpds_py-0.23.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f3288930b947cbebe767f84cf618d2cbe0b13be476e749da0e6a009f986248c", size = 448784 },
- { url = "https://files.pythonhosted.org/packages/71/2a/6de67c0c97ec7857e0e9e5cd7c52405af931b303eb1e5b9eff6c50fd9a2e/rpds_py-0.23.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ce473a2351c018b06dd8d30d5da8ab5a0831056cc53b2006e2a8028172c37ce5", size = 440203 },
- { url = "https://files.pythonhosted.org/packages/db/5e/e759cd1c276d98a4b1f464b17a9bf66c65d29f8f85754e27e1467feaa7c3/rpds_py-0.23.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d550d7e9e7d8676b183b37d65b5cd8de13676a738973d330b59dc8312df9c5dc", size = 391611 },
- { url = "https://files.pythonhosted.org/packages/1c/1e/2900358efcc0d9408c7289769cba4c0974d9db314aa884028ed7f7364f61/rpds_py-0.23.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e14f86b871ea74c3fddc9a40e947d6a5d09def5adc2076ee61fb910a9014fb35", size = 423306 },
- { url = "https://files.pythonhosted.org/packages/23/07/6c177e6d059f5d39689352d6c69a926ee4805ffdb6f06203570234d3d8f7/rpds_py-0.23.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1bf5be5ba34e19be579ae873da515a2836a2166d8d7ee43be6ff909eda42b72b", size = 562323 },
- { url = "https://files.pythonhosted.org/packages/70/e4/f9097fd1c02b516fff9850792161eb9fc20a2fd54762f3c69eae0bdb67cb/rpds_py-0.23.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d7031d493c4465dbc8d40bd6cafefef4bd472b17db0ab94c53e7909ee781b9ef", size = 588351 },
- { url = "https://files.pythonhosted.org/packages/87/39/5db3c6f326bfbe4576ae2af6435bd7555867d20ae690c786ff33659f293b/rpds_py-0.23.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:55ff4151cfd4bc635e51cfb1c59ac9f7196b256b12e3a57deb9e5742e65941ad", size = 557252 },
- { url = "https://files.pythonhosted.org/packages/fd/14/2d5ad292f144fa79bafb78d2eb5b8a3a91c358b6065443cb9c49b5d1fedf/rpds_py-0.23.1-cp312-cp312-win32.whl", hash = "sha256:a9d3b728f5a5873d84cba997b9d617c6090ca5721caaa691f3b1a78c60adc057", size = 222181 },
- { url = "https://files.pythonhosted.org/packages/a3/4f/0fce63e0f5cdd658e71e21abd17ac1bc9312741ebb8b3f74eeed2ebdf771/rpds_py-0.23.1-cp312-cp312-win_amd64.whl", hash = "sha256:b03a8d50b137ee758e4c73638b10747b7c39988eb8e6cd11abb7084266455165", size = 237426 },
- { url = "https://files.pythonhosted.org/packages/95/a9/6fafd35fc6bac05f59bcbc800b57cef877911ff1c015397c519fec888642/rpds_py-0.23.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c1f8afa346ccd59e4e5630d5abb67aba6a9812fddf764fd7eb11f382a345f8cc", size = 373463 },
- { url = "https://files.pythonhosted.org/packages/5b/ac/44f00029b8fbe0903a19e9a87a9b86063bf8700df2cc58868373d378418c/rpds_py-0.23.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:fad784a31869747df4ac968a351e070c06ca377549e4ace94775aaa3ab33ee06", size = 358400 },
- { url = "https://files.pythonhosted.org/packages/5e/9c/3da199346c68d785f10dccab123b74c8c5f73be3f742c9e33d1116e07931/rpds_py-0.23.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5a96fcac2f18e5a0a23a75cd27ce2656c66c11c127b0318e508aab436b77428", size = 386815 },
- { url = "https://files.pythonhosted.org/packages/d3/45/8f6533c33c0d33da8c2c8b2fb8f2ee90b23c05c679b86b0ac6aee4653749/rpds_py-0.23.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3e77febf227a1dc3220159355dba68faa13f8dca9335d97504abf428469fb18b", size = 392974 },
- { url = "https://files.pythonhosted.org/packages/ca/56/6a9ac1bf0455ba07385d8fe98c571c519b4f2000cff6581487bf9fab9272/rpds_py-0.23.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:26bb3e8de93443d55e2e748e9fd87deb5f8075ca7bc0502cfc8be8687d69a2ec", size = 446019 },
- { url = "https://files.pythonhosted.org/packages/f4/83/5d9a3f9731cdccf49088bcc4ce821a5cf50bd1737cdad83e9959a7b9054d/rpds_py-0.23.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:db7707dde9143a67b8812c7e66aeb2d843fe33cc8e374170f4d2c50bd8f2472d", size = 445811 },
- { url = "https://files.pythonhosted.org/packages/44/50/f2e0a98c62fc1fe68b176caca587714dc5c8bb2c3d1dd1eeb2bd4cc787ac/rpds_py-0.23.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1eedaaccc9bb66581d4ae7c50e15856e335e57ef2734dbc5fd8ba3e2a4ab3cb6", size = 388070 },
- { url = "https://files.pythonhosted.org/packages/f2/d0/4981878f8f157e6dbea01d95e0119bf3d6b4c2c884fe64a9e6987f941104/rpds_py-0.23.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28358c54fffadf0ae893f6c1050e8f8853e45df22483b7fff2f6ab6152f5d8bf", size = 419173 },
- { url = "https://files.pythonhosted.org/packages/ce/13/fc971c470da96b270d2f64fedee987351bd935dc3016932a5cdcb1a88a2a/rpds_py-0.23.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:633462ef7e61d839171bf206551d5ab42b30b71cac8f10a64a662536e057fdef", size = 559048 },
- { url = "https://files.pythonhosted.org/packages/42/02/be91e1de139ec8b4f9fec4192fd779ba48af281cfc762c0ca4c15b945484/rpds_py-0.23.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:a98f510d86f689fcb486dc59e6e363af04151e5260ad1bdddb5625c10f1e95f8", size = 584773 },
- { url = "https://files.pythonhosted.org/packages/27/28/3af8a1956df3edc41d884267d766dc096496dafc83f02f764a475eca0b4a/rpds_py-0.23.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e0397dd0b3955c61ef9b22838144aa4bef6f0796ba5cc8edfc64d468b93798b4", size = 555153 },
- { url = "https://files.pythonhosted.org/packages/5e/bb/e45f51c4e1327dea3c72b846c6de129eebacb7a6cb309af7af35d0578c80/rpds_py-0.23.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:75307599f0d25bf6937248e5ac4e3bde5ea72ae6618623b86146ccc7845ed00b", size = 233827 },
-]
-
[[package]]
name = "ruff"
version = "0.9.9"
@@ -2748,15 +2676,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e", size = 24303 },
]
-[[package]]
-name = "sniffio"
-version = "1.3.1"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235 },
-]
-
[[package]]
name = "snowballstemmer"
version = "2.2.0"
@@ -2775,15 +2694,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0", size = 29575 },
]
-[[package]]
-name = "soupsieve"
-version = "2.6"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/d7/ce/fbaeed4f9fb8b2daa961f90591662df6a86c1abf25c548329a86920aedfb/soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb", size = 101569 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/d1/c2/fe97d779f3ef3b15f05c94a2f1e3d21732574ed441687474db9d342a7315/soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9", size = 36186 },
-]
-
[[package]]
name = "sphinx"
version = "8.1.3"
@@ -2812,99 +2722,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/26/60/1ddff83a56d33aaf6f10ec8ce84b4c007d9368b21008876fceda7e7381ef/sphinx-8.1.3-py3-none-any.whl", hash = "sha256:09719015511837b76bf6e03e42eb7595ac8c2e41eeb9c29c5b755c6b677992a2", size = 3487125 },
]
-[[package]]
-name = "sphinx-autoapi"
-version = "3.6.0"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "astroid" },
- { name = "jinja2" },
- { name = "pyyaml" },
- { name = "sphinx" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/7f/a8/22b379a2a75ccb881217d3d4ae56d7d35f2d1bb4c8c0c51d0253676746a1/sphinx_autoapi-3.6.0.tar.gz", hash = "sha256:c685f274e41d0842ae7e199460c322c4bd7fec816ccc2da8d806094b4f64af06", size = 55417 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/58/17/0eda9dc80fcaf257222b506844207e71b5d59567c41bbdcca2a72da119b9/sphinx_autoapi-3.6.0-py3-none-any.whl", hash = "sha256:f3b66714493cab140b0e896d33ce7137654a16ac1edb6563edcbd47bf975f711", size = 35281 },
-]
-
-[[package]]
-name = "sphinx-autobuild"
-version = "2024.10.3"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "colorama" },
- { name = "sphinx" },
- { name = "starlette" },
- { name = "uvicorn" },
- { name = "watchfiles" },
- { name = "websockets" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/a5/2c/155e1de2c1ba96a72e5dba152c509a8b41e047ee5c2def9e9f0d812f8be7/sphinx_autobuild-2024.10.3.tar.gz", hash = "sha256:248150f8f333e825107b6d4b86113ab28fa51750e5f9ae63b59dc339be951fb1", size = 14023 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/18/c0/eba125db38c84d3c74717008fd3cb5000b68cd7e2cbafd1349c6a38c3d3b/sphinx_autobuild-2024.10.3-py3-none-any.whl", hash = "sha256:158e16c36f9d633e613c9aaf81c19b0fc458ca78b112533b20dafcda430d60fa", size = 11908 },
-]
-
-[[package]]
-name = "sphinx-autodoc-typehints"
-version = "2.5.0"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "sphinx" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/2e/a0/4f17d564c86aa269749d99dd498a5c94abe0915d2ff349187f8ff8c75994/sphinx_autodoc_typehints-2.5.0.tar.gz", hash = "sha256:259e1026b218d563d72743f417fcc25906a9614897fe37f91bd8d7d58f748c3b", size = 40822 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/fa/ae/322d05bec884977b89eced3af811c228652a9e25f9646ee6236890987214/sphinx_autodoc_typehints-2.5.0-py3-none-any.whl", hash = "sha256:53def4753239683835b19bfa8b68c021388bd48a096efcb02cdab508ece27363", size = 20104 },
-]
-
-[[package]]
-name = "sphinx-basic-ng"
-version = "1.0.0b2"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "sphinx" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/98/0b/a866924ded68efec7a1759587a4e478aec7559d8165fac8b2ad1c0e774d6/sphinx_basic_ng-1.0.0b2.tar.gz", hash = "sha256:9ec55a47c90c8c002b5960c57492ec3021f5193cb26cebc2dc4ea226848651c9", size = 20736 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/3c/dd/018ce05c532a22007ac58d4f45232514cd9d6dd0ee1dc374e309db830983/sphinx_basic_ng-1.0.0b2-py3-none-any.whl", hash = "sha256:eb09aedbabfb650607e9b4b68c9d240b90b1e1be221d6ad71d61c52e29f7932b", size = 22496 },
-]
-
-[[package]]
-name = "sphinx-copybutton"
-version = "0.5.2"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "sphinx" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/fc/2b/a964715e7f5295f77509e59309959f4125122d648f86b4fe7d70ca1d882c/sphinx-copybutton-0.5.2.tar.gz", hash = "sha256:4cf17c82fb9646d1bc9ca92ac280813a3b605d8c421225fd9913154103ee1fbd", size = 23039 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/9e/48/1ea60e74949eecb12cdd6ac43987f9fd331156388dcc2319b45e2ebb81bf/sphinx_copybutton-0.5.2-py3-none-any.whl", hash = "sha256:fb543fd386d917746c9a2c50360c7905b605726b9355cd26e9974857afeae06e", size = 13343 },
-]
-
-[[package]]
-name = "sphinx-design"
-version = "0.6.1"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "sphinx" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/2b/69/b34e0cb5336f09c6866d53b4a19d76c227cdec1bbc7ac4de63ca7d58c9c7/sphinx_design-0.6.1.tar.gz", hash = "sha256:b44eea3719386d04d765c1a8257caca2b3e6f8421d7b3a5e742c0fd45f84e632", size = 2193689 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/c6/43/65c0acbd8cc6f50195a3a1fc195c404988b15c67090e73c7a41a9f57d6bd/sphinx_design-0.6.1-py3-none-any.whl", hash = "sha256:b11f37db1a802a183d61b159d9a202314d4d2fe29c163437001324fe2f19549c", size = 2215338 },
-]
-
-[[package]]
-name = "sphinxcontrib-apidoc"
-version = "0.5.0"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "pbr" },
- { name = "sphinx" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/52/8c/a4fe93b51a1026c217731337cfe50569b8521d3e254dd451126bed208cd8/sphinxcontrib-apidoc-0.5.0.tar.gz", hash = "sha256:65efcd92212a5f823715fb95ee098b458a6bb09a5ee617d9ed3dead97177cd55", size = 16117 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/1c/35/453ba8b0f407b9b86520eba5122fe28e87230266cfae9524a623b524485e/sphinxcontrib_apidoc-0.5.0-py3-none-any.whl", hash = "sha256:c671d644d6dc468be91b813dcddf74d87893bff74fe8f1b8b01b69408f0fb776", size = 8603 },
-]
-
[[package]]
name = "sphinxcontrib-applehelp"
version = "2.0.0"
@@ -2973,18 +2790,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521 },
]
-[[package]]
-name = "starlette"
-version = "0.46.0"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "anyio" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/44/b6/fb9a32e3c5d59b1e383c357534c63c2d3caa6f25bf3c59dd89d296ecbaec/starlette-0.46.0.tar.gz", hash = "sha256:b359e4567456b28d473d0193f34c0de0ed49710d75ef183a74a5ce0499324f50", size = 2575568 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/41/94/8af675a62e3c91c2dee47cf92e602cfac86e8767b1a1ac3caf1b327c2ab0/starlette-0.46.0-py3-none-any.whl", hash = "sha256:913f0798bd90ba90a9156383bcf1350a17d6259451d0d8ee27fc0cf2db609038", size = 71991 },
-]
-
[[package]]
name = "submitit"
version = "1.5.2"
@@ -3044,18 +2849,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/6c/d0/179abca8b984b3deefd996f362b612c39da73b60f685921e6cd58b6125b4/timm-1.0.15-py3-none-any.whl", hash = "sha256:5a3dc460c24e322ecc7fd1f3e3eb112423ddee320cb059cc1956fbc9731748ef", size = 2361373 },
]
-[[package]]
-name = "tinycss2"
-version = "1.4.0"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "webencodings" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/7a/fd/7a5ee21fd08ff70d3d33a5781c255cbe779659bd03278feb98b19ee550f4/tinycss2-1.4.0.tar.gz", hash = "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7", size = 87085 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289", size = 26610 },
-]
-
[[package]]
name = "tokenizers"
version = "0.21.0"
@@ -3338,20 +3131,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/c8/19/4ec628951a74043532ca2cf5d97b7b14863931476d117c471e8e2b1eb39f/urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", size = 128369 },
]
-[[package]]
-name = "uvicorn"
-version = "0.34.0"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "click" },
- { name = "h11" },
- { name = "typing-extensions", marker = "python_full_version < '3.11'" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/4b/4d/938bd85e5bf2edeec766267a5015ad969730bb91e31b44021dfe8b22df6c/uvicorn-0.34.0.tar.gz", hash = "sha256:404051050cd7e905de2c9a7e61790943440b3416f49cb409f965d9dcd0fa73e9", size = 76568 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/61/14/33a3a1352cfa71812a3a21e8c9bfb83f60b0011f5e36f2b1399d51928209/uvicorn-0.34.0-py3-none-any.whl", hash = "sha256:023dc038422502fa28a09c7a30bf2b6991512da7dcdb8fd35fe57cfc154126f4", size = 62315 },
-]
-
[[package]]
name = "virtualenv"
version = "20.29.2"
@@ -3400,56 +3179,44 @@ wheels = [
]
[[package]]
-name = "watchfiles"
-version = "1.0.4"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "anyio" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/f5/26/c705fc77d0a9ecdb9b66f1e2976d95b81df3cae518967431e7dbf9b5e219/watchfiles-1.0.4.tar.gz", hash = "sha256:6ba473efd11062d73e4f00c2b730255f9c1bdd73cd5f9fe5b5da8dbd4a717205", size = 94625 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/14/02/22fcaed0396730b0d362bc8d1ffb3be2658fd473eecbb2ba84243e157f11/watchfiles-1.0.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:ba5bb3073d9db37c64520681dd2650f8bd40902d991e7b4cfaeece3e32561d08", size = 395212 },
- { url = "https://files.pythonhosted.org/packages/e9/3d/ec5a2369a46edf3ebe092c39d9ae48e8cb6dacbde51c4b4f98936c524269/watchfiles-1.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9f25d0ba0fe2b6d2c921cf587b2bf4c451860086534f40c384329fb96e2044d1", size = 384815 },
- { url = "https://files.pythonhosted.org/packages/df/b4/898991cececbe171e67142c31905510203649569d9817848f47c4177ee42/watchfiles-1.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47eb32ef8c729dbc4f4273baece89398a4d4b5d21a1493efea77a17059f4df8a", size = 450680 },
- { url = "https://files.pythonhosted.org/packages/58/f7/d4aa3000e812cfb5e5c2c6c0a3ec9d0a46a42489a8727edd160631c4e210/watchfiles-1.0.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:076f293100db3b0b634514aa0d294b941daa85fc777f9c698adb1009e5aca0b1", size = 455923 },
- { url = "https://files.pythonhosted.org/packages/dd/95/7e2e4c6aba1b02fb5c76d2f6a450b85215921ec5f8f7ad5efd075369563f/watchfiles-1.0.4-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1eacd91daeb5158c598fe22d7ce66d60878b6294a86477a4715154990394c9b3", size = 482339 },
- { url = "https://files.pythonhosted.org/packages/bb/67/4265b0fabcc2ef2c9e3e8802ba7908cf718a357ebfb49c72e53787156a48/watchfiles-1.0.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:13c2ce7b72026cfbca120d652f02c7750f33b4c9395d79c9790b27f014c8a5a2", size = 519908 },
- { url = "https://files.pythonhosted.org/packages/0d/96/b57802d5f8164bdf070befb4fd3dec4edba5a364ec0670965a97eb8098ce/watchfiles-1.0.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:90192cdc15ab7254caa7765a98132a5a41471cf739513cc9bcf7d2ffcc0ec7b2", size = 501410 },
- { url = "https://files.pythonhosted.org/packages/8b/18/6db0de4e8911ba14e31853201b40c0fa9fea5ecf3feb86b0ad58f006dfc3/watchfiles-1.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:278aaa395f405972e9f523bd786ed59dfb61e4b827856be46a42130605fd0899", size = 452876 },
- { url = "https://files.pythonhosted.org/packages/df/df/092a961815edf723a38ba2638c49491365943919c3526cc9cf82c42786a6/watchfiles-1.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a462490e75e466edbb9fc4cd679b62187153b3ba804868452ef0577ec958f5ff", size = 615353 },
- { url = "https://files.pythonhosted.org/packages/f3/cf/b85fe645de4ff82f3f436c5e9032379fce37c303f6396a18f9726cc34519/watchfiles-1.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8d0d0630930f5cd5af929040e0778cf676a46775753e442a3f60511f2409f48f", size = 613187 },
- { url = "https://files.pythonhosted.org/packages/f6/d4/a9fea27aef4dd69689bc3556718c1157a7accb72aa035ece87c1fa8483b5/watchfiles-1.0.4-cp310-cp310-win32.whl", hash = "sha256:cc27a65069bcabac4552f34fd2dce923ce3fcde0721a16e4fb1b466d63ec831f", size = 270799 },
- { url = "https://files.pythonhosted.org/packages/df/02/dbe9d4439f15dd4ad0720b6e039bde9d66d1f830331f34c18eb70fa6608e/watchfiles-1.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:8b1f135238e75d075359cf506b27bf3f4ca12029c47d3e769d8593a2024ce161", size = 284145 },
- { url = "https://files.pythonhosted.org/packages/0f/bb/8461adc4b1fed009546fb797fc0d5698dcfe5e289cb37e1b8f16a93cdc30/watchfiles-1.0.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:2a9f93f8439639dc244c4d2902abe35b0279102bca7bbcf119af964f51d53c19", size = 394869 },
- { url = "https://files.pythonhosted.org/packages/55/88/9ebf36b3547176d1709c320de78c1fa3263a46be31b5b1267571d9102686/watchfiles-1.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9eea33ad8c418847dd296e61eb683cae1c63329b6d854aefcd412e12d94ee235", size = 384905 },
- { url = "https://files.pythonhosted.org/packages/03/8a/04335ce23ef78d8c69f0913e8b20cf7d9233e3986543aeef95ef2d6e43d2/watchfiles-1.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:31f1a379c9dcbb3f09cf6be1b7e83b67c0e9faabed0471556d9438a4a4e14202", size = 449944 },
- { url = "https://files.pythonhosted.org/packages/17/4e/c8d5dcd14fe637f4633616dabea8a4af0a10142dccf3b43e0f081ba81ab4/watchfiles-1.0.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ab594e75644421ae0a2484554832ca5895f8cab5ab62de30a1a57db460ce06c6", size = 456020 },
- { url = "https://files.pythonhosted.org/packages/5e/74/3e91e09e1861dd7fbb1190ce7bd786700dc0fbc2ccd33bb9fff5de039229/watchfiles-1.0.4-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fc2eb5d14a8e0d5df7b36288979176fbb39672d45184fc4b1c004d7c3ce29317", size = 482983 },
- { url = "https://files.pythonhosted.org/packages/a1/3d/e64de2d1ce4eb6a574fd78ce3a28c279da263be9ef3cfcab6f708df192f2/watchfiles-1.0.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f68d8e9d5a321163ddacebe97091000955a1b74cd43724e346056030b0bacee", size = 520320 },
- { url = "https://files.pythonhosted.org/packages/2c/bd/52235f7063b57240c66a991696ed27e2a18bd6fcec8a1ea5a040b70d0611/watchfiles-1.0.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9ce064e81fe79faa925ff03b9f4c1a98b0bbb4a1b8c1b015afa93030cb21a49", size = 500988 },
- { url = "https://files.pythonhosted.org/packages/3a/b0/ff04194141a5fe650c150400dd9e42667916bc0f52426e2e174d779b8a74/watchfiles-1.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b77d5622ac5cc91d21ae9c2b284b5d5c51085a0bdb7b518dba263d0af006132c", size = 452573 },
- { url = "https://files.pythonhosted.org/packages/3d/9d/966164332c5a178444ae6d165082d4f351bd56afd9c3ec828eecbf190e6a/watchfiles-1.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1941b4e39de9b38b868a69b911df5e89dc43767feeda667b40ae032522b9b5f1", size = 615114 },
- { url = "https://files.pythonhosted.org/packages/94/df/f569ae4c1877f96ad4086c153a8eee5a19a3b519487bf5c9454a3438c341/watchfiles-1.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4f8c4998506241dedf59613082d1c18b836e26ef2a4caecad0ec41e2a15e4226", size = 613076 },
- { url = "https://files.pythonhosted.org/packages/15/ae/8ce5f29e65d5fa5790e3c80c289819c55e12be2e1b9f5b6a0e55e169b97d/watchfiles-1.0.4-cp311-cp311-win32.whl", hash = "sha256:4ebbeca9360c830766b9f0df3640b791be569d988f4be6c06d6fae41f187f105", size = 271013 },
- { url = "https://files.pythonhosted.org/packages/a4/c6/79dc4a7c598a978e5fafa135090aaf7bbb03b8dec7bada437dfbe578e7ed/watchfiles-1.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:05d341c71f3d7098920f8551d4df47f7b57ac5b8dad56558064c3431bdfc0b74", size = 284229 },
- { url = "https://files.pythonhosted.org/packages/37/3d/928633723211753f3500bfb138434f080363b87a1b08ca188b1ce54d1e05/watchfiles-1.0.4-cp311-cp311-win_arm64.whl", hash = "sha256:32b026a6ab64245b584acf4931fe21842374da82372d5c039cba6bf99ef722f3", size = 276824 },
- { url = "https://files.pythonhosted.org/packages/5b/1a/8f4d9a1461709756ace48c98f07772bc6d4519b1e48b5fa24a4061216256/watchfiles-1.0.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:229e6ec880eca20e0ba2f7e2249c85bae1999d330161f45c78d160832e026ee2", size = 391345 },
- { url = "https://files.pythonhosted.org/packages/bc/d2/6750b7b3527b1cdaa33731438432e7238a6c6c40a9924049e4cebfa40805/watchfiles-1.0.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5717021b199e8353782dce03bd8a8f64438832b84e2885c4a645f9723bf656d9", size = 381515 },
- { url = "https://files.pythonhosted.org/packages/4e/17/80500e42363deef1e4b4818729ed939aaddc56f82f4e72b2508729dd3c6b/watchfiles-1.0.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0799ae68dfa95136dde7c472525700bd48777875a4abb2ee454e3ab18e9fc712", size = 449767 },
- { url = "https://files.pythonhosted.org/packages/10/37/1427fa4cfa09adbe04b1e97bced19a29a3462cc64c78630787b613a23f18/watchfiles-1.0.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:43b168bba889886b62edb0397cab5b6490ffb656ee2fcb22dec8bfeb371a9e12", size = 455677 },
- { url = "https://files.pythonhosted.org/packages/c5/7a/39e9397f3a19cb549a7d380412fd9e507d4854eddc0700bfad10ef6d4dba/watchfiles-1.0.4-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fb2c46e275fbb9f0c92e7654b231543c7bbfa1df07cdc4b99fa73bedfde5c844", size = 482219 },
- { url = "https://files.pythonhosted.org/packages/45/2d/7113931a77e2ea4436cad0c1690c09a40a7f31d366f79c6f0a5bc7a4f6d5/watchfiles-1.0.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:857f5fc3aa027ff5e57047da93f96e908a35fe602d24f5e5d8ce64bf1f2fc733", size = 518830 },
- { url = "https://files.pythonhosted.org/packages/f9/1b/50733b1980fa81ef3c70388a546481ae5fa4c2080040100cd7bf3bf7b321/watchfiles-1.0.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55ccfd27c497b228581e2838d4386301227fc0cb47f5a12923ec2fe4f97b95af", size = 497997 },
- { url = "https://files.pythonhosted.org/packages/2b/b4/9396cc61b948ef18943e7c85ecfa64cf940c88977d882da57147f62b34b1/watchfiles-1.0.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c11ea22304d17d4385067588123658e9f23159225a27b983f343fcffc3e796a", size = 452249 },
- { url = "https://files.pythonhosted.org/packages/fb/69/0c65a5a29e057ad0dc691c2fa6c23b2983c7dabaa190ba553b29ac84c3cc/watchfiles-1.0.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:74cb3ca19a740be4caa18f238298b9d472c850f7b2ed89f396c00a4c97e2d9ff", size = 614412 },
- { url = "https://files.pythonhosted.org/packages/7f/b9/319fcba6eba5fad34327d7ce16a6b163b39741016b1996f4a3c96b8dd0e1/watchfiles-1.0.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c7cce76c138a91e720d1df54014a047e680b652336e1b73b8e3ff3158e05061e", size = 611982 },
- { url = "https://files.pythonhosted.org/packages/f1/47/143c92418e30cb9348a4387bfa149c8e0e404a7c5b0585d46d2f7031b4b9/watchfiles-1.0.4-cp312-cp312-win32.whl", hash = "sha256:b045c800d55bc7e2cadd47f45a97c7b29f70f08a7c2fa13241905010a5493f94", size = 271822 },
- { url = "https://files.pythonhosted.org/packages/ea/94/b0165481bff99a64b29e46e07ac2e0df9f7a957ef13bec4ceab8515f44e3/watchfiles-1.0.4-cp312-cp312-win_amd64.whl", hash = "sha256:c2acfa49dd0ad0bf2a9c0bb9a985af02e89345a7189be1efc6baa085e0f72d7c", size = 285441 },
- { url = "https://files.pythonhosted.org/packages/11/de/09fe56317d582742d7ca8c2ca7b52a85927ebb50678d9b0fa8194658f536/watchfiles-1.0.4-cp312-cp312-win_arm64.whl", hash = "sha256:22bb55a7c9e564e763ea06c7acea24fc5d2ee5dfc5dafc5cfbedfe58505e9f90", size = 277141 },
- { url = "https://files.pythonhosted.org/packages/6f/06/175d5ac6b838fb319008c0cd981d7bf289317c510154d411d3584ca2b67b/watchfiles-1.0.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cdcc92daeae268de1acf5b7befcd6cfffd9a047098199056c72e4623f531de18", size = 396269 },
- { url = "https://files.pythonhosted.org/packages/86/ee/5db93b0b57dc0587abdbac4149296ee73275f615d790a82cb5598af0557f/watchfiles-1.0.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d8d3d9203705b5797f0af7e7e5baa17c8588030aaadb7f6a86107b7247303817", size = 386010 },
- { url = "https://files.pythonhosted.org/packages/75/61/fe0dc5fedf152bfc085a53711f740701f6bdb8ab6b5c950402b681d4858b/watchfiles-1.0.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bdef5a1be32d0b07dcea3318a0be95d42c98ece24177820226b56276e06b63b0", size = 450913 },
- { url = "https://files.pythonhosted.org/packages/9f/dd/3c7731af3baf1a9957afc643d176f94480921a690ec3237c9f9d11301c08/watchfiles-1.0.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:342622287b5604ddf0ed2d085f3a589099c9ae8b7331df3ae9845571586c4f3d", size = 453474 },
+name = "watchdog"
+version = "6.0.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282", size = 131220 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/0c/56/90994d789c61df619bfc5ce2ecdabd5eeff564e1eb47512bd01b5e019569/watchdog-6.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d1cdb490583ebd691c012b3d6dae011000fe42edb7a82ece80965b42abd61f26", size = 96390 },
+ { url = "https://files.pythonhosted.org/packages/55/46/9a67ee697342ddf3c6daa97e3a587a56d6c4052f881ed926a849fcf7371c/watchdog-6.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc64ab3bdb6a04d69d4023b29422170b74681784ffb9463ed4870cf2f3e66112", size = 88389 },
+ { url = "https://files.pythonhosted.org/packages/44/65/91b0985747c52064d8701e1075eb96f8c40a79df889e59a399453adfb882/watchdog-6.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c897ac1b55c5a1461e16dae288d22bb2e412ba9807df8397a635d88f671d36c3", size = 89020 },
+ { url = "https://files.pythonhosted.org/packages/e0/24/d9be5cd6642a6aa68352ded4b4b10fb0d7889cb7f45814fb92cecd35f101/watchdog-6.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6eb11feb5a0d452ee41f824e271ca311a09e250441c262ca2fd7ebcf2461a06c", size = 96393 },
+ { url = "https://files.pythonhosted.org/packages/63/7a/6013b0d8dbc56adca7fdd4f0beed381c59f6752341b12fa0886fa7afc78b/watchdog-6.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ef810fbf7b781a5a593894e4f439773830bdecb885e6880d957d5b9382a960d2", size = 88392 },
+ { url = "https://files.pythonhosted.org/packages/d1/40/b75381494851556de56281e053700e46bff5b37bf4c7267e858640af5a7f/watchdog-6.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:afd0fe1b2270917c5e23c2a65ce50c2a4abb63daafb0d419fde368e272a76b7c", size = 89019 },
+ { url = "https://files.pythonhosted.org/packages/39/ea/3930d07dafc9e286ed356a679aa02d777c06e9bfd1164fa7c19c288a5483/watchdog-6.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948", size = 96471 },
+ { url = "https://files.pythonhosted.org/packages/12/87/48361531f70b1f87928b045df868a9fd4e253d9ae087fa4cf3f7113be363/watchdog-6.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c7c15dda13c4eb00d6fb6fc508b3c0ed88b9d5d374056b239c4ad1611125c860", size = 88449 },
+ { url = "https://files.pythonhosted.org/packages/5b/7e/8f322f5e600812e6f9a31b75d242631068ca8f4ef0582dd3ae6e72daecc8/watchdog-6.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f10cb2d5902447c7d0da897e2c6768bca89174d0c6e1e30abec5421af97a5b0", size = 89054 },
+ { url = "https://files.pythonhosted.org/packages/30/ad/d17b5d42e28a8b91f8ed01cb949da092827afb9995d4559fd448d0472763/watchdog-6.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:c7ac31a19f4545dd92fc25d200694098f42c9a8e391bc00bdd362c5736dbf881", size = 87902 },
+ { url = "https://files.pythonhosted.org/packages/5c/ca/c3649991d140ff6ab67bfc85ab42b165ead119c9e12211e08089d763ece5/watchdog-6.0.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9513f27a1a582d9808cf21a07dae516f0fab1cf2d7683a742c498b93eedabb11", size = 88380 },
+ { url = "https://files.pythonhosted.org/packages/a9/c7/ca4bf3e518cb57a686b2feb4f55a1892fd9a3dd13f470fca14e00f80ea36/watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13", size = 79079 },
+ { url = "https://files.pythonhosted.org/packages/5c/51/d46dc9332f9a647593c947b4b88e2381c8dfc0942d15b8edc0310fa4abb1/watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379", size = 79078 },
+ { url = "https://files.pythonhosted.org/packages/d4/57/04edbf5e169cd318d5f07b4766fee38e825d64b6913ca157ca32d1a42267/watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e", size = 79076 },
+ { url = "https://files.pythonhosted.org/packages/ab/cc/da8422b300e13cb187d2203f20b9253e91058aaf7db65b74142013478e66/watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f", size = 79077 },
+ { url = "https://files.pythonhosted.org/packages/2c/3b/b8964e04ae1a025c44ba8e4291f86e97fac443bca31de8bd98d3263d2fcf/watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26", size = 79078 },
+ { url = "https://files.pythonhosted.org/packages/62/ae/a696eb424bedff7407801c257d4b1afda455fe40821a2be430e173660e81/watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c", size = 79077 },
+ { url = "https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2", size = 79078 },
+ { url = "https://files.pythonhosted.org/packages/07/f6/d0e5b343768e8bcb4cda79f0f2f55051bf26177ecd5651f84c07567461cf/watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a", size = 79065 },
+ { url = "https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680", size = 79070 },
+ { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067 },
+]
+
+[[package]]
+name = "wcmatch"
+version = "10.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "bracex" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/41/ab/b3a52228538ccb983653c446c1656eddf1d5303b9cb8b9aef6a91299f862/wcmatch-10.0.tar.gz", hash = "sha256:e72f0de09bba6a04e0de70937b0cf06e55f36f37b3deb422dfaf854b867b840a", size = 115578 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ab/df/4ee467ab39cc1de4b852c212c1ed3becfec2e486a51ac1ce0091f85f38d7/wcmatch-10.0-py3-none-any.whl", hash = "sha256:0dd927072d03c0a6527a20d2e6ad5ba8d0380e60870c383bc533b71744df7b7a", size = 39347 },
]
[[package]]
@@ -3461,63 +3228,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", size = 34166 },
]
-[[package]]
-name = "webencodings"
-version = "0.5.1"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/0b/02/ae6ceac1baeda530866a85075641cec12989bd8d31af6d5ab4a3e8c92f47/webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923", size = 9721 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", size = 11774 },
-]
-
-[[package]]
-name = "websockets"
-version = "15.0"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/2e/7a/8bc4d15af7ff30f7ba34f9a172063bfcee9f5001d7cef04bee800a658f33/websockets-15.0.tar.gz", hash = "sha256:ca36151289a15b39d8d683fd8b7abbe26fc50be311066c5f8dcf3cb8cee107ab", size = 175574 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/3d/f1/b20cc4c1ff84911c791f36fa511a78203836bb4d603f56290de08c067437/websockets-15.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5e6ee18a53dd5743e6155b8ff7e8e477c25b29b440f87f65be8165275c87fef0", size = 174701 },
- { url = "https://files.pythonhosted.org/packages/f9/e8/4de59ee85ec86052ca574f4e5327ef948e4f77757d3c9c1503f5a0e9c039/websockets-15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ee06405ea2e67366a661ed313e14cf2a86e84142a3462852eb96348f7219cee3", size = 172358 },
- { url = "https://files.pythonhosted.org/packages/2f/ea/b0f95815cdc83d61b1a895858671c6af38a76c23f3ea5d91e2ba11bbedc7/websockets-15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8711682a629bbcaf492f5e0af72d378e976ea1d127a2d47584fa1c2c080b436b", size = 172610 },
- { url = "https://files.pythonhosted.org/packages/09/ed/c5d8f1f296f475c00611a40eff6a952248785efb125f91a0b29575f36ba6/websockets-15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94c4a9b01eede952442c088d415861b0cf2053cbd696b863f6d5022d4e4e2453", size = 181579 },
- { url = "https://files.pythonhosted.org/packages/b7/fc/2444b5ae792d92179f20cec53475bcc25d1d7f00a2be9947de9837ef230a/websockets-15.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:45535fead66e873f411c1d3cf0d3e175e66f4dd83c4f59d707d5b3e4c56541c4", size = 180588 },
- { url = "https://files.pythonhosted.org/packages/ff/b5/0945a31562d351cff26d76a2ae9a4ba4536e698aa059a4262afd793b2a1d/websockets-15.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e389efe46ccb25a1f93d08c7a74e8123a2517f7b7458f043bd7529d1a63ffeb", size = 180902 },
- { url = "https://files.pythonhosted.org/packages/b6/7c/e9d844b87754bc83b294cc1c695cbc6c5d42e329b85d2bf2d7bb9554d09c/websockets-15.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:67a04754d121ea5ca39ddedc3f77071651fb5b0bc6b973c71c515415b44ed9c5", size = 181282 },
- { url = "https://files.pythonhosted.org/packages/9e/6c/6a5d3272f494fa2fb4806b896ecb312bd6c72bab632df4ace19946c079dc/websockets-15.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:bd66b4865c8b853b8cca7379afb692fc7f52cf898786537dfb5e5e2d64f0a47f", size = 180694 },
- { url = "https://files.pythonhosted.org/packages/b2/32/1fb4b62c2ec2c9844d4ddaa4021d993552c7c493a0acdcec95551679d501/websockets-15.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a4cc73a6ae0a6751b76e69cece9d0311f054da9b22df6a12f2c53111735657c8", size = 180631 },
- { url = "https://files.pythonhosted.org/packages/e4/9b/5ef1ddb8857ce894217bdd9572ad98c1cef20d8f9f0f43823b782b7ded6b/websockets-15.0-cp310-cp310-win32.whl", hash = "sha256:89da58e4005e153b03fe8b8794330e3f6a9774ee9e1c3bd5bc52eb098c3b0c4f", size = 175664 },
- { url = "https://files.pythonhosted.org/packages/29/63/c320572ccf813ed2bc3058a0e0291ee95eb258dc5e6b3446ca45dc1af0fd/websockets-15.0-cp310-cp310-win_amd64.whl", hash = "sha256:4ff380aabd7a74a42a760ee76c68826a8f417ceb6ea415bd574a035a111fd133", size = 176109 },
- { url = "https://files.pythonhosted.org/packages/ee/16/81a7403c8c0a33383de647e89c07824ea6a654e3877d6ff402cbae298cb8/websockets-15.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:dd24c4d256558429aeeb8d6c24ebad4e982ac52c50bc3670ae8646c181263965", size = 174702 },
- { url = "https://files.pythonhosted.org/packages/ef/40/4629202386a3bf1195db9fe41baeb1d6dfd8d72e651d9592d81dae7fdc7c/websockets-15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f83eca8cbfd168e424dfa3b3b5c955d6c281e8fc09feb9d870886ff8d03683c7", size = 172359 },
- { url = "https://files.pythonhosted.org/packages/7b/33/dfb650e822bc7912d8c542c452497867af91dec81e7b5bf96aca5b419d58/websockets-15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4095a1f2093002c2208becf6f9a178b336b7572512ee0a1179731acb7788e8ad", size = 172604 },
- { url = "https://files.pythonhosted.org/packages/2e/52/666743114513fcffd43ee5df261a1eb5d41f8e9861b7a190b730732c19ba/websockets-15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb915101dfbf318486364ce85662bb7b020840f68138014972c08331458d41f3", size = 182145 },
- { url = "https://files.pythonhosted.org/packages/9c/63/5273f146b13aa4a057a95ab0855d9990f3a1ced63693f4365135d1abfacc/websockets-15.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:45d464622314973d78f364689d5dbb9144e559f93dca11b11af3f2480b5034e1", size = 181152 },
- { url = "https://files.pythonhosted.org/packages/0f/ae/075697f3f97de7c26b73ae96d952e13fa36393e0db3f028540b28954e0a9/websockets-15.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ace960769d60037ca9625b4c578a6f28a14301bd2a1ff13bb00e824ac9f73e55", size = 181523 },
- { url = "https://files.pythonhosted.org/packages/25/87/06d091bbcbe01903bed3dad3bb4a1a3c516f61e611ec31fffb28abe4974b/websockets-15.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c7cd4b1015d2f60dfe539ee6c95bc968d5d5fad92ab01bb5501a77393da4f596", size = 181791 },
- { url = "https://files.pythonhosted.org/packages/77/08/5063b6cc1b2aa1fba2ee3b578b777db22fde7145f121d07fd878811e983b/websockets-15.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4f7290295794b5dec470867c7baa4a14182b9732603fd0caf2a5bf1dc3ccabf3", size = 181231 },
- { url = "https://files.pythonhosted.org/packages/86/ff/af23084df0a7405bb2add12add8c17d6192a8de9480f1b90d12352ba2b7d/websockets-15.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3abd670ca7ce230d5a624fd3d55e055215d8d9b723adee0a348352f5d8d12ff4", size = 181191 },
- { url = "https://files.pythonhosted.org/packages/21/ce/b2bdfcf49201dee0b899edc6a814755763ec03d74f2714923d38453a9e8d/websockets-15.0-cp311-cp311-win32.whl", hash = "sha256:110a847085246ab8d4d119632145224d6b49e406c64f1bbeed45c6f05097b680", size = 175666 },
- { url = "https://files.pythonhosted.org/packages/8d/7b/444edcd5365538c226b631897975a65bbf5ccf27c77102e17d8f12a306ea/websockets-15.0-cp311-cp311-win_amd64.whl", hash = "sha256:8d7bbbe2cd6ed80aceef2a14e9f1c1b61683194c216472ed5ff33b700e784e37", size = 176105 },
- { url = "https://files.pythonhosted.org/packages/22/1e/92c4547d7b2a93f848aedaf37e9054111bc00dc11bff4385ca3f80dbb412/websockets-15.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:cccc18077acd34c8072578394ec79563664b1c205f7a86a62e94fafc7b59001f", size = 174709 },
- { url = "https://files.pythonhosted.org/packages/9f/37/eae4830a28061ba552516d84478686b637cd9e57d6a90b45ad69e89cb0af/websockets-15.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d4c22992e24f12de340ca5f824121a5b3e1a37ad4360b4e1aaf15e9d1c42582d", size = 172372 },
- { url = "https://files.pythonhosted.org/packages/46/2f/b409f8b8aa9328d5a47f7a301a43319d540d70cf036d1e6443675978a988/websockets-15.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1206432cc6c644f6fc03374b264c5ff805d980311563202ed7fef91a38906276", size = 172607 },
- { url = "https://files.pythonhosted.org/packages/d6/81/d7e2e4542d4b4df849b0110df1b1f94f2647b71ab4b65d672090931ad2bb/websockets-15.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d3cc75ef3e17490042c47e0523aee1bcc4eacd2482796107fd59dd1100a44bc", size = 182422 },
- { url = "https://files.pythonhosted.org/packages/b6/91/3b303160938d123eea97f58be363f7dbec76e8c59d587e07b5bc257dd584/websockets-15.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b89504227a5311610e4be16071465885a0a3d6b0e82e305ef46d9b064ce5fb72", size = 181362 },
- { url = "https://files.pythonhosted.org/packages/f2/8b/df6807f1ca339c567aba9a7ab03bfdb9a833f625e8d2b4fc7529e4c701de/websockets-15.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56e3efe356416bc67a8e093607315951d76910f03d2b3ad49c4ade9207bf710d", size = 181787 },
- { url = "https://files.pythonhosted.org/packages/21/37/e6d3d5ebb0ebcaf98ae84904205c9dcaf3e0fe93e65000b9f08631ed7309/websockets-15.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0f2205cdb444a42a7919690238fb5979a05439b9dbb73dd47c863d39640d85ab", size = 182058 },
- { url = "https://files.pythonhosted.org/packages/c9/df/6aca296f2be4c638ad20908bb3d7c94ce7afc8d9b4b2b0780d1fc59b359c/websockets-15.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:aea01f40995fa0945c020228ab919b8dfc93fc8a9f2d3d705ab5b793f32d9e99", size = 181434 },
- { url = "https://files.pythonhosted.org/packages/88/f1/75717a982bab39bbe63c83f9df0e7753e5c98bab907eb4fb5d97fe5c8c11/websockets-15.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a9f8e33747b1332db11cf7fcf4a9512bef9748cb5eb4d3f7fbc8c30d75dc6ffc", size = 181431 },
- { url = "https://files.pythonhosted.org/packages/e7/15/cee9e63ed9ac5bfc1a3ae8fc6c02c41745023c21eed622eef142d8fdd749/websockets-15.0-cp312-cp312-win32.whl", hash = "sha256:32e02a2d83f4954aa8c17e03fe8ec6962432c39aca4be7e8ee346b05a3476904", size = 175678 },
- { url = "https://files.pythonhosted.org/packages/4e/00/993974c60f40faabb725d4dbae8b072ef73b4c4454bd261d3b1d34ace41f/websockets-15.0-cp312-cp312-win_amd64.whl", hash = "sha256:ffc02b159b65c05f2ed9ec176b715b66918a674bd4daed48a9a7a590dd4be1aa", size = 176119 },
- { url = "https://files.pythonhosted.org/packages/42/52/359467c7ca12721a04520da9ba9fc29da2cd176c30992f6f81fa881bb3e5/websockets-15.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b499caef4bca9cbd0bd23cd3386f5113ee7378094a3cb613a2fa543260fe9506", size = 172384 },
- { url = "https://files.pythonhosted.org/packages/7c/ff/36fd8a45fac404d8f109e03ca06328f49847d71c0c048414c76bb2db91c4/websockets-15.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:17f2854c6bd9ee008c4b270f7010fe2da6c16eac5724a175e75010aacd905b31", size = 172616 },
- { url = "https://files.pythonhosted.org/packages/b1/a8/65496a87984815e2837835d5ac3c9f81ea82031036877e8f80953c59dbd9/websockets-15.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89f72524033abbfde880ad338fd3c2c16e31ae232323ebdfbc745cbb1b3dcc03", size = 173871 },
- { url = "https://files.pythonhosted.org/packages/23/89/9441e1e0818d46fe22d78b3e5c8fe2316516211330e138231c90dce5559e/websockets-15.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1657a9eecb29d7838e3b415458cc494e6d1b194f7ac73a34aa55c6fb6c72d1f3", size = 173477 },
- { url = "https://files.pythonhosted.org/packages/2f/1b/80460b3ac9795ef7bbaa074c603d64e009dbb2ceb11008416efab0dcc811/websockets-15.0-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e413352a921f5ad5d66f9e2869b977e88d5103fc528b6deb8423028a2befd842", size = 173425 },
- { url = "https://files.pythonhosted.org/packages/56/d1/8da7e733ed266f342e8c544c3b8338449de9b860d85d9a0bfd4fe1857d6e/websockets-15.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:8561c48b0090993e3b2a54db480cab1d23eb2c5735067213bb90f402806339f5", size = 176160 },
- { url = "https://files.pythonhosted.org/packages/e8/b2/31eec524b53f01cd8343f10a8e429730c52c1849941d1f530f8253b6d934/websockets-15.0-py3-none-any.whl", hash = "sha256:51ffd53c53c4442415b613497a34ba0aa7b99ac07f1e4a62db5dcd640ae6c3c3", size = 169023 },
-]
-
[[package]]
name = "widgetsnbextension"
version = "4.0.13"