diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..176a458f --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +* text=auto diff --git a/.github/labels.yml b/.github/labels.yml index d8fc68e1..bd982896 100644 --- a/.github/labels.yml +++ b/.github/labels.yml @@ -67,3 +67,6 @@ - name: skip-changelog description: Changes that should be omitted from the release notes color: "#ededed" +- name: DEPENDABOT + description: Pull requests created by Dependabot + color: "#ff00b3" diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 0bafff61..a01caf7e 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,22 +1,49 @@ -**PR Checklist** +# PR Checklist for all PRs - [ ] This comment contains a description of changes (with reason) - [ ] Referenced issue is linked - [ ] If you've fixed a bug or added code that should be tested, add tests! -- [ ] Documentation in `docs` is updated - -**Description of changes** - - - -**Technical details** - - - -**Additional context** - - +- [ ] Documentation in `docs` is updated. If you've created a new file, add it to the API documentation pages. + + + +### Changes + +### Bug fixes + +### New features + +### Maintenance + +## Version release checklist + +- [ ] Update the version in pyproject.toml +- [ ] Update version/release in docs/conf.py +- [ ] Run ‚poetry update‘ to get the latest package versions. This will update the poetry.lock file +- [ ] Run ‚poetry export --without-hashes --without development -f requirements.txt -o requirements.txt‘ to update the requirements.txt file +- [ ] (If one of the sphinx packages has been updated, you also need to update docs/requirements.txt) +- [ ] (If poetry itself was updated, update that in the Dockerfile and installation.rst) +- [ ] If you updated the python version: + - [ ] Update the Dockerfile so that it always runs on the latest python version. Watch out: the ‚builder‘ is the full python, the ‚runtime‘ is a slim python build. + - [ ] Update the python version in .github/workflows/: run_tests.yml, build_package.yml, publish_docs.yml, python-package.yml + - [ ] Update the python version in noxfile.py + - [ ] Update the documentation: contributing.rst, installation.rst + +Then, + +1. Open a PR from development to main with these changes. +2. Wait for a review and merge. +3. Create a new release on GitHub with the version number. Update the release notes with the changes made in this version. +4. If the Docker github action fails (e.g., no space left on device), you can do it manually: + - Enable Docker buildx locally. If you don't have a builder that supports multi-arch, create one: + ```{bash} + docker buildx ls + docker buildx create --use --name multiarch-builder + docker buildx inspect --bootstrap + ``` + - Login to ghcr `docker login --username --password ghcr.io` + - Build the multi-platform image, insert the correct version `docker buildx build --platform linux/amd64,linux/arm64 -t ghcr.io/daisybio/drevalpy:v -t ghcr.io/daisybio/drevalpy:latest --push .` diff --git a/.github/workflows/build_package.yml b/.github/workflows/build_package.yml index 7a62994c..41e34156 100644 --- a/.github/workflows/build_package.yml +++ b/.github/workflows/build_package.yml @@ -9,14 +9,14 @@ jobs: strategy: matrix: os: [macos-latest, ubuntu-latest, windows-latest] - python: ["3.11", "3.12"] + python: ["3.11", "3.12", "3.13"] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 name: Check out source-code repository - name: Setup Python - uses: actions/setup-python@v5 + uses: actions/setup-python@v6 with: python-version: ${{ matrix.python }} diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml index be5f659f..b4c5562b 100644 --- a/.github/workflows/labeler.yml +++ b/.github/workflows/labeler.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out the repository - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Run Labeler uses: crazy-max/ghaction-github-labeler@v5.3.0 diff --git a/.github/workflows/publish-docker.yml b/.github/workflows/publish-docker.yml index 42c88bc5..fb31eda6 100644 --- a/.github/workflows/publish-docker.yml +++ b/.github/workflows/publish-docker.yml @@ -26,7 +26,7 @@ jobs: steps: # Necessary for buildx - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Setup QEMU uses: docker/setup-qemu-action@v3 diff --git a/.github/workflows/publish_docs.yml b/.github/workflows/publish_docs.yml index e36150e7..405fd2c8 100644 --- a/.github/workflows/publish_docs.yml +++ b/.github/workflows/publish_docs.yml @@ -7,13 +7,13 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 name: Check out source-code repository - name: Setup Python - uses: actions/setup-python@v5 + uses: actions/setup-python@v6 with: - python-version: "3.12" + python-version: "3.13" - name: Install pip run: | diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index 154424dc..0f4c79e4 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -15,14 +15,14 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.11", "3.12"] + python-version: ["3.11", "3.12", "3.13"] steps: - name: Check out the repository - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v5 + uses: actions/setup-python@v6 with: python-version: ${{ matrix.python-version }} diff --git a/.github/workflows/python-publish.yml b/.github/workflows/python-publish.yml index c60b460c..f48d63e7 100644 --- a/.github/workflows/python-publish.yml +++ b/.github/workflows/python-publish.yml @@ -20,9 +20,9 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Set up Python - uses: actions/setup-python@v5 + uses: actions/setup-python@v6 with: python-version: "3.x" - name: Install dependencies @@ -32,7 +32,7 @@ jobs: - name: Build package run: python -m build - name: Publish package - uses: pypa/gh-action-pypi-publish@76f52bc884231f62b9a034ebfe128415bbaabdfc + uses: pypa/gh-action-pypi-publish@ed0c53931b1dc9bd32cbe73a98c7f6766f8a527e with: user: __token__ password: ${{ secrets.PYPI_API_TOKEN }} diff --git a/.github/workflows/run_tests.yml b/.github/workflows/run_tests.yml index 83585bbd..54a10681 100644 --- a/.github/workflows/run_tests.yml +++ b/.github/workflows/run_tests.yml @@ -13,25 +13,25 @@ jobs: name: ${{ matrix.session }} ${{ matrix.python-version }} / ${{ matrix.os }} runs-on: ${{ matrix.os }} strategy: - fail-fast: false + fail-fast: true matrix: include: - - { python-version: "3.12", os: ubuntu-latest, session: "pre-commit" } - - { python-version: "3.12", os: ubuntu-latest, session: "mypy" } - - { python-version: "3.12", os: ubuntu-latest, session: "tests" } - - { python-version: "3.12", os: windows-latest, session: "typeguard" } - - { python-version: "3.12", os: ubuntu-latest, session: "xdoctest" } - - { python-version: "3.12", os: ubuntu-latest, session: "docs-build" } + - { python-version: "3.13", os: ubuntu-latest, session: "pre-commit" } + - { python-version: "3.13", os: ubuntu-latest, session: "mypy" } + - { python-version: "3.13", os: ubuntu-latest, session: "tests" } + - { python-version: "3.13", os: windows-latest, session: "typeguard" } + - { python-version: "3.13", os: ubuntu-latest, session: "xdoctest" } + - { python-version: "3.13", os: ubuntu-latest, session: "docs-build" } env: NOXSESSION: ${{ matrix.session }} steps: - name: Check out the repository - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v5 + uses: actions/setup-python@v6 with: python-version: ${{ matrix.python-version }} @@ -64,7 +64,7 @@ jobs: print("::set-output name=result::{}".format(result)) - name: Restore pre-commit cache - uses: actions/cache@v4.2.3 + uses: actions/cache@v5.0.2 if: matrix.session == 'pre-commit' with: path: ~/.cache/pre-commit @@ -73,11 +73,12 @@ jobs: ${{ steps.pre-commit-cache.outputs.result }}- - name: Run Nox - run: nox --force-color --python=${{ matrix.python-version }} + run: | + nox --force-color --python=${{ matrix.python-version }} - name: Upload coverage data if: always() && matrix.session == 'tests' && matrix.os == 'ubuntu-latest' - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: name: coverage-data path: ".coverage.*" @@ -85,7 +86,7 @@ jobs: - name: Upload documentation if: matrix.session == 'docs-build' - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: name: docs path: docs/_build @@ -95,12 +96,12 @@ jobs: needs: tests steps: - name: Check out the repository - uses: actions/checkout@v4 + uses: actions/checkout@v6 - - name: Set up Python 3.12 - uses: actions/setup-python@v5 + - name: Set up Python 3.13 + uses: actions/setup-python@v6 with: - python-version: 3.12 + python-version: 3.13 - name: Install Poetry run: | @@ -116,7 +117,7 @@ jobs: nox --version - name: Download coverage data - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v7 with: name: coverage-data @@ -127,6 +128,6 @@ jobs: run: nox --force-color --session=coverage -- xml -i - name: Upload coverage report - uses: codecov/codecov-action@v5.4.3 + uses: codecov/codecov-action@v5.5.2 with: token: ${{ secrets.CODECOV_TOKEN }} diff --git a/.github/workflows/safety_scan.yml b/.github/workflows/safety_scan.yml deleted file mode 100644 index e288c936..00000000 --- a/.github/workflows/safety_scan.yml +++ /dev/null @@ -1,15 +0,0 @@ -name: Safety Action - -on: - push: # Run on every push to any branch - pull_request: # Run on new pull requests - -jobs: - security: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@main - - name: Run Safety CLI to check for vulnerabilities - uses: pyupio/safety-action@v1 - with: - api-key: ${{ secrets.SAFETY_API_KEY }} diff --git a/.gitignore b/.gitignore index 54c03d7f..5e873b1f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,14 +1,11 @@ # Data -data/cell_line_input -data/response_output -data/mapping -data/GDSC1 -data/GDSC2 -data/CCLE -data/TOYv1 -data/TOYv2 -data/CTRPv1 -data/CTRPv2 +data/ + +# Results directory is created when running the demo notebook +results/ + +# Wandb directory is created when running the benchmark with wandb +wandb/ # Byte-compiled / optimized / DLL files __pycache__/ @@ -171,3 +168,4 @@ cython_debug/ # option (not recommended) you can uncomment the following to ignore the entire idea folder. #.idea/ /data/GDSC/ +.Rproj.user diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 9897a71c..fdb212c9 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -10,6 +10,7 @@ repos: - id: check-added-large-files name: Check for added large files entry: check-added-large-files + exclude: ^dreval_demo\.ipynb$ language: system - id: check-toml name: Check Toml @@ -35,7 +36,7 @@ repos: types: [python] require_serial: true args: - - --ignore=D212,W503,C901,N803,N806 + - --ignore=D212,W503,C901,N803,N806,S615,S403,S301 - id: pyupgrade name: pyupgrade description: Automatically upgrade syntax for newer versions. @@ -43,18 +44,12 @@ repos: language: system types: [python] args: [--py39-plus, --keep-runtime-typing] - - id: trailing-whitespace - name: Trim Trailing Whitespace - entry: trailing-whitespace-fixer - language: system - types: [text] - stages: [pre-commit, pre-push, manual] - repo: https://github.com/pre-commit/mirrors-prettier rev: v2.5.1 hooks: - id: prettier - repo: https://github.com/pycqa/isort - rev: 5.12.0 + rev: 6.0.1 hooks: - id: isort name: isort (python) @@ -64,3 +59,7 @@ repos: - id: isort name: isort (pyi) types: [pyi] + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v5.0.0 + hooks: + - id: trailing-whitespace diff --git a/Dockerfile b/Dockerfile index 4e2451eb..f33a98e5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,9 +2,9 @@ # https://medium.com/@albertazzir/blazing-fast-python-docker-builds-with-poetry-a78a66f5aed0 # The builder image, used to build the virtual environment -FROM python:3.11-buster AS builder +FROM python:3.13-bookworm AS builder -RUN pip install poetry==2.0.0 +RUN pip install poetry==2.3.2 # POETRY_CACHE_DIR: When removing the cache folder, make sure this is done in the same RUN command. If it’s done in a # separate RUN command, the cache will still be part of the previous Docker layer (the one containing poetry install ) @@ -25,21 +25,19 @@ RUN touch README.md RUN poetry install --without development --no-root && rm -rf $POETRY_CACHE_DIR # The runtime image, used to run the code -FROM python:3.11-slim-buster AS runtime +FROM python:3.13-slim-bookworm AS runtime LABEL image.author.name="Judith Bernett" LABEL image.author.email="judith.bernett@tum.de" # Copy installed dependencies from the builder image -COPY --from=builder /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages +COPY --from=builder /usr/local/lib/python3.13/site-packages /usr/local/lib/python3.13/site-packages COPY --from=builder /usr/local/bin /usr/local/bin # Copy all relevant code COPY drevalpy ./drevalpy -COPY create_report.py ./ COPY README.md ./ -COPY run_suite.py ./ COPY pyproject.toml ./ COPY poetry.lock ./ @@ -47,4 +45,4 @@ COPY poetry.lock ./ RUN pip install . # Nextflow needs the command ps to be available -RUN apt-get update && apt-get install -y procps && rm -rf /var/lib/apt/lists/* +RUN apt-get update && apt-get install -y procps unzip && rm -rf /var/lib/apt/lists/* diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..fe22729a --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 Judith Bernett, Pascal Iversen + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/LICENSE.txt b/LICENSE.txt deleted file mode 100644 index f288702d..00000000 --- a/LICENSE.txt +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/README.md b/README.md index 277b6b3d..68d933c0 100644 --- a/README.md +++ b/README.md @@ -7,10 +7,13 @@ [![Test status](https://github.com/daisybio/drevalpy/actions/workflows/run_tests.yml/badge.svg)](https://github.com/daisybio/drevalpy/actions?workflow=Tests) [![Precommit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white)](https://github.com/pre-commit/pre-commit) [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) +[![DOI](https://zenodo.org/badge/727156477.svg)](https://doi.org/10.5281/zenodo.18302237) + +**News:** Our preprint is out on [biorxiv](https://www.biorxiv.org/content/10.1101/2025.05.26.655288v1)! Documentation at [ReadTheDocs](https://drevalpy.readthedocs.io/en/latest/index.html#). -Focus on Innovating Your Models — DrEval Handles the Rest! +**Focus on Innovating Your Models — DrEval Handles the Rest!** - DrEval is a toolkit that ensures drug response prediction evaluations are statistically sound, biologically meaningful, and reproducible. - Focus on model innovation while using our automated standardized evaluation protocols and preprocessing workflows. @@ -20,26 +23,41 @@ By contributing your model to the DrEval catalog, you can increase your work's e ![DrEval](docs/_static/img/overview.png) -Use DrEval to Build Drug Response Models That Have an Impact +--- - 1. Maintained, up-to-date baseline catalog, no need to re-implement literature models +Use DrEval to build drug response models that have an impact - 2. Gold standard datasets for benchmarking +1. Maintained, up-to-date baseline catalog, no need to re-implement literature models +2. Gold standard datasets for benchmarking +3. Consistent application-driven evaluation +4. Ablation studies with permutation tests +5. Cross-study evaluation for generalization analysis +6. Optimized nextflow pipeline for fast experiments +7. Easy-to-use hyperparameter tuning +8. Paper-ready visualizations to display performance - 3. Consistent application-driven evaluation +--- - 4. Ablation studies with permutation tests + + + + DrEvalPy Leaderboard + - 5. Cross-study evaluation for generalization analysis +--- - 6. Optimized nextflow pipeline for fast experiments +This project is a collaboration of the Technical University of Munich (TUM, Germany) +and the Freie Universität Berlin (FU, Germany). - 7. Easy-to-use hyperparameter tuning +## Demo - 8. Paper-ready visualizations to display performance +Check out our demo notebook in Colab: +[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/daisybio/drevalpy/blob/development/dreval_colab_demo.ipynb) -This project is a collaboration of the Technical University of Munich (TUM, Germany) -and the Freie Universität Berlin (FU, Germany). +Expected runtime on a normal machine: + +- Standalone demo: 38 minutes +- Nextflow demo: 5 minutes ## Installation @@ -49,6 +67,14 @@ Using pip: pip install drevalpy ``` +Optional Ray Tune support (for parallel hyperparameter tuning): + +```bash +pip install drevalpy[multiprocessing] +``` + +On a regular machine, the installation should take about a minute. + Using docker: ```bash @@ -61,60 +87,177 @@ From source: git clone https://github.com/daisybio/drevalpy.git cd drevalpy pip install poetry +pip install poetry-plugin-export poetry install ``` +Check your installation by running in your console: + +```bash +drevalpy --help +``` + ## Quickstart To run models from the catalog, you can run: ```bash -python run_suite.py --run_id my_first_run --models ElasticNet SimpleNeuralNetwork --dataset GDSC2 --test_mode LCO +drevalpy --run_id my_first_run --models NaiveTissueMeanPredictor NaiveDrugMeanPredictor --dataset TOYv1 --test_mode LCO ``` -This will train and tune a neural network and an elastic net model on gene expression features and drug fingerprint -features to predict IC50 values of the GDSC2 database. It will evaluate in "LCO" which is the leave-cell-line-out -splitting strategy using 5 fold cross validation. +This will download a small toy drug response dataset, train our baseline models which just predict the drug or tissue means or the mean drug and cell line effects. +It will evaluate in "LCO" which is the leave-cell-line-out splitting strategy using 7 fold cross validation. The results will be stored in ```bash -results/my_first_run/LCO +results/my_first_run/TOYv1/LCO ``` You can visualize them using ```bash -python create_report.py --run_id my_first_run --dataset GDSC2 +drevalpy-report --run_id my_first_run --dataset TOYv1 ``` -This will create an index.html file which you can open in your webbrowser. +This will create an index.html file in the results directory which you can open in your web browser. You can also run a drug response experiment using Python: ```python +from drevalpy.experiment import drug_response_experiment +from drevalpy.models import MODEL_FACTORY +from drevalpy.datasets import AVAILABLE_DATASETS from drevalpy.experiment import drug_response_experiment +naive_mean = MODEL_FACTORY["NaivePredictor"] # a naive model that just predicts the training mean +enet = MODEL_FACTORY["ElasticNet"] # An Elastic Net based on drug fingerprints and gene expression of 1000 landmark genes +simple_nn = MODEL_FACTORY["SimpleNeuralNetwork"] # A neural network based on drug fingerprints and gene expression of 1000 landmark genes + +toyv1 = AVAILABLE_DATASETS["TOYv1"](path_data="data") + drug_response_experiment( - models=["MultiOmicsNeuralNetwork"], - baselines=["RandomForest"], - response_data="GDSC1", - metric="mse", - n_cv_splits=5, - test_mode="LPO", - run_id="my_second_run", - ) + models=[enet, simple_nn], + baselines=[naive_mean], # Ablation studies and robustness tests are not run for baselines. + response_data=toyv1, + n_cv_splits=2, # the number of cross validation splits. Should be higher in practice :) + test_mode="LCO", # LCO means Leave-Cell-Line out. This means that the test and validation splits only contain unseed cell lines. + run_id="my_first_run", + path_data="data", # where the downloaded drug response and feature data is stored + path_out="results", # results are stored here :) + hyperparameter_tuning=False) # if True (default), hyperparameters of the models and baselines are tuned. +``` + +This will run the Random Forest and Simple Neural Network models on the CTRPv2 dataset, using the Naive Mean Effects Predictor as a baseline. The results will be stored in `results/my_second_run/CTRPv2/LCO`. +To obtain evaluation metrics, you can use: + +```python +from drevalpy.visualization.create_report import create_report + +create_report( + run_id="my_first_run", + dataset=toyv1.dataset_name, + path_data= "data", + result_path="results", +) ``` -We recommend the use of our nextflow pipeline for computational demanding runs and for improved reproducibility. No knowledge of nextflow is required to run it. The nextflow pipeline is available here: [nf-core-drugresponseeval](https://github.com/JudithBernett/nf-core-drugresponseeval). +We recommend the use of our Nextflow pipeline for computational demanding runs and for improved reproducibility. +No knowledge of Nextflow is required to run it. The nextflow pipeline is available here: [nf-core-drugresponseeval](https://github.com/JudithBernett/nf-core-drugresponseeval). ## Example Report [Browse our benchmark results here.](https://dilis-lab.github.io/drevalpy-report/) +You can reproduce the whole analysis by running the following commands: + +```bash +# Main run +nextflow run nf-core/drugresponseeval \ + -profile docker \ + --run_id main_results \ + --dataset_name CTRPv2 \ + --cross_study_datasets CTRPv1,CCLE,GDSC1,GDSC2 \ + --models DIPK,MultiOmicsRandomForest \ + --baselines SimpleNeuralNetwork,RandomForest,MultiOmicsNeuralNetwork,NaiveMeanEffectsPredictor,GradientBoosting,SRMF,ElasticNet,NaiveTissueMeanPredictor,NaivePredictor,SuperFELTR,NaiveCellLineMeanPredictor,NaiveDrugMeanPredictor,ProteomicsRandomForest \ + --test_mode LPO,LCO,LTO,LDO \ + --randomization_mode SVRC,SVRD \ + --randomization_type permutation \ + --measure LN_IC50 + +# EC50 run +nextflow run nf-core/drugresponseeval \ + -profile docker \ + --run_id ec50_run \ + --dataset_name CTRPv2 \ + --cross_study_datasets CTRPv1,CCLE,GDSC1,GDSC2,PDX_Bruna,BeatAML2 \ + --models RandomForest \ + --baselines NaiveMeanEffectsPredictor \ + --test_mode LCO \ + --measure pEC50 + +# AUC run +nextflow run nf-core/drugresponseeval \ + -profile docker \ + --run_id auc_run \ + --dataset_name CTRPv2 \ + --cross_study_datasets CTRPv1,CCLE,GDSC1,GDSC2,PDX_Bruna,BeatAML2 \ + --models RandomForest \ + --baselines NaiveMeanEffectsPredictor \ + --test_mode LCO \ + --measure AUC + +# Invariant ablation run +# Run this on CPU +nextflow run nf-core/drugresponseeval \ + -profile docker \ + --run_id invariant-rf \ + --dataset_name CTRPv2 \ + --models MultiOmicsRandomForest \ + --baselines NaiveMeanEffectsPredictor \ + --test_mode LPO,LCO,LDO \ + --randomization_mode SVRC,SVRD \ + --randomization_type invariant \ + --measure LN_IC50 + +# modify the profile to run this on GPU, if possible +nextflow run nf-core/drugresponseeval \ + -profile docker \ + --run_id invariant-dipk \ + --dataset_name CTRPv2 \ + --models DIPK \ + --baselines NaiveMeanEffectsPredictor \ + --test_mode LPO,LCO,LDO \ + --randomization_mode SVRC,SVRD \ + --randomization_type invariant \ + --measure LN_IC50 + +## Inference on BeatAMl2, PDX_Bruna +# run this on CPU +nextflow run nf-core/drugresponseeval \ + -profile docker \ + --run_id infer_pdx_beat \ + --dataset_name CTRPv2 \ + --cross_study_datasets PDX_Bruna,BeatAML2 \ + --models RandomForest,SimpleNeuralNetwork,GradientBoosting,SRMF,ElasticNet,NaivePredictor,NaiveDrugMeanPredictor,NaiveCellLineMeanPredictor \ + --baselines NaiveMeanEffectsPredictor \ + --test_mode LPO,LCO,LDO \ + --measure LN_IC50 + +# modify profile to run this on GPU, if possible +nextflow run nf-core/drugresponseeval \ + -profile docker \ + --run_id dipk_pdx_beat \ + --dataset_name CTRPv2 \ + --cross_study_datasets PDX_Bruna,BeatAML2 \ + --models DIPK \ + --baselines NaiveMeanEffectsPredictor \ + --test_mode LPO,LCO,LDO \ + --measure LN_IC50 +``` ## Contact Main developers: - [Judith Bernett](mailto:judith.bernett@tum.de), [Data Science in Systems Biology](https://www.mls.ls.tum.de/daisybio/startseite/), TUM -- [Pascal Iversen](mailto:Pascal.Iversen@hpi.de), [Data Integration in the Life Sciences](https://www.mi.fu-berlin.de/w/DILIS/WebHome), FU Berlin, Hasso Plattner Institute +- [Pascal Iversen](mailto:Pascal.Iversen@hpi.de), [Data Integration in the Life Sciences](https://www.mi.fu-berlin.de/w/DILIS/WebHome), FU Berlin, Hasso-Plattner-Institut diff --git a/README.rst b/README.rst index def362a8..048cbc35 100644 --- a/README.rst +++ b/README.rst @@ -1,7 +1,7 @@ DrEvalPy: Python Cancer Cell Line Drug Response Prediction Suite ================================================================ -|PyPI| |Python Version| |License| |Read the Docs| |Build| |Tests| |Codecov| |pre-commit| |Black| +|PyPI| |Python Version| |License| |Read the Docs| |Build| |Tests| |Codecov| |pre-commit| |Black| |Zenodo| .. |PyPI| image:: https://img.shields.io/pypi/v/drevalpy.svg :target: https://pypi.org/project/drevalpy/ @@ -30,6 +30,9 @@ DrEvalPy: Python Cancer Cell Line Drug Response Prediction Suite .. |Black| image:: https://img.shields.io/badge/code%20style-black-000000.svg :target: https://github.com/psf/black :alt: Black +.. |Zenodo| image:: https://zenodo.org/badge/727156477.svg + :target: https://doi.org/10.5281/zenodo.18302237 + :alt: DOI .. image:: _static/img/overview.png :align: center @@ -40,12 +43,15 @@ DrEvalPy: Python Cancer Cell Line Drug Response Prediction Suite Overview ======= -Focus on Innovating Your Models — DrEval Handles the Rest! +Check out our preprint on `bioRxiv `_! + +**Focus on Innovating Your Models — DrEval Handles the Rest!** + - DrEval is a toolkit that ensures drug response prediction evaluations are statistically sound, biologically meaningful, and reproducible. - Focus on model innovation while using our automated standardized evaluation protocols and preprocessing workflows. -- A flexible model interface supports all model types (e.g. Machine Learning, Stats, Network-based analyses) +- A flexible model interface supports all model types (e.g. machine learning, statistical models, network-based analyses). -Use DrEval to Build Drug Response Models That Have an Impact +Use DrEval to build drug response models that have an impact 1. Maintained, up-to-date baseline catalog, no need to re-implement literature models @@ -65,3 +71,11 @@ Use DrEval to Build Drug Response Models That Have an Impact This project is a collaboration of the Technical University of Munich (TUM, Germany) and the Freie Universität Berlin (FU, Germany). + +Leaderboard +----------- + +.. image:: _static/img/leaderboard_light.png + :alt: DrEvalPy Leaderboard + :align: center + :width: 70% diff --git a/basic_env.yml b/basic_env.yml deleted file mode 100644 index 7588b4bf..00000000 --- a/basic_env.yml +++ /dev/null @@ -1,11 +0,0 @@ -name: drp_basic -channels: - - conda-forge - - bioconda - - defaults - - pytorch -dependencies: - - python=3.8 - - scikit-learn=1.3.2 - - pip: - - pyyaml==6.0.1 diff --git a/create_report.py b/create_report.py deleted file mode 100644 index f6cc955c..00000000 --- a/create_report.py +++ /dev/null @@ -1,115 +0,0 @@ -"""Renders the evaluation results into an HTML report with various plots and tables.""" - -import argparse -import os -import pathlib - -from drevalpy.visualization.utils import ( - create_html, - create_index_html, - create_output_directories, - draw_algorithm_plots, - draw_test_mode_plots, - parse_results, - prep_results, - write_results, -) - -if __name__ == "__main__": - parser = argparse.ArgumentParser(description="Generate reports from evaluation results") - parser.add_argument("--run_id", required=True, help="Run ID for the current execution") - parser.add_argument("--dataset", required=True, help="Dataset name for which to render the result file") - parser.add_argument("--path_data", required=False, help="Path to the data, default is ./data") - parser.add_argument("--result_path", required=False, help="Path to the results, default is ./results") - args = parser.parse_args() - run_id = args.run_id - dataset = args.dataset - path_to_data = args.path_data if args.path_data is not None else "data" - path_data = pathlib.Path(path_to_data).resolve() - result_path = args.result_path if args.result_path is not None else "results" - result_path = pathlib.Path(result_path).resolve() - # assert that the run_id folder exists - if not os.path.exists(f"{result_path}/{run_id}"): - raise AssertionError(f"Folder {result_path}/{run_id} does not exist. The pipeline has to be run first.") - - # not part of pipeline - ( - evaluation_results, - evaluation_results_per_drug, - evaluation_results_per_cell_line, - true_vs_pred, - ) = parse_results(path_to_results=f"{result_path}/{run_id}", dataset=dataset) - - # part of pipeline: EVALUATE_FINAL, COLLECT_RESULTS - ( - evaluation_results, - evaluation_results_per_drug, - evaluation_results_per_cell_line, - true_vs_pred, - ) = prep_results( - evaluation_results, evaluation_results_per_drug, evaluation_results_per_cell_line, true_vs_pred, path_data - ) - - write_results( - path_out=f"{result_path}/{run_id}/", - eval_results=evaluation_results, - eval_results_per_drug=evaluation_results_per_drug, - eval_results_per_cl=evaluation_results_per_cell_line, - t_vs_p=true_vs_pred, - ) - - create_output_directories(result_path, run_id) - # Start loop over all test_modes - test_modes = evaluation_results["test_mode"].unique() - - for test_mode in test_modes: - print(f"Generating report for {test_mode} ...") - unique_algos = draw_test_mode_plots( - test_mode=test_mode, - ev_res=evaluation_results, - ev_res_per_drug=evaluation_results_per_drug, - ev_res_per_cell_line=evaluation_results_per_cell_line, - custom_id=run_id, - path_data=path_data, - result_path=result_path, - ) - # draw figures for each algorithm with all randomizations etc - unique_algos = set(unique_algos) - { - "NaiveMeanEffectsPredictor", - "NaivePredictor", - "NaiveCellLineMeansPredictor", - "NaiveTissueMeansPredictor", - "NaiveDrugMeanPredictor", - } - for algorithm in unique_algos: - draw_algorithm_plots( - model=algorithm, - ev_res=evaluation_results, - ev_res_per_drug=evaluation_results_per_drug, - ev_res_per_cell_line=evaluation_results_per_cell_line, - t_vs_p=true_vs_pred, - test_mode=test_mode, - custom_id=run_id, - result_path=result_path, - ) - # get all html files from {result_path}/{run_id} - all_files: list[str] = [] - for _, _, files in os.walk(f"{result_path}/{run_id}"): # type: ignore[assignment] - for file in files: - if file.endswith("json") or ( - file.endswith(".html") and file not in ["index.html", "LPO.html", "LCO.html", "LDO.html"] - ): - all_files.append(file) - # PIPELINE: WRITE_HTML - create_html( - run_id=run_id, - test_mode=test_mode, - files=all_files, - prefix_results=f"{result_path}/{run_id}", - ) - # PIPELINE: WRITE_INDEX - create_index_html( - custom_id=run_id, - test_modes=test_modes, - prefix_results=f"{result_path}/{run_id}", - ) diff --git a/docs/_key_contributors.rst b/docs/_key_contributors.rst index 0cc54ed4..145243e0 100644 --- a/docs/_key_contributors.rst +++ b/docs/_key_contributors.rst @@ -5,4 +5,5 @@ * `Mario Picciani `_: Developer * `Markus List `_: Advisor and PI of Data Science in Systems Biology, TUM * `Katharina Baum `_: Advisor and PI of Data Integration in the Life Sciences, FU Berlin - * `Mathias Wilhelm `_: Advisor and PI of Computational Mass Spectrometry, TUM \ No newline at end of file + * `Mathias Wilhelm `_: Advisor and PI of Computational Mass Spectrometry, TUM + * `Nico Trummer `_: Contributor, `Orakl Oncology `_ diff --git a/docs/_static/example_data/fingerprints_example.csv b/docs/_static/example_data/fingerprints_example.csv new file mode 100644 index 00000000..6ac8e94a --- /dev/null +++ b/docs/_static/example_data/fingerprints_example.csv @@ -0,0 +1,36 @@ +pubchem_id,dim_0,dim_1,dim_2,dim_3,dim_4,dim_5,dim_6,dim_7,dim_8,dim_9,dim_10,dim_11,dim_12,dim_13,dim_14,dim_15,dim_16,dim_17,dim_18,dim_19,dim_20,dim_21,dim_22,dim_23,dim_24,dim_25,dim_26,dim_27,dim_28,dim_29,dim_30,dim_31 +16720766,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0 +24821094,1.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0 +5284616,0.0,1.0,1.0,0.0,1.0,0.0,1.0,1.0,1.0,0.0,1.0,1.0,1.0,0.0,1.0,1.0,1.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,1.0,1.0,0.0,1.0,1.0,1.0 +44632017,1.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,1.0,0.0,0.0 +444795,0.0,0.0,1.0,1.0,1.0,1.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0 +2733526,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0 +6505803,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,1.0,1.0,1.0,0.0,0.0,1.0,0.0,1.0,0.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,1.0,0.0,1.0,1.0,1.0,1.0 +44137675,1.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0,1.0,1.0 +9933475,1.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,1.0,1.0,0.0,0.0,1.0,1.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0 +176870,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,1.0,0.0,0.0,1.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0 +10385095,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +135398516,1.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,0.0 +5494449,1.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,1.0,0.0,1.0,1.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0 +123631,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,1.0,1.0,1.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0 +60750,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0 +637858,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,0.0,1.0,1.0 +6450551,1.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +24771867,1.0,0.0,1.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0 +6914657,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0 +68289010,0.0,1.0,1.0,1.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,1.0,1.0,1.0 +156422,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,1.0,1.0,1.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0 +36314,1.0,1.0,1.0,1.0,0.0,1.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,1.0,0.0 +11977753,1.0,1.0,0.0,1.0,0.0,1.0,0.0,0.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +9926054,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,1.0 +24785538,1.0,0.0,1.0,1.0,1.0,1.0,1.0,0.0,1.0,0.0,1.0,1.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0 +216239,1.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0 +3062316,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0 +9927531,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0 +135398738,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +462382,1.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0 +117072552,1.0,1.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,1.0 +46224516,1.0,1.0,1.0,0.0,1.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,1.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,0.0 +11152667,1.0,0.0,0.0,1.0,1.0,0.0,1.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,1.0,0.0,1.0,0.0 +11228183,1.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,1.0,1.0,1.0,0.0,0.0,1.0,1.0,1.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,1.0 +11433190,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,0.0,1.0,0.0 diff --git a/docs/_static/example_data/gex_example.csv b/docs/_static/example_data/gex_example.csv new file mode 100644 index 00000000..3008fec8 --- /dev/null +++ b/docs/_static/example_data/gex_example.csv @@ -0,0 +1,89 @@ +cellosaurus_id,cell_line_name,DNAJB6,DTL,RPS6KB1,FOXJ3,ESYT2,RNF170,UBE3B,ZNF3,SMOX,GJC2,ANGEL2,ERBB4,FXN,IQSEC3,RNASE3,KNDC1,PIP4K2B,ARID3C,PIK3C3,FSTL1,TBXA2R,BCL9L,KDM2A,PHOSPHO1,OPRK1,MAPK14,TENM2,PKN1,RND2,RFC2,SYT8,DLEU7,DGAT1,LIN28B,S1PR1,CRIP3,CHST11,GMNN +CVCL_1402,Mel Ho,140.581488,17.619476,14.607653,20.76887,56.345975,7.442455,22.458604,29.109288,7.259666,0.125689,9.61685,0.001937,38.485539,0.0,0.258246,0.238614,30.723435,0.0,20.626653,88.521522,0.669885,3.606447,28.744636,0.0,0.018782,20.806067,0.065796,89.331683,0.022555,104.315954,0.006707,0.0,24.307616,10.829284,0.009426,0.0,62.646553,79.708234 +CVCL_1515,NCI-H2023,89.091465,30.064816,32.328136,18.42535,32.155903,9.290198,22.355019,19.411391,43.882979,0.308364,14.634494,0.050235,12.622539,0.156687,0.0,0.504009,26.251391,0.123867,22.647667,76.822492,5.084751,25.553375,21.094777,0.852469,0.018278,23.358446,0.046281,51.797575,0.451668,47.799441,0.154789,0.02999,29.053017,0.103054,0.42498,1.050828,14.376219,33.547804 +CVCL_1105,CAL-12T,132.671885,11.850045,16.394773,15.850939,32.844392,15.566276,21.746569,10.6378,203.191299,0.189163,10.815464,0.0,9.095408,0.011373,0.036478,0.372303,24.20092,0.023424,6.395406,19.791847,1.211711,78.578147,67.048724,0.073188,0.0,21.251328,0.10136,50.545536,0.528684,41.391946,5.79963,0.0,30.73785,0.0,17.963122,0.127448,60.007111,50.60188 +CVCL_1103,CADO-ES1,64.530113,44.218417,26.077694,19.539542,20.238988,27.139948,17.629982,25.138903,20.202886,0.43691,35.43395,0.00545,10.10695,0.383879,0.0,0.95854,80.974679,0.617502,6.185072,215.268053,0.077131,4.918923,17.437774,16.315974,0.0,25.12542,0.876523,97.493095,8.128164,41.363585,0.019237,0.0,52.981883,0.0,0.0,0.227211,9.538377,50.396844 +CVCL_1187,EC-GI-10,83.977097,2.818201,21.423409,10.538787,17.961432,11.652724,13.313952,20.373884,46.660511,0.138521,16.808167,0.032531,6.120558,0.029629,0.0,2.810659,22.845151,0.205723,12.415605,5.348224,0.069656,12.861374,34.679568,0.455362,0.021464,17.064288,0.078215,48.485725,0.047217,14.818668,13.657941,0.080812,12.291649,0.006986,0.458269,0.060817,21.847432,13.972432 +CVCL_2063,HCC827,152.075774,13.447143,26.670263,31.866492,73.056098,6.190505,21.746225,21.428897,23.316044,0.876363,14.260536,0.01243,19.113809,0.010383,0.03397,0.939987,21.103798,0.028298,16.479298,59.551,0.132097,25.533887,39.21832,0.00959,0.0,27.041275,2.81147,30.380515,0.09033,59.640339,2.517478,0.050205,7.15647,0.006818,1.863815,0.918066,26.611739,41.371673 +CVCL_0029,EFO-21,326.858984,8.445825,56.369365,37.011655,35.943594,17.551389,14.42692,73.882222,16.337652,2.742244,33.227742,6.776742,11.450972,0.326721,0.0,3.69939,22.628811,0.038685,19.031296,134.993801,0.66193,34.513127,39.604692,0.098325,0.0,33.462733,0.0959,148.127674,2.350114,9.076833,0.04367,0.14654,45.190252,0.0,2.375529,0.635792,1.740323,67.257108 +CVCL_1183,DU4475,104.734566,39.820808,15.034776,22.786066,37.684536,15.270224,19.352761,39.553957,0.619197,11.972193,37.291786,0.003535,7.164656,0.585059,0.0,3.550074,52.516956,0.08749,4.408537,0.156501,1.244427,13.200767,29.503886,0.0,0.008606,39.033394,0.044869,157.066935,0.910747,78.365514,0.211819,0.181003,21.42568,0.007791,0.00801,0.509528,5.712115,89.660189 +CVCL_1455,NCI-H1105,210.216017,72.008968,19.957025,68.840237,39.490625,15.383429,30.887089,96.796577,11.620393,0.951458,39.861934,0.200465,3.309148,3.977537,0.0,7.20643,73.342076,0.275365,63.157396,1.459507,0.462084,14.432394,90.809668,0.810439,0.038112,42.9863,0.054605,183.847785,4.371203,103.443146,0.68744,0.427433,37.538935,0.017252,0.234117,15.478618,8.224009,116.527213 +CVCL_1454,NCI-H1092,177.294548,47.50671,35.166522,68.799057,41.705038,18.247593,15.236477,115.270876,0.394716,1.556726,27.967001,0.160811,5.98084,15.456729,0.0,0.18279,65.420126,0.836207,39.820698,0.812329,0.085625,5.125916,81.897611,0.054757,0.902549,34.654027,0.209235,130.222141,3.105146,121.228792,0.0,0.071808,24.753839,0.04365,0.178359,27.695312,7.657127,54.783949 +CVCL_1783,UM-UC-3,158.239904,15.006115,17.411733,27.589598,48.89097,10.179963,18.895509,27.598338,12.855008,0.181628,12.256994,0.003081,12.860218,0.007724,0.0,2.658925,26.099872,0.09879,18.946911,77.905204,1.86749,21.568054,42.748814,0.036177,0.036182,24.435056,17.462665,64.880727,0.004484,76.399346,0.005333,0.012013,43.775384,0.006766,1.702994,0.192202,24.779781,74.482392 +CVCL_0067,Namalwa,87.936987,41.168027,23.476568,17.848613,14.76175,8.377535,19.129584,24.621425,0.22144,0.160966,14.005495,0.001151,43.966596,0.001921,0.0,0.023187,17.395733,0.170196,21.267809,0.144711,0.334933,1.346092,29.068804,0.434822,0.021469,23.91578,0.006505,73.152053,1.060432,95.61876,0.0,0.089335,16.974708,14.95702,13.405113,0.0,2.381695,86.090873 +CVCL_1847,PaTu 8988t,376.612123,39.787013,24.600735,12.858267,19.53475,12.970533,13.860402,23.576547,5.53553,0.433828,18.537716,0.00994,14.163078,0.0,0.0,0.574507,26.181999,0.055301,24.404135,91.362528,0.701109,76.809659,46.039796,0.062626,0.031122,40.786441,0.109847,103.030421,1.522191,58.114169,0.004955,0.0,28.9258,0.0,10.207446,0.8473,3.179392,115.355884 +CVCL_1327,KE-37,78.130414,57.712552,26.6163,30.720458,60.514715,12.87048,12.604049,29.15514,7.658769,1.855632,24.734986,2.893188,12.643914,0.203929,0.134273,0.044101,35.333131,0.568178,14.360818,11.232819,0.018246,7.19277,32.511037,1.000181,19.354137,52.547663,0.015476,89.722739,0.550254,68.152923,0.007036,0.328573,20.68139,20.43079,6.056878,0.235412,44.189383,92.621153 +CVCL_1818,Granta-519,81.159872,35.777478,23.102318,22.893017,17.37612,9.720389,15.413602,54.588757,0.780394,0.274053,37.421691,0.005396,13.200264,0.054068,0.0,0.018245,23.949394,0.032671,59.880785,0.658116,0.0,1.466876,41.762679,0.197539,0.0,15.035656,0.020523,69.977557,0.088795,43.382278,0.124288,0.0,18.368527,0.029167,9.918596,4.844307,8.217619,49.449247 +CVCL_1231,GI-1,266.959218,43.917228,38.806571,19.75173,43.795155,13.361285,12.558467,40.471286,10.33323,0.587152,28.245951,0.007305,8.804505,0.357622,0.0,0.006156,43.230358,0.0,13.158227,82.587327,2.78394,22.186488,48.460964,0.089689,0.021056,38.784496,16.672367,68.508181,0.996042,56.19793,0.012591,0.125751,34.126157,3.125544,0.192828,0.0,2.152067,86.7849 +CVCL_1385,LS411N,56.217418,20.258125,23.990742,22.260792,23.257101,14.045137,17.817217,39.956657,10.495516,0.173663,18.628563,0.009174,18.876136,0.017922,0.0,1.908917,16.754699,0.102061,4.533147,0.367897,0.011191,16.9118,23.701639,0.066744,0.018606,22.632697,0.04075,76.304524,0.040271,51.917849,5.886057,0.11077,36.05629,0.003369,0.015038,0.0,0.032143,56.860182 +CVCL_0012,LP-1,95.720927,1.410821,25.239395,18.261129,48.857517,40.630769,28.145698,41.710862,4.962385,0.091841,20.484872,0.02315,19.157037,4.100161,0.040054,0.0,23.293587,1.653104,35.197494,0.414146,0.01249,4.067869,42.387764,0.032191,0.0,29.924506,0.039605,44.675887,0.029997,25.17999,0.017428,0.0,14.61752,0.011294,2.294488,0.0,5.023005,8.857995 +CVCL_0547,SW620,160.640579,36.759399,20.115657,18.029807,38.003216,11.404347,17.274489,35.270364,53.131421,2.857062,15.704214,0.001468,22.538782,0.070208,0.0,0.036477,29.490824,0.110085,6.175134,0.170232,0.070351,28.937394,50.088541,0.054491,0.025001,29.139863,0.003726,69.558351,0.326719,82.404965,4.551788,0.111142,9.994,0.009707,0.021158,0.10425,4.567856,82.938981 +CVCL_1754,TE 441.T,90.895163,31.602591,36.772514,21.922611,37.018508,13.948252,27.112929,30.589361,13.685527,0.493647,10.79611,0.066327,14.518046,0.0,0.0,0.518064,124.353536,0.158696,38.313105,43.621158,0.522583,15.773484,34.62519,0.734234,0.0,24.916039,0.221831,53.082479,0.022145,77.612848,0.391824,0.117927,59.162025,0.016704,0.144111,0.0,15.227106,113.286744 +CVCL_1700,SK-N-AS,196.59306,21.066629,31.188453,23.069123,16.311901,11.459483,51.796055,61.445882,10.544694,0.990341,29.548813,0.035956,8.582954,0.153621,0.0,0.545376,48.44538,0.147416,30.49527,42.870542,0.49947,9.373203,38.325288,0.08627,0.0,30.714194,0.068182,61.698762,2.107345,43.333231,0.045452,0.012704,22.439309,0.103637,11.91147,0.027638,28.349497,49.794746 +CVCL_1619,OCI-AML-2,48.904545,56.711142,23.084596,24.641936,84.199194,13.669266,11.472657,16.747318,5.588099,0.045434,43.345197,0.004566,20.701575,0.463523,49.11319,0.018388,24.403131,0.25824,12.526311,0.384839,1.615532,4.316721,41.861363,0.181544,0.018382,68.846834,0.013521,64.036502,0.053424,42.772084,0.0,3.461906,56.54178,2.249565,0.030096,13.787792,29.313011,55.74638 +CVCL_1415,MKN1,290.004965,20.036072,19.98308,29.193413,74.338685,7.067815,22.303283,48.096537,22.078651,2.018816,15.518583,0.044473,9.798447,0.049094,0.064719,2.81345,37.605766,0.101497,43.538181,135.742998,0.158307,33.916266,39.938162,1.074024,0.018522,20.279929,3.593967,69.451455,3.205641,49.818353,0.423963,0.034766,34.839991,0.298375,3.915562,0.150012,9.235472,34.519041 +CVCL_0428,MIA PaCa-2,95.161694,16.883434,18.867156,15.281655,40.878124,5.479663,8.272478,18.28206,16.505445,0.67992,18.550853,0.002888,18.531748,0.002417,0.033627,8.708315,18.229521,0.074084,5.338429,4.701685,1.394516,7.66293,19.890961,0.865305,0.0,19.329918,0.014658,96.876372,0.0,68.75252,0.37712,0.032601,24.207064,0.006358,0.014169,0.0,0.225935,51.224207 +CVCL_1411,MHH-ES-1,105.936195,14.438288,22.445153,35.510921,19.06205,17.905224,26.924975,27.634542,20.177531,0.68899,23.597036,4.82056,6.575222,0.014268,0.030071,0.709739,19.942075,0.415134,27.902644,114.218755,0.601827,17.144086,56.060749,61.812505,0.0,33.947114,6.919399,72.615841,10.920488,46.522695,0.012454,0.005517,54.735982,0.074888,3.249695,6.199522,0.095318,33.891942 +CVCL_1379,LNCaP clone FGC,68.009397,17.803744,25.516542,23.149029,22.236241,5.890365,18.36676,32.832057,3.724675,0.068865,18.285873,0.009751,20.105578,0.019553,0.0,4.558265,32.945527,0.142325,11.48094,9.332481,0.05534,21.322792,32.923023,0.325576,0.512095,20.145697,0.627007,90.467168,0.028365,39.315923,0.041572,0.0,41.329852,0.012843,0.052405,0.080061,0.187942,39.253368 +CVCL_0620,MDA-MB-361,125.552494,36.034269,74.260902,21.469767,22.963883,6.842843,29.480366,28.412219,8.56409,1.097528,19.14274,0.092919,19.165788,0.00743,0.0,1.920222,54.282649,0.162009,20.859375,11.583373,0.273096,42.468138,58.180467,1.83365,0.062185,37.804426,1.217845,98.239573,0.051714,148.467044,17.935677,0.073369,23.407989,1.006569,1.691931,0.552027,30.909735,57.971838 +CVCL_1649,RD,210.834328,32.82315,37.357968,41.868646,34.679654,18.376974,25.586871,44.717174,15.414762,0.658996,16.36164,0.033294,12.035799,0.135855,0.0,0.486024,53.711543,0.044264,36.285213,337.795227,0.834771,15.463203,39.735466,0.226881,0.047071,32.114738,0.038869,66.44053,1.417112,101.72666,0.467023,0.0,26.699455,6.073232,0.09023,0.053372,1.478527,66.80758 +CVCL_1651,RERF-LC-Ad1,123.650236,17.500346,21.920202,26.961095,70.284111,20.070963,36.737213,38.772935,15.365013,0.850156,14.89737,0.093625,6.814388,0.007017,0.0,0.430127,33.349207,0.108266,9.012461,10.85257,0.221128,76.07148,64.196274,0.036496,0.0142,60.453861,0.132513,153.581055,0.115003,63.43487,7.681838,0.031717,62.563466,0.003217,0.09353,0.160668,0.682033,48.558235 +CVCL_1456,NCI-H1155,208.320302,33.570009,35.816897,31.449246,26.140091,11.81954,15.194532,37.307969,7.193628,0.234096,21.256818,0.110681,21.332251,1.171927,0.070986,1.168041,72.233189,0.443522,27.05378,1.214017,1.645091,5.579683,49.127201,0.616209,0.122669,36.516071,0.009465,97.813663,9.561301,110.578486,0.227046,0.010129,42.890091,0.003662,0.024196,9.740295,0.396253,100.103909 +CVCL_1525,NCI-H209,202.363287,45.74764,35.125813,110.164304,23.287925,11.455403,31.689023,66.709328,0.252576,0.219517,25.987761,0.096195,13.926541,0.040067,0.042853,0.094396,43.30822,0.077797,29.514787,0.849133,0.334145,4.319074,43.560792,0.015697,0.306239,59.206751,0.480798,124.397083,4.069235,81.066842,0.029506,0.33647,44.308569,1.665835,0.113999,14.308676,13.802903,148.179887 +CVCL_1529,NCI-H211,57.68604,38.954673,50.512541,28.037809,10.976455,10.406029,19.036624,46.451527,4.860016,0.189495,29.118399,1.9405,41.410687,0.056698,0.0,0.067195,81.731887,0.039168,7.006404,2.553411,0.060864,4.24123,66.270171,0.077839,2.52149,49.400898,0.026459,107.760752,3.167784,30.889772,0.017213,0.239402,28.94333,0.158471,0.028814,2.242208,6.599359,88.198053 +CVCL_2891,EBC-1,183.033747,23.143401,24.327367,29.164892,43.551686,6.860725,40.267879,58.217456,51.37853,0.401018,12.600486,0.041147,27.684176,0.007003,0.0,0.422732,28.828931,0.009206,21.629388,0.978382,0.530731,67.128547,62.065125,0.009359,0.0,44.833529,0.015529,36.465987,0.064213,145.49475,2.042538,0.039104,17.225064,0.024546,0.027947,0.119144,65.525862,96.995233 +CVCL_5069,SNU-489,210.336891,2.880395,26.693948,22.753767,55.811707,18.894407,19.174234,31.963341,29.186482,0.718577,13.834146,0.004765,9.798955,0.099398,0.0,0.269408,58.018852,0.205774,14.139641,273.453339,0.371549,31.882051,28.845532,0.333318,0.019928,30.485157,129.716665,56.51282,0.969532,28.55859,0.250335,0.257737,25.55788,0.045301,6.017065,0.127547,10.731055,13.397872 +CVCL_4381,HuH-6,89.649679,24.846883,11.488048,20.942784,16.21547,8.248673,15.920878,20.163025,28.502676,0.354831,14.963472,0.177023,24.415418,0.020763,0.033937,0.08033,18.326058,0.049156,5.595185,36.448171,0.051188,21.750255,23.752491,0.321383,0.003748,31.09756,0.034252,20.483962,0.517361,40.864721,0.148355,0.006024,102.368156,20.707897,0.021315,12.851934,0.080753,62.135962 +CVCL_1335,KNS-62,52.258268,9.461682,11.071046,7.939003,14.913713,4.798656,15.546374,15.905443,8.822419,0.095775,9.23397,0.013954,11.878344,0.018686,0.0,0.302799,8.492122,0.074289,5.467313,6.260072,0.0,16.992756,26.473874,0.037499,0.028498,9.196449,0.56106,21.85471,0.023377,57.685317,0.649527,0.054902,12.066213,0.017589,0.039354,0.075787,4.573007,14.046284 +CVCL_1324,Karpas-299,86.520628,38.520328,27.055514,16.040124,8.613675,10.769425,18.987434,20.810519,34.003192,0.168766,24.239544,0.002197,5.215333,0.154331,0.0,0.087686,20.552144,0.295181,20.743436,0.392283,0.0,6.027047,46.86166,0.63123,0.026644,47.380679,0.454401,101.859585,0.134402,59.012308,0.041985,0.0,24.288737,0.009653,99.458888,0.045827,44.867359,49.786898 +CVCL_1774,TT,113.737245,33.536651,19.842362,54.997479,55.657202,15.043755,31.693676,43.356304,0.0829,0.345237,36.133627,0.600254,4.497197,14.522964,0.0,0.079479,56.83257,0.028542,24.021492,1.717024,2.058811,5.65905,69.906965,0.0,0.465774,19.433958,59.284751,65.277567,8.136623,27.098389,0.015468,0.24489,63.534106,9.584982,0.011395,1.730355,9.692171,35.313789 +CVCL_1690,SF295,170.756831,23.529143,48.588942,17.58525,26.6074,9.461025,15.869796,39.075438,15.24192,0.718724,16.509138,0.001558,10.867243,0.00562,0.036873,0.0,43.976609,0.3217,7.573621,219.391518,0.298783,20.74082,22.12531,2.780364,0.00759,29.599136,0.323735,47.12705,0.228214,86.64993,0.290976,0.0,13.281882,0.027484,3.202419,0.0,9.348373,76.207808 +CVCL_1082,BEN,99.788228,4.099776,20.119358,21.226477,24.44575,9.393815,15.597901,36.905482,29.511218,0.241338,8.249348,0.317074,2.741341,0.199307,0.0,0.415838,12.614318,0.058655,14.797489,0.214556,0.492187,17.027122,33.005464,0.243987,0.224009,16.589316,0.025821,43.74858,1.038174,14.301585,0.235514,0.114146,25.193675,0.541783,1.255015,3.044279,0.651902,28.533826 +CVCL_0107,BCP-1,58.672098,18.436275,18.629484,17.748665,46.654616,11.667335,24.582097,37.011949,17.94504,0.449053,17.695154,0.001221,27.931868,0.531455,0.0,0.038616,27.433254,1.217139,198.078147,0.44051,0.0,0.551048,50.952457,0.059878,0.076826,36.946438,0.029036,17.931327,0.007082,52.09767,0.029817,0.107578,18.01542,14.574927,25.182196,0.047477,13.364441,100.794021 +CVCL_1085,BHT-101,153.157035,4.3925,16.040792,31.681634,57.088798,2.887012,23.658253,27.830427,32.895441,0.573688,12.677904,0.0,6.420611,0.695312,0.0,0.740851,20.031029,0.107908,26.458986,4.591479,0.30594,22.999821,30.316624,0.010963,0.036704,24.647467,0.015564,72.926522,0.015415,29.432621,0.020653,0.078958,19.939941,0.012523,0.414079,0.057392,13.73159,16.569899 +CVCL_1133,COLO 741,205.847348,14.658704,15.387154,14.070369,42.983199,11.283795,18.442409,32.789043,8.540731,0.293722,19.781325,0.654456,11.555522,0.0,0.0,0.646728,28.175367,0.030614,7.357558,84.318255,0.139485,10.161208,19.29016,0.191016,0.052164,28.083007,0.034939,65.1158,0.017928,72.513082,0.016954,0.021907,27.435695,0.023608,0.089887,0.023878,9.767789,134.792708 +CVCL_1559,NCI-H358,87.771382,11.760486,53.179627,23.507355,35.381518,10.840744,11.569442,36.31291,40.154232,0.285882,11.746615,0.024462,6.6953,0.002269,0.058106,0.647271,21.950278,0.22622,8.633266,0.230822,0.177269,25.826601,41.195424,0.029107,0.092548,28.025227,0.013781,36.184204,0.197098,62.712106,3.272396,0.311909,38.691931,0.008933,0.052165,0.115068,4.771517,60.856506 +CVCL_1565,NCI-H510A,110.113544,34.710095,43.661757,51.58901,42.99858,9.662323,25.859037,45.446946,4.934336,1.079887,20.534714,0.381086,16.15927,1.272733,0.0,0.006504,38.069497,0.0,25.779543,0.862067,0.844229,7.257442,73.890619,0.726235,8.740712,32.612782,0.042725,98.815316,1.430692,64.235546,0.0,0.121058,22.921313,1.877869,0.365765,1.947985,21.212328,77.37412 +CVCL_1245,HCC1143,92.269784,40.336956,17.373875,23.43359,31.775949,6.336497,25.525549,13.031575,51.56968,0.54726,38.138633,0.023901,11.828442,0.003453,0.0,0.10008,14.427648,0.094535,17.128063,19.648249,0.238383,23.484589,63.123106,1.32902,3.26389,23.875304,0.539625,52.764416,0.102846,32.919682,1.847922,0.024433,56.94778,0.040932,0.150291,0.233105,8.150717,62.56241 +CVCL_1760,TE-10,77.532536,5.971743,6.024416,12.137837,46.325603,3.554872,12.073152,15.654395,5.508739,0.320805,2.907075,0.019698,6.129327,0.002615,0.0,0.009004,4.614001,0.0,5.476994,8.718066,0.01116,9.98502,44.967778,0.0,0.025696,12.86973,0.176225,28.63456,0.209083,54.396356,1.725288,0.019039,38.238087,0.096115,0.515006,0.819117,1.761501,70.409477 +CVCL_0533,SK-UT-1,138.780465,54.405694,58.634236,22.665355,23.144093,6.653562,18.836711,34.550839,8.978705,0.990118,28.026122,0.005703,26.432611,0.006767,0.031495,3.859965,55.92456,0.060764,34.813558,431.478452,4.072342,20.715164,66.70635,0.473205,0.0,41.790164,4.162179,69.895769,10.470985,102.81063,0.066276,0.043298,29.025153,0.012914,9.989119,4.345887,1.709928,67.204093 +CVCL_1624,ONS-76,121.521805,12.213482,25.65829,16.800703,43.087244,16.635097,17.342983,50.446828,14.908327,2.536024,23.146187,0.508073,14.690753,0.00601,0.0,2.362862,24.551582,0.010966,6.632074,62.386508,0.230061,11.756942,26.828396,0.185126,0.0,21.492309,0.268242,82.101569,0.424021,41.393135,4.901807,0.024625,39.773686,1.958472,0.15182,0.154824,0.250733,45.891109 +CVCL_1626,OS-RC-2,211.443126,14.519658,26.225659,18.428673,42.313189,12.66217,29.743424,22.889677,87.192747,0.532006,22.626865,0.083278,6.668892,0.130698,0.037031,4.269055,34.000942,0.063407,5.946716,200.700382,0.426177,42.353481,33.263469,0.534368,0.043664,21.181531,52.819958,39.028407,0.620783,55.884136,0.069416,0.0,13.502774,0.080062,0.398924,0.0,35.095716,43.923243 +CVCL_3116,OVISE,52.230473,4.575075,22.68289,13.983612,24.243606,37.208413,25.600571,14.933833,21.422049,0.245134,17.982047,3.820973,4.350263,0.047628,0.029115,11.89488,31.875529,0.119902,8.126508,443.045955,0.0,10.142314,34.186031,10.877063,0.0,27.398322,0.344185,77.129785,0.19281,13.828975,3.480071,0.020476,33.149747,0.005478,0.244651,0.019153,4.175633,20.859181 +CVCL_1464,NCI-H1355,79.01602,46.037839,35.813777,28.93363,44.565185,14.966438,16.839943,17.722157,69.668077,0.393705,16.589199,0.0372,14.314345,0.002214,0.0,0.147812,34.338596,0.210985,14.996957,19.543557,0.148717,52.605986,38.052831,0.513604,0.015139,26.209408,0.065564,28.375067,0.034584,43.013322,0.0,0.062501,29.595138,0.005809,0.025548,0.645736,19.614117,75.054608 +CVCL_2209,SUP-M2,62.471143,41.208705,37.107252,13.815268,72.637308,16.36226,16.129582,25.42829,8.947309,0.219543,83.818027,0.014453,3.143955,0.056304,0.0,0.005692,26.365897,0.191265,15.457107,0.189157,0.024474,7.248361,32.183165,0.482907,0.0,51.705634,1.969458,118.961982,0.034079,40.27319,0.031235,0.0,20.180218,0.527384,77.947447,0.079401,24.265719,69.298033 +CVCL_0099,SNU-1,72.156569,33.239815,28.223917,22.757432,27.633912,9.747363,13.422112,21.608113,4.577051,0.55684,22.07931,0.001241,27.17653,0.0,0.029291,3.137882,38.825359,0.026335,15.5721,22.867126,0.011437,5.381905,27.475469,0.129598,0.015064,26.567499,0.008433,40.242957,0.018161,56.257653,0.004327,0.502707,31.501075,0.002734,0.006106,0.025836,0.241891,64.531991 +CVCL_5031,SNU-175,154.104511,11.271571,23.300753,19.353031,52.202729,10.464007,15.609974,48.876843,12.457411,0.040622,25.780337,0.025241,13.148827,0.0,0.0,0.210987,25.687212,0.366279,9.331407,0.25945,0.0,2.103808,36.14031,0.020225,0.0,33.941935,0.012386,11.112727,0.039541,65.532871,0.039983,0.061227,42.982743,0.028746,0.0,1.36769,0.02127,52.17083 +CVCL_3004,KP-2,96.817957,14.86214,15.943199,15.585426,45.804448,10.257226,7.319733,16.854329,5.436564,0.105679,13.943066,0.171216,8.935441,0.014745,0.037612,2.750064,16.036186,0.414766,3.197387,49.053229,0.011756,15.478864,27.904891,0.013744,0.027422,26.786707,0.418951,138.445859,0.037676,77.794557,72.462925,0.260456,15.491182,0.007094,0.229275,0.589769,8.534995,68.833618 +CVCL_1167,Daoy,322.373245,37.730377,24.932204,31.828032,33.797904,13.153493,14.455103,73.375664,24.264246,0.244692,23.736974,0.012895,26.660136,0.073576,0.0,0.2152,26.780928,0.048239,29.07881,415.106041,0.287569,15.227682,40.136128,0.576191,0.046658,45.121944,9.765122,43.058269,0.089972,122.577046,0.155506,0.022769,16.637184,4.59505,0.41841,0.433611,25.85883,101.129452 +CVCL_A352,HCC2108,335.25044,25.970534,38.960245,20.005608,40.708808,8.552202,23.907189,17.368919,41.056276,1.165951,22.416279,0.086306,13.386891,0.013353,0.0,4.205849,40.947259,0.136029,16.303695,365.158878,3.332156,79.515394,63.13556,0.451069,0.003872,21.939769,12.687827,84.114304,3.662899,60.209862,0.025141,0.0,16.845387,1.897771,0.0,0.263974,25.810619,33.712712 +CVCL_3172,SUIT-2,140.53198,41.502384,42.983497,23.932351,47.803127,15.25454,10.78919,16.478119,8.558274,0.261827,18.895176,0.011152,22.707981,0.0,0.0,5.660104,37.488708,0.0,8.298141,38.002407,0.0,35.789085,38.800827,0.0,0.009,39.902663,0.101249,36.612787,0.226839,66.969999,0.0,0.202402,28.919385,0.799138,0.033233,0.0,22.821407,84.440365 +CVCL_0080,A-673,131.480588,27.198455,24.833679,22.016659,25.300334,12.784321,26.945203,38.310898,13.141938,0.545977,20.218773,10.418492,8.073818,0.041298,0.031575,0.083772,23.624621,0.114585,30.382182,88.221413,1.24454,20.724521,67.700064,43.244814,0.00352,40.772721,13.508589,69.574783,6.10612,103.116881,0.034172,0.023912,57.657734,1.368489,0.203855,2.449571,0.120951,89.800492 +CVCL_0134,A2780,103.827605,43.300985,32.403766,17.184747,15.748268,17.866288,9.415428,27.521547,2.821455,0.284033,34.36118,0.740831,30.031358,0.015425,0.0,0.019036,40.326182,0.086608,16.033982,48.044897,2.618253,25.146951,32.782499,0.472974,0.033618,27.945388,0.009451,57.572159,7.126869,67.534908,0.120575,0.009525,15.898294,39.24948,2.575372,0.0,1.642994,80.919839 +CVCL_5098,SNU-81,152.422862,23.477199,30.698765,27.210446,25.910245,25.400247,25.899686,65.339129,18.001811,2.091468,30.403051,0.007744,22.522491,0.0,0.0,16.825418,20.894151,4.736563,34.512242,2.006469,0.027701,21.958848,35.517634,0.0,0.0,48.61149,0.08837,37.158128,0.4501,27.254453,4.075866,0.414107,65.684944,0.018331,0.037545,6.02823,0.145933,28.039546 +CVCL_1352,KYSE-410,92.780969,13.841422,19.731398,17.710612,28.526508,1.215794,23.5956,41.123494,15.921247,0.036327,13.876665,0.737063,14.41552,0.0,0.0,0.003548,16.999459,0.043164,3.524646,10.290617,0.044763,12.697158,104.163179,0.025506,0.009698,22.898502,0.033379,11.963393,0.035061,84.386219,5.449255,0.181219,28.378141,0.166623,0.081995,0.065458,13.278682,72.464553 +CVCL_1287,HSC-2,60.52426,4.065582,9.471789,8.428724,14.483105,9.41087,6.522543,10.261219,7.231284,0.20469,7.862677,0.008719,5.806003,0.019362,0.0,0.920475,11.121585,0.047005,2.651976,43.408325,0.023116,31.294685,42.126135,0.055755,0.0,17.302773,23.671977,9.33669,0.011237,26.489286,10.854967,0.098752,13.922539,0.0,0.23155,0.241077,4.727877,30.54076 +CVCL_0599,SK-MEL-24,144.849637,20.13019,14.017332,22.457021,95.274923,9.523216,27.68836,28.019356,15.715991,0.23865,11.669982,2.674479,4.635964,0.012139,0.0,0.022397,31.395853,0.144579,29.317126,144.030854,0.288174,12.402307,23.620587,0.089525,0.031664,23.054956,0.069131,57.446615,0.468664,39.071252,0.293216,0.159158,31.976858,0.003188,0.161922,0.0,38.59463,38.128717 +CVCL_0629,SK-LU-1,100.516104,17.447381,8.853875,7.487231,11.840843,4.223887,13.063982,9.303069,7.428393,0.074247,8.34373,0.008476,2.883602,0.019454,0.0,0.052365,13.603616,0.057525,2.263179,23.7544,0.249058,8.218308,17.133109,0.175427,0.0,14.979668,1.138767,13.758926,0.043016,26.490838,1.935528,0.054917,13.00673,0.002321,1.938926,0.334803,9.177111,16.798631 +CVCL_0600,SK-MEL-31,155.240112,25.135897,13.47316,21.684053,100.32777,12.428943,18.841653,28.412233,19.535219,0.459598,18.849041,0.008611,2.264603,0.002973,0.038733,0.424501,27.570225,0.151097,19.991931,96.095627,10.987824,18.615618,25.267457,0.05486,0.030162,36.01292,1.982688,75.629212,0.197278,89.783693,0.485321,0.151205,26.922852,0.02733,0.223992,0.0,63.088303,37.694834 +CVCL_1344,KU-19-19,127.880478,13.499147,15.561312,17.324792,43.135222,4.958688,18.198997,14.129831,4.557413,0.952262,13.888622,0.022406,15.391616,0.0,0.0,2.82452,15.200557,0.229318,4.111851,21.414296,2.552723,15.879627,77.464523,0.871133,0.248735,31.631223,0.015503,24.317567,6.18714,41.127191,0.230314,0.034268,39.247136,0.017909,0.228956,0.0,56.557133,58.994279 +CVCL_2094,KPL-1,168.010165,5.283417,457.988927,16.093414,33.060134,4.888649,16.221262,32.252132,1.990999,0.668028,7.370217,0.15596,8.674565,0.0,0.037028,10.476641,11.577786,0.103025,3.364828,0.170993,0.080151,53.70425,49.074828,0.393543,0.0,24.469008,0.037986,54.976225,0.340339,61.837118,0.90276,0.138839,15.695199,0.011169,0.015181,0.0,1.300907,41.573444 +CVCL_0379,Ku812,76.278116,16.705732,40.321389,22.809848,16.194392,9.472343,12.878889,32.81898,5.143509,0.737845,18.40989,0.003841,62.938556,0.243424,0.387021,0.014251,34.447979,0.058661,13.697123,0.17765,0.680101,4.82345,60.518401,0.590193,0.022686,103.460832,0.021923,86.451296,0.055957,33.645676,0.0,0.032056,50.142003,0.00422,2.69492,0.118291,14.402168,89.450161 +CVCL_1345,Kuramochi,190.549828,13.738278,15.753322,28.993736,64.012503,12.117699,11.267253,34.708149,2.635443,1.864291,26.819692,10.3546,5.766252,0.053815,0.047762,0.984814,16.934111,0.087065,8.151357,134.634315,0.125123,18.41215,43.707747,1.915002,0.0,37.352434,0.096408,28.334344,0.276409,29.03016,0.494755,0.175979,54.128103,3.522134,0.52707,0.0,1.416732,37.279028 +CVCL_1682,SCC-25,110.665189,9.126214,8.298211,9.633395,13.141012,8.897785,13.109729,6.244213,12.247397,0.344398,6.539057,0.003873,10.070883,0.015114,0.0,0.155692,11.519925,0.039555,5.012914,34.875723,0.141205,15.562551,34.446397,0.0,0.015352,19.286645,46.742694,5.297043,0.086609,17.230855,0.95643,0.020201,9.932452,0.022708,3.724761,0.071164,10.876848,32.288086 +CVCL_1679,SBC-5,128.849247,14.275033,107.390377,16.595935,25.100936,22.383321,21.056838,37.137821,2.13272,2.964483,26.716511,10.296267,12.732038,0.191293,0.0,10.63066,37.02423,0.147532,6.954715,6.37491,3.173693,12.070841,17.482376,0.747011,0.010366,24.133672,0.533186,77.630588,13.467999,47.511434,0.030439,0.031525,61.829677,9.285237,0.178387,0.021095,4.458683,26.030745 +CVCL_1536,NCI-H2171,167.292955,45.599509,18.864844,29.710808,16.636795,3.18596,22.504288,64.00758,13.882596,0.814433,13.944864,0.081544,19.073374,25.22026,0.059932,2.141006,25.112166,0.017837,43.889842,2.444092,0.349983,5.305893,46.156998,0.105134,13.99932,26.776381,2.037845,100.465199,5.115377,87.51192,0.0,0.022428,23.394589,0.149841,0.100927,1.97514,14.413223,114.133176 +CVCL_1539,NCI-H2196,77.102714,24.864776,30.600084,55.86778,15.686149,14.249735,50.459232,83.043161,4.028573,1.76516,36.362441,0.17513,19.051109,1.344616,0.0,1.264619,21.78307,0.223144,27.331755,3.143591,0.843757,11.50514,44.48102,0.323889,25.571791,41.991895,0.241952,134.207627,5.914819,80.815585,0.349962,0.317429,39.394033,0.012997,0.019262,0.02977,8.683872,64.048711 +CVCL_1545,NCI-H2286,467.641624,47.339433,33.938706,30.116621,39.569834,27.655088,20.762808,19.469966,33.903693,0.469836,19.262245,0.137732,19.944039,0.00277,0.0,0.420412,45.955425,0.131511,12.227704,21.06704,2.13732,60.13637,57.634685,0.542338,0.00402,19.128078,0.392437,91.955431,3.772778,61.264862,0.0,0.03728,13.106127,1.16498,15.791805,0.331371,13.127255,45.554609 +CVCL_0178,BT-20,217.407683,25.386088,16.778516,21.491572,149.729024,11.901786,20.32823,15.289437,15.635907,0.451803,18.278812,0.080942,11.350564,0.0,0.056746,2.428041,21.624206,0.0,8.259609,21.889907,0.141638,64.918334,44.052589,0.038133,0.096654,53.263142,0.014893,63.104775,0.049296,56.328829,23.073277,0.005075,13.658049,0.014314,0.006324,0.025237,21.94657,51.498938 +CVCL_1767,TE-9,85.571362,17.706667,23.891022,14.823631,14.250751,6.529188,20.893267,21.778666,3.41634,0.155987,22.622487,0.037077,13.724928,0.005169,0.0,1.10055,27.424191,0.075882,11.190944,46.348944,0.028131,25.946733,60.225728,0.237188,0.14934,34.753634,0.333035,8.492411,0.013529,57.392165,35.32973,0.251513,19.546075,0.006797,0.211286,0.056184,4.034488,72.338661 +CVCL_1633,Panc 02.03,127.393316,10.560111,35.287638,13.192893,20.664354,12.304725,17.825319,17.320384,33.567271,0.299088,22.248744,0.011866,8.852946,0.037211,0.0,0.31192,16.833423,0.040298,5.564544,23.625764,0.099485,40.24102,57.83271,0.018963,0.0,19.379268,0.003272,69.197824,0.487358,22.158729,6.685697,0.016505,31.755262,0.019533,0.059142,0.305221,20.394198,22.38275 +CVCL_3117,OVTOKO,41.11634,19.763518,13.772326,7.879389,20.577949,11.172972,16.714631,10.461738,30.480503,0.361199,6.902216,0.038325,6.670597,0.02723,0.025021,15.058447,11.223334,0.049285,19.934861,23.404494,0.0,2.310285,11.415158,1.566402,0.0,13.939002,0.014768,18.046977,0.006761,47.518295,0.255165,0.004522,9.111437,0.005107,0.013193,0.0,0.729051,58.028113 +CVCL_1569,NCI-H526,185.047743,15.98508,35.829407,50.231555,22.70456,5.27165,17.999231,72.907934,17.284829,0.182342,10.898668,0.241734,17.980859,1.010007,0.0,0.159885,36.939559,0.32802,4.289405,0.316441,0.302275,32.068659,43.375445,0.064851,0.013928,56.205832,0.407341,88.022417,6.270254,71.503721,0.047994,0.33527,39.638496,5.235637,0.021421,3.552678,1.411632,104.936768 +CVCL_1045,22Rv1,78.866736,39.125718,31.086297,24.876133,45.065779,8.609383,36.04836,37.675244,1.373006,0.351961,50.855282,1.625797,13.231269,0.011352,0.0,0.017439,27.207262,0.450026,7.277419,1.14548,1.53712,20.686785,30.751588,0.064624,0.00828,34.797666,0.299089,52.547754,4.22211,142.66741,0.328929,0.0902,28.19525,0.01872,0.031139,1.437648,0.43558,85.899188 +CVCL_1798,42-MG-BA,117.505556,10.456181,15.961309,29.83037,18.908971,6.249527,27.598394,22.733829,41.644256,1.549485,10.42241,0.00378,8.746017,0.003159,0.041912,0.163747,29.218789,0.026277,11.886459,695.594147,2.838263,40.995296,51.280132,0.351131,0.004582,33.472728,84.435106,28.308083,0.066031,83.713324,0.222801,0.050327,26.265417,0.012453,0.122737,0.246433,4.179718,32.782369 +CVCL_1254,HCC1500,141.425755,13.913433,28.855115,30.188599,35.999477,23.562422,21.577788,48.360653,1.499394,0.223649,26.646812,3.006877,17.365397,0.004555,0.029431,0.06465,21.193972,0.198055,44.074301,0.223193,0.051409,10.820852,42.523987,0.849086,0.015788,33.581037,0.102111,35.67638,8.389157,50.122005,0.368614,0.064735,40.678555,0.00598,0.0,1.164246,0.098714,42.828218 +CVCL_1255,HCC1569,255.325667,13.506402,12.505061,27.862796,74.822229,13.193876,26.430777,43.946037,27.579844,0.541969,28.699249,0.080691,16.610254,0.006061,0.0,0.004252,23.661558,0.065875,22.139147,24.329944,1.205533,45.211204,63.689429,0.251031,0.279895,32.925842,0.016105,8.676468,0.031611,86.949028,0.182505,0.037808,90.455491,0.035341,0.00878,0.185554,28.68262,37.704758 +CVCL_A351,HCC1588,81.157842,7.25815,12.469004,13.020648,31.085522,22.906964,8.78308,32.935857,23.013719,4.337343,15.683903,0.007525,8.818365,0.002179,0.0,1.231346,6.942277,0.057827,10.177303,0.20395,0.023193,20.768147,18.806193,0.32541,0.003156,15.262162,0.026813,29.467659,0.018935,25.31236,6.673755,0.146297,41.217543,0.00286,0.021093,0.037939,0.04368,13.372693 +CVCL_1479,NCI-H1581,102.479544,27.504955,20.948979,19.59686,19.967566,14.496981,16.65414,29.285742,1.559297,0.493581,13.298509,0.594645,12.862092,0.002745,0.0,3.710565,53.067587,0.030633,8.975117,3.264366,0.982729,8.826494,27.557512,0.666244,0.003994,21.772904,0.023793,77.119492,12.975576,65.796421,0.077663,0.20236,52.088145,19.446442,0.023062,1.279139,0.484995,87.31176 +CVCL_L083,YD-38,206.209845,30.547413,15.405668,13.167287,52.207695,7.944903,19.408122,15.461011,4.878815,0.430582,11.860621,0.121214,9.858199,0.0,0.0,1.174316,12.283076,0.0,18.187494,27.961068,0.526179,22.362144,26.514593,0.0,0.0,28.223819,9.530742,53.478967,0.010586,41.011314,12.606567,0.0,32.91518,0.007979,3.346796,0.076847,8.854512,29.280566 diff --git a/docs/_static/example_data/response_example.csv b/docs/_static/example_data/response_example.csv new file mode 100644 index 00000000..5f268c45 --- /dev/null +++ b/docs/_static/example_data/response_example.csv @@ -0,0 +1,2330 @@ +cellosaurus_id,cell_line_name,pubchem_id,drug_name,AUC,tissue +CVCL_0379,Ku812,6914657,Daporinad,0.22083125,Blood +CVCL_1045,22Rv1,6914657,Daporinad,0.3746875,Prostate +CVCL_1082,BEN,6914657,Daporinad,0.3380625,Lung +CVCL_1085,BHT-101,6914657,Daporinad,0.37409375,Thyroid +CVCL_1105,CAL-12T,6914657,Daporinad,0.54121875,Lung +CVCL_1133,COLO 741,6914657,Daporinad,0.42271875,Skin +CVCL_1167,Daoy,6914657,Daporinad,0.306646875,Brain +CVCL_1327,KE-37,6914657,Daporinad,0.13355625,Blood +CVCL_1344,KU-19-19,6914657,Daporinad,0.217646875,Bladder +CVCL_1345,Kuramochi,6914657,Daporinad,0.3140625,Ovary +CVCL_1385,LS411N,6914657,Daporinad,0.194084375,Colon +CVCL_1402,Mel Ho,6914657,Daporinad,0.33140625,Skin +CVCL_1411,MHH-ES-1,6914657,Daporinad,0.111825,Bone +CVCL_1415,MKN1,6914657,Daporinad,0.281284375,Stomach +CVCL_1456,NCI-H1155,6914657,Daporinad,0.172071875,Lung +CVCL_1479,NCI-H1581,6914657,Daporinad,0.32840625,Lung +CVCL_1529,NCI-H211,6914657,Daporinad,0.140421875,Lung +CVCL_1559,NCI-H358,6914657,Daporinad,0.476375,Lung +CVCL_1569,NCI-H526,6914657,Daporinad,,Lung +CVCL_1624,ONS-76,6914657,Daporinad,0.265734375,Brain +CVCL_1626,OS-RC-2,6914657,Daporinad,0.42675,Kidney +CVCL_1651,RERF-LC-Ad1,6914657,Daporinad,0.4184375,Lung +CVCL_1679,SBC-5,6914657,Daporinad,0.3541875,Lung +CVCL_1690,SF295,6914657,Daporinad,0.310825,Brain +CVCL_1760,TE-10,6914657,Daporinad,0.3108375,Esophagus +CVCL_1767,TE-9,6914657,Daporinad,0.263153125,Esophagus +CVCL_1774,TT,6914657,Daporinad,0.2448125,Esophagus +CVCL_2063,HCC827,6914657,Daporinad,0.4485,Lung +CVCL_2094,KPL-1,6914657,Daporinad,0.3338125,Breast +CVCL_3116,OVISE,6914657,Daporinad,0.24829375,Ovary +CVCL_3117,OVTOKO,6914657,Daporinad,0.371375,Ovary +CVCL_5098,SNU-81,6914657,Daporinad,0.49853125,Colon +CVCL_A351,HCC1588,6914657,Daporinad,0.342625,Lung +CVCL_A352,HCC2108,6914657,Daporinad,0.495125,Lung +CVCL_L083,YD-38,6914657,Daporinad,0.358875,Head And Neck +CVCL_3172,SUIT-2,6914657,Daporinad,0.419109375,Pancreas +CVCL_3172,SUIT-2,6914657,Daporinad,0.419109375,Pancreas +CVCL_0547,SW620,6914657,Daporinad,0.268425,Colon +CVCL_0600,SK-MEL-31,6914657,Daporinad,0.47865625,Skin +CVCL_0629,SK-LU-1,6914657,Daporinad,0.45546875,Lung +CVCL_1352,KYSE-410,6914657,Daporinad,0.4314375,Esophagus +CVCL_1515,NCI-H2023,6914657,Daporinad,0.38025,Lung +CVCL_1783,UM-UC-3,6914657,Daporinad,0.33578125,Bladder +CVCL_2891,EBC-1,6914657,Daporinad,0.3933125,Lung +CVCL_4381,HuH-6,6914657,Daporinad,0.27933125,Liver +CVCL_0012,LP-1,6914657,Daporinad,0.292609375,Blood +CVCL_0029,EFO-21,6914657,Daporinad,0.2640625,Ovary +CVCL_0080,A-673,6914657,Daporinad,0.04360625,Bone +CVCL_0099,SNU-1,6914657,Daporinad,0.206090625,Stomach +CVCL_0178,BT-20,6914657,Daporinad,0.4305625,Breast +CVCL_0428,MIA PaCa-2,6914657,Daporinad,0.302665625,Pancreas +CVCL_0533,SK-UT-1,6914657,Daporinad,0.211421875,Soft Tissue +CVCL_0599,SK-MEL-24,6914657,Daporinad,0.375375,Skin +CVCL_0620,MDA-MB-361,6914657,Daporinad,0.55609375,Breast +CVCL_1183,DU4475,6914657,Daporinad,0.10621875,Breast +CVCL_1187,EC-GI-10,6914657,Daporinad,0.205521875,Esophagus +CVCL_1231,GI-1,6914657,Daporinad,0.226925,Brain +CVCL_1254,HCC1500,6914657,Daporinad,0.4525,Breast +CVCL_1287,HSC-2,6914657,Daporinad,0.235778125,Head And Neck +CVCL_1335,KNS-62,6914657,Daporinad,0.4251875,Lung +CVCL_1379,LNCaP clone FGC,6914657,Daporinad,0.32546875,Prostate +CVCL_1454,NCI-H1092,6914657,Daporinad,0.17645625,Lung +CVCL_1455,NCI-H1105,6914657,Daporinad,0.198815625,Lung +CVCL_1539,NCI-H2196,6914657,Daporinad,0.32265625,Lung +CVCL_1633,Panc 02.03,6914657,Daporinad,0.279384375,Pancreas +CVCL_1649,RD,6914657,Daporinad,0.2289,Muscle +CVCL_1700,SK-N-AS,6914657,Daporinad,0.3231875,Nervous System +CVCL_1798,42-MG-BA,6914657,Daporinad,0.16623125,Brain +CVCL_1818,Granta-519,6914657,Daporinad,0.213825,Lymph +CVCL_1847,PaTu 8988t,6914657,Daporinad,0.230828125,Pancreas +CVCL_2209,SUP-M2,6914657,Daporinad,0.44721875,Lymph +CVCL_3004,KP-2,6914657,Daporinad,0.287946875,Pancreas +CVCL_1415,MKN1,6450551,Axitinib,,Stomach +CVCL_2094,KPL-1,6450551,Axitinib,,Breast +CVCL_1045,22Rv1,46224516,UNC0638,0.4083125,Prostate +CVCL_3116,OVISE,9926054,BMS-345541,,Ovary +CVCL_1085,BHT-101,60750,Gemcitabine,0.261415625,Thyroid +CVCL_1402,Mel Ho,5284616,Rapamycin,0.275503125,Skin +CVCL_1569,NCI-H526,60750,Gemcitabine,0.167521875,Lung +CVCL_1651,RERF-LC-Ad1,5284616,Rapamycin,0.43634375,Lung +CVCL_1651,RERF-LC-Ad1,60750,Gemcitabine,0.44359375,Lung +CVCL_1690,SF295,60750,Gemcitabine,0.3706875,Brain +CVCL_1760,TE-10,5284616,Rapamycin,0.34634375,Esophagus +CVCL_1760,TE-10,60750,Gemcitabine,0.3206875,Esophagus +CVCL_1767,TE-9,60750,Gemcitabine,0.2937125,Esophagus +CVCL_2063,HCC827,5284616,Rapamycin,0.37321875,Lung +CVCL_3116,OVISE,46224516,UNC0638,0.48478125,Ovary +CVCL_L083,YD-38,60750,Gemcitabine,0.2381,Head And Neck +CVCL_3116,OVISE,6450551,Axitinib,0.4680625,Ovary +CVCL_0012,LP-1,462382,MG-132,0.336125,Blood +CVCL_0029,EFO-21,462382,MG-132,0.4111875,Ovary +CVCL_0067,Namalwa,462382,MG-132,0.3481875,Lymph +CVCL_0080,A-673,462382,MG-132,0.336125,Bone +CVCL_0099,SNU-1,462382,MG-132,0.373625,Stomach +CVCL_0178,BT-20,462382,MG-132,0.38596875,Breast +CVCL_0428,MIA PaCa-2,462382,MG-132,0.359875,Pancreas +CVCL_1183,DU4475,462382,MG-132,0.32015625,Breast +CVCL_1231,GI-1,462382,MG-132,0.35509375,Brain +CVCL_1254,HCC1500,462382,MG-132,0.3393125,Breast +CVCL_1287,HSC-2,462382,MG-132,0.346125,Head And Neck +CVCL_1379,LNCaP clone FGC,462382,MG-132,0.36059375,Prostate +CVCL_1455,NCI-H1105,462382,MG-132,0.33628125,Lung +CVCL_1539,NCI-H2196,462382,MG-132,0.343625,Lung +CVCL_1633,Panc 02.03,462382,MG-132,0.39303125,Pancreas +CVCL_1700,SK-N-AS,462382,MG-132,0.32896875,Nervous System +CVCL_1754,TE 441.T,462382,MG-132,0.33434375,Muscle +CVCL_1847,PaTu 8988t,462382,MG-132,0.34684375,Pancreas +CVCL_3004,KP-2,462382,MG-132,0.383125,Pancreas +CVCL_0099,SNU-1,11977753,Dactolisib,0.221990625,Stomach +CVCL_1245,HCC1143,11977753,Dactolisib,0.34475,Breast +CVCL_0012,LP-1,11977753,Dactolisib,0.175646875,Blood +CVCL_0029,EFO-21,11977753,Dactolisib,0.3626875,Ovary +CVCL_0067,Namalwa,11977753,Dactolisib,0.228603125,Lymph +CVCL_0080,A-673,11977753,Dactolisib,0.1656,Bone +CVCL_0107,BCP-1,11977753,Dactolisib,0.140278125,Lymph +CVCL_0134,A2780,11977753,Dactolisib,0.2235875,Ovary +CVCL_0178,BT-20,11977753,Dactolisib,0.301853125,Breast +CVCL_0428,MIA PaCa-2,11977753,Dactolisib,0.31375,Pancreas +CVCL_0533,SK-UT-1,11977753,Dactolisib,0.31634375,Soft Tissue +CVCL_0547,SW620,11977753,Dactolisib,0.3318125,Colon +CVCL_0599,SK-MEL-24,11977753,Dactolisib,0.37715625,Skin +CVCL_0600,SK-MEL-31,11977753,Dactolisib,0.41059375,Skin +CVCL_0629,SK-LU-1,11977753,Dactolisib,0.32253125,Lung +CVCL_1183,DU4475,11977753,Dactolisib,0.189825,Breast +CVCL_1187,EC-GI-10,11977753,Dactolisib,0.302240625,Esophagus +CVCL_1231,GI-1,11977753,Dactolisib,0.272925,Brain +CVCL_1254,HCC1500,11977753,Dactolisib,0.2743,Breast +CVCL_1287,HSC-2,11977753,Dactolisib,0.32825,Head And Neck +CVCL_1324,Karpas-299,11977753,Dactolisib,0.23885625,Lymph +CVCL_1335,KNS-62,11977753,Dactolisib,0.3864375,Lung +CVCL_1352,KYSE-410,11977753,Dactolisib,0.275171875,Esophagus +CVCL_1379,LNCaP clone FGC,11977753,Dactolisib,0.20555625,Prostate +CVCL_1454,NCI-H1092,11977753,Dactolisib,0.35746875,Lung +CVCL_1455,NCI-H1105,11977753,Dactolisib,0.2734875,Lung +CVCL_1464,NCI-H1355,11977753,Dactolisib,0.294590625,Lung +CVCL_1515,NCI-H2023,11977753,Dactolisib,0.31878125,Lung +CVCL_1525,NCI-H209,11977753,Dactolisib,0.291871875,Lung +CVCL_1536,NCI-H2171,11977753,Dactolisib,0.3328125,Lung +CVCL_1539,NCI-H2196,11977753,Dactolisib,0.264921875,Lung +CVCL_1545,NCI-H2286,11977753,Dactolisib,0.3180625,Lung +CVCL_1565,NCI-H510A,11977753,Dactolisib,0.35265625,Lung +CVCL_1619,OCI-AML-2,11977753,Dactolisib,0.261003125,Blood +CVCL_1633,Panc 02.03,11977753,Dactolisib,0.4231875,Pancreas +CVCL_1649,RD,11977753,Dactolisib,0.23701875,Muscle +CVCL_1682,SCC-25,11977753,Dactolisib,0.057384375,Head And Neck +CVCL_1700,SK-N-AS,11977753,Dactolisib,0.2795625,Nervous System +CVCL_1754,TE 441.T,11977753,Dactolisib,0.259646875,Muscle +CVCL_1783,UM-UC-3,11977753,Dactolisib,0.3521875,Bladder +CVCL_1798,42-MG-BA,11977753,Dactolisib,0.1547125,Brain +CVCL_1818,Granta-519,11977753,Dactolisib,0.1706625,Lymph +CVCL_1847,PaTu 8988t,11977753,Dactolisib,0.37865625,Pancreas +CVCL_2209,SUP-M2,11977753,Dactolisib,0.163346875,Lymph +CVCL_2891,EBC-1,11977753,Dactolisib,0.24779375,Lung +CVCL_3004,KP-2,11977753,Dactolisib,0.3990625,Pancreas +CVCL_4381,HuH-6,11977753,Dactolisib,0.34471875,Liver +CVCL_0012,LP-1,46224516,UNC0638,0.3828125,Blood +CVCL_0029,EFO-21,46224516,UNC0638,0.5174375,Ovary +CVCL_0067,Namalwa,46224516,UNC0638,0.4875,Lymph +CVCL_0080,A-673,46224516,UNC0638,0.346875,Bone +CVCL_0178,BT-20,46224516,UNC0638,0.4519375,Breast +CVCL_0428,MIA PaCa-2,46224516,UNC0638,0.3933125,Pancreas +CVCL_0533,SK-UT-1,46224516,UNC0638,0.4501875,Soft Tissue +CVCL_0547,SW620,60750,Gemcitabine,,Colon +CVCL_0599,SK-MEL-24,46224516,UNC0638,0.430125,Skin +CVCL_0600,SK-MEL-31,60750,Gemcitabine,,Skin +CVCL_0629,SK-LU-1,60750,Gemcitabine,,Lung +CVCL_1082,BEN,46224516,UNC0638,0.41871875,Lung +CVCL_1085,BHT-101,46224516,UNC0638,0.40915625,Thyroid +CVCL_1133,COLO 741,46224516,UNC0638,0.43046875,Skin +CVCL_1187,EC-GI-10,46224516,UNC0638,0.46875,Esophagus +CVCL_1231,GI-1,46224516,UNC0638,0.372375,Brain +CVCL_1245,HCC1143,46224516,UNC0638,0.440375,Breast +CVCL_1245,HCC1143,60750,Gemcitabine,,Breast +CVCL_1254,HCC1500,46224516,UNC0638,0.37009375,Breast +CVCL_1324,Karpas-299,46224516,UNC0638,0.36221875,Lymph +CVCL_1327,KE-37,46224516,UNC0638,0.388625,Blood +CVCL_1344,KU-19-19,46224516,UNC0638,0.48640625,Bladder +CVCL_1345,Kuramochi,46224516,UNC0638,0.4324375,Ovary +CVCL_1379,LNCaP clone FGC,46224516,UNC0638,0.40071875,Prostate +CVCL_1385,LS411N,46224516,UNC0638,0.42978125,Colon +CVCL_1454,NCI-H1092,46224516,UNC0638,0.4071875,Lung +CVCL_1456,NCI-H1155,46224516,UNC0638,0.49696875,Lung +CVCL_1479,NCI-H1581,46224516,UNC0638,0.45675,Lung +CVCL_1515,NCI-H2023,46224516,UNC0638,0.435125,Lung +CVCL_1515,NCI-H2023,60750,Gemcitabine,,Lung +CVCL_1536,NCI-H2171,46224516,UNC0638,0.3594375,Lung +CVCL_1539,NCI-H2196,46224516,UNC0638,0.50671875,Lung +CVCL_1559,NCI-H358,46224516,UNC0638,0.49809375,Lung +CVCL_1619,OCI-AML-2,46224516,UNC0638,0.37278125,Blood +CVCL_1624,ONS-76,46224516,UNC0638,0.461875,Brain +CVCL_1626,OS-RC-2,46224516,UNC0638,0.46121875,Kidney +CVCL_1649,RD,46224516,UNC0638,0.34140625,Muscle +CVCL_1651,RERF-LC-Ad1,46224516,UNC0638,0.40759375,Lung +CVCL_1700,SK-N-AS,46224516,UNC0638,0.37778125,Nervous System +CVCL_1760,TE-10,46224516,UNC0638,0.435625,Esophagus +CVCL_1783,UM-UC-3,60750,Gemcitabine,,Bladder +CVCL_1818,Granta-519,46224516,UNC0638,0.36059375,Lymph +CVCL_2063,HCC827,46224516,UNC0638,0.44271875,Lung +CVCL_2209,SUP-M2,46224516,UNC0638,0.44015625,Lymph +CVCL_2891,EBC-1,60750,Gemcitabine,,Lung +CVCL_3117,OVTOKO,46224516,UNC0638,0.45084375,Ovary +CVCL_4381,HuH-6,60750,Gemcitabine,,Liver +CVCL_A351,HCC1588,5284616,Rapamycin,0.45253125,Lung +CVCL_0620,MDA-MB-361,11977753,Dactolisib,0.222465625,Breast +CVCL_1651,RERF-LC-Ad1,11228183,ABT-737,0.42396875,Lung +CVCL_1760,TE-10,11228183,ABT-737,0.45378125,Esophagus +CVCL_0029,EFO-21,16720766,Pevonedistat,0.42825,Ovary +CVCL_1187,EC-GI-10,16720766,Pevonedistat,0.44046875,Esophagus +CVCL_2209,SUP-M2,462382,MG-132,0.332125,Lymph +CVCL_0599,SK-MEL-24,462382,MG-132,0.3948125,Skin +CVCL_0533,SK-UT-1,462382,MG-132,0.3724375,Soft Tissue +CVCL_1454,NCI-H1092,462382,MG-132,0.35971875,Lung +CVCL_1649,RD,462382,MG-132,0.36921875,Muscle +CVCL_1818,Granta-519,462382,MG-132,0.35478125,Lymph +CVCL_1187,EC-GI-10,462382,MG-132,0.39421875,Esophagus +CVCL_0099,SNU-1,44632017,YK-4-279,0.398,Stomach +CVCL_0099,SNU-1,60750,Gemcitabine,0.169259375,Stomach +CVCL_1245,HCC1143,44632017,YK-4-279,0.41328125,Breast +CVCL_3116,OVISE,44632017,YK-4-279,0.44409375,Ovary +CVCL_5098,SNU-81,24785538,BMS-754807,0.35446875,Colon +CVCL_5098,SNU-81,6505803,Tanespimycin,0.309753125,Colon +CVCL_0012,LP-1,10385095,Telomerase Inhibitor IX,0.39253125,Blood +CVCL_0012,LP-1,24785538,BMS-754807,0.215084375,Blood +CVCL_0012,LP-1,44632017,YK-4-279,0.37475,Blood +CVCL_0012,LP-1,5284616,Rapamycin,0.226196875,Blood +CVCL_0012,LP-1,60750,Gemcitabine,0.3601875,Blood +CVCL_0012,LP-1,637858,Piperlongumine,0.37465625,Blood +CVCL_0012,LP-1,6505803,Tanespimycin,0.34396875,Blood +CVCL_0029,EFO-21,10385095,Telomerase Inhibitor IX,0.40078125,Ovary +CVCL_0029,EFO-21,24785538,BMS-754807,0.4396875,Ovary +CVCL_0029,EFO-21,44632017,YK-4-279,0.42265625,Ovary +CVCL_0029,EFO-21,5284616,Rapamycin,0.416125,Ovary +CVCL_0029,EFO-21,60750,Gemcitabine,0.323625,Ovary +CVCL_0029,EFO-21,637858,Piperlongumine,0.4553125,Ovary +CVCL_0029,EFO-21,6505803,Tanespimycin,0.35725,Ovary +CVCL_0067,Namalwa,10385095,Telomerase Inhibitor IX,0.33890625,Lymph +CVCL_0067,Namalwa,24785538,BMS-754807,0.380125,Lymph +CVCL_0067,Namalwa,44632017,YK-4-279,0.34803125,Lymph +CVCL_0067,Namalwa,5284616,Rapamycin,0.269071875,Lymph +CVCL_0067,Namalwa,60750,Gemcitabine,0.10024375,Lymph +CVCL_0067,Namalwa,637858,Piperlongumine,0.35865625,Lymph +CVCL_0067,Namalwa,6505803,Tanespimycin,0.3561875,Lymph +CVCL_0080,A-673,10385095,Telomerase Inhibitor IX,0.36521875,Bone +CVCL_0080,A-673,24785538,BMS-754807,0.26308125,Bone +CVCL_0080,A-673,44632017,YK-4-279,0.3510625,Bone +CVCL_0080,A-673,5284616,Rapamycin,0.222521875,Bone +CVCL_0080,A-673,60750,Gemcitabine,0.10905625,Bone +CVCL_0080,A-673,637858,Piperlongumine,0.348,Bone +CVCL_0080,A-673,6505803,Tanespimycin,0.336375,Bone +CVCL_0099,SNU-1,10385095,Telomerase Inhibitor IX,0.3464375,Stomach +CVCL_0099,SNU-1,24785538,BMS-754807,0.35196875,Stomach +CVCL_0099,SNU-1,46224516,UNC0638,0.4135625,Stomach +CVCL_0099,SNU-1,5284616,Rapamycin,0.2368125,Stomach +CVCL_0099,SNU-1,637858,Piperlongumine,0.35496875,Stomach +CVCL_0099,SNU-1,6505803,Tanespimycin,0.20663125,Stomach +CVCL_0107,BCP-1,5284616,Rapamycin,0.117703125,Lymph +CVCL_0107,BCP-1,60750,Gemcitabine,0.2367125,Lymph +CVCL_0134,A2780,10385095,Telomerase Inhibitor IX,0.34653125,Ovary +CVCL_0134,A2780,24785538,BMS-754807,0.351625,Ovary +CVCL_0134,A2780,44632017,YK-4-279,0.3409375,Ovary +CVCL_0134,A2780,46224516,UNC0638,0.4475,Ovary +CVCL_0134,A2780,5284616,Rapamycin,0.19161875,Ovary +CVCL_0134,A2780,60750,Gemcitabine,0.311028125,Ovary +CVCL_0134,A2780,637858,Piperlongumine,0.37859375,Ovary +CVCL_0134,A2780,6505803,Tanespimycin,0.263753125,Ovary +CVCL_0178,BT-20,10385095,Telomerase Inhibitor IX,0.36903125,Breast +CVCL_0178,BT-20,24785538,BMS-754807,0.41596875,Breast +CVCL_0178,BT-20,44632017,YK-4-279,0.4189375,Breast +CVCL_0178,BT-20,5284616,Rapamycin,0.353375,Breast +CVCL_0178,BT-20,60750,Gemcitabine,0.42321875,Breast +CVCL_0178,BT-20,637858,Piperlongumine,0.40578125,Breast +CVCL_0178,BT-20,6505803,Tanespimycin,0.360875,Breast +CVCL_0379,Ku812,10385095,Telomerase Inhibitor IX,0.36509375,Blood +CVCL_0379,Ku812,24785538,BMS-754807,0.36478125,Blood +CVCL_0379,Ku812,44632017,YK-4-279,0.35696875,Blood +CVCL_0379,Ku812,46224516,UNC0638,0.37471875,Blood +CVCL_0379,Ku812,5284616,Rapamycin,0.240634375,Blood +CVCL_0379,Ku812,60750,Gemcitabine,0.136953125,Blood +CVCL_0379,Ku812,637858,Piperlongumine,0.35640625,Blood +CVCL_0379,Ku812,6505803,Tanespimycin,0.2518,Blood +CVCL_0428,MIA PaCa-2,10385095,Telomerase Inhibitor IX,0.37284375,Pancreas +CVCL_0428,MIA PaCa-2,24785538,BMS-754807,0.3874375,Pancreas +CVCL_0428,MIA PaCa-2,44632017,YK-4-279,0.4165,Pancreas +CVCL_0428,MIA PaCa-2,5284616,Rapamycin,0.3813125,Pancreas +CVCL_0428,MIA PaCa-2,60750,Gemcitabine,0.31846875,Pancreas +CVCL_0428,MIA PaCa-2,637858,Piperlongumine,0.3813125,Pancreas +CVCL_0428,MIA PaCa-2,6505803,Tanespimycin,0.190053125,Pancreas +CVCL_0533,SK-UT-1,10385095,Telomerase Inhibitor IX,0.3880625,Soft Tissue +CVCL_0533,SK-UT-1,24785538,BMS-754807,0.42540625,Soft Tissue +CVCL_0533,SK-UT-1,44632017,YK-4-279,0.4054375,Soft Tissue +CVCL_0533,SK-UT-1,5284616,Rapamycin,0.3519375,Soft Tissue +CVCL_0533,SK-UT-1,60750,Gemcitabine,0.27605625,Soft Tissue +CVCL_0533,SK-UT-1,637858,Piperlongumine,0.42503125,Soft Tissue +CVCL_0533,SK-UT-1,6505803,Tanespimycin,0.29363125,Soft Tissue +CVCL_0547,SW620,10385095,Telomerase Inhibitor IX,0.3084625,Colon +CVCL_0547,SW620,24785538,BMS-754807,0.372875,Colon +CVCL_0547,SW620,44632017,YK-4-279,0.4081875,Colon +CVCL_0547,SW620,46224516,UNC0638,0.4815,Colon +CVCL_0547,SW620,5284616,Rapamycin,0.371,Colon +CVCL_0547,SW620,637858,Piperlongumine,0.38275,Colon +CVCL_0547,SW620,6505803,Tanespimycin,0.272309375,Colon +CVCL_0599,SK-MEL-24,10385095,Telomerase Inhibitor IX,0.35984375,Skin +CVCL_0599,SK-MEL-24,24785538,BMS-754807,0.33865625,Skin +CVCL_0599,SK-MEL-24,44632017,YK-4-279,0.422375,Skin +CVCL_0599,SK-MEL-24,5284616,Rapamycin,0.4496875,Skin +CVCL_0599,SK-MEL-24,60750,Gemcitabine,0.3719375,Skin +CVCL_0599,SK-MEL-24,637858,Piperlongumine,0.4041875,Skin +CVCL_0599,SK-MEL-24,6505803,Tanespimycin,0.29031875,Skin +CVCL_0600,SK-MEL-31,10385095,Telomerase Inhibitor IX,0.402875,Skin +CVCL_0600,SK-MEL-31,24785538,BMS-754807,0.40190625,Skin +CVCL_0600,SK-MEL-31,44632017,YK-4-279,0.445125,Skin +CVCL_0600,SK-MEL-31,46224516,UNC0638,0.4681875,Skin +CVCL_0600,SK-MEL-31,5284616,Rapamycin,0.435625,Skin +CVCL_0600,SK-MEL-31,637858,Piperlongumine,0.41540625,Skin +CVCL_0600,SK-MEL-31,6505803,Tanespimycin,0.4308125,Skin +CVCL_0620,MDA-MB-361,10385095,Telomerase Inhibitor IX,0.38696875,Breast +CVCL_0620,MDA-MB-361,24785538,BMS-754807,0.331125,Breast +CVCL_0620,MDA-MB-361,44632017,YK-4-279,0.4413125,Breast +CVCL_0620,MDA-MB-361,46224516,UNC0638,0.4540625,Breast +CVCL_0620,MDA-MB-361,5284616,Rapamycin,0.260396875,Breast +CVCL_0620,MDA-MB-361,60750,Gemcitabine,0.37184375,Breast +CVCL_0629,SK-LU-1,10385095,Telomerase Inhibitor IX,0.41115625,Lung +CVCL_0629,SK-LU-1,24785538,BMS-754807,0.379,Lung +CVCL_0629,SK-LU-1,44632017,YK-4-279,0.42534375,Lung +CVCL_0629,SK-LU-1,46224516,UNC0638,0.3963125,Lung +CVCL_0629,SK-LU-1,5284616,Rapamycin,0.3316875,Lung +CVCL_0629,SK-LU-1,637858,Piperlongumine,0.4276875,Lung +CVCL_0629,SK-LU-1,6505803,Tanespimycin,0.312875,Lung +CVCL_1045,22Rv1,24785538,BMS-754807,0.339,Prostate +CVCL_1045,22Rv1,44632017,YK-4-279,0.378875,Prostate +CVCL_1045,22Rv1,5284616,Rapamycin,0.26114375,Prostate +CVCL_1045,22Rv1,60750,Gemcitabine,0.216128125,Prostate +CVCL_1082,BEN,10385095,Telomerase Inhibitor IX,0.43509375,Lung +CVCL_1082,BEN,24785538,BMS-754807,0.51453125,Lung +CVCL_1082,BEN,44632017,YK-4-279,0.46875,Lung +CVCL_1082,BEN,5284616,Rapamycin,,Lung +CVCL_1082,BEN,60750,Gemcitabine,0.4686875,Lung +CVCL_1082,BEN,637858,Piperlongumine,0.47903125,Lung +CVCL_1082,BEN,6505803,Tanespimycin,0.4918125,Lung +CVCL_1085,BHT-101,10385095,Telomerase Inhibitor IX,0.39009375,Thyroid +CVCL_1085,BHT-101,24785538,BMS-754807,0.3685,Thyroid +CVCL_1085,BHT-101,44632017,YK-4-279,0.400875,Thyroid +CVCL_1085,BHT-101,5284616,Rapamycin,0.47325,Thyroid +CVCL_1085,BHT-101,637858,Piperlongumine,0.41484375,Thyroid +CVCL_1085,BHT-101,6505803,Tanespimycin,0.37921875,Thyroid +CVCL_1105,CAL-12T,10385095,Telomerase Inhibitor IX,0.396,Lung +CVCL_1105,CAL-12T,24785538,BMS-754807,0.3309375,Lung +CVCL_1105,CAL-12T,44632017,YK-4-279,0.43846875,Lung +CVCL_1105,CAL-12T,46224516,UNC0638,0.4149375,Lung +CVCL_1105,CAL-12T,5284616,Rapamycin,0.463625,Lung +CVCL_1105,CAL-12T,60750,Gemcitabine,0.43121875,Lung +CVCL_1105,CAL-12T,637858,Piperlongumine,0.4105625,Lung +CVCL_1105,CAL-12T,6505803,Tanespimycin,0.3718125,Lung +CVCL_1133,COLO 741,10385095,Telomerase Inhibitor IX,0.42375,Skin +CVCL_1133,COLO 741,24785538,BMS-754807,0.440625,Skin +CVCL_1133,COLO 741,44632017,YK-4-279,0.35384375,Skin +CVCL_1133,COLO 741,5284616,Rapamycin,0.36878125,Skin +CVCL_1133,COLO 741,60750,Gemcitabine,0.36459375,Skin +CVCL_1133,COLO 741,637858,Piperlongumine,0.3493125,Skin +CVCL_1133,COLO 741,6505803,Tanespimycin,0.41296875,Skin +CVCL_1167,Daoy,10385095,Telomerase Inhibitor IX,0.35846875,Brain +CVCL_1167,Daoy,24785538,BMS-754807,0.40771875,Brain +CVCL_1167,Daoy,44632017,YK-4-279,0.37240625,Brain +CVCL_1167,Daoy,46224516,UNC0638,0.451,Brain +CVCL_1167,Daoy,5284616,Rapamycin,0.35696875,Brain +CVCL_1167,Daoy,60750,Gemcitabine,0.195778125,Brain +CVCL_1167,Daoy,637858,Piperlongumine,0.40840625,Brain +CVCL_1167,Daoy,6505803,Tanespimycin,0.3558125,Brain +CVCL_1183,DU4475,10385095,Telomerase Inhibitor IX,0.3215,Breast +CVCL_1183,DU4475,24785538,BMS-754807,0.30958125,Breast +CVCL_1183,DU4475,44632017,YK-4-279,0.3559375,Breast +CVCL_1183,DU4475,5284616,Rapamycin,0.22429375,Breast +CVCL_1183,DU4475,60750,Gemcitabine,0.14648125,Breast +CVCL_1183,DU4475,637858,Piperlongumine,0.3464375,Breast +CVCL_1183,DU4475,6505803,Tanespimycin,0.187753125,Breast +CVCL_1187,EC-GI-10,10385095,Telomerase Inhibitor IX,0.40853125,Esophagus +CVCL_1187,EC-GI-10,24785538,BMS-754807,0.3885,Esophagus +CVCL_1187,EC-GI-10,44632017,YK-4-279,0.38521875,Esophagus +CVCL_1187,EC-GI-10,5284616,Rapamycin,0.3435,Esophagus +CVCL_1187,EC-GI-10,60750,Gemcitabine,0.33159375,Esophagus +CVCL_1187,EC-GI-10,637858,Piperlongumine,0.4440625,Esophagus +CVCL_1187,EC-GI-10,6505803,Tanespimycin,0.38084375,Esophagus +CVCL_1231,GI-1,10385095,Telomerase Inhibitor IX,0.385,Brain +CVCL_1231,GI-1,24785538,BMS-754807,0.36959375,Brain +CVCL_1231,GI-1,44632017,YK-4-279,0.38984375,Brain +CVCL_1231,GI-1,5284616,Rapamycin,0.32225,Brain +CVCL_1231,GI-1,60750,Gemcitabine,0.29673125,Brain +CVCL_1231,GI-1,637858,Piperlongumine,0.41003125,Brain +CVCL_1231,GI-1,6505803,Tanespimycin,0.357875,Brain +CVCL_1245,HCC1143,10385095,Telomerase Inhibitor IX,0.372375,Breast +CVCL_1245,HCC1143,24785538,BMS-754807,0.42375,Breast +CVCL_1245,HCC1143,5284616,Rapamycin,0.28439375,Breast +CVCL_1245,HCC1143,637858,Piperlongumine,0.38290625,Breast +CVCL_1245,HCC1143,6505803,Tanespimycin,0.320125,Breast +CVCL_1254,HCC1500,10385095,Telomerase Inhibitor IX,0.3641875,Breast +CVCL_1254,HCC1500,24785538,BMS-754807,0.4016875,Breast +CVCL_1254,HCC1500,44632017,YK-4-279,0.4130625,Breast +CVCL_1254,HCC1500,5284616,Rapamycin,0.2782375,Breast +CVCL_1254,HCC1500,60750,Gemcitabine,0.39940625,Breast +CVCL_1254,HCC1500,637858,Piperlongumine,0.36925,Breast +CVCL_1254,HCC1500,6505803,Tanespimycin,0.26415625,Breast +CVCL_1255,HCC1569,5284616,Rapamycin,0.33734375,Breast +CVCL_1287,HSC-2,10385095,Telomerase Inhibitor IX,0.35425,Head And Neck +CVCL_1287,HSC-2,24785538,BMS-754807,0.38140625,Head And Neck +CVCL_1287,HSC-2,44632017,YK-4-279,0.4095625,Head And Neck +CVCL_1287,HSC-2,46224516,UNC0638,0.44428125,Head And Neck +CVCL_1287,HSC-2,5284616,Rapamycin,0.4235625,Head And Neck +CVCL_1287,HSC-2,60750,Gemcitabine,0.258253125,Head And Neck +CVCL_1287,HSC-2,637858,Piperlongumine,0.3915625,Head And Neck +CVCL_1287,HSC-2,6505803,Tanespimycin,0.301815625,Head And Neck +CVCL_1324,Karpas-299,10385095,Telomerase Inhibitor IX,0.35796875,Lymph +CVCL_1324,Karpas-299,24785538,BMS-754807,0.35409375,Lymph +CVCL_1324,Karpas-299,44632017,YK-4-279,0.33059375,Lymph +CVCL_1324,Karpas-299,5284616,Rapamycin,0.173925,Lymph +CVCL_1324,Karpas-299,60750,Gemcitabine,0.1101125,Lymph +CVCL_1324,Karpas-299,637858,Piperlongumine,0.3570625,Lymph +CVCL_1324,Karpas-299,6505803,Tanespimycin,0.265725,Lymph +CVCL_1327,KE-37,10385095,Telomerase Inhibitor IX,0.3266875,Blood +CVCL_1327,KE-37,24785538,BMS-754807,0.38271875,Blood +CVCL_1327,KE-37,44632017,YK-4-279,0.351625,Blood +CVCL_1327,KE-37,5284616,Rapamycin,0.185025,Blood +CVCL_1327,KE-37,60750,Gemcitabine,0.10346875,Blood +CVCL_1327,KE-37,637858,Piperlongumine,0.32384375,Blood +CVCL_1327,KE-37,6505803,Tanespimycin,0.3226875,Blood +CVCL_1335,KNS-62,10385095,Telomerase Inhibitor IX,0.38796875,Lung +CVCL_1335,KNS-62,24785538,BMS-754807,0.45878125,Lung +CVCL_1335,KNS-62,44632017,YK-4-279,0.44515625,Lung +CVCL_1335,KNS-62,46224516,UNC0638,0.4625,Lung +CVCL_1335,KNS-62,5284616,Rapamycin,0.4483125,Lung +CVCL_1335,KNS-62,60750,Gemcitabine,0.4055,Lung +CVCL_1335,KNS-62,637858,Piperlongumine,0.4515,Lung +CVCL_1335,KNS-62,6505803,Tanespimycin,0.34253125,Lung +CVCL_1344,KU-19-19,10385095,Telomerase Inhibitor IX,0.3736875,Bladder +CVCL_1344,KU-19-19,24785538,BMS-754807,0.4484375,Bladder +CVCL_1344,KU-19-19,44632017,YK-4-279,0.44259375,Bladder +CVCL_1344,KU-19-19,5284616,Rapamycin,0.46875,Bladder +CVCL_1344,KU-19-19,60750,Gemcitabine,0.3345,Bladder +CVCL_1344,KU-19-19,637858,Piperlongumine,0.4135,Bladder +CVCL_1344,KU-19-19,6505803,Tanespimycin,0.3154375,Bladder +CVCL_1345,Kuramochi,10385095,Telomerase Inhibitor IX,0.4043125,Ovary +CVCL_1345,Kuramochi,24785538,BMS-754807,0.37953125,Ovary +CVCL_1345,Kuramochi,44632017,YK-4-279,0.40609375,Ovary +CVCL_1345,Kuramochi,5284616,Rapamycin,0.4035625,Ovary +CVCL_1345,Kuramochi,60750,Gemcitabine,0.43234375,Ovary +CVCL_1345,Kuramochi,637858,Piperlongumine,0.43521875,Ovary +CVCL_1345,Kuramochi,6505803,Tanespimycin,0.40015625,Ovary +CVCL_1352,KYSE-410,10385095,Telomerase Inhibitor IX,0.396625,Esophagus +CVCL_1352,KYSE-410,24785538,BMS-754807,0.3986875,Esophagus +CVCL_1352,KYSE-410,44632017,YK-4-279,0.41159375,Esophagus +CVCL_1352,KYSE-410,46224516,UNC0638,0.4436875,Esophagus +CVCL_1352,KYSE-410,5284616,Rapamycin,0.264040625,Esophagus +CVCL_1352,KYSE-410,60750,Gemcitabine,0.4885,Esophagus +CVCL_1352,KYSE-410,637858,Piperlongumine,0.4044375,Esophagus +CVCL_1352,KYSE-410,6505803,Tanespimycin,0.27099375,Esophagus +CVCL_1379,LNCaP clone FGC,10385095,Telomerase Inhibitor IX,0.36084375,Prostate +CVCL_1379,LNCaP clone FGC,24785538,BMS-754807,0.39365625,Prostate +CVCL_1379,LNCaP clone FGC,44632017,YK-4-279,0.38696875,Prostate +CVCL_1379,LNCaP clone FGC,5284616,Rapamycin,0.207328125,Prostate +CVCL_1379,LNCaP clone FGC,60750,Gemcitabine,0.26639375,Prostate +CVCL_1379,LNCaP clone FGC,637858,Piperlongumine,0.39878125,Prostate +CVCL_1379,LNCaP clone FGC,6505803,Tanespimycin,0.285028125,Prostate +CVCL_1385,LS411N,10385095,Telomerase Inhibitor IX,0.4056875,Colon +CVCL_1385,LS411N,24785538,BMS-754807,0.3523125,Colon +CVCL_1385,LS411N,44632017,YK-4-279,0.4651875,Colon +CVCL_1385,LS411N,5284616,Rapamycin,0.459375,Colon +CVCL_1385,LS411N,60750,Gemcitabine,0.38815625,Colon +CVCL_1385,LS411N,637858,Piperlongumine,0.437125,Colon +CVCL_1385,LS411N,6505803,Tanespimycin,0.31853125,Colon +CVCL_1402,Mel Ho,10385095,Telomerase Inhibitor IX,0.3765,Skin +CVCL_1402,Mel Ho,24785538,BMS-754807,0.43975,Skin +CVCL_1402,Mel Ho,44632017,YK-4-279,0.40359375,Skin +CVCL_1402,Mel Ho,46224516,UNC0638,0.41440625,Skin +CVCL_1402,Mel Ho,60750,Gemcitabine,0.273259375,Skin +CVCL_1402,Mel Ho,637858,Piperlongumine,0.386,Skin +CVCL_1402,Mel Ho,6505803,Tanespimycin,0.38084375,Skin +CVCL_1411,MHH-ES-1,10385095,Telomerase Inhibitor IX,0.36878125,Bone +CVCL_1411,MHH-ES-1,24785538,BMS-754807,0.23294375,Bone +CVCL_1411,MHH-ES-1,44632017,YK-4-279,0.3335,Bone +CVCL_1411,MHH-ES-1,46224516,UNC0638,0.3750625,Bone +CVCL_1411,MHH-ES-1,5284616,Rapamycin,0.286071875,Bone +CVCL_1411,MHH-ES-1,60750,Gemcitabine,0.119296875,Bone +CVCL_1411,MHH-ES-1,637858,Piperlongumine,0.377,Bone +CVCL_1411,MHH-ES-1,6505803,Tanespimycin,0.31690625,Bone +CVCL_1415,MKN1,10385095,Telomerase Inhibitor IX,0.39021875,Stomach +CVCL_1415,MKN1,24785538,BMS-754807,0.39334375,Stomach +CVCL_1415,MKN1,44632017,YK-4-279,0.4510625,Stomach +CVCL_1415,MKN1,46224516,UNC0638,0.451,Stomach +CVCL_1415,MKN1,5284616,Rapamycin,0.45784375,Stomach +CVCL_1415,MKN1,60750,Gemcitabine,0.36575,Stomach +CVCL_1415,MKN1,637858,Piperlongumine,0.4195625,Stomach +CVCL_1415,MKN1,6505803,Tanespimycin,0.45753125,Stomach +CVCL_1454,NCI-H1092,10385095,Telomerase Inhibitor IX,0.35925,Lung +CVCL_1454,NCI-H1092,24785538,BMS-754807,0.360625,Lung +CVCL_1454,NCI-H1092,44632017,YK-4-279,0.410375,Lung +CVCL_1454,NCI-H1092,5284616,Rapamycin,0.41621875,Lung +CVCL_1454,NCI-H1092,60750,Gemcitabine,0.291221875,Lung +CVCL_1454,NCI-H1092,6505803,Tanespimycin,0.419,Lung +CVCL_1455,NCI-H1105,10385095,Telomerase Inhibitor IX,0.35596875,Lung +CVCL_1455,NCI-H1105,24785538,BMS-754807,0.308325,Lung +CVCL_1455,NCI-H1105,44632017,YK-4-279,0.3963125,Lung +CVCL_1455,NCI-H1105,46224516,UNC0638,0.37878125,Lung +CVCL_1455,NCI-H1105,5284616,Rapamycin,0.4498125,Lung +CVCL_1455,NCI-H1105,60750,Gemcitabine,0.186275,Lung +CVCL_1455,NCI-H1105,637858,Piperlongumine,0.323125,Lung +CVCL_1455,NCI-H1105,6505803,Tanespimycin,0.37746875,Lung +CVCL_1456,NCI-H1155,10385095,Telomerase Inhibitor IX,0.3343125,Lung +CVCL_1456,NCI-H1155,24785538,BMS-754807,0.4095,Lung +CVCL_1456,NCI-H1155,44632017,YK-4-279,0.34128125,Lung +CVCL_1456,NCI-H1155,5284616,Rapamycin,0.323375,Lung +CVCL_1456,NCI-H1155,60750,Gemcitabine,0.16751875,Lung +CVCL_1456,NCI-H1155,637858,Piperlongumine,0.39740625,Lung +CVCL_1456,NCI-H1155,6505803,Tanespimycin,0.219084375,Lung +CVCL_1464,NCI-H1355,10385095,Telomerase Inhibitor IX,0.39446875,Lung +CVCL_1464,NCI-H1355,24785538,BMS-754807,0.400375,Lung +CVCL_1464,NCI-H1355,44632017,YK-4-279,0.378625,Lung +CVCL_1464,NCI-H1355,46224516,UNC0638,0.42959375,Lung +CVCL_1464,NCI-H1355,5284616,Rapamycin,0.312384375,Lung +CVCL_1464,NCI-H1355,60750,Gemcitabine,0.38084375,Lung +CVCL_1464,NCI-H1355,637858,Piperlongumine,0.42240625,Lung +CVCL_1464,NCI-H1355,6505803,Tanespimycin,0.3341875,Lung +CVCL_1479,NCI-H1581,10385095,Telomerase Inhibitor IX,0.34428125,Lung +CVCL_1479,NCI-H1581,24785538,BMS-754807,0.363125,Lung +CVCL_1479,NCI-H1581,44632017,YK-4-279,0.37025,Lung +CVCL_1479,NCI-H1581,5284616,Rapamycin,0.284821875,Lung +CVCL_1479,NCI-H1581,60750,Gemcitabine,0.27036875,Lung +CVCL_1479,NCI-H1581,637858,Piperlongumine,0.389375,Lung +CVCL_1479,NCI-H1581,6505803,Tanespimycin,0.3311875,Lung +CVCL_1515,NCI-H2023,10385095,Telomerase Inhibitor IX,0.38171875,Lung +CVCL_1515,NCI-H2023,24785538,BMS-754807,0.355875,Lung +CVCL_1515,NCI-H2023,44632017,YK-4-279,0.440875,Lung +CVCL_1515,NCI-H2023,5284616,Rapamycin,0.3226875,Lung +CVCL_1515,NCI-H2023,637858,Piperlongumine,0.4458125,Lung +CVCL_1515,NCI-H2023,6505803,Tanespimycin,0.34721875,Lung +CVCL_1525,NCI-H209,5284616,Rapamycin,0.210171875,Lung +CVCL_1529,NCI-H211,10385095,Telomerase Inhibitor IX,0.3660625,Lung +CVCL_1529,NCI-H211,24785538,BMS-754807,0.32465625,Lung +CVCL_1529,NCI-H211,44632017,YK-4-279,0.36165625,Lung +CVCL_1529,NCI-H211,46224516,UNC0638,0.37965625,Lung +CVCL_1529,NCI-H211,5284616,Rapamycin,0.2396875,Lung +CVCL_1529,NCI-H211,60750,Gemcitabine,0.172121875,Lung +CVCL_1529,NCI-H211,637858,Piperlongumine,0.37671875,Lung +CVCL_1529,NCI-H211,6505803,Tanespimycin,0.268971875,Lung +CVCL_1536,NCI-H2171,10385095,Telomerase Inhibitor IX,0.34575,Lung +CVCL_1536,NCI-H2171,24785538,BMS-754807,0.27309375,Lung +CVCL_1536,NCI-H2171,60750,Gemcitabine,0.2535125,Lung +CVCL_1536,NCI-H2171,6505803,Tanespimycin,0.295246875,Lung +CVCL_1539,NCI-H2196,10385095,Telomerase Inhibitor IX,0.374,Lung +CVCL_1539,NCI-H2196,24785538,BMS-754807,0.53078125,Lung +CVCL_1539,NCI-H2196,44632017,YK-4-279,0.423125,Lung +CVCL_1539,NCI-H2196,5284616,Rapamycin,0.31890625,Lung +CVCL_1539,NCI-H2196,60750,Gemcitabine,0.32725,Lung +CVCL_1539,NCI-H2196,637858,Piperlongumine,0.37478125,Lung +CVCL_1539,NCI-H2196,6505803,Tanespimycin,0.34896875,Lung +CVCL_1545,NCI-H2286,10385095,Telomerase Inhibitor IX,0.44959375,Lung +CVCL_1545,NCI-H2286,44632017,YK-4-279,0.3824375,Lung +CVCL_1545,NCI-H2286,46224516,UNC0638,0.444625,Lung +CVCL_1545,NCI-H2286,5284616,Rapamycin,0.289090625,Lung +CVCL_1545,NCI-H2286,60750,Gemcitabine,0.35396875,Lung +CVCL_1545,NCI-H2286,637858,Piperlongumine,0.4551875,Lung +CVCL_1545,NCI-H2286,6505803,Tanespimycin,0.386375,Lung +CVCL_1559,NCI-H358,10385095,Telomerase Inhibitor IX,0.40003125,Lung +CVCL_1559,NCI-H358,24785538,BMS-754807,0.274240625,Lung +CVCL_1559,NCI-H358,44632017,YK-4-279,0.32603125,Lung +CVCL_1559,NCI-H358,5284616,Rapamycin,0.3014375,Lung +CVCL_1559,NCI-H358,60750,Gemcitabine,0.38,Lung +CVCL_1559,NCI-H358,637858,Piperlongumine,0.40175,Lung +CVCL_1559,NCI-H358,6505803,Tanespimycin,0.31628125,Lung +CVCL_1565,NCI-H510A,60750,Gemcitabine,0.201834375,Lung +CVCL_1569,NCI-H526,10385095,Telomerase Inhibitor IX,0.34921875,Lung +CVCL_1569,NCI-H526,24785538,BMS-754807,0.2641625,Lung +CVCL_1569,NCI-H526,44632017,YK-4-279,0.35521875,Lung +CVCL_1569,NCI-H526,46224516,UNC0638,0.4079375,Lung +CVCL_1569,NCI-H526,5284616,Rapamycin,0.31571875,Lung +CVCL_1569,NCI-H526,637858,Piperlongumine,0.34075,Lung +CVCL_1569,NCI-H526,6505803,Tanespimycin,0.373625,Lung +CVCL_1619,OCI-AML-2,10385095,Telomerase Inhibitor IX,0.35875,Blood +CVCL_1619,OCI-AML-2,24785538,BMS-754807,0.282303125,Blood +CVCL_1619,OCI-AML-2,44632017,YK-4-279,0.3454375,Blood +CVCL_1619,OCI-AML-2,5284616,Rapamycin,0.35440625,Blood +CVCL_1619,OCI-AML-2,60750,Gemcitabine,0.152353125,Blood +CVCL_1619,OCI-AML-2,637858,Piperlongumine,0.30713125,Blood +CVCL_1619,OCI-AML-2,6505803,Tanespimycin,0.214209375,Blood +CVCL_1624,ONS-76,10385095,Telomerase Inhibitor IX,0.37684375,Brain +CVCL_1624,ONS-76,24785538,BMS-754807,0.41290625,Brain +CVCL_1624,ONS-76,44632017,YK-4-279,0.41159375,Brain +CVCL_1624,ONS-76,5284616,Rapamycin,0.3883125,Brain +CVCL_1624,ONS-76,60750,Gemcitabine,0.3559375,Brain +CVCL_1624,ONS-76,637858,Piperlongumine,0.42675,Brain +CVCL_1624,ONS-76,6505803,Tanespimycin,0.37853125,Brain +CVCL_1626,OS-RC-2,10385095,Telomerase Inhibitor IX,0.416875,Kidney +CVCL_1626,OS-RC-2,24785538,BMS-754807,0.41296875,Kidney +CVCL_1626,OS-RC-2,44632017,YK-4-279,0.44465625,Kidney +CVCL_1626,OS-RC-2,5284616,Rapamycin,0.32253125,Kidney +CVCL_1626,OS-RC-2,60750,Gemcitabine,0.37428125,Kidney +CVCL_1626,OS-RC-2,637858,Piperlongumine,0.415125,Kidney +CVCL_1626,OS-RC-2,6505803,Tanespimycin,0.36615625,Kidney +CVCL_1633,Panc 02.03,10385095,Telomerase Inhibitor IX,0.39734375,Pancreas +CVCL_1633,Panc 02.03,24785538,BMS-754807,0.41815625,Pancreas +CVCL_1633,Panc 02.03,44632017,YK-4-279,0.435375,Pancreas +CVCL_1633,Panc 02.03,46224516,UNC0638,0.43834375,Pancreas +CVCL_1633,Panc 02.03,5284616,Rapamycin,0.42034375,Pancreas +CVCL_1633,Panc 02.03,60750,Gemcitabine,0.4000625,Pancreas +CVCL_1633,Panc 02.03,637858,Piperlongumine,0.43315625,Pancreas +CVCL_1633,Panc 02.03,6505803,Tanespimycin,0.33140625,Pancreas +CVCL_1649,RD,10385095,Telomerase Inhibitor IX,0.39846875,Muscle +CVCL_1649,RD,24785538,BMS-754807,0.32625,Muscle +CVCL_1649,RD,44632017,YK-4-279,0.39271875,Muscle +CVCL_1649,RD,5284616,Rapamycin,0.3299375,Muscle +CVCL_1649,RD,60750,Gemcitabine,0.32884375,Muscle +CVCL_1649,RD,637858,Piperlongumine,0.38353125,Muscle +CVCL_1649,RD,6505803,Tanespimycin,0.274021875,Muscle +CVCL_1651,RERF-LC-Ad1,10385095,Telomerase Inhibitor IX,0.41696875,Lung +CVCL_1651,RERF-LC-Ad1,24785538,BMS-754807,0.43915625,Lung +CVCL_1651,RERF-LC-Ad1,44632017,YK-4-279,0.42653125,Lung +CVCL_1651,RERF-LC-Ad1,637858,Piperlongumine,0.435625,Lung +CVCL_1651,RERF-LC-Ad1,6505803,Tanespimycin,0.51296875,Lung +CVCL_1679,SBC-5,10385095,Telomerase Inhibitor IX,0.41465625,Lung +CVCL_1679,SBC-5,24785538,BMS-754807,0.441,Lung +CVCL_1679,SBC-5,44632017,YK-4-279,0.351125,Lung +CVCL_1679,SBC-5,46224516,UNC0638,0.46240625,Lung +CVCL_1679,SBC-5,5284616,Rapamycin,0.51946875,Lung +CVCL_1679,SBC-5,60750,Gemcitabine,0.149540625,Lung +CVCL_1679,SBC-5,637858,Piperlongumine,0.45340625,Lung +CVCL_1679,SBC-5,6505803,Tanespimycin,0.45259375,Lung +CVCL_1682,SCC-25,10385095,Telomerase Inhibitor IX,0.3916875,Head And Neck +CVCL_1682,SCC-25,24785538,BMS-754807,0.338,Head And Neck +CVCL_1682,SCC-25,44632017,YK-4-279,0.314375,Head And Neck +CVCL_1682,SCC-25,46224516,UNC0638,0.3573125,Head And Neck +CVCL_1682,SCC-25,5284616,Rapamycin,0.269346875,Head And Neck +CVCL_1682,SCC-25,60750,Gemcitabine,0.32890625,Head And Neck +CVCL_1682,SCC-25,637858,Piperlongumine,0.3865625,Head And Neck +CVCL_1682,SCC-25,6505803,Tanespimycin,0.282709375,Head And Neck +CVCL_1690,SF295,10385095,Telomerase Inhibitor IX,0.39825,Brain +CVCL_1690,SF295,24785538,BMS-754807,0.37371875,Brain +CVCL_1690,SF295,44632017,YK-4-279,0.43053125,Brain +CVCL_1690,SF295,46224516,UNC0638,0.42690625,Brain +CVCL_1690,SF295,5284616,Rapamycin,0.3511875,Brain +CVCL_1690,SF295,637858,Piperlongumine,0.43190625,Brain +CVCL_1690,SF295,6505803,Tanespimycin,0.357875,Brain +CVCL_1700,SK-N-AS,10385095,Telomerase Inhibitor IX,0.368875,Nervous System +CVCL_1700,SK-N-AS,24785538,BMS-754807,0.3315625,Nervous System +CVCL_1700,SK-N-AS,44632017,YK-4-279,0.35096875,Nervous System +CVCL_1700,SK-N-AS,5284616,Rapamycin,0.312625,Nervous System +CVCL_1700,SK-N-AS,60750,Gemcitabine,0.294925,Nervous System +CVCL_1700,SK-N-AS,637858,Piperlongumine,0.381375,Nervous System +CVCL_1700,SK-N-AS,6505803,Tanespimycin,0.3573125,Nervous System +CVCL_1754,TE 441.T,10385095,Telomerase Inhibitor IX,0.3526875,Muscle +CVCL_1754,TE 441.T,24785538,BMS-754807,0.2330625,Muscle +CVCL_1754,TE 441.T,44632017,YK-4-279,0.3879375,Muscle +CVCL_1754,TE 441.T,46224516,UNC0638,0.326375,Muscle +CVCL_1754,TE 441.T,5284616,Rapamycin,,Muscle +CVCL_1754,TE 441.T,60750,Gemcitabine,0.1824875,Muscle +CVCL_1754,TE 441.T,637858,Piperlongumine,0.32890625,Muscle +CVCL_1754,TE 441.T,6505803,Tanespimycin,0.253096875,Muscle +CVCL_1760,TE-10,10385095,Telomerase Inhibitor IX,0.40996875,Esophagus +CVCL_1760,TE-10,24785538,BMS-754807,0.38053125,Esophagus +CVCL_1760,TE-10,44632017,YK-4-279,0.3818125,Esophagus +CVCL_1760,TE-10,637858,Piperlongumine,0.41546875,Esophagus +CVCL_1760,TE-10,6505803,Tanespimycin,0.333125,Esophagus +CVCL_1767,TE-9,10385095,Telomerase Inhibitor IX,0.37159375,Esophagus +CVCL_1767,TE-9,24785538,BMS-754807,0.3819375,Esophagus +CVCL_1767,TE-9,44632017,YK-4-279,0.3823125,Esophagus +CVCL_1767,TE-9,46224516,UNC0638,0.45603125,Esophagus +CVCL_1767,TE-9,5284616,Rapamycin,0.48384375,Esophagus +CVCL_1767,TE-9,637858,Piperlongumine,0.43378125,Esophagus +CVCL_1767,TE-9,6505803,Tanespimycin,0.3259375,Esophagus +CVCL_1774,TT,10385095,Telomerase Inhibitor IX,0.39140625,Esophagus +CVCL_1774,TT,24785538,BMS-754807,0.33125,Esophagus +CVCL_1774,TT,44632017,YK-4-279,0.40334375,Esophagus +CVCL_1774,TT,46224516,UNC0638,0.411625,Esophagus +CVCL_1774,TT,5284616,Rapamycin,0.46475,Esophagus +CVCL_1774,TT,60750,Gemcitabine,0.389,Esophagus +CVCL_1774,TT,637858,Piperlongumine,0.43365625,Esophagus +CVCL_1774,TT,6505803,Tanespimycin,0.282309375,Esophagus +CVCL_1783,UM-UC-3,10385095,Telomerase Inhibitor IX,0.36725,Bladder +CVCL_1783,UM-UC-3,24785538,BMS-754807,0.41184375,Bladder +CVCL_1783,UM-UC-3,44632017,YK-4-279,0.42259375,Bladder +CVCL_1783,UM-UC-3,46224516,UNC0638,0.46871875,Bladder +CVCL_1783,UM-UC-3,5284616,Rapamycin,0.341625,Bladder +CVCL_1783,UM-UC-3,637858,Piperlongumine,0.4056875,Bladder +CVCL_1783,UM-UC-3,6505803,Tanespimycin,0.31041875,Bladder +CVCL_1798,42-MG-BA,10385095,Telomerase Inhibitor IX,0.37415625,Brain +CVCL_1798,42-MG-BA,24785538,BMS-754807,0.40790625,Brain +CVCL_1798,42-MG-BA,44632017,YK-4-279,0.43340625,Brain +CVCL_1798,42-MG-BA,46224516,UNC0638,0.4256875,Brain +CVCL_1798,42-MG-BA,5284616,Rapamycin,0.33621875,Brain +CVCL_1798,42-MG-BA,60750,Gemcitabine,0.233009375,Brain +CVCL_1798,42-MG-BA,637858,Piperlongumine,0.21620625,Brain +CVCL_1798,42-MG-BA,6505803,Tanespimycin,0.1744875,Brain +CVCL_1818,Granta-519,10385095,Telomerase Inhibitor IX,0.36165625,Lymph +CVCL_1818,Granta-519,24785538,BMS-754807,0.36040625,Lymph +CVCL_1818,Granta-519,44632017,YK-4-279,0.34,Lymph +CVCL_1818,Granta-519,5284616,Rapamycin,0.2549125,Lymph +CVCL_1818,Granta-519,60750,Gemcitabine,0.04529375,Lymph +CVCL_1818,Granta-519,637858,Piperlongumine,0.36890625,Lymph +CVCL_1818,Granta-519,6505803,Tanespimycin,0.33628125,Lymph +CVCL_1847,PaTu 8988t,10385095,Telomerase Inhibitor IX,0.38865625,Pancreas +CVCL_1847,PaTu 8988t,24785538,BMS-754807,0.449375,Pancreas +CVCL_1847,PaTu 8988t,44632017,YK-4-279,0.430125,Pancreas +CVCL_1847,PaTu 8988t,46224516,UNC0638,0.44453125,Pancreas +CVCL_1847,PaTu 8988t,5284616,Rapamycin,0.5428125,Pancreas +CVCL_1847,PaTu 8988t,60750,Gemcitabine,0.43771875,Pancreas +CVCL_1847,PaTu 8988t,637858,Piperlongumine,0.43028125,Pancreas +CVCL_1847,PaTu 8988t,6505803,Tanespimycin,0.30295,Pancreas +CVCL_2063,HCC827,10385095,Telomerase Inhibitor IX,0.3944375,Lung +CVCL_2063,HCC827,24785538,BMS-754807,0.348625,Lung +CVCL_2063,HCC827,44632017,YK-4-279,0.372625,Lung +CVCL_2063,HCC827,60750,Gemcitabine,0.37684375,Lung +CVCL_2063,HCC827,637858,Piperlongumine,0.3955625,Lung +CVCL_2063,HCC827,6505803,Tanespimycin,0.297625,Lung +CVCL_2094,KPL-1,10385095,Telomerase Inhibitor IX,0.45453125,Breast +CVCL_2094,KPL-1,24785538,BMS-754807,0.3328125,Breast +CVCL_2094,KPL-1,44632017,YK-4-279,0.51471875,Breast +CVCL_2094,KPL-1,46224516,UNC0638,0.39803125,Breast +CVCL_2094,KPL-1,5284616,Rapamycin,0.50359375,Breast +CVCL_2094,KPL-1,60750,Gemcitabine,0.417125,Breast +CVCL_2094,KPL-1,6505803,Tanespimycin,0.462375,Breast +CVCL_2209,SUP-M2,10385095,Telomerase Inhibitor IX,0.33640625,Lymph +CVCL_2209,SUP-M2,24785538,BMS-754807,0.3694375,Lymph +CVCL_2209,SUP-M2,44632017,YK-4-279,0.310875,Lymph +CVCL_2209,SUP-M2,5284616,Rapamycin,0.083165625,Lymph +CVCL_2209,SUP-M2,60750,Gemcitabine,0.32696875,Lymph +CVCL_2209,SUP-M2,637858,Piperlongumine,0.345625,Lymph +CVCL_2209,SUP-M2,6505803,Tanespimycin,0.2618375,Lymph +CVCL_2891,EBC-1,10385095,Telomerase Inhibitor IX,0.3688125,Lung +CVCL_2891,EBC-1,24785538,BMS-754807,0.32909375,Lung +CVCL_2891,EBC-1,44632017,YK-4-279,0.3876875,Lung +CVCL_2891,EBC-1,46224516,UNC0638,0.3884375,Lung +CVCL_2891,EBC-1,5284616,Rapamycin,0.196075,Lung +CVCL_2891,EBC-1,637858,Piperlongumine,0.39296875,Lung +CVCL_2891,EBC-1,6505803,Tanespimycin,0.234453125,Lung +CVCL_3004,KP-2,10385095,Telomerase Inhibitor IX,0.4323125,Pancreas +CVCL_3004,KP-2,24785538,BMS-754807,0.3703125,Pancreas +CVCL_3004,KP-2,44632017,YK-4-279,0.41803125,Pancreas +CVCL_3004,KP-2,46224516,UNC0638,0.44834375,Pancreas +CVCL_3004,KP-2,5284616,Rapamycin,0.453,Pancreas +CVCL_3004,KP-2,60750,Gemcitabine,0.46421875,Pancreas +CVCL_3004,KP-2,637858,Piperlongumine,0.4514375,Pancreas +CVCL_3004,KP-2,6505803,Tanespimycin,0.33521875,Pancreas +CVCL_3116,OVISE,24785538,BMS-754807,0.45146875,Ovary +CVCL_3116,OVISE,5284616,Rapamycin,0.403375,Ovary +CVCL_3116,OVISE,60750,Gemcitabine,0.4329375,Ovary +CVCL_3117,OVTOKO,10385095,Telomerase Inhibitor IX,0.362875,Ovary +CVCL_3117,OVTOKO,24785538,BMS-754807,0.38534375,Ovary +CVCL_3117,OVTOKO,44632017,YK-4-279,0.4330625,Ovary +CVCL_3117,OVTOKO,5284616,Rapamycin,0.33521875,Ovary +CVCL_3117,OVTOKO,60750,Gemcitabine,0.2388375,Ovary +CVCL_3117,OVTOKO,637858,Piperlongumine,0.41553125,Ovary +CVCL_3117,OVTOKO,6505803,Tanespimycin,0.3994375,Ovary +CVCL_4381,HuH-6,10385095,Telomerase Inhibitor IX,0.38865625,Liver +CVCL_4381,HuH-6,24785538,BMS-754807,0.3709375,Liver +CVCL_4381,HuH-6,44632017,YK-4-279,0.4213125,Liver +CVCL_4381,HuH-6,46224516,UNC0638,0.33090625,Liver +CVCL_4381,HuH-6,5284616,Rapamycin,0.308440625,Liver +CVCL_4381,HuH-6,637858,Piperlongumine,0.36221875,Liver +CVCL_4381,HuH-6,6505803,Tanespimycin,0.337125,Liver +CVCL_5031,SNU-175,10385095,Telomerase Inhibitor IX,0.30868125,Colon +CVCL_5031,SNU-175,24785538,BMS-754807,0.2702,Colon +CVCL_5031,SNU-175,44632017,YK-4-279,0.34909375,Colon +CVCL_5031,SNU-175,60750,Gemcitabine,0.339,Colon +CVCL_5031,SNU-175,637858,Piperlongumine,0.275921875,Colon +CVCL_5031,SNU-175,6505803,Tanespimycin,0.2113375,Colon +CVCL_5069,SNU-489,10385095,Telomerase Inhibitor IX,0.405625,Brain +CVCL_5069,SNU-489,24785538,BMS-754807,0.39403125,Brain +CVCL_5069,SNU-489,44632017,YK-4-279,0.40484375,Brain +CVCL_5069,SNU-489,46224516,UNC0638,0.3970625,Brain +CVCL_5069,SNU-489,5284616,Rapamycin,0.39153125,Brain +CVCL_5069,SNU-489,60750,Gemcitabine,0.35434375,Brain +CVCL_5069,SNU-489,637858,Piperlongumine,0.456875,Brain +CVCL_5069,SNU-489,6505803,Tanespimycin,0.40015625,Brain +CVCL_5098,SNU-81,5284616,Rapamycin,0.4081875,Colon +CVCL_A351,HCC1588,10385095,Telomerase Inhibitor IX,0.38575,Lung +CVCL_A351,HCC1588,24785538,BMS-754807,0.22660625,Lung +CVCL_A351,HCC1588,44632017,YK-4-279,0.37215625,Lung +CVCL_A351,HCC1588,46224516,UNC0638,0.41734375,Lung +CVCL_A351,HCC1588,60750,Gemcitabine,0.238165625,Lung +CVCL_A351,HCC1588,637858,Piperlongumine,0.38346875,Lung +CVCL_A351,HCC1588,6505803,Tanespimycin,0.2637875,Lung +CVCL_A352,HCC2108,10385095,Telomerase Inhibitor IX,0.37790625,Lung +CVCL_A352,HCC2108,24785538,BMS-754807,0.3445625,Lung +CVCL_A352,HCC2108,44632017,YK-4-279,0.402875,Lung +CVCL_A352,HCC2108,46224516,UNC0638,0.46328125,Lung +CVCL_A352,HCC2108,5284616,Rapamycin,0.36253125,Lung +CVCL_A352,HCC2108,60750,Gemcitabine,0.39134375,Lung +CVCL_A352,HCC2108,637858,Piperlongumine,0.39509375,Lung +CVCL_A352,HCC2108,6505803,Tanespimycin,0.31884375,Lung +CVCL_L083,YD-38,10385095,Telomerase Inhibitor IX,0.37771875,Head And Neck +CVCL_L083,YD-38,24785538,BMS-754807,0.4094375,Head And Neck +CVCL_L083,YD-38,44632017,YK-4-279,0.35840625,Head And Neck +CVCL_L083,YD-38,46224516,UNC0638,0.43371875,Head And Neck +CVCL_L083,YD-38,5284616,Rapamycin,0.402875,Head And Neck +CVCL_L083,YD-38,637858,Piperlongumine,0.4015625,Head And Neck +CVCL_L083,YD-38,6505803,Tanespimycin,0.287784375,Head And Neck +CVCL_3172,SUIT-2,10385095,Telomerase Inhibitor IX,0.502640625,Pancreas +CVCL_3172,SUIT-2,10385095,Telomerase Inhibitor IX,0.502640625,Pancreas +CVCL_3172,SUIT-2,24785538,BMS-754807,0.387,Pancreas +CVCL_3172,SUIT-2,24785538,BMS-754807,0.387,Pancreas +CVCL_3172,SUIT-2,44632017,YK-4-279,0.44425,Pancreas +CVCL_3172,SUIT-2,44632017,YK-4-279,0.44425,Pancreas +CVCL_3172,SUIT-2,46224516,UNC0638,0.434625,Pancreas +CVCL_3172,SUIT-2,46224516,UNC0638,0.434625,Pancreas +CVCL_3172,SUIT-2,5284616,Rapamycin,0.423109375,Pancreas +CVCL_3172,SUIT-2,5284616,Rapamycin,0.423109375,Pancreas +CVCL_3172,SUIT-2,60750,Gemcitabine,0.3180546875,Pancreas +CVCL_3172,SUIT-2,60750,Gemcitabine,0.3180546875,Pancreas +CVCL_3172,SUIT-2,637858,Piperlongumine,0.441921875,Pancreas +CVCL_3172,SUIT-2,637858,Piperlongumine,0.441921875,Pancreas +CVCL_3172,SUIT-2,6505803,Tanespimycin,0.433765625,Pancreas +CVCL_3172,SUIT-2,6505803,Tanespimycin,0.433765625,Pancreas +CVCL_1045,22Rv1,637858,Piperlongumine,0.40515625,Prostate +CVCL_1045,22Rv1,6505803,Tanespimycin,0.3405625,Prostate +CVCL_1245,HCC1143,36314,Paclitaxel,0.259353125,Breast +CVCL_1767,TE-9,9926054,BMS-345541,0.38865625,Esophagus +CVCL_3116,OVISE,637858,Piperlongumine,0.40346875,Ovary +CVCL_3116,OVISE,6505803,Tanespimycin,0.43784375,Ovary +CVCL_1525,NCI-H209,36314,Paclitaxel,0.25153125,Lung +CVCL_0620,MDA-MB-361,637858,Piperlongumine,0.39540625,Breast +CVCL_0620,MDA-MB-361,6505803,Tanespimycin,0.060046875,Breast +CVCL_1245,HCC1143,11228183,ABT-737,0.3965,Breast +CVCL_3116,OVISE,11228183,ABT-737,0.360875,Ovary +CVCL_5098,SNU-81,16720766,Pevonedistat,0.319875,Colon +CVCL_0012,LP-1,11228183,ABT-737,0.4315625,Blood +CVCL_0012,LP-1,16720766,Pevonedistat,0.3595625,Blood +CVCL_0029,EFO-21,11228183,ABT-737,0.45571875,Ovary +CVCL_0067,Namalwa,11228183,ABT-737,0.45178125,Lymph +CVCL_0080,A-673,11228183,ABT-737,0.390375,Bone +CVCL_0099,SNU-1,11228183,ABT-737,0.342125,Stomach +CVCL_0134,A2780,11228183,ABT-737,0.3750625,Ovary +CVCL_0134,A2780,16720766,Pevonedistat,0.329625,Ovary +CVCL_0178,BT-20,11228183,ABT-737,0.4285625,Breast +CVCL_0178,BT-20,16720766,Pevonedistat,0.41471875,Breast +CVCL_0379,Ku812,11228183,ABT-737,0.372125,Blood +CVCL_0379,Ku812,16720766,Pevonedistat,0.289078125,Blood +CVCL_0428,MIA PaCa-2,11228183,ABT-737,0.46053125,Pancreas +CVCL_0428,MIA PaCa-2,16720766,Pevonedistat,0.35921875,Pancreas +CVCL_0533,SK-UT-1,11228183,ABT-737,0.45975,Soft Tissue +CVCL_0533,SK-UT-1,16720766,Pevonedistat,0.3675625,Soft Tissue +CVCL_0547,SW620,11228183,ABT-737,0.413375,Colon +CVCL_0547,SW620,16720766,Pevonedistat,0.3400625,Colon +CVCL_0599,SK-MEL-24,11228183,ABT-737,0.434625,Skin +CVCL_0599,SK-MEL-24,16720766,Pevonedistat,0.424,Skin +CVCL_0600,SK-MEL-31,11228183,ABT-737,0.31525,Skin +CVCL_0600,SK-MEL-31,16720766,Pevonedistat,0.4651875,Skin +CVCL_0620,MDA-MB-361,11228183,ABT-737,0.42165625,Breast +CVCL_0620,MDA-MB-361,16720766,Pevonedistat,0.267871875,Breast +CVCL_0629,SK-LU-1,11228183,ABT-737,0.43953125,Lung +CVCL_0629,SK-LU-1,16720766,Pevonedistat,0.37946875,Lung +CVCL_1045,22Rv1,11228183,ABT-737,0.40515625,Prostate +CVCL_1045,22Rv1,16720766,Pevonedistat,0.322375,Prostate +CVCL_1082,BEN,11228183,ABT-737,0.45071875,Lung +CVCL_1082,BEN,16720766,Pevonedistat,0.46440625,Lung +CVCL_1085,BHT-101,11228183,ABT-737,0.4535,Thyroid +CVCL_1085,BHT-101,16720766,Pevonedistat,0.3564375,Thyroid +CVCL_1105,CAL-12T,11228183,ABT-737,0.45265625,Lung +CVCL_1105,CAL-12T,16720766,Pevonedistat,0.4015625,Lung +CVCL_1133,COLO 741,11228183,ABT-737,0.3311875,Skin +CVCL_1133,COLO 741,16720766,Pevonedistat,0.290721875,Skin +CVCL_1167,Daoy,11228183,ABT-737,0.4493125,Brain +CVCL_1167,Daoy,16720766,Pevonedistat,0.282403125,Brain +CVCL_1183,DU4475,11228183,ABT-737,0.3286875,Breast +CVCL_1187,EC-GI-10,11228183,ABT-737,0.42246875,Esophagus +CVCL_1231,GI-1,11228183,ABT-737,0.4419375,Brain +CVCL_1231,GI-1,16720766,Pevonedistat,0.39728125,Brain +CVCL_1245,HCC1143,16720766,Pevonedistat,0.38628125,Breast +CVCL_1254,HCC1500,11228183,ABT-737,0.16915,Breast +CVCL_1254,HCC1500,16720766,Pevonedistat,0.39440625,Breast +CVCL_1287,HSC-2,11228183,ABT-737,0.3953125,Head And Neck +CVCL_1287,HSC-2,16720766,Pevonedistat,0.3469375,Head And Neck +CVCL_1324,Karpas-299,11228183,ABT-737,0.43578125,Lymph +CVCL_1324,Karpas-299,16720766,Pevonedistat,0.336,Lymph +CVCL_1327,KE-37,11228183,ABT-737,0.25294375,Blood +CVCL_1327,KE-37,16720766,Pevonedistat,0.28093125,Blood +CVCL_1335,KNS-62,11228183,ABT-737,0.4476875,Lung +CVCL_1335,KNS-62,16720766,Pevonedistat,0.37228125,Lung +CVCL_1344,KU-19-19,11228183,ABT-737,0.491625,Bladder +CVCL_1344,KU-19-19,16720766,Pevonedistat,0.3756875,Bladder +CVCL_1345,Kuramochi,11228183,ABT-737,0.417125,Ovary +CVCL_1345,Kuramochi,16720766,Pevonedistat,0.44778125,Ovary +CVCL_1352,KYSE-410,11228183,ABT-737,0.39225,Esophagus +CVCL_1352,KYSE-410,16720766,Pevonedistat,0.36721875,Esophagus +CVCL_1379,LNCaP clone FGC,11228183,ABT-737,0.435625,Prostate +CVCL_1385,LS411N,11228183,ABT-737,0.45690625,Colon +CVCL_1385,LS411N,16720766,Pevonedistat,0.3945,Colon +CVCL_1402,Mel Ho,11228183,ABT-737,0.44709375,Skin +CVCL_1402,Mel Ho,16720766,Pevonedistat,0.338,Skin +CVCL_1411,MHH-ES-1,11228183,ABT-737,0.4270625,Bone +CVCL_1411,MHH-ES-1,16720766,Pevonedistat,0.256553125,Bone +CVCL_1415,MKN1,11228183,ABT-737,0.442875,Stomach +CVCL_1415,MKN1,16720766,Pevonedistat,0.47725,Stomach +CVCL_1454,NCI-H1092,11228183,ABT-737,0.35196875,Lung +CVCL_1454,NCI-H1092,16720766,Pevonedistat,0.56515625,Lung +CVCL_1455,NCI-H1105,11228183,ABT-737,0.21599375,Lung +CVCL_1455,NCI-H1105,16720766,Pevonedistat,0.3745,Lung +CVCL_1456,NCI-H1155,11228183,ABT-737,0.27691875,Lung +CVCL_1456,NCI-H1155,16720766,Pevonedistat,0.245365625,Lung +CVCL_1464,NCI-H1355,11228183,ABT-737,0.39603125,Lung +CVCL_1464,NCI-H1355,16720766,Pevonedistat,0.35459375,Lung +CVCL_1479,NCI-H1581,11228183,ABT-737,0.43403125,Lung +CVCL_1479,NCI-H1581,16720766,Pevonedistat,0.300159375,Lung +CVCL_1515,NCI-H2023,11228183,ABT-737,0.452375,Lung +CVCL_1515,NCI-H2023,16720766,Pevonedistat,0.3425,Lung +CVCL_1529,NCI-H211,11228183,ABT-737,0.253840625,Lung +CVCL_1529,NCI-H211,16720766,Pevonedistat,0.39825,Lung +CVCL_1536,NCI-H2171,11228183,ABT-737,0.306346875,Lung +CVCL_1539,NCI-H2196,11228183,ABT-737,0.2864125,Lung +CVCL_1539,NCI-H2196,16720766,Pevonedistat,,Lung +CVCL_1545,NCI-H2286,11228183,ABT-737,0.40290625,Lung +CVCL_1545,NCI-H2286,16720766,Pevonedistat,0.3264375,Lung +CVCL_1559,NCI-H358,11228183,ABT-737,0.36440625,Lung +CVCL_1559,NCI-H358,16720766,Pevonedistat,0.39628125,Lung +CVCL_1569,NCI-H526,11228183,ABT-737,0.35190625,Lung +CVCL_1569,NCI-H526,16720766,Pevonedistat,0.214915625,Lung +CVCL_1619,OCI-AML-2,16720766,Pevonedistat,0.198175,Blood +CVCL_1624,ONS-76,11228183,ABT-737,0.4138125,Brain +CVCL_1624,ONS-76,16720766,Pevonedistat,0.350875,Brain +CVCL_1626,OS-RC-2,11228183,ABT-737,0.4419375,Kidney +CVCL_1626,OS-RC-2,16720766,Pevonedistat,0.3264375,Kidney +CVCL_1633,Panc 02.03,11228183,ABT-737,0.45190625,Pancreas +CVCL_1633,Panc 02.03,16720766,Pevonedistat,0.4481875,Pancreas +CVCL_1649,RD,11228183,ABT-737,0.410125,Muscle +CVCL_1649,RD,16720766,Pevonedistat,0.380875,Muscle +CVCL_1651,RERF-LC-Ad1,16720766,Pevonedistat,0.5045625,Lung +CVCL_1679,SBC-5,11228183,ABT-737,0.4633125,Lung +CVCL_1679,SBC-5,16720766,Pevonedistat,0.306375,Lung +CVCL_1682,SCC-25,11228183,ABT-737,0.3764375,Head And Neck +CVCL_1682,SCC-25,16720766,Pevonedistat,0.3129375,Head And Neck +CVCL_1690,SF295,11228183,ABT-737,0.47528125,Brain +CVCL_1690,SF295,16720766,Pevonedistat,0.36015625,Brain +CVCL_1700,SK-N-AS,11228183,ABT-737,0.45775,Nervous System +CVCL_1700,SK-N-AS,16720766,Pevonedistat,0.4029375,Nervous System +CVCL_1754,TE 441.T,11228183,ABT-737,0.291753125,Muscle +CVCL_1754,TE 441.T,16720766,Pevonedistat,0.3814375,Muscle +CVCL_1760,TE-10,16720766,Pevonedistat,0.35571875,Esophagus +CVCL_1767,TE-9,11228183,ABT-737,0.45840625,Esophagus +CVCL_1767,TE-9,16720766,Pevonedistat,0.311003125,Esophagus +CVCL_1774,TT,11228183,ABT-737,0.41421875,Esophagus +CVCL_1774,TT,16720766,Pevonedistat,0.278453125,Esophagus +CVCL_1783,UM-UC-3,11228183,ABT-737,0.37578125,Bladder +CVCL_1783,UM-UC-3,16720766,Pevonedistat,0.24031875,Bladder +CVCL_1798,42-MG-BA,11228183,ABT-737,0.468125,Brain +CVCL_1798,42-MG-BA,16720766,Pevonedistat,0.34671875,Brain +CVCL_1818,Granta-519,11228183,ABT-737,0.224265625,Lymph +CVCL_1847,PaTu 8988t,16720766,Pevonedistat,0.3715,Pancreas +CVCL_2063,HCC827,11228183,ABT-737,0.4254375,Lung +CVCL_2063,HCC827,16720766,Pevonedistat,0.44134375,Lung +CVCL_2094,KPL-1,11228183,ABT-737,0.5020625,Breast +CVCL_2094,KPL-1,16720766,Pevonedistat,0.42365625,Breast +CVCL_2209,SUP-M2,11228183,ABT-737,0.36334375,Lymph +CVCL_2891,EBC-1,11228183,ABT-737,0.4301875,Lung +CVCL_2891,EBC-1,16720766,Pevonedistat,0.298175,Lung +CVCL_3004,KP-2,11228183,ABT-737,0.42375,Pancreas +CVCL_3004,KP-2,16720766,Pevonedistat,0.44603125,Pancreas +CVCL_3116,OVISE,16720766,Pevonedistat,0.44725,Ovary +CVCL_3117,OVTOKO,11228183,ABT-737,0.45165625,Ovary +CVCL_3117,OVTOKO,16720766,Pevonedistat,0.40125,Ovary +CVCL_4381,HuH-6,11228183,ABT-737,0.3804375,Liver +CVCL_4381,HuH-6,16720766,Pevonedistat,0.42859375,Liver +CVCL_5031,SNU-175,11228183,ABT-737,0.234490625,Colon +CVCL_5031,SNU-175,16720766,Pevonedistat,0.36134375,Colon +CVCL_5069,SNU-489,11228183,ABT-737,0.46390625,Brain +CVCL_5069,SNU-489,16720766,Pevonedistat,0.4611875,Brain +CVCL_5098,SNU-81,11228183,ABT-737,0.27670625,Colon +CVCL_A351,HCC1588,11228183,ABT-737,0.40553125,Lung +CVCL_A351,HCC1588,16720766,Pevonedistat,0.39796875,Lung +CVCL_A352,HCC2108,11228183,ABT-737,0.446125,Lung +CVCL_A352,HCC2108,16720766,Pevonedistat,0.41775,Lung +CVCL_L083,YD-38,11228183,ABT-737,0.4626875,Head And Neck +CVCL_L083,YD-38,16720766,Pevonedistat,0.3035,Head And Neck +CVCL_3172,SUIT-2,11228183,ABT-737,0.4581874999999999,Pancreas +CVCL_3172,SUIT-2,11228183,ABT-737,0.4581874999999999,Pancreas +CVCL_3172,SUIT-2,16720766,Pevonedistat,0.387296875,Pancreas +CVCL_3172,SUIT-2,16720766,Pevonedistat,0.387296875,Pancreas +CVCL_0099,SNU-1,123631,Gefitinib,0.38840625,Stomach +CVCL_0099,SNU-1,24821094,Ibrutinib,0.42528125,Stomach +CVCL_0099,SNU-1,36314,Paclitaxel,0.26813125,Stomach +CVCL_0099,SNU-1,6450551,Axitinib,0.36596875,Stomach +CVCL_1245,HCC1143,24821094,Ibrutinib,0.385125,Breast +CVCL_3116,OVISE,135398516,OSI-027,0.38403125,Ovary +CVCL_3116,OVISE,176870,Erlotinib,0.40259375,Ovary +CVCL_3116,OVISE,24771867,Alisertib,0.3850625,Ovary +CVCL_3116,OVISE,135398738,Dacarbazine,0.46396875,Ovary +CVCL_3116,OVISE,3062316,Dasatinib,0.297084375,Ovary +CVCL_5098,SNU-81,9926054,BMS-345541,0.3446875,Colon +CVCL_0012,LP-1,11152667,AZD7762,0.273325,Blood +CVCL_0012,LP-1,123631,Gefitinib,0.3735,Blood +CVCL_0012,LP-1,135398516,OSI-027,0.3155,Blood +CVCL_0012,LP-1,156422,Doramapimod,0.379625,Blood +CVCL_0012,LP-1,176870,Erlotinib,0.532875,Blood +CVCL_0012,LP-1,216239,Sorafenib,0.35128125,Blood +CVCL_0012,LP-1,24771867,Alisertib,0.4060625,Blood +CVCL_0012,LP-1,24821094,Ibrutinib,0.39084375,Blood +CVCL_0012,LP-1,135398738,Dacarbazine,0.44228125,Blood +CVCL_0012,LP-1,3062316,Dasatinib,0.36325,Blood +CVCL_0012,LP-1,36314,Paclitaxel,0.087825,Blood +CVCL_0012,LP-1,44137675,AZD6482,0.373,Blood +CVCL_0012,LP-1,6450551,Axitinib,0.35671875,Blood +CVCL_0012,LP-1,9926054,BMS-345541,0.35146875,Blood +CVCL_0012,LP-1,9933475,Cediranib,0.3740625,Blood +CVCL_0029,EFO-21,11152667,AZD7762,0.291615625,Ovary +CVCL_0029,EFO-21,123631,Gefitinib,0.46265625,Ovary +CVCL_0029,EFO-21,135398516,OSI-027,0.38771875,Ovary +CVCL_0029,EFO-21,176870,Erlotinib,0.4638125,Ovary +CVCL_0029,EFO-21,216239,Sorafenib,0.4050625,Ovary +CVCL_0029,EFO-21,24771867,Alisertib,0.38346875,Ovary +CVCL_0029,EFO-21,24821094,Ibrutinib,0.45971875,Ovary +CVCL_0029,EFO-21,135398738,Dacarbazine,0.43009375,Ovary +CVCL_0029,EFO-21,3062316,Dasatinib,0.294709375,Ovary +CVCL_0029,EFO-21,36314,Paclitaxel,0.31734375,Ovary +CVCL_0029,EFO-21,44137675,AZD6482,0.4368125,Ovary +CVCL_0029,EFO-21,6450551,Axitinib,0.43271875,Ovary +CVCL_0029,EFO-21,9926054,BMS-345541,0.37959375,Ovary +CVCL_0029,EFO-21,9933475,Cediranib,0.41646875,Ovary +CVCL_0067,Namalwa,11152667,AZD7762,0.195446875,Lymph +CVCL_0067,Namalwa,123631,Gefitinib,0.4085625,Lymph +CVCL_0067,Namalwa,135398516,OSI-027,0.3550625,Lymph +CVCL_0067,Namalwa,156422,Doramapimod,0.45209375,Lymph +CVCL_0067,Namalwa,176870,Erlotinib,0.435625,Lymph +CVCL_0067,Namalwa,216239,Sorafenib,0.3579375,Lymph +CVCL_0067,Namalwa,24771867,Alisertib,0.271896875,Lymph +CVCL_0067,Namalwa,24821094,Ibrutinib,0.4041875,Lymph +CVCL_0067,Namalwa,135398738,Dacarbazine,0.338875,Lymph +CVCL_0067,Namalwa,3062316,Dasatinib,0.305553125,Lymph +CVCL_0067,Namalwa,36314,Paclitaxel,0.026190625,Lymph +CVCL_0067,Namalwa,44137675,AZD6482,0.34865625,Lymph +CVCL_0067,Namalwa,6450551,Axitinib,0.3670625,Lymph +CVCL_0067,Namalwa,9926054,BMS-345541,0.35584375,Lymph +CVCL_0067,Namalwa,9933475,Cediranib,0.36084375,Lymph +CVCL_0080,A-673,11152667,AZD7762,0.17088125,Bone +CVCL_0080,A-673,123631,Gefitinib,0.38040625,Bone +CVCL_0080,A-673,135398516,OSI-027,0.3569375,Bone +CVCL_0080,A-673,156422,Doramapimod,0.42171875,Bone +CVCL_0080,A-673,176870,Erlotinib,0.442625,Bone +CVCL_0080,A-673,216239,Sorafenib,0.37159375,Bone +CVCL_0080,A-673,24771867,Alisertib,0.317125,Bone +CVCL_0080,A-673,135398738,Dacarbazine,0.45809375,Bone +CVCL_0080,A-673,3062316,Dasatinib,0.37428125,Bone +CVCL_0080,A-673,36314,Paclitaxel,0.0257,Bone +CVCL_0080,A-673,44137675,AZD6482,0.41303125,Bone +CVCL_0080,A-673,6450551,Axitinib,0.35896875,Bone +CVCL_0080,A-673,9926054,BMS-345541,0.359,Bone +CVCL_0080,A-673,9933475,Cediranib,0.35375,Bone +CVCL_0099,SNU-1,11152667,AZD7762,0.25474375,Stomach +CVCL_0099,SNU-1,135398516,OSI-027,0.33090625,Stomach +CVCL_0099,SNU-1,156422,Doramapimod,0.39534375,Stomach +CVCL_0099,SNU-1,176870,Erlotinib,0.4153125,Stomach +CVCL_0099,SNU-1,216239,Sorafenib,0.34584375,Stomach +CVCL_0099,SNU-1,24771867,Alisertib,0.42865625,Stomach +CVCL_0099,SNU-1,135398738,Dacarbazine,0.43528125,Stomach +CVCL_0099,SNU-1,3062316,Dasatinib,0.36909375,Stomach +CVCL_0099,SNU-1,44137675,AZD6482,0.37121875,Stomach +CVCL_0099,SNU-1,9926054,BMS-345541,0.3651875,Stomach +CVCL_0099,SNU-1,9933475,Cediranib,0.3583125,Stomach +CVCL_0107,BCP-1,11152667,AZD7762,0.248146875,Lymph +CVCL_0107,BCP-1,156422,Doramapimod,0.3128125,Lymph +CVCL_0107,BCP-1,9926054,BMS-345541,0.35246875,Lymph +CVCL_0107,BCP-1,9933475,Cediranib,0.37234375,Lymph +CVCL_0134,A2780,11152667,AZD7762,0.253971875,Ovary +CVCL_0134,A2780,123631,Gefitinib,0.38090625,Ovary +CVCL_0134,A2780,135398516,OSI-027,0.269246875,Ovary +CVCL_0134,A2780,156422,Doramapimod,0.43859375,Ovary +CVCL_0134,A2780,176870,Erlotinib,0.4099375,Ovary +CVCL_0134,A2780,216239,Sorafenib,0.35009375,Ovary +CVCL_0134,A2780,24771867,Alisertib,0.211515625,Ovary +CVCL_0134,A2780,24821094,Ibrutinib,0.36096875,Ovary +CVCL_0134,A2780,135398738,Dacarbazine,0.45975,Ovary +CVCL_0134,A2780,3062316,Dasatinib,0.3253125,Ovary +CVCL_0134,A2780,36314,Paclitaxel,0.108825,Ovary +CVCL_0134,A2780,44137675,AZD6482,0.32828125,Ovary +CVCL_0134,A2780,6450551,Axitinib,0.3119875,Ovary +CVCL_0134,A2780,9926054,BMS-345541,0.35946875,Ovary +CVCL_0178,BT-20,11152667,AZD7762,0.295709375,Breast +CVCL_0178,BT-20,123631,Gefitinib,0.43040625,Breast +CVCL_0178,BT-20,135398516,OSI-027,0.39315625,Breast +CVCL_0178,BT-20,156422,Doramapimod,0.4679375,Breast +CVCL_0178,BT-20,176870,Erlotinib,0.439,Breast +CVCL_0178,BT-20,216239,Sorafenib,0.405375,Breast +CVCL_0178,BT-20,24771867,Alisertib,0.3816875,Breast +CVCL_0178,BT-20,24821094,Ibrutinib,0.44278125,Breast +CVCL_0178,BT-20,135398738,Dacarbazine,0.46828125,Breast +CVCL_0178,BT-20,3062316,Dasatinib,0.325125,Breast +CVCL_0178,BT-20,36314,Paclitaxel,0.188146875,Breast +CVCL_0178,BT-20,44137675,AZD6482,0.35715625,Breast +CVCL_0178,BT-20,6450551,Axitinib,0.39325,Breast +CVCL_0178,BT-20,9926054,BMS-345541,0.38815625,Breast +CVCL_0178,BT-20,9933475,Cediranib,0.4085,Breast +CVCL_0379,Ku812,11152667,AZD7762,0.190471875,Blood +CVCL_0379,Ku812,123631,Gefitinib,0.3729375,Blood +CVCL_0379,Ku812,135398516,OSI-027,0.33334375,Blood +CVCL_0379,Ku812,156422,Doramapimod,0.42940625,Blood +CVCL_0379,Ku812,176870,Erlotinib,0.36340625,Blood +CVCL_0379,Ku812,216239,Sorafenib,0.32953125,Blood +CVCL_0379,Ku812,24771867,Alisertib,0.298915625,Blood +CVCL_0379,Ku812,135398738,Dacarbazine,0.37821875,Blood +CVCL_0379,Ku812,3062316,Dasatinib,0.0109625,Blood +CVCL_0379,Ku812,36314,Paclitaxel,0.104828125,Blood +CVCL_0379,Ku812,44137675,AZD6482,0.45978125,Blood +CVCL_0379,Ku812,6450551,Axitinib,0.181840625,Blood +CVCL_0379,Ku812,9926054,BMS-345541,0.3548125,Blood +CVCL_0428,MIA PaCa-2,11152667,AZD7762,0.1776,Pancreas +CVCL_0428,MIA PaCa-2,123631,Gefitinib,0.4231875,Pancreas +CVCL_0428,MIA PaCa-2,135398516,OSI-027,0.37846875,Pancreas +CVCL_0428,MIA PaCa-2,156422,Doramapimod,0.46121875,Pancreas +CVCL_0428,MIA PaCa-2,176870,Erlotinib,0.44125,Pancreas +CVCL_0428,MIA PaCa-2,216239,Sorafenib,0.40171875,Pancreas +CVCL_0428,MIA PaCa-2,24771867,Alisertib,0.36765625,Pancreas +CVCL_0428,MIA PaCa-2,24821094,Ibrutinib,0.4498125,Pancreas +CVCL_0428,MIA PaCa-2,135398738,Dacarbazine,0.47521875,Pancreas +CVCL_0428,MIA PaCa-2,3062316,Dasatinib,0.34234375,Pancreas +CVCL_0428,MIA PaCa-2,36314,Paclitaxel,0.210621875,Pancreas +CVCL_0428,MIA PaCa-2,44137675,AZD6482,0.37728125,Pancreas +CVCL_0428,MIA PaCa-2,6450551,Axitinib,0.38371875,Pancreas +CVCL_0428,MIA PaCa-2,9926054,BMS-345541,0.37321875,Pancreas +CVCL_0428,MIA PaCa-2,9933475,Cediranib,0.3534375,Pancreas +CVCL_0533,SK-UT-1,11152667,AZD7762,0.260875,Soft Tissue +CVCL_0533,SK-UT-1,123631,Gefitinib,0.4445625,Soft Tissue +CVCL_0533,SK-UT-1,135398516,OSI-027,0.39715625,Soft Tissue +CVCL_0533,SK-UT-1,156422,Doramapimod,0.4440625,Soft Tissue +CVCL_0533,SK-UT-1,176870,Erlotinib,0.478,Soft Tissue +CVCL_0533,SK-UT-1,216239,Sorafenib,0.37065625,Soft Tissue +CVCL_0533,SK-UT-1,24771867,Alisertib,0.39525,Soft Tissue +CVCL_0533,SK-UT-1,24821094,Ibrutinib,0.44565625,Soft Tissue +CVCL_0533,SK-UT-1,135398738,Dacarbazine,0.43253125,Soft Tissue +CVCL_0533,SK-UT-1,3062316,Dasatinib,0.37653125,Soft Tissue +CVCL_0533,SK-UT-1,36314,Paclitaxel,0.2512,Soft Tissue +CVCL_0533,SK-UT-1,44137675,AZD6482,0.41821875,Soft Tissue +CVCL_0533,SK-UT-1,6450551,Axitinib,0.3979375,Soft Tissue +CVCL_0533,SK-UT-1,9926054,BMS-345541,0.38521875,Soft Tissue +CVCL_0533,SK-UT-1,9933475,Cediranib,0.40428125,Soft Tissue +CVCL_0547,SW620,11152667,AZD7762,0.282809375,Colon +CVCL_0547,SW620,123631,Gefitinib,0.41559375,Colon +CVCL_0547,SW620,135398516,OSI-027,0.34621875,Colon +CVCL_0547,SW620,156422,Doramapimod,0.44871875,Colon +CVCL_0547,SW620,176870,Erlotinib,0.4228125,Colon +CVCL_0547,SW620,216239,Sorafenib,0.357875,Colon +CVCL_0547,SW620,24771867,Alisertib,0.345125,Colon +CVCL_0547,SW620,24821094,Ibrutinib,0.44075,Colon +CVCL_0547,SW620,135398738,Dacarbazine,0.40096875,Colon +CVCL_0547,SW620,3062316,Dasatinib,0.300228125,Colon +CVCL_0547,SW620,36314,Paclitaxel,,Colon +CVCL_0547,SW620,44137675,AZD6482,0.4273125,Colon +CVCL_0547,SW620,6450551,Axitinib,0.39459375,Colon +CVCL_0547,SW620,9926054,BMS-345541,0.41459375,Colon +CVCL_0599,SK-MEL-24,11152667,AZD7762,0.324875,Skin +CVCL_0599,SK-MEL-24,123631,Gefitinib,0.3590625,Skin +CVCL_0599,SK-MEL-24,135398516,OSI-027,0.3808125,Skin +CVCL_0599,SK-MEL-24,156422,Doramapimod,0.46375,Skin +CVCL_0599,SK-MEL-24,176870,Erlotinib,0.437375,Skin +CVCL_0599,SK-MEL-24,216239,Sorafenib,0.40528125,Skin +CVCL_0599,SK-MEL-24,24771867,Alisertib,0.43371875,Skin +CVCL_0599,SK-MEL-24,24821094,Ibrutinib,0.41828125,Skin +CVCL_0599,SK-MEL-24,135398738,Dacarbazine,0.45740625,Skin +CVCL_0599,SK-MEL-24,3062316,Dasatinib,0.2858125,Skin +CVCL_0599,SK-MEL-24,36314,Paclitaxel,0.33496875,Skin +CVCL_0599,SK-MEL-24,44137675,AZD6482,0.39965625,Skin +CVCL_0599,SK-MEL-24,6450551,Axitinib,0.44596875,Skin +CVCL_0599,SK-MEL-24,9926054,BMS-345541,0.40665625,Skin +CVCL_0599,SK-MEL-24,9933475,Cediranib,0.3620625,Skin +CVCL_0600,SK-MEL-31,11152667,AZD7762,0.349125,Skin +CVCL_0600,SK-MEL-31,123631,Gefitinib,0.43240625,Skin +CVCL_0600,SK-MEL-31,135398516,OSI-027,0.40234375,Skin +CVCL_0600,SK-MEL-31,156422,Doramapimod,0.48221875,Skin +CVCL_0600,SK-MEL-31,176870,Erlotinib,0.4204375,Skin +CVCL_0600,SK-MEL-31,216239,Sorafenib,0.40703125,Skin +CVCL_0600,SK-MEL-31,24771867,Alisertib,0.43625,Skin +CVCL_0600,SK-MEL-31,24821094,Ibrutinib,0.44675,Skin +CVCL_0600,SK-MEL-31,135398738,Dacarbazine,0.46696875,Skin +CVCL_0600,SK-MEL-31,3062316,Dasatinib,0.425,Skin +CVCL_0600,SK-MEL-31,36314,Paclitaxel,0.4026875,Skin +CVCL_0600,SK-MEL-31,44137675,AZD6482,0.38628125,Skin +CVCL_0600,SK-MEL-31,6450551,Axitinib,0.43171875,Skin +CVCL_0600,SK-MEL-31,9926054,BMS-345541,0.4485,Skin +CVCL_0620,MDA-MB-361,11152667,AZD7762,0.335375,Breast +CVCL_0620,MDA-MB-361,135398516,OSI-027,0.33275,Breast +CVCL_0620,MDA-MB-361,156422,Doramapimod,0.37925,Breast +CVCL_0620,MDA-MB-361,176870,Erlotinib,0.40259375,Breast +CVCL_0620,MDA-MB-361,216239,Sorafenib,0.38265625,Breast +CVCL_0620,MDA-MB-361,24771867,Alisertib,0.368625,Breast +CVCL_0620,MDA-MB-361,3062316,Dasatinib,0.42040625,Breast +CVCL_0620,MDA-MB-361,36314,Paclitaxel,0.35515625,Breast +CVCL_0620,MDA-MB-361,44137675,AZD6482,0.357375,Breast +CVCL_0620,MDA-MB-361,6450551,Axitinib,0.43009375,Breast +CVCL_0620,MDA-MB-361,9926054,BMS-345541,0.4056875,Breast +CVCL_0620,MDA-MB-361,9933475,Cediranib,0.36296875,Breast +CVCL_0629,SK-LU-1,11152667,AZD7762,0.179946875,Lung +CVCL_0629,SK-LU-1,123631,Gefitinib,0.3785,Lung +CVCL_0629,SK-LU-1,135398516,OSI-027,0.34321875,Lung +CVCL_0629,SK-LU-1,156422,Doramapimod,0.484875,Lung +CVCL_0629,SK-LU-1,176870,Erlotinib,0.4115,Lung +CVCL_0629,SK-LU-1,216239,Sorafenib,0.40653125,Lung +CVCL_0629,SK-LU-1,24771867,Alisertib,0.37484375,Lung +CVCL_0629,SK-LU-1,24821094,Ibrutinib,0.450875,Lung +CVCL_0629,SK-LU-1,135398738,Dacarbazine,0.4171875,Lung +CVCL_0629,SK-LU-1,3062316,Dasatinib,0.20916875,Lung +CVCL_0629,SK-LU-1,36314,Paclitaxel,0.42896875,Lung +CVCL_0629,SK-LU-1,44137675,AZD6482,0.3978125,Lung +CVCL_0629,SK-LU-1,6450551,Axitinib,0.42265625,Lung +CVCL_0629,SK-LU-1,9926054,BMS-345541,0.39021875,Lung +CVCL_1045,22Rv1,11152667,AZD7762,0.344375,Prostate +CVCL_1045,22Rv1,123631,Gefitinib,0.40884375,Prostate +CVCL_1045,22Rv1,135398516,OSI-027,0.33359375,Prostate +CVCL_1045,22Rv1,156422,Doramapimod,0.42475,Prostate +CVCL_1045,22Rv1,176870,Erlotinib,0.4448125,Prostate +CVCL_1045,22Rv1,216239,Sorafenib,0.4530625,Prostate +CVCL_1045,22Rv1,24771867,Alisertib,0.4105625,Prostate +CVCL_1045,22Rv1,135398738,Dacarbazine,0.41765625,Prostate +CVCL_1045,22Rv1,3062316,Dasatinib,0.4110625,Prostate +CVCL_1045,22Rv1,36314,Paclitaxel,0.239375,Prostate +CVCL_1045,22Rv1,44137675,AZD6482,0.40021875,Prostate +CVCL_1082,BEN,11152667,AZD7762,0.35640625,Lung +CVCL_1082,BEN,123631,Gefitinib,0.41078125,Lung +CVCL_1082,BEN,135398516,OSI-027,0.451375,Lung +CVCL_1082,BEN,156422,Doramapimod,0.503875,Lung +CVCL_1082,BEN,176870,Erlotinib,0.40959375,Lung +CVCL_1082,BEN,216239,Sorafenib,0.47146875,Lung +CVCL_1082,BEN,24771867,Alisertib,0.55753125,Lung +CVCL_1082,BEN,135398738,Dacarbazine,0.550125,Lung +CVCL_1082,BEN,3062316,Dasatinib,0.451875,Lung +CVCL_1082,BEN,36314,Paclitaxel,0.55340625,Lung +CVCL_1082,BEN,44137675,AZD6482,0.48353125,Lung +CVCL_1082,BEN,6450551,Axitinib,0.4873125,Lung +CVCL_1082,BEN,9926054,BMS-345541,0.42875,Lung +CVCL_1085,BHT-101,11152667,AZD7762,0.281196875,Thyroid +CVCL_1085,BHT-101,123631,Gefitinib,0.412,Thyroid +CVCL_1085,BHT-101,135398516,OSI-027,0.3690625,Thyroid +CVCL_1085,BHT-101,156422,Doramapimod,0.492125,Thyroid +CVCL_1085,BHT-101,176870,Erlotinib,0.43459375,Thyroid +CVCL_1085,BHT-101,216239,Sorafenib,0.43165625,Thyroid +CVCL_1085,BHT-101,24771867,Alisertib,0.41,Thyroid +CVCL_1085,BHT-101,135398738,Dacarbazine,0.4463125,Thyroid +CVCL_1085,BHT-101,3062316,Dasatinib,0.28891875,Thyroid +CVCL_1085,BHT-101,36314,Paclitaxel,0.3766875,Thyroid +CVCL_1085,BHT-101,44137675,AZD6482,0.42434375,Thyroid +CVCL_1085,BHT-101,6450551,Axitinib,0.48696875,Thyroid +CVCL_1085,BHT-101,9926054,BMS-345541,0.33734375,Thyroid +CVCL_1105,CAL-12T,11152667,AZD7762,0.1959625,Lung +CVCL_1105,CAL-12T,123631,Gefitinib,0.30231875,Lung +CVCL_1105,CAL-12T,135398516,OSI-027,0.35696875,Lung +CVCL_1105,CAL-12T,156422,Doramapimod,0.4646875,Lung +CVCL_1105,CAL-12T,176870,Erlotinib,0.305403125,Lung +CVCL_1105,CAL-12T,216239,Sorafenib,0.400375,Lung +CVCL_1105,CAL-12T,24771867,Alisertib,0.4126875,Lung +CVCL_1105,CAL-12T,135398738,Dacarbazine,0.40540625,Lung +CVCL_1105,CAL-12T,3062316,Dasatinib,0.18251875,Lung +CVCL_1105,CAL-12T,36314,Paclitaxel,0.210203125,Lung +CVCL_1105,CAL-12T,44137675,AZD6482,0.37790625,Lung +CVCL_1105,CAL-12T,6450551,Axitinib,0.4089375,Lung +CVCL_1105,CAL-12T,9926054,BMS-345541,0.37803125,Lung +CVCL_1133,COLO 741,11152667,AZD7762,0.33434375,Skin +CVCL_1133,COLO 741,123631,Gefitinib,0.31471875,Skin +CVCL_1133,COLO 741,135398516,OSI-027,0.3870625,Skin +CVCL_1133,COLO 741,156422,Doramapimod,0.4969375,Skin +CVCL_1133,COLO 741,24771867,Alisertib,0.48871875,Skin +CVCL_1133,COLO 741,36314,Paclitaxel,0.33303125,Skin +CVCL_1133,COLO 741,44137675,AZD6482,0.42521875,Skin +CVCL_1167,Daoy,11152667,AZD7762,0.278453125,Brain +CVCL_1167,Daoy,123631,Gefitinib,0.39825,Brain +CVCL_1167,Daoy,135398516,OSI-027,0.36678125,Brain +CVCL_1167,Daoy,156422,Doramapimod,0.4541875,Brain +CVCL_1167,Daoy,176870,Erlotinib,0.4303125,Brain +CVCL_1167,Daoy,216239,Sorafenib,0.37128125,Brain +CVCL_1167,Daoy,24771867,Alisertib,0.34571875,Brain +CVCL_1167,Daoy,135398738,Dacarbazine,0.41190625,Brain +CVCL_1167,Daoy,3062316,Dasatinib,0.31194375,Brain +CVCL_1167,Daoy,36314,Paclitaxel,0.149221875,Brain +CVCL_1167,Daoy,44137675,AZD6482,0.3781875,Brain +CVCL_1167,Daoy,6450551,Axitinib,0.42025,Brain +CVCL_1167,Daoy,9926054,BMS-345541,0.389875,Brain +CVCL_1183,DU4475,11152667,AZD7762,0.29285625,Breast +CVCL_1183,DU4475,123631,Gefitinib,0.38646875,Breast +CVCL_1183,DU4475,135398516,OSI-027,0.32496875,Breast +CVCL_1183,DU4475,156422,Doramapimod,0.4471875,Breast +CVCL_1183,DU4475,216239,Sorafenib,0.33178125,Breast +CVCL_1183,DU4475,24771867,Alisertib,0.271403125,Breast +CVCL_1183,DU4475,24821094,Ibrutinib,0.4031875,Breast +CVCL_1183,DU4475,135398738,Dacarbazine,0.34765625,Breast +CVCL_1183,DU4475,3062316,Dasatinib,0.36540625,Breast +CVCL_1183,DU4475,36314,Paclitaxel,0.084584375,Breast +CVCL_1183,DU4475,44137675,AZD6482,0.4298125,Breast +CVCL_1183,DU4475,6450551,Axitinib,0.328125,Breast +CVCL_1183,DU4475,9926054,BMS-345541,0.32440625,Breast +CVCL_1183,DU4475,9933475,Cediranib,0.33121875,Breast +CVCL_1187,EC-GI-10,11152667,AZD7762,0.255946875,Esophagus +CVCL_1187,EC-GI-10,123631,Gefitinib,0.39565625,Esophagus +CVCL_1187,EC-GI-10,135398516,OSI-027,0.37959375,Esophagus +CVCL_1187,EC-GI-10,176870,Erlotinib,0.4030625,Esophagus +CVCL_1187,EC-GI-10,216239,Sorafenib,0.36928125,Esophagus +CVCL_1187,EC-GI-10,24771867,Alisertib,0.2463125,Esophagus +CVCL_1187,EC-GI-10,24821094,Ibrutinib,0.3148125,Esophagus +CVCL_1187,EC-GI-10,135398738,Dacarbazine,0.50334375,Esophagus +CVCL_1187,EC-GI-10,3062316,Dasatinib,0.295665625,Esophagus +CVCL_1187,EC-GI-10,36314,Paclitaxel,0.13729375,Esophagus +CVCL_1187,EC-GI-10,44137675,AZD6482,0.4139375,Esophagus +CVCL_1187,EC-GI-10,6450551,Axitinib,0.363125,Esophagus +CVCL_1187,EC-GI-10,9926054,BMS-345541,0.38125,Esophagus +CVCL_1187,EC-GI-10,9933475,Cediranib,0.3834375,Esophagus +CVCL_1231,GI-1,11152667,AZD7762,0.149725,Brain +CVCL_1231,GI-1,123631,Gefitinib,0.41284375,Brain +CVCL_1231,GI-1,135398516,OSI-027,0.4006875,Brain +CVCL_1231,GI-1,156422,Doramapimod,0.46721875,Brain +CVCL_1231,GI-1,176870,Erlotinib,0.46828125,Brain +CVCL_1231,GI-1,216239,Sorafenib,0.42209375,Brain +CVCL_1231,GI-1,24771867,Alisertib,0.37996875,Brain +CVCL_1231,GI-1,24821094,Ibrutinib,0.44540625,Brain +CVCL_1231,GI-1,135398738,Dacarbazine,0.41896875,Brain +CVCL_1231,GI-1,3062316,Dasatinib,0.30475625,Brain +CVCL_1231,GI-1,36314,Paclitaxel,0.15796875,Brain +CVCL_1231,GI-1,44137675,AZD6482,0.28488125,Brain +CVCL_1231,GI-1,6450551,Axitinib,0.4140625,Brain +CVCL_1231,GI-1,9926054,BMS-345541,0.38446875,Brain +CVCL_1231,GI-1,9933475,Cediranib,0.35634375,Brain +CVCL_1245,HCC1143,11152667,AZD7762,0.181840625,Breast +CVCL_1245,HCC1143,123631,Gefitinib,0.37153125,Breast +CVCL_1245,HCC1143,135398516,OSI-027,0.36978125,Breast +CVCL_1245,HCC1143,156422,Doramapimod,0.45590625,Breast +CVCL_1245,HCC1143,176870,Erlotinib,0.41290625,Breast +CVCL_1245,HCC1143,216239,Sorafenib,0.460875,Breast +CVCL_1245,HCC1143,24771867,Alisertib,0.38965625,Breast +CVCL_1245,HCC1143,135398738,Dacarbazine,0.429375,Breast +CVCL_1245,HCC1143,3062316,Dasatinib,0.27006875,Breast +CVCL_1245,HCC1143,44137675,AZD6482,0.390125,Breast +CVCL_1245,HCC1143,6450551,Axitinib,0.4249375,Breast +CVCL_1245,HCC1143,9926054,BMS-345541,0.38221875,Breast +CVCL_1254,HCC1500,11152667,AZD7762,0.4221875,Breast +CVCL_1254,HCC1500,123631,Gefitinib,0.34859375,Breast +CVCL_1254,HCC1500,135398516,OSI-027,0.274778125,Breast +CVCL_1254,HCC1500,156422,Doramapimod,0.45428125,Breast +CVCL_1254,HCC1500,176870,Erlotinib,0.4365625,Breast +CVCL_1254,HCC1500,216239,Sorafenib,0.357875,Breast +CVCL_1254,HCC1500,24771867,Alisertib,0.3919375,Breast +CVCL_1254,HCC1500,24821094,Ibrutinib,0.38559375,Breast +CVCL_1254,HCC1500,135398738,Dacarbazine,0.4854375,Breast +CVCL_1254,HCC1500,3062316,Dasatinib,0.3984375,Breast +CVCL_1254,HCC1500,36314,Paclitaxel,0.32690625,Breast +CVCL_1254,HCC1500,44137675,AZD6482,0.45390625,Breast +CVCL_1254,HCC1500,6450551,Axitinib,0.31129375,Breast +CVCL_1254,HCC1500,9926054,BMS-345541,0.36359375,Breast +CVCL_1254,HCC1500,9933475,Cediranib,0.3770625,Breast +CVCL_1287,HSC-2,11152667,AZD7762,0.294609375,Head And Neck +CVCL_1287,HSC-2,123631,Gefitinib,0.31628125,Head And Neck +CVCL_1287,HSC-2,135398516,OSI-027,0.3880625,Head And Neck +CVCL_1287,HSC-2,156422,Doramapimod,0.44903125,Head And Neck +CVCL_1287,HSC-2,176870,Erlotinib,0.31853125,Head And Neck +CVCL_1287,HSC-2,216239,Sorafenib,0.33703125,Head And Neck +CVCL_1287,HSC-2,24771867,Alisertib,0.390125,Head And Neck +CVCL_1287,HSC-2,24821094,Ibrutinib,0.314,Head And Neck +CVCL_1287,HSC-2,135398738,Dacarbazine,0.46134375,Head And Neck +CVCL_1287,HSC-2,3062316,Dasatinib,0.14934375,Head And Neck +CVCL_1287,HSC-2,36314,Paclitaxel,0.29763125,Head And Neck +CVCL_1287,HSC-2,44137675,AZD6482,0.33634375,Head And Neck +CVCL_1287,HSC-2,6450551,Axitinib,0.397625,Head And Neck +CVCL_1287,HSC-2,9926054,BMS-345541,0.356125,Head And Neck +CVCL_1287,HSC-2,9933475,Cediranib,0.3664375,Head And Neck +CVCL_1324,Karpas-299,11152667,AZD7762,0.1493375,Lymph +CVCL_1324,Karpas-299,123631,Gefitinib,0.3891875,Lymph +CVCL_1324,Karpas-299,135398516,OSI-027,0.33378125,Lymph +CVCL_1324,Karpas-299,156422,Doramapimod,0.40753125,Lymph +CVCL_1324,Karpas-299,176870,Erlotinib,0.39528125,Lymph +CVCL_1324,Karpas-299,216239,Sorafenib,0.46128125,Lymph +CVCL_1324,Karpas-299,24771867,Alisertib,0.40909375,Lymph +CVCL_1324,Karpas-299,24821094,Ibrutinib,0.41659375,Lymph +CVCL_1324,Karpas-299,135398738,Dacarbazine,0.3393125,Lymph +CVCL_1324,Karpas-299,3062316,Dasatinib,0.36478125,Lymph +CVCL_1324,Karpas-299,36314,Paclitaxel,0.184825,Lymph +CVCL_1324,Karpas-299,44137675,AZD6482,0.433,Lymph +CVCL_1324,Karpas-299,6450551,Axitinib,0.3941875,Lymph +CVCL_1324,Karpas-299,9926054,BMS-345541,0.3541875,Lymph +CVCL_1327,KE-37,11152667,AZD7762,0.139946875,Blood +CVCL_1327,KE-37,123631,Gefitinib,0.37640625,Blood +CVCL_1327,KE-37,135398516,OSI-027,0.305034375,Blood +CVCL_1327,KE-37,156422,Doramapimod,0.46003125,Blood +CVCL_1327,KE-37,176870,Erlotinib,0.37746875,Blood +CVCL_1327,KE-37,216239,Sorafenib,0.3785,Blood +CVCL_1327,KE-37,24771867,Alisertib,0.216571875,Blood +CVCL_1327,KE-37,135398738,Dacarbazine,0.313875,Blood +CVCL_1327,KE-37,3062316,Dasatinib,0.35678125,Blood +CVCL_1327,KE-37,36314,Paclitaxel,0.047675,Blood +CVCL_1327,KE-37,44137675,AZD6482,0.41734375,Blood +CVCL_1327,KE-37,6450551,Axitinib,0.32340625,Blood +CVCL_1335,KNS-62,11152667,AZD7762,0.3174375,Lung +CVCL_1335,KNS-62,123631,Gefitinib,0.43359375,Lung +CVCL_1335,KNS-62,135398516,OSI-027,0.38490625,Lung +CVCL_1335,KNS-62,156422,Doramapimod,0.454625,Lung +CVCL_1335,KNS-62,176870,Erlotinib,0.43028125,Lung +CVCL_1335,KNS-62,216239,Sorafenib,0.38240625,Lung +CVCL_1335,KNS-62,24771867,Alisertib,0.4450625,Lung +CVCL_1335,KNS-62,24821094,Ibrutinib,0.457875,Lung +CVCL_1335,KNS-62,135398738,Dacarbazine,0.47990625,Lung +CVCL_1335,KNS-62,3062316,Dasatinib,0.428125,Lung +CVCL_1335,KNS-62,36314,Paclitaxel,0.33134375,Lung +CVCL_1335,KNS-62,44137675,AZD6482,0.4305,Lung +CVCL_1335,KNS-62,5494449,Tozasertib,0.45134375,Lung +CVCL_1335,KNS-62,6450551,Axitinib,0.43534375,Lung +CVCL_1335,KNS-62,9926054,BMS-345541,0.40571875,Lung +CVCL_1335,KNS-62,9933475,Cediranib,0.417125,Lung +CVCL_1344,KU-19-19,11152667,AZD7762,0.2773875,Bladder +CVCL_1344,KU-19-19,123631,Gefitinib,0.426,Bladder +CVCL_1344,KU-19-19,135398516,OSI-027,0.366,Bladder +CVCL_1344,KU-19-19,156422,Doramapimod,0.49096875,Bladder +CVCL_1344,KU-19-19,176870,Erlotinib,0.38953125,Bladder +CVCL_1344,KU-19-19,216239,Sorafenib,0.3934375,Bladder +CVCL_1344,KU-19-19,24771867,Alisertib,0.43203125,Bladder +CVCL_1344,KU-19-19,3062316,Dasatinib,0.281,Bladder +CVCL_1344,KU-19-19,36314,Paclitaxel,0.36459375,Bladder +CVCL_1344,KU-19-19,44137675,AZD6482,0.4561875,Bladder +CVCL_1344,KU-19-19,6450551,Axitinib,0.41775,Bladder +CVCL_1344,KU-19-19,9926054,BMS-345541,0.3880625,Bladder +CVCL_1345,Kuramochi,11152667,AZD7762,0.375,Ovary +CVCL_1345,Kuramochi,123631,Gefitinib,0.3859375,Ovary +CVCL_1345,Kuramochi,135398516,OSI-027,0.40625,Ovary +CVCL_1345,Kuramochi,156422,Doramapimod,0.42084375,Ovary +CVCL_1345,Kuramochi,176870,Erlotinib,0.4498125,Ovary +CVCL_1345,Kuramochi,216239,Sorafenib,0.40596875,Ovary +CVCL_1345,Kuramochi,24771867,Alisertib,0.427625,Ovary +CVCL_1345,Kuramochi,135398738,Dacarbazine,0.4661875,Ovary +CVCL_1345,Kuramochi,3062316,Dasatinib,0.32471875,Ovary +CVCL_1345,Kuramochi,36314,Paclitaxel,0.34865625,Ovary +CVCL_1345,Kuramochi,44137675,AZD6482,0.3993125,Ovary +CVCL_1345,Kuramochi,6450551,Axitinib,0.4455625,Ovary +CVCL_1345,Kuramochi,9926054,BMS-345541,0.41384375,Ovary +CVCL_1352,KYSE-410,11152667,AZD7762,0.271721875,Esophagus +CVCL_1352,KYSE-410,123631,Gefitinib,0.3151875,Esophagus +CVCL_1352,KYSE-410,135398516,OSI-027,0.349125,Esophagus +CVCL_1352,KYSE-410,156422,Doramapimod,0.46290625,Esophagus +CVCL_1352,KYSE-410,176870,Erlotinib,0.35696875,Esophagus +CVCL_1352,KYSE-410,216239,Sorafenib,0.3805,Esophagus +CVCL_1352,KYSE-410,24771867,Alisertib,0.35853125,Esophagus +CVCL_1352,KYSE-410,24821094,Ibrutinib,0.285159375,Esophagus +CVCL_1352,KYSE-410,135398738,Dacarbazine,0.44640625,Esophagus +CVCL_1352,KYSE-410,3062316,Dasatinib,0.214003125,Esophagus +CVCL_1352,KYSE-410,36314,Paclitaxel,0.14335625,Esophagus +CVCL_1352,KYSE-410,44137675,AZD6482,0.42215625,Esophagus +CVCL_1352,KYSE-410,6450551,Axitinib,0.41228125,Esophagus +CVCL_1352,KYSE-410,9926054,BMS-345541,0.400375,Esophagus +CVCL_1379,LNCaP clone FGC,11152667,AZD7762,0.29564375,Prostate +CVCL_1379,LNCaP clone FGC,123631,Gefitinib,0.440125,Prostate +CVCL_1379,LNCaP clone FGC,135398516,OSI-027,0.36334375,Prostate +CVCL_1379,LNCaP clone FGC,176870,Erlotinib,0.41778125,Prostate +CVCL_1379,LNCaP clone FGC,216239,Sorafenib,0.367875,Prostate +CVCL_1379,LNCaP clone FGC,24771867,Alisertib,0.36484375,Prostate +CVCL_1379,LNCaP clone FGC,24821094,Ibrutinib,0.4476875,Prostate +CVCL_1379,LNCaP clone FGC,135398738,Dacarbazine,0.448,Prostate +CVCL_1379,LNCaP clone FGC,3062316,Dasatinib,0.38134375,Prostate +CVCL_1379,LNCaP clone FGC,36314,Paclitaxel,0.122621875,Prostate +CVCL_1379,LNCaP clone FGC,44137675,AZD6482,0.2693625,Prostate +CVCL_1379,LNCaP clone FGC,6450551,Axitinib,0.36178125,Prostate +CVCL_1379,LNCaP clone FGC,9926054,BMS-345541,0.35796875,Prostate +CVCL_1379,LNCaP clone FGC,9933475,Cediranib,0.35690625,Prostate +CVCL_1385,LS411N,11152667,AZD7762,0.293184375,Colon +CVCL_1385,LS411N,123631,Gefitinib,0.41684375,Colon +CVCL_1385,LS411N,135398516,OSI-027,0.43275,Colon +CVCL_1385,LS411N,156422,Doramapimod,0.46809375,Colon +CVCL_1385,LS411N,176870,Erlotinib,0.47828125,Colon +CVCL_1385,LS411N,216239,Sorafenib,0.39984375,Colon +CVCL_1385,LS411N,24771867,Alisertib,0.5299375,Colon +CVCL_1385,LS411N,135398738,Dacarbazine,0.485875,Colon +CVCL_1385,LS411N,3062316,Dasatinib,0.42915625,Colon +CVCL_1385,LS411N,36314,Paclitaxel,0.45853125,Colon +CVCL_1385,LS411N,44137675,AZD6482,0.48778125,Colon +CVCL_1385,LS411N,6450551,Axitinib,0.43615625,Colon +CVCL_1385,LS411N,9926054,BMS-345541,0.39965625,Colon +CVCL_1402,Mel Ho,11152667,AZD7762,0.31384375,Skin +CVCL_1402,Mel Ho,123631,Gefitinib,0.3830625,Skin +CVCL_1402,Mel Ho,135398516,OSI-027,0.31765625,Skin +CVCL_1402,Mel Ho,156422,Doramapimod,0.453,Skin +CVCL_1402,Mel Ho,176870,Erlotinib,0.43665625,Skin +CVCL_1402,Mel Ho,216239,Sorafenib,0.39896875,Skin +CVCL_1402,Mel Ho,24771867,Alisertib,0.4353125,Skin +CVCL_1402,Mel Ho,135398738,Dacarbazine,0.434875,Skin +CVCL_1402,Mel Ho,3062316,Dasatinib,0.3884375,Skin +CVCL_1402,Mel Ho,36314,Paclitaxel,0.257175,Skin +CVCL_1402,Mel Ho,44137675,AZD6482,0.3363125,Skin +CVCL_1402,Mel Ho,6450551,Axitinib,0.4438125,Skin +CVCL_1402,Mel Ho,9926054,BMS-345541,0.3805625,Skin +CVCL_1411,MHH-ES-1,11152667,AZD7762,0.2378625,Bone +CVCL_1411,MHH-ES-1,123631,Gefitinib,0.3691875,Bone +CVCL_1411,MHH-ES-1,135398516,OSI-027,0.32246875,Bone +CVCL_1411,MHH-ES-1,156422,Doramapimod,0.364,Bone +CVCL_1411,MHH-ES-1,176870,Erlotinib,0.42703125,Bone +CVCL_1411,MHH-ES-1,216239,Sorafenib,0.38046875,Bone +CVCL_1411,MHH-ES-1,24771867,Alisertib,0.203778125,Bone +CVCL_1411,MHH-ES-1,135398738,Dacarbazine,0.405125,Bone +CVCL_1411,MHH-ES-1,3062316,Dasatinib,0.38171875,Bone +CVCL_1411,MHH-ES-1,36314,Paclitaxel,0.14133125,Bone +CVCL_1411,MHH-ES-1,44137675,AZD6482,0.3879375,Bone +CVCL_1411,MHH-ES-1,6450551,Axitinib,0.3365,Bone +CVCL_1411,MHH-ES-1,9926054,BMS-345541,0.35409375,Bone +CVCL_1415,MKN1,123631,Gefitinib,,Stomach +CVCL_1415,MKN1,135398516,OSI-027,0.4119375,Stomach +CVCL_1415,MKN1,156422,Doramapimod,0.4538125,Stomach +CVCL_1415,MKN1,176870,Erlotinib,0.426375,Stomach +CVCL_1415,MKN1,216239,Sorafenib,0.39203125,Stomach +CVCL_1415,MKN1,24771867,Alisertib,0.38521875,Stomach +CVCL_1415,MKN1,135398738,Dacarbazine,0.5146875,Stomach +CVCL_1415,MKN1,3062316,Dasatinib,0.293375,Stomach +CVCL_1415,MKN1,44137675,AZD6482,0.42203125,Stomach +CVCL_1415,MKN1,9926054,BMS-345541,0.438875,Stomach +CVCL_1454,NCI-H1092,11152667,AZD7762,0.254475,Lung +CVCL_1454,NCI-H1092,135398516,OSI-027,0.42221875,Lung +CVCL_1454,NCI-H1092,156422,Doramapimod,0.42715625,Lung +CVCL_1454,NCI-H1092,176870,Erlotinib,0.579375,Lung +CVCL_1454,NCI-H1092,216239,Sorafenib,0.355125,Lung +CVCL_1454,NCI-H1092,24771867,Alisertib,0.45884375,Lung +CVCL_1454,NCI-H1092,24821094,Ibrutinib,0.41234375,Lung +CVCL_1454,NCI-H1092,135398738,Dacarbazine,0.52725,Lung +CVCL_1454,NCI-H1092,3062316,Dasatinib,0.4285625,Lung +CVCL_1454,NCI-H1092,36314,Paclitaxel,0.29511875,Lung +CVCL_1454,NCI-H1092,44137675,AZD6482,0.44009375,Lung +CVCL_1454,NCI-H1092,6450551,Axitinib,0.37240625,Lung +CVCL_1454,NCI-H1092,9933475,Cediranib,0.3765625,Lung +CVCL_1455,NCI-H1105,11152667,AZD7762,0.2656625,Lung +CVCL_1455,NCI-H1105,135398516,OSI-027,0.39503125,Lung +CVCL_1455,NCI-H1105,156422,Doramapimod,0.3810625,Lung +CVCL_1455,NCI-H1105,176870,Erlotinib,0.49140625,Lung +CVCL_1455,NCI-H1105,216239,Sorafenib,0.36128125,Lung +CVCL_1455,NCI-H1105,24771867,Alisertib,0.35253125,Lung +CVCL_1455,NCI-H1105,24821094,Ibrutinib,0.37971875,Lung +CVCL_1455,NCI-H1105,135398738,Dacarbazine,0.4455,Lung +CVCL_1455,NCI-H1105,3062316,Dasatinib,0.37209375,Lung +CVCL_1455,NCI-H1105,36314,Paclitaxel,0.183075,Lung +CVCL_1455,NCI-H1105,44137675,AZD6482,0.395375,Lung +CVCL_1455,NCI-H1105,6450551,Axitinib,0.3579375,Lung +CVCL_1455,NCI-H1105,9926054,BMS-345541,0.3743125,Lung +CVCL_1455,NCI-H1105,9933475,Cediranib,0.3491875,Lung +CVCL_1456,NCI-H1155,11152667,AZD7762,0.2476125,Lung +CVCL_1456,NCI-H1155,123631,Gefitinib,0.387875,Lung +CVCL_1456,NCI-H1155,135398516,OSI-027,0.3284375,Lung +CVCL_1456,NCI-H1155,156422,Doramapimod,0.41625,Lung +CVCL_1456,NCI-H1155,176870,Erlotinib,0.4295,Lung +CVCL_1456,NCI-H1155,216239,Sorafenib,0.368,Lung +CVCL_1456,NCI-H1155,24771867,Alisertib,0.33228125,Lung +CVCL_1456,NCI-H1155,135398738,Dacarbazine,0.4514375,Lung +CVCL_1456,NCI-H1155,3062316,Dasatinib,0.40209375,Lung +CVCL_1456,NCI-H1155,36314,Paclitaxel,0.149353125,Lung +CVCL_1456,NCI-H1155,44137675,AZD6482,0.388125,Lung +CVCL_1456,NCI-H1155,6450551,Axitinib,0.37534375,Lung +CVCL_1456,NCI-H1155,9926054,BMS-345541,0.40125,Lung +CVCL_1464,NCI-H1355,11152667,AZD7762,0.225159375,Lung +CVCL_1464,NCI-H1355,123631,Gefitinib,0.3611875,Lung +CVCL_1464,NCI-H1355,135398516,OSI-027,0.2993375,Lung +CVCL_1464,NCI-H1355,156422,Doramapimod,0.450875,Lung +CVCL_1464,NCI-H1355,176870,Erlotinib,0.38884375,Lung +CVCL_1464,NCI-H1355,216239,Sorafenib,0.375,Lung +CVCL_1464,NCI-H1355,24771867,Alisertib,0.34775,Lung +CVCL_1464,NCI-H1355,24821094,Ibrutinib,0.4300625,Lung +CVCL_1464,NCI-H1355,135398738,Dacarbazine,0.44015625,Lung +CVCL_1464,NCI-H1355,3062316,Dasatinib,0.333875,Lung +CVCL_1464,NCI-H1355,36314,Paclitaxel,0.23161875,Lung +CVCL_1464,NCI-H1355,44137675,AZD6482,0.4039375,Lung +CVCL_1464,NCI-H1355,6450551,Axitinib,0.41471875,Lung +CVCL_1464,NCI-H1355,9926054,BMS-345541,0.39090625,Lung +CVCL_1479,NCI-H1581,11152667,AZD7762,0.27998125,Lung +CVCL_1479,NCI-H1581,123631,Gefitinib,0.39175,Lung +CVCL_1479,NCI-H1581,135398516,OSI-027,0.269159375,Lung +CVCL_1479,NCI-H1581,156422,Doramapimod,0.43371875,Lung +CVCL_1479,NCI-H1581,176870,Erlotinib,0.39353125,Lung +CVCL_1479,NCI-H1581,216239,Sorafenib,0.311890625,Lung +CVCL_1479,NCI-H1581,24771867,Alisertib,0.290246875,Lung +CVCL_1479,NCI-H1581,135398738,Dacarbazine,0.458375,Lung +CVCL_1479,NCI-H1581,3062316,Dasatinib,0.395875,Lung +CVCL_1479,NCI-H1581,36314,Paclitaxel,0.131859375,Lung +CVCL_1479,NCI-H1581,44137675,AZD6482,0.3786875,Lung +CVCL_1479,NCI-H1581,6450551,Axitinib,0.31278125,Lung +CVCL_1479,NCI-H1581,9926054,BMS-345541,0.37753125,Lung +CVCL_1515,NCI-H2023,11152667,AZD7762,0.285590625,Lung +CVCL_1515,NCI-H2023,123631,Gefitinib,0.38778125,Lung +CVCL_1515,NCI-H2023,135398516,OSI-027,0.39615625,Lung +CVCL_1515,NCI-H2023,156422,Doramapimod,0.46178125,Lung +CVCL_1515,NCI-H2023,176870,Erlotinib,0.4420625,Lung +CVCL_1515,NCI-H2023,216239,Sorafenib,0.4961875,Lung +CVCL_1515,NCI-H2023,24771867,Alisertib,0.4508125,Lung +CVCL_1515,NCI-H2023,24821094,Ibrutinib,0.4510625,Lung +CVCL_1515,NCI-H2023,135398738,Dacarbazine,0.45940625,Lung +CVCL_1515,NCI-H2023,3062316,Dasatinib,0.39790625,Lung +CVCL_1515,NCI-H2023,36314,Paclitaxel,0.320625,Lung +CVCL_1515,NCI-H2023,44137675,AZD6482,0.4125,Lung +CVCL_1515,NCI-H2023,6450551,Axitinib,0.4493125,Lung +CVCL_1515,NCI-H2023,9926054,BMS-345541,0.40071875,Lung +CVCL_1525,NCI-H209,11152667,AZD7762,0.30166875,Lung +CVCL_1525,NCI-H209,44137675,AZD6482,0.3915,Lung +CVCL_1529,NCI-H211,11152667,AZD7762,0.23420625,Lung +CVCL_1529,NCI-H211,123631,Gefitinib,0.40359375,Lung +CVCL_1529,NCI-H211,135398516,OSI-027,0.3258125,Lung +CVCL_1529,NCI-H211,156422,Doramapimod,0.44028125,Lung +CVCL_1529,NCI-H211,176870,Erlotinib,0.51903125,Lung +CVCL_1529,NCI-H211,216239,Sorafenib,0.35625,Lung +CVCL_1529,NCI-H211,24771867,Alisertib,0.243984375,Lung +CVCL_1529,NCI-H211,135398738,Dacarbazine,0.42640625,Lung +CVCL_1529,NCI-H211,3062316,Dasatinib,0.261984375,Lung +CVCL_1529,NCI-H211,36314,Paclitaxel,0.0754,Lung +CVCL_1529,NCI-H211,44137675,AZD6482,0.42378125,Lung +CVCL_1529,NCI-H211,6450551,Axitinib,0.342,Lung +CVCL_1529,NCI-H211,9926054,BMS-345541,0.3511875,Lung +CVCL_1536,NCI-H2171,11152667,AZD7762,0.243209375,Lung +CVCL_1536,NCI-H2171,24771867,Alisertib,0.234978125,Lung +CVCL_1536,NCI-H2171,24821094,Ibrutinib,0.40815625,Lung +CVCL_1536,NCI-H2171,135398738,Dacarbazine,0.4978125,Lung +CVCL_1536,NCI-H2171,36314,Paclitaxel,0.105275,Lung +CVCL_1536,NCI-H2171,9933475,Cediranib,0.35559375,Lung +CVCL_1539,NCI-H2196,11152667,AZD7762,0.2996,Lung +CVCL_1539,NCI-H2196,123631,Gefitinib,0.38509375,Lung +CVCL_1539,NCI-H2196,135398516,OSI-027,0.34878125,Lung +CVCL_1539,NCI-H2196,156422,Doramapimod,0.481875,Lung +CVCL_1539,NCI-H2196,176870,Erlotinib,0.53196875,Lung +CVCL_1539,NCI-H2196,216239,Sorafenib,0.3690625,Lung +CVCL_1539,NCI-H2196,24771867,Alisertib,0.45859375,Lung +CVCL_1539,NCI-H2196,24821094,Ibrutinib,0.39671875,Lung +CVCL_1539,NCI-H2196,135398738,Dacarbazine,0.46875,Lung +CVCL_1539,NCI-H2196,3062316,Dasatinib,0.39559375,Lung +CVCL_1539,NCI-H2196,36314,Paclitaxel,0.27401875,Lung +CVCL_1539,NCI-H2196,44137675,AZD6482,0.39803125,Lung +CVCL_1539,NCI-H2196,6450551,Axitinib,0.3866875,Lung +CVCL_1539,NCI-H2196,9926054,BMS-345541,0.333625,Lung +CVCL_1539,NCI-H2196,9933475,Cediranib,0.36303125,Lung +CVCL_1545,NCI-H2286,11152667,AZD7762,0.264021875,Lung +CVCL_1545,NCI-H2286,123631,Gefitinib,0.43390625,Lung +CVCL_1545,NCI-H2286,135398516,OSI-027,0.37821875,Lung +CVCL_1545,NCI-H2286,156422,Doramapimod,0.403125,Lung +CVCL_1545,NCI-H2286,176870,Erlotinib,0.41746875,Lung +CVCL_1545,NCI-H2286,216239,Sorafenib,0.46265625,Lung +CVCL_1545,NCI-H2286,24771867,Alisertib,0.36309375,Lung +CVCL_1545,NCI-H2286,24821094,Ibrutinib,0.38353125,Lung +CVCL_1545,NCI-H2286,135398738,Dacarbazine,0.5139375,Lung +CVCL_1545,NCI-H2286,3062316,Dasatinib,0.2088625,Lung +CVCL_1545,NCI-H2286,36314,Paclitaxel,0.238475,Lung +CVCL_1545,NCI-H2286,44137675,AZD6482,0.38471875,Lung +CVCL_1545,NCI-H2286,6450551,Axitinib,0.37621875,Lung +CVCL_1545,NCI-H2286,9926054,BMS-345541,0.54428125,Lung +CVCL_1559,NCI-H358,11152667,AZD7762,0.255146875,Lung +CVCL_1559,NCI-H358,123631,Gefitinib,0.294996875,Lung +CVCL_1559,NCI-H358,135398516,OSI-027,0.3178125,Lung +CVCL_1559,NCI-H358,156422,Doramapimod,0.4465,Lung +CVCL_1559,NCI-H358,176870,Erlotinib,0.27815625,Lung +CVCL_1559,NCI-H358,216239,Sorafenib,0.399,Lung +CVCL_1559,NCI-H358,24771867,Alisertib,0.303971875,Lung +CVCL_1559,NCI-H358,135398738,Dacarbazine,0.4770625,Lung +CVCL_1559,NCI-H358,3062316,Dasatinib,0.2681625,Lung +CVCL_1559,NCI-H358,36314,Paclitaxel,0.1179625,Lung +CVCL_1559,NCI-H358,44137675,AZD6482,0.3923125,Lung +CVCL_1559,NCI-H358,6450551,Axitinib,0.40084375,Lung +CVCL_1559,NCI-H358,9926054,BMS-345541,0.39978125,Lung +CVCL_1565,NCI-H510A,36314,Paclitaxel,0.0378125,Lung +CVCL_1565,NCI-H510A,6450551,Axitinib,0.26381875,Lung +CVCL_1569,NCI-H526,11152667,AZD7762,0.3043375,Lung +CVCL_1569,NCI-H526,123631,Gefitinib,0.40884375,Lung +CVCL_1569,NCI-H526,135398516,OSI-027,0.3981875,Lung +CVCL_1569,NCI-H526,156422,Doramapimod,0.44503125,Lung +CVCL_1569,NCI-H526,176870,Erlotinib,0.451375,Lung +CVCL_1569,NCI-H526,216239,Sorafenib,0.40303125,Lung +CVCL_1569,NCI-H526,24771867,Alisertib,0.27481875,Lung +CVCL_1569,NCI-H526,135398738,Dacarbazine,0.43096875,Lung +CVCL_1569,NCI-H526,3062316,Dasatinib,0.42834375,Lung +CVCL_1569,NCI-H526,44137675,AZD6482,0.42203125,Lung +CVCL_1569,NCI-H526,6450551,Axitinib,0.42015625,Lung +CVCL_1569,NCI-H526,9926054,BMS-345541,0.3618125,Lung +CVCL_1619,OCI-AML-2,11152667,AZD7762,0.155828125,Blood +CVCL_1619,OCI-AML-2,123631,Gefitinib,0.402125,Blood +CVCL_1619,OCI-AML-2,135398516,OSI-027,0.34846875,Blood +CVCL_1619,OCI-AML-2,156422,Doramapimod,0.41603125,Blood +CVCL_1619,OCI-AML-2,176870,Erlotinib,0.5465,Blood +CVCL_1619,OCI-AML-2,216239,Sorafenib,0.5708125,Blood +CVCL_1619,OCI-AML-2,24821094,Ibrutinib,0.4230625,Blood +CVCL_1619,OCI-AML-2,135398738,Dacarbazine,0.310309375,Blood +CVCL_1619,OCI-AML-2,3062316,Dasatinib,0.35890625,Blood +CVCL_1619,OCI-AML-2,36314,Paclitaxel,0.096465625,Blood +CVCL_1619,OCI-AML-2,44137675,AZD6482,0.4155,Blood +CVCL_1619,OCI-AML-2,6450551,Axitinib,0.34315625,Blood +CVCL_1619,OCI-AML-2,9926054,BMS-345541,0.3595,Blood +CVCL_1624,ONS-76,11152667,AZD7762,0.27170625,Brain +CVCL_1624,ONS-76,123631,Gefitinib,0.39696875,Brain +CVCL_1624,ONS-76,135398516,OSI-027,0.380125,Brain +CVCL_1624,ONS-76,156422,Doramapimod,0.46659375,Brain +CVCL_1624,ONS-76,176870,Erlotinib,0.45390625,Brain +CVCL_1624,ONS-76,216239,Sorafenib,0.3713125,Brain +CVCL_1624,ONS-76,24771867,Alisertib,0.4034375,Brain +CVCL_1624,ONS-76,135398738,Dacarbazine,0.44465625,Brain +CVCL_1624,ONS-76,3062316,Dasatinib,0.282471875,Brain +CVCL_1624,ONS-76,36314,Paclitaxel,0.244334375,Brain +CVCL_1624,ONS-76,44137675,AZD6482,0.37028125,Brain +CVCL_1624,ONS-76,6450551,Axitinib,0.4216875,Brain +CVCL_1624,ONS-76,9926054,BMS-345541,0.39584375,Brain +CVCL_1626,OS-RC-2,11152667,AZD7762,0.281959375,Kidney +CVCL_1626,OS-RC-2,123631,Gefitinib,0.40459375,Kidney +CVCL_1626,OS-RC-2,135398516,OSI-027,0.38428125,Kidney +CVCL_1626,OS-RC-2,156422,Doramapimod,0.4620625,Kidney +CVCL_1626,OS-RC-2,176870,Erlotinib,0.4195,Kidney +CVCL_1626,OS-RC-2,216239,Sorafenib,0.45265625,Kidney +CVCL_1626,OS-RC-2,24771867,Alisertib,0.44809375,Kidney +CVCL_1626,OS-RC-2,3062316,Dasatinib,0.27223125,Kidney +CVCL_1626,OS-RC-2,36314,Paclitaxel,0.349875,Kidney +CVCL_1626,OS-RC-2,44137675,AZD6482,0.33884375,Kidney +CVCL_1626,OS-RC-2,6450551,Axitinib,0.440875,Kidney +CVCL_1626,OS-RC-2,9926054,BMS-345541,0.422375,Kidney +CVCL_1633,Panc 02.03,123631,Gefitinib,0.4379375,Pancreas +CVCL_1633,Panc 02.03,135398516,OSI-027,0.42953125,Pancreas +CVCL_1633,Panc 02.03,156422,Doramapimod,0.452125,Pancreas +CVCL_1633,Panc 02.03,176870,Erlotinib,0.45959375,Pancreas +CVCL_1633,Panc 02.03,216239,Sorafenib,0.42159375,Pancreas +CVCL_1633,Panc 02.03,24771867,Alisertib,0.436125,Pancreas +CVCL_1633,Panc 02.03,24821094,Ibrutinib,0.46653125,Pancreas +CVCL_1633,Panc 02.03,135398738,Dacarbazine,0.43509375,Pancreas +CVCL_1633,Panc 02.03,3062316,Dasatinib,0.3556875,Pancreas +CVCL_1633,Panc 02.03,36314,Paclitaxel,0.290146875,Pancreas +CVCL_1633,Panc 02.03,6450551,Axitinib,0.43815625,Pancreas +CVCL_1633,Panc 02.03,9926054,BMS-345541,0.39725,Pancreas +CVCL_1633,Panc 02.03,9933475,Cediranib,0.386375,Pancreas +CVCL_1649,RD,11152667,AZD7762,0.29548125,Muscle +CVCL_1649,RD,123631,Gefitinib,0.39740625,Muscle +CVCL_1649,RD,135398516,OSI-027,0.37609375,Muscle +CVCL_1649,RD,156422,Doramapimod,0.429375,Muscle +CVCL_1649,RD,176870,Erlotinib,0.459375,Muscle +CVCL_1649,RD,216239,Sorafenib,0.3834375,Muscle +CVCL_1649,RD,24771867,Alisertib,0.37253125,Muscle +CVCL_1649,RD,24821094,Ibrutinib,0.42346875,Muscle +CVCL_1649,RD,135398738,Dacarbazine,0.45153125,Muscle +CVCL_1649,RD,3062316,Dasatinib,0.31653125,Muscle +CVCL_1649,RD,36314,Paclitaxel,0.17821875,Muscle +CVCL_1649,RD,44137675,AZD6482,0.4275,Muscle +CVCL_1649,RD,6450551,Axitinib,0.4231875,Muscle +CVCL_1649,RD,9926054,BMS-345541,0.37353125,Muscle +CVCL_1649,RD,9933475,Cediranib,0.36246875,Muscle +CVCL_1651,RERF-LC-Ad1,11152667,AZD7762,0.310009375,Lung +CVCL_1651,RERF-LC-Ad1,123631,Gefitinib,0.41559375,Lung +CVCL_1651,RERF-LC-Ad1,135398516,OSI-027,0.43328125,Lung +CVCL_1651,RERF-LC-Ad1,156422,Doramapimod,0.4754375,Lung +CVCL_1651,RERF-LC-Ad1,176870,Erlotinib,0.4775625,Lung +CVCL_1651,RERF-LC-Ad1,216239,Sorafenib,0.46678125,Lung +CVCL_1651,RERF-LC-Ad1,24771867,Alisertib,0.50984375,Lung +CVCL_1651,RERF-LC-Ad1,135398738,Dacarbazine,0.525625,Lung +CVCL_1651,RERF-LC-Ad1,3062316,Dasatinib,0.38265625,Lung +CVCL_1651,RERF-LC-Ad1,36314,Paclitaxel,0.4035625,Lung +CVCL_1651,RERF-LC-Ad1,44137675,AZD6482,0.45090625,Lung +CVCL_1651,RERF-LC-Ad1,6450551,Axitinib,0.46875,Lung +CVCL_1651,RERF-LC-Ad1,9926054,BMS-345541,0.42621875,Lung +CVCL_1679,SBC-5,11152667,AZD7762,0.284765625,Lung +CVCL_1679,SBC-5,123631,Gefitinib,0.416375,Lung +CVCL_1679,SBC-5,135398516,OSI-027,0.4305625,Lung +CVCL_1679,SBC-5,156422,Doramapimod,0.46715625,Lung +CVCL_1679,SBC-5,176870,Erlotinib,0.4429375,Lung +CVCL_1679,SBC-5,216239,Sorafenib,0.35209375,Lung +CVCL_1679,SBC-5,24771867,Alisertib,0.34965625,Lung +CVCL_1679,SBC-5,135398738,Dacarbazine,0.46646875,Lung +CVCL_1679,SBC-5,3062316,Dasatinib,0.43034375,Lung +CVCL_1679,SBC-5,36314,Paclitaxel,0.11003125,Lung +CVCL_1679,SBC-5,44137675,AZD6482,0.46796875,Lung +CVCL_1679,SBC-5,6450551,Axitinib,0.41846875,Lung +CVCL_1679,SBC-5,9926054,BMS-345541,0.41965625,Lung +CVCL_1682,SCC-25,11152667,AZD7762,0.24538125,Head And Neck +CVCL_1682,SCC-25,123631,Gefitinib,0.27498125,Head And Neck +CVCL_1682,SCC-25,135398516,OSI-027,0.323875,Head And Neck +CVCL_1682,SCC-25,156422,Doramapimod,0.464125,Head And Neck +CVCL_1682,SCC-25,176870,Erlotinib,0.32278125,Head And Neck +CVCL_1682,SCC-25,216239,Sorafenib,0.398875,Head And Neck +CVCL_1682,SCC-25,24771867,Alisertib,0.31033125,Head And Neck +CVCL_1682,SCC-25,24821094,Ibrutinib,0.185465625,Head And Neck +CVCL_1682,SCC-25,3062316,Dasatinib,0.15211875,Head And Neck +CVCL_1682,SCC-25,36314,Paclitaxel,0.123340625,Head And Neck +CVCL_1682,SCC-25,44137675,AZD6482,0.35578125,Head And Neck +CVCL_1682,SCC-25,6450551,Axitinib,0.399875,Head And Neck +CVCL_1682,SCC-25,9926054,BMS-345541,0.36465625,Head And Neck +CVCL_1690,SF295,11152667,AZD7762,0.26736875,Brain +CVCL_1690,SF295,123631,Gefitinib,0.44653125,Brain +CVCL_1690,SF295,135398516,OSI-027,0.3796875,Brain +CVCL_1690,SF295,156422,Doramapimod,0.46934375,Brain +CVCL_1690,SF295,176870,Erlotinib,0.47425,Brain +CVCL_1690,SF295,216239,Sorafenib,0.39578125,Brain +CVCL_1690,SF295,24771867,Alisertib,0.38425,Brain +CVCL_1690,SF295,135398738,Dacarbazine,0.4795,Brain +CVCL_1690,SF295,3062316,Dasatinib,0.426625,Brain +CVCL_1690,SF295,36314,Paclitaxel,0.37609375,Brain +CVCL_1690,SF295,44137675,AZD6482,0.38484375,Brain +CVCL_1690,SF295,6450551,Axitinib,0.40228125,Brain +CVCL_1690,SF295,9926054,BMS-345541,0.43021875,Brain +CVCL_1700,SK-N-AS,11152667,AZD7762,0.1693,Nervous System +CVCL_1700,SK-N-AS,123631,Gefitinib,0.41584375,Nervous System +CVCL_1700,SK-N-AS,135398516,OSI-027,0.38421875,Nervous System +CVCL_1700,SK-N-AS,156422,Doramapimod,0.43828125,Nervous System +CVCL_1700,SK-N-AS,176870,Erlotinib,0.45540625,Nervous System +CVCL_1700,SK-N-AS,216239,Sorafenib,0.378375,Nervous System +CVCL_1700,SK-N-AS,24771867,Alisertib,0.32925,Nervous System +CVCL_1700,SK-N-AS,24821094,Ibrutinib,0.45765625,Nervous System +CVCL_1700,SK-N-AS,135398738,Dacarbazine,0.43871875,Nervous System +CVCL_1700,SK-N-AS,3062316,Dasatinib,0.38996875,Nervous System +CVCL_1700,SK-N-AS,36314,Paclitaxel,0.200765625,Nervous System +CVCL_1700,SK-N-AS,44137675,AZD6482,0.42946875,Nervous System +CVCL_1700,SK-N-AS,6450551,Axitinib,0.39090625,Nervous System +CVCL_1700,SK-N-AS,9926054,BMS-345541,0.3655625,Nervous System +CVCL_1700,SK-N-AS,9933475,Cediranib,0.3563125,Nervous System +CVCL_1754,TE 441.T,11152667,AZD7762,0.292209375,Muscle +CVCL_1754,TE 441.T,123631,Gefitinib,0.41603125,Muscle +CVCL_1754,TE 441.T,135398516,OSI-027,0.35884375,Muscle +CVCL_1754,TE 441.T,156422,Doramapimod,0.4481875,Muscle +CVCL_1754,TE 441.T,176870,Erlotinib,0.41896875,Muscle +CVCL_1754,TE 441.T,216239,Sorafenib,0.3706875,Muscle +CVCL_1754,TE 441.T,24771867,Alisertib,0.36403125,Muscle +CVCL_1754,TE 441.T,24821094,Ibrutinib,0.41728125,Muscle +CVCL_1754,TE 441.T,135398738,Dacarbazine,0.45796875,Muscle +CVCL_1754,TE 441.T,3062316,Dasatinib,0.4236875,Muscle +CVCL_1754,TE 441.T,36314,Paclitaxel,0.2383875,Muscle +CVCL_1754,TE 441.T,44137675,AZD6482,0.3625625,Muscle +CVCL_1754,TE 441.T,6450551,Axitinib,0.39228125,Muscle +CVCL_1754,TE 441.T,9926054,BMS-345541,0.363625,Muscle +CVCL_1754,TE 441.T,9933475,Cediranib,0.35115625,Muscle +CVCL_1760,TE-10,11152667,AZD7762,0.20939375,Esophagus +CVCL_1760,TE-10,123631,Gefitinib,0.36296875,Esophagus +CVCL_1760,TE-10,135398516,OSI-027,0.3758125,Esophagus +CVCL_1760,TE-10,156422,Doramapimod,0.45846875,Esophagus +CVCL_1760,TE-10,176870,Erlotinib,0.4014375,Esophagus +CVCL_1760,TE-10,216239,Sorafenib,0.40253125,Esophagus +CVCL_1760,TE-10,24771867,Alisertib,0.422875,Esophagus +CVCL_1760,TE-10,135398738,Dacarbazine,0.4265,Esophagus +CVCL_1760,TE-10,3062316,Dasatinib,0.27961875,Esophagus +CVCL_1760,TE-10,36314,Paclitaxel,0.23831875,Esophagus +CVCL_1760,TE-10,44137675,AZD6482,0.41046875,Esophagus +CVCL_1760,TE-10,6450551,Axitinib,0.44403125,Esophagus +CVCL_1760,TE-10,9926054,BMS-345541,0.38084375,Esophagus +CVCL_1767,TE-9,11152667,AZD7762,0.273721875,Esophagus +CVCL_1767,TE-9,123631,Gefitinib,0.3895,Esophagus +CVCL_1767,TE-9,135398516,OSI-027,0.412375,Esophagus +CVCL_1767,TE-9,156422,Doramapimod,0.466375,Esophagus +CVCL_1767,TE-9,176870,Erlotinib,0.41446875,Esophagus +CVCL_1767,TE-9,216239,Sorafenib,0.39871875,Esophagus +CVCL_1767,TE-9,24771867,Alisertib,0.33875,Esophagus +CVCL_1767,TE-9,135398738,Dacarbazine,0.4478125,Esophagus +CVCL_1767,TE-9,3062316,Dasatinib,0.304878125,Esophagus +CVCL_1767,TE-9,44137675,AZD6482,0.44953125,Esophagus +CVCL_1767,TE-9,6450551,Axitinib,0.40928125,Esophagus +CVCL_1774,TT,11152667,AZD7762,0.27549375,Esophagus +CVCL_1774,TT,123631,Gefitinib,0.3209375,Esophagus +CVCL_1774,TT,135398516,OSI-027,0.39396875,Esophagus +CVCL_1774,TT,156422,Doramapimod,0.44534375,Esophagus +CVCL_1774,TT,176870,Erlotinib,0.35621875,Esophagus +CVCL_1774,TT,216239,Sorafenib,0.39721875,Esophagus +CVCL_1774,TT,24771867,Alisertib,0.43278125,Esophagus +CVCL_1774,TT,135398738,Dacarbazine,0.4118125,Esophagus +CVCL_1774,TT,3062316,Dasatinib,0.30311875,Esophagus +CVCL_1774,TT,36314,Paclitaxel,0.19031875,Esophagus +CVCL_1774,TT,44137675,AZD6482,0.4210625,Esophagus +CVCL_1774,TT,6450551,Axitinib,0.42390625,Esophagus +CVCL_1774,TT,9926054,BMS-345541,0.36671875,Esophagus +CVCL_1783,UM-UC-3,11152667,AZD7762,0.3063,Bladder +CVCL_1783,UM-UC-3,123631,Gefitinib,0.42734375,Bladder +CVCL_1783,UM-UC-3,135398516,OSI-027,0.40684375,Bladder +CVCL_1783,UM-UC-3,156422,Doramapimod,0.46153125,Bladder +CVCL_1783,UM-UC-3,176870,Erlotinib,0.44290625,Bladder +CVCL_1783,UM-UC-3,216239,Sorafenib,0.356375,Bladder +CVCL_1783,UM-UC-3,24771867,Alisertib,0.38865625,Bladder +CVCL_1783,UM-UC-3,24821094,Ibrutinib,0.44803125,Bladder +CVCL_1783,UM-UC-3,135398738,Dacarbazine,0.4635625,Bladder +CVCL_1783,UM-UC-3,3062316,Dasatinib,0.306703125,Bladder +CVCL_1783,UM-UC-3,36314,Paclitaxel,0.228571875,Bladder +CVCL_1783,UM-UC-3,44137675,AZD6482,0.3426875,Bladder +CVCL_1783,UM-UC-3,6450551,Axitinib,0.41078125,Bladder +CVCL_1783,UM-UC-3,9926054,BMS-345541,0.401,Bladder +CVCL_1798,42-MG-BA,11152667,AZD7762,0.234671875,Brain +CVCL_1798,42-MG-BA,123631,Gefitinib,0.225875,Brain +CVCL_1798,42-MG-BA,135398516,OSI-027,0.38128125,Brain +CVCL_1798,42-MG-BA,156422,Doramapimod,0.44140625,Brain +CVCL_1798,42-MG-BA,176870,Erlotinib,0.4350625,Brain +CVCL_1798,42-MG-BA,216239,Sorafenib,0.36378125,Brain +CVCL_1798,42-MG-BA,24771867,Alisertib,0.36721875,Brain +CVCL_1798,42-MG-BA,24821094,Ibrutinib,0.230675,Brain +CVCL_1798,42-MG-BA,135398738,Dacarbazine,0.32315625,Brain +CVCL_1798,42-MG-BA,3062316,Dasatinib,0.2021375,Brain +CVCL_1798,42-MG-BA,36314,Paclitaxel,0.264290625,Brain +CVCL_1798,42-MG-BA,44137675,AZD6482,0.36184375,Brain +CVCL_1798,42-MG-BA,5494449,Tozasertib,0.20401875,Brain +CVCL_1798,42-MG-BA,6450551,Axitinib,0.299840625,Brain +CVCL_1798,42-MG-BA,9926054,BMS-345541,0.3798125,Brain +CVCL_1798,42-MG-BA,9933475,Cediranib,0.242046875,Brain +CVCL_1818,Granta-519,11152667,AZD7762,0.13155625,Lymph +CVCL_1818,Granta-519,123631,Gefitinib,0.40840625,Lymph +CVCL_1818,Granta-519,135398516,OSI-027,0.3814375,Lymph +CVCL_1818,Granta-519,156422,Doramapimod,0.415875,Lymph +CVCL_1818,Granta-519,176870,Erlotinib,0.48628125,Lymph +CVCL_1818,Granta-519,216239,Sorafenib,0.3915625,Lymph +CVCL_1818,Granta-519,24771867,Alisertib,0.284409375,Lymph +CVCL_1818,Granta-519,24821094,Ibrutinib,0.3263125,Lymph +CVCL_1818,Granta-519,135398738,Dacarbazine,0.38834375,Lymph +CVCL_1818,Granta-519,3062316,Dasatinib,0.28933125,Lymph +CVCL_1818,Granta-519,36314,Paclitaxel,0.049509375,Lymph +CVCL_1818,Granta-519,44137675,AZD6482,0.35540625,Lymph +CVCL_1818,Granta-519,6450551,Axitinib,0.36353125,Lymph +CVCL_1818,Granta-519,9926054,BMS-345541,0.38396875,Lymph +CVCL_1818,Granta-519,9933475,Cediranib,0.35603125,Lymph +CVCL_1847,PaTu 8988t,11152667,AZD7762,0.2495125,Pancreas +CVCL_1847,PaTu 8988t,123631,Gefitinib,0.4505625,Pancreas +CVCL_1847,PaTu 8988t,135398516,OSI-027,0.4395625,Pancreas +CVCL_1847,PaTu 8988t,156422,Doramapimod,0.4956875,Pancreas +CVCL_1847,PaTu 8988t,176870,Erlotinib,0.413375,Pancreas +CVCL_1847,PaTu 8988t,216239,Sorafenib,0.39034375,Pancreas +CVCL_1847,PaTu 8988t,24771867,Alisertib,0.46875,Pancreas +CVCL_1847,PaTu 8988t,24821094,Ibrutinib,0.46440625,Pancreas +CVCL_1847,PaTu 8988t,135398738,Dacarbazine,0.4949375,Pancreas +CVCL_1847,PaTu 8988t,3062316,Dasatinib,0.32621875,Pancreas +CVCL_1847,PaTu 8988t,44137675,AZD6482,0.45775,Pancreas +CVCL_1847,PaTu 8988t,6450551,Axitinib,0.38828125,Pancreas +CVCL_1847,PaTu 8988t,9926054,BMS-345541,0.38475,Pancreas +CVCL_1847,PaTu 8988t,9933475,Cediranib,0.3843125,Pancreas +CVCL_2063,HCC827,11152667,AZD7762,0.226496875,Lung +CVCL_2063,HCC827,123631,Gefitinib,0.070734375,Lung +CVCL_2063,HCC827,135398516,OSI-027,0.35175,Lung +CVCL_2063,HCC827,156422,Doramapimod,0.4434375,Lung +CVCL_2063,HCC827,176870,Erlotinib,0.122553125,Lung +CVCL_2063,HCC827,216239,Sorafenib,0.40390625,Lung +CVCL_2063,HCC827,24771867,Alisertib,0.311596875,Lung +CVCL_2063,HCC827,3062316,Dasatinib,0.1146375,Lung +CVCL_2063,HCC827,36314,Paclitaxel,0.2402625,Lung +CVCL_2063,HCC827,44137675,AZD6482,0.384375,Lung +CVCL_2063,HCC827,6450551,Axitinib,0.42759375,Lung +CVCL_2063,HCC827,9926054,BMS-345541,0.3813125,Lung +CVCL_2094,KPL-1,123631,Gefitinib,,Breast +CVCL_2094,KPL-1,135398516,OSI-027,0.4625,Breast +CVCL_2094,KPL-1,156422,Doramapimod,0.46921875,Breast +CVCL_2094,KPL-1,176870,Erlotinib,0.46875,Breast +CVCL_2094,KPL-1,216239,Sorafenib,0.4185,Breast +CVCL_2094,KPL-1,24771867,Alisertib,0.44225,Breast +CVCL_2094,KPL-1,135398738,Dacarbazine,0.46875,Breast +CVCL_2094,KPL-1,3062316,Dasatinib,0.3408125,Breast +CVCL_2094,KPL-1,44137675,AZD6482,0.4441875,Breast +CVCL_2209,SUP-M2,123631,Gefitinib,0.38946875,Lymph +CVCL_2209,SUP-M2,135398516,OSI-027,0.298465625,Lymph +CVCL_2209,SUP-M2,156422,Doramapimod,0.4459375,Lymph +CVCL_2209,SUP-M2,176870,Erlotinib,0.44315625,Lymph +CVCL_2209,SUP-M2,216239,Sorafenib,0.3266875,Lymph +CVCL_2209,SUP-M2,24771867,Alisertib,0.1148375,Lymph +CVCL_2209,SUP-M2,24821094,Ibrutinib,0.37353125,Lymph +CVCL_2209,SUP-M2,135398738,Dacarbazine,0.3995625,Lymph +CVCL_2209,SUP-M2,3062316,Dasatinib,0.3756875,Lymph +CVCL_2209,SUP-M2,36314,Paclitaxel,0.022565625,Lymph +CVCL_2209,SUP-M2,44137675,AZD6482,0.33796875,Lymph +CVCL_2209,SUP-M2,6450551,Axitinib,0.3100625,Lymph +CVCL_2209,SUP-M2,9926054,BMS-345541,0.3436875,Lymph +CVCL_2209,SUP-M2,9933475,Cediranib,0.3585625,Lymph +CVCL_2891,EBC-1,11152667,AZD7762,0.28419375,Lung +CVCL_2891,EBC-1,123631,Gefitinib,0.3544375,Lung +CVCL_2891,EBC-1,135398516,OSI-027,0.345,Lung +CVCL_2891,EBC-1,156422,Doramapimod,0.42946875,Lung +CVCL_2891,EBC-1,176870,Erlotinib,0.4386875,Lung +CVCL_2891,EBC-1,216239,Sorafenib,0.39746875,Lung +CVCL_2891,EBC-1,24771867,Alisertib,0.3118625,Lung +CVCL_2891,EBC-1,24821094,Ibrutinib,0.4270625,Lung +CVCL_2891,EBC-1,135398738,Dacarbazine,0.44328125,Lung +CVCL_2891,EBC-1,3062316,Dasatinib,0.302146875,Lung +CVCL_2891,EBC-1,36314,Paclitaxel,0.219625,Lung +CVCL_2891,EBC-1,44137675,AZD6482,0.38978125,Lung +CVCL_2891,EBC-1,6450551,Axitinib,0.3985625,Lung +CVCL_2891,EBC-1,9926054,BMS-345541,0.38390625,Lung +CVCL_3004,KP-2,11152667,AZD7762,0.289590625,Pancreas +CVCL_3004,KP-2,123631,Gefitinib,0.428125,Pancreas +CVCL_3004,KP-2,135398516,OSI-027,0.428125,Pancreas +CVCL_3004,KP-2,156422,Doramapimod,0.453,Pancreas +CVCL_3004,KP-2,216239,Sorafenib,0.40225,Pancreas +CVCL_3004,KP-2,24771867,Alisertib,0.4261875,Pancreas +CVCL_3004,KP-2,24821094,Ibrutinib,0.45134375,Pancreas +CVCL_3004,KP-2,135398738,Dacarbazine,0.4615625,Pancreas +CVCL_3004,KP-2,3062316,Dasatinib,0.30406875,Pancreas +CVCL_3004,KP-2,36314,Paclitaxel,0.286115625,Pancreas +CVCL_3004,KP-2,44137675,AZD6482,0.4450625,Pancreas +CVCL_3004,KP-2,6450551,Axitinib,0.440375,Pancreas +CVCL_3004,KP-2,9926054,BMS-345541,0.3966875,Pancreas +CVCL_3004,KP-2,9933475,Cediranib,0.399875,Pancreas +CVCL_3116,OVISE,11152667,AZD7762,0.3745,Ovary +CVCL_3116,OVISE,123631,Gefitinib,0.47271875,Ovary +CVCL_3116,OVISE,156422,Doramapimod,0.50875,Ovary +CVCL_3116,OVISE,216239,Sorafenib,0.46875,Ovary +CVCL_3116,OVISE,36314,Paclitaxel,0.44809375,Ovary +CVCL_3116,OVISE,44137675,AZD6482,0.43853125,Ovary +CVCL_3117,OVTOKO,11152667,AZD7762,0.27100625,Ovary +CVCL_3117,OVTOKO,123631,Gefitinib,0.3495,Ovary +CVCL_3117,OVTOKO,135398516,OSI-027,0.35421875,Ovary +CVCL_3117,OVTOKO,156422,Doramapimod,0.4431875,Ovary +CVCL_3117,OVTOKO,176870,Erlotinib,0.3889375,Ovary +CVCL_3117,OVTOKO,216239,Sorafenib,0.42428125,Ovary +CVCL_3117,OVTOKO,24771867,Alisertib,0.39428125,Ovary +CVCL_3117,OVTOKO,3062316,Dasatinib,0.258646875,Ovary +CVCL_3117,OVTOKO,36314,Paclitaxel,0.36428125,Ovary +CVCL_3117,OVTOKO,44137675,AZD6482,0.37209375,Ovary +CVCL_3117,OVTOKO,6450551,Axitinib,0.4488125,Ovary +CVCL_3117,OVTOKO,9926054,BMS-345541,0.4059375,Ovary +CVCL_4381,HuH-6,11152667,AZD7762,0.199721875,Liver +CVCL_4381,HuH-6,123631,Gefitinib,0.3764375,Liver +CVCL_4381,HuH-6,135398516,OSI-027,0.38409375,Liver +CVCL_4381,HuH-6,156422,Doramapimod,0.44078125,Liver +CVCL_4381,HuH-6,176870,Erlotinib,0.4055,Liver +CVCL_4381,HuH-6,216239,Sorafenib,0.3576875,Liver +CVCL_4381,HuH-6,24771867,Alisertib,0.41784375,Liver +CVCL_4381,HuH-6,135398738,Dacarbazine,0.46403125,Liver +CVCL_4381,HuH-6,3062316,Dasatinib,0.37671875,Liver +CVCL_4381,HuH-6,36314,Paclitaxel,0.46871875,Liver +CVCL_4381,HuH-6,44137675,AZD6482,0.424125,Liver +CVCL_4381,HuH-6,6450551,Axitinib,0.368875,Liver +CVCL_5031,SNU-175,123631,Gefitinib,0.311053125,Colon +CVCL_5031,SNU-175,216239,Sorafenib,0.45146875,Colon +CVCL_5031,SNU-175,24771867,Alisertib,0.261671875,Colon +CVCL_5031,SNU-175,135398738,Dacarbazine,0.34453125,Colon +CVCL_5031,SNU-175,36314,Paclitaxel,0.061471875,Colon +CVCL_5069,SNU-489,11152667,AZD7762,0.30200625,Brain +CVCL_5069,SNU-489,123631,Gefitinib,0.41675,Brain +CVCL_5069,SNU-489,135398516,OSI-027,0.35934375,Brain +CVCL_5069,SNU-489,156422,Doramapimod,0.4415625,Brain +CVCL_5069,SNU-489,176870,Erlotinib,0.43953125,Brain +CVCL_5069,SNU-489,216239,Sorafenib,0.44421875,Brain +CVCL_5069,SNU-489,24771867,Alisertib,0.4294375,Brain +CVCL_5069,SNU-489,135398738,Dacarbazine,0.45959375,Brain +CVCL_5069,SNU-489,3062316,Dasatinib,0.353125,Brain +CVCL_5069,SNU-489,36314,Paclitaxel,0.271675,Brain +CVCL_5069,SNU-489,44137675,AZD6482,0.396875,Brain +CVCL_5069,SNU-489,6450551,Axitinib,0.4096875,Brain +CVCL_5069,SNU-489,9926054,BMS-345541,0.40525,Brain +CVCL_5098,SNU-81,11152667,AZD7762,0.242278125,Colon +CVCL_5098,SNU-81,135398516,OSI-027,0.34965625,Colon +CVCL_5098,SNU-81,24771867,Alisertib,0.2179625,Colon +CVCL_5098,SNU-81,3062316,Dasatinib,0.3900625,Colon +CVCL_5098,SNU-81,36314,Paclitaxel,0.098003125,Colon +CVCL_5098,SNU-81,44137675,AZD6482,0.3396875,Colon +CVCL_A351,HCC1588,11152667,AZD7762,0.26530625,Lung +CVCL_A351,HCC1588,123631,Gefitinib,0.359375,Lung +CVCL_A351,HCC1588,135398516,OSI-027,0.37796875,Lung +CVCL_A351,HCC1588,156422,Doramapimod,0.44934375,Lung +CVCL_A351,HCC1588,176870,Erlotinib,0.42515625,Lung +CVCL_A351,HCC1588,216239,Sorafenib,0.38278125,Lung +CVCL_A351,HCC1588,24771867,Alisertib,0.3325,Lung +CVCL_A351,HCC1588,135398738,Dacarbazine,0.41234375,Lung +CVCL_A351,HCC1588,3062316,Dasatinib,0.3771875,Lung +CVCL_A351,HCC1588,36314,Paclitaxel,0.2039125,Lung +CVCL_A351,HCC1588,44137675,AZD6482,0.4386875,Lung +CVCL_A351,HCC1588,6450551,Axitinib,0.3951875,Lung +CVCL_A351,HCC1588,9926054,BMS-345541,0.36625,Lung +CVCL_A352,HCC2108,11152667,AZD7762,0.3150625,Lung +CVCL_A352,HCC2108,123631,Gefitinib,0.39234375,Lung +CVCL_A352,HCC2108,135398516,OSI-027,0.37009375,Lung +CVCL_A352,HCC2108,156422,Doramapimod,0.454125,Lung +CVCL_A352,HCC2108,176870,Erlotinib,0.4154375,Lung +CVCL_A352,HCC2108,216239,Sorafenib,0.3945625,Lung +CVCL_A352,HCC2108,24771867,Alisertib,0.368375,Lung +CVCL_A352,HCC2108,135398738,Dacarbazine,0.37475,Lung +CVCL_A352,HCC2108,3062316,Dasatinib,0.3399375,Lung +CVCL_A352,HCC2108,36314,Paclitaxel,0.291496875,Lung +CVCL_A352,HCC2108,44137675,AZD6482,0.42503125,Lung +CVCL_A352,HCC2108,6450551,Axitinib,0.4114375,Lung +CVCL_A352,HCC2108,9926054,BMS-345541,0.40125,Lung +CVCL_L083,YD-38,11152667,AZD7762,0.250634375,Head And Neck +CVCL_L083,YD-38,123631,Gefitinib,0.22388125,Head And Neck +CVCL_L083,YD-38,135398516,OSI-027,0.36146875,Head And Neck +CVCL_L083,YD-38,156422,Doramapimod,0.45009375,Head And Neck +CVCL_L083,YD-38,176870,Erlotinib,0.27523125,Head And Neck +CVCL_L083,YD-38,216239,Sorafenib,0.410375,Head And Neck +CVCL_L083,YD-38,24771867,Alisertib,0.38996875,Head And Neck +CVCL_L083,YD-38,135398738,Dacarbazine,0.42315625,Head And Neck +CVCL_L083,YD-38,3062316,Dasatinib,0.222415625,Head And Neck +CVCL_L083,YD-38,44137675,AZD6482,0.38759375,Head And Neck +CVCL_L083,YD-38,6450551,Axitinib,0.45703125,Head And Neck +CVCL_L083,YD-38,9926054,BMS-345541,0.37446875,Head And Neck +CVCL_3172,SUIT-2,11152667,AZD7762,0.3379421875,Pancreas +CVCL_3172,SUIT-2,11152667,AZD7762,0.3379421875,Pancreas +CVCL_3172,SUIT-2,123631,Gefitinib,0.408734375,Pancreas +CVCL_3172,SUIT-2,123631,Gefitinib,0.408734375,Pancreas +CVCL_3172,SUIT-2,135398516,OSI-027,0.40765625,Pancreas +CVCL_3172,SUIT-2,135398516,OSI-027,0.40765625,Pancreas +CVCL_3172,SUIT-2,156422,Doramapimod,0.4494375,Pancreas +CVCL_3172,SUIT-2,156422,Doramapimod,0.4494375,Pancreas +CVCL_3172,SUIT-2,176870,Erlotinib,0.4111875,Pancreas +CVCL_3172,SUIT-2,176870,Erlotinib,0.4111875,Pancreas +CVCL_3172,SUIT-2,216239,Sorafenib,0.441,Pancreas +CVCL_3172,SUIT-2,216239,Sorafenib,0.441,Pancreas +CVCL_3172,SUIT-2,24771867,Alisertib,0.480171875,Pancreas +CVCL_3172,SUIT-2,24771867,Alisertib,0.480171875,Pancreas +CVCL_3172,SUIT-2,135398738,Dacarbazine,0.51853125,Pancreas +CVCL_3172,SUIT-2,135398738,Dacarbazine,0.51853125,Pancreas +CVCL_3172,SUIT-2,3062316,Dasatinib,0.377765625,Pancreas +CVCL_3172,SUIT-2,3062316,Dasatinib,0.377765625,Pancreas +CVCL_3172,SUIT-2,36314,Paclitaxel,0.412890625,Pancreas +CVCL_3172,SUIT-2,36314,Paclitaxel,0.412890625,Pancreas +CVCL_3172,SUIT-2,44137675,AZD6482,0.478328125,Pancreas +CVCL_3172,SUIT-2,44137675,AZD6482,0.478328125,Pancreas +CVCL_3172,SUIT-2,6450551,Axitinib,0.451,Pancreas +CVCL_3172,SUIT-2,6450551,Axitinib,0.451,Pancreas +CVCL_3172,SUIT-2,9926054,BMS-345541,0.4565,Pancreas +CVCL_3172,SUIT-2,9926054,BMS-345541,0.4565,Pancreas +CVCL_0029,EFO-21,444795,Tretinoin,0.508625,Ovary +CVCL_1082,BEN,444795,Tretinoin,0.52690625,Lung +CVCL_1187,EC-GI-10,444795,Tretinoin,0.4345,Esophagus +CVCL_1379,LNCaP clone FGC,444795,Tretinoin,0.4518125,Prostate +CVCL_1415,MKN1,36314,Paclitaxel,0.26805625,Stomach +CVCL_1454,NCI-H1092,444795,Tretinoin,0.45346875,Lung +CVCL_1539,NCI-H2196,444795,Tretinoin,0.45690625,Lung +CVCL_1626,OS-RC-2,444795,Tretinoin,0.47675,Kidney +CVCL_2063,HCC827,135398738,Dacarbazine,0.43128125,Lung +CVCL_2094,KPL-1,36314,Paclitaxel,0.4085,Breast +CVCL_1344,KU-19-19,135398738,Dacarbazine,0.49809375,Bladder +CVCL_1626,OS-RC-2,135398738,Dacarbazine,0.4513125,Kidney +CVCL_3117,OVTOKO,135398738,Dacarbazine,0.43484375,Ovary +CVCL_1415,MKN1,11152667,AZD7762,0.273365625,Stomach +CVCL_2094,KPL-1,11152667,AZD7762,,Breast +CVCL_0620,MDA-MB-361,123631,Gefitinib,0.35115625,Breast +CVCL_0620,MDA-MB-361,24821094,Ibrutinib,0.38609375,Breast +CVCL_0620,MDA-MB-361,135398738,Dacarbazine,0.46540625,Breast +CVCL_0620,MDA-MB-361,5494449,Tozasertib,0.415625,Breast +CVCL_0012,LP-1,2733526,Tamoxifen,0.43828125,Blood +CVCL_0029,EFO-21,2733526,Tamoxifen,0.460875,Ovary +CVCL_0067,Namalwa,2733526,Tamoxifen,0.4429375,Lymph +CVCL_0080,A-673,2733526,Tamoxifen,0.45103125,Bone +CVCL_0099,SNU-1,2733526,Tamoxifen,0.42278125,Stomach +CVCL_0134,A2780,2733526,Tamoxifen,0.3899375,Ovary +CVCL_0178,BT-20,2733526,Tamoxifen,0.44725,Breast +CVCL_0379,Ku812,2733526,Tamoxifen,0.4078125,Blood +CVCL_0428,MIA PaCa-2,2733526,Tamoxifen,0.4506875,Pancreas +CVCL_0533,SK-UT-1,2733526,Tamoxifen,0.4525625,Soft Tissue +CVCL_0547,SW620,2733526,Tamoxifen,0.42884375,Colon +CVCL_0599,SK-MEL-24,2733526,Tamoxifen,0.41746875,Skin +CVCL_0600,SK-MEL-31,2733526,Tamoxifen,0.47128125,Skin +CVCL_0620,MDA-MB-361,2733526,Tamoxifen,0.38753125,Breast +CVCL_0629,SK-LU-1,2733526,Tamoxifen,0.46334375,Lung +CVCL_1045,22Rv1,2733526,Tamoxifen,0.42425,Prostate +CVCL_1082,BEN,2733526,Tamoxifen,0.3825625,Lung +CVCL_1085,BHT-101,2733526,Tamoxifen,0.4990625,Thyroid +CVCL_1105,CAL-12T,2733526,Tamoxifen,0.32165625,Lung +CVCL_1167,Daoy,2733526,Tamoxifen,0.41421875,Brain +CVCL_1183,DU4475,2733526,Tamoxifen,0.42325,Breast +CVCL_1187,EC-GI-10,2733526,Tamoxifen,0.4325625,Esophagus +CVCL_1231,GI-1,2733526,Tamoxifen,0.52375,Brain +CVCL_1245,HCC1143,2733526,Tamoxifen,0.42628125,Breast +CVCL_1254,HCC1500,2733526,Tamoxifen,0.4393125,Breast +CVCL_1255,HCC1569,2733526,Tamoxifen,0.383,Breast +CVCL_1287,HSC-2,2733526,Tamoxifen,0.45325,Head And Neck +CVCL_1327,KE-37,2733526,Tamoxifen,0.39959375,Blood +CVCL_1335,KNS-62,2733526,Tamoxifen,0.41546875,Lung +CVCL_1344,KU-19-19,2733526,Tamoxifen,0.4088125,Bladder +CVCL_1345,Kuramochi,2733526,Tamoxifen,0.459375,Ovary +CVCL_1352,KYSE-410,2733526,Tamoxifen,0.39415625,Esophagus +CVCL_1379,LNCaP clone FGC,2733526,Tamoxifen,0.453125,Prostate +CVCL_1385,LS411N,2733526,Tamoxifen,0.46875,Colon +CVCL_1402,Mel Ho,2733526,Tamoxifen,0.461875,Skin +CVCL_1411,MHH-ES-1,2733526,Tamoxifen,0.4561875,Bone +CVCL_1415,MKN1,2733526,Tamoxifen,0.4135625,Stomach +CVCL_1454,NCI-H1092,2733526,Tamoxifen,0.44890625,Lung +CVCL_1455,NCI-H1105,2733526,Tamoxifen,,Lung +CVCL_1456,NCI-H1155,2733526,Tamoxifen,0.39565625,Lung +CVCL_1464,NCI-H1355,2733526,Tamoxifen,0.39196875,Lung +CVCL_1479,NCI-H1581,2733526,Tamoxifen,0.37815625,Lung +CVCL_1515,NCI-H2023,2733526,Tamoxifen,0.460125,Lung +CVCL_1529,NCI-H211,2733526,Tamoxifen,0.374,Lung +CVCL_1539,NCI-H2196,2733526,Tamoxifen,0.45965625,Lung +CVCL_1559,NCI-H358,2733526,Tamoxifen,0.39290625,Lung +CVCL_1569,NCI-H526,2733526,Tamoxifen,0.477,Lung +CVCL_1624,ONS-76,2733526,Tamoxifen,0.46396875,Brain +CVCL_1626,OS-RC-2,2733526,Tamoxifen,0.45678125,Kidney +CVCL_1633,Panc 02.03,2733526,Tamoxifen,0.477375,Pancreas +CVCL_1649,RD,2733526,Tamoxifen,0.44559375,Muscle +CVCL_1651,RERF-LC-Ad1,2733526,Tamoxifen,0.50090625,Lung +CVCL_1679,SBC-5,2733526,Tamoxifen,0.416875,Lung +CVCL_1682,SCC-25,2733526,Tamoxifen,0.41725,Head And Neck +CVCL_1690,SF295,2733526,Tamoxifen,0.45271875,Brain +CVCL_1700,SK-N-AS,2733526,Tamoxifen,0.450125,Nervous System +CVCL_1754,TE 441.T,2733526,Tamoxifen,0.442,Muscle +CVCL_1760,TE-10,2733526,Tamoxifen,0.46875,Esophagus +CVCL_1767,TE-9,2733526,Tamoxifen,0.45084375,Esophagus +CVCL_1774,TT,2733526,Tamoxifen,0.3421875,Esophagus +CVCL_1783,UM-UC-3,2733526,Tamoxifen,0.4558125,Bladder +CVCL_1798,42-MG-BA,2733526,Tamoxifen,0.39034375,Brain +CVCL_1818,Granta-519,2733526,Tamoxifen,0.4610625,Lymph +CVCL_1847,PaTu 8988t,2733526,Tamoxifen,0.4795,Pancreas +CVCL_2063,HCC827,2733526,Tamoxifen,0.4611875,Lung +CVCL_2094,KPL-1,2733526,Tamoxifen,0.40575,Breast +CVCL_2209,SUP-M2,2733526,Tamoxifen,0.4395625,Lymph +CVCL_2891,EBC-1,2733526,Tamoxifen,0.4783125,Lung +CVCL_3004,KP-2,2733526,Tamoxifen,0.46075,Pancreas +CVCL_3116,OVISE,2733526,Tamoxifen,0.4543125,Ovary +CVCL_3117,OVTOKO,2733526,Tamoxifen,0.47640625,Ovary +CVCL_4381,HuH-6,2733526,Tamoxifen,0.37484375,Liver +CVCL_5069,SNU-489,2733526,Tamoxifen,0.4873125,Brain +CVCL_A351,HCC1588,2733526,Tamoxifen,0.3176875,Lung +CVCL_A352,HCC2108,2733526,Tamoxifen,0.45421875,Lung +CVCL_L083,YD-38,2733526,Tamoxifen,0.49653125,Head And Neck +CVCL_3172,SUIT-2,2733526,Tamoxifen,0.474515625,Pancreas +CVCL_3172,SUIT-2,2733526,Tamoxifen,0.474515625,Pancreas +CVCL_0012,LP-1,444795,Tretinoin,0.4069375,Blood +CVCL_0067,Namalwa,444795,Tretinoin,0.39078125,Lymph +CVCL_0080,A-673,444795,Tretinoin,0.45365625,Bone +CVCL_0099,SNU-1,444795,Tretinoin,0.444,Stomach +CVCL_0134,A2780,444795,Tretinoin,0.3555,Ovary +CVCL_0178,BT-20,444795,Tretinoin,0.44328125,Breast +CVCL_0379,Ku812,444795,Tretinoin,0.3753125,Blood +CVCL_0428,MIA PaCa-2,444795,Tretinoin,0.467875,Pancreas +CVCL_0533,SK-UT-1,444795,Tretinoin,0.45221875,Soft Tissue +CVCL_0547,SW620,444795,Tretinoin,0.45896875,Colon +CVCL_0599,SK-MEL-24,444795,Tretinoin,0.48125,Skin +CVCL_0600,SK-MEL-31,444795,Tretinoin,0.4645,Skin +CVCL_0620,MDA-MB-361,444795,Tretinoin,0.40365625,Breast +CVCL_0629,SK-LU-1,444795,Tretinoin,0.46434375,Lung +CVCL_1045,22Rv1,444795,Tretinoin,0.426625,Prostate +CVCL_1085,BHT-101,444795,Tretinoin,0.5049375,Thyroid +CVCL_1105,CAL-12T,444795,Tretinoin,0.502875,Lung +CVCL_1133,COLO 741,444795,Tretinoin,0.433375,Skin +CVCL_1167,Daoy,444795,Tretinoin,0.44375,Brain +CVCL_1183,DU4475,444795,Tretinoin,0.438875,Breast +CVCL_1231,GI-1,444795,Tretinoin,0.46875,Brain +CVCL_1245,HCC1143,444795,Tretinoin,0.44615625,Breast +CVCL_1254,HCC1500,444795,Tretinoin,0.35171875,Breast +CVCL_1255,HCC1569,444795,Tretinoin,0.3999375,Breast +CVCL_1287,HSC-2,444795,Tretinoin,0.442375,Head And Neck +CVCL_1327,KE-37,444795,Tretinoin,0.42346875,Blood +CVCL_1335,KNS-62,444795,Tretinoin,0.44015625,Lung +CVCL_1344,KU-19-19,444795,Tretinoin,0.46875,Bladder +CVCL_1345,Kuramochi,444795,Tretinoin,0.46875,Ovary +CVCL_1352,KYSE-410,444795,Tretinoin,0.415375,Esophagus +CVCL_1385,LS411N,444795,Tretinoin,0.52825,Colon +CVCL_1402,Mel Ho,444795,Tretinoin,0.368125,Skin +CVCL_1411,MHH-ES-1,444795,Tretinoin,0.41840625,Bone +CVCL_1415,MKN1,444795,Tretinoin,0.43828125,Stomach +CVCL_1455,NCI-H1105,444795,Tretinoin,0.4335625,Lung +CVCL_1456,NCI-H1155,444795,Tretinoin,0.43365625,Lung +CVCL_1464,NCI-H1355,444795,Tretinoin,0.41440625,Lung +CVCL_1479,NCI-H1581,444795,Tretinoin,0.4324375,Lung +CVCL_1515,NCI-H2023,444795,Tretinoin,0.44621875,Lung +CVCL_1529,NCI-H211,444795,Tretinoin,0.289896875,Lung +CVCL_1559,NCI-H358,444795,Tretinoin,0.45765625,Lung +CVCL_1569,NCI-H526,444795,Tretinoin,0.43525,Lung +CVCL_1624,ONS-76,444795,Tretinoin,0.43325,Brain +CVCL_1633,Panc 02.03,444795,Tretinoin,0.4571875,Pancreas +CVCL_1649,RD,444795,Tretinoin,0.42728125,Muscle +CVCL_1651,RERF-LC-Ad1,444795,Tretinoin,0.46184375,Lung +CVCL_1679,SBC-5,444795,Tretinoin,0.44996875,Lung +CVCL_1690,SF295,444795,Tretinoin,0.501375,Brain +CVCL_1700,SK-N-AS,444795,Tretinoin,0.4435625,Nervous System +CVCL_1754,TE 441.T,444795,Tretinoin,0.4451875,Muscle +CVCL_1760,TE-10,444795,Tretinoin,0.4651875,Esophagus +CVCL_1767,TE-9,444795,Tretinoin,0.4420625,Esophagus +CVCL_1774,TT,444795,Tretinoin,0.447375,Esophagus +CVCL_1783,UM-UC-3,444795,Tretinoin,0.45321875,Bladder +CVCL_1798,42-MG-BA,444795,Tretinoin,0.46496875,Brain +CVCL_1818,Granta-519,444795,Tretinoin,0.351125,Lymph +CVCL_1847,PaTu 8988t,444795,Tretinoin,0.444125,Pancreas +CVCL_2063,HCC827,444795,Tretinoin,0.42096875,Lung +CVCL_2094,KPL-1,444795,Tretinoin,0.443375,Breast +CVCL_2209,SUP-M2,444795,Tretinoin,0.390625,Lymph +CVCL_2891,EBC-1,444795,Tretinoin,0.45653125,Lung +CVCL_3004,KP-2,444795,Tretinoin,0.4686875,Pancreas +CVCL_3116,OVISE,444795,Tretinoin,0.4695625,Ovary +CVCL_3117,OVTOKO,444795,Tretinoin,0.4076875,Ovary +CVCL_4381,HuH-6,444795,Tretinoin,0.3978125,Liver +CVCL_5069,SNU-489,444795,Tretinoin,0.46875,Brain +CVCL_A351,HCC1588,444795,Tretinoin,0.51840625,Lung +CVCL_A352,HCC2108,444795,Tretinoin,0.4424375,Lung +CVCL_L083,YD-38,444795,Tretinoin,0.4945625,Head And Neck +CVCL_3172,SUIT-2,444795,Tretinoin,0.4561406249999999,Pancreas +CVCL_3172,SUIT-2,444795,Tretinoin,0.4561406249999999,Pancreas +CVCL_1545,NCI-H2286,9927531,BIBR-1532,0.46025,Lung +CVCL_1619,OCI-AML-2,9927531,BIBR-1532,0.43840625,Blood +CVCL_1767,TE-9,9927531,BIBR-1532,0.46621875,Esophagus +CVCL_0099,SNU-1,9927531,BIBR-1532,0.39359375,Stomach +CVCL_0012,LP-1,9927531,BIBR-1532,0.4278125,Blood +CVCL_0029,EFO-21,9927531,BIBR-1532,0.45240625,Ovary +CVCL_0067,Namalwa,9927531,BIBR-1532,0.3778125,Lymph +CVCL_0080,A-673,9927531,BIBR-1532,0.40171875,Bone +CVCL_0134,A2780,9927531,BIBR-1532,0.37525,Ovary +CVCL_0178,BT-20,9927531,BIBR-1532,0.4051875,Breast +CVCL_0379,Ku812,9927531,BIBR-1532,0.41284375,Blood +CVCL_0428,MIA PaCa-2,9927531,BIBR-1532,0.41971875,Pancreas +CVCL_0533,SK-UT-1,9927531,BIBR-1532,0.4275625,Soft Tissue +CVCL_0547,SW620,9927531,BIBR-1532,0.475125,Colon +CVCL_0599,SK-MEL-24,9927531,BIBR-1532,0.4458125,Skin +CVCL_0600,SK-MEL-31,9927531,BIBR-1532,0.4643125,Skin +CVCL_0620,MDA-MB-361,9927531,BIBR-1532,0.4418125,Breast +CVCL_0629,SK-LU-1,9927531,BIBR-1532,0.4559375,Lung +CVCL_1045,22Rv1,9927531,BIBR-1532,0.394125,Prostate +CVCL_1082,BEN,9927531,BIBR-1532,0.46525,Lung +CVCL_1085,BHT-101,9927531,BIBR-1532,0.46875,Thyroid +CVCL_1105,CAL-12T,9927531,BIBR-1532,0.418,Lung +CVCL_1167,Daoy,9927531,BIBR-1532,0.40490625,Brain +CVCL_1183,DU4475,9927531,BIBR-1532,0.3888125,Breast +CVCL_1187,EC-GI-10,9927531,BIBR-1532,0.41665625,Esophagus +CVCL_1231,GI-1,9927531,BIBR-1532,0.45778125,Brain +CVCL_1245,HCC1143,9927531,BIBR-1532,0.42690625,Breast +CVCL_1254,HCC1500,9927531,BIBR-1532,0.43165625,Breast +CVCL_1287,HSC-2,9927531,BIBR-1532,0.39765625,Head And Neck +CVCL_1324,Karpas-299,9927531,BIBR-1532,0.44446875,Lymph +CVCL_1335,KNS-62,9927531,BIBR-1532,0.453125,Lung +CVCL_1344,KU-19-19,9927531,BIBR-1532,0.48078125,Bladder +CVCL_1345,Kuramochi,9927531,BIBR-1532,0.42690625,Ovary +CVCL_1352,KYSE-410,9927531,BIBR-1532,0.43453125,Esophagus +CVCL_1379,LNCaP clone FGC,9927531,BIBR-1532,0.41784375,Prostate +CVCL_1385,LS411N,9927531,BIBR-1532,0.44403125,Colon +CVCL_1402,Mel Ho,9927531,BIBR-1532,0.42553125,Skin +CVCL_1411,MHH-ES-1,9927531,BIBR-1532,0.4056875,Bone +CVCL_1415,MKN1,9927531,BIBR-1532,0.42671875,Stomach +CVCL_1454,NCI-H1092,9927531,BIBR-1532,0.4031875,Lung +CVCL_1455,NCI-H1105,9927531,BIBR-1532,0.43034375,Lung +CVCL_1456,NCI-H1155,9927531,BIBR-1532,0.387375,Lung +CVCL_1464,NCI-H1355,9927531,BIBR-1532,0.40559375,Lung +CVCL_1479,NCI-H1581,9927531,BIBR-1532,0.40796875,Lung +CVCL_1515,NCI-H2023,9927531,BIBR-1532,0.4484375,Lung +CVCL_1525,NCI-H209,9927531,BIBR-1532,0.40009375,Lung +CVCL_1529,NCI-H211,9927531,BIBR-1532,0.3813125,Lung +CVCL_1536,NCI-H2171,9927531,BIBR-1532,0.36053125,Lung +CVCL_1539,NCI-H2196,9927531,BIBR-1532,0.40109375,Lung +CVCL_1559,NCI-H358,9927531,BIBR-1532,0.41040625,Lung +CVCL_1565,NCI-H510A,9927531,BIBR-1532,0.41565625,Lung +CVCL_1569,NCI-H526,9927531,BIBR-1532,0.45109375,Lung +CVCL_1624,ONS-76,9927531,BIBR-1532,0.42671875,Brain +CVCL_1626,OS-RC-2,9927531,BIBR-1532,0.44440625,Kidney +CVCL_1633,Panc 02.03,9927531,BIBR-1532,0.45596875,Pancreas +CVCL_1649,RD,9927531,BIBR-1532,0.437875,Muscle +CVCL_1651,RERF-LC-Ad1,9927531,BIBR-1532,0.45609375,Lung +CVCL_1679,SBC-5,9927531,BIBR-1532,0.41903125,Lung +CVCL_1682,SCC-25,9927531,BIBR-1532,0.43921875,Head And Neck +CVCL_1690,SF295,9927531,BIBR-1532,0.4365,Brain +CVCL_1700,SK-N-AS,9927531,BIBR-1532,0.4290625,Nervous System +CVCL_1754,TE 441.T,9927531,BIBR-1532,0.451625,Muscle +CVCL_1760,TE-10,9927531,BIBR-1532,0.43665625,Esophagus +CVCL_1774,TT,9927531,BIBR-1532,0.4111875,Esophagus +CVCL_1783,UM-UC-3,9927531,BIBR-1532,0.41559375,Bladder +CVCL_1798,42-MG-BA,9927531,BIBR-1532,0.42953125,Brain +CVCL_1818,Granta-519,9927531,BIBR-1532,0.4235,Lymph +CVCL_1847,PaTu 8988t,9927531,BIBR-1532,0.435875,Pancreas +CVCL_2063,HCC827,9927531,BIBR-1532,0.43265625,Lung +CVCL_2094,KPL-1,9927531,BIBR-1532,0.413875,Breast +CVCL_2209,SUP-M2,9927531,BIBR-1532,0.33040625,Lymph +CVCL_2891,EBC-1,9927531,BIBR-1532,0.49234375,Lung +CVCL_3004,KP-2,9927531,BIBR-1532,0.43278125,Pancreas +CVCL_3116,OVISE,9927531,BIBR-1532,0.46875,Ovary +CVCL_3117,OVTOKO,9927531,BIBR-1532,0.43346875,Ovary +CVCL_5069,SNU-489,9927531,BIBR-1532,0.45946875,Brain +CVCL_A351,HCC1588,9927531,BIBR-1532,0.41634375,Lung +CVCL_A352,HCC2108,9927531,BIBR-1532,0.442625,Lung +CVCL_L083,YD-38,9927531,BIBR-1532,0.44953125,Head And Neck +CVCL_3172,SUIT-2,9927531,BIBR-1532,0.4344375,Pancreas +CVCL_3172,SUIT-2,9927531,BIBR-1532,0.4344375,Pancreas +CVCL_4381,HuH-6,9927531,BIBR-1532,0.4549375,Liver diff --git a/docs/_static/img/DrugResponseEvalLogo.svg b/docs/_static/img/DrugResponseEvalLogo.svg new file mode 100644 index 00000000..a49fd3b5 --- /dev/null +++ b/docs/_static/img/DrugResponseEvalLogo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/_static/img/leaderboard_dark.png b/docs/_static/img/leaderboard_dark.png new file mode 100644 index 00000000..42716c63 Binary files /dev/null and b/docs/_static/img/leaderboard_dark.png differ diff --git a/docs/_static/img/leaderboard_light.png b/docs/_static/img/leaderboard_light.png new file mode 100644 index 00000000..3330824c Binary files /dev/null and b/docs/_static/img/leaderboard_light.png differ diff --git a/docs/_static/img/overview.png b/docs/_static/img/overview.png index f6a738d9..05ea9399 100644 Binary files a/docs/_static/img/overview.png and b/docs/_static/img/overview.png differ diff --git a/docs/_static/memes/ci_prettier.png b/docs/_static/memes/ci_prettier.png new file mode 100644 index 00000000..a48c718c Binary files /dev/null and b/docs/_static/memes/ci_prettier.png differ diff --git a/docs/_static/memes/isthisdrugresponse.jpeg b/docs/_static/memes/isthisdrugresponse.jpeg new file mode 100644 index 00000000..5dc71552 Binary files /dev/null and b/docs/_static/memes/isthisdrugresponse.jpeg differ diff --git a/docs/conf.py b/docs/conf.py index 07958bdb..8e21b68a 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -1,5 +1,6 @@ #!/usr/bin/env python """Configuration file for the Sphinx documentation builder.""" + # mypy: ignore-errors # drevalpy documentation build configuration file # @@ -56,9 +57,9 @@ # the built documents. # # The short X.Y version. -version = "1.3.1" +version = "1.4.2" # The full version, including alpha/beta/rc tags. -release = "1.3.1" +release = "1.4.2" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/docs/contributing.rst b/docs/contributing.rst index d14ba6c9..424b7a6f 100644 --- a/docs/contributing.rst +++ b/docs/contributing.rst @@ -32,20 +32,21 @@ How to set up your development environment ------------------------------------------ 1. Fork the repository on GitHub. -2. Make a new conda environment with Python 3.11 or 3.12. +2. Make a new conda environment with Python 3.11, 3.12, or 3.13. 3. ``pip install poetry`` : we use poetry to manage dependencies -4. ``poetry install`` : this will install all dependencies -5. Test whether the installation was successful by running the following command: +4. ``pip install poetry-plugin-export`` +5. ``poetry install`` : this will install all dependencies +6. Test whether the installation was successful by running the following command: .. code:: console - $ python run_suite.py --run_id my_first_run --models NaiveDrugMeanPredictor ElasticNet --dataset TOYv1 --test_mode LCO + $ drevalpy --run_id my_first_run --models NaiveDrugMeanPredictor ElasticNet --dataset TOYv1 --test_mode LCO 6. Visualize the results by running the following command: .. code:: console - $ python create_report.py --run_id my_first_run --dataset TOYv1 + $ drevalpy-report --run_id my_first_run --dataset TOYv1 How to test the project ----------------------- diff --git a/docs/drevalpy.models.DrugGNN.rst b/docs/drevalpy.models.DrugGNN.rst new file mode 100644 index 00000000..7036061f --- /dev/null +++ b/docs/drevalpy.models.DrugGNN.rst @@ -0,0 +1,9 @@ +DrugGNN +======== + +DrugGNN Model +--------------- +.. automodule:: drevalpy.models.DrugGNN.drug_gnn + :members: + :undoc-members: + :show-inheritance: \ No newline at end of file diff --git a/docs/drevalpy.models.PharmaFormer.rst b/docs/drevalpy.models.PharmaFormer.rst new file mode 100644 index 00000000..2adf093f --- /dev/null +++ b/docs/drevalpy.models.PharmaFormer.rst @@ -0,0 +1,18 @@ +PharmaFormer +============================= + +PharmaFormer Model +---------------------------------- + +.. automodule:: drevalpy.models.PharmaFormer.pharmaformer + :members: + :undoc-members: + :show-inheritance: + +Model utils +---------------------------------- + +.. automodule:: drevalpy.models.PharmaFormer.model_utils + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/drevalpy.models.SimpleNeuralNetwork.rst b/docs/drevalpy.models.SimpleNeuralNetwork.rst index 31ca4007..b97d1457 100644 --- a/docs/drevalpy.models.SimpleNeuralNetwork.rst +++ b/docs/drevalpy.models.SimpleNeuralNetwork.rst @@ -1,7 +1,7 @@ Simple Neural Network =========================================== -Simple Neural Network Model +Simple Neural Network Model and ChemBERTaNeuralNetwork ------------------------------------------------------------------ .. automodule:: drevalpy.models.SimpleNeuralNetwork.simple_neural_network diff --git a/docs/drevalpy.models.baselines.rst b/docs/drevalpy.models.baselines.rst index b22bccbf..0754571b 100644 --- a/docs/drevalpy.models.baselines.rst +++ b/docs/drevalpy.models.baselines.rst @@ -17,6 +17,14 @@ Sklearn Models :undoc-members: :show-inheritance: +Single-Drug Elastic Net +----------------------------------------------------------- + +.. automodule:: drevalpy.models.baselines.singledrug_elastic_net + :members: + :undoc-members: + :show-inheritance: + Single-Drug Random Forest ----------------------------------------------------------- diff --git a/docs/drevalpy.models.rst b/docs/drevalpy.models.rst index 55a21d41..7fca1fa2 100644 --- a/docs/drevalpy.models.rst +++ b/docs/drevalpy.models.rst @@ -26,6 +26,7 @@ Implemented models drevalpy.models.DIPK drevalpy.models.MOLIR + drevalpy.models.PharmaFormer drevalpy.models.SRMF drevalpy.models.SimpleNeuralNetwork drevalpy.models.SuperFELTR diff --git a/docs/drevalpy.visualization.rst b/docs/drevalpy.visualization.rst index dabbeb14..e609099a 100644 --- a/docs/drevalpy.visualization.rst +++ b/docs/drevalpy.visualization.rst @@ -9,10 +9,10 @@ Outplot :undoc-members: :show-inheritance: -Correlation comparison scatter plot +Comparison scatter plot ------------------------------------------------- -.. automodule:: drevalpy.visualization.corr_comp_scatter +.. automodule:: drevalpy.visualization.comp_scatter :members: :undoc-members: :show-inheritance: @@ -25,10 +25,10 @@ Critical difference plot :undoc-members: :show-inheritance: -HTML tables +Cross study tables ------------------------------------------ -.. automodule:: drevalpy.visualization.html_tables +.. automodule:: drevalpy.visualization.cross_study_tables :members: :undoc-members: :show-inheritance: diff --git a/docs/installation.rst b/docs/installation.rst index df997ae4..b3f01128 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -9,7 +9,7 @@ If something goes wrong, feel free to open an issue on `GitHub =3.11 and <3.13. Best practice is to use a clean +DrEvalPy requires python >=3.11. Best practice is to use a clean (`mamba `_) or conda environment (`Miniconda `_). Mamba is automatically installed when downloading (`Miniforge `_) and is generally faster and better at @@ -18,7 +18,7 @@ Follow the installation guide for your operating system, then create a new envir .. code-block:: bash - mamba create -y -n drevalpy python==3.12 + mamba create -y -n drevalpy python=3.13 DrEvalPy is listed on the Python Package Index (PyPI) and can be installed with pip. Activate your conda environment (or skip this if you use a system wide python installation) @@ -26,7 +26,7 @@ and install the package using .. code-block:: bash - conda activate drevalpy + mamba activate drevalpy pip install drevalpy With venv @@ -55,26 +55,27 @@ Pull the image: .. code-block:: bash - docker pull ghcr.io/daisybio/drevalpy:main + docker pull ghcr.io/daisybio/drevalpy:latest Run the image: .. code-block:: bash - docker run -it ghcr.io/daisybio/drevalpy:main + docker run -it ghcr.io/daisybio/drevalpy:latest From Source ----------- To install DrEvalPy from source, clone the repository and install the package using Poetry -(ensure that Poetry is >=1.2.0 because otherwise, the group dependencies will not work, e.g., 2.0.1 works): +(ensure that Poetry is >=1.2.0 because otherwise, the group dependencies will not work, e.g., 2.1.3 works): .. code-block:: bash git clone https://github.com/daisybio/drevalpy.git cd drevalpy - mamba create -y -n drevalpy python==3.12 poetry==2.0.1 + mamba create -y -n drevalpy python==3.13 poetry==2.3.2 poetry --version + pip install poetry-plugin-export poetry install -Now, you can test the functionality by referring to the `Quickstart <./quickstart.html>`_ documentation. +Now, you can test the functionality quickly via `drevalpy --help`. Or take a look at the `Quickstart <./quickstart.html>`_ documentation. diff --git a/docs/memes.rst b/docs/memes.rst index 08a443c4..70e02e1d 100644 --- a/docs/memes.rst +++ b/docs/memes.rst @@ -18,3 +18,14 @@ Some people have pointed out the phonetic similarity between DrEval and DrEvil. :width: 400 px :align: center +CI magic +------------------- +.. image:: _static/memes/ci_prettier.png + :width: 400 px + :align: center + +Garbage in, garbage out +------------------- +.. image:: _static/memes/isthisdrugresponse.jpeg + :width: 400 px + :align: center diff --git a/docs/news.rst b/docs/news.rst index 03e960bf..c6140ebd 100644 --- a/docs/news.rst +++ b/docs/news.rst @@ -4,6 +4,17 @@ News .. role:: date :class: date +📄 Our preprint is out! :date:`2025-05-29` +-------------------------------------------------------------- +Check out our preprint on `bioRxiv `_! + +.. note:: + + **From Hype to Health Check: Critical Evaluation of Drug Response Prediction Models with DrEval.** + Judith Bernett, Pascal Iversen, Mario Picciani, Mathias Wilhelm, Katharina Baum, Markus List. + *bioRxiv* 2025.05.26.655288; doi: https://doi.org/10.1101/2025.05.26.655288 + + 🚀 We have launched the DrEval Challenge 🚀 :date:`2024-11-26` -------------------------------------------------------------- diff --git a/docs/quickstart.rst b/docs/quickstart.rst index 7e9ccb9e..a703f8aa 100644 --- a/docs/quickstart.rst +++ b/docs/quickstart.rst @@ -3,36 +3,38 @@ Quickstart Make sure you have installed DrEvalPy and its dependencies (see `Installation <./installation.html>`_). -To make sure the pipeline runs, you can use the fast models NaiveDrugMeanPredictor and NaivePredictor on the TOYv1 (subset of CTRPv2) or TOYv2 (subset of GDSC2) -dataset with the LPO test mode. +To make sure the pipeline runs, you can use the fast models NaiveMeanEffectsPredictor and NaiveDrugMeanPredictor on the TOYv1 (subset of CTRPv2) or TOYv2 (subset of GDSC2) +dataset with the LCO test mode. .. code-block:: bash - python run_suite.py --run_id my_first_run --models NaiveDrugMeanPredictor --baselines NaivePredictor --dataset TOYv1 --test_mode LPO + drevalpy --run_id my_first_run --models NaiveTissueMeanPredictor NaiveDrugMeanPredictor --baselines NaiveMeanEffectsPredictor --dataset TOYv1 --test_mode LCO -This will train the two baseline models on a subset of gene expression features and drug fingerprint features to -predict IC50 values of the GDSC1 database. It will evaluate in "LPO" which is the leave-pairs-out splitting strategy -(leave random pairs of drugs and cell lines out for testing) using 5 fold cross validation. +This will train the three baseline models to predict LN_IC50 values of our Toy dataset which is a subset of CTRPv2. +It will evaluate in "LCO" which is the leave-cell-line-out splitting strategy +(leave random cell lines out for testing) using 7 fold cross validation. The results will be stored in .. code-block:: bash - results/my_first_run/LPO + results/my_first_run/TOYv1/LCO You can visualize them using .. code-block:: bash - python create_report.py --run_id my_first_run + drevalpy-report --run_id my_first_run --dataset TOYv1 +This creates an index.html file which you can open in your browser to see the results of your run. We recommend the use of our nextflow pipeline for computational demanding runs and for improved reproducibility. No knowledge of nextflow is required to run it. The nextflow pipeline is available on the `nf-core GitHub `_, the documentation can be found `here `_. +- Want to test if your own model outperforms the baselines? See `Run Your Model <./runyourmodel.html>`_. - Discuss usage, development and issues on `GitHub `_. - Check the `Contributor Guide <./contributing.html>`_ if you want to participate in developing. +- If you use drevalpy for your work, `please cite us <./reference.html>`_. .. - Check our `tutorial notebook `_, the `usage principles <./usage.html>`_ or the `API <./API.html>`_. - - Consider citing `DrEvalPy <...>`_ along with original `references <./reference.html>`_. \ No newline at end of file diff --git a/docs/reference.rst b/docs/reference.rst index 7fda2d3a..650e1808 100644 --- a/docs/reference.rst +++ b/docs/reference.rst @@ -1,4 +1,19 @@ How to cite =========== -If you want to cite DrEvalPy in your work, please use the following: \ No newline at end of file +If you want to cite DrEvalPy or nf-core/drugresponseeval in your work, please use the following: + +.. code-block:: bibtex + + @article{bernettiversen2025dreval, + title={From Hype to Health Check: Critical Evaluation of Drug Response Prediction Models with DrEval}, + author={Bernett, Judith and Iversen, Pascal and Picciani, Mario and Wilhelm, Mathias and Baum, Katharina and List, Markus}, + journal={bioRxiv}, + pages={2025--05}, + year={2025}, + publisher={Cold Spring Harbor Laboratory} + } + +.. note:: + + Bernett, J., Iversen, P., Picciani, M., Wilhelm, M., Baum, K., & List, M. (2025). **From Hype to Health Check: Critical Evaluation of Drug Response Prediction Models with DrEval.** *bioRxiv*, 2025-05. \ No newline at end of file diff --git a/docs/requirements.txt b/docs/requirements.txt index 6fcc644b..39bb54e8 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,4 +1,4 @@ -sphinx-autobuild==2024.10.3 ; python_version >= "3.11" and python_version < "3.13" -sphinx-autodoc-typehints==3.2.0 ; python_version >= "3.11" and python_version < "3.13" -sphinx-click==6.0.0 ; python_version >= "3.11" and python_version < "3.13" -sphinx-rtd-theme==3.0.2 ; python_version >= "3.11" and python_version < "3.13" +sphinx-autobuild==2025.8.25 ; python_version >= "3.11" and python_version <= "3.13" +sphinx-autodoc-typehints==3.5.2 ; python_version >= "3.11" and python_version <= "3.13" +sphinx-click==6.2.0 ; python_version >= "3.11" and python_version <= "3.13" +sphinx-rtd-theme==3.0.2 ; python_version >= "3.11" and python_version <= "3.13" diff --git a/docs/runyourmodel.rst b/docs/runyourmodel.rst index 7ff12172..a8ade247 100644 --- a/docs/runyourmodel.rst +++ b/docs/runyourmodel.rst @@ -2,28 +2,39 @@ Run your own model =================== DrEvalPy provides a standardized interface for running your own model. -First make a new folder for your model at ``drevalpy/models/your_model_name``. -Create ``drevalpy/models/your_model_name/your_model.py`` in which you need to define the Python class for your model. + +There are a few steps to follow so we can make sure the model evaluation is consistent and reproducible. +Feel free to contact us via GitHub if you experience any difficulties :-) + +First, make a new folder for your model at ``drevalpy/models/your_model_name``. +Create ``drevalpy/models/your_model_name/your_model.py``, in which you need to define the Python class for your model. This class should inherit from the :ref:`DRPModel ` base class. -DrEvalPy is agnostic to the specific modeling strategy you use. However, you need to define the input views, which represent different types of features that your model requires. +DrEvalPy is agnostic to the specific modeling strategy you use. However, you need to define the input views (a.k.a modalities), which represent different types of features that your model requires. In this example, the model uses "gene_expression" and "methylation" features as cell line views, and "fingerprints" as drug views. Additionally, you must define a unique model name to identify your model during evaluation. .. code-block:: Python from drevalpy.models.drp_model import DRPModel - from drevalpy.datasets.dataset import FeatureDataset - - import pandas as pd + from drevalpy.datasets.dataset import FeatureDataset, DrugResponseDataset + from drevalpy.datasets.utils import CELL_LINE_IDENTIFIER, DRUG_IDENTIFIER + from drevalpy.models.utils import ( + load_and_select_gene_features, + load_drug_fingerprint_features, + scale_gene_expression, + ) + from typing import Any + import numpy as np class YourModel(DRPModel): """A revolutionary new modeling strategy.""" - is_single_drug_model = True / False # TODO: set to true if your model is a single drug model + is_single_drug_model = True / False # TODO: set to true if your model is a single drug model (i.e., it needs to be trained for each drug separately) early_stopping = True / False # TODO: set to true if you want to use a part of the validation set for early stopping cell_line_views = ["gene_expression", "methylation"] drug_views = ["fingerprints"] + @classmethod def get_model_name(cls) -> str: """ Returns the name of the model. @@ -32,6 +43,21 @@ Additionally, you must define a unique model name to identify your model during Next let's implement the feature loading. You have to return a DrEvalPy FeatureDataset object which contains the features for the cell lines and drugs. If the features are different depending on the dataset, use the ``dataset_name`` parameter. +In this example, we load custom drug fingerprints and cell line gene expression and methylation features from CSV files. +The cell line ids of your gene expression and methylation csvs should match the ``CELL_LINE_IDENTIFIER`` ("cell_line_name"), +and the drug ids of your fingerprints csv should match the ``DRUG_IDENTIFIER`` ("pubchem_id"). +The model will use these identifiers to match the features with the drug response data. + +:download:`Example fingerprint file <_static/example_data/fingerprints_example.csv>`, :download:`Example gene expression file <_static/example_data/gex_example.csv>`. + +For our provided datasets, we have other loading methods implemented in the `drevalpy/models/utils.py` file, which you can also use: + +* ``def load_and_select_gene_features``: Loads a specified omic; enables selecting a specific gene list (e.g., landmark genes). +* ``def get_multiomics_feature_dataset``: Loads the specified omics (iteratively calls previous method). +* ``def load_drug_fingerprint_features``: Loads the provided drug fingerprints. +* ``def load_cl_ids_from_csv`` +* ``def load_drug_ids_from_csv`` +* ``load_tissues_from_csv`` .. code-block:: Python @@ -43,7 +69,12 @@ If the features are different depending on the dataset, use the ``dataset_name`` :param dataset_name: name of the dataset :returns: FeatureDataset containing the drug ids """ - feature_dataset = FeatureDataset.from_csv(f"{data_path}/{dataset_name}/fingerprints.csv") # make sure to adjust the path to your data + feature_dataset = FeatureDataset.from_csv( + path_to_csv=f"{data_path}/{dataset_name}/fingerprints.csv", + id_column=DRUG_IDENTIFIER, + view_name="fingerprints", + drop_columns=None + ) # make sure to adjust the path to your data. If you want to drop columns, specify them in a list. return feature_dataset @@ -57,12 +88,14 @@ If the features are different depending on the dataset, use the ``dataset_name`` :returns: FeatureDataset containing the cell line ids """ feature_dataset = FeatureDataset.from_csv(f"{data_path}/{dataset_name}_gene_expression.csv", - id_column="cell_line_ids", - view_name="gene_expression" + id_column=CELL_LINE_IDENTIFIER, + view_name="gene_expression", + drop_columns=['cellosaurus_id'] ) # make sure to adjust the path to your data methylation = FeatureDataset.from_csv(f"{data_path}/{dataset_name}_methylation.csv", - id_column="cell_line_ids", - view_name="gene_expression" + id_column=CELL_LINE_IDENTIFIER, + view_name="methylation", + drop_columns=['cellosaurus_id'] ) # make sure to adjust the path to your data feature_dataset.add_features(methylation) @@ -81,7 +114,7 @@ The hyperparameters which get tested are defined in the ``drevalpy/models/your_m Example: self.model = ElasticNet(alpha=hyperparameters["alpha"], l1_ratio=hyperparameters["l1_ratio"]) """ - predictor = YourPredictor(hyperparameters) # Initialize your Predictor, this could be a sklearn model, a neural network, etc. + self.predictor = YourPredictor(hyperparameters) # Initialize your Predictor, this could be a sklearn model, a neural network, etc. Sometimes, the model design is dependent on your training data input. In this case, you can also consider implementing build_model like: @@ -91,23 +124,22 @@ Sometimes, the model design is dependent on your training data input. In this ca self.hyperparameters = hyperparameters and then set the model design later in the train method when you have access to the training data. +(e.g., when you can access the feature dimensionalities) The train method should handle model training, and saving any necessary information (e.g., learned parameters). Here we use a simple predictor that just uses the concatenated features to predict the response. .. code-block:: Python - def train(self, output: DrugResponseDataset, cell_line_input: FeatureDataset, drug_input: FeatureDataset | None = None, output_earlystopping: DrugResponseDataset | None = None) -> None: + def train(self, output: DrugResponseDataset, cell_line_input: FeatureDataset, drug_input: FeatureDataset | None = None, output_earlystopping: DrugResponseDataset | None = None, model_checkpoint_dir: str | None = None) -> None: inputs = self.get_feature_matrices( - cell_line_ids=cell_line_ids, - drug_ids=drug_ids, + cell_line_ids=output.cell_line_ids, + drug_ids=output.drug_ids, cell_line_input=cell_line_input, drug_input=drug_input, ) - predictor.fit(**inputs, output.response) - - self.predictor = predictor # save your predictor for the prediction step + self.predictor.fit(**inputs, output.response) In case you want to set some parameters dependent on the training data, your train function might look like this: @@ -132,11 +164,37 @@ In case you want to set some parameters dependent on the training data, your tra drug_input=drug_input, ) + +We also provide utility functions (drevalpy/models/utils.py) for data transformations that have to be computed on the training data only (e.g., scaling, feature selection) to avoid data leakage: + +* ``def scale_gene_expression`` +* ``class VarianceFeatureSelector`` +* ``def prepare_expression_and_methylation`` +* ``class ProteomicsMedianCenterAndImputeTransformer`` +* ``def prepare_proteomics`` + + The predict method should handle model prediction, and return the predicted response values. .. code-block:: Python - def predict(self, cell_line_input: FeatureDataset, drug_input: FeatureDataset | None = None) -> np.ndarray: + def predict( + self, + cell_line_ids: np.ndarray, + drug_ids: np.ndarray, + cell_line_input: FeatureDataset, + drug_input: FeatureDataset | None = None, + ) -> np.ndarray: + """ + Predicts the response for the given input. + + :param drug_ids: list of drug ids, also used for single drug models, there it is just an array containing the + same drug id + :param cell_line_ids: list of cell line ids + :param cell_line_input: input associated with the cell line, required for all models + :param drug_input: input associated with the drug, optional because single drug models do not use drug features + :returns: predicted response + """ inputs = self.get_feature_matrices( cell_line_ids=cell_line_ids, @@ -147,6 +205,7 @@ The predict method should handle model prediction, and return the predicted resp return self.predictor.predict(**inputs, output.response) + Finally, you need to register your model with the framework. This can be done by adding the following line to the ``__init__.py`` file in the ``drevalpy/models/__init__.py`` directory. Update the ``MULTI_DRUG_MODEL_FACTORY`` if your model is a global model for multiple cancer drugs or to the ``SINGLE_DRUG_MODEL_FACTORY`` if your model is specific to a single drug and needs to be trained for each drug separately. @@ -155,62 +214,298 @@ Update the ``MULTI_DRUG_MODEL_FACTORY`` if your model is a global model for mult from .your_model_name.your_model import YourModel MULTI_DRUG_MODEL_FACTORY.update("YourModel": YourModel) +Now you can run your model using the DrEvalPy pipeline. Run the following command (after installing your cloned and edited DrEvalPy repository e.g. with ``pip install -e .``): + +.. code-block:: shell + drevalpy --model YourModel --dataset CTRPv2 --data_path data + + +To contribute the model, so that the community can build on it, please also write appropriate tests in ``tests/models`` and documentation in ``docs/`` +We are happy to help you with that, contact us via GitHub! + +Let's look at an example an example implementation of a model using the DrEvalPy framework: -Next, please also write appropriate tests in ``tests/individual_models`` and documentation in ``docs/``. -Example: Proteomics Random Forest ---------------------------------- -Instead of gene expression data, we want to use proteomics data in our Random Forest. -The Random Forest is already implemented in ``models/baselines/sklearn_models.py``. -We just need to adapt some methods. -1. We make a new class ProteomicsRandomForest which inherits from the RandomForest class. -We overwrite ``cell_line_views`` to ``["proteomics"]`` and ``get_model_name`` to ``"ProteomicsRandomForest"``. +Example: TinyNN (Neural Network with PyTorch) +--------------------------------------------- + +In this example, we implement a simple feedforward neural network for drug response prediction using gene expression and drug fingerprint features. +We use and recommend PyTorch, but you can use any other framework like TensorFlow, JAX, etc. +Gene expression features are standardized using a ``StandardScaler``, while fingerprint features are used as-is. + +1. We define a minimal PyTorch model with CPU/GPU support. .. code-block:: Python - class ProteomicsRandomForest(RandomForest): - """RandomForest model for drug response prediction using proteomics data.""" + import torch + import torch.nn as nn + import numpy as np - cell_line_views = ["proteomics"] + device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + + class FeedForwardNetwork(nn.Module): + def __init__(self, input_dim: int, hidden_dim: int): + super().__init__() + self.net = nn.Sequential( + nn.Linear(input_dim, hidden_dim), + nn.ReLU(), + nn.Linear(hidden_dim, 1) + ) + self.to(device) + + def fit(self, x: np.ndarray, y: np.ndarray, lr: float = 1e-3, epochs: int = 100): + self.train() + x_tensor = torch.tensor(x, dtype=torch.float32, device=device) + y_tensor = torch.tensor(y, dtype=torch.float32, device=device).unsqueeze(1) + + optimizer = torch.optim.Adam(self.parameters(), lr=lr) + loss_fn = nn.MSELoss() + + for _ in range(epochs): + optimizer.zero_grad() + loss = loss_fn(self(x_tensor), y_tensor) + loss.backward() + optimizer.step() + + def forward(self, x): + return self.net(x) + + def predict(self, x: np.ndarray) -> np.ndarray: + self.eval() + with torch.no_grad(): + x_tensor = torch.tensor(x, dtype=torch.float32, device=device) + preds = self(x_tensor).squeeze(1) + return preds.cpu().numpy() + +2. We create the ``TinyNN`` model class that inherits from ``DRPModel``. + +.. code-block:: Python + + from drevalpy.models.drp_model import DRPModel + from drevalpy.datasets.dataset import FeatureDataset + from sklearn.preprocessing import StandardScaler + from drevalpy.models.utils import load_and_select_gene_features, load_drug_fingerprint_features + + + class TinyNN(DRPModel): + cell_line_views = ["gene_expression"] + drug_views = ["fingerprints"] + early_stopping = True + + def __init__(self): + super().__init__() + self.model = None + self.hyperparameters = None + self.scaler_gex = StandardScaler() @classmethod def get_model_name(cls) -> str: - """ - Returns the model name. + return "TinyNN" - :returns: ProteomicsRandomForest - """ - return "ProteomicsRandomForest" +3. We define how the features are loaded. Here, we use our presupplied datasets and the preimplemented functions. Loading features can be customized (Have a look at the FeatureDataset class for more details e.g. on how to load features from a CSV). + +.. code-block:: Python + + def load_cell_line_features(self, data_path: str, dataset_name: str) -> FeatureDataset: + + return load_and_select_gene_features(feature_type="gene_expression", + data_path=data_path, + dataset_name=dataset_name, + gene_list="landmark_genes_reduced") -2. Next, we need to implement the ``load_cell_line_features`` method to load the proteomics features. -We already supply proteomics features in the Zenodo as proteomics.csv. Hence, we can already use our -pre-implemented method ``load_cell_line_features``. + def load_drug_features(self, data_path: str, dataset_name: str) -> FeatureDataset: + + return load_drug_fingerprint_features(data_path, dataset_name, fill_na=True) + +1. In the ``build_model`` we just store the hyperparameters. .. code-block:: Python - def load_cell_line_features(self, data_path: str, dataset_name: str) -> FeatureDataset: - """ - Loads the cell line features. + def build_model(self, hyperparameters: dict[str, Any]) -> None: + self.hyperparameters = hyperparameters - :param data_path: Path to the gene expression and landmark genes - :param dataset_name: Name of the dataset - :returns: FeatureDataset containing the cell line proteomics features, filtered through the landmark genes - """ - return load_and_select_gene_features( - feature_type="proteomics", - gene_list=None, - data_path=data_path, - dataset_name=dataset_name, - ) +5. In the train method we scale gene expression and train the model. + +.. code-block:: Python + + def train(self, output, cell_line_input, drug_input, output_earlystopping=None, model_checkpoint_dir=None): + gex = cell_line_input.get_feature_matrix("gene_expression", output.cell_line_ids) + fp = drug_input.get_feature_matrix("fingerprints", output.drug_ids) + gex = self.scaler_gex.fit_transform(gex) + x = np.concatenate([gex, fp], axis=1) + y = output.response -3. We use the same build_model method as the RandomForest class, so we don't need to implement it. -However, we need to write the hyperparameters needed into the ``models/baselines/hyperparameters.yaml`` file: + self.model = FeedForwardNetwork( + input_dim=x.shape[1], + hidden_dim=self.hyperparameters["hidden_dim"] + ) + self.model.fit(x, y) + +6. We apply scaling in ``predict`` and return model outputs. + +.. code-block:: Python + + def predict(self, cell_line_ids, drug_ids, cell_line_input, drug_input): + gex = cell_line_input.get_feature_matrix("gene_expression", cell_line_ids) + fp = drug_input.get_feature_matrix("fingerprints", drug_ids) + + gex = self.scaler_gex.transform(gex) + x = np.concatenate([gex, fp], axis=1) + + return self.model.predict(x) + +7. Add hyperparameters to your ``hyperparameters.yaml``. We add two values for the hidden layer size. DrEval will tune over this hyperparameter space. .. code-block:: YAML + TinyNN: + hidden_dim: + - 32 + - 64 + +8. Register the model in ``models/__init__.py``. + +.. code-block:: Python + + from .your_model_folder.tinynn import TinyNN + MULTI_DRUG_MODEL_FACTORY.update({"TinyNN": TinyNN}) + + + +Second Example: ProteomicsRandomForest +-------------------------------------- + +Instead of gene expression data, we want to use proteomics data in our Random Forest. +The Random Forest model is already implemented in ``models/baselines/sklearn_models.py``. +We now adapt it to work with proteomics features, and apply preprocessing steps including missing value imputation, feature selection, and normalization. + +1. We create a new class ``ProteomicsRandomForest`` which inherits from ``RandomForest``. +We overwrite ``cell_line_views`` to ``["proteomics"]`` and define the model name. + +.. code-block:: python + from drevalpy.datasets.dataset import DrugResponseDataset, FeatureDataset + from drevalpy.models import RandomForest + from models.utils import ( + ProteomicsMedianCenterAndImputeTransformer, + load_and_select_gene_features, + load_drug_fingerprint_features, + prepare_proteomics, + scale_gene_expression, + ) + + class ProteomicsRandomForest(RandomForest): + """RandomForest model for drug response prediction using proteomics data.""" + + cell_line_views = ["proteomics"] + + def __init__(self): + super().__init__() + self.feature_threshold = 0.7 + self.n_features = 1000 + self.normalization_width = 0.3 + self.normalization_downshift = 1.8 + + @classmethod + def get_model_name(cls) -> str: + return "ProteomicsRandomForest" + +1. We implement the ``build_model`` method to configure the preprocessing transformer from hyperparameters. + +.. code-block:: python + + def build_model(self, hyperparameters: dict) -> None: + super().build_model(hyperparameters) + self.feature_threshold = hyperparameters.get("feature_threshold", 0.7) + self.n_features = hyperparameters.get("n_features", 1000) + self.normalization_width = hyperparameters.get("normalization_width", 0.3) + self.normalization_downshift = hyperparameters.get("normalization_downshift", 1.8) + self.proteomics_transformer = ProteomicsMedianCenterAndImputeTransformer( + feature_threshold=self.feature_threshold, + n_features=self.n_features, + normalization_downshift=self.normalization_downshift, + normalization_width=self.normalization_width, + ) + +3. We implement the ``load_cell_line_features`` method to load the presupplied proteomics features. + +.. code-block:: python + + def load_cell_line_features(self, data_path: str, dataset_name: str) -> FeatureDataset: + return load_and_select_gene_features( + feature_type="proteomics", + gene_list=None, + data_path=data_path, + dataset_name=dataset_name, + ) + +4. We implement the ``train`` method and preprocess the features before training. + +.. code-block:: python + + def train( + self, + output: DrugResponseDataset, + cell_line_input: FeatureDataset, + drug_input: FeatureDataset | None = None, + output_earlystopping: DrugResponseDataset | None = None, + model_checkpoint_dir: str = "checkpoints", + ) -> None: + if drug_input is None: + raise ValueError("drug_input (fingerprints) is required.") + cell_line_input = prepare_proteomics( + cell_line_input=cell_line_input, + cell_line_ids=np.unique(output.cell_line_ids), + training=True, + transformer=self.proteomics_transformer, + ) + x = self.get_concatenated_features( + cell_line_view=self.cell_line_views[0], + drug_view=self.drug_views[0], + cell_line_ids_output=output.cell_line_ids, + drug_ids_output=output.drug_ids, + cell_line_input=cell_line_input, + drug_input=drug_input, + ) + self.model.fit(x, output.response) + +5. We implement the ``predict`` method and apply the same preprocessing. + +.. code-block:: python + + def predict( + self, + cell_line_ids: np.ndarray, + drug_ids: np.ndarray, + cell_line_input: FeatureDataset, + drug_input: FeatureDataset | None = None, + ) -> np.ndarray: + if drug_input is None: + raise ValueError("drug_input (fingerprints) is required.") + cell_line_input = prepare_proteomics( + cell_line_input=cell_line_input, + cell_line_ids=np.unique(cell_line_ids), + training=False, + transformer=self.proteomics_transformer, + ) + if self.model is None: + return np.full(len(cell_line_ids), np.nan) + x = self.get_concatenated_features( + cell_line_view=self.cell_line_views[0], + drug_view=self.drug_views[0], + cell_line_ids_output=cell_line_ids, + drug_ids_output=drug_ids, + cell_line_input=cell_line_input, + drug_input=drug_input, + ) + return self.model.predict(x) + +6. We define the hyperparameters in ``models/baselines/hyperparameters.yaml``. + +.. code-block:: yaml + ProteomicsRandomForest: n_estimators: - 100 @@ -224,71 +519,28 @@ However, we need to write the hyperparameters needed into the ``models/baselines - -1 criterion: - squared_error + feature_threshold: + - 0.7 + n_features: + - 1000 + normalization_width: + - 0.3 + normalization_downshift: + - 1.8 -We also use the same train and predict method as the RandomForest class, so we don't need to implement them. - -4. Finally, we need to register the model in the ``__init__.py`` file in the ``models/baselines`` directory. +7. We register the model in ``models/__init__.py``. -.. code-block:: Python - - __all__ = [ - "MULTI_DRUG_MODEL_FACTORY", - "SINGLE_DRUG_MODEL_FACTORY", - "MODEL_FACTORY", - "NaivePredictor", - #[...] - "DIPKModel", - "ProteomicsRandomForest" - ] - #[...] - from .baselines.sklearn_models import ( - ElasticNetModel, GradientBoosting, RandomForest, SVMRegressor, ProteomicsRandomForest - ) +.. code-block:: python - # SINGLE_DRUG_MODEL_FACTORY is used in the pipeline! - SINGLE_DRUG_MODEL_FACTORY: dict[str, type[DRPModel]] = { - #[...] - } + from .baselines.sklearn_models import ProteomicsRandomForest - # MULTI_DRUG_MODEL_FACTORY is used in the pipeline! - MULTI_DRUG_MODEL_FACTORY: dict[str, type[DRPModel]] = { - "NaivePredictor": NaivePredictor, - #[...] - "DIPK": DIPKModel, + MULTI_DRUG_MODEL_FACTORY.update({ "ProteomicsRandomForest": ProteomicsRandomForest, - } + }) -5. Add your model to the tests, in this case in ``tests/individual_models/test_baselines.py``. +Now you can run the model using the DrEvalPy pipeline. +To run the model and execute the following command: +.. code-block:: shell -.. code-block:: Python - - @pytest.mark.parametrize( - "model_name", - [ - "NaivePredictor", - "NaiveDrugMeanPredictor", - "NaiveCellLineMeanPredictor", - "NaiveMeanEffectsPredictor", - "ElasticNet", - "RandomForest", - "SVR", - "MultiOmicsRandomForest", - "GradientBoosting", - "ProteomicsRandomForest", - ], - ) - @pytest.mark.parametrize("test_mode", ["LPO", "LCO", "LDO"]) - def test_baselines( - sample_dataset: DrugResponseDataset, - model_name: str, - test_mode: str, - cross_study_dataset: DrugResponseDataset, - ) -> None: - # [...] - -6. Now, we add the appropriate documentation. -In our case, the class methods etc. under API are rendered automatically because it is a subclass of Sklearn Models. -If you implement a new model, please orient yourself on the documentation of, e.g., DIPK. - -Add your model in ``usage.rst`` under the section "Available models". + drevalpy --model ProteomicsRandomForest --dataset CTRPv2 --data_path data \ No newline at end of file diff --git a/docs/usage.rst b/docs/usage.rst index 750fb09d..5f929acd 100644 --- a/docs/usage.rst +++ b/docs/usage.rst @@ -2,29 +2,29 @@ How to use DrEvalPy =================== Here, we document how to run DrEval with our implemented models and datasets. You can either do this with the standalone -supplied here or with the associated Nextflow pipeline. We recommend the use of our nextflow pipeline for computational +supplied here or with the associated Nextflow pipeline ``drugresponseeval``. We recommend the use of our Nextflow pipeline for computational demanding runs and for improved reproducibility. -No knowledge of nextflow is required to run it. The nextflow pipeline is available on the `nf-core GitHub +No knowledge of Nextflow is required to run it. The Nextflow pipeline is available on the `nf-core GitHub `_, the corresponding documentation can be found `here `_. Documentation of the standalone is provided below. -Generate results with ``run_suite.py`` +Run a drug response experiment results with ``drevalpy`` -------------------------------------- -The main script to run the standalone is ``run_suite.py``. You can run it with the following command: +You can run it the drug response pipeline, which can test drug response models via: .. code-block:: bash - python run_suite.py [-h] [--run_id RUN_ID] [--path_data PATH_DATA] [--models MODELS [MODELS ...]] [--baselines BASELINES [BASELINES ...]] [--test_mode TEST_MODE [TEST_MODE ...]] + drevalpy [-h] [--run_id RUN_ID] [--path_data PATH_DATA] [--models MODELS [MODELS ...]] [--baselines BASELINES [BASELINES ...]] [--test_mode TEST_MODE [TEST_MODE ...]] [--randomization_mode RANDOMIZATION_MODE [RANDOMIZATION_MODE ...]] [--randomization_type RANDOMIZATION_TYPE] [--n_trials_robustness N_TRIALS_ROBUSTNESS] [--dataset_name DATASET_NAME] - [--cross_study_datasets CROSS_STUDY_DATASETS [CROSS_STUDY_DATASETS ...]] [--path_out PATH_OUT] [--measure MEASURE] [--curve_curator] [--curve_curator_cores CORES] [--overwrite] [--optim_metric OPTIM_METRIC] [--n_cv_splits N_CV_SPLITS] - [--response_transformation RESPONSE_TRANSFORMATION] [--multiprocessing] + [--cross_study_datasets CROSS_STUDY_DATASETS [CROSS_STUDY_DATASETS ...]] [--path_out PATH_OUT] [--measure MEASURE] [--no_refitting] [--curve_curator_cores CORES] [--overwrite] [--optim_metric OPTIM_METRIC] [--n_cv_splits N_CV_SPLITS] + [--response_transformation RESPONSE_TRANSFORMATION] [--multiprocessing] [--model_checkpoint_dir MODEL_CHECKPOINT_DIR] [--final_model_on_full_data] [--no_hyperparameter_tuning] Options: * ``-h, --help``: Show help message and exit. * ``--run_id RUN_ID``: Identifier for the run. Will be used as a prefix for all output files. -* ``--path_data PATH_DATA``: Path to the data directory, default: data. All data files should be stored in this directory and will be downloaded into this directory. The location of the datasets are resolved by ``//.csv``. If providing raw viability data, the file needs to be named ``_raw.csv`` instead and ``--curve_curator`` needs to be specified for automated curve fitting (see ``--curve_curator`` for details and also check the :ref:`usage:Custom Datasets` section). +* ``--path_data PATH_DATA``: Path to the data directory, default: data. All data files should be stored in this directory and will be downloaded into this directory. The location of the datasets are resolved by ``//.csv``. If providing raw viability data, the file needs to be named ``_raw.csv`` instead and ``--no_refitting`` needs to be unspecified for automated curve fitting (thats the default) (see ``--no_refitting`` for details and also check the :ref:`usage:Custom Datasets` section). * ``--models MODELS [MODELS ...]``: List of models to evaluate. For a list of available models, see the :ref:`usage:Available Models` section. * ``--baselines BASELINES [BASELINES ...]``: List of baselines to evaluate. If NaiveMeanEffectsPredictor is not part of them, we will add it. For a list of available baselines, see the :ref:`usage:Available Models` section. * ``--test_mode TEST_MODE [TEST_MODE ...]``: Which tests to run (LPO=Leave-random-Pairs-Out, LCO=Leave-Cell-line-Out, LTO=Leave-Tissue-Out, LDO=Leave-Drug-Out). Can be a list of test runs e.g. 'LPO LCO LTO LDO' to run all tests. Default is LPO. For more information, see the :ref:`usage:Available Settings` section. @@ -34,37 +34,43 @@ Options: * ``--dataset_name DATASET_NAME``: Name of the dataset to use. For a list of available datasets, see the :ref:`usage:Available Datasets` section. For information on how to use custom datasets, see the :ref:`usage:Custom Datasets` section. * ``--cross_study_datasets CROSS_STUDY_DATASETS [CROSS_STUDY_DATASETS ...]``: List of datasets to use for cross-study validation. For a list of available datasets, see the :ref:`usage:Available Datasets` section. * ``--path_out PATH_OUT``: Path to the output directory, default: results. All output files will be stored in this directory. -* ``--measure MEASURE``: The name of the measure to use, default 'LN_IC50'. If using one of the available datasets (see ``--dataset_name``), this is restricted to one of ['LN_IC50', 'EC50', 'IC50', 'pEC50', 'AUC', 'response']. This corresponds to the names of the columns that contain theses measures in the provided input dataset. If providing a custom dataset, this may differ. If the option ``--curve_curator`` is set, the prefix '_curvecurator' is automatically appended, e.g. 'LN_IC50_curvecurator', to allow using the refit measures instead of the ones originally published for the available datasets, allowing for better dataset comparability (refit measures are already provided in the available datasets or computed as part of the fitting procedure when providing custom raw viability datasets, see ``--curve_curator`` for details). -* ``--curve_curator``: Default true. If set, the measure is appended with '_curvecurator'. If a custom dataset_name was provided, this will invoke the fitting procedure of raw viability data, which is expected to exist at ``//_raw.csv``. The fitted dataset will be stored in the same folder, in a file called ``.csv``. Also check the :ref:`usage:Custom Datasets` section. -* ``--curve_curator_cores CORES``: Number of cores to use for CurveCurator fitting. Only used when ``--curve_curator`` is set. +* ``--measure MEASURE``: The name of the measure to use, default 'LN_IC50'. If using one of the available datasets (see ``--dataset_name``), this is restricted to one of ['LN_IC50', 'EC50', 'IC50', 'pEC50', 'AUC', 'response']. This corresponds to the names of the columns that contain theses measures in the provided input dataset. If providing a custom dataset, this may differ. If the option ``--no_refitting`` is not set, the prefix '_curvecurator' is automatically appended, e.g. 'LN_IC50_curvecurator', to allow using the refit measures instead of the ones originally published for the available datasets, allowing for better dataset comparability (refit measures are already provided in the available datasets or computed as part of the fitting procedure when providing custom raw viability datasets, see ``--no_refitting`` for details). +* ``--no_refitting``: If not set, the measure is appended with '_curvecurator'. If a custom dataset_name was provided, this will invoke the fitting procedure of raw viability data, which is expected to exist at ``//_raw.csv``. The fitted dataset will be stored in the same folder, in a file called ``.csv``. Also check the :ref:`usage:Custom Datasets` section. Default is False i.e. curvecurated drug response measures are utilzed. +* ``--curve_curator_cores CURVE_CURATOR_CORES``: Number of cores to use for CurveCurator fitting. Only used when ``--no_refitting`` is not set. Default is 1. * ``--overwrite``: If set, existing files will be overwritten. * ``--optim_metric OPTIM_METRIC``: The metric to optimize for during hyperparameter tuning. Default is 'RMSE'. For more information, see the :ref:`usage:Available Metrics` section. * ``--n_cv_splits N_CV_SPLITS``: Number of cross-validation splits. Default is 7. * ``--response_transformation RESPONSE_TRANSFORMATION``: Transformation to apply to the response data. Default is None. For more information, see the :ref:`usage:Available Response Transformations` section. * ``--multiprocessing``: If set, we will use raytune for fitting. Default is False. +* ``--model_checkpoint_dir MODEL_CHECKPOINT_DIR``: Directory to save model checkpoints. Default is 'TEMPORARY'. +* ``--final_model_on_full_data``: If set, saves a final model trained/tuned on the union of all folds after CV. Default is False. +* ``--no_hyperparameter_tuning``: If set, disables hyperparameter tuning and uses the first hyperparameter set. Default is False. + Example: .. code-block:: bash - python run_suite.py --run_id my_first_run --models NaiveDrugMeanPredictor ElasticNet --dataset TOYv1 --test_mode LCO + drevalpy --run_id my_first_run --models NaiveDrugMeanPredictor ElasticNet --dataset TOYv1 --test_mode LCO + +*Note*: You need at least 7 CV splits to get a meaningful critical difference diagram and the corresponding p-values. -Visualize results with ``create_report.py`` +Visualize and evaluate results with ``drevalpy-report`` ------------------------------------------- -Executing the ``run_suite.py`` script will generate a folder with the results which includes the predictions of all models -in all specified settings. The ``create_report.py`` will evaluate the results with all available metrics and create an +Executing the main script ``drevalpy`` will generate a folder with the results which includes the predictions of all models +in all specified settings. The ``drevalpy-report`` CLI will evaluate the results with all available metrics and create an HTML report with many visualizations. You can run it with the following command: .. code-block:: bash - python create_report.py [-h] --run_id RUN_ID --dataset DATASET [--path_data PATH_DATA] [--result_path RESULT_PATH] + drevalpy-report [-h] --run_id RUN_ID --dataset DATASET [--path_data PATH_DATA] [--result_path RESULT_PATH] Options: * ``-h, --help``: Show help message and exit. -* ``--run_id RUN_ID``: Identifier for the run which was used when executing the ``run_suite.py`` script. -* ``--dataset DATASET``: Name of the dataset which was used when executing the ``run_suite.py`` script. +* ``--run_id RUN_ID``: Identifier for the run which was used when executing the ``drevalpy`` command. +* ``--dataset DATASET``: Name of the dataset which was used when executing the ``drevalpy`` command. * ``--path_data PATH_DATA``: Path to the data directory, default: data. * ``--result_path RESULT_PATH``: Path to the results directory, default: results. @@ -72,7 +78,7 @@ Example: .. code-block:: bash - python create_report.py --run_id my_first_run --dataset TOYv1 + drevalpy-report --run_id my_first_run --dataset TOYv1 The report will be stored in the ``results/RUN_ID`` folder. You can open the ``index.html`` file in your browser to view the report. @@ -113,14 +119,19 @@ reproducible manner. We offer three settings via the ``--test_mode`` parameter: development**. An underlying issue is that drugs have a rather unique IC50 range. That means that by just predicting the mean IC50 -that a drug has in the training set (aggregated over all cell lines), you can already achieve a rather good -prediction. This is why we also offer the possibility to compare your model to a **NaivePredictor** that predicts -the mean IC50 of all drugs in the training set. We also offer two more advanced naive predictors: -**NaiveCellLineMeanPredictor** and **NaiveDrugMeanPredictor**. The former predicts the mean IC50 of a cell line in -the training set and the latter predicts the mean IC50 of a drug in the training set. -Finally, as the strongest naive baseline we offer the **NaiveMeanEffectPredictor** -which combines the effects of cell lines and drugs. -It is equivalent to the **NaiveCellLineMeanPredictor** and **NaiveDrugMeanPredictor** for the LDO and LPO settings, respectively. +that a drug has in the training set (aggregated over all cell lines), you can already achieve a seemingly good +prediction (as evaluated by naive R^2 or correlation metrics). This is why we also offer the possibility to compare your model to a **NaivePredictor** that predicts +the mean IC50 of all drugs in the training set. We also offer several less naive predictors: +**NaiveCellLineMeanPredictor**, **NaiveDrugMeanPredictor**, **NaiveTissueMeanPredictor**, and **NaiveTissueDrugMeanPredictor**. +The **NaiveCellLineMeanPredictor** predicts the mean IC50 of a cell line in the training set, +the **NaiveDrugMeanPredictor** predicts the mean IC50 of a drug in the training set, +the **NaiveTissueMeanPredictor** predicts the mean IC50 of a tissue in the training set, +and the **NaiveTissueDrugMeanPredictor** predicts the mean IC50 per tissue-drug combination (aggregated across all cell lines with that tissue-drug pair). +The **NaiveMeanEffectPredictor** combines the effects of cell lines and drugs. +It is equivalent to the **NaiveCellLineMeanPredictor** and **NaiveDrugMeanPredictor** for the LDO and LCO settings, respectively, +as test cell line effects and drug effects are unknown in these settings. + +In LCO, **NaiveTissueDrugMeanPredictor** is the strongest baseline, while in all other settings, **NaiveMeanEffectPredictor** is the strongest. Available Models ------------------ @@ -142,6 +153,8 @@ For ``--models``, you can also perform randomization and robustness tests. The ` +---------------------------------+----------------------------+--------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | NaiveTissueMeanPredictor | Baseline Method | Multi-Drug Model | Predicts the mean response of the tissue in the training set. | +---------------------------------+----------------------------+--------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| NaiveTissueDrugMeanPredictor | Baseline Method | Multi-Drug Model | Predicts the mean response per tissue-drug combination in the training set (aggregated across all cell lines with that tissue-drug pair). Falls back to the overall dataset mean for unseen combinations. | ++---------------------------------+----------------------------+--------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | NaiveMeanEffectsPredictor | Baseline Method | Multi-Drug Model | Predicts using ANOVA-like mean effect model of cell lines and drugs | +---------------------------------+----------------------------+--------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ElasticNet | Baseline Method | Multi-Drug Model | Fits an `Sklearn Elastic Net `_, `Lasso `_, or `Ridge `_ model on gene expression data and drug fingerprints (concatenated input matrix). | @@ -170,6 +183,10 @@ For ``--models``, you can also perform randomization and robustness tests. The ` +---------------------------------+----------------------------+--------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | MultiOmicsNeuralNetwork | Baseline Method | Multi-Drug Model | Fits a simple feedforward neural network (implemented with `Pytorch Lightning `_) on gene expression, methylation, mutation, copy number variation data, and drug fingerprints (concatenated input) with 3 layers of varying dimensions and Dropout layers. The dimensionality of the methylation data is reduced with a PCA to the first 100 components before it is fed to the model. | +---------------------------------+----------------------------+--------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| ChemBERTaNeuralNetwork | Baseline Method | Multi-Drug Model | Same architecture as the SimpleNeuralNetwork but uses pre-computed ChemBERTa embeddings as input instead of drug fingerprints. | ++---------------------------------+----------------------------+--------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| DrugGNN | Baseline Method | Multi-Drug Model | Represents drugs as graph, encodes their structure with a 3-layer GNN. Uses a 2-layer MLP for encoding gene expression. Concatenates the representations and feeds them through 2 more MLP layers. | ++---------------------------------+----------------------------+--------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | SRMF | Published Model | Multi-Drug Model | `Similarity Regularization Matrix Factorization `_ model by Wang et al. on gene expression data and drug fingerprints. Re-implemented Matlab code into Python. The basic idea is to represent each drug and each cell line by their respective similarities to all other drugs/cell lines. Those similarities are mapped into a shared latent low-dimensional space from which responses are predicted. | +---------------------------------+----------------------------+--------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | MOLIR | Published Model | Single-Drug Model | Regression extension of `MOLI: multi-omics late integration deep neural network. `_ by Sharifi-Noghabi et al. Takes somatic mutation, copy number variation and gene expression data as input. MOLI reduces the dimensionality of each omics type with a hidden layer, concatenates them into one representation and optimizes this representation via a combined cost function consisting of a triplet loss and a binary cross-entropy loss. We implemented a regression adaption with MSE loss and an adapted triplet loss for regression.| @@ -182,32 +199,37 @@ For ``--models``, you can also perform randomization and robustness tests. The ` Available Datasets ------------------ We provide commonly used datasets to evaluate your model on (GDSC1, GDSC2, CCLE, CTRPv2) via the ``--dataset_name`` parameter. - -+-------------------+----------------------+-----------------+---------------------+--------------------------------------------------------------------------------------------------+ -| Dataset Name | Number of DRP Curves | Number of Drugs | Number of Cell Lines| Description | -+===================+======================+=================+=====================+==================================================================================================+ -| GDSC1 | 316,506 | 378 | 970 | The Genomics of Drug Sensitivity in Cancer (GDSC) dataset version 1. | -+-------------------+----------------------+-----------------+---------------------+--------------------------------------------------------------------------------------------------+ -| GDSC2 | 234,437 | 287 | 969 | The Genomics of Drug Sensitivity in Cancer (GDSC) dataset version 2. | -+-------------------+----------------------+-----------------+---------------------+--------------------------------------------------------------------------------------------------+ -| CCLE | 11,670 | 24 | 503 | The Cancer Cell Line Encyclopedia (CCLE) dataset. | -+-------------------+----------------------+-----------------+---------------------+--------------------------------------------------------------------------------------------------+ -| CTRPv1 | 60,758 | 354 | 243 | The Cancer Therapeutics Response Portal (CTRP) dataset version 1. | -+-------------------+----------------------+-----------------+---------------------+--------------------------------------------------------------------------------------------------+ -| CTRPv2 | 395,025 | 546 | 886 | The Cancer Therapeutics Response Portal (CTRP) dataset version 2. | -+-------------------+----------------------+-----------------+---------------------+--------------------------------------------------------------------------------------------------+ -| TOYv1 | 2,711 | 36 | 90 | A toy dataset for testing purposes subsetted from CTRPv2. | -+-------------------+----------------------+-----------------+---------------------+--------------------------------------------------------------------------------------------------+ -| TOYv2 | 2,784 | 36 | 90 | A second toy dataset for cross study testing purposes. 80 cell lines and 32 drugs overlap TOYv2. | -+-------------------+----------------------+-----------------+---------------------+--------------------------------------------------------------------------------------------------+ - - -If using the ``--curve_curator`` option with these datasets (default: true), the desired measure provided with the ``--measure`` option is appended with "_curvecurator", e.g. "IC50_curvecurator". +Further, we provide 2 datasets with more clinical relevance: BeatAML2 and PDX\_Bruna. + ++-------------------+----------------------+-----------------+---------------------+--------------------------------------------------------------------------------------------------------------------+ +| Dataset Name | Number of DRP Curves | Number of Drugs | Number of Cell Lines| Description | ++===================+======================+=================+=====================+====================================================================================================================+ +| GDSC1 | 316,506 | 378 | 970 | The Genomics of Drug Sensitivity in Cancer (GDSC) dataset version 1. | ++-------------------+----------------------+-----------------+---------------------+--------------------------------------------------------------------------------------------------------------------+ +| GDSC2 | 234,437 | 287 | 969 | The Genomics of Drug Sensitivity in Cancer (GDSC) dataset version 2. | ++-------------------+----------------------+-----------------+---------------------+--------------------------------------------------------------------------------------------------------------------+ +| CCLE | 11,670 | 24 | 503 | The Cancer Cell Line Encyclopedia (CCLE) dataset. | ++-------------------+----------------------+-----------------+---------------------+--------------------------------------------------------------------------------------------------------------------+ +| CTRPv1 | 60,758 | 354 | 243 | The Cancer Therapeutics Response Portal (CTRP) dataset version 1. | ++-------------------+----------------------+-----------------+---------------------+--------------------------------------------------------------------------------------------------------------------+ +| CTRPv2 | 395,025 | 546 | 886 | The Cancer Therapeutics Response Portal (CTRP) dataset version 2. | ++-------------------+----------------------+-----------------+---------------------+--------------------------------------------------------------------------------------------------------------------+ +| TOYv1 | 2,711 | 36 | 90 | A toy dataset for testing purposes subsetted from CTRPv2. | ++-------------------+----------------------+-----------------+---------------------+--------------------------------------------------------------------------------------------------------------------+ +| TOYv2 | 2,784 | 36 | 90 | A second toy dataset for cross study testing purposes. 80 cell lines and 32 drugs overlap TOYv2. | ++-------------------+----------------------+-----------------+---------------------+--------------------------------------------------------------------------------------------------------------------+ +| BeatAML2 | 62,487 | 166 | 569 (patients) | Ex vivo drug sensitivity screening for a cohort of acute myeloid leukemia (AML) patients. | ++-------------------+----------------------+-----------------+---------------------+--------------------------------------------------------------------------------------------------------------------+ +| PDX\_Bruna | 2,559 | 104 | 37 (mouse passages) | Ex vivo drug sensitivity screening for short-term cultures of PDTX-derived tumor cells from breast cancer patients | ++-------------------+----------------------+-----------------+---------------------+--------------------------------------------------------------------------------------------------------------------+ + + +If not specifying ``--no_refitting`` option with these datasets (default: false), the desired measure provided with the ``--measure`` option is appended with "_curvecurator", e.g. "IC50_curvecurator". In the provided datasets, these are the measures calculated with the same fitting procedure using CurveCurator. To use the measures reported from the original publications of the -dataset, do not set the ``--curve_curator`` option. +dataset, use the ``--no_refitting`` option, which will use the original measures as provided in the datasets. This however makes it hard to do cross-study comparisons, since the measures may not be directly comparable due to differences in the fitting procedures used by the original authors. -It is therefore recommended to always use DrEvalPy with the ``--curve_curator`` option, even when providing your own custom datasets (see next section). +It is therefore recommended to always use DrEvalPy without the ``--no_refitting`` option, which will lead to the use of the refitted measures that are calculated with the same procedure for all datasets. Corresponding feature data --------------------------- @@ -219,16 +241,28 @@ The datasets have corresponding cell-line and drug feature data. The sources are * CCLE, CTRPv1, CTRPv2: * Gene expression: reprocessed RNA-seq data PRJNA523380 * Methylation: DepMap Beta Values for RRBS clusters ``CCLE_RRBS_TSS_CpG_clusters_20180614.txt`` -* Used by all: +* Used by GDSC1, 2, CCLE, CTRPv1 and v2: * Mutation & CNV data: `Sanger Cell Model Passports `_. * Proteomics: Raw data at PRIDE: PXD030304 +* BeatAML2: + * Gene expression: RNA-seq but not re-processed because of missing FASTQ files. Taken from `the corresponding website `_ + * Mutation data would have been available but is measured too shallow, so we chose not to include it +* PDX\_Bruna: + * Retrieved from `the corresponding figshare `_ + * Gene expression: Microarray expression data + * Copy number variation: Reprocessed with GISTIC2.0 + * Mutation data would have been available but is measured too shallow, so we chose not to include it + * Methylation data would have been available but only Promoter methylation data which is incompatible with the CpG methylation data we have for the other screens. +* Drug features * Morgan Fingerprints were generated with RDKit from SMILES either downloaded from PubChem or provided by GDSC. * `DIPK associated drive `_ * MolGNet features were generated from SMILES * BIONIC features were generated from top expressed genes +* Gene lists * The 978 landmark genes are from the L1000 assay * The drug target genes are the genes targeted by the drugs used in GDSC, extractable from the `GDSC Data Portal `_ (compounds annotation). * The intersection lists are features occurring in all datasets for the respective OMICs to ensure that cross-study predictions can easily be done because the features are shared. + * Reduced versions of the lists only containing genes occurring in all datasets For more information on the preprocessing, please refer to `the corresponding GitHub Repo `_. @@ -240,19 +274,24 @@ the available datasets in the previous section. **Raw viability data** -* DrEvalPy expects a csv-formatted file in the location ``//_raw.csv`` (corresponding to the ``--path_data`` and ``--dataset_name`` options), - which contains the raw viability data in long format with the columns ["dose", "response", "sample", "drug"] and an optional "replicate" column. - If replicates are provided, the procedure will fit one curve per sample / drug pair using all replicates. -* The options ``--curve_curator`` and ``--curve_curator_cores`` must be set. -* Available measures are ["AUC", "pEC50", "EC50", "IC50"]. +* DrEvalPy expects a csv-formatted file in the location ``//_raw.csv`` (corresponding to the ``--path_data`` and ``--dataset_name`` options), which contains the raw viability data in long format with the columns ["dose", "response", "sample", "drug"] and an optional "replicate" column. If replicates are provided, the procedure will fit one curve per sample / drug pair using all replicates. +* **All dosages have to be provided in µM!** Drevalpy will compute the following response measures: + * pEC50_curvecurator: computed internally by CurveCurator. Is computed as -log10(EC50_curvecurator[M]). + * EC50_curvecurator: given in µM + * IC50_curvecurator: given in µM + * LN_IC50_curvecurator: computed from IC50_curvecurator + * AUC_curvecurator +* The option ``--curve_curator_cores`` must be set. ``--no_refitting`` must not be set. * DrEvalPy provides all results of the fitting in the same folder including the fitted curves in a file folder ``//.csv`` **Prefit viability data** * DrEvalPy expects a csv-formatted file in the location ``//.csv`` (corresponding to the ``--path_data`` and ``--dataset_name`` options), - with at least the columns ["cell_line_id", "drug_id", "] where is replaced with the name of the measure you provide + with at least the columns ["cell_line_id", "drug_id", "] where is replaced with the name of the measure you provide. +* For LTO, you must also provide a "tissue" column with tissue information * Available measures depend on the column names and can be provided using the `--measure` option. * It is required that you use measure names that are also working with the available datasets if you use the ``--cross_study_datasets`` option +* Your dataset will be read in with the DrugResponseDataset.from_csv method (drevalpy.datasets.dataset); :download:`Example response file <_static/example_data/response_example.csv>` would support the measure AUC. Available Randomization Tests ----------------------------- @@ -285,8 +324,6 @@ Robustness Test The robustness test is a test where the model is trained with varying seeds. This is done multiple times to see how stable the model is. Via ``--n_trials_robustness``, you can specify the number of trials for the robustness tests. -*Note*: You need at least 7 trials to get a meaningful critical difference diagram and the corresponding p-values. - Available Metrics ----------------- diff --git a/dreval_colab_demo.ipynb b/dreval_colab_demo.ipynb new file mode 100644 index 00000000..d83e01dd --- /dev/null +++ b/dreval_colab_demo.ipynb @@ -0,0 +1,2394 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "QfvWIKUf0V5V" + }, + "source": [ + "# DrEvalPy Demo\n", + "You can execute the DrEval Framework either via Nextflow as nf-core pipeline or as Python standalone.\n", + "\n", + "Approximate runtime standalone demo: 38 minutes, Nextflow demo: 5 minutes" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": "!pip install drevalpy" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-11-20T10:30:00.154463Z", + "start_time": "2025-11-20T10:30:00.134179Z" + } + }, + "cell_type": "code", + "source": [ + "import drevalpy\n", + "drevalpy.__version__" + ], + "outputs": [ + { + "data": { + "text/plain": [ + "'1.4.0'" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 1 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First let us see which dataset and models are already implemented in drevalpy.\n", + "You can test your own model on all the datasets and comapre your model to all.the implemented ones:" + ] + }, + { + "cell_type": "code", + "metadata": { + "ExecuteTime": { + "end_time": "2025-11-20T10:30:13.771977Z", + "start_time": "2025-11-20T10:30:02.952269Z" + } + }, + "source": [ + "from drevalpy.models import MODEL_FACTORY\n", + "from drevalpy.datasets import AVAILABLE_DATASETS\n", + "print(f\"Models: {list(MODEL_FACTORY.keys())}\")\n", + "print(f\"Dataset: {list(AVAILABLE_DATASETS.keys())}\")" + ], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/judithbernett/miniforge3/envs/drevalpy/lib/python3.13/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Models: ['NaivePredictor', 'NaiveDrugMeanPredictor', 'NaiveCellLineMeanPredictor', 'NaiveMeanEffectsPredictor', 'NaiveTissueMeanPredictor', 'ElasticNet', 'RandomForest', 'SVR', 'SimpleNeuralNetwork', 'MultiOmicsNeuralNetwork', 'MultiOmicsRandomForest', 'GradientBoosting', 'SRMF', 'DIPK', 'ProteomicsRandomForest', 'ProteomicsElasticNet', 'DrugGNN', 'ChemBERTaNeuralNetwork', 'SingleDrugRandomForest', 'MOLIR', 'SuperFELTR', 'SingleDrugElasticNet', 'SingleDrugProteomicsElasticNet', 'SingleDrugProteomicsRandomForest']\n", + "Dataset: ['GDSC1', 'GDSC2', 'CCLE', 'TOYv1', 'TOYv2', 'CTRPv1', 'CTRPv2', 'BeatAML2', 'PDX_Bruna']\n" + ] + } + ], + "execution_count": 2 + }, + { + "cell_type": "code", + "metadata": { + "ExecuteTime": { + "end_time": "2025-11-20T11:06:56.387483Z", + "start_time": "2025-11-20T10:30:23.203782Z" + } + }, + "source": [ + "# let us first train a model on the toy dataset. It will download the dataset for you.\n", + "from drevalpy.experiment import drug_response_experiment\n", + "\n", + "naive_mean = MODEL_FACTORY[\"NaivePredictor\"] # a naive model that just predicts the training mean\n", + "enet = MODEL_FACTORY[\"ElasticNet\"] # An Elastic Net based on drug fingerprints and gene expression of 1000 landmark genes\n", + "simple_nn = MODEL_FACTORY[\"SimpleNeuralNetwork\"] # A neural network based on drug fingerprints and gene expression of 1000 landmark genes\n", + "\n", + "toyv2 = AVAILABLE_DATASETS[\"TOYv1\"](path_data=\"data\")\n", + "\n", + "drug_response_experiment(\n", + " models=[enet, simple_nn],\n", + " baselines=[naive_mean], # Ablation studies and robustness tests are not done for baselines.\n", + " response_data=toyv2,\n", + " n_cv_splits=2, # the number of cross validation splits. Should be higher in practice :)\n", + " test_mode=\"LCO\", # LCO means Leave-Cell-Line out. This means that the test and validation splits only contain unseed cell lines.\n", + " run_id=\"my_first_run\",\n", + " path_data=\"data\", # where the downloaded drug response and feature data is stored\n", + " path_out=\"results\", # results are stored here :)\n", + " hyperparameter_tuning=False) # if True (default), hyperparameters of the models and baselines are tuned." + ], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-11-20 11:30:25,057\tINFO util.py:154 -- Missing packages: ['ipywidgets']. Run `pip install -U ipywidgets`, then restart the notebook server for rich notebook output.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Downloading TOYv1 from https://zenodo.org/api/records/17611663/files/TOYv1.zip/content...\n", + "TOYv1 data downloaded and extracted to data\n", + "Downloading meta from https://zenodo.org/api/records/17611663/files/meta.zip/content...\n", + "meta data downloaded and extracted to data\n", + "Creating cv splits at results/my_first_run/TOYv1/LCO/splits\n", + "Running ElasticNet\n", + "- Full Test -\n", + "\n", + "################# FOLD 1/2 #################\n", + "\n", + "Best hyperparameters: {'alpha': 1, 'l1_ratio': 0}\n", + "Training model on full train and validation set to predict test set\n", + "Loading cell line features ...\n", + "Loading drug features ...\n", + "Number of cell lines in features: 88\n", + "Number of drugs in features: 36\n", + "Number of cell lines in train dataset: 45\n", + "Number of drugs in train dataset: 36\n", + "Reduced training dataset from 889 to 858, due to missing features\n", + "Reduced prediction dataset from 887 to 871, due to missing features\n", + "Training model ...\n", + "Using temporary directory: /var/folders/3x/f8j9tddj7flfxt9zx1gkws1m0000gn/T/tmptnn7wkxp for model checkpoints\n", + "\n", + "################# FOLD 2/2 #################\n", + "\n", + "Best hyperparameters: {'alpha': 1, 'l1_ratio': 0}\n", + "Training model on full train and validation set to predict test set\n", + "Loading cell line features ...\n", + "Loading drug features ...\n", + "Number of cell lines in features: 88\n", + "Number of drugs in features: 36\n", + "Number of cell lines in train dataset: 45\n", + "Number of drugs in train dataset: 36\n", + "Reduced training dataset from 887 to 871, due to missing features\n", + "Reduced prediction dataset from 889 to 858, due to missing features\n", + "Training model ...\n", + "Using temporary directory: /var/folders/3x/f8j9tddj7flfxt9zx1gkws1m0000gn/T/tmp84_bfkh8 for model checkpoints\n", + "Running SimpleNeuralNetwork\n", + "- Full Test -\n", + "\n", + "################# FOLD 1/2 #################\n", + "\n", + "Best hyperparameters: {'dropout_prob': 0.3, 'max_epochs': 100, 'units_per_layer': [32, 16, 8, 4]}\n", + "Training model on full train and validation set to predict test set\n", + "Loading cell line features ...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "GPU available: True (mps), used: True\n", + "TPU available: False, using: 0 TPU cores\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loading drug features ...\n", + "Number of cell lines in features: 88\n", + "Number of drugs in features: 36\n", + "Number of cell lines in train dataset: 44\n", + "Number of drugs in train dataset: 36\n", + "Reduced early stopping dataset from 31 to 0\n", + "Training model ...\n", + "Using temporary directory: /var/folders/3x/f8j9tddj7flfxt9zx1gkws1m0000gn/T/tmp2k2op5hb for model checkpoints\n", + "SimpleNeuralNetwork: Early stopping dataset empty. Using training data for early stopping\n", + "Probably, your training dataset is small.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + " | Name | Type | Params | Mode \n", + "--------------------------------------------------------------\n", + "0 | loss | MSELoss | 0 | train\n", + "1 | fully_connected_layers | ModuleList | 13.5 K | train\n", + "2 | batch_norm_layers | ModuleList | 120 | train\n", + "3 | dropout_layer | Dropout | 0 | train\n", + "--------------------------------------------------------------\n", + "13.6 K Trainable params\n", + "0 Non-trainable params\n", + "13.6 K Total params\n", + "0.054 Total estimated model params size (MB)\n", + "13 Modules in train mode\n", + "0 Modules in eval mode\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 0: 100%|██████████| 58/58 [00:01<00:00, 32.78it/s, v_num=0, train_loss_step=12.20]\n", + "Validation: | | 0/? [00:00\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cell_line_namepubchem_idresponsepredictionstissue
0DU44751236311.6391122.327340Breast
1SK-MEL-311236313.3420292.933131Skin
2SK-MEL-246378582.0909052.584991Skin
3LNCaP clone FGC111526670.3595400.096984Prostate
4NCI-H21961236312.9121423.123437Lung
..................
866HCC114330623160.306898-0.228287Breast
867Karpas-299248210943.1245502.441677Lymph
868Namalwa24771867-1.506492-2.305591Lymph
869TE-10363141.665760-3.401662Esophagus
870Karpas-29911152667-4.530059-0.745779Lymph
\n", + "

871 rows × 5 columns

\n", + "" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 4 + }, + { + "cell_type": "code", + "metadata": { + "ExecuteTime": { + "end_time": "2025-11-20T11:31:54.051948Z", + "start_time": "2025-11-20T11:31:48.574322Z" + } + }, + "source": [ + "# you can generate your own evaluations from these predictions.\n", + "# However, we recommend using our evaluation pipeline, which calculates meaningful metrics, creates figures and prepares an HTML report:\n", + "from drevalpy.visualization.create_report import create_report\n", + "create_report(run_id=\"my_first_run\", dataset=\"TOYv1\")\n", + "\n", + "# this will create a report in the results/my_first_run/index.html which you can open in your browser." + ], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Generating result tables ...\n", + "Evaluating file: \"TOYv1/LCO/ElasticNet/predictions/predictions_split_0.csv\" ...\n", + "Parsing file: /Users/judithbernett/PycharmProjects/drevalpy/results/my_first_run/TOYv1/LCO/ElasticNet/predictions/predictions_split_0.csv\n", + "Calculating cell_line-wise evaluation measures …\n", + "Evaluating file: \"TOYv1/LCO/ElasticNet/predictions/predictions_split_1.csv\" ...\n", + "Parsing file: /Users/judithbernett/PycharmProjects/drevalpy/results/my_first_run/TOYv1/LCO/ElasticNet/predictions/predictions_split_1.csv\n", + "Calculating cell_line-wise evaluation measures …\n", + "Evaluating file: \"TOYv1/LCO/NaivePredictor/predictions/predictions_split_0.csv\" ...\n", + "Parsing file: /Users/judithbernett/PycharmProjects/drevalpy/results/my_first_run/TOYv1/LCO/NaivePredictor/predictions/predictions_split_0.csv\n", + "Calculating cell_line-wise evaluation measures …\n", + "Evaluating file: \"TOYv1/LCO/NaivePredictor/predictions/predictions_split_1.csv\" ...\n", + "Parsing file: /Users/judithbernett/PycharmProjects/drevalpy/results/my_first_run/TOYv1/LCO/NaivePredictor/predictions/predictions_split_1.csv\n", + "Calculating cell_line-wise evaluation measures …\n", + "Evaluating file: \"TOYv1/LCO/SimpleNeuralNetwork/predictions/predictions_split_0.csv\" ...\n", + "Parsing file: /Users/judithbernett/PycharmProjects/drevalpy/results/my_first_run/TOYv1/LCO/SimpleNeuralNetwork/predictions/predictions_split_0.csv\n", + "Calculating cell_line-wise evaluation measures …\n", + "Evaluating file: \"TOYv1/LCO/SimpleNeuralNetwork/predictions/predictions_split_1.csv\" ...\n", + "Parsing file: /Users/judithbernett/PycharmProjects/drevalpy/results/my_first_run/TOYv1/LCO/SimpleNeuralNetwork/predictions/predictions_split_1.csv\n", + "Calculating cell_line-wise evaluation measures …\n", + "Evaluating file: \"TOYv1/LCO/NaiveMeanEffectsPredictor/predictions/predictions_split_0.csv\" ...\n", + "Parsing file: /Users/judithbernett/PycharmProjects/drevalpy/results/my_first_run/TOYv1/LCO/NaiveMeanEffectsPredictor/predictions/predictions_split_0.csv\n", + "Calculating cell_line-wise evaluation measures …\n", + "Evaluating file: \"TOYv1/LCO/NaiveMeanEffectsPredictor/predictions/predictions_split_1.csv\" ...\n", + "Parsing file: /Users/judithbernett/PycharmProjects/drevalpy/results/my_first_run/TOYv1/LCO/NaiveMeanEffectsPredictor/predictions/predictions_split_1.csv\n", + "Calculating cell_line-wise evaluation measures …\n", + "Getting information about drugs and cell lines ...\n", + "Reformatting the evaluation results ...\n", + "Reformatting the evaluation results per cell line ...\n", + "Reformatting the true vs. predicted values ...\n", + "Generating report for LCO ...\n", + "Drawing Violin plots ...\n", + "Drawing Violin plots ...\n", + "Drawing heatmaps ...\n", + "Drawing heatmaps ...\n", + "Drawing scatterplots ...\n", + "Generating regression plots for cell_line_name, normalize=False, algorithm=SimpleNeuralNetwork...\n", + "Generating regression plots for cell_line_name, normalize=True, algorithm=SimpleNeuralNetwork...\n", + "Generating regression plots for cell_line_name, normalize=False, algorithm=ElasticNet...\n", + "Generating regression plots for cell_line_name, normalize=True, algorithm=ElasticNet...\n" + ] + } + ], + "execution_count": 5 + }, + { + "cell_type": "code", + "metadata": { + "ExecuteTime": { + "end_time": "2025-11-20T11:33:07.216005Z", + "start_time": "2025-11-20T11:32:45.310888Z" + } + }, + "source": [ + "# We prefer running this in the console:\n", + "!drevalpy --models RandomForest --dataset_name TOYv1 --n_cv_splits 2 --test_mode LPO --run_id my_second_run --no_hyperparameter_tuning\n", + "!drevalpy-report --run_id my_second_run --dataset TOYv1" + ], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Creating cv splits at results/my_second_run/TOYv1/LPO/splits\r\n", + "Running RandomForest\r\n", + "- Full Test -\r\n", + "\r\n", + "################# FOLD 1/2 #################\r\n", + "\r\n", + "Best hyperparameters: {'criterion': 'squared_error', 'max_depth': 5, 'max_samples': 0.2, 'n_estimators': 100, 'n_jobs': -1}\r\n", + "Training model on full train and validation set to predict test set\r\n", + "Loading cell line features ...\r\n", + "Loading drug features ...\r\n", + "Number of cell lines in features: 88\r\n", + "Number of drugs in features: 36\r\n", + "Number of cell lines in train dataset: 90\r\n", + "Number of drugs in train dataset: 36\r\n", + "Reduced training dataset from 888 to 865, due to missing features\r\n", + "Reduced prediction dataset from 888 to 864, due to missing features\r\n", + "Training model ...\r\n", + "Using temporary directory: /var/folders/3x/f8j9tddj7flfxt9zx1gkws1m0000gn/T/tmpmv442vyb for model checkpoints\r\n", + "\r\n", + "################# FOLD 2/2 #################\r\n", + "\r\n", + "Best hyperparameters: {'criterion': 'squared_error', 'max_depth': 5, 'max_samples': 0.2, 'n_estimators': 100, 'n_jobs': -1}\r\n", + "Training model on full train and validation set to predict test set\r\n", + "Loading cell line features ...\r\n", + "Loading drug features ...\r\n", + "Number of cell lines in features: 88\r\n", + "Number of drugs in features: 36\r\n", + "Number of cell lines in train dataset: 89\r\n", + "Number of drugs in train dataset: 36\r\n", + "Reduced training dataset from 888 to 864, due to missing features\r\n", + "Reduced prediction dataset from 888 to 865, due to missing features\r\n", + "Training model ...\r\n", + "Using temporary directory: /var/folders/3x/f8j9tddj7flfxt9zx1gkws1m0000gn/T/tmpppmlxz_8 for model checkpoints\r\n", + "Running NaiveMeanEffectsPredictor\r\n", + "- Only Baseline Tests -\r\n", + "\r\n", + "################# FOLD 1/2 #################\r\n", + "\r\n", + "Best hyperparameters: {}\r\n", + "Training model on full train and validation set to predict test set\r\n", + "Loading cell line features ...\r\n", + "Loading drug features ...\r\n", + "Number of cell lines in features: 90\r\n", + "Number of drugs in features: 36\r\n", + "Number of cell lines in train dataset: 89\r\n", + "Number of drugs in train dataset: 36\r\n", + "Training model ...\r\n", + "Using temporary directory: /var/folders/3x/f8j9tddj7flfxt9zx1gkws1m0000gn/T/tmp1ycyb7df for model checkpoints\r\n", + "\r\n", + "################# FOLD 2/2 #################\r\n", + "\r\n", + "Best hyperparameters: {}\r\n", + "Training model on full train and validation set to predict test set\r\n", + "Loading cell line features ...\r\n", + "Loading drug features ...\r\n", + "Number of cell lines in features: 90\r\n", + "Number of drugs in features: 36\r\n", + "Number of cell lines in train dataset: 89\r\n", + "Number of drugs in train dataset: 36\r\n", + "Training model ...\r\n", + "Using temporary directory: /var/folders/3x/f8j9tddj7flfxt9zx1gkws1m0000gn/T/tmp3lhqth94 for model checkpoints\r\n", + "Done!\r\n", + "Generating result tables ...\r\n", + "Evaluating file: \"TOYv1/LPO/RandomForest/predictions/predictions_split_0.csv\" ...\r\n", + "Parsing file: /Users/judithbernett/PycharmProjects/drevalpy/results/my_second_run/TOYv1/LPO/RandomForest/predictions/predictions_split_0.csv\r\n", + "Calculating drug-wise evaluation measures …\r\n", + "Calculating cell_line-wise evaluation measures …\r\n", + "Evaluating file: \"TOYv1/LPO/RandomForest/predictions/predictions_split_1.csv\" ...\r\n", + "Parsing file: /Users/judithbernett/PycharmProjects/drevalpy/results/my_second_run/TOYv1/LPO/RandomForest/predictions/predictions_split_1.csv\r\n", + "Calculating drug-wise evaluation measures …\r\n", + "Calculating cell_line-wise evaluation measures …\r\n", + "Evaluating file: \"TOYv1/LPO/NaiveMeanEffectsPredictor/predictions/predictions_split_0.csv\" ...\r\n", + "Parsing file: /Users/judithbernett/PycharmProjects/drevalpy/results/my_second_run/TOYv1/LPO/NaiveMeanEffectsPredictor/predictions/predictions_split_0.csv\r\n", + "Calculating drug-wise evaluation measures …\r\n", + "Calculating cell_line-wise evaluation measures …\r\n", + "Evaluating file: \"TOYv1/LPO/NaiveMeanEffectsPredictor/predictions/predictions_split_1.csv\" ...\r\n", + "Parsing file: /Users/judithbernett/PycharmProjects/drevalpy/results/my_second_run/TOYv1/LPO/NaiveMeanEffectsPredictor/predictions/predictions_split_1.csv\r\n", + "Calculating drug-wise evaluation measures …\r\n", + "Calculating cell_line-wise evaluation measures …\r\n", + "Getting information about drugs and cell lines ...\r\n", + "Reformatting the evaluation results ...\r\n", + "Reformatting the evaluation results per drug ...\r\n", + "Reformatting the evaluation results per cell line ...\r\n", + "Reformatting the true vs. predicted values ...\r\n", + "Generating report for LPO ...\r\n", + "Error in drawing critical difference plot: At least 3 sets of samples must be given for Friedman test, got 2.\r\n", + "Drawing Violin plots ...\r\n", + "Drawing Violin plots ...\r\n", + "Drawing heatmaps ...\r\n", + "Drawing heatmaps ...\r\n", + "Drawing scatterplots ...\r\n", + "Drawing scatterplots ...\r\n", + "Generating regression plots for drug_name, normalize=False, algorithm=RandomForest...\r\n", + "Generating regression plots for drug_name, normalize=True, algorithm=RandomForest...\r\n", + "Generating regression plots for cell_line_name, normalize=False, algorithm=RandomForest...\r\n", + "Generating regression plots for cell_line_name, normalize=True, algorithm=RandomForest...\r\n" + ] + } + ], + "execution_count": 6 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "qWbDZA4X17Tj" + }, + "source": [ + "## Using the drevalpy nextflow pipeline for highly optimized runs:" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "7145560s6U-K" + }, + "source": [ + "You should use DrEval with Nextflow on high-performance clusters or clouds. Nextflow supports various systems like Slurm, AWS, Azure, Kubernetes, or SGE. On a local machine, you can also use the pipeline but probably, the overhang from spawning processes is not worth it so you might prefer the standalone. Nextflow needs a java version >=17, so we need to install that, too." + ] + }, + { + "cell_type": "code", + "metadata": { + "ExecuteTime": { + "end_time": "2025-11-20T11:34:36.534414Z", + "start_time": "2025-11-20T11:34:32.713036Z" + } + }, + "source": [ + "!pip install nextflow\n", + "!apt-get install openjdk-17-jre-headless -qq > /dev/null\n", + "!java --version" + ], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Collecting nextflow\r\n", + " Downloading nextflow-25.10.0.tar.gz (7.7 kB)\r\n", + " Installing build dependencies ... \u001B[?25ldone\r\n", + "\u001B[?25h Getting requirements to build wheel ... \u001B[?25ldone\r\n", + "\u001B[?25h Preparing metadata (pyproject.toml) ... \u001B[?25ldone\r\n", + "\u001B[?25hBuilding wheels for collected packages: nextflow\r\n", + " Building wheel for nextflow (pyproject.toml) ... \u001B[?25ldone\r\n", + "\u001B[?25h Created wheel for nextflow: filename=nextflow-25.10.0-py3-none-any.whl size=7871 sha256=fa4251705ec9b8ea100573727ee2b922e26121c1c645159d17e46f469d74d953\r\n", + " Stored in directory: /Users/judithbernett/Library/Caches/pip/wheels/d9/3d/9f/f98531f3e6826cd9e58951157b2588a55a3426ecdb9b9b20dd\r\n", + "Successfully built nextflow\r\n", + "Installing collected packages: nextflow\r\n", + "Successfully installed nextflow-25.10.0\r\n", + "zsh:1: command not found: apt-get\r\n", + "openjdk 23.0.2 2025-01-21\r\n", + "OpenJDK Runtime Environment Homebrew (build 23.0.2)\r\n", + "OpenJDK 64-Bit Server VM Homebrew (build 23.0.2, mixed mode, sharing)\r\n" + ] + } + ], + "execution_count": 7 + }, + { + "cell_type": "code", + "metadata": { + "ExecuteTime": { + "end_time": "2025-11-20T11:34:43.437328Z", + "start_time": "2025-11-20T11:34:43.416328Z" + } + }, + "source": [ + "# we need a demo config for nextflow because on colab, we only have two CPUs available:\n", + "with open('demo.config', 'w') as f:\n", + " f.write('process {\\n')\n", + " f.write('\\tresourceLimits = [\\n')\n", + " f.write('\\t\\tcpus: 2,\\n')\n", + " f.write('\\t\\tmemory: \"3.GB\",\\n')\n", + " f.write('\\t\\ttime: \"1.h\",\\n')\n", + " f.write('\\t]\\n')\n", + " f.write('}')" + ], + "outputs": [], + "execution_count": 8 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "wvc80Ahz6jj4" + }, + "source": [ + "We run the pipeline with the TOYv1 dataset which was subset from CTRPv2. For the demo, we don't do hyperparameter tuning and we just do 2 CV splits. We want to inspect the final model which is why we train a final model on the full dataset. This should take about 10 minutes.\n", + "If you were on a compute cluster, you could now decide if you want to run the pipeline inside conda, docker, singularity, ... via the -profile option (-profile singularity, e.g.). If you want the executor to be slurm/..., you can write this in your config. You can find plenty of config examples online, e.g., the one for our group: [daisybio](https://github.com/nf-core/configs/blob/master/conf/daisybio.config)\n" + ] + }, + { + "cell_type": "code", + "metadata": { + "ExecuteTime": { + "end_time": "2025-11-20T11:39:03.729669Z", + "start_time": "2025-11-20T11:34:56.894351Z" + } + }, + "source": [ + "!nextflow run nf-core/drugresponseeval -r dev -c demo.config --dataset_name TOYv1 --models ElasticNet --baselines NaiveMeanEffectsPredictor --n_cv_splits 2 --no_hyperparameter_tuning --final_model_on_full_data" + ], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001B[Knloading nextflow dependencies. It may require a few seconds, please wait .. \r\n", + "\u001B[1m\u001B[38;5;232m\u001B[48;5;43m N E X T F L O W \u001B[0;2m ~ \u001B[mversion 25.10.0\u001B[m\r\n", + "\u001B[K\r\n", + "Pulling nf-core/drugresponseeval ...\r\n", + " downloaded from https://github.com/nf-core/drugresponseeval.git\r\n", + "Launching\u001B[35m `https://github.com/nf-core/drugresponseeval` \u001B[0;2m[\u001B[0;1;36mgrave_mclean\u001B[0;2m] DSL2 - \u001B[36mrevision: \u001B[0;36mae31d78d85 [dev]\u001B[m\r\n", + "\u001B[K\r\n", + "\r\n", + "------------------------------------------------------\r\n", + " ,--./,-.\r\n", + " ___ __ __ __ ___ /,-._.--~'\r\n", + " |\\ | |__ __ / ` / \\ |__) |__ } {\r\n", + " | \\| | \\__, \\__/ | \\ |___ \\`-._,-`-,\r\n", + " `._,._,'\r\n", + " nf-core/drugresponseeval 1.1.1dev\r\n", + "------------------------------------------------------\r\n", + "\u001B[1mModel options\u001B[0m\r\n", + " \u001B[0;34mmodels : \u001B[0;32mElasticNet\u001B[0m\r\n", + "\r\n", + "\u001B[1mInput/output options\u001B[0m\r\n", + " \u001B[0;34mdataset_name : \u001B[0;32mTOYv1\u001B[0m\r\n", + "\r\n", + "\u001B[1mAdditional options\u001B[0m\r\n", + " \u001B[0;34mn_cv_splits : \u001B[0;32m2\u001B[0m\r\n", + " \u001B[0;34mno_hyperparameter_tuning: \u001B[0;32mtrue\u001B[0m\r\n", + " \u001B[0;34mfinal_model_on_full_data: \u001B[0;32mtrue\u001B[0m\r\n", + "\r\n", + "\u001B[1mGeneric options\u001B[0m\r\n", + " \u001B[0;34mtrace_report_suffix : \u001B[0;32m2025-11-20_12-35-05\u001B[0m\r\n", + "\r\n", + "\u001B[1mCore Nextflow options\u001B[0m\r\n", + " \u001B[0;34mrevision : \u001B[0;32mdev\u001B[0m\r\n", + " \u001B[0;34mrunName : \u001B[0;32mgrave_mclean\u001B[0m\r\n", + " \u001B[0;34mcontainer : \u001B[0;32mghcr.io/daisybio/drevalpy:v1.3.5\u001B[0m\r\n", + " \u001B[0;34mlaunchDir : \u001B[0;32m/Users/judithbernett/PycharmProjects/drevalpy\u001B[0m\r\n", + " \u001B[0;34mworkDir : \u001B[0;32m/Users/judithbernett/PycharmProjects/drevalpy/work\u001B[0m\r\n", + " \u001B[0;34mprojectDir : \u001B[0;32m/Users/judithbernett/.nextflow/assets/nf-core/drugresponseeval\u001B[0m\r\n", + " \u001B[0;34muserName : \u001B[0;32mjudithbernett\u001B[0m\r\n", + " \u001B[0;34mprofile : \u001B[0;32mstandard\u001B[0m\r\n", + " \u001B[0;34mconfigFiles : \u001B[0;32m/Users/judithbernett/.nextflow/assets/nf-core/drugresponseeval/nextflow.config, /Users/judithbernett/PycharmProjects/drevalpy/demo.config\u001B[0m\r\n", + "\r\n", + "!! Only displaying parameters that differ from the pipeline defaults !!\r\n", + "-\u001B[2m----------------------------------------------------\u001B[0m-\r\n", + "* The nf-core framework\r\n", + " https://doi.org/10.1038/s41587-020-0439-x\r\n", + "\r\n", + "* Software dependencies\r\n", + " https://github.com/nf-core/drugresponseeval/blob/main/CITATIONS.md\r\n", + "\r\n", + "Using existing response dataset TOYv1 from data/TOYv1/TOYv1.csv\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…EEVAL:RUN_CV:\u001B[mLOAD_RESPONSE -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…AL:RUN_CV:\u001B[mLOAD_CS_RESPONSE -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…SPONSEEVAL:RUN_CV:\u001B[mCV_SPLIT -\u001B[K\r\n", + "\u001B[4A\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…EEVAL:RUN_CV:\u001B[mLOAD_RESPONSE -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…AL:RUN_CV:\u001B[mLOAD_CS_RESPONSE -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…SPONSEEVAL:RUN_CV:\u001B[mCV_SPLIT -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…NSEEVAL:RUN_CV:\u001B[mMAKE_MODELS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…EVAL:RUN_CV:\u001B[mMAKE_BASELINES -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…ONSEEVAL:RUN_CV:\u001B[mHPAM_SPLIT -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…UN_CV:\u001B[mTRAIN_AND_PREDICT_CV -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…L:RUN_CV:\u001B[mEVALUATE_FIND_MAX -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…MODEL_TESTING:\u001B[mPREDICT_FULL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…:MODEL_TESTING:\u001B[mFINAL_SPLIT -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…L_TESTING:\u001B[mTUNE_FINAL_MODEL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…NG:\u001B[mEVALUATE_FIND_MAX_FINAL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mTRAIN_FINAL_MODEL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…ESTING:\u001B[mCONSOLIDATE_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…DEL_TESTING:\u001B[mEVALUATE_FINAL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…EL_TESTING:\u001B[mCOLLECT_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mVISUALIZE_RESULTS -\u001B[K\r\n", + "\u001B[18A\r\n", + "\u001B[2mexecutor > local (2)\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…EEVAL:RUN_CV:\u001B[mLOAD_RESPONSE\u001B[2m |\u001B[m 0 of 1\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…AL:RUN_CV:\u001B[mLOAD_CS_RESPONSE -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…SPONSEEVAL:RUN_CV:\u001B[mCV_SPLIT -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…NSEEVAL:RUN_CV:\u001B[mMAKE_MODELS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…EVAL:RUN_CV:\u001B[mMAKE_BASELINES -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m63/47686a\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NaiveMeanEffectsPredictor)\u001B[2m |\u001B[m 0 of 2\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…UN_CV:\u001B[mTRAIN_AND_PREDICT_CV -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…L:RUN_CV:\u001B[mEVALUATE_FIND_MAX -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…MODEL_TESTING:\u001B[mPREDICT_FULL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…:MODEL_TESTING:\u001B[mFINAL_SPLIT -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…L_TESTING:\u001B[mTUNE_FINAL_MODEL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…NG:\u001B[mEVALUATE_FIND_MAX_FINAL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mTRAIN_FINAL_MODEL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…ESTING:\u001B[mCONSOLIDATE_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…DEL_TESTING:\u001B[mEVALUATE_FINAL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…EL_TESTING:\u001B[mCOLLECT_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mVISUALIZE_RESULTS -\u001B[K\r\n", + "\u001B[33mWARN: Task runtime metrics are not reported when using macOS without a container engine\u001B[39m\u001B[K\r\n", + "\u001B[20A\r\n", + "\u001B[2mexecutor > local (3)\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m27/079cb7\u001B[0;2m] \u001B[0;2mNFC…N_CV:\u001B[mLOAD_RESPONSE\u001B[33;2m (\u001B[0;33mTOYv1\u001B[2m)\u001B[m\u001B[2m |\u001B[m 0 of 1\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…AL:RUN_CV:\u001B[mLOAD_CS_RESPONSE -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…SPONSEEVAL:RUN_CV:\u001B[mCV_SPLIT -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…NSEEVAL:RUN_CV:\u001B[mMAKE_MODELS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…EVAL:RUN_CV:\u001B[mMAKE_BASELINES -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m63/47686a\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NaiveMeanEffectsPredictor)\u001B[2m |\u001B[m 2 of 2\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…UN_CV:\u001B[mTRAIN_AND_PREDICT_CV -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…L:RUN_CV:\u001B[mEVALUATE_FIND_MAX -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…MODEL_TESTING:\u001B[mPREDICT_FULL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…:MODEL_TESTING:\u001B[mFINAL_SPLIT -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…L_TESTING:\u001B[mTUNE_FINAL_MODEL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…NG:\u001B[mEVALUATE_FIND_MAX_FINAL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mTRAIN_FINAL_MODEL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…ESTING:\u001B[mCONSOLIDATE_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…DEL_TESTING:\u001B[mEVALUATE_FINAL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…EL_TESTING:\u001B[mCOLLECT_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mVISUALIZE_RESULTS -\u001B[K\r\n", + "\u001B[33mWARN: Task runtime metrics are not reported when using macOS without a container engine\u001B[39m\u001B[K\r\n", + "\u001B[20A\r\n", + "\u001B[2mexecutor > local (3)\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m27/079cb7\u001B[0;2m] \u001B[0;2mNFC…N_CV:\u001B[mLOAD_RESPONSE\u001B[33;2m (\u001B[0;33mTOYv1\u001B[2m)\u001B[m\u001B[2m |\u001B[m 0 of 1\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…AL:RUN_CV:\u001B[mLOAD_CS_RESPONSE -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…SPONSEEVAL:RUN_CV:\u001B[mCV_SPLIT -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…NSEEVAL:RUN_CV:\u001B[mMAKE_MODELS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…EVAL:RUN_CV:\u001B[mMAKE_BASELINES -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m63/47686a\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NaiveMeanEffectsPredictor)\u001B[2m |\u001B[m 2 of 2\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…UN_CV:\u001B[mTRAIN_AND_PREDICT_CV -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…L:RUN_CV:\u001B[mEVALUATE_FIND_MAX -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…MODEL_TESTING:\u001B[mPREDICT_FULL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…:MODEL_TESTING:\u001B[mFINAL_SPLIT -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…L_TESTING:\u001B[mTUNE_FINAL_MODEL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…NG:\u001B[mEVALUATE_FIND_MAX_FINAL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mTRAIN_FINAL_MODEL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…ESTING:\u001B[mCONSOLIDATE_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…DEL_TESTING:\u001B[mEVALUATE_FINAL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…EL_TESTING:\u001B[mCOLLECT_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mVISUALIZE_RESULTS -\u001B[K\r\n", + "\u001B[33mWARN: Task runtime metrics are not reported when using macOS without a container engine\u001B[39m\u001B[K\r\n", + "\u001B[20A\r\n", + "\u001B[2mexecutor > local (5)\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m27/079cb7\u001B[0;2m] \u001B[0;2mNFC…N_CV:\u001B[mLOAD_RESPONSE\u001B[33;2m (\u001B[0;33mTOYv1\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…AL:RUN_CV:\u001B[mLOAD_CS_RESPONSE -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/913635\u001B[0;2m] \u001B[0;2mNFC…EVAL:RUN_CV:\u001B[mCV_SPLIT\u001B[33;2m (\u001B[0;33mLCO\u001B[2m)\u001B[m\u001B[2m |\u001B[m 0 of 1\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…NSEEVAL:RUN_CV:\u001B[mMAKE_MODELS\u001B[2m |\u001B[m 0 of 1\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mb2/7bcc8d\u001B[0;2m] \u001B[0;2m\u001B[mNFC…LINES\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 0 of 1\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m63/47686a\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NaiveMeanEffectsPredictor)\u001B[2m |\u001B[m 2 of 2\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…UN_CV:\u001B[mTRAIN_AND_PREDICT_CV -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…L:RUN_CV:\u001B[mEVALUATE_FIND_MAX -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…MODEL_TESTING:\u001B[mPREDICT_FULL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…:MODEL_TESTING:\u001B[mFINAL_SPLIT -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…L_TESTING:\u001B[mTUNE_FINAL_MODEL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…NG:\u001B[mEVALUATE_FIND_MAX_FINAL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mTRAIN_FINAL_MODEL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…ESTING:\u001B[mCONSOLIDATE_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…DEL_TESTING:\u001B[mEVALUATE_FINAL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…EL_TESTING:\u001B[mCOLLECT_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mVISUALIZE_RESULTS -\u001B[K\r\n", + "\u001B[33mWARN: Task runtime metrics are not reported when using macOS without a container engine\u001B[39m\u001B[K\r\n", + "\u001B[20A\r\n", + "\u001B[2mexecutor > local (6)\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m27/079cb7\u001B[0;2m] \u001B[0;2mNFC…N_CV:\u001B[mLOAD_RESPONSE\u001B[33;2m (\u001B[0;33mTOYv1\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…AL:RUN_CV:\u001B[mLOAD_CS_RESPONSE -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/913635\u001B[0;2m] \u001B[0;2mNFC…EVAL:RUN_CV:\u001B[mCV_SPLIT\u001B[33;2m (\u001B[0;33mLCO\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mad/5338f4\u001B[0;2m] \u001B[0;2m\u001B[mNFC…ODELS\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 0 of 1\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mb2/7bcc8d\u001B[0;2m] \u001B[0;2m\u001B[mNFC…LINES\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 0 of 1\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m63/47686a\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NaiveMeanEffectsPredictor)\u001B[2m |\u001B[m 2 of 2\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…UN_CV:\u001B[mTRAIN_AND_PREDICT_CV -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…L:RUN_CV:\u001B[mEVALUATE_FIND_MAX -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…MODEL_TESTING:\u001B[mPREDICT_FULL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…:MODEL_TESTING:\u001B[mFINAL_SPLIT -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…L_TESTING:\u001B[mTUNE_FINAL_MODEL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…NG:\u001B[mEVALUATE_FIND_MAX_FINAL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mTRAIN_FINAL_MODEL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…ESTING:\u001B[mCONSOLIDATE_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…DEL_TESTING:\u001B[mEVALUATE_FINAL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…EL_TESTING:\u001B[mCOLLECT_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mVISUALIZE_RESULTS -\u001B[K\r\n", + "\u001B[33mWARN: Task runtime metrics are not reported when using macOS without a container engine\u001B[39m\u001B[K\r\n", + "\u001B[20A\r\n", + "\u001B[2mexecutor > local (6)\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m27/079cb7\u001B[0;2m] \u001B[0;2mNFC…N_CV:\u001B[mLOAD_RESPONSE\u001B[33;2m (\u001B[0;33mTOYv1\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…AL:RUN_CV:\u001B[mLOAD_CS_RESPONSE -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/913635\u001B[0;2m] \u001B[0;2mNFC…EVAL:RUN_CV:\u001B[mCV_SPLIT\u001B[33;2m (\u001B[0;33mLCO\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mad/5338f4\u001B[0;2m] \u001B[0;2m\u001B[mNFC…ODELS\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 0 of 1\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mb2/7bcc8d\u001B[0;2m] \u001B[0;2m\u001B[mNFC…LINES\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 0 of 1\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m63/47686a\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NaiveMeanEffectsPredictor)\u001B[2m |\u001B[m 2 of 2\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…UN_CV:\u001B[mTRAIN_AND_PREDICT_CV -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…L:RUN_CV:\u001B[mEVALUATE_FIND_MAX -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…MODEL_TESTING:\u001B[mPREDICT_FULL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…:MODEL_TESTING:\u001B[mFINAL_SPLIT -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…L_TESTING:\u001B[mTUNE_FINAL_MODEL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…NG:\u001B[mEVALUATE_FIND_MAX_FINAL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mTRAIN_FINAL_MODEL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…ESTING:\u001B[mCONSOLIDATE_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…DEL_TESTING:\u001B[mEVALUATE_FINAL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…EL_TESTING:\u001B[mCOLLECT_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mVISUALIZE_RESULTS -\u001B[K\r\n", + "\u001B[33mWARN: Task runtime metrics are not reported when using macOS without a container engine\u001B[39m\u001B[K\r\n", + "\u001B[20A\r\n", + "\u001B[2mexecutor > local (6)\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m27/079cb7\u001B[0;2m] \u001B[0;2mNFC…N_CV:\u001B[mLOAD_RESPONSE\u001B[33;2m (\u001B[0;33mTOYv1\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…AL:RUN_CV:\u001B[mLOAD_CS_RESPONSE -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/913635\u001B[0;2m] \u001B[0;2mNFC…EVAL:RUN_CV:\u001B[mCV_SPLIT\u001B[33;2m (\u001B[0;33mLCO\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mad/5338f4\u001B[0;2m] \u001B[0;2m\u001B[mNFC…ODELS\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 0 of 1\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mb2/7bcc8d\u001B[0;2m] \u001B[0;2m\u001B[mNFC…LINES\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m63/47686a\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NaiveMeanEffectsPredictor)\u001B[2m |\u001B[m 2 of 2\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…UN_CV:\u001B[mTRAIN_AND_PREDICT_CV -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…L:RUN_CV:\u001B[mEVALUATE_FIND_MAX -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…MODEL_TESTING:\u001B[mPREDICT_FULL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…:MODEL_TESTING:\u001B[mFINAL_SPLIT -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…L_TESTING:\u001B[mTUNE_FINAL_MODEL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…NG:\u001B[mEVALUATE_FIND_MAX_FINAL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mTRAIN_FINAL_MODEL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…ESTING:\u001B[mCONSOLIDATE_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…DEL_TESTING:\u001B[mEVALUATE_FINAL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…EL_TESTING:\u001B[mCOLLECT_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mVISUALIZE_RESULTS -\u001B[K\r\n", + "\u001B[33mWARN: Task runtime metrics are not reported when using macOS without a container engine\u001B[39m\u001B[K\r\n", + "\u001B[20A\r\n", + "\u001B[2mexecutor > local (8)\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m27/079cb7\u001B[0;2m] \u001B[0;2mNFC…N_CV:\u001B[mLOAD_RESPONSE\u001B[33;2m (\u001B[0;33mTOYv1\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…AL:RUN_CV:\u001B[mLOAD_CS_RESPONSE -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/913635\u001B[0;2m] \u001B[0;2mNFC…EVAL:RUN_CV:\u001B[mCV_SPLIT\u001B[33;2m (\u001B[0;33mLCO\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mad/5338f4\u001B[0;2m] \u001B[0;2m\u001B[mNFC…ODELS\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mb2/7bcc8d\u001B[0;2m] \u001B[0;2m\u001B[mNFC…LINES\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m63/47686a\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NaiveMeanEffectsPredictor)\u001B[2m |\u001B[m 2 of 2\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mf1/bb510f\u001B[0;2m] \u001B[0;2mNFC…(ElasticNet_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 0 of 4\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…L:RUN_CV:\u001B[mEVALUATE_FIND_MAX -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…MODEL_TESTING:\u001B[mPREDICT_FULL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/e49514\u001B[0;2m] \u001B[0;2m\u001B[mNFC…\u001B[33;2m (\u001B[0;33mElasticNet_LCO_gpu:null\u001B[2m)\u001B[m\u001B[2m |\u001B[m 0 of 1\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…L_TESTING:\u001B[mTUNE_FINAL_MODEL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…NG:\u001B[mEVALUATE_FIND_MAX_FINAL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mTRAIN_FINAL_MODEL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…ESTING:\u001B[mCONSOLIDATE_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…DEL_TESTING:\u001B[mEVALUATE_FINAL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…EL_TESTING:\u001B[mCOLLECT_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mVISUALIZE_RESULTS -\u001B[K\r\n", + "\u001B[33mWARN: Task runtime metrics are not reported when using macOS without a container engine\u001B[39m\u001B[K\r\n", + "\u001B[20A\r\n", + "\u001B[2mexecutor > local (10)\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m27/079cb7\u001B[0;2m] \u001B[0;2mNFC…N_CV:\u001B[mLOAD_RESPONSE\u001B[33;2m (\u001B[0;33mTOYv1\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…AL:RUN_CV:\u001B[mLOAD_CS_RESPONSE -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/913635\u001B[0;2m] \u001B[0;2mNFC…EVAL:RUN_CV:\u001B[mCV_SPLIT\u001B[33;2m (\u001B[0;33mLCO\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mad/5338f4\u001B[0;2m] \u001B[0;2m\u001B[mNFC…ODELS\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mb2/7bcc8d\u001B[0;2m] \u001B[0;2m\u001B[mNFC…LINES\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m63/47686a\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NaiveMeanEffectsPredictor)\u001B[2m |\u001B[m 2 of 2\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m27/a2a98f\u001B[0;2m] \u001B[0;2mNFC…(ElasticNet_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 1 of 4\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…L:RUN_CV:\u001B[mEVALUATE_FIND_MAX -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…MODEL_TESTING:\u001B[mPREDICT_FULL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/e49514\u001B[0;2m] \u001B[0;2m\u001B[mNFC…\u001B[33;2m (\u001B[0;33mElasticNet_LCO_gpu:null\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…L_TESTING:\u001B[mTUNE_FINAL_MODEL\u001B[2m |\u001B[m 0 of 1\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…NG:\u001B[mEVALUATE_FIND_MAX_FINAL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mTRAIN_FINAL_MODEL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…ESTING:\u001B[mCONSOLIDATE_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…DEL_TESTING:\u001B[mEVALUATE_FINAL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…EL_TESTING:\u001B[mCOLLECT_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mVISUALIZE_RESULTS -\u001B[K\r\n", + "\u001B[K\r\n", + "\u001B[20A\r\n", + "\u001B[2mexecutor > local (10)\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m27/079cb7\u001B[0;2m] \u001B[0;2mNFC…N_CV:\u001B[mLOAD_RESPONSE\u001B[33;2m (\u001B[0;33mTOYv1\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…AL:RUN_CV:\u001B[mLOAD_CS_RESPONSE -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/913635\u001B[0;2m] \u001B[0;2mNFC…EVAL:RUN_CV:\u001B[mCV_SPLIT\u001B[33;2m (\u001B[0;33mLCO\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mad/5338f4\u001B[0;2m] \u001B[0;2m\u001B[mNFC…ODELS\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mb2/7bcc8d\u001B[0;2m] \u001B[0;2m\u001B[mNFC…LINES\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m63/47686a\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NaiveMeanEffectsPredictor)\u001B[2m |\u001B[m 2 of 2\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m27/a2a98f\u001B[0;2m] \u001B[0;2mNFC…(ElasticNet_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 1 of 4\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…L:RUN_CV:\u001B[mEVALUATE_FIND_MAX -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…MODEL_TESTING:\u001B[mPREDICT_FULL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/e49514\u001B[0;2m] \u001B[0;2m\u001B[mNFC…\u001B[33;2m (\u001B[0;33mElasticNet_LCO_gpu:null\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…L_TESTING:\u001B[mTUNE_FINAL_MODEL\u001B[2m |\u001B[m 0 of 1\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…NG:\u001B[mEVALUATE_FIND_MAX_FINAL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mTRAIN_FINAL_MODEL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…ESTING:\u001B[mCONSOLIDATE_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…DEL_TESTING:\u001B[mEVALUATE_FINAL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…EL_TESTING:\u001B[mCOLLECT_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mVISUALIZE_RESULTS -\u001B[K\r\n", + "\u001B[K\r\n", + "\u001B[20A\r\n", + "\u001B[2mexecutor > local (12)\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m27/079cb7\u001B[0;2m] \u001B[0;2mNFC…N_CV:\u001B[mLOAD_RESPONSE\u001B[33;2m (\u001B[0;33mTOYv1\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…AL:RUN_CV:\u001B[mLOAD_CS_RESPONSE -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/913635\u001B[0;2m] \u001B[0;2mNFC…EVAL:RUN_CV:\u001B[mCV_SPLIT\u001B[33;2m (\u001B[0;33mLCO\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mad/5338f4\u001B[0;2m] \u001B[0;2m\u001B[mNFC…ODELS\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mb2/7bcc8d\u001B[0;2m] \u001B[0;2m\u001B[mNFC…LINES\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m63/47686a\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NaiveMeanEffectsPredictor)\u001B[2m |\u001B[m 2 of 2\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m7a/2322ea\u001B[0;2m] \u001B[0;2mNFC…tsPredictor_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 3 of 4\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…L:RUN_CV:\u001B[mEVALUATE_FIND_MAX -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…MODEL_TESTING:\u001B[mPREDICT_FULL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/e49514\u001B[0;2m] \u001B[0;2m\u001B[mNFC…\u001B[33;2m (\u001B[0;33mElasticNet_LCO_gpu:null\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34ma1/0aef18\u001B[0;2m] \u001B[0;2mNFC…(ElasticNet_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 0 of 1\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…NG:\u001B[mEVALUATE_FIND_MAX_FINAL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mTRAIN_FINAL_MODEL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…ESTING:\u001B[mCONSOLIDATE_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…DEL_TESTING:\u001B[mEVALUATE_FINAL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…EL_TESTING:\u001B[mCOLLECT_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mVISUALIZE_RESULTS -\u001B[K\r\n", + "\u001B[19A\r\n", + "\u001B[2mexecutor > local (12)\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m27/079cb7\u001B[0;2m] \u001B[0;2mNFC…N_CV:\u001B[mLOAD_RESPONSE\u001B[33;2m (\u001B[0;33mTOYv1\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…AL:RUN_CV:\u001B[mLOAD_CS_RESPONSE -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/913635\u001B[0;2m] \u001B[0;2mNFC…EVAL:RUN_CV:\u001B[mCV_SPLIT\u001B[33;2m (\u001B[0;33mLCO\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mad/5338f4\u001B[0;2m] \u001B[0;2m\u001B[mNFC…ODELS\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mb2/7bcc8d\u001B[0;2m] \u001B[0;2m\u001B[mNFC…LINES\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m63/47686a\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NaiveMeanEffectsPredictor)\u001B[2m |\u001B[m 2 of 2\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m7a/2322ea\u001B[0;2m] \u001B[0;2mNFC…tsPredictor_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 3 of 4\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…L:RUN_CV:\u001B[mEVALUATE_FIND_MAX -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…MODEL_TESTING:\u001B[mPREDICT_FULL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/e49514\u001B[0;2m] \u001B[0;2m\u001B[mNFC…\u001B[33;2m (\u001B[0;33mElasticNet_LCO_gpu:null\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34ma1/0aef18\u001B[0;2m] \u001B[0;2mNFC…(ElasticNet_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 0 of 1\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…NG:\u001B[mEVALUATE_FIND_MAX_FINAL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mTRAIN_FINAL_MODEL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…ESTING:\u001B[mCONSOLIDATE_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…DEL_TESTING:\u001B[mEVALUATE_FINAL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…EL_TESTING:\u001B[mCOLLECT_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mVISUALIZE_RESULTS -\u001B[K\r\n", + "\u001B[19A\r\n", + "\u001B[2mexecutor > local (14)\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m27/079cb7\u001B[0;2m] \u001B[0;2mNFC…N_CV:\u001B[mLOAD_RESPONSE\u001B[33;2m (\u001B[0;33mTOYv1\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…AL:RUN_CV:\u001B[mLOAD_CS_RESPONSE -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/913635\u001B[0;2m] \u001B[0;2mNFC…EVAL:RUN_CV:\u001B[mCV_SPLIT\u001B[33;2m (\u001B[0;33mLCO\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mad/5338f4\u001B[0;2m] \u001B[0;2m\u001B[mNFC…ODELS\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mb2/7bcc8d\u001B[0;2m] \u001B[0;2m\u001B[mNFC…LINES\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m63/47686a\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NaiveMeanEffectsPredictor)\u001B[2m |\u001B[m 2 of 2\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m7a/2322ea\u001B[0;2m] \u001B[0;2mNFC…tsPredictor_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m69/df82e0\u001B[0;2m] \u001B[0;2m\u001B[mNFC…nEffectsPredictor_split_0)\u001B[2m |\u001B[m 0 of 4\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…MODEL_TESTING:\u001B[mPREDICT_FULL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/e49514\u001B[0;2m] \u001B[0;2m\u001B[mNFC…\u001B[33;2m (\u001B[0;33mElasticNet_LCO_gpu:null\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34ma1/0aef18\u001B[0;2m] \u001B[0;2mNFC…(ElasticNet_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…NG:\u001B[mEVALUATE_FIND_MAX_FINAL\u001B[2m |\u001B[m 0 of 1\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mTRAIN_FINAL_MODEL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…ESTING:\u001B[mCONSOLIDATE_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…DEL_TESTING:\u001B[mEVALUATE_FINAL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…EL_TESTING:\u001B[mCOLLECT_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mVISUALIZE_RESULTS -\u001B[K\r\n", + "\u001B[33mWARN: Task runtime metrics are not reported when using macOS without a container engine\u001B[39m\u001B[K\r\n", + "\u001B[20A\r\n", + "\u001B[2mexecutor > local (14)\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m27/079cb7\u001B[0;2m] \u001B[0;2mNFC…N_CV:\u001B[mLOAD_RESPONSE\u001B[33;2m (\u001B[0;33mTOYv1\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…AL:RUN_CV:\u001B[mLOAD_CS_RESPONSE -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/913635\u001B[0;2m] \u001B[0;2mNFC…EVAL:RUN_CV:\u001B[mCV_SPLIT\u001B[33;2m (\u001B[0;33mLCO\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mad/5338f4\u001B[0;2m] \u001B[0;2m\u001B[mNFC…ODELS\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mb2/7bcc8d\u001B[0;2m] \u001B[0;2m\u001B[mNFC…LINES\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m63/47686a\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NaiveMeanEffectsPredictor)\u001B[2m |\u001B[m 2 of 2\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m7a/2322ea\u001B[0;2m] \u001B[0;2mNFC…tsPredictor_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m69/df82e0\u001B[0;2m] \u001B[0;2m\u001B[mNFC…nEffectsPredictor_split_0)\u001B[2m |\u001B[m 0 of 4\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…MODEL_TESTING:\u001B[mPREDICT_FULL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/e49514\u001B[0;2m] \u001B[0;2m\u001B[mNFC…\u001B[33;2m (\u001B[0;33mElasticNet_LCO_gpu:null\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34ma1/0aef18\u001B[0;2m] \u001B[0;2mNFC…(ElasticNet_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…NG:\u001B[mEVALUATE_FIND_MAX_FINAL\u001B[2m |\u001B[m 0 of 1\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mTRAIN_FINAL_MODEL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…ESTING:\u001B[mCONSOLIDATE_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…DEL_TESTING:\u001B[mEVALUATE_FINAL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…EL_TESTING:\u001B[mCOLLECT_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mVISUALIZE_RESULTS -\u001B[K\r\n", + "\u001B[33mWARN: Task runtime metrics are not reported when using macOS without a container engine\u001B[39m\u001B[K\r\n", + "\u001B[20A\r\n", + "\u001B[2mexecutor > local (16)\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m27/079cb7\u001B[0;2m] \u001B[0;2mNFC…N_CV:\u001B[mLOAD_RESPONSE\u001B[33;2m (\u001B[0;33mTOYv1\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…AL:RUN_CV:\u001B[mLOAD_CS_RESPONSE -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/913635\u001B[0;2m] \u001B[0;2mNFC…EVAL:RUN_CV:\u001B[mCV_SPLIT\u001B[33;2m (\u001B[0;33mLCO\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mad/5338f4\u001B[0;2m] \u001B[0;2m\u001B[mNFC…ODELS\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mb2/7bcc8d\u001B[0;2m] \u001B[0;2m\u001B[mNFC…LINES\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m63/47686a\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NaiveMeanEffectsPredictor)\u001B[2m |\u001B[m 2 of 2\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m7a/2322ea\u001B[0;2m] \u001B[0;2mNFC…tsPredictor_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m92/07ac22\u001B[0;2m] \u001B[0;2m\u001B[mNFC…X\u001B[33;2m (\u001B[0;33mLCO_ElasticNet_split_1\u001B[2m)\u001B[m\u001B[2m |\u001B[m 2 of 4\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…MODEL_TESTING:\u001B[mPREDICT_FULL\u001B[2m |\u001B[m 0 of 2\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/e49514\u001B[0;2m] \u001B[0;2m\u001B[mNFC…\u001B[33;2m (\u001B[0;33mElasticNet_LCO_gpu:null\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34ma1/0aef18\u001B[0;2m] \u001B[0;2mNFC…(ElasticNet_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…NG:\u001B[mEVALUATE_FIND_MAX_FINAL\u001B[2m |\u001B[m 0 of 1\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mTRAIN_FINAL_MODEL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…ESTING:\u001B[mCONSOLIDATE_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…DEL_TESTING:\u001B[mEVALUATE_FINAL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…EL_TESTING:\u001B[mCOLLECT_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mVISUALIZE_RESULTS -\u001B[K\r\n", + "\u001B[33mWARN: Task runtime metrics are not reported when using macOS without a container engine\u001B[39m\u001B[K\r\n", + "\u001B[20A\r\n", + "\u001B[2mexecutor > local (18)\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m27/079cb7\u001B[0;2m] \u001B[0;2mNFC…N_CV:\u001B[mLOAD_RESPONSE\u001B[33;2m (\u001B[0;33mTOYv1\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…AL:RUN_CV:\u001B[mLOAD_CS_RESPONSE -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/913635\u001B[0;2m] \u001B[0;2mNFC…EVAL:RUN_CV:\u001B[mCV_SPLIT\u001B[33;2m (\u001B[0;33mLCO\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mad/5338f4\u001B[0;2m] \u001B[0;2m\u001B[mNFC…ODELS\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mb2/7bcc8d\u001B[0;2m] \u001B[0;2m\u001B[mNFC…LINES\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m63/47686a\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NaiveMeanEffectsPredictor)\u001B[2m |\u001B[m 2 of 2\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m7a/2322ea\u001B[0;2m] \u001B[0;2mNFC…tsPredictor_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m4f/fdff95\u001B[0;2m] \u001B[0;2m\u001B[mNFC…nEffectsPredictor_split_1)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mc8/0c3828\u001B[0;2m] \u001B[0;2mNFC…edictor_split_0_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 0 of 4\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/e49514\u001B[0;2m] \u001B[0;2m\u001B[mNFC…\u001B[33;2m (\u001B[0;33mElasticNet_LCO_gpu:null\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34ma1/0aef18\u001B[0;2m] \u001B[0;2mNFC…(ElasticNet_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m85/69a140\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NAL\u001B[33;2m (\u001B[0;33mLCO_ElasticNet_final\u001B[2m)\u001B[m\u001B[2m |\u001B[m 0 of 1\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mTRAIN_FINAL_MODEL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…ESTING:\u001B[mCONSOLIDATE_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…DEL_TESTING:\u001B[mEVALUATE_FINAL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…EL_TESTING:\u001B[mCOLLECT_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mVISUALIZE_RESULTS -\u001B[K\r\n", + "\u001B[33mWARN: Task runtime metrics are not reported when using macOS without a container engine\u001B[39m\u001B[K\r\n", + "\u001B[20A\r\n", + "\u001B[2mexecutor > local (18)\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m27/079cb7\u001B[0;2m] \u001B[0;2mNFC…N_CV:\u001B[mLOAD_RESPONSE\u001B[33;2m (\u001B[0;33mTOYv1\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…AL:RUN_CV:\u001B[mLOAD_CS_RESPONSE -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/913635\u001B[0;2m] \u001B[0;2mNFC…EVAL:RUN_CV:\u001B[mCV_SPLIT\u001B[33;2m (\u001B[0;33mLCO\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mad/5338f4\u001B[0;2m] \u001B[0;2m\u001B[mNFC…ODELS\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mb2/7bcc8d\u001B[0;2m] \u001B[0;2m\u001B[mNFC…LINES\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m63/47686a\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NaiveMeanEffectsPredictor)\u001B[2m |\u001B[m 2 of 2\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m7a/2322ea\u001B[0;2m] \u001B[0;2mNFC…tsPredictor_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m4f/fdff95\u001B[0;2m] \u001B[0;2m\u001B[mNFC…nEffectsPredictor_split_1)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mc8/0c3828\u001B[0;2m] \u001B[0;2mNFC…edictor_split_0_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 0 of 4\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/e49514\u001B[0;2m] \u001B[0;2m\u001B[mNFC…\u001B[33;2m (\u001B[0;33mElasticNet_LCO_gpu:null\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34ma1/0aef18\u001B[0;2m] \u001B[0;2mNFC…(ElasticNet_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m85/69a140\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NAL\u001B[33;2m (\u001B[0;33mLCO_ElasticNet_final\u001B[2m)\u001B[m\u001B[2m |\u001B[m 0 of 1\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mTRAIN_FINAL_MODEL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…ESTING:\u001B[mCONSOLIDATE_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…DEL_TESTING:\u001B[mEVALUATE_FINAL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…EL_TESTING:\u001B[mCOLLECT_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mVISUALIZE_RESULTS -\u001B[K\r\n", + "\u001B[33mWARN: Task runtime metrics are not reported when using macOS without a container engine\u001B[39m\u001B[K\r\n", + "\u001B[20A\r\n", + "\u001B[2mexecutor > local (19)\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m27/079cb7\u001B[0;2m] \u001B[0;2mNFC…N_CV:\u001B[mLOAD_RESPONSE\u001B[33;2m (\u001B[0;33mTOYv1\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…AL:RUN_CV:\u001B[mLOAD_CS_RESPONSE -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/913635\u001B[0;2m] \u001B[0;2mNFC…EVAL:RUN_CV:\u001B[mCV_SPLIT\u001B[33;2m (\u001B[0;33mLCO\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mad/5338f4\u001B[0;2m] \u001B[0;2m\u001B[mNFC…ODELS\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mb2/7bcc8d\u001B[0;2m] \u001B[0;2m\u001B[mNFC…LINES\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m63/47686a\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NaiveMeanEffectsPredictor)\u001B[2m |\u001B[m 2 of 2\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m7a/2322ea\u001B[0;2m] \u001B[0;2mNFC…tsPredictor_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m4f/fdff95\u001B[0;2m] \u001B[0;2m\u001B[mNFC…nEffectsPredictor_split_1)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mc6/52c44e\u001B[0;2m] \u001B[0;2mNFC…sticNet_split_0_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 0 of 4\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/e49514\u001B[0;2m] \u001B[0;2m\u001B[mNFC…\u001B[33;2m (\u001B[0;33mElasticNet_LCO_gpu:null\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34ma1/0aef18\u001B[0;2m] \u001B[0;2mNFC…(ElasticNet_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m85/69a140\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NAL\u001B[33;2m (\u001B[0;33mLCO_ElasticNet_final\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mTRAIN_FINAL_MODEL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…ESTING:\u001B[mCONSOLIDATE_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…DEL_TESTING:\u001B[mEVALUATE_FINAL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…EL_TESTING:\u001B[mCOLLECT_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mVISUALIZE_RESULTS -\u001B[K\r\n", + "\u001B[33mWARN: Task runtime metrics are not reported when using macOS without a container engine\u001B[39m\u001B[K\r\n", + "\u001B[20A\r\n", + "\u001B[2mexecutor > local (19)\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m27/079cb7\u001B[0;2m] \u001B[0;2mNFC…N_CV:\u001B[mLOAD_RESPONSE\u001B[33;2m (\u001B[0;33mTOYv1\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…AL:RUN_CV:\u001B[mLOAD_CS_RESPONSE -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/913635\u001B[0;2m] \u001B[0;2mNFC…EVAL:RUN_CV:\u001B[mCV_SPLIT\u001B[33;2m (\u001B[0;33mLCO\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mad/5338f4\u001B[0;2m] \u001B[0;2m\u001B[mNFC…ODELS\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mb2/7bcc8d\u001B[0;2m] \u001B[0;2m\u001B[mNFC…LINES\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m63/47686a\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NaiveMeanEffectsPredictor)\u001B[2m |\u001B[m 2 of 2\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m7a/2322ea\u001B[0;2m] \u001B[0;2mNFC…tsPredictor_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m4f/fdff95\u001B[0;2m] \u001B[0;2m\u001B[mNFC…nEffectsPredictor_split_1)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mc6/52c44e\u001B[0;2m] \u001B[0;2mNFC…sticNet_split_0_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 0 of 4\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/e49514\u001B[0;2m] \u001B[0;2m\u001B[mNFC…\u001B[33;2m (\u001B[0;33mElasticNet_LCO_gpu:null\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34ma1/0aef18\u001B[0;2m] \u001B[0;2mNFC…(ElasticNet_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m85/69a140\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NAL\u001B[33;2m (\u001B[0;33mLCO_ElasticNet_final\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mTRAIN_FINAL_MODEL\u001B[2m |\u001B[m 0 of 1\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…ESTING:\u001B[mCONSOLIDATE_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…DEL_TESTING:\u001B[mEVALUATE_FINAL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…EL_TESTING:\u001B[mCOLLECT_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mVISUALIZE_RESULTS -\u001B[K\r\n", + "\u001B[33mWARN: Task runtime metrics are not reported when using macOS without a container engine\u001B[39m\u001B[K\r\n", + "\u001B[20A\r\n", + "\u001B[2mexecutor > local (20)\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m27/079cb7\u001B[0;2m] \u001B[0;2mNFC…N_CV:\u001B[mLOAD_RESPONSE\u001B[33;2m (\u001B[0;33mTOYv1\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…AL:RUN_CV:\u001B[mLOAD_CS_RESPONSE -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/913635\u001B[0;2m] \u001B[0;2mNFC…EVAL:RUN_CV:\u001B[mCV_SPLIT\u001B[33;2m (\u001B[0;33mLCO\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mad/5338f4\u001B[0;2m] \u001B[0;2m\u001B[mNFC…ODELS\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mb2/7bcc8d\u001B[0;2m] \u001B[0;2m\u001B[mNFC…LINES\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m63/47686a\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NaiveMeanEffectsPredictor)\u001B[2m |\u001B[m 2 of 2\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m7a/2322ea\u001B[0;2m] \u001B[0;2mNFC…tsPredictor_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m4f/fdff95\u001B[0;2m] \u001B[0;2m\u001B[mNFC…nEffectsPredictor_split_1)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m19/5fbc2f\u001B[0;2m] \u001B[0;2mNFC…edictor_split_1_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 0 of 4\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/e49514\u001B[0;2m] \u001B[0;2m\u001B[mNFC…\u001B[33;2m (\u001B[0;33mElasticNet_LCO_gpu:null\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34ma1/0aef18\u001B[0;2m] \u001B[0;2mNFC…(ElasticNet_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m85/69a140\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NAL\u001B[33;2m (\u001B[0;33mLCO_ElasticNet_final\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mTRAIN_FINAL_MODEL\u001B[2m |\u001B[m 0 of 1\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…ESTING:\u001B[mCONSOLIDATE_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…DEL_TESTING:\u001B[mEVALUATE_FINAL -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…EL_TESTING:\u001B[mCOLLECT_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mVISUALIZE_RESULTS -\u001B[K\r\n", + "\u001B[33mWARN: Task runtime metrics are not reported when using macOS without a container engine\u001B[39m\u001B[K\r\n", + "\u001B[20A\r\n", + "\u001B[2mexecutor > local (20)\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m27/079cb7\u001B[0;2m] \u001B[0;2mNFC…N_CV:\u001B[mLOAD_RESPONSE\u001B[33;2m (\u001B[0;33mTOYv1\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…AL:RUN_CV:\u001B[mLOAD_CS_RESPONSE -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/913635\u001B[0;2m] \u001B[0;2mNFC…EVAL:RUN_CV:\u001B[mCV_SPLIT\u001B[33;2m (\u001B[0;33mLCO\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mad/5338f4\u001B[0;2m] \u001B[0;2m\u001B[mNFC…ODELS\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mb2/7bcc8d\u001B[0;2m] \u001B[0;2m\u001B[mNFC…LINES\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m63/47686a\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NaiveMeanEffectsPredictor)\u001B[2m |\u001B[m 2 of 2\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m7a/2322ea\u001B[0;2m] \u001B[0;2mNFC…tsPredictor_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m4f/fdff95\u001B[0;2m] \u001B[0;2m\u001B[mNFC…nEffectsPredictor_split_1)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mc8/0c3828\u001B[0;2m] \u001B[0;2mNFC…edictor_split_0_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 1 of 4\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/e49514\u001B[0;2m] \u001B[0;2m\u001B[mNFC…\u001B[33;2m (\u001B[0;33mElasticNet_LCO_gpu:null\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34ma1/0aef18\u001B[0;2m] \u001B[0;2mNFC…(ElasticNet_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m85/69a140\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NAL\u001B[33;2m (\u001B[0;33mLCO_ElasticNet_final\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mTRAIN_FINAL_MODEL\u001B[2m |\u001B[m 0 of 1\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…ESTING:\u001B[mCONSOLIDATE_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…DEL_TESTING:\u001B[mEVALUATE_FINAL\u001B[2m |\u001B[m 0 of 1\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…EL_TESTING:\u001B[mCOLLECT_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mVISUALIZE_RESULTS -\u001B[K\r\n", + "\u001B[33mWARN: Task runtime metrics are not reported when using macOS without a container engine\u001B[39m\u001B[K\r\n", + "\u001B[20A\r\n", + "\u001B[2mexecutor > local (21)\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m27/079cb7\u001B[0;2m] \u001B[0;2mNFC…N_CV:\u001B[mLOAD_RESPONSE\u001B[33;2m (\u001B[0;33mTOYv1\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…AL:RUN_CV:\u001B[mLOAD_CS_RESPONSE -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/913635\u001B[0;2m] \u001B[0;2mNFC…EVAL:RUN_CV:\u001B[mCV_SPLIT\u001B[33;2m (\u001B[0;33mLCO\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mad/5338f4\u001B[0;2m] \u001B[0;2m\u001B[mNFC…ODELS\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mb2/7bcc8d\u001B[0;2m] \u001B[0;2m\u001B[mNFC…LINES\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m63/47686a\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NaiveMeanEffectsPredictor)\u001B[2m |\u001B[m 2 of 2\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m7a/2322ea\u001B[0;2m] \u001B[0;2mNFC…tsPredictor_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m4f/fdff95\u001B[0;2m] \u001B[0;2m\u001B[mNFC…nEffectsPredictor_split_1)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mc6/52c44e\u001B[0;2m] \u001B[0;2mNFC…sticNet_split_0_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 2 of 4\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/e49514\u001B[0;2m] \u001B[0;2m\u001B[mNFC…\u001B[33;2m (\u001B[0;33mElasticNet_LCO_gpu:null\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34ma1/0aef18\u001B[0;2m] \u001B[0;2mNFC…(ElasticNet_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m85/69a140\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NAL\u001B[33;2m (\u001B[0;33mLCO_ElasticNet_final\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mTRAIN_FINAL_MODEL\u001B[2m |\u001B[m 0 of 1\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…ESTING:\u001B[mCONSOLIDATE_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…DEL_TESTING:\u001B[mEVALUATE_FINAL\u001B[2m |\u001B[m 0 of 2\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…EL_TESTING:\u001B[mCOLLECT_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mVISUALIZE_RESULTS -\u001B[K\r\n", + "\u001B[33mWARN: Task runtime metrics are not reported when using macOS without a container engine\u001B[39m\u001B[K\r\n", + "\u001B[20A\r\n", + "\u001B[2mexecutor > local (21)\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m27/079cb7\u001B[0;2m] \u001B[0;2mNFC…N_CV:\u001B[mLOAD_RESPONSE\u001B[33;2m (\u001B[0;33mTOYv1\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…AL:RUN_CV:\u001B[mLOAD_CS_RESPONSE -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/913635\u001B[0;2m] \u001B[0;2mNFC…EVAL:RUN_CV:\u001B[mCV_SPLIT\u001B[33;2m (\u001B[0;33mLCO\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mad/5338f4\u001B[0;2m] \u001B[0;2m\u001B[mNFC…ODELS\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mb2/7bcc8d\u001B[0;2m] \u001B[0;2m\u001B[mNFC…LINES\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m63/47686a\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NaiveMeanEffectsPredictor)\u001B[2m |\u001B[m 2 of 2\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m7a/2322ea\u001B[0;2m] \u001B[0;2mNFC…tsPredictor_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m4f/fdff95\u001B[0;2m] \u001B[0;2m\u001B[mNFC…nEffectsPredictor_split_1)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mc6/52c44e\u001B[0;2m] \u001B[0;2mNFC…sticNet_split_0_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 2 of 4\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/e49514\u001B[0;2m] \u001B[0;2m\u001B[mNFC…\u001B[33;2m (\u001B[0;33mElasticNet_LCO_gpu:null\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34ma1/0aef18\u001B[0;2m] \u001B[0;2mNFC…(ElasticNet_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m85/69a140\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NAL\u001B[33;2m (\u001B[0;33mLCO_ElasticNet_final\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mTRAIN_FINAL_MODEL\u001B[2m |\u001B[m 0 of 1\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…ESTING:\u001B[mCONSOLIDATE_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…DEL_TESTING:\u001B[mEVALUATE_FINAL\u001B[2m |\u001B[m 0 of 2\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…EL_TESTING:\u001B[mCOLLECT_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mVISUALIZE_RESULTS -\u001B[K\r\n", + "\u001B[33mWARN: Task runtime metrics are not reported when using macOS without a container engine\u001B[39m\u001B[K\r\n", + "\u001B[20A\r\n", + "\u001B[2mexecutor > local (22)\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m27/079cb7\u001B[0;2m] \u001B[0;2mNFC…N_CV:\u001B[mLOAD_RESPONSE\u001B[33;2m (\u001B[0;33mTOYv1\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…AL:RUN_CV:\u001B[mLOAD_CS_RESPONSE -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/913635\u001B[0;2m] \u001B[0;2mNFC…EVAL:RUN_CV:\u001B[mCV_SPLIT\u001B[33;2m (\u001B[0;33mLCO\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mad/5338f4\u001B[0;2m] \u001B[0;2m\u001B[mNFC…ODELS\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mb2/7bcc8d\u001B[0;2m] \u001B[0;2m\u001B[mNFC…LINES\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m63/47686a\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NaiveMeanEffectsPredictor)\u001B[2m |\u001B[m 2 of 2\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m7a/2322ea\u001B[0;2m] \u001B[0;2mNFC…tsPredictor_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m4f/fdff95\u001B[0;2m] \u001B[0;2m\u001B[mNFC…nEffectsPredictor_split_1)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mc6/52c44e\u001B[0;2m] \u001B[0;2mNFC…sticNet_split_0_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 2 of 4\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/e49514\u001B[0;2m] \u001B[0;2m\u001B[mNFC…\u001B[33;2m (\u001B[0;33mElasticNet_LCO_gpu:null\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34ma1/0aef18\u001B[0;2m] \u001B[0;2mNFC…(ElasticNet_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m85/69a140\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NAL\u001B[33;2m (\u001B[0;33mLCO_ElasticNet_final\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mad/df8c4a\u001B[0;2m] \u001B[0;2mNFC…(ElasticNet_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 0 of 1\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…ESTING:\u001B[mCONSOLIDATE_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…DEL_TESTING:\u001B[mEVALUATE_FINAL\u001B[2m |\u001B[m 0 of 2\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…EL_TESTING:\u001B[mCOLLECT_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mVISUALIZE_RESULTS -\u001B[K\r\n", + "\u001B[K\r\n", + "\u001B[20A\r\n", + "\u001B[2mexecutor > local (22)\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m27/079cb7\u001B[0;2m] \u001B[0;2mNFC…N_CV:\u001B[mLOAD_RESPONSE\u001B[33;2m (\u001B[0;33mTOYv1\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…AL:RUN_CV:\u001B[mLOAD_CS_RESPONSE -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/913635\u001B[0;2m] \u001B[0;2mNFC…EVAL:RUN_CV:\u001B[mCV_SPLIT\u001B[33;2m (\u001B[0;33mLCO\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mad/5338f4\u001B[0;2m] \u001B[0;2m\u001B[mNFC…ODELS\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mb2/7bcc8d\u001B[0;2m] \u001B[0;2m\u001B[mNFC…LINES\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m63/47686a\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NaiveMeanEffectsPredictor)\u001B[2m |\u001B[m 2 of 2\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m7a/2322ea\u001B[0;2m] \u001B[0;2mNFC…tsPredictor_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m4f/fdff95\u001B[0;2m] \u001B[0;2m\u001B[mNFC…nEffectsPredictor_split_1)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m19/5fbc2f\u001B[0;2m] \u001B[0;2mNFC…edictor_split_1_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 3 of 4\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/e49514\u001B[0;2m] \u001B[0;2m\u001B[mNFC…\u001B[33;2m (\u001B[0;33mElasticNet_LCO_gpu:null\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34ma1/0aef18\u001B[0;2m] \u001B[0;2mNFC…(ElasticNet_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m85/69a140\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NAL\u001B[33;2m (\u001B[0;33mLCO_ElasticNet_final\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mad/df8c4a\u001B[0;2m] \u001B[0;2mNFC…(ElasticNet_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 0 of 1\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…ESTING:\u001B[mCONSOLIDATE_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…DEL_TESTING:\u001B[mEVALUATE_FINAL\u001B[2m |\u001B[m 0 of 3\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…EL_TESTING:\u001B[mCOLLECT_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mVISUALIZE_RESULTS -\u001B[K\r\n", + "\u001B[K\r\n", + "\u001B[20A\r\n", + "\u001B[2mexecutor > local (23)\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m27/079cb7\u001B[0;2m] \u001B[0;2mNFC…N_CV:\u001B[mLOAD_RESPONSE\u001B[33;2m (\u001B[0;33mTOYv1\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…AL:RUN_CV:\u001B[mLOAD_CS_RESPONSE -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/913635\u001B[0;2m] \u001B[0;2mNFC…EVAL:RUN_CV:\u001B[mCV_SPLIT\u001B[33;2m (\u001B[0;33mLCO\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mad/5338f4\u001B[0;2m] \u001B[0;2m\u001B[mNFC…ODELS\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mb2/7bcc8d\u001B[0;2m] \u001B[0;2m\u001B[mNFC…LINES\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m63/47686a\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NaiveMeanEffectsPredictor)\u001B[2m |\u001B[m 2 of 2\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m7a/2322ea\u001B[0;2m] \u001B[0;2mNFC…tsPredictor_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m4f/fdff95\u001B[0;2m] \u001B[0;2m\u001B[mNFC…nEffectsPredictor_split_1)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m19/5fbc2f\u001B[0;2m] \u001B[0;2mNFC…edictor_split_1_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 3 of 4\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/e49514\u001B[0;2m] \u001B[0;2m\u001B[mNFC…\u001B[33;2m (\u001B[0;33mElasticNet_LCO_gpu:null\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34ma1/0aef18\u001B[0;2m] \u001B[0;2mNFC…(ElasticNet_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m85/69a140\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NAL\u001B[33;2m (\u001B[0;33mLCO_ElasticNet_final\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mad/df8c4a\u001B[0;2m] \u001B[0;2mNFC…(ElasticNet_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 0 of 1\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…ESTING:\u001B[mCONSOLIDATE_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m4f/19bdb7\u001B[0;2m] \u001B[0;2m\u001B[mNFC…r_predictions_split_0.csv)\u001B[2m |\u001B[m 0 of 3\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…EL_TESTING:\u001B[mCOLLECT_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mVISUALIZE_RESULTS -\u001B[K\r\n", + "\u001B[19A\r\n", + "\u001B[2mexecutor > local (23)\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m27/079cb7\u001B[0;2m] \u001B[0;2mNFC…N_CV:\u001B[mLOAD_RESPONSE\u001B[33;2m (\u001B[0;33mTOYv1\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…AL:RUN_CV:\u001B[mLOAD_CS_RESPONSE -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/913635\u001B[0;2m] \u001B[0;2mNFC…EVAL:RUN_CV:\u001B[mCV_SPLIT\u001B[33;2m (\u001B[0;33mLCO\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mad/5338f4\u001B[0;2m] \u001B[0;2m\u001B[mNFC…ODELS\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mb2/7bcc8d\u001B[0;2m] \u001B[0;2m\u001B[mNFC…LINES\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m63/47686a\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NaiveMeanEffectsPredictor)\u001B[2m |\u001B[m 2 of 2\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m7a/2322ea\u001B[0;2m] \u001B[0;2mNFC…tsPredictor_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m4f/fdff95\u001B[0;2m] \u001B[0;2m\u001B[mNFC…nEffectsPredictor_split_1)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m60/2f90c4\u001B[0;2m] \u001B[0;2mNFC…sticNet_split_1_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/e49514\u001B[0;2m] \u001B[0;2m\u001B[mNFC…\u001B[33;2m (\u001B[0;33mElasticNet_LCO_gpu:null\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34ma1/0aef18\u001B[0;2m] \u001B[0;2mNFC…(ElasticNet_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m85/69a140\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NAL\u001B[33;2m (\u001B[0;33mLCO_ElasticNet_final\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mad/df8c4a\u001B[0;2m] \u001B[0;2mNFC…(ElasticNet_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 0 of 1\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…ESTING:\u001B[mCONSOLIDATE_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m4f/19bdb7\u001B[0;2m] \u001B[0;2m\u001B[mNFC…r_predictions_split_0.csv)\u001B[2m |\u001B[m 0 of 4\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…EL_TESTING:\u001B[mCOLLECT_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mVISUALIZE_RESULTS -\u001B[K\r\n", + "\u001B[19A\r\n", + "\u001B[2mexecutor > local (23)\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m27/079cb7\u001B[0;2m] \u001B[0;2mNFC…N_CV:\u001B[mLOAD_RESPONSE\u001B[33;2m (\u001B[0;33mTOYv1\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…AL:RUN_CV:\u001B[mLOAD_CS_RESPONSE -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/913635\u001B[0;2m] \u001B[0;2mNFC…EVAL:RUN_CV:\u001B[mCV_SPLIT\u001B[33;2m (\u001B[0;33mLCO\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mad/5338f4\u001B[0;2m] \u001B[0;2m\u001B[mNFC…ODELS\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mb2/7bcc8d\u001B[0;2m] \u001B[0;2m\u001B[mNFC…LINES\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m63/47686a\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NaiveMeanEffectsPredictor)\u001B[2m |\u001B[m 2 of 2\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m7a/2322ea\u001B[0;2m] \u001B[0;2mNFC…tsPredictor_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m4f/fdff95\u001B[0;2m] \u001B[0;2m\u001B[mNFC…nEffectsPredictor_split_1)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m60/2f90c4\u001B[0;2m] \u001B[0;2mNFC…sticNet_split_1_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/e49514\u001B[0;2m] \u001B[0;2m\u001B[mNFC…\u001B[33;2m (\u001B[0;33mElasticNet_LCO_gpu:null\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34ma1/0aef18\u001B[0;2m] \u001B[0;2mNFC…(ElasticNet_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m85/69a140\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NAL\u001B[33;2m (\u001B[0;33mLCO_ElasticNet_final\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mad/df8c4a\u001B[0;2m] \u001B[0;2mNFC…(ElasticNet_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 0 of 1\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…ESTING:\u001B[mCONSOLIDATE_RESULTS\u001B[2m |\u001B[m 0 of 2\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m4f/19bdb7\u001B[0;2m] \u001B[0;2m\u001B[mNFC…r_predictions_split_0.csv)\u001B[2m |\u001B[m 0 of 4\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…EL_TESTING:\u001B[mCOLLECT_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mVISUALIZE_RESULTS -\u001B[K\r\n", + "\u001B[19A\r\n", + "\u001B[2mexecutor > local (24)\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m27/079cb7\u001B[0;2m] \u001B[0;2mNFC…N_CV:\u001B[mLOAD_RESPONSE\u001B[33;2m (\u001B[0;33mTOYv1\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…AL:RUN_CV:\u001B[mLOAD_CS_RESPONSE -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/913635\u001B[0;2m] \u001B[0;2mNFC…EVAL:RUN_CV:\u001B[mCV_SPLIT\u001B[33;2m (\u001B[0;33mLCO\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mad/5338f4\u001B[0;2m] \u001B[0;2m\u001B[mNFC…ODELS\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mb2/7bcc8d\u001B[0;2m] \u001B[0;2m\u001B[mNFC…LINES\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m63/47686a\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NaiveMeanEffectsPredictor)\u001B[2m |\u001B[m 2 of 2\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m7a/2322ea\u001B[0;2m] \u001B[0;2mNFC…tsPredictor_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m4f/fdff95\u001B[0;2m] \u001B[0;2m\u001B[mNFC…nEffectsPredictor_split_1)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m60/2f90c4\u001B[0;2m] \u001B[0;2mNFC…sticNet_split_1_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/e49514\u001B[0;2m] \u001B[0;2m\u001B[mNFC…\u001B[33;2m (\u001B[0;33mElasticNet_LCO_gpu:null\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34ma1/0aef18\u001B[0;2m] \u001B[0;2mNFC…(ElasticNet_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m85/69a140\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NAL\u001B[33;2m (\u001B[0;33mLCO_ElasticNet_final\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mad/df8c4a\u001B[0;2m] \u001B[0;2mNFC…(ElasticNet_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 0 of 1\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…ESTING:\u001B[mCONSOLIDATE_RESULTS\u001B[2m |\u001B[m 0 of 2\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mbe/d1f525\u001B[0;2m] \u001B[0;2m\u001B[mNFC…t_predictions_split_0.csv)\u001B[2m |\u001B[m 1 of 4\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…EL_TESTING:\u001B[mCOLLECT_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mVISUALIZE_RESULTS -\u001B[K\r\n", + "\u001B[19A\r\n", + "\u001B[2mexecutor > local (25)\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m27/079cb7\u001B[0;2m] \u001B[0;2mNFC…N_CV:\u001B[mLOAD_RESPONSE\u001B[33;2m (\u001B[0;33mTOYv1\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…AL:RUN_CV:\u001B[mLOAD_CS_RESPONSE -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/913635\u001B[0;2m] \u001B[0;2mNFC…EVAL:RUN_CV:\u001B[mCV_SPLIT\u001B[33;2m (\u001B[0;33mLCO\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mad/5338f4\u001B[0;2m] \u001B[0;2m\u001B[mNFC…ODELS\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mb2/7bcc8d\u001B[0;2m] \u001B[0;2m\u001B[mNFC…LINES\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m63/47686a\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NaiveMeanEffectsPredictor)\u001B[2m |\u001B[m 2 of 2\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m7a/2322ea\u001B[0;2m] \u001B[0;2mNFC…tsPredictor_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m4f/fdff95\u001B[0;2m] \u001B[0;2m\u001B[mNFC…nEffectsPredictor_split_1)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m60/2f90c4\u001B[0;2m] \u001B[0;2mNFC…sticNet_split_1_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/e49514\u001B[0;2m] \u001B[0;2m\u001B[mNFC…\u001B[33;2m (\u001B[0;33mElasticNet_LCO_gpu:null\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34ma1/0aef18\u001B[0;2m] \u001B[0;2mNFC…(ElasticNet_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m85/69a140\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NAL\u001B[33;2m (\u001B[0;33mLCO_ElasticNet_final\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mad/df8c4a\u001B[0;2m] \u001B[0;2mNFC…(ElasticNet_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…ESTING:\u001B[mCONSOLIDATE_RESULTS\u001B[2m |\u001B[m 0 of 2\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mc2/e7af6e\u001B[0;2m] \u001B[0;2m\u001B[mNFC…r_predictions_split_1.csv)\u001B[2m |\u001B[m 1 of 4\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…EL_TESTING:\u001B[mCOLLECT_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mVISUALIZE_RESULTS -\u001B[K\r\n", + "\u001B[33mWARN: Task runtime metrics are not reported when using macOS without a container engine\u001B[39m\u001B[K\r\n", + "\u001B[20A\r\n", + "\u001B[2mexecutor > local (25)\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m27/079cb7\u001B[0;2m] \u001B[0;2mNFC…N_CV:\u001B[mLOAD_RESPONSE\u001B[33;2m (\u001B[0;33mTOYv1\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…AL:RUN_CV:\u001B[mLOAD_CS_RESPONSE -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/913635\u001B[0;2m] \u001B[0;2mNFC…EVAL:RUN_CV:\u001B[mCV_SPLIT\u001B[33;2m (\u001B[0;33mLCO\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mad/5338f4\u001B[0;2m] \u001B[0;2m\u001B[mNFC…ODELS\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mb2/7bcc8d\u001B[0;2m] \u001B[0;2m\u001B[mNFC…LINES\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m63/47686a\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NaiveMeanEffectsPredictor)\u001B[2m |\u001B[m 2 of 2\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m7a/2322ea\u001B[0;2m] \u001B[0;2mNFC…tsPredictor_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m4f/fdff95\u001B[0;2m] \u001B[0;2m\u001B[mNFC…nEffectsPredictor_split_1)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m60/2f90c4\u001B[0;2m] \u001B[0;2mNFC…sticNet_split_1_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/e49514\u001B[0;2m] \u001B[0;2m\u001B[mNFC…\u001B[33;2m (\u001B[0;33mElasticNet_LCO_gpu:null\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34ma1/0aef18\u001B[0;2m] \u001B[0;2mNFC…(ElasticNet_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m85/69a140\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NAL\u001B[33;2m (\u001B[0;33mLCO_ElasticNet_final\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mad/df8c4a\u001B[0;2m] \u001B[0;2mNFC…(ElasticNet_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…ESTING:\u001B[mCONSOLIDATE_RESULTS\u001B[2m |\u001B[m 0 of 2\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mc2/e7af6e\u001B[0;2m] \u001B[0;2m\u001B[mNFC…r_predictions_split_1.csv)\u001B[2m |\u001B[m 1 of 4\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…EL_TESTING:\u001B[mCOLLECT_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mVISUALIZE_RESULTS -\u001B[K\r\n", + "\u001B[33mWARN: Task runtime metrics are not reported when using macOS without a container engine\u001B[39m\u001B[K\r\n", + "\u001B[20A\r\n", + "\u001B[2mexecutor > local (26)\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m27/079cb7\u001B[0;2m] \u001B[0;2mNFC…N_CV:\u001B[mLOAD_RESPONSE\u001B[33;2m (\u001B[0;33mTOYv1\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…AL:RUN_CV:\u001B[mLOAD_CS_RESPONSE -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/913635\u001B[0;2m] \u001B[0;2mNFC…EVAL:RUN_CV:\u001B[mCV_SPLIT\u001B[33;2m (\u001B[0;33mLCO\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mad/5338f4\u001B[0;2m] \u001B[0;2m\u001B[mNFC…ODELS\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mb2/7bcc8d\u001B[0;2m] \u001B[0;2m\u001B[mNFC…LINES\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m63/47686a\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NaiveMeanEffectsPredictor)\u001B[2m |\u001B[m 2 of 2\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m7a/2322ea\u001B[0;2m] \u001B[0;2mNFC…tsPredictor_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m4f/fdff95\u001B[0;2m] \u001B[0;2m\u001B[mNFC…nEffectsPredictor_split_1)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m60/2f90c4\u001B[0;2m] \u001B[0;2mNFC…sticNet_split_1_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/e49514\u001B[0;2m] \u001B[0;2m\u001B[mNFC…\u001B[33;2m (\u001B[0;33mElasticNet_LCO_gpu:null\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34ma1/0aef18\u001B[0;2m] \u001B[0;2mNFC…(ElasticNet_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m85/69a140\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NAL\u001B[33;2m (\u001B[0;33mLCO_ElasticNet_final\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mad/df8c4a\u001B[0;2m] \u001B[0;2mNFC…(ElasticNet_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…ESTING:\u001B[mCONSOLIDATE_RESULTS\u001B[2m |\u001B[m 0 of 2\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m7b/3228c0\u001B[0;2m] \u001B[0;2m\u001B[mNFC…t_predictions_split_1.csv)\u001B[2m |\u001B[m 2 of 4\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…EL_TESTING:\u001B[mCOLLECT_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mVISUALIZE_RESULTS -\u001B[K\r\n", + "\u001B[33mWARN: Task runtime metrics are not reported when using macOS without a container engine\u001B[39m\u001B[K\r\n", + "\u001B[20A\r\n", + "\u001B[2mexecutor > local (27)\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m27/079cb7\u001B[0;2m] \u001B[0;2mNFC…N_CV:\u001B[mLOAD_RESPONSE\u001B[33;2m (\u001B[0;33mTOYv1\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…AL:RUN_CV:\u001B[mLOAD_CS_RESPONSE -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/913635\u001B[0;2m] \u001B[0;2mNFC…EVAL:RUN_CV:\u001B[mCV_SPLIT\u001B[33;2m (\u001B[0;33mLCO\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mad/5338f4\u001B[0;2m] \u001B[0;2m\u001B[mNFC…ODELS\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mb2/7bcc8d\u001B[0;2m] \u001B[0;2m\u001B[mNFC…LINES\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m63/47686a\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NaiveMeanEffectsPredictor)\u001B[2m |\u001B[m 2 of 2\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m7a/2322ea\u001B[0;2m] \u001B[0;2mNFC…tsPredictor_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m4f/fdff95\u001B[0;2m] \u001B[0;2m\u001B[mNFC…nEffectsPredictor_split_1)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m60/2f90c4\u001B[0;2m] \u001B[0;2mNFC…sticNet_split_1_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/e49514\u001B[0;2m] \u001B[0;2m\u001B[mNFC…\u001B[33;2m (\u001B[0;33mElasticNet_LCO_gpu:null\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34ma1/0aef18\u001B[0;2m] \u001B[0;2mNFC…(ElasticNet_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m85/69a140\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NAL\u001B[33;2m (\u001B[0;33mLCO_ElasticNet_final\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mad/df8c4a\u001B[0;2m] \u001B[0;2mNFC…(ElasticNet_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mfd/c5eab4\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NaiveMeanEffectsPredictor)\u001B[2m |\u001B[m 0 of 2\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m7b/3228c0\u001B[0;2m] \u001B[0;2m\u001B[mNFC…t_predictions_split_1.csv)\u001B[2m |\u001B[m 4 of 4\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…EL_TESTING:\u001B[mCOLLECT_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mVISUALIZE_RESULTS -\u001B[K\r\n", + "\u001B[33mWARN: Task runtime metrics are not reported when using macOS without a container engine\u001B[39m\u001B[K\r\n", + "\u001B[20A\r\n", + "\u001B[2mexecutor > local (28)\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m27/079cb7\u001B[0;2m] \u001B[0;2mNFC…N_CV:\u001B[mLOAD_RESPONSE\u001B[33;2m (\u001B[0;33mTOYv1\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…AL:RUN_CV:\u001B[mLOAD_CS_RESPONSE -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/913635\u001B[0;2m] \u001B[0;2mNFC…EVAL:RUN_CV:\u001B[mCV_SPLIT\u001B[33;2m (\u001B[0;33mLCO\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mad/5338f4\u001B[0;2m] \u001B[0;2m\u001B[mNFC…ODELS\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mb2/7bcc8d\u001B[0;2m] \u001B[0;2m\u001B[mNFC…LINES\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m63/47686a\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NaiveMeanEffectsPredictor)\u001B[2m |\u001B[m 2 of 2\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m7a/2322ea\u001B[0;2m] \u001B[0;2mNFC…tsPredictor_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m4f/fdff95\u001B[0;2m] \u001B[0;2m\u001B[mNFC…nEffectsPredictor_split_1)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m60/2f90c4\u001B[0;2m] \u001B[0;2mNFC…sticNet_split_1_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/e49514\u001B[0;2m] \u001B[0;2m\u001B[mNFC…\u001B[33;2m (\u001B[0;33mElasticNet_LCO_gpu:null\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34ma1/0aef18\u001B[0;2m] \u001B[0;2mNFC…(ElasticNet_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m85/69a140\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NAL\u001B[33;2m (\u001B[0;33mLCO_ElasticNet_final\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mad/df8c4a\u001B[0;2m] \u001B[0;2mNFC…(ElasticNet_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34ma6/b52106\u001B[0;2m] \u001B[0;2m\u001B[mNFC…IDATE_RESULTS\u001B[33;2m (\u001B[0;33mElasticNet\u001B[2m)\u001B[m\u001B[2m |\u001B[m 0 of 2\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m7b/3228c0\u001B[0;2m] \u001B[0;2m\u001B[mNFC…t_predictions_split_1.csv)\u001B[2m |\u001B[m 4 of 4\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…EL_TESTING:\u001B[mCOLLECT_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mVISUALIZE_RESULTS -\u001B[K\r\n", + "\u001B[33mWARN: Task runtime metrics are not reported when using macOS without a container engine\u001B[39m\u001B[K\r\n", + "\u001B[20A\r\n", + "\u001B[2mexecutor > local (28)\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m27/079cb7\u001B[0;2m] \u001B[0;2mNFC…N_CV:\u001B[mLOAD_RESPONSE\u001B[33;2m (\u001B[0;33mTOYv1\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…AL:RUN_CV:\u001B[mLOAD_CS_RESPONSE -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/913635\u001B[0;2m] \u001B[0;2mNFC…EVAL:RUN_CV:\u001B[mCV_SPLIT\u001B[33;2m (\u001B[0;33mLCO\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mad/5338f4\u001B[0;2m] \u001B[0;2m\u001B[mNFC…ODELS\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mb2/7bcc8d\u001B[0;2m] \u001B[0;2m\u001B[mNFC…LINES\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m63/47686a\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NaiveMeanEffectsPredictor)\u001B[2m |\u001B[m 2 of 2\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m7a/2322ea\u001B[0;2m] \u001B[0;2mNFC…tsPredictor_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m4f/fdff95\u001B[0;2m] \u001B[0;2m\u001B[mNFC…nEffectsPredictor_split_1)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m60/2f90c4\u001B[0;2m] \u001B[0;2mNFC…sticNet_split_1_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/e49514\u001B[0;2m] \u001B[0;2m\u001B[mNFC…\u001B[33;2m (\u001B[0;33mElasticNet_LCO_gpu:null\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34ma1/0aef18\u001B[0;2m] \u001B[0;2mNFC…(ElasticNet_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m85/69a140\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NAL\u001B[33;2m (\u001B[0;33mLCO_ElasticNet_final\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mad/df8c4a\u001B[0;2m] \u001B[0;2mNFC…(ElasticNet_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mfd/c5eab4\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NaiveMeanEffectsPredictor)\u001B[2m |\u001B[m 2 of 2\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m7b/3228c0\u001B[0;2m] \u001B[0;2m\u001B[mNFC…t_predictions_split_1.csv)\u001B[2m |\u001B[m 4 of 4\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…EL_TESTING:\u001B[mCOLLECT_RESULTS -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mVISUALIZE_RESULTS -\u001B[K\r\n", + "\u001B[K\r\n", + "\u001B[20A\r\n", + "\u001B[2mexecutor > local (29)\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m27/079cb7\u001B[0;2m] \u001B[0;2mNFC…N_CV:\u001B[mLOAD_RESPONSE\u001B[33;2m (\u001B[0;33mTOYv1\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…AL:RUN_CV:\u001B[mLOAD_CS_RESPONSE -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/913635\u001B[0;2m] \u001B[0;2mNFC…EVAL:RUN_CV:\u001B[mCV_SPLIT\u001B[33;2m (\u001B[0;33mLCO\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mad/5338f4\u001B[0;2m] \u001B[0;2m\u001B[mNFC…ODELS\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mb2/7bcc8d\u001B[0;2m] \u001B[0;2m\u001B[mNFC…LINES\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m63/47686a\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NaiveMeanEffectsPredictor)\u001B[2m |\u001B[m 2 of 2\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m7a/2322ea\u001B[0;2m] \u001B[0;2mNFC…tsPredictor_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m4f/fdff95\u001B[0;2m] \u001B[0;2m\u001B[mNFC…nEffectsPredictor_split_1)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m60/2f90c4\u001B[0;2m] \u001B[0;2mNFC…sticNet_split_1_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/e49514\u001B[0;2m] \u001B[0;2m\u001B[mNFC…\u001B[33;2m (\u001B[0;33mElasticNet_LCO_gpu:null\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34ma1/0aef18\u001B[0;2m] \u001B[0;2mNFC…(ElasticNet_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m85/69a140\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NAL\u001B[33;2m (\u001B[0;33mLCO_ElasticNet_final\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mad/df8c4a\u001B[0;2m] \u001B[0;2mNFC…(ElasticNet_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mfd/c5eab4\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NaiveMeanEffectsPredictor)\u001B[2m |\u001B[m 2 of 2\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m7b/3228c0\u001B[0;2m] \u001B[0;2m\u001B[mNFC…t_predictions_split_1.csv)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m2f/e0494d\u001B[0;2m] \u001B[0;2mNFC…ESTING:\u001B[mCOLLECT_RESULTS\u001B[33;2m (\u001B[0;33m1\u001B[2m)\u001B[m\u001B[2m |\u001B[m 0 of 1\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mVISUALIZE_RESULTS -\u001B[K\r\n", + "\u001B[33mWARN: Task runtime metrics are not reported when using macOS without a container engine\u001B[39m\u001B[K\r\n", + "\u001B[20A\r\n", + "\u001B[2mexecutor > local (29)\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m27/079cb7\u001B[0;2m] \u001B[0;2mNFC…N_CV:\u001B[mLOAD_RESPONSE\u001B[33;2m (\u001B[0;33mTOYv1\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…AL:RUN_CV:\u001B[mLOAD_CS_RESPONSE -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/913635\u001B[0;2m] \u001B[0;2mNFC…EVAL:RUN_CV:\u001B[mCV_SPLIT\u001B[33;2m (\u001B[0;33mLCO\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mad/5338f4\u001B[0;2m] \u001B[0;2m\u001B[mNFC…ODELS\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mb2/7bcc8d\u001B[0;2m] \u001B[0;2m\u001B[mNFC…LINES\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m63/47686a\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NaiveMeanEffectsPredictor)\u001B[2m |\u001B[m 2 of 2\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m7a/2322ea\u001B[0;2m] \u001B[0;2mNFC…tsPredictor_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m4f/fdff95\u001B[0;2m] \u001B[0;2m\u001B[mNFC…nEffectsPredictor_split_1)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m60/2f90c4\u001B[0;2m] \u001B[0;2mNFC…sticNet_split_1_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/e49514\u001B[0;2m] \u001B[0;2m\u001B[mNFC…\u001B[33;2m (\u001B[0;33mElasticNet_LCO_gpu:null\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34ma1/0aef18\u001B[0;2m] \u001B[0;2mNFC…(ElasticNet_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m85/69a140\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NAL\u001B[33;2m (\u001B[0;33mLCO_ElasticNet_final\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mad/df8c4a\u001B[0;2m] \u001B[0;2mNFC…(ElasticNet_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mfd/c5eab4\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NaiveMeanEffectsPredictor)\u001B[2m |\u001B[m 2 of 2\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m7b/3228c0\u001B[0;2m] \u001B[0;2m\u001B[mNFC…t_predictions_split_1.csv)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m2f/e0494d\u001B[0;2m] \u001B[0;2mNFC…ESTING:\u001B[mCOLLECT_RESULTS\u001B[33;2m (\u001B[0;33m1\u001B[2m)\u001B[m\u001B[2m |\u001B[m 0 of 1\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…_TESTING:\u001B[mVISUALIZE_RESULTS -\u001B[K\r\n", + "\u001B[33mWARN: Task runtime metrics are not reported when using macOS without a container engine\u001B[39m\u001B[K\r\n", + "\u001B[20A\r\n", + "\u001B[2mexecutor > local (30)\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m27/079cb7\u001B[0;2m] \u001B[0;2mNFC…N_CV:\u001B[mLOAD_RESPONSE\u001B[33;2m (\u001B[0;33mTOYv1\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…AL:RUN_CV:\u001B[mLOAD_CS_RESPONSE -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/913635\u001B[0;2m] \u001B[0;2mNFC…EVAL:RUN_CV:\u001B[mCV_SPLIT\u001B[33;2m (\u001B[0;33mLCO\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mad/5338f4\u001B[0;2m] \u001B[0;2m\u001B[mNFC…ODELS\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mb2/7bcc8d\u001B[0;2m] \u001B[0;2m\u001B[mNFC…LINES\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m63/47686a\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NaiveMeanEffectsPredictor)\u001B[2m |\u001B[m 2 of 2\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m7a/2322ea\u001B[0;2m] \u001B[0;2mNFC…tsPredictor_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m4f/fdff95\u001B[0;2m] \u001B[0;2m\u001B[mNFC…nEffectsPredictor_split_1)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m60/2f90c4\u001B[0;2m] \u001B[0;2mNFC…sticNet_split_1_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/e49514\u001B[0;2m] \u001B[0;2m\u001B[mNFC…\u001B[33;2m (\u001B[0;33mElasticNet_LCO_gpu:null\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34ma1/0aef18\u001B[0;2m] \u001B[0;2mNFC…(ElasticNet_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m85/69a140\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NAL\u001B[33;2m (\u001B[0;33mLCO_ElasticNet_final\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mad/df8c4a\u001B[0;2m] \u001B[0;2mNFC…(ElasticNet_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mfd/c5eab4\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NaiveMeanEffectsPredictor)\u001B[2m |\u001B[m 2 of 2\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m7b/3228c0\u001B[0;2m] \u001B[0;2m\u001B[mNFC…t_predictions_split_1.csv)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m2f/e0494d\u001B[0;2m] \u001B[0;2mNFC…ESTING:\u001B[mCOLLECT_RESULTS\u001B[33;2m (\u001B[0;33m1\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m57/ee097a\u001B[0;2m] \u001B[0;2mNFC…TING:\u001B[mVISUALIZE_RESULTS\u001B[33;2m (\u001B[0;33m1\u001B[2m)\u001B[m\u001B[2m |\u001B[m 0 of 1\u001B[K\r\n", + "\u001B[33mWARN: Task runtime metrics are not reported when using macOS without a container engine\u001B[39m\u001B[K\r\n", + "\u001B[20A\r\n", + "\u001B[2mexecutor > local (30)\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m27/079cb7\u001B[0;2m] \u001B[0;2mNFC…N_CV:\u001B[mLOAD_RESPONSE\u001B[33;2m (\u001B[0;33mTOYv1\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…AL:RUN_CV:\u001B[mLOAD_CS_RESPONSE -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/913635\u001B[0;2m] \u001B[0;2mNFC…EVAL:RUN_CV:\u001B[mCV_SPLIT\u001B[33;2m (\u001B[0;33mLCO\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mad/5338f4\u001B[0;2m] \u001B[0;2m\u001B[mNFC…ODELS\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mb2/7bcc8d\u001B[0;2m] \u001B[0;2m\u001B[mNFC…LINES\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m63/47686a\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NaiveMeanEffectsPredictor)\u001B[2m |\u001B[m 2 of 2\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m7a/2322ea\u001B[0;2m] \u001B[0;2mNFC…tsPredictor_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m4f/fdff95\u001B[0;2m] \u001B[0;2m\u001B[mNFC…nEffectsPredictor_split_1)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m60/2f90c4\u001B[0;2m] \u001B[0;2mNFC…sticNet_split_1_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/e49514\u001B[0;2m] \u001B[0;2m\u001B[mNFC…\u001B[33;2m (\u001B[0;33mElasticNet_LCO_gpu:null\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34ma1/0aef18\u001B[0;2m] \u001B[0;2mNFC…(ElasticNet_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m85/69a140\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NAL\u001B[33;2m (\u001B[0;33mLCO_ElasticNet_final\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mad/df8c4a\u001B[0;2m] \u001B[0;2mNFC…(ElasticNet_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mfd/c5eab4\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NaiveMeanEffectsPredictor)\u001B[2m |\u001B[m 2 of 2\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m7b/3228c0\u001B[0;2m] \u001B[0;2m\u001B[mNFC…t_predictions_split_1.csv)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m2f/e0494d\u001B[0;2m] \u001B[0;2mNFC…ESTING:\u001B[mCOLLECT_RESULTS\u001B[33;2m (\u001B[0;33m1\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m57/ee097a\u001B[0;2m] \u001B[0;2mNFC…TING:\u001B[mVISUALIZE_RESULTS\u001B[33;2m (\u001B[0;33m1\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[33mWARN: Task runtime metrics are not reported when using macOS without a container engine\u001B[39m\u001B[K\r\n", + "\u001B[20A\r\n", + "\u001B[2mexecutor > local (30)\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m27/079cb7\u001B[0;2m] \u001B[0;2mNFC…N_CV:\u001B[mLOAD_RESPONSE\u001B[33;2m (\u001B[0;33mTOYv1\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m- \u001B[0;2m] \u001B[0;2mNFC…AL:RUN_CV:\u001B[mLOAD_CS_RESPONSE -\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/913635\u001B[0;2m] \u001B[0;2mNFC…EVAL:RUN_CV:\u001B[mCV_SPLIT\u001B[33;2m (\u001B[0;33mLCO\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mad/5338f4\u001B[0;2m] \u001B[0;2m\u001B[mNFC…ODELS\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mb2/7bcc8d\u001B[0;2m] \u001B[0;2m\u001B[mNFC…LINES\u001B[33;2m (\u001B[0;33mMake model channel\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m63/47686a\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NaiveMeanEffectsPredictor)\u001B[2m |\u001B[m 2 of 2\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m7a/2322ea\u001B[0;2m] \u001B[0;2mNFC…tsPredictor_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m4f/fdff95\u001B[0;2m] \u001B[0;2m\u001B[mNFC…nEffectsPredictor_split_1)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m60/2f90c4\u001B[0;2m] \u001B[0;2mNFC…sticNet_split_1_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m23/e49514\u001B[0;2m] \u001B[0;2m\u001B[mNFC…\u001B[33;2m (\u001B[0;33mElasticNet_LCO_gpu:null\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34ma1/0aef18\u001B[0;2m] \u001B[0;2mNFC…(ElasticNet_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m85/69a140\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NAL\u001B[33;2m (\u001B[0;33mLCO_ElasticNet_final\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mad/df8c4a\u001B[0;2m] \u001B[0;2mNFC…(ElasticNet_LCO_gpu:\u001B[mfalse)\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34mfd/c5eab4\u001B[0;2m] \u001B[0;2m\u001B[mNFC…NaiveMeanEffectsPredictor)\u001B[2m |\u001B[m 2 of 2\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m7b/3228c0\u001B[0;2m] \u001B[0;2m\u001B[mNFC…t_predictions_split_1.csv)\u001B[2m |\u001B[m 4 of 4\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m2f/e0494d\u001B[0;2m] \u001B[0;2mNFC…ESTING:\u001B[mCOLLECT_RESULTS\u001B[33;2m (\u001B[0;33m1\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "\u001B[2m[\u001B[0;34m57/ee097a\u001B[0;2m] \u001B[0;2mNFC…TING:\u001B[mVISUALIZE_RESULTS\u001B[33;2m (\u001B[0;33m1\u001B[2m)\u001B[m\u001B[2m |\u001B[m 1 of 1\u001B[32m ✔\u001B[m\u001B[K\r\n", + "-\u001B[0;35m[nf-core/drugresponseeval]\u001B[0;32m Pipeline completed successfully\u001B[0m-\u001B[K\r\n", + "\u001B[33mWARN: Task runtime metrics are not reported when using macOS without a container engine\u001B[39m\u001B[K\r\n", + "\u001B[32;1mCompleted at: 20-Nov-2025 12:39:01\r\n", + "Duration : 3m 55s\r\n", + "CPU hours : 0.2\r\n", + "Succeeded : 30\r\n", + "\u001B[22;39m\u001B[K\r\n", + "\r\n" + ] + } + ], + "execution_count": 9 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "hZ6AcGPDA-yo" + }, + "source": [ + "The results will be stored in `results/my_run`. You can inspect pipeline information like runtime or memory in `results/pipeline_info`. In `my_run/report`, you can find the html report where you can look at your results interactively. The underlying data is in `my_run/evaluation_results.csv` or `true_vs_pred.csv`.\n", + "\n", + "We now inspect the final model saved in `results/my_run/LCO/ElasticNet/final_model` with `drevalpy` functions." + ] + }, + { + "cell_type": "code", + "metadata": { + "ExecuteTime": { + "end_time": "2025-11-20T11:40:16.860364Z", + "start_time": "2025-11-20T11:40:16.674489Z" + } + }, + "source": [ + "from drevalpy.models import MODEL_FACTORY\n", + "enet_class = MODEL_FACTORY[\"ElasticNet\"]\n", + "enet = enet_class.load(\"results/my_run/LCO/ElasticNet/final_model\")\n", + "enet" + ], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 10 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "WT4P7OBsDgWq" + }, + "source": [ + "We now want to extract the top scoring features." + ] + }, + { + "cell_type": "code", + "metadata": { + "ExecuteTime": { + "end_time": "2025-11-20T11:40:20.227563Z", + "start_time": "2025-11-20T11:40:19.744577Z" + } + }, + "source": [ + "# get the top features\n", + "cell_line_input = enet.load_cell_line_features(data_path=\"data\", dataset_name=\"TOYv1\")\n", + "drug_input = enet.load_drug_features(data_path=\"data\", dataset_name=\"TOYv1\")\n", + "all_features = list(cell_line_input.meta_info['gene_expression'])+[f'fingerprint_{i}' for i in range(128)]" + ], + "outputs": [], + "execution_count": 11 + }, + { + "cell_type": "code", + "metadata": { + "ExecuteTime": { + "end_time": "2025-11-20T11:40:21.849934Z", + "start_time": "2025-11-20T11:40:21.776366Z" + } + }, + "source": [ + "import pandas as pd\n", + "df = pd.DataFrame({'feature': all_features, 'coef': enet.model.coef_})\n", + "df.sort_values(by=\"coef\", ascending=False)" + ], + "outputs": [ + { + "data": { + "text/plain": [ + " feature coef\n", + "303 fingerprint_33 0.948429\n", + "345 fingerprint_75 0.657288\n", + "386 fingerprint_116 0.581950\n", + "314 fingerprint_44 0.462468\n", + "293 fingerprint_23 0.446101\n", + ".. ... ...\n", + "335 fingerprint_65 -0.507304\n", + "342 fingerprint_72 -0.613356\n", + "393 fingerprint_123 -0.638303\n", + "298 fingerprint_28 -0.668780\n", + "344 fingerprint_74 -0.775386\n", + "\n", + "[398 rows x 2 columns]" + ], + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
featurecoef
303fingerprint_330.948429
345fingerprint_750.657288
386fingerprint_1160.581950
314fingerprint_440.462468
293fingerprint_230.446101
.........
335fingerprint_65-0.507304
342fingerprint_72-0.613356
393fingerprint_123-0.638303
298fingerprint_28-0.668780
344fingerprint_74-0.775386
\n", + "

398 rows × 2 columns

\n", + "
" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 12 + }, + { + "cell_type": "code", + "metadata": { + "ExecuteTime": { + "end_time": "2025-11-20T11:40:22.899208Z", + "start_time": "2025-11-20T11:40:22.881780Z" + } + }, + "source": [ + "print(\"Top 50 features:\")\n", + "list(df.sort_values(by=\"coef\", ascending=False)[\"feature\"][:50])" + ], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Top 50 features:\n" + ] + }, + { + "data": { + "text/plain": [ + "['fingerprint_33',\n", + " 'fingerprint_75',\n", + " 'fingerprint_116',\n", + " 'fingerprint_44',\n", + " 'fingerprint_23',\n", + " 'fingerprint_4',\n", + " 'fingerprint_120',\n", + " 'fingerprint_61',\n", + " 'fingerprint_57',\n", + " 'fingerprint_112',\n", + " 'fingerprint_69',\n", + " 'fingerprint_109',\n", + " 'fingerprint_126',\n", + " 'fingerprint_31',\n", + " 'fingerprint_14',\n", + " 'fingerprint_50',\n", + " 'fingerprint_43',\n", + " 'fingerprint_121',\n", + " 'fingerprint_20',\n", + " 'fingerprint_47',\n", + " 'fingerprint_107',\n", + " 'fingerprint_110',\n", + " 'fingerprint_85',\n", + " 'fingerprint_24',\n", + " 'fingerprint_122',\n", + " 'fingerprint_63',\n", + " 'fingerprint_55',\n", + " 'fingerprint_91',\n", + " 'fingerprint_53',\n", + " 'fingerprint_30',\n", + " 'fingerprint_37',\n", + " 'fingerprint_62',\n", + " 'fingerprint_38',\n", + " 'fingerprint_78',\n", + " np.str_('CLPX'),\n", + " 'fingerprint_76',\n", + " 'fingerprint_92',\n", + " 'fingerprint_82',\n", + " 'fingerprint_64',\n", + " 'fingerprint_83',\n", + " 'fingerprint_87',\n", + " 'fingerprint_66',\n", + " 'fingerprint_3',\n", + " 'fingerprint_56',\n", + " 'fingerprint_118',\n", + " 'fingerprint_52',\n", + " np.str_('CPNE3'),\n", + " 'fingerprint_115',\n", + " np.str_('LIG1'),\n", + " np.str_('CAPN1')]" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 13 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "yErEV4pCK6-B" + }, + "source": [ + "The fingerprints are the most important features as the drug identity is responsible for the most variation between responses." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "drp2", + "language": "python", + "name": "python3" + }, + "language_info": { + "name": "python", + "version": "3.13.3" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/drevalpy/README.md b/drevalpy/README.md deleted file mode 100644 index 24d05e5b..00000000 --- a/drevalpy/README.md +++ /dev/null @@ -1,5 +0,0 @@ -This directory stores all wrapper files associated with the suite. - -If you have a new model that you would like to add to the suite, you can do so by implementing the custom model wrapper file in this directory. - -If you have a new drug response dataset on which you would like to test our models, you can add it by implementing the custom data wrapper file in this directory. diff --git a/drevalpy/cli.py b/drevalpy/cli.py new file mode 100644 index 00000000..5602f3bd --- /dev/null +++ b/drevalpy/cli.py @@ -0,0 +1,9 @@ +"""Main script to run the drug response evaluation pipeline.""" + +from drevalpy.utils import get_parser, main + + +def cli_main(): + """Command line interface entry point for the drug response evaluation pipeline.""" + args = get_parser().parse_args() + main(args) diff --git a/drevalpy/cli_model_testing.py b/drevalpy/cli_model_testing.py new file mode 100644 index 00000000..a871bae5 --- /dev/null +++ b/drevalpy/cli_model_testing.py @@ -0,0 +1,577 @@ +"""For the nf-core/drugresponseeval subworkflow model_testing.""" + +import argparse +import json +import pathlib +import pickle + +import pandas as pd +import yaml + + +def _prep_data_for_final_prediction(arguments): + """Helper function to load the data and prepare it for training and prediction. + + :param arguments: Command line arguments = model_name, split_dataset_path, split_id, hyperparameters_path, + response_transformation + :return: The instantiated model, the best hyperparameters, training dataset (=train + val), test dataset, + early stopping dataset, response transformation + """ + from drevalpy.experiment import get_datasets_from_cv_split, get_model_name_and_drug_id + from drevalpy.models import MODEL_FACTORY + from drevalpy.utils import get_response_transformation + + # instantiate model + model_name, drug_id = get_model_name_and_drug_id(arguments.model_name) + model_class = MODEL_FACTORY[model_name] + model = model_class() + # load the data + with open(arguments.split_dataset_path, "rb") as split_file: + split = pickle.load(split_file) + train_dataset, validation_dataset, es_dataset, test_dataset = get_datasets_from_cv_split( + split, model_class, model_name, drug_id + ) + + if model_class.early_stopping: + validation_dataset = split["validation_es"] + es_dataset = split["early_stopping"] + else: + es_dataset = None + # append the validation dataset to the training dataset because we now predict the test set with the + # optimal hyperparameters + train_dataset.add_rows(validation_dataset) + train_dataset.shuffle(random_state=42) + # get optimal hyperparameters + with open(arguments.hyperparameters_path) as f: + best_hpam_dict = yaml.safe_load(f) + best_hpams = best_hpam_dict[f"{arguments.model_name}_{arguments.split_id}"]["best_hpam_combi"] + # get response transformation + response_transform = get_response_transformation(arguments.response_transformation) + return model, drug_id, best_hpams, train_dataset, test_dataset, es_dataset, response_transform + + +def train_and_predict_final(): + """CLI for predicting the CV fold test set with the best hyperparameter configuration. + + Either in full mode, randomization mode, or robustness mode. + :raises ValueError: If mode is not full, randomization, or robustness. + """ + from drevalpy.experiment import ( + cross_study_prediction, + generate_data_saving_path, + randomize_train_predict, + robustness_train_predict, + train_and_predict, + ) + + # create parser + parser = argparse.ArgumentParser( + description="Train and predict: either full mode, randomization mode, " "or robustness mode." + ) + parser.add_argument( + "--mode", type=str, default="full", help="Mode: full, randomization, or robustness. Default: full." + ) + parser.add_argument( + "--model_name", + type=str, + required=True, + help="Model name for global models, . for single-drug models.", + ) + parser.add_argument("--split_id", type=str, required=True, help="Split id.") + parser.add_argument("--split_dataset_path", type=str, required=True, help="Path to the pickled CV split dataset.") + parser.add_argument( + "--hyperparameters_path", + type=str, + required=True, + help="Path to yaml file containing the optimal hyperparameters.", + ) + parser.add_argument( + "--response_transformation", type=str, default="None", help="Response transformation. Default: None." + ) + parser.add_argument("--test_mode", type=str, default="LPO", help="Test mode (LPO, LCO, LTO, LDO). Default: LPO.") + parser.add_argument("--path_data", type=str, default="data", required=True, help="Path to data. Default: data") + parser.add_argument( + "--randomization_views_path", + type=str, + default=None, + help="Path to the yaml file containing the randomization configuration (only relevant if mode=randomization).", + ) + parser.add_argument( + "--randomization_type", + type=str, + default="permutation", + help="Randomization type (permutation, invariant). Default: permutation. Only relevant if mode=randomization.", + ) + parser.add_argument( + "--robustness_trial", type=int, help="Robustness trial index. Only relevant if mode=robustness." + ) + parser.add_argument("--cross_study_datasets", nargs="+", help="(List of) path(s) to pickled cross study datasets.") + parser.add_argument( + "--model_checkpoint_dir", + type=str, + default="TEMPORARY", + help="model checkpoint directory, if not provided: temporary directory is used", + ) + args = parser.parse_args() + + # load all required objects + selected_model, drug_id, hpam_combi, train_set, test_set, es_set, transformation = _prep_data_for_final_prediction( + args + ) + if args.mode == "full": + predictions_path = generate_data_saving_path( + model_name=selected_model.get_model_name(), + drug_id=drug_id, + result_path="", + suffix="predictions", + ) + hpam_path = generate_data_saving_path( + model_name=selected_model.get_model_name(), + drug_id=drug_id, + result_path="", + suffix="best_hpams", + ) + hpam_path = pathlib.Path(hpam_path) / f"best_hpams_{args.split_id}.json" + # save the best hyperparameters as json + with open( + hpam_path, + "w", + encoding="utf-8", + ) as f: + json.dump(hpam_combi, f) + + test_set = train_and_predict( + model=selected_model, + hpams=hpam_combi, + path_data=args.path_data, + train_dataset=train_set, + prediction_dataset=test_set, + early_stopping_dataset=es_set, + response_transformation=transformation, + model_checkpoint_dir=args.model_checkpoint_dir, + ) + prediction_dataset = pathlib.Path(predictions_path) / f"predictions_{args.split_id}.csv" + + test_set.to_csv(prediction_dataset) + # cross-study prediction + for cs_ds in args.cross_study_datasets: + if cs_ds == "NONE.csv": + continue + split_index = args.split_id.split("split_")[1] + # load cross-study dataset + with open(cs_ds, "rb") as cs_file: + cross_study_dataset = pickle.load(cs_file) + cross_study_dataset.remove_nan_responses() + cross_study_prediction( + dataset=cross_study_dataset, + model=selected_model, + test_mode=args.test_mode, + train_dataset=train_set, + path_data=args.path_data, + early_stopping_dataset=(es_set if selected_model.early_stopping else None), + response_transformation=transformation, + path_out=str(pathlib.Path(predictions_path).parent), + split_index=split_index, + single_drug_id=drug_id, + ) + elif args.mode == "randomization": + with open(args.randomization_views_path) as f: + rand_test_view = yaml.safe_load(f) + rand_path = generate_data_saving_path( + model_name=selected_model.get_model_name(), + drug_id=drug_id, + result_path="", + suffix="randomization", + ) + randomization_test_file = ( + pathlib.Path(rand_path) / f'randomization_{rand_test_view["test_name"]}_{args.split_id}.csv' + ) + + randomize_train_predict( + view=rand_test_view["view"], + test_name=rand_test_view["test_name"], + randomization_type=args.randomization_type, + randomization_test_file=str(randomization_test_file), + model=selected_model, + hpam_set=hpam_combi, + path_data=args.path_data, + train_dataset=train_set, + test_dataset=test_set, + early_stopping_dataset=es_set, + response_transformation=transformation, + model_checkpoint_dir=args.model_checkpoint_dir, + ) + elif args.mode == "robustness": + rob_path = generate_data_saving_path( + model_name=selected_model.get_model_name(), + drug_id=drug_id, + result_path="", + suffix="robustness", + ) + robustness_test_file = pathlib.Path(rob_path) / f"robustness_{args.robustness_trial}_{args.split_id}.csv" + + robustness_train_predict( + trial=args.robustness_trial, + trial_file=str(robustness_test_file), + train_dataset=train_set, + test_dataset=test_set, + early_stopping_dataset=es_set, + model=selected_model, + hpam_set=hpam_combi, + path_data=args.path_data, + response_transformation=transformation, + model_checkpoint_dir=args.model_checkpoint_dir, + ) + else: + raise ValueError(f"Invalid mode: {args.mode}. Choose full, randomization, or robustness.") + + +def randomization_split(): + """CLI for creating randomization test view files.""" + from drevalpy.experiment import get_randomization_test_views + from drevalpy.models import MODEL_FACTORY + + # define parser + parser = argparse.ArgumentParser(description="Create randomization test views, saves them as yamls.") + parser.add_argument("--model_name", type=str, required=True, help="Name of the model to use.") + parser.add_argument("--randomization_mode", type=str, required=True, help="Randomization mode to use.") + args = parser.parse_args() + + model_class = MODEL_FACTORY[args.model_name] + model = model_class() + + randomization_test_views = get_randomization_test_views(model=model, randomization_mode=[args.randomization_mode]) + for test_name, views in randomization_test_views.items(): + for view in views: + rand_dict = {"test_name": test_name, "view": view} + with open(f"randomization_test_view_{test_name}.yaml", "w") as f: + yaml.dump(rand_dict, f) + + +def final_split(): + """CLI creating the final split pkls for a production model (no prediction, training on full dataset).""" + from drevalpy.datasets.dataset import split_early_stopping_data + from drevalpy.experiment import make_train_val_split + from drevalpy.models import MODEL_FACTORY + + # define parser + parser = argparse.ArgumentParser( + description="Splits to train a final model on the full dataset for future predictions " + "and saves them as pickles." + ) + parser.add_argument( + "--response", type=str, required=True, help="Drug response data, pickled (output of load_response)." + ) + parser.add_argument( + "--model_name", type=str, required=True, help="Model class name, e.g., RandomForest, SingleDrugRandomForest." + ) + parser.add_argument("--path_data", type=str, default="data", required=True, help="Path to data. Default: data.") + parser.add_argument("--test_mode", type=str, default="LPO", help="Test mode (LPO, LCO, LTO, LDO). Default: LPO.") + parser.add_argument("--val_ratio", type=float, default=0.1, help="Validation ratio.") + args = parser.parse_args() + + # load data + with open(args.response, "rb") as response_file: + response_data = pickle.load(response_file) + response_data.remove_nan_responses() + # get model features to reduce dataset + model_class = MODEL_FACTORY[args.model_name] + model = model_class() + cl_features = model.load_cell_line_features(data_path=args.path_data, dataset_name=response_data.dataset_name) + drug_features = model.load_drug_features(data_path=args.path_data, dataset_name=response_data.dataset_name) + cell_lines_to_keep = cl_features.identifiers + drugs_to_keep = drug_features.identifiers if drug_features is not None else None + response_data.reduce_to(cell_line_ids=cell_lines_to_keep, drug_ids=drugs_to_keep) + + # make the final split: only train and validation + train_dataset, validation_dataset = make_train_val_split( + response_data, test_mode=args.test_mode, val_ratio=args.val_ratio + ) + + if model_class.early_stopping: + validation_dataset, early_stopping_dataset = split_early_stopping_data(validation_dataset, args.test_mode) + else: + early_stopping_dataset = None + + # save datasets to pkl + with open("training_dataset.pkl", "wb") as f: + pickle.dump(train_dataset, f) + with open("validation_dataset.pkl", "wb") as f: + pickle.dump(validation_dataset, f) + with open("early_stopping_dataset.pkl", "wb") as f: + pickle.dump(early_stopping_dataset, f) + + +def tune_final_model(): + """CLI for tuning the final model on the full dataset.""" + from drevalpy.experiment import get_model_name_and_drug_id, train_and_predict + from drevalpy.models import MODEL_FACTORY + from drevalpy.utils import get_response_transformation + + # define parser + parser = argparse.ArgumentParser( + description="Finding the optimal hyperparameters for the final model trained " + "on the full dataset for future predictions." + ) + parser.add_argument("--train_data", type=str, required=True, help="Train dataset, pickled.") + parser.add_argument("--val_data", type=str, required=True, help="Validation dataset, pickled.") + parser.add_argument("--early_stopping_data", type=str, required=True, help="Early stopping dataset, pickled.") + parser.add_argument( + "--model_name", + type=str, + required=True, + help="Model name (model_name for global models, model_name.drug_name for single-drug models).", + ) + parser.add_argument( + "--hpam_combi", type=str, required=True, help="Path to hyperparameter combination file, yaml format." + ) + parser.add_argument( + "--response_transformation", type=str, default="None", help="Response transformation. Default: None." + ) + parser.add_argument("--path_data", type=str, default="data", required=True, help="Path to data. Default: data.") + parser.add_argument( + "--model_checkpoint_dir", + type=str, + default="TEMPORARY", + help="model checkpoint directory, if not provided: temporary directory is used", + ) + args = parser.parse_args() + + # load data + with open(args.train_data, "rb") as train_file: + train_dataset = pickle.load(train_file) + with open(args.val_data, "rb") as val_file: + validation_dataset = pickle.load(val_file) + with open(args.early_stopping_data, "rb") as es_file: + early_stopping_dataset = pickle.load(es_file) + response_transform = get_response_transformation(args.response_transformation) + + # instantiate and train model + model_name, drug_id = get_model_name_and_drug_id(args.model_name) + model_class = MODEL_FACTORY[model_name] + with open(args.hpam_combi) as f: + hpams = yaml.safe_load(f) + model = model_class() + + validation_dataset = train_and_predict( + model=model, + hpams=hpams, + path_data=args.path_data, + train_dataset=train_dataset, + prediction_dataset=validation_dataset, + early_stopping_dataset=early_stopping_dataset, + response_transformation=response_transform, + model_checkpoint_dir=args.model_checkpoint_dir, + ) + # save predictions to pkl + with open(f"final_prediction_dataset_{model_name}_" f"{str(args.hpam_combi).split('.yaml')[0]}.pkl", "wb") as f: + pickle.dump(validation_dataset, f) + + +def train_final_model(): + """CLI for training the final model on the full dataset with the optimal hyperparameters.""" + from drevalpy.experiment import generate_data_saving_path, get_model_name_and_drug_id + from drevalpy.models import MODEL_FACTORY + from drevalpy.utils import get_response_transformation + + # define parser + parser = argparse.ArgumentParser( + description="Train a final model on the full dataset for future predictions using the best hyperparameters." + ) + parser.add_argument("--train_data", type=str, required=True, help="Train data, pickled.") + parser.add_argument("--val_data", type=str, required=True, help="Validation data, pickled.") + parser.add_argument("--early_stopping_data", type=str, required=True, help="Early stopping data, pickled.") + parser.add_argument("--response_transformation", type=str, default="None", help="Response transformation.") + parser.add_argument( + "--model_name", + type=str, + required=True, + help="Model name (model_name for global models, model_name.drug_name for single-drug models).", + ) + parser.add_argument("--path_data", type=str, default="data", required=True, help="Path to data. Default: data.") + parser.add_argument( + "--model_checkpoint_dir", + type=str, + default="TEMPORARY", + help="model checkpoint directory, if not provided: temporary directory is used", + ) + parser.add_argument( + "--best_hpam_combi", type=str, required=True, help="Best hyperparameter combination file, yaml format." + ) + args = parser.parse_args() + + # create relevant objects from args + model_name, drug_id = get_model_name_and_drug_id(args.model_name) + + final_model_path = generate_data_saving_path( + model_name=model_name, drug_id=drug_id, result_path="", suffix="final_model" + ) + response_transform = get_response_transformation(args.response_transformation) + with open(args.train_data, "rb") as train_file: + train_dataset = pickle.load(train_file) + with open(args.val_data, "rb") as val_file: + validation_dataset = pickle.load(val_file) + with open(args.early_stopping_data, "rb") as es_file: + es_dataset = pickle.load(es_file) + # create dataset + train_dataset.add_rows(validation_dataset) + train_dataset.shuffle(random_state=42) + if response_transform: + train_dataset.fit_transform(response_transform) + if es_dataset is not None: + es_dataset.transform(response_transform) + # instantiate model + with open(args.best_hpam_combi) as f: + best_hpam_combi = yaml.safe_load(f)[f"{model_name}_final"]["best_hpam_combi"] + model = MODEL_FACTORY[model_name]() + cl_features = model.load_cell_line_features(data_path=args.path_data, dataset_name=train_dataset.dataset_name) + drug_features = model.load_drug_features(data_path=args.path_data, dataset_name=train_dataset.dataset_name) + model.build_model(hyperparameters=best_hpam_combi) + + # train + model.train( + output=train_dataset, + output_earlystopping=es_dataset, + cell_line_input=cl_features, + drug_input=drug_features, + model_checkpoint_dir=args.model_checkpoint_dir, + ) + + # save model for the future + pathlib.Path(final_model_path).mkdir(parents=True, exist_ok=True) + model.save(final_model_path) + + +def consolidate_results(): + """CLI for consolidating the results of the single-drug models.""" + from drevalpy.experiment import consolidate_single_drug_model_predictions + from drevalpy.models import MODEL_FACTORY + + # define parser + parser = argparse.ArgumentParser(description="Consolidate results for SingleDrugModels") + parser.add_argument("--run_id", type=str, required=True, help="Run ID") + parser.add_argument("--test_mode", type=str, required=False, default="LPO", help="Test mode (LPO, LCO, LTO, LDO)") + parser.add_argument("--model_name", type=str, required=True, help="All Model " "names") + parser.add_argument("--outdir_path", type=str, required=True, help="Output directory path") + parser.add_argument("--n_cv_splits", type=int, required=True, help="Number of CV splits") + parser.add_argument("--cross_study_datasets", type=str, nargs="+", help="All " "cross-study " "datasets") + parser.add_argument( + "--randomization_modes", type=str, default="[None]", required=False, help="All " "randomizations" + ) + parser.add_argument("--n_trials_robustness", type=int, default=0, required=False, help="Number of trials") + args = parser.parse_args() + + # load relevant objects from args + results_path = str(pathlib.Path(args.outdir_path) / args.run_id / args.test_mode) + if args.randomization_modes == "[None]": + randomizations = None + else: + randomizations = args.randomization_modes.split("[")[1].split("]")[0].split(", ") + model = MODEL_FACTORY[args.model_name] + if args.cross_study_datasets is None: + args.cross_study_datasets = [] + # consolidate results into a single file + consolidate_single_drug_model_predictions( + models=[model], + n_cv_splits=args.n_cv_splits, + results_path=results_path, + cross_study_datasets=args.cross_study_datasets, + randomization_mode=randomizations, + n_trials_robustness=args.n_trials_robustness, + out_path="", + ) + + +def evaluate_test_results(): + """CLI for evaluating the results obtained on the test sets of the CV splits.""" + from drevalpy.visualization.utils import evaluate_file + + # define parser + parser = argparse.ArgumentParser(description="Evaluate the predictions.") + parser.add_argument("--test_mode", type=str, default="LPO", help="Test mode (LPO, LCO, LDO, LTO).") + parser.add_argument("--model_name", type=str, required=True, help="Model name.") + parser.add_argument("--pred_file", type=str, required=True, help="Path to predictions.") + args = parser.parse_args() + + # evaluate the files + results_all, eval_res_d, eval_res_cl, t_vs_pred, mname = evaluate_file( + test_mode=args.test_mode, model_name=args.model_name, pred_file=args.pred_file + ) + # write the results to csvs + results_all.to_csv(f"{mname}_evaluation_results.csv") + if eval_res_d is not None: + eval_res_d.to_csv(f"{mname}_evaluation_results_per_drug.csv") + if eval_res_cl is not None: + eval_res_cl.to_csv(f"{mname}_evaluation_results_per_cl.csv") + t_vs_pred.to_csv(f"{mname}_true_vs_pred.csv") + + +def _parse_results(outfiles): + # get all files with the pattern f'{model_name}_evaluation_results.csv' from outfiles + result_files = [file for file in outfiles if "evaluation_results.csv" in file] + # get all files with the pattern f'{model_name}_evaluation_results_per_drug.csv' from outfiles + result_per_drug_files = [file for file in outfiles if "evaluation_results_per_drug.csv" in file] + # get all files with the pattern f'{model_name}_evaluation_results_per_cl.csv' from outfiles + result_per_cl_files = [file for file in outfiles if "evaluation_results_per_cl.csv" in file] + # get all files with the pattern f'{model_name}_true_vs_pred.csv' from outfiles + t_vs_pred_files = [file for file in outfiles if "true_vs_pred.csv" in file] + return result_files, result_per_drug_files, result_per_cl_files, t_vs_pred_files + + +def _collapse_file(files): + out_df = None + for file in files: + if out_df is None: + out_df = pd.read_csv(file, index_col=0) + else: + out_df = pd.concat([out_df, pd.read_csv(file, index_col=0)]) + if out_df is not None and "drug" in out_df.columns: + out_df["drug"] = out_df["drug"].astype(str) + return out_df + + +def collect_results(): + """CLI for collecting the results from the nextflow parallelization.""" + from drevalpy.visualization.utils import prep_results, write_results + + # define parser + parser = argparse.ArgumentParser(description="Collect results and write to single files.") + parser.add_argument( + "--outfiles", + type=str, + nargs="+", + required=True, + help="List of all output files containing results, i.e., evaluation_results*csv + true_vs_pred.csv files.", + ) + parser.add_argument("--path_data", type=str, default="data", help="Data directory path. Default: data.") + args = parser.parse_args() + # parse the results from outfiles.outfiles + outfiles = args.outfiles + path_data = pathlib.Path(args.path_data) + eval_result_files, eval_result_per_drug_files, eval_result_per_cl_files, true_vs_pred_files = _parse_results( + outfiles + ) + + # collapse the results into single dataframes + eval_results = _collapse_file(eval_result_files) + eval_results_per_drug = _collapse_file(eval_result_per_drug_files) + eval_results_per_cell_line = _collapse_file(eval_result_per_cl_files) + t_vs_p = _collapse_file(true_vs_pred_files) + + # prepare the results through introducing new columns algorithm, rand_setting, test_mode, split, CV_split + eval_results, eval_results_per_drug, eval_results_per_cell_line, t_vs_p = prep_results( + eval_results=eval_results, + eval_results_per_drug=eval_results_per_drug, + eval_results_per_cell_line=eval_results_per_cell_line, + t_vs_p=t_vs_p, + path_data=path_data, + ) + + # save the results to csv files + write_results( + path_out="", + eval_results=eval_results, + eval_results_per_drug=eval_results_per_drug, + eval_results_per_cl=eval_results_per_cell_line, + t_vs_p=t_vs_p, + ) diff --git a/drevalpy/cli_preprocess_custom.py b/drevalpy/cli_preprocess_custom.py new file mode 100644 index 00000000..7d261e96 --- /dev/null +++ b/drevalpy/cli_preprocess_custom.py @@ -0,0 +1,49 @@ +"""For the nf-core/drugresponseeval subworkflow preprocess_custom.""" + +import argparse +from pathlib import Path + + +def preprocess_raw_viability(): + """CLI for preprocessing raw viability data.""" + from drevalpy.datasets.curvecurator import preprocess + + # define parser + parser = argparse.ArgumentParser(description="Preprocess CurveCurator viability data.") + parser.add_argument( + "--path_data", + type=str, + default="./data", + help="Path to base folder containing datasets, in particular dataset_name/dataset_name_raw.csv, " + "default: ./data.", + ) + parser.add_argument("--dataset_name", type=str, required=True, help="Dataset name, e.g., MyCustomDataset.") + parser.add_argument( + "--cores", type=int, default=4, help="The number of cores used for CurveCurator fitting, default: 4." + ) + args = parser.parse_args() + # get the raw data and preprocess + input_file = Path(args.path_data).resolve() / args.dataset_name / f"{args.dataset_name}_raw.csv" + output_dir = input_file.parent + preprocess(input_file=str(input_file), output_dir=str(output_dir), dataset_name=args.dataset_name, cores=args.cores) + + +def postprocess_viability(): + """CLI for postprocessing viability data.""" + from drevalpy.datasets.curvecurator import postprocess + + # define parser + parser = argparse.ArgumentParser( + description="Postprocess CurveCurator viability data, combines everything in one .csv file." + ) + parser.add_argument("--dataset_name", type=str, required=True, help="Dataset name, e.g., MyCustomDataset.") + parser.add_argument( + "--path_data", + type=str, + default="./", + help="Path to output folder of CurveCurator containing the curves.txt file, default: './'.", + ) + args = parser.parse_args() + output_folder = Path(args.path_data).resolve() / args.dataset_name + # postprocess the curves.txt files and saves to the dataset_name.csv file + postprocess(output_folder=str(output_folder), dataset_name=args.dataset_name) diff --git a/drevalpy/cli_run_cv.py b/drevalpy/cli_run_cv.py new file mode 100644 index 00000000..faef9ff1 --- /dev/null +++ b/drevalpy/cli_run_cv.py @@ -0,0 +1,280 @@ +"""For the nf-core/drugresponseeval subworkflow run_cv.""" + +import argparse +import pickle +from pathlib import Path + +import pandas as pd +import yaml + + +def load_response(): + """CLI for loading the drug response data.""" + from drevalpy.datasets.dataset import DrugResponseDataset + from drevalpy.datasets.loader import AVAILABLE_DATASETS + from drevalpy.datasets.utils import CELL_LINE_IDENTIFIER, DRUG_IDENTIFIER, TISSUE_IDENTIFIER + + # define parser + parser = argparse.ArgumentParser(description="Load data for drug response prediction as pickle.") + parser.add_argument( + "--response_dataset", type=str, required=True, help="Path to the drug response file dataset_name.csv." + ) + parser.add_argument( + "--cross_study_dataset", + action="store_true", + default=False, + help="Whether to load cross-study datasets, default: False.", + ) + parser.add_argument( + "--measure", + type=str, + default="LN_IC50_curvecurator", + help="Name of the column in the dataset containing the drug response measures, default: LN_IC50_curvecurator.", + ) + args = parser.parse_args() + + # read in the csv and create the DrugResponseDataset + dataset_name = Path(args.response_dataset).stem + input_file = Path(f"{dataset_name}.csv") + if dataset_name in AVAILABLE_DATASETS: + response_file = pd.read_csv(input_file, dtype={"pubchem_id": str}) + if dataset_name == "BeatAML2": + # only has AML patients = blood + response_file[TISSUE_IDENTIFIER] = "Blood" + elif dataset_name == "PDX_Bruna": + # only has breast cancer patients + response_file[TISSUE_IDENTIFIER] = "Breast" + response_data = DrugResponseDataset( + response=response_file[args.measure].values, + cell_line_ids=response_file[CELL_LINE_IDENTIFIER].values, + drug_ids=response_file[DRUG_IDENTIFIER].values, + tissues=response_file[TISSUE_IDENTIFIER].values, + dataset_name=dataset_name, + ) + else: + tissue_column = TISSUE_IDENTIFIER + # check whether the input file has a TISSUE_IDENTIFIER column, if not, set tissue_column to None + if TISSUE_IDENTIFIER not in pd.read_csv(input_file, nrows=1).columns: + tissue_column = None + + response_data = DrugResponseDataset.from_csv( + input_file=input_file, dataset_name=dataset_name, measure=args.measure, tissue_column=tissue_column + ) + outfile = f"cross_study_{dataset_name}.pkl" if args.cross_study_dataset else "response_dataset.pkl" + # Pickle the object to a file + with open(outfile, "wb") as f: + pickle.dump(response_data, f) + + +def cv_split(): + """CLI for splitting the response.pkl into CV splits.""" + # define the parser + parser = argparse.ArgumentParser(description="Split data into CV splits: split_0.pkl, split_1.pkl, ...") + parser.add_argument("--response", type=str, required=True, help="Path to the pickled response data file.") + parser.add_argument("--n_cv_splits", type=int, required=True, help="Number of CV splits") + parser.add_argument("--test_mode", type=str, default="LPO", help="Test mode (LPO, LCO, LTO, LDO), default: LPO.") + parser.add_argument("--validation_ratio", type=float, default=0.1, help="Ratio of validation data, default: 0.1") + parser.add_argument("--seed", type=int, default=42, help="Random seed for splitting the data, default: 42.") + args = parser.parse_args() + + # load the response data and split it into CV splits + with open(args.response, "rb") as f: + response_data = pickle.load(f) + response_data.remove_nan_responses() + response_data.split_dataset( + n_cv_splits=args.n_cv_splits, + mode=args.test_mode, + split_validation=True, + split_early_stopping=True, + validation_ratio=args.validation_ratio, + random_state=args.seed, + ) + + # save the CV splits as pickled files + for split_index, split in enumerate(response_data.cv_splits): + with open(f"split_{split_index}.pkl", "wb") as f: + pickle.dump(split, f) + + +def hpam_split(): + """CLI for creating hyperparameter yamls for the specified model. + + :raises ValueError: if the model_name is neither in the MULTI- nor in the SINGLE_DRUG_MODEL_FACTORY + """ + from drevalpy.models import MODEL_FACTORY, MULTI_DRUG_MODEL_FACTORY, SINGLE_DRUG_MODEL_FACTORY + + # define the parser + parser = argparse.ArgumentParser( + description="Takes the model name and creates one yaml for each unique hyperparameter combination " + "(hpam_0.yaml, hpam_1.yaml, ...)." + ) + parser.add_argument("--model_name", type=str, help="Model name") + parser.add_argument( + "--hyperparameter_tuning", + action="store_true", + default=False, + help="If set, hyperparameter tuning is performed, otherwise only the first combination is used", + ) + args = parser.parse_args() + + # load the relevant parameters and instantiate the model + if args.model_name in MULTI_DRUG_MODEL_FACTORY: + model_name = args.model_name + else: + model_name = str(args.model_name).split(".")[0] + if model_name not in SINGLE_DRUG_MODEL_FACTORY: + raise ValueError( + f"{model_name} neither in " f"SINGLE_DRUG_MODEL_FACTORY nor in " f"MULTI_DRUG_MODEL_FACTORY." + ) + model_class = MODEL_FACTORY[model_name] + # get all hyperparameter combinations + hyperparameters = model_class.get_hyperparameter_set() + if not args.hyperparameter_tuning: + hyperparameters = [hyperparameters[0]] + # save the hyperparameter combinations as yaml files + hpam_idx = 0 + for hpam_combi in hyperparameters: + with open(f"hpam_{hpam_idx}.yaml", "w") as yaml_file: + hpam_idx += 1 + yaml.dump(hpam_combi, yaml_file, default_flow_style=False) + + +def train_and_predict_cv(): + """CLI for training and predicting on CV splits.""" + from drevalpy.experiment import get_datasets_from_cv_split, get_model_name_and_drug_id, train_and_predict + from drevalpy.models import MODEL_FACTORY + from drevalpy.utils import get_response_transformation + + # define parser + parser = argparse.ArgumentParser( + description="Trains the specified model on the specified CV split with the specified hyperparameter " + "configuration. Saves the prediction into a pickled file." + ) + parser.add_argument( + "--model_name", + type=str, + help="Model name (model_name for global models, model_name.drug_name for single-drug models).", + ) + parser.add_argument("--path_data", type=str, default="data", help="Data directory path, default: data.") + parser.add_argument("--test_mode", type=str, default="LPO", help="Test mode (LPO, LCO, LTO, LDO), default: LPO.") + parser.add_argument( + "--hyperparameters", + type=str, + help="Path to the yaml file containing the hyperparameter configuration for this run.", + ) + parser.add_argument("--cv_data", type=str, help="Path to the pickled cv data split.") + parser.add_argument( + "--response_transformation", + type=str, + default="None", + help="Response transformation to apply to the dataset, default: None.", + ) + parser.add_argument( + "--model_checkpoint_dir", + type=str, + default="TEMPORARY", + help="model checkpoint directory, if not provided: temporary directory is used", + ) + args = parser.parse_args() + + # load the relevant parameters + model_name, drug_id = get_model_name_and_drug_id(args.model_name) + + model_class = MODEL_FACTORY[model_name] + with open(args.cv_data, "rb") as f: + split = pickle.load(f) + + train_dataset, validation_dataset, es_dataset, test_dataset = get_datasets_from_cv_split( + split, model_class, model_name, drug_id + ) + + response_transform = get_response_transformation(args.response_transformation) + with open(args.hyperparameters) as f: + hpams = yaml.safe_load(f) + model = model_class() + + # train and predict on validation dataset + validation_dataset = train_and_predict( + model=model, + hpams=hpams, + path_data=args.path_data, + train_dataset=train_dataset, + prediction_dataset=validation_dataset, + early_stopping_dataset=es_dataset, + response_transformation=response_transform, + model_checkpoint_dir=args.model_checkpoint_dir, + ) + + # save the predictions + with open( + f"prediction_dataset_{model_name}_{str(args.cv_data).split('.pkl')[0]}_" + f"{str(args.hyperparameters).split('.yaml')[0]}.pkl", + "wb", + ) as f: + pickle.dump(validation_dataset, f) + + +def _best_metric(metric, current_metric, best_metric, minimization_metrics, maximization_metrics): + # returns whether the current metric is better than the best metric based on the metric type. + if metric in minimization_metrics: + if current_metric < best_metric: + return True + elif metric in maximization_metrics: + if current_metric > best_metric: + return True + else: + raise ValueError(f"Metric {metric} not recognized.") + return False + + +def evaluate_and_find_max(): + """CLI to evaluate the predictions and find the best hyperparameter combination.""" + from drevalpy.evaluation import MAXIMIZATION_METRICS, MINIMIZATION_METRICS, evaluate + + # define parser + parser = argparse.ArgumentParser( + description="Evaluates the predictions of the specified model on the specified CV split over all " + "hyperparameter configurations. Identifies the best hyperparameter combination based " + "on the specified metric and saves it into a yaml file." + ) + parser.add_argument("--model_name", type=str, help="Model name, used for naming the output file.") + parser.add_argument("--split_id", type=str, help="Split id, used for naming the output file.") + parser.add_argument("--hpam_yamls", nargs="+", help="List of paths to hyperparameter configuration yaml files.") + parser.add_argument("--pred_datas", nargs="+", help="List of paths to pickled predictions.") + parser.add_argument("--optim_metric", type=str, default="RMSE", help="Optimization metric, default: RMSE.") + args = parser.parse_args() + + # prepare data + hpam_yamls = [] + for hpam_yaml in args.hpam_yamls: + hpam_yamls.append(hpam_yaml) + pred_datas = [] + for pred_data in args.pred_datas: + pred_datas.append(pred_data) + + # find best hpam combi + best_hpam_combi = None + best_result = None + for i in range(0, len(pred_datas)): + with open(pred_datas[i], "rb") as pred_file: + pred_data = pickle.load(pred_file) + with open(hpam_yamls[i]) as yaml_file: + hpam_combi = yaml.safe_load(yaml_file) + results = evaluate(pred_data, args.optim_metric) + if best_result is None: + best_result = results[args.optim_metric] + best_hpam_combi = hpam_combi + elif _best_metric( + metric=args.optim_metric, + current_metric=results[args.optim_metric], + best_metric=best_result, + minimization_metrics=MINIMIZATION_METRICS, + maximization_metrics=MAXIMIZATION_METRICS, + ): + best_result = results[args.optim_metric] + best_hpam_combi = hpam_combi + final_result = { + f"{args.model_name}_{args.split_id}": {"best_hpam_combi": best_hpam_combi, "best_result": best_result} + } + with open(f"best_hpam_combi_{args.split_id}.yaml", "w") as yaml_file: + yaml.dump(final_result, yaml_file, default_flow_style=False) diff --git a/drevalpy/datasets/curvecurator.py b/drevalpy/datasets/curvecurator.py index edefb356..a3655b1f 100644 --- a/drevalpy/datasets/curvecurator.py +++ b/drevalpy/datasets/curvecurator.py @@ -13,6 +13,7 @@ """ import subprocess +import warnings from pathlib import Path import numpy as np @@ -32,6 +33,15 @@ def _prepare_raw_data(curve_df: pd.DataFrame, output_dir: Path, prefix: str = "" n_replicates = 1 pivot_columns = ["dose"] + if curve_df.duplicated(subset=["sample", "drug", "dose", "replicate"]).any(): + warnings.warn( + "CurveCurator Raw Data Processing: Duplicate entries found for some (sample, drug, dose, replicate)" + " combinations. Aggregating using mean of the 'response'.", + UserWarning, + stacklevel=1, + ) + curve_df = curve_df.groupby(["sample", "drug", "dose", "replicate"], as_index=False)["response"].mean() + df = curve_df.pivot(index=["sample", "drug"], columns=pivot_columns, values="response") if "replicate" in curve_df.columns: @@ -47,7 +57,6 @@ def _prepare_raw_data(curve_df: pd.DataFrame, output_dir: Path, prefix: str = "" experiments = np.arange(df.shape[1]) df.insert(0, "Name", ["|".join(map(str, i)) for i in df.index.tolist()]) - df.reset_index(drop=True) df.columns = ["Name"] + [f"Raw {i}" for i in experiments] @@ -59,7 +68,14 @@ def _prepare_raw_data(curve_df: pd.DataFrame, output_dir: Path, prefix: str = "" def _prepare_toml( - filename: str, n_exp: int, n_replicates: int, doses: list[float], dataset_name: str, cores: int, condition: str = "" + filename: str, + n_exp: int, + n_replicates: int, + doses: list[float], + dataset_name: str, + cores: int, + condition: str = "", + normalize: bool = False, ): config = { "Meta": { @@ -72,7 +88,7 @@ def _prepare_toml( "experiments": range(n_exp), "doses": doses, "dose_scale": "1e-06", - "dose_unit": "M", + "dose_unit": "uM", "control_experiment": [i for i in range(n_replicates)], "measurement_type": "OTHER", "data_type": "OTHER", @@ -90,7 +106,7 @@ def _prepare_toml( "available_cores": cores, "max_missing": max(len(doses) - 5, 0), "imputation": False, - "normalization": False, + "normalization": normalize, }, "Curve Fit": { "type": "OLS", @@ -123,13 +139,22 @@ def _exec_curvecurator(output_dir: Path, batched: bool = True): of configs spefified in /configlist.txt and consecutively executing each CurveCurator run. If False, run a single CurveCurator run (this can be used for parallelisation). + :raises RuntimeError: If CurveCurator fails to execute, the error message is printed to stdout and stderr. """ if batched: command = ["CurveCurator", str(output_dir / "configlist.txt"), "--mad", "--batch"] else: command = ["CurveCurator", str(output_dir / "config.toml"), "--mad"] - process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - process.communicate() + process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) + stdout, stderr = process.communicate() + + if process.returncode != 0: + print("CurveCurator stdout:") + print(stdout) + print("CurveCurator stderr:") + print(stderr) + + raise RuntimeError(f"CurveCurator failed with exit code {process.returncode}") def _calc_ic50(model_params_df: pd.DataFrame): @@ -139,6 +164,7 @@ def _calc_ic50(model_params_df: pd.DataFrame): This function expects a dataframe that was processed in the postprocess function, containing the columns "Front", "Back", "Slope", "pEC50". It calculates the IC50 for all the models in the dataframe in closed form and adds the column IC50_curvecurator to the input dataframe. + Also adds the natural logarithm of the IC50 as LN_IC50_curvecurator. :param model_params_df: a dataframe containing the fitted parameters """ @@ -150,13 +176,15 @@ def ic50(front, back, slope, pec50): front = model_params_df["Front"].values back = model_params_df["Back"].values slope = model_params_df["Slope"].values - pec50 = model_params_df["pEC50_curvecurator"].values + # we need the pEC50 in uM; now it is in M: -log10(EC50[M] * 10^6) = -log10(EC50[M])-6 = pEC50 -6 + pec50 = model_params_df["pEC50_curvecurator"].values - 6 model_params_df["IC50_curvecurator"] = ic50(front, back, slope, pec50) + model_params_df["LN_IC50_curvecurator"] = np.log(model_params_df["IC50_curvecurator"].values) @pipeline_function -def preprocess(input_file: str | Path, output_dir: str | Path, dataset_name: str, cores: int): +def preprocess(input_file: str, output_dir: str, dataset_name: str, cores: int, normalize: bool = False): """ Preprocess raw viability data and create required input files for CurveCurator. @@ -175,18 +203,19 @@ def preprocess(input_file: str | Path, output_dir: str | Path, dataset_name: str :param cores: The number of cores to be used for fitting the curves using CurveCurator. This parameter is written into the config.toml, but it is min of the number of curves to fit and the number given (min(n_curves, cores)) + :param normalize: Whether to normalize the response values to [0, 1] for curvecurator. Default = False. :raises ValueError: If required columns are not found in the provided input file. """ - input_file = Path(input_file) - output_dir = Path(output_dir) + input_path = Path(input_file) + output_path = Path(output_dir) required_columns = ["dose", "response", "sample", "drug", "replicate"] converters = {"dose": float, "response": float, "sample": str, "drug": str, "replicate": int} try: - curve_df = pd.read_csv(input_file, usecols=required_columns, converters=converters) + curve_df = pd.read_csv(input_path, usecols=required_columns, converters=converters) except ValueError: required_columns.pop() del converters["replicate"] - curve_df = pd.read_csv(input_file, usecols=required_columns, converters=converters) + curve_df = pd.read_csv(input_path, usecols=required_columns, converters=converters) if not all([col in curve_df.columns for col in required_columns]): raise ValueError(f"Missing columns in viability data. Required columns are {required_columns}.") @@ -214,22 +243,29 @@ def preprocess(input_file: str | Path, output_dir: str | Path, dataset_name: str for index, df in drug_df_groups: prefix = "_".join([f"{s}" for s in index]) n_exp, doses, n_replicates, n_curves_to_fit = _prepare_raw_data( - curve_df=df, output_dir=output_dir, prefix=prefix + curve_df=df, output_dir=output_path, prefix=prefix ) config = _prepare_toml( - input_file.name, n_exp, n_replicates, doses, dataset_name, min(n_curves_to_fit, cores), prefix + filename=input_path.name, + n_exp=n_exp, + n_replicates=n_replicates, + doses=doses, + dataset_name=dataset_name, + cores=min(n_curves_to_fit, cores), + condition=prefix, + normalize=normalize, ) - config_path = output_dir / prefix / "config.toml" + config_path = output_path / prefix / "config.toml" with open(config_path, "w") as f: toml.dump(config, f) configs.append(f"{config_path}\n") - with open(output_dir / "configlist.txt", "w") as f: + with open(output_path / "configlist.txt", "w") as f: f.writelines(configs) @pipeline_function -def postprocess(output_folder: str | Path, dataset_name: str): +def postprocess(output_folder: str, dataset_name: str): """ Postprocess CurveCurator output files. @@ -240,8 +276,8 @@ def postprocess(output_folder: str | Path, dataset_name: str): :param output_folder: Path to the output folder of CurveCurator containing the curves.txt file. :param dataset_name: The name of the dataset, will be used to prepend the postprocessed .csv file """ - output_folder = Path(output_folder) - curvecurator_output_files = output_folder.rglob("curves.tsv") + output_path = Path(output_folder) + curvecurator_output_files = output_path.rglob("curves.tsv") required_columns = { "Name": "Name", "pEC50": "pEC50_curvecurator", @@ -262,7 +298,7 @@ def postprocess(output_folder: str | Path, dataset_name: str): "Curve Regulation": "Regulation", } - with open(output_folder / f"{dataset_name}.csv", "w") as f: + with open(output_path / f"{dataset_name}.csv", "w") as f: first_file = True for output_file in curvecurator_output_files: fitted_curve_data = pd.read_csv(output_file, sep="\t", usecols=required_columns).rename( @@ -271,8 +307,8 @@ def postprocess(output_folder: str | Path, dataset_name: str): fitted_curve_data[[CELL_LINE_IDENTIFIER, DRUG_IDENTIFIER]] = fitted_curve_data.Name.str.split( "|", expand=True ) - fitted_curve_data["EC50_curvecurator"] = np.power( - 10, -fitted_curve_data["pEC50_curvecurator"].values + fitted_curve_data["EC50_curvecurator"] = ( + np.power(10, -fitted_curve_data["pEC50_curvecurator"].values) * 10**6 ) # in CurveCurator 10^-pEC50 = EC50 _calc_ic50(fitted_curve_data) fitted_curve_data.to_csv(f, index=None, header=first_file, mode="a") @@ -280,7 +316,7 @@ def postprocess(output_folder: str | Path, dataset_name: str): f.close() -def fit_curves(input_file: str | Path, output_dir: str | Path, dataset_name: str, cores: int): +def fit_curves(input_file: str, output_dir: str, dataset_name: str, cores: int, normalize: bool = False): """ Fit curves for provided raw viability data. @@ -295,7 +331,10 @@ def fit_curves(input_file: str | Path, output_dir: str | Path, dataset_name: str :param cores: The number of cores to be used for fitting the curves using CurveCurator. This parameter is written into the config.toml, but it is min of the number of curves to fit and the number given (min(n_curves, cores)) + :param normalize: Whether to normalize the response values to [0, 1] for curvecurator. Default = False. """ - preprocess(input_file, output_dir, dataset_name, cores) - _exec_curvecurator(Path(output_dir)) - postprocess(output_dir, dataset_name) + preprocess( + input_file=input_file, output_dir=output_dir, dataset_name=dataset_name, cores=cores, normalize=normalize + ) + _exec_curvecurator(output_dir=Path(output_dir)) + postprocess(output_folder=output_dir, dataset_name=dataset_name) diff --git a/drevalpy/datasets/dataset.py b/drevalpy/datasets/dataset.py index 7046e8e8..aa1e46f0 100644 --- a/drevalpy/datasets/dataset.py +++ b/drevalpy/datasets/dataset.py @@ -1,3 +1,5 @@ +# flake8: noqa: RST201, RST203, RST301, RST401 + """ Defines the different dataset classes. @@ -41,13 +43,53 @@ class DrugResponseDataset: _cv_splits: list[dict[str, "DrugResponseDataset"]] = [] _name: str + @pipeline_function + def __init__( + self, + response: np.ndarray, + cell_line_ids: np.ndarray, + drug_ids: np.ndarray, + tissues: np.ndarray | None = None, + predictions: np.ndarray | None = None, + dataset_name: str = "unnamed", + ) -> None: + """ + Initializes the drug response dataset. + + :param response: drug response values per cell line and drug + :param cell_line_ids: cell line IDs + :param drug_ids: drug IDs + :param tissues: Optionally, tissue types of the cell lines for leave-tissue-out cv + :param predictions: optional. Predicted drug response values per cell line and drug + :param dataset_name: optional. Name of the dataset, default: "unnamed" + :raises AssertionError: If response, cell_line_ids, drug_ids, (and the optional predictions) do not all have + the same length. + """ + super().__init__() + if len(response) != len(cell_line_ids): + raise AssertionError("Response and cell line identifiers have different lengths.") + if len(response) != len(drug_ids): + raise AssertionError("Response and drug identifiers have different lengths.") + if predictions is not None and len(response) != len(predictions): + raise AssertionError("Response and predictions have different lengths.") + self._response = response + self._cell_line_ids = cell_line_ids.astype(str) + self._drug_ids = drug_ids.astype(str) + self._predictions = predictions + self._name = dataset_name + if tissues is not None: + self._tissues = np.array(tissues).astype(str) + else: + self._tissues = None + + @pipeline_function @classmethod def from_csv( cls: type["DrugResponseDataset"], input_file: str | Path, dataset_name: str = "unknown", measure: str = "response", - tissue_column: str | None = None, + tissue_column: str | None = "tissue", ) -> "DrugResponseDataset": """ Load a dataset from a csv file. @@ -67,7 +109,7 @@ def from_csv( :raises ValueError: If the required columns are not found in the input file :returns: DrugResponseDataset object containing data from provided csv file. """ - data = pd.read_csv(input_file) + data = pd.read_csv(input_file, dtype={DRUG_IDENTIFIER: str, CELL_LINE_IDENTIFIER: str}, low_memory=False) if measure not in data.columns: raise ValueError(f"Column {measure} not found in the input file.") @@ -87,7 +129,7 @@ def from_csv( drug_ids=data[DRUG_IDENTIFIER].values, predictions=predictions, dataset_name=dataset_name, - tissues=data[tissue_column].values if tissue_column in data.columns else None, + tissues=data[tissue_column].values.astype(str) if tissue_column in data.columns else None, ) @property @@ -149,49 +191,12 @@ def dataset_name(self) -> str: """ Returns the name of this DrugResponseDataset. + Used in the pipeline. + :returns: dataset name. """ return self._name - @pipeline_function - def __init__( - self, - response: np.ndarray, - cell_line_ids: np.ndarray, - drug_ids: np.ndarray, - tissues: np.ndarray | None = None, - predictions: np.ndarray | None = None, - dataset_name: str = "unnamed", - ) -> None: - """ - Initializes the drug response dataset. - - :param response: drug response values per cell line and drug - :param cell_line_ids: cell line IDs - :param drug_ids: drug IDs - :param tissues: Optionally, tissue types of the cell lines for leave-tissue-out cv - :param predictions: optional. Predicted drug response values per cell line and drug - :param dataset_name: optional. Name of the dataset, default: "unnamed" - :raises AssertionError: If response, cell_line_ids, drug_ids, (and the optional predictions) do not all have - the same length. - """ - super().__init__() - if len(response) != len(cell_line_ids): - raise AssertionError("Response and cell line identifiers have different lengths.") - if len(response) != len(drug_ids): - raise AssertionError("Response and drug identifiers have different lengths.") - if predictions is not None and len(response) != len(predictions): - raise AssertionError("Response and predictions have different lengths.") - self._response = response - self._cell_line_ids = cell_line_ids - self._drug_ids = drug_ids - self._predictions = predictions - self._name = dataset_name - if tissues is not None: - self._tissues = np.array(tissues) - else: - self._tissues = None - def __len__(self) -> int: """ Overwrites the default length method. @@ -283,28 +288,28 @@ def shuffle(self, random_state: int = 42) -> None: if self.tissue is not None: self._tissues = self.tissue[indices] - def _remove_drugs(self, drugs_to_remove: str | list[str | int]) -> None: + def _remove_drugs(self, drugs_to_remove: str | list[str]) -> None: """ - Removes drugs from the dataset. + Removes one or more drugs from the dataset. - :param drugs_to_remove: name of drug or list of names of multiple drugs to remove + :param drugs_to_remove: A single drug ID (str) or a list of IDs to remove. """ if isinstance(drugs_to_remove, str): drugs_to_remove = [drugs_to_remove] - mask = np.array([drug not in drugs_to_remove for drug in self.drug_ids], dtype=bool) + mask: np.ndarray = ~np.isin(self.drug_ids, drugs_to_remove) self.mask(mask) - def _remove_cell_lines(self, cell_lines_to_remove: str | list[str | int]) -> None: + def _remove_cell_lines(self, cell_lines_to_remove: str | list[str]) -> None: """ - Removes cell lines from the dataset. + Removes one or more cell lines from the dataset. - :param cell_lines_to_remove: name of cell line or list of names of multiple cell lines to remove + :param cell_lines_to_remove: A single cell line ID (str) or a list of IDs to remove. """ if isinstance(cell_lines_to_remove, str): cell_lines_to_remove = [cell_lines_to_remove] - mask = np.array([cell_line not in cell_lines_to_remove for cell_line in self.cell_line_ids], dtype=bool) + mask: np.ndarray = ~np.isin(self.cell_line_ids, cell_lines_to_remove) self.mask(mask) def remove_rows(self, indices: np.ndarray) -> None: @@ -312,7 +317,15 @@ def remove_rows(self, indices: np.ndarray) -> None: Removes rows from the dataset. :param indices: indices of rows to remove + :raises ValueError: if indices are out of bounds or not 1-dimensional """ + if indices.ndim != 1: + raise ValueError("Indices must be a 1-dimensional array.") + if np.any(indices >= len(self)) or np.any(indices < 0): + raise ValueError("Indices are out of bounds.") + if len(indices) == 0: + return + mask = np.ones(len(self), dtype=bool) mask[indices] = False self.mask(mask) @@ -325,10 +338,10 @@ def reduce_to(self, cell_line_ids: np.ndarray | None = None, drug_ids: np.ndarra :param drug_ids: drug IDs or None to keep all cell lines """ if drug_ids is not None: - self._remove_drugs(list(set(self.drug_ids) - set(drug_ids))) + self._remove_drugs(list(set(self.drug_ids) - set(drug_ids.astype(str)))) if cell_line_ids is not None: - self._remove_cell_lines(list(set(self.cell_line_ids) - set(cell_line_ids))) + self._remove_cell_lines(list(set(self.cell_line_ids) - set(cell_line_ids.astype(str)))) @pipeline_function def split_dataset( @@ -397,7 +410,7 @@ def split_dataset( if split_validation and split_early_stopping: for split in cv_splits: - validation_es, early_stopping = _split_early_stopping_data(split["validation"], test_mode=mode) + validation_es, early_stopping = split_early_stopping_data(split["validation"], test_mode=mode) split["validation_es"] = validation_es split["early_stopping"] = early_stopping self._cv_splits = cv_splits @@ -520,6 +533,7 @@ def mask(self, mask: np.ndarray) -> None: if self.tissue is not None: self._tissues = self.tissue[mask] + @pipeline_function def transform(self, response_transformation: TransformerMixin) -> None: """ Apply transformation to the response data and prediction data of the dataset. @@ -530,6 +544,7 @@ def transform(self, response_transformation: TransformerMixin) -> None: if self.predictions is not None: self._predictions = response_transformation.transform(self.predictions.reshape(-1, 1)).squeeze() + @pipeline_function def fit_transform(self, response_transformation: TransformerMixin) -> None: """ Fit and transform the response data and prediction data of the dataset. @@ -550,7 +565,8 @@ def inverse_transform(self, response_transformation: TransformerMixin) -> None: self._predictions = response_transformation.inverse_transform(self.predictions.reshape(-1, 1)).squeeze() -def _split_early_stopping_data( +@pipeline_function +def split_early_stopping_data( validation_dataset: DrugResponseDataset, test_mode: str ) -> tuple[DrugResponseDataset, DrugResponseDataset]: """ @@ -779,7 +795,30 @@ def _leave_group_out_cv( class FeatureDataset: - """Class for feature datasets.""" + """ + Class for feature datasets. + + This class represents datasets with one or more views of features associated with a set of entities, + such as drugs or cell lines. The feature data is stored in a nested dictionary structure: + + { + identifier_1: { + view_name_1: feature_vector, + view_name_2: feature_vector, + ... + }, + identifier_2: { + view_name_1: feature_vector, + view_name_2: feature_vector, + ... + }, + ... + } + + - Each outer key is a string identifier (e.g. a cell line ID or drug ID) + - Each inner key is the name of a view (e.g. 'gene_expression', 'fingerprints') + - Each inner value is a feature vector or object representing that view for the identifier + """ _features: dict[str, dict[str, Any]] _meta_info: dict[str, Any] @@ -791,6 +830,8 @@ def from_csv( id_column: str, view_name: str, drop_columns: list[str] | None = None, + transpose: bool = False, + extract_meta_info: bool = True, ): """Load a one-view feature dataset from a csv file. @@ -803,13 +844,15 @@ def from_csv( :param view_name: name of the view (e.g. gene_expression) :param id_column: name of the column containing the identifiers :param drop_columns: list of columns to drop (e.g. other identifier columns) + :param transpose: if True, the csv is transposed, i.e. the rows become columns and vice versa + :param extract_meta_info: if True, extracts meta information from the dataset, e.g. gene names for gene expression :returns: FeatureDataset object containing data from provided csv file. """ - data = pd.read_csv(path_to_csv) + data = pd.read_csv(path_to_csv).T if transpose else pd.read_csv(path_to_csv) + data[id_column] = data[id_column].astype(str) ids = data[id_column].values data_features = data.drop(columns=(drop_columns or [])) data_features = data_features.set_index(id_column) - # remove duplicate feature rows (rows with the same index) data_features = data_features[~data_features.index.duplicated(keep="first")] features = {} @@ -817,29 +860,40 @@ def from_csv( features_for_instance = data_features.loc[identifier].values features[identifier] = {view_name: features_for_instance} - return cls(features=features) + meta_info = {} + if extract_meta_info: + meta_info = {view_name: list(data_features.columns)} + + return cls(features=features, meta_info=meta_info) def to_csv(self, path: str | Path, id_column: str, view_name: str): """ - Save the feature dataset to a CSV file. + Save the feature dataset to a CSV file. If meta_info is available for the view and valid, + it will be written as column names. :param path: Path to the CSV file. :param id_column: Name of the column containing the identifiers. - :param view_name: Name of the view (e.g., gene_expression). - - :raises ValueError: If the view is not found for an identifier. + :param view_name: Name of the view. """ data = [] + feature_names = None + for identifier, feature_dict in self.features.items(): - # Get the feature vector for the specified view - if view_name in feature_dict: - row = {id_column: identifier} - row.update({f"feature_{i}": value for i, value in enumerate(feature_dict[view_name])}) - data.append(row) - else: + vector = feature_dict.get(view_name) + if vector is None: raise ValueError(f"View {view_name!r} not found for identifier {identifier!r}.") - # Convert to DataFrame and save to CSV + if feature_names is None: + meta_names = self.meta_info.get(view_name) + if isinstance(meta_names, list) and len(meta_names) == len(vector): + feature_names = meta_names + else: + feature_names = [f"feature_{i}" for i in range(len(vector))] + + row = {id_column: identifier} + row.update({name: value for name, value in zip(feature_names, vector)}) + data.append(row) + df = pd.DataFrame(data) df.to_csv(path, index=False) @@ -866,6 +920,8 @@ def identifiers(self) -> np.ndarray: """ Returns the identifiers of the features. + Used in the pipeline. + :returns: feature identifiers of this FeatureDataset """ return np.array(list(self.features.keys())) @@ -1082,7 +1138,6 @@ def fit_transform_features(self, train_ids: np.ndarray, transformer: Transformer raise AssertionError("Train IDs should be unique.") - # Collect all features of the view for fitting the scaler train_features = np.vstack([self.features[identifier][view] for identifier in train_ids]) transformer.fit(train_features) diff --git a/drevalpy/datasets/featurizer/create_chemberta_drug_embeddings.py b/drevalpy/datasets/featurizer/create_chemberta_drug_embeddings.py new file mode 100644 index 00000000..3d19ff18 --- /dev/null +++ b/drevalpy/datasets/featurizer/create_chemberta_drug_embeddings.py @@ -0,0 +1,85 @@ +"""Preprocesses drug SMILES strings into ChemBERTa embeddings.""" + +import argparse +from pathlib import Path + +import pandas as pd +import torch +from tqdm import tqdm + +try: + from transformers import AutoModel, AutoTokenizer +except ImportError: + raise ImportError( + "Please install transformers package for ChemBERTa embedding featurizer: pip install transformers" + ) +# Load ChemBERTa +tokenizer = AutoTokenizer.from_pretrained("seyonec/ChemBERTa-zinc-base-v1") +model = AutoModel.from_pretrained("seyonec/ChemBERTa-zinc-base-v1") +model.eval() + + +def _smiles_to_chemberta(smiles: str, device="cpu"): + inputs = tokenizer(smiles, return_tensors="pt", truncation=True) + inputs = {k: v.to(device) for k, v in inputs.items()} + + with torch.no_grad(): + outputs = model(**inputs) + hidden_states = outputs.last_hidden_state + + embedding = hidden_states.mean(dim=1).squeeze(0) + return embedding.cpu().numpy() + + +def main(): + """Process drug SMILES and save ChemBERTa embeddings. + + :raises Exception: If a drug fails to process. + """ + parser = argparse.ArgumentParser(description="Preprocess drug SMILES to ChemBERTa embeddings.") + parser.add_argument("dataset_name", type=str, help="The name of the dataset to process.") + parser.add_argument("--device", type=str, default="cpu", help="Torch device (cpu or cuda)") + parser.add_argument("--data_path", type=str, default="data", help="Path to the data folder") + args = parser.parse_args() + + dataset_name = args.dataset_name + device = args.device + data_dir = Path(args.data_path).resolve() + + smiles_file = data_dir / dataset_name / "drug_smiles.csv" + output_file = data_dir / dataset_name / "drug_chemberta_embeddings.csv" + + if not smiles_file.exists(): + print(f"Error: {smiles_file} not found.") + return + + smiles_df = pd.read_csv(smiles_file, dtype={"canonical_smiles": str, "pubchem_id": str}) + embeddings_list = [] + drug_ids = [] + + print(f"Processing {len(smiles_df)} drugs for dataset {dataset_name}...") + + for row in tqdm(smiles_df.itertuples(index=False), total=len(smiles_df)): + drug_id = row.pubchem_id + smiles = row.canonical_smiles + + try: + embedding = _smiles_to_chemberta(smiles, device=device) + embeddings_list.append(embedding) + drug_ids.append(drug_id) + except Exception as e: + print() + print(smiles) + print() + print(f"Failed to process {drug_id}") + raise e + + embeddings_array = pd.DataFrame(embeddings_list) + embeddings_array.insert(0, "pubchem_id", drug_ids) + embeddings_array.to_csv(output_file, index=False) + + print(f"Finished processing. Embeddings saved to {output_file}") + + +if __name__ == "__main__": + main() diff --git a/drevalpy/datasets/featurizer/create_drug_graphs.py b/drevalpy/datasets/featurizer/create_drug_graphs.py new file mode 100644 index 00000000..c79e09ca --- /dev/null +++ b/drevalpy/datasets/featurizer/create_drug_graphs.py @@ -0,0 +1,145 @@ +""" +Preprocesses drug SMILES strings into graph representations. + +This script takes a dataset name as input, reads the corresponding +drug_smiles.csv file, and converts each SMILES string into a +torch_geometric.data.Data object. The resulting graph objects are saved +to {data_path}/{dataset_name}/drug_graphs/{drug_name}.pt. +""" + +import argparse +import os +from pathlib import Path + +import pandas as pd +import torch +from torch_geometric.data import Data +from tqdm import tqdm + +try: + from rdkit import Chem +except ImportError: + raise ImportError("Please install rdkit package for drug graphs featurizer: pip install rdkit") + +# Atom feature configuration +ATOM_FEATURES = { + "atomic_num": list(range(1, 119)), + "degree": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "formal_charge": [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5], + "num_hs": [0, 1, 2, 3, 4, 5, 6, 7, 8], + "hybridization": [ + Chem.rdchem.HybridizationType.SP, + Chem.rdchem.HybridizationType.SP2, + Chem.rdchem.HybridizationType.SP3, + Chem.rdchem.HybridizationType.SP3D, + Chem.rdchem.HybridizationType.SP3D2, + ], +} + +# Bond feature configuration +BOND_FEATURES = { + "bond_type": [ + Chem.rdchem.BondType.SINGLE, + Chem.rdchem.BondType.DOUBLE, + Chem.rdchem.BondType.TRIPLE, + Chem.rdchem.BondType.AROMATIC, + ] +} + + +def _one_hot_encode(value, choices): + """Create a one-hot encoding for a value in a list of choices. + + :param value: The value to be one-hot encoded. + :param choices: A list of possible choices for the value. + :return: A list representing the one-hot encoding. + """ + encoding = [0] * (len(choices) + 1) + index = choices.index(value) if value in choices else -1 + encoding[index] = 1 + return encoding + + +def _smiles_to_graph(smiles: str): + """ + Converts a SMILES string to a torch_geometric.data.Data object. + + :param smiles: The SMILES string for the drug. + :return: A Data object representing the molecular graph, or None if conversion fails. + """ + mol = Chem.MolFromSmiles(smiles) + if mol is None: + return None + + # Atom features + atom_features_list = [] + for atom in mol.GetAtoms(): + features = [] + features.extend(_one_hot_encode(atom.GetAtomicNum(), ATOM_FEATURES["atomic_num"])) + features.extend(_one_hot_encode(atom.GetDegree(), ATOM_FEATURES["degree"])) + features.extend(_one_hot_encode(atom.GetFormalCharge(), ATOM_FEATURES["formal_charge"])) + features.extend(_one_hot_encode(atom.GetTotalNumHs(), ATOM_FEATURES["num_hs"])) + features.extend(_one_hot_encode(atom.GetHybridization(), ATOM_FEATURES["hybridization"])) + features.append(atom.GetIsAromatic()) + features.append(atom.IsInRing()) + atom_features_list.append(features) + x = torch.tensor(atom_features_list, dtype=torch.float) + + # Edge index and edge features + edge_indices = [] + edge_features_list = [] + for bond in mol.GetBonds(): + i = bond.GetBeginAtomIdx() + j = bond.GetEndAtomIdx() + + # Edge features + features = [] + features.extend(_one_hot_encode(bond.GetBondType(), BOND_FEATURES["bond_type"])) + features.append(bond.GetIsConjugated()) + features.append(bond.IsInRing()) + + edge_indices.extend([[i, j], [j, i]]) + edge_features_list.extend([features, features]) # Same features for both directions + + edge_index = torch.tensor(edge_indices, dtype=torch.long).t().contiguous() + edge_attr = torch.tensor(edge_features_list, dtype=torch.float) + + return Data(x=x, edge_index=edge_index, edge_attr=edge_attr) + + +def main(): + """Main function to run the preprocessing.""" + parser = argparse.ArgumentParser(description="Preprocess drug SMILES to graphs.") + parser.add_argument("dataset_name", type=str, help="The name of the dataset to process.") + parser.add_argument("--data_path", type=str, default="data", help="Path to the data folder") + args = parser.parse_args() + + dataset_name = args.dataset_name + data_dir = Path(args.data_path).resolve() + smiles_file = data_dir / dataset_name / "drug_smiles.csv" + output_dir = data_dir / dataset_name / "drug_graphs" + + if not smiles_file.exists(): + print(f"Error: {smiles_file} not found.") + return + + os.makedirs(output_dir, exist_ok=True) + + smiles_df = pd.read_csv(smiles_file) + + print(f"Processing {len(smiles_df)} drugs for dataset {dataset_name}...") + + for _, row in tqdm(smiles_df.iterrows(), total=smiles_df.shape[0]): + drug_id = row["pubchem_id"] + smiles = row["canonical_smiles"] + + graph = _smiles_to_graph(smiles) + + if graph: + torch.save(graph, output_dir / f"{drug_id}.pt") + + print(f"Finished processing. Graphs saved to {output_dir}") + + +if __name__ == "__main__": + main() diff --git a/drevalpy/datasets/featurizer/create_molgnet_embeddings.py b/drevalpy/datasets/featurizer/create_molgnet_embeddings.py new file mode 100644 index 00000000..2d337e80 --- /dev/null +++ b/drevalpy/datasets/featurizer/create_molgnet_embeddings.py @@ -0,0 +1,917 @@ +#!/usr/bin/env python3 +"""MolGNet feature extraction utilities (needed for DIPK and adapted from the DIPK github). + +Creates MolGNet embeddings for molecules given their SMILES strings. This module needs torch_scatter. + python create_molgnet_embeddings.py dataset_name --checkpoint meta/MolGNet.pt --data_path data +""" + +import argparse +import math +import os +import pickle # noqa: S403 +from pathlib import Path +from typing import Any, Optional + +import numpy as np +import pandas as pd +import torch +import torch.nn.functional as torch_nn_f +from torch import nn +from torch.nn import Parameter +from torch_geometric.data import Data +from torch_geometric.utils import add_self_loops, softmax +from tqdm import tqdm + +try: + from rdkit import Chem + from rdkit.Chem.rdchem import Mol as RDMol +except ImportError: + raise ImportError("Please install rdkit package for MolGNet featurizer: pip install rdkit") + +# building graphs +allowable_features: dict[str, list[Any]] = { + "atomic_num": list(range(1, 122)), + "formal_charge": ["unk", -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5], + "chirality": [ + "unk", + Chem.rdchem.ChiralType.CHI_UNSPECIFIED, + Chem.rdchem.ChiralType.CHI_TETRAHEDRAL_CW, + Chem.rdchem.ChiralType.CHI_TETRAHEDRAL_CCW, + Chem.rdchem.ChiralType.CHI_OTHER, + ], + "hybridization": [ + "unk", + Chem.rdchem.HybridizationType.S, + Chem.rdchem.HybridizationType.SP, + Chem.rdchem.HybridizationType.SP2, + Chem.rdchem.HybridizationType.SP3, + Chem.rdchem.HybridizationType.SP3D, + Chem.rdchem.HybridizationType.SP3D2, + Chem.rdchem.HybridizationType.UNSPECIFIED, + ], + "numH": ["unk", 0, 1, 2, 3, 4, 5, 6, 7, 8], + "implicit_valence": ["unk", 0, 1, 2, 3, 4, 5, 6], + "degree": ["unk", 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "isaromatic": [False, True], + "bond_type": [ + "unk", + Chem.rdchem.BondType.SINGLE, + Chem.rdchem.BondType.DOUBLE, + Chem.rdchem.BondType.TRIPLE, + Chem.rdchem.BondType.AROMATIC, + ], + "bond_dirs": [ + Chem.rdchem.BondDir.NONE, + Chem.rdchem.BondDir.ENDUPRIGHT, + Chem.rdchem.BondDir.ENDDOWNRIGHT, + ], + "bond_isconjugated": [False, True], + "bond_inring": [False, True], + "bond_stereo": [ + "STEREONONE", + "STEREOANY", + "STEREOZ", + "STEREOE", + "STEREOCIS", + "STEREOTRANS", + ], +} + +atom_dic = [ + len(allowable_features["atomic_num"]), + len(allowable_features["formal_charge"]), + len(allowable_features["chirality"]), + len(allowable_features["hybridization"]), + len(allowable_features["numH"]), + len(allowable_features["implicit_valence"]), + len(allowable_features["degree"]), + len(allowable_features["isaromatic"]), +] +bond_dic = [ + len(allowable_features["bond_type"]), + len(allowable_features["bond_dirs"]), + len(allowable_features["bond_isconjugated"]), + len(allowable_features["bond_inring"]), + len(allowable_features["bond_stereo"]), +] +atom_cumsum = np.cumsum(atom_dic) +bond_cumsum = np.cumsum(bond_dic) + + +def mol_to_graph_data_obj_complex(mol: RDMol) -> Data: + """Convert an RDKit Mol into a torch_geometric ``Data`` object. + + The function encodes a fixed set of atom and bond categorical + features and returns a ``Data`` instance with ``x``, ``edge_index`` + and ``edge_attr`` fields. It mirrors the feature layout expected by + the MolGNet implementation used in this repository. + + :param mol: RDKit ``Mol`` instance. Must not be ``None``. + :return: A ``torch_geometric.data.Data`` object with node and edge fields. + :raises ValueError: If ``mol`` is ``None``. + """ + if mol is None: + raise ValueError("mol must not be None") + atom_features_list: list = [] + # Shortcuts for feature lists + fc_list = allowable_features["formal_charge"] + ch_list = allowable_features["chirality"] + hyb_list = allowable_features["hybridization"] + numh_list = allowable_features["numH"] + imp_list = allowable_features["implicit_valence"] + deg_list = allowable_features["degree"] + isa_list = allowable_features["isaromatic"] + bt_list = allowable_features["bond_type"] + bd_list = allowable_features["bond_dirs"] + bic_list = allowable_features["bond_isconjugated"] + bir_list = allowable_features["bond_inring"] + bs_list = allowable_features["bond_stereo"] + for atom in mol.GetAtoms(): + a_idx = allowable_features["atomic_num"].index(atom.GetAtomicNum()) + fc_idx = fc_list.index(atom.GetFormalCharge()) + atom_cumsum[0] + ch_idx = ch_list.index(atom.GetChiralTag()) + atom_cumsum[1] + hyb_idx = hyb_list.index(atom.GetHybridization()) + atom_cumsum[2] + numh_idx = numh_list.index(atom.GetTotalNumHs()) + atom_cumsum[3] + imp_idx = imp_list.index(atom.GetImplicitValence()) + atom_cumsum[4] + deg_idx = deg_list.index(atom.GetDegree()) + atom_cumsum[5] + isa_idx = isa_list.index(atom.GetIsAromatic()) + atom_cumsum[6] + + atom_feature = [ + a_idx, + fc_idx, + ch_idx, + hyb_idx, + numh_idx, + imp_idx, + deg_idx, + isa_idx, + ] + atom_features_list.append(atom_feature) + x = torch.tensor(np.array(atom_features_list), dtype=torch.long) + + # bonds + num_bond_features = 5 + if len(mol.GetBonds()) > 0: + edges_list = [] + edge_features_list = [] + for bond in mol.GetBonds(): + i = bond.GetBeginAtomIdx() + j = bond.GetEndAtomIdx() + bt = bt_list.index(bond.GetBondType()) + bd = bd_list.index(bond.GetBondDir()) + bond_cumsum[0] + bic = bic_list.index(bond.GetIsConjugated()) + bond_cumsum[1] + bir = bir_list.index(bond.IsInRing()) + bond_cumsum[2] + bs = bs_list.index(str(bond.GetStereo())) + bond_cumsum[3] + + edge_feature = [bt, bd, bic, bir, bs] + edges_list.append((i, j)) + edge_features_list.append(edge_feature) + edges_list.append((j, i)) + edge_features_list.append(edge_feature) + edge_index = torch.tensor(np.array(edges_list).T, dtype=torch.long) + edge_attr = torch.tensor(np.array(edge_features_list), dtype=torch.long) + else: + edge_index = torch.empty((2, 0), dtype=torch.long) + edge_attr = torch.empty((0, num_bond_features), dtype=torch.long) + + data = Data(x=x, edge_index=edge_index, edge_attr=edge_attr) + return data + + +class SelfLoop: + """Callable that appends self-loops and matching edge attributes. + + This helper mutates the provided ``Data`` object by adding self-loop + entries to ``edge_index`` and a corresponding edge attribute row for + every node. + """ + + def __call__(self, data: Data) -> Data: + """Modify ``data`` in-place by adding self-loop indices and corresponding edge attributes. + + :param data: ``torch_geometric.data.Data`` to modify. + :return: The modified ``Data`` object (same instance). + """ + num_nodes = data.num_nodes + data.edge_index, _ = add_self_loops(data.edge_index, num_nodes=num_nodes) + self_loop_attr = torch.LongTensor([0, 5, 8, 10, 12]).repeat(num_nodes, 1) + data.edge_attr = torch.cat((data.edge_attr, self_loop_attr), dim=0) + return data + + +class AddSegId: + """Attach zero-valued segment id tensors to nodes and edges. + + The created ``node_seg`` and ``edge_seg`` tensors are added to the + provided ``Data`` instance and used by the MolGNet embedding layers. + """ + + def __init__(self) -> None: + """Create an AddSegId callable (no parameters).""" + pass + + def __call__(self, data: Data) -> Data: + """Attach zero-filled ``node_seg`` and ``edge_seg`` tensors to ``data``. + + :param data: ``torch_geometric.data.Data`` to modify. + :return: The modified ``Data`` object (same instance). + """ + num_nodes = data.num_nodes + num_edges = data.num_edges + node_seg = [0 for _ in range(num_nodes)] + edge_seg = [0 for _ in range(num_edges)] + data.edge_seg = torch.LongTensor(edge_seg) + data.node_seg = torch.LongTensor(node_seg) + return data + + +# MolGNet model + + +class BertLayerNorm(nn.Module): + """Layer normalization compatible with BERT-style implementations. + + :param hidden_size: Dimension of the last axis to normalize. + :param eps: Small epsilon for numerical stability. + """ + + def __init__(self, hidden_size, eps=1e-12): + """Create a BertLayerNorm module. + + :param hidden_size: Dimension of the last axis to normalize. + :param eps: Small epsilon for numerical stability. + """ + super().__init__() + self.shape = torch.Size((hidden_size,)) + self.eps = eps + self.weight = nn.Parameter(torch.ones(hidden_size)) + self.bias = nn.Parameter(torch.zeros(hidden_size)) + + def forward(self, x: torch.Tensor) -> torch.Tensor: + """Apply layer normalization to the last dimension of ``x``. + + :param x: Input tensor. + :return: Normalized tensor with same shape as ``x``. + """ + u = x.mean(-1, keepdim=True) + s = (x - u).pow(2).mean(-1, keepdim=True) + x = (x - u) / torch.sqrt(s + self.eps) + x = self.weight * x + self.bias + return x + + +def gelu(x: torch.Tensor) -> torch.Tensor: + """Gaussian Error Linear Unit activation (approximation). + + :param x: Input tensor. + :return: Activated tensor. + """ + return x * 0.5 * (1.0 + torch.erf(x / math.sqrt(2))) + + +def bias_gelu(bias: torch.Tensor, y: torch.Tensor) -> torch.Tensor: + """Apply GELU to ``bias + y``. + + :param bias: Bias tensor to add. + :param y: Linear output tensor. + :return: GELU applied to ``bias + y``. + """ + x = bias + y + return x * 0.5 * (1.0 + torch.erf(x / math.sqrt(2))) + + +class LinearActivation(nn.Module): + """Linear layer with optional bias-aware GELU activation. + + :param in_features: Input feature dimension. + :param out_features: Output feature dimension. + :param bias: Whether to use a bias parameter and the biased GELU. + """ + + def __init__(self, in_features: int, out_features: int, bias: bool = True) -> None: + """ + Create a LinearActivation module. + + :param in_features: Input feature dimension. + :param out_features: Output feature dimension. + :param bias: Whether to use a bias parameter and the biased GELU. + """ + super().__init__() + self.in_features = in_features + self.out_features = out_features + if bias: + self.biased_act_fn = bias_gelu + else: + self.act_fn = gelu + self.weight = Parameter(torch.Tensor(out_features, in_features)) + if bias: + self.bias = Parameter(torch.Tensor(out_features)) + else: + self.register_parameter("bias", None) + self.reset_parameters() + + def reset_parameters(self) -> None: + """Initialize the layer parameters.""" + nn.init.kaiming_uniform_(self.weight, a=math.sqrt(5)) + if self.bias is not None: + fan_in, _ = nn.init._calculate_fan_in_and_fan_out(self.weight) + bound = 1 / math.sqrt(fan_in) + nn.init.uniform_(self.bias, -bound, bound) + + def forward(self, input: torch.Tensor) -> torch.Tensor: + """Apply the linear transformation and activation. + + :param input: Input tensor of shape [N, in_features]. + :return: Transformed tensor of shape [N, out_features]. + """ + if self.bias is not None: + linear_out = torch_nn_f.linear(input, self.weight, None) + return self.biased_act_fn(self.bias, linear_out) + else: + return self.act_fn(torch_nn_f.linear(input, self.weight, self.bias)) + + +class Intermediate(nn.Module): + """Intermediate feed-forward block used inside GT layers. + + :param hidden: Hidden dimension size. + """ + + def __init__(self, hidden: int) -> None: + """Create the intermediate dense activation block. + + :param hidden: Hidden dimension size. + """ + super().__init__() + self.dense_act = LinearActivation(hidden, 4 * hidden) + + def forward(self, hidden_states: torch.Tensor) -> torch.Tensor: + """Apply the dense activation to the hidden states. + + :param hidden_states: Input tensor of shape [N, hidden]. + :return: Transformed tensor of shape [N, 4*hidden]. + """ + hidden_states = self.dense_act(hidden_states) + return hidden_states + + +class AttentionOut(nn.Module): + """Post-attention output block: projection, dropout and residual norm. + + :param hidden: Hidden dimension used for the linear projection. + :param dropout: Dropout probability. + """ + + def __init__(self, hidden: int, dropout: float) -> None: + """Create an AttentionOut block. + + :param hidden: Hidden dimension used for projection. + :param dropout: Dropout probability. + """ + super().__init__() + self.dense = nn.Linear(hidden, hidden) + self.LayerNorm = BertLayerNorm(hidden, eps=1e-12) + self.dropout = nn.Dropout(dropout) + + def forward(self, hidden_states: torch.Tensor, input_tensor: torch.Tensor) -> torch.Tensor: + """Project attention outputs and apply layer norm with residual. + + :param hidden_states: Attention output tensor. + :param input_tensor: Residual tensor to add before normalization. + :return: Normalized tensor with the same shape as ``input_tensor``. + """ + hidden_states = self.dense(hidden_states) + hidden_states = self.dropout(hidden_states) + hidden_states = self.LayerNorm(hidden_states + input_tensor) + return hidden_states + + +class GTOut(nn.Module): + """Output projection used in GT blocks. + + :param hidden: Hidden dimension. + :param dropout: Dropout probability. + """ + + def __init__(self, hidden: int, dropout: float) -> None: + """Create a GTOut projection block. + + :param hidden: Hidden dimension. + :param dropout: Dropout probability. + """ + super().__init__() + self.dense = nn.Linear(hidden * 4, hidden) + self.LayerNorm = BertLayerNorm(hidden, eps=1e-12) + self.dropout = nn.Dropout(dropout) + + def forward(self, hidden_states: torch.Tensor, input_tensor: torch.Tensor) -> torch.Tensor: + """Project intermediate states back to hidden dimension and normalize. + + :param hidden_states: Intermediate tensor of shape [N, 4*hidden]. + :param input_tensor: Residual tensor to add. + :return: Tensor of shape [N, hidden]. + """ + hidden_states = self.dense(hidden_states) + hidden_states = self.dropout(hidden_states) + hidden_states = self.LayerNorm(hidden_states + input_tensor) + return hidden_states + + +class MessagePassing(nn.Module): + """Minimal MessagePassing base class used by the MolGNet layers. + + This class provides a lightweight implementation of propagate/ + message/aggregate/update used in graph convolutions. + + :param aggr: Aggregation method (e.g., 'add', 'mean'). + :param flow: Message flow direction. + :param node_dim: Node dimension index (unused in this minimal impl). + """ + + def __init__(self, aggr: str = "add", flow: str = "source_to_target", node_dim: int = 0) -> None: + """Create a MessagePassing helper. + + :param aggr: Aggregation method (e.g., 'add' or 'mean'). + :param flow: Message flow direction. + :param node_dim: Node dimension index. + """ + super().__init__() + self.aggr = aggr + self.flow = flow + self.node_dim = node_dim + + def propagate(self, edge_index: torch.Tensor, size: Optional[tuple[int, int]] = None, **kwargs) -> torch.Tensor: + """Run full message-passing: message -> aggregate -> update. + + :param edge_index: Edge indices tensor of shape [2, E]. + :param size: Optional pair describing (num_nodes_source, num_nodes_target). + :param kwargs: Additional data (e.g., node features) needed for message computation. + :raises ValueError: If required inputs (e.g., 'x') are missing or indexing fails. + :return: Updated node tensor after aggregation. + """ + i = 1 if self.flow == "source_to_target" else 0 + j = 0 if i == 1 else 1 + x = kwargs.get("x") + if x is None: + raise ValueError("propagate requires node features passed as keyword 'x'") + try: + x_i = x[edge_index[i]] + x_j = x[edge_index[j]] + except Exception as exc: # defensive + raise ValueError("failed to index node features with edge_index") from exc + msg = self.message( + edge_index_i=edge_index[i], + edge_index_j=edge_index[j], + x_i=x_i, + x_j=x_j, + **kwargs, + ) + # determine number of destination nodes for aggregation + if hasattr(x, "size"): + dim_size = x.size(0) + else: + dim_size = len(x) + out = self.aggregate(msg, index=edge_index[i], dim_size=dim_size) + out = self.update(out) + return out + + def message(self, *args: Any, **kwargs: Any) -> torch.Tensor: + """Default message function returning neighbor features. + + Subclasses may provide richer signatures; this generic form allows + subclass overrides while keeping the base class typed. + + :param args: Positional arguments forwarded by propagate. + :param kwargs: Keyword arguments forwarded by propagate. + :raises ValueError: If required node features are not present. + :return: Message tensor. + """ + x_j = kwargs.get("x_j") if "x_j" in kwargs else (args[1] if len(args) > 1 else None) + if x_j is None: + raise ValueError("message requires node features 'x_j'") + return x_j + + def aggregate(self, inputs: torch.Tensor, index: torch.Tensor, dim_size: Optional[int] = None) -> torch.Tensor: + """Aggregate messages using ``torch_scatter.scatter``. + + :param inputs: Message tensor of shape [E, hidden]. + :param index: Indices to aggregate into nodes. + :param dim_size: Optional target size for the aggregation dimension. + :return: Aggregated node tensor. + """ + from torch_scatter import scatter # local dependency + + return scatter( + inputs, + index, + dim=0, + dim_size=dim_size, + reduce=self.aggr, + ) + + def update(self, inputs: torch.Tensor) -> torch.Tensor: + """Identity update by default. + + Override to apply post-aggregation transformations. + + :param inputs: Aggregated node tensor. + :return: Updated tensor. + """ + return inputs + + +class GraphAttentionConv(MessagePassing): + """Graph attention convolution used by MolGNet. + + :param hidden: Hidden feature dimension. + :param heads: Number of attention heads. + :param dropout: Attention dropout probability. + """ + + def __init__(self, hidden: int, heads: int = 3, dropout: float = 0.0) -> None: + """Create a GraphAttentionConv. + + :param hidden: Hidden feature dimension. + :param heads: Number of attention heads. + :param dropout: Dropout probability. + :raises ValueError: If hidden is not divisible by heads. + """ + super().__init__() + self.hidden = hidden + self.heads = heads + if hidden % heads != 0: + raise ValueError("hidden must be divisible by heads") + self.query = nn.Linear(hidden, heads * int(hidden / heads)) + self.key = nn.Linear(hidden, heads * int(hidden / heads)) + self.value = nn.Linear(hidden, heads * int(hidden / heads)) + self.attn_drop = nn.Dropout(dropout) + + def forward( + self, + x: torch.Tensor, + edge_index: torch.Tensor, + edge_attr: torch.Tensor, + size: Optional[tuple[int, int]] = None, + ) -> torch.Tensor: + """Execute the graph attention conv over the provided inputs. + + :param x: Node feature tensor. + :param edge_index: Edge indices tensor. + :param edge_attr: Edge attribute tensor. + :param size: Optional size tuple. + :return: Updated node tensor after attention. + """ + pseudo = edge_attr.unsqueeze(-1) if edge_attr.dim() == 1 else edge_attr + return self.propagate(edge_index=edge_index, x=x, pseudo=pseudo) + + def message( + self, + edge_index_i: torch.Tensor, + x_i: torch.Tensor, + x_j: torch.Tensor, + pseudo: torch.Tensor, + size_i: Optional[int] = None, + **kwargs, + ) -> torch.Tensor: + """Compute messages using multi-head attention between nodes. + + :param edge_index_i: Source indices for edges. + :param x_i: Node features for source nodes. + :param x_j: Node features for target nodes. + :param pseudo: Edge pseudo-features (edge attributes). + :param size_i: Optional number of destination nodes. + :param kwargs: Additional keyword arguments (ignored). + :return: Message tensor shaped for aggregation. + """ + query = self.query(x_i).view( + -1, + self.heads, + int(self.hidden / self.heads), + ) + key = self.key(x_j + pseudo).view( + -1, + self.heads, + int(self.hidden / self.heads), + ) + value = self.value(x_j + pseudo).view( + -1, + self.heads, + int(self.hidden / self.heads), + ) + denom = math.sqrt(int(self.hidden / self.heads)) + alpha = (query * key).sum(dim=-1) / denom + alpha = softmax(src=alpha, index=edge_index_i, num_nodes=size_i) + alpha = self.attn_drop(alpha.view(-1, self.heads, 1)) + return alpha * value + + def update(self, aggr_out: torch.Tensor) -> torch.Tensor: + """Reshape aggregated outputs from multi-head to flat hidden dim. + + :param aggr_out: Aggregated output tensor of shape [N*heads, head_dim]. + :return: Reshaped tensor of shape [N, hidden]. + """ + aggr_out = aggr_out.view(-1, self.heads * int(self.hidden / self.heads)) + return aggr_out + + +class GTLayer(nn.Module): + """Graph Transformer layer composed from attention and feed-forward blocks. + + :param hidden: Hidden dimension size. + :param heads: Number of attention heads. + :param dropout: Dropout probability. + :param num_message_passing: Number of internal message passing steps. + """ + + def __init__(self, hidden: int, heads: int, dropout: float, num_message_passing: int) -> None: + """Create a GTLayer composed of attention and feed-forward blocks. + + :param hidden: Hidden dimension size. + :param heads: Number of attention heads. + :param dropout: Dropout probability. + :param num_message_passing: Number of internal message passing steps. + """ + super().__init__() + self.attention = GraphAttentionConv(hidden, heads, dropout) + self.att_out = AttentionOut(hidden, dropout) + self.intermediate = Intermediate(hidden) + self.output = GTOut(hidden, dropout) + self.gru = nn.GRU(hidden, hidden) + self.LayerNorm = BertLayerNorm(hidden, eps=1e-12) + self.time_step = num_message_passing + + def forward(self, x: torch.Tensor, edge_index: torch.Tensor, edge_attr: torch.Tensor) -> torch.Tensor: + """Run the GT layer for the configured number of message-passing steps. + + :param x: Node feature tensor of shape [N, hidden]. + :param edge_index: Edge index tensor. + :param edge_attr: Edge attribute tensor. + :return: Updated node tensor of shape [N, hidden]. + """ + h = x.unsqueeze(0) + for _ in range(self.time_step): + attention_output = self.attention.forward(x, edge_index, edge_attr) + attention_output = self.att_out.forward(attention_output, x) + intermediate_output = self.intermediate.forward(attention_output) + m = self.output.forward(intermediate_output, attention_output) + x, h = self.gru(m.unsqueeze(0), h) + x = self.LayerNorm.forward(x.squeeze(0)) + return x + + +class MolGNet(torch.nn.Module): + """MolGNet model implementation used for node embeddings. + + This implementation is intentionally minimal and only includes the + components required to run a checkpoint and produce per-node + embeddings saved by the featurizer script. + + :param num_layer: Number of GT layers. + :param emb_dim: Embedding dimensionality per node. + :param heads: Number of attention heads. + :param num_message_passing: Message passing steps per layer. + :param drop_ratio: Dropout probability. + """ + + def __init__( + self, + num_layer: int, + emb_dim: int, + heads: int, + num_message_passing: int, + drop_ratio: float = 0, + ) -> None: + """Create a MolGNet instance. + + :param num_layer: Number of GT layers. + :param emb_dim: Embedding dimensionality per node. + :param heads: Number of attention heads. + :param num_message_passing: Message passing steps per layer. + :param drop_ratio: Dropout probability. + """ + super().__init__() + self.num_layer = num_layer + self.drop_ratio = drop_ratio + self.x_embedding = torch.nn.Embedding(178, emb_dim) + self.x_seg_embed = torch.nn.Embedding(3, emb_dim) + self.edge_embedding = torch.nn.Embedding(18, emb_dim) + self.edge_seg_embed = torch.nn.Embedding(3, emb_dim) + self.reset_parameters() + self.gnns = torch.nn.ModuleList( + [GTLayer(emb_dim, heads, drop_ratio, num_message_passing) for _ in range(num_layer)] + ) + + def reset_parameters(self) -> None: + """Re-initialize embedding parameters with Xavier uniform. + + This mirrors common initialization used for transformer-style + embeddings. + """ + torch.nn.init.xavier_uniform_(self.x_embedding.weight.data) + torch.nn.init.xavier_uniform_(self.x_seg_embed.weight.data) + torch.nn.init.xavier_uniform_(self.edge_embedding.weight.data) + torch.nn.init.xavier_uniform_(self.edge_seg_embed.weight.data) + + def forward(self, *argv: Any) -> torch.Tensor: + """Forward pass supporting two calling conventions. + + Accepts either explicit tensors (x, edge_index, edge_attr, node_seg, + edge_seg) or a single ``Data`` object containing those attributes. + + :param argv: Positional arguments as described above. + :raises ValueError: If an unsupported number of arguments is provided. + :return: Node embeddings tensor of shape [N, emb_dim]. + """ + if len(argv) == 5: + x, edge_index, edge_attr, node_seg, edge_seg = (argv[0], argv[1], argv[2], argv[3], argv[4]) + elif len(argv) == 1: + data = argv[0] + x, edge_index, edge_attr, node_seg, edge_seg = ( + data.x, + data.edge_index, + data.edge_attr, + data.node_seg, + data.edge_seg, + ) + else: + raise ValueError("unmatched number of arguments.") + x = self.x_embedding(x).sum(1) + self.x_seg_embed(node_seg) + edge_attr = self.edge_embedding(edge_attr).sum(1) + edge_attr = edge_attr + self.edge_seg_embed(edge_seg) + for gnn in self.gnns: + x = gnn(x, edge_index, edge_attr) + return x + + +def tensor_to_csv_friendly(tensor: Any) -> np.ndarray: + """Convert a tensor-like object into a NumPy array safe for CSV output. + + :param tensor: Input tensor or array-like object. + :return: NumPy array on CPU. + """ + if isinstance(tensor, torch.Tensor): + return tensor.cpu().detach().numpy() + return np.array(tensor) + + +def run(args: argparse.Namespace) -> None: + """Execute the featurization pipeline for a given dataset. + + The function builds graphs from SMILES, runs the MolGNet checkpoint + to extract node embeddings, and writes per-drug CSVs and pickles in + the dataset folder. + + :param args: Parsed CLI arguments. + :raises FileNotFoundError: If expected files or directories are missing. + :raises ValueError: If expected columns are missing in the input CSV. + :raises Exception: For various failures during graph building or inference. + """ + # Use dataset-oriented paths: {data_path}/{dataset_name}/... + # Expand user (~) and resolve to an absolute path. + data_dir = Path(args.data_path).expanduser().resolve() + dataset_dir = data_dir / args.dataset_name + if not dataset_dir.exists(): + raise FileNotFoundError(f"Dataset directory not found: {dataset_dir}") + + out_graphs = str(dataset_dir / "GRAPH_dict.pkl") + out_molg = str(dataset_dir / "MolGNet_dict.pkl") + + # read input csv (expected at {data_path}/{dataset_name}/drug_smiles.csv) + smiles_csv = dataset_dir / "drug_smiles.csv" + if not smiles_csv.exists(): + raise FileNotFoundError(f"Expected SMILES CSV at: {smiles_csv}") + df = pd.read_csv(smiles_csv) + if args.smiles_col not in df.columns or args.id_col not in df.columns: + msg = f"Provided columns not in CSV: {args.smiles_col}, " f"{args.id_col}" + raise ValueError(msg) + df = df.dropna(subset=[args.smiles_col]) + smiles_map = dict(zip(df[args.id_col], df[args.smiles_col])) + + # Build graphs + graph_dict: dict[Any, Data] = {} + failed_conversions = [] + for idx, smi in tqdm(smiles_map.items(), desc="building graphs"): + mol = Chem.MolFromSmiles(smi) + if mol is None: + failed_conversions.append((idx, smi, "MolFromSmiles returned None")) + continue + try: + graph_dict[idx] = mol_to_graph_data_obj_complex(mol) + except Exception as e: + failed_conversions.append((idx, smi, str(e))) + if failed_conversions: + print(f"\n{len(failed_conversions)} molecules failed to convert to graphs.") + for idx, smi, err in failed_conversions: + print(f"Failed to convert {idx} (SMILES: {smi}): {err}") + else: + print("\nAll molecules converted to graphs successfully.") + # save graphs to dataset folder + with open(out_graphs, "wb") as f: + pickle.dump(graph_dict, f) + # load model + if args.device: + device = torch.device(args.device) + else: + device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + + num_layer = 5 + emb_dim = 768 + heads = 12 + msg_pass = 3 + drop = 0.0 + model = MolGNet( + num_layer=num_layer, + emb_dim=emb_dim, + heads=heads, + num_message_passing=msg_pass, + drop_ratio=drop, + ) + # Prefer pathlib operations when working with Path objects + checkpoint_path = data_dir / args.checkpoint + ckpt = torch.load(checkpoint_path, map_location=device) # noqa S614 + try: + model.load_state_dict(ckpt) + except Exception: + if isinstance(ckpt, dict) and "state_dict" in ckpt: + model.load_state_dict(ckpt["state_dict"]) + else: + raise + model = model.to(device) + model.eval() + + self_loop = SelfLoop() + add_seg = AddSegId() + + molgnet_dict: dict[Any, torch.Tensor] = {} + with torch.no_grad(): + for idx, graph in tqdm(graph_dict.items(), desc="running model"): + try: + g = self_loop(graph) + g = add_seg(g) + g = g.to(device) + emb = model(g) + molgnet_dict[idx] = emb.cpu() + except Exception as e: + print(f"Inference failed for {idx}: {e}") + + with open(out_molg, "wb") as f: + pickle.dump(molgnet_dict, f) + + # write per-drug CSVs to {dataset_dir}/DIPK_features/Drugs + out_drugs_dir = dataset_dir / "DIPK_features/Drugs" + os.makedirs(out_drugs_dir, exist_ok=True) + for idx, emb in tqdm(molgnet_dict.items(), desc="writing csvs"): + arr = tensor_to_csv_friendly(emb) + df_emb = pd.DataFrame(arr) + out_path = out_drugs_dir / f"MolGNet_{idx}.csv" + df_emb.to_csv(out_path, sep="\t", index=False) + + print("Done.") + print("Graphs saved to:", out_graphs) + print("Node embeddings saved to:", out_molg) + print("Per-drug CSVs in:", out_drugs_dir) + + +def parse_args() -> argparse.Namespace: + """Parse command-line arguments. + + :return: Parsed arguments namespace. + """ + p = argparse.ArgumentParser(description=("Standalone MolGNet extractor " "(dataset-oriented)")) + p.add_argument( + "dataset_name", + help="Name of the dataset (folder under data_path)", + ) + p.add_argument( + "--data_path", + default="data", + help="Top-level data folder path", + ) + p.add_argument( + "--smiles-col", + dest="smiles_col", + default="canonical_smiles", + help="Column name for SMILES in input CSV", + ) + p.add_argument( + "--id-col", + dest="id_col", + default="pubchem_id", + help="Column name for unique ID in input CSV", + ) + p.add_argument( + "--checkpoint", + default="MolGNet.pt", + help="MolGNet checkpoint (state_dict), can be obtained from Zenodo: https://doi.org/10.5281/zenodo.12633909", + ) + p.add_argument( + "--device", + default=None, + help="torch device string, e.g. cpu or cuda:0", + ) + return p.parse_args() + + +if __name__ == "__main__": + args = parse_args() + run(args) diff --git a/drevalpy/datasets/featurizer/create_pharmaformer_drug_embeddings.py b/drevalpy/datasets/featurizer/create_pharmaformer_drug_embeddings.py new file mode 100644 index 00000000..3100affa --- /dev/null +++ b/drevalpy/datasets/featurizer/create_pharmaformer_drug_embeddings.py @@ -0,0 +1,164 @@ +"""Preprocesses drug SMILES strings into BPE-encoded embeddings. + +WARNING: This featurizer produces problematic embeddings and should ONLY be used +with the PharmaFormer model. It replicates the original PharmaFormer implementation +for compatibility, but the embeddings have known issues and should not be used +for any other models. + +Details about the issues are explained in: +https://github.com/daisybio/drevalpy/pull/336#discussion_r2682718948 +""" + +import argparse +import codecs +import os +import tempfile +from pathlib import Path + +import numpy as np +import pandas as pd +from tqdm import tqdm + +try: + from subword_nmt.apply_bpe import BPE + from subword_nmt.learn_bpe import learn_bpe +except ImportError: + raise ImportError("Please install subword-nmt package for BPE SMILES featurizer: pip install subword-nmt") + + +def create_pharmaformer_drug_embeddings( + data_path: str, + dataset_name: str, + num_symbols: int = 10000, + max_length: int = 128, +) -> None: + """ + Create BPE-encoded SMILES embeddings for drugs. + + WARNING: This featurizer produces problematic embeddings and should ONLY be used + with the PharmaFormer model. It replicates the original PharmaFormer implementation + for compatibility purposes, but the embeddings have known issues and should NOT + be used for any other models. + + Details about the issues are explained in: + https://github.com/daisybio/drevalpy/pull/336#discussion_r2682718948 + + Process: + 1. Read drug_smiles.csv + 2. Learn BPE codes from all SMILES strings + 3. Apply BPE to each SMILES + 4. Convert to character ordinals + 5. Pad/truncate to max_length + 6. Save to drug_bpe_smiles.csv + + :param data_path: Path to the data folder + :param dataset_name: Name of the dataset to process + :param num_symbols: Number of BPE symbols to learn + :param max_length: Maximum length of encoded SMILES (padding/truncation) + :raises FileNotFoundError: If drug_smiles.csv is not found + :raises Exception: If a drug fails to process + """ + data_dir = Path(data_path).resolve() + dataset_dir = data_dir / dataset_name + + smiles_file = dataset_dir / "drug_smiles.csv" + bpe_codes_path = dataset_dir / "bpe.codes" + output_file = dataset_dir / "drug_bpe_smiles.csv" + + if not smiles_file.exists(): + raise FileNotFoundError(f"Error: {smiles_file} not found.") + + # Read SMILES data + smiles_df = pd.read_csv(smiles_file, dtype={"canonical_smiles": str, "pubchem_id": str}) + smiles_df = smiles_df.dropna(subset=["canonical_smiles"]) + + print(f"Learning BPE codes from {len(smiles_df)} SMILES strings...") + + # Create temporary file with SMILES strings for BPE learning + # learn_bpe expects one item per line + with tempfile.NamedTemporaryFile(mode="w", encoding="utf-8", delete=False, suffix=".txt") as tmp_file: + tmp_smiles_file = tmp_file.name + for smiles in smiles_df["canonical_smiles"]: + tmp_file.write(f"{smiles}\n") + + # Learn BPE codes from SMILES corpus + try: + with codecs.open(tmp_smiles_file, encoding="utf-8") as f_in: + with codecs.open(str(bpe_codes_path), "w", encoding="utf-8") as f_out: + learn_bpe(f_in, f_out, num_symbols=num_symbols) + finally: + # Clean up temporary file + if os.path.exists(tmp_smiles_file): + os.remove(tmp_smiles_file) + + print(f"BPE codes saved to {bpe_codes_path}") + + # Load BPE encoder + with codecs.open(str(bpe_codes_path), encoding="utf-8") as f_in: + bpe = BPE(f_in) + + # Encode each SMILES string + embeddings_list = [] + drug_ids = [] + + print(f"Encoding {len(smiles_df)} SMILES strings...") + + for row in tqdm(smiles_df.itertuples(index=False), total=len(smiles_df)): + drug_id = row.pubchem_id + smiles = row.canonical_smiles + + try: + # Apply BPE + bpe_processed = bpe.process_line(smiles) + # Convert to character ordinals + encoded = [ord(char) for char in bpe_processed] + # Pad/truncate to max_length + if len(encoded) > max_length: + encoded = encoded[:max_length] + else: + encoded = np.pad(encoded, (0, max_length - len(encoded)), "constant").tolist() + + embeddings_list.append(encoded) + drug_ids.append(drug_id) + except Exception as e: + print(f"\nFailed to process drug {drug_id} with SMILES: {smiles}") + print(f"Error: {e}") + raise e + + # Create DataFrame with pubchem_id and encoded features + embeddings_df = pd.DataFrame(embeddings_list) + embeddings_df.columns = [f"feature_{i}" for i in range(max_length)] + embeddings_df.insert(0, "pubchem_id", drug_ids) + embeddings_df.to_csv(output_file, index=False) + + print(f"Finished processing. BPE-encoded SMILES saved to {output_file}") + + +def main(): + """Process drug SMILES and save BPE-encoded embeddings. + + WARNING: This featurizer produces problematic embeddings and should ONLY be used + with the PharmaFormer model. It replicates the original PharmaFormer implementation + for compatibility purposes, but the embeddings have known issues and should NOT + be used for any other models. + + Details about the issues are explained in: + https://github.com/daisybio/drevalpy/pull/336#discussion_r2682718948 + """ + parser = argparse.ArgumentParser(description="Preprocess drug SMILES to BPE-encoded embeddings.") + parser.add_argument("dataset_name", type=str, help="The name of the dataset to process.") + parser.add_argument("--data_path", type=str, default="data", help="Path to the data folder") + parser.add_argument("--num-symbols", type=int, default=10000, help="Number of BPE symbols to learn") + parser.add_argument("--max-length", type=int, default=128, help="Maximum length of encoded SMILES") + args = parser.parse_args() + + create_pharmaformer_drug_embeddings( + data_path=args.data_path, + dataset_name=args.dataset_name, + num_symbols=args.num_symbols, + max_length=args.max_length, + ) + + +if __name__ == "__main__": + main() diff --git a/drevalpy/datasets/loader.py b/drevalpy/datasets/loader.py index 6e594056..497ac03e 100644 --- a/drevalpy/datasets/loader.py +++ b/drevalpy/datasets/loader.py @@ -6,10 +6,17 @@ import pandas as pd -from ..pipeline_function import pipeline_function from .curvecurator import fit_curves from .dataset import DrugResponseDataset -from .utils import ALLOWED_MEASURES, CELL_LINE_IDENTIFIER, DRUG_IDENTIFIER, TISSUE_IDENTIFIER, download_dataset +from .utils import ( + ALLOWED_MEASURES, + CELL_LINE_IDENTIFIER, + DRUG_IDENTIFIER, + TISSUE_IDENTIFIER, + download_dataset, + download_from_url, + unzip_data, +) def check_measure(measure_queried: str, measures_data: list[str], dataset_name: str) -> None: @@ -29,29 +36,38 @@ def check_measure(measure_queried: str, measures_data: list[str], dataset_name: ) -def load_gdsc1( +def _load_zenodo_dataset( path_data: str = "data", measure: str = "LN_IC50_curvecurator", - file_name: str = "GDSC1.csv", - dataset_name: str = "GDSC1", + file_name: str = "dataset_name.csv", + dataset_name: str = "dataset_name", ) -> DrugResponseDataset: """ - Loads the GDSC1 dataset. + Parent function to load_gdsc1, load_gdsc2, ... :param path_data: Path to the dataset. - :param file_name: File name of the dataset. - :param measure: The name of the column containing the measure to predict, default = "LN_IC50_curvecurator" - - :param dataset_name: Name of the dataset. + :param file_name: File name of the dataset, e.g., GDSC1.csv + :param measure: File name of the dataset, default = "LN_IC50_curvecurator". + :param dataset_name: Name of the dataset, e.g., GDSC1. :return: DrugResponseDataset containing response, cell line IDs, and drug IDs. """ path = os.path.join(path_data, dataset_name, file_name) if not os.path.exists(path): download_dataset(dataset_name, path_data, redownload=True) + # tissue mapping is not in TOY play dataset + meta_path = os.path.join(path_data, "meta", "tissue_mapping.csv") + if not os.path.exists(meta_path): + download_dataset("meta", path_data, redownload=True) - response_data = pd.read_csv(path, dtype={"pubchem_id": str}) + response_data = pd.read_csv(path, dtype={"pubchem_id": str, "cell_line_name": str}) response_data[DRUG_IDENTIFIER] = response_data[DRUG_IDENTIFIER].str.replace(",", "") check_measure(measure, list(response_data.columns), dataset_name) + if dataset_name == "BeatAML2": + # only has AML patients = blood + response_data[TISSUE_IDENTIFIER] = "Blood" + elif dataset_name == "PDX_Bruna": + # only has breast cancer patients + response_data[TISSUE_IDENTIFIER] = "Breast" return DrugResponseDataset( response=response_data[measure].values, cell_line_ids=response_data[CELL_LINE_IDENTIFIER].values, @@ -61,64 +77,78 @@ def load_gdsc1( ) -def load_gdsc2(path_data: str = "data", measure: str = "LN_IC50_curvecurator", file_name: str = "GDSC2.csv"): +def load_gdsc1( + path_data: str = "data", + measure: str = "LN_IC50_curvecurator", +) -> DrugResponseDataset: """ - Loads the GDSC2 dataset. + Loads the GDSC1 dataset. :param path_data: Path to the dataset. - :param file_name: File name of the dataset. :param measure: The name of the column containing the measure to predict, default = "LN_IC50_curvecurator" - :return: DrugResponseDataset containing response, cell line IDs, and drug IDs. """ - return load_gdsc1(path_data=path_data, measure=measure, file_name=file_name, dataset_name="GDSC2") + return _load_zenodo_dataset(path_data=path_data, measure=measure, file_name="GDSC1.csv", dataset_name="GDSC1") -def load_ccle( - path_data: str = "data", measure: str = "LN_IC50_curvecurator", file_name: str = "CCLE.csv" -) -> DrugResponseDataset: +def load_gdsc2( + path_data: str = "data", + measure: str = "LN_IC50_curvecurator", +): """ - Loads the CCLE dataset. + Loads the GDSC2 dataset. :param path_data: Path to the dataset. - :param file_name: File name of the dataset. :param measure: The name of the column containing the measure to predict, default = "LN_IC50_curvecurator" :return: DrugResponseDataset containing response, cell line IDs, and drug IDs. """ - dataset_name = "CCLE" - path = os.path.join(path_data, dataset_name, file_name) - if not os.path.exists(path): - download_dataset(dataset_name, path_data, redownload=True) + return _load_zenodo_dataset(path_data=path_data, measure=measure, file_name="GDSC2.csv", dataset_name="GDSC2") - response_data = pd.read_csv(path, dtype={"pubchem_id": str}) - response_data[DRUG_IDENTIFIER] = response_data[DRUG_IDENTIFIER].str.replace(",", "") - check_measure(measure, list(response_data.columns), dataset_name) - return DrugResponseDataset( - response=response_data[measure].values, - cell_line_ids=response_data[CELL_LINE_IDENTIFIER].values, - drug_ids=response_data[DRUG_IDENTIFIER].values, - tissues=response_data[TISSUE_IDENTIFIER].values, - dataset_name=dataset_name, - ) - -def _load_toy( - path_data: str = "data", measure: str = "LN_IC50_curvecurator", dataset_name="TOYv1" +def load_ccle( + path_data: str = "data", + measure: str = "LN_IC50_curvecurator", ) -> DrugResponseDataset: """ - Loads small Toy dataset, subsampled from CTRPv2 or GDSC2. + Loads the CCLE dataset. :param path_data: Path to the dataset. :param measure: The name of the column containing the measure to predict, default = "LN_IC50_curvecurator" - :param dataset_name: Name of the dataset. Either "TOYv1" or "TOYv2". :return: DrugResponseDataset containing response, cell line IDs, and drug IDs. """ - path = os.path.join(path_data, dataset_name, f"{dataset_name}.csv") - if not os.path.exists(path): - download_dataset(dataset_name, path_data, redownload=True) - response_data = pd.read_csv(path, dtype={"pubchem_id": str}) + return _load_zenodo_dataset(path_data=path_data, measure=measure, file_name="CCLE.csv", dataset_name="CCLE") + + +def _load_test_data( + path_data: str = "data", measure: str = "LN_IC50_curvecurator", dataset_name: str = "TOYv1" +) -> DrugResponseDataset: + # ensure that path_data exists + Path(path_data).mkdir(parents=True, exist_ok=True) + test_data_path = "https://github.com/nf-core/test-datasets/raw/refs/heads/drugresponseeval/test_data" + # first get meta + meta_path = os.path.join(path_data, "meta") + if not os.path.exists(meta_path): + file_url = f"{test_data_path}/meta.zip" + file_path = Path(path_data) / "meta.zip" + response_meta = download_from_url(dataset_name="meta", file_url=file_url) + unzip_data(path_to_zip=file_path, response=response_meta, data_path=path_data) + # get raw test data + raw_data_path = os.path.join(path_data, "CTRPv2_sample_test") + if not os.path.exists(raw_data_path): + file_url = f"{test_data_path}/CTRPv2_sample_test.zip" + file_path = Path(path_data) / "CTRPv2_sample_test.zip" + response_raw = download_from_url(dataset_name="CTRPv2_sample_test", file_url=file_url) + unzip_data(path_to_zip=file_path, response=response_raw, data_path=path_data) + file_url = f"{test_data_path}/{dataset_name}.zip" + file_path = Path(path_data) / f"{dataset_name}.zip" + response = download_from_url(dataset_name=dataset_name, file_url=file_url) + unzip_data(path_to_zip=file_path, response=response, data_path=path_data) + + file_name = Path(path_data) / dataset_name / f"{dataset_name}.csv" + response_data = pd.read_csv(file_name, dtype={"pubchem_id": str, "cell_line_name": str}) + response_data[DRUG_IDENTIFIER] = response_data[DRUG_IDENTIFIER].str.replace(",", "") check_measure(measure, list(response_data.columns), dataset_name) return DrugResponseDataset( response=response_data[measure].values, @@ -138,7 +168,7 @@ def load_toyv1(path_data: str = "data", measure: str = "LN_IC50_curvecurator") - :return: DrugResponseDataset containing response, cell line IDs, and drug IDs. """ - return _load_toy(path_data, measure, "TOYv1") + return _load_test_data(path_data=path_data, measure=measure, dataset_name="TOYv1") def load_toyv2(path_data: str = "data", measure: str = "LN_IC50_curvecurator") -> DrugResponseDataset: @@ -150,57 +180,63 @@ def load_toyv2(path_data: str = "data", measure: str = "LN_IC50_curvecurator") - :return: DrugResponseDataset containing response, cell line IDs, and drug IDs. """ - return _load_toy(path_data, measure, "TOYv2") + return _load_test_data(path_data=path_data, measure=measure, dataset_name="TOYv2") -def _load_ctrpv(version: str, path_data: str = "data", measure: str = "LN_IC50_curvecurator") -> DrugResponseDataset: +def load_ctrpv1(path_data: str = "data", measure: str = "LN_IC50_curvecurator") -> DrugResponseDataset: """ Load CTRPv1 dataset. - :param version: The version of the CTRP dataset to load. - :param path_data: Path to location of CTRPv1 dataset + :param path_data: Path to the location of CTRPv1 dataset :param measure: The name of the column containing the measure to predict, default = "LN_IC50_curvecurator" :return: DrugResponseDataset containing response, cell line IDs, and drug IDs """ - dataset_name = "CTRPv" + version - path = os.path.join(path_data, dataset_name, f"{dataset_name}.csv") - if not os.path.exists(path): - download_dataset(dataset_name, path_data, redownload=True) - response_data = pd.read_csv(path, dtype={"pubchem_id": str}) - check_measure(measure, list(response_data.columns), dataset_name) - - return DrugResponseDataset( - response=response_data[measure].values, - cell_line_ids=response_data[CELL_LINE_IDENTIFIER].values, - drug_ids=response_data[DRUG_IDENTIFIER].values, - tissues=response_data[TISSUE_IDENTIFIER].values, - dataset_name=dataset_name, - ) + return _load_zenodo_dataset(path_data=path_data, measure=measure, file_name="CTRPv1.csv", dataset_name="CTRPv1") -def load_ctrpv1(path_data: str = "data", measure: str = "LN_IC50_curvecurator") -> DrugResponseDataset: +def load_ctrpv2(path_data: str = "data", measure: str = "LN_IC50_curvecurator") -> DrugResponseDataset: """ Load CTRPv2 dataset. - :param path_data: Path to location of CTRPv2 dataset - :param measure: The name of the column containing the measure to predict, default = "LN_IC50_curvecurator" + :param path_data: Path to the location of CTRPv2 dataset + :param measure: The name of the column containing the measure to predict, default: LN_IC50_curvecurator :return: DrugResponseDataset containing response, cell line IDs, and drug IDs """ - return _load_ctrpv("1", path_data, measure) + return _load_zenodo_dataset(path_data=path_data, measure=measure, file_name="CTRPv2.csv", dataset_name="CTRPv2") -def load_ctrpv2(path_data: str = "data", measure: str = "LN_IC50_curvecurator") -> DrugResponseDataset: +def load_beataml2( + path_data: str = "data", + measure: str = "LN_IC50_curvecurator", +) -> DrugResponseDataset: """ - Load CTRPv2 dataset. + Loads the BeatAML2 dataset. - :param path_data: Path to location of CTRPv2 dataset + :param path_data: Path to the dataset. :param measure: The name of the column containing the measure to predict, default: LN_IC50_curvecurator - :return: DrugResponseDataset containing response, cell line IDs, and drug IDs + :return: DrugResponseDataset containing response, cell line IDs, and drug IDs. """ - return _load_ctrpv("2", path_data, measure) + return _load_zenodo_dataset(path_data=path_data, measure=measure, file_name="BeatAML2.csv", dataset_name="BeatAML2") + + +def load_pdx_bruna( + path_data: str = "data", + measure: str = "LN_IC50_curvecurator", +) -> DrugResponseDataset: + """ + Loads the PDX_Bruna dataset. + + :param path_data: Path to the dataset. + :param measure: The name of the column containing the measure to predict, default: LN_IC50_curvecurator + + :return: DrugResponseDataset containing response, cell line IDs, and drug IDs. + """ + return _load_zenodo_dataset( + path_data=path_data, measure=measure, file_name="PDX_Bruna.csv", dataset_name="PDX_Bruna" + ) def load_custom( @@ -221,6 +257,7 @@ def load_custom( ) +# Used in pipeline AVAILABLE_DATASETS: dict[str, Callable] = { "GDSC1": load_gdsc1, "GDSC2": load_gdsc2, @@ -229,10 +266,11 @@ def load_custom( "TOYv2": load_toyv2, "CTRPv1": load_ctrpv1, "CTRPv2": load_ctrpv2, + "BeatAML2": load_beataml2, + "PDX_Bruna": load_pdx_bruna, } -@pipeline_function def load_dataset( dataset_name: str, path_data: str = "data", @@ -240,6 +278,7 @@ def load_dataset( curve_curator: bool = False, cores: int = 1, tissue_column: str | None = None, + normalize: bool = False, ) -> DrugResponseDataset: """ Load a dataset based on the dataset name. @@ -260,14 +299,16 @@ def load_dataset( :param cores: Number of cores to use for CurveCurator fitting. Only used when curve_curator is True, default = 1 :param tissue_column: The name of the column containing the tissue type. If None, no tissue information is loaded. This is only used when loading a custom dataset. Default = None. + :param normalize: Whether to normalize the response values to [0, 1] for curvecurator. Default = False. + Only used for custom datasets when curve_curator is True. :return: A DrugResponseDataset containing response, cell line IDs, drug IDs, and dataset name. :raises FileNotFoundError: If the custom dataset or raw viability data could not be found at the given path. """ if curve_curator: measure += "_curvecurator" - input_file = Path(path_data) / dataset_name / f"{dataset_name}_raw.csv" + input_file = Path(path_data).resolve() / dataset_name / f"{dataset_name}_raw.csv" else: - input_file = Path(path_data) / dataset_name / f"{dataset_name}.csv" + input_file = Path(path_data).resolve() / dataset_name / f"{dataset_name}.csv" if dataset_name in AVAILABLE_DATASETS: return AVAILABLE_DATASETS[dataset_name](path_data, measure=measure) @@ -275,12 +316,16 @@ def load_dataset( if input_file.is_file(): if curve_curator: fit_curves( - input_file=input_file, - output_dir=input_file.parent, + input_file=str(input_file), + output_dir=str(input_file.parent), dataset_name=dataset_name, cores=cores, + normalize=normalize, ) return load_custom( - Path(path_data) / dataset_name / f"{dataset_name}.csv", measure=measure, tissue_column=tissue_column + path_data=Path(path_data) / dataset_name / f"{dataset_name}.csv", + dataset_name=dataset_name, + measure=measure, + tissue_column=tissue_column, ) raise FileNotFoundError(f"Custom dataset does not exist at given path: {input_file}") diff --git a/drevalpy/datasets/map_tissues.py b/drevalpy/datasets/map_tissues.py index ba836006..b7a7a7aa 100644 --- a/drevalpy/datasets/map_tissues.py +++ b/drevalpy/datasets/map_tissues.py @@ -193,7 +193,7 @@ } -def _parse_cellosaurus(cellosaurus_path: str) -> tuple[dict, dict, dict]: +def _parse_cellosaurus(cellosaurus_path: str | Path) -> tuple[dict, dict, dict]: """ Parse Cellosaurus file and return mappings from cellosaurus ID to name, site, and disease. @@ -201,7 +201,7 @@ def _parse_cellosaurus(cellosaurus_path: str) -> tuple[dict, dict, dict]: :return: Tuple of dictionaries (id_to_name, id_to_site, id_to_disease) """ id_to_name, id_to_site, id_to_disease = {}, {}, {} - + cellosaurus_path = str(cellosaurus_path) with open(cellosaurus_path, encoding="utf-8") as f: current_ids, current_name, site, disease = [], None, None, None for line in f: @@ -407,8 +407,7 @@ def main(): tissue_map = _apply_manual_cell_line_corrections(tissue_map) - final.loc[:, "tissue"] = final.loc[:, "cellosaurus_id"].map(tissue_map) - final = final.copy() + final = final.assign(tissue=final["cellosaurus_id"].map(tissue_map)) if save_tissue_mapping: final.drop_duplicates(subset="cellosaurus_id", inplace=True) tissue_mapping_path = os.path.join(data_path, "meta", "tissue_mapping.csv") diff --git a/drevalpy/datasets/utils.py b/drevalpy/datasets/utils.py index d21e3454..9ac6b227 100644 --- a/drevalpy/datasets/utils.py +++ b/drevalpy/datasets/utils.py @@ -8,7 +8,9 @@ import networkx as nx import numpy as np import requests +from requests import Response +# DRUG_IDENTIFIER, CELL_LINE_IDENTIFIER, and TISSUE_IDENTIFIER are used in pipeline DRUG_IDENTIFIER = "pubchem_id" CELL_LINE_IDENTIFIER = "cell_line_name" TISSUE_IDENTIFIER = "tissue" @@ -16,9 +18,43 @@ ALLOWED_MEASURES.extend([f"{m}_curvecurator" for m in ALLOWED_MEASURES]) +def unzip_data(path_to_zip: Path, response: Response, data_path: str): + """ + Unzips the downloaded data. + + :param path_to_zip: Path to the zip file to be unzipped. + :param response: HTML response containing response.content + :param data_path: Where the unzipped directory should be stored + """ + with open(path_to_zip, "wb") as f: + f.write(response.content) + + with zipfile.ZipFile(path_to_zip, "r") as z: + for member in z.infolist(): + if not member.filename.startswith("__MACOSX/"): + z.extract(member, os.path.join(data_path)) + path_to_zip.unlink() # Remove zip file after extraction + + +def download_from_url(dataset_name: str, file_url: str) -> Response: + """ + Download a file from a given URL. + + :param dataset_name: how the dataset is called + :param file_url: exact URL to the zip file + :return: HTML response containing response.content + :raises HTTPError: if the download fails + """ + print(f"Downloading {dataset_name} from {file_url}...") + response = requests.get(file_url, timeout=120) + if response.status_code != 200: + raise requests.exceptions.HTTPError(f"Error downloading file: " f"{response.status_code}") + return response + + def download_dataset( dataset_name: str, - data_path: str | Path = "data", + data_path: str = "data", redownload: bool = False, ): """ @@ -54,21 +90,9 @@ def download_dataset( # Download each file name_to_url = {file["key"]: file["links"]["self"] for file in data["files"]} file_url = name_to_url[file_name] - # Download the file - print(f"Downloading {dataset_name} from {file_url}...") - response = requests.get(file_url, timeout=timeout) - if response.status_code != 200: - raise requests.exceptions.HTTPError(f"Error downloading file {dataset_name}: " f"{response.status_code}") - - # Save the file - with open(file_path, "wb") as f: - f.write(response.content) - with zipfile.ZipFile(file_path, "r") as z: - for member in z.infolist(): - if not member.filename.startswith("__MACOSX/"): - z.extract(member, os.path.join(data_path)) - file_path.unlink() # Remove zip file after extraction + response = download_from_url(dataset_name=dataset_name, file_url=file_url) + unzip_data(path_to_zip=file_path, response=response, data_path=data_path) print(f"{dataset_name} data downloaded and extracted to {data_path}") diff --git a/drevalpy/experiment.py b/drevalpy/experiment.py index 0379c5f7..635c1ea3 100644 --- a/drevalpy/experiment.py +++ b/drevalpy/experiment.py @@ -13,8 +13,13 @@ import torch from sklearn.base import TransformerMixin -from .datasets.dataset import DrugResponseDataset, FeatureDataset -from .evaluation import evaluate, get_mode +try: + import wandb +except ImportError: + wandb = None # type: ignore[assignment] + +from .datasets.dataset import DrugResponseDataset, FeatureDataset, split_early_stopping_data +from .evaluation import get_mode from .models import MODEL_FACTORY, MULTI_DRUG_MODEL_FACTORY, SINGLE_DRUG_MODEL_FACTORY from .models.drp_model import DRPModel from .pipeline_function import pipeline_function @@ -22,7 +27,7 @@ if importlib.util.find_spec("ray"): import ray else: - ray = None + ray = None # type: ignore[assignment] def drug_response_experiment( @@ -32,7 +37,7 @@ def drug_response_experiment( response_transformation: TransformerMixin | None = None, run_id: str = "", test_mode: str = "LPO", - metric: str = "RMSE", + hpam_optimization_metric: str = "RMSE", n_cv_splits: int = 5, multiprocessing: bool = False, randomization_mode: list[str] | None = None, @@ -44,6 +49,8 @@ def drug_response_experiment( path_data: str = "data", model_checkpoint_dir: str = "TEMPORARY", hyperparameter_tuning=True, + final_model_on_full_data: bool = False, + wandb_project: str | None = None, ) -> None: """ Run the drug response prediction experiment. Save results to disc. @@ -52,7 +59,8 @@ def drug_response_experiment( :param baselines: list of baseline models. No randomization or robustness tests are run for the baseline models. :param response_data: drug response dataset :param response_transformation: normalizer to use for the response data - :param metric: metric to use for hyperparameter optimization + :param hpam_optimization_metric: metric to use for hyperparameter optimization + (i.e., for selecting the best model on the validation set) :param n_cv_splits: number of cross-validation splits :param multiprocessing: whether to use multiprocessing. This requires Ray to be installed. :param randomization_mode: list of randomization modes to do. Modes: SVCC, SVRC, SVCD, SVRD Can be a list of @@ -92,10 +100,20 @@ def drug_response_experiment( :param path_data: path to the data directory, usually data/ :param model_checkpoint_dir: directory to save model checkpoints. If "TEMPORARY", a temporary directory is created. :param hyperparameter_tuning: whether to run in debug mode - if False, only select first hyperparameter set + :param final_model_on_full_data: if True, a final/production model is saved in the results directory. + If hyperparameter_tuning is true, the final model is produced according to the hyperparameter tuning procedure + which was evaluated in the nested cross validation. + :param wandb_project: if provided, enables wandb logging for all DRPModel instances throughout training. + All hyperparameters and metrics will be logged to the specified wandb project. :raises ValueError: if no cv splits are found """ + # Default baseline model, needed for normalization + nme = MODEL_FACTORY["NaiveMeanEffectsPredictor"] if baselines is None: - baselines = [] + baselines = [nme] + elif nme not in baselines: + baselines.append(nme) + cross_study_datasets = cross_study_datasets or [] result_path = os.path.join(path_out, run_id, response_data._name, test_mode) split_path = os.path.join(result_path, "splits") @@ -127,6 +145,7 @@ def drug_response_experiment( ) response_data.save_splits(path=split_path) + # Build the list of models to run (done regardless of whether splits were newly created or loaded) model_list = make_model_list(models + baselines, response_data) for model_name in model_list.keys(): print(f"Running {model_name}") @@ -162,7 +181,9 @@ def drug_response_experiment( raise ValueError("No cv splits found.") for split_index, split in enumerate(response_data.cv_splits): + print() print(f"################# FOLD {split_index + 1}/{len(response_data.cv_splits)} " f"#################") + print() prediction_file = os.path.join(predictions_path, f"predictions_split_{split_index}.csv") @@ -177,6 +198,16 @@ def drug_response_experiment( ) = get_datasets_from_cv_split(split, model_class, model_name, drug_id) model = model_class() + # Base wandb configuration for this split (used when training actually happens) + base_wandb_config = { + "model_name": model_name, + "drug_id": drug_id, + "split_index": split_index, + "test_mode": test_mode, + "dataset": response_data.dataset_name, + "n_cv_splits": n_cv_splits, + "hyperparameter_tuning": hyperparameter_tuning, + } if not os.path.isfile( prediction_file @@ -188,11 +219,17 @@ def drug_response_experiment( "early_stopping_dataset": early_stopping_dataset, "hpam_set": model_hpam_set, "response_transformation": response_transformation, - "metric": metric, + "metric": hpam_optimization_metric, "path_data": path_data, "model_checkpoint_dir": model_checkpoint_dir, } + # During hyperparameter tuning, create separate wandb runs per trial if enabled + if wandb_project is not None: + tuning_inputs["wandb_project"] = wandb_project + tuning_inputs["split_index"] = split_index + tuning_inputs["wandb_base_config"] = base_wandb_config + if multiprocessing: tuning_inputs["ray_path"] = os.path.abspath(os.path.join(result_path, "raytune")) best_hpams = hpam_tune_raytune(**tuning_inputs) @@ -201,6 +238,9 @@ def drug_response_experiment( print(f"Best hyperparameters: {best_hpams}") print("Training model on full train and validation set to predict test set") + + # Log best hyperparameters to wandb (they will be logged when build_model is called) + # The best hyperparameters will be logged via build_model -> log_hyperparameters # save best hyperparameters as json with open( hpam_save_path, @@ -212,6 +252,25 @@ def drug_response_experiment( train_dataset.add_rows(validation_dataset) # use full train val set data for final training train_dataset.shuffle(random_state=42) + # Initialize wandb for the final training on the full train+validation set + # This happens regardless of whether hyperparameter tuning was performed + if wandb_project is not None: + final_run_name = f"{model_name}" + if drug_id is not None: + final_run_name += f"_{drug_id}" + final_run_name += f"_split_{split_index}_final" + + final_config = { + **base_wandb_config, + "phase": "final_training", + } + model.init_wandb( + project=wandb_project, + config=final_config, + name=final_run_name, + tags=[model_name, test_mode, response_data.dataset_name or "unknown", "final"], + ) + test_dataset = train_and_predict( model=model, hpams=best_hpams, @@ -223,6 +282,24 @@ def drug_response_experiment( model_checkpoint_dir=model_checkpoint_dir, ) + # Log final metrics on test set for all models + # Metrics will be logged as test_RMSE, test_R^2, test_Pearson, etc. + # This happens regardless of whether hyperparameter tuning was performed + if ( + wandb_project is not None + and wandb is not None + and len(test_dataset) > 0 + and test_dataset.predictions is not None + and len(test_dataset.predictions) > 0 + ): + # Ensure wandb run is active before logging metrics + if wandb.run is not None: + model.compute_and_log_final_metrics( + test_dataset, + additional_metrics=[hpam_optimization_metric], + prefix="test_", + ) + for cross_study_dataset in cross_study_datasets: print(f"Cross study prediction on {cross_study_dataset.dataset_name}") cross_study_dataset.remove_nan_responses() @@ -247,6 +324,10 @@ def drug_response_experiment( encoding="utf-8", ) as f: best_hpams = json.load(f) + + # Finish wandb run for this split + if wandb_project is not None: + model.finish_wandb() if not is_baseline: if randomization_mode is not None: print(f"Randomization tests for {model_class.get_model_name()}") @@ -283,6 +364,27 @@ def drug_response_experiment( split_index=split_index, response_transformation=response_transformation, ) + + if final_model_on_full_data and (model_class not in baselines): + final_model_path = generate_data_saving_path( + model_name=model_name, + drug_id=drug_id, + result_path=result_path, + suffix="final_model", + ) + train_final_model( + model_class=model_class, + full_dataset=response_data.copy(), + response_transformation=response_transformation, + path_data=path_data, + model_checkpoint_dir=model_checkpoint_dir, + metric=hpam_optimization_metric, + final_model_path=final_model_path, + test_mode=test_mode, + val_ratio=0.1, + hyperparameter_tuning=hyperparameter_tuning, + ) + consolidate_single_drug_model_predictions( models=models, n_cv_splits=n_cv_splits, @@ -560,7 +662,7 @@ def cross_study_prediction( drug_input=drug_input, ) if response_transformation: - dataset._response = response_transformation.inverse_transform(dataset.response) + dataset.inverse_transform(response_transformation) else: dataset._predictions = np.array([]) dataset.to_csv( @@ -714,7 +816,7 @@ def randomization_test( path_out: str, split_index: int, randomization_type: str = "permutation", - response_transformation=TransformerMixin | None, + response_transformation: TransformerMixin | None = None, model_checkpoint_dir: str = "TEMPORARY", ) -> None: """ @@ -900,6 +1002,12 @@ def train_and_predict( :returns: prediction dataset with predictions :raises ValueError: if train_dataset does not have a dataset_name """ + # Make copies to avoid that models ever mutate the data + train_dataset = train_dataset.copy() + prediction_dataset = prediction_dataset.copy() + if early_stopping_dataset is not None: + early_stopping_dataset = early_stopping_dataset.copy() + model.build_model(hyperparameters=hpams) if train_dataset.dataset_name is None: raise ValueError("train_dataset must have a dataset_name") @@ -916,7 +1024,8 @@ def train_and_predict( # making sure there are no missing features: len_train_before = len(train_dataset) len_pred_before = len(prediction_dataset) - print(f"Number of cell lines in features: {len(cell_lines_to_keep)}") + if cell_lines_to_keep is not None: + print(f"Number of cell lines in features: {len(cell_lines_to_keep)}") if drugs_to_keep is not None: print(f"Number of drugs in features: {len(drugs_to_keep)}") print(f"Number of cell lines in train dataset: {len(np.unique(train_dataset.cell_line_ids))}") @@ -968,6 +1077,7 @@ def train_and_predict( ) if len(prediction_dataset) > 0: + drug_input = drug_features.copy() if drug_features is not None else None prediction_dataset._predictions = model.predict( cell_line_ids=prediction_dataset.cell_line_ids, drug_ids=prediction_dataset.drug_ids, @@ -975,11 +1085,15 @@ def train_and_predict( drug_input=drug_input, ) - if response_transformation: - prediction_dataset.inverse_transform(response_transformation) else: prediction_dataset._predictions = np.array([]) + if response_transformation: + train_dataset.inverse_transform(response_transformation) + prediction_dataset.inverse_transform(response_transformation) + if early_stopping_dataset is not None: + early_stopping_dataset.inverse_transform(response_transformation) + return prediction_dataset @@ -991,7 +1105,7 @@ def train_and_evaluate( validation_dataset: DrugResponseDataset, early_stopping_dataset: DrugResponseDataset | None = None, response_transformation: TransformerMixin | None = None, - metric: str = "rmse", + metric: str = "RMSE", model_checkpoint_dir: str = "TEMPORARY", ) -> dict[str, float]: """ @@ -1018,7 +1132,20 @@ def train_and_evaluate( response_transformation=response_transformation, model_checkpoint_dir=model_checkpoint_dir, ) - return evaluate(validation_dataset, metric=[metric]) + + # Compute final metrics using DRPModel helper (always includes R^2 and PCC) + # Add primary metric if it's not already included + additional_metrics = None + if metric not in ["R^2", "Pearson"]: + additional_metrics = [metric] + # Use "val_" prefix to clearly denote validation metrics (val_RMSE, val_R^2, val_Pearson) + results = model.compute_and_log_final_metrics( + validation_dataset, + additional_metrics=additional_metrics, + prefix="val_", + ) + + return results def hpam_tune( @@ -1031,6 +1158,10 @@ def hpam_tune( metric: str = "RMSE", path_data: str = "data", model_checkpoint_dir: str = "TEMPORARY", + *, + split_index: int | None = None, + wandb_project: str | None = None, + wandb_base_config: dict[str, Any] | None = None, ) -> dict: """ Tune the hyperparameters for the given model in an iterative manner. @@ -1044,6 +1175,9 @@ def hpam_tune( :param metric: metric to evaluate which model is the best :param path_data: path to the data directory, e.g., data/ :param model_checkpoint_dir: directory to save model checkpoints + :param split_index: optional CV split index, used for naming wandb runs + :param wandb_project: optional wandb project name; if provided, enables per-trial wandb runs + :param wandb_base_config: optional base config dict to include in each wandb run :returns: best hyperparameters :raises AssertionError: if hpam_set is empty """ @@ -1052,11 +1186,44 @@ def hpam_tune( if len(hpam_set) == 1: return hpam_set[0] + # Mark that we're in hyperparameter tuning phase + # This prevents updating wandb.config during tuning - we'll only log final best hyperparameters + model._in_hyperparameter_tuning = True + best_hyperparameters = None mode = get_mode(metric) best_score = float("inf") if mode == "min" else float("-inf") - for hyperparameter in hpam_set: + for trial_idx, hyperparameter in enumerate(hpam_set): print(f"Training model with hyperparameters: {hyperparameter}") + + # Create a separate wandb run for each hyperparameter trial if enabled + if wandb_project is not None: + trial_run_name = model.get_model_name() + if split_index is not None: + trial_run_name += f"_split_{split_index}" + trial_run_name += f"_trial_{trial_idx}" + + trial_config: dict[str, Any] = {} + if wandb_base_config is not None: + trial_config.update(wandb_base_config) + trial_config.update( + { + "phase": "hyperparameter_tuning", + "trial_index": trial_idx, + "hyperparameters": hyperparameter, + } + ) + + model.init_wandb( + project=wandb_project, + config=trial_config, + name=trial_run_name, + tags=[model.get_model_name(), "hpam_tuning"], + finish_previous=True, + ) + + # During hyperparameter tuning, don't update wandb config via log_hyperparameters + # Trial hyperparameters are stored in wandb.config for each run score = train_and_evaluate( model=model, hpams=hyperparameter, @@ -1069,7 +1236,12 @@ def hpam_tune( model_checkpoint_dir=model_checkpoint_dir, )[metric] + # Note: train_and_evaluate() already logs val_* metrics once via + # DRPModel.compute_and_log_final_metrics(..., prefix="val_"). + # Avoid logging val_{metric} again here (it would create duplicate points). if np.isnan(score): + if model.is_wandb_enabled(): + model.finish_wandb() continue if (mode == "min" and score < best_score) or (mode == "max" and score > best_score): @@ -1077,6 +1249,10 @@ def hpam_tune( best_score = score best_hyperparameters = hyperparameter + # Close this trial's run after all logging is done + if model.is_wandb_enabled(): + model.finish_wandb() + if best_hyperparameters is None: warnings.warn("all hpams lead to NaN respone. using last hpam combination.", stacklevel=2) best_hyperparameters = hyperparameter @@ -1097,51 +1273,79 @@ def hpam_tune_raytune( model_checkpoint_dir: str = "TEMPORARY", ) -> dict: """ - Tune the hyperparameters for the given model using raytune. This requires ray to be installed. + Tune the hyperparameters for the given model using Ray Tune. Ray[tune] must be installed. :param model: model to use :param train_dataset: training dataset :param validation_dataset: validation dataset :param early_stopping_dataset: early stopping dataset :param hpam_set: hyperparameters to tune - :param response_transformation: normalizer to use for the response data - :param metric: metric to evaluate which model is the best + :param response_transformation: normalizer for response data + :param metric: evaluation metric :param ray_path: path to the raytune directory - :param path_data: path to the data directory, e.g., data/ - :param model_checkpoint_dir: directory to save model checkpoints + :param path_data: path to data directory, e.g., data/ + :param model_checkpoint_dir: directory for model checkpoints :returns: best hyperparameters + :raises ValueError: if best_result is None """ + print("Starting hyperparameter tuning with Ray Tune ...") + print(f"Hyperparameter combinations to evaluate: {len(hpam_set)}") + print() + if len(hpam_set) == 1: return hpam_set[0] - ray.init(_temp_dir=os.path.join(os.path.expanduser("~"), "raytmp")) - if torch.cuda.is_available(): - resources_per_trial = {"gpu": 1} # TODO make this user defined - else: - resources_per_trial = {"cpu": 1} # TODO make this user defined - analysis = ray.tune.run( - lambda hpams: train_and_evaluate( - model=model, - hpams=hpams, - path_data=path_data, - train_dataset=train_dataset, - validation_dataset=validation_dataset, - early_stopping_dataset=early_stopping_dataset, + + import ray + from ray import tune + + path_data = os.path.abspath(path_data) + if not ray.is_initialized(): + ray.init(_temp_dir=os.path.join(os.path.expanduser("~"), "raytmp")) + resources_per_trial = {"gpu": 1} if torch.cuda.is_available() else {"cpu": 1} + + def trainable(hpams): + try: + inner = hpams["hpams"] + result = train_and_evaluate( + model=model, + hpams=inner, + path_data=path_data, + train_dataset=train_dataset, + validation_dataset=validation_dataset, + early_stopping_dataset=early_stopping_dataset, + metric=metric, + response_transformation=response_transformation, + model_checkpoint_dir=model_checkpoint_dir, + ) + tune.report(metrics={metric: result[metric]}) + except Exception as e: + import traceback + + print("Trial failed:", e) + traceback.print_exc() + + trainable = tune.with_resources(trainable, resources_per_trial) + param_space = {"hpams": tune.grid_search(hpam_set)} + + tuner = tune.Tuner( + trainable, + param_space=param_space, + run_config=tune.RunConfig( + storage_path=ray_path, + name="hpam_tuning", + ), + tune_config=tune.TuneConfig( metric=metric, - response_transformation=response_transformation, - model_checkpoint_dir=model_checkpoint_dir, + mode=get_mode(metric), ), - config=ray.tune.grid_search(hpam_set), - mode="min", - num_samples=5, - resources_per_trial=resources_per_trial, - chdir_to_trial_dir=False, - verbose=0, - storage_path=ray_path, ) - mode = get_mode(metric) - best_config = analysis.get_best_config(metric=metric, mode=mode) - return best_config + results = tuner.fit() + best_result = results.get_best_result(metric=metric, mode=get_mode(metric)) + ray.shutdown() + if best_result.config is None: + raise ValueError("Ray failed; no best result.") + return best_result.config["hpams"] @pipeline_function @@ -1195,38 +1399,35 @@ def get_datasets_from_cv_split( """ Get train, validation, (early stopping), and test datasets from the CV split. + Returns copies of the datasets to prevent in-place modifications (e.g., add_rows, reduce_to) + from affecting the original split data used by subsequent models. + :param split: dictionary of the CV split :param model_class: model class :param model_name: model name :param drug_id: drug id for single drug models - :returns: tuple of train, validation, (early stopping), and test datasets + :returns: tuple of train, validation, (early stopping), and test datasets (as copies) """ - train_dataset = split["train"] - validation_dataset = split["validation"] - test_dataset = split["test"] + train_dataset = split["train"].copy() + validation_dataset = split["validation"].copy() + test_dataset = split["test"].copy() if model_class.early_stopping: - validation_dataset = split["validation_es"] - early_stopping_dataset = split["early_stopping"] + validation_dataset = split["validation_es"].copy() + early_stopping_dataset = split["early_stopping"].copy() else: early_stopping_dataset = None if model_name in SINGLE_DRUG_MODEL_FACTORY.keys(): output_mask = train_dataset.drug_ids == drug_id - train_cp = train_dataset.copy() - train_cp.mask(output_mask) + train_dataset.mask(output_mask) validation_mask = validation_dataset.drug_ids == drug_id - val_cp = validation_dataset.copy() - val_cp.mask(validation_mask) + validation_dataset.mask(validation_mask) test_mask = test_dataset.drug_ids == drug_id - test_cp = test_dataset.copy() - test_cp.mask(test_mask) + test_dataset.mask(test_mask) if early_stopping_dataset is not None: es_mask = early_stopping_dataset.drug_ids == drug_id - es_cp = early_stopping_dataset.copy() - es_cp.mask(es_mask) - return train_cp, val_cp, es_cp, test_cp - return train_cp, val_cp, None, test_cp + early_stopping_dataset.mask(es_mask) return ( train_dataset, @@ -1256,3 +1457,141 @@ def generate_data_saving_path(model_name, drug_id, result_path, suffix) -> str: model_path = os.path.join(result_path, model_name, suffix) os.makedirs(model_path, exist_ok=True) return model_path + + +def train_final_model( + model_class: type[DRPModel], + full_dataset: DrugResponseDataset, + response_transformation: TransformerMixin, + path_data: str, + model_checkpoint_dir: str, + metric: str, + final_model_path: str, + test_mode: str = "LCO", + val_ratio: float = 0.1, + hyperparameter_tuning: bool = True, +) -> None: + """ + Final Production Model Training. + + Tune a final model on the full data set using a validation split that reflects intended generalization. + No test set is used here. The performance during the nested CV is a + pessimistic estimate of the final model performance. + The validation split strategy is determined by `test_mode`: + - LCO: generalization to unseen cell lines (e.g., personalized medicine) + - LDO: generalization to new drugs (e.g., drug repurposing) + - LTO: generalization to new tissues + - LPO: general (pair-level) prediction + + :param model_class: model to use + :param full_dataset: full training dataset (union of outer folds) + :param response_transformation: sklearn scaler used for response normalization + :param path_data: path to data directory + :param model_checkpoint_dir: checkpoint dir for intermediate tuning models + :param metric: metric for tuning, e.g., "RMSE" + :param final_model_path: path to final_model save directory + :param test_mode: split logic for validation (LCO, LDO, LTO, LPO) + :param val_ratio: validation size ratio + :param hyperparameter_tuning: whether to perform hyperparameter tuning + """ + print("Training final model with application-specific validation strategy ...") + + full_dataset.remove_nan_responses() + + model = model_class() + cl_features = model.load_cell_line_features(data_path=path_data, dataset_name=full_dataset.dataset_name) + drug_features = model.load_drug_features(data_path=path_data, dataset_name=full_dataset.dataset_name) + cell_lines_to_keep = cl_features.identifiers + drugs_to_keep = drug_features.identifiers if drug_features is not None else None + full_dataset.reduce_to(cell_line_ids=cell_lines_to_keep, drug_ids=drugs_to_keep) + + train_dataset, validation_dataset = make_train_val_split(full_dataset, test_mode=test_mode, val_ratio=val_ratio) + + if model_class.early_stopping: + validation_dataset, early_stopping_dataset = split_early_stopping_data(validation_dataset, test_mode) + else: + early_stopping_dataset = None + + hpam_set = model.get_hyperparameter_set() + if hyperparameter_tuning: + best_hpams = hpam_tune( + model=model, + train_dataset=train_dataset, + validation_dataset=validation_dataset, + early_stopping_dataset=early_stopping_dataset, + hpam_set=hpam_set, + response_transformation=response_transformation, + metric=metric, + path_data=path_data, + model_checkpoint_dir=model_checkpoint_dir, + ) + else: + best_hpams = hpam_set[0] + + print(f"Best hyperparameters for final model: {best_hpams}") + train_dataset.add_rows(validation_dataset) + train_dataset.shuffle(random_state=42) + if response_transformation: + train_dataset.fit_transform(response_transformation) + if early_stopping_dataset is not None: + early_stopping_dataset.transform(response_transformation) + + model.build_model(hyperparameters=best_hpams) + drug_features = drug_features.copy() if drug_features is not None else None + model.train( + output=train_dataset, + output_earlystopping=early_stopping_dataset, + cell_line_input=cl_features.copy(), + drug_input=drug_features, + model_checkpoint_dir=model_checkpoint_dir, + ) + if response_transformation: + train_dataset.inverse_transform(response_transformation) + if early_stopping_dataset is not None: + early_stopping_dataset.inverse_transform(response_transformation) + + os.makedirs(final_model_path, exist_ok=True) + model.save(final_model_path) + + +@pipeline_function +def make_train_val_split( + dataset: DrugResponseDataset, + test_mode: str, + val_ratio: float = 0.1, + random_state: int = 42, +) -> tuple[DrugResponseDataset, DrugResponseDataset]: + """ + Split a dataset into train and validation sets according to the test mode and desired ratio. + + :param dataset: full dataset to split + :param test_mode: one of "LPO", "LCO", "LDO", "LTO" + :param val_ratio: approximate fraction of data to use for validation + :param random_state: random seed + :returns: (train_dataset, validation_dataset) + :raises ValueError: if no tissue information is provided for the DrugResponseDataset + """ + if test_mode == "LTO": + if dataset.tissue is not None: + n_groups = len(np.unique(dataset.tissue)) + else: + raise ValueError("Tissue information is missing but required for LTO mode.") + + elif test_mode == "LCO": + n_groups = len(np.unique(dataset.cell_line_ids)) + elif test_mode == "LDO": + n_groups = len(np.unique(dataset.drug_ids)) + else: + n_groups = len(dataset) + + n_splits = int(1 / val_ratio) + n_splits = min(n_splits, n_groups) + + split = dataset.split_dataset( + n_cv_splits=n_splits, + mode=test_mode, + split_validation=False, + random_state=random_state, + )[0] + + return split["train"], split["test"] diff --git a/drevalpy/models/DIPK/dipk.py b/drevalpy/models/DIPK/dipk.py index 1264dbc9..1b35e4ff 100644 --- a/drevalpy/models/DIPK/dipk.py +++ b/drevalpy/models/DIPK/dipk.py @@ -7,9 +7,10 @@ Briefings in Bioinformatics, Volume 25, Issue 3, May 2024, bbae153, https://doi.org/10.1093/bib/bbae153 """ +import json import os import secrets -from typing import Any +from typing import Any, cast import numpy as np import pandas as pd @@ -40,11 +41,8 @@ def __init__(self) -> None: self.DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu") # all of this gets initialized in build_model self.model: Predictor | None = None - self.epochs: int = 0 - self.batch_size: int = 0 - self.lr: float = 0.0 self.gene_expression_encoder: GeneExpressionEncoder | None = None - self.epochs_autoencoder: int = 100 + self.hyperparameters: dict[str, Any] = {} @classmethod def get_model_name(cls) -> str: @@ -78,11 +76,7 @@ def build_model(self, hyperparameters: dict[str, Any]) -> None: hyperparameters["fc_layer_dim"], hyperparameters["dropout_rate"], ).to(self.DEVICE) - self.epochs = hyperparameters["epochs"] - self.batch_size = hyperparameters["batch_size"] - self.lr = hyperparameters["lr"] - self.epochs_autoencoder = hyperparameters["epochs_autoencoder"] - self.patience = hyperparameters["patience"] + self.hyperparameters = hyperparameters def train( self, @@ -111,13 +105,21 @@ def train( loss_func = nn.MSELoss() params = [{"params": self.model.parameters()}] - optimizer = optim.Adam(params, lr=self.lr) + optimizer = optim.Adam(params, lr=self.hyperparameters["lr"]) + + train_gene_expression = cell_line_input.get_feature_matrix( + view="gene_expression", identifiers=output.cell_line_ids + ) + val_gene_expression = cell_line_input.get_feature_matrix( + view="gene_expression", identifiers=output_earlystopping.cell_line_ids + ) self.gene_expression_encoder = train_gene_expession_autoencoder( - cell_line_input.get_feature_matrix(view="gene_expression", identifiers=output.cell_line_ids), - cell_line_input.get_feature_matrix(view="gene_expression", identifiers=output_earlystopping.cell_line_ids), - epochs_autoencoder=self.epochs_autoencoder, + train_gene_expression, + val_gene_expression, + epochs_autoencoder=self.hyperparameters["epochs_autoencoder"], ) + self.hyperparameters["gene_encoder_input_dim"] = train_gene_expression.shape[1] cell_line_input.apply( lambda x: encode_gene_expression(x, self.gene_expression_encoder), # type: ignore[arg-type] @@ -142,10 +144,13 @@ def train( ) train_loader: DataLoader = DataLoader( - DIPKDataset(train_samples), batch_size=self.batch_size, shuffle=True, collate_fn=collate + DIPKDataset(train_samples), batch_size=self.hyperparameters["batch_size"], shuffle=True, collate_fn=collate ) early_stopping_loader: DataLoader = DataLoader( - DIPKDataset(early_stopping_samples), batch_size=self.batch_size, shuffle=True, collate_fn=collate + DIPKDataset(early_stopping_samples), + batch_size=self.hyperparameters["batch_size"], + shuffle=True, + collate_fn=collate, ) # Early stopping parameters @@ -162,7 +167,7 @@ def train( # Train model print("Training DIPK model") - for epoch in range(self.epochs): + for epoch in range(self.hyperparameters["epochs"]): self.model.train() epoch_loss = 0.0 batch_count = 0 @@ -237,7 +242,7 @@ def train( print(f"DIPK: Saved best model at epoch {epoch + 1}") else: epochs_without_improvement += 1 - if epochs_without_improvement >= self.patience: + if epochs_without_improvement >= self.hyperparameters["patience"]: print(f"DIPK: Early stopping triggered at epoch {epoch + 1}") break @@ -294,7 +299,7 @@ def predict( drug_features=drug_input, ) test_loader: DataLoader = DataLoader( - DIPKDataset(test_samples), batch_size=self.batch_size, shuffle=False, collate_fn=collate + DIPKDataset(test_samples), batch_size=self.hyperparameters["batch_size"], shuffle=False, collate_fn=collate ) # Run prediction @@ -373,3 +378,60 @@ def load_feature(file_path, sep="\t"): ) return f + + def save(self, directory: str) -> None: + """ + Save the DIPK model and gene expression encoder using PyTorch conventions. + + This method stores: + - "dipk_model.pt": PyTorch state_dict of the DIPK predictor model + - "gene_encoder.pt": PyTorch state_dict of the trained gene expression encoder + - "hyperparameters.json": All hyperparameters including encoder input_dim + + :param directory: Target directory where the model files will be saved + :raises ValueError: If model or encoder is not built + """ + os.makedirs(directory, exist_ok=True) + if self.model is None or self.gene_expression_encoder is None: + raise ValueError("Cannot save model: model is not built.") + model = cast(Predictor, self.model) + + torch.save(model.state_dict(), os.path.join(directory, "dipk_model.pt")) # noqa: S614 + torch.save(self.gene_expression_encoder.state_dict(), os.path.join(directory, "gene_encoder.pt")) # noqa: S614 + with open(os.path.join(directory, "hyperparameters.json"), "w") as f: + json.dump(self.hyperparameters, f) + + @classmethod + def load(cls, directory: str) -> "DIPKModel": + """ + Load the DIPK model and gene expression encoder using PyTorch conventions. + + This method expects the following files in the given directory: + - "dipk_model.pt": PyTorch state_dict of the DIPK predictor model + - "gene_encoder.pt": PyTorch state_dict of the gene expression encoder + - "hyperparameters.json": Dictionary of hyperparameters, must include "gene_encoder_input_dim" + + :param directory: Path to the directory containing the model files + :return: An instance of DIPK with loaded model and encoder + """ + instance = cls() + + with open(os.path.join(directory, "hyperparameters.json")) as f: + instance.hyperparameters = json.load(f) + + instance.build_model(instance.hyperparameters) + instance.model = cast(Predictor, instance.model) + + instance.model.load_state_dict( + torch.load(os.path.join(directory, "dipk_model.pt"), map_location=instance.DEVICE) # noqa: S614 + ) + instance.model.eval() + + input_dim = instance.hyperparameters["gene_encoder_input_dim"] + instance.gene_expression_encoder = GeneExpressionEncoder(input_dim=input_dim) + instance.gene_expression_encoder.load_state_dict( + torch.load(os.path.join(directory, "gene_encoder.pt"), map_location=instance.DEVICE) # noqa: S614 + ) + instance.gene_expression_encoder.eval() + + return instance diff --git a/drevalpy/models/DrugGNN/__init__.py b/drevalpy/models/DrugGNN/__init__.py new file mode 100644 index 00000000..0eb63501 --- /dev/null +++ b/drevalpy/models/DrugGNN/__init__.py @@ -0,0 +1,5 @@ +"""A GNN based drug response prediction model.""" + +from .drug_gnn import DrugGNN + +__all__ = ["DrugGNN"] diff --git a/drevalpy/models/DrugGNN/drug_gnn.py b/drevalpy/models/DrugGNN/drug_gnn.py new file mode 100644 index 00000000..89f0fb7d --- /dev/null +++ b/drevalpy/models/DrugGNN/drug_gnn.py @@ -0,0 +1,496 @@ +"""DrugGNN model.""" + +import json +from pathlib import Path +from typing import Any + +import numpy as np +import pytorch_lightning as pl +import torch +import torch.nn as nn +from torch.optim import Adam +from torch.utils.data import Dataset as PytorchDataset +from torch_geometric.loader import DataLoader +from torch_geometric.nn import GCNConv, global_mean_pool + +from ...datasets.dataset import DrugResponseDataset, FeatureDataset +from ..drp_model import DRPModel +from ..lightning_metrics_mixin import RegressionMetricsMixin +from ..utils import load_and_select_gene_features + + +class DrugGraphNet(nn.Module): + """Neural network for DrugGNN.""" + + def __init__(self, num_node_features, num_cell_features, hidden_dim=64, dropout=0.2): + """Initialize the network. + + :param num_node_features: Number of features for each node in the drug graph. + :param num_cell_features: Number of features for the cell line. + :param hidden_dim: The hidden dimension size. + :param dropout: The dropout rate. + """ + super().__init__() + self.dropout = dropout + + # Drug Encoder (GNN) + self.conv1 = GCNConv(num_node_features, hidden_dim) + self.conv2 = GCNConv(hidden_dim, hidden_dim * 2) + self.conv3 = GCNConv(hidden_dim * 2, hidden_dim * 4) + self.drug_embed_fc = nn.Linear(hidden_dim * 4, hidden_dim) + + # Cell Line Encoder (MLP) + self.cell_fc1 = nn.Linear(num_cell_features, hidden_dim * 2) + self.cell_fc2 = nn.Linear(hidden_dim * 2, hidden_dim) + + # Combiner and Regressor + self.combiner_fc1 = nn.Linear(hidden_dim * 2, hidden_dim) + self.combiner_fc2 = nn.Linear(hidden_dim, 32) + self.output_fc = nn.Linear(32, 1) + + def forward(self, drug_graph, cell_features): + """Forward pass of the network. + + :param drug_graph: The drug graph. + :param cell_features: The cell line features. + :return: The output of the network. + """ + # Process drug graph + x, edge_index, batch = drug_graph.x, drug_graph.edge_index, drug_graph.batch + + x = self.conv1(x, edge_index) + x = nn.functional.relu(x) + x = nn.functional.dropout(x, p=self.dropout, training=self.training) + + x = self.conv2(x, edge_index) + x = nn.functional.relu(x) + x = nn.functional.dropout(x, p=self.dropout, training=self.training) + + x = self.conv3(x, edge_index) + x = nn.functional.relu(x) + + drug_embedding = global_mean_pool(x, batch) + drug_embedding = self.drug_embed_fc(drug_embedding) + + # Process cell line features + cell_embedding = nn.functional.relu(self.cell_fc1(cell_features)) + cell_embedding = nn.functional.dropout(cell_embedding, p=self.dropout, training=self.training) + cell_embedding = self.cell_fc2(cell_embedding) + + # Concatenate and predict + combined = torch.cat([drug_embedding, cell_embedding], dim=1) + x = nn.functional.relu(self.combiner_fc1(combined)) + x = nn.functional.dropout(x, p=self.dropout, training=self.training) + x = nn.functional.relu(self.combiner_fc2(x)) + x = nn.functional.dropout(x, p=self.dropout, training=self.training) + out = self.output_fc(x) + return out.view(-1) + + +class DrugGNNModule(RegressionMetricsMixin, pl.LightningModule): + """The LightningModule for the DrugGNN model.""" + + def __init__( + self, + num_node_features: int, + num_cell_features: int, + hidden_dim: int = 64, + dropout: float = 0.2, + learning_rate: float = 0.001, + ): + """Initialize the LightningModule. + + :param num_node_features: Number of features for each node in the drug graph. + :param num_cell_features: Number of features for the cell line. + :param hidden_dim: The hidden dimension size. + :param dropout: The dropout rate. + :param learning_rate: The learning rate. + """ + super().__init__() + self.save_hyperparameters() + self.model = DrugGraphNet( + num_node_features=self.hparams["num_node_features"], + num_cell_features=self.hparams["num_cell_features"], + hidden_dim=self.hparams["hidden_dim"], + dropout=self.hparams["dropout"], + ) + self.criterion = nn.MSELoss() + + # Initialize metrics storage for epoch-end R^2 and PCC computation + self._init_metrics_storage() + + def forward(self, batch): + """Forward pass of the module. + + :param batch: The batch. + :return: The output of the model. + """ + drug_graph, cell_features, _ = batch + return self.model(drug_graph, cell_features) + + def training_step(self, batch, batch_idx): + """A single training step. + + :param batch: The batch. + :param batch_idx: The batch index. + :return: The loss. + """ + drug_graph, cell_features, responses = batch + outputs = self.model(drug_graph, cell_features) + loss = self.criterion(outputs, responses) + self.log("train_loss", loss, on_step=False, on_epoch=True, batch_size=responses.size(0)) + + # Store predictions and targets for epoch-end metrics via mixin + self._store_predictions(outputs, responses, is_training=True) + + return loss + + def validation_step(self, batch, batch_idx): + """A single validation step. + + :param batch: The batch. + :param batch_idx: The batch index. + """ + drug_graph, cell_features, responses = batch + outputs = self.model(drug_graph, cell_features) + loss = self.criterion(outputs, responses) + self.log("val_loss", loss, on_step=False, on_epoch=True, batch_size=responses.size(0)) + + # Store predictions and targets for epoch-end metrics via mixin + self._store_predictions(outputs, responses, is_training=False) + + def predict_step(self, batch, batch_idx, dataloader_idx=0): + """A single prediction step. + + :param batch: The batch. + :param batch_idx: The batch index. + :param dataloader_idx: The dataloader index. + :return: The output of the model. + """ + return self.forward(batch) + + def configure_optimizers(self): + """Configure the optimizer. + + :return: The optimizer. + """ + return Adam(self.parameters(), lr=self.hparams.learning_rate) + + +class _DrugResponsePytorchDataset(PytorchDataset): + """A PyTorch Dataset to wrap the drug response data for DrugGNN.""" + + def __init__( + self, + response: np.ndarray, + cell_line_ids: np.ndarray, + drug_ids: np.ndarray, + cell_line_features: FeatureDataset, + drug_features: FeatureDataset, + ): + """Initialize the dataset. + + :param response: The drug response values. + :param cell_line_ids: The cell line IDs. + :param drug_ids: The drug IDs. + :param cell_line_features: A FeatureDataset object with cell line features. + :param drug_features: A FeatureDataset object with drug features. + """ + self.response = response + self.cell_line_ids = cell_line_ids + self.drug_ids = drug_ids + + # preconvert to tensors to avoid per item tensor creation + self.cell_features = { + cl_id: torch.tensor(features["gene_expression"], dtype=torch.float32) + for cl_id, features in cell_line_features.features.items() + } + self.response_tensor = torch.tensor(self.response, dtype=torch.float32) + + self.drug_graphs = { + drug_id: feature_views["drug_graph"] for drug_id, feature_views in drug_features.features.items() + } + + def __len__(self): + return len(self.response) + + def __getitem__(self, idx): + cell_line_id = self.cell_line_ids[idx] + drug_id = self.drug_ids[idx] + + drug_graph = self.drug_graphs[drug_id] + cell_feat = self.cell_features[cell_line_id] + response = self.response_tensor[idx] + + return drug_graph, cell_feat, response + + +class DrugGNN(DRPModel): + """DrugGNN model.""" + + def __init__(self): + """Initialize the DrugGNN model.""" + super().__init__() + self.model: DrugGNNModule | None = None + self.hyperparameters = {} + + @classmethod + def get_model_name(cls) -> str: + """Return the name of the model. + + :return: The name of the model. + """ + return "DrugGNN" + + @property + def cell_line_views(self) -> list[str]: + """Return the sources the model needs as input for describing the cell line. + + :return: The sources the model needs as input for describing the cell line. + """ + return ["gene_expression"] + + @property + def drug_views(self) -> list[str]: + """Return the sources the model needs as input for describing the drug. + + :return: The sources the model needs as input for describing the drug. + """ + return ["drug_graph"] + + def build_model(self, hyperparameters: dict[str, Any]) -> None: + """Build the model. + + :param hyperparameters: The hyperparameters. + """ + # Log hyperparameters to wandb if enabled + self.log_hyperparameters(hyperparameters) + + self.hyperparameters = hyperparameters + + def _loader_kwargs(self) -> dict[str, Any]: + num_workers = int(self.hyperparameters.get("num_workers", 4)) + kw = { + "num_workers": num_workers, + "pin_memory": True, + } + if num_workers > 0: + kw["persistent_workers"] = True + kw["prefetch_factor"] = int(self.hyperparameters.get("prefetch_factor", 2)) + return kw + + def train( + self, + output: DrugResponseDataset, + cell_line_input: FeatureDataset, + drug_input: FeatureDataset | None = None, + output_earlystopping: DrugResponseDataset | None = None, + **kwargs, + ): + """Train the model. + + :param output: The output dataset. + :param cell_line_input: The cell line input dataset. + :param drug_input: The drug input dataset. + :param output_earlystopping: The early stopping output dataset. + :param kwargs: Additional arguments. + :raises ValueError: If drug input is not provided. + """ + if drug_input is None: + raise ValueError("Drug input is required for DrugGNN") + + # Determine feature sizes + num_node_features = next(iter(drug_input.features.values()))["drug_graph"].num_node_features + num_cell_features = next(iter(cell_line_input.features.values()))["gene_expression"].shape[0] + + self.model = DrugGNNModule( + num_node_features=num_node_features, + num_cell_features=num_cell_features, + hidden_dim=self.hyperparameters.get("hidden_dim", 64), + dropout=self.hyperparameters.get("dropout", 0.2), + learning_rate=self.hyperparameters.get("learning_rate", 0.001), + ) + + train_dataset = _DrugResponsePytorchDataset( + response=output.response, + cell_line_ids=output.cell_line_ids, + drug_ids=output.drug_ids, + cell_line_features=cell_line_input, + drug_features=drug_input, + ) + train_loader = DataLoader( + train_dataset, + batch_size=self.hyperparameters.get("batch_size", 1024), + shuffle=True, + **self._loader_kwargs(), + ) + + val_loader = None + if output_earlystopping is not None and len(output_earlystopping) > 0: + val_dataset = _DrugResponsePytorchDataset( + response=output_earlystopping.response, + cell_line_ids=output_earlystopping.cell_line_ids, + drug_ids=output_earlystopping.drug_ids, + cell_line_features=cell_line_input, + drug_features=drug_input, + ) + val_loader = DataLoader( + val_dataset, + batch_size=self.hyperparameters.get("batch_size", 32), + **self._loader_kwargs(), + ) + + # Set up wandb logger if project is provided + loggers = [] + if self.wandb_project is not None: + from pytorch_lightning.loggers import WandbLogger + + logger = WandbLogger(project=self.wandb_project, log_model=False) + loggers.append(logger) + + trainer = pl.Trainer( + max_epochs=self.hyperparameters.get("epochs", 100), + accelerator="auto", + devices="auto", + callbacks=[pl.callbacks.EarlyStopping(monitor="val_loss", mode="min", patience=5)] if val_loader else None, + logger=loggers if loggers else True, # Use default logger if no wandb + enable_progress_bar=True, + log_every_n_steps=int(self.hyperparameters.get("log_every_n_steps", 50)), + precision=self.hyperparameters.get("precision", 32), + ) + trainer.fit(self.model, train_dataloaders=train_loader, val_dataloaders=val_loader) + + def predict( + self, + cell_line_ids: np.ndarray, + drug_ids: np.ndarray, + cell_line_input: FeatureDataset, + drug_input: FeatureDataset | None = None, + ) -> np.ndarray: + """Predict drug response. + + :param cell_line_ids: The cell line IDs. + :param drug_ids: The drug IDs. + :param cell_line_input: The cell line input dataset. + :param drug_input: The drug input dataset. + :raises RuntimeError: If the model has not been trained yet. + :raises ValueError: If drug input is not provided. + :return: The predicted drug response. + """ + if len(drug_ids) == 0 or len(cell_line_ids) == 0: + print("DrugGNN predict: No drug or cell line IDs provided; returning empty array.") + return np.array([]) + if self.model is None: + raise RuntimeError("Model has not been trained yet.") + if drug_input is None: + raise ValueError("Drug input is required for DrugGNN") + + self.model.eval() + + predict_dataset = _DrugResponsePytorchDataset( + response=np.zeros(len(cell_line_ids)), + cell_line_ids=cell_line_ids, + drug_ids=drug_ids, + cell_line_features=cell_line_input, + drug_features=drug_input, + ) + predict_loader = DataLoader( + predict_dataset, + batch_size=self.hyperparameters.get("batch_size", 32), + **self._loader_kwargs(), + ) + + trainer = pl.Trainer(accelerator="auto", devices="auto", enable_progress_bar=False) + predictions_list = trainer.predict(self.model, dataloaders=predict_loader) + + if not predictions_list: + print("DrugGNN predict: No predictions were made; returning empty array.") + return np.array([]) + + predictions_flat = [ + item for sublist in predictions_list for item in (sublist if isinstance(sublist, list) else [sublist]) + ] + + predictions = torch.cat(predictions_flat).cpu().numpy() + return predictions + + def load_cell_line_features(self, data_path: str, dataset_name: str) -> FeatureDataset: + """Loads the cell line features. + + :param data_path: Path to the gene expression and landmark genes + :param dataset_name: name of the dataset + :return: FeatureDataset containing the cell line gene expression features. + """ + return load_and_select_gene_features( + feature_type="gene_expression", + gene_list="landmark_genes_reduced", + data_path=data_path, + dataset_name=dataset_name, + ) + + def load_drug_features(self, data_path: str, dataset_name: str) -> FeatureDataset: + """Loads the pre-computed drug graph data. + + :param data_path: Path to the data directory. + :param dataset_name: Name of the dataset. + :raises FileNotFoundError: If the drug graph directory is not found. + :raises ValueError: If no drug graphs are loaded. + :return: FeatureDataset containing the drug graphs. + """ + graph_path = Path(data_path) / dataset_name / "drug_graphs" + if not graph_path.exists(): + raise FileNotFoundError( + f"Drug graph directory not found at {graph_path}. " + f"Please run 'create_drug_graphs.py' for the {dataset_name} dataset." + ) + + drug_graphs = {} + for p_file in graph_path.glob("*.pt"): + drug_id = p_file.stem + drug_graphs[drug_id] = torch.load(p_file, weights_only=False) # noqa: S614 + + if not drug_graphs: + raise ValueError(f"No drug graphs loaded from {graph_path}. Check the directory and file contents.") + + feature_dict = {drug_id: {"drug_graph": graph} for drug_id, graph in drug_graphs.items()} + + return FeatureDataset(features=feature_dict) + + def save_model(self, path: str | Path, drug_name=None): + """Save the model. + + :param path: The path to save the model to. + :param drug_name: The name of the drug. + :raises RuntimeError: If there is no model to save. + """ + if self.model is None: + raise RuntimeError("No model to save.") + path = Path(path) + path.mkdir(parents=True, exist_ok=True) + + trainer = pl.Trainer() + trainer.save_checkpoint(path / "model.ckpt", weights_only=True) + + with open(path / "config.json", "w") as f: + json.dump(self.hyperparameters, f, indent=4) + + def load_model(self, path: str | Path, drug_name=None): + """Load the model. + + :param path: The path to load the model from. + :param drug_name: The name of the drug. + """ + path = Path(path) + + config_path = path / "config.json" + with open(config_path) as f: + self.hyperparameters = json.load(f) + + self.model = DrugGNNModule.load_from_checkpoint( + path / "model.ckpt", + num_node_features=self.hyperparameters["num_node_features"], + num_cell_features=self.hyperparameters["num_cell_features"], + hidden_dim=self.hyperparameters.get("hidden_dim", 64), + dropout=self.hyperparameters.get("dropout", 0.2), + learning_rate=self.hyperparameters.get("learning_rate", 0.001), + ) diff --git a/drevalpy/models/DrugGNN/hyperparameters.yaml b/drevalpy/models/DrugGNN/hyperparameters.yaml new file mode 100644 index 00000000..b028a3f0 --- /dev/null +++ b/drevalpy/models/DrugGNN/hyperparameters.yaml @@ -0,0 +1,11 @@ +DrugGNN: + learning_rate: + - 0.001 + epochs: + - 100 + hidden_dim: + - 64 + - 128 + dropout: + - 0.2 + - 0.3 diff --git a/drevalpy/models/MOLIR/molir.py b/drevalpy/models/MOLIR/molir.py index 844bcb23..4aaab346 100644 --- a/drevalpy/models/MOLIR/molir.py +++ b/drevalpy/models/MOLIR/molir.py @@ -64,6 +64,9 @@ def build_model(self, hyperparameters: dict[str, Any]) -> None: :param hyperparameters: Custom hyperparameters for the model, includes mini_batch, layer dimensions (h_dim1, h_dim2, h_dim3), learning_rate, dropout_rate, weight_decay, gamma, epochs, and margin. """ + # Log hyperparameters to wandb if enabled + self.log_hyperparameters(hyperparameters) + self.hyperparameters = hyperparameters self.selector = VarianceFeatureSelector( view="gene_expression", k=hyperparameters.get("n_gene_expression_features", 1000) @@ -125,6 +128,7 @@ def train( cell_line_input=cell_line_input, output_earlystopping=output_earlystopping, model_checkpoint_dir=model_checkpoint_dir, + wandb_project=self.wandb_project, ) else: print(f"Not enough training data provided ({len(output)}), will predict on randomly initialized model.") @@ -179,13 +183,13 @@ def predict( cell_line_input=cell_line_input, drug_input=drug_input, ) - (gene_expression, mutations, cnvs) = ( + gene_expression, mutations, cnvs = ( input_data["gene_expression"], input_data["mutations"], input_data["copy_number_variation_gistic"], ) - (gene_expression, mutations, cnvs) = filter_and_sort_omics( + gene_expression, mutations, cnvs = filter_and_sort_omics( model=self, gene_expression=gene_expression, mutations=mutations, cnvs=cnvs, cell_line_input=cell_line_input ) diff --git a/drevalpy/models/MOLIR/utils.py b/drevalpy/models/MOLIR/utils.py index f83eb5e2..1f4401f2 100644 --- a/drevalpy/models/MOLIR/utils.py +++ b/drevalpy/models/MOLIR/utils.py @@ -18,7 +18,9 @@ from torch.utils.data import DataLoader, Dataset from drevalpy.datasets.dataset import DrugResponseDataset, FeatureDataset -from drevalpy.models.drp_model import DRPModel + +from ..drp_model import DRPModel +from ..lightning_metrics_mixin import RegressionMetricsMixin class RegressionDataset(Dataset): @@ -313,7 +315,7 @@ def forward(self, x: torch.Tensor) -> torch.Tensor: return self.regressor(x) -class MOLIModel(pl.LightningModule): +class MOLIModel(RegressionMetricsMixin, pl.LightningModule): """ PyTorch Lightning module for the MOLIR model. @@ -363,6 +365,9 @@ def __init__( self.cna_encoder = MOLIEncoder(input_dim_cnv, self.h_dim3, self.dropout_rate) self.regressor = MOLIRegressor(self.h_dim1 + self.h_dim2 + self.h_dim3, self.dropout_rate) + # Initialize metrics storage for epoch-end R^2 and PCC computation + self._init_metrics_storage() + def fit( self, output_train: DrugResponseDataset, @@ -370,6 +375,7 @@ def fit( output_earlystopping: DrugResponseDataset | None = None, patience: int = 5, model_checkpoint_dir: str = "checkpoints", + wandb_project: str | None = None, ) -> None: """ Trains the MOLIR model. @@ -377,11 +383,14 @@ def fit( First, the ranges for the triplet loss are determined using the standard deviation of the training responses. Then, the training and validation data loaders are created. The model is trained using the Lightning Trainer with an early stopping callback and patience of 5. + :param output_train: training dataset containing the response output :param cell_line_input: feature dataset containing the omics data of the cell lines :param output_earlystopping: early stopping dataset :param patience: for early stopping :param model_checkpoint_dir: directory to save the model checkpoints + :param wandb_project: optional wandb project name for logging. If provided, uses WandbLogger + for PyTorch Lightning training. """ self.positive_range, self.negative_range = make_ranges(output_train) @@ -407,9 +416,18 @@ def fit( save_weights_only=True, ) + # Set up wandb logger if project is provided + loggers = [] + if wandb_project is not None: + from pytorch_lightning.loggers import WandbLogger + + logger = WandbLogger(project=wandb_project, log_model=False) + loggers.append(logger) + # Initialize the Lightning trainer trainer = pl.Trainer( max_epochs=self.epochs, + logger=loggers if loggers else True, # Use default logger if no wandb callbacks=[ early_stop_callback, self.checkpoint_callback, @@ -521,6 +539,10 @@ def training_step(self, batch: list[torch.Tensor], batch_idx: int) -> torch.Tens # Compute loss loss = self._compute_loss(z, preds, response) self.log("train_loss", loss, on_step=False, on_epoch=True, prog_bar=True) + + # Store predictions and targets for epoch-end metrics via mixin + self._store_predictions(preds, response, is_training=True) + return loss def validation_step(self, batch: list[torch.Tensor], batch_idx: int) -> torch.Tensor: @@ -542,6 +564,10 @@ def validation_step(self, batch: list[torch.Tensor], batch_idx: int) -> torch.Te # Compute loss val_loss = self._compute_loss(z, preds, response) self.log("val_loss", val_loss, on_step=False, on_epoch=True, prog_bar=True) + + # Store predictions and targets for epoch-end metrics via mixin + self._store_predictions(preds, response, is_training=False) + return val_loss def configure_optimizers(self) -> torch.optim.Optimizer: diff --git a/drevalpy/models/PharmaFormer/__init__.py b/drevalpy/models/PharmaFormer/__init__.py new file mode 100644 index 00000000..f78b623a --- /dev/null +++ b/drevalpy/models/PharmaFormer/__init__.py @@ -0,0 +1,5 @@ +"""PharmaFormer model.""" + +from .pharmaformer import PharmaFormerModel + +__all__ = ["PharmaFormerModel"] diff --git a/drevalpy/models/PharmaFormer/hyperparameters.yaml b/drevalpy/models/PharmaFormer/hyperparameters.yaml new file mode 100644 index 00000000..2982f0c1 --- /dev/null +++ b/drevalpy/models/PharmaFormer/hyperparameters.yaml @@ -0,0 +1,33 @@ +--- +PharmaFormer: + gene_hidden_size: + - 2048 + - 4096 + drug_hidden_size: + - 128 + - 256 + feature_dim: + - 64 + - 128 + nhead: + - 4 + - 8 + num_layers: + - 2 + - 3 + dim_feedforward: + - 1024 + - 2048 + dropout: + - 0.1 + - 0.2 + batch_size: + - 64 + - 128 + lr: + - 0.00001 + - 0.0001 + epochs: + - 100 + patience: + - 10 diff --git a/drevalpy/models/PharmaFormer/model_utils.py b/drevalpy/models/PharmaFormer/model_utils.py new file mode 100644 index 00000000..a8e632fe --- /dev/null +++ b/drevalpy/models/PharmaFormer/model_utils.py @@ -0,0 +1,140 @@ +"""Neural network components for PharmaFormer model.""" + +import torch +import torch.nn as nn +import torch.nn.functional as functional + + +class FeatureExtractor(nn.Module): + """Feature extractor for gene expression and drug SMILES.""" + + def __init__(self, gene_input_size: int, gene_hidden_size: int, drug_hidden_size: int): + """ + Initialize the feature extractor. + + :param gene_input_size: Input size for gene expression features + :param gene_hidden_size: Hidden size for gene expression MLP + :param drug_hidden_size: Hidden size for drug SMILES MLP + """ + super().__init__() + self.gene_fc1 = nn.Linear(gene_input_size, gene_hidden_size) + self.gene_fc2 = nn.Linear(gene_hidden_size, gene_hidden_size) + self.smiles_fc = nn.Linear(128, drug_hidden_size) + + def forward(self, gene_expr: torch.Tensor, smiles: torch.Tensor) -> torch.Tensor: + """ + Forward pass of the feature extractor. + + :param gene_expr: Gene expression features [batch_size, gene_input_size] + :param smiles: BPE-encoded SMILES features [batch_size, 128] + :return: Combined features [batch_size, gene_hidden_size + drug_hidden_size] + """ + gene_out = functional.relu(self.gene_fc1(gene_expr)) + gene_out = functional.relu(self.gene_fc2(gene_out)) + smiles_out = functional.relu(self.smiles_fc(smiles)) + combined_features = torch.cat((gene_out, smiles_out), dim=1) + return combined_features + + +class TransModel(nn.Module): + """Transformer model for processing combined features.""" + + def __init__( + self, + feature_dim: int, + nhead: int, + seq_len: int, + dim_feedforward: int = 2048, + dropout: float = 0.1, + num_layers: int = 3, + ): + """ + Initialize the transformer model. + + :param feature_dim: Dimension of each feature in the sequence + :param nhead: Number of attention heads + :param seq_len: Length of the input sequence + :param dim_feedforward: Dimension of feedforward network + :param dropout: Dropout rate + :param num_layers: Number of transformer encoder layers + """ + super().__init__() + encoder_layer = nn.TransformerEncoderLayer( + d_model=feature_dim, + nhead=nhead, + dim_feedforward=dim_feedforward, + dropout=dropout, + batch_first=True, + ) + self.transformer_encoder = nn.TransformerEncoder(encoder_layer, num_layers=num_layers) + self.output = nn.Sequential( + nn.Linear(seq_len * feature_dim, 1024), + nn.ReLU(), + nn.Dropout(dropout), + nn.Linear(1024, 1), + ) + + def forward(self, x: torch.Tensor) -> torch.Tensor: + """ + Forward pass of the transformer model. + + :param x: Input tensor [batch_size, seq_len, feature_dim] + :return: Output predictions [batch_size, 1] + """ + x = self.transformer_encoder(x) + x = torch.flatten(x, 1) + return self.output(x) + + +class CombinedModel(nn.Module): + """Combined model integrating feature extraction and transformer.""" + + def __init__( + self, + gene_input_size: int, + gene_hidden_size: int, + drug_hidden_size: int, + feature_dim: int, + nhead: int, + num_layers: int = 3, + dim_feedforward: int = 2048, + dropout: float = 0.1, + ): + """ + Initialize the combined model. + + :param gene_input_size: Input size for gene expression features + :param gene_hidden_size: Hidden size for gene expression MLP + :param drug_hidden_size: Hidden size for drug SMILES MLP + :param feature_dim: Dimension of each feature in the transformer sequence + :param nhead: Number of attention heads + :param num_layers: Number of transformer encoder layers + :param dim_feedforward: Dimension of feedforward network + :param dropout: Dropout rate + """ + super().__init__() + self.feature_extractor = FeatureExtractor(gene_input_size, gene_hidden_size, drug_hidden_size) + self.feature_dim = feature_dim + self.seq_len = (gene_hidden_size + drug_hidden_size) // feature_dim + self.transformer = TransModel( + feature_dim=feature_dim, + nhead=nhead, + seq_len=self.seq_len, + num_layers=num_layers, + dim_feedforward=dim_feedforward, + dropout=dropout, + ) + + def forward(self, gene_expr: torch.Tensor, smiles: torch.Tensor) -> torch.Tensor: + """ + Forward pass of the combined model. + + :param gene_expr: Gene expression features [batch_size, gene_input_size] + :param smiles: BPE-encoded SMILES features [batch_size, 128] + :return: Output predictions [batch_size, 1] + """ + features = self.feature_extractor(gene_expr, smiles) + batch_size = features.size(0) + features = features.view(batch_size, self.seq_len, self.feature_dim) + output = self.transformer(features) + return output diff --git a/drevalpy/models/PharmaFormer/pharmaformer.py b/drevalpy/models/PharmaFormer/pharmaformer.py new file mode 100644 index 00000000..d1561d2d --- /dev/null +++ b/drevalpy/models/PharmaFormer/pharmaformer.py @@ -0,0 +1,508 @@ +""" +Contains PharmaFormer, a transformer-based deep learning model for drug response prediction. + +A Transformer-based deep learning model designed to predict clinical drug responses +by integrating gene expression profiles and drug molecular structures. + +Original authors: Zhou et al. (2025, 10.1038/s41698-025-01082-6) +Code adapted from their Github: https://github.com/zhouyuru1205/PharmaFormer +""" + +import json +import os +import secrets +from typing import Any, cast + +import numpy as np +import pandas as pd +import torch +import torch.nn as nn +import torch.optim as optim +from sklearn.preprocessing import MinMaxScaler, StandardScaler +from torch.utils.data import DataLoader, Dataset + +from drevalpy.datasets.dataset import DrugResponseDataset, FeatureDataset +from drevalpy.models.drp_model import DRPModel +from drevalpy.models.utils import load_and_select_gene_features + +from .model_utils import CombinedModel + + +class _PharmaFormerDataset(Dataset): + """PyTorch Dataset for PharmaFormer model.""" + + def __init__( + self, + response: np.ndarray, + cell_line_ids: np.ndarray, + drug_ids: np.ndarray, + cell_line_features: FeatureDataset, + drug_features: FeatureDataset, + ): + """ + Initialize the dataset. + + :param response: Drug response values + :param cell_line_ids: Cell line identifiers + :param drug_ids: Drug identifiers + :param cell_line_features: FeatureDataset with cell line features + :param drug_features: FeatureDataset with drug features + """ + self.response = response + self.cell_line_ids = cell_line_ids + self.drug_ids = drug_ids + self.cell_line_features = cell_line_features + self.drug_features = drug_features + + def __len__(self) -> int: + """Return the length of the dataset. + + :return: Length of the dataset + """ + return len(self.response) + + def __getitem__(self, idx: int) -> tuple[torch.Tensor, torch.Tensor, torch.Tensor]: + """ + Get a single item from the dataset. + + :param idx: Index of the item + :return: Tuple of (gene_features, drug_features, response) + """ + cell_line_id = self.cell_line_ids[idx] + drug_id = self.drug_ids[idx] + + gene_features = torch.tensor( + self.cell_line_features.features[cell_line_id]["gene_expression"], dtype=torch.float32 + ) + drug_features = torch.tensor(self.drug_features.features[drug_id]["bpe_smiles"], dtype=torch.float32) + response = torch.tensor(self.response[idx], dtype=torch.float32) + + return gene_features, drug_features, response + + +class PharmaFormerModel(DRPModel): + """PharmaFormer model for drug response prediction.""" + + cell_line_views = ["gene_expression"] + drug_views = ["bpe_smiles"] + early_stopping = True + + def __init__(self) -> None: + """Initialize the PharmaFormer model.""" + super().__init__() + self.DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu") + self.model: CombinedModel | None = None + self.hyperparameters: dict[str, Any] = {} + self.gene_expression_scaler: StandardScaler | None = None + self.gene_expression_normalizer: MinMaxScaler | None = None + + @classmethod + def get_model_name(cls) -> str: + """ + Get the model name. + + :returns: PharmaFormer + """ + return "PharmaFormer" + + def build_model(self, hyperparameters: dict[str, Any]) -> None: + """ + Builds the PharmaFormer model with the specified hyperparameters. + + :param hyperparameters: Model hyperparameters including gene_hidden_size, drug_hidden_size, + feature_dim, nhead, num_layers, dim_feedforward, dropout, batch_size, lr, epochs, patience + """ + # Log hyperparameters to wandb if enabled + self.log_hyperparameters(hyperparameters) + + self.hyperparameters = hyperparameters + # Model will be built in train() when we know the input dimensions + + def train( + self, + output: DrugResponseDataset, + cell_line_input: FeatureDataset, + drug_input: FeatureDataset | None = None, + output_earlystopping: DrugResponseDataset | None = None, + model_checkpoint_dir: str = "checkpoints", + ) -> None: + """ + Trains the model. + + :param output: training data associated with the response output + :param cell_line_input: input data associated with the cell line + :param drug_input: input data associated with the drug + :param output_earlystopping: early stopping data associated with the response output + :param model_checkpoint_dir: directory to save the model checkpoint + :raises ValueError: if drug_input is None or if early stopping data is missing + """ + if drug_input is None: + raise ValueError("PharmaFormer model requires drug features.") + if output_earlystopping is None: + raise ValueError("PharmaFormer model requires early stopping data.") + + # Get feature dimensions + train_gene_features = cell_line_input.get_feature_matrix( + view="gene_expression", identifiers=output.cell_line_ids + ) + gene_input_size = train_gene_features.shape[1] + + # Standardize and normalize gene expression (matching original PharmaFormer) + self.gene_expression_scaler = StandardScaler() + self.gene_expression_normalizer = MinMaxScaler() + + train_gene_scaled = self.gene_expression_scaler.fit_transform(train_gene_features) + self.gene_expression_normalizer.fit_transform(train_gene_scaled) + + # Apply transformations to all gene expression features + cell_line_input = cell_line_input.copy() + for cell_line_id in cell_line_input.features: + gene_expr = cell_line_input.features[cell_line_id]["gene_expression"] + gene_expr_scaled = self.gene_expression_scaler.transform(gene_expr.reshape(1, -1)) + gene_expr_normalized = self.gene_expression_normalizer.transform(gene_expr_scaled) + cell_line_input.features[cell_line_id]["gene_expression"] = gene_expr_normalized.flatten() + + # Build model with known input dimensions + self.model = CombinedModel( + gene_input_size=gene_input_size, + gene_hidden_size=self.hyperparameters["gene_hidden_size"], + drug_hidden_size=self.hyperparameters["drug_hidden_size"], + feature_dim=self.hyperparameters["feature_dim"], + nhead=self.hyperparameters["nhead"], + num_layers=self.hyperparameters.get("num_layers", 3), + dim_feedforward=self.hyperparameters.get("dim_feedforward", 2048), + dropout=self.hyperparameters.get("dropout", 0.1), + ).to(self.DEVICE) + + loss_func = nn.MSELoss() + optimizer = optim.Adam(self.model.parameters(), lr=self.hyperparameters["lr"]) + + # Create datasets + train_dataset = _PharmaFormerDataset( + response=output.response, + cell_line_ids=output.cell_line_ids, + drug_ids=output.drug_ids, + cell_line_features=cell_line_input, + drug_features=drug_input, + ) + early_stopping_dataset = _PharmaFormerDataset( + response=output_earlystopping.response, + cell_line_ids=output_earlystopping.cell_line_ids, + drug_ids=output_earlystopping.drug_ids, + cell_line_features=cell_line_input, + drug_features=drug_input, + ) + + train_loader = DataLoader( + train_dataset, + batch_size=self.hyperparameters["batch_size"], + shuffle=True, + ) + early_stopping_loader = DataLoader( + early_stopping_dataset, + batch_size=self.hyperparameters["batch_size"], + shuffle=False, + ) + + # Early stopping parameters + best_val_loss = float("inf") + epochs_without_improvement = 0 + + # Ensure the checkpoint directory exists + os.makedirs(model_checkpoint_dir, exist_ok=True) + version = "version-" + "".join([secrets.choice("0123456789abcdef") for _ in range(20)]) + + checkpoint_path = os.path.join(model_checkpoint_dir, f"{version}_best_PharmaFormer_model.pth") + + # Train model + print("Training PharmaFormer model") + for epoch in range(self.hyperparameters["epochs"]): + self.model.train() + epoch_loss = 0.0 + batch_count = 0 + train_predictions = [] + train_targets = [] + + # Training phase + for gene_inputs, smiles_inputs, targets in train_loader: + gene_inputs = gene_inputs.to(self.DEVICE) + smiles_inputs = smiles_inputs.to(self.DEVICE) + targets = targets.to(self.DEVICE) + + # Forward pass + outputs = self.model(gene_inputs, smiles_inputs) + loss = loss_func(outputs.squeeze(), targets) + + # Backpropagation + optimizer.zero_grad() + loss.backward() + optimizer.step() + + epoch_loss += loss.detach().item() + batch_count += 1 + + # Store predictions and targets for R^2 and PCC computation + train_predictions.append(outputs.squeeze().detach().cpu().numpy()) + train_targets.append(targets.detach().cpu().numpy()) + + epoch_loss /= batch_count + print(f"PharmaFormer: Epoch [{epoch + 1}/{self.hyperparameters['epochs']}] Training Loss: {epoch_loss:.4f}") + + # Compute and log training R^2 and PCC using DRPModel helper + train_metrics = {"train_loss": epoch_loss} + if len(train_predictions) > 0: + all_train_preds = np.concatenate(train_predictions) + all_train_targets = np.concatenate(train_targets) + perf_metrics = self.compute_performance_metrics(all_train_preds, all_train_targets, prefix="train_") + train_metrics.update(perf_metrics) + + # Log training metrics to wandb if enabled + if self.is_wandb_enabled(): + self.log_metrics(train_metrics, step=epoch) + + # Validation phase for early stopping + self.model.eval() + val_loss = 0.0 + val_batch_count = 0 + val_predictions = [] + val_targets = [] + with torch.no_grad(): + for gene_inputs, smiles_inputs, targets in early_stopping_loader: + gene_inputs = gene_inputs.to(self.DEVICE) + smiles_inputs = smiles_inputs.to(self.DEVICE) + targets = targets.to(self.DEVICE) + + outputs = self.model(gene_inputs, smiles_inputs) + loss = loss_func(outputs.squeeze(), targets) + + val_loss += loss.item() + val_batch_count += 1 + + # Store predictions and targets for R^2 and PCC computation + val_predictions.append(outputs.squeeze().detach().cpu().numpy()) + val_targets.append(targets.detach().cpu().numpy()) + + val_loss /= val_batch_count + print(f"PharmaFormer: Epoch [{epoch + 1}/{self.hyperparameters['epochs']}] Validation Loss: {val_loss:.4f}") + + # Compute and log validation R^2 and PCC using DRPModel helper + val_metrics = {"val_loss": val_loss} + if len(val_predictions) > 0: + all_val_preds = np.concatenate(val_predictions) + all_val_targets = np.concatenate(val_targets) + perf_metrics = self.compute_performance_metrics(all_val_preds, all_val_targets, prefix="val_") + val_metrics.update(perf_metrics) + + # Log validation metrics to wandb if enabled + if self.is_wandb_enabled(): + self.log_metrics(val_metrics, step=epoch) + + # Checkpointing: Save the best model + if val_loss < best_val_loss: + best_val_loss = val_loss + epochs_without_improvement = 0 + torch.save(self.model.state_dict(), checkpoint_path) # noqa: S614 + print(f"PharmaFormer: Saved best model at epoch {epoch + 1}") + else: + epochs_without_improvement += 1 + if epochs_without_improvement >= self.hyperparameters.get("patience", 10): + print(f"PharmaFormer: Early stopping triggered at epoch {epoch + 1}") + break + + # Reload the best model after training + print("PharmaFormer: Reloading the best model") + self.model.load_state_dict( + torch.load(checkpoint_path, map_location=self.DEVICE, weights_only=True) + ) # noqa: S614 + self.model.to(self.DEVICE) + + def predict( + self, + cell_line_ids: np.ndarray, + drug_ids: np.ndarray, + cell_line_input: FeatureDataset, + drug_input: FeatureDataset | None = None, + ) -> np.ndarray: + """ + Predicts the response values for the given cell lines and drugs. + + :param cell_line_ids: list of cell line IDs + :param drug_ids: list of drug IDs + :param cell_line_input: input data associated with the cell line + :param drug_input: input data associated with the drug + :return: predicted response values + :raises ValueError: if drug_input is None or if the model is not initialized + """ + if drug_input is None: + raise ValueError("PharmaFormer model requires drug features.") + if self.model is None: + raise ValueError("PharmaFormer model not initialized.") + + # Apply transformations to gene expression if scalers are available + if self.gene_expression_scaler is not None and self.gene_expression_normalizer is not None: + cell_line_input = cell_line_input.copy() + for cell_line_id in cell_line_ids: + if cell_line_id in cell_line_input.features: + gene_expr = cell_line_input.features[cell_line_id]["gene_expression"] + gene_expr_scaled = self.gene_expression_scaler.transform(gene_expr.reshape(1, -1)) + gene_expr_normalized = self.gene_expression_normalizer.transform(gene_expr_scaled) + cell_line_input.features[cell_line_id]["gene_expression"] = gene_expr_normalized.flatten() + + # Create dataset + predict_dataset = _PharmaFormerDataset( + response=np.zeros(len(cell_line_ids)), + cell_line_ids=cell_line_ids, + drug_ids=drug_ids, + cell_line_features=cell_line_input, + drug_features=drug_input, + ) + + predict_loader = DataLoader( + predict_dataset, batch_size=self.hyperparameters.get("batch_size", 64), shuffle=False + ) + + # Run prediction + self.model.eval() + predictions = [] + with torch.no_grad(): + for gene_inputs, smiles_inputs, _ in predict_loader: + gene_inputs = gene_inputs.to(self.DEVICE) + smiles_inputs = smiles_inputs.to(self.DEVICE) + + outputs = self.model(gene_inputs, smiles_inputs) + if outputs.numel() > 1: + predictions += outputs.squeeze().cpu().tolist() + else: + predictions += [outputs.item()] + + return np.array(predictions) + + def load_cell_line_features(self, data_path: str, dataset_name: str) -> FeatureDataset: + """ + Load cell line features. + + :param data_path: path to the data + :param dataset_name: name of the dataset + :returns: cell line features + """ + return load_and_select_gene_features( + feature_type="gene_expression", + gene_list="landmark_genes_reduced", + data_path=data_path, + dataset_name=dataset_name, + ) + + def load_drug_features(self, data_path: str, dataset_name: str) -> FeatureDataset: + """ + Load drug features (BPE-encoded SMILES). + + :param data_path: path to the data + :param dataset_name: name of the dataset + :returns: drug features + :raises FileNotFoundError: if the BPE SMILES file is not found + """ + bpe_smiles_file = os.path.join(data_path, dataset_name, "drug_bpe_smiles.csv") + if not os.path.exists(bpe_smiles_file): + raise FileNotFoundError( + f"BPE SMILES file not found: {bpe_smiles_file}. " + "Please run the BPE featurizer first: " + "python -m drevalpy.datasets.featurizer.create_pharmaformer_drug_embeddings " + ) + + bpe_df = pd.read_csv(bpe_smiles_file, dtype={"pubchem_id": str}) + features = {} + for _, row in bpe_df.iterrows(): + drug_id = row["pubchem_id"] + # Extract all feature columns (excluding pubchem_id) + embedding = row.drop("pubchem_id").values.astype(np.float32) + features[drug_id] = {"bpe_smiles": embedding} + + return FeatureDataset(features) + + def save(self, directory: str) -> None: + """ + Save the PharmaFormer model using PyTorch conventions. + + This method stores: + - "pharmaformer_model.pt": PyTorch state_dict of the model + - "hyperparameters.json": All hyperparameters + - "gene_scaler.pkl": Fitted StandardScaler for gene expression + - "gene_normalizer.pkl": Fitted MinMaxScaler for gene expression + + :param directory: Target directory where the model files will be saved + :raises ValueError: If model is not built + """ + import joblib + + os.makedirs(directory, exist_ok=True) + if self.model is None: + raise ValueError("Cannot save model: model is not built.") + + model = cast(CombinedModel, self.model) + + torch.save(model.state_dict(), os.path.join(directory, "pharmaformer_model.pt")) # noqa: S614 + + # Save hyperparameters including gene_input_size + save_hyperparameters = self.hyperparameters.copy() + if self.model is not None: + # Extract gene_input_size from the model + save_hyperparameters["gene_input_size"] = self.model.feature_extractor.gene_fc1.in_features + + with open(os.path.join(directory, "hyperparameters.json"), "w") as f: + json.dump(save_hyperparameters, f) + + if self.gene_expression_scaler is not None: + joblib.dump(self.gene_expression_scaler, os.path.join(directory, "gene_scaler.pkl")) + if self.gene_expression_normalizer is not None: + joblib.dump(self.gene_expression_normalizer, os.path.join(directory, "gene_normalizer.pkl")) + + @classmethod + def load(cls, directory: str) -> "PharmaFormerModel": + """ + Load the PharmaFormer model using PyTorch conventions. + + This method expects the following files in the given directory: + - "pharmaformer_model.pt": PyTorch state_dict of the model + - "hyperparameters.json": Dictionary of hyperparameters + - "gene_scaler.pkl": Fitted StandardScaler (optional) + - "gene_normalizer.pkl": Fitted MinMaxScaler (optional) + + :param directory: Path to the directory containing the model files + :return: An instance of PharmaFormerModel with loaded model + """ + import joblib + + instance = cls() + + with open(os.path.join(directory, "hyperparameters.json")) as f: + instance.hyperparameters = json.load(f) + + # Load scalers if they exist + scaler_path = os.path.join(directory, "gene_scaler.pkl") + normalizer_path = os.path.join(directory, "gene_normalizer.pkl") + if os.path.exists(scaler_path): + instance.gene_expression_scaler = joblib.load(scaler_path) + if os.path.exists(normalizer_path): + instance.gene_expression_normalizer = joblib.load(normalizer_path) + + # Model will be built when needed (requires input dimensions) + # For now, we'll need to rebuild it with the saved hyperparameters + # This requires knowing the gene_input_size, which should be saved in hyperparameters + if "gene_input_size" in instance.hyperparameters: + instance.model = CombinedModel( + gene_input_size=instance.hyperparameters["gene_input_size"], + gene_hidden_size=instance.hyperparameters["gene_hidden_size"], + drug_hidden_size=instance.hyperparameters["drug_hidden_size"], + feature_dim=instance.hyperparameters["feature_dim"], + nhead=instance.hyperparameters["nhead"], + num_layers=instance.hyperparameters.get("num_layers", 3), + dim_feedforward=instance.hyperparameters.get("dim_feedforward", 2048), + dropout=instance.hyperparameters.get("dropout", 0.1), + ).to(instance.DEVICE) + + instance.model.load_state_dict( + torch.load(os.path.join(directory, "pharmaformer_model.pt"), map_location=instance.DEVICE) # noqa: S614 + ) + instance.model.eval() + + return instance diff --git a/drevalpy/models/SRMF/srmf.py b/drevalpy/models/SRMF/srmf.py index 88f635a5..8e1aaeb0 100644 --- a/drevalpy/models/SRMF/srmf.py +++ b/drevalpy/models/SRMF/srmf.py @@ -7,6 +7,10 @@ Matlab code adapted from https://github.com/linwang1982/SRMF. """ +import json +import os + +import joblib import numpy as np import pandas as pd from scipy.spatial.distance import jaccard @@ -294,3 +298,66 @@ def load_drug_features(self, data_path: str, dataset_name: str) -> FeatureDatase :returns: FeatureDataset containing the drug fingerprint features """ return load_drug_fingerprint_features(data_path, dataset_name, fill_na=True) + + def save(self, directory: str) -> None: + """ + Save the SRMF model's parameters and latent matrices to the specified directory. + + Files saved: + - best_u.pkl: latent factors for drugs + - best_v.pkl: latent factors for cell lines + - w_mask.pkl: response presence mask + - config.json: model configuration (hyperparameters and training mean) + + :param directory: Target directory to store model artifacts + """ + os.makedirs(directory, exist_ok=True) + joblib.dump(self.best_u, os.path.join(directory, "best_u.pkl")) + joblib.dump(self.best_v, os.path.join(directory, "best_v.pkl")) + joblib.dump(self.w, os.path.join(directory, "w_mask.pkl")) + with open(os.path.join(directory, "config.json"), "w") as f: + json.dump( + { + "k": self.k, + "lambda_l": self.lambda_l, + "lambda_d": self.lambda_d, + "lambda_c": self.lambda_c, + "max_iter": self.max_iter, + "seed": self.seed, + "training_mean": self.training_mean, + }, + f, + ) + + @classmethod + def load(cls, directory: str) -> "SRMF": + """ + Load a trained SRMF model from the specified directory. + + Expects the following files: + - best_u.pkl: latent factors for drugs + - best_v.pkl: latent factors for cell lines + - w_mask.pkl: response presence mask + - config.json: model configuration (hyperparameters and training mean) + + :param directory: Directory containing the saved model artifacts + :return: An instance of SRMF with restored parameters + :raises FileNotFoundError: if any required file is missing + """ + required_files = ["best_u.pkl", "best_v.pkl", "w_mask.pkl", "config.json"] + for file in required_files: + if not os.path.exists(os.path.join(directory, file)): + raise FileNotFoundError(f"Missing file: {file}") + + instance = cls() + instance.best_u = joblib.load(os.path.join(directory, "best_u.pkl")) + instance.best_v = joblib.load(os.path.join(directory, "best_v.pkl")) + instance.w = joblib.load(os.path.join(directory, "w_mask.pkl")) + + with open(os.path.join(directory, "config.json")) as f: + config = json.load(f) + + instance.build_model(config) + instance.training_mean = config["training_mean"] + + return instance diff --git a/drevalpy/models/SimpleNeuralNetwork/__init__.py b/drevalpy/models/SimpleNeuralNetwork/__init__.py index 4db64a73..444b3e12 100644 --- a/drevalpy/models/SimpleNeuralNetwork/__init__.py +++ b/drevalpy/models/SimpleNeuralNetwork/__init__.py @@ -1 +1 @@ -"""Module for the baseline neural network models SimpleNeuralNetwork and MultiOmicsNeuralNetwork.""" +"""Module for the baseline models SimpleNeuralNetwork, ChemBERTaNeuralNetwork and MultiOmicsNeuralNetwork.""" diff --git a/drevalpy/models/SimpleNeuralNetwork/hyperparameters.yaml b/drevalpy/models/SimpleNeuralNetwork/hyperparameters.yaml index b48a288c..721991f2 100644 --- a/drevalpy/models/SimpleNeuralNetwork/hyperparameters.yaml +++ b/drevalpy/models/SimpleNeuralNetwork/hyperparameters.yaml @@ -41,3 +41,24 @@ MultiOmicsNeuralNetwork: - 100 max_epochs: - 100 + +ChemBERTaNeuralNetwork: + dropout_prob: + - 0.3 + units_per_layer: + - - 32 + - 16 + - 8 + - 4 + - - 128 + - 64 + - 32 + - - 64 + - 64 + - 32 + - - 1024 + - 128 + - 64 + - 16 + max_epochs: + - 100 diff --git a/drevalpy/models/SimpleNeuralNetwork/multiomics_neural_network.py b/drevalpy/models/SimpleNeuralNetwork/multiomics_neural_network.py index aa1671b0..39b778a1 100644 --- a/drevalpy/models/SimpleNeuralNetwork/multiomics_neural_network.py +++ b/drevalpy/models/SimpleNeuralNetwork/multiomics_neural_network.py @@ -1,8 +1,12 @@ """Contains the baseline MultiOmicsNeuralNetwork model.""" +import json +import os import warnings +import joblib import numpy as np +import torch from sklearn.decomposition import PCA from sklearn.preprocessing import StandardScaler @@ -33,9 +37,9 @@ def __init__(self): """ super().__init__() self.model = None - self.hyperparameters = None self.methylation_scaler = StandardScaler() self.methylation_pca = None + self.pca_ncomp = 100 self.gene_expression_scaler = StandardScaler() @classmethod @@ -57,8 +61,11 @@ def build_model(self, hyperparameters: dict): :param hyperparameters: dictionary containing the hyperparameters units_per_layer, dropout_prob, and methylation_pca_components. """ + # Log hyperparameters to wandb if enabled + self.log_hyperparameters(hyperparameters) + self.hyperparameters = hyperparameters - self.methylation_pca = PCA(n_components=hyperparameters["methylation_pca_components"]) + self.pca_ncomp = hyperparameters["methylation_pca_components"] def train( self, @@ -80,6 +87,13 @@ def train( """ if drug_input is None: raise ValueError("Drug input (fingerprints) is needed for the MultiOmicsNeuralNetwork model.") + first_feature = next(iter(cell_line_input.features.values())) + n_met_features = first_feature["methylation"].shape[0] + if n_met_features > self.pca_ncomp: + self.methylation_pca = PCA(n_components=self.pca_ncomp) + else: + self.methylation_pca = PCA(n_components=n_met_features) + cell_line_input = prepare_expression_and_methylation( cell_line_input=cell_line_input, cell_line_ids=np.unique(output.cell_line_ids), @@ -96,6 +110,12 @@ def train( dim_cnv = first_feature["copy_number_variation_gistic"].shape[0] dim_fingerprint = next(iter(drug_input.features.values()))["fingerprints"].shape[0] + self.dim_gex = dim_gex + self.dim_met = dim_met + self.dim_mut = dim_mut + self.dim_cnv = dim_cnv + self.dim_fp = dim_fingerprint + self.model = FeedForwardNetwork( hyperparameters=self.hyperparameters, input_dim=dim_gex + dim_met + dim_mut + dim_cnv + dim_fingerprint, @@ -121,6 +141,7 @@ def train( patience=5, num_workers=1, model_checkpoint_dir=model_checkpoint_dir, + wandb_project=self.wandb_project, ) def predict( @@ -194,3 +215,96 @@ def load_drug_features(self, data_path: str, dataset_name: str) -> FeatureDatase :returns: FeatureDataset containing the drug fingerprint features """ return load_drug_fingerprint_features(data_path, dataset_name, fill_na=True) + + def save(self, directory: str) -> None: + """ + Save the trained model, hyperparameters, scalers, PCA object, and feature dimensions to disk. + + Files saved: + - model.pt + - hyperparameters.json + - gene_scaler.pkl + - methylation_scaler.pkl + - methylation_pca.pkl + - metadata.json + + :param directory: Target directory + """ + os.makedirs(directory, exist_ok=True) + + torch.save(self.model.state_dict(), os.path.join(directory, "model.pt")) # noqa: S614 + + with open(os.path.join(directory, "hyperparameters.json"), "w") as f: + json.dump(self.hyperparameters, f) + + joblib.dump(self.gene_expression_scaler, os.path.join(directory, "gene_scaler.pkl")) + joblib.dump(self.methylation_scaler, os.path.join(directory, "methylation_scaler.pkl")) + joblib.dump(self.methylation_pca, os.path.join(directory, "methylation_pca.pkl")) + + metadata = { + "dim_gex": self.dim_gex, + "dim_met": self.dim_met, + "dim_mut": self.dim_mut, + "dim_cnv": self.dim_cnv, + "dim_fp": self.dim_fp, + } + with open(os.path.join(directory, "metadata.json"), "w") as f: + json.dump(metadata, f) + + @classmethod + def load(cls, directory: str) -> "MultiOmicsNeuralNetwork": + """ + Load a trained MultiOmicsNeuralNetwork instance from disk. + + Required files: + - model.pt + - hyperparameters.json + - gene_scaler.pkl + - methylation_scaler.pkl + - methylation_pca.pkl + - metadata.json + + :param directory: Directory containing the saved model files + :return: Fully restored MultiOmicsNeuralNetwork instance + :raises FileNotFoundError: if any required file is missing + """ + required_files = [ + "model.pt", + "hyperparameters.json", + "gene_scaler.pkl", + "methylation_scaler.pkl", + "methylation_pca.pkl", + "metadata.json", + ] + missing = [f for f in required_files if not os.path.exists(os.path.join(directory, f))] + if missing: + raise FileNotFoundError(f"Missing model files: {', '.join(missing)}") + + instance = cls() + + with open(os.path.join(directory, "hyperparameters.json")) as f: + instance.hyperparameters = json.load(f) + + instance.gene_expression_scaler = joblib.load(os.path.join(directory, "gene_scaler.pkl")) + instance.methylation_scaler = joblib.load(os.path.join(directory, "methylation_scaler.pkl")) + instance.methylation_pca = joblib.load(os.path.join(directory, "methylation_pca.pkl")) + + with open(os.path.join(directory, "metadata.json")) as f: + metadata = json.load(f) + + instance.dim_gex = metadata["dim_gex"] + instance.dim_met = metadata["dim_met"] + instance.dim_mut = metadata["dim_mut"] + instance.dim_cnv = metadata["dim_cnv"] + instance.dim_fp = metadata["dim_fp"] + + input_dim = instance.dim_gex + instance.dim_met + instance.dim_mut + instance.dim_cnv + instance.dim_fp + + instance.model = FeedForwardNetwork( + hyperparameters=instance.hyperparameters, + input_dim=input_dim, + ) + instance.model.load_state_dict(torch.load(os.path.join(directory, "model.pt"))) # noqa: S614 + instance.model.eval() + + return instance diff --git a/drevalpy/models/SimpleNeuralNetwork/simple_neural_network.py b/drevalpy/models/SimpleNeuralNetwork/simple_neural_network.py index f0d3820c..077e69ff 100644 --- a/drevalpy/models/SimpleNeuralNetwork/simple_neural_network.py +++ b/drevalpy/models/SimpleNeuralNetwork/simple_neural_network.py @@ -1,9 +1,14 @@ -"""Contains the SimpleNeuralNetwork model.""" +"""Contains the SimpleNeuralNetwork and the ChemBERTaNeuralNetwork model.""" +import json +import os import platform import warnings +import joblib import numpy as np +import pandas as pd +import torch from sklearn.preprocessing import StandardScaler from drevalpy.datasets.dataset import DrugResponseDataset, FeatureDataset @@ -23,12 +28,11 @@ class SimpleNeuralNetwork(DRPModel): def __init__(self): """Initializes the SimpleNeuralNetwork. - The model is build in train(). The gene_expression_scalar is set to the StandardScaler() and later fitted + The model is built in train(). The gene_expression_scalar is set to the StandardScaler() and later fitted using the training data only. """ super().__init__() self.model = None - self.hyperparameters = None self.gene_expression_scaler = StandardScaler() @classmethod @@ -46,7 +50,12 @@ def build_model(self, hyperparameters: dict): :param hyperparameters: includes units_per_layer and dropout_prob. """ + # Log hyperparameters to wandb if enabled + self.log_hyperparameters(hyperparameters) + self.hyperparameters = hyperparameters + self.hyperparameters.setdefault("input_dim_gex", None) + self.hyperparameters.setdefault("input_dim_fp", None) def train( self, @@ -70,7 +79,7 @@ def train( """ if drug_input is None: - raise ValueError("drug_input (fingerprints) are required for SimpleNeuralNetwork.") + raise ValueError(f"drug_input ({self.drug_views[0]}) are required for SimpleNeuralNetwork.") # Apply arcsinh transformation and scaling to gene expression features if "gene_expression" in self.cell_line_views: @@ -82,7 +91,9 @@ def train( ) dim_gex = next(iter(cell_line_input.features.values()))["gene_expression"].shape[0] - dim_fingerprint = next(iter(drug_input.features.values()))["fingerprints"].shape[0] + dim_fingerprint = next(iter(drug_input.features.values()))[self.drug_views[0]].shape[0] + self.hyperparameters["input_dim_gex"] = dim_gex + self.hyperparameters["input_dim_fp"] = dim_fingerprint self.model = FeedForwardNetwork( hyperparameters=self.hyperparameters, @@ -98,6 +109,12 @@ def train( "ignore", message="Starting from v1\\.9\\.0, `tensorboardX` has been removed.*", ) + if (output_earlystopping is not None) and len(output_earlystopping) == 0: + output_earlystopping = output + print("SimpleNeuralNetwork: Early stopping dataset empty. Using training data for early stopping") + + print("Probably, your training dataset is small.") + self.model.fit( output_train=output, cell_line_input=cell_line_input, @@ -113,6 +130,7 @@ def train( patience=5, num_workers=1 if platform.system() == "Windows" else 8, model_checkpoint_dir=model_checkpoint_dir, + wandb_project=self.wandb_project, ) def predict( @@ -142,7 +160,7 @@ def predict( x = self.get_concatenated_features( cell_line_view="gene_expression", - drug_view="fingerprints", + drug_view=self.drug_views[0], cell_line_ids_output=cell_line_ids, drug_ids_output=drug_ids, cell_line_input=cell_line_input, @@ -161,7 +179,7 @@ def load_cell_line_features(self, data_path: str, dataset_name: str) -> FeatureD """ return load_and_select_gene_features( feature_type="gene_expression", - gene_list="landmark_genes", + gene_list="landmark_genes_reduced", data_path=data_path, dataset_name=dataset_name, ) @@ -175,3 +193,102 @@ def load_drug_features(self, data_path: str, dataset_name: str) -> FeatureDatase :returns: FeatureDataset containing the fingerprints """ return load_drug_fingerprint_features(data_path, dataset_name, fill_na=True) + + def save(self, directory: str) -> None: + """ + Save the trained model, hyperparameters, and gene expression scaler to the given directory. + + This enables full reconstruction of the model using `load`. + + Files saved: + - model.pt: PyTorch state_dict of the trained model + - hyperparameters.json: Dictionary containing all relevant model hyperparameters + - scaler.pkl: Fitted StandardScaler for gene expression features + + :param directory: Target directory to store all model artifacts + """ + os.makedirs(directory, exist_ok=True) + + torch.save(self.model.state_dict(), os.path.join(directory, "model.pt")) # noqa: S614 + + with open(os.path.join(directory, "hyperparameters.json"), "w") as f: + json.dump(self.hyperparameters, f) + + joblib.dump(self.gene_expression_scaler, os.path.join(directory, "scaler.pkl")) + + @classmethod + def load(cls, directory: str) -> "SimpleNeuralNetwork": + """ + Load a trained SimpleNeuralNetwork instance from disk. + + This includes: + - model.pt: PyTorch state_dict of the trained model + - hyperparameters.json: Dictionary with model hyperparameters + - scaler.pkl: Fitted StandardScaler for gene expression features + + :param directory: Directory containing the saved model files + :return: An instance of SimpleNeuralNetwork with restored state + :raises FileNotFoundError: if any required file is missing + """ + hyperparam_file = os.path.join(directory, "hyperparameters.json") + scaler_file = os.path.join(directory, "scaler.pkl") + model_file = os.path.join(directory, "model.pt") + + if not all(os.path.exists(f) for f in [hyperparam_file, scaler_file, model_file]): + raise FileNotFoundError("Missing model files. Required: model.pt, hyperparameters.json, scaler.pkl") + + instance = cls() + + with open(hyperparam_file) as f: + instance.hyperparameters = json.load(f) + + instance.gene_expression_scaler = joblib.load(scaler_file) + + dim_gex = instance.hyperparameters["input_dim_gex"] + dim_fp = instance.hyperparameters["input_dim_fp"] + + instance.model = FeedForwardNetwork(instance.hyperparameters, input_dim=dim_gex + dim_fp) + instance.model.load_state_dict(torch.load(model_file)) # noqa: S614 + instance.model.eval() + + return instance + + +class ChemBERTaNeuralNetwork(SimpleNeuralNetwork): + """ChemBERTa Neural Network model using gene expression and ChemBERTa drug embeddings.""" + + drug_views = ["chemberta_embeddings"] + + @classmethod + def get_model_name(cls) -> str: + """ + Returns the model name. + + :returns: ChemBERTaNeuralNetwork + """ + return "ChemBERTaNeuralNetwork" + + def load_drug_features(self, data_path: str, dataset_name: str) -> FeatureDataset: + """ + Loads the ChemBERTa embeddings. + + :param data_path: Path to the ChemBERTa embeddings, e.g., data/ + :param dataset_name: name of the dataset, e.g., GDSC1 + :returns: FeatureDataset containing the ChemBERTa embeddings + :raises FileNotFoundError: if the ChemBERTa embeddings file is not found + """ + chemberta_file = os.path.join(data_path, dataset_name, "drug_chemberta_embeddings.csv") + if not os.path.exists(chemberta_file): + raise FileNotFoundError( + f"ChemBERTa embeddings file not found: {chemberta_file}. " + "Please create it first with the respective drug_featurizer." + ) + + chemberta_df = pd.read_csv(chemberta_file, dtype={"pubchem_id": str}) + features = {} + for _, row in chemberta_df.iterrows(): + drug_id = row["pubchem_id"] + embedding = row.drop("pubchem_id").to_numpy(dtype=np.float32) + features[drug_id] = {"chemberta_embeddings": embedding} + + return FeatureDataset(features) diff --git a/drevalpy/models/SimpleNeuralNetwork/utils.py b/drevalpy/models/SimpleNeuralNetwork/utils.py index 26b2790b..b388bcab 100644 --- a/drevalpy/models/SimpleNeuralNetwork/utils.py +++ b/drevalpy/models/SimpleNeuralNetwork/utils.py @@ -7,11 +7,14 @@ import pytorch_lightning as pl import torch from pytorch_lightning.callbacks import EarlyStopping, TQDMProgressBar +from pytorch_lightning.loggers import WandbLogger from torch import nn from torch.utils.data import DataLoader, Dataset from drevalpy.datasets.dataset import DrugResponseDataset, FeatureDataset +from ..lightning_metrics_mixin import RegressionMetricsMixin + class RegressionDataset(Dataset): """Dataset for regression tasks for the data loader.""" @@ -92,7 +95,7 @@ def __len__(self): return len(self.output.response) -class FeedForwardNetwork(pl.LightningModule): +class FeedForwardNetwork(RegressionMetricsMixin, pl.LightningModule): """Feed forward neural network for regression tasks with basic architecture.""" def __init__(self, hyperparameters: dict[str, int | float | list[int]], input_dim: int) -> None: @@ -137,6 +140,9 @@ def __init__(self, hyperparameters: dict[str, int | float | list[int]], input_di if self.dropout_prob is not None: self.dropout_layer = nn.Dropout(p=self.dropout_prob) + # Initialize metrics storage for epoch-end R^2 and PCC computation + self._init_metrics_storage() + def fit( self, output_train: DrugResponseDataset, @@ -150,11 +156,13 @@ def fit( patience=5, num_workers: int = 2, model_checkpoint_dir: str = "checkpoints", + wandb_project: str | None = None, ) -> None: """ Fits the model. First, the data is loaded using a DataLoader. Then, the model is trained using the Lightning Trainer. + :param output_train: Response values for training :param cell_line_input: Cell line features :param drug_input: Drug features @@ -166,6 +174,8 @@ def fit( :param patience: patience for early stopping, default is 5 :param num_workers: number of workers for the DataLoader, default is 2 :param model_checkpoint_dir: directory to save the model checkpoints + :param wandb_project: optional wandb project name for logging. If provided, uses WandbLogger + for PyTorch Lightning training. :raises ValueError: if drug_input is missing """ if trainer_params is None: @@ -233,6 +243,14 @@ def fit( trainer_params_copy = trainer_params.copy() del trainer_params_copy["progress_bar_refresh_rate"] + # Set up wandb logger if project is provided + # Note: This method receives wandb_project as parameter, but the model instance + # should have wandb already initialized via DRPModel.init_wandb() + loggers = [] + if wandb_project is not None: + logger = WandbLogger(project=wandb_project, log_model=False) + loggers.append(logger) + # Initialize the Lightning trainer trainer = pl.Trainer( callbacks=[ @@ -240,6 +258,7 @@ def fit( self.checkpoint_callback, progress_bar, ], + logger=loggers if loggers else True, # Use default logger if no wandb default_root_dir=model_checkpoint_dir, devices=1, **trainer_params_copy, @@ -287,6 +306,10 @@ def _forward_loss_and_log(self, x, y, log_as: str): y_pred = self.forward(x) result = self.loss(y_pred, y) self.log(log_as, result, on_step=True, on_epoch=True, prog_bar=True) + + # Store predictions and targets for epoch-end metrics via mixin + self._store_predictions(y_pred, y, is_training=(log_as == "train_loss")) + return result def training_step(self, batch): diff --git a/drevalpy/models/SuperFELTR/superfeltr.py b/drevalpy/models/SuperFELTR/superfeltr.py index 43268f4f..6334dfc5 100644 --- a/drevalpy/models/SuperFELTR/superfeltr.py +++ b/drevalpy/models/SuperFELTR/superfeltr.py @@ -78,6 +78,9 @@ def build_model(self, hyperparameters) -> None: dropout_rate, weight_decay, out_dim_expr_encoder, out_dim_mutation_encoder, out_dim_cnv_encoder, epochs, variance thresholds for gene expression, mutation, and copy number variation, margin, and learning rate. """ + # Log hyperparameters to wandb if enabled + self.log_hyperparameters(hyperparameters) + self.hyperparameters = hyperparameters n_features = hyperparameters.get("n_features_per_view", 1000) @@ -133,6 +136,7 @@ def train( output_earlystopping=output_earlystopping, patience=5, model_checkpoint_dir=model_checkpoint_dir, + wandb_project=self.wandb_project, ) encoders[omic_type] = SuperFELTEncoder.load_from_checkpoint(best_checkpoint.best_model_path) else: @@ -165,6 +169,7 @@ def train( output_earlystopping=output_earlystopping, patience=5, model_checkpoint_dir=model_checkpoint_dir, + wandb_project=self.wandb_project, ) else: print("Not enough training data provided for SuperFELTR Regressor. Using random initialization.") @@ -232,7 +237,7 @@ def predict( mutations = input_data["mutations"] cnvs = input_data["copy_number_variation_gistic"] - (gene_expression, mutations, cnvs) = filter_and_sort_omics( + gene_expression, mutations, cnvs = filter_and_sort_omics( model=self, gene_expression=gene_expression, mutations=mutations, cnvs=cnvs, cell_line_input=cell_line_input ) diff --git a/drevalpy/models/SuperFELTR/utils.py b/drevalpy/models/SuperFELTR/utils.py index 4816302d..de507331 100644 --- a/drevalpy/models/SuperFELTR/utils.py +++ b/drevalpy/models/SuperFELTR/utils.py @@ -10,6 +10,7 @@ from torch import nn from ...datasets.dataset import DrugResponseDataset, FeatureDataset +from ..lightning_metrics_mixin import RegressionMetricsMixin from ..MOLIR.utils import create_dataset_and_loaders, generate_triplets_indices @@ -164,7 +165,7 @@ def validation_step(self, batch: list[torch.Tensor], batch_idx: int) -> torch.Te return triplet_loss -class SuperFELTRegressor(pl.LightningModule): +class SuperFELTRegressor(RegressionMetricsMixin, pl.LightningModule): """ SuperFELT regressor definition. @@ -204,6 +205,9 @@ def __init__( encoder.eval() self.regression_loss = nn.MSELoss() + # Initialize metrics storage for epoch-end R^2 and PCC computation + self._init_metrics_storage() + def forward(self, x: torch.Tensor) -> torch.Tensor: """ Forward pass of the SuperFELTRegressor. @@ -268,6 +272,10 @@ def training_step(self, batch: list[torch.Tensor], batch_idx: int) -> torch.Tens pred = self.regressor(encoded) loss = self.regression_loss(pred.squeeze(), response) self.log("train_loss", loss, on_step=False, on_epoch=True, prog_bar=True) + + # Store predictions and targets for epoch-end metrics via mixin + self._store_predictions(pred.squeeze(), response, is_training=True) + return loss def validation_step(self, batch: list[torch.Tensor], batch_idx: int) -> torch.Tensor: @@ -283,6 +291,10 @@ def validation_step(self, batch: list[torch.Tensor], batch_idx: int) -> torch.Te pred = self.regressor(encoded) loss = self.regression_loss(pred.squeeze(), response) self.log("val_loss", loss, on_step=False, on_epoch=True, prog_bar=True) + + # Store predictions and targets for epoch-end metrics via mixin + self._store_predictions(pred.squeeze(), response, is_training=False) + return loss @@ -294,11 +306,13 @@ def train_superfeltr_model( output_earlystopping: DrugResponseDataset | None = None, patience: int = 5, model_checkpoint_dir: str = "superfeltr_checkpoints", + wandb_project: str | None = None, ) -> pl.callbacks.ModelCheckpoint: """ Trains one encoder or the regressor. First, the dataset and loaders are created. Then, the model is trained with the Lightning trainer. + :param model: either one of the encoders or the regressor :param hpams: hyperparameters for the model :param output_train: response data for training @@ -306,6 +320,8 @@ def train_superfeltr_model( :param output_earlystopping: response data for early stopping :param patience: for early stopping, defaults to 5 :param model_checkpoint_dir: directory to save the model checkpoints + :param wandb_project: optional wandb project name for logging. If provided, uses WandbLogger + for PyTorch Lightning training. :returns: checkpoint callback with the best model :raises ValueError: if the epochs and mini_batch are not integers """ @@ -329,9 +345,18 @@ def train_superfeltr_model( mode="min", save_top_k=1, ) + # Set up wandb logger if project is provided + loggers = [] + if wandb_project is not None: + from pytorch_lightning.loggers import WandbLogger + + logger = WandbLogger(project=wandb_project, log_model=False) + loggers.append(logger) + # Initialize the Lightning trainer trainer = pl.Trainer( max_epochs=hpams["epochs"], + logger=loggers if loggers else True, # Use default logger if no wandb callbacks=[ early_stop_callback, checkpoint_callback, diff --git a/drevalpy/models/__init__.py b/drevalpy/models/__init__.py index 28301249..5ecf2e4f 100644 --- a/drevalpy/models/__init__.py +++ b/drevalpy/models/__init__.py @@ -8,6 +8,7 @@ "NaiveDrugMeanPredictor", "NaiveCellLineMeanPredictor", "NaiveTissueMeanPredictor", + "NaiveTissueDrugMeanPredictor", "NaiveMeanEffectsPredictor", "ElasticNetModel", "RandomForest", @@ -26,6 +27,9 @@ "ProteomicsRandomForest", "ProteomicsElasticNetModel", "SingleDrugProteomicsRandomForest", + "DrugGNN", + "ChemBERTaNeuralNetwork", + "PharmaFormerModel", ] from .baselines.multi_omics_random_forest import MultiOmicsRandomForest @@ -34,6 +38,7 @@ NaiveDrugMeanPredictor, NaiveMeanEffectsPredictor, NaivePredictor, + NaiveTissueDrugMeanPredictor, NaiveTissueMeanPredictor, ) from .baselines.singledrug_elastic_net import SingleDrugElasticNet, SingleDrugProteomicsElasticNet @@ -48,9 +53,11 @@ ) from .DIPK.dipk import DIPKModel from .drp_model import DRPModel +from .DrugGNN import DrugGNN from .MOLIR.molir import MOLIR +from .PharmaFormer.pharmaformer import PharmaFormerModel from .SimpleNeuralNetwork.multiomics_neural_network import MultiOmicsNeuralNetwork -from .SimpleNeuralNetwork.simple_neural_network import SimpleNeuralNetwork +from .SimpleNeuralNetwork.simple_neural_network import ChemBERTaNeuralNetwork, SimpleNeuralNetwork from .SRMF.srmf import SRMF from .SuperFELTR.superfeltr import SuperFELTR @@ -71,6 +78,7 @@ "NaiveCellLineMeanPredictor": NaiveCellLineMeanPredictor, "NaiveMeanEffectsPredictor": NaiveMeanEffectsPredictor, "NaiveTissueMeanPredictor": NaiveTissueMeanPredictor, + "NaiveTissueDrugMeanPredictor": NaiveTissueDrugMeanPredictor, "ElasticNet": ElasticNetModel, "RandomForest": RandomForest, "SVR": SVMRegressor, @@ -82,6 +90,9 @@ "DIPK": DIPKModel, "ProteomicsRandomForest": ProteomicsRandomForest, "ProteomicsElasticNet": ProteomicsElasticNetModel, + "DrugGNN": DrugGNN, + "ChemBERTaNeuralNetwork": ChemBERTaNeuralNetwork, + "PharmaFormer": PharmaFormerModel, } # MODEL_FACTORY is used in the pipeline! diff --git a/drevalpy/models/baselines/hyperparameters.yaml b/drevalpy/models/baselines/hyperparameters.yaml index bc258616..7bee8857 100644 --- a/drevalpy/models/baselines/hyperparameters.yaml +++ b/drevalpy/models/baselines/hyperparameters.yaml @@ -3,6 +3,7 @@ NaiveDrugMeanPredictor: NaiveCellLineMeanPredictor: NaiveMeanEffectsPredictor: NaiveTissueMeanPredictor: +NaiveTissueDrugMeanPredictor: ElasticNet: l1_ratio: - 0 diff --git a/drevalpy/models/baselines/multi_omics_random_forest.py b/drevalpy/models/baselines/multi_omics_random_forest.py index c1912d7d..005bb14e 100644 --- a/drevalpy/models/baselines/multi_omics_random_forest.py +++ b/drevalpy/models/baselines/multi_omics_random_forest.py @@ -1,5 +1,8 @@ """Contains the Multi-OMICS Random Forest model.""" +import os + +import joblib import numpy as np from sklearn.decomposition import PCA @@ -27,6 +30,7 @@ def __init__(self): """ super().__init__() self.pca = None + self.pca_ncomp = 100 @classmethod def get_model_name(cls) -> str: @@ -44,7 +48,7 @@ def build_model(self, hyperparameters: dict): :param hyperparameters: Hyperparameters for the model. """ super().build_model(hyperparameters) - self.pca = PCA(n_components=hyperparameters["n_components"]) + self.pca_ncomp = hyperparameters["n_components"] def load_cell_line_features(self, data_path: str, dataset_name: str) -> FeatureDataset: """ @@ -101,6 +105,10 @@ def train( inputs["fingerprints"], ) + if methylation.shape[1] > self.pca_ncomp: + self.pca = PCA(n_components=self.pca_ncomp) + else: + self.pca = PCA(n_components=methylation.shape[1]) methylation = self.pca.fit_transform(methylation) x = np.concatenate( @@ -130,7 +138,11 @@ def predict( :param cell_line_input: cell line input :param drug_input: drug input :returns: predicted response + :raises RuntimeError: if PCA has not been fit """ + if not hasattr(self.pca, "components_"): + raise RuntimeError("PCA has not been fit. Call train() before predict().") + inputs = self.get_feature_matrices( cell_line_ids=cell_line_ids, drug_ids=drug_ids, @@ -163,3 +175,27 @@ def predict( axis=1, ) return self.model.predict(x) + + def save(self, directory: str) -> None: + """ + Saves the trained model, hyperparameters, scaler, and PCA transformer to the specified directory. + + :param directory: Path to the directory where model components will be saved. + """ + super().save(directory) + if self.pca is not None: + joblib.dump(self.pca, os.path.join(directory, "pca.pkl")) + + @classmethod + def load(cls, directory: str) -> "MultiOmicsRandomForest": + """ + Loads the trained model, hyperparameters, scaler, and PCA transformer from the specified directory. + + :param directory: Path to the directory where model components are stored. + :returns: An instance of MultiOmicsRandomForest with restored state. + """ + instance: MultiOmicsRandomForest = super().load(directory) # type: ignore[assignment] + pca_path = os.path.join(directory, "pca.pkl") + if os.path.exists(pca_path): + instance.pca = joblib.load(pca_path) + return instance diff --git a/drevalpy/models/baselines/naive_pred.py b/drevalpy/models/baselines/naive_pred.py index 202da4a0..db1391c6 100644 --- a/drevalpy/models/baselines/naive_pred.py +++ b/drevalpy/models/baselines/naive_pred.py @@ -4,11 +4,16 @@ The naive predictor models are simple models that predict the mean of the response values. The NaivePredictor predicts the overall mean of the response, the NaiveCellLineMeanPredictor predicts the mean of the response per cell line, and the NaiveDrugMeanPredictor predicts the mean of the response per drug. +The NaiveTissueMeanPredictor predicts the mean of the response per tissue. +The NaiveTissueDrugMeanPredictor predicts the mean of the response per tissue-drug combination. The NaiveMeanEffectsPredictor predicts the response as the overall mean plus the cell line effect plus the drug effect and should be the strongest naive baseline. """ +import json +import os + import numpy as np from drevalpy.datasets.dataset import DrugResponseDataset, FeatureDataset @@ -17,7 +22,80 @@ from drevalpy.models.utils import load_cl_ids_from_csv, load_drug_ids_from_csv, load_tissues_from_csv, unique -class NaivePredictor(DRPModel): +class NaiveModel(DRPModel): + """ + Base class for all naive predictor models which are based on simple dataset stats. + + This class provides a shared interface and save/load mechanism for simple statistical models that + predict drug response based on dataset means, stratified by drug, cell line, or tissue. + """ + + def __init__(self): + """Initializes the NaiveModel base class.""" + super().__init__() + self.dataset_mean = None + + def build_model(self, hyperparameters: dict): + """ + Builds the model. + + Naive model do not require any hyperparameter tuning. + + :param hyperparameters: Dictionary of hyperparameters (not used). + """ + pass + + def save(self, directory: str) -> None: + """ + Saves the model parameters to the given directory. + + Serializes dataset_mean and any available subclass-specific attributes to a JSON file + named 'naive_model.json'. Creates the directory if it doesn't exist. + + :param directory: Path to the directory where the model will be saved. + """ + os.makedirs(directory, exist_ok=True) + config = {"dataset_mean": self.dataset_mean} + for attr in [ + "drug_means", + "cell_line_means", + "tissue_means", + "tissue_drug_means", + "cell_line_effects", + "drug_effects", + ]: + if hasattr(self, attr): + config[attr] = getattr(self, attr) + with open(os.path.join(directory, "naive_model.json"), "w") as f: + json.dump(config, f) + + @classmethod + def load(cls, directory: str) -> "NaiveModel": + """ + Loads the model parameters from the given directory. + + Reads the 'naive_model.json' file and initializes a NaiveModel instance with the loaded parameters. + :param directory: Path to the directory where the model is saved. + :return: An instance of NaiveModel with the loaded parameters. + """ + with open(os.path.join(directory, "naive_model.json")) as f: + config = json.load(f) + instance = cls() + instance.dataset_mean = config["dataset_mean"] + for attr in [ + "drug_means", + "cell_line_means", + "tissue_means", + "tissue_drug_means", + "cell_line_effects", + "drug_effects", + ]: + if attr in config: + setattr(instance, attr, config[attr]) + return instance + + +class NaivePredictor(NaiveModel): """Naive predictor model that predicts the overall mean of the response.""" cell_line_views = [CELL_LINE_IDENTIFIER] @@ -30,7 +108,6 @@ def __init__(self): Sets the dataset mean to None, which is initialized in the train method. """ super().__init__() - self.dataset_mean = None @classmethod def get_model_name(cls) -> str: @@ -41,14 +118,6 @@ def get_model_name(cls) -> str: """ return "NaivePredictor" - def build_model(self, hyperparameters: dict): - """ - Builds the model from hyperparameters. Not needed for the NaivePredictor. - - :param hyperparameters: Hyperparameters for the model, not needed - """ - pass - def train( self, output: DrugResponseDataset, @@ -107,7 +176,7 @@ def load_drug_features(self, data_path: str, dataset_name: str) -> FeatureDatase return load_drug_ids_from_csv(data_path, dataset_name) -class NaiveDrugMeanPredictor(DRPModel): +class NaiveDrugMeanPredictor(NaiveModel): """Naive predictor model that predicts the mean of the response per drug.""" cell_line_views = [CELL_LINE_IDENTIFIER] @@ -121,7 +190,6 @@ def __init__(self): """ super().__init__() self.drug_means = None - self.dataset_mean = None @classmethod def get_model_name(cls) -> str: @@ -132,14 +200,6 @@ def get_model_name(cls) -> str: """ return "NaiveDrugMeanPredictor" - def build_model(self, hyperparameters: dict): - """ - Builds the model from hyperparameters. Not needed for the NaiveDrugMeanPredictor. - - :param hyperparameters: Hyperparameters for the model, not needed - """ - pass - def train( self, output: DrugResponseDataset, @@ -224,7 +284,7 @@ def load_drug_features(self, data_path: str, dataset_name: str) -> FeatureDatase return load_drug_ids_from_csv(data_path, dataset_name) -class NaiveCellLineMeanPredictor(DRPModel): +class NaiveCellLineMeanPredictor(NaiveModel): """Naive predictor model that predicts the mean of the response per cell line.""" cell_line_views = [CELL_LINE_IDENTIFIER] @@ -238,7 +298,6 @@ def __init__(self): """ super().__init__() self.cell_line_means = None - self.dataset_mean = None @classmethod def get_model_name(cls) -> str: @@ -249,14 +308,6 @@ def get_model_name(cls) -> str: """ return "NaiveCellLineMeanPredictor" - def build_model(self, hyperparameters: dict): - """ - Builds the model from hyperparameters. Not needed for the NaiveCellLineMeanPredictor. - - :param hyperparameters: not needed - """ - pass - def train( self, output: DrugResponseDataset, @@ -340,7 +391,7 @@ def load_drug_features(self, data_path: str, dataset_name: str) -> FeatureDatase return load_drug_ids_from_csv(data_path, dataset_name) -class NaiveTissueMeanPredictor(DRPModel): +class NaiveTissueMeanPredictor(NaiveModel): """Naive predictor model that predicts the mean of the response per tissue.""" cell_line_views = [TISSUE_IDENTIFIER] @@ -354,7 +405,6 @@ def __init__(self): """ super().__init__() self.tissue_means = None - self.dataset_mean = None @classmethod def get_model_name(cls) -> str: @@ -365,14 +415,6 @@ def get_model_name(cls) -> str: """ return "NaiveTissueMeanPredictor" - def build_model(self, hyperparameters: dict): - """ - Builds the model from hyperparameters. Not needed for the NaiveTissueMeanPredictor. - - :param hyperparameters: Hyperparameters for the model, not needed - """ - pass - def train( self, output: DrugResponseDataset, @@ -384,20 +426,20 @@ def train( """ Computes the mean per tissue. Falls back to the overall mean for unknown tissues. - :param output: training dataset with `.response` and `.tissue` - :param cell_line_input: not needed + :param output: training dataset with `.response` + :param cell_line_input: tissue features for cell lines :param drug_input: not needed :param output_earlystopping: not needed :param model_checkpoint_dir: not needed - :raises ValueError: If tissue information is missing in the output dataset. """ self.dataset_mean = np.mean(output.response) self.tissue_means = {} - if output.tissue is None: - raise ValueError("Tissue information is missing in the output dataset.") - for tissue in np.unique(output.tissue): - mask = output.tissue == tissue + # Get tissue information from cell_line_input FeatureDataset + tissues = cell_line_input.get_feature_matrix(view=TISSUE_IDENTIFIER, identifiers=output.cell_line_ids) + tissues = np.asarray(tissues).flatten() + for tissue in np.unique(tissues): + mask = tissues == tissue responses = output.response[mask] if len(responses) > 0: self.tissue_means[tissue] = np.mean(responses) @@ -448,7 +490,7 @@ def load_drug_features(self, data_path: str, dataset_name: str) -> FeatureDatase return load_drug_ids_from_csv(data_path, dataset_name) -class NaiveMeanEffectsPredictor(DRPModel): +class NaiveMeanEffectsPredictor(NaiveModel): """ ANOVA-like predictor model. @@ -473,7 +515,6 @@ def __init__(self): and empty dictionaries, respectively. """ super().__init__() - self.dataset_mean = None self.cell_line_effects = {} self.drug_effects = {} @@ -486,16 +527,6 @@ def get_model_name(cls) -> str: """ return "NaiveMeanEffectsPredictor" - def build_model(self, hyperparameters: dict): - """ - Builds the model. - - This model does not require any hyperparameter tuning. - - :param hyperparameters: Dictionary of hyperparameters (not used). - """ - pass - def train( self, output: DrugResponseDataset, @@ -515,12 +546,13 @@ def train( :raises ValueError: If drug_input is None. """ if drug_input is None: - raise ValueError("drug_input (drug_id) is required for ANOVAPredictor.") + raise ValueError("drug_input (drug_id) is required for NaiveMeanEffectsPredictor.") # Compute the overall mean response. self.dataset_mean = np.mean(output.response) # Obtain cell line features. + cell_line_ids = cell_line_input.get_feature_matrix(view=CELL_LINE_IDENTIFIER, identifiers=output.cell_line_ids) cell_line_means = {} for cl_output, cl_feature in zip(unique(output.cell_line_ids), unique(cell_line_ids), strict=True): @@ -588,3 +620,163 @@ def load_drug_features(self, data_path: str, dataset_name: str) -> FeatureDatase :return: FeatureDataset containing the drug IDs. """ return load_drug_ids_from_csv(data_path, dataset_name) + + +class NaiveTissueDrugMeanPredictor(NaiveModel): + """ + Naive predictor model that predicts the mean of the response per tissue-drug combination. + + This model combines tissue and drug information to predict the mean response aggregated across + all cell lines from the same tissue tested on the same drug. If a (tissue, drug) combination + was not seen during training, it falls back to the overall dataset mean. + """ + + cell_line_views = [TISSUE_IDENTIFIER] + drug_views = [DRUG_IDENTIFIER] + + def __init__(self): + """ + Initializes the model. + + Tissue-drug means and dataset mean are set to None, which are initialized in the train method. + """ + super().__init__() + self.tissue_drug_means = None + + @classmethod + def get_model_name(cls) -> str: + """ + Returns the model name. + + :returns: NaiveTissueDrugMeanPredictor + """ + return "NaiveTissueDrugMeanPredictor" + + def save(self, directory: str) -> None: + """ + Saves the model parameters to the given directory. + + Overrides the base class save method to handle tuple keys in tissue_drug_means + by converting them to JSON-serializable string keys. + + :param directory: Path to the directory where the model will be saved. + """ + os.makedirs(directory, exist_ok=True) + config = {"dataset_mean": self.dataset_mean} + # Convert tuple keys to string keys for JSON serialization + if self.tissue_drug_means is not None: + config["tissue_drug_means"] = {f"{k[0]}|{k[1]}": v for k, v in self.tissue_drug_means.items()} + with open(os.path.join(directory, "naive_model.json"), "w") as f: + json.dump(config, f) + + @classmethod + def load(cls, directory: str) -> "NaiveTissueDrugMeanPredictor": + """ + Loads the model parameters from the given directory. + + Overrides the base class load method to convert string keys back to tuple keys. + + :param directory: Path to the directory where the model is saved. + :return: An instance of NaiveTissueDrugMeanPredictor with the loaded parameters. + """ + with open(os.path.join(directory, "naive_model.json")) as f: + config = json.load(f) + instance = cls() + instance.dataset_mean = config["dataset_mean"] + # Convert string keys back to tuple keys + if "tissue_drug_means" in config: + instance.tissue_drug_means = {tuple(k.split("|")): v for k, v in config["tissue_drug_means"].items()} + return instance + + def train( + self, + output: DrugResponseDataset, + cell_line_input: FeatureDataset, + drug_input: FeatureDataset | None = None, + output_earlystopping: DrugResponseDataset | None = None, + model_checkpoint_dir: str = "None", + ) -> None: + """ + Computes the mean per tissue-drug combination. Falls back to the overall mean for unknown combinations. + + :param output: training dataset with `.response` and `.drug_ids` + :param cell_line_input: tissue features for cell lines + :param drug_input: drug id features + :param output_earlystopping: not needed + :param model_checkpoint_dir: not needed + :raises ValueError: If drug_input is None. + """ + if drug_input is None: + raise ValueError("drug_input (drug_id) is required for the NaiveTissueDrugMeanPredictor.") + + # Get drug features for each drug in the output (following NaiveDrugMeanPredictor pattern) + drug_ids = drug_input.get_feature_matrix(view=DRUG_IDENTIFIER, identifiers=output.drug_ids) + + # Get tissue information from cell_line_input FeatureDataset + tissues = cell_line_input.get_feature_matrix(view=TISSUE_IDENTIFIER, identifiers=output.cell_line_ids) + tissues = np.asarray(tissues).flatten() + + self.dataset_mean = np.mean(output.response) + self.tissue_drug_means = {} + + # Use tissues from cell_line_input FeatureDataset + # and drug_ids from drug_input FeatureDataset (following NaiveDrugMeanPredictor pattern) + for tissue in np.unique(tissues): + tissue_mask = tissues == tissue + for drug_response, drug_feature in zip(unique(output.drug_ids), unique(drug_ids), strict=True): + drug_mask = drug_feature == output.drug_ids + combo_mask = tissue_mask & drug_mask + responses = output.response[combo_mask] + if len(responses) > 0: + combo_key = (str(tissue), str(drug_response)) + self.tissue_drug_means[combo_key] = np.mean(responses) + + def predict( + self, + cell_line_ids: np.ndarray, + drug_ids: np.ndarray, + cell_line_input: FeatureDataset, + drug_input: FeatureDataset | None = None, + ) -> np.ndarray: + """ + Predicts the tissue-drug mean for each drug-cell line combination. + + If the (tissue, drug) combination is not in the training set, the dataset mean is used. + + :param cell_line_ids: cell line ids + :param drug_ids: drug ids (used directly, following NaiveDrugMeanPredictor pattern) + :param cell_line_input: tissue features + :param drug_input: not needed + :return: array of the same length as the input containing the tissue-drug mean or dataset mean + """ + # Get tissues from FeatureDataset (following NaiveTissueMeanPredictor pattern) + tissues = cell_line_input.get_feature_matrix(view=TISSUE_IDENTIFIER, identifiers=cell_line_ids) + + # Use drug_ids parameter directly (following NaiveDrugMeanPredictor pattern) + preds = [] + for tissue, drug_id in zip(tissues, drug_ids, strict=True): + tissue_key = tissue.item() if isinstance(tissue, np.ndarray) else tissue + combo_key = (str(tissue_key), str(drug_id)) + preds.append(self.tissue_drug_means.get(combo_key, self.dataset_mean)) + + return np.array(preds) + + def load_cell_line_features(self, data_path: str, dataset_name: str) -> FeatureDataset: + """ + Loads the cell line features, in this case the tissue annotations. + + :param data_path: path to the data + :param dataset_name: name of the dataset + :returns: FeatureDataset containing the tissue ids + """ + return load_tissues_from_csv(data_path, dataset_name) + + def load_drug_features(self, data_path: str, dataset_name: str) -> FeatureDataset: + """ + Loads the drug features, in this case the drug ids. + + :param data_path: path to the data + :param dataset_name: name of the dataset + :returns: FeatureDataset containing the drug ids + """ + return load_drug_ids_from_csv(data_path, dataset_name) diff --git a/drevalpy/models/baselines/singledrug_elastic_net.py b/drevalpy/models/baselines/singledrug_elastic_net.py index 49396c70..13b27379 100644 --- a/drevalpy/models/baselines/singledrug_elastic_net.py +++ b/drevalpy/models/baselines/singledrug_elastic_net.py @@ -1,5 +1,9 @@ -"""SingleDrugElasticNet and SingleDrugProteomicsElasticNet classes. Fit an Elastic net for each drug seperately.""" +"""SingleDrugElasticNet and SingleDrugProteomicsElasticNet classes. Fit an Elastic net for each drug separately.""" +import json +import os + +import joblib import numpy as np from sklearn.linear_model import ElasticNet from sklearn.preprocessing import StandardScaler @@ -271,3 +275,56 @@ def predict( drug_input=None, ) return self.model.predict(x) + + def save(self, directory: str) -> None: + """ + Save the trained model and proteomics transformer. + + Saves: + - model.pkl: the fitted ElasticNet model + - transformer.pkl: the fitted ProteomicsMedianCenterAndImputeTransformer + + :param directory: Target directory for saving model files + :raises ValueError: If model or transformer is not initialized + """ + os.makedirs(directory, exist_ok=True) + + if self.model is None: + raise ValueError("Cannot save: model is not trained.") + + joblib.dump(self.model, os.path.join(directory, "elasticnet_model.pkl")) + joblib.dump(self.proteomics_transformer, os.path.join(directory, "proteomics_transformer.pkl")) + + with open(os.path.join(directory, "hyperparameters.json"), "w") as f: + json.dump( + { + "feature_threshold": self.feature_threshold, + "n_features": self.n_features, + "normalization_width": self.normalization_width, + "normalization_downshift": self.normalization_downshift, + }, + f, + ) + + @classmethod + def load(cls, directory: str) -> "SingleDrugProteomicsElasticNet": + """ + Load a trained SingleDrugProteomicsElasticNet model and transformer. + + Loads: + - model.pkl: trained ElasticNet model + - transformer.pkl: fitted ProteomicsMedianCenterAndImputeTransformer + + :param directory: Directory where the model files are stored + :return: Loaded instance of SingleDrugProteomicsElasticNet + """ + instance = cls() + + with open(os.path.join(directory, "hyperparameters.json")) as f: + hyperparameters = json.load(f) + instance.build_model(hyperparameters) + + instance.model = joblib.load(os.path.join(directory, "elasticnet_model.pkl")) + instance.proteomics_transformer = joblib.load(os.path.join(directory, "proteomics_transformer.pkl")) + + return instance diff --git a/drevalpy/models/baselines/sklearn_models.py b/drevalpy/models/baselines/sklearn_models.py index a396fd09..425727b3 100644 --- a/drevalpy/models/baselines/sklearn_models.py +++ b/drevalpy/models/baselines/sklearn_models.py @@ -1,5 +1,9 @@ """Contains sklearn baseline models: ElasticNet, RandomForest, SVM.""" +import json +import os + +import joblib import numpy as np from sklearn.ensemble import HistGradientBoostingRegressor, RandomForestRegressor from sklearn.linear_model import ElasticNet, Lasso, Ridge @@ -33,6 +37,7 @@ def __init__(self): super().__init__() self.model = None self.gene_expression_scaler = StandardScaler() + self.proteomics_transformer = None @classmethod def get_model_name(cls) -> str: @@ -48,9 +53,8 @@ def build_model(self, hyperparameters: dict): Builds the model from hyperparameters. :param hyperparameters: Custom hyperparameters for the model, have to be defined in the child class. - :raises NotImplementedError: If the method is not implemented in the child class. """ - raise NotImplementedError("build_model method has to be implemented in the child class.") + self.hyperparameters = hyperparameters def train( self, @@ -75,6 +79,7 @@ def train( raise ValueError("drug_input (fingerprints) is required for the sklearn models.") if "gene_expression" in self.cell_line_views: + cell_line_input = scale_gene_expression( cell_line_input=cell_line_input, cell_line_ids=np.unique(output.cell_line_ids), @@ -139,7 +144,7 @@ def load_cell_line_features(self, data_path: str, dataset_name: str) -> FeatureD """ return load_and_select_gene_features( feature_type="gene_expression", - gene_list="landmark_genes", + gene_list="landmark_genes_reduced", data_path=data_path, dataset_name=dataset_name, ) @@ -154,6 +159,64 @@ def load_drug_features(self, data_path: str, dataset_name: str) -> FeatureDatase """ return load_drug_fingerprint_features(data_path, dataset_name, fill_na=True) + def save(self, directory: str) -> None: + """ + Save the trained model and any associated preprocessing components to the given directory. + + Saves: + - model.pkl: the trained sklearn model + - hyperparameters.json: dictionary of model hyperparameters (if present) + - scaler.pkl: fitted gene expression scaler (if present) + - proteomics_transformer.pkl: fitted proteomics transformer (if present) + + :param directory: path to the directory where model files will be stored + """ + os.makedirs(directory, exist_ok=True) + joblib.dump(self.model, os.path.join(directory, "model.pkl")) + with open(os.path.join(directory, "hyperparameters.json"), "w") as f: + json.dump(getattr(self, "hyperparameters", {}), f) + if self.gene_expression_scaler is not None: + joblib.dump(self.gene_expression_scaler, os.path.join(directory, "scaler.pkl")) + if self.proteomics_transformer is not None: + joblib.dump(self.proteomics_transformer, os.path.join(directory, "proteomics_transformer.pkl")) + + @classmethod + def load(cls, directory: str) -> "SklearnModel": + """ + Load a trained sklearn-based model and its preprocessing components from disk. + + Loads: + - model.pkl: the trained sklearn model + - hyperparameters.json: model hyperparameters (optional) + - scaler.pkl: gene expression scaler (optional) + - proteomics_transformer.pkl: proteomics transformer (optional) + + :param directory: path to the directory where model files are stored + :return: an instance of the model with restored state + :raises FileNotFoundError: if model.pkl is missing + """ + model_path = os.path.join(directory, "model.pkl") + if not os.path.exists(model_path): + raise FileNotFoundError(f"{model_path} not found") + + instance = cls() + + hyperparams_path = os.path.join(directory, "hyperparameters.json") + with open(hyperparams_path) as f: + hyperparameters = json.load(f) + instance.build_model(hyperparameters) + instance.model = joblib.load(model_path) + + scaler_path = os.path.join(directory, "scaler.pkl") + if os.path.exists(scaler_path): + instance.gene_expression_scaler = joblib.load(scaler_path) + + transformer_path = os.path.join(directory, "proteomics_transformer.pkl") + if os.path.exists(transformer_path): + instance.proteomics_transformer = joblib.load(transformer_path) + + return instance + class ElasticNetModel(SklearnModel): """ElasticNet model for drug response prediction.""" @@ -182,6 +245,7 @@ def build_model(self, hyperparameters: dict): alpha=hyperparameters["alpha"], l1_ratio=hyperparameters["l1_ratio"], ) + self.hyperparameters = hyperparameters class RandomForest(SklearnModel): @@ -211,6 +275,7 @@ def build_model(self, hyperparameters: dict): max_samples=hyperparameters["max_samples"], n_jobs=hyperparameters["n_jobs"], ) + self.hyperparameters = hyperparameters class SVMRegressor(SklearnModel): @@ -237,6 +302,7 @@ def build_model(self, hyperparameters: dict): epsilon=hyperparameters["epsilon"], max_iter=hyperparameters["max_iter"], ) + self.hyperparameters = hyperparameters class GradientBoosting(SklearnModel): @@ -265,6 +331,7 @@ def build_model(self, hyperparameters: dict): learning_rate=hyperparameters.get("learning_rate", 0.1), max_depth=hyperparameters.get("max_depth", 3), ) + self.hyperparameters = hyperparameters class ProteomicsRandomForest(RandomForest): @@ -436,8 +503,7 @@ def build_model(self, hyperparameters: dict): """ Builds the model from hyperparameters. - :param hyperparameters: Hyperparameters for the model. Contains n_estimators, criterion, max_samples, - and n_jobs. + :param hyperparameters: Hyperparameters for the model. """ super().build_model(hyperparameters) self.feature_threshold = hyperparameters.get("feature_threshold", 0.7) diff --git a/drevalpy/models/drp_model.py b/drevalpy/models/drp_model.py index 968bc821..7599be2e 100644 --- a/drevalpy/models/drp_model.py +++ b/drevalpy/models/drp_model.py @@ -9,13 +9,16 @@ import inspect import os from abc import ABC, abstractmethod +from contextlib import suppress from typing import Any import numpy as np +import wandb import yaml from sklearn.model_selection import ParameterGrid from ..datasets.dataset import DrugResponseDataset, FeatureDataset +from ..evaluation import AVAILABLE_METRICS, evaluate from ..pipeline_function import pipeline_function @@ -33,6 +36,220 @@ class DRPModel(ABC): # Then, the model is trained per drug is_single_drug_model = False + def __init__(self): + """Initialize the DRPModel instance.""" + self.wandb_project: str | None = None + self.wandb_run: Any = None + self.wandb_config: dict[str, Any] | None = None + self.hyperparameters: dict[str, Any] = {} + self._in_hyperparameter_tuning: bool = False # Flag to track if we're in hyperparameter tuning + + def init_wandb( + self, + project: str, + config: dict[str, Any] | None = None, + name: str | None = None, + tags: list[str] | None = None, + finish_previous: bool = True, + ) -> None: + """ + Initialize wandb logging for this model instance. + + :param project: wandb project name + :param config: dictionary of configuration to log (e.g., hyperparameters, dataset info) + :param name: run name (defaults to model name) + :param tags: list of tags for the run + :param finish_previous: whether to finish any existing wandb run before starting a new one + """ + self.wandb_project = project + self.wandb_config = config or {} + + if finish_previous: + wandb.finish() + + run_name = name or self.get_model_name() + wandb.init( + project=project, + config=self.wandb_config, + name=run_name, + tags=tags, + ) + self.wandb_run = wandb.run + + # Define common metric summaries so final/best values are tracked automatically + with suppress(Exception): # pragma: no cover - wandb may not support define_metric in all contexts + wandb.define_metric("epoch", summary="max") + wandb.define_metric("train_loss", summary="min") + wandb.define_metric("val_loss", summary="min") + wandb.define_metric("train_R^2", summary="max") + wandb.define_metric("val_R^2", summary="max") + wandb.define_metric("train_Pearson", summary="max") + wandb.define_metric("val_Pearson", summary="max") + + def log_hyperparameters(self, hyperparameters: dict[str, Any]) -> None: + """ + Log hyperparameters to wandb. + + This method is called automatically by build_model when wandb is enabled. + Subclasses can override this to add additional hyperparameter logging. + + During hyperparameter tuning, config updates are skipped to avoid overwriting. + Only the final best hyperparameters are logged to wandb.config. + + :param hyperparameters: dictionary of hyperparameters to log + """ + if not self.is_wandb_enabled(): + return + + self.hyperparameters = hyperparameters + # Only update wandb.config if we're not in hyperparameter tuning phase + # During tuning, trial hyperparameters are stored in config.hyperparameters + # Nest hyperparameters under a single key to prevent them from appearing as separate table columns + if not self._in_hyperparameter_tuning: + wandb.config.update({"hyperparameters": hyperparameters}) + + def is_wandb_enabled(self) -> bool: + """ + Check if wandb logging is enabled for this model instance. + + :returns: True if wandb is initialized and active, False otherwise + """ + # Check both self.wandb_run and wandb.run to handle cases where + # PyTorch Lightning's WandbLogger might have affected the run state + return self.wandb_project is not None and (self.wandb_run is not None or wandb.run is not None) + + def get_wandb_logger(self) -> Any | None: + """ + Get a WandbLogger for PyTorch Lightning integration. + + This method creates a WandbLogger that uses the existing wandb run. + Returns None if wandb is not enabled. + + :returns: WandbLogger instance or None + """ + if not self.is_wandb_enabled() or self.wandb_project is None: + return None + + from pytorch_lightning.loggers import WandbLogger + + return WandbLogger(project=self.wandb_project, log_model=False) + + def log_metrics(self, metrics: dict[str, float], step: int | None = None) -> None: + """ + Log metrics to wandb. + + Subclasses can call this method to log custom metrics during training. + + :param metrics: dictionary of metric names to values + :param step: optional step number for the metrics + """ + if not self.is_wandb_enabled(): + return + + if step is not None: + wandb.log(metrics, step=step) + else: + wandb.log(metrics) + + def compute_performance_metrics( + self, predictions: np.ndarray, targets: np.ndarray, prefix: str = "" + ) -> dict[str, float]: + """ + Compute R^2 and PCC metrics from predictions and targets. + + This is a convenience method for computing performance metrics consistently + across all models. It always computes R^2 and PCC in addition to any other + metrics that may be needed. + + :param predictions: model predictions array + :param targets: ground truth targets array + :param prefix: optional prefix for metric keys (e.g., ``val_``, ``train_``) + :returns: dictionary of computed metrics with optional prefix + """ + try: + # Always compute R^2 and PCC + metrics = { + "R^2": AVAILABLE_METRICS["R^2"](y_pred=predictions, y_true=targets), + "Pearson": AVAILABLE_METRICS["Pearson"](y_pred=predictions, y_true=targets), + } + + # Add prefix if provided + if prefix: + metrics = {f"{prefix}{k}": v for k, v in metrics.items()} + + return metrics + except Exception: + # Return empty dict if computation fails + return {} + + def compute_and_log_final_metrics( + self, + dataset: DrugResponseDataset, + additional_metrics: list[str] | None = None, + prefix: str = "val_", + ) -> dict[str, float]: + r""" + Compute final performance metrics from a dataset and log them to wandb. + + This method computes R^2 and PCC (always), plus any additional metrics specified. + The metrics are both logged to wandb history and stored in the run summary. + + :param dataset: DrugResponseDataset with predictions and response + :param additional_metrics: optional list of additional metrics to compute (e.g., ["RMSE", "MAE"]) + :param prefix: metric name prefix indicating which split the metrics belong to + (for example, use ``"val"`` for validation and ``"test"`` for test metrics) + :returns: dictionary of computed metrics + """ + if dataset.predictions is None: + return {} + + # Always compute R^2 and PCC + metrics_to_compute = ["R^2", "Pearson"] + if additional_metrics: + metrics_to_compute.extend(additional_metrics) + + results = evaluate(dataset, metric=metrics_to_compute) + + # Log to wandb if enabled + # Check both is_wandb_enabled() and wandb.run to ensure the run is active + if self.is_wandb_enabled() and wandb.run is not None: + # Prefix indicates which split the metrics belong to (e.g. \"val\" or \"test\") + wandb_metrics = {f"{prefix}{k}": v for k, v in results.items()} + # Log to summary only (not history) since these are final metrics logged once + self.log_final_metrics(wandb_metrics) + + return results + + def log_final_metrics(self, metrics: dict[str, float]) -> None: + """ + Store final metrics in the wandb run summary. + + This method is used to record final metrics (e.g., after validation + or after a hyperparameter trial). Metrics are stored with their original + names (e.g., val_RMSE, test_RMSE) without additional prefixes. + + :param metrics: dictionary of metric names to values + """ + if not self.is_wandb_enabled(): + return + + # Ensure wandb.run is active before logging + if wandb.run is None: + return + + for key, value in metrics.items(): + # Store metrics directly without adding "final_" prefix + # The prefix (val_ or test_) already indicates the split + wandb.run.summary[key] = value + + def finish_wandb(self) -> None: + """Finish the wandb run. Call this when training is complete.""" + if not self.is_wandb_enabled(): + return + + wandb.finish() + self.wandb_run = None + @classmethod @abstractmethod @pipeline_function @@ -97,13 +314,19 @@ def build_model(self, hyperparameters: dict[str, Any]) -> None: """ Builds the model, for models that use hyperparameters. + Subclasses should call self.log_hyperparameters(hyperparameters) at the beginning + of this method to ensure hyperparameters are logged to wandb if enabled. + :param hyperparameters: hyperparameters for the model Example:: - self.model = ElasticNet(alpha=hyperparameters["alpha"], l1_ratio=hyperparameters["l1_ratio"]) + def build_model(self, hyperparameters: dict[str, Any]) -> None: + self.log_hyperparameters(hyperparameters) # Log to wandb + self.model = ElasticNet(alpha=hyperparameters["alpha"], l1_ratio=hyperparameters["l1_ratio"]) """ + @pipeline_function @abstractmethod def train( self, @@ -142,6 +365,7 @@ def predict( :returns: predicted response """ + @pipeline_function @abstractmethod def load_cell_line_features(self, data_path: str, dataset_name: str) -> FeatureDataset: """ @@ -155,6 +379,7 @@ def load_cell_line_features(self, data_path: str, dataset_name: str) -> FeatureD :returns: FeatureDataset with the cell line features """ + @pipeline_function @abstractmethod def load_drug_features(self, data_path: str, dataset_name: str) -> FeatureDataset | None: """ @@ -170,6 +395,37 @@ def load_drug_features(self, data_path: str, dataset_name: str) -> FeatureDatase :returns: FeatureDataset or None """ + @pipeline_function + def save(self, directory: str) -> None: + """ + Save the model, including trainable parameters, hyperparameters, scalars, encoders. + + This method should serialize all necessary components to allow + full reconstruction of the model later via the `load` method. + + Only needs to be implemented for the DrEval evaluation framework, if a final production model should be saved. + + :param directory: Target directory where the model and metadata should be saved + :raises NotImplementedError: if the method is not implemented by the subclass + """ + raise NotImplementedError(f"{self.get_model_name()} does not implement model saving.") + + @classmethod + def load(cls, directory: str) -> "DRPModel": + """ + Load a model, including trainable parameters, hyperparameters, scalars, encoders. + + This method should fully reconstruct an instance of the model using + the files in the specified directory. + + Only needs to be implemented for the DrEval evaluation framework, if a final production model should be saved. + + + :param directory: Source directory containing the saved model files + :raises NotImplementedError: if the method is not implemented by the subclass + """ + raise NotImplementedError(f"{cls.get_model_name()} does not implement model loading.") + def get_concatenated_features( self, cell_line_view: str | None, diff --git a/drevalpy/models/lightning_metrics_mixin.py b/drevalpy/models/lightning_metrics_mixin.py new file mode 100644 index 00000000..6139de75 --- /dev/null +++ b/drevalpy/models/lightning_metrics_mixin.py @@ -0,0 +1,112 @@ +"""Mixin class for PyTorch Lightning modules to add R^2 and PCC metrics logging.""" + +import torch + +from ..evaluation import AVAILABLE_METRICS + + +class RegressionMetricsMixin: + """ + Mixin class for PyTorch Lightning modules to automatically compute and log R^2 and PCC metrics. + + This mixin provides: + - Storage for predictions and targets during training/validation steps + - Automatic computation of R^2 and PCC at epoch end + - Consistent logging to wandb via PyTorch Lightning's logging system + + Usage: + class MyModel(RegressionMetricsMixin, pl.LightningModule): + def __init__(self, ...): + super().__init__() + # Initialize your model... + self._init_metrics_storage() # Call this in __init__ + + def training_step(self, batch, batch_idx): + # ... your training logic ... + predictions = self.forward(...) + loss = self.criterion(predictions, targets) + self.log("train_loss", loss, ...) + self._store_predictions(predictions, targets, is_training=True) + return loss + + def validation_step(self, batch, batch_idx): + # ... your validation logic ... + predictions = self.forward(...) + loss = self.criterion(predictions, targets) + self.log("val_loss", loss, ...) + self._store_predictions(predictions, targets, is_training=False) + return loss + """ + + def _init_metrics_storage(self) -> None: + """Initialize storage for predictions and targets.""" + self.train_predictions: list[torch.Tensor] = [] + self.train_targets: list[torch.Tensor] = [] + self.val_predictions: list[torch.Tensor] = [] + self.val_targets: list[torch.Tensor] = [] + + def _store_predictions(self, predictions: torch.Tensor, targets: torch.Tensor, is_training: bool = True) -> None: + """ + Store predictions and targets for epoch-end metric computation. + + :param predictions: model predictions tensor + :param targets: ground truth targets tensor + :param is_training: whether this is from training (True) or validation (False) + """ + # Ensure tensors are detached and on CPU for numpy conversion + preds_cpu = predictions.detach().cpu() + targets_cpu = targets.detach().cpu() + + if is_training: + self.train_predictions.append(preds_cpu) + self.train_targets.append(targets_cpu) + else: + self.val_predictions.append(preds_cpu) + self.val_targets.append(targets_cpu) + + def _compute_epoch_metrics(self, predictions: list[torch.Tensor], targets: list[torch.Tensor]) -> dict[str, float]: + """ + Compute R^2 and PCC metrics from stored predictions and targets. + + :param predictions: list of prediction tensors from the epoch + :param targets: list of target tensors from the epoch + :returns: dictionary with "R^2" and "Pearson" keys, or empty dict if computation fails + """ + if len(predictions) == 0: + return {} + + try: + # Concatenate all predictions and targets from the epoch + all_preds = torch.cat(predictions).numpy() + all_targets = torch.cat(targets).numpy() + + # Compute metrics + r2 = AVAILABLE_METRICS["R^2"](y_pred=all_preds, y_true=all_targets) + pcc = AVAILABLE_METRICS["Pearson"](y_pred=all_preds, y_true=all_targets) + + return {"R^2": r2, "Pearson": pcc} + except Exception: + # If computation fails (e.g., NaN values, insufficient data), return empty dict + return {} + + def on_train_epoch_end(self) -> None: + """ + Epoch-end hook for training. + + Intentionally does NOT log R^2/Pearson per epoch anymore. We only keep + these buffers to allow optional debugging or future extensions. + """ + # Clear stored predictions/targets for next epoch + self.train_predictions.clear() + self.train_targets.clear() + + def on_validation_epoch_end(self) -> None: + """ + Epoch-end hook for validation. + + Intentionally does NOT log R^2/Pearson per epoch anymore. Final metrics + are logged once at the end via DRPModel.compute_and_log_final_metrics(). + """ + # Clear stored predictions/targets for next epoch + self.val_predictions.clear() + self.val_targets.clear() diff --git a/drevalpy/models/utils.py b/drevalpy/models/utils.py index c7e8c4d1..d2ea9d61 100644 --- a/drevalpy/models/utils.py +++ b/drevalpy/models/utils.py @@ -19,7 +19,8 @@ def load_cl_ids_from_csv(path: str, dataset_name: str) -> FeatureDataset: :param dataset_name: name of the dataset, e.g., GDSC2 :returns: FeatureDataset with the cell line ids """ - cl_names = pd.read_csv(f"{path}/{dataset_name}/cell_line_names.csv", index_col=1) + cl_names = pd.read_csv(f"{path}/{dataset_name}/cell_line_names.csv", index_col=CELL_LINE_IDENTIFIER) + cl_names.index = cl_names.index.astype(str) return FeatureDataset(features={cl: {CELL_LINE_IDENTIFIER: np.array([cl])} for cl in cl_names.index}) @@ -31,9 +32,11 @@ def load_tissues_from_csv(path: str, dataset_name: str) -> FeatureDataset: :param dataset_name: name of the dataset, e.g., GDSC2 :returns: FeatureDataset with the tissues """ - tissues = pd.read_csv(f"{path}/{dataset_name}/cell_line_names.csv", index_col=1).drop_duplicates() + tissues = pd.read_csv( + f"{path}/{dataset_name}/cell_line_names.csv", index_col=CELL_LINE_IDENTIFIER + ).drop_duplicates() return FeatureDataset( - features={cl: {TISSUE_IDENTIFIER: np.array([tissues.loc[cl, "tissue"]])} for cl in tissues.index} + features={cl: {TISSUE_IDENTIFIER: np.array([tissues.loc[cl, TISSUE_IDENTIFIER]])} for cl in tissues.index} ) @@ -55,19 +58,20 @@ def load_and_select_gene_features( :returns: FeatureDataset with the reduced features :raises ValueError: if genes from gene_list are missing in the dataset """ - ge = pd.read_csv(f"{data_path}/{dataset_name}/{feature_type}.csv", index_col=1) - ge = ge.drop(columns=["cellosaurus_id"]) + ge = pd.read_csv(f"{data_path}/{dataset_name}/{feature_type}.csv", index_col=CELL_LINE_IDENTIFIER) + ge.index = ge.index.astype(str) + if "cellosaurus_id" in ge.columns: + ge = ge.drop(columns=["cellosaurus_id"]) cl_features = FeatureDataset( features=iterate_features(df=ge, feature_type=feature_type), meta_info={feature_type: ge.columns.values}, ) - if gene_list is None: return cl_features gene_info = pd.read_csv( - f"{data_path}/{dataset_name}/gene_lists/{gene_list}.csv", + f"{data_path}/meta/gene_lists/{gene_list}.csv", sep=",", ) ordered_genes = gene_info["Symbol"].tolist() @@ -124,7 +128,12 @@ def load_drug_ids_from_csv(data_path: str, dataset_name: str) -> FeatureDataset: :param dataset_name: name of the dataset, e.g., GDSC2 :returns: FeatureDataset with the drug ids """ - drug_names = pd.read_csv(f"{data_path}/{dataset_name}/drug_names.csv", index_col=0) + drug_names = pd.read_csv( + f"{data_path}/{dataset_name}/drug_names.csv", + index_col=DRUG_IDENTIFIER, + dtype={"pubchem_id": str}, + low_memory=False, + ) drug_names.index = drug_names.index.astype(str) return FeatureDataset(features={drug: {DRUG_IDENTIFIER: np.array([drug])} for drug in drug_names.index}) @@ -170,7 +179,7 @@ def get_multiomics_feature_dataset( :param data_path: path to the data, e.g., data/ :param dataset_name: name of the dataset, e.g., GDSC2 :param gene_lists: dictionary of names of lists of genes to include, for each omics type, - e.g., {"gene_expression": "landmark_genes"}, if None, all features are not reduced + e.g., {"gene_expression": "landmark_genes_reduced"}, if None, all features are not reduced :param omics: list of omics to include, e.g., ["gene_expression", "methylation"] :returns: FeatureDataset with the multiomics features :raises ValueError: if no omics features are found diff --git a/drevalpy/utils.py b/drevalpy/utils.py index 0a86a5a5..46e3d9d8 100644 --- a/drevalpy/utils.py +++ b/drevalpy/utils.py @@ -15,7 +15,6 @@ from .models import MODEL_FACTORY -@pipeline_function def get_parser() -> argparse.ArgumentParser: """ Get the parser for the evaluation pipeline. @@ -122,10 +121,13 @@ def get_parser() -> argparse.ArgumentParser: ) parser.add_argument( - "--curve_curator", + "--no_refitting", action="store_true", - default=True, - help="Whether to run " "CurveCurator " "to sort out " "non-reactive " "curves", + default=False, + help=( + "Whether to run CurveCurator to sort out non-reactive curves. " + "By default, curve curator is applied and curve-curated metrics are used." + ), ) parser.add_argument( @@ -135,6 +137,13 @@ def get_parser() -> argparse.ArgumentParser: help="Max. number of cores used to fit curves with CurveCurator following min(cores, #curves to fit).", ) + parser.add_argument( + "--curve_curator_normalize", + action="store_true", + default=False, + help="Whether to normalize the response values to [0, 1] for CurveCurator. Default is False.", + ) + parser.add_argument( "--measure", type=str, @@ -154,6 +163,14 @@ def get_parser() -> argparse.ArgumentParser: default="RMSE", help=f"Metric for hyperparameter tuning choose from {list(AVAILABLE_METRICS.keys())} " f"Default is RMSE.", ) + parser.add_argument( + "--wandb_project", + type=str, + default=None, + help=( + "Optional Weights & Biases project name. " "If provided, enables wandb logging for all DRPModel instances." + ), + ) parser.add_argument( "--n_cv_splits", type=int, @@ -181,11 +198,22 @@ def get_parser() -> argparse.ArgumentParser: default="TEMPORARY", help="Directory to save model checkpoints", ) + parser.add_argument( + "--final_model_on_full_data", + action="store_true", + default=False, + help="If True, saves a final model, trained/tuned on the union of all folds after CV", + ) + parser.add_argument( + "--no_hyperparameter_tuning", + action="store_true", + default=False, + help="Disable hyperparameter tuning and use first hyperparameter set.", + ) return parser -@pipeline_function def check_arguments(args) -> None: """ Check the validity of the arguments for the evaluation pipeline. @@ -214,7 +242,7 @@ def check_arguments(args) -> None: f"the MODEL_FACTORY in the models init" ) if args.dataset_name not in AVAILABLE_DATASETS: - if args.curve_curator: + if not args.no_refitting: expected_custom_input = Path(args.path_data).absolute() / args.dataset_name / f"{args.dataset_name}_raw.csv" if not expected_custom_input.is_file(): raise FileNotFoundError( @@ -233,7 +261,7 @@ def check_arguments(args) -> None: "located at //.csv." ) - if args.curve_curator and args.curve_curator_cores < 1: + if (not args.no_refitting) and args.curve_curator_cores < 1: raise ValueError("Number of cores for CurveCurator must be greater than 0.") for dataset in args.cross_study_datasets: @@ -255,7 +283,7 @@ def check_arguments(args) -> None: if args.randomization_mode[0] != "None": if not all(randomization in ["SVCC", "SVRC", "SVCD", "SVRD"] for randomization in args.randomization_mode): raise AssertionError( - "At least one invalid randomization mode. Available randomization modes are SVCC, " "SVRC, SVSC, SVRD" + "At least one invalid randomization mode. Available randomization modes are SVCC, SVRC, SVCD, SVRD." ) if args.randomization_type not in ["permutation", "invariant"]: @@ -279,22 +307,21 @@ def check_arguments(args) -> None: ) -def main(args, hyperparameter_tuning=True) -> None: +def main(args) -> None: """ Main function to run the drug response evaluation pipeline. :param args: passed from command line - :param hyperparameter_tuning: whether to run the pipeline in debug mode """ check_arguments(args) - # PIPELINE: LOAD_RESPONSE response_data, cross_study_datasets = get_datasets( dataset_name=args.dataset_name, cross_study_datasets=args.cross_study_datasets, path_data=args.path_data, measure=args.measure, - curve_curator=args.curve_curator, + curve_curator=(not args.no_refitting), cores=args.curve_curator_cores, + normalize=getattr(args, "curve_curator_normalize", False), ) models = [MODEL_FACTORY[model] for model in args.models] @@ -304,12 +331,6 @@ def main(args, hyperparameter_tuning=True) -> None: else: baselines = [] - # NaiveMeanEffectsPredictor is always run as it is needed for evaluation - if "NaiveMeanEffectsPredictor" not in baselines: - baselines.append(MODEL_FACTORY["NaiveMeanEffectsPredictor"]) - - # TODO Allow for custom randomization tests maybe via config file - if args.randomization_mode[0] == "None": args.randomization_mode = None response_transformation = get_response_transformation(args.response_transformation) @@ -320,7 +341,7 @@ def main(args, hyperparameter_tuning=True) -> None: baselines=baselines, response_data=response_data, response_transformation=response_transformation, - metric=args.optim_metric, + hpam_optimization_metric=args.optim_metric, n_cv_splits=args.n_cv_splits, multiprocessing=args.multiprocessing, test_mode=test_mode, @@ -333,7 +354,9 @@ def main(args, hyperparameter_tuning=True) -> None: overwrite=args.overwrite, path_data=args.path_data, model_checkpoint_dir=args.model_checkpoint_dir, - hyperparameter_tuning=hyperparameter_tuning, + hyperparameter_tuning=not args.no_hyperparameter_tuning, + final_model_on_full_data=args.final_model_on_full_data, + wandb_project=args.wandb_project, ) @@ -344,6 +367,7 @@ def get_datasets( measure: str = "response", curve_curator: bool = False, cores: int = 1, + normalize: bool = False, ) -> tuple[DrugResponseDataset, list[DrugResponseDataset] | None]: """ Load the response data and cross-study datasets. @@ -366,11 +390,17 @@ def get_datasets( which is expected to exist at //_raw.csv. The fitted dataset will be stored in the same folder, in a file called .csv :param cores: Number of cores to use for CurveCurator fitting. Only used when curve_curator is True, default = 1 + :param normalize: Whether to normalize the response values to [0, 1] for curvecurator. Default = False. + Only used for custom datasets when curve_curator is True. :returns: response data and, potentially, cross-study datasets """ - # PIPELINE: LOAD_RESPONSE response_data = load_dataset( - dataset_name=dataset_name, path_data=path_data, measure=measure, curve_curator=curve_curator, cores=cores + dataset_name=dataset_name, + path_data=path_data, + measure=measure, + curve_curator=curve_curator, + cores=cores, + normalize=normalize, ) cross_study_datasets = [ @@ -380,7 +410,7 @@ def get_datasets( @pipeline_function -def get_response_transformation(response_transformation: str) -> TransformerMixin | None: +def get_response_transformation(response_transformation: str | None) -> TransformerMixin | None: """ Get the skelarn response transformation object of choice. @@ -389,7 +419,7 @@ def get_response_transformation(response_transformation: str) -> TransformerMixi :returns: response transformation object :raises ValueError: if the response transformation is not recognized """ - if response_transformation == "None": + if (response_transformation == "None") or (response_transformation is None): return None if response_transformation == "standard": return StandardScaler() diff --git a/drevalpy/visualization/comp_scatter.py b/drevalpy/visualization/comp_scatter.py index 468db26c..33118c1f 100644 --- a/drevalpy/visualization/comp_scatter.py +++ b/drevalpy/visualization/comp_scatter.py @@ -6,7 +6,6 @@ import plotly.graph_objects as go from ..models import SINGLE_DRUG_MODEL_FACTORY -from ..pipeline_function import pipeline_function from .outplot import OutPlot @@ -21,7 +20,6 @@ class ComparisonScatter(OutPlot): The overall plot facets all models and visualizes the density of the points. """ - @pipeline_function def __init__( self, df: pd.DataFrame, @@ -77,7 +75,6 @@ def __init__( self.dropdown_buttons_x: list[dict] = list() self.dropdown_buttons_y: list[dict] = list() - @pipeline_function def draw_and_save(self, out_prefix: str, out_suffix: str) -> None: """ Draws and saves the scatter plots. @@ -138,7 +135,7 @@ def write_to_html(test_mode: str, f: TextIOWrapper, *args, **kwargs) -> TextIOWr :param test_mode: test_mode, e.g., LCO :param f: file to write to :param args: unused - :param kwargs: used to get all files generated by create_report.py / the pipeline + :param kwargs: used to get all files generated by create_report / the pipeline :returns: the file f """ files: list[str] = kwargs.get("files", []) diff --git a/drevalpy/visualization/create_leaderboard.py b/drevalpy/visualization/create_leaderboard.py new file mode 100644 index 00000000..4a0de6da --- /dev/null +++ b/drevalpy/visualization/create_leaderboard.py @@ -0,0 +1,478 @@ +#!/usr/bin/env python3 +""" +DrEvalPy Leaderboard Visualization. + +This script generates a leaderboard visualization (normalized PCC and RMSE) from +the evaluation results CSV file produced by the DrEvalPy evaluation pipeline. +Usage: +python create_leaderboard.py --results_path /path/to/results.csv +""" + +import argparse +from pathlib import Path +from typing import Optional + +import matplotlib.patches as mpatches +import matplotlib.pyplot as plt +import numpy as np +import pandas as pd +from matplotlib.patches import FancyBboxPatch + +# --- Theme Definitions --- +DARK_THEME = { + "background": "#0d1117", + "surface": "#2d2d2d", + "text": "#ece7e4", + "text_secondary": "#a0a0a0", + "grid": "#30363d", +} + +LIGHT_THEME = { + "background": "#ffffff", + "surface": "#f6f8fa", + "text": "#1f2328", + "text_secondary": "#57606a", + "grid": "#d0d7de", +} + +COLORS = DARK_THEME + +COMPETITOR_COLOR = "#6A5ACD" + + +def configure_matplotlib(font_adder: int = 0): + """ + Configure global matplotlib parameters for the current theme. + + :param font_adder: Increment to add to the base font size. + """ + plt.rcParams.update( + { + "figure.facecolor": COLORS["background"], + "axes.facecolor": COLORS["background"], + "axes.edgecolor": COLORS["grid"], + "axes.labelcolor": COLORS["text"], + "text.color": COLORS["text"], + "xtick.color": COLORS["text"], + "ytick.color": COLORS["text"], + "grid.color": COLORS["grid"], + "font.family": "sans-serif", + "font.size": 11 + font_adder, + "axes.spines.top": False, + "axes.spines.right": False, + } + ) + + +def load_results(results_path: str, test_mode: str = "LCO") -> pd.DataFrame: + """ + Load and aggregate results from the evaluation CSV. + + :param results_path: Path to evaluation_results.csv. + :param test_mode: Filtering mode (e.g., LCO). + :raises FileNotFoundError: If path does not exist. + :raises ValueError: If no data matches criteria. + :return: Processed DataFrame. + """ + path = Path(results_path) + if not path.exists(): + raise FileNotFoundError(f"Results file not found: {results_path}") + + df = pd.read_csv(path, index_col=0) + df = df[(df["rand_setting"] == "predictions") & (df["test_mode"] == test_mode)] + + if df.empty: + raise ValueError(f"No results found for rand_setting='predictions' and test_mode='{test_mode}'") + + df_agg = ( + df.groupby("algorithm") + .agg( + { + "Pearson: normalized": ["mean", "std"], + "RMSE": ["mean", "std"], + } + ) + .reset_index() + ) + + df_agg.columns = ["algorithm", "PCC", "PCC_std", "RMSE", "RMSE_std"] + df_agg["PCC_std"] = df_agg["PCC_std"].fillna(0) + df_agg["RMSE_std"] = df_agg["RMSE_std"].fillna(0) + df_agg["is_baseline"] = df_agg["algorithm"].str.startswith("Naive") + + return df_agg.sort_values("PCC", ascending=False).reset_index(drop=True) + + +def get_bar_color(rank: int, is_baseline: bool) -> dict: + """ + Assign colors based on model rank and type. + + :param rank: Model index in sorted list. + :param is_baseline: Boolean if model is a baseline. + :return: Styling dictionary. + """ + if is_baseline: + return {"color": "#5a5a5a", "alpha": 1.0} + + medal_gold = "#F4D03F" + medal_silver = "#BDC3C7" + medal_bronze = "#E67E22" + + if rank == 0: + return {"color": medal_gold, "alpha": 1.0} + elif rank == 1: + return {"color": medal_silver, "alpha": 1.0} + elif rank == 2: + return {"color": medal_bronze, "alpha": 1.0} + + return {"color": COMPETITOR_COLOR, "alpha": 0.85} + + +def draw_bar(ax, x: float, y: float, width: float, height: float, color: str, alpha: float = 1.0): + """ + Draw a custom rounded rectangle bar. + + :param ax: Matplotlib axis. + :param x: Origin X. + :param y: Origin Y. + :param width: Bar width. + :param height: Bar height. + :param color: Hex color. + :param alpha: Transparency. + :return: Patch artist. + """ + bar = FancyBboxPatch( + (x, y - height / 2), + width, + height, + boxstyle="round,pad=0.01,rounding_size=0.015", + facecolor=color, + alpha=alpha, + edgecolor="none", + zorder=3, + ) + ax.add_patch(bar) + return bar + + +def create_leaderboard( + df: pd.DataFrame, + output_path: str, + test_mode: str = "LCO", + dataset: str = "CTRPv2", + measure: str = "LN_IC50_curvecurator", + figsize: tuple = (16, 12), + show_top_n: Optional[int] = None, + font_adder: int = 6, +) -> tuple: + """ + Generate the dual-panel leaderboard figure. + + :param df: Input results data. + :param output_path: File path for save. + :param test_mode: Evaluation mode name. + :param dataset: Dataset name. + :param measure: Performance measure. + :param figsize: Figure dimensions. + :param show_top_n: Limit displayed models. + :param font_adder: Scale for text. + :return: Figure and axes tuple. + """ + configure_matplotlib(font_adder=font_adder) + + if show_top_n: + df = df.head(show_top_n) + + n_models = len(df) + y_positions = np.arange(n_models - 1, -1, -1) + bar_height = 0.65 + + fig, (ax1, ax2) = plt.subplots(1, 2, figsize=figsize, facecolor=COLORS["background"]) + fig.subplots_adjust(wspace=0.4) + + ax1.set_facecolor(COLORS["background"]) + df_pcc = df.sort_values("PCC", ascending=False).reset_index(drop=True) + max_pcc = (df_pcc["PCC"] + df_pcc["PCC_std"]).max() * 1.18 + + for i, (_, row) in enumerate(df_pcc.iterrows()): + style = get_bar_color(i, row["is_baseline"]) + draw_bar(ax1, 0, y_positions[i], row["PCC"], bar_height, style["color"], style["alpha"]) + + label_color = style["color"] if not row["is_baseline"] else COLORS["text_secondary"] + label_x = row["PCC"] + max_pcc * 0.02 + ax1.text( + label_x, + y_positions[i], + f"{row['PCC']:.3f}", + va="center", + ha="left", + fontsize=9 + font_adder, + fontweight="bold", + color=label_color, + zorder=5, + ) + + if i < 3 and not row["is_baseline"]: + medals = ["①", "②", "③"] + ax1.text( + -max_pcc * 0.03, + y_positions[i], + medals[i], + va="center", + ha="center", + fontsize=14 + font_adder, + fontweight="bold", + color=style["color"], + zorder=5, + ) + + ax1.set_xlim(-max_pcc * 0.06, max_pcc) + ax1.set_ylim(-0.8, n_models - 0.2) + ax1.set_yticks(y_positions) + ax1.set_yticklabels(df_pcc["algorithm"].values, fontsize=10 + font_adder) + + for i, label in enumerate(ax1.get_yticklabels()): + if i < 3 and not df_pcc.iloc[i]["is_baseline"]: + label.set_fontweight("bold") + label.set_color(get_bar_color(i, False)["color"]) + elif df_pcc.iloc[i]["is_baseline"]: + label.set_style("italic") + label.set_color(COLORS["text_secondary"]) + else: + label.set_color(COLORS["text"]) + + ax1.set_xlabel("Normalized PCC", fontsize=12 + font_adder, fontweight="bold", labelpad=10) + ax1.xaxis.grid(True, linestyle="--", alpha=0.3, color=COLORS["grid"]) + ax1.set_axisbelow(True) + ax1.tick_params(axis="x", colors=COLORS["text_secondary"]) + ax1.set_title( + "Normalized Pearson ↑ higher is better", + fontsize=14 + font_adder, + fontweight="bold", + color="#29ABCA", + pad=15, + ) + + ax2.set_facecolor(COLORS["background"]) + df_rmse = df.sort_values("RMSE", ascending=True).reset_index(drop=True) + max_rmse = (df_rmse["RMSE"] + df_rmse["RMSE_std"]).max() * 1.18 + + for i, (_, row) in enumerate(df_rmse.iterrows()): + style = get_bar_color(i, row["is_baseline"]) + draw_bar(ax2, 0, y_positions[i], row["RMSE"], bar_height, style["color"], style["alpha"]) + + label_color = style["color"] if not row["is_baseline"] else COLORS["text_secondary"] + label_x = row["RMSE"] + max_rmse * 0.02 + ax2.text( + label_x, + y_positions[i], + f"{row['RMSE']:.3f}", + va="center", + ha="left", + fontsize=9 + font_adder, + fontweight="bold", + color=label_color, + zorder=5, + ) + + if i < 3 and not row["is_baseline"]: + medals = ["①", "②", "③"] + ax2.text( + -max_rmse * 0.03, + y_positions[i], + medals[i], + va="center", + ha="center", + fontsize=14 + font_adder, + fontweight="bold", + color=style["color"], + zorder=5, + ) + + ax2.set_xlim(-max_rmse * 0.06, max_rmse) + ax2.set_ylim(-0.8, n_models - 0.2) + ax2.set_yticks(y_positions) + ax2.set_yticklabels(df_rmse["algorithm"].values, fontsize=10 + font_adder) + ax2.set_xlabel("Root Mean Square Error", fontsize=12 + font_adder, fontweight="bold", labelpad=10) + + for i, label in enumerate(ax2.get_yticklabels()): + if i < 3 and not df_rmse.iloc[i]["is_baseline"]: + label.set_fontweight("bold") + label.set_color(get_bar_color(i, False)["color"]) + elif df_rmse.iloc[i]["is_baseline"]: + label.set_style("italic") + label.set_color(COLORS["text_secondary"]) + else: + label.set_color(COLORS["text"]) + + ax2.xaxis.grid(True, linestyle="--", alpha=0.3, color=COLORS["grid"]) + ax2.set_axisbelow(True) + ax2.tick_params(axis="x", colors=COLORS["text_secondary"]) + ax2.set_title("RMSE ↓ lower is better", fontsize=14 + font_adder, fontweight="bold", color="#FF6B9D", pad=15) + + title_text = "DrEval Challenge Leaderboard" + n_chars = len(title_text) + gradient_colors = [] + for j in range(n_chars): + t = j / max(n_chars - 1, 1) + if t < 0.5: + t2 = t * 2 + r = int(0x14 + (0x29 - 0x14) * t2) + g = int(0xB8 + (0xAB - 0xB8) * t2) + b = int(0xA6 + (0xCA - 0xA6) * t2) + else: + t2 = (t - 0.5) * 2 + r = int(0x29 + (0x9D - 0x29) * t2) + g = int(0xAB + (0x4E - 0xAB) * t2) + b = int(0xCA + (0xDD - 0xCA) * t2) + gradient_colors.append(f"#{r:02x}{g:02x}{b:02x}") + + title_x_start = 0.5 - len(title_text) * 0.012 + for j, char in enumerate(title_text): + fig.text( + title_x_start + j * 0.024, + 0.97, + char, + fontsize=24 + font_adder, + fontweight="bold", + color=gradient_colors[j], + ha="center", + ) + fig.text( + 0.5, + 0.92, + f"{dataset} Dataset • {measure} • {_get_test_mode_name(test_mode)}", + ha="center", + fontsize=12 + font_adder, + color=COLORS["text_secondary"], + ) + + logo_path = Path("docs/_static/img/DrugResponseEvalLogo.svg") + if logo_path.exists(): + try: + from io import BytesIO + + import cairosvg + from PIL import Image + + png_data = cairosvg.svg2png(url=str(logo_path)) + logo_img = Image.open(BytesIO(png_data)) + logo_ax = fig.add_axes((0.8, 0.94, 0.15, 0.06)) + logo_ax.imshow(logo_img) + logo_ax.axis("off") + except Exception as e: + print(e) + pass + + legend_elements = [ + mpatches.Patch(facecolor="#F4D03F", label="#1 Champion", edgecolor="none"), + mpatches.Patch(facecolor="#BDC3C7", label="#2 Runner-up", edgecolor="none"), + mpatches.Patch(facecolor="#E67E22", label="#3 Third Place", edgecolor="none"), + mpatches.Patch(facecolor=COMPETITOR_COLOR, alpha=0.85, label="Competitor", edgecolor="none"), + mpatches.Patch(facecolor="#5a5a5a", alpha=1, label="Baseline", edgecolor="none"), + ] + + legend = fig.legend( + handles=legend_elements, + loc="lower center", + ncol=5, + frameon=True, + facecolor=COLORS["surface"], + edgecolor=COLORS["grid"], + fontsize=10 + font_adder, + bbox_to_anchor=(0.5, 0.02), + ) + legend.get_frame().set_alpha(0.9) + for text in legend.get_texts(): + text.set_color(COLORS["text"]) + + footer_text = ( + "Submit your model → https://drevalpy.readthedocs.io/en/latest/. " + "Send us your results.\n\n" + "If you significantly outperform the RandomForest, we send you chocolate!" + ) + + fig.text( + 0.5, + -0.01, + footer_text, + ha="center", + va="top", + fontsize=14 + font_adder, + color=COLORS["text_secondary"], + style="italic", + linespacing=1.0, + ) + + plt.tight_layout(rect=(0, 0.06, 1, 0.90)) + fig.savefig(output_path, dpi=150, bbox_inches="tight", facecolor=COLORS["background"], transparent=False) + plt.close(fig) + print(f"Saved leaderboard to: {output_path}") + + return fig, (ax1, ax2) + + +def _get_test_mode_name(test_mode: str) -> str: + """ + Map shorthand mode codes to full descriptive names. + + :param test_mode: Suffix code (LCO, etc). + :return: Full string name. + """ + names = { + "LCO": "10-Fold Leave-Cell-Out Cross Validation", + "LDO": "10-Fold Leave-Drug-Out Cross Validation", + "LPO": "10-Fold Leave-Pair-Out Cross Validation", + "LTO": "10-Fold Leave-Tissue-Out Cross Validation", + } + return names.get(test_mode, test_mode) + + +def main(): + """Execute dual-theme leaderboard generation.""" + parser = argparse.ArgumentParser( + description="Generate DrEvalPy leaderboard visualization (Dark & Light modes)", + formatter_class=argparse.RawDescriptionHelpFormatter, + ) + parser.add_argument("--results_path", "-r", type=str, required=True, help="Path to evaluation_results.csv") + parser.add_argument("--output_dir", "-o", type=str, default="docs/_static/img", help="Directory to save images") + parser.add_argument("--test_mode", "-t", type=str, default="LCO", choices=["LCO", "LDO", "LPO", "LTO"]) + parser.add_argument("--dataset", "-d", type=str, default="CTRPv2", help="Dataset name") + parser.add_argument("--measure", "-m", type=str, default="LN_IC50_curvecurator", help="Response measure") + parser.add_argument("--top_n", "-n", type=int, default=None, help="Top N models") + parser.add_argument("--font_adder", type=int, default=6, help="Font size increment") + + args = parser.parse_args() + + df = load_results(args.results_path, test_mode=args.test_mode) + + out_dir = Path(args.output_dir) + out_dir.mkdir(parents=True, exist_ok=True) + + global COLORS + + COLORS = DARK_THEME + create_leaderboard( + df=df, + output_path=str(out_dir / "leaderboard_dark.png"), + test_mode=args.test_mode, + dataset=args.dataset, + measure=args.measure, + show_top_n=args.top_n, + font_adder=args.font_adder, + ) + + COLORS = LIGHT_THEME + create_leaderboard( + df=df, + output_path=str(out_dir / "leaderboard_light.png"), + test_mode=args.test_mode, + dataset=args.dataset, + measure=args.measure, + show_top_n=args.top_n, + font_adder=args.font_adder, + ) + + +if __name__ == "__main__": + main() diff --git a/drevalpy/visualization/create_report.py b/drevalpy/visualization/create_report.py new file mode 100644 index 00000000..5c4e5877 --- /dev/null +++ b/drevalpy/visualization/create_report.py @@ -0,0 +1,264 @@ +"""Generate evaluation reports after running a drug response experiment.""" + +import argparse +import os +import pathlib +from collections.abc import Iterable +from typing import Union + +import numpy as np +import pandas as pd + +from drevalpy.visualization.utils import ( + create_html, + create_index_html, + create_output_directories, + draw_algorithm_plots, + draw_test_mode_plots, + parse_results, + prep_results, + write_results, +) + + +def generate_reports_for_test_mode( + test_mode: str, + evaluation_results: pd.DataFrame, + evaluation_results_per_drug: pd.DataFrame, + evaluation_results_per_cell_line: pd.DataFrame, + true_vs_pred: pd.DataFrame, + run_id: str, + path_data: Union[str, pathlib.Path], + result_path: Union[str, pathlib.Path], +) -> None: + """ + Generate reports (plots and HTML) for a single test mode. + + :param test_mode: The test mode to generate reports for. + :param evaluation_results: Aggregated evaluation results. + :param evaluation_results_per_drug: Evaluation results per drug. + :param evaluation_results_per_cell_line: Evaluation results per cell line. + :param true_vs_pred: True vs predicted values. + :param run_id: Unique run identifier. + :param path_data: Path to the dataset directory. + :param result_path: Path to the results directory. + """ + path_data = pathlib.Path(path_data) + result_path = pathlib.Path(result_path) + + print(f"Generating report for {test_mode} ...") + unique_algos_ndarray = draw_test_mode_plots( + test_mode=test_mode, + ev_res=evaluation_results, + ev_res_per_drug=evaluation_results_per_drug, + ev_res_per_cell_line=evaluation_results_per_cell_line, + custom_id=run_id, + path_data=path_data, + result_path=result_path, + ) + unique_algos: Iterable[str] = ( + list(unique_algos_ndarray) if isinstance(unique_algos_ndarray, (np.ndarray, tuple)) else unique_algos_ndarray + ) + + unique_algos_set = set(unique_algos) - { + "NaiveMeanEffectsPredictor", + "NaivePredictor", + "NaiveCellLineMeansPredictor", + "NaiveTissueMeansPredictor", + "NaiveDrugMeanPredictor", + } + for algorithm in unique_algos_set: + draw_algorithm_plots( + model=algorithm, + ev_res=evaluation_results, + ev_res_per_drug=evaluation_results_per_drug, + ev_res_per_cell_line=evaluation_results_per_cell_line, + t_vs_p=true_vs_pred, + test_mode=test_mode, + custom_id=run_id, + result_path=result_path, + ) + + all_files = [] + for _, _, files in os.walk(f"{result_path}/{run_id}"): + for file in files: + if file.endswith("json") or ( + file.endswith(".html") and file not in ["index.html", "LPO.html", "LCO.html", "LDO.html"] + ): + all_files.append(file) + + create_html( + run_id=run_id, + test_mode=test_mode, + files=all_files, + prefix_results=f"{result_path}/{run_id}", + ) + + +def generate_reports_for_all_test_modes( + test_modes: list[str], + evaluation_results: pd.DataFrame, + evaluation_results_per_drug: pd.DataFrame, + evaluation_results_per_cell_line: pd.DataFrame, + true_vs_pred: pd.DataFrame, + run_id: str, + path_data: Union[str, pathlib.Path], + result_path: Union[str, pathlib.Path], +) -> None: + """ + Generate reports for all test modes. + + :param test_modes: list of test modes to process. + :param evaluation_results: Aggregated evaluation results. + :param evaluation_results_per_drug: Evaluation results per drug. + :param evaluation_results_per_cell_line: Evaluation results per cell line. + :param true_vs_pred: True vs predicted values. + :param run_id: Unique run identifier. + :param path_data: Path to the dataset directory. + :param result_path: Path to the results directory. + """ + for test_mode in test_modes: + generate_reports_for_test_mode( + test_mode=test_mode, + evaluation_results=evaluation_results, + evaluation_results_per_drug=evaluation_results_per_drug, + evaluation_results_per_cell_line=evaluation_results_per_cell_line, + true_vs_pred=true_vs_pred, + run_id=run_id, + path_data=path_data, + result_path=result_path, + ) + + +def create_report( + run_id: str, + dataset: str, + path_data: Union[str, pathlib.Path] = "data", + result_path: Union[str, pathlib.Path] = "results", +) -> None: + """ + Render a full evaluation report pipeline. + + :param run_id: Unique run identifier for locating results. + :param dataset: Dataset name to filter results. + :param path_data: Path to the dataset directory. Defaults to "data". + :param result_path: Path to the results directory. Defaults to "results". + + :raises AssertionError: If the folder with the run_id does not exist under result_path. + """ + path_data = pathlib.Path(path_data).resolve() + result_path = pathlib.Path(result_path).resolve() + + if not os.path.exists(f"{result_path}/{run_id}"): + raise AssertionError(f"Folder {result_path}/{run_id} does not exist. The pipeline has to be run first.") + + ( + evaluation_results, + evaluation_results_per_drug, + evaluation_results_per_cell_line, + true_vs_pred, + ) = parse_results(path_to_results=f"{result_path}/{run_id}", dataset=dataset) + + ( + evaluation_results, + evaluation_results_per_drug, + evaluation_results_per_cell_line, + true_vs_pred, + ) = prep_results( + evaluation_results, evaluation_results_per_drug, evaluation_results_per_cell_line, true_vs_pred, path_data + ) + + write_results( + path_out=f"{result_path}/{run_id}/", + eval_results=evaluation_results, + eval_results_per_drug=evaluation_results_per_drug, + eval_results_per_cl=evaluation_results_per_cell_line, + t_vs_p=true_vs_pred, + ) + + create_output_directories(result_path, run_id) + test_modes = list(evaluation_results["test_mode"].unique()) + + generate_reports_for_all_test_modes( + test_modes=test_modes, + evaluation_results=evaluation_results, + evaluation_results_per_drug=evaluation_results_per_drug, + evaluation_results_per_cell_line=evaluation_results_per_cell_line, + true_vs_pred=true_vs_pred, + run_id=run_id, + path_data=path_data, + result_path=result_path, + ) + + create_index_html( + custom_id=run_id, + test_modes=test_modes, + prefix_results=f"{result_path}/{run_id}", + ) + + +def main() -> None: + """ + Command line interface entry point for rendering evaluation reports. + + Parses command line arguments and calls render_report. + """ + parser = argparse.ArgumentParser(description="Generate reports from evaluation results") + parser.add_argument("--run_id", required=True, help="Run ID for the current execution") + parser.add_argument("--dataset", required=True, help="Dataset name for which to render the result file") + parser.add_argument("--path_data", default="data", help="Path to the data") + parser.add_argument("--result_path", default="results", help="Path to the results") + args = parser.parse_args() + create_report(args.run_id, args.dataset, args.path_data, args.result_path) + + +def pipeline_report(): + """CLI for the pipeline report.""" + parser = argparse.ArgumentParser(description="Make the HTML report for the pipeline.") + parser.add_argument("--test_modes", type=str, nargs="+", required=True, help="LPO, LDO, LCO, or LTO.") + parser.add_argument("--eval_results", type=str, required=True, help="Path to the evaluation results.") + parser.add_argument( + "--eval_results_per_drug", type=str, required=True, help="Path to the evaluation results per drug." + ) + parser.add_argument( + "--eval_results_per_cl", type=str, required=True, help="Path to the evaluation results per cell line." + ) + parser.add_argument("--true_vs_predicted", type=str, required=True, help="Path to the true vs predicted results.") + parser.add_argument("--path_data", type=str, required=True, help="Path to the data.") + args = parser.parse_args() + + # make directories + result_path = pathlib.Path(".") + outdir_name = "report" + create_output_directories(result_path=result_path, custom_id=outdir_name) + test_modes = args.test_modes + + # read in data + ev_res = pd.read_csv(args.eval_results, index_col=0) + if args.eval_results_per_drug == "NO_FILE": + ev_res_per_drug = None + else: + ev_res_per_drug = pd.read_csv(args.eval_results_per_drug, index_col=0) + if args.eval_results_per_cl == "NO_FILE": + ev_res_per_cl = None + else: + ev_res_per_cl = pd.read_csv(args.eval_results_per_cl, index_col=0) + t_vs_p = pd.read_csv(args.true_vs_predicted, index_col=0) + + # make individual html reports per test mode + generate_reports_for_all_test_modes( + test_modes=test_modes, + evaluation_results=ev_res, + evaluation_results_per_drug=ev_res_per_drug, + evaluation_results_per_cell_line=ev_res_per_cl, + true_vs_pred=t_vs_p, + run_id=outdir_name, + path_data=args.path_data, + result_path=result_path, + ) + # make index html + create_index_html( + custom_id=outdir_name, + test_modes=test_modes, + prefix_results=f"{result_path}/{outdir_name}", + ) diff --git a/drevalpy/visualization/critical_difference_plot.py b/drevalpy/visualization/critical_difference_plot.py index ab642979..a7f3f7d0 100644 --- a/drevalpy/visualization/critical_difference_plot.py +++ b/drevalpy/visualization/critical_difference_plot.py @@ -6,7 +6,7 @@ differences in treatments across multiple test attempts. It compares the ranks of multiple groups and is suitable when there are repeated measurements for each group (as is the case here with cross-validation splits). The p-value of this test is used to assess whether there are any significant differences in the performance of the - models. + models. We use Benjamini/Hochberg correction for multiple testing. 2. **Post-hoc Conover Test**: If the Friedman test returns a significant result (p-value < 0.05), the post-hoc Conover test can be used to identify pairs of algorithms that perform significantly different. This test is necessary @@ -40,7 +40,6 @@ from scipy import stats from ..evaluation import MINIMIZATION_METRICS -from ..pipeline_function import pipeline_function from .outplot import OutPlot matplotlib.use("agg") @@ -53,23 +52,25 @@ class CriticalDifferencePlot(OutPlot): """ Draws the critical difference diagram. - Used by the pipeline! - The critical difference diagram is used to compare the performance of multiple classifiers and show whether a model is significantly better than another model. This is calculated over the average ranks of the classifiers which is why there need to be at least 3 classifiers to draw the diagram. Because the ranks are calculated over the cross-validation splits and the significance threshold is set to 0.05, e.g., 10 CV folds are advisable. """ - @pipeline_function def __init__(self, eval_results_preds: pd.DataFrame, metric="MSE"): """ Initializes the critical difference plot. :param eval_results_preds: evaluation results subsetted to predictions only (no randomizations etc) :param metric: to be used to assess the critical difference + :raises ValueError: if eval_results_preds is empty or does not contain the metric """ eval_results_preds = eval_results_preds[["algorithm", "CV_split", metric]] + if eval_results_preds.empty: + raise ValueError( + "Critical Difference Plot: The DataFrame is empty. Please provide a valid DataFrame with predictions." + ) if metric in MINIMIZATION_METRICS: eval_results_preds.loc[:, metric] = -eval_results_preds.loc[:, metric] @@ -78,7 +79,6 @@ def __init__(self, eval_results_preds: pd.DataFrame, metric="MSE"): self.fig: Optional[plt.Figure] = None self.test_results: Optional[pd.DataFrame] = None - @pipeline_function def draw_and_save(self, out_prefix: str, out_suffix: str) -> None: """ Draws the critical difference plot and saves it to a file. @@ -119,7 +119,7 @@ def _draw(self) -> None: input_conover_friedman = self.eval_results_preds.pivot_table( index="CV_split", columns="algorithm", values=self.metric ) - self.test_results = pd.DataFrame(sp.posthoc_conover_friedman(input_conover_friedman)) + self.test_results = pd.DataFrame(sp.posthoc_conover_friedman(input_conover_friedman, p_adjust="fdr_bh")) average_ranks = input_conover_friedman.rank(ascending=False, axis=1).mean(axis=0) plt.title( f"Critical Difference Diagram: Metric: {self.metric}.\n" @@ -159,7 +159,8 @@ def write_to_html(test_mode: str, f: TextIOWrapper, *args, **kwargs) -> TextIOWr "other. The p-values are shown below. This can only be rendered if at least 3 models were run." ) f.write("

") - f.write("

Results of Post-Hoc Conover Test

") + f.write("

Results of the pairwise Post-Hoc Conover Test

") + f.write("

All p-values are adjusted with Benjamini-Hochberg correction.

") f.write("
") path_to_table = pathlib.Path( pathlib.Path(f.name).parent, f"critical_difference_plots/critical_difference_algorithms_{test_mode}.html" diff --git a/drevalpy/visualization/cross_study_tables.py b/drevalpy/visualization/cross_study_tables.py index 84e7c178..c5ce52ab 100644 --- a/drevalpy/visualization/cross_study_tables.py +++ b/drevalpy/visualization/cross_study_tables.py @@ -7,8 +7,6 @@ import pandas as pd import plotly.graph_objects as go -from ..pipeline_function import pipeline_function - class CrossStudyTables: """Generate evaluation tables for cross-study drug response prediction.""" @@ -87,7 +85,6 @@ def draw(self): fig.update_layout(title_text=f"Evaluation Metrics for Cross-Study Predictions to {dataset_name}") self.figures[dataset_name] = fig - @pipeline_function def draw_and_save(self, out_prefix: str, out_suffix: str): """ Generate and save HTML tables for each cross-study dataset. diff --git a/drevalpy/visualization/heatmap.py b/drevalpy/visualization/heatmap.py index 45387c51..81673183 100644 --- a/drevalpy/visualization/heatmap.py +++ b/drevalpy/visualization/heatmap.py @@ -5,14 +5,12 @@ import plotly.graph_objects as go from plotly.subplots import make_subplots -from ..pipeline_function import pipeline_function from .vioheat import VioHeat class Heatmap(VioHeat): """Plots a heatmap of the evaluation metrics.""" - @pipeline_function def __init__(self, df: pd.DataFrame, normalized_metrics=False, whole_name=False): """ Initialize the Heatmap class. @@ -21,11 +19,20 @@ def __init__(self, df: pd.DataFrame, normalized_metrics=False, whole_name=False) robustness, randomization, … tests then) :param normalized_metrics: whether the metrics are normalized :param whole_name: whether the whole name should be displayed + :raises ValueError: If the DataFrame is empty or does not contain the required metrics. """ super().__init__(df, normalized_metrics, whole_name) + if normalized_metrics and not any(["normalized" in col for col in self.df.columns]): + raise ValueError( + "The DataFrame does not contain normalized metrics. Please provide a DataFrame with normalized metrics." + ) + if self.df.empty: + raise ValueError("The DataFrame is empty. Please provide a valid DataFrame with metrics.") self.df = self.df[[col for col in self.df.columns if col in self.all_metrics]] + if self.df.empty: + raise ValueError("The DataFrame does not contain any valid metrics. Please check the columns.") self.n_models = len(self.df.index) if self.normalized_metrics: @@ -59,7 +66,6 @@ def __init__(self, df: pd.DataFrame, normalized_metrics=False, whole_name=False) vertical_spacing=0.1, ) - @pipeline_function def draw_and_save(self, out_prefix: str, out_suffix: str) -> None: """ Draw the heatmap and save it to a file. diff --git a/drevalpy/visualization/regression_slider_plot.py b/drevalpy/visualization/regression_slider_plot.py index edcb2f7b..3b56ef81 100644 --- a/drevalpy/visualization/regression_slider_plot.py +++ b/drevalpy/visualization/regression_slider_plot.py @@ -8,14 +8,12 @@ import plotly.graph_objects as go from scipy.stats import pearsonr -from ..pipeline_function import pipeline_function from .outplot import OutPlot class RegressionSliderPlot(OutPlot): """Generates regression plots with a slider for the Pearson correlation coefficient.""" - @pipeline_function def __init__( self, df: pd.DataFrame, @@ -73,7 +71,6 @@ def __init__( columns={"model_x": "model", "algorithm_x": "algorithm", "CV_split_x": "CV_split"} ) - @pipeline_function def draw_and_save(self, out_prefix: str, out_suffix: str) -> None: """ Draw the regression plot and save it to a file. diff --git a/drevalpy/visualization/utils.py b/drevalpy/visualization/utils.py index 428c108f..ca4dcd64 100644 --- a/drevalpy/visualization/utils.py +++ b/drevalpy/visualization/utils.py @@ -12,6 +12,7 @@ from ..datasets.dataset import DrugResponseDataset from ..evaluation import AVAILABLE_METRICS, evaluate +from ..models.utils import CELL_LINE_IDENTIFIER, DRUG_IDENTIFIER from ..pipeline_function import pipeline_function from . import ( ComparisonScatter, @@ -212,6 +213,7 @@ def prep_results( :param t_vs_p: true vs. predicted values :param path_data: path to the data :returns: the same dataframes with new columns + :raises ValueError: if NaiveMeanEffectsPredictor is not found in the evaluation results """ # get metadata print("Getting information about drugs and cell lines ...") @@ -220,15 +222,26 @@ def prep_results( for root, _, files in os.walk(path_data): for file in files: if file == "drug_names.csv": - drug_names = pd.read_csv(os.path.join(root, file), index_col=0) - # make index to str - drug_names.index = drug_names.index.astype(str) + drug_names = pd.read_csv(os.path.join(root, file)) + drug_names["pubchem_id"] = drug_names["pubchem_id"].astype(str) # index: pubchem_id, column: drug_name - drug_metadata.update(zip(drug_names.index, drug_names["drug_name"])) + drug_metadata.update(zip(drug_names["pubchem_id"], drug_names["drug_name"])) elif file == "cell_line_names.csv": - cell_line_names = pd.read_csv(os.path.join(root, file), index_col=0) + cell_line_names = pd.read_csv(os.path.join(root, file)) # index: cellosaurus_id, column: cell_line_name - cell_line_metadata.update(zip(cell_line_names["cell_line_name"], cell_line_names.index)) + try: + cellosaurus_ids = cell_line_names["cellosaurus_id"].astype(str) + # replace nan with unknown_id_{i} (patient derived cell lines might not have a cellosaurus id) + n_missing = cellosaurus_ids.isna().sum() + fill_values = [f"unknown_id_{i}" for i in range(n_missing)] + cellosaurus_ids = cellosaurus_ids.where( + cellosaurus_ids.notna(), + pd.Series(fill_values, index=cellosaurus_ids[cellosaurus_ids.isna()].index), + ) + + except KeyError: + cellosaurus_ids = pd.Series([f"unknown_id_{i}" for i in range(len(cell_line_names))]) + cell_line_metadata.update(zip(cell_line_names[CELL_LINE_IDENTIFIER], cellosaurus_ids)) # add variables # split the index by "_" into: algorithm, randomization, test_mode, split, CV_split @@ -251,7 +264,7 @@ def prep_results( all_drugs = [drug_metadata[drug] for drug in eval_results_per_drug["drug"]] eval_results_per_drug["drug_name"] = all_drugs # rename drug to pubchem_id - eval_results_per_drug = eval_results_per_drug.rename(columns={"drug": "pubchem_id"}) + eval_results_per_drug = eval_results_per_drug.rename(columns={"drug": DRUG_IDENTIFIER}) if eval_results_per_cell_line is not None: print("Reformatting the evaluation results per cell line ...") eval_results_per_cell_line[["algorithm", "rand_setting", "test_mode", "split", "CV_split"]] = ( @@ -259,7 +272,7 @@ def prep_results( ) all_cello_ids = [cell_line_metadata[cell_line] for cell_line in eval_results_per_cell_line["cell_line"]] eval_results_per_cell_line["cellosaurus_id"] = all_cello_ids - eval_results_per_cell_line = eval_results_per_cell_line.rename(columns={"cell_line": "cell_line_name"}) + eval_results_per_cell_line = eval_results_per_cell_line.rename(columns={"cell_line": CELL_LINE_IDENTIFIER}) print("Reformatting the true vs. predicted values ...") t_vs_p[["algorithm", "rand_setting", "test_mode", "split", "CV_split"]] = t_vs_p["model"].str.split( @@ -270,14 +283,19 @@ def prep_results( t_vs_p["drug_name"] = all_drugs all_cello_ids = [cell_line_metadata[cell_line] for cell_line in t_vs_p["cell_line"]] t_vs_p["cellosaurus_id"] = all_cello_ids - t_vs_p = t_vs_p.rename(columns={"cell_line": "cell_line_name", "drug": "pubchem_id"}) - t_vs_p["pubchem_id"] = t_vs_p["pubchem_id"].astype(str) + t_vs_p = t_vs_p.rename(columns={"cell_line": CELL_LINE_IDENTIFIER, "drug": DRUG_IDENTIFIER}) + t_vs_p[DRUG_IDENTIFIER] = t_vs_p[DRUG_IDENTIFIER].astype(str) if "NaiveMeanEffectsPredictor" in eval_results["algorithm"].unique(): eval_results = _normalize_metrics_by_mean_effects( evaluation_results=eval_results, true_vs_pred=t_vs_p, ) + else: + raise ValueError( + "NaiveMeanEffectsPredictor not found in evaluation results. " + "Please check if the evaluation was run correctly." + ) return ( eval_results, @@ -312,7 +330,7 @@ def _normalize_metrics_by_mean_effects( for algorithm in evaluation_results["algorithm"].unique(): for rand_setting in evaluation_results["rand_setting"].unique(): for test_mode in evaluation_results["test_mode"].unique(): - print(f"Calculating normalized metrics for {algorithm}, {rand_setting}, " f"{test_mode} ...") + setting_subset = true_vs_pred[ (true_vs_pred["algorithm"] == algorithm) & (true_vs_pred["rand_setting"] == rand_setting) @@ -511,7 +529,6 @@ def create_index_html(custom_id: str, test_modes: list[str], prefix_results: str f.write("\n") -@pipeline_function def create_html(run_id: str, test_mode: str, files: list, prefix_results: str) -> None: """ Create the html file for the given test mode, e.g., LPO.html. @@ -574,19 +591,28 @@ def draw_test_mode_plots( :param path_data: path to the data :param result_path: path to the results :returns: list of unique algorithms + :raises ValueError: if no evaluation results are found for the given test_mode """ + if ev_res.empty: + raise ValueError( + f"No evaluation results found for test_mode {test_mode}. " + "Please check if the evaluation was run correctly." + ) ev_res_subset = ev_res[ev_res["test_mode"] == test_mode] # only draw figures for 'real' predictions comparing all models eval_results_preds = ev_res_subset[ev_res_subset["rand_setting"] == "predictions"] + if eval_results_preds.empty: + raise ValueError( + f"No evaluation results found for test_mode {test_mode} with predictions. " + "Please check if the evaluation was run correctly." + ) - # PIPELINE: DRAW_CRITICAL_DIFFERENCE cd_plot = CriticalDifferencePlot(eval_results_preds=eval_results_preds, metric="MSE") cd_plot.draw_and_save( out_prefix=f"{result_path}/{custom_id}/critical_difference_plots/", out_suffix=test_mode, ) - # PIPELINE: DRAW_VIOLIN_AND_HEATMAP for plt_type in ["violinplot", "heatmap"]: if plt_type == "violinplot": out_dir = "violin_plots" @@ -597,7 +623,9 @@ def draw_test_mode_plots( out_suffix = f"algorithms_{test_mode}_normalized" else: out_suffix = f"algorithms_{test_mode}" + out_plot: Violin | Heatmap if plt_type == "violinplot": + out_plot = Violin( df=eval_results_preds, normalized_metrics=normalized, @@ -655,7 +683,6 @@ def _draw_per_grouping_setting_plots( :param custom_id: run id passed over command line :param result_path: path to the results """ - # PIPELINE: DRAW_CORR_COMP corr_comp = ComparisonScatter( df=ev_res_per_group, color_by=grouping, @@ -692,11 +719,11 @@ def draw_algorithm_plots( :param result_path: path to the results """ eval_results_algorithm = ev_res[(ev_res["test_mode"] == test_mode) & (ev_res["algorithm"] == model)] - # PIPELINE: DRAW_VIOLIN_AND_HEATMAP for plt_type in ["violinplot", "heatmap"]: if len(eval_results_algorithm["rand_setting"].unique()) < 2: # only draw plots if there are predictions and another test_mode (randomization/robustness) continue + out_plot: Violin | Heatmap if plt_type == "violinplot": out_dir = "violin_plots" out_plot = Violin( @@ -759,7 +786,6 @@ def _draw_per_grouping_algorithm_plots( """ if len(ev_res_per_group["rand_setting"].unique()) > 1: # only draw plots if there are predictions and another test_mode (randomization/robustness) - # PIPELINE: DRAW_CORR_COMP comp_scatter = ComparisonScatter( df=ev_res_per_group, color_by=grouping, @@ -771,7 +797,6 @@ def _draw_per_grouping_algorithm_plots( out_prefix=f"{result_path}/{custom_id}/comp_scatter/", out_suffix=comp_scatter.name, ) - # PIPELINE: DRAW_REGRESSION for normalize in [False, True]: name_suffix = "_normalized" if normalize else "" name = f"{test_mode}_{grouping}{name_suffix}" diff --git a/drevalpy/visualization/violin.py b/drevalpy/visualization/violin.py index e674154e..be4536c0 100644 --- a/drevalpy/visualization/violin.py +++ b/drevalpy/visualization/violin.py @@ -3,14 +3,12 @@ import pandas as pd import plotly.graph_objects as go -from ..pipeline_function import pipeline_function from .vioheat import VioHeat class Violin(VioHeat): """Plots a violin plot of the evaluation metrics.""" - @pipeline_function def __init__(self, df: pd.DataFrame, normalized_metrics=False, whole_name=False): """ Initialize the Violin class. @@ -27,7 +25,6 @@ def __init__(self, df: pd.DataFrame, normalized_metrics=False, whole_name=False) self.fig = go.Figure() self.occurring_metrics = [metric for metric in self.all_metrics if metric in self.df.columns] - @pipeline_function def draw_and_save(self, out_prefix: str, out_suffix: str) -> None: """ Draw the violin and save it to a file. diff --git a/noxfile.py b/noxfile.py index 1841adf6..e0b7a8b8 100644 --- a/noxfile.py +++ b/noxfile.py @@ -18,7 +18,7 @@ sys.exit(1) package = "drevalpy" -python_versions = ["3.11", "3.12"] +python_versions = ["3.12", "3.13"] nox.options.sessions = ( "pre-commit", "mypy", @@ -144,10 +144,18 @@ def tests(session: Session) -> None: :param session: The Session object. """ - session.install(".[fit]") + session.install(".[multiprocessing]") session.install("coverage[toml]", "pytest", "pygments") try: - session.run("coverage", "run", "--parallel", "-m", "pytest", *session.posargs) + session.run( + "coverage", + "run", + "--parallel", + "-m", + "pytest", + "--ignore=tests/test_hpam_tune_raytune.py", # skip ray, not enough disk space on the runner for ray + *session.posargs, + ) finally: if session.interactive: session.notify("coverage") @@ -182,7 +190,12 @@ def typeguard(session: Session) -> None: """ session.install(".[fit]") session.install("pytest", "typeguard", "pygments") - session.run("pytest", f"--typeguard-packages={package}", *session.posargs) + session.run( + "pytest", + f"--typeguard-packages={package}", + "--ignore=tests/test_hpam_tune_raytune.py", + *session.posargs, + ) @session(python=python_versions) diff --git a/poetry.lock b/poetry.lock index 4133aca7..39af226d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.1.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.3.1 and should not be changed by hand. [[package]] name = "aiohappyeyeballs" @@ -6,7 +6,7 @@ version = "2.6.1" description = "Happy Eyeballs for asyncio" optional = false python-versions = ">=3.9" -groups = ["main"] +groups = ["main", "torch-cuda"] files = [ {file = "aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8"}, {file = "aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558"}, @@ -14,98 +14,137 @@ files = [ [[package]] name = "aiohttp" -version = "3.11.18" +version = "3.13.3" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.9" -groups = ["main"] -files = [ - {file = "aiohttp-3.11.18-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:96264854fedbea933a9ca4b7e0c745728f01380691687b7365d18d9e977179c4"}, - {file = "aiohttp-3.11.18-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9602044ff047043430452bc3a2089743fa85da829e6fc9ee0025351d66c332b6"}, - {file = "aiohttp-3.11.18-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5691dc38750fcb96a33ceef89642f139aa315c8a193bbd42a0c33476fd4a1609"}, - {file = "aiohttp-3.11.18-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:554c918ec43f8480b47a5ca758e10e793bd7410b83701676a4782672d670da55"}, - {file = "aiohttp-3.11.18-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a4076a2b3ba5b004b8cffca6afe18a3b2c5c9ef679b4d1e9859cf76295f8d4f"}, - {file = "aiohttp-3.11.18-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:767a97e6900edd11c762be96d82d13a1d7c4fc4b329f054e88b57cdc21fded94"}, - {file = "aiohttp-3.11.18-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0ddc9337a0fb0e727785ad4f41163cc314376e82b31846d3835673786420ef1"}, - {file = "aiohttp-3.11.18-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f414f37b244f2a97e79b98d48c5ff0789a0b4b4609b17d64fa81771ad780e415"}, - {file = "aiohttp-3.11.18-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:fdb239f47328581e2ec7744ab5911f97afb10752332a6dd3d98e14e429e1a9e7"}, - {file = "aiohttp-3.11.18-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:f2c50bad73ed629cc326cc0f75aed8ecfb013f88c5af116f33df556ed47143eb"}, - {file = "aiohttp-3.11.18-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0a8d8f20c39d3fa84d1c28cdb97f3111387e48209e224408e75f29c6f8e0861d"}, - {file = "aiohttp-3.11.18-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:106032eaf9e62fd6bc6578c8b9e6dc4f5ed9a5c1c7fb2231010a1b4304393421"}, - {file = "aiohttp-3.11.18-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:b491e42183e8fcc9901d8dcd8ae644ff785590f1727f76ca86e731c61bfe6643"}, - {file = "aiohttp-3.11.18-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ad8c745ff9460a16b710e58e06a9dec11ebc0d8f4dd82091cefb579844d69868"}, - {file = "aiohttp-3.11.18-cp310-cp310-win32.whl", hash = "sha256:8e57da93e24303a883146510a434f0faf2f1e7e659f3041abc4e3fb3f6702a9f"}, - {file = "aiohttp-3.11.18-cp310-cp310-win_amd64.whl", hash = "sha256:cc93a4121d87d9f12739fc8fab0a95f78444e571ed63e40bfc78cd5abe700ac9"}, - {file = "aiohttp-3.11.18-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:427fdc56ccb6901ff8088544bde47084845ea81591deb16f957897f0f0ba1be9"}, - {file = "aiohttp-3.11.18-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c828b6d23b984255b85b9b04a5b963a74278b7356a7de84fda5e3b76866597b"}, - {file = "aiohttp-3.11.18-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5c2eaa145bb36b33af1ff2860820ba0589e165be4ab63a49aebfd0981c173b66"}, - {file = "aiohttp-3.11.18-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d518ce32179f7e2096bf4e3e8438cf445f05fedd597f252de9f54c728574756"}, - {file = "aiohttp-3.11.18-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0700055a6e05c2f4711011a44364020d7a10fbbcd02fbf3e30e8f7e7fddc8717"}, - {file = "aiohttp-3.11.18-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8bd1cde83e4684324e6ee19adfc25fd649d04078179890be7b29f76b501de8e4"}, - {file = "aiohttp-3.11.18-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73b8870fe1c9a201b8c0d12c94fe781b918664766728783241a79e0468427e4f"}, - {file = "aiohttp-3.11.18-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25557982dd36b9e32c0a3357f30804e80790ec2c4d20ac6bcc598533e04c6361"}, - {file = "aiohttp-3.11.18-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7e889c9df381a2433802991288a61e5a19ceb4f61bd14f5c9fa165655dcb1fd1"}, - {file = "aiohttp-3.11.18-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:9ea345fda05bae217b6cce2acf3682ce3b13d0d16dd47d0de7080e5e21362421"}, - {file = "aiohttp-3.11.18-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9f26545b9940c4b46f0a9388fd04ee3ad7064c4017b5a334dd450f616396590e"}, - {file = "aiohttp-3.11.18-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:3a621d85e85dccabd700294494d7179ed1590b6d07a35709bb9bd608c7f5dd1d"}, - {file = "aiohttp-3.11.18-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9c23fd8d08eb9c2af3faeedc8c56e134acdaf36e2117ee059d7defa655130e5f"}, - {file = "aiohttp-3.11.18-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d9e6b0e519067caa4fd7fb72e3e8002d16a68e84e62e7291092a5433763dc0dd"}, - {file = "aiohttp-3.11.18-cp311-cp311-win32.whl", hash = "sha256:122f3e739f6607e5e4c6a2f8562a6f476192a682a52bda8b4c6d4254e1138f4d"}, - {file = "aiohttp-3.11.18-cp311-cp311-win_amd64.whl", hash = "sha256:e6f3c0a3a1e73e88af384b2e8a0b9f4fb73245afd47589df2afcab6b638fa0e6"}, - {file = "aiohttp-3.11.18-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:63d71eceb9cad35d47d71f78edac41fcd01ff10cacaa64e473d1aec13fa02df2"}, - {file = "aiohttp-3.11.18-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d1929da615840969929e8878d7951b31afe0bac883d84418f92e5755d7b49508"}, - {file = "aiohttp-3.11.18-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d0aebeb2392f19b184e3fdd9e651b0e39cd0f195cdb93328bd124a1d455cd0e"}, - {file = "aiohttp-3.11.18-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3849ead845e8444f7331c284132ab314b4dac43bfae1e3cf350906d4fff4620f"}, - {file = "aiohttp-3.11.18-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5e8452ad6b2863709f8b3d615955aa0807bc093c34b8e25b3b52097fe421cb7f"}, - {file = "aiohttp-3.11.18-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b8d2b42073611c860a37f718b3d61ae8b4c2b124b2e776e2c10619d920350ec"}, - {file = "aiohttp-3.11.18-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40fbf91f6a0ac317c0a07eb328a1384941872f6761f2e6f7208b63c4cc0a7ff6"}, - {file = "aiohttp-3.11.18-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ff5625413fec55216da5eaa011cf6b0a2ed67a565914a212a51aa3755b0009"}, - {file = "aiohttp-3.11.18-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7f33a92a2fde08e8c6b0c61815521324fc1612f397abf96eed86b8e31618fdb4"}, - {file = "aiohttp-3.11.18-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:11d5391946605f445ddafda5eab11caf310f90cdda1fd99865564e3164f5cff9"}, - {file = "aiohttp-3.11.18-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3cc314245deb311364884e44242e00c18b5896e4fe6d5f942e7ad7e4cb640adb"}, - {file = "aiohttp-3.11.18-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:0f421843b0f70740772228b9e8093289924359d306530bcd3926f39acbe1adda"}, - {file = "aiohttp-3.11.18-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e220e7562467dc8d589e31c1acd13438d82c03d7f385c9cd41a3f6d1d15807c1"}, - {file = "aiohttp-3.11.18-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ab2ef72f8605046115bc9aa8e9d14fd49086d405855f40b79ed9e5c1f9f4faea"}, - {file = "aiohttp-3.11.18-cp312-cp312-win32.whl", hash = "sha256:12a62691eb5aac58d65200c7ae94d73e8a65c331c3a86a2e9670927e94339ee8"}, - {file = "aiohttp-3.11.18-cp312-cp312-win_amd64.whl", hash = "sha256:364329f319c499128fd5cd2d1c31c44f234c58f9b96cc57f743d16ec4f3238c8"}, - {file = "aiohttp-3.11.18-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:474215ec618974054cf5dc465497ae9708543cbfc312c65212325d4212525811"}, - {file = "aiohttp-3.11.18-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6ced70adf03920d4e67c373fd692123e34d3ac81dfa1c27e45904a628567d804"}, - {file = "aiohttp-3.11.18-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2d9f6c0152f8d71361905aaf9ed979259537981f47ad099c8b3d81e0319814bd"}, - {file = "aiohttp-3.11.18-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a35197013ed929c0aed5c9096de1fc5a9d336914d73ab3f9df14741668c0616c"}, - {file = "aiohttp-3.11.18-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:540b8a1f3a424f1af63e0af2d2853a759242a1769f9f1ab053996a392bd70118"}, - {file = "aiohttp-3.11.18-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9e6710ebebfce2ba21cee6d91e7452d1125100f41b906fb5af3da8c78b764c1"}, - {file = "aiohttp-3.11.18-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8af2ef3b4b652ff109f98087242e2ab974b2b2b496304063585e3d78de0b000"}, - {file = "aiohttp-3.11.18-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:28c3f975e5ae3dbcbe95b7e3dcd30e51da561a0a0f2cfbcdea30fc1308d72137"}, - {file = "aiohttp-3.11.18-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c28875e316c7b4c3e745172d882d8a5c835b11018e33432d281211af35794a93"}, - {file = "aiohttp-3.11.18-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:13cd38515568ae230e1ef6919e2e33da5d0f46862943fcda74e7e915096815f3"}, - {file = "aiohttp-3.11.18-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:0e2a92101efb9f4c2942252c69c63ddb26d20f46f540c239ccfa5af865197bb8"}, - {file = "aiohttp-3.11.18-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:e6d3e32b8753c8d45ac550b11a1090dd66d110d4ef805ffe60fa61495360b3b2"}, - {file = "aiohttp-3.11.18-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:ea4cf2488156e0f281f93cc2fd365025efcba3e2d217cbe3df2840f8c73db261"}, - {file = "aiohttp-3.11.18-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9d4df95ad522c53f2b9ebc07f12ccd2cb15550941e11a5bbc5ddca2ca56316d7"}, - {file = "aiohttp-3.11.18-cp313-cp313-win32.whl", hash = "sha256:cdd1bbaf1e61f0d94aced116d6e95fe25942f7a5f42382195fd9501089db5d78"}, - {file = "aiohttp-3.11.18-cp313-cp313-win_amd64.whl", hash = "sha256:bdd619c27e44382cf642223f11cfd4d795161362a5a1fc1fa3940397bc89db01"}, - {file = "aiohttp-3.11.18-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:469ac32375d9a716da49817cd26f1916ec787fc82b151c1c832f58420e6d3533"}, - {file = "aiohttp-3.11.18-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3cec21dd68924179258ae14af9f5418c1ebdbba60b98c667815891293902e5e0"}, - {file = "aiohttp-3.11.18-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b426495fb9140e75719b3ae70a5e8dd3a79def0ae3c6c27e012fc59f16544a4a"}, - {file = "aiohttp-3.11.18-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad2f41203e2808616292db5d7170cccf0c9f9c982d02544443c7eb0296e8b0c7"}, - {file = "aiohttp-3.11.18-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5bc0ae0a5e9939e423e065a3e5b00b24b8379f1db46046d7ab71753dfc7dd0e1"}, - {file = "aiohttp-3.11.18-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe7cdd3f7d1df43200e1c80f1aed86bb36033bf65e3c7cf46a2b97a253ef8798"}, - {file = "aiohttp-3.11.18-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5199be2a2f01ffdfa8c3a6f5981205242986b9e63eb8ae03fd18f736e4840721"}, - {file = "aiohttp-3.11.18-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ccec9e72660b10f8e283e91aa0295975c7bd85c204011d9f5eb69310555cf30"}, - {file = "aiohttp-3.11.18-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1596ebf17e42e293cbacc7a24c3e0dc0f8f755b40aff0402cb74c1ff6baec1d3"}, - {file = "aiohttp-3.11.18-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:eab7b040a8a873020113ba814b7db7fa935235e4cbaf8f3da17671baa1024863"}, - {file = "aiohttp-3.11.18-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:5d61df4a05476ff891cff0030329fee4088d40e4dc9b013fac01bc3c745542c2"}, - {file = "aiohttp-3.11.18-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:46533e6792e1410f9801d09fd40cbbff3f3518d1b501d6c3c5b218f427f6ff08"}, - {file = "aiohttp-3.11.18-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:c1b90407ced992331dd6d4f1355819ea1c274cc1ee4d5b7046c6761f9ec11829"}, - {file = "aiohttp-3.11.18-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a2fd04ae4971b914e54fe459dd7edbbd3f2ba875d69e057d5e3c8e8cac094935"}, - {file = "aiohttp-3.11.18-cp39-cp39-win32.whl", hash = "sha256:b2f317d1678002eee6fe85670039fb34a757972284614638f82b903a03feacdc"}, - {file = "aiohttp-3.11.18-cp39-cp39-win_amd64.whl", hash = "sha256:5e7007b8d1d09bce37b54111f593d173691c530b80f27c6493b928dabed9e6ef"}, - {file = "aiohttp-3.11.18.tar.gz", hash = "sha256:ae856e1138612b7e412db63b7708735cff4d38d0399f6a5435d3dac2669f558a"}, +groups = ["main", "torch-cuda"] +files = [ + {file = "aiohttp-3.13.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d5a372fd5afd301b3a89582817fdcdb6c34124787c70dbcc616f259013e7eef7"}, + {file = "aiohttp-3.13.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:147e422fd1223005c22b4fe080f5d93ced44460f5f9c105406b753612b587821"}, + {file = "aiohttp-3.13.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:859bd3f2156e81dd01432f5849fc73e2243d4a487c4fd26609b1299534ee1845"}, + {file = "aiohttp-3.13.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dca68018bf48c251ba17c72ed479f4dafe9dbd5a73707ad8d28a38d11f3d42af"}, + {file = "aiohttp-3.13.3-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:fee0c6bc7db1de362252affec009707a17478a00ec69f797d23ca256e36d5940"}, + {file = "aiohttp-3.13.3-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c048058117fd649334d81b4b526e94bde3ccaddb20463a815ced6ecbb7d11160"}, + {file = "aiohttp-3.13.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:215a685b6fbbfcf71dfe96e3eba7a6f58f10da1dfdf4889c7dd856abe430dca7"}, + {file = "aiohttp-3.13.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de2c184bb1fe2cbd2cefba613e9db29a5ab559323f994b6737e370d3da0ac455"}, + {file = "aiohttp-3.13.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:75ca857eba4e20ce9f546cd59c7007b33906a4cd48f2ff6ccf1ccfc3b646f279"}, + {file = "aiohttp-3.13.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:81e97251d9298386c2b7dbeb490d3d1badbdc69107fb8c9299dd04eb39bddc0e"}, + {file = "aiohttp-3.13.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:c0e2d366af265797506f0283487223146af57815b388623f0357ef7eac9b209d"}, + {file = "aiohttp-3.13.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:4e239d501f73d6db1522599e14b9b321a7e3b1de66ce33d53a765d975e9f4808"}, + {file = "aiohttp-3.13.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:0db318f7a6f065d84cb1e02662c526294450b314a02bd9e2a8e67f0d8564ce40"}, + {file = "aiohttp-3.13.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:bfc1cc2fe31a6026a8a88e4ecfb98d7f6b1fec150cfd708adbfd1d2f42257c29"}, + {file = "aiohttp-3.13.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:af71fff7bac6bb7508956696dce8f6eec2bbb045eceb40343944b1ae62b5ef11"}, + {file = "aiohttp-3.13.3-cp310-cp310-win32.whl", hash = "sha256:37da61e244d1749798c151421602884db5270faf479cf0ef03af0ff68954c9dd"}, + {file = "aiohttp-3.13.3-cp310-cp310-win_amd64.whl", hash = "sha256:7e63f210bc1b57ef699035f2b4b6d9ce096b5914414a49b0997c839b2bd2223c"}, + {file = "aiohttp-3.13.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5b6073099fb654e0a068ae678b10feff95c5cae95bbfcbfa7af669d361a8aa6b"}, + {file = "aiohttp-3.13.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cb93e166e6c28716c8c6aeb5f99dfb6d5ccf482d29fe9bf9a794110e6d0ab64"}, + {file = "aiohttp-3.13.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:28e027cf2f6b641693a09f631759b4d9ce9165099d2b5d92af9bd4e197690eea"}, + {file = "aiohttp-3.13.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3b61b7169ababd7802f9568ed96142616a9118dd2be0d1866e920e77ec8fa92a"}, + {file = "aiohttp-3.13.3-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:80dd4c21b0f6237676449c6baaa1039abae86b91636b6c91a7f8e61c87f89540"}, + {file = "aiohttp-3.13.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:65d2ccb7eabee90ce0503c17716fc77226be026dcc3e65cce859a30db715025b"}, + {file = "aiohttp-3.13.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5b179331a481cb5529fca8b432d8d3c7001cb217513c94cd72d668d1248688a3"}, + {file = "aiohttp-3.13.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d4c940f02f49483b18b079d1c27ab948721852b281f8b015c058100e9421dd1"}, + {file = "aiohttp-3.13.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f9444f105664c4ce47a2a7171a2418bce5b7bae45fb610f4e2c36045d85911d3"}, + {file = "aiohttp-3.13.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:694976222c711d1d00ba131904beb60534f93966562f64440d0c9d41b8cdb440"}, + {file = "aiohttp-3.13.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:f33ed1a2bf1997a36661874b017f5c4b760f41266341af36febaf271d179f6d7"}, + {file = "aiohttp-3.13.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e636b3c5f61da31a92bf0d91da83e58fdfa96f178ba682f11d24f31944cdd28c"}, + {file = "aiohttp-3.13.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:5d2d94f1f5fcbe40838ac51a6ab5704a6f9ea42e72ceda48de5e6b898521da51"}, + {file = "aiohttp-3.13.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:2be0e9ccf23e8a94f6f0650ce06042cefc6ac703d0d7ab6c7a917289f2539ad4"}, + {file = "aiohttp-3.13.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9af5e68ee47d6534d36791bbe9b646d2a7c7deb6fc24d7943628edfbb3581f29"}, + {file = "aiohttp-3.13.3-cp311-cp311-win32.whl", hash = "sha256:a2212ad43c0833a873d0fb3c63fa1bacedd4cf6af2fee62bf4b739ceec3ab239"}, + {file = "aiohttp-3.13.3-cp311-cp311-win_amd64.whl", hash = "sha256:642f752c3eb117b105acbd87e2c143de710987e09860d674e068c4c2c441034f"}, + {file = "aiohttp-3.13.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b903a4dfee7d347e2d87697d0713be59e0b87925be030c9178c5faa58ea58d5c"}, + {file = "aiohttp-3.13.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a45530014d7a1e09f4a55f4f43097ba0fd155089372e105e4bff4ca76cb1b168"}, + {file = "aiohttp-3.13.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:27234ef6d85c914f9efeb77ff616dbf4ad2380be0cda40b4db086ffc7ddd1b7d"}, + {file = "aiohttp-3.13.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d32764c6c9aafb7fb55366a224756387cd50bfa720f32b88e0e6fa45b27dcf29"}, + {file = "aiohttp-3.13.3-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b1a6102b4d3ebc07dad44fbf07b45bb600300f15b552ddf1851b5390202ea2e3"}, + {file = "aiohttp-3.13.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c014c7ea7fb775dd015b2d3137378b7be0249a448a1612268b5a90c2d81de04d"}, + {file = "aiohttp-3.13.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2b8d8ddba8f95ba17582226f80e2de99c7a7948e66490ef8d947e272a93e9463"}, + {file = "aiohttp-3.13.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9ae8dd55c8e6c4257eae3a20fd2c8f41edaea5992ed67156642493b8daf3cecc"}, + {file = "aiohttp-3.13.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:01ad2529d4b5035578f5081606a465f3b814c542882804e2e8cda61adf5c71bf"}, + {file = "aiohttp-3.13.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bb4f7475e359992b580559e008c598091c45b5088f28614e855e42d39c2f1033"}, + {file = "aiohttp-3.13.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:c19b90316ad3b24c69cd78d5c9b4f3aa4497643685901185b65166293d36a00f"}, + {file = "aiohttp-3.13.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:96d604498a7c782cb15a51c406acaea70d8c027ee6b90c569baa6e7b93073679"}, + {file = "aiohttp-3.13.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:084911a532763e9d3dd95adf78a78f4096cd5f58cdc18e6fdbc1b58417a45423"}, + {file = "aiohttp-3.13.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:7a4a94eb787e606d0a09404b9c38c113d3b099d508021faa615d70a0131907ce"}, + {file = "aiohttp-3.13.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:87797e645d9d8e222e04160ee32aa06bc5c163e8499f24db719e7852ec23093a"}, + {file = "aiohttp-3.13.3-cp312-cp312-win32.whl", hash = "sha256:b04be762396457bef43f3597c991e192ee7da460a4953d7e647ee4b1c28e7046"}, + {file = "aiohttp-3.13.3-cp312-cp312-win_amd64.whl", hash = "sha256:e3531d63d3bdfa7e3ac5e9b27b2dd7ec9df3206a98e0b3445fa906f233264c57"}, + {file = "aiohttp-3.13.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:5dff64413671b0d3e7d5918ea490bdccb97a4ad29b3f311ed423200b2203e01c"}, + {file = "aiohttp-3.13.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:87b9aab6d6ed88235aa2970294f496ff1a1f9adcd724d800e9b952395a80ffd9"}, + {file = "aiohttp-3.13.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:425c126c0dc43861e22cb1c14ba4c8e45d09516d0a3ae0a3f7494b79f5f233a3"}, + {file = "aiohttp-3.13.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7f9120f7093c2a32d9647abcaf21e6ad275b4fbec5b55969f978b1a97c7c86bf"}, + {file = "aiohttp-3.13.3-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:697753042d57f4bf7122cab985bf15d0cef23c770864580f5af4f52023a56bd6"}, + {file = "aiohttp-3.13.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6de499a1a44e7de70735d0b39f67c8f25eb3d91eb3103be99ca0fa882cdd987d"}, + {file = "aiohttp-3.13.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:37239e9f9a7ea9ac5bf6b92b0260b01f8a22281996da609206a84df860bc1261"}, + {file = "aiohttp-3.13.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f76c1e3fe7d7c8afad7ed193f89a292e1999608170dcc9751a7462a87dfd5bc0"}, + {file = "aiohttp-3.13.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fc290605db2a917f6e81b0e1e0796469871f5af381ce15c604a3c5c7e51cb730"}, + {file = "aiohttp-3.13.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4021b51936308aeea0367b8f006dc999ca02bc118a0cc78c303f50a2ff6afb91"}, + {file = "aiohttp-3.13.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:49a03727c1bba9a97d3e93c9f93ca03a57300f484b6e935463099841261195d3"}, + {file = "aiohttp-3.13.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3d9908a48eb7416dc1f4524e69f1d32e5d90e3981e4e37eb0aa1cd18f9cfa2a4"}, + {file = "aiohttp-3.13.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:2712039939ec963c237286113c68dbad80a82a4281543f3abf766d9d73228998"}, + {file = "aiohttp-3.13.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:7bfdc049127717581866fa4708791220970ce291c23e28ccf3922c700740fdc0"}, + {file = "aiohttp-3.13.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8057c98e0c8472d8846b9c79f56766bcc57e3e8ac7bfd510482332366c56c591"}, + {file = "aiohttp-3.13.3-cp313-cp313-win32.whl", hash = "sha256:1449ceddcdbcf2e0446957863af03ebaaa03f94c090f945411b61269e2cb5daf"}, + {file = "aiohttp-3.13.3-cp313-cp313-win_amd64.whl", hash = "sha256:693781c45a4033d31d4187d2436f5ac701e7bbfe5df40d917736108c1cc7436e"}, + {file = "aiohttp-3.13.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:ea37047c6b367fd4bd632bff8077449b8fa034b69e812a18e0132a00fae6e808"}, + {file = "aiohttp-3.13.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:6fc0e2337d1a4c3e6acafda6a78a39d4c14caea625124817420abceed36e2415"}, + {file = "aiohttp-3.13.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c685f2d80bb67ca8c3837823ad76196b3694b0159d232206d1e461d3d434666f"}, + {file = "aiohttp-3.13.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:48e377758516d262bde50c2584fc6c578af272559c409eecbdd2bae1601184d6"}, + {file = "aiohttp-3.13.3-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:34749271508078b261c4abb1767d42b8d0c0cc9449c73a4df494777dc55f0687"}, + {file = "aiohttp-3.13.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:82611aeec80eb144416956ec85b6ca45a64d76429c1ed46ae1b5f86c6e0c9a26"}, + {file = "aiohttp-3.13.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2fff83cfc93f18f215896e3a190e8e5cb413ce01553901aca925176e7568963a"}, + {file = "aiohttp-3.13.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bbe7d4cecacb439e2e2a8a1a7b935c25b812af7a5fd26503a66dadf428e79ec1"}, + {file = "aiohttp-3.13.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b928f30fe49574253644b1ca44b1b8adbd903aa0da4b9054a6c20fc7f4092a25"}, + {file = "aiohttp-3.13.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7b5e8fe4de30df199155baaf64f2fcd604f4c678ed20910db8e2c66dc4b11603"}, + {file = "aiohttp-3.13.3-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:8542f41a62bcc58fc7f11cf7c90e0ec324ce44950003feb70640fc2a9092c32a"}, + {file = "aiohttp-3.13.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:5e1d8c8b8f1d91cd08d8f4a3c2b067bfca6ec043d3ff36de0f3a715feeedf926"}, + {file = "aiohttp-3.13.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:90455115e5da1c3c51ab619ac57f877da8fd6d73c05aacd125c5ae9819582aba"}, + {file = "aiohttp-3.13.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:042e9e0bcb5fba81886c8b4fbb9a09d6b8a00245fd8d88e4d989c1f96c74164c"}, + {file = "aiohttp-3.13.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2eb752b102b12a76ca02dff751a801f028b4ffbbc478840b473597fc91a9ed43"}, + {file = "aiohttp-3.13.3-cp314-cp314-win32.whl", hash = "sha256:b556c85915d8efaed322bf1bdae9486aa0f3f764195a0fb6ee962e5c71ef5ce1"}, + {file = "aiohttp-3.13.3-cp314-cp314-win_amd64.whl", hash = "sha256:9bf9f7a65e7aa20dd764151fb3d616c81088f91f8df39c3893a536e279b4b984"}, + {file = "aiohttp-3.13.3-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:05861afbbec40650d8a07ea324367cb93e9e8cc7762e04dd4405df99fa65159c"}, + {file = "aiohttp-3.13.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2fc82186fadc4a8316768d61f3722c230e2c1dcab4200d52d2ebdf2482e47592"}, + {file = "aiohttp-3.13.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0add0900ff220d1d5c5ebbf99ed88b0c1bbf87aa7e4262300ed1376a6b13414f"}, + {file = "aiohttp-3.13.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:568f416a4072fbfae453dcf9a99194bbb8bdeab718e08ee13dfa2ba0e4bebf29"}, + {file = "aiohttp-3.13.3-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:add1da70de90a2569c5e15249ff76a631ccacfe198375eead4aadf3b8dc849dc"}, + {file = "aiohttp-3.13.3-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:10b47b7ba335d2e9b1239fa571131a87e2d8ec96b333e68b2a305e7a98b0bae2"}, + {file = "aiohttp-3.13.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3dd4dce1c718e38081c8f35f323209d4c1df7d4db4bab1b5c88a6b4d12b74587"}, + {file = "aiohttp-3.13.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:34bac00a67a812570d4a460447e1e9e06fae622946955f939051e7cc895cfab8"}, + {file = "aiohttp-3.13.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a19884d2ee70b06d9204b2727a7b9f983d0c684c650254679e716b0b77920632"}, + {file = "aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5f8ca7f2bb6ba8348a3614c7918cc4bb73268c5ac2a207576b7afea19d3d9f64"}, + {file = "aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:b0d95340658b9d2f11d9697f59b3814a9d3bb4b7a7c20b131df4bcef464037c0"}, + {file = "aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:a1e53262fd202e4b40b70c3aff944a8155059beedc8a89bba9dc1f9ef06a1b56"}, + {file = "aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:d60ac9663f44168038586cab2157e122e46bdef09e9368b37f2d82d354c23f72"}, + {file = "aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:90751b8eed69435bac9ff4e3d2f6b3af1f57e37ecb0fbeee59c0174c9e2d41df"}, + {file = "aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:fc353029f176fd2b3ec6cfc71be166aba1936fe5d73dd1992ce289ca6647a9aa"}, + {file = "aiohttp-3.13.3-cp314-cp314t-win32.whl", hash = "sha256:2e41b18a58da1e474a057b3d35248d8320029f61d70a37629535b16a0c8f3767"}, + {file = "aiohttp-3.13.3-cp314-cp314t-win_amd64.whl", hash = "sha256:44531a36aa2264a1860089ffd4dce7baf875ee5a6079d5fb42e261c704ef7344"}, + {file = "aiohttp-3.13.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:31a83ea4aead760dfcb6962efb1d861db48c34379f2ff72db9ddddd4cda9ea2e"}, + {file = "aiohttp-3.13.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:988a8c5e317544fdf0d39871559e67b6341065b87fceac641108c2096d5506b7"}, + {file = "aiohttp-3.13.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9b174f267b5cfb9a7dba9ee6859cecd234e9a681841eb85068059bc867fb8f02"}, + {file = "aiohttp-3.13.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:947c26539750deeaee933b000fb6517cc770bbd064bad6033f1cff4803881e43"}, + {file = "aiohttp-3.13.3-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:9ebf57d09e131f5323464bd347135a88622d1c0976e88ce15b670e7ad57e4bd6"}, + {file = "aiohttp-3.13.3-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4ae5b5a0e1926e504c81c5b84353e7a5516d8778fbbff00429fe7b05bb25cbce"}, + {file = "aiohttp-3.13.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2ba0eea45eb5cc3172dbfc497c066f19c41bac70963ea1a67d51fc92e4cf9a80"}, + {file = "aiohttp-3.13.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bae5c2ed2eae26cc382020edad80d01f36cb8e746da40b292e68fec40421dc6a"}, + {file = "aiohttp-3.13.3-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8a60e60746623925eab7d25823329941aee7242d559baa119ca2b253c88a7bd6"}, + {file = "aiohttp-3.13.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e50a2e1404f063427c9d027378472316201a2290959a295169bcf25992d04558"}, + {file = "aiohttp-3.13.3-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:9a9dc347e5a3dc7dfdbc1f82da0ef29e388ddb2ed281bfce9dd8248a313e62b7"}, + {file = "aiohttp-3.13.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:b46020d11d23fe16551466c77823df9cc2f2c1e63cc965daf67fa5eec6ca1877"}, + {file = "aiohttp-3.13.3-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:69c56fbc1993fa17043e24a546959c0178fe2b5782405ad4559e6c13975c15e3"}, + {file = "aiohttp-3.13.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:b99281b0704c103d4e11e72a76f1b543d4946fea7dd10767e7e1b5f00d4e5704"}, + {file = "aiohttp-3.13.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:40c5e40ecc29ba010656c18052b877a1c28f84344825efa106705e835c28530f"}, + {file = "aiohttp-3.13.3-cp39-cp39-win32.whl", hash = "sha256:56339a36b9f1fc708260c76c87e593e2afb30d26de9ae1eb445b5e051b98a7a1"}, + {file = "aiohttp-3.13.3-cp39-cp39-win_amd64.whl", hash = "sha256:c6b8568a3bb5819a0ad087f16d40e5a3fb6099f39ea1d5625a3edc1e923fc538"}, + {file = "aiohttp-3.13.3.tar.gz", hash = "sha256:a949eee43d3782f2daae4f4a2819b2cb9b0c5d3b7f7a927067cc84dafdbb9f88"}, ] [package.dependencies] -aiohappyeyeballs = ">=2.3.0" -aiosignal = ">=1.1.2" +aiohappyeyeballs = ">=2.5.0" +aiosignal = ">=1.4.0" attrs = ">=17.3.0" frozenlist = ">=1.1.1" multidict = ">=4.5,<7.0" @@ -113,22 +152,23 @@ propcache = ">=0.2.0" yarl = ">=1.17.0,<2.0" [package.extras] -speedups = ["Brotli ; platform_python_implementation == \"CPython\"", "aiodns (>=3.2.0) ; sys_platform == \"linux\" or sys_platform == \"darwin\"", "brotlicffi ; platform_python_implementation != \"CPython\""] +speedups = ["Brotli (>=1.2) ; platform_python_implementation == \"CPython\"", "aiodns (>=3.3.0)", "backports.zstd ; platform_python_implementation == \"CPython\" and python_version < \"3.14\"", "brotlicffi (>=1.2) ; platform_python_implementation != \"CPython\""] [[package]] name = "aiosignal" -version = "1.3.2" +version = "1.4.0" description = "aiosignal: a list of registered asynchronous callbacks" optional = false python-versions = ">=3.9" -groups = ["main"] +groups = ["main", "torch-cuda"] files = [ - {file = "aiosignal-1.3.2-py2.py3-none-any.whl", hash = "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5"}, - {file = "aiosignal-1.3.2.tar.gz", hash = "sha256:a8c255c66fafb1e499c9351d0bf32ff2d8a0321595ebac3b93713656d2436f54"}, + {file = "aiosignal-1.4.0-py3-none-any.whl", hash = "sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e"}, + {file = "aiosignal-1.4.0.tar.gz", hash = "sha256:f47eecd9468083c2029cc99945502cb7708b082c232f9aca65da147157b251c7"}, ] [package.dependencies] frozenlist = ">=1.1.0" +typing-extensions = {version = ">=4.2", markers = "python_version < \"3.13\""} [[package]] name = "alabaster" @@ -142,38 +182,47 @@ files = [ {file = "alabaster-1.0.0.tar.gz", hash = "sha256:c00dca57bca26fa62a6d7d0a9fcce65f3e026e9bfe33e9c538fd3fbb2144fd9e"}, ] +[[package]] +name = "annotated-types" +version = "0.7.0" +description = "Reusable constraint types to use with typing.Annotated" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, + {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, +] + [[package]] name = "anyio" -version = "4.9.0" -description = "High level compatibility layer for multiple asynchronous event loop implementations" +version = "4.12.1" +description = "High-level concurrency and networking framework on top of asyncio or Trio" optional = false python-versions = ">=3.9" groups = ["main", "development"] files = [ - {file = "anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c"}, - {file = "anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028"}, + {file = "anyio-4.12.1-py3-none-any.whl", hash = "sha256:d405828884fc140aa80a3c667b8beed277f1dfedec42ba031bd6ac3db606ab6c"}, + {file = "anyio-4.12.1.tar.gz", hash = "sha256:41cfcc3a4c85d3f05c932da7c26d0201ac36f72abd4435ba90d0464a3ffed703"}, ] [package.dependencies] idna = ">=2.8" -sniffio = ">=1.1" typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""} [package.extras] -doc = ["Sphinx (>=8.2,<9.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx_rtd_theme"] -test = ["anyio[trio]", "blockbuster (>=1.5.23)", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "trustme", "truststore (>=0.9.1) ; python_version >= \"3.10\"", "uvloop (>=0.21) ; platform_python_implementation == \"CPython\" and platform_system != \"Windows\" and python_version < \"3.14\""] -trio = ["trio (>=0.26.1)"] +trio = ["trio (>=0.31.0) ; python_version < \"3.10\"", "trio (>=0.32.0) ; python_version >= \"3.10\""] [[package]] name = "argcomplete" -version = "3.6.2" +version = "3.6.3" description = "Bash tab completion for argparse" optional = false python-versions = ">=3.8" groups = ["development"] files = [ - {file = "argcomplete-3.6.2-py3-none-any.whl", hash = "sha256:65b3133a29ad53fb42c48cf5114752c7ab66c1c38544fdf6460f450c09b42591"}, - {file = "argcomplete-3.6.2.tar.gz", hash = "sha256:d0519b1bc867f5f4f4713c41ad0aba73a4a5f007449716b16f385f2166dc6adf"}, + {file = "argcomplete-3.6.3-py3-none-any.whl", hash = "sha256:f5007b3a600ccac5d25bbce33089211dfd49eab4a7718da3f10e3082525a92ce"}, + {file = "argcomplete-3.6.3.tar.gz", hash = "sha256:62e8ed4fd6a45864acc8235409461b72c9a28ee785a2011cc5eb78318786c89c"}, ] [package.extras] @@ -181,34 +230,26 @@ test = ["coverage", "mypy", "pexpect", "ruff", "wheel"] [[package]] name = "attrs" -version = "25.3.0" +version = "25.4.0" description = "Classes Without Boilerplate" optional = false -python-versions = ">=3.8" -groups = ["main", "development"] +python-versions = ">=3.9" +groups = ["main", "development", "torch-cuda"] files = [ - {file = "attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3"}, - {file = "attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b"}, + {file = "attrs-25.4.0-py3-none-any.whl", hash = "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373"}, + {file = "attrs-25.4.0.tar.gz", hash = "sha256:16d5969b87f0859ef33a48b35d55ac1be6e42ae49d5e853b597db70c35c57e11"}, ] -[package.extras] -benchmark = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] -cov = ["cloudpickle ; platform_python_implementation == \"CPython\"", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] -dev = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] -docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier"] -tests = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] -tests-mypy = ["mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\""] - [[package]] name = "babel" -version = "2.17.0" +version = "2.18.0" description = "Internationalization utilities" optional = false python-versions = ">=3.8" groups = ["development"] files = [ - {file = "babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2"}, - {file = "babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d"}, + {file = "babel-2.18.0-py3-none-any.whl", hash = "sha256:e2b422b277c2b9a9630c1d7903c2a00d0830c409c59ac8cae9081c92f1aeba35"}, + {file = "babel-2.18.0.tar.gz", hash = "sha256:b80b99a14bd085fcacfa15c9165f651fbb3406e66cc603abf11c5750937c992d"}, ] [package.extras] @@ -233,14 +274,14 @@ testing = ["jaraco.test", "pytest (!=8.0.*)", "pytest (>=6,!=8.1.*)", "pytest-ch [[package]] name = "bandit" -version = "1.8.3" +version = "1.9.3" description = "Security oriented static analyser for python code." optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["development"] files = [ - {file = "bandit-1.8.3-py3-none-any.whl", hash = "sha256:28f04dc0d258e1dd0f99dee8eefa13d1cb5e3fde1a5ab0c523971f97b289bcd8"}, - {file = "bandit-1.8.3.tar.gz", hash = "sha256:f5847beb654d309422985c36644649924e0ea4425c76dec2e89110b87506193a"}, + {file = "bandit-1.9.3-py3-none-any.whl", hash = "sha256:4745917c88d2246def79748bde5e08b9d5e9b92f877863d43fab70cd8814ce6a"}, + {file = "bandit-1.9.3.tar.gz", hash = "sha256:ade4b9b7786f89ef6fc7344a52b34558caec5da74cb90373aed01de88472f774"}, ] [package.dependencies] @@ -258,42 +299,48 @@ yaml = ["PyYAML"] [[package]] name = "black" -version = "25.1.0" +version = "26.1.0" description = "The uncompromising code formatter." optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["development"] files = [ - {file = "black-25.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:759e7ec1e050a15f89b770cefbf91ebee8917aac5c20483bc2d80a6c3a04df32"}, - {file = "black-25.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e519ecf93120f34243e6b0054db49c00a35f84f195d5bce7e9f5cfc578fc2da"}, - {file = "black-25.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:055e59b198df7ac0b7efca5ad7ff2516bca343276c466be72eb04a3bcc1f82d7"}, - {file = "black-25.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:db8ea9917d6f8fc62abd90d944920d95e73c83a5ee3383493e35d271aca872e9"}, - {file = "black-25.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a39337598244de4bae26475f77dda852ea00a93bd4c728e09eacd827ec929df0"}, - {file = "black-25.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:96c1c7cd856bba8e20094e36e0f948718dc688dba4a9d78c3adde52b9e6c2299"}, - {file = "black-25.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bce2e264d59c91e52d8000d507eb20a9aca4a778731a08cfff7e5ac4a4bb7096"}, - {file = "black-25.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:172b1dbff09f86ce6f4eb8edf9dede08b1fce58ba194c87d7a4f1a5aa2f5b3c2"}, - {file = "black-25.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4b60580e829091e6f9238c848ea6750efed72140b91b048770b64e74fe04908b"}, - {file = "black-25.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e2978f6df243b155ef5fa7e558a43037c3079093ed5d10fd84c43900f2d8ecc"}, - {file = "black-25.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b48735872ec535027d979e8dcb20bf4f70b5ac75a8ea99f127c106a7d7aba9f"}, - {file = "black-25.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:ea0213189960bda9cf99be5b8c8ce66bb054af5e9e861249cd23471bd7b0b3ba"}, - {file = "black-25.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8f0b18a02996a836cc9c9c78e5babec10930862827b1b724ddfe98ccf2f2fe4f"}, - {file = "black-25.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:afebb7098bfbc70037a053b91ae8437c3857482d3a690fefc03e9ff7aa9a5fd3"}, - {file = "black-25.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:030b9759066a4ee5e5aca28c3c77f9c64789cdd4de8ac1df642c40b708be6171"}, - {file = "black-25.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:a22f402b410566e2d1c950708c77ebf5ebd5d0d88a6a2e87c86d9fb48afa0d18"}, - {file = "black-25.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a1ee0a0c330f7b5130ce0caed9936a904793576ef4d2b98c40835d6a65afa6a0"}, - {file = "black-25.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3df5f1bf91d36002b0a75389ca8663510cf0531cca8aa5c1ef695b46d98655f"}, - {file = "black-25.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d9e6827d563a2c820772b32ce8a42828dc6790f095f441beef18f96aa6f8294e"}, - {file = "black-25.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:bacabb307dca5ebaf9c118d2d2f6903da0d62c9faa82bd21a33eecc319559355"}, - {file = "black-25.1.0-py3-none-any.whl", hash = "sha256:95e8176dae143ba9097f351d174fdaf0ccd29efb414b362ae3fd72bf0f710717"}, - {file = "black-25.1.0.tar.gz", hash = "sha256:33496d5cd1222ad73391352b4ae8da15253c5de89b93a80b3e2c8d9a19ec2666"}, + {file = "black-26.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ca699710dece84e3ebf6e92ee15f5b8f72870ef984bf944a57a777a48357c168"}, + {file = "black-26.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5e8e75dabb6eb83d064b0db46392b25cabb6e784ea624219736e8985a6b3675d"}, + {file = "black-26.1.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eb07665d9a907a1a645ee41a0df8a25ffac8ad9c26cdb557b7b88eeeeec934e0"}, + {file = "black-26.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:7ed300200918147c963c87700ccf9966dceaefbbb7277450a8d646fc5646bf24"}, + {file = "black-26.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:c5b7713daea9bf943f79f8c3b46f361cc5229e0e604dcef6a8bb6d1c37d9df89"}, + {file = "black-26.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3cee1487a9e4c640dc7467aaa543d6c0097c391dc8ac74eb313f2fbf9d7a7cb5"}, + {file = "black-26.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d62d14ca31c92adf561ebb2e5f2741bf8dea28aef6deb400d49cca011d186c68"}, + {file = "black-26.1.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fb1dafbbaa3b1ee8b4550a84425aac8874e5f390200f5502cf3aee4a2acb2f14"}, + {file = "black-26.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:101540cb2a77c680f4f80e628ae98bd2bd8812fb9d72ade4f8995c5ff019e82c"}, + {file = "black-26.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:6f3977a16e347f1b115662be07daa93137259c711e526402aa444d7a88fdc9d4"}, + {file = "black-26.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6eeca41e70b5f5c84f2f913af857cf2ce17410847e1d54642e658e078da6544f"}, + {file = "black-26.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:dd39eef053e58e60204f2cdf059e2442e2eb08f15989eefe259870f89614c8b6"}, + {file = "black-26.1.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9459ad0d6cd483eacad4c6566b0f8e42af5e8b583cee917d90ffaa3778420a0a"}, + {file = "black-26.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:a19915ec61f3a8746e8b10adbac4a577c6ba9851fa4a9e9fbfbcf319887a5791"}, + {file = "black-26.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:643d27fb5facc167c0b1b59d0315f2674a6e950341aed0fc05cf307d22bf4954"}, + {file = "black-26.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ba1d768fbfb6930fc93b0ecc32a43d8861ded16f47a40f14afa9bb04ab93d304"}, + {file = "black-26.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2b807c240b64609cb0e80d2200a35b23c7df82259f80bef1b2c96eb422b4aac9"}, + {file = "black-26.1.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1de0f7d01cc894066a1153b738145b194414cc6eeaad8ef4397ac9abacf40f6b"}, + {file = "black-26.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:91a68ae46bf07868963671e4d05611b179c2313301bd756a89ad4e3b3db2325b"}, + {file = "black-26.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:be5e2fe860b9bd9edbf676d5b60a9282994c03fbbd40fe8f5e75d194f96064ca"}, + {file = "black-26.1.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:9dc8c71656a79ca49b8d3e2ce8103210c9481c57798b48deeb3a8bb02db5f115"}, + {file = "black-26.1.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:b22b3810451abe359a964cc88121d57f7bce482b53a066de0f1584988ca36e79"}, + {file = "black-26.1.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:53c62883b3f999f14e5d30b5a79bd437236658ad45b2f853906c7cbe79de00af"}, + {file = "black-26.1.0-cp314-cp314-win_amd64.whl", hash = "sha256:f016baaadc423dc960cdddf9acae679e71ee02c4c341f78f3179d7e4819c095f"}, + {file = "black-26.1.0-cp314-cp314-win_arm64.whl", hash = "sha256:66912475200b67ef5a0ab665011964bf924745103f51977a78b4fb92a9fc1bf0"}, + {file = "black-26.1.0-py3-none-any.whl", hash = "sha256:1054e8e47ebd686e078c0bb0eaf31e6ce69c966058d122f2c0c950311f9f3ede"}, + {file = "black-26.1.0.tar.gz", hash = "sha256:d294ac3340eef9c9eb5d29288e96dc719ff269a88e27b396340459dd85da4c58"}, ] [package.dependencies] click = ">=8.0.0" mypy-extensions = ">=0.4.3" packaging = ">=22.0" -pathspec = ">=0.9.0" +pathspec = ">=1.0.0" platformdirs = ">=2" +pytokens = ">=0.3.0" [package.extras] colorama = ["colorama (>=0.4.3)"] @@ -303,61 +350,59 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "bokeh" -version = "3.4.3" +version = "3.7.3" description = "Interactive plots and applications in the browser from Python" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["main"] files = [ - {file = "bokeh-3.4.3-py3-none-any.whl", hash = "sha256:c6f33817f866fc67fbeb5df79cd13a8bb592c05c591f3fd7f4f22b824f7afa01"}, - {file = "bokeh-3.4.3.tar.gz", hash = "sha256:b7c22fb0f7004b04f12e1b7b26ee0269a26737a08ded848fb58f6a34ec1eb155"}, + {file = "bokeh-3.7.3-py3-none-any.whl", hash = "sha256:b0e79dd737f088865212e4fdcb0f3b95d087f0f088bf8ca186a300ab1641e2c7"}, + {file = "bokeh-3.7.3.tar.gz", hash = "sha256:70a89a9f797b103d5ee6ad15fb7944adda115cf0da996ed0b75cfba61cb12f2b"}, ] [package.dependencies] contourpy = ">=1.2" Jinja2 = ">=2.9" +narwhals = ">=1.13" numpy = ">=1.16" packaging = ">=16.8" pandas = ">=1.2" pillow = ">=7.1.0" PyYAML = ">=3.10" -tornado = ">=6.2" -xyzservices = ">=2021.09.1" +tornado = {version = ">=6.2", markers = "sys_platform != \"emscripten\""} +xyzservices = ">=2021.9.1" [[package]] name = "build" -version = "1.2.2.post1" +version = "1.4.0" description = "A simple, correct Python build frontend" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main", "development"] files = [ - {file = "build-1.2.2.post1-py3-none-any.whl", hash = "sha256:1d61c0887fa860c01971625baae8bdd338e517b836a2f70dd1f7aa3a6b2fc5b5"}, - {file = "build-1.2.2.post1.tar.gz", hash = "sha256:b36993e92ca9375a219c99e606a122ff365a760a2d4bba0caa09bd5278b608b7"}, + {file = "build-1.4.0-py3-none-any.whl", hash = "sha256:6a07c1b8eb6f2b311b96fcbdbce5dab5fe637ffda0fd83c9cac622e927501596"}, + {file = "build-1.4.0.tar.gz", hash = "sha256:f1b91b925aa322be454f8330c6fb48b465da993d1e7e7e6fa35027ec49f3c936"}, ] [package.dependencies] colorama = {version = "*", markers = "os_name == \"nt\""} -packaging = ">=19.1" +packaging = ">=24.0" pyproject_hooks = "*" [package.extras] -docs = ["furo (>=2023.08.17)", "sphinx (>=7.0,<8.0)", "sphinx-argparse-cli (>=1.5)", "sphinx-autodoc-typehints (>=1.10)", "sphinx-issues (>=3.0.0)"] -test = ["build[uv,virtualenv]", "filelock (>=3)", "pytest (>=6.2.4)", "pytest-cov (>=2.12)", "pytest-mock (>=2)", "pytest-rerunfailures (>=9.1)", "pytest-xdist (>=1.34)", "setuptools (>=42.0.0) ; python_version < \"3.10\"", "setuptools (>=56.0.0) ; python_version == \"3.10\"", "setuptools (>=56.0.0) ; python_version == \"3.11\"", "setuptools (>=67.8.0) ; python_version >= \"3.12\"", "wheel (>=0.36.0)"] -typing = ["build[uv]", "importlib-metadata (>=5.1)", "mypy (>=1.9.0,<1.10.0)", "tomli", "typing-extensions (>=3.7.4.3)"] uv = ["uv (>=0.1.18)"] -virtualenv = ["virtualenv (>=20.0.35)"] +virtualenv = ["virtualenv (>=20.11) ; python_version < \"3.10\"", "virtualenv (>=20.17) ; python_version >= \"3.10\" and python_version < \"3.14\"", "virtualenv (>=20.31) ; python_version >= \"3.14\""] [[package]] name = "cachecontrol" -version = "0.14.3" +version = "0.14.4" description = "httplib2 caching for requests" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["main"] files = [ - {file = "cachecontrol-0.14.3-py3-none-any.whl", hash = "sha256:b35e44a3113f17d2a31c1e6b27b9de6d4405f84ae51baa8c1d3cc5b633010cae"}, - {file = "cachecontrol-0.14.3.tar.gz", hash = "sha256:73e7efec4b06b20d9267b441c1f733664f989fb8688391b670ca812d70795d11"}, + {file = "cachecontrol-0.14.4-py3-none-any.whl", hash = "sha256:b7ac014ff72ee199b5f8af1de29d60239954f223e948196fa3d84adaffc71d2b"}, + {file = "cachecontrol-0.14.4.tar.gz", hash = "sha256:e6220afafa4c22a47dd0badb319f84475d79108100d04e26e8542ef7d3ab05a1"}, ] [package.dependencies] @@ -366,215 +411,253 @@ msgpack = ">=0.5.2,<2.0.0" requests = ">=2.16.0" [package.extras] -dev = ["CacheControl[filecache,redis]", "build", "cherrypy", "codespell[tomli]", "furo", "mypy", "pytest", "pytest-cov", "ruff", "sphinx", "sphinx-copybutton", "tox", "types-redis", "types-requests"] +dev = ["cachecontrol[filecache,redis]", "cheroot (>=11.1.2)", "cherrypy", "codespell", "furo", "mypy", "pytest", "pytest-cov", "ruff", "sphinx", "sphinx-copybutton", "types-redis", "types-requests"] filecache = ["filelock (>=3.8.0)"] redis = ["redis (>=2.10.5)"] [[package]] name = "certifi" -version = "2025.4.26" +version = "2026.1.4" description = "Python package for providing Mozilla's CA Bundle." optional = false -python-versions = ">=3.6" -groups = ["main", "development"] +python-versions = ">=3.7" +groups = ["main", "development", "torch-cuda"] files = [ - {file = "certifi-2025.4.26-py3-none-any.whl", hash = "sha256:30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3"}, - {file = "certifi-2025.4.26.tar.gz", hash = "sha256:0a816057ea3cdefcef70270d2c515e4506bbc954f417fa5ade2021213bb8f0c6"}, + {file = "certifi-2026.1.4-py3-none-any.whl", hash = "sha256:9943707519e4add1115f44c2bc244f782c0249876bf51b6599fee1ffbedd685c"}, + {file = "certifi-2026.1.4.tar.gz", hash = "sha256:ac726dd470482006e014ad384921ed6438c457018f4b3d204aea4281258b2120"}, ] [[package]] name = "cffi" -version = "1.17.1" +version = "2.0.0" description = "Foreign Function Interface for Python calling C code." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main"] -markers = "sys_platform == \"linux\" or sys_platform == \"darwin\" or platform_python_implementation == \"PyPy\"" -files = [ - {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, - {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17"}, - {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8"}, - {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e"}, - {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be"}, - {file = "cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c"}, - {file = "cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15"}, - {file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"}, - {file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"}, - {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6"}, - {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f"}, - {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"}, - {file = "cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655"}, - {file = "cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0"}, - {file = "cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4"}, - {file = "cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93"}, - {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3"}, - {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8"}, - {file = "cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65"}, - {file = "cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903"}, - {file = "cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e"}, - {file = "cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd"}, - {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed"}, - {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9"}, - {file = "cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d"}, - {file = "cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a"}, - {file = "cffi-1.17.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1"}, - {file = "cffi-1.17.1-cp38-cp38-win32.whl", hash = "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8"}, - {file = "cffi-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1"}, - {file = "cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16"}, - {file = "cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3"}, - {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595"}, - {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a"}, - {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e"}, - {file = "cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7"}, - {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, - {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, +markers = "(platform_python_implementation != \"PyPy\" or sys_platform == \"darwin\") and (sys_platform == \"linux\" or sys_platform == \"darwin\")" +files = [ + {file = "cffi-2.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44"}, + {file = "cffi-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49"}, + {file = "cffi-2.0.0-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:53f77cbe57044e88bbd5ed26ac1d0514d2acf0591dd6bb02a3ae37f76811b80c"}, + {file = "cffi-2.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3e837e369566884707ddaf85fc1744b47575005c0a229de3327f8f9a20f4efeb"}, + {file = "cffi-2.0.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:5eda85d6d1879e692d546a078b44251cdd08dd1cfb98dfb77b670c97cee49ea0"}, + {file = "cffi-2.0.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9332088d75dc3241c702d852d4671613136d90fa6881da7d770a483fd05248b4"}, + {file = "cffi-2.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc7de24befaeae77ba923797c7c87834c73648a05a4bde34b3b7e5588973a453"}, + {file = "cffi-2.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cf364028c016c03078a23b503f02058f1814320a56ad535686f90565636a9495"}, + {file = "cffi-2.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e11e82b744887154b182fd3e7e8512418446501191994dbf9c9fc1f32cc8efd5"}, + {file = "cffi-2.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8ea985900c5c95ce9db1745f7933eeef5d314f0565b27625d9a10ec9881e1bfb"}, + {file = "cffi-2.0.0-cp310-cp310-win32.whl", hash = "sha256:1f72fb8906754ac8a2cc3f9f5aaa298070652a0ffae577e0ea9bd480dc3c931a"}, + {file = "cffi-2.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:b18a3ed7d5b3bd8d9ef7a8cb226502c6bf8308df1525e1cc676c3680e7176739"}, + {file = "cffi-2.0.0-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe"}, + {file = "cffi-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c"}, + {file = "cffi-2.0.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92"}, + {file = "cffi-2.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93"}, + {file = "cffi-2.0.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5"}, + {file = "cffi-2.0.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664"}, + {file = "cffi-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26"}, + {file = "cffi-2.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9"}, + {file = "cffi-2.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414"}, + {file = "cffi-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743"}, + {file = "cffi-2.0.0-cp311-cp311-win32.whl", hash = "sha256:c649e3a33450ec82378822b3dad03cc228b8f5963c0c12fc3b1e0ab940f768a5"}, + {file = "cffi-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5"}, + {file = "cffi-2.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c6638687455baf640e37344fe26d37c404db8b80d037c3d29f58fe8d1c3b194d"}, + {file = "cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d"}, + {file = "cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c"}, + {file = "cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe"}, + {file = "cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062"}, + {file = "cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e"}, + {file = "cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037"}, + {file = "cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba"}, + {file = "cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94"}, + {file = "cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187"}, + {file = "cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18"}, + {file = "cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5"}, + {file = "cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6"}, + {file = "cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb"}, + {file = "cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca"}, + {file = "cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b"}, + {file = "cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b"}, + {file = "cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2"}, + {file = "cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3"}, + {file = "cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26"}, + {file = "cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c"}, + {file = "cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b"}, + {file = "cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27"}, + {file = "cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75"}, + {file = "cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91"}, + {file = "cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5"}, + {file = "cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13"}, + {file = "cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b"}, + {file = "cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c"}, + {file = "cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef"}, + {file = "cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775"}, + {file = "cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205"}, + {file = "cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1"}, + {file = "cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f"}, + {file = "cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25"}, + {file = "cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad"}, + {file = "cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9"}, + {file = "cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d"}, + {file = "cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c"}, + {file = "cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8"}, + {file = "cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc"}, + {file = "cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592"}, + {file = "cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512"}, + {file = "cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4"}, + {file = "cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e"}, + {file = "cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6"}, + {file = "cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9"}, + {file = "cffi-2.0.0-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:fe562eb1a64e67dd297ccc4f5addea2501664954f2692b69a76449ec7913ecbf"}, + {file = "cffi-2.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:de8dad4425a6ca6e4e5e297b27b5c824ecc7581910bf9aee86cb6835e6812aa7"}, + {file = "cffi-2.0.0-cp39-cp39-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:4647afc2f90d1ddd33441e5b0e85b16b12ddec4fca55f0d9671fef036ecca27c"}, + {file = "cffi-2.0.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3f4d46d8b35698056ec29bca21546e1551a205058ae1a181d871e278b0b28165"}, + {file = "cffi-2.0.0-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:e6e73b9e02893c764e7e8d5bb5ce277f1a009cd5243f8228f75f842bf937c534"}, + {file = "cffi-2.0.0-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:cb527a79772e5ef98fb1d700678fe031e353e765d1ca2d409c92263c6d43e09f"}, + {file = "cffi-2.0.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:61d028e90346df14fedc3d1e5441df818d095f3b87d286825dfcbd6459b7ef63"}, + {file = "cffi-2.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0f6084a0ea23d05d20c3edcda20c3d006f9b6f3fefeac38f59262e10cef47ee2"}, + {file = "cffi-2.0.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1cd13c99ce269b3ed80b417dcd591415d3372bcac067009b6e0f59c7d4015e65"}, + {file = "cffi-2.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:89472c9762729b5ae1ad974b777416bfda4ac5642423fa93bd57a09204712322"}, + {file = "cffi-2.0.0-cp39-cp39-win32.whl", hash = "sha256:2081580ebb843f759b9f617314a24ed5738c51d2aee65d31e02f6f7a2b97707a"}, + {file = "cffi-2.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:b882b3df248017dba09d6b16defe9b5c407fe32fc7c65a9c69798e6175601be9"}, + {file = "cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529"}, ] [package.dependencies] -pycparser = "*" +pycparser = {version = "*", markers = "implementation_name != \"PyPy\""} [[package]] name = "cfgv" -version = "3.4.0" +version = "3.5.0" description = "Validate configuration and produce human readable error messages." optional = false -python-versions = ">=3.8" +python-versions = ">=3.10" groups = ["development"] files = [ - {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, - {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, + {file = "cfgv-3.5.0-py2.py3-none-any.whl", hash = "sha256:a8dc6b26ad22ff227d2634a65cb388215ce6cc96bbcc5cfde7641ae87e8dacc0"}, + {file = "cfgv-3.5.0.tar.gz", hash = "sha256:d5b1034354820651caa73ede66a6294d6e95c1b00acc5e9b098e917404669132"}, ] [[package]] name = "charset-normalizer" -version = "3.4.2" +version = "3.4.4" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7" -groups = ["main", "development"] -files = [ - {file = "charset_normalizer-3.4.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c48ed483eb946e6c04ccbe02c6b4d1d48e51944b6db70f697e089c193404941"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2d318c11350e10662026ad0eb71bb51c7812fc8590825304ae0bdd4ac283acd"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9cbfacf36cb0ec2897ce0ebc5d08ca44213af24265bd56eca54bee7923c48fd6"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18dd2e350387c87dabe711b86f83c9c78af772c748904d372ade190b5c7c9d4d"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8075c35cd58273fee266c58c0c9b670947c19df5fb98e7b66710e04ad4e9ff86"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5bf4545e3b962767e5c06fe1738f951f77d27967cb2caa64c28be7c4563e162c"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7a6ab32f7210554a96cd9e33abe3ddd86732beeafc7a28e9955cdf22ffadbab0"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b33de11b92e9f75a2b545d6e9b6f37e398d86c3e9e9653c4864eb7e89c5773ef"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8755483f3c00d6c9a77f490c17e6ab0c8729e39e6390328e42521ef175380ae6"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:68a328e5f55ec37c57f19ebb1fdc56a248db2e3e9ad769919a58672958e8f366"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:21b2899062867b0e1fde9b724f8aecb1af14f2778d69aacd1a5a1853a597a5db"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-win32.whl", hash = "sha256:e8082b26888e2f8b36a042a58307d5b917ef2b1cacab921ad3323ef91901c71a"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:f69a27e45c43520f5487f27627059b64aaf160415589230992cec34c5e18a509"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-win32.whl", hash = "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-win32.whl", hash = "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-win32.whl", hash = "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cad5f45b3146325bb38d6855642f6fd609c3f7cad4dbaf75549bf3b904d3184"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2680962a4848b3c4f155dc2ee64505a9c57186d0d56b43123b17ca3de18f0fa"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:36b31da18b8890a76ec181c3cf44326bf2c48e36d393ca1b72b3f484113ea344"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f4074c5a429281bf056ddd4c5d3b740ebca4d43ffffe2ef4bf4d2d05114299da"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9e36a97bee9b86ef9a1cf7bb96747eb7a15c2f22bdb5b516434b00f2a599f02"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:1b1bde144d98e446b056ef98e59c256e9294f6b74d7af6846bf5ffdafd687a7d"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:915f3849a011c1f593ab99092f3cecfcb4d65d8feb4a64cf1bf2d22074dc0ec4"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:fb707f3e15060adf5b7ada797624a6c6e0138e2a26baa089df64c68ee98e040f"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:25a23ea5c7edc53e0f29bae2c44fcb5a1aa10591aae107f2a2b2583a9c5cbc64"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:770cab594ecf99ae64c236bc9ee3439c3f46be49796e265ce0cc8bc17b10294f"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-win32.whl", hash = "sha256:6a0289e4589e8bdfef02a80478f1dfcb14f0ab696b5a00e1f4b8a14a307a3c58"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6fc1f5b51fa4cecaa18f2bd7a003f3dd039dd615cd69a2afd6d3b19aed6775f2"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:76af085e67e56c8816c3ccf256ebd136def2ed9654525348cfa744b6802b69eb"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e45ba65510e2647721e35323d6ef54c7974959f6081b58d4ef5d87c60c84919a"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:046595208aae0120559a67693ecc65dd75d46f7bf687f159127046628178dc45"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75d10d37a47afee94919c4fab4c22b9bc2a8bf7d4f46f87363bcf0573f3ff4f5"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6333b3aa5a12c26b2a4d4e7335a28f1475e0e5e17d69d55141ee3cab736f66d1"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e8323a9b031aa0393768b87f04b4164a40037fb2a3c11ac06a03ffecd3618027"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:24498ba8ed6c2e0b56d4acbf83f2d989720a93b41d712ebd4f4979660db4417b"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:844da2b5728b5ce0e32d863af26f32b5ce61bc4273a9c720a9f3aa9df73b1455"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:65c981bdbd3f57670af8b59777cbfae75364b483fa8a9f420f08094531d54a01"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:3c21d4fca343c805a52c0c78edc01e3477f6dd1ad7c47653241cf2a206d4fc58"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:dc7039885fa1baf9be153a0626e337aa7ec8bf96b0128605fb0d77788ddc1681"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-win32.whl", hash = "sha256:8272b73e1c5603666618805fe821edba66892e2870058c94c53147602eab29c7"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:70f7172939fdf8790425ba31915bfbe8335030f05b9913d7ae00a87d4395620a"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:005fa3432484527f9732ebd315da8da8001593e2cf46a3d817669f062c3d9ed4"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e92fca20c46e9f5e1bb485887d074918b13543b1c2a1185e69bb8d17ab6236a7"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50bf98d5e563b83cc29471fa114366e6806bc06bc7a25fd59641e41445327836"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:721c76e84fe669be19c5791da68232ca2e05ba5185575086e384352e2c309597"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82d8fd25b7f4675d0c47cf95b594d4e7b158aca33b76aa63d07186e13c0e0ab7"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3daeac64d5b371dea99714f08ffc2c208522ec6b06fbc7866a450dd446f5c0f"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dccab8d5fa1ef9bfba0590ecf4d46df048d18ffe3eec01eeb73a42e0d9e7a8ba"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:aaf27faa992bfee0264dc1f03f4c75e9fcdda66a519db6b957a3f826e285cf12"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:eb30abc20df9ab0814b5a2524f23d75dcf83cde762c161917a2b4b7b55b1e518"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:c72fbbe68c6f32f251bdc08b8611c7b3060612236e960ef848e0a517ddbe76c5"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:982bb1e8b4ffda883b3d0a521e23abcd6fd17418f6d2c4118d257a10199c0ce3"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-win32.whl", hash = "sha256:43e0933a0eff183ee85833f341ec567c0980dae57c464d8a508e1b2ceb336471"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:d11b54acf878eef558599658b0ffca78138c8c3655cf4f3a4a673c437e67732e"}, - {file = "charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0"}, - {file = "charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63"}, +groups = ["main", "development", "torch-cuda"] +files = [ + {file = "charset_normalizer-3.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e824f1492727fa856dd6eda4f7cee25f8518a12f3c4a56a74e8095695089cf6d"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4bd5d4137d500351a30687c2d3971758aac9a19208fc110ccb9d7188fbe709e8"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:027f6de494925c0ab2a55eab46ae5129951638a49a34d87f4c3eda90f696b4ad"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f820802628d2694cb7e56db99213f930856014862f3fd943d290ea8438d07ca8"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:798d75d81754988d2565bff1b97ba5a44411867c0cf32b77a7e8f8d84796b10d"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d1bb833febdff5c8927f922386db610b49db6e0d4f4ee29601d71e7c2694313"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9cd98cdc06614a2f768d2b7286d66805f94c48cde050acdbbb7db2600ab3197e"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:077fbb858e903c73f6c9db43374fd213b0b6a778106bc7032446a8e8b5b38b93"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:244bfb999c71b35de57821b8ea746b24e863398194a4014e4c76adc2bbdfeff0"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:64b55f9dce520635f018f907ff1b0df1fdc31f2795a922fb49dd14fbcdf48c84"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:faa3a41b2b66b6e50f84ae4a68c64fcd0c44355741c6374813a800cd6695db9e"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6515f3182dbe4ea06ced2d9e8666d97b46ef4c75e326b79bb624110f122551db"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cc00f04ed596e9dc0da42ed17ac5e596c6ccba999ba6bd92b0e0aef2f170f2d6"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-win32.whl", hash = "sha256:f34be2938726fc13801220747472850852fe6b1ea75869a048d6f896838c896f"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:a61900df84c667873b292c3de315a786dd8dac506704dea57bc957bd31e22c7d"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-win_arm64.whl", hash = "sha256:cead0978fc57397645f12578bfd2d5ea9138ea0fac82b2f63f7f7c6877986a69"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f819d5fe9234f9f82d75bdfa9aef3a3d72c4d24a6e57aeaebba32a704553aa0"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a59cb51917aa591b1c4e6a43c132f0cdc3c76dbad6155df4e28ee626cc77a0a3"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ef3c867360f88ac904fd3f5e1f902f13307af9052646963ee08ff4f131adafc"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d9e45d7faa48ee908174d8fe84854479ef838fc6a705c9315372eacbc2f02897"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:840c25fb618a231545cbab0564a799f101b63b9901f2569faecd6b222ac72381"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ca5862d5b3928c4940729dacc329aa9102900382fea192fc5e52eb69d6093815"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9c7f57c3d666a53421049053eaacdd14bbd0a528e2186fcb2e672effd053bb0"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:277e970e750505ed74c832b4bf75dac7476262ee2a013f5574dd49075879e161"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:31fd66405eaf47bb62e8cd575dc621c56c668f27d46a61d975a249930dd5e2a4"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:0d3d8f15c07f86e9ff82319b3d9ef6f4bf907608f53fe9d92b28ea9ae3d1fd89"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9f7fcd74d410a36883701fafa2482a6af2ff5ba96b9a620e9e0721e28ead5569"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ebf3e58c7ec8a8bed6d66a75d7fb37b55e5015b03ceae72a8e7c74495551e224"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-win32.whl", hash = "sha256:eecbc200c7fd5ddb9a7f16c7decb07b566c29fa2161a16cf67b8d068bd21690a"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:5ae497466c7901d54b639cf42d5b8c1b6a4fead55215500d2f486d34db48d016"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:65e2befcd84bc6f37095f5961e68a6f077bf44946771354a28ad434c2cce0ae1"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-win32.whl", hash = "sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-win32.whl", hash = "sha256:9b35f4c90079ff2e2edc5b26c0c77925e5d2d255c42c74fdb70fb49b172726ac"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:542d2cee80be6f80247095cc36c418f7bddd14f4a6de45af91dfad36d817bba2"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-win32.whl", hash = "sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ce8a0633f41a967713a59c4139d29110c07e826d131a316b50ce11b1d79b4f84"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eaabd426fe94daf8fd157c32e571c85cb12e66692f15516a83a03264b08d06c3"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c4ef880e27901b6cc782f1b95f82da9313c0eb95c3af699103088fa0ac3ce9ac"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2aaba3b0819274cc41757a1da876f810a3e4d7b6eb25699253a4effef9e8e4af"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:778d2e08eda00f4256d7f672ca9fef386071c9202f5e4607920b86d7803387f2"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f155a433c2ec037d4e8df17d18922c3a0d9b3232a396690f17175d2946f0218d"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a8bf8d0f749c5757af2142fe7903a9df1d2e8aa3841559b2bad34b08d0e2bcf3"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:194f08cbb32dc406d6e1aea671a68be0823673db2832b38405deba2fb0d88f63"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:6aee717dcfead04c6eb1ce3bd29ac1e22663cdea57f943c87d1eab9a025438d7"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:cd4b7ca9984e5e7985c12bc60a6f173f3c958eae74f3ef6624bb6b26e2abbae4"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_riscv64.whl", hash = "sha256:b7cf1017d601aa35e6bb650b6ad28652c9cd78ee6caff19f3c28d03e1c80acbf"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:e912091979546adf63357d7e2ccff9b44f026c075aeaf25a52d0e95ad2281074"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:5cb4d72eea50c8868f5288b7f7f33ed276118325c1dfd3957089f6b519e1382a"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-win32.whl", hash = "sha256:837c2ce8c5a65a2035be9b3569c684358dfbf109fd3b6969630a87535495ceaa"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:44c2a8734b333e0578090c4cd6b16f275e07aa6614ca8715e6c038e865e70576"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a9768c477b9d7bd54bc0c86dbaebdec6f03306675526c9927c0e8a04e8f94af9"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1bee1e43c28aa63cb16e5c14e582580546b08e535299b8b6158a7c9c768a1f3d"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:fd44c878ea55ba351104cb93cc85e74916eb8fa440ca7903e57575e97394f608"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0f04b14ffe5fdc8c4933862d8306109a2c51e0704acfa35d51598eb45a1e89fc"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:cd09d08005f958f370f539f186d10aec3377d55b9eeb0d796025d4886119d76e"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4fe7859a4e3e8457458e2ff592f15ccb02f3da787fcd31e0183879c3ad4692a1"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fa09f53c465e532f4d3db095e0c55b615f010ad81803d383195b6b5ca6cbf5f3"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7fa17817dc5625de8a027cb8b26d9fefa3ea28c8253929b8d6649e705d2835b6"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:5947809c8a2417be3267efc979c47d76a079758166f7d43ef5ae8e9f92751f88"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:4902828217069c3c5c71094537a8e623f5d097858ac6ca8252f7b4d10b7560f1"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:7c308f7e26e4363d79df40ca5b2be1c6ba9f02bdbccfed5abddb7859a6ce72cf"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:2c9d3c380143a1fedbff95a312aa798578371eb29da42106a29019368a475318"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cb01158d8b88ee68f15949894ccc6712278243d95f344770fa7593fa2d94410c"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-win32.whl", hash = "sha256:2677acec1a2f8ef614c6888b5b4ae4060cc184174a938ed4e8ef690e15d3e505"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:f8e160feb2aed042cd657a72acc0b481212ed28b1b9a95c0cee1621b524e1966"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-win_arm64.whl", hash = "sha256:b5d84d37db046c5ca74ee7bb47dd6cbc13f80665fdde3e8040bdd3fb015ecb50"}, + {file = "charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f"}, + {file = "charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a"}, ] [[package]] @@ -595,14 +678,14 @@ rapidfuzz = ">=3.0.0,<4.0.0" [[package]] name = "click" -version = "8.1.8" +version = "8.3.1" description = "Composable command line interface toolkit" optional = false -python-versions = ">=3.7" -groups = ["development"] +python-versions = ">=3.10" +groups = ["main", "development"] files = [ - {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, - {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"}, + {file = "click-8.3.1-py3-none-any.whl", hash = "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6"}, + {file = "click-8.3.1.tar.gz", hash = "sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a"}, ] [package.dependencies] @@ -614,23 +697,23 @@ version = "0.4.6" description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -groups = ["main", "development"] +groups = ["main", "development", "torch-cuda"] files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] -markers = {main = "platform_system == \"Windows\" or sys_platform == \"win32\" or os_name == \"nt\""} +markers = {main = "platform_system == \"Windows\" or sys_platform == \"win32\" or os_name == \"nt\"", torch-cuda = "platform_system == \"Windows\""} [[package]] name = "colorlog" -version = "6.9.0" +version = "6.10.1" description = "Add colours to the output of Python's logging module." optional = false python-versions = ">=3.6" groups = ["development"] files = [ - {file = "colorlog-6.9.0-py3-none-any.whl", hash = "sha256:5906e71acd67cb07a71e779c47c4bcb45fb8c2993eebe9e5adcd6a6f1b283eff"}, - {file = "colorlog-6.9.0.tar.gz", hash = "sha256:bfba54a1b93b94f54e1f4fe48395725a3d92fd2a4af702f6bd70946bdc0c6ac2"}, + {file = "colorlog-6.10.1-py3-none-any.whl", hash = "sha256:2d7e8348291948af66122cff006c9f8da6255d224e7cf8e37d8de2df3bad8c9c"}, + {file = "colorlog-6.10.1.tar.gz", hash = "sha256:eb4ae5cb65fe7fec7773c2306061a8e63e02efc2c72eba9d27b0fa23c94f1321"}, ] [package.dependencies] @@ -641,78 +724,93 @@ development = ["black", "flake8", "mypy", "pytest", "types-colorama"] [[package]] name = "contourpy" -version = "1.3.2" +version = "1.3.3" description = "Python library for calculating contours of 2D quadrilateral grids" optional = false -python-versions = ">=3.10" +python-versions = ">=3.11" groups = ["main"] files = [ - {file = "contourpy-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ba38e3f9f330af820c4b27ceb4b9c7feee5fe0493ea53a8720f4792667465934"}, - {file = "contourpy-1.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dc41ba0714aa2968d1f8674ec97504a8f7e334f48eeacebcaa6256213acb0989"}, - {file = "contourpy-1.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9be002b31c558d1ddf1b9b415b162c603405414bacd6932d031c5b5a8b757f0d"}, - {file = "contourpy-1.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8d2e74acbcba3bfdb6d9d8384cdc4f9260cae86ed9beee8bd5f54fee49a430b9"}, - {file = "contourpy-1.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e259bced5549ac64410162adc973c5e2fb77f04df4a439d00b478e57a0e65512"}, - {file = "contourpy-1.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad687a04bc802cbe8b9c399c07162a3c35e227e2daccf1668eb1f278cb698631"}, - {file = "contourpy-1.3.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cdd22595308f53ef2f891040ab2b93d79192513ffccbd7fe19be7aa773a5e09f"}, - {file = "contourpy-1.3.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b4f54d6a2defe9f257327b0f243612dd051cc43825587520b1bf74a31e2f6ef2"}, - {file = "contourpy-1.3.2-cp310-cp310-win32.whl", hash = "sha256:f939a054192ddc596e031e50bb13b657ce318cf13d264f095ce9db7dc6ae81c0"}, - {file = "contourpy-1.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:c440093bbc8fc21c637c03bafcbef95ccd963bc6e0514ad887932c18ca2a759a"}, - {file = "contourpy-1.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6a37a2fb93d4df3fc4c0e363ea4d16f83195fc09c891bc8ce072b9d084853445"}, - {file = "contourpy-1.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b7cd50c38f500bbcc9b6a46643a40e0913673f869315d8e70de0438817cb7773"}, - {file = "contourpy-1.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6658ccc7251a4433eebd89ed2672c2ed96fba367fd25ca9512aa92a4b46c4f1"}, - {file = "contourpy-1.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:70771a461aaeb335df14deb6c97439973d253ae70660ca085eec25241137ef43"}, - {file = "contourpy-1.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65a887a6e8c4cd0897507d814b14c54a8c2e2aa4ac9f7686292f9769fcf9a6ab"}, - {file = "contourpy-1.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3859783aefa2b8355697f16642695a5b9792e7a46ab86da1118a4a23a51a33d7"}, - {file = "contourpy-1.3.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:eab0f6db315fa4d70f1d8ab514e527f0366ec021ff853d7ed6a2d33605cf4b83"}, - {file = "contourpy-1.3.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d91a3ccc7fea94ca0acab82ceb77f396d50a1f67412efe4c526f5d20264e6ecd"}, - {file = "contourpy-1.3.2-cp311-cp311-win32.whl", hash = "sha256:1c48188778d4d2f3d48e4643fb15d8608b1d01e4b4d6b0548d9b336c28fc9b6f"}, - {file = "contourpy-1.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:5ebac872ba09cb8f2131c46b8739a7ff71de28a24c869bcad554477eb089a878"}, - {file = "contourpy-1.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4caf2bcd2969402bf77edc4cb6034c7dd7c0803213b3523f111eb7460a51b8d2"}, - {file = "contourpy-1.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:82199cb78276249796419fe36b7386bd8d2cc3f28b3bc19fe2454fe2e26c4c15"}, - {file = "contourpy-1.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:106fab697af11456fcba3e352ad50effe493a90f893fca6c2ca5c033820cea92"}, - {file = "contourpy-1.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d14f12932a8d620e307f715857107b1d1845cc44fdb5da2bc8e850f5ceba9f87"}, - {file = "contourpy-1.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:532fd26e715560721bb0d5fc7610fce279b3699b018600ab999d1be895b09415"}, - {file = "contourpy-1.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b383144cf2d2c29f01a1e8170f50dacf0eac02d64139dcd709a8ac4eb3cfe"}, - {file = "contourpy-1.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c49f73e61f1f774650a55d221803b101d966ca0c5a2d6d5e4320ec3997489441"}, - {file = "contourpy-1.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3d80b2c0300583228ac98d0a927a1ba6a2ba6b8a742463c564f1d419ee5b211e"}, - {file = "contourpy-1.3.2-cp312-cp312-win32.whl", hash = "sha256:90df94c89a91b7362e1142cbee7568f86514412ab8a2c0d0fca72d7e91b62912"}, - {file = "contourpy-1.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:8c942a01d9163e2e5cfb05cb66110121b8d07ad438a17f9e766317bcb62abf73"}, - {file = "contourpy-1.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:de39db2604ae755316cb5967728f4bea92685884b1e767b7c24e983ef5f771cb"}, - {file = "contourpy-1.3.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3f9e896f447c5c8618f1edb2bafa9a4030f22a575ec418ad70611450720b5b08"}, - {file = "contourpy-1.3.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71e2bd4a1c4188f5c2b8d274da78faab884b59df20df63c34f74aa1813c4427c"}, - {file = "contourpy-1.3.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de425af81b6cea33101ae95ece1f696af39446db9682a0b56daaa48cfc29f38f"}, - {file = "contourpy-1.3.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:977e98a0e0480d3fe292246417239d2d45435904afd6d7332d8455981c408b85"}, - {file = "contourpy-1.3.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:434f0adf84911c924519d2b08fc10491dd282b20bdd3fa8f60fd816ea0b48841"}, - {file = "contourpy-1.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c66c4906cdbc50e9cba65978823e6e00b45682eb09adbb78c9775b74eb222422"}, - {file = "contourpy-1.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8b7fc0cd78ba2f4695fd0a6ad81a19e7e3ab825c31b577f384aa9d7817dc3bef"}, - {file = "contourpy-1.3.2-cp313-cp313-win32.whl", hash = "sha256:15ce6ab60957ca74cff444fe66d9045c1fd3e92c8936894ebd1f3eef2fff075f"}, - {file = "contourpy-1.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:e1578f7eafce927b168752ed7e22646dad6cd9bca673c60bff55889fa236ebf9"}, - {file = "contourpy-1.3.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0475b1f6604896bc7c53bb070e355e9321e1bc0d381735421a2d2068ec56531f"}, - {file = "contourpy-1.3.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c85bb486e9be652314bb5b9e2e3b0d1b2e643d5eec4992c0fbe8ac71775da739"}, - {file = "contourpy-1.3.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:745b57db7758f3ffc05a10254edd3182a2a83402a89c00957a8e8a22f5582823"}, - {file = "contourpy-1.3.2-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:970e9173dbd7eba9b4e01aab19215a48ee5dd3f43cef736eebde064a171f89a5"}, - {file = "contourpy-1.3.2-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6c4639a9c22230276b7bffb6a850dfc8258a2521305e1faefe804d006b2e532"}, - {file = "contourpy-1.3.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc829960f34ba36aad4302e78eabf3ef16a3a100863f0d4eeddf30e8a485a03b"}, - {file = "contourpy-1.3.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d32530b534e986374fc19eaa77fcb87e8a99e5431499949b828312bdcd20ac52"}, - {file = "contourpy-1.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e298e7e70cf4eb179cc1077be1c725b5fd131ebc81181bf0c03525c8abc297fd"}, - {file = "contourpy-1.3.2-cp313-cp313t-win32.whl", hash = "sha256:d0e589ae0d55204991450bb5c23f571c64fe43adaa53f93fc902a84c96f52fe1"}, - {file = "contourpy-1.3.2-cp313-cp313t-win_amd64.whl", hash = "sha256:78e9253c3de756b3f6a5174d024c4835acd59eb3f8e2ca13e775dbffe1558f69"}, - {file = "contourpy-1.3.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fd93cc7f3139b6dd7aab2f26a90dde0aa9fc264dbf70f6740d498a70b860b82c"}, - {file = "contourpy-1.3.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:107ba8a6a7eec58bb475329e6d3b95deba9440667c4d62b9b6063942b61d7f16"}, - {file = "contourpy-1.3.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ded1706ed0c1049224531b81128efbd5084598f18d8a2d9efae833edbd2b40ad"}, - {file = "contourpy-1.3.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5f5964cdad279256c084b69c3f412b7801e15356b16efa9d78aa974041903da0"}, - {file = "contourpy-1.3.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49b65a95d642d4efa8f64ba12558fcb83407e58a2dfba9d796d77b63ccfcaff5"}, - {file = "contourpy-1.3.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:8c5acb8dddb0752bf252e01a3035b21443158910ac16a3b0d20e7fed7d534ce5"}, - {file = "contourpy-1.3.2.tar.gz", hash = "sha256:b6945942715a034c671b7fc54f9588126b0b8bf23db2696e3ca8328f3ff0ab54"}, + {file = "contourpy-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:709a48ef9a690e1343202916450bc48b9e51c049b089c7f79a267b46cffcdaa1"}, + {file = "contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:23416f38bfd74d5d28ab8429cc4d63fa67d5068bd711a85edb1c3fb0c3e2f381"}, + {file = "contourpy-1.3.3-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:929ddf8c4c7f348e4c0a5a3a714b5c8542ffaa8c22954862a46ca1813b667ee7"}, + {file = "contourpy-1.3.3-cp311-cp311-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9e999574eddae35f1312c2b4b717b7885d4edd6cb46700e04f7f02db454e67c1"}, + {file = "contourpy-1.3.3-cp311-cp311-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0bf67e0e3f482cb69779dd3061b534eb35ac9b17f163d851e2a547d56dba0a3a"}, + {file = "contourpy-1.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:51e79c1f7470158e838808d4a996fa9bac72c498e93d8ebe5119bc1e6becb0db"}, + {file = "contourpy-1.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:598c3aaece21c503615fd59c92a3598b428b2f01bfb4b8ca9c4edeecc2438620"}, + {file = "contourpy-1.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:322ab1c99b008dad206d406bb61d014cf0174df491ae9d9d0fac6a6fda4f977f"}, + {file = "contourpy-1.3.3-cp311-cp311-win32.whl", hash = "sha256:fd907ae12cd483cd83e414b12941c632a969171bf90fc937d0c9f268a31cafff"}, + {file = "contourpy-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:3519428f6be58431c56581f1694ba8e50626f2dd550af225f82fb5f5814d2a42"}, + {file = "contourpy-1.3.3-cp311-cp311-win_arm64.whl", hash = "sha256:15ff10bfada4bf92ec8b31c62bf7c1834c244019b4a33095a68000d7075df470"}, + {file = "contourpy-1.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b08a32ea2f8e42cf1d4be3169a98dd4be32bafe4f22b6c4cb4ba810fa9e5d2cb"}, + {file = "contourpy-1.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:556dba8fb6f5d8742f2923fe9457dbdd51e1049c4a43fd3986a0b14a1d815fc6"}, + {file = "contourpy-1.3.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92d9abc807cf7d0e047b95ca5d957cf4792fcd04e920ca70d48add15c1a90ea7"}, + {file = "contourpy-1.3.3-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b2e8faa0ed68cb29af51edd8e24798bb661eac3bd9f65420c1887b6ca89987c8"}, + {file = "contourpy-1.3.3-cp312-cp312-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:626d60935cf668e70a5ce6ff184fd713e9683fb458898e4249b63be9e28286ea"}, + {file = "contourpy-1.3.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d00e655fcef08aba35ec9610536bfe90267d7ab5ba944f7032549c55a146da1"}, + {file = "contourpy-1.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:451e71b5a7d597379ef572de31eeb909a87246974d960049a9848c3bc6c41bf7"}, + {file = "contourpy-1.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:459c1f020cd59fcfe6650180678a9993932d80d44ccde1fa1868977438f0b411"}, + {file = "contourpy-1.3.3-cp312-cp312-win32.whl", hash = "sha256:023b44101dfe49d7d53932be418477dba359649246075c996866106da069af69"}, + {file = "contourpy-1.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:8153b8bfc11e1e4d75bcb0bff1db232f9e10b274e0929de9d608027e0d34ff8b"}, + {file = "contourpy-1.3.3-cp312-cp312-win_arm64.whl", hash = "sha256:07ce5ed73ecdc4a03ffe3e1b3e3c1166db35ae7584be76f65dbbe28a7791b0cc"}, + {file = "contourpy-1.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:177fb367556747a686509d6fef71d221a4b198a3905fe824430e5ea0fda54eb5"}, + {file = "contourpy-1.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d002b6f00d73d69333dac9d0b8d5e84d9724ff9ef044fd63c5986e62b7c9e1b1"}, + {file = "contourpy-1.3.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:348ac1f5d4f1d66d3322420f01d42e43122f43616e0f194fc1c9f5d830c5b286"}, + {file = "contourpy-1.3.3-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:655456777ff65c2c548b7c454af9c6f33f16c8884f11083244b5819cc214f1b5"}, + {file = "contourpy-1.3.3-cp313-cp313-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:644a6853d15b2512d67881586bd03f462c7ab755db95f16f14d7e238f2852c67"}, + {file = "contourpy-1.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4debd64f124ca62069f313a9cb86656ff087786016d76927ae2cf37846b006c9"}, + {file = "contourpy-1.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a15459b0f4615b00bbd1e91f1b9e19b7e63aea7483d03d804186f278c0af2659"}, + {file = "contourpy-1.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ca0fdcd73925568ca027e0b17ab07aad764be4706d0a925b89227e447d9737b7"}, + {file = "contourpy-1.3.3-cp313-cp313-win32.whl", hash = "sha256:b20c7c9a3bf701366556e1b1984ed2d0cedf999903c51311417cf5f591d8c78d"}, + {file = "contourpy-1.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:1cadd8b8969f060ba45ed7c1b714fe69185812ab43bd6b86a9123fe8f99c3263"}, + {file = "contourpy-1.3.3-cp313-cp313-win_arm64.whl", hash = "sha256:fd914713266421b7536de2bfa8181aa8c699432b6763a0ea64195ebe28bff6a9"}, + {file = "contourpy-1.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:88df9880d507169449d434c293467418b9f6cbe82edd19284aa0409e7fdb933d"}, + {file = "contourpy-1.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d06bb1f751ba5d417047db62bca3c8fde202b8c11fb50742ab3ab962c81e8216"}, + {file = "contourpy-1.3.3-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e4e6b05a45525357e382909a4c1600444e2a45b4795163d3b22669285591c1ae"}, + {file = "contourpy-1.3.3-cp313-cp313t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ab3074b48c4e2cf1a960e6bbeb7f04566bf36b1861d5c9d4d8ac04b82e38ba20"}, + {file = "contourpy-1.3.3-cp313-cp313t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c3d53c796f8647d6deb1abe867daeb66dcc8a97e8455efa729516b997b8ed99"}, + {file = "contourpy-1.3.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50ed930df7289ff2a8d7afeb9603f8289e5704755c7e5c3bbd929c90c817164b"}, + {file = "contourpy-1.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4feffb6537d64b84877da813a5c30f1422ea5739566abf0bd18065ac040e120a"}, + {file = "contourpy-1.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2b7e9480ffe2b0cd2e787e4df64270e3a0440d9db8dc823312e2c940c167df7e"}, + {file = "contourpy-1.3.3-cp313-cp313t-win32.whl", hash = "sha256:283edd842a01e3dcd435b1c5116798d661378d83d36d337b8dde1d16a5fc9ba3"}, + {file = "contourpy-1.3.3-cp313-cp313t-win_amd64.whl", hash = "sha256:87acf5963fc2b34825e5b6b048f40e3635dd547f590b04d2ab317c2619ef7ae8"}, + {file = "contourpy-1.3.3-cp313-cp313t-win_arm64.whl", hash = "sha256:3c30273eb2a55024ff31ba7d052dde990d7d8e5450f4bbb6e913558b3d6c2301"}, + {file = "contourpy-1.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fde6c716d51c04b1c25d0b90364d0be954624a0ee9d60e23e850e8d48353d07a"}, + {file = "contourpy-1.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:cbedb772ed74ff5be440fa8eee9bd49f64f6e3fc09436d9c7d8f1c287b121d77"}, + {file = "contourpy-1.3.3-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:22e9b1bd7a9b1d652cd77388465dc358dafcd2e217d35552424aa4f996f524f5"}, + {file = "contourpy-1.3.3-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a22738912262aa3e254e4f3cb079a95a67132fc5a063890e224393596902f5a4"}, + {file = "contourpy-1.3.3-cp314-cp314-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:afe5a512f31ee6bd7d0dda52ec9864c984ca3d66664444f2d72e0dc4eb832e36"}, + {file = "contourpy-1.3.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f64836de09927cba6f79dcd00fdd7d5329f3fccc633468507079c829ca4db4e3"}, + {file = "contourpy-1.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1fd43c3be4c8e5fd6e4f2baeae35ae18176cf2e5cced681cca908addf1cdd53b"}, + {file = "contourpy-1.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6afc576f7b33cf00996e5c1102dc2a8f7cc89e39c0b55df93a0b78c1bd992b36"}, + {file = "contourpy-1.3.3-cp314-cp314-win32.whl", hash = "sha256:66c8a43a4f7b8df8b71ee1840e4211a3c8d93b214b213f590e18a1beca458f7d"}, + {file = "contourpy-1.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:cf9022ef053f2694e31d630feaacb21ea24224be1c3ad0520b13d844274614fd"}, + {file = "contourpy-1.3.3-cp314-cp314-win_arm64.whl", hash = "sha256:95b181891b4c71de4bb404c6621e7e2390745f887f2a026b2d99e92c17892339"}, + {file = "contourpy-1.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:33c82d0138c0a062380332c861387650c82e4cf1747aaa6938b9b6516762e772"}, + {file = "contourpy-1.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ea37e7b45949df430fe649e5de8351c423430046a2af20b1c1961cae3afcda77"}, + {file = "contourpy-1.3.3-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d304906ecc71672e9c89e87c4675dc5c2645e1f4269a5063b99b0bb29f232d13"}, + {file = "contourpy-1.3.3-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca658cd1a680a5c9ea96dc61cdbae1e85c8f25849843aa799dfd3cb370ad4fbe"}, + {file = "contourpy-1.3.3-cp314-cp314t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ab2fd90904c503739a75b7c8c5c01160130ba67944a7b77bbf36ef8054576e7f"}, + {file = "contourpy-1.3.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7301b89040075c30e5768810bc96a8e8d78085b47d8be6e4c3f5a0b4ed478a0"}, + {file = "contourpy-1.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2a2a8b627d5cc6b7c41a4beff6c5ad5eb848c88255fda4a8745f7e901b32d8e4"}, + {file = "contourpy-1.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:fd6ec6be509c787f1caf6b247f0b1ca598bef13f4ddeaa126b7658215529ba0f"}, + {file = "contourpy-1.3.3-cp314-cp314t-win32.whl", hash = "sha256:e74a9a0f5e3fff48fb5a7f2fd2b9b70a3fe014a67522f79b7cca4c0c7e43c9ae"}, + {file = "contourpy-1.3.3-cp314-cp314t-win_amd64.whl", hash = "sha256:13b68d6a62db8eafaebb8039218921399baf6e47bf85006fd8529f2a08ef33fc"}, + {file = "contourpy-1.3.3-cp314-cp314t-win_arm64.whl", hash = "sha256:b7448cb5a725bb1e35ce88771b86fba35ef418952474492cf7c764059933ff8b"}, + {file = "contourpy-1.3.3-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cd5dfcaeb10f7b7f9dc8941717c6c2ade08f587be2226222c12b25f0483ed497"}, + {file = "contourpy-1.3.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:0c1fc238306b35f246d61a1d416a627348b5cf0648648a031e14bb8705fcdfe8"}, + {file = "contourpy-1.3.3-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:70f9aad7de812d6541d29d2bbf8feb22ff7e1c299523db288004e3157ff4674e"}, + {file = "contourpy-1.3.3-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5ed3657edf08512fc3fe81b510e35c2012fbd3081d2e26160f27ca28affec989"}, + {file = "contourpy-1.3.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:3d1a3799d62d45c18bafd41c5fa05120b96a28079f2393af559b843d1a966a77"}, + {file = "contourpy-1.3.3.tar.gz", hash = "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880"}, ] [package.dependencies] -numpy = ">=1.23" +numpy = ">=1.25" [package.extras] bokeh = ["bokeh", "selenium"] docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"] -mypy = ["bokeh", "contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.15.0)", "types-Pillow"] +mypy = ["bokeh", "contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.17.0)", "types-Pillow"] test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] test-no-images = ["pytest", "pytest-cov", "pytest-rerunfailures", "pytest-xdist", "wurlitzer"] @@ -730,80 +828,147 @@ files = [ [[package]] name = "cryptography" -version = "44.0.3" +version = "46.0.4" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false -python-versions = "!=3.9.0,!=3.9.1,>=3.7" +python-versions = "!=3.9.0,!=3.9.1,>=3.8" groups = ["main"] markers = "sys_platform == \"linux\"" files = [ - {file = "cryptography-44.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:962bc30480a08d133e631e8dfd4783ab71cc9e33d5d7c1e192f0b7c06397bb88"}, - {file = "cryptography-44.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ffc61e8f3bf5b60346d89cd3d37231019c17a081208dfbbd6e1605ba03fa137"}, - {file = "cryptography-44.0.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58968d331425a6f9eedcee087f77fd3c927c88f55368f43ff7e0a19891f2642c"}, - {file = "cryptography-44.0.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:e28d62e59a4dbd1d22e747f57d4f00c459af22181f0b2f787ea83f5a876d7c76"}, - {file = "cryptography-44.0.3-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:af653022a0c25ef2e3ffb2c673a50e5a0d02fecc41608f4954176f1933b12359"}, - {file = "cryptography-44.0.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:157f1f3b8d941c2bd8f3ffee0af9b049c9665c39d3da9db2dc338feca5e98a43"}, - {file = "cryptography-44.0.3-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:c6cd67722619e4d55fdb42ead64ed8843d64638e9c07f4011163e46bc512cf01"}, - {file = "cryptography-44.0.3-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:b424563394c369a804ecbee9b06dfb34997f19d00b3518e39f83a5642618397d"}, - {file = "cryptography-44.0.3-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c91fc8e8fd78af553f98bc7f2a1d8db977334e4eea302a4bfd75b9461c2d8904"}, - {file = "cryptography-44.0.3-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:25cd194c39fa5a0aa4169125ee27d1172097857b27109a45fadc59653ec06f44"}, - {file = "cryptography-44.0.3-cp37-abi3-win32.whl", hash = "sha256:3be3f649d91cb182c3a6bd336de8b61a0a71965bd13d1a04a0e15b39c3d5809d"}, - {file = "cryptography-44.0.3-cp37-abi3-win_amd64.whl", hash = "sha256:3883076d5c4cc56dbef0b898a74eb6992fdac29a7b9013870b34efe4ddb39a0d"}, - {file = "cryptography-44.0.3-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:5639c2b16764c6f76eedf722dbad9a0914960d3489c0cc38694ddf9464f1bb2f"}, - {file = "cryptography-44.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3ffef566ac88f75967d7abd852ed5f182da252d23fac11b4766da3957766759"}, - {file = "cryptography-44.0.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:192ed30fac1728f7587c6f4613c29c584abdc565d7417c13904708db10206645"}, - {file = "cryptography-44.0.3-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:7d5fe7195c27c32a64955740b949070f21cba664604291c298518d2e255931d2"}, - {file = "cryptography-44.0.3-cp39-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3f07943aa4d7dad689e3bb1638ddc4944cc5e0921e3c227486daae0e31a05e54"}, - {file = "cryptography-44.0.3-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:cb90f60e03d563ca2445099edf605c16ed1d5b15182d21831f58460c48bffb93"}, - {file = "cryptography-44.0.3-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:ab0b005721cc0039e885ac3503825661bd9810b15d4f374e473f8c89b7d5460c"}, - {file = "cryptography-44.0.3-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:3bb0847e6363c037df8f6ede57d88eaf3410ca2267fb12275370a76f85786a6f"}, - {file = "cryptography-44.0.3-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:b0cc66c74c797e1db750aaa842ad5b8b78e14805a9b5d1348dc603612d3e3ff5"}, - {file = "cryptography-44.0.3-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6866df152b581f9429020320e5eb9794c8780e90f7ccb021940d7f50ee00ae0b"}, - {file = "cryptography-44.0.3-cp39-abi3-win32.whl", hash = "sha256:c138abae3a12a94c75c10499f1cbae81294a6f983b3af066390adee73f433028"}, - {file = "cryptography-44.0.3-cp39-abi3-win_amd64.whl", hash = "sha256:5d186f32e52e66994dce4f766884bcb9c68b8da62d61d9d215bfe5fb56d21334"}, - {file = "cryptography-44.0.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:cad399780053fb383dc067475135e41c9fe7d901a97dd5d9c5dfb5611afc0d7d"}, - {file = "cryptography-44.0.3-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:21a83f6f35b9cc656d71b5de8d519f566df01e660ac2578805ab245ffd8523f8"}, - {file = "cryptography-44.0.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:fc3c9babc1e1faefd62704bb46a69f359a9819eb0292e40df3fb6e3574715cd4"}, - {file = "cryptography-44.0.3-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:e909df4053064a97f1e6565153ff8bb389af12c5c8d29c343308760890560aff"}, - {file = "cryptography-44.0.3-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:dad80b45c22e05b259e33ddd458e9e2ba099c86ccf4e88db7bbab4b747b18d06"}, - {file = "cryptography-44.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:479d92908277bed6e1a1c69b277734a7771c2b78633c224445b5c60a9f4bc1d9"}, - {file = "cryptography-44.0.3-pp311-pypy311_pp73-macosx_10_9_x86_64.whl", hash = "sha256:896530bc9107b226f265effa7ef3f21270f18a2026bc09fed1ebd7b66ddf6375"}, - {file = "cryptography-44.0.3-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:9b4d4a5dbee05a2c390bf212e78b99434efec37b17a4bff42f50285c5c8c9647"}, - {file = "cryptography-44.0.3-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:02f55fb4f8b79c1221b0961488eaae21015b69b210e18c386b69de182ebb1259"}, - {file = "cryptography-44.0.3-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:dd3db61b8fe5be220eee484a17233287d0be6932d056cf5738225b9c05ef4fff"}, - {file = "cryptography-44.0.3-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:978631ec51a6bbc0b7e58f23b68a8ce9e5f09721940933e9c217068388789fe5"}, - {file = "cryptography-44.0.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:5d20cc348cca3a8aa7312f42ab953a56e15323800ca3ab0706b8cd452a3a056c"}, - {file = "cryptography-44.0.3.tar.gz", hash = "sha256:fe19d8bc5536a91a24a8133328880a41831b6c5df54599a8417b62fe015d3053"}, + {file = "cryptography-46.0.4-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:281526e865ed4166009e235afadf3a4c4cba6056f99336a99efba65336fd5485"}, + {file = "cryptography-46.0.4-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5f14fba5bf6f4390d7ff8f086c566454bff0411f6d8aa7af79c88b6f9267aecc"}, + {file = "cryptography-46.0.4-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:47bcd19517e6389132f76e2d5303ded6cf3f78903da2158a671be8de024f4cd0"}, + {file = "cryptography-46.0.4-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:01df4f50f314fbe7009f54046e908d1754f19d0c6d3070df1e6268c5a4af09fa"}, + {file = "cryptography-46.0.4-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:5aa3e463596b0087b3da0dbe2b2487e9fc261d25da85754e30e3b40637d61f81"}, + {file = "cryptography-46.0.4-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:0a9ad24359fee86f131836a9ac3bffc9329e956624a2d379b613f8f8abaf5255"}, + {file = "cryptography-46.0.4-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:dc1272e25ef673efe72f2096e92ae39dea1a1a450dd44918b15351f72c5a168e"}, + {file = "cryptography-46.0.4-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:de0f5f4ec8711ebc555f54735d4c673fc34b65c44283895f1a08c2b49d2fd99c"}, + {file = "cryptography-46.0.4-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:eeeb2e33d8dbcccc34d64651f00a98cb41b2dc69cef866771a5717e6734dfa32"}, + {file = "cryptography-46.0.4-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:3d425eacbc9aceafd2cb429e42f4e5d5633c6f873f5e567077043ef1b9bbf616"}, + {file = "cryptography-46.0.4-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:91627ebf691d1ea3976a031b61fb7bac1ccd745afa03602275dda443e11c8de0"}, + {file = "cryptography-46.0.4-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2d08bc22efd73e8854b0b7caff402d735b354862f1145d7be3b9c0f740fef6a0"}, + {file = "cryptography-46.0.4-cp311-abi3-win32.whl", hash = "sha256:82a62483daf20b8134f6e92898da70d04d0ef9a75829d732ea1018678185f4f5"}, + {file = "cryptography-46.0.4-cp311-abi3-win_amd64.whl", hash = "sha256:6225d3ebe26a55dbc8ead5ad1265c0403552a63336499564675b29eb3184c09b"}, + {file = "cryptography-46.0.4-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:485e2b65d25ec0d901bca7bcae0f53b00133bf3173916d8e421f6fddde103908"}, + {file = "cryptography-46.0.4-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:078e5f06bd2fa5aea5a324f2a09f914b1484f1d0c2a4d6a8a28c74e72f65f2da"}, + {file = "cryptography-46.0.4-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:dce1e4f068f03008da7fa51cc7abc6ddc5e5de3e3d1550334eaf8393982a5829"}, + {file = "cryptography-46.0.4-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:2067461c80271f422ee7bdbe79b9b4be54a5162e90345f86a23445a0cf3fd8a2"}, + {file = "cryptography-46.0.4-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:c92010b58a51196a5f41c3795190203ac52edfd5dc3ff99149b4659eba9d2085"}, + {file = "cryptography-46.0.4-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:829c2b12bbc5428ab02d6b7f7e9bbfd53e33efd6672d21341f2177470171ad8b"}, + {file = "cryptography-46.0.4-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:62217ba44bf81b30abaeda1488686a04a702a261e26f87db51ff61d9d3510abd"}, + {file = "cryptography-46.0.4-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:9c2da296c8d3415b93e6053f5a728649a87a48ce084a9aaf51d6e46c87c7f2d2"}, + {file = "cryptography-46.0.4-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:9b34d8ba84454641a6bf4d6762d15847ecbd85c1316c0a7984e6e4e9f748ec2e"}, + {file = "cryptography-46.0.4-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:df4a817fa7138dd0c96c8c8c20f04b8aaa1fac3bbf610913dcad8ea82e1bfd3f"}, + {file = "cryptography-46.0.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:b1de0ebf7587f28f9190b9cb526e901bf448c9e6a99655d2b07fff60e8212a82"}, + {file = "cryptography-46.0.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9b4d17bc7bd7cdd98e3af40b441feaea4c68225e2eb2341026c84511ad246c0c"}, + {file = "cryptography-46.0.4-cp314-cp314t-win32.whl", hash = "sha256:c411f16275b0dea722d76544a61d6421e2cc829ad76eec79280dbdc9ddf50061"}, + {file = "cryptography-46.0.4-cp314-cp314t-win_amd64.whl", hash = "sha256:728fedc529efc1439eb6107b677f7f7558adab4553ef8669f0d02d42d7b959a7"}, + {file = "cryptography-46.0.4-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:a9556ba711f7c23f77b151d5798f3ac44a13455cc68db7697a1096e6d0563cab"}, + {file = "cryptography-46.0.4-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8bf75b0259e87fa70bddc0b8b4078b76e7fd512fd9afae6c1193bcf440a4dbef"}, + {file = "cryptography-46.0.4-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3c268a3490df22270955966ba236d6bc4a8f9b6e4ffddb78aac535f1a5ea471d"}, + {file = "cryptography-46.0.4-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:812815182f6a0c1d49a37893a303b44eaac827d7f0d582cecfc81b6427f22973"}, + {file = "cryptography-46.0.4-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:a90e43e3ef65e6dcf969dfe3bb40cbf5aef0d523dff95bfa24256be172a845f4"}, + {file = "cryptography-46.0.4-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:a05177ff6296644ef2876fce50518dffb5bcdf903c85250974fc8bc85d54c0af"}, + {file = "cryptography-46.0.4-cp38-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:daa392191f626d50f1b136c9b4cf08af69ca8279d110ea24f5c2700054d2e263"}, + {file = "cryptography-46.0.4-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:e07ea39c5b048e085f15923511d8121e4a9dc45cee4e3b970ca4f0d338f23095"}, + {file = "cryptography-46.0.4-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:d5a45ddc256f492ce42a4e35879c5e5528c09cd9ad12420828c972951d8e016b"}, + {file = "cryptography-46.0.4-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:6bb5157bf6a350e5b28aee23beb2d84ae6f5be390b2f8ee7ea179cda077e1019"}, + {file = "cryptography-46.0.4-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:dd5aba870a2c40f87a3af043e0dee7d9eb02d4aff88a797b48f2b43eff8c3ab4"}, + {file = "cryptography-46.0.4-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:93d8291da8d71024379ab2cb0b5c57915300155ad42e07f76bea6ad838d7e59b"}, + {file = "cryptography-46.0.4-cp38-abi3-win32.whl", hash = "sha256:0563655cb3c6d05fb2afe693340bc050c30f9f34e15763361cf08e94749401fc"}, + {file = "cryptography-46.0.4-cp38-abi3-win_amd64.whl", hash = "sha256:fa0900b9ef9c49728887d1576fd8d9e7e3ea872fa9b25ef9b64888adc434e976"}, + {file = "cryptography-46.0.4-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:766330cce7416c92b5e90c3bb71b1b79521760cdcfc3a6a1a182d4c9fab23d2b"}, + {file = "cryptography-46.0.4-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c236a44acfb610e70f6b3e1c3ca20ff24459659231ef2f8c48e879e2d32b73da"}, + {file = "cryptography-46.0.4-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:8a15fb869670efa8f83cbffbc8753c1abf236883225aed74cd179b720ac9ec80"}, + {file = "cryptography-46.0.4-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:fdc3daab53b212472f1524d070735b2f0c214239df131903bae1d598016fa822"}, + {file = "cryptography-46.0.4-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:44cc0675b27cadb71bdbb96099cca1fa051cd11d2ade09e5cd3a2edb929ed947"}, + {file = "cryptography-46.0.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:be8c01a7d5a55f9a47d1888162b76c8f49d62b234d88f0ff91a9fbebe32ffbc3"}, + {file = "cryptography-46.0.4.tar.gz", hash = "sha256:bfd019f60f8abc2ed1b9be4ddc21cfef059c841d86d710bb69909a688cbb8f59"}, ] [package.dependencies] -cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} +cffi = {version = ">=2.0.0", markers = "python_full_version >= \"3.9.0\" and platform_python_implementation != \"PyPy\""} [package.extras] -docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=3.0.0) ; python_version >= \"3.8\""] +docs = ["sphinx (>=5.3.0)", "sphinx-inline-tabs", "sphinx-rtd-theme (>=3.0.0)"] docstest = ["pyenchant (>=3)", "readme-renderer (>=30.0)", "sphinxcontrib-spelling (>=7.3.1)"] -nox = ["nox (>=2024.4.15)", "nox[uv] (>=2024.3.2) ; python_version >= \"3.8\""] -pep8test = ["check-sdist ; python_version >= \"3.8\"", "click (>=8.0.1)", "mypy (>=1.4)", "ruff (>=0.3.6)"] +nox = ["nox[uv] (>=2024.4.15)"] +pep8test = ["check-sdist", "click (>=8.0.1)", "mypy (>=1.14)", "ruff (>=0.11.11)"] sdist = ["build (>=1.0.0)"] ssh = ["bcrypt (>=3.1.5)"] -test = ["certifi (>=2024)", "cryptography-vectors (==44.0.3)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"] +test = ["certifi (>=2024)", "cryptography-vectors (==46.0.4)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"] test-randomorder = ["pytest-randomly"] +[[package]] +name = "cuda-bindings" +version = "12.9.4" +description = "Python bindings for CUDA" +optional = false +python-versions = "*" +groups = ["main", "torch-cuda"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" +files = [ + {file = "cuda_bindings-12.9.4-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a022c96b8bd847e8dc0675523431149a4c3e872f440e3002213dbb9e08f0331a"}, + {file = "cuda_bindings-12.9.4-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d3c842c2a4303b2a580fe955018e31aea30278be19795ae05226235268032e5"}, + {file = "cuda_bindings-12.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:f69107389e6b9948969bfd0a20c4f571fd1aefcfb1d2e1b72cc8ba5ecb7918ab"}, + {file = "cuda_bindings-12.9.4-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a6a429dc6c13148ff1e27c44f40a3dd23203823e637b87fd0854205195988306"}, + {file = "cuda_bindings-12.9.4-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c912a3d9e6b6651853eed8eed96d6800d69c08e94052c292fec3f282c5a817c9"}, + {file = "cuda_bindings-12.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:443b0875916879c2e4c3722941e25e42d5ab9bcbf34c9e83404fb100fa1f6913"}, + {file = "cuda_bindings-12.9.4-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:694ba35023846625ef471257e6b5a4bc8af690f961d197d77d34b1d1db393f56"}, + {file = "cuda_bindings-12.9.4-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fda147a344e8eaeca0c6ff113d2851ffca8f7dfc0a6c932374ee5c47caa649c8"}, + {file = "cuda_bindings-12.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:696ca75d249ddf287d01b9a698b8e2d8a05046495a9c051ca15659dc52d17615"}, + {file = "cuda_bindings-12.9.4-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cf8bfaedc238f3b115d957d1fd6562b7e8435ba57f6d0e2f87d0e7149ccb2da5"}, + {file = "cuda_bindings-12.9.4-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:32bdc5a76906be4c61eb98f546a6786c5773a881f3b166486449b5d141e4a39f"}, + {file = "cuda_bindings-12.9.4-cp313-cp313-win_amd64.whl", hash = "sha256:a2e82c8985948f953c2be51df45c3fe11c812a928fca525154fb9503190b3e64"}, + {file = "cuda_bindings-12.9.4-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3adf4958dcf68ae7801a59b73fb00a8b37f8d0595060d66ceae111b1002de38d"}, + {file = "cuda_bindings-12.9.4-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:56e0043c457a99ac473ddc926fe0dc4046694d99caef633e92601ab52cbe17eb"}, + {file = "cuda_bindings-12.9.4-cp313-cp313t-win_amd64.whl", hash = "sha256:b32d8b685f0e66f5658bcf4601ef034e89fc2843582886f0a58784a4302da06c"}, + {file = "cuda_bindings-12.9.4-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1f53a7f453d4b2643d8663d036bafe29b5ba89eb904c133180f295df6dc151e5"}, + {file = "cuda_bindings-12.9.4-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8b72ee72a9cc1b531db31eebaaee5c69a8ec3500e32c6933f2d3b15297b53686"}, + {file = "cuda_bindings-12.9.4-cp314-cp314-win_amd64.whl", hash = "sha256:53a10c71fdbdb743e0268d07964e5a996dd00b4e43831cbfce9804515d97d575"}, + {file = "cuda_bindings-12.9.4-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:20f2699d61d724de3eb3f3369d57e2b245f93085cab44fd37c3bea036cea1a6f"}, + {file = "cuda_bindings-12.9.4-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d80bffc357df9988dca279734bc9674c3934a654cab10cadeed27ce17d8635ee"}, + {file = "cuda_bindings-12.9.4-cp314-cp314t-win_amd64.whl", hash = "sha256:53e11991a92ff6f26a0c8a98554cd5d6721c308a6b7bfb08bebac9201e039e43"}, + {file = "cuda_bindings-12.9.4-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:893ca68114b5b769c1d4c02583b91ed22691887c3ed513b59467d23540104db4"}, + {file = "cuda_bindings-12.9.4-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9866ceec83e39337d1a1d64837864c964ad902992478caa288a0bc1be95f21aa"}, + {file = "cuda_bindings-12.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:37744e721a18a514423e81863f52a4f7f46f5a6f9cccd569f2735f8067f4d8c2"}, +] + +[package.dependencies] +cuda-pathfinder = ">=1.1,<2.0" + +[package.extras] +all = ["nvidia-cuda-nvcc-cu12", "nvidia-cuda-nvrtc-cu12", "nvidia-cufile-cu12 ; sys_platform == \"linux\"", "nvidia-nvjitlink-cu12 (>=12.3)"] +test = ["cython (>=3.1,<3.2)", "numpy (>=1.21.1)", "pyglet (>=2.1.9)", "pytest (>=6.2.4)", "pytest-benchmark (>=3.4.1)", "setuptools (>=77.0.0)"] + +[[package]] +name = "cuda-pathfinder" +version = "1.3.3" +description = "Pathfinder for CUDA components" +optional = false +python-versions = ">=3.10" +groups = ["main", "torch-cuda"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" +files = [ + {file = "cuda_pathfinder-1.3.3-py3-none-any.whl", hash = "sha256:9984b664e404f7c134954a771be8775dfd6180ea1e1aef4a5a37d4be05d9bbb1"}, +] + [[package]] name = "curve-curator" -version = "0.5.1" +version = "0.6.0" description = "CurveCurator is an open-source analysis platform for any dose-dependent data. It fits a classical 4-parameter equation to estimate effect potency, effect size, and the statistical significance of the observed response. 2D-thresholding efficiently reduces false positives in high-throughput experiments and separates relevant from irrelevant or insignificant hits in an automated and unbiased manner. An interactive dashboard allows users to quickly explore data locally." optional = false -python-versions = "<3.13,>=3.11" +python-versions = "<3.14,>=3.11" groups = ["main"] files = [ - {file = "curve_curator-0.5.1-py3-none-any.whl", hash = "sha256:23b74f7c92f1cc9bd0fdedb3429514df4b779fa39a98dfe5eb4ae14efb67b0ee"}, + {file = "curve_curator-0.6.0-py3-none-any.whl", hash = "sha256:c4345ff856e6de68826fd80536731989e88d9910ba81b00a8ffb5665e318f7e2"}, + {file = "curve_curator-0.6.0.tar.gz", hash = "sha256:d323dbf900a2c390de7e4ee744a74268d328f917decb277216043ffabccd1a92"}, ] [package.dependencies] -bokeh = ">=3.4.0,<3.5.0" -numpy = ">=1.25.0,<2.0.0" -pandas = ">=2.1.2,<3.0.0" +bokeh = ">=3.4.0,<3.8.0" +numpy = ">=1.25.0,<3.0" +pandas = ">=2.1.0,<3.0.0" pytest = ">=7.4.3,<8.0.0" scipy = ">=1.10.1,<2.0.0" statsmodels = ">=0.14.0,<0.15.0" @@ -857,14 +1022,14 @@ cli = ["tomli ; python_version < \"3.11\""] [[package]] name = "distlib" -version = "0.3.9" +version = "0.4.0" description = "Distribution utilities" optional = false python-versions = "*" groups = ["main", "development"] files = [ - {file = "distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87"}, - {file = "distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403"}, + {file = "distlib-0.4.0-py2.py3-none-any.whl", hash = "sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16"}, + {file = "distlib-0.4.0.tar.gz", hash = "sha256:feec40075be03a04501a973d81f633735b4b69f98b05450592310c0f401a4e0d"}, ] [[package]] @@ -881,81 +1046,66 @@ files = [ [[package]] name = "dulwich" -version = "0.22.8" +version = "1.0.0" description = "Python Git Library" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["main"] files = [ - {file = "dulwich-0.22.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:546176d18b8cc0a492b0f23f07411e38686024cffa7e9d097ae20512a2e57127"}, - {file = "dulwich-0.22.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d2434dd72b2ae09b653c9cfe6764a03c25cfbd99fbbb7c426f0478f6fb1100f"}, - {file = "dulwich-0.22.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe8318bc0921d42e3e69f03716f983a301b5ee4c8dc23c7f2c5bbb28581257a9"}, - {file = "dulwich-0.22.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7a0f96a2a87f3b4f7feae79d2ac6b94107d6b7d827ac08f2f331b88c8f597a1"}, - {file = "dulwich-0.22.8-cp310-cp310-win32.whl", hash = "sha256:432a37b25733202897b8d67cdd641688444d980167c356ef4e4dd15a17a39a24"}, - {file = "dulwich-0.22.8-cp310-cp310-win_amd64.whl", hash = "sha256:f3a15e58dac8b8a76073ddca34e014f66f3672a5540a99d49ef6a9c09ab21285"}, - {file = "dulwich-0.22.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0852edc51cff4f4f62976bdaa1d82f6ef248356c681c764c0feb699bc17d5782"}, - {file = "dulwich-0.22.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:826aae8b64ac1a12321d6b272fc13934d8f62804fda2bc6ae46f93f4380798eb"}, - {file = "dulwich-0.22.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7ae726f923057d36cdbb9f4fb7da0d0903751435934648b13f1b851f0e38ea1"}, - {file = "dulwich-0.22.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6987d753227f55cf75ba29a8dab69d1d83308ce483d7a8c6d223086f7a42e125"}, - {file = "dulwich-0.22.8-cp311-cp311-win32.whl", hash = "sha256:7757b4a2aad64c6f1920082fc1fccf4da25c3923a0ae7b242c08d06861dae6e1"}, - {file = "dulwich-0.22.8-cp311-cp311-win_amd64.whl", hash = "sha256:12b243b7e912011c7225dc67480c313ac8d2990744789b876016fb593f6f3e19"}, - {file = "dulwich-0.22.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d81697f74f50f008bb221ab5045595f8a3b87c0de2c86aa55be42ba97421f3cd"}, - {file = "dulwich-0.22.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bff1da8e2e6a607c3cb45f5c2e652739589fe891245e1d5b770330cdecbde41"}, - {file = "dulwich-0.22.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9969099e15b939d3936f8bee8459eaef7ef5a86cd6173393a17fe28ca3d38aff"}, - {file = "dulwich-0.22.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:017152c51b9a613f0698db28c67cf3e0a89392d28050dbf4f4ac3f657ea4c0dc"}, - {file = "dulwich-0.22.8-cp312-cp312-win32.whl", hash = "sha256:ee70e8bb8798b503f81b53f7a103cb869c8e89141db9005909f79ab1506e26e9"}, - {file = "dulwich-0.22.8-cp312-cp312-win_amd64.whl", hash = "sha256:dc89c6f14dcdcbfee200b0557c59ae243835e42720be143526d834d0e53ed3af"}, - {file = "dulwich-0.22.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dbade3342376be1cd2409539fe1b901d2d57a531106bbae204da921ef4456a74"}, - {file = "dulwich-0.22.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71420ffb6deebc59b2ce875e63d814509f9c1dc89c76db962d547aebf15670c7"}, - {file = "dulwich-0.22.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a626adbfac44646a125618266a24133763bdc992bf8bd0702910d67e6b994443"}, - {file = "dulwich-0.22.8-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f1476c9c4e4ede95714d06c4831883a26680e37b040b8b6230f506e5ba39f51"}, - {file = "dulwich-0.22.8-cp313-cp313-win32.whl", hash = "sha256:b2b31913932bb5bd41658dd398b33b1a2d4d34825123ad54e40912cfdfe60003"}, - {file = "dulwich-0.22.8-cp313-cp313-win_amd64.whl", hash = "sha256:7a44e5a61a7989aca1e301d39cfb62ad2f8853368682f524d6e878b4115d823d"}, - {file = "dulwich-0.22.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f9cd0c67fb44a38358b9fcabee948bf11044ef6ce7a129e50962f54c176d084e"}, - {file = "dulwich-0.22.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b79b94726c3f4a9e5a830c649376fd0963236e73142a4290bac6bc9fc9cb120"}, - {file = "dulwich-0.22.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16bbe483d663944972e22d64e1f191201123c3b5580fbdaac6a4f66bfaa4fc11"}, - {file = "dulwich-0.22.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e02d403af23d93dc1f96eb2408e25efd50046e38590a88c86fa4002adc9849b0"}, - {file = "dulwich-0.22.8-cp39-cp39-win32.whl", hash = "sha256:8bdd9543a77fb01be704377f5e634b71f955fec64caa4a493dc3bfb98e3a986e"}, - {file = "dulwich-0.22.8-cp39-cp39-win_amd64.whl", hash = "sha256:3b6757c6b3ba98212b854a766a4157b9cb79a06f4e1b06b46dec4bd834945b8e"}, - {file = "dulwich-0.22.8-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7bb18fa09daa1586c1040b3e2777d38d4212a5cdbe47d384ba66a1ac336fcc4c"}, - {file = "dulwich-0.22.8-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b2fda8e87907ed304d4a5962aea0338366144df0df60f950b8f7f125871707f"}, - {file = "dulwich-0.22.8-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1748cd573a0aee4d530bc223a23ccb8bb5b319645931a37bd1cfb68933b720c1"}, - {file = "dulwich-0.22.8-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a631b2309feb9a9631eabd896612ba36532e3ffedccace57f183bb868d7afc06"}, - {file = "dulwich-0.22.8-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:00e7d9a3d324f9e0a1b27880eec0e8e276ff76519621b66c1a429ca9eb3f5a8d"}, - {file = "dulwich-0.22.8-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:f8aa3de93201f9e3e40198725389aa9554a4ee3318a865f96a8e9bc9080f0b25"}, - {file = "dulwich-0.22.8-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e8da9dd8135884975f5be0563ede02179240250e11f11942801ae31ac293f37"}, - {file = "dulwich-0.22.8-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4fc5ce2435fb3abdf76f1acabe48f2e4b3f7428232cadaef9daaf50ea7fa30ee"}, - {file = "dulwich-0.22.8-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:982b21cc3100d959232cadb3da0a478bd549814dd937104ea50f43694ec27153"}, - {file = "dulwich-0.22.8-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:6bde2b13a05cc0ec2ecd4597a99896663544c40af1466121f4d046119b874ce3"}, - {file = "dulwich-0.22.8-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:6d446cb7d272a151934ad4b48ba691f32486d5267cf2de04ee3b5e05fc865326"}, - {file = "dulwich-0.22.8-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f6338e6cf95cd76a0191b3637dc3caed1f988ae84d8e75f876d5cd75a8dd81a"}, - {file = "dulwich-0.22.8-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e004fc532ea262f2d5f375068101ca4792becb9d4aa663b050f5ac31fda0bb5c"}, - {file = "dulwich-0.22.8-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6bfdbc6fa477dee00d04e22d43a51571cd820cfaaaa886f0f155b8e29b3e3d45"}, - {file = "dulwich-0.22.8-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ae900c8e573f79d714c1d22b02cdadd50b64286dd7203028f0200f82089e4950"}, - {file = "dulwich-0.22.8-py3-none-any.whl", hash = "sha256:ffc7a02e62b72884de58baaa3b898b7f6427893e79b1289ffa075092efe59181"}, - {file = "dulwich-0.22.8.tar.gz", hash = "sha256:701547310415de300269331abe29cb5717aa1ea377af826bf513d0adfb1c209b"}, + {file = "dulwich-1.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2881fe077792474cbd8cae140e7c2c2263fc07017ba37051946d869151f79624"}, + {file = "dulwich-1.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:3f090da8af238d7d9dba53a87b86a9e3e21529690b7536c253b1d5061bdb3a4d"}, + {file = "dulwich-1.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:af39c560b75f64ec2d44519baf51ed1871be69e7ed4b0a4314215fa1ffe71195"}, + {file = "dulwich-1.0.0-cp310-cp310-win32.whl", hash = "sha256:c2f2b2692524468bcd91bf79aa1f420bbbb59996506ec434ad6e72227f52365b"}, + {file = "dulwich-1.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:2ba6072e922b815006b036d0df59b25eb2523b89581fcf9f47feb43324629ba4"}, + {file = "dulwich-1.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1213da9832621b07dfaafdb651b74edb8966481475c52be0bff8dee352d75853"}, + {file = "dulwich-1.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:e370e3cdd0b00c059ebee8371cc1644aa61d6de3de0ca5c2f2a5f075bf4c53d9"}, + {file = "dulwich-1.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:86271e17d76a667abb1d68dad83b6324422a1ab20d60be30395fd60a37b735b1"}, + {file = "dulwich-1.0.0-cp311-cp311-win32.whl", hash = "sha256:3051007bc2792b5a72fee938842cf45b66924d6d5147d824f3e609eb75fc0322"}, + {file = "dulwich-1.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:5cf6e9b5620a3e842663b58ad534da29944db6a6016ba61fc9bbed24830cd85f"}, + {file = "dulwich-1.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6736abc2ce2994e38a00a3a4c80237b2b944e7c6f4e346119debdd2592312d83"}, + {file = "dulwich-1.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:06514b02da1e32a077062924d2c3b20a7bc76ab9b92eeac691f72b76b14111bc"}, + {file = "dulwich-1.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:32b6fb1205b1d9c0e43986f9e4e5e50a3670014440e61498eca2b8ab6b00129f"}, + {file = "dulwich-1.0.0-cp312-cp312-win32.whl", hash = "sha256:1a6583499b915fe5a8ac5595325f1e6a6a5a456de1575e0293e8a6ebb6915f3f"}, + {file = "dulwich-1.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:f90b54faeb995607c876cdb2c082c0f0af702e1ccb524c6126ce99a36536fa3f"}, + {file = "dulwich-1.0.0-cp313-cp313-android_21_arm64_v8a.whl", hash = "sha256:ff94f47f0b5787d4e6a0105daf51ff9cdb4e5b9d4e9f8dd01b58ba9a5b79bbd9"}, + {file = "dulwich-1.0.0-cp313-cp313-android_21_x86_64.whl", hash = "sha256:1d95663441c930631d9d1765dc4f427dcc0662af45f42a0831357e60055ddb84"}, + {file = "dulwich-1.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:78542a62fabea894943a1d01c9c477a56eee5f7d58d3bdee42c7e0622ddf6893"}, + {file = "dulwich-1.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:d1c33f6456e4335dfe6f4d3917fa7d77050d6470bbbaf8054b5c5084ee8e8cd1"}, + {file = "dulwich-1.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:581330cf799577f194fda2b5384b7ba50e095de7ff088779c027a6de63642de2"}, + {file = "dulwich-1.0.0-cp313-cp313-win32.whl", hash = "sha256:276ff18ae734fe4a1be66d4267216a51d2deab0ac981d722db3d32fcc2ac4ff8"}, + {file = "dulwich-1.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:cc0ab4ba7fd8617bebe20294dedaa8f713d1767ce059bfbefd971b911b702726"}, + {file = "dulwich-1.0.0-cp314-cp314-android_24_arm64_v8a.whl", hash = "sha256:1bd4c872b617edc20e0b726479ec25705a0107a4bd16f83cb6cd108d86950634"}, + {file = "dulwich-1.0.0-cp314-cp314-android_24_x86_64.whl", hash = "sha256:fc791771859258ffbe34a6579ece30684a535ae0341fd2f5adfa5f64cc885c13"}, + {file = "dulwich-1.0.0-py3-none-any.whl", hash = "sha256:221be803b71b060c928e9faae4ab3e259ff5beac6e0c251ba3c176b51b5c2ffb"}, + {file = "dulwich-1.0.0.tar.gz", hash = "sha256:3d07104735525f22bfec35514ac611cf328c89b7acb059316a4f6e583c8f09bc"}, ] [package.dependencies] -urllib3 = ">=1.25" +typing_extensions = {version = ">=4.6.0", markers = "python_version < \"3.12\""} +urllib3 = ">=2.2.2" [package.extras] -dev = ["mypy (==1.15.0)", "ruff (==0.9.7)"] +aiohttp = ["aiohttp"] +colordiff = ["rich"] +dev = ["codespell (==2.4.1)", "dissolve (>=0.1.1)", "mypy (==1.19.1)", "ruff (==0.14.10)"] fastimport = ["fastimport"] -https = ["urllib3 (>=1.24.1)"] +fuzzing = ["atheris"] +https = ["urllib3 (>=2.2.2)"] +merge = ["merge3"] paramiko = ["paramiko"] +patiencediff = ["patiencediff"] pgp = ["gpg"] [[package]] name = "fastjsonschema" -version = "2.21.1" +version = "2.21.2" description = "Fastest Python implementation of JSON schema" optional = false python-versions = "*" groups = ["main"] files = [ - {file = "fastjsonschema-2.21.1-py3-none-any.whl", hash = "sha256:c9e5b7e908310918cf494a434eeb31384dd84a98b57a30bcb1f535015b554667"}, - {file = "fastjsonschema-2.21.1.tar.gz", hash = "sha256:794d4f0a58f848961ba16af7b9c85a3e88cd360df008c59aac6fc5ae9323b5d4"}, + {file = "fastjsonschema-2.21.2-py3-none-any.whl", hash = "sha256:1c797122d0a86c5cace2e54bf4e819c36223b552017172f32c5c024a6b77e463"}, + {file = "fastjsonschema-2.21.2.tar.gz", hash = "sha256:b1eb43748041c880796cd077f1a07c3d94e93ae84bba5ed36800a33554ae05de"}, ] [package.extras] @@ -963,52 +1113,48 @@ devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benc [[package]] name = "filelock" -version = "3.18.0" +version = "3.20.3" description = "A platform independent file lock." optional = false -python-versions = ">=3.9" -groups = ["main", "development"] +python-versions = ">=3.10" +groups = ["main", "development", "torch-cuda"] files = [ - {file = "filelock-3.18.0-py3-none-any.whl", hash = "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de"}, - {file = "filelock-3.18.0.tar.gz", hash = "sha256:adbc88eabb99d2fec8c9c1b229b171f18afa655400173ddc653d5d01501fb9f2"}, + {file = "filelock-3.20.3-py3-none-any.whl", hash = "sha256:4b0dda527ee31078689fc205ec4f1c1bf7d56cf88b6dc9426c4f230e46c2dce1"}, + {file = "filelock-3.20.3.tar.gz", hash = "sha256:18c57ee915c7ec61cff0ecf7f0f869936c7c30191bb0cf406f1341778d0834e1"}, ] -[package.extras] -docs = ["furo (>=2024.8.6)", "sphinx (>=8.1.3)", "sphinx-autodoc-typehints (>=3)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.6.10)", "diff-cover (>=9.2.1)", "pytest (>=8.3.4)", "pytest-asyncio (>=0.25.2)", "pytest-cov (>=6)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.28.1)"] -typing = ["typing-extensions (>=4.12.2) ; python_version < \"3.11\""] - [[package]] name = "findpython" -version = "0.6.3" +version = "0.7.1" description = "A utility to find python versions on your system" optional = false python-versions = ">=3.8" groups = ["main"] files = [ - {file = "findpython-0.6.3-py3-none-any.whl", hash = "sha256:a85bb589b559cdf1b87227cc233736eb7cad894b9e68021ee498850611939ebc"}, - {file = "findpython-0.6.3.tar.gz", hash = "sha256:5863ea55556d8aadc693481a14ac4f3624952719efc1c5591abb0b4a9e965c94"}, + {file = "findpython-0.7.1-py3-none-any.whl", hash = "sha256:1b78b1ff6e886cbddeffe80f8ecdbf2b8b061169bbd18b673070e26b644c51ac"}, + {file = "findpython-0.7.1.tar.gz", hash = "sha256:9f29e6a3dabdb75f2b39c949772c0ed26eab15308006669f3478cdab0d867c78"}, ] [package.dependencies] packaging = ">=20" +platformdirs = ">=4.3.6" [[package]] name = "flake8" -version = "7.2.0" +version = "7.3.0" description = "the modular source code checker: pep8 pyflakes and co" optional = false python-versions = ">=3.9" groups = ["development"] files = [ - {file = "flake8-7.2.0-py2.py3-none-any.whl", hash = "sha256:93b92ba5bdb60754a6da14fa3b93a9361fd00a59632ada61fd7b130436c40343"}, - {file = "flake8-7.2.0.tar.gz", hash = "sha256:fa558ae3f6f7dbf2b4f22663e5343b6b6023620461f8d4ff2019ef4b5ee70426"}, + {file = "flake8-7.3.0-py2.py3-none-any.whl", hash = "sha256:b9696257b9ce8beb888cdbe31cf885c90d31928fe202be0889a7cdafad32f01e"}, + {file = "flake8-7.3.0.tar.gz", hash = "sha256:fe044858146b9fc69b551a4b490d69cf960fcb78ad1edcb84e7fbb1b4a8e3872"}, ] [package.dependencies] mccabe = ">=0.7.0,<0.8.0" -pycodestyle = ">=2.13.0,<2.14.0" -pyflakes = ">=3.3.0,<3.4.0" +pycodestyle = ">=2.14.0,<2.15.0" +pyflakes = ">=3.4.0,<3.5.0" [[package]] name = "flake8-bandit" @@ -1028,19 +1174,19 @@ flake8 = ">=5.0.0" [[package]] name = "flake8-bugbear" -version = "24.12.12" +version = "25.11.29" description = "A plugin for flake8 finding likely bugs and design problems in your program. Contains warnings that don't belong in pyflakes and pycodestyle." optional = false -python-versions = ">=3.8.1" +python-versions = ">=3.10" groups = ["development"] files = [ - {file = "flake8_bugbear-24.12.12-py3-none-any.whl", hash = "sha256:1b6967436f65ca22a42e5373aaa6f2d87966ade9aa38d4baf2a1be550767545e"}, - {file = "flake8_bugbear-24.12.12.tar.gz", hash = "sha256:46273cef0a6b6ff48ca2d69e472f41420a42a46e24b2a8972e4f0d6733d12a64"}, + {file = "flake8_bugbear-25.11.29-py3-none-any.whl", hash = "sha256:9bf15e2970e736d2340da4c0a70493db964061c9c38f708cfe1f7b2d87392298"}, + {file = "flake8_bugbear-25.11.29.tar.gz", hash = "sha256:b5d06710f3d26e595541ad303ad4d5cb52578bd4bccbb2c2c0b2c72e243dafc8"}, ] [package.dependencies] attrs = ">=22.2.0" -flake8 = ">=6.0.0" +flake8 = ">=7.2.0" [package.extras] dev = ["coverage", "hypothesis", "hypothesmith (>=0.2)", "pre-commit", "pytest", "tox"] @@ -1063,14 +1209,14 @@ pydocstyle = ">=2.1" [[package]] name = "flake8-rst-docstrings" -version = "0.3.1" +version = "0.4.0" description = "Python docstring reStructuredText (RST) validator for flake8" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["development"] files = [ - {file = "flake8_rst_docstrings-0.3.1-py3-none-any.whl", hash = "sha256:ed831afca7ee47851e2162d5fa726b823b446fd46085c2164d7979ae5d9a96d7"}, - {file = "flake8_rst_docstrings-0.3.1.tar.gz", hash = "sha256:26dcc1338caf985990677696a8a6a274f73a0c6845b85f567befd3b648db78e2"}, + {file = "flake8_rst_docstrings-0.4.0-py3-none-any.whl", hash = "sha256:f0fe9027af48ef84550bd641eedfbd58a35d182014d372dcb0321535e5face3a"}, + {file = "flake8_rst_docstrings-0.4.0.tar.gz", hash = "sha256:a885cccfac9ff9b1e6d062ac0f8ba79a63fd0cf0fdcf220a5e3d7e6378acc7d0"}, ] [package.dependencies] @@ -1095,202 +1241,227 @@ files = [ [[package]] name = "fonttools" -version = "4.57.0" +version = "4.61.1" description = "Tools to manipulate font files" optional = false -python-versions = ">=3.8" +python-versions = ">=3.10" groups = ["main"] files = [ - {file = "fonttools-4.57.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:babe8d1eb059a53e560e7bf29f8e8f4accc8b6cfb9b5fd10e485bde77e71ef41"}, - {file = "fonttools-4.57.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:81aa97669cd726349eb7bd43ca540cf418b279ee3caba5e2e295fb4e8f841c02"}, - {file = "fonttools-4.57.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0e9618630edd1910ad4f07f60d77c184b2f572c8ee43305ea3265675cbbfe7e"}, - {file = "fonttools-4.57.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:34687a5d21f1d688d7d8d416cb4c5b9c87fca8a1797ec0d74b9fdebfa55c09ab"}, - {file = "fonttools-4.57.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:69ab81b66ebaa8d430ba56c7a5f9abe0183afefd3a2d6e483060343398b13fb1"}, - {file = "fonttools-4.57.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d639397de852f2ccfb3134b152c741406752640a266d9c1365b0f23d7b88077f"}, - {file = "fonttools-4.57.0-cp310-cp310-win32.whl", hash = "sha256:cc066cb98b912f525ae901a24cd381a656f024f76203bc85f78fcc9e66ae5aec"}, - {file = "fonttools-4.57.0-cp310-cp310-win_amd64.whl", hash = "sha256:7a64edd3ff6a7f711a15bd70b4458611fb240176ec11ad8845ccbab4fe6745db"}, - {file = "fonttools-4.57.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3871349303bdec958360eedb619169a779956503ffb4543bb3e6211e09b647c4"}, - {file = "fonttools-4.57.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c59375e85126b15a90fcba3443eaac58f3073ba091f02410eaa286da9ad80ed8"}, - {file = "fonttools-4.57.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:967b65232e104f4b0f6370a62eb33089e00024f2ce143aecbf9755649421c683"}, - {file = "fonttools-4.57.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39acf68abdfc74e19de7485f8f7396fa4d2418efea239b7061d6ed6a2510c746"}, - {file = "fonttools-4.57.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9d077f909f2343daf4495ba22bb0e23b62886e8ec7c109ee8234bdbd678cf344"}, - {file = "fonttools-4.57.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:46370ac47a1e91895d40e9ad48effbe8e9d9db1a4b80888095bc00e7beaa042f"}, - {file = "fonttools-4.57.0-cp311-cp311-win32.whl", hash = "sha256:ca2aed95855506b7ae94e8f1f6217b7673c929e4f4f1217bcaa236253055cb36"}, - {file = "fonttools-4.57.0-cp311-cp311-win_amd64.whl", hash = "sha256:17168a4670bbe3775f3f3f72d23ee786bd965395381dfbb70111e25e81505b9d"}, - {file = "fonttools-4.57.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:889e45e976c74abc7256d3064aa7c1295aa283c6bb19810b9f8b604dfe5c7f31"}, - {file = "fonttools-4.57.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0425c2e052a5f1516c94e5855dbda706ae5a768631e9fcc34e57d074d1b65b92"}, - {file = "fonttools-4.57.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44c26a311be2ac130f40a96769264809d3b0cb297518669db437d1cc82974888"}, - {file = "fonttools-4.57.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84c41ba992df5b8d680b89fd84c6a1f2aca2b9f1ae8a67400c8930cd4ea115f6"}, - {file = "fonttools-4.57.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ea1e9e43ca56b0c12440a7c689b1350066595bebcaa83baad05b8b2675129d98"}, - {file = "fonttools-4.57.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:84fd56c78d431606332a0627c16e2a63d243d0d8b05521257d77c6529abe14d8"}, - {file = "fonttools-4.57.0-cp312-cp312-win32.whl", hash = "sha256:f4376819c1c778d59e0a31db5dc6ede854e9edf28bbfa5b756604727f7f800ac"}, - {file = "fonttools-4.57.0-cp312-cp312-win_amd64.whl", hash = "sha256:57e30241524879ea10cdf79c737037221f77cc126a8cdc8ff2c94d4a522504b9"}, - {file = "fonttools-4.57.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:408ce299696012d503b714778d89aa476f032414ae57e57b42e4b92363e0b8ef"}, - {file = "fonttools-4.57.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:bbceffc80aa02d9e8b99f2a7491ed8c4a783b2fc4020119dc405ca14fb5c758c"}, - {file = "fonttools-4.57.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f022601f3ee9e1f6658ed6d184ce27fa5216cee5b82d279e0f0bde5deebece72"}, - {file = "fonttools-4.57.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4dea5893b58d4637ffa925536462ba626f8a1b9ffbe2f5c272cdf2c6ebadb817"}, - {file = "fonttools-4.57.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dff02c5c8423a657c550b48231d0a48d7e2b2e131088e55983cfe74ccc2c7cc9"}, - {file = "fonttools-4.57.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:767604f244dc17c68d3e2dbf98e038d11a18abc078f2d0f84b6c24571d9c0b13"}, - {file = "fonttools-4.57.0-cp313-cp313-win32.whl", hash = "sha256:8e2e12d0d862f43d51e5afb8b9751c77e6bec7d2dc00aad80641364e9df5b199"}, - {file = "fonttools-4.57.0-cp313-cp313-win_amd64.whl", hash = "sha256:f1d6bc9c23356908db712d282acb3eebd4ae5ec6d8b696aa40342b1d84f8e9e3"}, - {file = "fonttools-4.57.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:9d57b4e23ebbe985125d3f0cabbf286efa191ab60bbadb9326091050d88e8213"}, - {file = "fonttools-4.57.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:579ba873d7f2a96f78b2e11028f7472146ae181cae0e4d814a37a09e93d5c5cc"}, - {file = "fonttools-4.57.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e3e1ec10c29bae0ea826b61f265ec5c858c5ba2ce2e69a71a62f285cf8e4595"}, - {file = "fonttools-4.57.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1968f2a2003c97c4ce6308dc2498d5fd4364ad309900930aa5a503c9851aec8"}, - {file = "fonttools-4.57.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:aff40f8ac6763d05c2c8f6d240c6dac4bb92640a86d9b0c3f3fff4404f34095c"}, - {file = "fonttools-4.57.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:d07f1b64008e39fceae7aa99e38df8385d7d24a474a8c9872645c4397b674481"}, - {file = "fonttools-4.57.0-cp38-cp38-win32.whl", hash = "sha256:51d8482e96b28fb28aa8e50b5706f3cee06de85cbe2dce80dbd1917ae22ec5a6"}, - {file = "fonttools-4.57.0-cp38-cp38-win_amd64.whl", hash = "sha256:03290e818782e7edb159474144fca11e36a8ed6663d1fcbd5268eb550594fd8e"}, - {file = "fonttools-4.57.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7339e6a3283e4b0ade99cade51e97cde3d54cd6d1c3744459e886b66d630c8b3"}, - {file = "fonttools-4.57.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:05efceb2cb5f6ec92a4180fcb7a64aa8d3385fd49cfbbe459350229d1974f0b1"}, - {file = "fonttools-4.57.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a97bb05eb24637714a04dee85bdf0ad1941df64fe3b802ee4ac1c284a5f97b7c"}, - {file = "fonttools-4.57.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:541cb48191a19ceb1a2a4b90c1fcebd22a1ff7491010d3cf840dd3a68aebd654"}, - {file = "fonttools-4.57.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:cdef9a056c222d0479a1fdb721430f9efd68268014c54e8166133d2643cb05d9"}, - {file = "fonttools-4.57.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3cf97236b192a50a4bf200dc5ba405aa78d4f537a2c6e4c624bb60466d5b03bd"}, - {file = "fonttools-4.57.0-cp39-cp39-win32.whl", hash = "sha256:e952c684274a7714b3160f57ec1d78309f955c6335c04433f07d36c5eb27b1f9"}, - {file = "fonttools-4.57.0-cp39-cp39-win_amd64.whl", hash = "sha256:a2a722c0e4bfd9966a11ff55c895c817158fcce1b2b6700205a376403b546ad9"}, - {file = "fonttools-4.57.0-py3-none-any.whl", hash = "sha256:3122c604a675513c68bd24c6a8f9091f1c2376d18e8f5fe5a101746c81b3e98f"}, - {file = "fonttools-4.57.0.tar.gz", hash = "sha256:727ece10e065be2f9dd239d15dd5d60a66e17eac11aea47d447f9f03fdbc42de"}, + {file = "fonttools-4.61.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c7db70d57e5e1089a274cbb2b1fd635c9a24de809a231b154965d415d6c6d24"}, + {file = "fonttools-4.61.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5fe9fd43882620017add5eabb781ebfbc6998ee49b35bd7f8f79af1f9f99a958"}, + {file = "fonttools-4.61.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8db08051fc9e7d8bc622f2112511b8107d8f27cd89e2f64ec45e9825e8288da"}, + {file = "fonttools-4.61.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a76d4cb80f41ba94a6691264be76435e5f72f2cb3cab0b092a6212855f71c2f6"}, + {file = "fonttools-4.61.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a13fc8aeb24bad755eea8f7f9d409438eb94e82cf86b08fe77a03fbc8f6a96b1"}, + {file = "fonttools-4.61.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b846a1fcf8beadeb9ea4f44ec5bdde393e2f1569e17d700bfc49cd69bde75881"}, + {file = "fonttools-4.61.1-cp310-cp310-win32.whl", hash = "sha256:78a7d3ab09dc47ac1a363a493e6112d8cabed7ba7caad5f54dbe2f08676d1b47"}, + {file = "fonttools-4.61.1-cp310-cp310-win_amd64.whl", hash = "sha256:eff1ac3cc66c2ac7cda1e64b4e2f3ffef474b7335f92fc3833fc632d595fcee6"}, + {file = "fonttools-4.61.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c6604b735bb12fef8e0efd5578c9fb5d3d8532d5001ea13a19cddf295673ee09"}, + {file = "fonttools-4.61.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5ce02f38a754f207f2f06557523cd39a06438ba3aafc0639c477ac409fc64e37"}, + {file = "fonttools-4.61.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:77efb033d8d7ff233385f30c62c7c79271c8885d5c9657d967ede124671bbdfb"}, + {file = "fonttools-4.61.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:75c1a6dfac6abd407634420c93864a1e274ebc1c7531346d9254c0d8f6ca00f9"}, + {file = "fonttools-4.61.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0de30bfe7745c0d1ffa2b0b7048fb7123ad0d71107e10ee090fa0b16b9452e87"}, + {file = "fonttools-4.61.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:58b0ee0ab5b1fc9921eccfe11d1435added19d6494dde14e323f25ad2bc30c56"}, + {file = "fonttools-4.61.1-cp311-cp311-win32.whl", hash = "sha256:f79b168428351d11e10c5aeb61a74e1851ec221081299f4cf56036a95431c43a"}, + {file = "fonttools-4.61.1-cp311-cp311-win_amd64.whl", hash = "sha256:fe2efccb324948a11dd09d22136fe2ac8a97d6c1347cf0b58a911dcd529f66b7"}, + {file = "fonttools-4.61.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f3cb4a569029b9f291f88aafc927dd53683757e640081ca8c412781ea144565e"}, + {file = "fonttools-4.61.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41a7170d042e8c0024703ed13b71893519a1a6d6e18e933e3ec7507a2c26a4b2"}, + {file = "fonttools-4.61.1-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:10d88e55330e092940584774ee5e8a6971b01fc2f4d3466a1d6c158230880796"}, + {file = "fonttools-4.61.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:15acc09befd16a0fb8a8f62bc147e1a82817542d72184acca9ce6e0aeda9fa6d"}, + {file = "fonttools-4.61.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e6bcdf33aec38d16508ce61fd81838f24c83c90a1d1b8c68982857038673d6b8"}, + {file = "fonttools-4.61.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5fade934607a523614726119164ff621e8c30e8fa1ffffbbd358662056ba69f0"}, + {file = "fonttools-4.61.1-cp312-cp312-win32.whl", hash = "sha256:75da8f28eff26defba42c52986de97b22106cb8f26515b7c22443ebc9c2d3261"}, + {file = "fonttools-4.61.1-cp312-cp312-win_amd64.whl", hash = "sha256:497c31ce314219888c0e2fce5ad9178ca83fe5230b01a5006726cdf3ac9f24d9"}, + {file = "fonttools-4.61.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8c56c488ab471628ff3bfa80964372fc13504ece601e0d97a78ee74126b2045c"}, + {file = "fonttools-4.61.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dc492779501fa723b04d0ab1f5be046797fee17d27700476edc7ee9ae535a61e"}, + {file = "fonttools-4.61.1-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:64102ca87e84261419c3747a0d20f396eb024bdbeb04c2bfb37e2891f5fadcb5"}, + {file = "fonttools-4.61.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c1b526c8d3f615a7b1867f38a9410849c8f4aef078535742198e942fba0e9bd"}, + {file = "fonttools-4.61.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:41ed4b5ec103bd306bb68f81dc166e77409e5209443e5773cb4ed837bcc9b0d3"}, + {file = "fonttools-4.61.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b501c862d4901792adaec7c25b1ecc749e2662543f68bb194c42ba18d6eec98d"}, + {file = "fonttools-4.61.1-cp313-cp313-win32.whl", hash = "sha256:4d7092bb38c53bbc78e9255a59158b150bcdc115a1e3b3ce0b5f267dc35dd63c"}, + {file = "fonttools-4.61.1-cp313-cp313-win_amd64.whl", hash = "sha256:21e7c8d76f62ab13c9472ccf74515ca5b9a761d1bde3265152a6dc58700d895b"}, + {file = "fonttools-4.61.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:fff4f534200a04b4a36e7ae3cb74493afe807b517a09e99cb4faa89a34ed6ecd"}, + {file = "fonttools-4.61.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:d9203500f7c63545b4ce3799319fe4d9feb1a1b89b28d3cb5abd11b9dd64147e"}, + {file = "fonttools-4.61.1-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fa646ecec9528bef693415c79a86e733c70a4965dd938e9a226b0fc64c9d2e6c"}, + {file = "fonttools-4.61.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:11f35ad7805edba3aac1a3710d104592df59f4b957e30108ae0ba6c10b11dd75"}, + {file = "fonttools-4.61.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b931ae8f62db78861b0ff1ac017851764602288575d65b8e8ff1963fed419063"}, + {file = "fonttools-4.61.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b148b56f5de675ee16d45e769e69f87623a4944f7443850bf9a9376e628a89d2"}, + {file = "fonttools-4.61.1-cp314-cp314-win32.whl", hash = "sha256:9b666a475a65f4e839d3d10473fad6d47e0a9db14a2f4a224029c5bfde58ad2c"}, + {file = "fonttools-4.61.1-cp314-cp314-win_amd64.whl", hash = "sha256:4f5686e1fe5fce75d82d93c47a438a25bf0d1319d2843a926f741140b2b16e0c"}, + {file = "fonttools-4.61.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:e76ce097e3c57c4bcb67c5aa24a0ecdbd9f74ea9219997a707a4061fbe2707aa"}, + {file = "fonttools-4.61.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:9cfef3ab326780c04d6646f68d4b4742aae222e8b8ea1d627c74e38afcbc9d91"}, + {file = "fonttools-4.61.1-cp314-cp314t-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a75c301f96db737e1c5ed5fd7d77d9c34466de16095a266509e13da09751bd19"}, + {file = "fonttools-4.61.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:91669ccac46bbc1d09e9273546181919064e8df73488ea087dcac3e2968df9ba"}, + {file = "fonttools-4.61.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c33ab3ca9d3ccd581d58e989d67554e42d8d4ded94ab3ade3508455fe70e65f7"}, + {file = "fonttools-4.61.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:664c5a68ec406f6b1547946683008576ef8b38275608e1cee6c061828171c118"}, + {file = "fonttools-4.61.1-cp314-cp314t-win32.whl", hash = "sha256:aed04cabe26f30c1647ef0e8fbb207516fd40fe9472e9439695f5c6998e60ac5"}, + {file = "fonttools-4.61.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2180f14c141d2f0f3da43f3a81bc8aa4684860f6b0e6f9e165a4831f24e6a23b"}, + {file = "fonttools-4.61.1-py3-none-any.whl", hash = "sha256:17d2bf5d541add43822bcf0c43d7d847b160c9bb01d15d5007d84e2217aaa371"}, + {file = "fonttools-4.61.1.tar.gz", hash = "sha256:6675329885c44657f826ef01d9e4fb33b9158e9d93c537d84ad8399539bc6f69"}, ] [package.extras] -all = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\"", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0) ; python_version <= \"3.12\"", "xattr ; sys_platform == \"darwin\"", "zopfli (>=0.1.4)"] +all = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\"", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.45.0)", "unicodedata2 (>=17.0.0) ; python_version <= \"3.14\"", "xattr ; sys_platform == \"darwin\"", "zopfli (>=0.1.4)"] graphite = ["lz4 (>=1.7.4.2)"] interpolatable = ["munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\""] lxml = ["lxml (>=4.0)"] pathops = ["skia-pathops (>=0.5.0)"] plot = ["matplotlib"] -repacker = ["uharfbuzz (>=0.23.0)"] +repacker = ["uharfbuzz (>=0.45.0)"] symfont = ["sympy"] type1 = ["xattr ; sys_platform == \"darwin\""] -ufo = ["fs (>=2.2.0,<3)"] -unicode = ["unicodedata2 (>=15.1.0) ; python_version <= \"3.12\""] +unicode = ["unicodedata2 (>=17.0.0) ; python_version <= \"3.14\""] woff = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "zopfli (>=0.1.4)"] [[package]] name = "frozenlist" -version = "1.6.0" +version = "1.8.0" description = "A list-like structure which implements collections.abc.MutableSequence" optional = false python-versions = ">=3.9" -groups = ["main"] -files = [ - {file = "frozenlist-1.6.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e6e558ea1e47fd6fa8ac9ccdad403e5dd5ecc6ed8dda94343056fa4277d5c65e"}, - {file = "frozenlist-1.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f4b3cd7334a4bbc0c472164f3744562cb72d05002cc6fcf58adb104630bbc352"}, - {file = "frozenlist-1.6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9799257237d0479736e2b4c01ff26b5c7f7694ac9692a426cb717f3dc02fff9b"}, - {file = "frozenlist-1.6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3a7bb0fe1f7a70fb5c6f497dc32619db7d2cdd53164af30ade2f34673f8b1fc"}, - {file = "frozenlist-1.6.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:36d2fc099229f1e4237f563b2a3e0ff7ccebc3999f729067ce4e64a97a7f2869"}, - {file = "frozenlist-1.6.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f27a9f9a86dcf00708be82359db8de86b80d029814e6693259befe82bb58a106"}, - {file = "frozenlist-1.6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75ecee69073312951244f11b8627e3700ec2bfe07ed24e3a685a5979f0412d24"}, - {file = "frozenlist-1.6.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2c7d5aa19714b1b01a0f515d078a629e445e667b9da869a3cd0e6fe7dec78bd"}, - {file = "frozenlist-1.6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69bbd454f0fb23b51cadc9bdba616c9678e4114b6f9fa372d462ff2ed9323ec8"}, - {file = "frozenlist-1.6.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7daa508e75613809c7a57136dec4871a21bca3080b3a8fc347c50b187df4f00c"}, - {file = "frozenlist-1.6.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:89ffdb799154fd4d7b85c56d5fa9d9ad48946619e0eb95755723fffa11022d75"}, - {file = "frozenlist-1.6.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:920b6bd77d209931e4c263223381d63f76828bec574440f29eb497cf3394c249"}, - {file = "frozenlist-1.6.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d3ceb265249fb401702fce3792e6b44c1166b9319737d21495d3611028d95769"}, - {file = "frozenlist-1.6.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:52021b528f1571f98a7d4258c58aa8d4b1a96d4f01d00d51f1089f2e0323cb02"}, - {file = "frozenlist-1.6.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0f2ca7810b809ed0f1917293050163c7654cefc57a49f337d5cd9de717b8fad3"}, - {file = "frozenlist-1.6.0-cp310-cp310-win32.whl", hash = "sha256:0e6f8653acb82e15e5443dba415fb62a8732b68fe09936bb6d388c725b57f812"}, - {file = "frozenlist-1.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:f1a39819a5a3e84304cd286e3dc62a549fe60985415851b3337b6f5cc91907f1"}, - {file = "frozenlist-1.6.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ae8337990e7a45683548ffb2fee1af2f1ed08169284cd829cdd9a7fa7470530d"}, - {file = "frozenlist-1.6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8c952f69dd524558694818a461855f35d36cc7f5c0adddce37e962c85d06eac0"}, - {file = "frozenlist-1.6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8f5fef13136c4e2dee91bfb9a44e236fff78fc2cd9f838eddfc470c3d7d90afe"}, - {file = "frozenlist-1.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:716bbba09611b4663ecbb7cd022f640759af8259e12a6ca939c0a6acd49eedba"}, - {file = "frozenlist-1.6.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7b8c4dc422c1a3ffc550b465090e53b0bf4839047f3e436a34172ac67c45d595"}, - {file = "frozenlist-1.6.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b11534872256e1666116f6587a1592ef395a98b54476addb5e8d352925cb5d4a"}, - {file = "frozenlist-1.6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c6eceb88aaf7221f75be6ab498dc622a151f5f88d536661af3ffc486245a626"}, - {file = "frozenlist-1.6.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62c828a5b195570eb4b37369fcbbd58e96c905768d53a44d13044355647838ff"}, - {file = "frozenlist-1.6.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1c6bd2c6399920c9622362ce95a7d74e7f9af9bfec05fff91b8ce4b9647845a"}, - {file = "frozenlist-1.6.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:49ba23817781e22fcbd45fd9ff2b9b8cdb7b16a42a4851ab8025cae7b22e96d0"}, - {file = "frozenlist-1.6.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:431ef6937ae0f853143e2ca67d6da76c083e8b1fe3df0e96f3802fd37626e606"}, - {file = "frozenlist-1.6.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9d124b38b3c299ca68433597ee26b7819209cb8a3a9ea761dfe9db3a04bba584"}, - {file = "frozenlist-1.6.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:118e97556306402e2b010da1ef21ea70cb6d6122e580da64c056b96f524fbd6a"}, - {file = "frozenlist-1.6.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:fb3b309f1d4086b5533cf7bbcf3f956f0ae6469664522f1bde4feed26fba60f1"}, - {file = "frozenlist-1.6.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:54dece0d21dce4fdb188a1ffc555926adf1d1c516e493c2914d7c370e454bc9e"}, - {file = "frozenlist-1.6.0-cp311-cp311-win32.whl", hash = "sha256:654e4ba1d0b2154ca2f096bed27461cf6160bc7f504a7f9a9ef447c293caf860"}, - {file = "frozenlist-1.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:3e911391bffdb806001002c1f860787542f45916c3baf764264a52765d5a5603"}, - {file = "frozenlist-1.6.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:c5b9e42ace7d95bf41e19b87cec8f262c41d3510d8ad7514ab3862ea2197bfb1"}, - {file = "frozenlist-1.6.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ca9973735ce9f770d24d5484dcb42f68f135351c2fc81a7a9369e48cf2998a29"}, - {file = "frozenlist-1.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6ac40ec76041c67b928ca8aaffba15c2b2ee3f5ae8d0cb0617b5e63ec119ca25"}, - {file = "frozenlist-1.6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:95b7a8a3180dfb280eb044fdec562f9b461614c0ef21669aea6f1d3dac6ee576"}, - {file = "frozenlist-1.6.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c444d824e22da6c9291886d80c7d00c444981a72686e2b59d38b285617cb52c8"}, - {file = "frozenlist-1.6.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb52c8166499a8150bfd38478248572c924c003cbb45fe3bcd348e5ac7c000f9"}, - {file = "frozenlist-1.6.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b35298b2db9c2468106278537ee529719228950a5fdda686582f68f247d1dc6e"}, - {file = "frozenlist-1.6.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d108e2d070034f9d57210f22fefd22ea0d04609fc97c5f7f5a686b3471028590"}, - {file = "frozenlist-1.6.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e1be9111cb6756868ac242b3c2bd1f09d9aea09846e4f5c23715e7afb647103"}, - {file = "frozenlist-1.6.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:94bb451c664415f02f07eef4ece976a2c65dcbab9c2f1705b7031a3a75349d8c"}, - {file = "frozenlist-1.6.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:d1a686d0b0949182b8faddea596f3fc11f44768d1f74d4cad70213b2e139d821"}, - {file = "frozenlist-1.6.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:ea8e59105d802c5a38bdbe7362822c522230b3faba2aa35c0fa1765239b7dd70"}, - {file = "frozenlist-1.6.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:abc4e880a9b920bc5020bf6a431a6bb40589d9bca3975c980495f63632e8382f"}, - {file = "frozenlist-1.6.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9a79713adfe28830f27a3c62f6b5406c37376c892b05ae070906f07ae4487046"}, - {file = "frozenlist-1.6.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9a0318c2068e217a8f5e3b85e35899f5a19e97141a45bb925bb357cfe1daf770"}, - {file = "frozenlist-1.6.0-cp312-cp312-win32.whl", hash = "sha256:853ac025092a24bb3bf09ae87f9127de9fe6e0c345614ac92536577cf956dfcc"}, - {file = "frozenlist-1.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:2bdfe2d7e6c9281c6e55523acd6c2bf77963cb422fdc7d142fb0cb6621b66878"}, - {file = "frozenlist-1.6.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1d7fb014fe0fbfee3efd6a94fc635aeaa68e5e1720fe9e57357f2e2c6e1a647e"}, - {file = "frozenlist-1.6.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:01bcaa305a0fdad12745502bfd16a1c75b14558dabae226852f9159364573117"}, - {file = "frozenlist-1.6.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8b314faa3051a6d45da196a2c495e922f987dc848e967d8cfeaee8a0328b1cd4"}, - {file = "frozenlist-1.6.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da62fecac21a3ee10463d153549d8db87549a5e77eefb8c91ac84bb42bb1e4e3"}, - {file = "frozenlist-1.6.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d1eb89bf3454e2132e046f9599fbcf0a4483ed43b40f545551a39316d0201cd1"}, - {file = "frozenlist-1.6.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d18689b40cb3936acd971f663ccb8e2589c45db5e2c5f07e0ec6207664029a9c"}, - {file = "frozenlist-1.6.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e67ddb0749ed066b1a03fba812e2dcae791dd50e5da03be50b6a14d0c1a9ee45"}, - {file = "frozenlist-1.6.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fc5e64626e6682638d6e44398c9baf1d6ce6bc236d40b4b57255c9d3f9761f1f"}, - {file = "frozenlist-1.6.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:437cfd39564744ae32ad5929e55b18ebd88817f9180e4cc05e7d53b75f79ce85"}, - {file = "frozenlist-1.6.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:62dd7df78e74d924952e2feb7357d826af8d2f307557a779d14ddf94d7311be8"}, - {file = "frozenlist-1.6.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:a66781d7e4cddcbbcfd64de3d41a61d6bdde370fc2e38623f30b2bd539e84a9f"}, - {file = "frozenlist-1.6.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:482fe06e9a3fffbcd41950f9d890034b4a54395c60b5e61fae875d37a699813f"}, - {file = "frozenlist-1.6.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:e4f9373c500dfc02feea39f7a56e4f543e670212102cc2eeb51d3a99c7ffbde6"}, - {file = "frozenlist-1.6.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e69bb81de06827147b7bfbaeb284d85219fa92d9f097e32cc73675f279d70188"}, - {file = "frozenlist-1.6.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7613d9977d2ab4a9141dde4a149f4357e4065949674c5649f920fec86ecb393e"}, - {file = "frozenlist-1.6.0-cp313-cp313-win32.whl", hash = "sha256:4def87ef6d90429f777c9d9de3961679abf938cb6b7b63d4a7eb8a268babfce4"}, - {file = "frozenlist-1.6.0-cp313-cp313-win_amd64.whl", hash = "sha256:37a8a52c3dfff01515e9bbbee0e6063181362f9de3db2ccf9bc96189b557cbfd"}, - {file = "frozenlist-1.6.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:46138f5a0773d064ff663d273b309b696293d7a7c00a0994c5c13a5078134b64"}, - {file = "frozenlist-1.6.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:f88bc0a2b9c2a835cb888b32246c27cdab5740059fb3688852bf91e915399b91"}, - {file = "frozenlist-1.6.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:777704c1d7655b802c7850255639672e90e81ad6fa42b99ce5ed3fbf45e338dd"}, - {file = "frozenlist-1.6.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85ef8d41764c7de0dcdaf64f733a27352248493a85a80661f3c678acd27e31f2"}, - {file = "frozenlist-1.6.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:da5cb36623f2b846fb25009d9d9215322318ff1c63403075f812b3b2876c8506"}, - {file = "frozenlist-1.6.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cbb56587a16cf0fb8acd19e90ff9924979ac1431baea8681712716a8337577b0"}, - {file = "frozenlist-1.6.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6154c3ba59cda3f954c6333025369e42c3acd0c6e8b6ce31eb5c5b8116c07e0"}, - {file = "frozenlist-1.6.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e8246877afa3f1ae5c979fe85f567d220f86a50dc6c493b9b7d8191181ae01e"}, - {file = "frozenlist-1.6.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b0f6cce16306d2e117cf9db71ab3a9e8878a28176aeaf0dbe35248d97b28d0c"}, - {file = "frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:1b8e8cd8032ba266f91136d7105706ad57770f3522eac4a111d77ac126a25a9b"}, - {file = "frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:e2ada1d8515d3ea5378c018a5f6d14b4994d4036591a52ceaf1a1549dec8e1ad"}, - {file = "frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:cdb2c7f071e4026c19a3e32b93a09e59b12000751fc9b0b7758da899e657d215"}, - {file = "frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:03572933a1969a6d6ab509d509e5af82ef80d4a5d4e1e9f2e1cdd22c77a3f4d2"}, - {file = "frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:77effc978947548b676c54bbd6a08992759ea6f410d4987d69feea9cd0919911"}, - {file = "frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a2bda8be77660ad4089caf2223fdbd6db1858462c4b85b67fbfa22102021e497"}, - {file = "frozenlist-1.6.0-cp313-cp313t-win32.whl", hash = "sha256:a4d96dc5bcdbd834ec6b0f91027817214216b5b30316494d2b1aebffb87c534f"}, - {file = "frozenlist-1.6.0-cp313-cp313t-win_amd64.whl", hash = "sha256:e18036cb4caa17ea151fd5f3d70be9d354c99eb8cf817a3ccde8a7873b074348"}, - {file = "frozenlist-1.6.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:536a1236065c29980c15c7229fbb830dedf809708c10e159b8136534233545f0"}, - {file = "frozenlist-1.6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ed5e3a4462ff25ca84fb09e0fada8ea267df98a450340ead4c91b44857267d70"}, - {file = "frozenlist-1.6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e19c0fc9f4f030fcae43b4cdec9e8ab83ffe30ec10c79a4a43a04d1af6c5e1ad"}, - {file = "frozenlist-1.6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7c608f833897501dac548585312d73a7dca028bf3b8688f0d712b7acfaf7fb3"}, - {file = "frozenlist-1.6.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0dbae96c225d584f834b8d3cc688825911960f003a85cb0fd20b6e5512468c42"}, - {file = "frozenlist-1.6.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:625170a91dd7261a1d1c2a0c1a353c9e55d21cd67d0852185a5fef86587e6f5f"}, - {file = "frozenlist-1.6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1db8b2fc7ee8a940b547a14c10e56560ad3ea6499dc6875c354e2335812f739d"}, - {file = "frozenlist-1.6.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4da6fc43048b648275a220e3a61c33b7fff65d11bdd6dcb9d9c145ff708b804c"}, - {file = "frozenlist-1.6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ef8e7e8f2f3820c5f175d70fdd199b79e417acf6c72c5d0aa8f63c9f721646f"}, - {file = "frozenlist-1.6.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:aa733d123cc78245e9bb15f29b44ed9e5780dc6867cfc4e544717b91f980af3b"}, - {file = "frozenlist-1.6.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:ba7f8d97152b61f22d7f59491a781ba9b177dd9f318486c5fbc52cde2db12189"}, - {file = "frozenlist-1.6.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:56a0b8dd6d0d3d971c91f1df75e824986667ccce91e20dca2023683814344791"}, - {file = "frozenlist-1.6.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:5c9e89bf19ca148efcc9e3c44fd4c09d5af85c8a7dd3dbd0da1cb83425ef4983"}, - {file = "frozenlist-1.6.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:1330f0a4376587face7637dfd245380a57fe21ae8f9d360c1c2ef8746c4195fa"}, - {file = "frozenlist-1.6.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2187248203b59625566cac53572ec8c2647a140ee2738b4e36772930377a533c"}, - {file = "frozenlist-1.6.0-cp39-cp39-win32.whl", hash = "sha256:2b8cf4cfea847d6c12af06091561a89740f1f67f331c3fa8623391905e878530"}, - {file = "frozenlist-1.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:1255d5d64328c5a0d066ecb0f02034d086537925f1f04b50b1ae60d37afbf572"}, - {file = "frozenlist-1.6.0-py3-none-any.whl", hash = "sha256:535eec9987adb04701266b92745d6cdcef2e77669299359c3009c3404dd5d191"}, - {file = "frozenlist-1.6.0.tar.gz", hash = "sha256:b99655c32c1c8e06d111e7f41c06c29a5318cb1835df23a45518e02a47c63b68"}, +groups = ["main", "torch-cuda"] +files = [ + {file = "frozenlist-1.8.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b37f6d31b3dcea7deb5e9696e529a6aa4a898adc33db82da12e4c60a7c4d2011"}, + {file = "frozenlist-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ef2b7b394f208233e471abc541cc6991f907ffd47dc72584acee3147899d6565"}, + {file = "frozenlist-1.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a88f062f072d1589b7b46e951698950e7da00442fc1cacbe17e19e025dc327ad"}, + {file = "frozenlist-1.8.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f57fb59d9f385710aa7060e89410aeb5058b99e62f4d16b08b91986b9a2140c2"}, + {file = "frozenlist-1.8.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:799345ab092bee59f01a915620b5d014698547afd011e691a208637312db9186"}, + {file = "frozenlist-1.8.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c23c3ff005322a6e16f71bf8692fcf4d5a304aaafe1e262c98c6d4adc7be863e"}, + {file = "frozenlist-1.8.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8a76ea0f0b9dfa06f254ee06053d93a600865b3274358ca48a352ce4f0798450"}, + {file = "frozenlist-1.8.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c7366fe1418a6133d5aa824ee53d406550110984de7637d65a178010f759c6ef"}, + {file = "frozenlist-1.8.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:13d23a45c4cebade99340c4165bd90eeb4a56c6d8a9d8aa49568cac19a6d0dc4"}, + {file = "frozenlist-1.8.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:e4a3408834f65da56c83528fb52ce7911484f0d1eaf7b761fc66001db1646eff"}, + {file = "frozenlist-1.8.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:42145cd2748ca39f32801dad54aeea10039da6f86e303659db90db1c4b614c8c"}, + {file = "frozenlist-1.8.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e2de870d16a7a53901e41b64ffdf26f2fbb8917b3e6ebf398098d72c5b20bd7f"}, + {file = "frozenlist-1.8.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:20e63c9493d33ee48536600d1a5c95eefc870cd71e7ab037763d1fbb89cc51e7"}, + {file = "frozenlist-1.8.0-cp310-cp310-win32.whl", hash = "sha256:adbeebaebae3526afc3c96fad434367cafbfd1b25d72369a9e5858453b1bb71a"}, + {file = "frozenlist-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:667c3777ca571e5dbeb76f331562ff98b957431df140b54c85fd4d52eea8d8f6"}, + {file = "frozenlist-1.8.0-cp310-cp310-win_arm64.whl", hash = "sha256:80f85f0a7cc86e7a54c46d99c9e1318ff01f4687c172ede30fd52d19d1da1c8e"}, + {file = "frozenlist-1.8.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:09474e9831bc2b2199fad6da3c14c7b0fbdd377cce9d3d77131be28906cb7d84"}, + {file = "frozenlist-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:17c883ab0ab67200b5f964d2b9ed6b00971917d5d8a92df149dc2c9779208ee9"}, + {file = "frozenlist-1.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fa47e444b8ba08fffd1c18e8cdb9a75db1b6a27f17507522834ad13ed5922b93"}, + {file = "frozenlist-1.8.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2552f44204b744fba866e573be4c1f9048d6a324dfe14475103fd51613eb1d1f"}, + {file = "frozenlist-1.8.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:957e7c38f250991e48a9a73e6423db1bb9dd14e722a10f6b8bb8e16a0f55f695"}, + {file = "frozenlist-1.8.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:8585e3bb2cdea02fc88ffa245069c36555557ad3609e83be0ec71f54fd4abb52"}, + {file = "frozenlist-1.8.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:edee74874ce20a373d62dc28b0b18b93f645633c2943fd90ee9d898550770581"}, + {file = "frozenlist-1.8.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c9a63152fe95756b85f31186bddf42e4c02c6321207fd6601a1c89ebac4fe567"}, + {file = "frozenlist-1.8.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b6db2185db9be0a04fecf2f241c70b63b1a242e2805be291855078f2b404dd6b"}, + {file = "frozenlist-1.8.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:f4be2e3d8bc8aabd566f8d5b8ba7ecc09249d74ba3c9ed52e54dc23a293f0b92"}, + {file = "frozenlist-1.8.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c8d1634419f39ea6f5c427ea2f90ca85126b54b50837f31497f3bf38266e853d"}, + {file = "frozenlist-1.8.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:1a7fa382a4a223773ed64242dbe1c9c326ec09457e6b8428efb4118c685c3dfd"}, + {file = "frozenlist-1.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:11847b53d722050808926e785df837353bd4d75f1d494377e59b23594d834967"}, + {file = "frozenlist-1.8.0-cp311-cp311-win32.whl", hash = "sha256:27c6e8077956cf73eadd514be8fb04d77fc946a7fe9f7fe167648b0b9085cc25"}, + {file = "frozenlist-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:ac913f8403b36a2c8610bbfd25b8013488533e71e62b4b4adce9c86c8cea905b"}, + {file = "frozenlist-1.8.0-cp311-cp311-win_arm64.whl", hash = "sha256:d4d3214a0f8394edfa3e303136d0575eece0745ff2b47bd2cb2e66dd92d4351a"}, + {file = "frozenlist-1.8.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:78f7b9e5d6f2fdb88cdde9440dc147259b62b9d3b019924def9f6478be254ac1"}, + {file = "frozenlist-1.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:229bf37d2e4acdaf808fd3f06e854a4a7a3661e871b10dc1f8f1896a3b05f18b"}, + {file = "frozenlist-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f833670942247a14eafbb675458b4e61c82e002a148f49e68257b79296e865c4"}, + {file = "frozenlist-1.8.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:494a5952b1c597ba44e0e78113a7266e656b9794eec897b19ead706bd7074383"}, + {file = "frozenlist-1.8.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96f423a119f4777a4a056b66ce11527366a8bb92f54e541ade21f2374433f6d4"}, + {file = "frozenlist-1.8.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3462dd9475af2025c31cc61be6652dfa25cbfb56cbbf52f4ccfe029f38decaf8"}, + {file = "frozenlist-1.8.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c4c800524c9cd9bac5166cd6f55285957fcfc907db323e193f2afcd4d9abd69b"}, + {file = "frozenlist-1.8.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d6a5df73acd3399d893dafc71663ad22534b5aa4f94e8a2fabfe856c3c1b6a52"}, + {file = "frozenlist-1.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:405e8fe955c2280ce66428b3ca55e12b3c4e9c336fb2103a4937e891c69a4a29"}, + {file = "frozenlist-1.8.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:908bd3f6439f2fef9e85031b59fd4f1297af54415fb60e4254a95f75b3cab3f3"}, + {file = "frozenlist-1.8.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:294e487f9ec720bd8ffcebc99d575f7eff3568a08a253d1ee1a0378754b74143"}, + {file = "frozenlist-1.8.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:74c51543498289c0c43656701be6b077f4b265868fa7f8a8859c197006efb608"}, + {file = "frozenlist-1.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:776f352e8329135506a1d6bf16ac3f87bc25b28e765949282dcc627af36123aa"}, + {file = "frozenlist-1.8.0-cp312-cp312-win32.whl", hash = "sha256:433403ae80709741ce34038da08511d4a77062aa924baf411ef73d1146e74faf"}, + {file = "frozenlist-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:34187385b08f866104f0c0617404c8eb08165ab1272e884abc89c112e9c00746"}, + {file = "frozenlist-1.8.0-cp312-cp312-win_arm64.whl", hash = "sha256:fe3c58d2f5db5fbd18c2987cba06d51b0529f52bc3a6cdc33d3f4eab725104bd"}, + {file = "frozenlist-1.8.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8d92f1a84bb12d9e56f818b3a746f3efba93c1b63c8387a73dde655e1e42282a"}, + {file = "frozenlist-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:96153e77a591c8adc2ee805756c61f59fef4cf4073a9275ee86fe8cba41241f7"}, + {file = "frozenlist-1.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f21f00a91358803399890ab167098c131ec2ddd5f8f5fd5fe9c9f2c6fcd91e40"}, + {file = "frozenlist-1.8.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fb30f9626572a76dfe4293c7194a09fb1fe93ba94c7d4f720dfae3b646b45027"}, + {file = "frozenlist-1.8.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eaa352d7047a31d87dafcacbabe89df0aa506abb5b1b85a2fb91bc3faa02d822"}, + {file = "frozenlist-1.8.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:03ae967b4e297f58f8c774c7eabcce57fe3c2434817d4385c50661845a058121"}, + {file = "frozenlist-1.8.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f6292f1de555ffcc675941d65fffffb0a5bcd992905015f85d0592201793e0e5"}, + {file = "frozenlist-1.8.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:29548f9b5b5e3460ce7378144c3010363d8035cea44bc0bf02d57f5a685e084e"}, + {file = "frozenlist-1.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ec3cc8c5d4084591b4237c0a272cc4f50a5b03396a47d9caaf76f5d7b38a4f11"}, + {file = "frozenlist-1.8.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:517279f58009d0b1f2e7c1b130b377a349405da3f7621ed6bfae50b10adf20c1"}, + {file = "frozenlist-1.8.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:db1e72ede2d0d7ccb213f218df6a078a9c09a7de257c2fe8fcef16d5925230b1"}, + {file = "frozenlist-1.8.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b4dec9482a65c54a5044486847b8a66bf10c9cb4926d42927ec4e8fd5db7fed8"}, + {file = "frozenlist-1.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:21900c48ae04d13d416f0e1e0c4d81f7931f73a9dfa0b7a8746fb2fe7dd970ed"}, + {file = "frozenlist-1.8.0-cp313-cp313-win32.whl", hash = "sha256:8b7b94a067d1c504ee0b16def57ad5738701e4ba10cec90529f13fa03c833496"}, + {file = "frozenlist-1.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:878be833caa6a3821caf85eb39c5ba92d28e85df26d57afb06b35b2efd937231"}, + {file = "frozenlist-1.8.0-cp313-cp313-win_arm64.whl", hash = "sha256:44389d135b3ff43ba8cc89ff7f51f5a0bb6b63d829c8300f79a2fe4fe61bcc62"}, + {file = "frozenlist-1.8.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:e25ac20a2ef37e91c1b39938b591457666a0fa835c7783c3a8f33ea42870db94"}, + {file = "frozenlist-1.8.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:07cdca25a91a4386d2e76ad992916a85038a9b97561bf7a3fd12d5d9ce31870c"}, + {file = "frozenlist-1.8.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4e0c11f2cc6717e0a741f84a527c52616140741cd812a50422f83dc31749fb52"}, + {file = "frozenlist-1.8.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b3210649ee28062ea6099cfda39e147fa1bc039583c8ee4481cb7811e2448c51"}, + {file = "frozenlist-1.8.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:581ef5194c48035a7de2aefc72ac6539823bb71508189e5de01d60c9dcd5fa65"}, + {file = "frozenlist-1.8.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3ef2d026f16a2b1866e1d86fc4e1291e1ed8a387b2c333809419a2f8b3a77b82"}, + {file = "frozenlist-1.8.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5500ef82073f599ac84d888e3a8c1f77ac831183244bfd7f11eaa0289fb30714"}, + {file = "frozenlist-1.8.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:50066c3997d0091c411a66e710f4e11752251e6d2d73d70d8d5d4c76442a199d"}, + {file = "frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5c1c8e78426e59b3f8005e9b19f6ff46e5845895adbde20ece9218319eca6506"}, + {file = "frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:eefdba20de0d938cec6a89bd4d70f346a03108a19b9df4248d3cf0d88f1b0f51"}, + {file = "frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:cf253e0e1c3ceb4aaff6df637ce033ff6535fb8c70a764a8f46aafd3d6ab798e"}, + {file = "frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:032efa2674356903cd0261c4317a561a6850f3ac864a63fc1583147fb05a79b0"}, + {file = "frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6da155091429aeba16851ecb10a9104a108bcd32f6c1642867eadaee401c1c41"}, + {file = "frozenlist-1.8.0-cp313-cp313t-win32.whl", hash = "sha256:0f96534f8bfebc1a394209427d0f8a63d343c9779cda6fc25e8e121b5fd8555b"}, + {file = "frozenlist-1.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5d63a068f978fc69421fb0e6eb91a9603187527c86b7cd3f534a5b77a592b888"}, + {file = "frozenlist-1.8.0-cp313-cp313t-win_arm64.whl", hash = "sha256:bf0a7e10b077bf5fb9380ad3ae8ce20ef919a6ad93b4552896419ac7e1d8e042"}, + {file = "frozenlist-1.8.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:cee686f1f4cadeb2136007ddedd0aaf928ab95216e7691c63e50a8ec066336d0"}, + {file = "frozenlist-1.8.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:119fb2a1bd47307e899c2fac7f28e85b9a543864df47aa7ec9d3c1b4545f096f"}, + {file = "frozenlist-1.8.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4970ece02dbc8c3a92fcc5228e36a3e933a01a999f7094ff7c23fbd2beeaa67c"}, + {file = "frozenlist-1.8.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:cba69cb73723c3f329622e34bdbf5ce1f80c21c290ff04256cff1cd3c2036ed2"}, + {file = "frozenlist-1.8.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:778a11b15673f6f1df23d9586f83c4846c471a8af693a22e066508b77d201ec8"}, + {file = "frozenlist-1.8.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0325024fe97f94c41c08872db482cf8ac4800d80e79222c6b0b7b162d5b13686"}, + {file = "frozenlist-1.8.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:97260ff46b207a82a7567b581ab4190bd4dfa09f4db8a8b49d1a958f6aa4940e"}, + {file = "frozenlist-1.8.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:54b2077180eb7f83dd52c40b2750d0a9f175e06a42e3213ce047219de902717a"}, + {file = "frozenlist-1.8.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2f05983daecab868a31e1da44462873306d3cbfd76d1f0b5b69c473d21dbb128"}, + {file = "frozenlist-1.8.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:33f48f51a446114bc5d251fb2954ab0164d5be02ad3382abcbfe07e2531d650f"}, + {file = "frozenlist-1.8.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:154e55ec0655291b5dd1b8731c637ecdb50975a2ae70c606d100750a540082f7"}, + {file = "frozenlist-1.8.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:4314debad13beb564b708b4a496020e5306c7333fa9a3ab90374169a20ffab30"}, + {file = "frozenlist-1.8.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:073f8bf8becba60aa931eb3bc420b217bb7d5b8f4750e6f8b3be7f3da85d38b7"}, + {file = "frozenlist-1.8.0-cp314-cp314-win32.whl", hash = "sha256:bac9c42ba2ac65ddc115d930c78d24ab8d4f465fd3fc473cdedfccadb9429806"}, + {file = "frozenlist-1.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:3e0761f4d1a44f1d1a47996511752cf3dcec5bbdd9cc2b4fe595caf97754b7a0"}, + {file = "frozenlist-1.8.0-cp314-cp314-win_arm64.whl", hash = "sha256:d1eaff1d00c7751b7c6662e9c5ba6eb2c17a2306ba5e2a37f24ddf3cc953402b"}, + {file = "frozenlist-1.8.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:d3bb933317c52d7ea5004a1c442eef86f426886fba134ef8cf4226ea6ee1821d"}, + {file = "frozenlist-1.8.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:8009897cdef112072f93a0efdce29cd819e717fd2f649ee3016efd3cd885a7ed"}, + {file = "frozenlist-1.8.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2c5dcbbc55383e5883246d11fd179782a9d07a986c40f49abe89ddf865913930"}, + {file = "frozenlist-1.8.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:39ecbc32f1390387d2aa4f5a995e465e9e2f79ba3adcac92d68e3e0afae6657c"}, + {file = "frozenlist-1.8.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92db2bf818d5cc8d9c1f1fc56b897662e24ea5adb36ad1f1d82875bd64e03c24"}, + {file = "frozenlist-1.8.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2dc43a022e555de94c3b68a4ef0b11c4f747d12c024a520c7101709a2144fb37"}, + {file = "frozenlist-1.8.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cb89a7f2de3602cfed448095bab3f178399646ab7c61454315089787df07733a"}, + {file = "frozenlist-1.8.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:33139dc858c580ea50e7e60a1b0ea003efa1fd42e6ec7fdbad78fff65fad2fd2"}, + {file = "frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:168c0969a329b416119507ba30b9ea13688fafffac1b7822802537569a1cb0ef"}, + {file = "frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:28bd570e8e189d7f7b001966435f9dac6718324b5be2990ac496cf1ea9ddb7fe"}, + {file = "frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b2a095d45c5d46e5e79ba1e5b9cb787f541a8dee0433836cea4b96a2c439dcd8"}, + {file = "frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:eab8145831a0d56ec9c4139b6c3e594c7a83c2c8be25d5bcf2d86136a532287a"}, + {file = "frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:974b28cf63cc99dfb2188d8d222bc6843656188164848c4f679e63dae4b0708e"}, + {file = "frozenlist-1.8.0-cp314-cp314t-win32.whl", hash = "sha256:342c97bf697ac5480c0a7ec73cd700ecfa5a8a40ac923bd035484616efecc2df"}, + {file = "frozenlist-1.8.0-cp314-cp314t-win_amd64.whl", hash = "sha256:06be8f67f39c8b1dc671f5d83aaefd3358ae5cdcf8314552c57e7ed3e6475bdd"}, + {file = "frozenlist-1.8.0-cp314-cp314t-win_arm64.whl", hash = "sha256:102e6314ca4da683dca92e3b1355490fed5f313b768500084fbe6371fddfdb79"}, + {file = "frozenlist-1.8.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d8b7138e5cd0647e4523d6685b0eac5d4be9a184ae9634492f25c6eb38c12a47"}, + {file = "frozenlist-1.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a6483e309ca809f1efd154b4d37dc6d9f61037d6c6a81c2dc7a15cb22c8c5dca"}, + {file = "frozenlist-1.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1b9290cf81e95e93fdf90548ce9d3c1211cf574b8e3f4b3b7cb0537cf2227068"}, + {file = "frozenlist-1.8.0-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:59a6a5876ca59d1b63af8cd5e7ffffb024c3dc1e9cf9301b21a2e76286505c95"}, + {file = "frozenlist-1.8.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6dc4126390929823e2d2d9dc79ab4046ed74680360fc5f38b585c12c66cdf459"}, + {file = "frozenlist-1.8.0-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:332db6b2563333c5671fecacd085141b5800cb866be16d5e3eb15a2086476675"}, + {file = "frozenlist-1.8.0-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9ff15928d62a0b80bb875655c39bf517938c7d589554cbd2669be42d97c2cb61"}, + {file = "frozenlist-1.8.0-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7bf6cdf8e07c8151fba6fe85735441240ec7f619f935a5205953d58009aef8c6"}, + {file = "frozenlist-1.8.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:48e6d3f4ec5c7273dfe83ff27c91083c6c9065af655dc2684d2c200c94308bb5"}, + {file = "frozenlist-1.8.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:1a7607e17ad33361677adcd1443edf6f5da0ce5e5377b798fba20fae194825f3"}, + {file = "frozenlist-1.8.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:5a3a935c3a4e89c733303a2d5a7c257ea44af3a56c8202df486b7f5de40f37e1"}, + {file = "frozenlist-1.8.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:940d4a017dbfed9daf46a3b086e1d2167e7012ee297fef9e1c545c4d022f5178"}, + {file = "frozenlist-1.8.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b9be22a69a014bc47e78072d0ecae716f5eb56c15238acca0f43d6eb8e4a5bda"}, + {file = "frozenlist-1.8.0-cp39-cp39-win32.whl", hash = "sha256:1aa77cb5697069af47472e39612976ed05343ff2e84a3dcf15437b232cbfd087"}, + {file = "frozenlist-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:7398c222d1d405e796970320036b1b563892b65809d9e5261487bb2c7f7b5c6a"}, + {file = "frozenlist-1.8.0-cp39-cp39-win_arm64.whl", hash = "sha256:b4f3b365f31c6cd4af24545ca0a244a53688cad8834e32f56831c4923b50a103"}, + {file = "frozenlist-1.8.0-py3-none-any.whl", hash = "sha256:0c18a16eab41e82c295618a77502e17b195883241c563b00f0aa5106fc4eaa0d"}, + {file = "frozenlist-1.8.0.tar.gz", hash = "sha256:3ede829ed8d842f6cd48fc7081d7a41001a56f1f38603f9d49bf3020d59a31ad"}, ] [[package]] name = "fsspec" -version = "2025.3.2" +version = "2026.2.0" description = "File-system specification" optional = false -python-versions = ">=3.9" -groups = ["main"] +python-versions = ">=3.10" +groups = ["main", "torch-cuda"] files = [ - {file = "fsspec-2025.3.2-py3-none-any.whl", hash = "sha256:2daf8dc3d1dfa65b6aa37748d112773a7a08416f6c70d96b264c96476ecaf711"}, - {file = "fsspec-2025.3.2.tar.gz", hash = "sha256:e52c77ef398680bbd6a98c0e628fbc469491282981209907bbc8aea76a04fdc6"}, + {file = "fsspec-2026.2.0-py3-none-any.whl", hash = "sha256:98de475b5cb3bd66bedd5c4679e87b4fdfe1a3bf4d707b151b3c07e58c9a2437"}, + {file = "fsspec-2026.2.0.tar.gz", hash = "sha256:6544e34b16869f5aacd5b90bdf1a71acb37792ea3ddf6125ee69a22a53fb8bff"}, ] [package.dependencies] @@ -1301,12 +1472,12 @@ abfs = ["adlfs"] adl = ["adlfs"] arrow = ["pyarrow (>=1)"] dask = ["dask", "distributed"] -dev = ["pre-commit", "ruff"] +dev = ["pre-commit", "ruff (>=0.5)"] doc = ["numpydoc", "sphinx", "sphinx-design", "sphinx-rtd-theme", "yarl"] dropbox = ["dropbox", "dropboxdrivefs", "requests"] -full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "dask", "distributed", "dropbox", "dropboxdrivefs", "fusepy", "gcsfs", "libarchive-c", "ocifs", "panel", "paramiko", "pyarrow (>=1)", "pygit2", "requests", "s3fs", "smbprotocol", "tqdm"] +full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "dask", "distributed", "dropbox", "dropboxdrivefs", "fusepy", "gcsfs (>2024.2.0)", "libarchive-c", "ocifs", "panel", "paramiko", "pyarrow (>=1)", "pygit2", "requests", "s3fs (>2024.2.0)", "smbprotocol", "tqdm"] fuse = ["fusepy"] -gcs = ["gcsfs"] +gcs = ["gcsfs (>2024.2.0)"] git = ["pygit2"] github = ["requests"] gs = ["gcsfs"] @@ -1315,15 +1486,49 @@ hdfs = ["pyarrow (>=1)"] http = ["aiohttp (!=4.0.0a0,!=4.0.0a1)"] libarchive = ["libarchive-c"] oci = ["ocifs"] -s3 = ["s3fs"] +s3 = ["s3fs (>2024.2.0)"] sftp = ["paramiko"] smb = ["smbprotocol"] ssh = ["paramiko"] test = ["aiohttp (!=4.0.0a0,!=4.0.0a1)", "numpy", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "requests"] test-downstream = ["aiobotocore (>=2.5.4,<3.0.0)", "dask[dataframe,test]", "moto[server] (>4,<5)", "pytest-timeout", "xarray"] -test-full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "cloudpickle", "dask", "distributed", "dropbox", "dropboxdrivefs", "fastparquet", "fusepy", "gcsfs", "jinja2", "kerchunk", "libarchive-c", "lz4", "notebook", "numpy", "ocifs", "pandas", "panel", "paramiko", "pyarrow", "pyarrow (>=1)", "pyftpdlib", "pygit2", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "python-snappy", "requests", "smbprotocol", "tqdm", "urllib3", "zarr", "zstandard"] +test-full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "backports-zstd ; python_version < \"3.14\"", "cloudpickle", "dask", "distributed", "dropbox", "dropboxdrivefs", "fastparquet", "fusepy", "gcsfs", "jinja2", "kerchunk", "libarchive-c", "lz4", "notebook", "numpy", "ocifs", "pandas (<3.0.0)", "panel", "paramiko", "pyarrow", "pyarrow (>=1)", "pyftpdlib", "pygit2", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "python-snappy", "requests", "smbprotocol", "tqdm", "urllib3", "zarr", "zstandard ; python_version < \"3.14\""] tqdm = ["tqdm"] +[[package]] +name = "gitdb" +version = "4.0.12" +description = "Git Object Database" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf"}, + {file = "gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571"}, +] + +[package.dependencies] +smmap = ">=3.0.1,<6" + +[[package]] +name = "gitpython" +version = "3.1.46" +description = "GitPython is a Python library used to interact with Git repositories" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "gitpython-3.1.46-py3-none-any.whl", hash = "sha256:79812ed143d9d25b6d176a10bb511de0f9c67b1fa641d82097b0ab90398a2058"}, + {file = "gitpython-3.1.46.tar.gz", hash = "sha256:400124c7d0ef4ea03f7310ac2fbf7151e09ff97f2a3288d64a440c584a29c37f"}, +] + +[package.dependencies] +gitdb = ">=4.0.1,<5" + +[package.extras] +doc = ["sphinx (>=7.1.2,<7.2)", "sphinx-autodoc-typehints", "sphinx_rtd_theme"] +test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock ; python_version < \"3.8\"", "mypy (==1.18.2) ; python_version >= \"3.9\"", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar", "typing-extensions ; python_version < \"3.11\""] + [[package]] name = "h11" version = "0.16.0" @@ -1383,16 +1588,31 @@ http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] zstd = ["zstandard (>=0.18.0)"] +[[package]] +name = "humanize" +version = "4.15.0" +description = "Python humanize utilities" +optional = false +python-versions = ">=3.10" +groups = ["development"] +files = [ + {file = "humanize-4.15.0-py3-none-any.whl", hash = "sha256:b1186eb9f5a9749cd9cb8565aee77919dd7c8d076161cf44d70e59e3301e1769"}, + {file = "humanize-4.15.0.tar.gz", hash = "sha256:1dd098483eb1c7ee8e32eb2e99ad1910baefa4b75c3aff3a82f4d78688993b10"}, +] + +[package.extras] +tests = ["freezegun", "pytest", "pytest-cov"] + [[package]] name = "identify" -version = "2.6.10" +version = "2.6.16" description = "File identification library for Python" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["development"] files = [ - {file = "identify-2.6.10-py2.py3-none-any.whl", hash = "sha256:5f34248f54136beed1a7ba6a6b5c4b6cf21ff495aac7c359e1ef831ae3b8ab25"}, - {file = "identify-2.6.10.tar.gz", hash = "sha256:45e92fd704f3da71cc3880036633f48b4b7265fd4de2b57627cb157216eb7eb8"}, + {file = "identify-2.6.16-py2.py3-none-any.whl", hash = "sha256:391ee4d77741d994189522896270b787aed8670389bfd60f326d677d64a6dfb0"}, + {file = "identify-2.6.16.tar.gz", hash = "sha256:846857203b5511bbe94d5a352a48ef2359532bc8f6727b5544077a0dcfb24980"}, ] [package.extras] @@ -1400,14 +1620,14 @@ license = ["ukkonen"] [[package]] name = "idna" -version = "3.10" +version = "3.11" description = "Internationalized Domain Names in Applications (IDNA)" optional = false -python-versions = ">=3.6" -groups = ["main", "development"] +python-versions = ">=3.8" +groups = ["main", "development", "torch-cuda"] files = [ - {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, - {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, + {file = "idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea"}, + {file = "idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902"}, ] [package.extras] @@ -1427,15 +1647,15 @@ files = [ [[package]] name = "importlib-metadata" -version = "8.7.0" +version = "8.7.1" description = "Read metadata from Python packages" optional = false python-versions = ">=3.9" groups = ["main"] markers = "python_version == \"3.11\"" files = [ - {file = "importlib_metadata-8.7.0-py3-none-any.whl", hash = "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd"}, - {file = "importlib_metadata-8.7.0.tar.gz", hash = "sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000"}, + {file = "importlib_metadata-8.7.1-py3-none-any.whl", hash = "sha256:5a1f80bf1daa489495071efbb095d75a634cf28a8bc299581244063b53176151"}, + {file = "importlib_metadata-8.7.1.tar.gz", hash = "sha256:49fef1ae6440c182052f407c8d34a68f72efc36db9ca90dc0113398f2fdde8bb"}, ] [package.dependencies] @@ -1445,10 +1665,10 @@ zipp = ">=3.20" check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -enabler = ["pytest-enabler (>=2.2)"] +enabler = ["pytest-enabler (>=3.4)"] perf = ["ipython"] -test = ["flufl.flake8", "importlib_resources (>=1.3) ; python_version < \"3.9\"", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] -type = ["pytest-mypy"] +test = ["flufl.flake8", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] +type = ["mypy (<1.19) ; platform_python_implementation == \"PyPy\"", "pytest-mypy (>=1.0.1)"] [[package]] name = "importlib-resources" @@ -1472,14 +1692,14 @@ type = ["pytest-mypy"] [[package]] name = "iniconfig" -version = "2.1.0" +version = "2.3.0" description = "brain-dead simple config-ini parsing" optional = false -python-versions = ">=3.8" +python-versions = ">=3.10" groups = ["main", "development"] files = [ - {file = "iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760"}, - {file = "iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7"}, + {file = "iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12"}, + {file = "iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730"}, ] [[package]] @@ -1496,14 +1716,14 @@ files = [ [[package]] name = "isort" -version = "6.0.1" +version = "7.0.0" description = "A Python utility / library to sort Python imports." optional = false -python-versions = ">=3.9.0" +python-versions = ">=3.10.0" groups = ["development"] files = [ - {file = "isort-6.0.1-py3-none-any.whl", hash = "sha256:2dc5d7f65c9678d94c88dfc29161a320eec67328bc97aad576874cb4be1e9615"}, - {file = "isort-6.0.1.tar.gz", hash = "sha256:1cb5df28dfbc742e490c5e41bad6da41b805b0a8be7bc93cd0fb2a8a890ac450"}, + {file = "isort-7.0.0-py3-none-any.whl", hash = "sha256:1bcabac8bc3c36c7fb7b98a76c8abb18e0f841a3ba81decac7691008592499c1"}, + {file = "isort-7.0.0.tar.gz", hash = "sha256:5513527951aadb3ac4292a41a16cbc50dd1642432f5e8c20057d414bdafb4187"}, ] [package.extras] @@ -1531,45 +1751,49 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-ena [[package]] name = "jaraco-context" -version = "6.0.1" +version = "6.1.0" description = "Useful decorators and context managers" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main"] files = [ - {file = "jaraco.context-6.0.1-py3-none-any.whl", hash = "sha256:f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4"}, - {file = "jaraco_context-6.0.1.tar.gz", hash = "sha256:9bae4ea555cf0b14938dc0aee7c9f32ed303aa20a3b73e7dc80111628792d1b3"}, + {file = "jaraco_context-6.1.0-py3-none-any.whl", hash = "sha256:a43b5ed85815223d0d3cfdb6d7ca0d2bc8946f28f30b6f3216bda070f68badda"}, + {file = "jaraco_context-6.1.0.tar.gz", hash = "sha256:129a341b0a85a7db7879e22acd66902fda67882db771754574338898b2d5d86f"}, ] [package.dependencies] "backports.tarfile" = {version = "*", markers = "python_version < \"3.12\""} [package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] +cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -test = ["portend", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] +enabler = ["pytest-enabler (>=3.4)"] +test = ["jaraco.test (>=5.6.0)", "portend", "pytest (>=6,!=8.1.*)"] +type = ["mypy (<1.19) ; platform_python_implementation == \"PyPy\"", "pytest-mypy (>=1.0.1)"] [[package]] name = "jaraco-functools" -version = "4.1.0" +version = "4.4.0" description = "Functools like those found in stdlib" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main"] files = [ - {file = "jaraco.functools-4.1.0-py3-none-any.whl", hash = "sha256:ad159f13428bc4acbf5541ad6dec511f91573b90fba04df61dafa2a1231cf649"}, - {file = "jaraco_functools-4.1.0.tar.gz", hash = "sha256:70f7e0e2ae076498e212562325e805204fc092d7b4c17e0e86c959e249701a9d"}, + {file = "jaraco_functools-4.4.0-py3-none-any.whl", hash = "sha256:9eec1e36f45c818d9bf307c8948eb03b2b56cd44087b3cdc989abca1f20b9176"}, + {file = "jaraco_functools-4.4.0.tar.gz", hash = "sha256:da21933b0417b89515562656547a77b4931f98176eb173644c0d35032a33d6bb"}, ] [package.dependencies] -more-itertools = "*" +more_itertools = "*" [package.extras] check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -enabler = ["pytest-enabler (>=2.2)"] +enabler = ["pytest-enabler (>=3.4)"] test = ["jaraco.classes", "pytest (>=6,!=8.1.*)"] -type = ["pytest-mypy"] +type = ["mypy (<1.19) ; platform_python_implementation == \"PyPy\"", "pytest-mypy (>=1.0.1)"] [[package]] name = "jeepney" @@ -1594,7 +1818,7 @@ version = "3.1.6" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" -groups = ["main", "development"] +groups = ["main", "development", "torch-cuda"] files = [ {file = "jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"}, {file = "jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d"}, @@ -1608,26 +1832,65 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "joblib" -version = "1.5.0" +version = "1.5.3" description = "Lightweight pipelining with Python functions" optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "joblib-1.5.0-py3-none-any.whl", hash = "sha256:206144b320246485b712fc8cc51f017de58225fa8b414a1fe1764a7231aca491"}, - {file = "joblib-1.5.0.tar.gz", hash = "sha256:d8757f955389a3dd7a23152e43bc297c2e0c2d3060056dad0feefc88a06939b5"}, + {file = "joblib-1.5.3-py3-none-any.whl", hash = "sha256:5fc3c5039fc5ca8c0276333a188bbd59d6b7ab37fe6632daa76bc7f9ec18e713"}, + {file = "joblib-1.5.3.tar.gz", hash = "sha256:8561a3269e6801106863fd0d6d84bb737be9e7631e33aaed3fb9ce5953688da3"}, +] + +[[package]] +name = "jsonschema" +version = "4.26.0" +description = "An implementation of JSON Schema validation for Python" +optional = false +python-versions = ">=3.10" +groups = ["main"] +markers = "extra == \"multiprocessing\"" +files = [ + {file = "jsonschema-4.26.0-py3-none-any.whl", hash = "sha256:d489f15263b8d200f8387e64b4c3a75f06629559fb73deb8fdfb525f2dab50ce"}, + {file = "jsonschema-4.26.0.tar.gz", hash = "sha256:0c26707e2efad8aa1bfc5b7ce170f3fccc2e4918ff85989ba9ffa9facb2be326"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +jsonschema-specifications = ">=2023.3.6" +referencing = ">=0.28.4" +rpds-py = ">=0.25.0" + +[package.extras] +format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "rfc3987-syntax (>=1.1.0)", "uri-template", "webcolors (>=24.6.0)"] + +[[package]] +name = "jsonschema-specifications" +version = "2025.9.1" +description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" +optional = false +python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"multiprocessing\"" +files = [ + {file = "jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe"}, + {file = "jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d"}, ] +[package.dependencies] +referencing = ">=0.31.0" + [[package]] name = "keyring" -version = "25.6.0" +version = "25.7.0" description = "Store and access your passwords safely." optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "keyring-25.6.0-py3-none-any.whl", hash = "sha256:552a3f7af126ece7ed5c89753650eec89c7eaae8617d0aa4d9ad2b75111266bd"}, - {file = "keyring-25.6.0.tar.gz", hash = "sha256:0b39998aa941431eb3d9b0d4b2460bc773b9df6fed7621c2dfb291a7e0187a66"}, + {file = "keyring-25.7.0-py3-none-any.whl", hash = "sha256:be4a0b195f149690c166e850609a477c532ddbfbaed96a404d4e43f8d5e2689f"}, + {file = "keyring-25.7.0.tar.gz", hash = "sha256:fe01bd85eb3f8fb3dd0405defdeac9a5b4f6f0439edbb3149577f244a2e8245b"}, ] [package.dependencies] @@ -1644,110 +1907,131 @@ check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \" completion = ["shtab (>=1.1.0)"] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -enabler = ["pytest-enabler (>=2.2)"] +enabler = ["pytest-enabler (>=3.4)"] test = ["pyfakefs", "pytest (>=6,!=8.1.*)"] -type = ["pygobject-stubs", "pytest-mypy", "shtab", "types-pywin32"] +type = ["pygobject-stubs", "pytest-mypy (>=1.0.1)", "shtab", "types-pywin32"] [[package]] name = "kiwisolver" -version = "1.4.8" +version = "1.4.9" description = "A fast implementation of the Cassowary constraint solver" optional = false python-versions = ">=3.10" groups = ["main"] files = [ - {file = "kiwisolver-1.4.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:88c6f252f6816a73b1f8c904f7bbe02fd67c09a69f7cb8a0eecdbf5ce78e63db"}, - {file = "kiwisolver-1.4.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c72941acb7b67138f35b879bbe85be0f6c6a70cab78fe3ef6db9c024d9223e5b"}, - {file = "kiwisolver-1.4.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce2cf1e5688edcb727fdf7cd1bbd0b6416758996826a8be1d958f91880d0809d"}, - {file = "kiwisolver-1.4.8-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c8bf637892dc6e6aad2bc6d4d69d08764166e5e3f69d469e55427b6ac001b19d"}, - {file = "kiwisolver-1.4.8-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:034d2c891f76bd3edbdb3ea11140d8510dca675443da7304205a2eaa45d8334c"}, - {file = "kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d47b28d1dfe0793d5e96bce90835e17edf9a499b53969b03c6c47ea5985844c3"}, - {file = "kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb158fe28ca0c29f2260cca8c43005329ad58452c36f0edf298204de32a9a3ed"}, - {file = "kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5536185fce131780ebd809f8e623bf4030ce1b161353166c49a3c74c287897f"}, - {file = "kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:369b75d40abedc1da2c1f4de13f3482cb99e3237b38726710f4a793432b1c5ff"}, - {file = "kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:641f2ddf9358c80faa22e22eb4c9f54bd3f0e442e038728f500e3b978d00aa7d"}, - {file = "kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d561d2d8883e0819445cfe58d7ddd673e4015c3c57261d7bdcd3710d0d14005c"}, - {file = "kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1732e065704b47c9afca7ffa272f845300a4eb959276bf6970dc07265e73b605"}, - {file = "kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bcb1ebc3547619c3b58a39e2448af089ea2ef44b37988caf432447374941574e"}, - {file = "kiwisolver-1.4.8-cp310-cp310-win_amd64.whl", hash = "sha256:89c107041f7b27844179ea9c85d6da275aa55ecf28413e87624d033cf1f6b751"}, - {file = "kiwisolver-1.4.8-cp310-cp310-win_arm64.whl", hash = "sha256:b5773efa2be9eb9fcf5415ea3ab70fc785d598729fd6057bea38d539ead28271"}, - {file = "kiwisolver-1.4.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a4d3601908c560bdf880f07d94f31d734afd1bb71e96585cace0e38ef44c6d84"}, - {file = "kiwisolver-1.4.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:856b269c4d28a5c0d5e6c1955ec36ebfd1651ac00e1ce0afa3e28da95293b561"}, - {file = "kiwisolver-1.4.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c2b9a96e0f326205af81a15718a9073328df1173a2619a68553decb7097fd5d7"}, - {file = "kiwisolver-1.4.8-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5020c83e8553f770cb3b5fc13faac40f17e0b205bd237aebd21d53d733adb03"}, - {file = "kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dace81d28c787956bfbfbbfd72fdcef014f37d9b48830829e488fdb32b49d954"}, - {file = "kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11e1022b524bd48ae56c9b4f9296bce77e15a2e42a502cceba602f804b32bb79"}, - {file = "kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b9b4d2892fefc886f30301cdd80debd8bb01ecdf165a449eb6e78f79f0fabd6"}, - {file = "kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a96c0e790ee875d65e340ab383700e2b4891677b7fcd30a699146f9384a2bb0"}, - {file = "kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:23454ff084b07ac54ca8be535f4174170c1094a4cff78fbae4f73a4bcc0d4dab"}, - {file = "kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:87b287251ad6488e95b4f0b4a79a6d04d3ea35fde6340eb38fbd1ca9cd35bbbc"}, - {file = "kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b21dbe165081142b1232a240fc6383fd32cdd877ca6cc89eab93e5f5883e1c25"}, - {file = "kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:768cade2c2df13db52475bd28d3a3fac8c9eff04b0e9e2fda0f3760f20b3f7fc"}, - {file = "kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d47cfb2650f0e103d4bf68b0b5804c68da97272c84bb12850d877a95c056bd67"}, - {file = "kiwisolver-1.4.8-cp311-cp311-win_amd64.whl", hash = "sha256:ed33ca2002a779a2e20eeb06aea7721b6e47f2d4b8a8ece979d8ba9e2a167e34"}, - {file = "kiwisolver-1.4.8-cp311-cp311-win_arm64.whl", hash = "sha256:16523b40aab60426ffdebe33ac374457cf62863e330a90a0383639ce14bf44b2"}, - {file = "kiwisolver-1.4.8-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d6af5e8815fd02997cb6ad9bbed0ee1e60014438ee1a5c2444c96f87b8843502"}, - {file = "kiwisolver-1.4.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bade438f86e21d91e0cf5dd7c0ed00cda0f77c8c1616bd83f9fc157fa6760d31"}, - {file = "kiwisolver-1.4.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b83dc6769ddbc57613280118fb4ce3cd08899cc3369f7d0e0fab518a7cf37fdb"}, - {file = "kiwisolver-1.4.8-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:111793b232842991be367ed828076b03d96202c19221b5ebab421ce8bcad016f"}, - {file = "kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:257af1622860e51b1a9d0ce387bf5c2c4f36a90594cb9514f55b074bcc787cfc"}, - {file = "kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69b5637c3f316cab1ec1c9a12b8c5f4750a4c4b71af9157645bf32830e39c03a"}, - {file = "kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:782bb86f245ec18009890e7cb8d13a5ef54dcf2ebe18ed65f795e635a96a1c6a"}, - {file = "kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc978a80a0db3a66d25767b03688f1147a69e6237175c0f4ffffaaedf744055a"}, - {file = "kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:36dbbfd34838500a31f52c9786990d00150860e46cd5041386f217101350f0d3"}, - {file = "kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:eaa973f1e05131de5ff3569bbba7f5fd07ea0595d3870ed4a526d486fe57fa1b"}, - {file = "kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a66f60f8d0c87ab7f59b6fb80e642ebb29fec354a4dfad687ca4092ae69d04f4"}, - {file = "kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:858416b7fb777a53f0c59ca08190ce24e9abbd3cffa18886a5781b8e3e26f65d"}, - {file = "kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:085940635c62697391baafaaeabdf3dd7a6c3643577dde337f4d66eba021b2b8"}, - {file = "kiwisolver-1.4.8-cp312-cp312-win_amd64.whl", hash = "sha256:01c3d31902c7db5fb6182832713d3b4122ad9317c2c5877d0539227d96bb2e50"}, - {file = "kiwisolver-1.4.8-cp312-cp312-win_arm64.whl", hash = "sha256:a3c44cb68861de93f0c4a8175fbaa691f0aa22550c331fefef02b618a9dcb476"}, - {file = "kiwisolver-1.4.8-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1c8ceb754339793c24aee1c9fb2485b5b1f5bb1c2c214ff13368431e51fc9a09"}, - {file = "kiwisolver-1.4.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:54a62808ac74b5e55a04a408cda6156f986cefbcf0ada13572696b507cc92fa1"}, - {file = "kiwisolver-1.4.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:68269e60ee4929893aad82666821aaacbd455284124817af45c11e50a4b42e3c"}, - {file = "kiwisolver-1.4.8-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34d142fba9c464bc3bbfeff15c96eab0e7310343d6aefb62a79d51421fcc5f1b"}, - {file = "kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc373e0eef45b59197de815b1b28ef89ae3955e7722cc9710fb91cd77b7f47"}, - {file = "kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:77e6f57a20b9bd4e1e2cedda4d0b986ebd0216236f0106e55c28aea3d3d69b16"}, - {file = "kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08e77738ed7538f036cd1170cbed942ef749137b1311fa2bbe2a7fda2f6bf3cc"}, - {file = "kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5ce1e481a74b44dd5e92ff03ea0cb371ae7a0268318e202be06c8f04f4f1246"}, - {file = "kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fc2ace710ba7c1dfd1a3b42530b62b9ceed115f19a1656adefce7b1782a37794"}, - {file = "kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:3452046c37c7692bd52b0e752b87954ef86ee2224e624ef7ce6cb21e8c41cc1b"}, - {file = "kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7e9a60b50fe8b2ec6f448fe8d81b07e40141bfced7f896309df271a0b92f80f3"}, - {file = "kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:918139571133f366e8362fa4a297aeba86c7816b7ecf0bc79168080e2bd79957"}, - {file = "kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e063ef9f89885a1d68dd8b2e18f5ead48653176d10a0e324e3b0030e3a69adeb"}, - {file = "kiwisolver-1.4.8-cp313-cp313-win_amd64.whl", hash = "sha256:a17b7c4f5b2c51bb68ed379defd608a03954a1845dfed7cc0117f1cc8a9b7fd2"}, - {file = "kiwisolver-1.4.8-cp313-cp313-win_arm64.whl", hash = "sha256:3cd3bc628b25f74aedc6d374d5babf0166a92ff1317f46267f12d2ed54bc1d30"}, - {file = "kiwisolver-1.4.8-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:370fd2df41660ed4e26b8c9d6bbcad668fbe2560462cba151a721d49e5b6628c"}, - {file = "kiwisolver-1.4.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:84a2f830d42707de1d191b9490ac186bf7997a9495d4e9072210a1296345f7dc"}, - {file = "kiwisolver-1.4.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7a3ad337add5148cf51ce0b55642dc551c0b9d6248458a757f98796ca7348712"}, - {file = "kiwisolver-1.4.8-cp313-cp313t-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7506488470f41169b86d8c9aeff587293f530a23a23a49d6bc64dab66bedc71e"}, - {file = "kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f0121b07b356a22fb0414cec4666bbe36fd6d0d759db3d37228f496ed67c880"}, - {file = "kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d6d6bd87df62c27d4185de7c511c6248040afae67028a8a22012b010bc7ad062"}, - {file = "kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:291331973c64bb9cce50bbe871fb2e675c4331dab4f31abe89f175ad7679a4d7"}, - {file = "kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:893f5525bb92d3d735878ec00f781b2de998333659507d29ea4466208df37bed"}, - {file = "kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b47a465040146981dc9db8647981b8cb96366fbc8d452b031e4f8fdffec3f26d"}, - {file = "kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:99cea8b9dd34ff80c521aef46a1dddb0dcc0283cf18bde6d756f1e6f31772165"}, - {file = "kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:151dffc4865e5fe6dafce5480fab84f950d14566c480c08a53c663a0020504b6"}, - {file = "kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:577facaa411c10421314598b50413aa1ebcf5126f704f1e5d72d7e4e9f020d90"}, - {file = "kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:be4816dc51c8a471749d664161b434912eee82f2ea66bd7628bd14583a833e85"}, - {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e7a019419b7b510f0f7c9dceff8c5eae2392037eae483a7f9162625233802b0a"}, - {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:286b18e86682fd2217a48fc6be6b0f20c1d0ed10958d8dc53453ad58d7be0bf8"}, - {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4191ee8dfd0be1c3666ccbac178c5a05d5f8d689bbe3fc92f3c4abec817f8fe0"}, - {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7cd2785b9391f2873ad46088ed7599a6a71e762e1ea33e87514b1a441ed1da1c"}, - {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c07b29089b7ba090b6f1a669f1411f27221c3662b3a1b7010e67b59bb5a6f10b"}, - {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:65ea09a5a3faadd59c2ce96dc7bf0f364986a315949dc6374f04396b0d60e09b"}, - {file = "kiwisolver-1.4.8.tar.gz", hash = "sha256:23d5f023bdc8c7e54eb65f03ca5d5bb25b601eac4d7f1a042888a1f45237987e"}, + {file = "kiwisolver-1.4.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b4b4d74bda2b8ebf4da5bd42af11d02d04428b2c32846e4c2c93219df8a7987b"}, + {file = "kiwisolver-1.4.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fb3b8132019ea572f4611d770991000d7f58127560c4889729248eb5852a102f"}, + {file = "kiwisolver-1.4.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84fd60810829c27ae375114cd379da1fa65e6918e1da405f356a775d49a62bcf"}, + {file = "kiwisolver-1.4.9-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b78efa4c6e804ecdf727e580dbb9cba85624d2e1c6b5cb059c66290063bd99a9"}, + {file = "kiwisolver-1.4.9-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d4efec7bcf21671db6a3294ff301d2fc861c31faa3c8740d1a94689234d1b415"}, + {file = "kiwisolver-1.4.9-cp310-cp310-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:90f47e70293fc3688b71271100a1a5453aa9944a81d27ff779c108372cf5567b"}, + {file = "kiwisolver-1.4.9-cp310-cp310-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8fdca1def57a2e88ef339de1737a1449d6dbf5fab184c54a1fca01d541317154"}, + {file = "kiwisolver-1.4.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9cf554f21be770f5111a1690d42313e140355e687e05cf82cb23d0a721a64a48"}, + {file = "kiwisolver-1.4.9-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fc1795ac5cd0510207482c3d1d3ed781143383b8cfd36f5c645f3897ce066220"}, + {file = "kiwisolver-1.4.9-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:ccd09f20ccdbbd341b21a67ab50a119b64a403b09288c27481575105283c1586"}, + {file = "kiwisolver-1.4.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:540c7c72324d864406a009d72f5d6856f49693db95d1fbb46cf86febef873634"}, + {file = "kiwisolver-1.4.9-cp310-cp310-win_amd64.whl", hash = "sha256:ede8c6d533bc6601a47ad4046080d36b8fc99f81e6f1c17b0ac3c2dc91ac7611"}, + {file = "kiwisolver-1.4.9-cp310-cp310-win_arm64.whl", hash = "sha256:7b4da0d01ac866a57dd61ac258c5607b4cd677f63abaec7b148354d2b2cdd536"}, + {file = "kiwisolver-1.4.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:eb14a5da6dc7642b0f3a18f13654847cd8b7a2550e2645a5bda677862b03ba16"}, + {file = "kiwisolver-1.4.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:39a219e1c81ae3b103643d2aedb90f1ef22650deb266ff12a19e7773f3e5f089"}, + {file = "kiwisolver-1.4.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2405a7d98604b87f3fc28b1716783534b1b4b8510d8142adca34ee0bc3c87543"}, + {file = "kiwisolver-1.4.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:dc1ae486f9abcef254b5618dfb4113dd49f94c68e3e027d03cf0143f3f772b61"}, + {file = "kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a1f570ce4d62d718dce3f179ee78dac3b545ac16c0c04bb363b7607a949c0d1"}, + {file = "kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cb27e7b78d716c591e88e0a09a2139c6577865d7f2e152488c2cc6257f460872"}, + {file = "kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:15163165efc2f627eb9687ea5f3a28137217d217ac4024893d753f46bce9de26"}, + {file = "kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bdee92c56a71d2b24c33a7d4c2856bd6419d017e08caa7802d2963870e315028"}, + {file = "kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:412f287c55a6f54b0650bd9b6dce5aceddb95864a1a90c87af16979d37c89771"}, + {file = "kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:2c93f00dcba2eea70af2be5f11a830a742fe6b579a1d4e00f47760ef13be247a"}, + {file = "kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f117e1a089d9411663a3207ba874f31be9ac8eaa5b533787024dc07aeb74f464"}, + {file = "kiwisolver-1.4.9-cp311-cp311-win_amd64.whl", hash = "sha256:be6a04e6c79819c9a8c2373317d19a96048e5a3f90bec587787e86a1153883c2"}, + {file = "kiwisolver-1.4.9-cp311-cp311-win_arm64.whl", hash = "sha256:0ae37737256ba2de764ddc12aed4956460277f00c4996d51a197e72f62f5eec7"}, + {file = "kiwisolver-1.4.9-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ac5a486ac389dddcc5bef4f365b6ae3ffff2c433324fb38dd35e3fab7c957999"}, + {file = "kiwisolver-1.4.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f2ba92255faa7309d06fe44c3a4a97efe1c8d640c2a79a5ef728b685762a6fd2"}, + {file = "kiwisolver-1.4.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a2899935e724dd1074cb568ce7ac0dce28b2cd6ab539c8e001a8578eb106d14"}, + {file = "kiwisolver-1.4.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f6008a4919fdbc0b0097089f67a1eb55d950ed7e90ce2cc3e640abadd2757a04"}, + {file = "kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:67bb8b474b4181770f926f7b7d2f8c0248cbcb78b660fdd41a47054b28d2a752"}, + {file = "kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2327a4a30d3ee07d2fbe2e7933e8a37c591663b96ce42a00bc67461a87d7df77"}, + {file = "kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7a08b491ec91b1d5053ac177afe5290adacf1f0f6307d771ccac5de30592d198"}, + {file = "kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d8fc5c867c22b828001b6a38d2eaeb88160bf5783c6cb4a5e440efc981ce286d"}, + {file = "kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:3b3115b2581ea35bb6d1f24a4c90af37e5d9b49dcff267eeed14c3893c5b86ab"}, + {file = "kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:858e4c22fb075920b96a291928cb7dea5644e94c0ee4fcd5af7e865655e4ccf2"}, + {file = "kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ed0fecd28cc62c54b262e3736f8bb2512d8dcfdc2bcf08be5f47f96bf405b145"}, + {file = "kiwisolver-1.4.9-cp312-cp312-win_amd64.whl", hash = "sha256:f68208a520c3d86ea51acf688a3e3002615a7f0238002cccc17affecc86a8a54"}, + {file = "kiwisolver-1.4.9-cp312-cp312-win_arm64.whl", hash = "sha256:2c1a4f57df73965f3f14df20b80ee29e6a7930a57d2d9e8491a25f676e197c60"}, + {file = "kiwisolver-1.4.9-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a5d0432ccf1c7ab14f9949eec60c5d1f924f17c037e9f8b33352fa05799359b8"}, + {file = "kiwisolver-1.4.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efb3a45b35622bb6c16dbfab491a8f5a391fe0e9d45ef32f4df85658232ca0e2"}, + {file = "kiwisolver-1.4.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1a12cf6398e8a0a001a059747a1cbf24705e18fe413bc22de7b3d15c67cffe3f"}, + {file = "kiwisolver-1.4.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b67e6efbf68e077dd71d1a6b37e43e1a99d0bff1a3d51867d45ee8908b931098"}, + {file = "kiwisolver-1.4.9-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5656aa670507437af0207645273ccdfee4f14bacd7f7c67a4306d0dcaeaf6eed"}, + {file = "kiwisolver-1.4.9-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bfc08add558155345129c7803b3671cf195e6a56e7a12f3dde7c57d9b417f525"}, + {file = "kiwisolver-1.4.9-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:40092754720b174e6ccf9e845d0d8c7d8e12c3d71e7fc35f55f3813e96376f78"}, + {file = "kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:497d05f29a1300d14e02e6441cf0f5ee81c1ff5a304b0d9fb77423974684e08b"}, + {file = "kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:bdd1a81a1860476eb41ac4bc1e07b3f07259e6d55bbf739b79c8aaedcf512799"}, + {file = "kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e6b93f13371d341afee3be9f7c5964e3fe61d5fa30f6a30eb49856935dfe4fc3"}, + {file = "kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d75aa530ccfaa593da12834b86a0724f58bff12706659baa9227c2ccaa06264c"}, + {file = "kiwisolver-1.4.9-cp313-cp313-win_amd64.whl", hash = "sha256:dd0a578400839256df88c16abddf9ba14813ec5f21362e1fe65022e00c883d4d"}, + {file = "kiwisolver-1.4.9-cp313-cp313-win_arm64.whl", hash = "sha256:d4188e73af84ca82468f09cadc5ac4db578109e52acb4518d8154698d3a87ca2"}, + {file = "kiwisolver-1.4.9-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:5a0f2724dfd4e3b3ac5a82436a8e6fd16baa7d507117e4279b660fe8ca38a3a1"}, + {file = "kiwisolver-1.4.9-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:1b11d6a633e4ed84fc0ddafd4ebfd8ea49b3f25082c04ad12b8315c11d504dc1"}, + {file = "kiwisolver-1.4.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61874cdb0a36016354853593cffc38e56fc9ca5aa97d2c05d3dcf6922cd55a11"}, + {file = "kiwisolver-1.4.9-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:60c439763a969a6af93b4881db0eed8fadf93ee98e18cbc35bc8da868d0c4f0c"}, + {file = "kiwisolver-1.4.9-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92a2f997387a1b79a75e7803aa7ded2cfbe2823852ccf1ba3bcf613b62ae3197"}, + {file = "kiwisolver-1.4.9-cp313-cp313t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a31d512c812daea6d8b3be3b2bfcbeb091dbb09177706569bcfc6240dcf8b41c"}, + {file = "kiwisolver-1.4.9-cp313-cp313t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:52a15b0f35dad39862d376df10c5230155243a2c1a436e39eb55623ccbd68185"}, + {file = "kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a30fd6fdef1430fd9e1ba7b3398b5ee4e2887783917a687d86ba69985fb08748"}, + {file = "kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:cc9617b46837c6468197b5945e196ee9ca43057bb7d9d1ae688101e4e1dddf64"}, + {file = "kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:0ab74e19f6a2b027ea4f845a78827969af45ce790e6cb3e1ebab71bdf9f215ff"}, + {file = "kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dba5ee5d3981160c28d5490f0d1b7ed730c22470ff7f6cc26cfcfaacb9896a07"}, + {file = "kiwisolver-1.4.9-cp313-cp313t-win_arm64.whl", hash = "sha256:0749fd8f4218ad2e851e11cc4dc05c7cbc0cbc4267bdfdb31782e65aace4ee9c"}, + {file = "kiwisolver-1.4.9-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:9928fe1eb816d11ae170885a74d074f57af3a0d65777ca47e9aeb854a1fba386"}, + {file = "kiwisolver-1.4.9-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d0005b053977e7b43388ddec89fa567f43d4f6d5c2c0affe57de5ebf290dc552"}, + {file = "kiwisolver-1.4.9-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:2635d352d67458b66fd0667c14cb1d4145e9560d503219034a18a87e971ce4f3"}, + {file = "kiwisolver-1.4.9-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:767c23ad1c58c9e827b649a9ab7809fd5fd9db266a9cf02b0e926ddc2c680d58"}, + {file = "kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:72d0eb9fba308b8311685c2268cf7d0a0639a6cd027d8128659f72bdd8a024b4"}, + {file = "kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f68e4f3eeca8fb22cc3d731f9715a13b652795ef657a13df1ad0c7dc0e9731df"}, + {file = "kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d84cd4061ae292d8ac367b2c3fa3aad11cb8625a95d135fe93f286f914f3f5a6"}, + {file = "kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a60ea74330b91bd22a29638940d115df9dc00af5035a9a2a6ad9399ffb4ceca5"}, + {file = "kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:ce6a3a4e106cf35c2d9c4fa17c05ce0b180db622736845d4315519397a77beaf"}, + {file = "kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:77937e5e2a38a7b48eef0585114fe7930346993a88060d0bf886086d2aa49ef5"}, + {file = "kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:24c175051354f4a28c5d6a31c93906dc653e2bf234e8a4bbfb964892078898ce"}, + {file = "kiwisolver-1.4.9-cp314-cp314-win_amd64.whl", hash = "sha256:0763515d4df10edf6d06a3c19734e2566368980d21ebec439f33f9eb936c07b7"}, + {file = "kiwisolver-1.4.9-cp314-cp314-win_arm64.whl", hash = "sha256:0e4e2bf29574a6a7b7f6cb5fa69293b9f96c928949ac4a53ba3f525dffb87f9c"}, + {file = "kiwisolver-1.4.9-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:d976bbb382b202f71c67f77b0ac11244021cfa3f7dfd9e562eefcea2df711548"}, + {file = "kiwisolver-1.4.9-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2489e4e5d7ef9a1c300a5e0196e43d9c739f066ef23270607d45aba368b91f2d"}, + {file = "kiwisolver-1.4.9-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:e2ea9f7ab7fbf18fffb1b5434ce7c69a07582f7acc7717720f1d69f3e806f90c"}, + {file = "kiwisolver-1.4.9-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b34e51affded8faee0dfdb705416153819d8ea9250bbbf7ea1b249bdeb5f1122"}, + {file = "kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8aacd3d4b33b772542b2e01beb50187536967b514b00003bdda7589722d2a64"}, + {file = "kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7cf974dd4e35fa315563ac99d6287a1024e4dc2077b8a7d7cd3d2fb65d283134"}, + {file = "kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:85bd218b5ecfbee8c8a82e121802dcb519a86044c9c3b2e4aef02fa05c6da370"}, + {file = "kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0856e241c2d3df4efef7c04a1e46b1936b6120c9bcf36dd216e3acd84bc4fb21"}, + {file = "kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:9af39d6551f97d31a4deebeac6f45b156f9755ddc59c07b402c148f5dbb6482a"}, + {file = "kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:bb4ae2b57fc1d8cbd1cf7b1d9913803681ffa903e7488012be5b76dedf49297f"}, + {file = "kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:aedff62918805fb62d43a4aa2ecd4482c380dc76cd31bd7c8878588a61bd0369"}, + {file = "kiwisolver-1.4.9-cp314-cp314t-win_amd64.whl", hash = "sha256:1fa333e8b2ce4d9660f2cda9c0e1b6bafcfb2457a9d259faa82289e73ec24891"}, + {file = "kiwisolver-1.4.9-cp314-cp314t-win_arm64.whl", hash = "sha256:4a48a2ce79d65d363597ef7b567ce3d14d68783d2b2263d98db3d9477805ba32"}, + {file = "kiwisolver-1.4.9-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:4d1d9e582ad4d63062d34077a9a1e9f3c34088a2ec5135b1f7190c07cf366527"}, + {file = "kiwisolver-1.4.9-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:deed0c7258ceb4c44ad5ec7d9918f9f14fd05b2be86378d86cf50e63d1e7b771"}, + {file = "kiwisolver-1.4.9-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0a590506f303f512dff6b7f75fd2fd18e16943efee932008fe7140e5fa91d80e"}, + {file = "kiwisolver-1.4.9-pp310-pypy310_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e09c2279a4d01f099f52d5c4b3d9e208e91edcbd1a175c9662a8b16e000fece9"}, + {file = "kiwisolver-1.4.9-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c9e7cdf45d594ee04d5be1b24dd9d49f3d1590959b2271fb30b5ca2b262c00fb"}, + {file = "kiwisolver-1.4.9-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:720e05574713db64c356e86732c0f3c5252818d05f9df320f0ad8380641acea5"}, + {file = "kiwisolver-1.4.9-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:17680d737d5335b552994a2008fab4c851bcd7de33094a82067ef3a576ff02fa"}, + {file = "kiwisolver-1.4.9-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:85b5352f94e490c028926ea567fc569c52ec79ce131dadb968d3853e809518c2"}, + {file = "kiwisolver-1.4.9-pp311-pypy311_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:464415881e4801295659462c49461a24fb107c140de781d55518c4b80cb6790f"}, + {file = "kiwisolver-1.4.9-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:fb940820c63a9590d31d88b815e7a3aa5915cad3ce735ab45f0c730b39547de1"}, + {file = "kiwisolver-1.4.9.tar.gz", hash = "sha256:c3b22c26c6fd6811b0ae8363b95ca8ce4ea3c202d3d0975b2914310ceb1bcc4d"}, ] [[package]] name = "lightning-utilities" -version = "0.14.3" +version = "0.15.2" description = "Lightning toolbox for across the our ecosystem." optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "lightning_utilities-0.14.3-py3-none-any.whl", hash = "sha256:4ab9066aa36cd7b93a05713808901909e96cc3f187ea6fd3052b2fd91313b468"}, - {file = "lightning_utilities-0.14.3.tar.gz", hash = "sha256:37e2f83f273890052955a44054382c211a303012ee577619efbaa5df9e65e9f5"}, + {file = "lightning_utilities-0.15.2-py3-none-any.whl", hash = "sha256:ad3ab1703775044bbf880dbf7ddaaac899396c96315f3aa1779cec9d618a9841"}, + {file = "lightning_utilities-0.15.2.tar.gz", hash = "sha256:cdf12f530214a63dacefd713f180d1ecf5d165338101617b4742e8f22c032e24"}, ] [package.dependencies] @@ -1756,20 +2040,20 @@ setuptools = "*" typing_extensions = "*" [package.extras] -cli = ["fire"] +cli = ["jsonargparse[signatures] (>=4.38.0)", "tomlkit"] docs = ["requests (>=2.0.0)"] -typing = ["fire", "mypy (>=1.0.0)", "types-setuptools"] +typing = ["mypy (>=1.0.0)", "types-setuptools"] [[package]] name = "markdown-it-py" -version = "3.0.0" +version = "4.0.0" description = "Python port of markdown-it. Markdown parsing, done right!" optional = false -python-versions = ">=3.8" +python-versions = ">=3.10" groups = ["development"] files = [ - {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, - {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, + {file = "markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147"}, + {file = "markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3"}, ] [package.dependencies] @@ -1777,127 +2061,175 @@ mdurl = ">=0.1,<1.0" [package.extras] benchmarking = ["psutil", "pytest", "pytest-benchmark"] -code-style = ["pre-commit (>=3.0,<4.0)"] -compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] +compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "markdown-it-pyrs", "mistletoe (>=1.0,<2.0)", "mistune (>=3.0,<4.0)", "panflute (>=2.3,<3.0)"] linkify = ["linkify-it-py (>=1,<3)"] -plugins = ["mdit-py-plugins"] +plugins = ["mdit-py-plugins (>=0.5.0)"] profiling = ["gprof2dot"] -rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] -testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] +rtd = ["ipykernel", "jupyter_sphinx", "mdit-py-plugins (>=0.5.0)", "myst-parser", "pyyaml", "sphinx", "sphinx-book-theme (>=1.0,<2.0)", "sphinx-copybutton", "sphinx-design"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions", "requests"] [[package]] name = "markupsafe" -version = "3.0.2" +version = "3.0.3" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.9" -groups = ["main", "development"] -files = [ - {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a"}, - {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"}, +groups = ["main", "development", "torch-cuda"] +files = [ + {file = "markupsafe-3.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559"}, + {file = "markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419"}, + {file = "markupsafe-3.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695"}, + {file = "markupsafe-3.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591"}, + {file = "markupsafe-3.0.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c"}, + {file = "markupsafe-3.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f"}, + {file = "markupsafe-3.0.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6"}, + {file = "markupsafe-3.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1"}, + {file = "markupsafe-3.0.3-cp310-cp310-win32.whl", hash = "sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa"}, + {file = "markupsafe-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8"}, + {file = "markupsafe-3.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1"}, + {file = "markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad"}, + {file = "markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a"}, + {file = "markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50"}, + {file = "markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf"}, + {file = "markupsafe-3.0.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f"}, + {file = "markupsafe-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a"}, + {file = "markupsafe-3.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115"}, + {file = "markupsafe-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a"}, + {file = "markupsafe-3.0.3-cp311-cp311-win32.whl", hash = "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19"}, + {file = "markupsafe-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01"}, + {file = "markupsafe-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c"}, + {file = "markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e"}, + {file = "markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce"}, + {file = "markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d"}, + {file = "markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d"}, + {file = "markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a"}, + {file = "markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b"}, + {file = "markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f"}, + {file = "markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b"}, + {file = "markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d"}, + {file = "markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c"}, + {file = "markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f"}, + {file = "markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795"}, + {file = "markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219"}, + {file = "markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6"}, + {file = "markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676"}, + {file = "markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9"}, + {file = "markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1"}, + {file = "markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc"}, + {file = "markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12"}, + {file = "markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed"}, + {file = "markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5"}, + {file = "markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485"}, + {file = "markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73"}, + {file = "markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37"}, + {file = "markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19"}, + {file = "markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025"}, + {file = "markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6"}, + {file = "markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f"}, + {file = "markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb"}, + {file = "markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009"}, + {file = "markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354"}, + {file = "markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218"}, + {file = "markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287"}, + {file = "markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe"}, + {file = "markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026"}, + {file = "markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737"}, + {file = "markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97"}, + {file = "markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d"}, + {file = "markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda"}, + {file = "markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf"}, + {file = "markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe"}, + {file = "markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9"}, + {file = "markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581"}, + {file = "markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4"}, + {file = "markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab"}, + {file = "markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175"}, + {file = "markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634"}, + {file = "markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50"}, + {file = "markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e"}, + {file = "markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5"}, + {file = "markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523"}, + {file = "markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc"}, + {file = "markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d"}, + {file = "markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9"}, + {file = "markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa"}, + {file = "markupsafe-3.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15d939a21d546304880945ca1ecb8a039db6b4dc49b2c5a400387cdae6a62e26"}, + {file = "markupsafe-3.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f71a396b3bf33ecaa1626c255855702aca4d3d9fea5e051b41ac59a9c1c41edc"}, + {file = "markupsafe-3.0.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f4b68347f8c5eab4a13419215bdfd7f8c9b19f2b25520968adfad23eb0ce60c"}, + {file = "markupsafe-3.0.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e8fc20152abba6b83724d7ff268c249fa196d8259ff481f3b1476383f8f24e42"}, + {file = "markupsafe-3.0.3-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:949b8d66bc381ee8b007cd945914c721d9aba8e27f71959d750a46f7c282b20b"}, + {file = "markupsafe-3.0.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:3537e01efc9d4dccdf77221fb1cb3b8e1a38d5428920e0657ce299b20324d758"}, + {file = "markupsafe-3.0.3-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:591ae9f2a647529ca990bc681daebdd52c8791ff06c2bfa05b65163e28102ef2"}, + {file = "markupsafe-3.0.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a320721ab5a1aba0a233739394eb907f8c8da5c98c9181d1161e77a0c8e36f2d"}, + {file = "markupsafe-3.0.3-cp39-cp39-win32.whl", hash = "sha256:df2449253ef108a379b8b5d6b43f4b1a8e81a061d6537becd5582fba5f9196d7"}, + {file = "markupsafe-3.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:7c3fb7d25180895632e5d3148dbdc29ea38ccb7fd210aa27acbd1201a1902c6e"}, + {file = "markupsafe-3.0.3-cp39-cp39-win_arm64.whl", hash = "sha256:38664109c14ffc9e7437e86b4dceb442b0096dfe3541d7864d9cbe1da4cf36c8"}, + {file = "markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698"}, ] [[package]] name = "matplotlib" -version = "3.10.1" +version = "3.10.8" description = "Python plotting package" optional = false python-versions = ">=3.10" groups = ["main"] files = [ - {file = "matplotlib-3.10.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:ff2ae14910be903f4a24afdbb6d7d3a6c44da210fc7d42790b87aeac92238a16"}, - {file = "matplotlib-3.10.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0721a3fd3d5756ed593220a8b86808a36c5031fce489adb5b31ee6dbb47dd5b2"}, - {file = "matplotlib-3.10.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0673b4b8f131890eb3a1ad058d6e065fb3c6e71f160089b65f8515373394698"}, - {file = "matplotlib-3.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e875b95ac59a7908978fe307ecdbdd9a26af7fa0f33f474a27fcf8c99f64a19"}, - {file = "matplotlib-3.10.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2589659ea30726284c6c91037216f64a506a9822f8e50592d48ac16a2f29e044"}, - {file = "matplotlib-3.10.1-cp310-cp310-win_amd64.whl", hash = "sha256:a97ff127f295817bc34517255c9db6e71de8eddaab7f837b7d341dee9f2f587f"}, - {file = "matplotlib-3.10.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:057206ff2d6ab82ff3e94ebd94463d084760ca682ed5f150817b859372ec4401"}, - {file = "matplotlib-3.10.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a144867dd6bf8ba8cb5fc81a158b645037e11b3e5cf8a50bd5f9917cb863adfe"}, - {file = "matplotlib-3.10.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56c5d9fcd9879aa8040f196a235e2dcbdf7dd03ab5b07c0696f80bc6cf04bedd"}, - {file = "matplotlib-3.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f69dc9713e4ad2fb21a1c30e37bd445d496524257dfda40ff4a8efb3604ab5c"}, - {file = "matplotlib-3.10.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4c59af3e8aca75d7744b68e8e78a669e91ccbcf1ac35d0102a7b1b46883f1dd7"}, - {file = "matplotlib-3.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:11b65088c6f3dae784bc72e8d039a2580186285f87448babb9ddb2ad0082993a"}, - {file = "matplotlib-3.10.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:66e907a06e68cb6cfd652c193311d61a12b54f56809cafbed9736ce5ad92f107"}, - {file = "matplotlib-3.10.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e9b4bb156abb8fa5e5b2b460196f7db7264fc6d62678c03457979e7d5254b7be"}, - {file = "matplotlib-3.10.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1985ad3d97f51307a2cbfc801a930f120def19ba22864182dacef55277102ba6"}, - {file = "matplotlib-3.10.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c96f2c2f825d1257e437a1482c5a2cf4fee15db4261bd6fc0750f81ba2b4ba3d"}, - {file = "matplotlib-3.10.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:35e87384ee9e488d8dd5a2dd7baf471178d38b90618d8ea147aced4ab59c9bea"}, - {file = "matplotlib-3.10.1-cp312-cp312-win_amd64.whl", hash = "sha256:cfd414bce89cc78a7e1d25202e979b3f1af799e416010a20ab2b5ebb3a02425c"}, - {file = "matplotlib-3.10.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c42eee41e1b60fd83ee3292ed83a97a5f2a8239b10c26715d8a6172226988d7b"}, - {file = "matplotlib-3.10.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4f0647b17b667ae745c13721602b540f7aadb2a32c5b96e924cd4fea5dcb90f1"}, - {file = "matplotlib-3.10.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa3854b5f9473564ef40a41bc922be978fab217776e9ae1545c9b3a5cf2092a3"}, - {file = "matplotlib-3.10.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e496c01441be4c7d5f96d4e40f7fca06e20dcb40e44c8daa2e740e1757ad9e6"}, - {file = "matplotlib-3.10.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5d45d3f5245be5b469843450617dcad9af75ca50568acf59997bed9311131a0b"}, - {file = "matplotlib-3.10.1-cp313-cp313-win_amd64.whl", hash = "sha256:8e8e25b1209161d20dfe93037c8a7f7ca796ec9aa326e6e4588d8c4a5dd1e473"}, - {file = "matplotlib-3.10.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:19b06241ad89c3ae9469e07d77efa87041eac65d78df4fcf9cac318028009b01"}, - {file = "matplotlib-3.10.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:01e63101ebb3014e6e9f80d9cf9ee361a8599ddca2c3e166c563628b39305dbb"}, - {file = "matplotlib-3.10.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f06bad951eea6422ac4e8bdebcf3a70c59ea0a03338c5d2b109f57b64eb3972"}, - {file = "matplotlib-3.10.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3dfb036f34873b46978f55e240cff7a239f6c4409eac62d8145bad3fc6ba5a3"}, - {file = "matplotlib-3.10.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dc6ab14a7ab3b4d813b88ba957fc05c79493a037f54e246162033591e770de6f"}, - {file = "matplotlib-3.10.1-cp313-cp313t-win_amd64.whl", hash = "sha256:bc411ebd5889a78dabbc457b3fa153203e22248bfa6eedc6797be5df0164dbf9"}, - {file = "matplotlib-3.10.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:648406f1899f9a818cef8c0231b44dcfc4ff36f167101c3fd1c9151f24220fdc"}, - {file = "matplotlib-3.10.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:02582304e352f40520727984a5a18f37e8187861f954fea9be7ef06569cf85b4"}, - {file = "matplotlib-3.10.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3809916157ba871bcdd33d3493acd7fe3037db5daa917ca6e77975a94cef779"}, - {file = "matplotlib-3.10.1.tar.gz", hash = "sha256:e8d2d0e3881b129268585bf4765ad3ee73a4591d77b9a18c214ac7e3a79fb2ba"}, + {file = "matplotlib-3.10.8-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:00270d217d6b20d14b584c521f810d60c5c78406dc289859776550df837dcda7"}, + {file = "matplotlib-3.10.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:37b3c1cc42aa184b3f738cfa18c1c1d72fd496d85467a6cf7b807936d39aa656"}, + {file = "matplotlib-3.10.8-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ee40c27c795bda6a5292e9cff9890189d32f7e3a0bf04e0e3c9430c4a00c37df"}, + {file = "matplotlib-3.10.8-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a48f2b74020919552ea25d222d5cc6af9ca3f4eb43a93e14d068457f545c2a17"}, + {file = "matplotlib-3.10.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f254d118d14a7f99d616271d6c3c27922c092dac11112670b157798b89bf4933"}, + {file = "matplotlib-3.10.8-cp310-cp310-win_amd64.whl", hash = "sha256:f9b587c9c7274c1613a30afabf65a272114cd6cdbe67b3406f818c79d7ab2e2a"}, + {file = "matplotlib-3.10.8-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6be43b667360fef5c754dda5d25a32e6307a03c204f3c0fc5468b78fa87b4160"}, + {file = "matplotlib-3.10.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a2b336e2d91a3d7006864e0990c83b216fcdca64b5a6484912902cef87313d78"}, + {file = "matplotlib-3.10.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:efb30e3baaea72ce5928e32bab719ab4770099079d66726a62b11b1ef7273be4"}, + {file = "matplotlib-3.10.8-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d56a1efd5bfd61486c8bc968fa18734464556f0fb8e51690f4ac25d85cbbbbc2"}, + {file = "matplotlib-3.10.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:238b7ce5717600615c895050239ec955d91f321c209dd110db988500558e70d6"}, + {file = "matplotlib-3.10.8-cp311-cp311-win_amd64.whl", hash = "sha256:18821ace09c763ec93aef5eeff087ee493a24051936d7b9ebcad9662f66501f9"}, + {file = "matplotlib-3.10.8-cp311-cp311-win_arm64.whl", hash = "sha256:bab485bcf8b1c7d2060b4fcb6fc368a9e6f4cd754c9c2fea281f4be21df394a2"}, + {file = "matplotlib-3.10.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:64fcc24778ca0404ce0cb7b6b77ae1f4c7231cdd60e6778f999ee05cbd581b9a"}, + {file = "matplotlib-3.10.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b9a5ca4ac220a0cdd1ba6bcba3608547117d30468fefce49bb26f55c1a3d5c58"}, + {file = "matplotlib-3.10.8-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3ab4aabc72de4ff77b3ec33a6d78a68227bf1123465887f9905ba79184a1cc04"}, + {file = "matplotlib-3.10.8-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:24d50994d8c5816ddc35411e50a86ab05f575e2530c02752e02538122613371f"}, + {file = "matplotlib-3.10.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:99eefd13c0dc3b3c1b4d561c1169e65fe47aab7b8158754d7c084088e2329466"}, + {file = "matplotlib-3.10.8-cp312-cp312-win_amd64.whl", hash = "sha256:dd80ecb295460a5d9d260df63c43f4afbdd832d725a531f008dad1664f458adf"}, + {file = "matplotlib-3.10.8-cp312-cp312-win_arm64.whl", hash = "sha256:3c624e43ed56313651bc18a47f838b60d7b8032ed348911c54906b130b20071b"}, + {file = "matplotlib-3.10.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3f2e409836d7f5ac2f1c013110a4d50b9f7edc26328c108915f9075d7d7a91b6"}, + {file = "matplotlib-3.10.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:56271f3dac49a88d7fca5060f004d9d22b865f743a12a23b1e937a0be4818ee1"}, + {file = "matplotlib-3.10.8-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a0a7f52498f72f13d4a25ea70f35f4cb60642b466cbb0a9be951b5bc3f45a486"}, + {file = "matplotlib-3.10.8-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:646d95230efb9ca614a7a594d4fcacde0ac61d25e37dd51710b36477594963ce"}, + {file = "matplotlib-3.10.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f89c151aab2e2e23cb3fe0acad1e8b82841fd265379c4cecd0f3fcb34c15e0f6"}, + {file = "matplotlib-3.10.8-cp313-cp313-win_amd64.whl", hash = "sha256:e8ea3e2d4066083e264e75c829078f9e149fa119d27e19acd503de65e0b13149"}, + {file = "matplotlib-3.10.8-cp313-cp313-win_arm64.whl", hash = "sha256:c108a1d6fa78a50646029cb6d49808ff0fc1330fda87fa6f6250c6b5369b6645"}, + {file = "matplotlib-3.10.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:ad3d9833a64cf48cc4300f2b406c3d0f4f4724a91c0bd5640678a6ba7c102077"}, + {file = "matplotlib-3.10.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:eb3823f11823deade26ce3b9f40dcb4a213da7a670013929f31d5f5ed1055b22"}, + {file = "matplotlib-3.10.8-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d9050fee89a89ed57b4fb2c1bfac9a3d0c57a0d55aed95949eedbc42070fea39"}, + {file = "matplotlib-3.10.8-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b44d07310e404ba95f8c25aa5536f154c0a8ec473303535949e52eb71d0a1565"}, + {file = "matplotlib-3.10.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:0a33deb84c15ede243aead39f77e990469fff93ad1521163305095b77b72ce4a"}, + {file = "matplotlib-3.10.8-cp313-cp313t-win_amd64.whl", hash = "sha256:3a48a78d2786784cc2413e57397981fb45c79e968d99656706018d6e62e57958"}, + {file = "matplotlib-3.10.8-cp313-cp313t-win_arm64.whl", hash = "sha256:15d30132718972c2c074cd14638c7f4592bd98719e2308bccea40e0538bc0cb5"}, + {file = "matplotlib-3.10.8-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b53285e65d4fa4c86399979e956235deb900be5baa7fc1218ea67fbfaeaadd6f"}, + {file = "matplotlib-3.10.8-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:32f8dce744be5569bebe789e46727946041199030db8aeb2954d26013a0eb26b"}, + {file = "matplotlib-3.10.8-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4cf267add95b1c88300d96ca837833d4112756045364f5c734a2276038dae27d"}, + {file = "matplotlib-3.10.8-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2cf5bd12cecf46908f286d7838b2abc6c91cda506c0445b8223a7c19a00df008"}, + {file = "matplotlib-3.10.8-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:41703cc95688f2516b480f7f339d8851a6035f18e100ee6a32bc0b8536a12a9c"}, + {file = "matplotlib-3.10.8-cp314-cp314-win_amd64.whl", hash = "sha256:83d282364ea9f3e52363da262ce32a09dfe241e4080dcedda3c0db059d3c1f11"}, + {file = "matplotlib-3.10.8-cp314-cp314-win_arm64.whl", hash = "sha256:2c1998e92cd5999e295a731bcb2911c75f597d937341f3030cc24ef2733d78a8"}, + {file = "matplotlib-3.10.8-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:b5a2b97dbdc7d4f353ebf343744f1d1f1cca8aa8bfddb4262fcf4306c3761d50"}, + {file = "matplotlib-3.10.8-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3f5c3e4da343bba819f0234186b9004faba952cc420fbc522dc4e103c1985908"}, + {file = "matplotlib-3.10.8-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f62550b9a30afde8c1c3ae450e5eb547d579dd69b25c2fc7a1c67f934c1717a"}, + {file = "matplotlib-3.10.8-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:495672de149445ec1b772ff2c9ede9b769e3cb4f0d0aa7fa730d7f59e2d4e1c1"}, + {file = "matplotlib-3.10.8-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:595ba4d8fe983b88f0eec8c26a241e16d6376fe1979086232f481f8f3f67494c"}, + {file = "matplotlib-3.10.8-cp314-cp314t-win_amd64.whl", hash = "sha256:25d380fe8b1dc32cf8f0b1b448470a77afb195438bafdf1d858bfb876f3edf7b"}, + {file = "matplotlib-3.10.8-cp314-cp314t-win_arm64.whl", hash = "sha256:113bb52413ea508ce954a02c10ffd0d565f9c3bc7f2eddc27dfe1731e71c7b5f"}, + {file = "matplotlib-3.10.8-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:f97aeb209c3d2511443f8797e3e5a569aebb040d4f8bc79aa3ee78a8fb9e3dd8"}, + {file = "matplotlib-3.10.8-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:fb061f596dad3a0f52b60dc6a5dec4a0c300dec41e058a7efe09256188d170b7"}, + {file = "matplotlib-3.10.8-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:12d90df9183093fcd479f4172ac26b322b1248b15729cb57f42f71f24c7e37a3"}, + {file = "matplotlib-3.10.8-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:6da7c2ce169267d0d066adcf63758f0604aa6c3eebf67458930f9d9b79ad1db1"}, + {file = "matplotlib-3.10.8-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:9153c3292705be9f9c64498a8872118540c3f4123d1a1c840172edf262c8be4a"}, + {file = "matplotlib-3.10.8-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1ae029229a57cd1e8fe542485f27e7ca7b23aa9e8944ddb4985d0bc444f1eca2"}, + {file = "matplotlib-3.10.8.tar.gz", hash = "sha256:2299372c19d56bcd35cf05a2738308758d32b9eaed2371898d8f5bd33f084aa3"}, ] [package.dependencies] @@ -1908,7 +2240,7 @@ kiwisolver = ">=1.3.1" numpy = ">=1.23" packaging = ">=20.0" pillow = ">=8" -pyparsing = ">=2.3.1" +pyparsing = ">=3" python-dateutil = ">=2.7" [package.extras] @@ -1938,16 +2270,33 @@ files = [ {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, ] +[[package]] +name = "mock" +version = "5.2.0" +description = "Rolling backport of unittest.mock for all Pythons" +optional = false +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "mock-5.2.0-py3-none-any.whl", hash = "sha256:7ba87f72ca0e915175596069dbbcc7c75af7b5e9b9bc107ad6349ede0819982f"}, + {file = "mock-5.2.0.tar.gz", hash = "sha256:4e460e818629b4b173f32d08bf30d3af8123afbb8e04bb5707a1fd4799e503f0"}, +] + +[package.extras] +build = ["blurb", "twine", "wheel"] +docs = ["sphinx"] +test = ["pytest", "pytest-cov"] + [[package]] name = "more-itertools" -version = "10.7.0" +version = "10.8.0" description = "More routines for operating on iterables, beyond itertools" optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "more_itertools-10.7.0-py3-none-any.whl", hash = "sha256:d43980384673cb07d2f7d2d918c616b30c659c089ee23953f601d6609c67510e"}, - {file = "more_itertools-10.7.0.tar.gz", hash = "sha256:9fddd5403be01a94b204faadcff459ec3568cf110265d3c54323e1e866ad29d3"}, + {file = "more_itertools-10.8.0-py3-none-any.whl", hash = "sha256:52d4362373dcf7c52546bc4af9a86ee7c4579df9a8dc268be0a2f949d376cc9b"}, + {file = "more_itertools-10.8.0.tar.gz", hash = "sha256:f638ddf8a1a0d134181275fb5d58b086ead7c6a72429ad725c67503f13ba30bd"}, ] [[package]] @@ -1956,7 +2305,7 @@ version = "1.3.0" description = "Python library for arbitrary-precision floating-point arithmetic" optional = false python-versions = "*" -groups = ["main"] +groups = ["main", "torch-cuda"] files = [ {file = "mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c"}, {file = "mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f"}, @@ -1970,190 +2319,230 @@ tests = ["pytest (>=4.6)"] [[package]] name = "msgpack" -version = "1.1.0" +version = "1.1.2" description = "MessagePack serializer" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main"] files = [ - {file = "msgpack-1.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7ad442d527a7e358a469faf43fda45aaf4ac3249c8310a82f0ccff9164e5dccd"}, - {file = "msgpack-1.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:74bed8f63f8f14d75eec75cf3d04ad581da6b914001b474a5d3cd3372c8cc27d"}, - {file = "msgpack-1.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:914571a2a5b4e7606997e169f64ce53a8b1e06f2cf2c3a7273aa106236d43dd5"}, - {file = "msgpack-1.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c921af52214dcbb75e6bdf6a661b23c3e6417f00c603dd2070bccb5c3ef499f5"}, - {file = "msgpack-1.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8ce0b22b890be5d252de90d0e0d119f363012027cf256185fc3d474c44b1b9e"}, - {file = "msgpack-1.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:73322a6cc57fcee3c0c57c4463d828e9428275fb85a27aa2aa1a92fdc42afd7b"}, - {file = "msgpack-1.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e1f3c3d21f7cf67bcf2da8e494d30a75e4cf60041d98b3f79875afb5b96f3a3f"}, - {file = "msgpack-1.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:64fc9068d701233effd61b19efb1485587560b66fe57b3e50d29c5d78e7fef68"}, - {file = "msgpack-1.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:42f754515e0f683f9c79210a5d1cad631ec3d06cea5172214d2176a42e67e19b"}, - {file = "msgpack-1.1.0-cp310-cp310-win32.whl", hash = "sha256:3df7e6b05571b3814361e8464f9304c42d2196808e0119f55d0d3e62cd5ea044"}, - {file = "msgpack-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:685ec345eefc757a7c8af44a3032734a739f8c45d1b0ac45efc5d8977aa4720f"}, - {file = "msgpack-1.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3d364a55082fb2a7416f6c63ae383fbd903adb5a6cf78c5b96cc6316dc1cedc7"}, - {file = "msgpack-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:79ec007767b9b56860e0372085f8504db5d06bd6a327a335449508bbee9648fa"}, - {file = "msgpack-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6ad622bf7756d5a497d5b6836e7fc3752e2dd6f4c648e24b1803f6048596f701"}, - {file = "msgpack-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e59bca908d9ca0de3dc8684f21ebf9a690fe47b6be93236eb40b99af28b6ea6"}, - {file = "msgpack-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e1da8f11a3dd397f0a32c76165cf0c4eb95b31013a94f6ecc0b280c05c91b59"}, - {file = "msgpack-1.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:452aff037287acb1d70a804ffd022b21fa2bb7c46bee884dbc864cc9024128a0"}, - {file = "msgpack-1.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8da4bf6d54ceed70e8861f833f83ce0814a2b72102e890cbdfe4b34764cdd66e"}, - {file = "msgpack-1.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:41c991beebf175faf352fb940bf2af9ad1fb77fd25f38d9142053914947cdbf6"}, - {file = "msgpack-1.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a52a1f3a5af7ba1c9ace055b659189f6c669cf3657095b50f9602af3a3ba0fe5"}, - {file = "msgpack-1.1.0-cp311-cp311-win32.whl", hash = "sha256:58638690ebd0a06427c5fe1a227bb6b8b9fdc2bd07701bec13c2335c82131a88"}, - {file = "msgpack-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fd2906780f25c8ed5d7b323379f6138524ba793428db5d0e9d226d3fa6aa1788"}, - {file = "msgpack-1.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d46cf9e3705ea9485687aa4001a76e44748b609d260af21c4ceea7f2212a501d"}, - {file = "msgpack-1.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5dbad74103df937e1325cc4bfeaf57713be0b4f15e1c2da43ccdd836393e2ea2"}, - {file = "msgpack-1.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:58dfc47f8b102da61e8949708b3eafc3504509a5728f8b4ddef84bd9e16ad420"}, - {file = "msgpack-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4676e5be1b472909b2ee6356ff425ebedf5142427842aa06b4dfd5117d1ca8a2"}, - {file = "msgpack-1.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17fb65dd0bec285907f68b15734a993ad3fc94332b5bb21b0435846228de1f39"}, - {file = "msgpack-1.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a51abd48c6d8ac89e0cfd4fe177c61481aca2d5e7ba42044fd218cfd8ea9899f"}, - {file = "msgpack-1.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2137773500afa5494a61b1208619e3871f75f27b03bcfca7b3a7023284140247"}, - {file = "msgpack-1.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:398b713459fea610861c8a7b62a6fec1882759f308ae0795b5413ff6a160cf3c"}, - {file = "msgpack-1.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:06f5fd2f6bb2a7914922d935d3b8bb4a7fff3a9a91cfce6d06c13bc42bec975b"}, - {file = "msgpack-1.1.0-cp312-cp312-win32.whl", hash = "sha256:ad33e8400e4ec17ba782f7b9cf868977d867ed784a1f5f2ab46e7ba53b6e1e1b"}, - {file = "msgpack-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:115a7af8ee9e8cddc10f87636767857e7e3717b7a2e97379dc2054712693e90f"}, - {file = "msgpack-1.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:071603e2f0771c45ad9bc65719291c568d4edf120b44eb36324dcb02a13bfddf"}, - {file = "msgpack-1.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0f92a83b84e7c0749e3f12821949d79485971f087604178026085f60ce109330"}, - {file = "msgpack-1.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4a1964df7b81285d00a84da4e70cb1383f2e665e0f1f2a7027e683956d04b734"}, - {file = "msgpack-1.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59caf6a4ed0d164055ccff8fe31eddc0ebc07cf7326a2aaa0dbf7a4001cd823e"}, - {file = "msgpack-1.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0907e1a7119b337971a689153665764adc34e89175f9a34793307d9def08e6ca"}, - {file = "msgpack-1.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65553c9b6da8166e819a6aa90ad15288599b340f91d18f60b2061f402b9a4915"}, - {file = "msgpack-1.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7a946a8992941fea80ed4beae6bff74ffd7ee129a90b4dd5cf9c476a30e9708d"}, - {file = "msgpack-1.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4b51405e36e075193bc051315dbf29168d6141ae2500ba8cd80a522964e31434"}, - {file = "msgpack-1.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4c01941fd2ff87c2a934ee6055bda4ed353a7846b8d4f341c428109e9fcde8c"}, - {file = "msgpack-1.1.0-cp313-cp313-win32.whl", hash = "sha256:7c9a35ce2c2573bada929e0b7b3576de647b0defbd25f5139dcdaba0ae35a4cc"}, - {file = "msgpack-1.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:bce7d9e614a04d0883af0b3d4d501171fbfca038f12c77fa838d9f198147a23f"}, - {file = "msgpack-1.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c40ffa9a15d74e05ba1fe2681ea33b9caffd886675412612d93ab17b58ea2fec"}, - {file = "msgpack-1.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1ba6136e650898082d9d5a5217d5906d1e138024f836ff48691784bbe1adf96"}, - {file = "msgpack-1.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e0856a2b7e8dcb874be44fea031d22e5b3a19121be92a1e098f46068a11b0870"}, - {file = "msgpack-1.1.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:471e27a5787a2e3f974ba023f9e265a8c7cfd373632247deb225617e3100a3c7"}, - {file = "msgpack-1.1.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:646afc8102935a388ffc3914b336d22d1c2d6209c773f3eb5dd4d6d3b6f8c1cb"}, - {file = "msgpack-1.1.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:13599f8829cfbe0158f6456374e9eea9f44eee08076291771d8ae93eda56607f"}, - {file = "msgpack-1.1.0-cp38-cp38-win32.whl", hash = "sha256:8a84efb768fb968381e525eeeb3d92857e4985aacc39f3c47ffd00eb4509315b"}, - {file = "msgpack-1.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:879a7b7b0ad82481c52d3c7eb99bf6f0645dbdec5134a4bddbd16f3506947feb"}, - {file = "msgpack-1.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:53258eeb7a80fc46f62fd59c876957a2d0e15e6449a9e71842b6d24419d88ca1"}, - {file = "msgpack-1.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7e7b853bbc44fb03fbdba34feb4bd414322180135e2cb5164f20ce1c9795ee48"}, - {file = "msgpack-1.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3e9b4936df53b970513eac1758f3882c88658a220b58dcc1e39606dccaaf01c"}, - {file = "msgpack-1.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46c34e99110762a76e3911fc923222472c9d681f1094096ac4102c18319e6468"}, - {file = "msgpack-1.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a706d1e74dd3dea05cb54580d9bd8b2880e9264856ce5068027eed09680aa74"}, - {file = "msgpack-1.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:534480ee5690ab3cbed89d4c8971a5c631b69a8c0883ecfea96c19118510c846"}, - {file = "msgpack-1.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8cf9e8c3a2153934a23ac160cc4cba0ec035f6867c8013cc6077a79823370346"}, - {file = "msgpack-1.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3180065ec2abbe13a4ad37688b61b99d7f9e012a535b930e0e683ad6bc30155b"}, - {file = "msgpack-1.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c5a91481a3cc573ac8c0d9aace09345d989dc4a0202b7fcb312c88c26d4e71a8"}, - {file = "msgpack-1.1.0-cp39-cp39-win32.whl", hash = "sha256:f80bc7d47f76089633763f952e67f8214cb7b3ee6bfa489b3cb6a84cfac114cd"}, - {file = "msgpack-1.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:4d1b7ff2d6146e16e8bd665ac726a89c74163ef8cd39fa8c1087d4e52d3a2325"}, - {file = "msgpack-1.1.0.tar.gz", hash = "sha256:dd432ccc2c72b914e4cb77afce64aab761c1137cc698be3984eee260bcb2896e"}, + {file = "msgpack-1.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0051fffef5a37ca2cd16978ae4f0aef92f164df86823871b5162812bebecd8e2"}, + {file = "msgpack-1.1.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a605409040f2da88676e9c9e5853b3449ba8011973616189ea5ee55ddbc5bc87"}, + {file = "msgpack-1.1.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b696e83c9f1532b4af884045ba7f3aa741a63b2bc22617293a2c6a7c645f251"}, + {file = "msgpack-1.1.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:365c0bbe981a27d8932da71af63ef86acc59ed5c01ad929e09a0b88c6294e28a"}, + {file = "msgpack-1.1.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:41d1a5d875680166d3ac5c38573896453bbbea7092936d2e107214daf43b1d4f"}, + {file = "msgpack-1.1.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:354e81bcdebaab427c3df4281187edc765d5d76bfb3a7c125af9da7a27e8458f"}, + {file = "msgpack-1.1.2-cp310-cp310-win32.whl", hash = "sha256:e64c8d2f5e5d5fda7b842f55dec6133260ea8f53c4257d64494c534f306bf7a9"}, + {file = "msgpack-1.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:db6192777d943bdaaafb6ba66d44bf65aa0e9c5616fa1d2da9bb08828c6b39aa"}, + {file = "msgpack-1.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2e86a607e558d22985d856948c12a3fa7b42efad264dca8a3ebbcfa2735d786c"}, + {file = "msgpack-1.1.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:283ae72fc89da59aa004ba147e8fc2f766647b1251500182fac0350d8af299c0"}, + {file = "msgpack-1.1.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:61c8aa3bd513d87c72ed0b37b53dd5c5a0f58f2ff9f26e1555d3bd7948fb7296"}, + {file = "msgpack-1.1.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:454e29e186285d2ebe65be34629fa0e8605202c60fbc7c4c650ccd41870896ef"}, + {file = "msgpack-1.1.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7bc8813f88417599564fafa59fd6f95be417179f76b40325b500b3c98409757c"}, + {file = "msgpack-1.1.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bafca952dc13907bdfdedfc6a5f579bf4f292bdd506fadb38389afa3ac5b208e"}, + {file = "msgpack-1.1.2-cp311-cp311-win32.whl", hash = "sha256:602b6740e95ffc55bfb078172d279de3773d7b7db1f703b2f1323566b878b90e"}, + {file = "msgpack-1.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:d198d275222dc54244bf3327eb8cbe00307d220241d9cec4d306d49a44e85f68"}, + {file = "msgpack-1.1.2-cp311-cp311-win_arm64.whl", hash = "sha256:86f8136dfa5c116365a8a651a7d7484b65b13339731dd6faebb9a0242151c406"}, + {file = "msgpack-1.1.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:70a0dff9d1f8da25179ffcf880e10cf1aad55fdb63cd59c9a49a1b82290062aa"}, + {file = "msgpack-1.1.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:446abdd8b94b55c800ac34b102dffd2f6aa0ce643c55dfc017ad89347db3dbdb"}, + {file = "msgpack-1.1.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c63eea553c69ab05b6747901b97d620bb2a690633c77f23feb0c6a947a8a7b8f"}, + {file = "msgpack-1.1.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:372839311ccf6bdaf39b00b61288e0557916c3729529b301c52c2d88842add42"}, + {file = "msgpack-1.1.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2929af52106ca73fcb28576218476ffbb531a036c2adbcf54a3664de124303e9"}, + {file = "msgpack-1.1.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:be52a8fc79e45b0364210eef5234a7cf8d330836d0a64dfbb878efa903d84620"}, + {file = "msgpack-1.1.2-cp312-cp312-win32.whl", hash = "sha256:1fff3d825d7859ac888b0fbda39a42d59193543920eda9d9bea44d958a878029"}, + {file = "msgpack-1.1.2-cp312-cp312-win_amd64.whl", hash = "sha256:1de460f0403172cff81169a30b9a92b260cb809c4cb7e2fc79ae8d0510c78b6b"}, + {file = "msgpack-1.1.2-cp312-cp312-win_arm64.whl", hash = "sha256:be5980f3ee0e6bd44f3a9e9dea01054f175b50c3e6cdb692bc9424c0bbb8bf69"}, + {file = "msgpack-1.1.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4efd7b5979ccb539c221a4c4e16aac1a533efc97f3b759bb5a5ac9f6d10383bf"}, + {file = "msgpack-1.1.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:42eefe2c3e2af97ed470eec850facbe1b5ad1d6eacdbadc42ec98e7dcf68b4b7"}, + {file = "msgpack-1.1.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1fdf7d83102bf09e7ce3357de96c59b627395352a4024f6e2458501f158bf999"}, + {file = "msgpack-1.1.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fac4be746328f90caa3cd4bc67e6fe36ca2bf61d5c6eb6d895b6527e3f05071e"}, + {file = "msgpack-1.1.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fffee09044073e69f2bad787071aeec727183e7580443dfeb8556cbf1978d162"}, + {file = "msgpack-1.1.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5928604de9b032bc17f5099496417f113c45bc6bc21b5c6920caf34b3c428794"}, + {file = "msgpack-1.1.2-cp313-cp313-win32.whl", hash = "sha256:a7787d353595c7c7e145e2331abf8b7ff1e6673a6b974ded96e6d4ec09f00c8c"}, + {file = "msgpack-1.1.2-cp313-cp313-win_amd64.whl", hash = "sha256:a465f0dceb8e13a487e54c07d04ae3ba131c7c5b95e2612596eafde1dccf64a9"}, + {file = "msgpack-1.1.2-cp313-cp313-win_arm64.whl", hash = "sha256:e69b39f8c0aa5ec24b57737ebee40be647035158f14ed4b40e6f150077e21a84"}, + {file = "msgpack-1.1.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:e23ce8d5f7aa6ea6d2a2b326b4ba46c985dbb204523759984430db7114f8aa00"}, + {file = "msgpack-1.1.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:6c15b7d74c939ebe620dd8e559384be806204d73b4f9356320632d783d1f7939"}, + {file = "msgpack-1.1.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:99e2cb7b9031568a2a5c73aa077180f93dd2e95b4f8d3b8e14a73ae94a9e667e"}, + {file = "msgpack-1.1.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:180759d89a057eab503cf62eeec0aa61c4ea1200dee709f3a8e9397dbb3b6931"}, + {file = "msgpack-1.1.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:04fb995247a6e83830b62f0b07bf36540c213f6eac8e851166d8d86d83cbd014"}, + {file = "msgpack-1.1.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:8e22ab046fa7ede9e36eeb4cfad44d46450f37bb05d5ec482b02868f451c95e2"}, + {file = "msgpack-1.1.2-cp314-cp314-win32.whl", hash = "sha256:80a0ff7d4abf5fecb995fcf235d4064b9a9a8a40a3ab80999e6ac1e30b702717"}, + {file = "msgpack-1.1.2-cp314-cp314-win_amd64.whl", hash = "sha256:9ade919fac6a3e7260b7f64cea89df6bec59104987cbea34d34a2fa15d74310b"}, + {file = "msgpack-1.1.2-cp314-cp314-win_arm64.whl", hash = "sha256:59415c6076b1e30e563eb732e23b994a61c159cec44deaf584e5cc1dd662f2af"}, + {file = "msgpack-1.1.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:897c478140877e5307760b0ea66e0932738879e7aa68144d9b78ea4c8302a84a"}, + {file = "msgpack-1.1.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a668204fa43e6d02f89dbe79a30b0d67238d9ec4c5bd8a940fc3a004a47b721b"}, + {file = "msgpack-1.1.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5559d03930d3aa0f3aacb4c42c776af1a2ace2611871c84a75afe436695e6245"}, + {file = "msgpack-1.1.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:70c5a7a9fea7f036b716191c29047374c10721c389c21e9ffafad04df8c52c90"}, + {file = "msgpack-1.1.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:f2cb069d8b981abc72b41aea1c580ce92d57c673ec61af4c500153a626cb9e20"}, + {file = "msgpack-1.1.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d62ce1f483f355f61adb5433ebfd8868c5f078d1a52d042b0a998682b4fa8c27"}, + {file = "msgpack-1.1.2-cp314-cp314t-win32.whl", hash = "sha256:1d1418482b1ee984625d88aa9585db570180c286d942da463533b238b98b812b"}, + {file = "msgpack-1.1.2-cp314-cp314t-win_amd64.whl", hash = "sha256:5a46bf7e831d09470ad92dff02b8b1ac92175ca36b087f904a0519857c6be3ff"}, + {file = "msgpack-1.1.2-cp314-cp314t-win_arm64.whl", hash = "sha256:d99ef64f349d5ec3293688e91486c5fdb925ed03807f64d98d205d2713c60b46"}, + {file = "msgpack-1.1.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ea5405c46e690122a76531ab97a079e184c0daf491e588592d6a23d3e32af99e"}, + {file = "msgpack-1.1.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9fba231af7a933400238cb357ecccf8ab5d51535ea95d94fc35b7806218ff844"}, + {file = "msgpack-1.1.2-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a8f6e7d30253714751aa0b0c84ae28948e852ee7fb0524082e6716769124bc23"}, + {file = "msgpack-1.1.2-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:94fd7dc7d8cb0a54432f296f2246bc39474e017204ca6f4ff345941d4ed285a7"}, + {file = "msgpack-1.1.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:350ad5353a467d9e3b126d8d1b90fe05ad081e2e1cef5753f8c345217c37e7b8"}, + {file = "msgpack-1.1.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6bde749afe671dc44893f8d08e83bf475a1a14570d67c4bb5cec5573463c8833"}, + {file = "msgpack-1.1.2-cp39-cp39-win32.whl", hash = "sha256:ad09b984828d6b7bb52d1d1d0c9be68ad781fa004ca39216c8a1e63c0f34ba3c"}, + {file = "msgpack-1.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:67016ae8c8965124fdede9d3769528ad8284f14d635337ffa6a713a580f6c030"}, + {file = "msgpack-1.1.2.tar.gz", hash = "sha256:3b60763c1373dd60f398488069bcdc703cd08a711477b5d480eecc9f9626f47e"}, ] [[package]] name = "multidict" -version = "6.4.3" +version = "6.7.1" description = "multidict implementation" optional = false python-versions = ">=3.9" -groups = ["main"] -files = [ - {file = "multidict-6.4.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:32a998bd8a64ca48616eac5a8c1cc4fa38fb244a3facf2eeb14abe186e0f6cc5"}, - {file = "multidict-6.4.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a54ec568f1fc7f3c313c2f3b16e5db346bf3660e1309746e7fccbbfded856188"}, - {file = "multidict-6.4.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a7be07e5df178430621c716a63151165684d3e9958f2bbfcb644246162007ab7"}, - {file = "multidict-6.4.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b128dbf1c939674a50dd0b28f12c244d90e5015e751a4f339a96c54f7275e291"}, - {file = "multidict-6.4.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b9cb19dfd83d35b6ff24a4022376ea6e45a2beba8ef3f0836b8a4b288b6ad685"}, - {file = "multidict-6.4.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3cf62f8e447ea2c1395afa289b332e49e13d07435369b6f4e41f887db65b40bf"}, - {file = "multidict-6.4.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:909f7d43ff8f13d1adccb6a397094adc369d4da794407f8dd592c51cf0eae4b1"}, - {file = "multidict-6.4.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0bb8f8302fbc7122033df959e25777b0b7659b1fd6bcb9cb6bed76b5de67afef"}, - {file = "multidict-6.4.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:224b79471b4f21169ea25ebc37ed6f058040c578e50ade532e2066562597b8a9"}, - {file = "multidict-6.4.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a7bd27f7ab3204f16967a6f899b3e8e9eb3362c0ab91f2ee659e0345445e0078"}, - {file = "multidict-6.4.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:99592bd3162e9c664671fd14e578a33bfdba487ea64bcb41d281286d3c870ad7"}, - {file = "multidict-6.4.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:a62d78a1c9072949018cdb05d3c533924ef8ac9bcb06cbf96f6d14772c5cd451"}, - {file = "multidict-6.4.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:3ccdde001578347e877ca4f629450973c510e88e8865d5aefbcb89b852ccc666"}, - {file = "multidict-6.4.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:eccb67b0e78aa2e38a04c5ecc13bab325a43e5159a181a9d1a6723db913cbb3c"}, - {file = "multidict-6.4.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8b6fcf6054fc4114a27aa865f8840ef3d675f9316e81868e0ad5866184a6cba5"}, - {file = "multidict-6.4.3-cp310-cp310-win32.whl", hash = "sha256:f92c7f62d59373cd93bc9969d2da9b4b21f78283b1379ba012f7ee8127b3152e"}, - {file = "multidict-6.4.3-cp310-cp310-win_amd64.whl", hash = "sha256:b57e28dbc031d13916b946719f213c494a517b442d7b48b29443e79610acd887"}, - {file = "multidict-6.4.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f6f19170197cc29baccd33ccc5b5d6a331058796485857cf34f7635aa25fb0cd"}, - {file = "multidict-6.4.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f2882bf27037eb687e49591690e5d491e677272964f9ec7bc2abbe09108bdfb8"}, - {file = "multidict-6.4.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fbf226ac85f7d6b6b9ba77db4ec0704fde88463dc17717aec78ec3c8546c70ad"}, - {file = "multidict-6.4.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e329114f82ad4b9dd291bef614ea8971ec119ecd0f54795109976de75c9a852"}, - {file = "multidict-6.4.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:1f4e0334d7a555c63f5c8952c57ab6f1c7b4f8c7f3442df689fc9f03df315c08"}, - {file = "multidict-6.4.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:740915eb776617b57142ce0bb13b7596933496e2f798d3d15a20614adf30d229"}, - {file = "multidict-6.4.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:255dac25134d2b141c944b59a0d2f7211ca12a6d4779f7586a98b4b03ea80508"}, - {file = "multidict-6.4.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4e8535bd4d741039b5aad4285ecd9b902ef9e224711f0b6afda6e38d7ac02c7"}, - {file = "multidict-6.4.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30c433a33be000dd968f5750722eaa0991037be0be4a9d453eba121774985bc8"}, - {file = "multidict-6.4.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4eb33b0bdc50acd538f45041f5f19945a1f32b909b76d7b117c0c25d8063df56"}, - {file = "multidict-6.4.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:75482f43465edefd8a5d72724887ccdcd0c83778ded8f0cb1e0594bf71736cc0"}, - {file = "multidict-6.4.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ce5b3082e86aee80b3925ab4928198450d8e5b6466e11501fe03ad2191c6d777"}, - {file = "multidict-6.4.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e413152e3212c4d39f82cf83c6f91be44bec9ddea950ce17af87fbf4e32ca6b2"}, - {file = "multidict-6.4.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:8aac2eeff69b71f229a405c0a4b61b54bade8e10163bc7b44fcd257949620618"}, - {file = "multidict-6.4.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ab583ac203af1d09034be41458feeab7863c0635c650a16f15771e1386abf2d7"}, - {file = "multidict-6.4.3-cp311-cp311-win32.whl", hash = "sha256:1b2019317726f41e81154df636a897de1bfe9228c3724a433894e44cd2512378"}, - {file = "multidict-6.4.3-cp311-cp311-win_amd64.whl", hash = "sha256:43173924fa93c7486402217fab99b60baf78d33806af299c56133a3755f69589"}, - {file = "multidict-6.4.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1f1c2f58f08b36f8475f3ec6f5aeb95270921d418bf18f90dffd6be5c7b0e676"}, - {file = "multidict-6.4.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:26ae9ad364fc61b936fb7bf4c9d8bd53f3a5b4417142cd0be5c509d6f767e2f1"}, - {file = "multidict-6.4.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:659318c6c8a85f6ecfc06b4e57529e5a78dfdd697260cc81f683492ad7e9435a"}, - {file = "multidict-6.4.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1eb72c741fd24d5a28242ce72bb61bc91f8451877131fa3fe930edb195f7054"}, - {file = "multidict-6.4.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3cd06d88cb7398252284ee75c8db8e680aa0d321451132d0dba12bc995f0adcc"}, - {file = "multidict-6.4.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4543d8dc6470a82fde92b035a92529317191ce993533c3c0c68f56811164ed07"}, - {file = "multidict-6.4.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:30a3ebdc068c27e9d6081fca0e2c33fdf132ecea703a72ea216b81a66860adde"}, - {file = "multidict-6.4.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b038f10e23f277153f86f95c777ba1958bcd5993194fda26a1d06fae98b2f00c"}, - {file = "multidict-6.4.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c605a2b2dc14282b580454b9b5d14ebe0668381a3a26d0ac39daa0ca115eb2ae"}, - {file = "multidict-6.4.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8bd2b875f4ca2bb527fe23e318ddd509b7df163407b0fb717df229041c6df5d3"}, - {file = "multidict-6.4.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:c2e98c840c9c8e65c0e04b40c6c5066c8632678cd50c8721fdbcd2e09f21a507"}, - {file = "multidict-6.4.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:66eb80dd0ab36dbd559635e62fba3083a48a252633164857a1d1684f14326427"}, - {file = "multidict-6.4.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c23831bdee0a2a3cf21be057b5e5326292f60472fb6c6f86392bbf0de70ba731"}, - {file = "multidict-6.4.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1535cec6443bfd80d028052e9d17ba6ff8a5a3534c51d285ba56c18af97e9713"}, - {file = "multidict-6.4.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3b73e7227681f85d19dec46e5b881827cd354aabe46049e1a61d2f9aaa4e285a"}, - {file = "multidict-6.4.3-cp312-cp312-win32.whl", hash = "sha256:8eac0c49df91b88bf91f818e0a24c1c46f3622978e2c27035bfdca98e0e18124"}, - {file = "multidict-6.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:11990b5c757d956cd1db7cb140be50a63216af32cd6506329c2c59d732d802db"}, - {file = "multidict-6.4.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7a76534263d03ae0cfa721fea40fd2b5b9d17a6f85e98025931d41dc49504474"}, - {file = "multidict-6.4.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:805031c2f599eee62ac579843555ed1ce389ae00c7e9f74c2a1b45e0564a88dd"}, - {file = "multidict-6.4.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c56c179839d5dcf51d565132185409d1d5dd8e614ba501eb79023a6cab25576b"}, - {file = "multidict-6.4.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c64f4ddb3886dd8ab71b68a7431ad4aa01a8fa5be5b11543b29674f29ca0ba3"}, - {file = "multidict-6.4.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3002a856367c0b41cad6784f5b8d3ab008eda194ed7864aaa58f65312e2abcac"}, - {file = "multidict-6.4.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3d75e621e7d887d539d6e1d789f0c64271c250276c333480a9e1de089611f790"}, - {file = "multidict-6.4.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:995015cf4a3c0d72cbf453b10a999b92c5629eaf3a0c3e1efb4b5c1f602253bb"}, - {file = "multidict-6.4.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2b0fabae7939d09d7d16a711468c385272fa1b9b7fb0d37e51143585d8e72e0"}, - {file = "multidict-6.4.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:61ed4d82f8a1e67eb9eb04f8587970d78fe7cddb4e4d6230b77eda23d27938f9"}, - {file = "multidict-6.4.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:062428944a8dc69df9fdc5d5fc6279421e5f9c75a9ee3f586f274ba7b05ab3c8"}, - {file = "multidict-6.4.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:b90e27b4674e6c405ad6c64e515a505c6d113b832df52fdacb6b1ffd1fa9a1d1"}, - {file = "multidict-6.4.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7d50d4abf6729921e9613d98344b74241572b751c6b37feed75fb0c37bd5a817"}, - {file = "multidict-6.4.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:43fe10524fb0a0514be3954be53258e61d87341008ce4914f8e8b92bee6f875d"}, - {file = "multidict-6.4.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:236966ca6c472ea4e2d3f02f6673ebfd36ba3f23159c323f5a496869bc8e47c9"}, - {file = "multidict-6.4.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:422a5ec315018e606473ba1f5431e064cf8b2a7468019233dcf8082fabad64c8"}, - {file = "multidict-6.4.3-cp313-cp313-win32.whl", hash = "sha256:f901a5aace8e8c25d78960dcc24c870c8d356660d3b49b93a78bf38eb682aac3"}, - {file = "multidict-6.4.3-cp313-cp313-win_amd64.whl", hash = "sha256:1c152c49e42277bc9a2f7b78bd5fa10b13e88d1b0328221e7aef89d5c60a99a5"}, - {file = "multidict-6.4.3-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:be8751869e28b9c0d368d94f5afcb4234db66fe8496144547b4b6d6a0645cfc6"}, - {file = "multidict-6.4.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0d4b31f8a68dccbcd2c0ea04f0e014f1defc6b78f0eb8b35f2265e8716a6df0c"}, - {file = "multidict-6.4.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:032efeab3049e37eef2ff91271884303becc9e54d740b492a93b7e7266e23756"}, - {file = "multidict-6.4.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e78006af1a7c8a8007e4f56629d7252668344442f66982368ac06522445e375"}, - {file = "multidict-6.4.3-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:daeac9dd30cda8703c417e4fddccd7c4dc0c73421a0b54a7da2713be125846be"}, - {file = "multidict-6.4.3-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f6f90700881438953eae443a9c6f8a509808bc3b185246992c4233ccee37fea"}, - {file = "multidict-6.4.3-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f84627997008390dd15762128dcf73c3365f4ec0106739cde6c20a07ed198ec8"}, - {file = "multidict-6.4.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3307b48cd156153b117c0ea54890a3bdbf858a5b296ddd40dc3852e5f16e9b02"}, - {file = "multidict-6.4.3-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ead46b0fa1dcf5af503a46e9f1c2e80b5d95c6011526352fa5f42ea201526124"}, - {file = "multidict-6.4.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:1748cb2743bedc339d63eb1bca314061568793acd603a6e37b09a326334c9f44"}, - {file = "multidict-6.4.3-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:acc9fa606f76fc111b4569348cc23a771cb52c61516dcc6bcef46d612edb483b"}, - {file = "multidict-6.4.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:31469d5832b5885adeb70982e531ce86f8c992334edd2f2254a10fa3182ac504"}, - {file = "multidict-6.4.3-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:ba46b51b6e51b4ef7bfb84b82f5db0dc5e300fb222a8a13b8cd4111898a869cf"}, - {file = "multidict-6.4.3-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:389cfefb599edf3fcfd5f64c0410da686f90f5f5e2c4d84e14f6797a5a337af4"}, - {file = "multidict-6.4.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:64bc2bbc5fba7b9db5c2c8d750824f41c6994e3882e6d73c903c2afa78d091e4"}, - {file = "multidict-6.4.3-cp313-cp313t-win32.whl", hash = "sha256:0ecdc12ea44bab2807d6b4a7e5eef25109ab1c82a8240d86d3c1fc9f3b72efd5"}, - {file = "multidict-6.4.3-cp313-cp313t-win_amd64.whl", hash = "sha256:7146a8742ea71b5d7d955bffcef58a9e6e04efba704b52a460134fefd10a8208"}, - {file = "multidict-6.4.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5427a2679e95a642b7f8b0f761e660c845c8e6fe3141cddd6b62005bd133fc21"}, - {file = "multidict-6.4.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:24a8caa26521b9ad09732972927d7b45b66453e6ebd91a3c6a46d811eeb7349b"}, - {file = "multidict-6.4.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6b5a272bc7c36a2cd1b56ddc6bff02e9ce499f9f14ee4a45c45434ef083f2459"}, - {file = "multidict-6.4.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edf74dc5e212b8c75165b435c43eb0d5e81b6b300a938a4eb82827119115e840"}, - {file = "multidict-6.4.3-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:9f35de41aec4b323c71f54b0ca461ebf694fb48bec62f65221f52e0017955b39"}, - {file = "multidict-6.4.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae93e0ff43b6f6892999af64097b18561691ffd835e21a8348a441e256592e1f"}, - {file = "multidict-6.4.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5e3929269e9d7eff905d6971d8b8c85e7dbc72c18fb99c8eae6fe0a152f2e343"}, - {file = "multidict-6.4.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb6214fe1750adc2a1b801a199d64b5a67671bf76ebf24c730b157846d0e90d2"}, - {file = "multidict-6.4.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6d79cf5c0c6284e90f72123f4a3e4add52d6c6ebb4a9054e88df15b8d08444c6"}, - {file = "multidict-6.4.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2427370f4a255262928cd14533a70d9738dfacadb7563bc3b7f704cc2360fc4e"}, - {file = "multidict-6.4.3-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:fbd8d737867912b6c5f99f56782b8cb81f978a97b4437a1c476de90a3e41c9a1"}, - {file = "multidict-6.4.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:0ee1bf613c448997f73fc4efb4ecebebb1c02268028dd4f11f011f02300cf1e8"}, - {file = "multidict-6.4.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:578568c4ba5f2b8abd956baf8b23790dbfdc953e87d5b110bce343b4a54fc9e7"}, - {file = "multidict-6.4.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:a059ad6b80de5b84b9fa02a39400319e62edd39d210b4e4f8c4f1243bdac4752"}, - {file = "multidict-6.4.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:dd53893675b729a965088aaadd6a1f326a72b83742b056c1065bdd2e2a42b4df"}, - {file = "multidict-6.4.3-cp39-cp39-win32.whl", hash = "sha256:abcfed2c4c139f25c2355e180bcc077a7cae91eefbb8b3927bb3f836c9586f1f"}, - {file = "multidict-6.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:b1b389ae17296dd739015d5ddb222ee99fd66adeae910de21ac950e00979d897"}, - {file = "multidict-6.4.3-py3-none-any.whl", hash = "sha256:59fe01ee8e2a1e8ceb3f6dbb216b09c8d9f4ef1c22c4fc825d045a147fa2ebc9"}, - {file = "multidict-6.4.3.tar.gz", hash = "sha256:3ada0b058c9f213c5f95ba301f922d402ac234f1111a7d8fd70f1b99f3c281ec"}, +groups = ["main", "torch-cuda"] +files = [ + {file = "multidict-6.7.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c93c3db7ea657dd4637d57e74ab73de31bccefe144d3d4ce370052035bc85fb5"}, + {file = "multidict-6.7.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:974e72a2474600827abaeda71af0c53d9ebbc3c2eb7da37b37d7829ae31232d8"}, + {file = "multidict-6.7.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cdea2e7b2456cfb6694fb113066fd0ec7ea4d67e3a35e1f4cbeea0b448bf5872"}, + {file = "multidict-6.7.1-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:17207077e29342fdc2c9a82e4b306f1127bf1ea91f8b71e02d4798a70bb99991"}, + {file = "multidict-6.7.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d4f49cb5661344764e4c7c7973e92a47a59b8fc19b6523649ec9dc4960e58a03"}, + {file = "multidict-6.7.1-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a9fc4caa29e2e6ae408d1c450ac8bf19892c5fca83ee634ecd88a53332c59981"}, + {file = "multidict-6.7.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c5f0c21549ab432b57dcc82130f388d84ad8179824cc3f223d5e7cfbfd4143f6"}, + {file = "multidict-6.7.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7dfb78d966b2c906ae1d28ccf6e6712a3cd04407ee5088cd276fe8cb42186190"}, + {file = "multidict-6.7.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9b0d9b91d1aa44db9c1f1ecd0d9d2ae610b2f4f856448664e01a3b35899f3f92"}, + {file = "multidict-6.7.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:dd96c01a9dcd4889dcfcf9eb5544ca0c77603f239e3ffab0524ec17aea9a93ee"}, + {file = "multidict-6.7.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:067343c68cd6612d375710f895337b3a98a033c94f14b9a99eff902f205424e2"}, + {file = "multidict-6.7.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5884a04f4ff56c6120f6ccf703bdeb8b5079d808ba604d4d53aec0d55dc33568"}, + {file = "multidict-6.7.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8affcf1c98b82bc901702eb73b6947a1bfa170823c153fe8a47b5f5f02e48e40"}, + {file = "multidict-6.7.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:0d17522c37d03e85c8098ec8431636309b2682cf12e58f4dbc76121fb50e4962"}, + {file = "multidict-6.7.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:24c0cf81544ca5e17cfcb6e482e7a82cd475925242b308b890c9452a074d4505"}, + {file = "multidict-6.7.1-cp310-cp310-win32.whl", hash = "sha256:d82dd730a95e6643802f4454b8fdecdf08667881a9c5670db85bc5a56693f122"}, + {file = "multidict-6.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:cf37cbe5ced48d417ba045aca1b21bafca67489452debcde94778a576666a1df"}, + {file = "multidict-6.7.1-cp310-cp310-win_arm64.whl", hash = "sha256:59bc83d3f66b41dac1e7460aac1d196edc70c9ba3094965c467715a70ecb46db"}, + {file = "multidict-6.7.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7ff981b266af91d7b4b3793ca3382e53229088d193a85dfad6f5f4c27fc73e5d"}, + {file = "multidict-6.7.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:844c5bca0b5444adb44a623fb0a1310c2f4cd41f402126bb269cd44c9b3f3e1e"}, + {file = "multidict-6.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f2a0a924d4c2e9afcd7ec64f9de35fcd96915149b2216e1cb2c10a56df483855"}, + {file = "multidict-6.7.1-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:8be1802715a8e892c784c0197c2ace276ea52702a0ede98b6310c8f255a5afb3"}, + {file = "multidict-6.7.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2e2d2ed645ea29f31c4c7ea1552fcfd7cb7ba656e1eafd4134a6620c9f5fdd9e"}, + {file = "multidict-6.7.1-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:95922cee9a778659e91db6497596435777bd25ed116701a4c034f8e46544955a"}, + {file = "multidict-6.7.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6b83cabdc375ffaaa15edd97eb7c0c672ad788e2687004990074d7d6c9b140c8"}, + {file = "multidict-6.7.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:38fb49540705369bab8484db0689d86c0a33a0a9f2c1b197f506b71b4b6c19b0"}, + {file = "multidict-6.7.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:439cbebd499f92e9aa6793016a8acaa161dfa749ae86d20960189f5398a19144"}, + {file = "multidict-6.7.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6d3bc717b6fe763b8be3f2bee2701d3c8eb1b2a8ae9f60910f1b2860c82b6c49"}, + {file = "multidict-6.7.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:619e5a1ac57986dbfec9f0b301d865dddf763696435e2962f6d9cf2fdff2bb71"}, + {file = "multidict-6.7.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0b38ebffd9be37c1170d33bc0f36f4f262e0a09bc1aac1c34c7aa51a7293f0b3"}, + {file = "multidict-6.7.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:10ae39c9cfe6adedcdb764f5e8411d4a92b055e35573a2eaa88d3323289ef93c"}, + {file = "multidict-6.7.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:25167cc263257660290fba06b9318d2026e3c910be240a146e1f66dd114af2b0"}, + {file = "multidict-6.7.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:128441d052254f42989ef98b7b6a6ecb1e6f708aa962c7984235316db59f50fa"}, + {file = "multidict-6.7.1-cp311-cp311-win32.whl", hash = "sha256:d62b7f64ffde3b99d06b707a280db04fb3855b55f5a06df387236051d0668f4a"}, + {file = "multidict-6.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:bdbf9f3b332abd0cdb306e7c2113818ab1e922dc84b8f8fd06ec89ed2a19ab8b"}, + {file = "multidict-6.7.1-cp311-cp311-win_arm64.whl", hash = "sha256:b8c990b037d2fff2f4e33d3f21b9b531c5745b33a49a7d6dbe7a177266af44f6"}, + {file = "multidict-6.7.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a90f75c956e32891a4eda3639ce6dd86e87105271f43d43442a3aedf3cddf172"}, + {file = "multidict-6.7.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fccb473e87eaa1382689053e4a4618e7ba7b9b9b8d6adf2027ee474597128cd"}, + {file = "multidict-6.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0fa96985700739c4c7853a43c0b3e169360d6855780021bfc6d0f1ce7c123e7"}, + {file = "multidict-6.7.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cb2a55f408c3043e42b40cc8eecd575afa27b7e0b956dfb190de0f8499a57a53"}, + {file = "multidict-6.7.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eb0ce7b2a32d09892b3dd6cc44877a0d02a33241fafca5f25c8b6b62374f8b75"}, + {file = "multidict-6.7.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c3a32d23520ee37bf327d1e1a656fec76a2edd5c038bf43eddfa0572ec49c60b"}, + {file = "multidict-6.7.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9c90fed18bffc0189ba814749fdcc102b536e83a9f738a9003e569acd540a733"}, + {file = "multidict-6.7.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:da62917e6076f512daccfbbde27f46fed1c98fee202f0559adec8ee0de67f71a"}, + {file = "multidict-6.7.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bfde23ef6ed9db7eaee6c37dcec08524cb43903c60b285b172b6c094711b3961"}, + {file = "multidict-6.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3758692429e4e32f1ba0df23219cd0b4fc0a52f476726fff9337d1a57676a582"}, + {file = "multidict-6.7.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:398c1478926eca669f2fd6a5856b6de9c0acf23a2cb59a14c0ba5844fa38077e"}, + {file = "multidict-6.7.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c102791b1c4f3ab36ce4101154549105a53dc828f016356b3e3bcae2e3a039d3"}, + {file = "multidict-6.7.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a088b62bd733e2ad12c50dad01b7d0166c30287c166e137433d3b410add807a6"}, + {file = "multidict-6.7.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3d51ff4785d58d3f6c91bdbffcb5e1f7ddfda557727043aa20d20ec4f65e324a"}, + {file = "multidict-6.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc5907494fccf3e7d3f94f95c91d6336b092b5fc83811720fae5e2765890dfba"}, + {file = "multidict-6.7.1-cp312-cp312-win32.whl", hash = "sha256:28ca5ce2fd9716631133d0e9a9b9a745ad7f60bac2bccafb56aa380fc0b6c511"}, + {file = "multidict-6.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:fcee94dfbd638784645b066074b338bc9cc155d4b4bffa4adce1615c5a426c19"}, + {file = "multidict-6.7.1-cp312-cp312-win_arm64.whl", hash = "sha256:ba0a9fb644d0c1a2194cf7ffb043bd852cea63a57f66fbd33959f7dae18517bf"}, + {file = "multidict-6.7.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2b41f5fed0ed563624f1c17630cb9941cf2309d4df00e494b551b5f3e3d67a23"}, + {file = "multidict-6.7.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:84e61e3af5463c19b67ced91f6c634effb89ef8bfc5ca0267f954451ed4bb6a2"}, + {file = "multidict-6.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:935434b9853c7c112eee7ac891bc4cb86455aa631269ae35442cb316790c1445"}, + {file = "multidict-6.7.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:432feb25a1cb67fe82a9680b4d65fb542e4635cb3166cd9c01560651ad60f177"}, + {file = "multidict-6.7.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e82d14e3c948952a1a85503817e038cba5905a3352de76b9a465075d072fba23"}, + {file = "multidict-6.7.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4cfb48c6ea66c83bcaaf7e4dfa7ec1b6bbcf751b7db85a328902796dfde4c060"}, + {file = "multidict-6.7.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1d540e51b7e8e170174555edecddbd5538105443754539193e3e1061864d444d"}, + {file = "multidict-6.7.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:273d23f4b40f3dce4d6c8a821c741a86dec62cded82e1175ba3d99be128147ed"}, + {file = "multidict-6.7.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d624335fd4fa1c08a53f8b4be7676ebde19cd092b3895c421045ca87895b429"}, + {file = "multidict-6.7.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:12fad252f8b267cc75b66e8fc51b3079604e8d43a75428ffe193cd9e2195dfd6"}, + {file = "multidict-6.7.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:03ede2a6ffbe8ef936b92cb4529f27f42be7f56afcdab5ab739cd5f27fb1cbf9"}, + {file = "multidict-6.7.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:90efbcf47dbe33dcf643a1e400d67d59abeac5db07dc3f27d6bdeae497a2198c"}, + {file = "multidict-6.7.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5c4b9bfc148f5a91be9244d6264c53035c8a0dcd2f51f1c3c6e30e30ebaa1c84"}, + {file = "multidict-6.7.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:401c5a650f3add2472d1d288c26deebc540f99e2fb83e9525007a74cd2116f1d"}, + {file = "multidict-6.7.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:97891f3b1b3ffbded884e2916cacf3c6fc87b66bb0dde46f7357404750559f33"}, + {file = "multidict-6.7.1-cp313-cp313-win32.whl", hash = "sha256:e1c5988359516095535c4301af38d8a8838534158f649c05dd1050222321bcb3"}, + {file = "multidict-6.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:960c83bf01a95b12b08fd54324a4eb1d5b52c88932b5cba5d6e712bb3ed12eb5"}, + {file = "multidict-6.7.1-cp313-cp313-win_arm64.whl", hash = "sha256:563fe25c678aaba333d5399408f5ec3c383ca5b663e7f774dd179a520b8144df"}, + {file = "multidict-6.7.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:c76c4bec1538375dad9d452d246ca5368ad6e1c9039dadcf007ae59c70619ea1"}, + {file = "multidict-6.7.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:57b46b24b5d5ebcc978da4ec23a819a9402b4228b8a90d9c656422b4bdd8a963"}, + {file = "multidict-6.7.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e954b24433c768ce78ab7929e84ccf3422e46deb45a4dc9f93438f8217fa2d34"}, + {file = "multidict-6.7.1-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3bd231490fa7217cc832528e1cd8752a96f0125ddd2b5749390f7c3ec8721b65"}, + {file = "multidict-6.7.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:253282d70d67885a15c8a7716f3a73edf2d635793ceda8173b9ecc21f2fb8292"}, + {file = "multidict-6.7.1-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0b4c48648d7649c9335cf1927a8b87fa692de3dcb15faa676c6a6f1f1aabda43"}, + {file = "multidict-6.7.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:98bc624954ec4d2c7cb074b8eefc2b5d0ce7d482e410df446414355d158fe4ca"}, + {file = "multidict-6.7.1-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1b99af4d9eec0b49927b4402bcbb58dea89d3e0db8806a4086117019939ad3dd"}, + {file = "multidict-6.7.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6aac4f16b472d5b7dc6f66a0d49dd57b0e0902090be16594dc9ebfd3d17c47e7"}, + {file = "multidict-6.7.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:21f830fe223215dffd51f538e78c172ed7c7f60c9b96a2bf05c4848ad49921c3"}, + {file = "multidict-6.7.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:f5dd81c45b05518b9aa4da4aa74e1c93d715efa234fd3e8a179df611cc85e5f4"}, + {file = "multidict-6.7.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:eb304767bca2bb92fb9c5bd33cedc95baee5bb5f6c88e63706533a1c06ad08c8"}, + {file = "multidict-6.7.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:c9035dde0f916702850ef66460bc4239d89d08df4d02023a5926e7446724212c"}, + {file = "multidict-6.7.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:af959b9beeb66c822380f222f0e0a1889331597e81f1ded7f374f3ecb0fd6c52"}, + {file = "multidict-6.7.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:41f2952231456154ee479651491e94118229844dd7226541788be783be2b5108"}, + {file = "multidict-6.7.1-cp313-cp313t-win32.whl", hash = "sha256:df9f19c28adcb40b6aae30bbaa1478c389efd50c28d541d76760199fc1037c32"}, + {file = "multidict-6.7.1-cp313-cp313t-win_amd64.whl", hash = "sha256:d54ecf9f301853f2c5e802da559604b3e95bb7a3b01a9c295c6ee591b9882de8"}, + {file = "multidict-6.7.1-cp313-cp313t-win_arm64.whl", hash = "sha256:5a37ca18e360377cfda1d62f5f382ff41f2b8c4ccb329ed974cc2e1643440118"}, + {file = "multidict-6.7.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8f333ec9c5eb1b7105e3b84b53141e66ca05a19a605368c55450b6ba208cb9ee"}, + {file = "multidict-6.7.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:a407f13c188f804c759fc6a9f88286a565c242a76b27626594c133b82883b5c2"}, + {file = "multidict-6.7.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0e161ddf326db5577c3a4cc2d8648f81456e8a20d40415541587a71620d7a7d1"}, + {file = "multidict-6.7.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1e3a8bb24342a8201d178c3b4984c26ba81a577c80d4d525727427460a50c22d"}, + {file = "multidict-6.7.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97231140a50f5d447d3164f994b86a0bed7cd016e2682f8650d6a9158e14fd31"}, + {file = "multidict-6.7.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6b10359683bd8806a200fd2909e7c8ca3a7b24ec1d8132e483d58e791d881048"}, + {file = "multidict-6.7.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:283ddac99f7ac25a4acadbf004cb5ae34480bbeb063520f70ce397b281859362"}, + {file = "multidict-6.7.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:538cec1e18c067d0e6103aa9a74f9e832904c957adc260e61cd9d8cf0c3b3d37"}, + {file = "multidict-6.7.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7eee46ccb30ff48a1e35bb818cc90846c6be2b68240e42a78599166722cea709"}, + {file = "multidict-6.7.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fa263a02f4f2dd2d11a7b1bb4362aa7cb1049f84a9235d31adf63f30143469a0"}, + {file = "multidict-6.7.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:2e1425e2f99ec5bd36c15a01b690a1a2456209c5deed58f95469ffb46039ccbb"}, + {file = "multidict-6.7.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:497394b3239fc6f0e13a78a3e1b61296e72bf1c5f94b4c4eb80b265c37a131cd"}, + {file = "multidict-6.7.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:233b398c29d3f1b9676b4b6f75c518a06fcb2ea0b925119fb2c1bc35c05e1601"}, + {file = "multidict-6.7.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:93b1818e4a6e0930454f0f2af7dfce69307ca03cdcfb3739bf4d91241967b6c1"}, + {file = "multidict-6.7.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f33dc2a3abe9249ea5d8360f969ec7f4142e7ac45ee7014d8f8d5acddf178b7b"}, + {file = "multidict-6.7.1-cp314-cp314-win32.whl", hash = "sha256:3ab8b9d8b75aef9df299595d5388b14530839f6422333357af1339443cff777d"}, + {file = "multidict-6.7.1-cp314-cp314-win_amd64.whl", hash = "sha256:5e01429a929600e7dab7b166062d9bb54a5eed752384c7384c968c2afab8f50f"}, + {file = "multidict-6.7.1-cp314-cp314-win_arm64.whl", hash = "sha256:4885cb0e817aef5d00a2e8451d4665c1808378dc27c2705f1bf4ef8505c0d2e5"}, + {file = "multidict-6.7.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:0458c978acd8e6ea53c81eefaddbbee9c6c5e591f41b3f5e8e194780fe026581"}, + {file = "multidict-6.7.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:c0abd12629b0af3cf590982c0b413b1e7395cd4ec026f30986818ab95bfaa94a"}, + {file = "multidict-6.7.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:14525a5f61d7d0c94b368a42cff4c9a4e7ba2d52e2672a7b23d84dc86fb02b0c"}, + {file = "multidict-6.7.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:17307b22c217b4cf05033dabefe68255a534d637c6c9b0cc8382718f87be4262"}, + {file = "multidict-6.7.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7a7e590ff876a3eaf1c02a4dfe0724b6e69a9e9de6d8f556816f29c496046e59"}, + {file = "multidict-6.7.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5fa6a95dfee63893d80a34758cd0e0c118a30b8dcb46372bf75106c591b77889"}, + {file = "multidict-6.7.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a0543217a6a017692aa6ae5cc39adb75e587af0f3a82288b1492eb73dd6cc2a4"}, + {file = "multidict-6.7.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f99fe611c312b3c1c0ace793f92464d8cd263cc3b26b5721950d977b006b6c4d"}, + {file = "multidict-6.7.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9004d8386d133b7e6135679424c91b0b854d2d164af6ea3f289f8f2761064609"}, + {file = "multidict-6.7.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e628ef0e6859ffd8273c69412a2465c4be4a9517d07261b33334b5ec6f3c7489"}, + {file = "multidict-6.7.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:841189848ba629c3552035a6a7f5bf3b02eb304e9fea7492ca220a8eda6b0e5c"}, + {file = "multidict-6.7.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:ce1bbd7d780bb5a0da032e095c951f7014d6b0a205f8318308140f1a6aba159e"}, + {file = "multidict-6.7.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b26684587228afed0d50cf804cc71062cc9c1cdf55051c4c6345d372947b268c"}, + {file = "multidict-6.7.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:9f9af11306994335398293f9958071019e3ab95e9a707dc1383a35613f6abcb9"}, + {file = "multidict-6.7.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b4938326284c4f1224178a560987b6cf8b4d38458b113d9b8c1db1a836e640a2"}, + {file = "multidict-6.7.1-cp314-cp314t-win32.whl", hash = "sha256:98655c737850c064a65e006a3df7c997cd3b220be4ec8fe26215760b9697d4d7"}, + {file = "multidict-6.7.1-cp314-cp314t-win_amd64.whl", hash = "sha256:497bde6223c212ba11d462853cfa4f0ae6ef97465033e7dc9940cdb3ab5b48e5"}, + {file = "multidict-6.7.1-cp314-cp314t-win_arm64.whl", hash = "sha256:2bbd113e0d4af5db41d5ebfe9ccaff89de2120578164f86a5d17d5a576d1e5b2"}, + {file = "multidict-6.7.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:65573858d27cdeaca41893185677dc82395159aa28875a8867af66532d413a8f"}, + {file = "multidict-6.7.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c524c6fb8fc342793708ab111c4dbc90ff9abd568de220432500e47e990c0358"}, + {file = "multidict-6.7.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:aa23b001d968faef416ff70dc0f1ab045517b9b42a90edd3e9bcdb06479e31d5"}, + {file = "multidict-6.7.1-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:6704fa2b7453b2fb121740555fa1ee20cd98c4d011120caf4d2b8d4e7c76eec0"}, + {file = "multidict-6.7.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:121a34e5bfa410cdf2c8c49716de160de3b1dbcd86b49656f5681e4543bcd1a8"}, + {file = "multidict-6.7.1-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:026d264228bcd637d4e060844e39cdc60f86c479e463d49075dedc21b18fbbe0"}, + {file = "multidict-6.7.1-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0e697826df7eb63418ee190fd06ce9f1803593bb4b9517d08c60d9b9a7f69d8f"}, + {file = "multidict-6.7.1-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bb08271280173720e9fea9ede98e5231defcbad90f1624bea26f32ec8a956e2f"}, + {file = "multidict-6.7.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c6b3228e1d80af737b72925ce5fb4daf5a335e49cd7ab77ed7b9fdfbf58c526e"}, + {file = "multidict-6.7.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:3943debf0fbb57bdde5901695c11094a9a36723e5c03875f87718ee15ca2f4d2"}, + {file = "multidict-6.7.1-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:98c5787b0a0d9a41d9311eae44c3b76e6753def8d8870ab501320efe75a6a5f8"}, + {file = "multidict-6.7.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:08ccb2a6dc72009093ebe7f3f073e5ec5964cba9a706fa94b1a1484039b87941"}, + {file = "multidict-6.7.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:eb351f72c26dc9abe338ca7294661aa22969ad8ffe7ef7d5541d19f368dc854a"}, + {file = "multidict-6.7.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ac1c665bad8b5d762f5f85ebe4d94130c26965f11de70c708c75671297c776de"}, + {file = "multidict-6.7.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1fa6609d0364f4f6f58351b4659a1f3e0e898ba2a8c5cac04cb2c7bc556b0bc5"}, + {file = "multidict-6.7.1-cp39-cp39-win32.whl", hash = "sha256:6f77ce314a29263e67adadc7e7c1bc699fcb3a305059ab973d038f87caa42ed0"}, + {file = "multidict-6.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:f537b55778cd3cbee430abe3131255d3a78202e0f9ea7ffc6ada893a4bcaeea4"}, + {file = "multidict-6.7.1-cp39-cp39-win_arm64.whl", hash = "sha256:749aa54f578f2e5f439538706a475aa844bfa8ef75854b1401e6e528e4937cf9"}, + {file = "multidict-6.7.1-py3-none-any.whl", hash = "sha256:55d97cc6dae627efa6a6e548885712d4864b81110ac76fa4e534c03819fa4a56"}, + {file = "multidict-6.7.1.tar.gz", hash = "sha256:ec6652a1bee61c53a3e5776b6049172c53b6aaba34f18c9ad04f82712bac623d"}, ] [[package]] @@ -2170,82 +2559,88 @@ files = [ [[package]] name = "narwhals" -version = "1.38.1" +version = "2.16.0" description = "Extremely lightweight compatibility layer between dataframe libraries" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main"] files = [ - {file = "narwhals-1.38.1-py3-none-any.whl", hash = "sha256:f06fe4227299cb0a554e562ae639c115797b22f35bc3a6ccc95ed5d74212b3d9"}, - {file = "narwhals-1.38.1.tar.gz", hash = "sha256:16d4c13c9e045e1f5b26b289ec307349a9613e83345d1c809be697eb2f7ff938"}, + {file = "narwhals-2.16.0-py3-none-any.whl", hash = "sha256:846f1fd7093ac69d63526e50732033e86c30ea0026a44d9b23991010c7d1485d"}, + {file = "narwhals-2.16.0.tar.gz", hash = "sha256:155bb45132b370941ba0396d123cf9ed192bf25f39c4cea726f2da422ca4e145"}, ] [package.extras] -cudf = ["cudf (>=24.10.0)"] +cudf = ["cudf-cu12 (>=24.10.0)"] dask = ["dask[dataframe] (>=2024.8)"] -duckdb = ["duckdb (>=1.0)"] +duckdb = ["duckdb (>=1.1)"] ibis = ["ibis-framework (>=6.0.0)", "packaging", "pyarrow-hotfix", "rich"] modin = ["modin"] -pandas = ["pandas (>=0.25.3)"] -polars = ["polars (>=0.20.3)"] -pyarrow = ["pyarrow (>=11.0.0)"] +pandas = ["pandas (>=1.1.3)"] +polars = ["polars (>=0.20.4)"] +pyarrow = ["pyarrow (>=13.0.0)"] pyspark = ["pyspark (>=3.5.0)"] pyspark-connect = ["pyspark[connect] (>=3.5.0)"] -sqlframe = ["sqlframe (>=3.22.0)"] +sql = ["duckdb (>=1.1)", "sqlparse"] +sqlframe = ["sqlframe (>=3.22.0,!=3.39.3)"] [[package]] name = "networkx" -version = "3.4.2" +version = "3.6.1" description = "Python package for creating and manipulating graphs and networks" optional = false -python-versions = ">=3.10" -groups = ["main"] +python-versions = "!=3.14.1,>=3.11" +groups = ["main", "torch-cuda"] files = [ - {file = "networkx-3.4.2-py3-none-any.whl", hash = "sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f"}, - {file = "networkx-3.4.2.tar.gz", hash = "sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1"}, + {file = "networkx-3.6.1-py3-none-any.whl", hash = "sha256:d47fbf302e7d9cbbb9e2555a0d267983d2aa476bac30e90dfbe5669bd57f3762"}, + {file = "networkx-3.6.1.tar.gz", hash = "sha256:26b7c357accc0c8cde558ad486283728b65b6a95d85ee1cd66bafab4c8168509"}, ] [package.extras] -default = ["matplotlib (>=3.7)", "numpy (>=1.24)", "pandas (>=2.0)", "scipy (>=1.10,!=1.11.0,!=1.11.1)"] -developer = ["changelist (==0.5)", "mypy (>=1.1)", "pre-commit (>=3.2)", "rtoml"] -doc = ["intersphinx-registry", "myst-nb (>=1.1)", "numpydoc (>=1.8.0)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.15)", "sphinx (>=7.3)", "sphinx-gallery (>=0.16)", "texext (>=0.6.7)"] -example = ["cairocffi (>=1.7)", "contextily (>=1.6)", "igraph (>=0.11)", "momepy (>=0.7.2)", "osmnx (>=1.9)", "scikit-learn (>=1.5)", "seaborn (>=0.13)"] +benchmarking = ["asv", "virtualenv"] +default = ["matplotlib (>=3.8)", "numpy (>=1.25)", "pandas (>=2.0)", "scipy (>=1.11.2)"] +developer = ["mypy (>=1.15)", "pre-commit (>=4.1)"] +doc = ["intersphinx-registry", "myst-nb (>=1.1)", "numpydoc (>=1.8.0)", "pillow (>=10)", "pydata-sphinx-theme (>=0.16)", "sphinx (>=8.0)", "sphinx-gallery (>=0.18)", "texext (>=0.6.7)"] +example = ["cairocffi (>=1.7)", "contextily (>=1.6)", "igraph (>=0.11)", "iplotx (>=0.9.0)", "momepy (>=0.7.2)", "osmnx (>=2.0.0)", "scikit-learn (>=1.5)", "seaborn (>=0.13)"] extra = ["lxml (>=4.6)", "pydot (>=3.0.1)", "pygraphviz (>=1.14)", "sympy (>=1.10)"] -test = ["pytest (>=7.2)", "pytest-cov (>=4.0)"] +release = ["build (>=0.10)", "changelist (==0.5)", "twine (>=4.0)", "wheel (>=0.40)"] +test = ["pytest (>=7.2)", "pytest-cov (>=4.0)", "pytest-xdist (>=3.0)"] +test-extras = ["pytest-mpl", "pytest-randomly"] [[package]] name = "nodeenv" -version = "1.9.1" +version = "1.10.0" description = "Node.js virtual environment builder" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" groups = ["development"] files = [ - {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"}, - {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, + {file = "nodeenv-1.10.0-py2.py3-none-any.whl", hash = "sha256:5bb13e3eed2923615535339b3c620e76779af4cb4c6a90deccc9e36b274d3827"}, + {file = "nodeenv-1.10.0.tar.gz", hash = "sha256:996c191ad80897d076bdfba80a41994c2b47c68e224c542b48feba42ba00f8bb"}, ] [[package]] name = "nox" -version = "2025.5.1" +version = "2025.11.12" description = "Flexible test automation." optional = false python-versions = ">=3.8" groups = ["development"] files = [ - {file = "nox-2025.5.1-py3-none-any.whl", hash = "sha256:56abd55cf37ff523c254fcec4d152ed51e5fe80e2ab8317221d8b828ac970a31"}, - {file = "nox-2025.5.1.tar.gz", hash = "sha256:2a571dfa7a58acc726521ac3cd8184455ebcdcbf26401c7b737b5bc6701427b2"}, + {file = "nox-2025.11.12-py3-none-any.whl", hash = "sha256:707171f9f63bc685da9d00edd8c2ceec8405b8e38b5fb4e46114a860070ef0ff"}, + {file = "nox-2025.11.12.tar.gz", hash = "sha256:3d317f9e61f49d6bde39cf2f59695bb4e1722960457eee3ae19dacfe03c07259"}, ] [package.dependencies] argcomplete = ">=1.9.4,<4" -attrs = ">=23.1" +attrs = ">=24.1" colorlog = ">=2.6.1,<7" dependency-groups = ">=1.1" -packaging = ">=20.9" -virtualenv = ">=20.14.1" +humanize = ">=4" +packaging = {version = ">=21", markers = "python_version >= \"3.10\""} +virtualenv = {version = ">=20.15", markers = "python_version >= \"3.10\""} [package.extras] +pbs = ["pbs-installer[all] (>=2025.1.6)"] tox-to-nox = ["importlib-resources ; python_version < \"3.9\"", "jinja2", "tox (>=4)"] uv = ["uv (>=0.1.6)"] @@ -2269,122 +2664,154 @@ tomlkit = ">=0.7" [[package]] name = "numpy" -version = "1.26.4" +version = "2.4.2" description = "Fundamental package for array computing in Python" optional = false -python-versions = ">=3.9" -groups = ["main"] -files = [ - {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, - {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, - {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, - {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, - {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, - {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, - {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, - {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, - {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, - {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, - {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, - {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, - {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, - {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, - {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, - {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, - {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, - {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, - {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, - {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, - {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, - {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, - {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, - {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, - {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, - {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, - {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, - {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, - {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, - {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, - {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, - {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, - {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, - {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, - {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, - {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, +python-versions = ">=3.11" +groups = ["main", "torch-cuda"] +files = [ + {file = "numpy-2.4.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e7e88598032542bd49af7c4747541422884219056c268823ef6e5e89851c8825"}, + {file = "numpy-2.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7edc794af8b36ca37ef5fcb5e0d128c7e0595c7b96a2318d1badb6fcd8ee86b1"}, + {file = "numpy-2.4.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:6e9f61981ace1360e42737e2bae58b27bf28a1b27e781721047d84bd754d32e7"}, + {file = "numpy-2.4.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:cb7bbb88aa74908950d979eeaa24dbdf1a865e3c7e45ff0121d8f70387b55f73"}, + {file = "numpy-2.4.2-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4f069069931240b3fc703f1e23df63443dbd6390614c8c44a87d96cd0ec81eb1"}, + {file = "numpy-2.4.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c02ef4401a506fb60b411467ad501e1429a3487abca4664871d9ae0b46c8ba32"}, + {file = "numpy-2.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2653de5c24910e49c2b106499803124dde62a5a1fe0eedeaecf4309a5f639390"}, + {file = "numpy-2.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1ae241bbfc6ae276f94a170b14785e561cb5e7f626b6688cf076af4110887413"}, + {file = "numpy-2.4.2-cp311-cp311-win32.whl", hash = "sha256:df1b10187212b198dd45fa943d8985a3c8cf854aed4923796e0e019e113a1bda"}, + {file = "numpy-2.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:b9c618d56a29c9cb1c4da979e9899be7578d2e0b3c24d52079c166324c9e8695"}, + {file = "numpy-2.4.2-cp311-cp311-win_arm64.whl", hash = "sha256:47c5a6ed21d9452b10227e5e8a0e1c22979811cad7dcc19d8e3e2fb8fa03f1a3"}, + {file = "numpy-2.4.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:21982668592194c609de53ba4933a7471880ccbaadcc52352694a59ecc860b3a"}, + {file = "numpy-2.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40397bda92382fcec844066efb11f13e1c9a3e2a8e8f318fb72ed8b6db9f60f1"}, + {file = "numpy-2.4.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:b3a24467af63c67829bfaa61eecf18d5432d4f11992688537be59ecd6ad32f5e"}, + {file = "numpy-2.4.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:805cc8de9fd6e7a22da5aed858e0ab16be5a4db6c873dde1d7451c541553aa27"}, + {file = "numpy-2.4.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d82351358ffbcdcd7b686b90742a9b86632d6c1c051016484fa0b326a0a1548"}, + {file = "numpy-2.4.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e35d3e0144137d9fdae62912e869136164534d64a169f86438bc9561b6ad49f"}, + {file = "numpy-2.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:adb6ed2ad29b9e15321d167d152ee909ec73395901b70936f029c3bc6d7f4460"}, + {file = "numpy-2.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8906e71fd8afcb76580404e2a950caef2685df3d2a57fe82a86ac8d33cc007ba"}, + {file = "numpy-2.4.2-cp312-cp312-win32.whl", hash = "sha256:ec055f6dae239a6299cace477b479cca2fc125c5675482daf1dd886933a1076f"}, + {file = "numpy-2.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:209fae046e62d0ce6435fcfe3b1a10537e858249b3d9b05829e2a05218296a85"}, + {file = "numpy-2.4.2-cp312-cp312-win_arm64.whl", hash = "sha256:fbde1b0c6e81d56f5dccd95dd4a711d9b95df1ae4009a60887e56b27e8d903fa"}, + {file = "numpy-2.4.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:25f2059807faea4b077a2b6837391b5d830864b3543627f381821c646f31a63c"}, + {file = "numpy-2.4.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bd3a7a9f5847d2fb8c2c6d1c862fa109c31a9abeca1a3c2bd5a64572955b2979"}, + {file = "numpy-2.4.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:8e4549f8a3c6d13d55041925e912bfd834285ef1dd64d6bc7d542583355e2e98"}, + {file = "numpy-2.4.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:aea4f66ff44dfddf8c2cffd66ba6538c5ec67d389285292fe428cb2c738c8aef"}, + {file = "numpy-2.4.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c3cd545784805de05aafe1dde61752ea49a359ccba9760c1e5d1c88a93bbf2b7"}, + {file = "numpy-2.4.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d0d9b7c93578baafcbc5f0b83eaf17b79d345c6f36917ba0c67f45226911d499"}, + {file = "numpy-2.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f74f0f7779cc7ae07d1810aab8ac6b1464c3eafb9e283a40da7309d5e6e48fbb"}, + {file = "numpy-2.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c7ac672d699bf36275c035e16b65539931347d68b70667d28984c9fb34e07fa7"}, + {file = "numpy-2.4.2-cp313-cp313-win32.whl", hash = "sha256:8e9afaeb0beff068b4d9cd20d322ba0ee1cecfb0b08db145e4ab4dd44a6b5110"}, + {file = "numpy-2.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:7df2de1e4fba69a51c06c28f5a3de36731eb9639feb8e1cf7e4a7b0daf4cf622"}, + {file = "numpy-2.4.2-cp313-cp313-win_arm64.whl", hash = "sha256:0fece1d1f0a89c16b03442eae5c56dc0be0c7883b5d388e0c03f53019a4bfd71"}, + {file = "numpy-2.4.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5633c0da313330fd20c484c78cdd3f9b175b55e1a766c4a174230c6b70ad8262"}, + {file = "numpy-2.4.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:d9f64d786b3b1dd742c946c42d15b07497ed14af1a1f3ce840cce27daa0ce913"}, + {file = "numpy-2.4.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:b21041e8cb6a1eb5312dd1d2f80a94d91efffb7a06b70597d44f1bd2dfc315ab"}, + {file = "numpy-2.4.2-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:00ab83c56211a1d7c07c25e3217ea6695e50a3e2f255053686b081dc0b091a82"}, + {file = "numpy-2.4.2-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2fb882da679409066b4603579619341c6d6898fc83a8995199d5249f986e8e8f"}, + {file = "numpy-2.4.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:66cb9422236317f9d44b67b4d18f44efe6e9c7f8794ac0462978513359461554"}, + {file = "numpy-2.4.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:0f01dcf33e73d80bd8dc0f20a71303abbafa26a19e23f6b68d1aa9990af90257"}, + {file = "numpy-2.4.2-cp313-cp313t-win32.whl", hash = "sha256:52b913ec40ff7ae845687b0b34d8d93b60cb66dcee06996dd5c99f2fc9328657"}, + {file = "numpy-2.4.2-cp313-cp313t-win_amd64.whl", hash = "sha256:5eea80d908b2c1f91486eb95b3fb6fab187e569ec9752ab7d9333d2e66bf2d6b"}, + {file = "numpy-2.4.2-cp313-cp313t-win_arm64.whl", hash = "sha256:fd49860271d52127d61197bb50b64f58454e9f578cb4b2c001a6de8b1f50b0b1"}, + {file = "numpy-2.4.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:444be170853f1f9d528428eceb55f12918e4fda5d8805480f36a002f1415e09b"}, + {file = "numpy-2.4.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d1240d50adff70c2a88217698ca844723068533f3f5c5fa6ee2e3220e3bdb000"}, + {file = "numpy-2.4.2-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:7cdde6de52fb6664b00b056341265441192d1291c130e99183ec0d4b110ff8b1"}, + {file = "numpy-2.4.2-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:cda077c2e5b780200b6b3e09d0b42205a3d1c68f30c6dceb90401c13bff8fe74"}, + {file = "numpy-2.4.2-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d30291931c915b2ab5717c2974bb95ee891a1cf22ebc16a8006bd59cd210d40a"}, + {file = "numpy-2.4.2-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bba37bc29d4d85761deed3954a1bc62be7cf462b9510b51d367b769a8c8df325"}, + {file = "numpy-2.4.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b2f0073ed0868db1dcd86e052d37279eef185b9c8db5bf61f30f46adac63c909"}, + {file = "numpy-2.4.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7f54844851cdb630ceb623dcec4db3240d1ac13d4990532446761baede94996a"}, + {file = "numpy-2.4.2-cp314-cp314-win32.whl", hash = "sha256:12e26134a0331d8dbd9351620f037ec470b7c75929cb8a1537f6bfe411152a1a"}, + {file = "numpy-2.4.2-cp314-cp314-win_amd64.whl", hash = "sha256:068cdb2d0d644cdb45670810894f6a0600797a69c05f1ac478e8d31670b8ee75"}, + {file = "numpy-2.4.2-cp314-cp314-win_arm64.whl", hash = "sha256:6ed0be1ee58eef41231a5c943d7d1375f093142702d5723ca2eb07db9b934b05"}, + {file = "numpy-2.4.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:98f16a80e917003a12c0580f97b5f875853ebc33e2eaa4bccfc8201ac6869308"}, + {file = "numpy-2.4.2-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:20abd069b9cda45874498b245c8015b18ace6de8546bf50dfa8cea1696ed06ef"}, + {file = "numpy-2.4.2-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:e98c97502435b53741540a5717a6749ac2ada901056c7db951d33e11c885cc7d"}, + {file = "numpy-2.4.2-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:da6cad4e82cb893db4b69105c604d805e0c3ce11501a55b5e9f9083b47d2ffe8"}, + {file = "numpy-2.4.2-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e4424677ce4b47fe73c8b5556d876571f7c6945d264201180db2dc34f676ab5"}, + {file = "numpy-2.4.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2b8f157c8a6f20eb657e240f8985cc135598b2b46985c5bccbde7616dc9c6b1e"}, + {file = "numpy-2.4.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5daf6f3914a733336dab21a05cdec343144600e964d2fcdabaac0c0269874b2a"}, + {file = "numpy-2.4.2-cp314-cp314t-win32.whl", hash = "sha256:8c50dd1fc8826f5b26a5ee4d77ca55d88a895f4e4819c7ecc2a9f5905047a443"}, + {file = "numpy-2.4.2-cp314-cp314t-win_amd64.whl", hash = "sha256:fcf92bee92742edd401ba41135185866f7026c502617f422eb432cfeca4fe236"}, + {file = "numpy-2.4.2-cp314-cp314t-win_arm64.whl", hash = "sha256:1f92f53998a17265194018d1cc321b2e96e900ca52d54c7c77837b71b9465181"}, + {file = "numpy-2.4.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:89f7268c009bc492f506abd6f5265defa7cb3f7487dc21d357c3d290add45082"}, + {file = "numpy-2.4.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:e6dee3bb76aa4009d5a912180bf5b2de012532998d094acee25d9cb8dee3e44a"}, + {file = "numpy-2.4.2-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:cd2bd2bbed13e213d6b55dc1d035a4f91748a7d3edc9480c13898b0353708920"}, + {file = "numpy-2.4.2-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:cf28c0c1d4c4bf00f509fa7eb02c58d7caf221b50b467bcb0d9bbf1584d5c821"}, + {file = "numpy-2.4.2-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e04ae107ac591763a47398bb45b568fc38f02dbc4aa44c063f67a131f99346cb"}, + {file = "numpy-2.4.2-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:602f65afdef699cda27ec0b9224ae5dc43e328f4c24c689deaf77133dbee74d0"}, + {file = "numpy-2.4.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:be71bf1edb48ebbbf7f6337b5bfd2f895d1902f6335a5830b20141fc126ffba0"}, + {file = "numpy-2.4.2.tar.gz", hash = "sha256:659a6107e31a83c4e33f763942275fd278b21d095094044eb35569e86a21ddae"}, ] [[package]] name = "nvidia-cublas-cu12" -version = "12.6.4.1" +version = "12.8.4.1" description = "CUBLAS native runtime libraries" optional = false python-versions = ">=3" -groups = ["main"] +groups = ["main", "torch-cuda"] markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" files = [ - {file = "nvidia_cublas_cu12-12.6.4.1-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:08ed2686e9875d01b58e3cb379c6896df8e76c75e0d4a7f7dace3d7b6d9ef8eb"}, - {file = "nvidia_cublas_cu12-12.6.4.1-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:235f728d6e2a409eddf1df58d5b0921cf80cfa9e72b9f2775ccb7b4a87984668"}, - {file = "nvidia_cublas_cu12-12.6.4.1-py3-none-win_amd64.whl", hash = "sha256:9e4fa264f4d8a4eb0cdbd34beadc029f453b3bafae02401e999cf3d5a5af75f8"}, + {file = "nvidia_cublas_cu12-12.8.4.1-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:b86f6dd8935884615a0683b663891d43781b819ac4f2ba2b0c9604676af346d0"}, + {file = "nvidia_cublas_cu12-12.8.4.1-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:8ac4e771d5a348c551b2a426eda6193c19aa630236b418086020df5ba9667142"}, + {file = "nvidia_cublas_cu12-12.8.4.1-py3-none-win_amd64.whl", hash = "sha256:47e9b82132fa8d2b4944e708049229601448aaad7e6f296f630f2d1a32de35af"}, ] [[package]] name = "nvidia-cuda-cupti-cu12" -version = "12.6.80" +version = "12.8.90" description = "CUDA profiling tools runtime libs." optional = false python-versions = ">=3" -groups = ["main"] +groups = ["main", "torch-cuda"] markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" files = [ - {file = "nvidia_cuda_cupti_cu12-12.6.80-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:166ee35a3ff1587f2490364f90eeeb8da06cd867bd5b701bf7f9a02b78bc63fc"}, - {file = "nvidia_cuda_cupti_cu12-12.6.80-py3-none-manylinux2014_aarch64.whl", hash = "sha256:358b4a1d35370353d52e12f0a7d1769fc01ff74a191689d3870b2123156184c4"}, - {file = "nvidia_cuda_cupti_cu12-12.6.80-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6768bad6cab4f19e8292125e5f1ac8aa7d1718704012a0e3272a6f61c4bce132"}, - {file = "nvidia_cuda_cupti_cu12-12.6.80-py3-none-manylinux2014_x86_64.whl", hash = "sha256:a3eff6cdfcc6a4c35db968a06fcadb061cbc7d6dde548609a941ff8701b98b73"}, - {file = "nvidia_cuda_cupti_cu12-12.6.80-py3-none-win_amd64.whl", hash = "sha256:bbe6ae76e83ce5251b56e8c8e61a964f757175682bbad058b170b136266ab00a"}, + {file = "nvidia_cuda_cupti_cu12-12.8.90-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4412396548808ddfed3f17a467b104ba7751e6b58678a4b840675c56d21cf7ed"}, + {file = "nvidia_cuda_cupti_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ea0cb07ebda26bb9b29ba82cda34849e73c166c18162d3913575b0c9db9a6182"}, + {file = "nvidia_cuda_cupti_cu12-12.8.90-py3-none-win_amd64.whl", hash = "sha256:bb479dcdf7e6d4f8b0b01b115260399bf34154a1a2e9fe11c85c517d87efd98e"}, ] [[package]] name = "nvidia-cuda-nvrtc-cu12" -version = "12.6.77" +version = "12.8.93" description = "NVRTC native runtime libraries" optional = false python-versions = ">=3" -groups = ["main"] +groups = ["main", "torch-cuda"] markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" files = [ - {file = "nvidia_cuda_nvrtc_cu12-12.6.77-py3-none-manylinux2014_aarch64.whl", hash = "sha256:5847f1d6e5b757f1d2b3991a01082a44aad6f10ab3c5c0213fa3e25bddc25a13"}, - {file = "nvidia_cuda_nvrtc_cu12-12.6.77-py3-none-manylinux2014_x86_64.whl", hash = "sha256:35b0cc6ee3a9636d5409133e79273ce1f3fd087abb0532d2d2e8fff1fe9efc53"}, - {file = "nvidia_cuda_nvrtc_cu12-12.6.77-py3-none-win_amd64.whl", hash = "sha256:f7007dbd914c56bd80ea31bc43e8e149da38f68158f423ba845fc3292684e45a"}, + {file = "nvidia_cuda_nvrtc_cu12-12.8.93-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:a7756528852ef889772a84c6cd89d41dfa74667e24cca16bb31f8f061e3e9994"}, + {file = "nvidia_cuda_nvrtc_cu12-12.8.93-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fc1fec1e1637854b4c0a65fb9a8346b51dd9ee69e61ebaccc82058441f15bce8"}, + {file = "nvidia_cuda_nvrtc_cu12-12.8.93-py3-none-win_amd64.whl", hash = "sha256:7a4b6b2904850fe78e0bd179c4b655c404d4bb799ef03ddc60804247099ae909"}, ] [[package]] name = "nvidia-cuda-runtime-cu12" -version = "12.6.77" +version = "12.8.90" description = "CUDA Runtime native Libraries" optional = false python-versions = ">=3" -groups = ["main"] +groups = ["main", "torch-cuda"] markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" files = [ - {file = "nvidia_cuda_runtime_cu12-12.6.77-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6116fad3e049e04791c0256a9778c16237837c08b27ed8c8401e2e45de8d60cd"}, - {file = "nvidia_cuda_runtime_cu12-12.6.77-py3-none-manylinux2014_aarch64.whl", hash = "sha256:d461264ecb429c84c8879a7153499ddc7b19b5f8d84c204307491989a365588e"}, - {file = "nvidia_cuda_runtime_cu12-12.6.77-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ba3b56a4f896141e25e19ab287cd71e52a6a0f4b29d0d31609f60e3b4d5219b7"}, - {file = "nvidia_cuda_runtime_cu12-12.6.77-py3-none-manylinux2014_x86_64.whl", hash = "sha256:a84d15d5e1da416dd4774cb42edf5e954a3e60cc945698dc1d5be02321c44dc8"}, - {file = "nvidia_cuda_runtime_cu12-12.6.77-py3-none-win_amd64.whl", hash = "sha256:86c58044c824bf3c173c49a2dbc7a6c8b53cb4e4dca50068be0bf64e9dab3f7f"}, + {file = "nvidia_cuda_runtime_cu12-12.8.90-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:52bf7bbee900262ffefe5e9d5a2a69a30d97e2bc5bb6cc866688caa976966e3d"}, + {file = "nvidia_cuda_runtime_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:adade8dcbd0edf427b7204d480d6066d33902cab2a4707dcfc48a2d0fd44ab90"}, + {file = "nvidia_cuda_runtime_cu12-12.8.90-py3-none-win_amd64.whl", hash = "sha256:c0c6027f01505bfed6c3b21ec546f69c687689aad5f1a377554bc6ca4aa993a8"}, ] [[package]] name = "nvidia-cudnn-cu12" -version = "9.5.1.17" +version = "9.10.2.21" description = "cuDNN runtime libraries" optional = false python-versions = ">=3" -groups = ["main"] +groups = ["main", "torch-cuda"] markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" files = [ - {file = "nvidia_cudnn_cu12-9.5.1.17-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:9fd4584468533c61873e5fda8ca41bac3a38bcb2d12350830c69b0a96a7e4def"}, - {file = "nvidia_cudnn_cu12-9.5.1.17-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:30ac3869f6db17d170e0e556dd6cc5eee02647abc31ca856634d5a40f82c15b2"}, - {file = "nvidia_cudnn_cu12-9.5.1.17-py3-none-win_amd64.whl", hash = "sha256:d7af0f8a4f3b4b9dbb3122f2ef553b45694ed9c384d5a75bab197b8eefb79ab8"}, + {file = "nvidia_cudnn_cu12-9.10.2.21-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:c9132cc3f8958447b4910a1720036d9eff5928cc3179b0a51fb6d167c6cc87d8"}, + {file = "nvidia_cudnn_cu12-9.10.2.21-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:949452be657fa16687d0930933f032835951ef0892b37d2d53824d1a84dc97a8"}, + {file = "nvidia_cudnn_cu12-9.10.2.21-py3-none-win_amd64.whl", hash = "sha256:c6288de7d63e6cf62988f0923f96dc339cea362decb1bf5b3141883392a7d65e"}, ] [package.dependencies] @@ -2392,18 +2819,16 @@ nvidia-cublas-cu12 = "*" [[package]] name = "nvidia-cufft-cu12" -version = "11.3.0.4" +version = "11.3.3.83" description = "CUFFT native runtime libraries" optional = false python-versions = ">=3" -groups = ["main"] +groups = ["main", "torch-cuda"] markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" files = [ - {file = "nvidia_cufft_cu12-11.3.0.4-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d16079550df460376455cba121db6564089176d9bac9e4f360493ca4741b22a6"}, - {file = "nvidia_cufft_cu12-11.3.0.4-py3-none-manylinux2014_aarch64.whl", hash = "sha256:8510990de9f96c803a051822618d42bf6cb8f069ff3f48d93a8486efdacb48fb"}, - {file = "nvidia_cufft_cu12-11.3.0.4-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ccba62eb9cef5559abd5e0d54ceed2d9934030f51163df018532142a8ec533e5"}, - {file = "nvidia_cufft_cu12-11.3.0.4-py3-none-manylinux2014_x86_64.whl", hash = "sha256:768160ac89f6f7b459bee747e8d175dbf53619cfe74b2a5636264163138013ca"}, - {file = "nvidia_cufft_cu12-11.3.0.4-py3-none-win_amd64.whl", hash = "sha256:6048ebddfb90d09d2707efb1fd78d4e3a77cb3ae4dc60e19aab6be0ece2ae464"}, + {file = "nvidia_cufft_cu12-11.3.3.83-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:848ef7224d6305cdb2a4df928759dca7b1201874787083b6e7550dd6765ce69a"}, + {file = "nvidia_cufft_cu12-11.3.3.83-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4d2dd21ec0b88cf61b62e6b43564355e5222e4a3fb394cac0db101f2dd0d4f74"}, + {file = "nvidia_cufft_cu12-11.3.3.83-py3-none-win_amd64.whl", hash = "sha256:7a64a98ef2a7c47f905aaf8931b69a3a43f27c55530c698bb2ed7c75c0b42cb7"}, ] [package.dependencies] @@ -2411,47 +2836,43 @@ nvidia-nvjitlink-cu12 = "*" [[package]] name = "nvidia-cufile-cu12" -version = "1.11.1.6" +version = "1.13.1.3" description = "cuFile GPUDirect libraries" optional = false python-versions = ">=3" -groups = ["main"] +groups = ["main", "torch-cuda"] markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" files = [ - {file = "nvidia_cufile_cu12-1.11.1.6-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cc23469d1c7e52ce6c1d55253273d32c565dd22068647f3aa59b3c6b005bf159"}, - {file = "nvidia_cufile_cu12-1.11.1.6-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:8f57a0051dcf2543f6dc2b98a98cb2719c37d3cee1baba8965d57f3bbc90d4db"}, + {file = "nvidia_cufile_cu12-1.13.1.3-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1d069003be650e131b21c932ec3d8969c1715379251f8d23a1860554b1cb24fc"}, + {file = "nvidia_cufile_cu12-1.13.1.3-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:4beb6d4cce47c1a0f1013d72e02b0994730359e17801d395bdcbf20cfb3bb00a"}, ] [[package]] name = "nvidia-curand-cu12" -version = "10.3.7.77" +version = "10.3.9.90" description = "CURAND native runtime libraries" optional = false python-versions = ">=3" -groups = ["main"] +groups = ["main", "torch-cuda"] markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" files = [ - {file = "nvidia_curand_cu12-10.3.7.77-py3-none-manylinux2014_aarch64.whl", hash = "sha256:6e82df077060ea28e37f48a3ec442a8f47690c7499bff392a5938614b56c98d8"}, - {file = "nvidia_curand_cu12-10.3.7.77-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a42cd1344297f70b9e39a1e4f467a4e1c10f1da54ff7a85c12197f6c652c8bdf"}, - {file = "nvidia_curand_cu12-10.3.7.77-py3-none-manylinux2014_x86_64.whl", hash = "sha256:99f1a32f1ac2bd134897fc7a203f779303261268a65762a623bf30cc9fe79117"}, - {file = "nvidia_curand_cu12-10.3.7.77-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:7b2ed8e95595c3591d984ea3603dd66fe6ce6812b886d59049988a712ed06b6e"}, - {file = "nvidia_curand_cu12-10.3.7.77-py3-none-win_amd64.whl", hash = "sha256:6d6d935ffba0f3d439b7cd968192ff068fafd9018dbf1b85b37261b13cfc9905"}, + {file = "nvidia_curand_cu12-10.3.9.90-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:dfab99248034673b779bc6decafdc3404a8a6f502462201f2f31f11354204acd"}, + {file = "nvidia_curand_cu12-10.3.9.90-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:b32331d4f4df5d6eefa0554c565b626c7216f87a06a4f56fab27c3b68a830ec9"}, + {file = "nvidia_curand_cu12-10.3.9.90-py3-none-win_amd64.whl", hash = "sha256:f149a8ca457277da854f89cf282d6ef43176861926c7ac85b2a0fbd237c587ec"}, ] [[package]] name = "nvidia-cusolver-cu12" -version = "11.7.1.2" +version = "11.7.3.90" description = "CUDA solver native runtime libraries" optional = false python-versions = ">=3" -groups = ["main"] +groups = ["main", "torch-cuda"] markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" files = [ - {file = "nvidia_cusolver_cu12-11.7.1.2-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0ce237ef60acde1efc457335a2ddadfd7610b892d94efee7b776c64bb1cac9e0"}, - {file = "nvidia_cusolver_cu12-11.7.1.2-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e9e49843a7707e42022babb9bcfa33c29857a93b88020c4e4434656a655b698c"}, - {file = "nvidia_cusolver_cu12-11.7.1.2-py3-none-manylinux2014_x86_64.whl", hash = "sha256:6cf28f17f64107a0c4d7802be5ff5537b2130bfc112f25d5a30df227058ca0e6"}, - {file = "nvidia_cusolver_cu12-11.7.1.2-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:dbbe4fc38ec1289c7e5230e16248365e375c3673c9c8bac5796e2e20db07f56e"}, - {file = "nvidia_cusolver_cu12-11.7.1.2-py3-none-win_amd64.whl", hash = "sha256:6813f9d8073f555444a8705f3ab0296d3e1cb37a16d694c5fc8b862a0d8706d7"}, + {file = "nvidia_cusolver_cu12-11.7.3.90-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:db9ed69dbef9715071232caa9b69c52ac7de3a95773c2db65bdba85916e4e5c0"}, + {file = "nvidia_cusolver_cu12-11.7.3.90-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:4376c11ad263152bd50ea295c05370360776f8c3427b30991df774f9fb26c450"}, + {file = "nvidia_cusolver_cu12-11.7.3.90-py3-none-win_amd64.whl", hash = "sha256:4a550db115fcabc4d495eb7d39ac8b58d4ab5d8e63274d3754df1c0ad6a22d34"}, ] [package.dependencies] @@ -2461,18 +2882,16 @@ nvidia-nvjitlink-cu12 = "*" [[package]] name = "nvidia-cusparse-cu12" -version = "12.5.4.2" +version = "12.5.8.93" description = "CUSPARSE native runtime libraries" optional = false python-versions = ">=3" -groups = ["main"] +groups = ["main", "torch-cuda"] markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" files = [ - {file = "nvidia_cusparse_cu12-12.5.4.2-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d25b62fb18751758fe3c93a4a08eff08effedfe4edf1c6bb5afd0890fe88f887"}, - {file = "nvidia_cusparse_cu12-12.5.4.2-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7aa32fa5470cf754f72d1116c7cbc300b4e638d3ae5304cfa4a638a5b87161b1"}, - {file = "nvidia_cusparse_cu12-12.5.4.2-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7556d9eca156e18184b94947ade0fba5bb47d69cec46bf8660fd2c71a4b48b73"}, - {file = "nvidia_cusparse_cu12-12.5.4.2-py3-none-manylinux2014_x86_64.whl", hash = "sha256:23749a6571191a215cb74d1cdbff4a86e7b19f1200c071b3fcf844a5bea23a2f"}, - {file = "nvidia_cusparse_cu12-12.5.4.2-py3-none-win_amd64.whl", hash = "sha256:4acb8c08855a26d737398cba8fb6f8f5045d93f82612b4cfd84645a2332ccf20"}, + {file = "nvidia_cusparse_cu12-12.5.8.93-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9b6c161cb130be1a07a27ea6923df8141f3c295852f4b260c65f18f3e0a091dc"}, + {file = "nvidia_cusparse_cu12-12.5.8.93-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1ec05d76bbbd8b61b06a80e1eaf8cf4959c3d4ce8e711b65ebd0443bb0ebb13b"}, + {file = "nvidia_cusparse_cu12-12.5.8.93-py3-none-win_amd64.whl", hash = "sha256:9a33604331cb2cac199f2e7f5104dfbb8a5a898c367a53dfda9ff2acb6b6b4dd"}, ] [package.dependencies] @@ -2480,123 +2899,147 @@ nvidia-nvjitlink-cu12 = "*" [[package]] name = "nvidia-cusparselt-cu12" -version = "0.6.3" +version = "0.7.1" description = "NVIDIA cuSPARSELt" optional = false python-versions = "*" -groups = ["main"] +groups = ["main", "torch-cuda"] markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" files = [ - {file = "nvidia_cusparselt_cu12-0.6.3-py3-none-manylinux2014_aarch64.whl", hash = "sha256:8371549623ba601a06322af2133c4a44350575f5a3108fb75f3ef20b822ad5f1"}, - {file = "nvidia_cusparselt_cu12-0.6.3-py3-none-manylinux2014_x86_64.whl", hash = "sha256:e5c8a26c36445dd2e6812f1177978a24e2d37cacce7e090f297a688d1ec44f46"}, - {file = "nvidia_cusparselt_cu12-0.6.3-py3-none-win_amd64.whl", hash = "sha256:3b325bcbd9b754ba43df5a311488fca11a6b5dc3d11df4d190c000cf1a0765c7"}, + {file = "nvidia_cusparselt_cu12-0.7.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:8878dce784d0fac90131b6817b607e803c36e629ba34dc5b433471382196b6a5"}, + {file = "nvidia_cusparselt_cu12-0.7.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:f1bb701d6b930d5a7cea44c19ceb973311500847f81b634d802b7b539dc55623"}, + {file = "nvidia_cusparselt_cu12-0.7.1-py3-none-win_amd64.whl", hash = "sha256:f67fbb5831940ec829c9117b7f33807db9f9678dc2a617fbe781cac17b4e1075"}, ] [[package]] name = "nvidia-nccl-cu12" -version = "2.26.2" +version = "2.27.5" description = "NVIDIA Collective Communication Library (NCCL) Runtime" optional = false python-versions = ">=3" -groups = ["main"] +groups = ["main", "torch-cuda"] markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" files = [ - {file = "nvidia_nccl_cu12-2.26.2-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5c196e95e832ad30fbbb50381eb3cbd1fadd5675e587a548563993609af19522"}, - {file = "nvidia_nccl_cu12-2.26.2-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:694cf3879a206553cc9d7dbda76b13efaf610fdb70a50cba303de1b0d1530ac6"}, + {file = "nvidia_nccl_cu12-2.27.5-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:31432ad4d1fb1004eb0c56203dc9bc2178a1ba69d1d9e02d64a6938ab5e40e7a"}, + {file = "nvidia_nccl_cu12-2.27.5-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ad730cf15cb5d25fe849c6e6ca9eb5b76db16a80f13f425ac68d8e2e55624457"}, ] [[package]] name = "nvidia-nvjitlink-cu12" -version = "12.6.85" +version = "12.8.93" description = "Nvidia JIT LTO Library" optional = false python-versions = ">=3" -groups = ["main"] +groups = ["main", "torch-cuda"] markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" files = [ - {file = "nvidia_nvjitlink_cu12-12.6.85-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:eedc36df9e88b682efe4309aa16b5b4e78c2407eac59e8c10a6a47535164369a"}, - {file = "nvidia_nvjitlink_cu12-12.6.85-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cf4eaa7d4b6b543ffd69d6abfb11efdeb2db48270d94dfd3a452c24150829e41"}, - {file = "nvidia_nvjitlink_cu12-12.6.85-py3-none-win_amd64.whl", hash = "sha256:e61120e52ed675747825cdd16febc6a0730537451d867ee58bee3853b1b13d1c"}, + {file = "nvidia_nvjitlink_cu12-12.8.93-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:81ff63371a7ebd6e6451970684f916be2eab07321b73c9d244dc2b4da7f73b88"}, + {file = "nvidia_nvjitlink_cu12-12.8.93-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:adccd7161ace7261e01bb91e44e88da350895c270d23f744f0820c818b7229e7"}, + {file = "nvidia_nvjitlink_cu12-12.8.93-py3-none-win_amd64.whl", hash = "sha256:bd93fbeeee850917903583587f4fc3a4eafa022e34572251368238ab5e6bd67f"}, +] + +[[package]] +name = "nvidia-nvshmem-cu12" +version = "3.4.5" +description = "NVSHMEM creates a global address space that provides efficient and scalable communication for NVIDIA GPU clusters." +optional = false +python-versions = ">=3" +groups = ["main", "torch-cuda"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" +files = [ + {file = "nvidia_nvshmem_cu12-3.4.5-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0b48363fc6964dede448029434c6abed6c5e37f823cb43c3bcde7ecfc0457e15"}, + {file = "nvidia_nvshmem_cu12-3.4.5-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:042f2500f24c021db8a06c5eec2539027d57460e1c1a762055a6554f72c369bd"}, ] [[package]] name = "nvidia-nvtx-cu12" -version = "12.6.77" +version = "12.8.90" description = "NVIDIA Tools Extension" optional = false python-versions = ">=3" -groups = ["main"] +groups = ["main", "torch-cuda"] markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" files = [ - {file = "nvidia_nvtx_cu12-12.6.77-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f44f8d86bb7d5629988d61c8d3ae61dddb2015dee142740536bc7481b022fe4b"}, - {file = "nvidia_nvtx_cu12-12.6.77-py3-none-manylinux2014_aarch64.whl", hash = "sha256:adcaabb9d436c9761fca2b13959a2d237c5f9fd406c8e4b723c695409ff88059"}, - {file = "nvidia_nvtx_cu12-12.6.77-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b90bed3df379fa79afbd21be8e04a0314336b8ae16768b58f2d34cb1d04cd7d2"}, - {file = "nvidia_nvtx_cu12-12.6.77-py3-none-manylinux2014_x86_64.whl", hash = "sha256:6574241a3ec5fdc9334353ab8c479fe75841dbe8f4532a8fc97ce63503330ba1"}, - {file = "nvidia_nvtx_cu12-12.6.77-py3-none-win_amd64.whl", hash = "sha256:2fb11a4af04a5e6c84073e6404d26588a34afd35379f0855a99797897efa75c0"}, + {file = "nvidia_nvtx_cu12-12.8.90-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d7ad891da111ebafbf7e015d34879f7112832fc239ff0d7d776b6cb685274615"}, + {file = "nvidia_nvtx_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5b17e2001cc0d751a5bc2c6ec6d26ad95913324a4adb86788c944f8ce9ba441f"}, + {file = "nvidia_nvtx_cu12-12.8.90-py3-none-win_amd64.whl", hash = "sha256:619c8304aedc69f02ea82dd244541a83c3d9d40993381b3b590f1adaed3db41e"}, ] [[package]] name = "packaging" -version = "25.0" +version = "26.0" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" groups = ["main", "development"] files = [ - {file = "packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484"}, - {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"}, + {file = "packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529"}, + {file = "packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4"}, ] [[package]] name = "pandas" -version = "2.2.3" +version = "2.3.3" description = "Powerful data structures for data analysis, time series, and statistics" optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "pandas-2.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1948ddde24197a0f7add2bdc4ca83bf2b1ef84a1bc8ccffd95eda17fd836ecb5"}, - {file = "pandas-2.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:381175499d3802cde0eabbaf6324cce0c4f5d52ca6f8c377c29ad442f50f6348"}, - {file = "pandas-2.2.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d9c45366def9a3dd85a6454c0e7908f2b3b8e9c138f5dc38fed7ce720d8453ed"}, - {file = "pandas-2.2.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86976a1c5b25ae3f8ccae3a5306e443569ee3c3faf444dfd0f41cda24667ad57"}, - {file = "pandas-2.2.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b8661b0238a69d7aafe156b7fa86c44b881387509653fdf857bebc5e4008ad42"}, - {file = "pandas-2.2.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:37e0aced3e8f539eccf2e099f65cdb9c8aa85109b0be6e93e2baff94264bdc6f"}, - {file = "pandas-2.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:56534ce0746a58afaf7942ba4863e0ef81c9c50d3f0ae93e9497d6a41a057645"}, - {file = "pandas-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039"}, - {file = "pandas-2.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c2875855b0ff77b2a64a0365e24455d9990730d6431b9e0ee18ad8acee13dbd"}, - {file = "pandas-2.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698"}, - {file = "pandas-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc"}, - {file = "pandas-2.2.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:63cc132e40a2e084cf01adf0775b15ac515ba905d7dcca47e9a251819c575ef3"}, - {file = "pandas-2.2.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:29401dbfa9ad77319367d36940cd8a0b3a11aba16063e39632d98b0e931ddf32"}, - {file = "pandas-2.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:3fc6873a41186404dad67245896a6e440baacc92f5b716ccd1bc9ed2995ab2c5"}, - {file = "pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9"}, - {file = "pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4"}, - {file = "pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3"}, - {file = "pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319"}, - {file = "pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8"}, - {file = "pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a"}, - {file = "pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13"}, - {file = "pandas-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015"}, - {file = "pandas-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28"}, - {file = "pandas-2.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0"}, - {file = "pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24"}, - {file = "pandas-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659"}, - {file = "pandas-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb"}, - {file = "pandas-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d"}, - {file = "pandas-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468"}, - {file = "pandas-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18"}, - {file = "pandas-2.2.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2"}, - {file = "pandas-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4"}, - {file = "pandas-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d"}, - {file = "pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a"}, - {file = "pandas-2.2.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc6b93f9b966093cb0fd62ff1a7e4c09e6d546ad7c1de191767baffc57628f39"}, - {file = "pandas-2.2.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5dbca4c1acd72e8eeef4753eeca07de9b1db4f398669d5994086f788a5d7cc30"}, - {file = "pandas-2.2.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8cd6d7cc958a3910f934ea8dbdf17b2364827bb4dafc38ce6eef6bb3d65ff09c"}, - {file = "pandas-2.2.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99df71520d25fade9db7c1076ac94eb994f4d2673ef2aa2e86ee039b6746d20c"}, - {file = "pandas-2.2.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:31d0ced62d4ea3e231a9f228366919a5ea0b07440d9d4dac345376fd8e1477ea"}, - {file = "pandas-2.2.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7eee9e7cea6adf3e3d24e304ac6b8300646e2a5d1cd3a3c2abed9101b0846761"}, - {file = "pandas-2.2.3-cp39-cp39-win_amd64.whl", hash = "sha256:4850ba03528b6dd51d6c5d273c46f183f39a9baf3f0143e566b89450965b105e"}, - {file = "pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667"}, + {file = "pandas-2.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:376c6446ae31770764215a6c937f72d917f214b43560603cd60da6408f183b6c"}, + {file = "pandas-2.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e19d192383eab2f4ceb30b412b22ea30690c9e618f78870357ae1d682912015a"}, + {file = "pandas-2.3.3-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5caf26f64126b6c7aec964f74266f435afef1c1b13da3b0636c7518a1fa3e2b1"}, + {file = "pandas-2.3.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dd7478f1463441ae4ca7308a70e90b33470fa593429f9d4c578dd00d1fa78838"}, + {file = "pandas-2.3.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4793891684806ae50d1288c9bae9330293ab4e083ccd1c5e383c34549c6e4250"}, + {file = "pandas-2.3.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:28083c648d9a99a5dd035ec125d42439c6c1c525098c58af0fc38dd1a7a1b3d4"}, + {file = "pandas-2.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:503cf027cf9940d2ceaa1a93cfb5f8c8c7e6e90720a2850378f0b3f3b1e06826"}, + {file = "pandas-2.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:602b8615ebcc4a0c1751e71840428ddebeb142ec02c786e8ad6b1ce3c8dec523"}, + {file = "pandas-2.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8fe25fc7b623b0ef6b5009149627e34d2a4657e880948ec3c840e9402e5c1b45"}, + {file = "pandas-2.3.3-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b468d3dad6ff947df92dcb32ede5b7bd41a9b3cceef0a30ed925f6d01fb8fa66"}, + {file = "pandas-2.3.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b98560e98cb334799c0b07ca7967ac361a47326e9b4e5a7dfb5ab2b1c9d35a1b"}, + {file = "pandas-2.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37b5848ba49824e5c30bedb9c830ab9b7751fd049bc7914533e01c65f79791"}, + {file = "pandas-2.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:db4301b2d1f926ae677a751eb2bd0e8c5f5319c9cb3f88b0becbbb0b07b34151"}, + {file = "pandas-2.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:f086f6fe114e19d92014a1966f43a3e62285109afe874f067f5abbdcbb10e59c"}, + {file = "pandas-2.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d21f6d74eb1725c2efaa71a2bfc661a0689579b58e9c0ca58a739ff0b002b53"}, + {file = "pandas-2.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3fd2f887589c7aa868e02632612ba39acb0b8948faf5cc58f0850e165bd46f35"}, + {file = "pandas-2.3.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ecaf1e12bdc03c86ad4a7ea848d66c685cb6851d807a26aa245ca3d2017a1908"}, + {file = "pandas-2.3.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b3d11d2fda7eb164ef27ffc14b4fcab16a80e1ce67e9f57e19ec0afaf715ba89"}, + {file = "pandas-2.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a68e15f780eddf2b07d242e17a04aa187a7ee12b40b930bfdd78070556550e98"}, + {file = "pandas-2.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:371a4ab48e950033bcf52b6527eccb564f52dc826c02afd9a1bc0ab731bba084"}, + {file = "pandas-2.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:a16dcec078a01eeef8ee61bf64074b4e524a2a3f4b3be9326420cabe59c4778b"}, + {file = "pandas-2.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:56851a737e3470de7fa88e6131f41281ed440d29a9268dcbf0002da5ac366713"}, + {file = "pandas-2.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bdcd9d1167f4885211e401b3036c0c8d9e274eee67ea8d0758a256d60704cfe8"}, + {file = "pandas-2.3.3-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e32e7cc9af0f1cc15548288a51a3b681cc2a219faa838e995f7dc53dbab1062d"}, + {file = "pandas-2.3.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:318d77e0e42a628c04dc56bcef4b40de67918f7041c2b061af1da41dcff670ac"}, + {file = "pandas-2.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e0a175408804d566144e170d0476b15d78458795bb18f1304fb94160cabf40c"}, + {file = "pandas-2.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:93c2d9ab0fc11822b5eece72ec9587e172f63cff87c00b062f6e37448ced4493"}, + {file = "pandas-2.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:f8bfc0e12dc78f777f323f55c58649591b2cd0c43534e8355c51d3fede5f4dee"}, + {file = "pandas-2.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:75ea25f9529fdec2d2e93a42c523962261e567d250b0013b16210e1d40d7c2e5"}, + {file = "pandas-2.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74ecdf1d301e812db96a465a525952f4dde225fdb6d8e5a521d47e1f42041e21"}, + {file = "pandas-2.3.3-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6435cb949cb34ec11cc9860246ccb2fdc9ecd742c12d3304989017d53f039a78"}, + {file = "pandas-2.3.3-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:900f47d8f20860de523a1ac881c4c36d65efcb2eb850e6948140fa781736e110"}, + {file = "pandas-2.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a45c765238e2ed7d7c608fc5bc4a6f88b642f2f01e70c0c23d2224dd21829d86"}, + {file = "pandas-2.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c4fc4c21971a1a9f4bdb4c73978c7f7256caa3e62b323f70d6cb80db583350bc"}, + {file = "pandas-2.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:ee15f284898e7b246df8087fc82b87b01686f98ee67d85a17b7ab44143a3a9a0"}, + {file = "pandas-2.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1611aedd912e1ff81ff41c745822980c49ce4a7907537be8692c8dbc31924593"}, + {file = "pandas-2.3.3-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d2cefc361461662ac48810cb14365a365ce864afe85ef1f447ff5a1e99ea81c"}, + {file = "pandas-2.3.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ee67acbbf05014ea6c763beb097e03cd629961c8a632075eeb34247120abcb4b"}, + {file = "pandas-2.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c46467899aaa4da076d5abc11084634e2d197e9460643dd455ac3db5856b24d6"}, + {file = "pandas-2.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6253c72c6a1d990a410bc7de641d34053364ef8bcd3126f7e7450125887dffe3"}, + {file = "pandas-2.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:1b07204a219b3b7350abaae088f451860223a52cfb8a6c53358e7948735158e5"}, + {file = "pandas-2.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2462b1a365b6109d275250baaae7b760fd25c726aaca0054649286bcfbb3e8ec"}, + {file = "pandas-2.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0242fe9a49aa8b4d78a4fa03acb397a58833ef6199e9aa40a95f027bb3a1b6e7"}, + {file = "pandas-2.3.3-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a21d830e78df0a515db2b3d2f5570610f5e6bd2e27749770e8bb7b524b89b450"}, + {file = "pandas-2.3.3-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e3ebdb170b5ef78f19bfb71b0dc5dc58775032361fa188e814959b74d726dd5"}, + {file = "pandas-2.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d051c0e065b94b7a3cea50eb1ec32e912cd96dba41647eb24104b6c6c14c5788"}, + {file = "pandas-2.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3869faf4bd07b3b66a9f462417d0ca3a9df29a9f6abd5d0d0dbab15dac7abe87"}, + {file = "pandas-2.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c503ba5216814e295f40711470446bc3fd00f0faea8a086cbc688808e26f92a2"}, + {file = "pandas-2.3.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a637c5cdfa04b6d6e2ecedcb81fc52ffb0fd78ce2ebccc9ea964df9f658de8c8"}, + {file = "pandas-2.3.3-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:854d00d556406bffe66a4c0802f334c9ad5a96b4f1f868adf036a21b11ef13ff"}, + {file = "pandas-2.3.3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bf1f8a81d04ca90e32a0aceb819d34dbd378a98bf923b6398b9a3ec0bf44de29"}, + {file = "pandas-2.3.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:23ebd657a4d38268c7dfbdf089fbc31ea709d82e4923c5ffd4fbd5747133ce73"}, + {file = "pandas-2.3.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5554c929ccc317d41a5e3d1234f3be588248e61f08a74dd17c9eabb535777dc9"}, + {file = "pandas-2.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:d3e28b3e83862ccf4d85ff19cf8c20b2ae7e503881711ff2d534dc8f761131aa"}, + {file = "pandas-2.3.3.tar.gz", hash = "sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b"}, ] [package.dependencies] @@ -2635,26 +3078,32 @@ xml = ["lxml (>=4.9.2)"] [[package]] name = "pathspec" -version = "0.12.1" +version = "1.0.4" description = "Utility library for gitignore style pattern matching of file paths." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["development"] files = [ - {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, - {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, + {file = "pathspec-1.0.4-py3-none-any.whl", hash = "sha256:fb6ae2fd4e7c921a165808a552060e722767cfa526f99ca5156ed2ce45a5c723"}, + {file = "pathspec-1.0.4.tar.gz", hash = "sha256:0210e2ae8a21a9137c0d470578cb0e595af87edaa6ebf12ff176f14a02e0e645"}, ] +[package.extras] +hyperscan = ["hyperscan (>=0.7)"] +optional = ["typing-extensions (>=4)"] +re2 = ["google-re2 (>=1.1)"] +tests = ["pytest (>=9)", "typing-extensions (>=4.15)"] + [[package]] name = "patsy" -version = "1.0.1" +version = "1.0.2" description = "A Python package for describing statistical models and for building design matrices." optional = false python-versions = ">=3.6" groups = ["main"] files = [ - {file = "patsy-1.0.1-py2.py3-none-any.whl", hash = "sha256:751fb38f9e97e62312e921a1954b81e1bb2bcda4f5eeabaf94db251ee791509c"}, - {file = "patsy-1.0.1.tar.gz", hash = "sha256:e786a9391eec818c054e359b737bbce692f051aee4c661f4141cc88fb459c0c4"}, + {file = "patsy-1.0.2-py2.py3-none-any.whl", hash = "sha256:37bfddbc58fcf0362febb5f54f10743f8b21dd2aa73dec7e7ef59d1b02ae668a"}, + {file = "patsy-1.0.2.tar.gz", hash = "sha256:cdc995455f6233e90e22de72c37fcadb344e7586fb83f06696f54d92f8ce74c0"}, ] [package.dependencies] @@ -2663,31 +3112,16 @@ numpy = ">=1.4" [package.extras] test = ["pytest", "pytest-cov", "scipy"] -[[package]] -name = "pbr" -version = "6.1.1" -description = "Python Build Reasonableness" -optional = false -python-versions = ">=2.6" -groups = ["development"] -files = [ - {file = "pbr-6.1.1-py2.py3-none-any.whl", hash = "sha256:38d4daea5d9fa63b3f626131b9d34947fd0c8be9b05a29276870580050a25a76"}, - {file = "pbr-6.1.1.tar.gz", hash = "sha256:93ea72ce6989eb2eed99d0f75721474f69ad88128afdef5ac377eb797c4bf76b"}, -] - -[package.dependencies] -setuptools = "*" - [[package]] name = "pbs-installer" -version = "2025.4.9" +version = "2026.2.3" description = "Installer for Python Build Standalone" optional = false python-versions = ">=3.8" groups = ["main"] files = [ - {file = "pbs_installer-2025.4.9-py3-none-any.whl", hash = "sha256:af110b398248584422f46760ce1e3793622fe3fbcde47aacd22e35baf8c3db1d"}, - {file = "pbs_installer-2025.4.9.tar.gz", hash = "sha256:15755bc94769a544af5dda155f973c70caf76f0e70b21f3c8a8ed506f102f88f"}, + {file = "pbs_installer-2026.2.3-py3-none-any.whl", hash = "sha256:0225254ada5812c34761325edfd9c744317422c2767e434143307da171de0673"}, + {file = "pbs_installer-2026.2.3.tar.gz", hash = "sha256:1328eacb32b3a5bad59edeff942e16f4083c79e6dea46cdd8b98141b4030a93d"}, ] [package.dependencies] @@ -2716,102 +3150,111 @@ flake8 = ">=5.0.0" [[package]] name = "pillow" -version = "11.2.1" -description = "Python Imaging Library (Fork)" +version = "12.1.0" +description = "Python Imaging Library (fork)" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["main"] files = [ - {file = "pillow-11.2.1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:d57a75d53922fc20c165016a20d9c44f73305e67c351bbc60d1adaf662e74047"}, - {file = "pillow-11.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:127bf6ac4a5b58b3d32fc8289656f77f80567d65660bc46f72c0d77e6600cc95"}, - {file = "pillow-11.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4ba4be812c7a40280629e55ae0b14a0aafa150dd6451297562e1764808bbe61"}, - {file = "pillow-11.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8bd62331e5032bc396a93609982a9ab6b411c05078a52f5fe3cc59234a3abd1"}, - {file = "pillow-11.2.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:562d11134c97a62fe3af29581f083033179f7ff435f78392565a1ad2d1c2c45c"}, - {file = "pillow-11.2.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:c97209e85b5be259994eb5b69ff50c5d20cca0f458ef9abd835e262d9d88b39d"}, - {file = "pillow-11.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0c3e6d0f59171dfa2e25d7116217543310908dfa2770aa64b8f87605f8cacc97"}, - {file = "pillow-11.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cc1c3bc53befb6096b84165956e886b1729634a799e9d6329a0c512ab651e579"}, - {file = "pillow-11.2.1-cp310-cp310-win32.whl", hash = "sha256:312c77b7f07ab2139924d2639860e084ec2a13e72af54d4f08ac843a5fc9c79d"}, - {file = "pillow-11.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:9bc7ae48b8057a611e5fe9f853baa88093b9a76303937449397899385da06fad"}, - {file = "pillow-11.2.1-cp310-cp310-win_arm64.whl", hash = "sha256:2728567e249cdd939f6cc3d1f049595c66e4187f3c34078cbc0a7d21c47482d2"}, - {file = "pillow-11.2.1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:35ca289f712ccfc699508c4658a1d14652e8033e9b69839edf83cbdd0ba39e70"}, - {file = "pillow-11.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e0409af9f829f87a2dfb7e259f78f317a5351f2045158be321fd135973fff7bf"}, - {file = "pillow-11.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4e5c5edee874dce4f653dbe59db7c73a600119fbea8d31f53423586ee2aafd7"}, - {file = "pillow-11.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b93a07e76d13bff9444f1a029e0af2964e654bfc2e2c2d46bfd080df5ad5f3d8"}, - {file = "pillow-11.2.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:e6def7eed9e7fa90fde255afaf08060dc4b343bbe524a8f69bdd2a2f0018f600"}, - {file = "pillow-11.2.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:8f4f3724c068be008c08257207210c138d5f3731af6c155a81c2b09a9eb3a788"}, - {file = "pillow-11.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a0a6709b47019dff32e678bc12c63008311b82b9327613f534e496dacaefb71e"}, - {file = "pillow-11.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f6b0c664ccb879109ee3ca702a9272d877f4fcd21e5eb63c26422fd6e415365e"}, - {file = "pillow-11.2.1-cp311-cp311-win32.whl", hash = "sha256:cc5d875d56e49f112b6def6813c4e3d3036d269c008bf8aef72cd08d20ca6df6"}, - {file = "pillow-11.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:0f5c7eda47bf8e3c8a283762cab94e496ba977a420868cb819159980b6709193"}, - {file = "pillow-11.2.1-cp311-cp311-win_arm64.whl", hash = "sha256:4d375eb838755f2528ac8cbc926c3e31cc49ca4ad0cf79cff48b20e30634a4a7"}, - {file = "pillow-11.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:78afba22027b4accef10dbd5eed84425930ba41b3ea0a86fa8d20baaf19d807f"}, - {file = "pillow-11.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:78092232a4ab376a35d68c4e6d5e00dfd73454bd12b230420025fbe178ee3b0b"}, - {file = "pillow-11.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25a5f306095c6780c52e6bbb6109624b95c5b18e40aab1c3041da3e9e0cd3e2d"}, - {file = "pillow-11.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c7b29dbd4281923a2bfe562acb734cee96bbb129e96e6972d315ed9f232bef4"}, - {file = "pillow-11.2.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:3e645b020f3209a0181a418bffe7b4a93171eef6c4ef6cc20980b30bebf17b7d"}, - {file = "pillow-11.2.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b2dbea1012ccb784a65349f57bbc93730b96e85b42e9bf7b01ef40443db720b4"}, - {file = "pillow-11.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:da3104c57bbd72948d75f6a9389e6727d2ab6333c3617f0a89d72d4940aa0443"}, - {file = "pillow-11.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:598174aef4589af795f66f9caab87ba4ff860ce08cd5bb447c6fc553ffee603c"}, - {file = "pillow-11.2.1-cp312-cp312-win32.whl", hash = "sha256:1d535df14716e7f8776b9e7fee118576d65572b4aad3ed639be9e4fa88a1cad3"}, - {file = "pillow-11.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:14e33b28bf17c7a38eede290f77db7c664e4eb01f7869e37fa98a5aa95978941"}, - {file = "pillow-11.2.1-cp312-cp312-win_arm64.whl", hash = "sha256:21e1470ac9e5739ff880c211fc3af01e3ae505859392bf65458c224d0bf283eb"}, - {file = "pillow-11.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:fdec757fea0b793056419bca3e9932eb2b0ceec90ef4813ea4c1e072c389eb28"}, - {file = "pillow-11.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b0e130705d568e2f43a17bcbe74d90958e8a16263868a12c3e0d9c8162690830"}, - {file = "pillow-11.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bdb5e09068332578214cadd9c05e3d64d99e0e87591be22a324bdbc18925be0"}, - {file = "pillow-11.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d189ba1bebfbc0c0e529159631ec72bb9e9bc041f01ec6d3233d6d82eb823bc1"}, - {file = "pillow-11.2.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:191955c55d8a712fab8934a42bfefbf99dd0b5875078240943f913bb66d46d9f"}, - {file = "pillow-11.2.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:ad275964d52e2243430472fc5d2c2334b4fc3ff9c16cb0a19254e25efa03a155"}, - {file = "pillow-11.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:750f96efe0597382660d8b53e90dd1dd44568a8edb51cb7f9d5d918b80d4de14"}, - {file = "pillow-11.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fe15238d3798788d00716637b3d4e7bb6bde18b26e5d08335a96e88564a36b6b"}, - {file = "pillow-11.2.1-cp313-cp313-win32.whl", hash = "sha256:3fe735ced9a607fee4f481423a9c36701a39719252a9bb251679635f99d0f7d2"}, - {file = "pillow-11.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:74ee3d7ecb3f3c05459ba95eed5efa28d6092d751ce9bf20e3e253a4e497e691"}, - {file = "pillow-11.2.1-cp313-cp313-win_arm64.whl", hash = "sha256:5119225c622403afb4b44bad4c1ca6c1f98eed79db8d3bc6e4e160fc6339d66c"}, - {file = "pillow-11.2.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8ce2e8411c7aaef53e6bb29fe98f28cd4fbd9a1d9be2eeea434331aac0536b22"}, - {file = "pillow-11.2.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:9ee66787e095127116d91dea2143db65c7bb1e232f617aa5957c0d9d2a3f23a7"}, - {file = "pillow-11.2.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9622e3b6c1d8b551b6e6f21873bdcc55762b4b2126633014cea1803368a9aa16"}, - {file = "pillow-11.2.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63b5dff3a68f371ea06025a1a6966c9a1e1ee452fc8020c2cd0ea41b83e9037b"}, - {file = "pillow-11.2.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:31df6e2d3d8fc99f993fd253e97fae451a8db2e7207acf97859732273e108406"}, - {file = "pillow-11.2.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:062b7a42d672c45a70fa1f8b43d1d38ff76b63421cbbe7f88146b39e8a558d91"}, - {file = "pillow-11.2.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4eb92eca2711ef8be42fd3f67533765d9fd043b8c80db204f16c8ea62ee1a751"}, - {file = "pillow-11.2.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f91ebf30830a48c825590aede79376cb40f110b387c17ee9bd59932c961044f9"}, - {file = "pillow-11.2.1-cp313-cp313t-win32.whl", hash = "sha256:e0b55f27f584ed623221cfe995c912c61606be8513bfa0e07d2c674b4516d9dd"}, - {file = "pillow-11.2.1-cp313-cp313t-win_amd64.whl", hash = "sha256:36d6b82164c39ce5482f649b437382c0fb2395eabc1e2b1702a6deb8ad647d6e"}, - {file = "pillow-11.2.1-cp313-cp313t-win_arm64.whl", hash = "sha256:225c832a13326e34f212d2072982bb1adb210e0cc0b153e688743018c94a2681"}, - {file = "pillow-11.2.1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:7491cf8a79b8eb867d419648fff2f83cb0b3891c8b36da92cc7f1931d46108c8"}, - {file = "pillow-11.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8b02d8f9cb83c52578a0b4beadba92e37d83a4ef11570a8688bbf43f4ca50909"}, - {file = "pillow-11.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:014ca0050c85003620526b0ac1ac53f56fc93af128f7546623cc8e31875ab928"}, - {file = "pillow-11.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3692b68c87096ac6308296d96354eddd25f98740c9d2ab54e1549d6c8aea9d79"}, - {file = "pillow-11.2.1-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:f781dcb0bc9929adc77bad571b8621ecb1e4cdef86e940fe2e5b5ee24fd33b35"}, - {file = "pillow-11.2.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:2b490402c96f907a166615e9a5afacf2519e28295f157ec3a2bb9bd57de638cb"}, - {file = "pillow-11.2.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dd6b20b93b3ccc9c1b597999209e4bc5cf2853f9ee66e3fc9a400a78733ffc9a"}, - {file = "pillow-11.2.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:4b835d89c08a6c2ee7781b8dd0a30209a8012b5f09c0a665b65b0eb3560b6f36"}, - {file = "pillow-11.2.1-cp39-cp39-win32.whl", hash = "sha256:b10428b3416d4f9c61f94b494681280be7686bda15898a3a9e08eb66a6d92d67"}, - {file = "pillow-11.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:6ebce70c3f486acf7591a3d73431fa504a4e18a9b97ff27f5f47b7368e4b9dd1"}, - {file = "pillow-11.2.1-cp39-cp39-win_arm64.whl", hash = "sha256:c27476257b2fdcd7872d54cfd119b3a9ce4610fb85c8e32b70b42e3680a29a1e"}, - {file = "pillow-11.2.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:9b7b0d4fd2635f54ad82785d56bc0d94f147096493a79985d0ab57aedd563156"}, - {file = "pillow-11.2.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:aa442755e31c64037aa7c1cb186e0b369f8416c567381852c63444dd666fb772"}, - {file = "pillow-11.2.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0d3348c95b766f54b76116d53d4cb171b52992a1027e7ca50c81b43b9d9e363"}, - {file = "pillow-11.2.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85d27ea4c889342f7e35f6d56e7e1cb345632ad592e8c51b693d7b7556043ce0"}, - {file = "pillow-11.2.1-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:bf2c33d6791c598142f00c9c4c7d47f6476731c31081331664eb26d6ab583e01"}, - {file = "pillow-11.2.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e616e7154c37669fc1dfc14584f11e284e05d1c650e1c0f972f281c4ccc53193"}, - {file = "pillow-11.2.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:39ad2e0f424394e3aebc40168845fee52df1394a4673a6ee512d840d14ab3013"}, - {file = "pillow-11.2.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:80f1df8dbe9572b4b7abdfa17eb5d78dd620b1d55d9e25f834efdbee872d3aed"}, - {file = "pillow-11.2.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:ea926cfbc3957090becbcbbb65ad177161a2ff2ad578b5a6ec9bb1e1cd78753c"}, - {file = "pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:738db0e0941ca0376804d4de6a782c005245264edaa253ffce24e5a15cbdc7bd"}, - {file = "pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9db98ab6565c69082ec9b0d4e40dd9f6181dab0dd236d26f7a50b8b9bfbd5076"}, - {file = "pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:036e53f4170e270ddb8797d4c590e6dd14d28e15c7da375c18978045f7e6c37b"}, - {file = "pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:14f73f7c291279bd65fda51ee87affd7c1e097709f7fdd0188957a16c264601f"}, - {file = "pillow-11.2.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:208653868d5c9ecc2b327f9b9ef34e0e42a4cdd172c2988fd81d62d2bc9bc044"}, - {file = "pillow-11.2.1.tar.gz", hash = "sha256:a64dd61998416367b7ef979b73d3a85853ba9bec4c2925f74e588879a58716b6"}, + {file = "pillow-12.1.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:fb125d860738a09d363a88daa0f59c4533529a90e564785e20fe875b200b6dbd"}, + {file = "pillow-12.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cad302dc10fac357d3467a74a9561c90609768a6f73a1923b0fd851b6486f8b0"}, + {file = "pillow-12.1.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a40905599d8079e09f25027423aed94f2823adaf2868940de991e53a449e14a8"}, + {file = "pillow-12.1.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:92a7fe4225365c5e3a8e598982269c6d6698d3e783b3b1ae979e7819f9cd55c1"}, + {file = "pillow-12.1.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f10c98f49227ed8383d28174ee95155a675c4ed7f85e2e573b04414f7e371bda"}, + {file = "pillow-12.1.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8637e29d13f478bc4f153d8daa9ffb16455f0a6cb287da1b432fdad2bfbd66c7"}, + {file = "pillow-12.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:21e686a21078b0f9cb8c8a961d99e6a4ddb88e0fc5ea6e130172ddddc2e5221a"}, + {file = "pillow-12.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2415373395a831f53933c23ce051021e79c8cd7979822d8cc478547a3f4da8ef"}, + {file = "pillow-12.1.0-cp310-cp310-win32.whl", hash = "sha256:e75d3dba8fc1ddfec0cd752108f93b83b4f8d6ab40e524a95d35f016b9683b09"}, + {file = "pillow-12.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:64efdf00c09e31efd754448a383ea241f55a994fd079866b92d2bbff598aad91"}, + {file = "pillow-12.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:f188028b5af6b8fb2e9a76ac0f841a575bd1bd396e46ef0840d9b88a48fdbcea"}, + {file = "pillow-12.1.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:a83e0850cb8f5ac975291ebfc4170ba481f41a28065277f7f735c202cd8e0af3"}, + {file = "pillow-12.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b6e53e82ec2db0717eabb276aa56cf4e500c9a7cec2c2e189b55c24f65a3e8c0"}, + {file = "pillow-12.1.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:40a8e3b9e8773876d6e30daed22f016509e3987bab61b3b7fe309d7019a87451"}, + {file = "pillow-12.1.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:800429ac32c9b72909c671aaf17ecd13110f823ddb7db4dfef412a5587c2c24e"}, + {file = "pillow-12.1.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b022eaaf709541b391ee069f0022ee5b36c709df71986e3f7be312e46f42c84"}, + {file = "pillow-12.1.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1f345e7bc9d7f368887c712aa5054558bad44d2a301ddf9248599f4161abc7c0"}, + {file = "pillow-12.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d70347c8a5b7ccd803ec0c85c8709f036e6348f1e6a5bf048ecd9c64d3550b8b"}, + {file = "pillow-12.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1fcc52d86ce7a34fd17cb04e87cfdb164648a3662a6f20565910a99653d66c18"}, + {file = "pillow-12.1.0-cp311-cp311-win32.whl", hash = "sha256:3ffaa2f0659e2f740473bcf03c702c39a8d4b2b7ffc629052028764324842c64"}, + {file = "pillow-12.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:806f3987ffe10e867bab0ddad45df1148a2b98221798457fa097ad85d6e8bc75"}, + {file = "pillow-12.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:9f5fefaca968e700ad1a4a9de98bf0869a94e397fe3524c4c9450c1445252304"}, + {file = "pillow-12.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a332ac4ccb84b6dde65dbace8431f3af08874bf9770719d32a635c4ef411b18b"}, + {file = "pillow-12.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:907bfa8a9cb790748a9aa4513e37c88c59660da3bcfffbd24a7d9e6abf224551"}, + {file = "pillow-12.1.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:efdc140e7b63b8f739d09a99033aa430accce485ff78e6d311973a67b6bf3208"}, + {file = "pillow-12.1.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bef9768cab184e7ae6e559c032e95ba8d07b3023c289f79a2bd36e8bf85605a5"}, + {file = "pillow-12.1.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:742aea052cf5ab5034a53c3846165bc3ce88d7c38e954120db0ab867ca242661"}, + {file = "pillow-12.1.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a6dfc2af5b082b635af6e08e0d1f9f1c4e04d17d4e2ca0ef96131e85eda6eb17"}, + {file = "pillow-12.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:609e89d9f90b581c8d16358c9087df76024cf058fa693dd3e1e1620823f39670"}, + {file = "pillow-12.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:43b4899cfd091a9693a1278c4982f3e50f7fb7cff5153b05174b4afc9593b616"}, + {file = "pillow-12.1.0-cp312-cp312-win32.whl", hash = "sha256:aa0c9cc0b82b14766a99fbe6084409972266e82f459821cd26997a488a7261a7"}, + {file = "pillow-12.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:d70534cea9e7966169ad29a903b99fc507e932069a881d0965a1a84bb57f6c6d"}, + {file = "pillow-12.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:65b80c1ee7e14a87d6a068dd3b0aea268ffcabfe0498d38661b00c5b4b22e74c"}, + {file = "pillow-12.1.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:7b5dd7cbae20285cdb597b10eb5a2c13aa9de6cde9bb64a3c1317427b1db1ae1"}, + {file = "pillow-12.1.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:29a4cef9cb672363926f0470afc516dbf7305a14d8c54f7abbb5c199cd8f8179"}, + {file = "pillow-12.1.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:681088909d7e8fa9e31b9799aaa59ba5234c58e5e4f1951b4c4d1082a2e980e0"}, + {file = "pillow-12.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:983976c2ab753166dc66d36af6e8ec15bb511e4a25856e2227e5f7e00a160587"}, + {file = "pillow-12.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:db44d5c160a90df2d24a24760bbd37607d53da0b34fb546c4c232af7192298ac"}, + {file = "pillow-12.1.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6b7a9d1db5dad90e2991645874f708e87d9a3c370c243c2d7684d28f7e133e6b"}, + {file = "pillow-12.1.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6258f3260986990ba2fa8a874f8b6e808cf5abb51a94015ca3dc3c68aa4f30ea"}, + {file = "pillow-12.1.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e115c15e3bc727b1ca3e641a909f77f8ca72a64fff150f666fcc85e57701c26c"}, + {file = "pillow-12.1.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6741e6f3074a35e47c77b23a4e4f2d90db3ed905cb1c5e6e0d49bff2045632bc"}, + {file = "pillow-12.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:935b9d1aed48fcfb3f838caac506f38e29621b44ccc4f8a64d575cb1b2a88644"}, + {file = "pillow-12.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5fee4c04aad8932da9f8f710af2c1a15a83582cfb884152a9caa79d4efcdbf9c"}, + {file = "pillow-12.1.0-cp313-cp313-win32.whl", hash = "sha256:a786bf667724d84aa29b5db1c61b7bfdde380202aaca12c3461afd6b71743171"}, + {file = "pillow-12.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:461f9dfdafa394c59cd6d818bdfdbab4028b83b02caadaff0ffd433faf4c9a7a"}, + {file = "pillow-12.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:9212d6b86917a2300669511ed094a9406888362e085f2431a7da985a6b124f45"}, + {file = "pillow-12.1.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:00162e9ca6d22b7c3ee8e61faa3c3253cd19b6a37f126cad04f2f88b306f557d"}, + {file = "pillow-12.1.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7d6daa89a00b58c37cb1747ec9fb7ac3bc5ffd5949f5888657dfddde6d1312e0"}, + {file = "pillow-12.1.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e2479c7f02f9d505682dc47df8c0ea1fc5e264c4d1629a5d63fe3e2334b89554"}, + {file = "pillow-12.1.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f188d580bd870cda1e15183790d1cc2fa78f666e76077d103edf048eed9c356e"}, + {file = "pillow-12.1.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0fde7ec5538ab5095cc02df38ee99b0443ff0e1c847a045554cf5f9af1f4aa82"}, + {file = "pillow-12.1.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0ed07dca4a8464bada6139ab38f5382f83e5f111698caf3191cb8dbf27d908b4"}, + {file = "pillow-12.1.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:f45bd71d1fa5e5749587613037b172e0b3b23159d1c00ef2fc920da6f470e6f0"}, + {file = "pillow-12.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:277518bf4fe74aa91489e1b20577473b19ee70fb97c374aa50830b279f25841b"}, + {file = "pillow-12.1.0-cp313-cp313t-win32.whl", hash = "sha256:7315f9137087c4e0ee73a761b163fc9aa3b19f5f606a7fc08d83fd3e4379af65"}, + {file = "pillow-12.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:0ddedfaa8b5f0b4ffbc2fa87b556dc59f6bb4ecb14a53b33f9189713ae8053c0"}, + {file = "pillow-12.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:80941e6d573197a0c28f394753de529bb436b1ca990ed6e765cf42426abc39f8"}, + {file = "pillow-12.1.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:5cb7bc1966d031aec37ddb9dcf15c2da5b2e9f7cc3ca7c54473a20a927e1eb91"}, + {file = "pillow-12.1.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:97e9993d5ed946aba26baf9c1e8cf18adbab584b99f452ee72f7ee8acb882796"}, + {file = "pillow-12.1.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:414b9a78e14ffeb98128863314e62c3f24b8a86081066625700b7985b3f529bd"}, + {file = "pillow-12.1.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:e6bdb408f7c9dd2a5ff2b14a3b0bb6d4deb29fb9961e6eb3ae2031ae9a5cec13"}, + {file = "pillow-12.1.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:3413c2ae377550f5487991d444428f1a8ae92784aac79caa8b1e3b89b175f77e"}, + {file = "pillow-12.1.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e5dcbe95016e88437ecf33544ba5db21ef1b8dd6e1b434a2cb2a3d605299e643"}, + {file = "pillow-12.1.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d0a7735df32ccbcc98b98a1ac785cc4b19b580be1bdf0aeb5c03223220ea09d5"}, + {file = "pillow-12.1.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0c27407a2d1b96774cbc4a7594129cc027339fd800cd081e44497722ea1179de"}, + {file = "pillow-12.1.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15c794d74303828eaa957ff8070846d0efe8c630901a1c753fdc63850e19ecd9"}, + {file = "pillow-12.1.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c990547452ee2800d8506c4150280757f88532f3de2a58e3022e9b179107862a"}, + {file = "pillow-12.1.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b63e13dd27da389ed9475b3d28510f0f954bca0041e8e551b2a4eb1eab56a39a"}, + {file = "pillow-12.1.0-cp314-cp314-win32.whl", hash = "sha256:1a949604f73eb07a8adab38c4fe50791f9919344398bdc8ac6b307f755fc7030"}, + {file = "pillow-12.1.0-cp314-cp314-win_amd64.whl", hash = "sha256:4f9f6a650743f0ddee5593ac9e954ba1bdbc5e150bc066586d4f26127853ab94"}, + {file = "pillow-12.1.0-cp314-cp314-win_arm64.whl", hash = "sha256:808b99604f7873c800c4840f55ff389936ef1948e4e87645eaf3fccbc8477ac4"}, + {file = "pillow-12.1.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:bc11908616c8a283cf7d664f77411a5ed2a02009b0097ff8abbba5e79128ccf2"}, + {file = "pillow-12.1.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:896866d2d436563fa2a43a9d72f417874f16b5545955c54a64941e87c1376c61"}, + {file = "pillow-12.1.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8e178e3e99d3c0ea8fc64b88447f7cac8ccf058af422a6cedc690d0eadd98c51"}, + {file = "pillow-12.1.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:079af2fb0c599c2ec144ba2c02766d1b55498e373b3ac64687e43849fbbef5bc"}, + {file = "pillow-12.1.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bdec5e43377761c5dbca620efb69a77f6855c5a379e32ac5b158f54c84212b14"}, + {file = "pillow-12.1.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:565c986f4b45c020f5421a4cea13ef294dde9509a8577f29b2fc5edc7587fff8"}, + {file = "pillow-12.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:43aca0a55ce1eefc0aefa6253661cb54571857b1a7b2964bd8a1e3ef4b729924"}, + {file = "pillow-12.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0deedf2ea233722476b3a81e8cdfbad786f7adbed5d848469fa59fe52396e4ef"}, + {file = "pillow-12.1.0-cp314-cp314t-win32.whl", hash = "sha256:b17fbdbe01c196e7e159aacb889e091f28e61020a8abeac07b68079b6e626988"}, + {file = "pillow-12.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:27b9baecb428899db6c0de572d6d305cfaf38ca1596b5c0542a5182e3e74e8c6"}, + {file = "pillow-12.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:f61333d817698bdcdd0f9d7793e365ac3d2a21c1f1eb02b32ad6aefb8d8ea831"}, + {file = "pillow-12.1.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ca94b6aac0d7af2a10ba08c0f888b3d5114439b6b3ef39968378723622fed377"}, + {file = "pillow-12.1.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:351889afef0f485b84078ea40fe33727a0492b9af3904661b0abbafee0355b72"}, + {file = "pillow-12.1.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bb0984b30e973f7e2884362b7d23d0a348c7143ee559f38ef3eaab640144204c"}, + {file = "pillow-12.1.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:84cabc7095dd535ca934d57e9ce2a72ffd216e435a84acb06b2277b1de2689bd"}, + {file = "pillow-12.1.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53d8b764726d3af1a138dd353116f774e3862ec7e3794e0c8781e30db0f35dfc"}, + {file = "pillow-12.1.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5da841d81b1a05ef940a8567da92decaa15bc4d7dedb540a8c219ad83d91808a"}, + {file = "pillow-12.1.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:75af0b4c229ac519b155028fa1be632d812a519abba9b46b20e50c6caa184f19"}, + {file = "pillow-12.1.0.tar.gz", hash = "sha256:5c5ae0a06e9ea030ab786b0251b32c7e4ce10e58d983c0d5c56029455180b5b9"}, ] [package.extras] -docs = ["furo", "olefile", "sphinx (>=8.2)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] +docs = ["furo", "olefile", "sphinx (>=8.2)", "sphinx-autobuild", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] fpx = ["olefile"] mic = ["olefile"] -test-arrow = ["pyarrow"] -tests = ["check-manifest", "coverage (>=7.4.2)", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout", "trove-classifiers (>=2024.10.12)"] -typing = ["typing-extensions ; python_version < \"3.10\""] +test-arrow = ["arro3-compute", "arro3-core", "nanoarrow", "pyarrow"] +tests = ["check-manifest", "coverage (>=7.4.2)", "defusedxml", "markdown2", "olefile", "packaging", "pyroma (>=5)", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "trove-classifiers (>=2024.10.12)"] xmp = ["defusedxml"] [[package]] @@ -2831,31 +3274,31 @@ testing = ["pytest", "pytest-cov", "wheel"] [[package]] name = "platformdirs" -version = "4.3.8" +version = "4.5.1" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["main", "development"] files = [ - {file = "platformdirs-4.3.8-py3-none-any.whl", hash = "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4"}, - {file = "platformdirs-4.3.8.tar.gz", hash = "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc"}, + {file = "platformdirs-4.5.1-py3-none-any.whl", hash = "sha256:d03afa3963c806a9bed9d5125c8f4cb2fdaf74a55ab60e5d59b3fde758104d31"}, + {file = "platformdirs-4.5.1.tar.gz", hash = "sha256:61d5cdcc6065745cdd94f0f878977f8de9437be93de97c1c12f853c9c0cdcbda"}, ] [package.extras] -docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.1.3)", "sphinx-autodoc-typehints (>=3)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.4)", "pytest-cov (>=6)", "pytest-mock (>=3.14)"] -type = ["mypy (>=1.14.1)"] +docs = ["furo (>=2025.9.25)", "proselint (>=0.14)", "sphinx (>=8.2.3)", "sphinx-autodoc-typehints (>=3.2)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.4.2)", "pytest-cov (>=7)", "pytest-mock (>=3.15.1)"] +type = ["mypy (>=1.18.2)"] [[package]] name = "plotly" -version = "6.0.1" +version = "6.5.2" description = "An open-source interactive data visualization library for Python" optional = false python-versions = ">=3.8" groups = ["main"] files = [ - {file = "plotly-6.0.1-py3-none-any.whl", hash = "sha256:4714db20fea57a435692c548a4eb4fae454f7daddf15f8d8ba7e1045681d7768"}, - {file = "plotly-6.0.1.tar.gz", hash = "sha256:dd8400229872b6e3c964b099be699f8d00c489a974f2cfccfad5e8240873366b"}, + {file = "plotly-6.5.2-py3-none-any.whl", hash = "sha256:91757653bd9c550eeea2fa2404dba6b85d1e366d54804c340b2c874e5a7eb4a4"}, + {file = "plotly-6.5.2.tar.gz", hash = "sha256:7478555be0198562d1435dee4c308268187553cc15516a2f4dd034453699e393"}, ] [package.dependencies] @@ -2863,81 +3306,86 @@ narwhals = ">=1.15.1" packaging = "*" [package.extras] +dev = ["plotly[dev-optional]"] +dev-build = ["build", "jupyter", "plotly[dev-core]"] +dev-core = ["pytest", "requests", "ruff (==0.11.12)"] +dev-optional = ["anywidget", "colorcet", "fiona (<=1.9.6) ; python_version <= \"3.8\"", "geopandas", "inflect", "numpy", "orjson", "pandas", "pdfrw", "pillow", "plotly-geo", "plotly[dev-build]", "plotly[kaleido]", "polars[timezone]", "pyarrow", "pyshp", "pytz", "scikit-image", "scipy", "shapely", "statsmodels", "vaex ; python_version <= \"3.9\"", "xarray"] express = ["numpy"] +kaleido = ["kaleido (>=1.1.0)"] [[package]] name = "pluggy" -version = "1.5.0" +version = "1.6.0" description = "plugin and hook calling mechanisms for python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main", "development"] files = [ - {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, - {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, + {file = "pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746"}, + {file = "pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3"}, ] [package.extras] dev = ["pre-commit", "tox"] -testing = ["pytest", "pytest-benchmark"] +testing = ["coverage", "pytest", "pytest-benchmark"] [[package]] name = "poetry" -version = "2.1.3" +version = "2.3.2" description = "Python dependency management and packaging made easy." optional = false -python-versions = "<4.0,>=3.9" +python-versions = "<4.0,>=3.10" groups = ["main"] files = [ - {file = "poetry-2.1.3-py3-none-any.whl", hash = "sha256:7054d3f97ccce7f31961ead16250407c4577bfe57e2037a190ae2913fc40a20c"}, - {file = "poetry-2.1.3.tar.gz", hash = "sha256:f2c9bd6790b19475976d88ea4553bcc3533c0dc73f740edc4fffe9e2add50594"}, + {file = "poetry-2.3.2-py3-none-any.whl", hash = "sha256:4b64412c61b4de2c7268ffebbde7d564b655a37d29c2cd82bf1b52f15c8066b4"}, + {file = "poetry-2.3.2.tar.gz", hash = "sha256:6e81526ae99a4f07f75174600bfe8b73e74c786dc18c9d1ce1800dd6f807414b"}, ] [package.dependencies] build = ">=1.2.1,<2.0.0" cachecontrol = {version = ">=0.14.0,<0.15.0", extras = ["filecache"]} cleo = ">=2.1.0,<3.0.0" -dulwich = ">=0.22.6,<0.23.0" +dulwich = ">=0.25.0,<2" fastjsonschema = ">=2.18.0,<3.0.0" -findpython = ">=0.6.2,<0.7.0" +findpython = ">=0.6.2,<0.8.0" installer = ">=0.7.0,<0.8.0" keyring = ">=25.1.0,<26.0.0" -packaging = ">=24.0" -pbs-installer = {version = ">=2025.1.6,<2026.0.0", extras = ["download", "install"]} +packaging = ">=24.2" +pbs-installer = {version = ">=2025.6.10", extras = ["download", "install"]} pkginfo = ">=1.12,<2.0" platformdirs = ">=3.0.0,<5" -poetry-core = "2.1.3" +poetry-core = "2.3.1" pyproject-hooks = ">=1.0.0,<2.0.0" requests = ">=2.26,<3.0" requests-toolbelt = ">=1.0.0,<2.0.0" shellingham = ">=1.5,<2.0" tomlkit = ">=0.11.4,<1.0.0" trove-classifiers = ">=2022.5.19" -virtualenv = ">=20.26.6,<21.0.0" +virtualenv = ">=20.26.6" xattr = {version = ">=1.0.0,<2.0.0", markers = "sys_platform == \"darwin\""} [[package]] name = "poetry-core" -version = "2.1.3" +version = "2.3.1" description = "Poetry PEP 517 Build Backend" optional = false -python-versions = "<4.0,>=3.9" +python-versions = "<4.0,>=3.10" groups = ["main"] files = [ - {file = "poetry_core-2.1.3-py3-none-any.whl", hash = "sha256:2c704f05016698a54ca1d327f46ce2426d72eaca6ff614132c8477c292266771"}, - {file = "poetry_core-2.1.3.tar.gz", hash = "sha256:0522a015477ed622c89aad56a477a57813cace0c8e7ff2a2906b7ef4a2e296a4"}, + {file = "poetry_core-2.3.1-py3-none-any.whl", hash = "sha256:db1cf63b782570deb38bfba61e2304a553eef0740dc17959a50cc0f5115ee634"}, + {file = "poetry_core-2.3.1.tar.gz", hash = "sha256:96f791d5d7d4e040f3983d76779425cf9532690e2756a24fd5ca0f86af19ef82"}, ] [[package]] name = "pre-commit" -version = "4.2.0" +version = "4.5.1" description = "A framework for managing and maintaining multi-language pre-commit hooks." optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["development"] files = [ - {file = "pre_commit-4.2.0-py2.py3-none-any.whl", hash = "sha256:a009ca7205f1eb497d10b845e52c838a98b6cdd2102a6c8e4540e94ee75c58bd"}, - {file = "pre_commit-4.2.0.tar.gz", hash = "sha256:601283b9757afd87d40c4c4a9b2b5de9637a8ea02eaff7adc2d0fb4e04841146"}, + {file = "pre_commit-4.5.1-py2.py3-none-any.whl", hash = "sha256:3b3afd891e97337708c1674210f8eba659b52a38ea5f822ff142d10786221f77"}, + {file = "pre_commit-4.5.1.tar.gz", hash = "sha256:eb545fcff725875197837263e977ea257a402056661f09dae08e4b149b030a61"}, ] [package.dependencies] @@ -2949,14 +3397,14 @@ virtualenv = ">=20.10.0" [[package]] name = "pre-commit-hooks" -version = "5.0.0" +version = "6.0.0" description = "Some out-of-the-box hooks for pre-commit." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["development"] files = [ - {file = "pre_commit_hooks-5.0.0-py2.py3-none-any.whl", hash = "sha256:8d71cfb582c5c314a5498d94e0104b6567a8b93fb35903ea845c491f4e290a7a"}, - {file = "pre_commit_hooks-5.0.0.tar.gz", hash = "sha256:10626959a9eaf602fbfc22bc61b6e75801436f82326bfcee82bb1f2fc4bc646e"}, + {file = "pre_commit_hooks-6.0.0-py2.py3-none-any.whl", hash = "sha256:76161b76d321d2f8ee2a8e0b84c30ee8443e01376121fd1c90851e33e3bd7ee2"}, + {file = "pre_commit_hooks-6.0.0.tar.gz", hash = "sha256:76d8370c006f5026cdd638a397a678d26dda735a3c88137e05885a020f824034"}, ] [package.dependencies] @@ -2964,161 +3412,433 @@ files = [ [[package]] name = "propcache" -version = "0.3.1" +version = "0.4.1" description = "Accelerated property cache" optional = false python-versions = ">=3.9" +groups = ["main", "torch-cuda"] +files = [ + {file = "propcache-0.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c2d1fa3201efaf55d730400d945b5b3ab6e672e100ba0f9a409d950ab25d7db"}, + {file = "propcache-0.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1eb2994229cc8ce7fe9b3db88f5465f5fd8651672840b2e426b88cdb1a30aac8"}, + {file = "propcache-0.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:66c1f011f45a3b33d7bcb22daed4b29c0c9e2224758b6be00686731e1b46f925"}, + {file = "propcache-0.4.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9a52009f2adffe195d0b605c25ec929d26b36ef986ba85244891dee3b294df21"}, + {file = "propcache-0.4.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5d4e2366a9c7b837555cf02fb9be2e3167d333aff716332ef1b7c3a142ec40c5"}, + {file = "propcache-0.4.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:9d2b6caef873b4f09e26ea7e33d65f42b944837563a47a94719cc3544319a0db"}, + {file = "propcache-0.4.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2b16ec437a8c8a965ecf95739448dd938b5c7f56e67ea009f4300d8df05f32b7"}, + {file = "propcache-0.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:296f4c8ed03ca7476813fe666c9ea97869a8d7aec972618671b33a38a5182ef4"}, + {file = "propcache-0.4.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:1f0978529a418ebd1f49dad413a2b68af33f85d5c5ca5c6ca2a3bed375a7ac60"}, + {file = "propcache-0.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fd138803047fb4c062b1c1dd95462f5209456bfab55c734458f15d11da288f8f"}, + {file = "propcache-0.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8c9b3cbe4584636d72ff556d9036e0c9317fa27b3ac1f0f558e7e84d1c9c5900"}, + {file = "propcache-0.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f93243fdc5657247533273ac4f86ae106cc6445a0efacb9a1bfe982fcfefd90c"}, + {file = "propcache-0.4.1-cp310-cp310-win32.whl", hash = "sha256:a0ee98db9c5f80785b266eb805016e36058ac72c51a064040f2bc43b61101cdb"}, + {file = "propcache-0.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:1cdb7988c4e5ac7f6d175a28a9aa0c94cb6f2ebe52756a3c0cda98d2809a9e37"}, + {file = "propcache-0.4.1-cp310-cp310-win_arm64.whl", hash = "sha256:d82ad62b19645419fe79dd63b3f9253e15b30e955c0170e5cebc350c1844e581"}, + {file = "propcache-0.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:60a8fda9644b7dfd5dece8c61d8a85e271cb958075bfc4e01083c148b61a7caf"}, + {file = "propcache-0.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c30b53e7e6bda1d547cabb47c825f3843a0a1a42b0496087bb58d8fedf9f41b5"}, + {file = "propcache-0.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6918ecbd897443087a3b7cd978d56546a812517dcaaca51b49526720571fa93e"}, + {file = "propcache-0.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3d902a36df4e5989763425a8ab9e98cd8ad5c52c823b34ee7ef307fd50582566"}, + {file = "propcache-0.4.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a9695397f85973bb40427dedddf70d8dc4a44b22f1650dd4af9eedf443d45165"}, + {file = "propcache-0.4.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2bb07ffd7eaad486576430c89f9b215f9e4be68c4866a96e97db9e97fead85dc"}, + {file = "propcache-0.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fd6f30fdcf9ae2a70abd34da54f18da086160e4d7d9251f81f3da0ff84fc5a48"}, + {file = "propcache-0.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fc38cba02d1acba4e2869eef1a57a43dfbd3d49a59bf90dda7444ec2be6a5570"}, + {file = "propcache-0.4.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:67fad6162281e80e882fb3ec355398cf72864a54069d060321f6cd0ade95fe85"}, + {file = "propcache-0.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f10207adf04d08bec185bae14d9606a1444715bc99180f9331c9c02093e1959e"}, + {file = "propcache-0.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e9b0d8d0845bbc4cfcdcbcdbf5086886bc8157aa963c31c777ceff7846c77757"}, + {file = "propcache-0.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:981333cb2f4c1896a12f4ab92a9cc8f09ea664e9b7dbdc4eff74627af3a11c0f"}, + {file = "propcache-0.4.1-cp311-cp311-win32.whl", hash = "sha256:f1d2f90aeec838a52f1c1a32fe9a619fefd5e411721a9117fbf82aea638fe8a1"}, + {file = "propcache-0.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:364426a62660f3f699949ac8c621aad6977be7126c5807ce48c0aeb8e7333ea6"}, + {file = "propcache-0.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:e53f3a38d3510c11953f3e6a33f205c6d1b001129f972805ca9b42fc308bc239"}, + {file = "propcache-0.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e153e9cd40cc8945138822807139367f256f89c6810c2634a4f6902b52d3b4e2"}, + {file = "propcache-0.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cd547953428f7abb73c5ad82cbb32109566204260d98e41e5dfdc682eb7f8403"}, + {file = "propcache-0.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f048da1b4f243fc44f205dfd320933a951b8d89e0afd4c7cacc762a8b9165207"}, + {file = "propcache-0.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ec17c65562a827bba85e3872ead335f95405ea1674860d96483a02f5c698fa72"}, + {file = "propcache-0.4.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:405aac25c6394ef275dee4c709be43745d36674b223ba4eb7144bf4d691b7367"}, + {file = "propcache-0.4.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0013cb6f8dde4b2a2f66903b8ba740bdfe378c943c4377a200551ceb27f379e4"}, + {file = "propcache-0.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15932ab57837c3368b024473a525e25d316d8353016e7cc0e5ba9eb343fbb1cf"}, + {file = "propcache-0.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:031dce78b9dc099f4c29785d9cf5577a3faf9ebf74ecbd3c856a7b92768c3df3"}, + {file = "propcache-0.4.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ab08df6c9a035bee56e31af99be621526bd237bea9f32def431c656b29e41778"}, + {file = "propcache-0.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4d7af63f9f93fe593afbf104c21b3b15868efb2c21d07d8732c0c4287e66b6a6"}, + {file = "propcache-0.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:cfc27c945f422e8b5071b6e93169679e4eb5bf73bbcbf1ba3ae3a83d2f78ebd9"}, + {file = "propcache-0.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:35c3277624a080cc6ec6f847cbbbb5b49affa3598c4535a0a4682a697aaa5c75"}, + {file = "propcache-0.4.1-cp312-cp312-win32.whl", hash = "sha256:671538c2262dadb5ba6395e26c1731e1d52534bfe9ae56d0b5573ce539266aa8"}, + {file = "propcache-0.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:cb2d222e72399fcf5890d1d5cc1060857b9b236adff2792ff48ca2dfd46c81db"}, + {file = "propcache-0.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:204483131fb222bdaaeeea9f9e6c6ed0cac32731f75dfc1d4a567fc1926477c1"}, + {file = "propcache-0.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:43eedf29202c08550aac1d14e0ee619b0430aaef78f85864c1a892294fbc28cf"}, + {file = "propcache-0.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d62cdfcfd89ccb8de04e0eda998535c406bf5e060ffd56be6c586cbcc05b3311"}, + {file = "propcache-0.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cae65ad55793da34db5f54e4029b89d3b9b9490d8abe1b4c7ab5d4b8ec7ebf74"}, + {file = "propcache-0.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:333ddb9031d2704a301ee3e506dc46b1fe5f294ec198ed6435ad5b6a085facfe"}, + {file = "propcache-0.4.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:fd0858c20f078a32cf55f7e81473d96dcf3b93fd2ccdb3d40fdf54b8573df3af"}, + {file = "propcache-0.4.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:678ae89ebc632c5c204c794f8dab2837c5f159aeb59e6ed0539500400577298c"}, + {file = "propcache-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d472aeb4fbf9865e0c6d622d7f4d54a4e101a89715d8904282bb5f9a2f476c3f"}, + {file = "propcache-0.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4d3df5fa7e36b3225954fba85589da77a0fe6a53e3976de39caf04a0db4c36f1"}, + {file = "propcache-0.4.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:ee17f18d2498f2673e432faaa71698032b0127ebf23ae5974eeaf806c279df24"}, + {file = "propcache-0.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:580e97762b950f993ae618e167e7be9256b8353c2dcd8b99ec100eb50f5286aa"}, + {file = "propcache-0.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:501d20b891688eb8e7aa903021f0b72d5a55db40ffaab27edefd1027caaafa61"}, + {file = "propcache-0.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a0bd56e5b100aef69bd8562b74b46254e7c8812918d3baa700c8a8009b0af66"}, + {file = "propcache-0.4.1-cp313-cp313-win32.whl", hash = "sha256:bcc9aaa5d80322bc2fb24bb7accb4a30f81e90ab8d6ba187aec0744bc302ad81"}, + {file = "propcache-0.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:381914df18634f5494334d201e98245c0596067504b9372d8cf93f4bb23e025e"}, + {file = "propcache-0.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:8873eb4460fd55333ea49b7d189749ecf6e55bf85080f11b1c4530ed3034cba1"}, + {file = "propcache-0.4.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:92d1935ee1f8d7442da9c0c4fa7ac20d07e94064184811b685f5c4fada64553b"}, + {file = "propcache-0.4.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:473c61b39e1460d386479b9b2f337da492042447c9b685f28be4f74d3529e566"}, + {file = "propcache-0.4.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c0ef0aaafc66fbd87842a3fe3902fd889825646bc21149eafe47be6072725835"}, + {file = "propcache-0.4.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f95393b4d66bfae908c3ca8d169d5f79cd65636ae15b5e7a4f6e67af675adb0e"}, + {file = "propcache-0.4.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c07fda85708bc48578467e85099645167a955ba093be0a2dcba962195676e859"}, + {file = "propcache-0.4.1-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:af223b406d6d000830c6f65f1e6431783fc3f713ba3e6cc8c024d5ee96170a4b"}, + {file = "propcache-0.4.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a78372c932c90ee474559c5ddfffd718238e8673c340dc21fe45c5b8b54559a0"}, + {file = "propcache-0.4.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:564d9f0d4d9509e1a870c920a89b2fec951b44bf5ba7d537a9e7c1ccec2c18af"}, + {file = "propcache-0.4.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:17612831fda0138059cc5546f4d12a2aacfb9e47068c06af35c400ba58ba7393"}, + {file = "propcache-0.4.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:41a89040cb10bd345b3c1a873b2bf36413d48da1def52f268a055f7398514874"}, + {file = "propcache-0.4.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e35b88984e7fa64aacecea39236cee32dd9bd8c55f57ba8a75cf2399553f9bd7"}, + {file = "propcache-0.4.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f8b465489f927b0df505cbe26ffbeed4d6d8a2bbc61ce90eb074ff129ef0ab1"}, + {file = "propcache-0.4.1-cp313-cp313t-win32.whl", hash = "sha256:2ad890caa1d928c7c2965b48f3a3815c853180831d0e5503d35cf00c472f4717"}, + {file = "propcache-0.4.1-cp313-cp313t-win_amd64.whl", hash = "sha256:f7ee0e597f495cf415bcbd3da3caa3bd7e816b74d0d52b8145954c5e6fd3ff37"}, + {file = "propcache-0.4.1-cp313-cp313t-win_arm64.whl", hash = "sha256:929d7cbe1f01bb7baffb33dc14eb5691c95831450a26354cd210a8155170c93a"}, + {file = "propcache-0.4.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3f7124c9d820ba5548d431afb4632301acf965db49e666aa21c305cbe8c6de12"}, + {file = "propcache-0.4.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:c0d4b719b7da33599dfe3b22d3db1ef789210a0597bc650b7cee9c77c2be8c5c"}, + {file = "propcache-0.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9f302f4783709a78240ebc311b793f123328716a60911d667e0c036bc5dcbded"}, + {file = "propcache-0.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c80ee5802e3fb9ea37938e7eecc307fb984837091d5fd262bb37238b1ae97641"}, + {file = "propcache-0.4.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ed5a841e8bb29a55fb8159ed526b26adc5bdd7e8bd7bf793ce647cb08656cdf4"}, + {file = "propcache-0.4.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:55c72fd6ea2da4c318e74ffdf93c4fe4e926051133657459131a95c846d16d44"}, + {file = "propcache-0.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8326e144341460402713f91df60ade3c999d601e7eb5ff8f6f7862d54de0610d"}, + {file = "propcache-0.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:060b16ae65bc098da7f6d25bf359f1f31f688384858204fe5d652979e0015e5b"}, + {file = "propcache-0.4.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:89eb3fa9524f7bec9de6e83cf3faed9d79bffa560672c118a96a171a6f55831e"}, + {file = "propcache-0.4.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:dee69d7015dc235f526fe80a9c90d65eb0039103fe565776250881731f06349f"}, + {file = "propcache-0.4.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:5558992a00dfd54ccbc64a32726a3357ec93825a418a401f5cc67df0ac5d9e49"}, + {file = "propcache-0.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c9b822a577f560fbd9554812526831712c1436d2c046cedee4c3796d3543b144"}, + {file = "propcache-0.4.1-cp314-cp314-win32.whl", hash = "sha256:ab4c29b49d560fe48b696cdcb127dd36e0bc2472548f3bf56cc5cb3da2b2984f"}, + {file = "propcache-0.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:5a103c3eb905fcea0ab98be99c3a9a5ab2de60228aa5aceedc614c0281cf6153"}, + {file = "propcache-0.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:74c1fb26515153e482e00177a1ad654721bf9207da8a494a0c05e797ad27b992"}, + {file = "propcache-0.4.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:824e908bce90fb2743bd6b59db36eb4f45cd350a39637c9f73b1c1ea66f5b75f"}, + {file = "propcache-0.4.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:c2b5e7db5328427c57c8e8831abda175421b709672f6cfc3d630c3b7e2146393"}, + {file = "propcache-0.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6f6ff873ed40292cd4969ef5310179afd5db59fdf055897e282485043fc80ad0"}, + {file = "propcache-0.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:49a2dc67c154db2c1463013594c458881a069fcf98940e61a0569016a583020a"}, + {file = "propcache-0.4.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:005f08e6a0529984491e37d8dbc3dd86f84bd78a8ceb5fa9a021f4c48d4984be"}, + {file = "propcache-0.4.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5c3310452e0d31390da9035c348633b43d7e7feb2e37be252be6da45abd1abcc"}, + {file = "propcache-0.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4c3c70630930447f9ef1caac7728c8ad1c56bc5015338b20fed0d08ea2480b3a"}, + {file = "propcache-0.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8e57061305815dfc910a3634dcf584f08168a8836e6999983569f51a8544cd89"}, + {file = "propcache-0.4.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:521a463429ef54143092c11a77e04056dd00636f72e8c45b70aaa3140d639726"}, + {file = "propcache-0.4.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:120c964da3fdc75e3731aa392527136d4ad35868cc556fd09bb6d09172d9a367"}, + {file = "propcache-0.4.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:d8f353eb14ee3441ee844ade4277d560cdd68288838673273b978e3d6d2c8f36"}, + {file = "propcache-0.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ab2943be7c652f09638800905ee1bab2c544e537edb57d527997a24c13dc1455"}, + {file = "propcache-0.4.1-cp314-cp314t-win32.whl", hash = "sha256:05674a162469f31358c30bcaa8883cb7829fa3110bf9c0991fe27d7896c42d85"}, + {file = "propcache-0.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:990f6b3e2a27d683cb7602ed6c86f15ee6b43b1194736f9baaeb93d0016633b1"}, + {file = "propcache-0.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:ecef2343af4cc68e05131e45024ba34f6095821988a9d0a02aa7c73fcc448aa9"}, + {file = "propcache-0.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3d233076ccf9e450c8b3bc6720af226b898ef5d051a2d145f7d765e6e9f9bcff"}, + {file = "propcache-0.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:357f5bb5c377a82e105e44bd3d52ba22b616f7b9773714bff93573988ef0a5fb"}, + {file = "propcache-0.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cbc3b6dfc728105b2a57c06791eb07a94229202ea75c59db644d7d496b698cac"}, + {file = "propcache-0.4.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:182b51b421f0501952d938dc0b0eb45246a5b5153c50d42b495ad5fb7517c888"}, + {file = "propcache-0.4.1-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4b536b39c5199b96fc6245eb5fb796c497381d3942f169e44e8e392b29c9ebcc"}, + {file = "propcache-0.4.1-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:db65d2af507bbfbdcedb254a11149f894169d90488dd3e7190f7cdcb2d6cd57a"}, + {file = "propcache-0.4.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fd2dbc472da1f772a4dae4fa24be938a6c544671a912e30529984dd80400cd88"}, + {file = "propcache-0.4.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:daede9cd44e0f8bdd9e6cc9a607fc81feb80fae7a5fc6cecaff0e0bb32e42d00"}, + {file = "propcache-0.4.1-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:71b749281b816793678ae7f3d0d84bd36e694953822eaad408d682efc5ca18e0"}, + {file = "propcache-0.4.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:0002004213ee1f36cfb3f9a42b5066100c44276b9b72b4e1504cddd3d692e86e"}, + {file = "propcache-0.4.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:fe49d0a85038f36ba9e3ffafa1103e61170b28e95b16622e11be0a0ea07c6781"}, + {file = "propcache-0.4.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:99d43339c83aaf4d32bda60928231848eee470c6bda8d02599cc4cebe872d183"}, + {file = "propcache-0.4.1-cp39-cp39-win32.whl", hash = "sha256:a129e76735bc792794d5177069691c3217898b9f5cee2b2661471e52ffe13f19"}, + {file = "propcache-0.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:948dab269721ae9a87fd16c514a0a2c2a1bdb23a9a61b969b0f9d9ee2968546f"}, + {file = "propcache-0.4.1-cp39-cp39-win_arm64.whl", hash = "sha256:5fd37c406dd6dc85aa743e214cef35dc54bbdd1419baac4f6ae5e5b1a2976938"}, + {file = "propcache-0.4.1-py3-none-any.whl", hash = "sha256:af2a6052aeb6cf17d3e46ee169099044fd8224cbaf75c76a2ef596e8163e2237"}, + {file = "propcache-0.4.1.tar.gz", hash = "sha256:f48107a8c637e80362555f37ecf49abe20370e557cc4ab374f04ec4423c97c3d"}, +] + +[[package]] +name = "protobuf" +version = "6.33.5" +description = "" +optional = false +python-versions = ">=3.9" groups = ["main"] files = [ - {file = "propcache-0.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f27785888d2fdd918bc36de8b8739f2d6c791399552333721b58193f68ea3e98"}, - {file = "propcache-0.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4e89cde74154c7b5957f87a355bb9c8ec929c167b59c83d90654ea36aeb6180"}, - {file = "propcache-0.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:730178f476ef03d3d4d255f0c9fa186cb1d13fd33ffe89d39f2cda4da90ceb71"}, - {file = "propcache-0.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:967a8eec513dbe08330f10137eacb427b2ca52118769e82ebcfcab0fba92a649"}, - {file = "propcache-0.3.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b9145c35cc87313b5fd480144f8078716007656093d23059e8993d3a8fa730f"}, - {file = "propcache-0.3.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9e64e948ab41411958670f1093c0a57acfdc3bee5cf5b935671bbd5313bcf229"}, - {file = "propcache-0.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:319fa8765bfd6a265e5fa661547556da381e53274bc05094fc9ea50da51bfd46"}, - {file = "propcache-0.3.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c66d8ccbc902ad548312b96ed8d5d266d0d2c6d006fd0f66323e9d8f2dd49be7"}, - {file = "propcache-0.3.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:2d219b0dbabe75e15e581fc1ae796109b07c8ba7d25b9ae8d650da582bed01b0"}, - {file = "propcache-0.3.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:cd6a55f65241c551eb53f8cf4d2f4af33512c39da5d9777694e9d9c60872f519"}, - {file = "propcache-0.3.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9979643ffc69b799d50d3a7b72b5164a2e97e117009d7af6dfdd2ab906cb72cd"}, - {file = "propcache-0.3.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:4cf9e93a81979f1424f1a3d155213dc928f1069d697e4353edb8a5eba67c6259"}, - {file = "propcache-0.3.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2fce1df66915909ff6c824bbb5eb403d2d15f98f1518e583074671a30fe0c21e"}, - {file = "propcache-0.3.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:4d0dfdd9a2ebc77b869a0b04423591ea8823f791293b527dc1bb896c1d6f1136"}, - {file = "propcache-0.3.1-cp310-cp310-win32.whl", hash = "sha256:1f6cc0ad7b4560e5637eb2c994e97b4fa41ba8226069c9277eb5ea7101845b42"}, - {file = "propcache-0.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:47ef24aa6511e388e9894ec16f0fbf3313a53ee68402bc428744a367ec55b833"}, - {file = "propcache-0.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7f30241577d2fef2602113b70ef7231bf4c69a97e04693bde08ddab913ba0ce5"}, - {file = "propcache-0.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:43593c6772aa12abc3af7784bff4a41ffa921608dd38b77cf1dfd7f5c4e71371"}, - {file = "propcache-0.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a75801768bbe65499495660b777e018cbe90c7980f07f8aa57d6be79ea6f71da"}, - {file = "propcache-0.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6f1324db48f001c2ca26a25fa25af60711e09b9aaf4b28488602776f4f9a744"}, - {file = "propcache-0.3.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cdb0f3e1eb6dfc9965d19734d8f9c481b294b5274337a8cb5cb01b462dcb7e0"}, - {file = "propcache-0.3.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1eb34d90aac9bfbced9a58b266f8946cb5935869ff01b164573a7634d39fbcb5"}, - {file = "propcache-0.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f35c7070eeec2cdaac6fd3fe245226ed2a6292d3ee8c938e5bb645b434c5f256"}, - {file = "propcache-0.3.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b23c11c2c9e6d4e7300c92e022046ad09b91fd00e36e83c44483df4afa990073"}, - {file = "propcache-0.3.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3e19ea4ea0bf46179f8a3652ac1426e6dcbaf577ce4b4f65be581e237340420d"}, - {file = "propcache-0.3.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:bd39c92e4c8f6cbf5f08257d6360123af72af9f4da75a690bef50da77362d25f"}, - {file = "propcache-0.3.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b0313e8b923b3814d1c4a524c93dfecea5f39fa95601f6a9b1ac96cd66f89ea0"}, - {file = "propcache-0.3.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e861ad82892408487be144906a368ddbe2dc6297074ade2d892341b35c59844a"}, - {file = "propcache-0.3.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:61014615c1274df8da5991a1e5da85a3ccb00c2d4701ac6f3383afd3ca47ab0a"}, - {file = "propcache-0.3.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:71ebe3fe42656a2328ab08933d420df5f3ab121772eef78f2dc63624157f0ed9"}, - {file = "propcache-0.3.1-cp311-cp311-win32.whl", hash = "sha256:58aa11f4ca8b60113d4b8e32d37e7e78bd8af4d1a5b5cb4979ed856a45e62005"}, - {file = "propcache-0.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:9532ea0b26a401264b1365146c440a6d78269ed41f83f23818d4b79497aeabe7"}, - {file = "propcache-0.3.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f78eb8422acc93d7b69964012ad7048764bb45a54ba7a39bb9e146c72ea29723"}, - {file = "propcache-0.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:89498dd49c2f9a026ee057965cdf8192e5ae070ce7d7a7bd4b66a8e257d0c976"}, - {file = "propcache-0.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:09400e98545c998d57d10035ff623266927cb784d13dd2b31fd33b8a5316b85b"}, - {file = "propcache-0.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa8efd8c5adc5a2c9d3b952815ff8f7710cefdcaf5f2c36d26aff51aeca2f12f"}, - {file = "propcache-0.3.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2fe5c910f6007e716a06d269608d307b4f36e7babee5f36533722660e8c4a70"}, - {file = "propcache-0.3.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a0ab8cf8cdd2194f8ff979a43ab43049b1df0b37aa64ab7eca04ac14429baeb7"}, - {file = "propcache-0.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:563f9d8c03ad645597b8d010ef4e9eab359faeb11a0a2ac9f7b4bc8c28ebef25"}, - {file = "propcache-0.3.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fb6e0faf8cb6b4beea5d6ed7b5a578254c6d7df54c36ccd3d8b3eb00d6770277"}, - {file = "propcache-0.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1c5c7ab7f2bb3f573d1cb921993006ba2d39e8621019dffb1c5bc94cdbae81e8"}, - {file = "propcache-0.3.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:050b571b2e96ec942898f8eb46ea4bfbb19bd5502424747e83badc2d4a99a44e"}, - {file = "propcache-0.3.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e1c4d24b804b3a87e9350f79e2371a705a188d292fd310e663483af6ee6718ee"}, - {file = "propcache-0.3.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e4fe2a6d5ce975c117a6bb1e8ccda772d1e7029c1cca1acd209f91d30fa72815"}, - {file = "propcache-0.3.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:feccd282de1f6322f56f6845bf1207a537227812f0a9bf5571df52bb418d79d5"}, - {file = "propcache-0.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ec314cde7314d2dd0510c6787326bbffcbdc317ecee6b7401ce218b3099075a7"}, - {file = "propcache-0.3.1-cp312-cp312-win32.whl", hash = "sha256:7d2d5a0028d920738372630870e7d9644ce437142197f8c827194fca404bf03b"}, - {file = "propcache-0.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:88c423efef9d7a59dae0614eaed718449c09a5ac79a5f224a8b9664d603f04a3"}, - {file = "propcache-0.3.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f1528ec4374617a7a753f90f20e2f551121bb558fcb35926f99e3c42367164b8"}, - {file = "propcache-0.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dc1915ec523b3b494933b5424980831b636fe483d7d543f7afb7b3bf00f0c10f"}, - {file = "propcache-0.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a110205022d077da24e60b3df8bcee73971be9575dec5573dd17ae5d81751111"}, - {file = "propcache-0.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d249609e547c04d190e820d0d4c8ca03ed4582bcf8e4e160a6969ddfb57b62e5"}, - {file = "propcache-0.3.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ced33d827625d0a589e831126ccb4f5c29dfdf6766cac441d23995a65825dcb"}, - {file = "propcache-0.3.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4114c4ada8f3181af20808bedb250da6bae56660e4b8dfd9cd95d4549c0962f7"}, - {file = "propcache-0.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:975af16f406ce48f1333ec5e912fe11064605d5c5b3f6746969077cc3adeb120"}, - {file = "propcache-0.3.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a34aa3a1abc50740be6ac0ab9d594e274f59960d3ad253cd318af76b996dd654"}, - {file = "propcache-0.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9cec3239c85ed15bfaded997773fdad9fb5662b0a7cbc854a43f291eb183179e"}, - {file = "propcache-0.3.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:05543250deac8e61084234d5fc54f8ebd254e8f2b39a16b1dce48904f45b744b"}, - {file = "propcache-0.3.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5cb5918253912e088edbf023788de539219718d3b10aef334476b62d2b53de53"}, - {file = "propcache-0.3.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f3bbecd2f34d0e6d3c543fdb3b15d6b60dd69970c2b4c822379e5ec8f6f621d5"}, - {file = "propcache-0.3.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aca63103895c7d960a5b9b044a83f544b233c95e0dcff114389d64d762017af7"}, - {file = "propcache-0.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5a0a9898fdb99bf11786265468571e628ba60af80dc3f6eb89a3545540c6b0ef"}, - {file = "propcache-0.3.1-cp313-cp313-win32.whl", hash = "sha256:3a02a28095b5e63128bcae98eb59025924f121f048a62393db682f049bf4ac24"}, - {file = "propcache-0.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:813fbb8b6aea2fc9659815e585e548fe706d6f663fa73dff59a1677d4595a037"}, - {file = "propcache-0.3.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a444192f20f5ce8a5e52761a031b90f5ea6288b1eef42ad4c7e64fef33540b8f"}, - {file = "propcache-0.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0fbe94666e62ebe36cd652f5fc012abfbc2342de99b523f8267a678e4dfdee3c"}, - {file = "propcache-0.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f011f104db880f4e2166bcdcf7f58250f7a465bc6b068dc84c824a3d4a5c94dc"}, - {file = "propcache-0.3.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e584b6d388aeb0001d6d5c2bd86b26304adde6d9bb9bfa9c4889805021b96de"}, - {file = "propcache-0.3.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a17583515a04358b034e241f952f1715243482fc2c2945fd99a1b03a0bd77d6"}, - {file = "propcache-0.3.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5aed8d8308215089c0734a2af4f2e95eeb360660184ad3912686c181e500b2e7"}, - {file = "propcache-0.3.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d8e309ff9a0503ef70dc9a0ebd3e69cf7b3894c9ae2ae81fc10943c37762458"}, - {file = "propcache-0.3.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b655032b202028a582d27aeedc2e813299f82cb232f969f87a4fde491a233f11"}, - {file = "propcache-0.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9f64d91b751df77931336b5ff7bafbe8845c5770b06630e27acd5dbb71e1931c"}, - {file = "propcache-0.3.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:19a06db789a4bd896ee91ebc50d059e23b3639c25d58eb35be3ca1cbe967c3bf"}, - {file = "propcache-0.3.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:bef100c88d8692864651b5f98e871fb090bd65c8a41a1cb0ff2322db39c96c27"}, - {file = "propcache-0.3.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:87380fb1f3089d2a0b8b00f006ed12bd41bd858fabfa7330c954c70f50ed8757"}, - {file = "propcache-0.3.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e474fc718e73ba5ec5180358aa07f6aded0ff5f2abe700e3115c37d75c947e18"}, - {file = "propcache-0.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:17d1c688a443355234f3c031349da69444be052613483f3e4158eef751abcd8a"}, - {file = "propcache-0.3.1-cp313-cp313t-win32.whl", hash = "sha256:359e81a949a7619802eb601d66d37072b79b79c2505e6d3fd8b945538411400d"}, - {file = "propcache-0.3.1-cp313-cp313t-win_amd64.whl", hash = "sha256:e7fb9a84c9abbf2b2683fa3e7b0d7da4d8ecf139a1c635732a8bda29c5214b0e"}, - {file = "propcache-0.3.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ed5f6d2edbf349bd8d630e81f474d33d6ae5d07760c44d33cd808e2f5c8f4ae6"}, - {file = "propcache-0.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:668ddddc9f3075af019f784456267eb504cb77c2c4bd46cc8402d723b4d200bf"}, - {file = "propcache-0.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0c86e7ceea56376216eba345aa1fc6a8a6b27ac236181f840d1d7e6a1ea9ba5c"}, - {file = "propcache-0.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83be47aa4e35b87c106fc0c84c0fc069d3f9b9b06d3c494cd404ec6747544894"}, - {file = "propcache-0.3.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:27c6ac6aa9fc7bc662f594ef380707494cb42c22786a558d95fcdedb9aa5d035"}, - {file = "propcache-0.3.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:64a956dff37080b352c1c40b2966b09defb014347043e740d420ca1eb7c9b908"}, - {file = "propcache-0.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82de5da8c8893056603ac2d6a89eb8b4df49abf1a7c19d536984c8dd63f481d5"}, - {file = "propcache-0.3.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c3c3a203c375b08fd06a20da3cf7aac293b834b6f4f4db71190e8422750cca5"}, - {file = "propcache-0.3.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:b303b194c2e6f171cfddf8b8ba30baefccf03d36a4d9cab7fd0bb68ba476a3d7"}, - {file = "propcache-0.3.1-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:916cd229b0150129d645ec51614d38129ee74c03293a9f3f17537be0029a9641"}, - {file = "propcache-0.3.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:a461959ead5b38e2581998700b26346b78cd98540b5524796c175722f18b0294"}, - {file = "propcache-0.3.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:069e7212890b0bcf9b2be0a03afb0c2d5161d91e1bf51569a64f629acc7defbf"}, - {file = "propcache-0.3.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ef2e4e91fb3945769e14ce82ed53007195e616a63aa43b40fb7ebaaf907c8d4c"}, - {file = "propcache-0.3.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:8638f99dca15b9dff328fb6273e09f03d1c50d9b6512f3b65a4154588a7595fe"}, - {file = "propcache-0.3.1-cp39-cp39-win32.whl", hash = "sha256:6f173bbfe976105aaa890b712d1759de339d8a7cef2fc0a1714cc1a1e1c47f64"}, - {file = "propcache-0.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:603f1fe4144420374f1a69b907494c3acbc867a581c2d49d4175b0de7cc64566"}, - {file = "propcache-0.3.1-py3-none-any.whl", hash = "sha256:9a8ecf38de50a7f518c21568c80f985e776397b902f1ce0b01f799aba1608b40"}, - {file = "propcache-0.3.1.tar.gz", hash = "sha256:40d980c33765359098837527e18eddefc9a24cea5b45e078a7f3bb5b032c6ecf"}, + {file = "protobuf-6.33.5-cp310-abi3-win32.whl", hash = "sha256:d71b040839446bac0f4d162e758bea99c8251161dae9d0983a3b88dee345153b"}, + {file = "protobuf-6.33.5-cp310-abi3-win_amd64.whl", hash = "sha256:3093804752167bcab3998bec9f1048baae6e29505adaf1afd14a37bddede533c"}, + {file = "protobuf-6.33.5-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:a5cb85982d95d906df1e2210e58f8e4f1e3cdc088e52c921a041f9c9a0386de5"}, + {file = "protobuf-6.33.5-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:9b71e0281f36f179d00cbcb119cb19dec4d14a81393e5ea220f64b286173e190"}, + {file = "protobuf-6.33.5-cp39-abi3-manylinux2014_s390x.whl", hash = "sha256:8afa18e1d6d20af15b417e728e9f60f3aa108ee76f23c3b2c07a2c3b546d3afd"}, + {file = "protobuf-6.33.5-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:cbf16ba3350fb7b889fca858fb215967792dc125b35c7976ca4818bee3521cf0"}, + {file = "protobuf-6.33.5-cp39-cp39-win32.whl", hash = "sha256:a3157e62729aafb8df6da2c03aa5c0937c7266c626ce11a278b6eb7963c4e37c"}, + {file = "protobuf-6.33.5-cp39-cp39-win_amd64.whl", hash = "sha256:8f04fa32763dcdb4973d537d6b54e615cc61108c7cb38fe59310c3192d29510a"}, + {file = "protobuf-6.33.5-py3-none-any.whl", hash = "sha256:69915a973dd0f60f31a08b8318b73eab2bd6a392c79184b3612226b0a3f8ec02"}, + {file = "protobuf-6.33.5.tar.gz", hash = "sha256:6ddcac2a081f8b7b9642c09406bc6a4290128fce5f471cddd165960bb9119e5c"}, ] [[package]] name = "psutil" -version = "7.0.0" -description = "Cross-platform lib for process and system monitoring in Python. NOTE: the syntax of this script MUST be kept compatible with Python 2.7." +version = "7.2.2" +description = "Cross-platform lib for process and system monitoring." optional = false python-versions = ">=3.6" -groups = ["main"] -files = [ - {file = "psutil-7.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25"}, - {file = "psutil-7.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da"}, - {file = "psutil-7.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fcee592b4c6f146991ca55919ea3d1f8926497a713ed7faaf8225e174581e91"}, - {file = "psutil-7.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b1388a4f6875d7e2aff5c4ca1cc16c545ed41dd8bb596cefea80111db353a34"}, - {file = "psutil-7.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f098451abc2828f7dc6b58d44b532b22f2088f4999a937557b603ce72b1993"}, - {file = "psutil-7.0.0-cp36-cp36m-win32.whl", hash = "sha256:84df4eb63e16849689f76b1ffcb36db7b8de703d1bc1fe41773db487621b6c17"}, - {file = "psutil-7.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:1e744154a6580bc968a0195fd25e80432d3afec619daf145b9e5ba16cc1d688e"}, - {file = "psutil-7.0.0-cp37-abi3-win32.whl", hash = "sha256:ba3fcef7523064a6c9da440fc4d6bd07da93ac726b5733c29027d7dc95b39d99"}, - {file = "psutil-7.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553"}, - {file = "psutil-7.0.0.tar.gz", hash = "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456"}, +groups = ["main", "torch-cuda"] +files = [ + {file = "psutil-7.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2edccc433cbfa046b980b0df0171cd25bcaeb3a68fe9022db0979e7aa74a826b"}, + {file = "psutil-7.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e78c8603dcd9a04c7364f1a3e670cea95d51ee865e4efb3556a3a63adef958ea"}, + {file = "psutil-7.2.2-cp313-cp313t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1a571f2330c966c62aeda00dd24620425d4b0cc86881c89861fbc04549e5dc63"}, + {file = "psutil-7.2.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:917e891983ca3c1887b4ef36447b1e0873e70c933afc831c6b6da078ba474312"}, + {file = "psutil-7.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:ab486563df44c17f5173621c7b198955bd6b613fb87c71c161f827d3fb149a9b"}, + {file = "psutil-7.2.2-cp313-cp313t-win_arm64.whl", hash = "sha256:ae0aefdd8796a7737eccea863f80f81e468a1e4cf14d926bd9b6f5f2d5f90ca9"}, + {file = "psutil-7.2.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:eed63d3b4d62449571547b60578c5b2c4bcccc5387148db46e0c2313dad0ee00"}, + {file = "psutil-7.2.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7b6d09433a10592ce39b13d7be5a54fbac1d1228ed29abc880fb23df7cb694c9"}, + {file = "psutil-7.2.2-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fa4ecf83bcdf6e6c8f4449aff98eefb5d0604bf88cb883d7da3d8d2d909546a"}, + {file = "psutil-7.2.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e452c464a02e7dc7822a05d25db4cde564444a67e58539a00f929c51eddda0cf"}, + {file = "psutil-7.2.2-cp314-cp314t-win_amd64.whl", hash = "sha256:c7663d4e37f13e884d13994247449e9f8f574bc4655d509c3b95e9ec9e2b9dc1"}, + {file = "psutil-7.2.2-cp314-cp314t-win_arm64.whl", hash = "sha256:11fe5a4f613759764e79c65cf11ebdf26e33d6dd34336f8a337aa2996d71c841"}, + {file = "psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ed0cace939114f62738d808fdcecd4c869222507e266e574799e9c0faa17d486"}, + {file = "psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:1a7b04c10f32cc88ab39cbf606e117fd74721c831c98a27dc04578deb0c16979"}, + {file = "psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9"}, + {file = "psutil-7.2.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b0726cecd84f9474419d67252add4ac0cd9811b04d61123054b9fb6f57df6e9e"}, + {file = "psutil-7.2.2-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fd04ef36b4a6d599bbdb225dd1d3f51e00105f6d48a28f006da7f9822f2606d8"}, + {file = "psutil-7.2.2-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b58fabe35e80b264a4e3bb23e6b96f9e45a3df7fb7eed419ac0e5947c61e47cc"}, + {file = "psutil-7.2.2-cp37-abi3-win_amd64.whl", hash = "sha256:eb7e81434c8d223ec4a219b5fc1c47d0417b12be7ea866e24fb5ad6e84b3d988"}, + {file = "psutil-7.2.2-cp37-abi3-win_arm64.whl", hash = "sha256:8c233660f575a5a89e6d4cb65d9f938126312bca76d8fe087b947b3a1aaac9ee"}, + {file = "psutil-7.2.2.tar.gz", hash = "sha256:0746f5f8d406af344fd547f1c8daa5f5c33dbc293bb8d6a16d80b4bb88f59372"}, ] [package.extras] -dev = ["abi3audit", "black (==24.10.0)", "check-manifest", "coverage", "packaging", "pylint", "pyperf", "pypinfo", "pytest", "pytest-cov", "pytest-xdist", "requests", "rstcheck", "ruff", "setuptools", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "virtualenv", "vulture", "wheel"] -test = ["pytest", "pytest-xdist", "setuptools"] +dev = ["abi3audit", "black", "check-manifest", "colorama ; os_name == \"nt\"", "coverage", "packaging", "psleak", "pylint", "pyperf", "pypinfo", "pyreadline3 ; os_name == \"nt\"", "pytest", "pytest-cov", "pytest-instafail", "pytest-xdist", "pywin32 ; os_name == \"nt\" and implementation_name != \"pypy\"", "requests", "rstcheck", "ruff", "setuptools", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "validate-pyproject[all]", "virtualenv", "vulture", "wheel", "wheel ; os_name == \"nt\" and implementation_name != \"pypy\"", "wmi ; os_name == \"nt\" and implementation_name != \"pypy\""] +test = ["psleak", "pytest", "pytest-instafail", "pytest-xdist", "pywin32 ; os_name == \"nt\" and implementation_name != \"pypy\"", "setuptools", "wheel ; os_name == \"nt\" and implementation_name != \"pypy\"", "wmi ; os_name == \"nt\" and implementation_name != \"pypy\""] + +[[package]] +name = "pyarrow" +version = "23.0.0" +description = "Python library for Apache Arrow" +optional = false +python-versions = ">=3.10" +groups = ["main"] +markers = "extra == \"multiprocessing\"" +files = [ + {file = "pyarrow-23.0.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:cbdc2bf5947aa4d462adcf8453cf04aee2f7932653cb67a27acd96e5e8528a67"}, + {file = "pyarrow-23.0.0-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:4d38c836930ce15cd31dce20114b21ba082da231c884bdc0a7b53e1477fe7f07"}, + {file = "pyarrow-23.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:4222ff8f76919ecf6c716175a0e5fddb5599faeed4c56d9ea41a2c42be4998b2"}, + {file = "pyarrow-23.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:87f06159cbe38125852657716889296c83c37b4d09a5e58f3d10245fd1f69795"}, + {file = "pyarrow-23.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1675c374570d8b91ea6d4edd4608fa55951acd44e0c31bd146e091b4005de24f"}, + {file = "pyarrow-23.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:247374428fde4f668f138b04031a7e7077ba5fa0b5b1722fdf89a017bf0b7ee0"}, + {file = "pyarrow-23.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:de53b1bd3b88a2ee93c9af412c903e57e738c083be4f6392288294513cd8b2c1"}, + {file = "pyarrow-23.0.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:5574d541923efcbfdf1294a2746ae3b8c2498a2dc6cd477882f6f4e7b1ac08d3"}, + {file = "pyarrow-23.0.0-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:2ef0075c2488932e9d3c2eb3482f9459c4be629aa673b725d5e3cf18f777f8e4"}, + {file = "pyarrow-23.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:65666fc269669af1ef1c14478c52222a2aa5c907f28b68fb50a203c777e4f60c"}, + {file = "pyarrow-23.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:4d85cb6177198f3812db4788e394b757223f60d9a9f5ad6634b3e32be1525803"}, + {file = "pyarrow-23.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1a9ff6fa4141c24a03a1a434c63c8fa97ce70f8f36bccabc18ebba905ddf0f17"}, + {file = "pyarrow-23.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:84839d060a54ae734eb60a756aeacb62885244aaa282f3c968f5972ecc7b1ecc"}, + {file = "pyarrow-23.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:a149a647dbfe928ce8830a713612aa0b16e22c64feac9d1761529778e4d4eaa5"}, + {file = "pyarrow-23.0.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:5961a9f646c232697c24f54d3419e69b4261ba8a8b66b0ac54a1851faffcbab8"}, + {file = "pyarrow-23.0.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:632b3e7c3d232f41d64e1a4a043fb82d44f8a349f339a1188c6a0dd9d2d47d8a"}, + {file = "pyarrow-23.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:76242c846db1411f1d6c2cc3823be6b86b40567ee24493344f8226ba34a81333"}, + {file = "pyarrow-23.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b73519f8b52ae28127000986bf228fda781e81d3095cd2d3ece76eb5cf760e1b"}, + {file = "pyarrow-23.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:068701f6823449b1b6469120f399a1239766b117d211c5d2519d4ed5861f75de"}, + {file = "pyarrow-23.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1801ba947015d10e23bca9dd6ef5d0e9064a81569a89b6e9a63b59224fd060df"}, + {file = "pyarrow-23.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:52265266201ec25b6839bf6bd4ea918ca6d50f31d13e1cf200b4261cd11dc25c"}, + {file = "pyarrow-23.0.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:ad96a597547af7827342ffb3c503c8316e5043bb09b47a84885ce39394c96e00"}, + {file = "pyarrow-23.0.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:b9edf990df77c2901e79608f08c13fbde60202334a4fcadb15c1f57bf7afee43"}, + {file = "pyarrow-23.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:36d1b5bc6ddcaff0083ceec7e2561ed61a51f49cce8be079ee8ed406acb6fdef"}, + {file = "pyarrow-23.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:4292b889cd224f403304ddda8b63a36e60f92911f89927ec8d98021845ea21be"}, + {file = "pyarrow-23.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dfd9e133e60eaa847fd80530a1b89a052f09f695d0b9c34c235ea6b2e0924cf7"}, + {file = "pyarrow-23.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:832141cc09fac6aab1cd3719951d23301396968de87080c57c9a7634e0ecd068"}, + {file = "pyarrow-23.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:7a7d067c9a88faca655c71bcc30ee2782038d59c802d57950826a07f60d83c4c"}, + {file = "pyarrow-23.0.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:ce9486e0535a843cf85d990e2ec5820a47918235183a5c7b8b97ed7e92c2d47d"}, + {file = "pyarrow-23.0.0-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:075c29aeaa685fd1182992a9ed2499c66f084ee54eea47da3eb76e125e06064c"}, + {file = "pyarrow-23.0.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:799965a5379589510d888be3094c2296efd186a17ca1cef5b77703d4d5121f53"}, + {file = "pyarrow-23.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:ef7cac8fe6fccd8b9e7617bfac785b0371a7fe26af59463074e4882747145d40"}, + {file = "pyarrow-23.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15a414f710dc927132dd67c361f78c194447479555af57317066ee5116b90e9e"}, + {file = "pyarrow-23.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:3e0d2e6915eca7d786be6a77bf227fbc06d825a75b5b5fe9bcbef121dec32685"}, + {file = "pyarrow-23.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:4b317ea6e800b5704e5e5929acb6e2dc13e9276b708ea97a39eb8b345aa2658b"}, + {file = "pyarrow-23.0.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:20b187ed9550d233a872074159f765f52f9d92973191cd4b93f293a19efbe377"}, + {file = "pyarrow-23.0.0-cp314-cp314-macosx_12_0_x86_64.whl", hash = "sha256:18ec84e839b493c3886b9b5e06861962ab4adfaeb79b81c76afbd8d84c7d5fda"}, + {file = "pyarrow-23.0.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:e438dd3f33894e34fd02b26bd12a32d30d006f5852315f611aa4add6c7fab4bc"}, + {file = "pyarrow-23.0.0-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:a244279f240c81f135631be91146d7fa0e9e840e1dfed2aba8483eba25cd98e6"}, + {file = "pyarrow-23.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c4692e83e42438dba512a570c6eaa42be2f8b6c0f492aea27dec54bdc495103a"}, + {file = "pyarrow-23.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ae7f30f898dfe44ea69654a35c93e8da4cef6606dc4c72394068fd95f8e9f54a"}, + {file = "pyarrow-23.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:5b86bb649e4112fb0614294b7d0a175c7513738876b89655605ebb87c804f861"}, + {file = "pyarrow-23.0.0-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:ebc017d765d71d80a3f8584ca0566b53e40464586585ac64176115baa0ada7d3"}, + {file = "pyarrow-23.0.0-cp314-cp314t-macosx_12_0_x86_64.whl", hash = "sha256:0800cc58a6d17d159df823f87ad66cefebf105b982493d4bad03ee7fab84b993"}, + {file = "pyarrow-23.0.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:3a7c68c722da9bb5b0f8c10e3eae71d9825a4b429b40b32709df5d1fa55beb3d"}, + {file = "pyarrow-23.0.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:bd5556c24622df90551063ea41f559b714aa63ca953db884cfb958559087a14e"}, + {file = "pyarrow-23.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:54810f6e6afc4ffee7c2e0051b61722fbea9a4961b46192dcfae8ea12fa09059"}, + {file = "pyarrow-23.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:14de7d48052cf4b0ed174533eafa3cfe0711b8076ad70bede32cf59f744f0d7c"}, + {file = "pyarrow-23.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:427deac1f535830a744a4f04a6ac183a64fcac4341b3f618e693c41b7b98d2b0"}, + {file = "pyarrow-23.0.0.tar.gz", hash = "sha256:180e3150e7edfcd182d3d9afba72f7cf19839a497cc76555a8dce998a8f67615"}, +] [[package]] name = "pycodestyle" -version = "2.13.0" +version = "2.14.0" description = "Python style guide checker" optional = false python-versions = ">=3.9" groups = ["development"] files = [ - {file = "pycodestyle-2.13.0-py2.py3-none-any.whl", hash = "sha256:35863c5974a271c7a726ed228a14a4f6daf49df369d8c50cd9a6f58a5e143ba9"}, - {file = "pycodestyle-2.13.0.tar.gz", hash = "sha256:c8415bf09abe81d9c7f872502a6eee881fbe85d8763dd5b9924bb0a01d67efae"}, + {file = "pycodestyle-2.14.0-py2.py3-none-any.whl", hash = "sha256:dd6bf7cb4ee77f8e016f9c8e74a35ddd9f67e1d5fd4184d86c3b98e07099f42d"}, + {file = "pycodestyle-2.14.0.tar.gz", hash = "sha256:c4b5b517d278089ff9d0abdec919cd97262a3367449ea1c8b49b91529167b783"}, ] [[package]] name = "pycparser" -version = "2.22" +version = "3.0" description = "C parser in Python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.10" +groups = ["main"] +markers = "implementation_name != \"PyPy\" and (platform_python_implementation != \"PyPy\" or sys_platform == \"darwin\") and (sys_platform == \"linux\" or sys_platform == \"darwin\")" +files = [ + {file = "pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992"}, + {file = "pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29"}, +] + +[[package]] +name = "pydantic" +version = "2.12.5" +description = "Data validation using Python type hints" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "pydantic-2.12.5-py3-none-any.whl", hash = "sha256:e561593fccf61e8a20fc46dfc2dfe075b8be7d0188df33f221ad1f0139180f9d"}, + {file = "pydantic-2.12.5.tar.gz", hash = "sha256:4d351024c75c0f085a9febbb665ce8c0c6ec5d30e903bdb6394b7ede26aebb49"}, +] + +[package.dependencies] +annotated-types = ">=0.6.0" +pydantic-core = "2.41.5" +typing-extensions = ">=4.14.1" +typing-inspection = ">=0.4.2" + +[package.extras] +email = ["email-validator (>=2.0.0)"] +timezone = ["tzdata ; python_version >= \"3.9\" and platform_system == \"Windows\""] + +[[package]] +name = "pydantic-core" +version = "2.41.5" +description = "Core functionality for Pydantic validation and serialization" +optional = false +python-versions = ">=3.9" groups = ["main"] -markers = "sys_platform == \"linux\" or sys_platform == \"darwin\" or platform_python_implementation == \"PyPy\"" files = [ - {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, - {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, + {file = "pydantic_core-2.41.5-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:77b63866ca88d804225eaa4af3e664c5faf3568cea95360d21f4725ab6e07146"}, + {file = "pydantic_core-2.41.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dfa8a0c812ac681395907e71e1274819dec685fec28273a28905df579ef137e2"}, + {file = "pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5921a4d3ca3aee735d9fd163808f5e8dd6c6972101e4adbda9a4667908849b97"}, + {file = "pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e25c479382d26a2a41b7ebea1043564a937db462816ea07afa8a44c0866d52f9"}, + {file = "pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f547144f2966e1e16ae626d8ce72b4cfa0caedc7fa28052001c94fb2fcaa1c52"}, + {file = "pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f52298fbd394f9ed112d56f3d11aabd0d5bd27beb3084cc3d8ad069483b8941"}, + {file = "pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:100baa204bb412b74fe285fb0f3a385256dad1d1879f0a5cb1499ed2e83d132a"}, + {file = "pydantic_core-2.41.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:05a2c8852530ad2812cb7914dc61a1125dc4e06252ee98e5638a12da6cc6fb6c"}, + {file = "pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:29452c56df2ed968d18d7e21f4ab0ac55e71dc59524872f6fc57dcf4a3249ed2"}, + {file = "pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:d5160812ea7a8a2ffbe233d8da666880cad0cbaf5d4de74ae15c313213d62556"}, + {file = "pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:df3959765b553b9440adfd3c795617c352154e497a4eaf3752555cfb5da8fc49"}, + {file = "pydantic_core-2.41.5-cp310-cp310-win32.whl", hash = "sha256:1f8d33a7f4d5a7889e60dc39856d76d09333d8a6ed0f5f1190635cbec70ec4ba"}, + {file = "pydantic_core-2.41.5-cp310-cp310-win_amd64.whl", hash = "sha256:62de39db01b8d593e45871af2af9e497295db8d73b085f6bfd0b18c83c70a8f9"}, + {file = "pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a3a52f6156e73e7ccb0f8cced536adccb7042be67cb45f9562e12b319c119da6"}, + {file = "pydantic_core-2.41.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7f3bf998340c6d4b0c9a2f02d6a400e51f123b59565d74dc60d252ce888c260b"}, + {file = "pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:378bec5c66998815d224c9ca994f1e14c0c21cb95d2f52b6021cc0b2a58f2a5a"}, + {file = "pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e7b576130c69225432866fe2f4a469a85a54ade141d96fd396dffcf607b558f8"}, + {file = "pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6cb58b9c66f7e4179a2d5e0f849c48eff5c1fca560994d6eb6543abf955a149e"}, + {file = "pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:88942d3a3dff3afc8288c21e565e476fc278902ae4d6d134f1eeda118cc830b1"}, + {file = "pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f31d95a179f8d64d90f6831d71fa93290893a33148d890ba15de25642c5d075b"}, + {file = "pydantic_core-2.41.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c1df3d34aced70add6f867a8cf413e299177e0c22660cc767218373d0779487b"}, + {file = "pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4009935984bd36bd2c774e13f9a09563ce8de4abaa7226f5108262fa3e637284"}, + {file = "pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:34a64bc3441dc1213096a20fe27e8e128bd3ff89921706e83c0b1ac971276594"}, + {file = "pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c9e19dd6e28fdcaa5a1de679aec4141f691023916427ef9bae8584f9c2fb3b0e"}, + {file = "pydantic_core-2.41.5-cp311-cp311-win32.whl", hash = "sha256:2c010c6ded393148374c0f6f0bf89d206bf3217f201faa0635dcd56bd1520f6b"}, + {file = "pydantic_core-2.41.5-cp311-cp311-win_amd64.whl", hash = "sha256:76ee27c6e9c7f16f47db7a94157112a2f3a00e958bc626e2f4ee8bec5c328fbe"}, + {file = "pydantic_core-2.41.5-cp311-cp311-win_arm64.whl", hash = "sha256:4bc36bbc0b7584de96561184ad7f012478987882ebf9f9c389b23f432ea3d90f"}, + {file = "pydantic_core-2.41.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f41a7489d32336dbf2199c8c0a215390a751c5b014c2c1c5366e817202e9cdf7"}, + {file = "pydantic_core-2.41.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:070259a8818988b9a84a449a2a7337c7f430a22acc0859c6b110aa7212a6d9c0"}, + {file = "pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e96cea19e34778f8d59fe40775a7a574d95816eb150850a85a7a4c8f4b94ac69"}, + {file = "pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed2e99c456e3fadd05c991f8f437ef902e00eedf34320ba2b0842bd1c3ca3a75"}, + {file = "pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65840751b72fbfd82c3c640cff9284545342a4f1eb1586ad0636955b261b0b05"}, + {file = "pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e536c98a7626a98feb2d3eaf75944ef6f3dbee447e1f841eae16f2f0a72d8ddc"}, + {file = "pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eceb81a8d74f9267ef4081e246ffd6d129da5d87e37a77c9bde550cb04870c1c"}, + {file = "pydantic_core-2.41.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d38548150c39b74aeeb0ce8ee1d8e82696f4a4e16ddc6de7b1d8823f7de4b9b5"}, + {file = "pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c23e27686783f60290e36827f9c626e63154b82b116d7fe9adba1fda36da706c"}, + {file = "pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:482c982f814460eabe1d3bb0adfdc583387bd4691ef00b90575ca0d2b6fe2294"}, + {file = "pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:bfea2a5f0b4d8d43adf9d7b8bf019fb46fdd10a2e5cde477fbcb9d1fa08c68e1"}, + {file = "pydantic_core-2.41.5-cp312-cp312-win32.whl", hash = "sha256:b74557b16e390ec12dca509bce9264c3bbd128f8a2c376eaa68003d7f327276d"}, + {file = "pydantic_core-2.41.5-cp312-cp312-win_amd64.whl", hash = "sha256:1962293292865bca8e54702b08a4f26da73adc83dd1fcf26fbc875b35d81c815"}, + {file = "pydantic_core-2.41.5-cp312-cp312-win_arm64.whl", hash = "sha256:1746d4a3d9a794cacae06a5eaaccb4b8643a131d45fbc9af23e353dc0a5ba5c3"}, + {file = "pydantic_core-2.41.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:941103c9be18ac8daf7b7adca8228f8ed6bb7a1849020f643b3a14d15b1924d9"}, + {file = "pydantic_core-2.41.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:112e305c3314f40c93998e567879e887a3160bb8689ef3d2c04b6cc62c33ac34"}, + {file = "pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cbaad15cb0c90aa221d43c00e77bb33c93e8d36e0bf74760cd00e732d10a6a0"}, + {file = "pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:03ca43e12fab6023fc79d28ca6b39b05f794ad08ec2feccc59a339b02f2b3d33"}, + {file = "pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc799088c08fa04e43144b164feb0c13f9a0bc40503f8df3e9fde58a3c0c101e"}, + {file = "pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:97aeba56665b4c3235a0e52b2c2f5ae9cd071b8a8310ad27bddb3f7fb30e9aa2"}, + {file = "pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:406bf18d345822d6c21366031003612b9c77b3e29ffdb0f612367352aab7d586"}, + {file = "pydantic_core-2.41.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b93590ae81f7010dbe380cdeab6f515902ebcbefe0b9327cc4804d74e93ae69d"}, + {file = "pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:01a3d0ab748ee531f4ea6c3e48ad9dac84ddba4b0d82291f87248f2f9de8d740"}, + {file = "pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:6561e94ba9dacc9c61bce40e2d6bdc3bfaa0259d3ff36ace3b1e6901936d2e3e"}, + {file = "pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:915c3d10f81bec3a74fbd4faebe8391013ba61e5a1a8d48c4455b923bdda7858"}, + {file = "pydantic_core-2.41.5-cp313-cp313-win32.whl", hash = "sha256:650ae77860b45cfa6e2cdafc42618ceafab3a2d9a3811fcfbd3bbf8ac3c40d36"}, + {file = "pydantic_core-2.41.5-cp313-cp313-win_amd64.whl", hash = "sha256:79ec52ec461e99e13791ec6508c722742ad745571f234ea6255bed38c6480f11"}, + {file = "pydantic_core-2.41.5-cp313-cp313-win_arm64.whl", hash = "sha256:3f84d5c1b4ab906093bdc1ff10484838aca54ef08de4afa9de0f5f14d69639cd"}, + {file = "pydantic_core-2.41.5-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:3f37a19d7ebcdd20b96485056ba9e8b304e27d9904d233d7b1015db320e51f0a"}, + {file = "pydantic_core-2.41.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1d1d9764366c73f996edd17abb6d9d7649a7eb690006ab6adbda117717099b14"}, + {file = "pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25e1c2af0fce638d5f1988b686f3b3ea8cd7de5f244ca147c777769e798a9cd1"}, + {file = "pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:506d766a8727beef16b7adaeb8ee6217c64fc813646b424d0804d67c16eddb66"}, + {file = "pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4819fa52133c9aa3c387b3328f25c1facc356491e6135b459f1de698ff64d869"}, + {file = "pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b761d210c9ea91feda40d25b4efe82a1707da2ef62901466a42492c028553a2"}, + {file = "pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22f0fb8c1c583a3b6f24df2470833b40207e907b90c928cc8d3594b76f874375"}, + {file = "pydantic_core-2.41.5-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2782c870e99878c634505236d81e5443092fba820f0373997ff75f90f68cd553"}, + {file = "pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:0177272f88ab8312479336e1d777f6b124537d47f2123f89cb37e0accea97f90"}, + {file = "pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:63510af5e38f8955b8ee5687740d6ebf7c2a0886d15a6d65c32814613681bc07"}, + {file = "pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:e56ba91f47764cc14f1daacd723e3e82d1a89d783f0f5afe9c364b8bb491ccdb"}, + {file = "pydantic_core-2.41.5-cp314-cp314-win32.whl", hash = "sha256:aec5cf2fd867b4ff45b9959f8b20ea3993fc93e63c7363fe6851424c8a7e7c23"}, + {file = "pydantic_core-2.41.5-cp314-cp314-win_amd64.whl", hash = "sha256:8e7c86f27c585ef37c35e56a96363ab8de4e549a95512445b85c96d3e2f7c1bf"}, + {file = "pydantic_core-2.41.5-cp314-cp314-win_arm64.whl", hash = "sha256:e672ba74fbc2dc8eea59fb6d4aed6845e6905fc2a8afe93175d94a83ba2a01a0"}, + {file = "pydantic_core-2.41.5-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:8566def80554c3faa0e65ac30ab0932b9e3a5cd7f8323764303d468e5c37595a"}, + {file = "pydantic_core-2.41.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b80aa5095cd3109962a298ce14110ae16b8c1aece8b72f9dafe81cf597ad80b3"}, + {file = "pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3006c3dd9ba34b0c094c544c6006cc79e87d8612999f1a5d43b769b89181f23c"}, + {file = "pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:72f6c8b11857a856bcfa48c86f5368439f74453563f951e473514579d44aa612"}, + {file = "pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cb1b2f9742240e4bb26b652a5aeb840aa4b417c7748b6f8387927bc6e45e40d"}, + {file = "pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bd3d54f38609ff308209bd43acea66061494157703364ae40c951f83ba99a1a9"}, + {file = "pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ff4321e56e879ee8d2a879501c8e469414d948f4aba74a2d4593184eb326660"}, + {file = "pydantic_core-2.41.5-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d0d2568a8c11bf8225044aa94409e21da0cb09dcdafe9ecd10250b2baad531a9"}, + {file = "pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:a39455728aabd58ceabb03c90e12f71fd30fa69615760a075b9fec596456ccc3"}, + {file = "pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:239edca560d05757817c13dc17c50766136d21f7cd0fac50295499ae24f90fdf"}, + {file = "pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:2a5e06546e19f24c6a96a129142a75cee553cc018ffee48a460059b1185f4470"}, + {file = "pydantic_core-2.41.5-cp314-cp314t-win32.whl", hash = "sha256:b4ececa40ac28afa90871c2cc2b9ffd2ff0bf749380fbdf57d165fd23da353aa"}, + {file = "pydantic_core-2.41.5-cp314-cp314t-win_amd64.whl", hash = "sha256:80aa89cad80b32a912a65332f64a4450ed00966111b6615ca6816153d3585a8c"}, + {file = "pydantic_core-2.41.5-cp314-cp314t-win_arm64.whl", hash = "sha256:35b44f37a3199f771c3eaa53051bc8a70cd7b54f333531c59e29fd4db5d15008"}, + {file = "pydantic_core-2.41.5-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:8bfeaf8735be79f225f3fefab7f941c712aaca36f1128c9d7e2352ee1aa87bdf"}, + {file = "pydantic_core-2.41.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:346285d28e4c8017da95144c7f3acd42740d637ff41946af5ce6e5e420502dd5"}, + {file = "pydantic_core-2.41.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a75dafbf87d6276ddc5b2bf6fae5254e3d0876b626eb24969a574fff9149ee5d"}, + {file = "pydantic_core-2.41.5-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7b93a4d08587e2b7e7882de461e82b6ed76d9026ce91ca7915e740ecc7855f60"}, + {file = "pydantic_core-2.41.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e8465ab91a4bd96d36dde3263f06caa6a8a6019e4113f24dc753d79a8b3a3f82"}, + {file = "pydantic_core-2.41.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:299e0a22e7ae2b85c1a57f104538b2656e8ab1873511fd718a1c1c6f149b77b5"}, + {file = "pydantic_core-2.41.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:707625ef0983fcfb461acfaf14de2067c5942c6bb0f3b4c99158bed6fedd3cf3"}, + {file = "pydantic_core-2.41.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f41eb9797986d6ebac5e8edff36d5cef9de40def462311b3eb3eeded1431e425"}, + {file = "pydantic_core-2.41.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0384e2e1021894b1ff5a786dbf94771e2986ebe2869533874d7e43bc79c6f504"}, + {file = "pydantic_core-2.41.5-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:f0cd744688278965817fd0839c4a4116add48d23890d468bc436f78beb28abf5"}, + {file = "pydantic_core-2.41.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:753e230374206729bf0a807954bcc6c150d3743928a73faffee51ac6557a03c3"}, + {file = "pydantic_core-2.41.5-cp39-cp39-win32.whl", hash = "sha256:873e0d5b4fb9b89ef7c2d2a963ea7d02879d9da0da8d9d4933dee8ee86a8b460"}, + {file = "pydantic_core-2.41.5-cp39-cp39-win_amd64.whl", hash = "sha256:e4f4a984405e91527a0d62649ee21138f8e3d0ef103be488c1dc11a80d7f184b"}, + {file = "pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:b96d5f26b05d03cc60f11a7761a5ded1741da411e7fe0909e27a5e6a0cb7b034"}, + {file = "pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:634e8609e89ceecea15e2d61bc9ac3718caaaa71963717bf3c8f38bfde64242c"}, + {file = "pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:93e8740d7503eb008aa2df04d3b9735f845d43ae845e6dcd2be0b55a2da43cd2"}, + {file = "pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f15489ba13d61f670dcc96772e733aad1a6f9c429cc27574c6cdaed82d0146ad"}, + {file = "pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:7da7087d756b19037bc2c06edc6c170eeef3c3bafcb8f532ff17d64dc427adfd"}, + {file = "pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:aabf5777b5c8ca26f7824cb4a120a740c9588ed58df9b2d196ce92fba42ff8dc"}, + {file = "pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c007fe8a43d43b3969e8469004e9845944f1a80e6acd47c150856bb87f230c56"}, + {file = "pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76d0819de158cd855d1cbb8fcafdf6f5cf1eb8e470abe056d5d161106e38062b"}, + {file = "pydantic_core-2.41.5-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b5819cd790dbf0c5eb9f82c73c16b39a65dd6dd4d1439dcdea7816ec9adddab8"}, + {file = "pydantic_core-2.41.5-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5a4e67afbc95fa5c34cf27d9089bca7fcab4e51e57278d710320a70b956d1b9a"}, + {file = "pydantic_core-2.41.5-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ece5c59f0ce7d001e017643d8d24da587ea1f74f6993467d85ae8a5ef9d4f42b"}, + {file = "pydantic_core-2.41.5-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:16f80f7abe3351f8ea6858914ddc8c77e02578544a0ebc15b4c2e1a0e813b0b2"}, + {file = "pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:33cb885e759a705b426baada1fe68cbb0a2e68e34c5d0d0289a364cf01709093"}, + {file = "pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:c8d8b4eb992936023be7dee581270af5c6e0697a8559895f527f5b7105ecd36a"}, + {file = "pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:242a206cd0318f95cd21bdacff3fcc3aab23e79bba5cac3db5a841c9ef9c6963"}, + {file = "pydantic_core-2.41.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d3a978c4f57a597908b7e697229d996d77a6d3c94901e9edee593adada95ce1a"}, + {file = "pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b2379fa7ed44ddecb5bfe4e48577d752db9fc10be00a6b7446e9663ba143de26"}, + {file = "pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:266fb4cbf5e3cbd0b53669a6d1b039c45e3ce651fd5442eff4d07c2cc8d66808"}, + {file = "pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58133647260ea01e4d0500089a8c4f07bd7aa6ce109682b1426394988d8aaacc"}, + {file = "pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:287dad91cfb551c363dc62899a80e9e14da1f0e2b6ebde82c806612ca2a13ef1"}, + {file = "pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:03b77d184b9eb40240ae9fd676ca364ce1085f203e1b1256f8ab9984dca80a84"}, + {file = "pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:a668ce24de96165bb239160b3d854943128f4334822900534f2fe947930e5770"}, + {file = "pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f14f8f046c14563f8eb3f45f499cc658ab8d10072961e07225e507adb700e93f"}, + {file = "pydantic_core-2.41.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:56121965f7a4dc965bff783d70b907ddf3d57f6eba29b6d2e5dabfaf07799c51"}, + {file = "pydantic_core-2.41.5.tar.gz", hash = "sha256:08daa51ea16ad373ffd5e7606252cc32f07bc72b28284b6bc9c6df804816476e"}, ] +[package.dependencies] +typing-extensions = ">=4.14.1" + [[package]] name = "pydocstyle" version = "6.3.0" @@ -3139,26 +3859,26 @@ toml = ["tomli (>=1.2.3) ; python_version < \"3.11\""] [[package]] name = "pyflakes" -version = "3.3.2" +version = "3.4.0" description = "passive checker of Python programs" optional = false python-versions = ">=3.9" groups = ["development"] files = [ - {file = "pyflakes-3.3.2-py2.py3-none-any.whl", hash = "sha256:5039c8339cbb1944045f4ee5466908906180f13cc99cc9949348d10f82a5c32a"}, - {file = "pyflakes-3.3.2.tar.gz", hash = "sha256:6dfd61d87b97fba5dcfaaf781171ac16be16453be6d816147989e7f6e6a9576b"}, + {file = "pyflakes-3.4.0-py2.py3-none-any.whl", hash = "sha256:f742a7dbd0d9cb9ea41e9a24a918996e8170c799fa528688d40dd582c8265f4f"}, + {file = "pyflakes-3.4.0.tar.gz", hash = "sha256:b24f96fafb7d2ab0ec5075b7350b3d2d2218eab42003821c06344973d3ea2f58"}, ] [[package]] name = "pygments" -version = "2.19.1" +version = "2.19.2" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.8" groups = ["development"] files = [ - {file = "pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c"}, - {file = "pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f"}, + {file = "pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b"}, + {file = "pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887"}, ] [package.extras] @@ -3166,14 +3886,14 @@ windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pyparsing" -version = "3.2.3" -description = "pyparsing module - Classes and methods to define and execute parsing grammars" +version = "3.3.2" +description = "pyparsing - Classes and methods to define and execute parsing grammars" optional = false python-versions = ">=3.9" -groups = ["main"] +groups = ["main", "torch-cuda"] files = [ - {file = "pyparsing-3.2.3-py3-none-any.whl", hash = "sha256:a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf"}, - {file = "pyparsing-3.2.3.tar.gz", hash = "sha256:b9c13f1ab8b3b542f72e28f634bad4de758ab3ce4546e4301970ad6fa77c38be"}, + {file = "pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d"}, + {file = "pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc"}, ] [package.extras] @@ -3227,36 +3947,91 @@ files = [ [package.dependencies] six = ">=1.5" +[[package]] +name = "pytokens" +version = "0.4.1" +description = "A Fast, spec compliant Python 3.14+ tokenizer that runs on older Pythons." +optional = false +python-versions = ">=3.8" +groups = ["development"] +files = [ + {file = "pytokens-0.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2a44ed93ea23415c54f3face3b65ef2b844d96aeb3455b8a69b3df6beab6acc5"}, + {file = "pytokens-0.4.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:add8bf86b71a5d9fb5b89f023a80b791e04fba57960aa790cc6125f7f1d39dfe"}, + {file = "pytokens-0.4.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:670d286910b531c7b7e3c0b453fd8156f250adb140146d234a82219459b9640c"}, + {file = "pytokens-0.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:4e691d7f5186bd2842c14813f79f8884bb03f5995f0575272009982c5ac6c0f7"}, + {file = "pytokens-0.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:27b83ad28825978742beef057bfe406ad6ed524b2d28c252c5de7b4a6dd48fa2"}, + {file = "pytokens-0.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d70e77c55ae8380c91c0c18dea05951482e263982911fc7410b1ffd1dadd3440"}, + {file = "pytokens-0.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a58d057208cb9075c144950d789511220b07636dd2e4708d5645d24de666bdc"}, + {file = "pytokens-0.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b49750419d300e2b5a3813cf229d4e5a4c728dae470bcc89867a9ad6f25a722d"}, + {file = "pytokens-0.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d9907d61f15bf7261d7e775bd5d7ee4d2930e04424bab1972591918497623a16"}, + {file = "pytokens-0.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:ee44d0f85b803321710f9239f335aafe16553b39106384cef8e6de40cb4ef2f6"}, + {file = "pytokens-0.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:140709331e846b728475786df8aeb27d24f48cbcf7bcd449f8de75cae7a45083"}, + {file = "pytokens-0.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d6c4268598f762bc8e91f5dbf2ab2f61f7b95bdc07953b602db879b3c8c18e1"}, + {file = "pytokens-0.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:24afde1f53d95348b5a0eb19488661147285ca4dd7ed752bbc3e1c6242a304d1"}, + {file = "pytokens-0.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5ad948d085ed6c16413eb5fec6b3e02fa00dc29a2534f088d3302c47eb59adf9"}, + {file = "pytokens-0.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:3f901fe783e06e48e8cbdc82d631fca8f118333798193e026a50ce1b3757ea68"}, + {file = "pytokens-0.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8bdb9d0ce90cbf99c525e75a2fa415144fd570a1ba987380190e8b786bc6ef9b"}, + {file = "pytokens-0.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5502408cab1cb18e128570f8d598981c68a50d0cbd7c61312a90507cd3a1276f"}, + {file = "pytokens-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:29d1d8fb1030af4d231789959f21821ab6325e463f0503a61d204343c9b355d1"}, + {file = "pytokens-0.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:970b08dd6b86058b6dc07efe9e98414f5102974716232d10f32ff39701e841c4"}, + {file = "pytokens-0.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:9bd7d7f544d362576be74f9d5901a22f317efc20046efe2034dced238cbbfe78"}, + {file = "pytokens-0.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4a14d5f5fc78ce85e426aa159489e2d5961acf0e47575e08f35584009178e321"}, + {file = "pytokens-0.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f50fd18543be72da51dd505e2ed20d2228c74e0464e4262e4899797803d7fa"}, + {file = "pytokens-0.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dc74c035f9bfca0255c1af77ddd2d6ae8419012805453e4b0e7513e17904545d"}, + {file = "pytokens-0.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f66a6bbe741bd431f6d741e617e0f39ec7257ca1f89089593479347cc4d13324"}, + {file = "pytokens-0.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:b35d7e5ad269804f6697727702da3c517bb8a5228afa450ab0fa787732055fc9"}, + {file = "pytokens-0.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:8fcb9ba3709ff77e77f1c7022ff11d13553f3c30299a9fe246a166903e9091eb"}, + {file = "pytokens-0.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:79fc6b8699564e1f9b521582c35435f1bd32dd06822322ec44afdeba666d8cb3"}, + {file = "pytokens-0.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d31b97b3de0f61571a124a00ffe9a81fb9939146c122c11060725bd5aea79975"}, + {file = "pytokens-0.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:967cf6e3fd4adf7de8fc73cd3043754ae79c36475c1c11d514fc72cf5490094a"}, + {file = "pytokens-0.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:584c80c24b078eec1e227079d56dc22ff755e0ba8654d8383b2c549107528918"}, + {file = "pytokens-0.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:da5baeaf7116dced9c6bb76dc31ba04a2dc3695f3d9f74741d7910122b456edc"}, + {file = "pytokens-0.4.1-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:11edda0942da80ff58c4408407616a310adecae1ddd22eef8c692fe266fa5009"}, + {file = "pytokens-0.4.1-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0fc71786e629cef478cbf29d7ea1923299181d0699dbe7c3c0f4a583811d9fc1"}, + {file = "pytokens-0.4.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:dcafc12c30dbaf1e2af0490978352e0c4041a7cde31f4f81435c2a5e8b9cabb6"}, + {file = "pytokens-0.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:42f144f3aafa5d92bad964d471a581651e28b24434d184871bd02e3a0d956037"}, + {file = "pytokens-0.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:34bcc734bd2f2d5fe3b34e7b3c0116bfb2397f2d9666139988e7a3eb5f7400e3"}, + {file = "pytokens-0.4.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:941d4343bf27b605e9213b26bfa1c4bf197c9c599a9627eb7305b0defcfe40c1"}, + {file = "pytokens-0.4.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3ad72b851e781478366288743198101e5eb34a414f1d5627cdd585ca3b25f1db"}, + {file = "pytokens-0.4.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:682fa37ff4d8e95f7df6fe6fe6a431e8ed8e788023c6bcc0f0880a12eab80ad1"}, + {file = "pytokens-0.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:30f51edd9bb7f85c748979384165601d028b84f7bd13fe14d3e065304093916a"}, + {file = "pytokens-0.4.1-py3-none-any.whl", hash = "sha256:26cef14744a8385f35d0e095dc8b3a7583f6c953c2e3d269c7f82484bf5ad2de"}, + {file = "pytokens-0.4.1.tar.gz", hash = "sha256:292052fe80923aae2260c073f822ceba21f3872ced9a68bb7953b348e561179a"}, +] + +[package.extras] +dev = ["black", "build", "mypy", "pytest", "pytest-cov", "setuptools", "tox", "twine", "wheel"] + [[package]] name = "pytorch-lightning" -version = "2.5.1.post0" +version = "2.6.1" description = "PyTorch Lightning is the lightweight PyTorch wrapper for ML researchers. Scale your models. Write less boilerplate." optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["main"] files = [ - {file = "pytorch_lightning-2.5.1.post0-py3-none-any.whl", hash = "sha256:873fb21392c8b79908218f5ca8f65bd835439216e52550c36ff55d849e99c93e"}, - {file = "pytorch_lightning-2.5.1.post0.tar.gz", hash = "sha256:abc3d5a804d41f941b14e3fd7db5572a1270cd1e9889b50e962984c87d498d94"}, + {file = "pytorch_lightning-2.6.1-py3-none-any.whl", hash = "sha256:1f8118567ec829e3055f16cf1aa320883a86a47c836951bfd9dcfa34ec7ffd59"}, + {file = "pytorch_lightning-2.6.1.tar.gz", hash = "sha256:ba08f8901cf226fcca473046ad9346f414e99117762dc869c76e650d5b3d7bdc"}, ] [package.dependencies] fsspec = {version = ">=2022.5.0", extras = ["http"]} lightning-utilities = ">=0.10.0" -packaging = ">=20.0" -PyYAML = ">=5.4" +packaging = ">=23.0" +PyYAML = ">5.4" torch = ">=2.1.0" -torchmetrics = ">=0.7.0" +torchmetrics = ">0.7.0" tqdm = ">=4.57.0" -typing-extensions = ">=4.4.0" +typing-extensions = ">4.5.0" [package.extras] -all = ["bitsandbytes (>=0.45.2) ; platform_system != \"Darwin\"", "deepspeed (>=0.8.2,<=0.9.3) ; platform_system != \"Windows\" and platform_system != \"Darwin\"", "hydra-core (>=1.2.0)", "ipython[all] (<8.15.0)", "jsonargparse[signatures] (>=4.27.7)", "lightning-utilities (>=0.8.0)", "matplotlib (>3.1)", "omegaconf (>=2.2.3)", "requests (<2.32.0)", "rich (>=12.3.0)", "tensorboardX (>=2.2)", "torchmetrics (>=0.10.0)", "torchvision (>=0.16.0)"] -deepspeed = ["deepspeed (>=0.8.2,<=0.9.3) ; platform_system != \"Windows\" and platform_system != \"Darwin\""] -dev = ["bitsandbytes (>=0.45.2) ; platform_system != \"Darwin\"", "cloudpickle (>=1.3)", "coverage (==7.3.1)", "deepspeed (>=0.8.2,<=0.9.3) ; platform_system != \"Windows\" and platform_system != \"Darwin\"", "fastapi", "hydra-core (>=1.2.0)", "ipython[all] (<8.15.0)", "jsonargparse[signatures] (>=4.27.7)", "lightning-utilities (>=0.8.0)", "matplotlib (>3.1)", "numpy (>=1.17.2)", "omegaconf (>=2.2.3)", "onnx (>=1.12.0)", "onnxruntime (>=1.12.0)", "pandas (>1.0)", "psutil (<5.9.6)", "pytest (==7.4.0)", "pytest-cov (==4.1.0)", "pytest-random-order (==1.1.0)", "pytest-rerunfailures (==12.0)", "pytest-timeout (==2.1.0)", "requests (<2.32.0)", "rich (>=12.3.0)", "scikit-learn (>0.22.1)", "tensorboard (>=2.9.1)", "tensorboardX (>=2.2)", "torchmetrics (>=0.10.0)", "torchvision (>=0.16.0)", "uvicorn"] -examples = ["ipython[all] (<8.15.0)", "lightning-utilities (>=0.8.0)", "requests (<2.32.0)", "torchmetrics (>=0.10.0)", "torchvision (>=0.16.0)"] -extra = ["bitsandbytes (>=0.45.2) ; platform_system != \"Darwin\"", "hydra-core (>=1.2.0)", "jsonargparse[signatures] (>=4.27.7)", "matplotlib (>3.1)", "omegaconf (>=2.2.3)", "rich (>=12.3.0)", "tensorboardX (>=2.2)"] -strategies = ["deepspeed (>=0.8.2,<=0.9.3) ; platform_system != \"Windows\" and platform_system != \"Darwin\""] -test = ["cloudpickle (>=1.3)", "coverage (==7.3.1)", "fastapi", "numpy (>=1.17.2)", "onnx (>=1.12.0)", "onnxruntime (>=1.12.0)", "pandas (>1.0)", "psutil (<5.9.6)", "pytest (==7.4.0)", "pytest-cov (==4.1.0)", "pytest-random-order (==1.1.0)", "pytest-rerunfailures (==12.0)", "pytest-timeout (==2.1.0)", "scikit-learn (>0.22.1)", "tensorboard (>=2.9.1)", "uvicorn"] +all = ["bitsandbytes (>=0.45.2) ; platform_system != \"Darwin\"", "deepspeed (>=0.15.0,<0.17.0) ; platform_system != \"Windows\" and platform_system != \"Darwin\"", "hydra-core (>=1.2.0)", "ipython[all] (>=8.0.0)", "jsonargparse[jsonnet,signatures] (>=4.39.0)", "matplotlib (>3.1)", "omegaconf (>=2.2.3)", "requests (<2.33.0)", "rich (>=12.3.0)", "tensorboardX (>=2.2)", "torchmetrics (>=0.10.0)", "torchvision (>=0.16.0)"] +deepspeed = ["deepspeed (>=0.15.0,<0.17.0) ; platform_system != \"Windows\" and platform_system != \"Darwin\""] +dev = ["bitsandbytes (>=0.45.2) ; platform_system != \"Darwin\"", "cloudpickle (>=1.3)", "coverage (==7.10.7) ; python_version < \"3.10\"", "coverage (==7.13.1) ; python_version >= \"3.10\"", "deepspeed (>=0.15.0,<0.17.0) ; platform_system != \"Windows\" and platform_system != \"Darwin\"", "fastapi", "huggingface-hub", "hydra-core (>=1.2.0)", "ipython[all] (>=8.0.0)", "jsonargparse[jsonnet,signatures] (>=4.39.0)", "matplotlib (>3.1)", "numpy (>1.21.0) ; python_version < \"3.12\"", "numpy (>2.1.0) ; python_version >= \"3.12\"", "omegaconf (>=2.2.3)", "onnx (>1.12.0)", "onnxruntime (>=1.12.0)", "onnxscript (>=0.1.0)", "pandas (>2.0)", "psutil (<7.3.0)", "pytest (==9.0.2)", "pytest-cov (==7.0.0)", "pytest-random-order (==1.2.0)", "pytest-rerunfailures (==16.0.1) ; python_version < \"3.10\"", "pytest-rerunfailures (==16.1) ; python_version >= \"3.10\"", "pytest-timeout (==2.4.0)", "requests (<2.33.0)", "rich (>=12.3.0)", "scikit-learn (>0.22.1)", "tensorboard (>=2.11)", "tensorboardX (>=2.2)", "torch-tensorrt ; platform_system != \"Darwin\" and python_version >= \"3.12\"", "torchmetrics (>=0.10.0)", "torchvision (>=0.16.0)", "uvicorn"] +examples = ["ipython[all] (>=8.0.0)", "requests (<2.33.0)", "torchmetrics (>=0.10.0)", "torchvision (>=0.16.0)"] +extra = ["bitsandbytes (>=0.45.2) ; platform_system != \"Darwin\"", "hydra-core (>=1.2.0)", "jsonargparse[jsonnet,signatures] (>=4.39.0)", "matplotlib (>3.1)", "omegaconf (>=2.2.3)", "rich (>=12.3.0)", "tensorboardX (>=2.2)"] +strategies = ["deepspeed (>=0.15.0,<0.17.0) ; platform_system != \"Windows\" and platform_system != \"Darwin\""] +test = ["cloudpickle (>=1.3)", "coverage (==7.10.7) ; python_version < \"3.10\"", "coverage (==7.13.1) ; python_version >= \"3.10\"", "fastapi", "huggingface-hub", "numpy (>1.21.0) ; python_version < \"3.12\"", "numpy (>2.1.0) ; python_version >= \"3.12\"", "onnx (>1.12.0)", "onnxruntime (>=1.12.0)", "onnxscript (>=0.1.0)", "pandas (>2.0)", "psutil (<7.3.0)", "pytest (==9.0.2)", "pytest-cov (==7.0.0)", "pytest-random-order (==1.2.0)", "pytest-rerunfailures (==16.0.1) ; python_version < \"3.10\"", "pytest-rerunfailures (==16.1) ; python_version >= \"3.10\"", "pytest-timeout (==2.4.0)", "scikit-learn (>0.22.1)", "tensorboard (>=2.11)", "torch-tensorrt ; platform_system != \"Darwin\" and python_version >= \"3.12\"", "uvicorn"] [[package]] name = "pytz" @@ -3272,14 +4047,14 @@ files = [ [[package]] name = "pyupgrade" -version = "3.19.1" +version = "3.21.2" description = "A tool to automatically upgrade syntax for newer versions." optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["development"] files = [ - {file = "pyupgrade-3.19.1-py2.py3-none-any.whl", hash = "sha256:8c5b0bfacae5ff30fa136a53eb7f22c34ba007450d4099e9da8089dabb9e67c9"}, - {file = "pyupgrade-3.19.1.tar.gz", hash = "sha256:d10e8c5f54b8327211828769e98d95d95e4715de632a3414f1eef3f51357b9e2"}, + {file = "pyupgrade-3.21.2-py2.py3-none-any.whl", hash = "sha256:2ac7b95cbd176475041e4dfe8ef81298bd4654a244f957167bd68af37d52be9f"}, + {file = "pyupgrade-3.21.2.tar.gz", hash = "sha256:1a361bea39deda78d1460f65d9dd548d3a36ff8171d2482298539b9dc11c9c06"}, ] [package.dependencies] @@ -3300,189 +4075,276 @@ files = [ [[package]] name = "pyyaml" -version = "6.0.2" +version = "6.0.3" description = "YAML parser and emitter for Python" optional = false python-versions = ">=3.8" groups = ["main", "development"] files = [ - {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, - {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, - {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, - {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, - {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, - {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, - {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, - {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, - {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, - {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, - {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, - {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, - {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, - {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, - {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, - {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, - {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, - {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, - {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, - {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, - {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, - {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, - {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, - {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, - {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, - {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, - {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, - {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, - {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, - {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, - {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, - {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, - {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, - {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, - {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, - {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, - {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, - {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, - {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, - {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, - {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, - {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, - {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, - {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, - {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, - {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, - {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, - {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, - {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, - {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, - {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, - {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, - {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, + {file = "PyYAML-6.0.3-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:c2514fceb77bc5e7a2f7adfaa1feb2fb311607c9cb518dbc378688ec73d8292f"}, + {file = "PyYAML-6.0.3-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c57bb8c96f6d1808c030b1687b9b5fb476abaa47f0db9c0101f5e9f394e97f4"}, + {file = "PyYAML-6.0.3-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:efd7b85f94a6f21e4932043973a7ba2613b059c4a000551892ac9f1d11f5baf3"}, + {file = "PyYAML-6.0.3-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22ba7cfcad58ef3ecddc7ed1db3409af68d023b7f940da23c6c2a1890976eda6"}, + {file = "PyYAML-6.0.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:6344df0d5755a2c9a276d4473ae6b90647e216ab4757f8426893b5dd2ac3f369"}, + {file = "PyYAML-6.0.3-cp38-cp38-win32.whl", hash = "sha256:3ff07ec89bae51176c0549bc4c63aa6202991da2d9a6129d7aef7f1407d3f295"}, + {file = "PyYAML-6.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:5cf4e27da7e3fbed4d6c3d8e797387aaad68102272f8f9752883bc32d61cb87b"}, + {file = "pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b"}, + {file = "pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956"}, + {file = "pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8"}, + {file = "pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198"}, + {file = "pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b"}, + {file = "pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0"}, + {file = "pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69"}, + {file = "pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e"}, + {file = "pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c"}, + {file = "pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e"}, + {file = "pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824"}, + {file = "pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c"}, + {file = "pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00"}, + {file = "pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d"}, + {file = "pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a"}, + {file = "pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4"}, + {file = "pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b"}, + {file = "pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf"}, + {file = "pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196"}, + {file = "pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0"}, + {file = "pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28"}, + {file = "pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c"}, + {file = "pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc"}, + {file = "pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e"}, + {file = "pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea"}, + {file = "pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5"}, + {file = "pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b"}, + {file = "pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd"}, + {file = "pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8"}, + {file = "pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1"}, + {file = "pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c"}, + {file = "pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5"}, + {file = "pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6"}, + {file = "pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6"}, + {file = "pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be"}, + {file = "pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26"}, + {file = "pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c"}, + {file = "pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb"}, + {file = "pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac"}, + {file = "pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310"}, + {file = "pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7"}, + {file = "pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788"}, + {file = "pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5"}, + {file = "pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764"}, + {file = "pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35"}, + {file = "pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac"}, + {file = "pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3"}, + {file = "pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3"}, + {file = "pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba"}, + {file = "pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c"}, + {file = "pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702"}, + {file = "pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c"}, + {file = "pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065"}, + {file = "pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65"}, + {file = "pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9"}, + {file = "pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b"}, + {file = "pyyaml-6.0.3-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:b865addae83924361678b652338317d1bd7e79b1f4596f96b96c77a5a34b34da"}, + {file = "pyyaml-6.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c3355370a2c156cffb25e876646f149d5d68f5e0a3ce86a5084dd0b64a994917"}, + {file = "pyyaml-6.0.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3c5677e12444c15717b902a5798264fa7909e41153cdf9ef7ad571b704a63dd9"}, + {file = "pyyaml-6.0.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5ed875a24292240029e4483f9d4a4b8a1ae08843b9c54f43fcc11e404532a8a5"}, + {file = "pyyaml-6.0.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0150219816b6a1fa26fb4699fb7daa9caf09eb1999f3b70fb6e786805e80375a"}, + {file = "pyyaml-6.0.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fa160448684b4e94d80416c0fa4aac48967a969efe22931448d853ada8baf926"}, + {file = "pyyaml-6.0.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:27c0abcb4a5dac13684a37f76e701e054692a9b2d3064b70f5e4eb54810553d7"}, + {file = "pyyaml-6.0.3-cp39-cp39-win32.whl", hash = "sha256:1ebe39cb5fc479422b83de611d14e2c0d3bb2a18bbcb01f229ab3cfbd8fee7a0"}, + {file = "pyyaml-6.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:2e71d11abed7344e42a8849600193d15b6def118602c4c176f748e4583246007"}, + {file = "pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f"}, ] [[package]] name = "rapidfuzz" -version = "3.13.0" +version = "3.14.3" description = "rapid fuzzy string matching" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["main"] files = [ - {file = "rapidfuzz-3.13.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:aafc42a1dc5e1beeba52cd83baa41372228d6d8266f6d803c16dbabbcc156255"}, - {file = "rapidfuzz-3.13.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:85c9a131a44a95f9cac2eb6e65531db014e09d89c4f18c7b1fa54979cb9ff1f3"}, - {file = "rapidfuzz-3.13.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d7cec4242d30dd521ef91c0df872e14449d1dffc2a6990ede33943b0dae56c3"}, - {file = "rapidfuzz-3.13.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e297c09972698c95649e89121e3550cee761ca3640cd005e24aaa2619175464e"}, - {file = "rapidfuzz-3.13.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ef0f5f03f61b0e5a57b1df7beafd83df993fd5811a09871bad6038d08e526d0d"}, - {file = "rapidfuzz-3.13.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d8cf5f7cd6e4d5eb272baf6a54e182b2c237548d048e2882258336533f3f02b7"}, - {file = "rapidfuzz-3.13.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9256218ac8f1a957806ec2fb9a6ddfc6c32ea937c0429e88cf16362a20ed8602"}, - {file = "rapidfuzz-3.13.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e1bdd2e6d0c5f9706ef7595773a81ca2b40f3b33fd7f9840b726fb00c6c4eb2e"}, - {file = "rapidfuzz-3.13.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5280be8fd7e2bee5822e254fe0a5763aa0ad57054b85a32a3d9970e9b09bbcbf"}, - {file = "rapidfuzz-3.13.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fd742c03885db1fce798a1cd87a20f47f144ccf26d75d52feb6f2bae3d57af05"}, - {file = "rapidfuzz-3.13.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:5435fcac94c9ecf0504bf88a8a60c55482c32e18e108d6079a0089c47f3f8cf6"}, - {file = "rapidfuzz-3.13.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:93a755266856599be4ab6346273f192acde3102d7aa0735e2f48b456397a041f"}, - {file = "rapidfuzz-3.13.0-cp310-cp310-win32.whl", hash = "sha256:3abe6a4e8eb4cfc4cda04dd650a2dc6d2934cbdeda5def7e6fd1c20f6e7d2a0b"}, - {file = "rapidfuzz-3.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:e8ddb58961401da7d6f55f185512c0d6bd24f529a637078d41dd8ffa5a49c107"}, - {file = "rapidfuzz-3.13.0-cp310-cp310-win_arm64.whl", hash = "sha256:c523620d14ebd03a8d473c89e05fa1ae152821920c3ff78b839218ff69e19ca3"}, - {file = "rapidfuzz-3.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d395a5cad0c09c7f096433e5fd4224d83b53298d53499945a9b0e5a971a84f3a"}, - {file = "rapidfuzz-3.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b7b3eda607a019169f7187328a8d1648fb9a90265087f6903d7ee3a8eee01805"}, - {file = "rapidfuzz-3.13.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98e0bfa602e1942d542de077baf15d658bd9d5dcfe9b762aff791724c1c38b70"}, - {file = "rapidfuzz-3.13.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bef86df6d59667d9655905b02770a0c776d2853971c0773767d5ef8077acd624"}, - {file = "rapidfuzz-3.13.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fedd316c165beed6307bf754dee54d3faca2c47e1f3bcbd67595001dfa11e969"}, - {file = "rapidfuzz-3.13.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5158da7f2ec02a930be13bac53bb5903527c073c90ee37804090614cab83c29e"}, - {file = "rapidfuzz-3.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b6f913ee4618ddb6d6f3e387b76e8ec2fc5efee313a128809fbd44e65c2bbb2"}, - {file = "rapidfuzz-3.13.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d25fdbce6459ccbbbf23b4b044f56fbd1158b97ac50994eaae2a1c0baae78301"}, - {file = "rapidfuzz-3.13.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:25343ccc589a4579fbde832e6a1e27258bfdd7f2eb0f28cb836d6694ab8591fc"}, - {file = "rapidfuzz-3.13.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a9ad1f37894e3ffb76bbab76256e8a8b789657183870be11aa64e306bb5228fd"}, - {file = "rapidfuzz-3.13.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5dc71ef23845bb6b62d194c39a97bb30ff171389c9812d83030c1199f319098c"}, - {file = "rapidfuzz-3.13.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b7f4c65facdb94f44be759bbd9b6dda1fa54d0d6169cdf1a209a5ab97d311a75"}, - {file = "rapidfuzz-3.13.0-cp311-cp311-win32.whl", hash = "sha256:b5104b62711565e0ff6deab2a8f5dbf1fbe333c5155abe26d2cfd6f1849b6c87"}, - {file = "rapidfuzz-3.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:9093cdeb926deb32a4887ebe6910f57fbcdbc9fbfa52252c10b56ef2efb0289f"}, - {file = "rapidfuzz-3.13.0-cp311-cp311-win_arm64.whl", hash = "sha256:f70f646751b6aa9d05be1fb40372f006cc89d6aad54e9d79ae97bd1f5fce5203"}, - {file = "rapidfuzz-3.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a1a6a906ba62f2556372282b1ef37b26bca67e3d2ea957277cfcefc6275cca7"}, - {file = "rapidfuzz-3.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2fd0975e015b05c79a97f38883a11236f5a24cca83aa992bd2558ceaa5652b26"}, - {file = "rapidfuzz-3.13.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d4e13593d298c50c4f94ce453f757b4b398af3fa0fd2fde693c3e51195b7f69"}, - {file = "rapidfuzz-3.13.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed6f416bda1c9133000009d84d9409823eb2358df0950231cc936e4bf784eb97"}, - {file = "rapidfuzz-3.13.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1dc82b6ed01acb536b94a43996a94471a218f4d89f3fdd9185ab496de4b2a981"}, - {file = "rapidfuzz-3.13.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9d824de871daa6e443b39ff495a884931970d567eb0dfa213d234337343835f"}, - {file = "rapidfuzz-3.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d18228a2390375cf45726ce1af9d36ff3dc1f11dce9775eae1f1b13ac6ec50f"}, - {file = "rapidfuzz-3.13.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9f5fe634c9482ec5d4a6692afb8c45d370ae86755e5f57aa6c50bfe4ca2bdd87"}, - {file = "rapidfuzz-3.13.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:694eb531889f71022b2be86f625a4209c4049e74be9ca836919b9e395d5e33b3"}, - {file = "rapidfuzz-3.13.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:11b47b40650e06147dee5e51a9c9ad73bb7b86968b6f7d30e503b9f8dd1292db"}, - {file = "rapidfuzz-3.13.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:98b8107ff14f5af0243f27d236bcc6e1ef8e7e3b3c25df114e91e3a99572da73"}, - {file = "rapidfuzz-3.13.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b836f486dba0aceb2551e838ff3f514a38ee72b015364f739e526d720fdb823a"}, - {file = "rapidfuzz-3.13.0-cp312-cp312-win32.whl", hash = "sha256:4671ee300d1818d7bdfd8fa0608580d7778ba701817216f0c17fb29e6b972514"}, - {file = "rapidfuzz-3.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:6e2065f68fb1d0bf65adc289c1bdc45ba7e464e406b319d67bb54441a1b9da9e"}, - {file = "rapidfuzz-3.13.0-cp312-cp312-win_arm64.whl", hash = "sha256:65cc97c2fc2c2fe23586599686f3b1ceeedeca8e598cfcc1b7e56dc8ca7e2aa7"}, - {file = "rapidfuzz-3.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:09e908064d3684c541d312bd4c7b05acb99a2c764f6231bd507d4b4b65226c23"}, - {file = "rapidfuzz-3.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:57c390336cb50d5d3bfb0cfe1467478a15733703af61f6dffb14b1cd312a6fae"}, - {file = "rapidfuzz-3.13.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0da54aa8547b3c2c188db3d1c7eb4d1bb6dd80baa8cdaeaec3d1da3346ec9caa"}, - {file = "rapidfuzz-3.13.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df8e8c21e67afb9d7fbe18f42c6111fe155e801ab103c81109a61312927cc611"}, - {file = "rapidfuzz-3.13.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:461fd13250a2adf8e90ca9a0e1e166515cbcaa5e9c3b1f37545cbbeff9e77f6b"}, - {file = "rapidfuzz-3.13.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2b3dd5d206a12deca16870acc0d6e5036abeb70e3cad6549c294eff15591527"}, - {file = "rapidfuzz-3.13.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1343d745fbf4688e412d8f398c6e6d6f269db99a54456873f232ba2e7aeb4939"}, - {file = "rapidfuzz-3.13.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b1b065f370d54551dcc785c6f9eeb5bd517ae14c983d2784c064b3aa525896df"}, - {file = "rapidfuzz-3.13.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:11b125d8edd67e767b2295eac6eb9afe0b1cdc82ea3d4b9257da4b8e06077798"}, - {file = "rapidfuzz-3.13.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c33f9c841630b2bb7e69a3fb5c84a854075bb812c47620978bddc591f764da3d"}, - {file = "rapidfuzz-3.13.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:ae4574cb66cf1e85d32bb7e9ec45af5409c5b3970b7ceb8dea90168024127566"}, - {file = "rapidfuzz-3.13.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e05752418b24bbd411841b256344c26f57da1148c5509e34ea39c7eb5099ab72"}, - {file = "rapidfuzz-3.13.0-cp313-cp313-win32.whl", hash = "sha256:0e1d08cb884805a543f2de1f6744069495ef527e279e05370dd7c83416af83f8"}, - {file = "rapidfuzz-3.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:9a7c6232be5f809cd39da30ee5d24e6cadd919831e6020ec6c2391f4c3bc9264"}, - {file = "rapidfuzz-3.13.0-cp313-cp313-win_arm64.whl", hash = "sha256:3f32f15bacd1838c929b35c84b43618481e1b3d7a61b5ed2db0291b70ae88b53"}, - {file = "rapidfuzz-3.13.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cc64da907114d7a18b5e589057e3acaf2fec723d31c49e13fedf043592a3f6a7"}, - {file = "rapidfuzz-3.13.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4d9d7f84c8e992a8dbe5a3fdbea73d733da39bf464e62c912ac3ceba9c0cff93"}, - {file = "rapidfuzz-3.13.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a79a2f07786a2070669b4b8e45bd96a01c788e7a3c218f531f3947878e0f956"}, - {file = "rapidfuzz-3.13.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9f338e71c45b69a482de8b11bf4a029993230760120c8c6e7c9b71760b6825a1"}, - {file = "rapidfuzz-3.13.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:adb40ca8ddfcd4edd07b0713a860be32bdf632687f656963bcbce84cea04b8d8"}, - {file = "rapidfuzz-3.13.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48719f7dcf62dfb181063b60ee2d0a39d327fa8ad81b05e3e510680c44e1c078"}, - {file = "rapidfuzz-3.13.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9327a4577f65fc3fb712e79f78233815b8a1c94433d0c2c9f6bc5953018b3565"}, - {file = "rapidfuzz-3.13.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:200030dfc0a1d5d6ac18e993c5097c870c97c41574e67f227300a1fb74457b1d"}, - {file = "rapidfuzz-3.13.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:cc269e74cad6043cb8a46d0ce580031ab642b5930562c2bb79aa7fbf9c858d26"}, - {file = "rapidfuzz-3.13.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:e62779c6371bd2b21dbd1fdce89eaec2d93fd98179d36f61130b489f62294a92"}, - {file = "rapidfuzz-3.13.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:f4797f821dc5d7c2b6fc818b89f8a3f37bcc900dd9e4369e6ebf1e525efce5db"}, - {file = "rapidfuzz-3.13.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d21f188f6fe4fbf422e647ae9d5a68671d00218e187f91859c963d0738ccd88c"}, - {file = "rapidfuzz-3.13.0-cp39-cp39-win32.whl", hash = "sha256:45dd4628dd9c21acc5c97627dad0bb791764feea81436fb6e0a06eef4c6dceaa"}, - {file = "rapidfuzz-3.13.0-cp39-cp39-win_amd64.whl", hash = "sha256:624a108122039af89ddda1a2b7ab2a11abe60c1521956f142f5d11bcd42ef138"}, - {file = "rapidfuzz-3.13.0-cp39-cp39-win_arm64.whl", hash = "sha256:435071fd07a085ecbf4d28702a66fd2e676a03369ee497cc38bcb69a46bc77e2"}, - {file = "rapidfuzz-3.13.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fe5790a36d33a5d0a6a1f802aa42ecae282bf29ac6f7506d8e12510847b82a45"}, - {file = "rapidfuzz-3.13.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:cdb33ee9f8a8e4742c6b268fa6bd739024f34651a06b26913381b1413ebe7590"}, - {file = "rapidfuzz-3.13.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c99b76b93f7b495eee7dcb0d6a38fb3ce91e72e99d9f78faa5664a881cb2b7d"}, - {file = "rapidfuzz-3.13.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6af42f2ede8b596a6aaf6d49fdee3066ca578f4856b85ab5c1e2145de367a12d"}, - {file = "rapidfuzz-3.13.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c0efa73afbc5b265aca0d8a467ae2a3f40d6854cbe1481cb442a62b7bf23c99"}, - {file = "rapidfuzz-3.13.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7ac21489de962a4e2fc1e8f0b0da4aa1adc6ab9512fd845563fecb4b4c52093a"}, - {file = "rapidfuzz-3.13.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1ba007f4d35a45ee68656b2eb83b8715e11d0f90e5b9f02d615a8a321ff00c27"}, - {file = "rapidfuzz-3.13.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d7a217310429b43be95b3b8ad7f8fc41aba341109dc91e978cd7c703f928c58f"}, - {file = "rapidfuzz-3.13.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:558bf526bcd777de32b7885790a95a9548ffdcce68f704a81207be4a286c1095"}, - {file = "rapidfuzz-3.13.0-pp311-pypy311_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:202a87760f5145140d56153b193a797ae9338f7939eb16652dd7ff96f8faf64c"}, - {file = "rapidfuzz-3.13.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfcccc08f671646ccb1e413c773bb92e7bba789e3a1796fd49d23c12539fe2e4"}, - {file = "rapidfuzz-3.13.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:1f219f1e3c3194d7a7de222f54450ce12bc907862ff9a8962d83061c1f923c86"}, - {file = "rapidfuzz-3.13.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ccbd0e7ea1a216315f63ffdc7cd09c55f57851afc8fe59a74184cb7316c0598b"}, - {file = "rapidfuzz-3.13.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:a50856f49a4016ef56edd10caabdaf3608993f9faf1e05c3c7f4beeac46bd12a"}, - {file = "rapidfuzz-3.13.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fd05336db4d0b8348d7eaaf6fa3c517b11a56abaa5e89470ce1714e73e4aca7"}, - {file = "rapidfuzz-3.13.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:573ad267eb9b3f6e9b04febce5de55d8538a87c56c64bf8fd2599a48dc9d8b77"}, - {file = "rapidfuzz-3.13.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:30fd1451f87ccb6c2f9d18f6caa483116bbb57b5a55d04d3ddbd7b86f5b14998"}, - {file = "rapidfuzz-3.13.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a6dd36d4916cf57ddb05286ed40b09d034ca5d4bca85c17be0cb6a21290597d9"}, - {file = "rapidfuzz-3.13.0.tar.gz", hash = "sha256:d2eaf3839e52cbcc0accbe9817a67b4b0fcf70aaeb229cfddc1c28061f9ce5d8"}, + {file = "rapidfuzz-3.14.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b9fcd4d751a4fffa17aed1dde41647923c72c74af02459ad1222e3b0022da3a1"}, + {file = "rapidfuzz-3.14.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4ad73afb688b36864a8d9b7344a9cf6da186c471e5790cbf541a635ee0f457f2"}, + {file = "rapidfuzz-3.14.3-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c5fb2d978a601820d2cfd111e2c221a9a7bfdf84b41a3ccbb96ceef29f2f1ac7"}, + {file = "rapidfuzz-3.14.3-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1d83b8b712fa37e06d59f29a4b49e2e9e8635e908fbc21552fe4d1163db9d2a1"}, + {file = "rapidfuzz-3.14.3-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:dc8c07801df5206b81ed6bd6c35cb520cf9b6c64b9b0d19d699f8633dc942897"}, + {file = "rapidfuzz-3.14.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c71ce6d4231e5ef2e33caa952bfe671cb9fd42e2afb11952df9fad41d5c821f9"}, + {file = "rapidfuzz-3.14.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:0e38828d1381a0cceb8a4831212b2f673d46f5129a1897b0451c883eaf4a1747"}, + {file = "rapidfuzz-3.14.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:da2a007434323904719158e50f3076a4dadb176ce43df28ed14610c773cc9825"}, + {file = "rapidfuzz-3.14.3-cp310-cp310-win32.whl", hash = "sha256:fce3152f94afcfd12f3dd8cf51e48fa606e3cb56719bccebe3b401f43d0714f9"}, + {file = "rapidfuzz-3.14.3-cp310-cp310-win_amd64.whl", hash = "sha256:37d3c653af15cd88592633e942f5407cb4c64184efab163c40fcebad05f25141"}, + {file = "rapidfuzz-3.14.3-cp310-cp310-win_arm64.whl", hash = "sha256:cc594bbcd3c62f647dfac66800f307beaee56b22aaba1c005e9c4c40ed733923"}, + {file = "rapidfuzz-3.14.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dea2d113e260a5da0c4003e0a5e9fdf24a9dc2bb9eaa43abd030a1e46ce7837d"}, + {file = "rapidfuzz-3.14.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e6c31a4aa68cfa75d7eede8b0ed24b9e458447db604c2db53f358be9843d81d3"}, + {file = "rapidfuzz-3.14.3-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:02821366d928e68ddcb567fed8723dad7ea3a979fada6283e6914d5858674850"}, + {file = "rapidfuzz-3.14.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cfe8df315ab4e6db4e1be72c5170f8e66021acde22cd2f9d04d2058a9fd8162e"}, + {file = "rapidfuzz-3.14.3-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:769f31c60cd79420188fcdb3c823227fc4a6deb35cafec9d14045c7f6743acae"}, + {file = "rapidfuzz-3.14.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:54fa03062124e73086dae66a3451c553c1e20a39c077fd704dc7154092c34c63"}, + {file = "rapidfuzz-3.14.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:834d1e818005ed0d4ae38f6b87b86fad9b0a74085467ece0727d20e15077c094"}, + {file = "rapidfuzz-3.14.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:948b00e8476a91f510dd1ec07272efc7d78c275d83b630455559671d4e33b678"}, + {file = "rapidfuzz-3.14.3-cp311-cp311-win32.whl", hash = "sha256:43d0305c36f504232f18ea04e55f2059bb89f169d3119c4ea96a0e15b59e2a91"}, + {file = "rapidfuzz-3.14.3-cp311-cp311-win_amd64.whl", hash = "sha256:ef6bf930b947bd0735c550683939a032090f1d688dfd8861d6b45307b96fd5c5"}, + {file = "rapidfuzz-3.14.3-cp311-cp311-win_arm64.whl", hash = "sha256:f3eb0ff3b75d6fdccd40b55e7414bb859a1cda77c52762c9c82b85569f5088e7"}, + {file = "rapidfuzz-3.14.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:685c93ea961d135893b5984a5a9851637d23767feabe414ec974f43babbd8226"}, + {file = "rapidfuzz-3.14.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fa7c8f26f009f8c673fbfb443792f0cf8cf50c4e18121ff1e285b5e08a94fbdb"}, + {file = "rapidfuzz-3.14.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:57f878330c8d361b2ce76cebb8e3e1dc827293b6abf404e67d53260d27b5d941"}, + {file = "rapidfuzz-3.14.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6c5f545f454871e6af05753a0172849c82feaf0f521c5ca62ba09e1b382d6382"}, + {file = "rapidfuzz-3.14.3-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:07aa0b5d8863e3151e05026a28e0d924accf0a7a3b605da978f0359bb804df43"}, + {file = "rapidfuzz-3.14.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:73b07566bc7e010e7b5bd490fb04bb312e820970180df6b5655e9e6224c137db"}, + {file = "rapidfuzz-3.14.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:6de00eb84c71476af7d3110cf25d8fe7c792d7f5fa86764ef0b4ca97e78ca3ed"}, + {file = "rapidfuzz-3.14.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d7843a1abf0091773a530636fdd2a49a41bcae22f9910b86b4f903e76ddc82dc"}, + {file = "rapidfuzz-3.14.3-cp312-cp312-win32.whl", hash = "sha256:dea97ac3ca18cd3ba8f3d04b5c1fe4aa60e58e8d9b7793d3bd595fdb04128d7a"}, + {file = "rapidfuzz-3.14.3-cp312-cp312-win_amd64.whl", hash = "sha256:b5100fd6bcee4d27f28f4e0a1c6b5127bc8ba7c2a9959cad9eab0bf4a7ab3329"}, + {file = "rapidfuzz-3.14.3-cp312-cp312-win_arm64.whl", hash = "sha256:4e49c9e992bc5fc873bd0fff7ef16a4405130ec42f2ce3d2b735ba5d3d4eb70f"}, + {file = "rapidfuzz-3.14.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dbcb726064b12f356bf10fffdb6db4b6dce5390b23627c08652b3f6e49aa56ae"}, + {file = "rapidfuzz-3.14.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1704fc70d214294e554a2421b473779bcdeef715881c5e927dc0f11e1692a0ff"}, + {file = "rapidfuzz-3.14.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cc65e72790ddfd310c2c8912b45106e3800fefe160b0c2ef4d6b6fec4e826457"}, + {file = "rapidfuzz-3.14.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43e38c1305cffae8472572a0584d4ffc2f130865586a81038ca3965301f7c97c"}, + {file = "rapidfuzz-3.14.3-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:e195a77d06c03c98b3fc06b8a28576ba824392ce40de8c708f96ce04849a052e"}, + {file = "rapidfuzz-3.14.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1b7ef2f4b8583a744338a18f12c69693c194fb6777c0e9ada98cd4d9e8f09d10"}, + {file = "rapidfuzz-3.14.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:a2135b138bcdcb4c3742d417f215ac2d8c2b87bde15b0feede231ae95f09ec41"}, + {file = "rapidfuzz-3.14.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:33a325ed0e8e1aa20c3e75f8ab057a7b248fdea7843c2a19ade0008906c14af0"}, + {file = "rapidfuzz-3.14.3-cp313-cp313-win32.whl", hash = "sha256:8383b6d0d92f6cd008f3c9216535be215a064b2cc890398a678b56e6d280cb63"}, + {file = "rapidfuzz-3.14.3-cp313-cp313-win_amd64.whl", hash = "sha256:e6b5e3036976f0fde888687d91be86d81f9ac5f7b02e218913c38285b756be6c"}, + {file = "rapidfuzz-3.14.3-cp313-cp313-win_arm64.whl", hash = "sha256:7ba009977601d8b0828bfac9a110b195b3e4e79b350dcfa48c11269a9f1918a0"}, + {file = "rapidfuzz-3.14.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a0a28add871425c2fe94358c6300bbeb0bc2ed828ca003420ac6825408f5a424"}, + {file = "rapidfuzz-3.14.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:010e12e2411a4854b0434f920e72b717c43f8ec48d57e7affe5c42ecfa05dd0e"}, + {file = "rapidfuzz-3.14.3-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5cfc3d57abd83c734d1714ec39c88a34dd69c85474918ebc21296f1e61eb5ca8"}, + {file = "rapidfuzz-3.14.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:89acb8cbb52904f763e5ac238083b9fc193bed8d1f03c80568b20e4cef43a519"}, + {file = "rapidfuzz-3.14.3-cp313-cp313t-manylinux_2_31_armv7l.whl", hash = "sha256:7d9af908c2f371bfb9c985bd134e295038e3031e666e4b2ade1e7cb7f5af2f1a"}, + {file = "rapidfuzz-3.14.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:1f1925619627f8798f8c3a391d81071336942e5fe8467bc3c567f982e7ce2897"}, + {file = "rapidfuzz-3.14.3-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:152555187360978119e98ce3e8263d70dd0c40c7541193fc302e9b7125cf8f58"}, + {file = "rapidfuzz-3.14.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:52619d25a09546b8db078981ca88939d72caa6b8701edd8b22e16482a38e799f"}, + {file = "rapidfuzz-3.14.3-cp313-cp313t-win32.whl", hash = "sha256:489ce98a895c98cad284f0a47960c3e264c724cb4cfd47a1430fa091c0c25204"}, + {file = "rapidfuzz-3.14.3-cp313-cp313t-win_amd64.whl", hash = "sha256:656e52b054d5b5c2524169240e50cfa080b04b1c613c5f90a2465e84888d6f15"}, + {file = "rapidfuzz-3.14.3-cp313-cp313t-win_arm64.whl", hash = "sha256:c7e40c0a0af02ad6e57e89f62bef8604f55a04ecae90b0ceeda591bbf5923317"}, + {file = "rapidfuzz-3.14.3-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:442125473b247227d3f2de807a11da6c08ccf536572d1be943f8e262bae7e4ea"}, + {file = "rapidfuzz-3.14.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1ec0c8c0c3d4f97ced46b2e191e883f8c82dbbf6d5ebc1842366d7eff13cd5a6"}, + {file = "rapidfuzz-3.14.3-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2dc37bc20272f388b8c3a4eba4febc6e77e50a8f450c472def4751e7678f55e4"}, + {file = "rapidfuzz-3.14.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dee362e7e79bae940a5e2b3f6d09c6554db6a4e301cc68343886c08be99844f1"}, + {file = "rapidfuzz-3.14.3-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:4b39921df948388a863f0e267edf2c36302983459b021ab928d4b801cbe6a421"}, + {file = "rapidfuzz-3.14.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:beda6aa9bc44d1d81242e7b291b446be352d3451f8217fcb068fc2933927d53b"}, + {file = "rapidfuzz-3.14.3-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:6a014ba09657abfcfeed64b7d09407acb29af436d7fc075b23a298a7e4a6b41c"}, + {file = "rapidfuzz-3.14.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:32eeafa3abce138bb725550c0e228fc7eaeec7059aa8093d9cbbec2b58c2371a"}, + {file = "rapidfuzz-3.14.3-cp314-cp314-win32.whl", hash = "sha256:adb44d996fc610c7da8c5048775b21db60dd63b1548f078e95858c05c86876a3"}, + {file = "rapidfuzz-3.14.3-cp314-cp314-win_amd64.whl", hash = "sha256:f3d15d8527e2b293e38ce6e437631af0708df29eafd7c9fc48210854c94472f9"}, + {file = "rapidfuzz-3.14.3-cp314-cp314-win_arm64.whl", hash = "sha256:576e4b9012a67e0bf54fccb69a7b6c94d4e86a9540a62f1a5144977359133583"}, + {file = "rapidfuzz-3.14.3-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:cec3c0da88562727dd5a5a364bd9efeb535400ff0bfb1443156dd139a1dd7b50"}, + {file = "rapidfuzz-3.14.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d1fa009f8b1100e4880868137e7bf0501422898f7674f2adcd85d5a67f041296"}, + {file = "rapidfuzz-3.14.3-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b86daa7419b5e8b180690efd1fdbac43ff19230803282521c5b5a9c83977655"}, + {file = "rapidfuzz-3.14.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c7bd1816db05d6c5ffb3a4df0a2b7b56fb8c81ef584d08e37058afa217da91b1"}, + {file = "rapidfuzz-3.14.3-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:33da4bbaf44e9755b0ce192597f3bde7372fe2e381ab305f41b707a95ac57aa7"}, + {file = "rapidfuzz-3.14.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:3fecce764cf5a991ee2195a844196da840aba72029b2612f95ac68a8b74946bf"}, + {file = "rapidfuzz-3.14.3-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:ecd7453e02cf072258c3a6b8e930230d789d5d46cc849503729f9ce475d0e785"}, + {file = "rapidfuzz-3.14.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ea188aa00e9bcae8c8411f006a5f2f06c4607a02f24eab0d8dc58566aa911f35"}, + {file = "rapidfuzz-3.14.3-cp314-cp314t-win32.whl", hash = "sha256:7ccbf68100c170e9a0581accbe9291850936711548c6688ce3bfb897b8c589ad"}, + {file = "rapidfuzz-3.14.3-cp314-cp314t-win_amd64.whl", hash = "sha256:9ec02e62ae765a318d6de38df609c57fc6dacc65c0ed1fd489036834fd8a620c"}, + {file = "rapidfuzz-3.14.3-cp314-cp314t-win_arm64.whl", hash = "sha256:e805e52322ae29aa945baf7168b6c898120fbc16d2b8f940b658a5e9e3999253"}, + {file = "rapidfuzz-3.14.3-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7cf174b52cb3ef5d49e45d0a1133b7e7d0ecf770ed01f97ae9962c5c91d97d23"}, + {file = "rapidfuzz-3.14.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:442cba39957a008dfc5bdef21a9c3f4379e30ffb4e41b8555dbaf4887eca9300"}, + {file = "rapidfuzz-3.14.3-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1faa0f8f76ba75fd7b142c984947c280ef6558b5067af2ae9b8729b0a0f99ede"}, + {file = "rapidfuzz-3.14.3-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1e6eefec45625c634926a9fd46c9e4f31118ac8f3156fff9494422cee45207e6"}, + {file = "rapidfuzz-3.14.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:56fefb4382bb12250f164250240b9dd7772e41c5c8ae976fd598a32292449cc5"}, + {file = "rapidfuzz-3.14.3.tar.gz", hash = "sha256:2491937177868bc4b1e469087601d53f925e8d270ccc21e07404b4b5814b7b5f"}, ] [package.extras] all = ["numpy"] +[[package]] +name = "ray" +version = "2.53.0" +description = "Ray provides a simple, universal API for building distributed applications." +optional = false +python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"multiprocessing\"" +files = [ + {file = "ray-2.53.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:4db914a0a6dd608fa49c066929a1282745a2dbd73caee67d7b80fe684ca65bdd"}, + {file = "ray-2.53.0-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:4108280d8a1cb90d7d68e5c954c35e63b8bb9a4ba15f88c5e7da0e2025647712"}, + {file = "ray-2.53.0-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:4dbb5fce1364763f29741055f50abe33cf726397141f9cc0e845dd3cc963e455"}, + {file = "ray-2.53.0-cp310-cp310-win_amd64.whl", hash = "sha256:90faf630d20b6abf3135997fb3edb5842134aff92e04ee709865db04816d97ef"}, + {file = "ray-2.53.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:bd3ec4c342776ddac23ae2b108c64f5939f417ccc4875900d586c7c978463269"}, + {file = "ray-2.53.0-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:a0bbb98b0b0f25a3ee075ca10171e1260e70b6bc690cd509ecd7ce1228af854d"}, + {file = "ray-2.53.0-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:eb000c17f7301071fdd15c44c4cd3ac0f7953bb4c7c227e61719fe7048195bcd"}, + {file = "ray-2.53.0-cp311-cp311-win_amd64.whl", hash = "sha256:4a1bb3fe09ab4cd0d16ddc96b9f60c9ed83b3f93b87aa8506e0d3b746fd4e825"}, + {file = "ray-2.53.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:d8b95d047d947493803fb8417aea31225dcacdab15afdc75b8a238901949d457"}, + {file = "ray-2.53.0-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:65e2ce58d3dc6baa3cf45824d889c1968ebde565ee54dfd80a98af8f31af8e4a"}, + {file = "ray-2.53.0-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:14f46363e9b4cf0c1c8b4d8623ec337c5bd408377831b5e5b50067930137bbca"}, + {file = "ray-2.53.0-cp312-cp312-win_amd64.whl", hash = "sha256:b828c147f9ff2f277b1d254e4fe9a746fdfaee7e313a93a97c7edf4dae9b81a4"}, + {file = "ray-2.53.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:85b472ab6fb8f1189f8cef81913fd91b24dd69b3fa7dcca7e144827bd924f6c0"}, + {file = "ray-2.53.0-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:7196e5358dfcc8211be864f45e6dfe4827202df294af3c7a76ff8fbc080e0522"}, + {file = "ray-2.53.0-cp313-cp313-manylinux2014_x86_64.whl", hash = "sha256:73dbbaa7962a7f5e38aa8cf9483e0e9817205e989aa3dc859c738c2af1ae01df"}, +] + +[package.dependencies] +click = ">=7.0" +filelock = "*" +fsspec = {version = "*", optional = true, markers = "extra == \"tune\""} +jsonschema = "*" +msgpack = ">=1.0.0,<2.0.0" +packaging = ">=24.2" +pandas = {version = "*", optional = true, markers = "extra == \"tune\""} +protobuf = ">=3.20.3" +pyarrow = {version = ">=9.0.0", optional = true, markers = "extra == \"tune\""} +pydantic = {version = "<2.0.dev0 || >=2.12.dev0,<3", optional = true, markers = "extra == \"tune\""} +pyyaml = "*" +requests = "*" +tensorboardX = {version = ">=1.9", optional = true, markers = "extra == \"tune\""} + +[package.extras] +adag = ["cupy-cuda12x ; sys_platform != \"darwin\""] +air = ["aiohttp (>=3.7)", "aiohttp_cors", "colorful", "fastapi", "fsspec", "grpcio (>=1.32.0) ; python_version < \"3.10\"", "grpcio (>=1.42.0) ; python_version >= \"3.10\"", "numpy (>=1.20)", "opencensus", "opentelemetry-exporter-prometheus", "opentelemetry-proto", "opentelemetry-sdk (>=1.30.0)", "pandas", "pandas (>=1.3)", "prometheus_client (>=0.7.1)", "py-spy (>=0.2.0) ; python_version < \"3.12\"", "py-spy (>=0.4.0) ; python_version >= \"3.12\"", "pyarrow (>=9.0.0)", "pydantic (<2.0.dev0 || >=2.12.dev0,<3)", "requests", "smart_open", "starlette", "tensorboardX (>=1.9)", "uvicorn[standard]", "virtualenv (>=20.0.24,!=20.21.1)", "watchfiles"] +all = ["aiohttp (>=3.7)", "aiohttp_cors", "celery", "colorful", "cupy-cuda12x ; sys_platform != \"darwin\"", "dm_tree", "fastapi", "fsspec", "grpcio", "grpcio (!=1.56.0) ; sys_platform == \"darwin\"", "grpcio (>=1.32.0) ; python_version < \"3.10\"", "grpcio (>=1.42.0) ; python_version >= \"3.10\"", "gymnasium (==1.1.1)", "lz4", "memray ; sys_platform != \"win32\"", "numpy (>=1.20)", "opencensus", "opentelemetry-exporter-prometheus", "opentelemetry-proto", "opentelemetry-sdk (>=1.30.0)", "ormsgpack (==1.7.0)", "pandas", "pandas (>=1.3)", "prometheus_client (>=0.7.1)", "py-spy (>=0.2.0) ; python_version < \"3.12\"", "py-spy (>=0.4.0) ; python_version >= \"3.12\"", "pyOpenSSL", "pyarrow (>=9.0.0)", "pydantic (<2.0.dev0 || >=2.12.dev0,<3)", "pyyaml", "requests", "scipy", "smart_open", "starlette", "tensorboardX (>=1.9)", "uvicorn[standard]", "virtualenv (>=20.0.24,!=20.21.1)", "watchfiles"] +all-cpp = ["aiohttp (>=3.7)", "aiohttp_cors", "celery", "colorful", "cupy-cuda12x ; sys_platform != \"darwin\"", "dm_tree", "fastapi", "fsspec", "grpcio", "grpcio (!=1.56.0) ; sys_platform == \"darwin\"", "grpcio (>=1.32.0) ; python_version < \"3.10\"", "grpcio (>=1.42.0) ; python_version >= \"3.10\"", "gymnasium (==1.1.1)", "lz4", "memray ; sys_platform != \"win32\"", "numpy (>=1.20)", "opencensus", "opentelemetry-exporter-prometheus", "opentelemetry-proto", "opentelemetry-sdk (>=1.30.0)", "ormsgpack (==1.7.0)", "pandas", "pandas (>=1.3)", "prometheus_client (>=0.7.1)", "py-spy (>=0.2.0) ; python_version < \"3.12\"", "py-spy (>=0.4.0) ; python_version >= \"3.12\"", "pyOpenSSL", "pyarrow (>=9.0.0)", "pydantic (<2.0.dev0 || >=2.12.dev0,<3)", "pyyaml", "ray-cpp (==2.53.0)", "requests", "scipy", "smart_open", "starlette", "tensorboardX (>=1.9)", "uvicorn[standard]", "virtualenv (>=20.0.24,!=20.21.1)", "watchfiles"] +cgraph = ["cupy-cuda12x ; sys_platform != \"darwin\""] +client = ["grpcio", "grpcio (!=1.56.0) ; sys_platform == \"darwin\""] +cpp = ["ray-cpp (==2.53.0)"] +data = ["fsspec", "numpy (>=1.20)", "pandas (>=1.3)", "pyarrow (>=9.0.0)"] +default = ["aiohttp (>=3.7)", "aiohttp_cors", "colorful", "grpcio (>=1.32.0) ; python_version < \"3.10\"", "grpcio (>=1.42.0) ; python_version >= \"3.10\"", "opencensus", "opentelemetry-exporter-prometheus", "opentelemetry-proto", "opentelemetry-sdk (>=1.30.0)", "prometheus_client (>=0.7.1)", "py-spy (>=0.2.0) ; python_version < \"3.12\"", "py-spy (>=0.4.0) ; python_version >= \"3.12\"", "pydantic (<2.0.dev0 || >=2.12.dev0,<3)", "requests", "smart_open", "virtualenv (>=20.0.24,!=20.21.1)"] +llm = ["aiohttp (>=3.7)", "aiohttp_cors", "async-timeout ; python_version < \"3.11\"", "colorful", "fastapi", "fsspec", "grpcio (>=1.32.0) ; python_version < \"3.10\"", "grpcio (>=1.42.0) ; python_version >= \"3.10\"", "hf_transfer", "jsonref (>=1.1.0)", "jsonschema", "meson", "ninja", "nixl (>=0.6.1)", "numpy (>=1.20)", "opencensus", "opentelemetry-exporter-prometheus", "opentelemetry-proto", "opentelemetry-sdk (>=1.30.0)", "pandas (>=1.3)", "prometheus_client (>=0.7.1)", "py-spy (>=0.2.0) ; python_version < \"3.12\"", "py-spy (>=0.4.0) ; python_version >= \"3.12\"", "pyarrow (>=9.0.0)", "pybind11", "pydantic (<2.0.dev0 || >=2.12.dev0,<3)", "requests", "smart_open", "starlette", "transformers (>=4.57.3)", "typer", "uvicorn[standard]", "virtualenv (>=20.0.24,!=20.21.1)", "vllm[audio] (>=0.12.0)", "watchfiles"] +observability = ["memray ; sys_platform != \"win32\""] +rllib = ["dm_tree", "fsspec", "gymnasium (==1.1.1)", "lz4", "ormsgpack (==1.7.0)", "pandas", "pyarrow (>=9.0.0)", "pydantic (<2.0.dev0 || >=2.12.dev0,<3)", "pyyaml", "requests", "scipy", "tensorboardX (>=1.9)"] +serve = ["aiohttp (>=3.7)", "aiohttp_cors", "colorful", "fastapi", "grpcio (>=1.32.0) ; python_version < \"3.10\"", "grpcio (>=1.42.0) ; python_version >= \"3.10\"", "opencensus", "opentelemetry-exporter-prometheus", "opentelemetry-proto", "opentelemetry-sdk (>=1.30.0)", "prometheus_client (>=0.7.1)", "py-spy (>=0.2.0) ; python_version < \"3.12\"", "py-spy (>=0.4.0) ; python_version >= \"3.12\"", "pydantic (<2.0.dev0 || >=2.12.dev0,<3)", "requests", "smart_open", "starlette", "uvicorn[standard]", "virtualenv (>=20.0.24,!=20.21.1)", "watchfiles"] +serve-async-inference = ["aiohttp (>=3.7)", "aiohttp_cors", "celery", "colorful", "fastapi", "grpcio (>=1.32.0) ; python_version < \"3.10\"", "grpcio (>=1.42.0) ; python_version >= \"3.10\"", "opencensus", "opentelemetry-exporter-prometheus", "opentelemetry-proto", "opentelemetry-sdk (>=1.30.0)", "prometheus_client (>=0.7.1)", "py-spy (>=0.2.0) ; python_version < \"3.12\"", "py-spy (>=0.4.0) ; python_version >= \"3.12\"", "pydantic (<2.0.dev0 || >=2.12.dev0,<3)", "requests", "smart_open", "starlette", "uvicorn[standard]", "virtualenv (>=20.0.24,!=20.21.1)", "watchfiles"] +serve-grpc = ["aiohttp (>=3.7)", "aiohttp_cors", "colorful", "fastapi", "grpcio (>=1.32.0) ; python_version < \"3.10\"", "grpcio (>=1.42.0) ; python_version >= \"3.10\"", "opencensus", "opentelemetry-exporter-prometheus", "opentelemetry-proto", "opentelemetry-sdk (>=1.30.0)", "prometheus_client (>=0.7.1)", "py-spy (>=0.2.0) ; python_version < \"3.12\"", "py-spy (>=0.4.0) ; python_version >= \"3.12\"", "pyOpenSSL", "pydantic (<2.0.dev0 || >=2.12.dev0,<3)", "requests", "smart_open", "starlette", "uvicorn[standard]", "virtualenv (>=20.0.24,!=20.21.1)", "watchfiles"] +train = ["fsspec", "pandas", "pyarrow (>=9.0.0)", "pydantic (<2.0.dev0 || >=2.12.dev0,<3)", "pydantic (<2.0.dev0 || >=2.12.dev0,<3)", "requests", "tensorboardX (>=1.9)"] +tune = ["fsspec", "pandas", "pyarrow (>=9.0.0)", "pydantic (<2.0.dev0 || >=2.12.dev0,<3)", "requests", "tensorboardX (>=1.9)"] + +[[package]] +name = "referencing" +version = "0.37.0" +description = "JSON Referencing + Python" +optional = false +python-versions = ">=3.10" +groups = ["main"] +markers = "extra == \"multiprocessing\"" +files = [ + {file = "referencing-0.37.0-py3-none-any.whl", hash = "sha256:381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231"}, + {file = "referencing-0.37.0.tar.gz", hash = "sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +rpds-py = ">=0.7.0" +typing-extensions = {version = ">=4.4.0", markers = "python_version < \"3.13\""} + [[package]] name = "requests" -version = "2.32.3" +version = "2.32.5" description = "Python HTTP for Humans." optional = false -python-versions = ">=3.8" -groups = ["main", "development"] +python-versions = ">=3.9" +groups = ["main", "development", "torch-cuda"] files = [ - {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, - {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, + {file = "requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6"}, + {file = "requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf"}, ] [package.dependencies] certifi = ">=2017.4.17" -charset-normalizer = ">=2,<4" +charset_normalizer = ">=2,<4" idna = ">=2.5,<4" urllib3 = ">=1.21.1,<3" @@ -3507,13 +4369,14 @@ requests = ">=2.0.1,<3.0.0" [[package]] name = "restructuredtext-lint" -version = "1.4.0" +version = "2.0.2" description = "reStructuredText linter" optional = false python-versions = "*" groups = ["development"] files = [ - {file = "restructuredtext_lint-1.4.0.tar.gz", hash = "sha256:1b235c0c922341ab6c530390892eb9e92f90b9b75046063e047cacfb0f050c45"}, + {file = "restructuredtext_lint-2.0.2-py3-none-any.whl", hash = "sha256:374c0d3e7e0867b2335146a145343ac619400623716b211b9a010c94426bbed7"}, + {file = "restructuredtext_lint-2.0.2.tar.gz", hash = "sha256:dd25209b9e0b726929d8306339faf723734a3137db382bcf27294fa18a6bc52b"}, ] [package.dependencies] @@ -3521,14 +4384,14 @@ docutils = ">=0.11,<1.0" [[package]] name = "rich" -version = "14.0.0" +version = "14.3.2" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" optional = false python-versions = ">=3.8.0" groups = ["development"] files = [ - {file = "rich-14.0.0-py3-none-any.whl", hash = "sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0"}, - {file = "rich-14.0.0.tar.gz", hash = "sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725"}, + {file = "rich-14.3.2-py3-none-any.whl", hash = "sha256:08e67c3e90884651da3239ea668222d19bea7b589149d8014a21c633420dbb69"}, + {file = "rich-14.3.2.tar.gz", hash = "sha256:e712f11c1a562a11843306f5ed999475f09ac31ffb64281f73ab29ffdda8b3b8"}, ] [package.dependencies] @@ -3539,146 +4402,237 @@ pygments = ">=2.13.0,<3.0.0" jupyter = ["ipywidgets (>=7.5.1,<9)"] [[package]] -name = "roman-numerals-py" -version = "3.1.0" +name = "roman-numerals" +version = "4.1.0" description = "Manipulate well-formed Roman numerals" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["development"] files = [ - {file = "roman_numerals_py-3.1.0-py3-none-any.whl", hash = "sha256:9da2ad2fb670bcf24e81070ceb3be72f6c11c440d73bd579fbeca1e9f330954c"}, - {file = "roman_numerals_py-3.1.0.tar.gz", hash = "sha256:be4bf804f083a4ce001b5eb7e3c0862479d10f94c936f6c4e5f250aa5ff5bd2d"}, + {file = "roman_numerals-4.1.0-py3-none-any.whl", hash = "sha256:647ba99caddc2cc1e55a51e4360689115551bf4476d90e8162cf8c345fe233c7"}, + {file = "roman_numerals-4.1.0.tar.gz", hash = "sha256:1af8b147eb1405d5839e78aeb93131690495fe9da5c91856cb33ad55a7f1e5b2"}, ] -[package.extras] -lint = ["mypy (==1.15.0)", "pyright (==1.1.394)", "ruff (==0.9.7)"] -test = ["pytest (>=8)"] - [[package]] -name = "ruamel-yaml" -version = "0.18.10" -description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" +name = "roman-numerals-py" +version = "4.1.0" +description = "This package is deprecated, switch to roman-numerals." optional = false -python-versions = ">=3.7" +python-versions = ">=3.10" groups = ["development"] files = [ - {file = "ruamel.yaml-0.18.10-py3-none-any.whl", hash = "sha256:30f22513ab2301b3d2b577adc121c6471f28734d3d9728581245f1e76468b4f1"}, - {file = "ruamel.yaml-0.18.10.tar.gz", hash = "sha256:20c86ab29ac2153f80a428e1254a8adf686d3383df04490514ca3b79a362db58"}, + {file = "roman_numerals_py-4.1.0-py3-none-any.whl", hash = "sha256:553114c1167141c1283a51743759723ecd05604a1b6b507225e91dc1a6df0780"}, + {file = "roman_numerals_py-4.1.0.tar.gz", hash = "sha256:f5d7b2b4ca52dd855ef7ab8eb3590f428c0b1ea480736ce32b01fef2a5f8daf9"}, ] [package.dependencies] -"ruamel.yaml.clib" = {version = ">=0.2.7", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.13\""} +roman-numerals = "4.1.0" -[package.extras] -docs = ["mercurial (>5.7)", "ryd"] -jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] +[[package]] +name = "rpds-py" +version = "0.30.0" +description = "Python bindings to Rust's persistent data structures (rpds)" +optional = false +python-versions = ">=3.10" +groups = ["main"] +markers = "extra == \"multiprocessing\"" +files = [ + {file = "rpds_py-0.30.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:679ae98e00c0e8d68a7fda324e16b90fd5260945b45d3b824c892cec9eea3288"}, + {file = "rpds_py-0.30.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4cc2206b76b4f576934f0ed374b10d7ca5f457858b157ca52064bdfc26b9fc00"}, + {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:389a2d49eded1896c3d48b0136ead37c48e221b391c052fba3f4055c367f60a6"}, + {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:32c8528634e1bf7121f3de08fa85b138f4e0dc47657866630611b03967f041d7"}, + {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f207f69853edd6f6700b86efb84999651baf3789e78a466431df1331608e5324"}, + {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:67b02ec25ba7a9e8fa74c63b6ca44cf5707f2fbfadae3ee8e7494297d56aa9df"}, + {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0e95f6819a19965ff420f65578bacb0b00f251fefe2c8b23347c37174271f3"}, + {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:a452763cc5198f2f98898eb98f7569649fe5da666c2dc6b5ddb10fde5a574221"}, + {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e0b65193a413ccc930671c55153a03ee57cecb49e6227204b04fae512eb657a7"}, + {file = "rpds_py-0.30.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:858738e9c32147f78b3ac24dc0edb6610000e56dc0f700fd5f651d0a0f0eb9ff"}, + {file = "rpds_py-0.30.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:da279aa314f00acbb803da1e76fa18666778e8a8f83484fba94526da5de2cba7"}, + {file = "rpds_py-0.30.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7c64d38fb49b6cdeda16ab49e35fe0da2e1e9b34bc38bd78386530f218b37139"}, + {file = "rpds_py-0.30.0-cp310-cp310-win32.whl", hash = "sha256:6de2a32a1665b93233cde140ff8b3467bdb9e2af2b91079f0333a0974d12d464"}, + {file = "rpds_py-0.30.0-cp310-cp310-win_amd64.whl", hash = "sha256:1726859cd0de969f88dc8673bdd954185b9104e05806be64bcd87badbe313169"}, + {file = "rpds_py-0.30.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a2bffea6a4ca9f01b3f8e548302470306689684e61602aa3d141e34da06cf425"}, + {file = "rpds_py-0.30.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dc4f992dfe1e2bc3ebc7444f6c7051b4bc13cd8e33e43511e8ffd13bf407010d"}, + {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:422c3cb9856d80b09d30d2eb255d0754b23e090034e1deb4083f8004bd0761e4"}, + {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:07ae8a593e1c3c6b82ca3292efbe73c30b61332fd612e05abee07c79359f292f"}, + {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12f90dd7557b6bd57f40abe7747e81e0c0b119bef015ea7726e69fe550e394a4"}, + {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:99b47d6ad9a6da00bec6aabe5a6279ecd3c06a329d4aa4771034a21e335c3a97"}, + {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33f559f3104504506a44bb666b93a33f5d33133765b0c216a5bf2f1e1503af89"}, + {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:946fe926af6e44f3697abbc305ea168c2c31d3e3ef1058cf68f379bf0335a78d"}, + {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:495aeca4b93d465efde585977365187149e75383ad2684f81519f504f5c13038"}, + {file = "rpds_py-0.30.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9a0ca5da0386dee0655b4ccdf46119df60e0f10da268d04fe7cc87886872ba7"}, + {file = "rpds_py-0.30.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8d6d1cc13664ec13c1b84241204ff3b12f9bb82464b8ad6e7a5d3486975c2eed"}, + {file = "rpds_py-0.30.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3896fa1be39912cf0757753826bc8bdc8ca331a28a7c4ae46b7a21280b06bb85"}, + {file = "rpds_py-0.30.0-cp311-cp311-win32.whl", hash = "sha256:55f66022632205940f1827effeff17c4fa7ae1953d2b74a8581baaefb7d16f8c"}, + {file = "rpds_py-0.30.0-cp311-cp311-win_amd64.whl", hash = "sha256:a51033ff701fca756439d641c0ad09a41d9242fa69121c7d8769604a0a629825"}, + {file = "rpds_py-0.30.0-cp311-cp311-win_arm64.whl", hash = "sha256:47b0ef6231c58f506ef0b74d44e330405caa8428e770fec25329ed2cb971a229"}, + {file = "rpds_py-0.30.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a161f20d9a43006833cd7068375a94d035714d73a172b681d8881820600abfad"}, + {file = "rpds_py-0.30.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6abc8880d9d036ecaafe709079969f56e876fcf107f7a8e9920ba6d5a3878d05"}, + {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca28829ae5f5d569bb62a79512c842a03a12576375d5ece7d2cadf8abe96ec28"}, + {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a1010ed9524c73b94d15919ca4d41d8780980e1765babf85f9a2f90d247153dd"}, + {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8d1736cfb49381ba528cd5baa46f82fdc65c06e843dab24dd70b63d09121b3f"}, + {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d948b135c4693daff7bc2dcfc4ec57237a29bd37e60c2fabf5aff2bbacf3e2f1"}, + {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47f236970bccb2233267d89173d3ad2703cd36a0e2a6e92d0560d333871a3d23"}, + {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:2e6ecb5a5bcacf59c3f912155044479af1d0b6681280048b338b28e364aca1f6"}, + {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a8fa71a2e078c527c3e9dc9fc5a98c9db40bcc8a92b4e8858e36d329f8684b51"}, + {file = "rpds_py-0.30.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:73c67f2db7bc334e518d097c6d1e6fed021bbc9b7d678d6cc433478365d1d5f5"}, + {file = "rpds_py-0.30.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5ba103fb455be00f3b1c2076c9d4264bfcb037c976167a6047ed82f23153f02e"}, + {file = "rpds_py-0.30.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7cee9c752c0364588353e627da8a7e808a66873672bcb5f52890c33fd965b394"}, + {file = "rpds_py-0.30.0-cp312-cp312-win32.whl", hash = "sha256:1ab5b83dbcf55acc8b08fc62b796ef672c457b17dbd7820a11d6c52c06839bdf"}, + {file = "rpds_py-0.30.0-cp312-cp312-win_amd64.whl", hash = "sha256:a090322ca841abd453d43456ac34db46e8b05fd9b3b4ac0c78bcde8b089f959b"}, + {file = "rpds_py-0.30.0-cp312-cp312-win_arm64.whl", hash = "sha256:669b1805bd639dd2989b281be2cfd951c6121b65e729d9b843e9639ef1fd555e"}, + {file = "rpds_py-0.30.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f83424d738204d9770830d35290ff3273fbb02b41f919870479fab14b9d303b2"}, + {file = "rpds_py-0.30.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e7536cd91353c5273434b4e003cbda89034d67e7710eab8761fd918ec6c69cf8"}, + {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2771c6c15973347f50fece41fc447c054b7ac2ae0502388ce3b6738cd366e3d4"}, + {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0a59119fc6e3f460315fe9d08149f8102aa322299deaa5cab5b40092345c2136"}, + {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76fec018282b4ead0364022e3c54b60bf368b9d926877957a8624b58419169b7"}, + {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:692bef75a5525db97318e8cd061542b5a79812d711ea03dbc1f6f8dbb0c5f0d2"}, + {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9027da1ce107104c50c81383cae773ef5c24d296dd11c99e2629dbd7967a20c6"}, + {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:9cf69cdda1f5968a30a359aba2f7f9aa648a9ce4b580d6826437f2b291cfc86e"}, + {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a4796a717bf12b9da9d3ad002519a86063dcac8988b030e405704ef7d74d2d9d"}, + {file = "rpds_py-0.30.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5d4c2aa7c50ad4728a094ebd5eb46c452e9cb7edbfdb18f9e1221f597a73e1e7"}, + {file = "rpds_py-0.30.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ba81a9203d07805435eb06f536d95a266c21e5b2dfbf6517748ca40c98d19e31"}, + {file = "rpds_py-0.30.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:945dccface01af02675628334f7cf49c2af4c1c904748efc5cf7bbdf0b579f95"}, + {file = "rpds_py-0.30.0-cp313-cp313-win32.whl", hash = "sha256:b40fb160a2db369a194cb27943582b38f79fc4887291417685f3ad693c5a1d5d"}, + {file = "rpds_py-0.30.0-cp313-cp313-win_amd64.whl", hash = "sha256:806f36b1b605e2d6a72716f321f20036b9489d29c51c91f4dd29a3e3afb73b15"}, + {file = "rpds_py-0.30.0-cp313-cp313-win_arm64.whl", hash = "sha256:d96c2086587c7c30d44f31f42eae4eac89b60dabbac18c7669be3700f13c3ce1"}, + {file = "rpds_py-0.30.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:eb0b93f2e5c2189ee831ee43f156ed34e2a89a78a66b98cadad955972548be5a"}, + {file = "rpds_py-0.30.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:922e10f31f303c7c920da8981051ff6d8c1a56207dbdf330d9047f6d30b70e5e"}, + {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdc62c8286ba9bf7f47befdcea13ea0e26bf294bda99758fd90535cbaf408000"}, + {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:47f9a91efc418b54fb8190a6b4aa7813a23fb79c51f4bb84e418f5476c38b8db"}, + {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f3587eb9b17f3789ad50824084fa6f81921bbf9a795826570bda82cb3ed91f2"}, + {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:39c02563fc592411c2c61d26b6c5fe1e51eaa44a75aa2c8735ca88b0d9599daa"}, + {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51a1234d8febafdfd33a42d97da7a43f5dcb120c1060e352a3fbc0c6d36e2083"}, + {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:eb2c4071ab598733724c08221091e8d80e89064cd472819285a9ab0f24bcedb9"}, + {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6bdfdb946967d816e6adf9a3d8201bfad269c67efe6cefd7093ef959683c8de0"}, + {file = "rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c77afbd5f5250bf27bf516c7c4a016813eb2d3e116139aed0096940c5982da94"}, + {file = "rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:61046904275472a76c8c90c9ccee9013d70a6d0f73eecefd38c1ae7c39045a08"}, + {file = "rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c5f36a861bc4b7da6516dbdf302c55313afa09b81931e8280361a4f6c9a2d27"}, + {file = "rpds_py-0.30.0-cp313-cp313t-win32.whl", hash = "sha256:3d4a69de7a3e50ffc214ae16d79d8fbb0922972da0356dcf4d0fdca2878559c6"}, + {file = "rpds_py-0.30.0-cp313-cp313t-win_amd64.whl", hash = "sha256:f14fc5df50a716f7ece6a80b6c78bb35ea2ca47c499e422aa4463455dd96d56d"}, + {file = "rpds_py-0.30.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:68f19c879420aa08f61203801423f6cd5ac5f0ac4ac82a2368a9fcd6a9a075e0"}, + {file = "rpds_py-0.30.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ec7c4490c672c1a0389d319b3a9cfcd098dcdc4783991553c332a15acf7249be"}, + {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f251c812357a3fed308d684a5079ddfb9d933860fc6de89f2b7ab00da481e65f"}, + {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac98b175585ecf4c0348fd7b29c3864bda53b805c773cbf7bfdaffc8070c976f"}, + {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3e62880792319dbeb7eb866547f2e35973289e7d5696c6e295476448f5b63c87"}, + {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e7fc54e0900ab35d041b0601431b0a0eb495f0851a0639b6ef90f7741b39a18"}, + {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47e77dc9822d3ad616c3d5759ea5631a75e5809d5a28707744ef79d7a1bcfcad"}, + {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:b4dc1a6ff022ff85ecafef7979a2c6eb423430e05f1165d6688234e62ba99a07"}, + {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4559c972db3a360808309e06a74628b95eaccbf961c335c8fe0d590cf587456f"}, + {file = "rpds_py-0.30.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:0ed177ed9bded28f8deb6ab40c183cd1192aa0de40c12f38be4d59cd33cb5c65"}, + {file = "rpds_py-0.30.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ad1fa8db769b76ea911cb4e10f049d80bf518c104f15b3edb2371cc65375c46f"}, + {file = "rpds_py-0.30.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:46e83c697b1f1c72b50e5ee5adb4353eef7406fb3f2043d64c33f20ad1c2fc53"}, + {file = "rpds_py-0.30.0-cp314-cp314-win32.whl", hash = "sha256:ee454b2a007d57363c2dfd5b6ca4a5d7e2c518938f8ed3b706e37e5d470801ed"}, + {file = "rpds_py-0.30.0-cp314-cp314-win_amd64.whl", hash = "sha256:95f0802447ac2d10bcc69f6dc28fe95fdf17940367b21d34e34c737870758950"}, + {file = "rpds_py-0.30.0-cp314-cp314-win_arm64.whl", hash = "sha256:613aa4771c99f03346e54c3f038e4cc574ac09a3ddfb0e8878487335e96dead6"}, + {file = "rpds_py-0.30.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:7e6ecfcb62edfd632e56983964e6884851786443739dbfe3582947e87274f7cb"}, + {file = "rpds_py-0.30.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a1d0bc22a7cdc173fedebb73ef81e07faef93692b8c1ad3733b67e31e1b6e1b8"}, + {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d08f00679177226c4cb8c5265012eea897c8ca3b93f429e546600c971bcbae7"}, + {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5965af57d5848192c13534f90f9dd16464f3c37aaf166cc1da1cae1fd5a34898"}, + {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a4e86e34e9ab6b667c27f3211ca48f73dba7cd3d90f8d5b11be56e5dbc3fb4e"}, + {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5d3e6b26f2c785d65cc25ef1e5267ccbe1b069c5c21b8cc724efee290554419"}, + {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:626a7433c34566535b6e56a1b39a7b17ba961e97ce3b80ec62e6f1312c025551"}, + {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:acd7eb3f4471577b9b5a41baf02a978e8bdeb08b4b355273994f8b87032000a8"}, + {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fe5fa731a1fa8a0a56b0977413f8cacac1768dad38d16b3a296712709476fbd5"}, + {file = "rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:74a3243a411126362712ee1524dfc90c650a503502f135d54d1b352bd01f2404"}, + {file = "rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:3e8eeb0544f2eb0d2581774be4c3410356eba189529a6b3e36bbbf9696175856"}, + {file = "rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:dbd936cde57abfee19ab3213cf9c26be06d60750e60a8e4dd85d1ab12c8b1f40"}, + {file = "rpds_py-0.30.0-cp314-cp314t-win32.whl", hash = "sha256:dc824125c72246d924f7f796b4f63c1e9dc810c7d9e2355864b3c3a73d59ade0"}, + {file = "rpds_py-0.30.0-cp314-cp314t-win_amd64.whl", hash = "sha256:27f4b0e92de5bfbc6f86e43959e6edd1425c33b5e69aab0984a72047f2bcf1e3"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c2262bdba0ad4fc6fb5545660673925c2d2a5d9e2e0fb603aad545427be0fc58"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:ee6af14263f25eedc3bb918a3c04245106a42dfd4f5c2285ea6f997b1fc3f89a"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3adbb8179ce342d235c31ab8ec511e66c73faa27a47e076ccc92421add53e2bb"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:250fa00e9543ac9b97ac258bd37367ff5256666122c2d0f2bc97577c60a1818c"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9854cf4f488b3d57b9aaeb105f06d78e5529d3145b1e4a41750167e8c213c6d3"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:993914b8e560023bc0a8bf742c5f303551992dcb85e247b1e5c7f4a7d145bda5"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58edca431fb9b29950807e301826586e5bbf24163677732429770a697ffe6738"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:dea5b552272a944763b34394d04577cf0f9bd013207bc32323b5a89a53cf9c2f"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ba3af48635eb83d03f6c9735dfb21785303e73d22ad03d489e88adae6eab8877"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:dff13836529b921e22f15cb099751209a60009731a68519630a24d61f0b1b30a"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:1b151685b23929ab7beec71080a8889d4d6d9fa9a983d213f07121205d48e2c4"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ac37f9f516c51e5753f27dfdef11a88330f04de2d564be3991384b2f3535d02e"}, + {file = "rpds_py-0.30.0.tar.gz", hash = "sha256:dd8ff7cf90014af0c0f787eea34794ebf6415242ee1d6fa91eaba725cc441e84"}, +] [[package]] -name = "ruamel-yaml-clib" -version = "0.2.12" -description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" +name = "ruamel-yaml" +version = "0.19.1" +description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" optional = false python-versions = ">=3.9" groups = ["development"] -markers = "platform_python_implementation == \"CPython\"" -files = [ - {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:11f891336688faf5156a36293a9c362bdc7c88f03a8a027c2c1d8e0bcde998e5"}, - {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:a606ef75a60ecf3d924613892cc603b154178ee25abb3055db5062da811fd969"}, - {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd5415dded15c3822597455bc02bcd66e81ef8b7a48cb71a33628fc9fdde39df"}, - {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f66efbc1caa63c088dead1c4170d148eabc9b80d95fb75b6c92ac0aad2437d76"}, - {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:22353049ba4181685023b25b5b51a574bce33e7f51c759371a7422dcae5402a6"}, - {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:932205970b9f9991b34f55136be327501903f7c66830e9760a8ffb15b07f05cd"}, - {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-win32.whl", hash = "sha256:3eac5a91891ceb88138c113f9db04f3cebdae277f5d44eaa3651a4f573e6a5da"}, - {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-win_amd64.whl", hash = "sha256:ab007f2f5a87bd08ab1499bdf96f3d5c6ad4dcfa364884cb4549aa0154b13a28"}, - {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:4a6679521a58256a90b0d89e03992c15144c5f3858f40d7c18886023d7943db6"}, - {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:d84318609196d6bd6da0edfa25cedfbabd8dbde5140a0a23af29ad4b8f91fb1e"}, - {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb43a269eb827806502c7c8efb7ae7e9e9d0573257a46e8e952f4d4caba4f31e"}, - {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:811ea1594b8a0fb466172c384267a4e5e367298af6b228931f273b111f17ef52"}, - {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cf12567a7b565cbf65d438dec6cfbe2917d3c1bdddfce84a9930b7d35ea59642"}, - {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7dd5adc8b930b12c8fc5b99e2d535a09889941aa0d0bd06f4749e9a9397c71d2"}, - {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-win32.whl", hash = "sha256:bd0a08f0bab19093c54e18a14a10b4322e1eacc5217056f3c063bd2f59853ce4"}, - {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-win_amd64.whl", hash = "sha256:a274fb2cb086c7a3dea4322ec27f4cb5cc4b6298adb583ab0e211a4682f241eb"}, - {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:20b0f8dc160ba83b6dcc0e256846e1a02d044e13f7ea74a3d1d56ede4e48c632"}, - {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:943f32bc9dedb3abff9879edc134901df92cfce2c3d5c9348f172f62eb2d771d"}, - {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95c3829bb364fdb8e0332c9931ecf57d9be3519241323c5274bd82f709cebc0c"}, - {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:749c16fcc4a2b09f28843cda5a193e0283e47454b63ec4b81eaa2242f50e4ccd"}, - {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bf165fef1f223beae7333275156ab2022cffe255dcc51c27f066b4370da81e31"}, - {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:32621c177bbf782ca5a18ba4d7af0f1082a3f6e517ac2a18b3974d4edf349680"}, - {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-win32.whl", hash = "sha256:e8c4ebfcfd57177b572e2040777b8abc537cdef58a2120e830124946aa9b42c5"}, - {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-win_amd64.whl", hash = "sha256:0467c5965282c62203273b838ae77c0d29d7638c8a4e3a1c8bdd3602c10904e4"}, - {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:4c8c5d82f50bb53986a5e02d1b3092b03622c02c2eb78e29bec33fd9593bae1a"}, - {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:e7e3736715fbf53e9be2a79eb4db68e4ed857017344d697e8b9749444ae57475"}, - {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b7e75b4965e1d4690e93021adfcecccbca7d61c7bddd8e22406ef2ff20d74ef"}, - {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96777d473c05ee3e5e3c3e999f5d23c6f4ec5b0c38c098b3a5229085f74236c6"}, - {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:3bc2a80e6420ca8b7d3590791e2dfc709c88ab9152c00eeb511c9875ce5778bf"}, - {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e188d2699864c11c36cdfdada94d781fd5d6b0071cd9c427bceb08ad3d7c70e1"}, - {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-win32.whl", hash = "sha256:6442cb36270b3afb1b4951f060eccca1ce49f3d087ca1ca4563a6eb479cb3de6"}, - {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-win_amd64.whl", hash = "sha256:e5b8daf27af0b90da7bb903a876477a9e6d7270be6146906b276605997c7e9a3"}, - {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:fc4b630cd3fa2cf7fce38afa91d7cfe844a9f75d7f0f36393fa98815e911d987"}, - {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:bc5f1e1c28e966d61d2519f2a3d451ba989f9ea0f2307de7bc45baa526de9e45"}, - {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a0e060aace4c24dcaf71023bbd7d42674e3b230f7e7b97317baf1e953e5b519"}, - {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2f1c3765db32be59d18ab3953f43ab62a761327aafc1594a2a1fbe038b8b8a7"}, - {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d85252669dc32f98ebcd5d36768f5d4faeaeaa2d655ac0473be490ecdae3c285"}, - {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e143ada795c341b56de9418c58d028989093ee611aa27ffb9b7f609c00d813ed"}, - {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-win32.whl", hash = "sha256:beffaed67936fbbeffd10966a4eb53c402fafd3d6833770516bf7314bc6ffa12"}, - {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-win_amd64.whl", hash = "sha256:040ae85536960525ea62868b642bdb0c2cc6021c9f9d507810c0c604e66f5a7b"}, - {file = "ruamel.yaml.clib-0.2.12.tar.gz", hash = "sha256:6c8fbb13ec503f99a91901ab46e0b07ae7941cd527393187039aec586fdfd36f"}, +files = [ + {file = "ruamel_yaml-0.19.1-py3-none-any.whl", hash = "sha256:27592957fedf6e0b62f281e96effd28043345e0e66001f97683aa9a40c667c93"}, + {file = "ruamel_yaml-0.19.1.tar.gz", hash = "sha256:53eb66cd27849eff968ebf8f0bf61f46cdac2da1d1f3576dd4ccee9b25c31993"}, ] +[package.extras] +docs = ["mercurial (>5.7)", "ryd"] +jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] +libyaml = ["ruamel.yaml.clibz (>=0.3.7) ; platform_python_implementation == \"CPython\""] +oldlibyaml = ["ruamel.yaml.clib ; platform_python_implementation == \"CPython\""] + [[package]] name = "scikit-learn" -version = "1.6.1" +version = "1.8.0" description = "A set of python modules for machine learning and data mining" optional = false -python-versions = ">=3.9" +python-versions = ">=3.11" groups = ["main"] files = [ - {file = "scikit_learn-1.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d056391530ccd1e501056160e3c9673b4da4805eb67eb2bdf4e983e1f9c9204e"}, - {file = "scikit_learn-1.6.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:0c8d036eb937dbb568c6242fa598d551d88fb4399c0344d95c001980ec1c7d36"}, - {file = "scikit_learn-1.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8634c4bd21a2a813e0a7e3900464e6d593162a29dd35d25bdf0103b3fce60ed5"}, - {file = "scikit_learn-1.6.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:775da975a471c4f6f467725dff0ced5c7ac7bda5e9316b260225b48475279a1b"}, - {file = "scikit_learn-1.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:8a600c31592bd7dab31e1c61b9bbd6dea1b3433e67d264d17ce1017dbdce8002"}, - {file = "scikit_learn-1.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:72abc587c75234935e97d09aa4913a82f7b03ee0b74111dcc2881cba3c5a7b33"}, - {file = "scikit_learn-1.6.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:b3b00cdc8f1317b5f33191df1386c0befd16625f49d979fe77a8d44cae82410d"}, - {file = "scikit_learn-1.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc4765af3386811c3ca21638f63b9cf5ecf66261cc4815c1db3f1e7dc7b79db2"}, - {file = "scikit_learn-1.6.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:25fc636bdaf1cc2f4a124a116312d837148b5e10872147bdaf4887926b8c03d8"}, - {file = "scikit_learn-1.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:fa909b1a36e000a03c382aade0bd2063fd5680ff8b8e501660c0f59f021a6415"}, - {file = "scikit_learn-1.6.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:926f207c804104677af4857b2c609940b743d04c4c35ce0ddc8ff4f053cddc1b"}, - {file = "scikit_learn-1.6.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:2c2cae262064e6a9b77eee1c8e768fc46aa0b8338c6a8297b9b6759720ec0ff2"}, - {file = "scikit_learn-1.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1061b7c028a8663fb9a1a1baf9317b64a257fcb036dae5c8752b2abef31d136f"}, - {file = "scikit_learn-1.6.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e69fab4ebfc9c9b580a7a80111b43d214ab06250f8a7ef590a4edf72464dd86"}, - {file = "scikit_learn-1.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:70b1d7e85b1c96383f872a519b3375f92f14731e279a7b4c6cfd650cf5dffc52"}, - {file = "scikit_learn-1.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2ffa1e9e25b3d93990e74a4be2c2fc61ee5af85811562f1288d5d055880c4322"}, - {file = "scikit_learn-1.6.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:dc5cf3d68c5a20ad6d571584c0750ec641cc46aeef1c1507be51300e6003a7e1"}, - {file = "scikit_learn-1.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c06beb2e839ecc641366000ca84f3cf6fa9faa1777e29cf0c04be6e4d096a348"}, - {file = "scikit_learn-1.6.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8ca8cb270fee8f1f76fa9bfd5c3507d60c6438bbee5687f81042e2bb98e5a97"}, - {file = "scikit_learn-1.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:7a1c43c8ec9fde528d664d947dc4c0789be4077a3647f232869f41d9bf50e0fb"}, - {file = "scikit_learn-1.6.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a17c1dea1d56dcda2fac315712f3651a1fea86565b64b48fa1bc090249cbf236"}, - {file = "scikit_learn-1.6.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:6a7aa5f9908f0f28f4edaa6963c0a6183f1911e63a69aa03782f0d924c830a35"}, - {file = "scikit_learn-1.6.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0650e730afb87402baa88afbf31c07b84c98272622aaba002559b614600ca691"}, - {file = "scikit_learn-1.6.1-cp313-cp313t-win_amd64.whl", hash = "sha256:3f59fe08dc03ea158605170eb52b22a105f238a5d512c4470ddeca71feae8e5f"}, - {file = "scikit_learn-1.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6849dd3234e87f55dce1db34c89a810b489ead832aaf4d4550b7ea85628be6c1"}, - {file = "scikit_learn-1.6.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:e7be3fa5d2eb9be7d77c3734ff1d599151bb523674be9b834e8da6abe132f44e"}, - {file = "scikit_learn-1.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44a17798172df1d3c1065e8fcf9019183f06c87609b49a124ebdf57ae6cb0107"}, - {file = "scikit_learn-1.6.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8b7a3b86e411e4bce21186e1c180d792f3d99223dcfa3b4f597ecc92fa1a422"}, - {file = "scikit_learn-1.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:7a73d457070e3318e32bdb3aa79a8d990474f19035464dfd8bede2883ab5dc3b"}, - {file = "scikit_learn-1.6.1.tar.gz", hash = "sha256:b4fc2525eca2c69a59260f583c56a7557c6ccdf8deafdba6e060f94c1c59738e"}, + {file = "scikit_learn-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:146b4d36f800c013d267b29168813f7a03a43ecd2895d04861f1240b564421da"}, + {file = "scikit_learn-1.8.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:f984ca4b14914e6b4094c5d52a32ea16b49832c03bd17a110f004db3c223e8e1"}, + {file = "scikit_learn-1.8.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5e30adb87f0cc81c7690a84f7932dd66be5bac57cfe16b91cb9151683a4a2d3b"}, + {file = "scikit_learn-1.8.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ada8121bcb4dac28d930febc791a69f7cb1673c8495e5eee274190b73a4559c1"}, + {file = "scikit_learn-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:c57b1b610bd1f40ba43970e11ce62821c2e6569e4d74023db19c6b26f246cb3b"}, + {file = "scikit_learn-1.8.0-cp311-cp311-win_arm64.whl", hash = "sha256:2838551e011a64e3053ad7618dda9310175f7515f1742fa2d756f7c874c05961"}, + {file = "scikit_learn-1.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5fb63362b5a7ddab88e52b6dbb47dac3fd7dafeee740dc6c8d8a446ddedade8e"}, + {file = "scikit_learn-1.8.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:5025ce924beccb28298246e589c691fe1b8c1c96507e6d27d12c5fadd85bfd76"}, + {file = "scikit_learn-1.8.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4496bb2cf7a43ce1a2d7524a79e40bc5da45cf598dbf9545b7e8316ccba47bb4"}, + {file = "scikit_learn-1.8.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a0bcfe4d0d14aec44921545fd2af2338c7471de9cb701f1da4c9d85906ab847a"}, + {file = "scikit_learn-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:35c007dedb2ffe38fe3ee7d201ebac4a2deccd2408e8621d53067733e3c74809"}, + {file = "scikit_learn-1.8.0-cp312-cp312-win_arm64.whl", hash = "sha256:8c497fff237d7b4e07e9ef1a640887fa4fb765647f86fbe00f969ff6280ce2bb"}, + {file = "scikit_learn-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0d6ae97234d5d7079dc0040990a6f7aeb97cb7fa7e8945f1999a429b23569e0a"}, + {file = "scikit_learn-1.8.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:edec98c5e7c128328124a029bceb09eda2d526997780fef8d65e9a69eead963e"}, + {file = "scikit_learn-1.8.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:74b66d8689d52ed04c271e1329f0c61635bcaf5b926db9b12d58914cdc01fe57"}, + {file = "scikit_learn-1.8.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8fdf95767f989b0cfedb85f7ed8ca215d4be728031f56ff5a519ee1e3276dc2e"}, + {file = "scikit_learn-1.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:2de443b9373b3b615aec1bb57f9baa6bb3a9bd093f1269ba95c17d870422b271"}, + {file = "scikit_learn-1.8.0-cp313-cp313-win_arm64.whl", hash = "sha256:eddde82a035681427cbedded4e6eff5e57fa59216c2e3e90b10b19ab1d0a65c3"}, + {file = "scikit_learn-1.8.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:7cc267b6108f0a1499a734167282c00c4ebf61328566b55ef262d48e9849c735"}, + {file = "scikit_learn-1.8.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:fe1c011a640a9f0791146011dfd3c7d9669785f9fed2b2a5f9e207536cf5c2fd"}, + {file = "scikit_learn-1.8.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:72358cce49465d140cc4e7792015bb1f0296a9742d5622c67e31399b75468b9e"}, + {file = "scikit_learn-1.8.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:80832434a6cc114f5219211eec13dcbc16c2bac0e31ef64c6d346cde3cf054cb"}, + {file = "scikit_learn-1.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ee787491dbfe082d9c3013f01f5991658b0f38aa8177e4cd4bf434c58f551702"}, + {file = "scikit_learn-1.8.0-cp313-cp313t-win_arm64.whl", hash = "sha256:bf97c10a3f5a7543f9b88cbf488d33d175e9146115a451ae34568597ba33dcde"}, + {file = "scikit_learn-1.8.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:c22a2da7a198c28dd1a6e1136f19c830beab7fdca5b3e5c8bba8394f8a5c45b3"}, + {file = "scikit_learn-1.8.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:6b595b07a03069a2b1740dc08c2299993850ea81cce4fe19b2421e0c970de6b7"}, + {file = "scikit_learn-1.8.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:29ffc74089f3d5e87dfca4c2c8450f88bdc61b0fc6ed5d267f3988f19a1309f6"}, + {file = "scikit_learn-1.8.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fb65db5d7531bccf3a4f6bec3462223bea71384e2cda41da0f10b7c292b9e7c4"}, + {file = "scikit_learn-1.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:56079a99c20d230e873ea40753102102734c5953366972a71d5cb39a32bc40c6"}, + {file = "scikit_learn-1.8.0-cp314-cp314-win_arm64.whl", hash = "sha256:3bad7565bc9cf37ce19a7c0d107742b320c1285df7aab1a6e2d28780df167242"}, + {file = "scikit_learn-1.8.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:4511be56637e46c25721e83d1a9cea9614e7badc7040c4d573d75fbe257d6fd7"}, + {file = "scikit_learn-1.8.0-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:a69525355a641bf8ef136a7fa447672fb54fe8d60cab5538d9eb7c6438543fb9"}, + {file = "scikit_learn-1.8.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c2656924ec73e5939c76ac4c8b026fc203b83d8900362eb2599d8aee80e4880f"}, + {file = "scikit_learn-1.8.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15fc3b5d19cc2be65404786857f2e13c70c83dd4782676dd6814e3b89dc8f5b9"}, + {file = "scikit_learn-1.8.0-cp314-cp314t-win_amd64.whl", hash = "sha256:00d6f1d66fbcf4eba6e356e1420d33cc06c70a45bb1363cd6f6a8e4ebbbdece2"}, + {file = "scikit_learn-1.8.0-cp314-cp314t-win_arm64.whl", hash = "sha256:f28dd15c6bb0b66ba09728cf09fd8736c304be29409bd8445a080c1280619e8c"}, + {file = "scikit_learn-1.8.0.tar.gz", hash = "sha256:9bccbb3b40e3de10351f8f5068e105d0f4083b1a65fa07b6634fbc401a6287fd"}, ] [package.dependencies] -joblib = ">=1.2.0" -numpy = ">=1.19.5" -scipy = ">=1.6.0" -threadpoolctl = ">=3.1.0" +joblib = ">=1.3.0" +numpy = ">=1.24.1" +scipy = ">=1.10.0" +threadpoolctl = ">=3.2.0" [package.extras] -benchmark = ["matplotlib (>=3.3.4)", "memory_profiler (>=0.57.0)", "pandas (>=1.1.5)"] -build = ["cython (>=3.0.10)", "meson-python (>=0.16.0)", "numpy (>=1.19.5)", "scipy (>=1.6.0)"] -docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.3.4)", "memory_profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "polars (>=0.20.30)", "pooch (>=1.6.0)", "pydata-sphinx-theme (>=0.15.3)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)", "sphinx (>=7.3.7)", "sphinx-copybutton (>=0.5.2)", "sphinx-design (>=0.5.0)", "sphinx-design (>=0.6.0)", "sphinx-gallery (>=0.17.1)", "sphinx-prompt (>=1.4.0)", "sphinx-remove-toctrees (>=1.0.0.post1)", "sphinxcontrib-sass (>=0.3.4)", "sphinxext-opengraph (>=0.9.1)", "towncrier (>=24.8.0)"] -examples = ["matplotlib (>=3.3.4)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)"] -install = ["joblib (>=1.2.0)", "numpy (>=1.19.5)", "scipy (>=1.6.0)", "threadpoolctl (>=3.1.0)"] -maintenance = ["conda-lock (==2.5.6)"] -tests = ["black (>=24.3.0)", "matplotlib (>=3.3.4)", "mypy (>=1.9)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "polars (>=0.20.30)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pyarrow (>=12.0.0)", "pytest (>=7.1.2)", "pytest-cov (>=2.9.0)", "ruff (>=0.5.1)", "scikit-image (>=0.17.2)"] +benchmark = ["matplotlib (>=3.6.1)", "memory_profiler (>=0.57.0)", "pandas (>=1.5.0)"] +build = ["cython (>=3.1.2)", "meson-python (>=0.17.1)", "numpy (>=1.24.1)", "scipy (>=1.10.0)"] +docs = ["Pillow (>=10.1.0)", "matplotlib (>=3.6.1)", "memory_profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.5.0)", "plotly (>=5.18.0)", "polars (>=0.20.30)", "pooch (>=1.8.0)", "pydata-sphinx-theme (>=0.15.3)", "scikit-image (>=0.22.0)", "seaborn (>=0.13.0)", "sphinx (>=7.3.7)", "sphinx-copybutton (>=0.5.2)", "sphinx-design (>=0.6.0)", "sphinx-gallery (>=0.17.1)", "sphinx-prompt (>=1.4.0)", "sphinx-remove-toctrees (>=1.0.0.post1)", "sphinxcontrib-sass (>=0.3.4)", "sphinxext-opengraph (>=0.9.1)", "towncrier (>=24.8.0)"] +examples = ["matplotlib (>=3.6.1)", "pandas (>=1.5.0)", "plotly (>=5.18.0)", "pooch (>=1.8.0)", "scikit-image (>=0.22.0)", "seaborn (>=0.13.0)"] +install = ["joblib (>=1.3.0)", "numpy (>=1.24.1)", "scipy (>=1.10.0)", "threadpoolctl (>=3.2.0)"] +maintenance = ["conda-lock (==3.0.1)"] +tests = ["matplotlib (>=3.6.1)", "mypy (>=1.15)", "numpydoc (>=1.2.0)", "pandas (>=1.5.0)", "polars (>=0.20.30)", "pooch (>=1.8.0)", "pyamg (>=5.0.0)", "pyarrow (>=12.0.0)", "pytest (>=7.1.2)", "pytest-cov (>=2.9.0)", "ruff (>=0.11.7)"] [[package]] name = "scikit-posthocs" @@ -3705,67 +4659,82 @@ test = ["coverage", "pytest"] [[package]] name = "scipy" -version = "1.15.2" +version = "1.17.0" description = "Fundamental algorithms for scientific computing in Python" optional = false -python-versions = ">=3.10" +python-versions = ">=3.11" groups = ["main"] files = [ - {file = "scipy-1.15.2-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:a2ec871edaa863e8213ea5df811cd600734f6400b4af272e1c011e69401218e9"}, - {file = "scipy-1.15.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:6f223753c6ea76983af380787611ae1291e3ceb23917393079dcc746ba60cfb5"}, - {file = "scipy-1.15.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:ecf797d2d798cf7c838c6d98321061eb3e72a74710e6c40540f0e8087e3b499e"}, - {file = "scipy-1.15.2-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:9b18aa747da280664642997e65aab1dd19d0c3d17068a04b3fe34e2559196cb9"}, - {file = "scipy-1.15.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87994da02e73549dfecaed9e09a4f9d58a045a053865679aeb8d6d43747d4df3"}, - {file = "scipy-1.15.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69ea6e56d00977f355c0f84eba69877b6df084516c602d93a33812aa04d90a3d"}, - {file = "scipy-1.15.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:888307125ea0c4466287191e5606a2c910963405ce9671448ff9c81c53f85f58"}, - {file = "scipy-1.15.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9412f5e408b397ff5641080ed1e798623dbe1ec0d78e72c9eca8992976fa65aa"}, - {file = "scipy-1.15.2-cp310-cp310-win_amd64.whl", hash = "sha256:b5e025e903b4f166ea03b109bb241355b9c42c279ea694d8864d033727205e65"}, - {file = "scipy-1.15.2-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:92233b2df6938147be6fa8824b8136f29a18f016ecde986666be5f4d686a91a4"}, - {file = "scipy-1.15.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:62ca1ff3eb513e09ed17a5736929429189adf16d2d740f44e53270cc800ecff1"}, - {file = "scipy-1.15.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:4c6676490ad76d1c2894d77f976144b41bd1a4052107902238047fb6a473e971"}, - {file = "scipy-1.15.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:a8bf5cb4a25046ac61d38f8d3c3426ec11ebc350246a4642f2f315fe95bda655"}, - {file = "scipy-1.15.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a8e34cf4c188b6dd004654f88586d78f95639e48a25dfae9c5e34a6dc34547e"}, - {file = "scipy-1.15.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28a0d2c2075946346e4408b211240764759e0fabaeb08d871639b5f3b1aca8a0"}, - {file = "scipy-1.15.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:42dabaaa798e987c425ed76062794e93a243be8f0f20fff6e7a89f4d61cb3d40"}, - {file = "scipy-1.15.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6f5e296ec63c5da6ba6fa0343ea73fd51b8b3e1a300b0a8cae3ed4b1122c7462"}, - {file = "scipy-1.15.2-cp311-cp311-win_amd64.whl", hash = "sha256:597a0c7008b21c035831c39927406c6181bcf8f60a73f36219b69d010aa04737"}, - {file = "scipy-1.15.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c4697a10da8f8765bb7c83e24a470da5797e37041edfd77fd95ba3811a47c4fd"}, - {file = "scipy-1.15.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:869269b767d5ee7ea6991ed7e22b3ca1f22de73ab9a49c44bad338b725603301"}, - {file = "scipy-1.15.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:bad78d580270a4d32470563ea86c6590b465cb98f83d760ff5b0990cb5518a93"}, - {file = "scipy-1.15.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:b09ae80010f52efddb15551025f9016c910296cf70adbf03ce2a8704f3a5ad20"}, - {file = "scipy-1.15.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a6fd6eac1ce74a9f77a7fc724080d507c5812d61e72bd5e4c489b042455865e"}, - {file = "scipy-1.15.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b871df1fe1a3ba85d90e22742b93584f8d2b8e6124f8372ab15c71b73e428b8"}, - {file = "scipy-1.15.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:03205d57a28e18dfd39f0377d5002725bf1f19a46f444108c29bdb246b6c8a11"}, - {file = "scipy-1.15.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:601881dfb761311045b03114c5fe718a12634e5608c3b403737ae463c9885d53"}, - {file = "scipy-1.15.2-cp312-cp312-win_amd64.whl", hash = "sha256:e7c68b6a43259ba0aab737237876e5c2c549a031ddb7abc28c7b47f22e202ded"}, - {file = "scipy-1.15.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:01edfac9f0798ad6b46d9c4c9ca0e0ad23dbf0b1eb70e96adb9fa7f525eff0bf"}, - {file = "scipy-1.15.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:08b57a9336b8e79b305a143c3655cc5bdbe6d5ece3378578888d2afbb51c4e37"}, - {file = "scipy-1.15.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:54c462098484e7466362a9f1672d20888f724911a74c22ae35b61f9c5919183d"}, - {file = "scipy-1.15.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:cf72ff559a53a6a6d77bd8eefd12a17995ffa44ad86c77a5df96f533d4e6c6bb"}, - {file = "scipy-1.15.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9de9d1416b3d9e7df9923ab23cd2fe714244af10b763975bea9e4f2e81cebd27"}, - {file = "scipy-1.15.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb530e4794fc8ea76a4a21ccb67dea33e5e0e60f07fc38a49e821e1eae3b71a0"}, - {file = "scipy-1.15.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5ea7ed46d437fc52350b028b1d44e002646e28f3e8ddc714011aaf87330f2f32"}, - {file = "scipy-1.15.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:11e7ad32cf184b74380f43d3c0a706f49358b904fa7d5345f16ddf993609184d"}, - {file = "scipy-1.15.2-cp313-cp313-win_amd64.whl", hash = "sha256:a5080a79dfb9b78b768cebf3c9dcbc7b665c5875793569f48bf0e2b1d7f68f6f"}, - {file = "scipy-1.15.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:447ce30cee6a9d5d1379087c9e474628dab3db4a67484be1b7dc3196bfb2fac9"}, - {file = "scipy-1.15.2-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:c90ebe8aaa4397eaefa8455a8182b164a6cc1d59ad53f79943f266d99f68687f"}, - {file = "scipy-1.15.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:def751dd08243934c884a3221156d63e15234a3155cf25978b0a668409d45eb6"}, - {file = "scipy-1.15.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:302093e7dfb120e55515936cb55618ee0b895f8bcaf18ff81eca086c17bd80af"}, - {file = "scipy-1.15.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7cd5b77413e1855351cdde594eca99c1f4a588c2d63711388b6a1f1c01f62274"}, - {file = "scipy-1.15.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d0194c37037707b2afa7a2f2a924cf7bac3dc292d51b6a925e5fcb89bc5c776"}, - {file = "scipy-1.15.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:bae43364d600fdc3ac327db99659dcb79e6e7ecd279a75fe1266669d9a652828"}, - {file = "scipy-1.15.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f031846580d9acccd0044efd1a90e6f4df3a6e12b4b6bd694a7bc03a89892b28"}, - {file = "scipy-1.15.2-cp313-cp313t-win_amd64.whl", hash = "sha256:fe8a9eb875d430d81755472c5ba75e84acc980e4a8f6204d402849234d3017db"}, - {file = "scipy-1.15.2.tar.gz", hash = "sha256:cd58a314d92838f7e6f755c8a2167ead4f27e1fd5c1251fd54289569ef3495ec"}, + {file = "scipy-1.17.0-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:2abd71643797bd8a106dff97894ff7869eeeb0af0f7a5ce02e4227c6a2e9d6fd"}, + {file = "scipy-1.17.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:ef28d815f4d2686503e5f4f00edc387ae58dfd7a2f42e348bb53359538f01558"}, + {file = "scipy-1.17.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:272a9f16d6bb4667e8b50d25d71eddcc2158a214df1b566319298de0939d2ab7"}, + {file = "scipy-1.17.0-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:7204fddcbec2fe6598f1c5fdf027e9f259106d05202a959a9f1aecf036adc9f6"}, + {file = "scipy-1.17.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fc02c37a5639ee67d8fb646ffded6d793c06c5622d36b35cfa8fe5ececb8f042"}, + {file = "scipy-1.17.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dac97a27520d66c12a34fd90a4fe65f43766c18c0d6e1c0a80f114d2260080e4"}, + {file = "scipy-1.17.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ebb7446a39b3ae0fe8f416a9a3fdc6fba3f11c634f680f16a239c5187bc487c0"}, + {file = "scipy-1.17.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:474da16199f6af66601a01546144922ce402cb17362e07d82f5a6cf8f963e449"}, + {file = "scipy-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:255c0da161bd7b32a6c898e7891509e8a9289f0b1c6c7d96142ee0d2b114c2ea"}, + {file = "scipy-1.17.0-cp311-cp311-win_arm64.whl", hash = "sha256:85b0ac3ad17fa3be50abd7e69d583d98792d7edc08367e01445a1e2076005379"}, + {file = "scipy-1.17.0-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:0d5018a57c24cb1dd828bcf51d7b10e65986d549f52ef5adb6b4d1ded3e32a57"}, + {file = "scipy-1.17.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:88c22af9e5d5a4f9e027e26772cc7b5922fab8bcc839edb3ae33de404feebd9e"}, + {file = "scipy-1.17.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:f3cd947f20fe17013d401b64e857c6b2da83cae567adbb75b9dcba865abc66d8"}, + {file = "scipy-1.17.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:e8c0b331c2c1f531eb51f1b4fc9ba709521a712cce58f1aa627bc007421a5306"}, + {file = "scipy-1.17.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5194c445d0a1c7a6c1a4a4681b6b7c71baad98ff66d96b949097e7513c9d6742"}, + {file = "scipy-1.17.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9eeb9b5f5997f75507814ed9d298ab23f62cf79f5a3ef90031b1ee2506abdb5b"}, + {file = "scipy-1.17.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:40052543f7bbe921df4408f46003d6f01c6af109b9e2c8a66dd1cf6cf57f7d5d"}, + {file = "scipy-1.17.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0cf46c8013fec9d3694dc572f0b54100c28405d55d3e2cb15e2895b25057996e"}, + {file = "scipy-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:0937a0b0d8d593a198cededd4c439a0ea216a3f36653901ea1f3e4be949056f8"}, + {file = "scipy-1.17.0-cp312-cp312-win_arm64.whl", hash = "sha256:f603d8a5518c7426414d1d8f82e253e454471de682ce5e39c29adb0df1efb86b"}, + {file = "scipy-1.17.0-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:65ec32f3d32dfc48c72df4291345dae4f048749bc8d5203ee0a3f347f96c5ce6"}, + {file = "scipy-1.17.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:1f9586a58039d7229ce77b52f8472c972448cded5736eaf102d5658bbac4c269"}, + {file = "scipy-1.17.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:9fad7d3578c877d606b1150135c2639e9de9cecd3705caa37b66862977cc3e72"}, + {file = "scipy-1.17.0-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:423ca1f6584fc03936972b5f7c06961670dbba9f234e71676a7c7ccf938a0d61"}, + {file = "scipy-1.17.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fe508b5690e9eaaa9467fc047f833af58f1152ae51a0d0aed67aa5801f4dd7d6"}, + {file = "scipy-1.17.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6680f2dfd4f6182e7d6db161344537da644d1cf85cf293f015c60a17ecf08752"}, + {file = "scipy-1.17.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:eec3842ec9ac9de5917899b277428886042a93db0b227ebbe3a333b64ec7643d"}, + {file = "scipy-1.17.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d7425fcafbc09a03731e1bc05581f5fad988e48c6a861f441b7ab729a49a55ea"}, + {file = "scipy-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:87b411e42b425b84777718cc41516b8a7e0795abfa8e8e1d573bf0ef014f0812"}, + {file = "scipy-1.17.0-cp313-cp313-win_arm64.whl", hash = "sha256:357ca001c6e37601066092e7c89cca2f1ce74e2a520ca78d063a6d2201101df2"}, + {file = "scipy-1.17.0-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:ec0827aa4d36cb79ff1b81de898e948a51ac0b9b1c43e4a372c0508c38c0f9a3"}, + {file = "scipy-1.17.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:819fc26862b4b3c73a60d486dbb919202f3d6d98c87cf20c223511429f2d1a97"}, + {file = "scipy-1.17.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:363ad4ae2853d88ebcde3ae6ec46ccca903ea9835ee8ba543f12f575e7b07e4e"}, + {file = "scipy-1.17.0-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:979c3a0ff8e5ba254d45d59ebd38cde48fce4f10b5125c680c7a4bfe177aab07"}, + {file = "scipy-1.17.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:130d12926ae34399d157de777472bf82e9061c60cc081372b3118edacafe1d00"}, + {file = "scipy-1.17.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6e886000eb4919eae3a44f035e63f0fd8b651234117e8f6f29bad1cd26e7bc45"}, + {file = "scipy-1.17.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:13c4096ac6bc31d706018f06a49abe0485f96499deb82066b94d19b02f664209"}, + {file = "scipy-1.17.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:cacbaddd91fcffde703934897c5cd2c7cb0371fac195d383f4e1f1c5d3f3bd04"}, + {file = "scipy-1.17.0-cp313-cp313t-win_amd64.whl", hash = "sha256:edce1a1cf66298cccdc48a1bdf8fb10a3bf58e8b58d6c3883dd1530e103f87c0"}, + {file = "scipy-1.17.0-cp313-cp313t-win_arm64.whl", hash = "sha256:30509da9dbec1c2ed8f168b8d8aa853bc6723fede1dbc23c7d43a56f5ab72a67"}, + {file = "scipy-1.17.0-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:c17514d11b78be8f7e6331b983a65a7f5ca1fd037b95e27b280921fe5606286a"}, + {file = "scipy-1.17.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:4e00562e519c09da34c31685f6acc3aa384d4d50604db0f245c14e1b4488bfa2"}, + {file = "scipy-1.17.0-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:f7df7941d71314e60a481e02d5ebcb3f0185b8d799c70d03d8258f6c80f3d467"}, + {file = "scipy-1.17.0-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:aabf057c632798832f071a8dde013c2e26284043934f53b00489f1773b33527e"}, + {file = "scipy-1.17.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a38c3337e00be6fd8a95b4ed66b5d988bac4ec888fd922c2ea9fe5fb1603dd67"}, + {file = "scipy-1.17.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00fb5f8ec8398ad90215008d8b6009c9db9fa924fd4c7d6be307c6f945f9cd73"}, + {file = "scipy-1.17.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f2a4942b0f5f7c23c7cd641a0ca1955e2ae83dedcff537e3a0259096635e186b"}, + {file = "scipy-1.17.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:dbf133ced83889583156566d2bdf7a07ff89228fe0c0cb727f777de92092ec6b"}, + {file = "scipy-1.17.0-cp314-cp314-win_amd64.whl", hash = "sha256:3625c631a7acd7cfd929e4e31d2582cf00f42fcf06011f59281271746d77e061"}, + {file = "scipy-1.17.0-cp314-cp314-win_arm64.whl", hash = "sha256:9244608d27eafe02b20558523ba57f15c689357c85bdcfe920b1828750aa26eb"}, + {file = "scipy-1.17.0-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:2b531f57e09c946f56ad0b4a3b2abee778789097871fc541e267d2eca081cff1"}, + {file = "scipy-1.17.0-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:13e861634a2c480bd237deb69333ac79ea1941b94568d4b0efa5db5e263d4fd1"}, + {file = "scipy-1.17.0-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:eb2651271135154aa24f6481cbae5cc8af1f0dd46e6533fb7b56aa9727b6a232"}, + {file = "scipy-1.17.0-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:c5e8647f60679790c2f5c76be17e2e9247dc6b98ad0d3b065861e082c56e078d"}, + {file = "scipy-1.17.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5fb10d17e649e1446410895639f3385fd2bf4c3c7dfc9bea937bddcbc3d7b9ba"}, + {file = "scipy-1.17.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8547e7c57f932e7354a2319fab613981cde910631979f74c9b542bb167a8b9db"}, + {file = "scipy-1.17.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:33af70d040e8af9d5e7a38b5ed3b772adddd281e3062ff23fec49e49681c38cf"}, + {file = "scipy-1.17.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f9eb55bb97d00f8b7ab95cb64f873eb0bf54d9446264d9f3609130381233483f"}, + {file = "scipy-1.17.0-cp314-cp314t-win_amd64.whl", hash = "sha256:1ff269abf702f6c7e67a4b7aad981d42871a11b9dd83c58d2d2ea624efbd1088"}, + {file = "scipy-1.17.0-cp314-cp314t-win_arm64.whl", hash = "sha256:031121914e295d9791319a1875444d55079885bbae5bdc9c5e0f2ee5f09d34ff"}, + {file = "scipy-1.17.0.tar.gz", hash = "sha256:2591060c8e648d8b96439e111ac41fd8342fdeff1876be2e19dea3fe8930454e"}, ] [package.dependencies] -numpy = ">=1.23.5,<2.5" +numpy = ">=1.26.4,<2.7" [package.extras] -dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy (==1.10.0)", "pycodestyle", "pydevtool", "rich-click", "ruff (>=0.0.292)", "types-psutil", "typing_extensions"] -doc = ["intersphinx_registry", "jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.16.5)", "jupytext", "matplotlib (>=3.5)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0,<8.0.0)", "sphinx-copybutton", "sphinx-design (>=0.4.0)"] -test = ["Cython", "array-api-strict (>=2.0,<2.1.1)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja ; sys_platform != \"emscripten\"", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] +dev = ["click (<8.3.0)", "cython-lint (>=0.12.2)", "mypy (==1.10.0)", "pycodestyle", "ruff (>=0.12.0)", "spin", "types-psutil", "typing_extensions"] +doc = ["intersphinx_registry", "jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.19.1)", "jupytext", "linkify-it-py", "matplotlib (>=3.5)", "myst-nb (>=1.2.0)", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0,<8.2.0)", "sphinx-copybutton", "sphinx-design (>=0.4.0)", "tabulate"] +test = ["Cython", "array-api-strict (>=2.3.1)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja ; sys_platform != \"emscripten\"", "pooch", "pytest (>=8.0.0)", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] [[package]] name = "seaborn" @@ -3791,41 +4760,105 @@ stats = ["scipy (>=1.7)", "statsmodels (>=0.12)"] [[package]] name = "secretstorage" -version = "3.3.3" +version = "3.5.0" description = "Python bindings to FreeDesktop.org Secret Service API" optional = false -python-versions = ">=3.6" +python-versions = ">=3.10" groups = ["main"] markers = "sys_platform == \"linux\"" files = [ - {file = "SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99"}, - {file = "SecretStorage-3.3.3.tar.gz", hash = "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77"}, + {file = "secretstorage-3.5.0-py3-none-any.whl", hash = "sha256:0ce65888c0725fcb2c5bc0fdb8e5438eece02c523557ea40ce0703c266248137"}, + {file = "secretstorage-3.5.0.tar.gz", hash = "sha256:f04b8e4689cbce351744d5537bf6b1329c6fc68f91fa666f60a380edddcd11be"}, ] [package.dependencies] cryptography = ">=2.0" jeepney = ">=0.6" +[[package]] +name = "sentry-sdk" +version = "2.52.0" +description = "Python client for Sentry (https://sentry.io)" +optional = false +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "sentry_sdk-2.52.0-py2.py3-none-any.whl", hash = "sha256:931c8f86169fc6f2752cb5c4e6480f0d516112e78750c312e081ababecbaf2ed"}, + {file = "sentry_sdk-2.52.0.tar.gz", hash = "sha256:fa0bec872cfec0302970b2996825723d67390cdd5f0229fb9efed93bd5384899"}, +] + +[package.dependencies] +certifi = "*" +urllib3 = ">=1.26.11" + +[package.extras] +aiohttp = ["aiohttp (>=3.5)"] +anthropic = ["anthropic (>=0.16)"] +arq = ["arq (>=0.23)"] +asyncpg = ["asyncpg (>=0.23)"] +beam = ["apache-beam (>=2.12)"] +bottle = ["bottle (>=0.12.13)"] +celery = ["celery (>=3)"] +celery-redbeat = ["celery-redbeat (>=2)"] +chalice = ["chalice (>=1.16.0)"] +clickhouse-driver = ["clickhouse-driver (>=0.2.0)"] +django = ["django (>=1.8)"] +falcon = ["falcon (>=1.4)"] +fastapi = ["fastapi (>=0.79.0)"] +flask = ["blinker (>=1.1)", "flask (>=0.11)", "markupsafe"] +google-genai = ["google-genai (>=1.29.0)"] +grpcio = ["grpcio (>=1.21.1)", "protobuf (>=3.8.0)"] +http2 = ["httpcore[http2] (==1.*)"] +httpx = ["httpx (>=0.16.0)"] +huey = ["huey (>=2)"] +huggingface-hub = ["huggingface_hub (>=0.22)"] +langchain = ["langchain (>=0.0.210)"] +langgraph = ["langgraph (>=0.6.6)"] +launchdarkly = ["launchdarkly-server-sdk (>=9.8.0)"] +litellm = ["litellm (>=1.77.5)"] +litestar = ["litestar (>=2.0.0)"] +loguru = ["loguru (>=0.5)"] +mcp = ["mcp (>=1.15.0)"] +openai = ["openai (>=1.0.0)", "tiktoken (>=0.3.0)"] +openfeature = ["openfeature-sdk (>=0.7.1)"] +opentelemetry = ["opentelemetry-distro (>=0.35b0)"] +opentelemetry-experimental = ["opentelemetry-distro"] +opentelemetry-otlp = ["opentelemetry-distro[otlp] (>=0.35b0)"] +pure-eval = ["asttokens", "executing", "pure_eval"] +pydantic-ai = ["pydantic-ai (>=1.0.0)"] +pymongo = ["pymongo (>=3.1)"] +pyspark = ["pyspark (>=2.4.4)"] +quart = ["blinker (>=1.1)", "quart (>=0.16.1)"] +rq = ["rq (>=0.6)"] +sanic = ["sanic (>=0.8)"] +sqlalchemy = ["sqlalchemy (>=1.2)"] +starlette = ["starlette (>=0.19.1)"] +starlite = ["starlite (>=1.48)"] +statsig = ["statsig (>=0.55.3)"] +tornado = ["tornado (>=6)"] +unleash = ["UnleashClient (>=6.0.1)"] + [[package]] name = "setuptools" -version = "80.3.1" +version = "82.0.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.9" -groups = ["main", "development"] +groups = ["main", "torch-cuda"] files = [ - {file = "setuptools-80.3.1-py3-none-any.whl", hash = "sha256:ea8e00d7992054c4c592aeb892f6ad51fe1b4d90cc6947cc45c45717c40ec537"}, - {file = "setuptools-80.3.1.tar.gz", hash = "sha256:31e2c58dbb67c99c289f51c16d899afedae292b978f8051efaf6262d8212f927"}, + {file = "setuptools-82.0.0-py3-none-any.whl", hash = "sha256:70b18734b607bd1da571d097d236cfcfacaf01de45717d59e6e04b96877532e0"}, + {file = "setuptools-82.0.0.tar.gz", hash = "sha256:22e0a2d69474c6ae4feb01951cb69d515ed23728cf96d05513d36e42b62b37cb"}, ] +markers = {torch-cuda = "python_version >= \"3.12\""} [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\"", "ruff (>=0.8.0) ; sys_platform != \"cygwin\""] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\"", "ruff (>=0.13.0) ; sys_platform != \"cygwin\""] core = ["importlib_metadata (>=6) ; python_version < \"3.10\"", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1) ; python_version < \"3.11\"", "wheel (>=0.43.0)"] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] enabler = ["pytest-enabler (>=2.2)"] test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21) ; python_version >= \"3.9\" and sys_platform != \"cygwin\"", "jaraco.envs (>=2.2)", "jaraco.path (>=3.7.2)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf ; sys_platform != \"cygwin\"", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] -type = ["importlib_metadata (>=7.0.2) ; python_version < \"3.10\"", "jaraco.develop (>=7.21) ; sys_platform != \"cygwin\"", "mypy (==1.14.*)", "pytest-mypy"] +type = ["importlib_metadata (>=7.0.2) ; python_version < \"3.10\"", "jaraco.develop (>=7.21) ; sys_platform != \"cygwin\"", "mypy (==1.18.*)", "pytest-mypy"] [[package]] name = "shellingham" @@ -3852,27 +4885,27 @@ files = [ ] [[package]] -name = "sniffio" -version = "1.3.1" -description = "Sniff out which async library your code is running under" +name = "smmap" +version = "5.0.2" +description = "A pure Python implementation of a sliding window memory map manager" optional = false python-versions = ">=3.7" -groups = ["main", "development"] +groups = ["main"] files = [ - {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, - {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, + {file = "smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e"}, + {file = "smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5"}, ] [[package]] name = "snowballstemmer" -version = "3.0.0.1" +version = "3.0.1" description = "This package provides 32 stemmers for 30 languages generated from Snowball algorithms." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*" groups = ["development"] files = [ - {file = "snowballstemmer-3.0.0.1-py3-none-any.whl", hash = "sha256:d1cdabc06fb492e80620d9e2c44d39e67cfda290b2aaef8718b0691079443b10"}, - {file = "snowballstemmer-3.0.0.1.tar.gz", hash = "sha256:1d09493a5ecc85fb5b433674e9c83fcd41c6739b6979ce4b54e81a40ec078342"}, + {file = "snowballstemmer-3.0.1-py3-none-any.whl", hash = "sha256:6cd7b3897da8d6c9ffb968a6781fa6532dce9c3618a4b127d920dab764a19064"}, + {file = "snowballstemmer-3.0.1.tar.gz", hash = "sha256:6d5eeeec8e9f84d4d56b847692bacf79bc2c8e90c7f80ca4444ff8b6f2e52895"}, ] [[package]] @@ -3913,19 +4946,19 @@ test = ["cython (>=3.0)", "defusedxml (>=0.7.1)", "pytest (>=8.0)", "pytest-xdis [[package]] name = "sphinx-autobuild" -version = "2024.10.3" +version = "2025.8.25" description = "Rebuild Sphinx documentation on changes, with hot reloading in the browser." optional = false -python-versions = ">=3.9" +python-versions = ">=3.11" groups = ["development"] files = [ - {file = "sphinx_autobuild-2024.10.3-py3-none-any.whl", hash = "sha256:158e16c36f9d633e613c9aaf81c19b0fc458ca78b112533b20dafcda430d60fa"}, - {file = "sphinx_autobuild-2024.10.3.tar.gz", hash = "sha256:248150f8f333e825107b6d4b86113ab28fa51750e5f9ae63b59dc339be951fb1"}, + {file = "sphinx_autobuild-2025.8.25-py3-none-any.whl", hash = "sha256:b750ac7d5a18603e4665294323fd20f6dcc0a984117026d1986704fa68f0379a"}, + {file = "sphinx_autobuild-2025.8.25.tar.gz", hash = "sha256:9cf5aab32853c8c31af572e4fecdc09c997e2b8be5a07daf2a389e270e85b213"}, ] [package.dependencies] colorama = ">=0.4.6" -sphinx = "*" +Sphinx = "*" starlette = ">=0.35" uvicorn = ">=0.25" watchfiles = ">=0.20" @@ -3936,33 +4969,33 @@ test = ["httpx", "pytest (>=6)"] [[package]] name = "sphinx-autodoc-typehints" -version = "3.2.0" +version = "3.5.2" description = "Type hints (PEP 484) support for the Sphinx autodoc extension" optional = false python-versions = ">=3.11" groups = ["development"] files = [ - {file = "sphinx_autodoc_typehints-3.2.0-py3-none-any.whl", hash = "sha256:884b39be23b1d884dcc825d4680c9c6357a476936e3b381a67ae80091984eb49"}, - {file = "sphinx_autodoc_typehints-3.2.0.tar.gz", hash = "sha256:107ac98bc8b4837202c88c0736d59d6da44076e65a0d7d7d543a78631f662a9b"}, + {file = "sphinx_autodoc_typehints-3.5.2-py3-none-any.whl", hash = "sha256:0accd043619f53c86705958e323b419e41667917045ac9215d7be1b493648d8c"}, + {file = "sphinx_autodoc_typehints-3.5.2.tar.gz", hash = "sha256:5fcd4a3eb7aa89424c1e2e32bedca66edc38367569c9169a80f4b3e934171fdb"}, ] [package.dependencies] -sphinx = ">=8.2" +sphinx = ">=8.2.3" [package.extras] -docs = ["furo (>=2024.8.6)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.6.12)", "defusedxml (>=0.7.1)", "diff-cover (>=9.2.3)", "pytest (>=8.3.4)", "pytest-cov (>=6)", "sphobjinv (>=2.3.1.2)", "typing-extensions (>=4.12.2)"] +docs = ["furo (>=2025.9.25)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.10.7)", "defusedxml (>=0.7.1)", "diff-cover (>=9.7.1)", "pytest (>=8.4.2)", "pytest-cov (>=7)", "sphobjinv (>=2.3.1.3)", "typing-extensions (>=4.15)"] [[package]] name = "sphinx-click" -version = "6.0.0" +version = "6.2.0" description = "Sphinx extension that automatically documents click applications" optional = false -python-versions = ">=3.8" +python-versions = ">=3.10" groups = ["development"] files = [ - {file = "sphinx_click-6.0.0-py3-none-any.whl", hash = "sha256:1e0a3c83bcb7c55497751b19d07ebe56b5d7b85eb76dd399cf9061b497adc317"}, - {file = "sphinx_click-6.0.0.tar.gz", hash = "sha256:f5d664321dc0c6622ff019f1e1c84e58ce0cecfddeb510e004cf60c2a3ab465b"}, + {file = "sphinx_click-6.2.0-py3-none-any.whl", hash = "sha256:1fb1851cb4f2c286d43cbcd57f55db6ef5a8d208bfc3370f19adde232e5803d7"}, + {file = "sphinx_click-6.2.0.tar.gz", hash = "sha256:fc78b4154a4e5159462e36de55b8643747da6cda86b3b52a8bb62289e603776c"}, ] [package.dependencies] @@ -3970,6 +5003,10 @@ click = ">=8.0" docutils = "*" sphinx = ">=4.0" +[package.extras] +docs = ["reno"] +test = ["pytest", "pytest-cov"] + [[package]] name = "sphinx-rtd-theme" version = "3.0.2" @@ -4107,60 +5144,67 @@ test = ["pytest"] [[package]] name = "starlette" -version = "0.46.2" +version = "0.52.1" description = "The little ASGI library that shines." optional = false -python-versions = ">=3.9" -groups = ["development"] +python-versions = ">=3.10" +groups = ["main", "development"] files = [ - {file = "starlette-0.46.2-py3-none-any.whl", hash = "sha256:595633ce89f8ffa71a015caed34a5b2dc1c0cdb3f0f1fbd1e69339cf2abeec35"}, - {file = "starlette-0.46.2.tar.gz", hash = "sha256:7f7361f34eed179294600af672f565727419830b54b7b084efe44bb82d2fccd5"}, + {file = "starlette-0.52.1-py3-none-any.whl", hash = "sha256:0029d43eb3d273bc4f83a08720b4912ea4b071087a3b48db01b7c839f7954d74"}, + {file = "starlette-0.52.1.tar.gz", hash = "sha256:834edd1b0a23167694292e94f597773bc3f89f362be6effee198165a35d62933"}, ] [package.dependencies] anyio = ">=3.6.2,<5" +typing-extensions = {version = ">=4.10.0", markers = "python_version < \"3.13\""} [package.extras] full = ["httpx (>=0.27.0,<0.29.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.18)", "pyyaml"] [[package]] name = "statsmodels" -version = "0.14.4" +version = "0.14.6" description = "Statistical computations and models for Python" optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "statsmodels-0.14.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7a62f1fc9086e4b7ee789a6f66b3c0fc82dd8de1edda1522d30901a0aa45e42b"}, - {file = "statsmodels-0.14.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:46ac7ddefac0c9b7b607eed1d47d11e26fe92a1bc1f4d9af48aeed4e21e87981"}, - {file = "statsmodels-0.14.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a337b731aa365d09bb0eab6da81446c04fde6c31976b1d8e3d3a911f0f1e07b"}, - {file = "statsmodels-0.14.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:631bb52159117c5da42ba94bd94859276b68cab25dc4cac86475bc24671143bc"}, - {file = "statsmodels-0.14.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3bb2e580d382545a65f298589809af29daeb15f9da2eb252af8f79693e618abc"}, - {file = "statsmodels-0.14.4-cp310-cp310-win_amd64.whl", hash = "sha256:9729642884147ee9db67b5a06a355890663d21f76ed608a56ac2ad98b94d201a"}, - {file = "statsmodels-0.14.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5ed7e118e6e3e02d6723a079b8c97eaadeed943fa1f7f619f7148dfc7862670f"}, - {file = "statsmodels-0.14.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f5f537f7d000de4a1708c63400755152b862cd4926bb81a86568e347c19c364b"}, - {file = "statsmodels-0.14.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa74aaa26eaa5012b0a01deeaa8a777595d0835d3d6c7175f2ac65435a7324d2"}, - {file = "statsmodels-0.14.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e332c2d9b806083d1797231280602340c5c913f90d4caa0213a6a54679ce9331"}, - {file = "statsmodels-0.14.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d9c8fa28dfd75753d9cf62769ba1fecd7e73a0be187f35cc6f54076f98aa3f3f"}, - {file = "statsmodels-0.14.4-cp311-cp311-win_amd64.whl", hash = "sha256:a6087ecb0714f7c59eb24c22781491e6f1cfffb660b4740e167625ca4f052056"}, - {file = "statsmodels-0.14.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5221dba7424cf4f2561b22e9081de85f5bb871228581124a0d1b572708545199"}, - {file = "statsmodels-0.14.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:17672b30c6b98afe2b095591e32d1d66d4372f2651428e433f16a3667f19eabb"}, - {file = "statsmodels-0.14.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab5e6312213b8cfb9dca93dd46a0f4dccb856541f91d3306227c3d92f7659245"}, - {file = "statsmodels-0.14.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4bbb150620b53133d6cd1c5d14c28a4f85701e6c781d9b689b53681effaa655f"}, - {file = "statsmodels-0.14.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bb695c2025d122a101c2aca66d2b78813c321b60d3a7c86bb8ec4467bb53b0f9"}, - {file = "statsmodels-0.14.4-cp312-cp312-win_amd64.whl", hash = "sha256:7f7917a51766b4e074da283c507a25048ad29a18e527207883d73535e0dc6184"}, - {file = "statsmodels-0.14.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b5a24f5d2c22852d807d2b42daf3a61740820b28d8381daaf59dcb7055bf1a79"}, - {file = "statsmodels-0.14.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:df4f7864606fa843d7e7c0e6af288f034a2160dba14e6ccc09020a3cf67cb092"}, - {file = "statsmodels-0.14.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91341cbde9e8bea5fb419a76e09114e221567d03f34ca26e6d67ae2c27d8fe3c"}, - {file = "statsmodels-0.14.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1322286a7bfdde2790bf72d29698a1b76c20b8423a55bdcd0d457969d0041f72"}, - {file = "statsmodels-0.14.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e31b95ac603415887c9f0d344cb523889cf779bc52d68e27e2d23c358958fec7"}, - {file = "statsmodels-0.14.4-cp313-cp313-win_amd64.whl", hash = "sha256:81030108d27aecc7995cac05aa280cf8c6025f6a6119894eef648997936c2dd0"}, - {file = "statsmodels-0.14.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4793b01b7a5f5424f5a1dbcefc614c83c7608aa2b035f087538253007c339d5d"}, - {file = "statsmodels-0.14.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d330da34f59f1653c5193f9fe3a3a258977c880746db7f155fc33713ea858db5"}, - {file = "statsmodels-0.14.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e9ddefba1d4e1107c1f20f601b0581421ea3ad9fd75ce3c2ba6a76b6dc4682c"}, - {file = "statsmodels-0.14.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f43da7957e00190104c5dd0f661bfc6dfc68b87313e3f9c4dbd5e7d222e0aeb"}, - {file = "statsmodels-0.14.4-cp39-cp39-win_amd64.whl", hash = "sha256:8286f69a5e1d0e0b366ffed5691140c83d3efc75da6dbf34a3d06e88abfaaab6"}, - {file = "statsmodels-0.14.4.tar.gz", hash = "sha256:5d69e0f39060dc72c067f9bb6e8033b6dccdb0bae101d76a7ef0bcc94e898b67"}, + {file = "statsmodels-0.14.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f4ff0649a2df674c7ffb6fa1a06bffdb82a6adf09a48e90e000a15a6aaa734b0"}, + {file = "statsmodels-0.14.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:109012088b3e370080846ab053c76d125268631410142daad2f8c10770e8e8d9"}, + {file = "statsmodels-0.14.6-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e93bd5d220f3cb6fc5fc1bffd5b094966cab8ee99f6c57c02e95710513d6ac3f"}, + {file = "statsmodels-0.14.6-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:06eec42d682fdb09fe5d70a05930857efb141754ec5a5056a03304c1b5e32fd9"}, + {file = "statsmodels-0.14.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0444e88557df735eda7db330806fe09d51c9f888bb1f5906cb3a61fb1a3ed4a8"}, + {file = "statsmodels-0.14.6-cp310-cp310-win_amd64.whl", hash = "sha256:e83a9abe653835da3b37fb6ae04b45480c1de11b3134bd40b09717192a1456ea"}, + {file = "statsmodels-0.14.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6ad5c2810fc6c684254a7792bf1cbaf1606cdee2a253f8bd259c43135d87cfb4"}, + {file = "statsmodels-0.14.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:341fa68a7403e10a95c7b6e41134b0da3a7b835ecff1eb266294408535a06eb6"}, + {file = "statsmodels-0.14.6-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bdf1dfe2a3ca56f5529118baf33a13efed2783c528f4a36409b46bbd2d9d48eb"}, + {file = "statsmodels-0.14.6-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a3764ba8195c9baf0925a96da0743ff218067a269f01d155ca3558deed2658ca"}, + {file = "statsmodels-0.14.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9e8d2e519852adb1b420e018f5ac6e6684b2b877478adf7fda2cfdb58f5acb5d"}, + {file = "statsmodels-0.14.6-cp311-cp311-win_amd64.whl", hash = "sha256:2738a00fca51196f5a7d44b06970ace6b8b30289839e4808d656f8a98e35faa7"}, + {file = "statsmodels-0.14.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fe76140ae7adc5ff0e60a3f0d56f4fffef484efa803c3efebf2fcd734d72ecb5"}, + {file = "statsmodels-0.14.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:26d4f0ed3b31f3c86f83a92f5c1f5cbe63fc992cd8915daf28ca49be14463a1c"}, + {file = "statsmodels-0.14.6-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8c00a42863e4f4733ac9d078bbfad816249c01451740e6f5053ecc7db6d6368"}, + {file = "statsmodels-0.14.6-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:19b58cf7474aa9e7e3b0771a66537148b2df9b5884fbf156096c0e6c1ff0469d"}, + {file = "statsmodels-0.14.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:81e7dcc5e9587f2567e52deaff5220b175bf2f648951549eae5fc9383b62bc37"}, + {file = "statsmodels-0.14.6-cp312-cp312-win_amd64.whl", hash = "sha256:b5eb07acd115aa6208b4058211138393a7e6c2cf12b6f213ede10f658f6a714f"}, + {file = "statsmodels-0.14.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:47ee7af083623d2091954fa71c7549b8443168f41b7c5dce66510274c50fd73e"}, + {file = "statsmodels-0.14.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:aa60d82e29fcd0a736e86feb63a11d2380322d77a9369a54be8b0965a3985f71"}, + {file = "statsmodels-0.14.6-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:89ee7d595f5939cc20bf946faedcb5137d975f03ae080f300ebb4398f16a5bd4"}, + {file = "statsmodels-0.14.6-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:730f3297b26749b216a06e4327fe0be59b8d05f7d594fb6caff4287b69654589"}, + {file = "statsmodels-0.14.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f1c08befa85e93acc992b72a390ddb7bd876190f1360e61d10cf43833463bc9c"}, + {file = "statsmodels-0.14.6-cp313-cp313-win_amd64.whl", hash = "sha256:8021271a79f35b842c02a1794465a651a9d06ec2080f76ebc3b7adce77d08233"}, + {file = "statsmodels-0.14.6-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:00781869991f8f02ad3610da6627fd26ebe262210287beb59761982a8fa88cae"}, + {file = "statsmodels-0.14.6-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:73f305fbf31607b35ce919fae636ab8b80d175328ed38fdc6f354e813b86ee37"}, + {file = "statsmodels-0.14.6-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e443e7077a6e2d3faeea72f5a92c9f12c63722686eb80bb40a0f04e4a7e267ad"}, + {file = "statsmodels-0.14.6-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3414e40c073d725007a6603a18247ab7af3467e1af4a5e5a24e4c27bc26673b4"}, + {file = "statsmodels-0.14.6-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:a518d3f9889ef920116f9fa56d0338069e110f823926356946dae83bc9e33e19"}, + {file = "statsmodels-0.14.6-cp314-cp314-win_amd64.whl", hash = "sha256:151b73e29f01fe619dbce7f66d61a356e9d1fe5e906529b78807df9189c37721"}, + {file = "statsmodels-0.14.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4d0c1b0f9f6915619e2a0d3853e5763d4d66876892ad352e7d7b93a737556978"}, + {file = "statsmodels-0.14.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9e0fc891d6358bf376cc0ae1fee10a650478172ae9ba359daba1785fc496cd1a"}, + {file = "statsmodels-0.14.6-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f52ef0f0b63b8fd11e1ef1c2a1e73a410720b8715c9a83a26d733b6815597fe"}, + {file = "statsmodels-0.14.6-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b328eafa86a2a67303fdb1d25677d15b70cd2a5229aabec7670ec5ea840f1375"}, + {file = "statsmodels-0.14.6-cp39-cp39-win_amd64.whl", hash = "sha256:3bef39f8587754f2d644b2e831e102fa08ace9a5a1af4b583b122e6fd3e083ab"}, + {file = "statsmodels-0.14.6.tar.gz", hash = "sha256:4d17873d3e607d398b85126cd4ed7aad89e4e9d89fc744cdab1af3189a996c2a"}, ] [package.dependencies] @@ -4172,23 +5216,36 @@ scipy = ">=1.8,<1.9.2 || >1.9.2" [package.extras] build = ["cython (>=3.0.10)"] -develop = ["colorama", "cython (>=3.0.10)", "cython (>=3.0.10,<4)", "flake8", "isort", "joblib", "matplotlib (>=3)", "pytest (>=7.3.0,<8)", "pytest-cov", "pytest-randomly", "pytest-xdist", "pywinpty ; os_name == \"nt\"", "setuptools-scm[toml] (>=8.0,<9.0)"] -docs = ["ipykernel", "jupyter-client", "matplotlib", "nbconvert", "nbformat", "numpydoc", "pandas-datareader", "sphinx"] +develop = ["colorama", "cython (>=3.0.10)", "cython (>=3.0.10,<4)", "flake8", "isort", "jinja2", "joblib", "matplotlib (>=3)", "pytest (>=7.3.0,<8)", "pytest-cov", "pytest-randomly", "pytest-xdist", "pywinpty ; os_name == \"nt\"", "setuptools_scm[toml] (>=8.0,<9.0)"] +docs = ["ipykernel", "jupyter_client", "matplotlib", "nbconvert", "nbformat", "numpydoc", "pandas-datareader", "sphinx"] [[package]] name = "stevedore" -version = "5.4.1" +version = "5.6.0" description = "Manage dynamic plugins for Python applications" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["development"] files = [ - {file = "stevedore-5.4.1-py3-none-any.whl", hash = "sha256:d10a31c7b86cba16c1f6e8d15416955fc797052351a56af15e608ad20811fcfe"}, - {file = "stevedore-5.4.1.tar.gz", hash = "sha256:3135b5ae50fe12816ef291baff420acb727fcd356106e3e9cbfa9e5985cd6f4b"}, + {file = "stevedore-5.6.0-py3-none-any.whl", hash = "sha256:4a36dccefd7aeea0c70135526cecb7766c4c84c473b1af68db23d541b6dc1820"}, + {file = "stevedore-5.6.0.tar.gz", hash = "sha256:f22d15c6ead40c5bbfa9ca54aa7e7b4a07d59b36ae03ed12ced1a54cf0b51945"}, +] + +[[package]] +name = "subword-nmt" +version = "0.3.8" +description = "Unsupervised Word Segmentation for Neural Machine Translation and Text Generation" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "subword_nmt-0.3.8-py3-none-any.whl", hash = "sha256:d22526b557752f35ac15e8ea384ea7773e50a51d966b8752d023d16cb87eac36"}, + {file = "subword_nmt-0.3.8.tar.gz", hash = "sha256:3964c66b37712ca1d9fb9a1a6ff7e57c9ab72d838813da3e9a1d4d4997f4fb75"}, ] [package.dependencies] -pbr = ">=2.0.0" +mock = "*" +tqdm = "*" [[package]] name = "sympy" @@ -4196,7 +5253,7 @@ version = "1.14.0" description = "Computer algebra system (CAS) in Python" optional = false python-versions = ">=3.9" -groups = ["main"] +groups = ["main", "torch-cuda"] files = [ {file = "sympy-1.14.0-py3-none-any.whl", hash = "sha256:e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5"}, {file = "sympy-1.14.0.tar.gz", hash = "sha256:d3d3fe8df1e5a0b42f0e7bdf50541697dbe7d23746e894990c030e2b05e72517"}, @@ -4208,6 +5265,24 @@ mpmath = ">=1.1.0,<1.4" [package.extras] dev = ["hypothesis (>=6.70.0)", "pytest (>=7.1.0)"] +[[package]] +name = "tensorboardx" +version = "2.6.4" +description = "TensorBoardX lets you watch Tensors Flow without Tensorflow" +optional = false +python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"multiprocessing\"" +files = [ + {file = "tensorboardx-2.6.4-py3-none-any.whl", hash = "sha256:5970cf3a1f0a6a6e8b180ccf46f3fe832b8a25a70b86e5a237048a7c0beb18e2"}, + {file = "tensorboardx-2.6.4.tar.gz", hash = "sha256:b163ccb7798b31100b9f5fa4d6bc22dad362d7065c2f24b51e50731adde86828"}, +] + +[package.dependencies] +numpy = "*" +packaging = "*" +protobuf = ">=3.20" + [[package]] name = "threadpoolctl" version = "3.6.0" @@ -4222,14 +5297,14 @@ files = [ [[package]] name = "tokenize-rt" -version = "6.1.0" +version = "6.2.0" description = "A wrapper around the stdlib `tokenize` which roundtrips." optional = false python-versions = ">=3.9" groups = ["development"] files = [ - {file = "tokenize_rt-6.1.0-py2.py3-none-any.whl", hash = "sha256:d706141cdec4aa5f358945abe36b911b8cbdc844545da99e811250c0cee9b6fc"}, - {file = "tokenize_rt-6.1.0.tar.gz", hash = "sha256:e8ee836616c0877ab7c7b54776d2fefcc3bde714449a206762425ae114b53c86"}, + {file = "tokenize_rt-6.2.0-py2.py3-none-any.whl", hash = "sha256:a152bf4f249c847a66497a4a95f63376ed68ac6abf092a2f7cfb29d044ecff44"}, + {file = "tokenize_rt-6.2.0.tar.gz", hash = "sha256:8439c042b330c553fdbe1758e4a05c0ed460dbbbb24a606f11f0dee75da4cad6"}, ] [[package]] @@ -4246,88 +5321,99 @@ files = [ [[package]] name = "tomlkit" -version = "0.13.2" +version = "0.14.0" description = "Style preserving TOML library" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main", "development"] files = [ - {file = "tomlkit-0.13.2-py3-none-any.whl", hash = "sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde"}, - {file = "tomlkit-0.13.2.tar.gz", hash = "sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79"}, + {file = "tomlkit-0.14.0-py3-none-any.whl", hash = "sha256:592064ed85b40fa213469f81ac584f67a4f2992509a7c3ea2d632208623a3680"}, + {file = "tomlkit-0.14.0.tar.gz", hash = "sha256:cf00efca415dbd57575befb1f6634c4f42d2d87dbba376128adb42c121b87064"}, ] [[package]] name = "torch" -version = "2.7.0" +version = "2.10.0" description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" optional = false -python-versions = ">=3.9.0" -groups = ["main"] -files = [ - {file = "torch-2.7.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:c9afea41b11e1a1ab1b258a5c31afbd646d6319042bfe4f231b408034b51128b"}, - {file = "torch-2.7.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:0b9960183b6e5b71239a3e6c883d8852c304e691c0b2955f7045e8a6d05b9183"}, - {file = "torch-2.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:2ad79d0d8c2a20a37c5df6052ec67c2078a2c4e9a96dd3a8b55daaff6d28ea29"}, - {file = "torch-2.7.0-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:34e0168ed6de99121612d72224e59b2a58a83dae64999990eada7260c5dd582d"}, - {file = "torch-2.7.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:2b7813e904757b125faf1a9a3154e1d50381d539ced34da1992f52440567c156"}, - {file = "torch-2.7.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:fd5cfbb4c3bbadd57ad1b27d56a28008f8d8753733411a140fcfb84d7f933a25"}, - {file = "torch-2.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:58df8d5c2eeb81305760282b5069ea4442791a6bbf0c74d9069b7b3304ff8a37"}, - {file = "torch-2.7.0-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:0a8d43caa342b9986101ec5feb5bbf1d86570b5caa01e9cb426378311258fdde"}, - {file = "torch-2.7.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:36a6368c7ace41ad1c0f69f18056020b6a5ca47bedaca9a2f3b578f5a104c26c"}, - {file = "torch-2.7.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:15aab3e31c16feb12ae0a88dba3434a458874636f360c567caa6a91f6bfba481"}, - {file = "torch-2.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:f56d4b2510934e072bab3ab8987e00e60e1262fb238176168f5e0c43a1320c6d"}, - {file = "torch-2.7.0-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:30b7688a87239a7de83f269333651d8e582afffce6f591fff08c046f7787296e"}, - {file = "torch-2.7.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:868ccdc11798535b5727509480cd1d86d74220cfdc42842c4617338c1109a205"}, - {file = "torch-2.7.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:9b52347118116cf3dff2ab5a3c3dd97c719eb924ac658ca2a7335652076df708"}, - {file = "torch-2.7.0-cp313-cp313-win_amd64.whl", hash = "sha256:434cf3b378340efc87c758f250e884f34460624c0523fe5c9b518d205c91dd1b"}, - {file = "torch-2.7.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:edad98dddd82220465b106506bb91ee5ce32bd075cddbcf2b443dfaa2cbd83bf"}, - {file = "torch-2.7.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:2a885fc25afefb6e6eb18a7d1e8bfa01cc153e92271d980a49243b250d5ab6d9"}, - {file = "torch-2.7.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:176300ff5bc11a5f5b0784e40bde9e10a35c4ae9609beed96b4aeb46a27f5fae"}, - {file = "torch-2.7.0-cp313-cp313t-win_amd64.whl", hash = "sha256:d0ca446a93f474985d81dc866fcc8dccefb9460a29a456f79d99c29a78a66993"}, - {file = "torch-2.7.0-cp313-none-macosx_11_0_arm64.whl", hash = "sha256:27f5007bdf45f7bb7af7f11d1828d5c2487e030690afb3d89a651fd7036a390e"}, - {file = "torch-2.7.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:e362efaa5b3078e5f75c33efc05005b9b46de0d2e899519d5b4cad0e050ed0f7"}, - {file = "torch-2.7.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:fc1ed9258cbfce69970ff508ea60881818d414d098a800b7695ba36f570d34b0"}, - {file = "torch-2.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:87b0802cab44659fcb6bcf5678d58fa4a8b48561cde8fb2d317edf0b6990e1bb"}, - {file = "torch-2.7.0-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:ccd7509141713997861b7a947ef0a717143cd7e9240addd168f38ba8fd23fd56"}, +python-versions = ">=3.10" +groups = ["main", "torch-cuda"] +files = [ + {file = "torch-2.10.0-1-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:c37fc46eedd9175f9c81814cc47308f1b42cfe4987e532d4b423d23852f2bf63"}, + {file = "torch-2.10.0-1-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:f699f31a236a677b3118bc0a3ef3d89c0c29b5ec0b20f4c4bf0b110378487464"}, + {file = "torch-2.10.0-1-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:6abb224c2b6e9e27b592a1c0015c33a504b00a0e0938f1499f7f514e9b7bfb5c"}, + {file = "torch-2.10.0-1-cp313-none-macosx_11_0_arm64.whl", hash = "sha256:7350f6652dfd761f11f9ecb590bfe95b573e2961f7a242eccb3c8e78348d26fe"}, + {file = "torch-2.10.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:5276fa790a666ee8becaffff8acb711922252521b28fbce5db7db5cf9cb2026d"}, + {file = "torch-2.10.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:aaf663927bcd490ae971469a624c322202a2a1e68936eb952535ca4cd3b90444"}, + {file = "torch-2.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:a4be6a2a190b32ff5c8002a0977a25ea60e64f7ba46b1be37093c141d9c49aeb"}, + {file = "torch-2.10.0-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:35e407430795c8d3edb07a1d711c41cc1f9eaddc8b2f1cc0a165a6767a8fb73d"}, + {file = "torch-2.10.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:3282d9febd1e4e476630a099692b44fdc214ee9bf8ee5377732d9d9dfe5712e4"}, + {file = "torch-2.10.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a2f9edd8dbc99f62bc4dfb78af7bf89499bca3d753423ac1b4e06592e467b763"}, + {file = "torch-2.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:29b7009dba4b7a1c960260fc8ac85022c784250af43af9fb0ebafc9883782ebd"}, + {file = "torch-2.10.0-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:b7bd80f3477b830dd166c707c5b0b82a898e7b16f59a7d9d42778dd058272e8b"}, + {file = "torch-2.10.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:5fd4117d89ffd47e3dcc71e71a22efac24828ad781c7e46aaaf56bf7f2796acf"}, + {file = "torch-2.10.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:787124e7db3b379d4f1ed54dd12ae7c741c16a4d29b49c0226a89bea50923ffb"}, + {file = "torch-2.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:2c66c61f44c5f903046cc696d088e21062644cbe541c7f1c4eaae88b2ad23547"}, + {file = "torch-2.10.0-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:6d3707a61863d1c4d6ebba7be4ca320f42b869ee657e9b2c21c736bf17000294"}, + {file = "torch-2.10.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:5c4d217b14741e40776dd7074d9006fd28b8a97ef5654db959d8635b2fe5f29b"}, + {file = "torch-2.10.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:6b71486353fce0f9714ca0c9ef1c850a2ae766b409808acd58e9678a3edb7738"}, + {file = "torch-2.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:c2ee399c644dc92ef7bc0d4f7e74b5360c37cdbe7c5ba11318dda49ffac2bc57"}, + {file = "torch-2.10.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:3202429f58309b9fa96a614885eace4b7995729f44beb54d3e4a47773649d382"}, + {file = "torch-2.10.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:aae1b29cd68e50a9397f5ee897b9c24742e9e306f88a807a27d617f07adb3bd8"}, + {file = "torch-2.10.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:6021db85958db2f07ec94e1bc77212721ba4920c12a18dc552d2ae36a3eb163f"}, + {file = "torch-2.10.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ff43db38af76fda183156153983c9a096fc4c78d0cd1e07b14a2314c7f01c2c8"}, + {file = "torch-2.10.0-cp313-none-macosx_11_0_arm64.whl", hash = "sha256:cdf2a523d699b70d613243211ecaac14fe9c5df8a0b0a9c02add60fb2a413e0f"}, + {file = "torch-2.10.0-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:bf0d9ff448b0218e0433aeb198805192346c4fd659c852370d5cc245f602a06a"}, + {file = "torch-2.10.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:233aed0659a2503b831d8a67e9da66a62c996204c0bba4f4c442ccc0c68a3f60"}, + {file = "torch-2.10.0-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:682497e16bdfa6efeec8cde66531bc8d1fbbbb4d8788ec6173c089ed3cc2bfe5"}, + {file = "torch-2.10.0-cp314-cp314-win_amd64.whl", hash = "sha256:6528f13d2a8593a1a412ea07a99812495bec07e9224c28b2a25c0a30c7da025c"}, + {file = "torch-2.10.0-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:f5ab4ba32383061be0fb74bda772d470140a12c1c3b58a0cfbf3dae94d164c28"}, + {file = "torch-2.10.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:716b01a176c2a5659c98f6b01bf868244abdd896526f1c692712ab36dbaf9b63"}, + {file = "torch-2.10.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:d8f5912ba938233f86361e891789595ff35ca4b4e2ac8fe3670895e5976731d6"}, + {file = "torch-2.10.0-cp314-cp314t-win_amd64.whl", hash = "sha256:71283a373f0ee2c89e0f0d5f446039bdabe8dbc3c9ccf35f0f784908b0acd185"}, ] [package.dependencies] +cuda-bindings = {version = "12.9.4", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} filelock = "*" -fsspec = "*" +fsspec = ">=0.8.5" jinja2 = "*" -networkx = "*" -nvidia-cublas-cu12 = {version = "12.6.4.1", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-cuda-cupti-cu12 = {version = "12.6.80", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-cuda-nvrtc-cu12 = {version = "12.6.77", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-cuda-runtime-cu12 = {version = "12.6.77", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-cudnn-cu12 = {version = "9.5.1.17", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-cufft-cu12 = {version = "11.3.0.4", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-cufile-cu12 = {version = "1.11.1.6", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-curand-cu12 = {version = "10.3.7.77", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-cusolver-cu12 = {version = "11.7.1.2", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-cusparse-cu12 = {version = "12.5.4.2", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-cusparselt-cu12 = {version = "0.6.3", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-nccl-cu12 = {version = "2.26.2", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-nvjitlink-cu12 = {version = "12.6.85", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-nvtx-cu12 = {version = "12.6.77", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +networkx = ">=2.5.1" +nvidia-cublas-cu12 = {version = "12.8.4.1", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-cupti-cu12 = {version = "12.8.90", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-nvrtc-cu12 = {version = "12.8.93", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-runtime-cu12 = {version = "12.8.90", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cudnn-cu12 = {version = "9.10.2.21", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cufft-cu12 = {version = "11.3.3.83", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cufile-cu12 = {version = "1.13.1.3", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-curand-cu12 = {version = "10.3.9.90", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cusolver-cu12 = {version = "11.7.3.90", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cusparse-cu12 = {version = "12.5.8.93", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cusparselt-cu12 = {version = "0.7.1", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-nccl-cu12 = {version = "2.27.5", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-nvjitlink-cu12 = {version = "12.8.93", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-nvshmem-cu12 = {version = "3.4.5", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-nvtx-cu12 = {version = "12.8.90", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} setuptools = {version = "*", markers = "python_version >= \"3.12\""} sympy = ">=1.13.3" -triton = {version = "3.3.0", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +triton = {version = "3.6.0", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} typing-extensions = ">=4.10.0" [package.extras] opt-einsum = ["opt-einsum (>=3.3)"] optree = ["optree (>=0.13.0)"] +pyyaml = ["pyyaml"] [[package]] name = "torch-geometric" -version = "2.6.1" +version = "2.7.0" description = "Graph Neural Network Library for PyTorch" optional = false -python-versions = ">=3.8" -groups = ["main"] +python-versions = ">=3.10" +groups = ["main", "torch-cuda"] files = [ - {file = "torch_geometric-2.6.1-py3-none-any.whl", hash = "sha256:8faeb353f9655f7dbec44c5e0b44c721773bdfb279994da96b9b8b12fd30f427"}, - {file = "torch_geometric-2.6.1.tar.gz", hash = "sha256:1f18f9d0fc4d2239d526221e4f22606a4a3895b5d965a9856d27610a3df662c6"}, + {file = "torch_geometric-2.7.0-py3-none-any.whl", hash = "sha256:6e0cd3ad824d484651ef5d308fc66c687bfcf5ba040d56d1e0fe0f81f365e292"}, + {file = "torch_geometric-2.7.0.tar.gz", hash = "sha256:f9099e4aece1a9f618c84dbaac33a77f43139736698c7e8bddf3301ef1f2e8d4"}, ] [package.dependencies] @@ -4339,25 +5425,27 @@ psutil = ">=5.8.0" pyparsing = "*" requests = "*" tqdm = "*" +xxhash = "*" [package.extras] benchmark = ["matplotlib", "networkx", "pandas", "protobuf (<4.21)", "wandb"] dev = ["ipython", "matplotlib-inline", "pre-commit", "torch_geometric[test]"] -full = ["ase", "captum (<0.7.0)", "graphviz", "h5py", "matplotlib", "networkx", "numba (<0.60.0)", "opt_einsum", "pandas", "pgmpy", "pynndescent", "pytorch-memlab", "rdflib", "rdkit", "scikit-image", "scikit-learn", "scipy", "statsmodels", "sympy", "tabulate", "torch_geometric[graphgym,modelhub]", "torchmetrics", "trimesh"] -graphgym = ["protobuf (<4.21)", "pytorch-lightning (<2.3.0)", "yacs"] +full = ["ase", "captum (<0.7.0)", "graphviz", "h5py", "matplotlib", "networkx", "numba (<0.60.0)", "opt_einsum", "pandas", "pynndescent", "pytorch-memlab", "rdflib", "rdkit", "scikit-image", "scikit-learn", "scipy", "statsmodels", "sympy", "tabulate", "torch_geometric[graphgym,modelhub]", "torchmetrics", "trimesh"] +graphgym = ["protobuf (<4.21)", "pytorch-lightning", "yacs"] modelhub = ["huggingface_hub"] -test = ["onnx", "onnxruntime", "pytest", "pytest-cov"] +rag = ["accelerate", "datasets", "pandas", "pcst_fast", "sentencepiece", "torchmetrics", "transformers"] +test = ["onnx", "onnxruntime", "onnxscript", "pytest", "pytest-cov"] [[package]] name = "torchmetrics" -version = "1.7.1" +version = "1.8.2" description = "PyTorch native Metrics" optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "torchmetrics-1.7.1-py3-none-any.whl", hash = "sha256:9a4c45edbd0a1844cc1540c9e71bfbe0ee783a2ed997344d947fefecac90dbb9"}, - {file = "torchmetrics-1.7.1.tar.gz", hash = "sha256:0ac1a0e90d2375866ceb5d3868720c6df7d7d0c5729b7ad36e92c897c6af70c2"}, + {file = "torchmetrics-1.8.2-py3-none-any.whl", hash = "sha256:08382fd96b923e39e904c4d570f3d49e2cc71ccabd2a94e0f895d1f0dac86242"}, + {file = "torchmetrics-1.8.2.tar.gz", hash = "sha256:cf64a901036bf107f17a524009eea7781c9c5315d130713aeca5747a686fe7a5"}, ] [package.dependencies] @@ -4367,48 +5455,51 @@ packaging = ">17.1" torch = ">=2.0.0" [package.extras] -all = ["SciencePlots (>=2.0.0)", "einops (>=0.7.0)", "gammatone (>=1.0.0)", "ipadic (>=1.0.0)", "librosa (>=0.10.0)", "matplotlib (>=3.6.0)", "mecab-python3 (>=1.0.6)", "mypy (==1.15.0)", "nltk (>3.8.1)", "onnxruntime (>=1.12.0)", "pesq (>=0.0.4)", "piq (<=0.8.0)", "pycocotools (>2.0.0)", "pystoi (>=0.4.0)", "regex (>=2021.9.24)", "requests (>=2.19.0)", "scipy (>1.0.0)", "sentencepiece (>=0.2.0)", "timm (>=0.9.0)", "torch (==2.6.0)", "torch-fidelity (<=0.4.0)", "torch_linear_assignment (>=0.0.2)", "torchaudio (>=2.0.1)", "torchvision (>=0.15.1)", "torchvision (>=0.15.1)", "tqdm (<4.68.0)", "transformers (>4.4.0)", "transformers (>=4.42.3)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"] +all = ["SciencePlots (>=2.0.0)", "einops (>=0.7.0)", "einops (>=0.7.0)", "gammatone (>=1.0.0)", "ipadic (>=1.0.0)", "librosa (>=0.10.0)", "matplotlib (>=3.6.0)", "mecab-python3 (>=1.0.6)", "mypy (==1.17.1)", "nltk (>3.8.1)", "onnxruntime (>=1.12.0)", "pesq (>=0.0.4)", "piq (<=0.8.0)", "pycocotools (>2.0.0)", "pystoi (>=0.4.0)", "regex (>=2021.9.24)", "requests (>=2.19.0)", "scipy (>1.0.0)", "sentencepiece (>=0.2.0)", "timm (>=0.9.0)", "torch (==2.8.0)", "torch-fidelity (<=0.4.0)", "torch_linear_assignment (>=0.0.2)", "torchaudio (>=2.0.1)", "torchvision (>=0.15.1)", "torchvision (>=0.15.1)", "tqdm (<4.68.0)", "transformers (>=4.43.0)", "transformers (>=4.43.0)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate", "vmaf-torch (>=1.1.0)"] audio = ["gammatone (>=1.0.0)", "librosa (>=0.10.0)", "onnxruntime (>=1.12.0)", "pesq (>=0.0.4)", "pystoi (>=0.4.0)", "requests (>=2.19.0)", "torchaudio (>=2.0.1)"] clustering = ["torch_linear_assignment (>=0.0.2)"] detection = ["pycocotools (>2.0.0)", "torchvision (>=0.15.1)"] -dev = ["PyTDC (==0.4.1) ; python_version < \"3.12\"", "SciencePlots (>=2.0.0)", "aeon (>=1.0.0) ; python_version > \"3.10\"", "bert_score (==0.3.13)", "dists-pytorch (==0.1)", "dython (==0.7.9)", "einops (>=0.7.0)", "fairlearn", "fast-bss-eval (>=0.1.0)", "faster-coco-eval (>=1.6.3)", "gammatone (>=1.0.0)", "huggingface-hub (<0.31)", "ipadic (>=1.0.0)", "jiwer (>=2.3.0)", "kornia (>=0.6.7)", "librosa (>=0.10.0)", "lpips (<=0.1.4)", "matplotlib (>=3.6.0)", "mecab-ko (>=1.0.0,<1.1.0) ; python_version < \"3.12\"", "mecab-ko-dic (>=1.0.0) ; python_version < \"3.12\"", "mecab-python3 (>=1.0.6)", "mir-eval (>=0.6)", "monai (==1.4.0)", "mypy (==1.15.0)", "netcal (>1.0.0)", "nltk (>3.8.1)", "numpy (<2.3.0)", "onnxruntime (>=1.12.0)", "pandas (>1.4.0)", "permetrics (==2.0.0)", "pesq (>=0.0.4)", "piq (<=0.8.0)", "pycocotools (>2.0.0)", "pystoi (>=0.4.0)", "pytorch-msssim (==1.0.0)", "regex (>=2021.9.24)", "requests (>=2.19.0)", "rouge-score (>0.1.0)", "sacrebleu (>=2.3.0)", "scikit-image (>=0.19.0)", "scipy (>1.0.0)", "scipy (>1.0.0)", "sentencepiece (>=0.2.0)", "sewar (>=0.4.4)", "statsmodels (>0.13.5)", "timm (>=0.9.0)", "torch (==2.6.0)", "torch-fidelity (<=0.4.0)", "torch_complex (<0.5.0)", "torch_linear_assignment (>=0.0.2)", "torchaudio (>=2.0.1)", "torchvision (>=0.15.1)", "torchvision (>=0.15.1)", "tqdm (<4.68.0)", "transformers (>4.4.0)", "transformers (>=4.42.3)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"] +dev = ["PyTDC (==0.4.1) ; python_version < \"3.10\" or platform_system == \"Windows\" and python_version < \"3.12\"", "SciencePlots (>=2.0.0)", "aeon (>=1.0.0) ; python_version > \"3.10\"", "bert_score (==0.3.13)", "dists-pytorch (==0.1)", "dython (==0.7.9)", "einops (>=0.7.0)", "einops (>=0.7.0)", "fairlearn", "fast-bss-eval (>=0.1.0)", "faster-coco-eval (>=1.6.3)", "gammatone (>=1.0.0)", "huggingface-hub (<0.35)", "ipadic (>=1.0.0)", "jiwer (>=2.3.0)", "kornia (>=0.6.7)", "librosa (>=0.10.0)", "lpips (<=0.1.4)", "matplotlib (>=3.6.0)", "mecab-ko (>=1.0.0,<1.1.0) ; python_version < \"3.12\"", "mecab-ko-dic (>=1.0.0) ; python_version < \"3.12\"", "mecab-python3 (>=1.0.6)", "mir-eval (>=0.6)", "monai (==1.4.0)", "mypy (==1.17.1)", "netcal (>1.0.0)", "nltk (>3.8.1)", "numpy (<2.4.0)", "onnxruntime (>=1.12.0)", "pandas (>1.4.0)", "permetrics (==2.0.0)", "pesq (>=0.0.4)", "piq (<=0.8.0)", "properscoring (==0.1)", "pycocotools (>2.0.0)", "pystoi (>=0.4.0)", "pytorch-msssim (==1.0.0)", "regex (>=2021.9.24)", "requests (>=2.19.0)", "rouge-score (>0.1.0)", "sacrebleu (>=2.3.0)", "scikit-image (>=0.19.0)", "scipy (>1.0.0)", "scipy (>1.0.0)", "sentencepiece (>=0.2.0)", "sewar (>=0.4.4)", "statsmodels (>0.13.5)", "timm (>=0.9.0)", "torch (==2.8.0)", "torch-fidelity (<=0.4.0)", "torch_complex (<0.5.0)", "torch_linear_assignment (>=0.0.2)", "torchaudio (>=2.0.1)", "torchvision (>=0.15.1)", "torchvision (>=0.15.1)", "tqdm (<4.68.0)", "transformers (>=4.43.0)", "transformers (>=4.43.0)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate", "vmaf-torch (>=1.1.0)"] image = ["scipy (>1.0.0)", "torch-fidelity (<=0.4.0)", "torchvision (>=0.15.1)"] -multimodal = ["einops (>=0.7.0)", "piq (<=0.8.0)", "timm (>=0.9.0)", "transformers (>=4.42.3)"] -text = ["ipadic (>=1.0.0)", "mecab-python3 (>=1.0.6)", "nltk (>3.8.1)", "regex (>=2021.9.24)", "sentencepiece (>=0.2.0)", "tqdm (<4.68.0)", "transformers (>4.4.0)"] -typing = ["mypy (==1.15.0)", "torch (==2.6.0)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"] +multimodal = ["einops (>=0.7.0)", "piq (<=0.8.0)", "timm (>=0.9.0)", "transformers (>=4.43.0)"] +text = ["ipadic (>=1.0.0)", "mecab-python3 (>=1.0.6)", "nltk (>3.8.1)", "regex (>=2021.9.24)", "sentencepiece (>=0.2.0)", "tqdm (<4.68.0)", "transformers (>=4.43.0)"] +typing = ["mypy (==1.17.1)", "torch (==2.8.0)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"] +video = ["einops (>=0.7.0)", "vmaf-torch (>=1.1.0)"] visual = ["SciencePlots (>=2.0.0)", "matplotlib (>=3.6.0)"] [[package]] name = "tornado" -version = "6.4.2" +version = "6.5.4" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main"] +markers = "sys_platform != \"emscripten\"" files = [ - {file = "tornado-6.4.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e828cce1123e9e44ae2a50a9de3055497ab1d0aeb440c5ac23064d9e44880da1"}, - {file = "tornado-6.4.2-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:072ce12ada169c5b00b7d92a99ba089447ccc993ea2143c9ede887e0937aa803"}, - {file = "tornado-6.4.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a017d239bd1bb0919f72af256a970624241f070496635784d9bf0db640d3fec"}, - {file = "tornado-6.4.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c36e62ce8f63409301537222faffcef7dfc5284f27eec227389f2ad11b09d946"}, - {file = "tornado-6.4.2-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bca9eb02196e789c9cb5c3c7c0f04fb447dc2adffd95265b2c7223a8a615ccbf"}, - {file = "tornado-6.4.2-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:304463bd0772442ff4d0f5149c6f1c2135a1fae045adf070821c6cdc76980634"}, - {file = "tornado-6.4.2-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:c82c46813ba483a385ab2a99caeaedf92585a1f90defb5693351fa7e4ea0bf73"}, - {file = "tornado-6.4.2-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:932d195ca9015956fa502c6b56af9eb06106140d844a335590c1ec7f5277d10c"}, - {file = "tornado-6.4.2-cp38-abi3-win32.whl", hash = "sha256:2876cef82e6c5978fde1e0d5b1f919d756968d5b4282418f3146b79b58556482"}, - {file = "tornado-6.4.2-cp38-abi3-win_amd64.whl", hash = "sha256:908b71bf3ff37d81073356a5fadcc660eb10c1476ee6e2725588626ce7e5ca38"}, - {file = "tornado-6.4.2.tar.gz", hash = "sha256:92bad5b4746e9879fd7bf1eb21dce4e3fc5128d71601f80005afa39237ad620b"}, + {file = "tornado-6.5.4-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:d6241c1a16b1c9e4cc28148b1cda97dd1c6cb4fb7068ac1bedc610768dff0ba9"}, + {file = "tornado-6.5.4-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:2d50f63dda1d2cac3ae1fa23d254e16b5e38153758470e9956cbc3d813d40843"}, + {file = "tornado-6.5.4-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1cf66105dc6acb5af613c054955b8137e34a03698aa53272dbda4afe252be17"}, + {file = "tornado-6.5.4-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50ff0a58b0dc97939d29da29cd624da010e7f804746621c78d14b80238669335"}, + {file = "tornado-6.5.4-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5fb5e04efa54cf0baabdd10061eb4148e0be137166146fff835745f59ab9f7f"}, + {file = "tornado-6.5.4-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9c86b1643b33a4cd415f8d0fe53045f913bf07b4a3ef646b735a6a86047dda84"}, + {file = "tornado-6.5.4-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:6eb82872335a53dd063a4f10917b3efd28270b56a33db69009606a0312660a6f"}, + {file = "tornado-6.5.4-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6076d5dda368c9328ff41ab5d9dd3608e695e8225d1cd0fd1e006f05da3635a8"}, + {file = "tornado-6.5.4-cp39-abi3-win32.whl", hash = "sha256:1768110f2411d5cd281bac0a090f707223ce77fd110424361092859e089b38d1"}, + {file = "tornado-6.5.4-cp39-abi3-win_amd64.whl", hash = "sha256:fa07d31e0cd85c60713f2b995da613588aa03e1303d75705dca6af8babc18ddc"}, + {file = "tornado-6.5.4-cp39-abi3-win_arm64.whl", hash = "sha256:053e6e16701eb6cbe641f308f4c1a9541f91b6261991160391bfc342e8a551a1"}, + {file = "tornado-6.5.4.tar.gz", hash = "sha256:a22fa9047405d03260b483980635f0b041989d8bcc9a313f8fe18b411d84b1d7"}, ] [[package]] name = "tqdm" -version = "4.67.1" +version = "4.67.3" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" -groups = ["main"] +groups = ["main", "torch-cuda"] files = [ - {file = "tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2"}, - {file = "tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2"}, + {file = "tqdm-4.67.3-py3-none-any.whl", hash = "sha256:ee1e4c0e59148062281c49d80b25b67771a127c85fc9676d3be5f243206826bf"}, + {file = "tqdm-4.67.3.tar.gz", hash = "sha256:7d825f03f89244ef73f1d4ce193cb1774a8179fd96f31d7e1dcde62092b960bb"}, ] [package.dependencies] @@ -4423,93 +5514,114 @@ telegram = ["requests"] [[package]] name = "triton" -version = "3.3.0" +version = "3.6.0" description = "A language and compiler for custom Deep Learning operations" optional = false -python-versions = "*" -groups = ["main"] +python-versions = "<3.15,>=3.10" +groups = ["main", "torch-cuda"] markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" files = [ - {file = "triton-3.3.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fad99beafc860501d7fcc1fb7045d9496cbe2c882b1674640304949165a916e7"}, - {file = "triton-3.3.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3161a2bf073d6b22c4e2f33f951f3e5e3001462b2570e6df9cd57565bdec2984"}, - {file = "triton-3.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b68c778f6c4218403a6bd01be7484f6dc9e20fe2083d22dd8aef33e3b87a10a3"}, - {file = "triton-3.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:47bc87ad66fa4ef17968299acacecaab71ce40a238890acc6ad197c3abe2b8f1"}, - {file = "triton-3.3.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ce4700fc14032af1e049005ae94ba908e71cd6c2df682239aed08e49bc71b742"}, - {file = "triton-3.3.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1f41403bfa0cbb3e24fd958ca7fee04e9681e55e539296db9aca30c42acae693"}, + {file = "triton-3.6.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6c723cfb12f6842a0ae94ac307dba7e7a44741d720a40cf0e270ed4a4e3be781"}, + {file = "triton-3.6.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a6550fae429e0667e397e5de64b332d1e5695b73650ee75a6146e2e902770bea"}, + {file = "triton-3.6.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:49df5ef37379c0c2b5c0012286f80174fcf0e073e5ade1ca9a86c36814553651"}, + {file = "triton-3.6.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e8e323d608e3a9bfcc2d9efcc90ceefb764a82b99dea12a86d643c72539ad5d3"}, + {file = "triton-3.6.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:374f52c11a711fd062b4bfbb201fd9ac0a5febd28a96fb41b4a0f51dde3157f4"}, + {file = "triton-3.6.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:74caf5e34b66d9f3a429af689c1c7128daba1d8208df60e81106b115c00d6fca"}, + {file = "triton-3.6.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:448e02fe6dc898e9e5aa89cf0ee5c371e99df5aa5e8ad976a80b93334f3494fd"}, + {file = "triton-3.6.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:10c7f76c6e72d2ef08df639e3d0d30729112f47a56b0c81672edc05ee5116ac9"}, + {file = "triton-3.6.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1722e172d34e32abc3eb7711d0025bb69d7959ebea84e3b7f7a341cd7ed694d6"}, + {file = "triton-3.6.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d002e07d7180fd65e622134fbd980c9a3d4211fb85224b56a0a0efbd422ab72f"}, + {file = "triton-3.6.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef5523241e7d1abca00f1d240949eebdd7c673b005edbbce0aca95b8191f1d43"}, + {file = "triton-3.6.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a17a5d5985f0ac494ed8a8e54568f092f7057ef60e1b0fa09d3fd1512064e803"}, + {file = "triton-3.6.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b3a97e8ed304dfa9bd23bb41ca04cdf6b2e617d5e782a8653d616037a5d537d"}, + {file = "triton-3.6.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:46bd1c1af4b6704e554cad2eeb3b0a6513a980d470ccfa63189737340c7746a7"}, ] -[package.dependencies] -setuptools = ">=40.8.0" - [package.extras] -build = ["cmake (>=3.20)", "lit"] +build = ["cmake (>=3.20,<4.0)", "lit"] tests = ["autopep8", "isort", "llnl-hatchet", "numpy", "pytest", "pytest-forked", "pytest-xdist", "scipy (>=1.7.1)"] tutorials = ["matplotlib", "pandas", "tabulate"] [[package]] name = "trove-classifiers" -version = "2025.5.8.13" +version = "2026.1.14.14" description = "Canonical source for classifiers on PyPI (pypi.org)." optional = false python-versions = "*" groups = ["main"] files = [ - {file = "trove_classifiers-2025.5.8.13-py3-none-any.whl", hash = "sha256:c5b2186be0e428d05944d22aab259a3916b3d52ac3cb2c742d6ba68627f879b1"}, - {file = "trove_classifiers-2025.5.8.13.tar.gz", hash = "sha256:b3e3742a6b01eaaec35500ac1b9220683f65b63fa05ef78d5d26d2f1e9ac6ca8"}, + {file = "trove_classifiers-2026.1.14.14-py3-none-any.whl", hash = "sha256:1f9553927f18d0513d8e5ff80ab8980b8202ce37ecae0e3274ed2ef11880e74d"}, + {file = "trove_classifiers-2026.1.14.14.tar.gz", hash = "sha256:00492545a1402b09d4858605ba190ea33243d361e2b01c9c296ce06b5c3325f3"}, ] [[package]] name = "typing-extensions" -version = "4.13.2" -description = "Backported and Experimental Type Hints for Python 3.8+" +version = "4.15.0" +description = "Backported and Experimental Type Hints for Python 3.9+" optional = false -python-versions = ">=3.8" -groups = ["main", "development"] +python-versions = ">=3.9" +groups = ["main", "development", "torch-cuda"] files = [ - {file = "typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c"}, - {file = "typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef"}, + {file = "typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548"}, + {file = "typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466"}, ] +markers = {development = "python_version < \"3.13\""} + +[[package]] +name = "typing-inspection" +version = "0.4.2" +description = "Runtime typing introspection tools" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7"}, + {file = "typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464"}, +] + +[package.dependencies] +typing-extensions = ">=4.12.0" [[package]] name = "tzdata" -version = "2025.2" +version = "2025.3" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" groups = ["main"] files = [ - {file = "tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8"}, - {file = "tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9"}, + {file = "tzdata-2025.3-py2.py3-none-any.whl", hash = "sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1"}, + {file = "tzdata-2025.3.tar.gz", hash = "sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7"}, ] [[package]] name = "urllib3" -version = "2.4.0" +version = "2.6.3" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.9" -groups = ["main", "development"] +groups = ["main", "development", "torch-cuda"] files = [ - {file = "urllib3-2.4.0-py3-none-any.whl", hash = "sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813"}, - {file = "urllib3-2.4.0.tar.gz", hash = "sha256:414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466"}, + {file = "urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4"}, + {file = "urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed"}, ] [package.extras] -brotli = ["brotli (>=1.0.9) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\""] +brotli = ["brotli (>=1.2.0) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=1.2.0.0) ; platform_python_implementation != \"CPython\""] h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] -zstd = ["zstandard (>=0.18.0)"] +zstd = ["backports-zstd (>=1.0.0) ; python_version < \"3.14\""] [[package]] name = "uvicorn" -version = "0.34.2" +version = "0.40.0" description = "The lightning-fast ASGI server." optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["development"] files = [ - {file = "uvicorn-0.34.2-py3-none-any.whl", hash = "sha256:deb49af569084536d269fe0a6d67e3754f104cf03aba7c11c40f01aadf33c403"}, - {file = "uvicorn-0.34.2.tar.gz", hash = "sha256:0e929828f6186353a80b58ea719861d2629d766293b6d19baf086ba31d4f3328"}, + {file = "uvicorn-0.40.0-py3-none-any.whl", hash = "sha256:c6c8f55bc8bf13eb6fa9ff87ad62308bbbc33d0b67f84293151efe87e0d5f2ee"}, + {file = "uvicorn-0.40.0.tar.gz", hash = "sha256:839676675e87e73694518b5574fd0f24c9d97b46bea16df7b8c05ea1a51071ea"}, ] [package.dependencies] @@ -4517,108 +5629,191 @@ click = ">=7.0" h11 = ">=0.8" [package.extras] -standard = ["colorama (>=0.4) ; sys_platform == \"win32\"", "httptools (>=0.6.3)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1) ; sys_platform != \"win32\" and sys_platform != \"cygwin\" and platform_python_implementation != \"PyPy\"", "watchfiles (>=0.13)", "websockets (>=10.4)"] +standard = ["colorama (>=0.4) ; sys_platform == \"win32\"", "httptools (>=0.6.3)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.15.1) ; sys_platform != \"win32\" and sys_platform != \"cygwin\" and platform_python_implementation != \"PyPy\"", "watchfiles (>=0.13)", "websockets (>=10.4)"] [[package]] name = "virtualenv" -version = "20.31.1" +version = "20.36.1" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.8" groups = ["main", "development"] files = [ - {file = "virtualenv-20.31.1-py3-none-any.whl", hash = "sha256:f448cd2f1604c831afb9ea238021060be2c0edbcad8eb0a4e8b4e14ff11a5482"}, - {file = "virtualenv-20.31.1.tar.gz", hash = "sha256:65442939608aeebb9284cd30baca5865fcd9f12b58bb740a24b220030df46d26"}, + {file = "virtualenv-20.36.1-py3-none-any.whl", hash = "sha256:575a8d6b124ef88f6f51d56d656132389f961062a9177016a50e4f507bbcc19f"}, + {file = "virtualenv-20.36.1.tar.gz", hash = "sha256:8befb5c81842c641f8ee658481e42641c68b5eab3521d8e092d18320902466ba"}, ] [package.dependencies] distlib = ">=0.3.7,<1" -filelock = ">=3.12.2,<4" +filelock = {version = ">=3.20.1,<4", markers = "python_version >= \"3.10\""} platformdirs = ">=3.9.1,<5" [package.extras] docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8) ; platform_python_implementation == \"PyPy\" or platform_python_implementation == \"GraalVM\" or platform_python_implementation == \"CPython\" and sys_platform == \"win32\" and python_version >= \"3.13\"", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10) ; platform_python_implementation == \"CPython\""] +[[package]] +name = "wandb" +version = "0.24.2" +description = "A CLI and library for interacting with the Weights & Biases API." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "wandb-0.24.2-py3-none-macosx_12_0_arm64.whl", hash = "sha256:755b8a92edd28e15c052dc2bdc4652e26bce379fa7745360249cbfc589ff5f53"}, + {file = "wandb-0.24.2-py3-none-macosx_12_0_x86_64.whl", hash = "sha256:5e6c0ad176792c7c3d1620a2ad65bd9a5f3886c69362af540d3667bfc97b67fb"}, + {file = "wandb-0.24.2-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:85861f9b3e54a07b84bade0aa5f4caa156028ab959351d98816a45e3b1411d35"}, + {file = "wandb-0.24.2-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:38661c666e70d7e1f460fc0a0edab8a393eaaa5f8773c17be534961a7022779d"}, + {file = "wandb-0.24.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:656a4272000999569eb8e0773f1259403bc6bd3e7d1c7d2238d3e359874da9c4"}, + {file = "wandb-0.24.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:33cba098d95fd46720cc9023bd23e4a38e9b11836a836b4a57b8d41cff8985f2"}, + {file = "wandb-0.24.2-py3-none-win32.whl", hash = "sha256:70db8680e8d7edb5bd60dfb7f31aeb5af30b31ad72498c47e1aba7471c337bb2"}, + {file = "wandb-0.24.2-py3-none-win_amd64.whl", hash = "sha256:a78ac1fa116b196cd33250b3d80f4a5c05c141ad949175515c007ec9826e49a6"}, + {file = "wandb-0.24.2-py3-none-win_arm64.whl", hash = "sha256:b42614b99f8b9af69f88c15a84283a973c8cd5750e9c4752aa3ce21f13dbac9a"}, + {file = "wandb-0.24.2.tar.gz", hash = "sha256:968b5b91d0a164dfb2f8c604cdf69e6fb09de6596b85b9f9d3c916b71ae86198"}, +] + +[package.dependencies] +click = ">=8.0.1" +gitpython = ">=1.0.0,<3.1.29 || >3.1.29" +packaging = "*" +platformdirs = "*" +protobuf = {version = ">=3.19.0,<4.21.0 || >4.21.0,<5.28.0 || >5.28.0,<7", markers = "python_version > \"3.9\" or sys_platform != \"linux\""} +pydantic = "<3" +pyyaml = "*" +requests = ">=2.0.0,<3" +sentry-sdk = ">=2.0.0" +typing-extensions = ">=4.8,<5" + +[package.extras] +aws = ["boto3", "botocore (>=1.5.76)"] +azure = ["azure-identity", "azure-storage-blob"] +gcp = ["google-cloud-storage"] +importers = ["filelock", "mlflow", "polars (<=1.2.1)", "rich", "tenacity"] +kubeflow = ["google-cloud-storage", "kubernetes", "minio", "sh"] +launch = ["awscli", "azure-containerregistry", "azure-identity", "azure-storage-blob", "boto3", "botocore (>=1.5.76)", "chardet", "google-auth", "google-cloud-aiplatform", "google-cloud-artifact-registry", "google-cloud-compute", "google-cloud-storage", "iso8601", "jsonschema", "kubernetes", "kubernetes-asyncio", "nbconvert", "nbformat", "optuna", "pydantic", "pyyaml (>=6.0.0)", "tomli", "tornado (>=6.5.0) ; python_version >= \"3.9\"", "typing-extensions"] +media = ["bokeh", "imageio (>=2.28.1)", "moviepy (>=1.0.0)", "numpy", "pillow", "plotly (>=5.18.0)", "rdkit", "soundfile"] +models = ["cloudpickle"] +perf = ["orjson"] +sweeps = ["sweeps (>=0.2.0)"] +workspaces = ["wandb-workspaces"] + [[package]] name = "watchfiles" -version = "1.0.5" +version = "1.1.1" description = "Simple, modern and high performance file watching and code reload in python." optional = false python-versions = ">=3.9" groups = ["development"] files = [ - {file = "watchfiles-1.0.5-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:5c40fe7dd9e5f81e0847b1ea64e1f5dd79dd61afbedb57759df06767ac719b40"}, - {file = "watchfiles-1.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8c0db396e6003d99bb2d7232c957b5f0b5634bbd1b24e381a5afcc880f7373fb"}, - {file = "watchfiles-1.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b551d4fb482fc57d852b4541f911ba28957d051c8776e79c3b4a51eb5e2a1b11"}, - {file = "watchfiles-1.0.5-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:830aa432ba5c491d52a15b51526c29e4a4b92bf4f92253787f9726fe01519487"}, - {file = "watchfiles-1.0.5-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a16512051a822a416b0d477d5f8c0e67b67c1a20d9acecb0aafa3aa4d6e7d256"}, - {file = "watchfiles-1.0.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bfe0cbc787770e52a96c6fda6726ace75be7f840cb327e1b08d7d54eadc3bc85"}, - {file = "watchfiles-1.0.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d363152c5e16b29d66cbde8fa614f9e313e6f94a8204eaab268db52231fe5358"}, - {file = "watchfiles-1.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ee32c9a9bee4d0b7bd7cbeb53cb185cf0b622ac761efaa2eba84006c3b3a614"}, - {file = "watchfiles-1.0.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:29c7fd632ccaf5517c16a5188e36f6612d6472ccf55382db6c7fe3fcccb7f59f"}, - {file = "watchfiles-1.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8e637810586e6fe380c8bc1b3910accd7f1d3a9a7262c8a78d4c8fb3ba6a2b3d"}, - {file = "watchfiles-1.0.5-cp310-cp310-win32.whl", hash = "sha256:cd47d063fbeabd4c6cae1d4bcaa38f0902f8dc5ed168072874ea11d0c7afc1ff"}, - {file = "watchfiles-1.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:86c0df05b47a79d80351cd179893f2f9c1b1cae49d96e8b3290c7f4bd0ca0a92"}, - {file = "watchfiles-1.0.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:237f9be419e977a0f8f6b2e7b0475ababe78ff1ab06822df95d914a945eac827"}, - {file = "watchfiles-1.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e0da39ff917af8b27a4bdc5a97ac577552a38aac0d260a859c1517ea3dc1a7c4"}, - {file = "watchfiles-1.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cfcb3952350e95603f232a7a15f6c5f86c5375e46f0bd4ae70d43e3e063c13d"}, - {file = "watchfiles-1.0.5-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:68b2dddba7a4e6151384e252a5632efcaa9bc5d1c4b567f3cb621306b2ca9f63"}, - {file = "watchfiles-1.0.5-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:95cf944fcfc394c5f9de794ce581914900f82ff1f855326f25ebcf24d5397418"}, - {file = "watchfiles-1.0.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ecf6cd9f83d7c023b1aba15d13f705ca7b7d38675c121f3cc4a6e25bd0857ee9"}, - {file = "watchfiles-1.0.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:852de68acd6212cd6d33edf21e6f9e56e5d98c6add46f48244bd479d97c967c6"}, - {file = "watchfiles-1.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5730f3aa35e646103b53389d5bc77edfbf578ab6dab2e005142b5b80a35ef25"}, - {file = "watchfiles-1.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:18b3bd29954bc4abeeb4e9d9cf0b30227f0f206c86657674f544cb032296acd5"}, - {file = "watchfiles-1.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ba5552a1b07c8edbf197055bc9d518b8f0d98a1c6a73a293bc0726dce068ed01"}, - {file = "watchfiles-1.0.5-cp311-cp311-win32.whl", hash = "sha256:2f1fefb2e90e89959447bc0420fddd1e76f625784340d64a2f7d5983ef9ad246"}, - {file = "watchfiles-1.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:b6e76ceb1dd18c8e29c73f47d41866972e891fc4cc7ba014f487def72c1cf096"}, - {file = "watchfiles-1.0.5-cp311-cp311-win_arm64.whl", hash = "sha256:266710eb6fddc1f5e51843c70e3bebfb0f5e77cf4f27129278c70554104d19ed"}, - {file = "watchfiles-1.0.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:b5eb568c2aa6018e26da9e6c86f3ec3fd958cee7f0311b35c2630fa4217d17f2"}, - {file = "watchfiles-1.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0a04059f4923ce4e856b4b4e5e783a70f49d9663d22a4c3b3298165996d1377f"}, - {file = "watchfiles-1.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e380c89983ce6e6fe2dd1e1921b9952fb4e6da882931abd1824c092ed495dec"}, - {file = "watchfiles-1.0.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fe43139b2c0fdc4a14d4f8d5b5d967f7a2777fd3d38ecf5b1ec669b0d7e43c21"}, - {file = "watchfiles-1.0.5-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee0822ce1b8a14fe5a066f93edd20aada932acfe348bede8aa2149f1a4489512"}, - {file = "watchfiles-1.0.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a0dbcb1c2d8f2ab6e0a81c6699b236932bd264d4cef1ac475858d16c403de74d"}, - {file = "watchfiles-1.0.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a2014a2b18ad3ca53b1f6c23f8cd94a18ce930c1837bd891262c182640eb40a6"}, - {file = "watchfiles-1.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10f6ae86d5cb647bf58f9f655fcf577f713915a5d69057a0371bc257e2553234"}, - {file = "watchfiles-1.0.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1a7bac2bde1d661fb31f4d4e8e539e178774b76db3c2c17c4bb3e960a5de07a2"}, - {file = "watchfiles-1.0.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ab626da2fc1ac277bbf752446470b367f84b50295264d2d313e28dc4405d663"}, - {file = "watchfiles-1.0.5-cp312-cp312-win32.whl", hash = "sha256:9f4571a783914feda92018ef3901dab8caf5b029325b5fe4558c074582815249"}, - {file = "watchfiles-1.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:360a398c3a19672cf93527f7e8d8b60d8275119c5d900f2e184d32483117a705"}, - {file = "watchfiles-1.0.5-cp312-cp312-win_arm64.whl", hash = "sha256:1a2902ede862969077b97523987c38db28abbe09fb19866e711485d9fbf0d417"}, - {file = "watchfiles-1.0.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:0b289572c33a0deae62daa57e44a25b99b783e5f7aed81b314232b3d3c81a11d"}, - {file = "watchfiles-1.0.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a056c2f692d65bf1e99c41045e3bdcaea3cb9e6b5a53dcaf60a5f3bd95fc9763"}, - {file = "watchfiles-1.0.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9dca99744991fc9850d18015c4f0438865414e50069670f5f7eee08340d8b40"}, - {file = "watchfiles-1.0.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:894342d61d355446d02cd3988a7326af344143eb33a2fd5d38482a92072d9563"}, - {file = "watchfiles-1.0.5-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ab44e1580924d1ffd7b3938e02716d5ad190441965138b4aa1d1f31ea0877f04"}, - {file = "watchfiles-1.0.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d6f9367b132078b2ceb8d066ff6c93a970a18c3029cea37bfd7b2d3dd2e5db8f"}, - {file = "watchfiles-1.0.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2e55a9b162e06e3f862fb61e399fe9f05d908d019d87bf5b496a04ef18a970a"}, - {file = "watchfiles-1.0.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0125f91f70e0732a9f8ee01e49515c35d38ba48db507a50c5bdcad9503af5827"}, - {file = "watchfiles-1.0.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:13bb21f8ba3248386337c9fa51c528868e6c34a707f729ab041c846d52a0c69a"}, - {file = "watchfiles-1.0.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:839ebd0df4a18c5b3c1b890145b5a3f5f64063c2a0d02b13c76d78fe5de34936"}, - {file = "watchfiles-1.0.5-cp313-cp313-win32.whl", hash = "sha256:4a8ec1e4e16e2d5bafc9ba82f7aaecfeec990ca7cd27e84fb6f191804ed2fcfc"}, - {file = "watchfiles-1.0.5-cp313-cp313-win_amd64.whl", hash = "sha256:f436601594f15bf406518af922a89dcaab416568edb6f65c4e5bbbad1ea45c11"}, - {file = "watchfiles-1.0.5-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:2cfb371be97d4db374cba381b9f911dd35bb5f4c58faa7b8b7106c8853e5d225"}, - {file = "watchfiles-1.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a3904d88955fda461ea2531fcf6ef73584ca921415d5cfa44457a225f4a42bc1"}, - {file = "watchfiles-1.0.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b7a21715fb12274a71d335cff6c71fe7f676b293d322722fe708a9ec81d91f5"}, - {file = "watchfiles-1.0.5-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:dfd6ae1c385ab481766b3c61c44aca2b3cd775f6f7c0fa93d979ddec853d29d5"}, - {file = "watchfiles-1.0.5-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b659576b950865fdad31fa491d31d37cf78b27113a7671d39f919828587b429b"}, - {file = "watchfiles-1.0.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1909e0a9cd95251b15bff4261de5dd7550885bd172e3536824bf1cf6b121e200"}, - {file = "watchfiles-1.0.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:832ccc221927c860e7286c55c9b6ebcc0265d5e072f49c7f6456c7798d2b39aa"}, - {file = "watchfiles-1.0.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85fbb6102b3296926d0c62cfc9347f6237fb9400aecd0ba6bbda94cae15f2b3b"}, - {file = "watchfiles-1.0.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:15ac96dd567ad6c71c71f7b2c658cb22b7734901546cd50a475128ab557593ca"}, - {file = "watchfiles-1.0.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4b6227351e11c57ae997d222e13f5b6f1f0700d84b8c52304e8675d33a808382"}, - {file = "watchfiles-1.0.5-cp39-cp39-win32.whl", hash = "sha256:974866e0db748ebf1eccab17862bc0f0303807ed9cda465d1324625b81293a18"}, - {file = "watchfiles-1.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:9848b21ae152fe79c10dd0197304ada8f7b586d3ebc3f27f43c506e5a52a863c"}, - {file = "watchfiles-1.0.5-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f59b870db1f1ae5a9ac28245707d955c8721dd6565e7f411024fa374b5362d1d"}, - {file = "watchfiles-1.0.5-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9475b0093767e1475095f2aeb1d219fb9664081d403d1dff81342df8cd707034"}, - {file = "watchfiles-1.0.5-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc533aa50664ebd6c628b2f30591956519462f5d27f951ed03d6c82b2dfd9965"}, - {file = "watchfiles-1.0.5-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fed1cd825158dcaae36acce7b2db33dcbfd12b30c34317a88b8ed80f0541cc57"}, - {file = "watchfiles-1.0.5-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:554389562c29c2c182e3908b149095051f81d28c2fec79ad6c8997d7d63e0009"}, - {file = "watchfiles-1.0.5-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:a74add8d7727e6404d5dc4dcd7fac65d4d82f95928bbee0cf5414c900e86773e"}, - {file = "watchfiles-1.0.5-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb1489f25b051a89fae574505cc26360c8e95e227a9500182a7fe0afcc500ce0"}, - {file = "watchfiles-1.0.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0901429650652d3f0da90bad42bdafc1f9143ff3605633c455c999a2d786cac"}, - {file = "watchfiles-1.0.5.tar.gz", hash = "sha256:b7529b5dcc114679d43827d8c35a07c493ad6f083633d573d81c660abc5979e9"}, + {file = "watchfiles-1.1.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:eef58232d32daf2ac67f42dea51a2c80f0d03379075d44a587051e63cc2e368c"}, + {file = "watchfiles-1.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:03fa0f5237118a0c5e496185cafa92878568b652a2e9a9382a5151b1a0380a43"}, + {file = "watchfiles-1.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8ca65483439f9c791897f7db49202301deb6e15fe9f8fe2fed555bf986d10c31"}, + {file = "watchfiles-1.1.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f0ab1c1af0cb38e3f598244c17919fb1a84d1629cc08355b0074b6d7f53138ac"}, + {file = "watchfiles-1.1.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bc570d6c01c206c46deb6e935a260be44f186a2f05179f52f7fcd2be086a94d"}, + {file = "watchfiles-1.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e84087b432b6ac94778de547e08611266f1f8ffad28c0ee4c82e028b0fc5966d"}, + {file = "watchfiles-1.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:620bae625f4cb18427b1bb1a2d9426dc0dd5a5ba74c7c2cdb9de405f7b129863"}, + {file = "watchfiles-1.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:544364b2b51a9b0c7000a4b4b02f90e9423d97fbbf7e06689236443ebcad81ab"}, + {file = "watchfiles-1.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:bbe1ef33d45bc71cf21364df962af171f96ecaeca06bd9e3d0b583efb12aec82"}, + {file = "watchfiles-1.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1a0bb430adb19ef49389e1ad368450193a90038b5b752f4ac089ec6942c4dff4"}, + {file = "watchfiles-1.1.1-cp310-cp310-win32.whl", hash = "sha256:3f6d37644155fb5beca5378feb8c1708d5783145f2a0f1c4d5a061a210254844"}, + {file = "watchfiles-1.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:a36d8efe0f290835fd0f33da35042a1bb5dc0e83cbc092dcf69bce442579e88e"}, + {file = "watchfiles-1.1.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:f57b396167a2565a4e8b5e56a5a1c537571733992b226f4f1197d79e94cf0ae5"}, + {file = "watchfiles-1.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:421e29339983e1bebc281fab40d812742268ad057db4aee8c4d2bce0af43b741"}, + {file = "watchfiles-1.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e43d39a741e972bab5d8100b5cdacf69db64e34eb19b6e9af162bccf63c5cc6"}, + {file = "watchfiles-1.1.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f537afb3276d12814082a2e9b242bdcf416c2e8fd9f799a737990a1dbe906e5b"}, + {file = "watchfiles-1.1.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2cd9e04277e756a2e2d2543d65d1e2166d6fd4c9b183f8808634fda23f17b14"}, + {file = "watchfiles-1.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5f3f58818dc0b07f7d9aa7fe9eb1037aecb9700e63e1f6acfed13e9fef648f5d"}, + {file = "watchfiles-1.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bb9f66367023ae783551042d31b1d7fd422e8289eedd91f26754a66f44d5cff"}, + {file = "watchfiles-1.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aebfd0861a83e6c3d1110b78ad54704486555246e542be3e2bb94195eabb2606"}, + {file = "watchfiles-1.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5fac835b4ab3c6487b5dbad78c4b3724e26bcc468e886f8ba8cc4306f68f6701"}, + {file = "watchfiles-1.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:399600947b170270e80134ac854e21b3ccdefa11a9529a3decc1327088180f10"}, + {file = "watchfiles-1.1.1-cp311-cp311-win32.whl", hash = "sha256:de6da501c883f58ad50db3a32ad397b09ad29865b5f26f64c24d3e3281685849"}, + {file = "watchfiles-1.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:35c53bd62a0b885bf653ebf6b700d1bf05debb78ad9292cf2a942b23513dc4c4"}, + {file = "watchfiles-1.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:57ca5281a8b5e27593cb7d82c2ac927ad88a96ed406aa446f6344e4328208e9e"}, + {file = "watchfiles-1.1.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:8c89f9f2f740a6b7dcc753140dd5e1ab9215966f7a3530d0c0705c83b401bd7d"}, + {file = "watchfiles-1.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bd404be08018c37350f0d6e34676bd1e2889990117a2b90070b3007f172d0610"}, + {file = "watchfiles-1.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8526e8f916bb5b9a0a777c8317c23ce65de259422bba5b31325a6fa6029d33af"}, + {file = "watchfiles-1.1.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2edc3553362b1c38d9f06242416a5d8e9fe235c204a4072e988ce2e5bb1f69f6"}, + {file = "watchfiles-1.1.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30f7da3fb3f2844259cba4720c3fc7138eb0f7b659c38f3bfa65084c7fc7abce"}, + {file = "watchfiles-1.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8979280bdafff686ba5e4d8f97840f929a87ed9cdf133cbbd42f7766774d2aa"}, + {file = "watchfiles-1.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dcc5c24523771db3a294c77d94771abcfcb82a0e0ee8efd910c37c59ec1b31bb"}, + {file = "watchfiles-1.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db5d7ae38ff20153d542460752ff397fcf5c96090c1230803713cf3147a6803"}, + {file = "watchfiles-1.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:28475ddbde92df1874b6c5c8aaeb24ad5be47a11f87cde5a28ef3835932e3e94"}, + {file = "watchfiles-1.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:36193ed342f5b9842edd3532729a2ad55c4160ffcfa3700e0d54be496b70dd43"}, + {file = "watchfiles-1.1.1-cp312-cp312-win32.whl", hash = "sha256:859e43a1951717cc8de7f4c77674a6d389b106361585951d9e69572823f311d9"}, + {file = "watchfiles-1.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:91d4c9a823a8c987cce8fa2690923b069966dabb196dd8d137ea2cede885fde9"}, + {file = "watchfiles-1.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:a625815d4a2bdca61953dbba5a39d60164451ef34c88d751f6c368c3ea73d404"}, + {file = "watchfiles-1.1.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:130e4876309e8686a5e37dba7d5e9bc77e6ed908266996ca26572437a5271e18"}, + {file = "watchfiles-1.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5f3bde70f157f84ece3765b42b4a52c6ac1a50334903c6eaf765362f6ccca88a"}, + {file = "watchfiles-1.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14e0b1fe858430fc0251737ef3824c54027bedb8c37c38114488b8e131cf8219"}, + {file = "watchfiles-1.1.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f27db948078f3823a6bb3b465180db8ebecf26dd5dae6f6180bd87383b6b4428"}, + {file = "watchfiles-1.1.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:059098c3a429f62fc98e8ec62b982230ef2c8df68c79e826e37b895bc359a9c0"}, + {file = "watchfiles-1.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bfb5862016acc9b869bb57284e6cb35fdf8e22fe59f7548858e2f971d045f150"}, + {file = "watchfiles-1.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:319b27255aacd9923b8a276bb14d21a5f7ff82564c744235fc5eae58d95422ae"}, + {file = "watchfiles-1.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c755367e51db90e75b19454b680903631d41f9e3607fbd941d296a020c2d752d"}, + {file = "watchfiles-1.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c22c776292a23bfc7237a98f791b9ad3144b02116ff10d820829ce62dff46d0b"}, + {file = "watchfiles-1.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:3a476189be23c3686bc2f4321dd501cb329c0a0469e77b7b534ee10129ae6374"}, + {file = "watchfiles-1.1.1-cp313-cp313-win32.whl", hash = "sha256:bf0a91bfb5574a2f7fc223cf95eeea79abfefa404bf1ea5e339c0c1560ae99a0"}, + {file = "watchfiles-1.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:52e06553899e11e8074503c8e716d574adeeb7e68913115c4b3653c53f9bae42"}, + {file = "watchfiles-1.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:ac3cc5759570cd02662b15fbcd9d917f7ecd47efe0d6b40474eafd246f91ea18"}, + {file = "watchfiles-1.1.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:563b116874a9a7ce6f96f87cd0b94f7faf92d08d0021e837796f0a14318ef8da"}, + {file = "watchfiles-1.1.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3ad9fe1dae4ab4212d8c91e80b832425e24f421703b5a42ef2e4a1e215aff051"}, + {file = "watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce70f96a46b894b36eba678f153f052967a0d06d5b5a19b336ab0dbbd029f73e"}, + {file = "watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cb467c999c2eff23a6417e58d75e5828716f42ed8289fe6b77a7e5a91036ca70"}, + {file = "watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:836398932192dae4146c8f6f737d74baeac8b70ce14831a239bdb1ca882fc261"}, + {file = "watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:743185e7372b7bc7c389e1badcc606931a827112fbbd37f14c537320fca08620"}, + {file = "watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:afaeff7696e0ad9f02cbb8f56365ff4686ab205fcf9c4c5b6fdfaaa16549dd04"}, + {file = "watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f7eb7da0eb23aa2ba036d4f616d46906013a68caf61b7fdbe42fc8b25132e77"}, + {file = "watchfiles-1.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:831a62658609f0e5c64178211c942ace999517f5770fe9436be4c2faeba0c0ef"}, + {file = "watchfiles-1.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:f9a2ae5c91cecc9edd47e041a930490c31c3afb1f5e6d71de3dc671bfaca02bf"}, + {file = "watchfiles-1.1.1-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:d1715143123baeeaeadec0528bb7441103979a1d5f6fd0e1f915383fea7ea6d5"}, + {file = "watchfiles-1.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:39574d6370c4579d7f5d0ad940ce5b20db0e4117444e39b6d8f99db5676c52fd"}, + {file = "watchfiles-1.1.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7365b92c2e69ee952902e8f70f3ba6360d0d596d9299d55d7d386df84b6941fb"}, + {file = "watchfiles-1.1.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bfff9740c69c0e4ed32416f013f3c45e2ae42ccedd1167ef2d805c000b6c71a5"}, + {file = "watchfiles-1.1.1-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b27cf2eb1dda37b2089e3907d8ea92922b673c0c427886d4edc6b94d8dfe5db3"}, + {file = "watchfiles-1.1.1-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:526e86aced14a65a5b0ec50827c745597c782ff46b571dbfe46192ab9e0b3c33"}, + {file = "watchfiles-1.1.1-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04e78dd0b6352db95507fd8cb46f39d185cf8c74e4cf1e4fbad1d3df96faf510"}, + {file = "watchfiles-1.1.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c85794a4cfa094714fb9c08d4a218375b2b95b8ed1666e8677c349906246c05"}, + {file = "watchfiles-1.1.1-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:74d5012b7630714b66be7b7b7a78855ef7ad58e8650c73afc4c076a1f480a8d6"}, + {file = "watchfiles-1.1.1-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:8fbe85cb3201c7d380d3d0b90e63d520f15d6afe217165d7f98c9c649654db81"}, + {file = "watchfiles-1.1.1-cp314-cp314-win32.whl", hash = "sha256:3fa0b59c92278b5a7800d3ee7733da9d096d4aabcfabb9a928918bd276ef9b9b"}, + {file = "watchfiles-1.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:c2047d0b6cea13b3316bdbafbfa0c4228ae593d995030fda39089d36e64fc03a"}, + {file = "watchfiles-1.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:842178b126593addc05acf6fce960d28bc5fae7afbaa2c6c1b3a7b9460e5be02"}, + {file = "watchfiles-1.1.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:88863fbbc1a7312972f1c511f202eb30866370ebb8493aef2812b9ff28156a21"}, + {file = "watchfiles-1.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:55c7475190662e202c08c6c0f4d9e345a29367438cf8e8037f3155e10a88d5a5"}, + {file = "watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f53fa183d53a1d7a8852277c92b967ae99c2d4dcee2bfacff8868e6e30b15f7"}, + {file = "watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6aae418a8b323732fa89721d86f39ec8f092fc2af67f4217a2b07fd3e93c6101"}, + {file = "watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f096076119da54a6080e8920cbdaac3dbee667eb91dcc5e5b78840b87415bd44"}, + {file = "watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:00485f441d183717038ed2e887a7c868154f216877653121068107b227a2f64c"}, + {file = "watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a55f3e9e493158d7bfdb60a1165035f1cf7d320914e7b7ea83fe22c6023b58fc"}, + {file = "watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c91ed27800188c2ae96d16e3149f199d62f86c7af5f5f4d2c61a3ed8cd3666c"}, + {file = "watchfiles-1.1.1-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:311ff15a0bae3714ffb603e6ba6dbfba4065ab60865d15a6ec544133bdb21099"}, + {file = "watchfiles-1.1.1-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:a916a2932da8f8ab582f242c065f5c81bed3462849ca79ee357dd9551b0e9b01"}, + {file = "watchfiles-1.1.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c882d69f6903ef6092bedfb7be973d9319940d56b8427ab9187d1ecd73438a70"}, + {file = "watchfiles-1.1.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d6ff426a7cb54f310d51bfe83fe9f2bbe40d540c741dc974ebc30e6aa238f52e"}, + {file = "watchfiles-1.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79ff6c6eadf2e3fc0d7786331362e6ef1e51125892c75f1004bd6b52155fb956"}, + {file = "watchfiles-1.1.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c1f5210f1b8fc91ead1283c6fd89f70e76fb07283ec738056cf34d51e9c1d62c"}, + {file = "watchfiles-1.1.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b9c4702f29ca48e023ffd9b7ff6b822acdf47cb1ff44cb490a3f1d5ec8987e9c"}, + {file = "watchfiles-1.1.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:acb08650863767cbc58bca4813b92df4d6c648459dcaa3d4155681962b2aa2d3"}, + {file = "watchfiles-1.1.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08af70fd77eee58549cd69c25055dc344f918d992ff626068242259f98d598a2"}, + {file = "watchfiles-1.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c3631058c37e4a0ec440bf583bc53cdbd13e5661bb6f465bc1d88ee9a0a4d02"}, + {file = "watchfiles-1.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:cf57a27fb986c6243d2ee78392c503826056ffe0287e8794503b10fb51b881be"}, + {file = "watchfiles-1.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d7e7067c98040d646982daa1f37a33d3544138ea155536c2e0e63e07ff8a7e0f"}, + {file = "watchfiles-1.1.1-cp39-cp39-win32.whl", hash = "sha256:6c9c9262f454d1c4d8aaa7050121eb4f3aea197360553699520767daebf2180b"}, + {file = "watchfiles-1.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:74472234c8370669850e1c312490f6026d132ca2d396abfad8830b4f1c096957"}, + {file = "watchfiles-1.1.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:17ef139237dfced9da49fb7f2232c86ca9421f666d78c264c7ffca6601d154c3"}, + {file = "watchfiles-1.1.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:672b8adf25b1a0d35c96b5888b7b18699d27d4194bac8beeae75be4b7a3fc9b2"}, + {file = "watchfiles-1.1.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77a13aea58bc2b90173bc69f2a90de8e282648939a00a602e1dc4ee23e26b66d"}, + {file = "watchfiles-1.1.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b495de0bb386df6a12b18335a0285dda90260f51bdb505503c02bcd1ce27a8b"}, + {file = "watchfiles-1.1.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:db476ab59b6765134de1d4fe96a1a9c96ddf091683599be0f26147ea1b2e4b88"}, + {file = "watchfiles-1.1.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:89eef07eee5e9d1fda06e38822ad167a044153457e6fd997f8a858ab7564a336"}, + {file = "watchfiles-1.1.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce19e06cbda693e9e7686358af9cd6f5d61312ab8b00488bc36f5aabbaf77e24"}, + {file = "watchfiles-1.1.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e6f39af2eab0118338902798b5aa6664f46ff66bc0280de76fca67a7f262a49"}, + {file = "watchfiles-1.1.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cdab464fee731e0884c35ae3588514a9bcf718d0e2c82169c1c4a85cc19c3c7f"}, + {file = "watchfiles-1.1.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:3dbd8cbadd46984f802f6d479b7e3afa86c42d13e8f0f322d669d79722c8ec34"}, + {file = "watchfiles-1.1.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5524298e3827105b61951a29c3512deb9578586abf3a7c5da4a8069df247cccc"}, + {file = "watchfiles-1.1.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b943d3668d61cfa528eb949577479d3b077fd25fb83c641235437bc0b5bc60e"}, + {file = "watchfiles-1.1.1.tar.gz", hash = "sha256:a173cb5c16c4f40ab19cecf48a534c409f7ea983ab8fed0741304a1c0a31b3f2"}, ] [package.dependencies] @@ -4626,162 +5821,134 @@ anyio = ">=3.0.0" [[package]] name = "websockets" -version = "15.0.1" +version = "16.0" description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["development"] files = [ - {file = "websockets-15.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d63efaa0cd96cf0c5fe4d581521d9fa87744540d4bc999ae6e08595a1014b45b"}, - {file = "websockets-15.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ac60e3b188ec7574cb761b08d50fcedf9d77f1530352db4eef1707fe9dee7205"}, - {file = "websockets-15.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5756779642579d902eed757b21b0164cd6fe338506a8083eb58af5c372e39d9a"}, - {file = "websockets-15.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fdfe3e2a29e4db3659dbd5bbf04560cea53dd9610273917799f1cde46aa725e"}, - {file = "websockets-15.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c2529b320eb9e35af0fa3016c187dffb84a3ecc572bcee7c3ce302bfeba52bf"}, - {file = "websockets-15.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac1e5c9054fe23226fb11e05a6e630837f074174c4c2f0fe442996112a6de4fb"}, - {file = "websockets-15.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:5df592cd503496351d6dc14f7cdad49f268d8e618f80dce0cd5a36b93c3fc08d"}, - {file = "websockets-15.0.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0a34631031a8f05657e8e90903e656959234f3a04552259458aac0b0f9ae6fd9"}, - {file = "websockets-15.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3d00075aa65772e7ce9e990cab3ff1de702aa09be3940d1dc88d5abf1ab8a09c"}, - {file = "websockets-15.0.1-cp310-cp310-win32.whl", hash = "sha256:1234d4ef35db82f5446dca8e35a7da7964d02c127b095e172e54397fb6a6c256"}, - {file = "websockets-15.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:39c1fec2c11dc8d89bba6b2bf1556af381611a173ac2b511cf7231622058af41"}, - {file = "websockets-15.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:823c248b690b2fd9303ba00c4f66cd5e2d8c3ba4aa968b2779be9532a4dad431"}, - {file = "websockets-15.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678999709e68425ae2593acf2e3ebcbcf2e69885a5ee78f9eb80e6e371f1bf57"}, - {file = "websockets-15.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d50fd1ee42388dcfb2b3676132c78116490976f1300da28eb629272d5d93e905"}, - {file = "websockets-15.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d99e5546bf73dbad5bf3547174cd6cb8ba7273062a23808ffea025ecb1cf8562"}, - {file = "websockets-15.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66dd88c918e3287efc22409d426c8f729688d89a0c587c88971a0faa2c2f3792"}, - {file = "websockets-15.0.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8dd8327c795b3e3f219760fa603dcae1dcc148172290a8ab15158cf85a953413"}, - {file = "websockets-15.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8fdc51055e6ff4adeb88d58a11042ec9a5eae317a0a53d12c062c8a8865909e8"}, - {file = "websockets-15.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:693f0192126df6c2327cce3baa7c06f2a117575e32ab2308f7f8216c29d9e2e3"}, - {file = "websockets-15.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:54479983bd5fb469c38f2f5c7e3a24f9a4e70594cd68cd1fa6b9340dadaff7cf"}, - {file = "websockets-15.0.1-cp311-cp311-win32.whl", hash = "sha256:16b6c1b3e57799b9d38427dda63edcbe4926352c47cf88588c0be4ace18dac85"}, - {file = "websockets-15.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:27ccee0071a0e75d22cb35849b1db43f2ecd3e161041ac1ee9d2352ddf72f065"}, - {file = "websockets-15.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:3e90baa811a5d73f3ca0bcbf32064d663ed81318ab225ee4f427ad4e26e5aff3"}, - {file = "websockets-15.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:592f1a9fe869c778694f0aa806ba0374e97648ab57936f092fd9d87f8bc03665"}, - {file = "websockets-15.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0701bc3cfcb9164d04a14b149fd74be7347a530ad3bbf15ab2c678a2cd3dd9a2"}, - {file = "websockets-15.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8b56bdcdb4505c8078cb6c7157d9811a85790f2f2b3632c7d1462ab5783d215"}, - {file = "websockets-15.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0af68c55afbd5f07986df82831c7bff04846928ea8d1fd7f30052638788bc9b5"}, - {file = "websockets-15.0.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64dee438fed052b52e4f98f76c5790513235efaa1ef7f3f2192c392cd7c91b65"}, - {file = "websockets-15.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d5f6b181bb38171a8ad1d6aa58a67a6aa9d4b38d0f8c5f496b9e42561dfc62fe"}, - {file = "websockets-15.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5d54b09eba2bada6011aea5375542a157637b91029687eb4fdb2dab11059c1b4"}, - {file = "websockets-15.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3be571a8b5afed347da347bfcf27ba12b069d9d7f42cb8c7028b5e98bbb12597"}, - {file = "websockets-15.0.1-cp312-cp312-win32.whl", hash = "sha256:c338ffa0520bdb12fbc527265235639fb76e7bc7faafbb93f6ba80d9c06578a9"}, - {file = "websockets-15.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:fcd5cf9e305d7b8338754470cf69cf81f420459dbae8a3b40cee57417f4614a7"}, - {file = "websockets-15.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ee443ef070bb3b6ed74514f5efaa37a252af57c90eb33b956d35c8e9c10a1931"}, - {file = "websockets-15.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5a939de6b7b4e18ca683218320fc67ea886038265fd1ed30173f5ce3f8e85675"}, - {file = "websockets-15.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:746ee8dba912cd6fc889a8147168991d50ed70447bf18bcda7039f7d2e3d9151"}, - {file = "websockets-15.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:595b6c3969023ecf9041b2936ac3827e4623bfa3ccf007575f04c5a6aa318c22"}, - {file = "websockets-15.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c714d2fc58b5ca3e285461a4cc0c9a66bd0e24c5da9911e30158286c9b5be7f"}, - {file = "websockets-15.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f3c1e2ab208db911594ae5b4f79addeb3501604a165019dd221c0bdcabe4db8"}, - {file = "websockets-15.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:229cf1d3ca6c1804400b0a9790dc66528e08a6a1feec0d5040e8b9eb14422375"}, - {file = "websockets-15.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:756c56e867a90fb00177d530dca4b097dd753cde348448a1012ed6c5131f8b7d"}, - {file = "websockets-15.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:558d023b3df0bffe50a04e710bc87742de35060580a293c2a984299ed83bc4e4"}, - {file = "websockets-15.0.1-cp313-cp313-win32.whl", hash = "sha256:ba9e56e8ceeeedb2e080147ba85ffcd5cd0711b89576b83784d8605a7df455fa"}, - {file = "websockets-15.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:e09473f095a819042ecb2ab9465aee615bd9c2028e4ef7d933600a8401c79561"}, - {file = "websockets-15.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5f4c04ead5aed67c8a1a20491d54cdfba5884507a48dd798ecaf13c74c4489f5"}, - {file = "websockets-15.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:abdc0c6c8c648b4805c5eacd131910d2a7f6455dfd3becab248ef108e89ab16a"}, - {file = "websockets-15.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a625e06551975f4b7ea7102bc43895b90742746797e2e14b70ed61c43a90f09b"}, - {file = "websockets-15.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d591f8de75824cbb7acad4e05d2d710484f15f29d4a915092675ad3456f11770"}, - {file = "websockets-15.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:47819cea040f31d670cc8d324bb6435c6f133b8c7a19ec3d61634e62f8d8f9eb"}, - {file = "websockets-15.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac017dd64572e5c3bd01939121e4d16cf30e5d7e110a119399cf3133b63ad054"}, - {file = "websockets-15.0.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:4a9fac8e469d04ce6c25bb2610dc535235bd4aa14996b4e6dbebf5e007eba5ee"}, - {file = "websockets-15.0.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:363c6f671b761efcb30608d24925a382497c12c506b51661883c3e22337265ed"}, - {file = "websockets-15.0.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2034693ad3097d5355bfdacfffcbd3ef5694f9718ab7f29c29689a9eae841880"}, - {file = "websockets-15.0.1-cp39-cp39-win32.whl", hash = "sha256:3b1ac0d3e594bf121308112697cf4b32be538fb1444468fb0a6ae4feebc83411"}, - {file = "websockets-15.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:b7643a03db5c95c799b89b31c036d5f27eeb4d259c798e878d6937d71832b1e4"}, - {file = "websockets-15.0.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0c9e74d766f2818bb95f84c25be4dea09841ac0f734d1966f415e4edfc4ef1c3"}, - {file = "websockets-15.0.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1009ee0c7739c08a0cd59de430d6de452a55e42d6b522de7aa15e6f67db0b8e1"}, - {file = "websockets-15.0.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76d1f20b1c7a2fa82367e04982e708723ba0e7b8d43aa643d3dcd404d74f1475"}, - {file = "websockets-15.0.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f29d80eb9a9263b8d109135351caf568cc3f80b9928bccde535c235de55c22d9"}, - {file = "websockets-15.0.1-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b359ed09954d7c18bbc1680f380c7301f92c60bf924171629c5db97febb12f04"}, - {file = "websockets-15.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:cad21560da69f4ce7658ca2cb83138fb4cf695a2ba3e475e0559e05991aa8122"}, - {file = "websockets-15.0.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7f493881579c90fc262d9cdbaa05a6b54b3811c2f300766748db79f098db9940"}, - {file = "websockets-15.0.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:47b099e1f4fbc95b701b6e85768e1fcdaf1630f3cbe4765fa216596f12310e2e"}, - {file = "websockets-15.0.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67f2b6de947f8c757db2db9c71527933ad0019737ec374a8a6be9a956786aaf9"}, - {file = "websockets-15.0.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d08eb4c2b7d6c41da6ca0600c077e93f5adcfd979cd777d747e9ee624556da4b"}, - {file = "websockets-15.0.1-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b826973a4a2ae47ba357e4e82fa44a463b8f168e1ca775ac64521442b19e87f"}, - {file = "websockets-15.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:21c1fa28a6a7e3cbdc171c694398b6df4744613ce9b36b1a498e816787e28123"}, - {file = "websockets-15.0.1-py3-none-any.whl", hash = "sha256:f7a866fbc1e97b5c617ee4116daaa09b722101d4a3c170c787450ba409f9736f"}, - {file = "websockets-15.0.1.tar.gz", hash = "sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee"}, + {file = "websockets-16.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:04cdd5d2d1dacbad0a7bf36ccbcd3ccd5a30ee188f2560b7a62a30d14107b31a"}, + {file = "websockets-16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8ff32bb86522a9e5e31439a58addbb0166f0204d64066fb955265c4e214160f0"}, + {file = "websockets-16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:583b7c42688636f930688d712885cf1531326ee05effd982028212ccc13e5957"}, + {file = "websockets-16.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7d837379b647c0c4c2355c2499723f82f1635fd2c26510e1f587d89bc2199e72"}, + {file = "websockets-16.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:df57afc692e517a85e65b72e165356ed1df12386ecb879ad5693be08fac65dde"}, + {file = "websockets-16.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:2b9f1e0d69bc60a4a87349d50c09a037a2607918746f07de04df9e43252c77a3"}, + {file = "websockets-16.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:335c23addf3d5e6a8633f9f8eda77efad001671e80b95c491dd0924587ece0b3"}, + {file = "websockets-16.0-cp310-cp310-win32.whl", hash = "sha256:37b31c1623c6605e4c00d466c9d633f9b812ea430c11c8a278774a1fde1acfa9"}, + {file = "websockets-16.0-cp310-cp310-win_amd64.whl", hash = "sha256:8e1dab317b6e77424356e11e99a432b7cb2f3ec8c5ab4dabbcee6add48f72b35"}, + {file = "websockets-16.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:31a52addea25187bde0797a97d6fc3d2f92b6f72a9370792d65a6e84615ac8a8"}, + {file = "websockets-16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:417b28978cdccab24f46400586d128366313e8a96312e4b9362a4af504f3bbad"}, + {file = "websockets-16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:af80d74d4edfa3cb9ed973a0a5ba2b2a549371f8a741e0800cb07becdd20f23d"}, + {file = "websockets-16.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:08d7af67b64d29823fed316505a89b86705f2b7981c07848fb5e3ea3020c1abe"}, + {file = "websockets-16.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7be95cfb0a4dae143eaed2bcba8ac23f4892d8971311f1b06f3c6b78952ee70b"}, + {file = "websockets-16.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d6297ce39ce5c2e6feb13c1a996a2ded3b6832155fcfc920265c76f24c7cceb5"}, + {file = "websockets-16.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1c1b30e4f497b0b354057f3467f56244c603a79c0d1dafce1d16c283c25f6e64"}, + {file = "websockets-16.0-cp311-cp311-win32.whl", hash = "sha256:5f451484aeb5cafee1ccf789b1b66f535409d038c56966d6101740c1614b86c6"}, + {file = "websockets-16.0-cp311-cp311-win_amd64.whl", hash = "sha256:8d7f0659570eefb578dacde98e24fb60af35350193e4f56e11190787bee77dac"}, + {file = "websockets-16.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:71c989cbf3254fbd5e84d3bff31e4da39c43f884e64f2551d14bb3c186230f00"}, + {file = "websockets-16.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8b6e209ffee39ff1b6d0fa7bfef6de950c60dfb91b8fcead17da4ee539121a79"}, + {file = "websockets-16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:86890e837d61574c92a97496d590968b23c2ef0aeb8a9bc9421d174cd378ae39"}, + {file = "websockets-16.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9b5aca38b67492ef518a8ab76851862488a478602229112c4b0d58d63a7a4d5c"}, + {file = "websockets-16.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e0334872c0a37b606418ac52f6ab9cfd17317ac26365f7f65e203e2d0d0d359f"}, + {file = "websockets-16.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a0b31e0b424cc6b5a04b8838bbaec1688834b2383256688cf47eb97412531da1"}, + {file = "websockets-16.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:485c49116d0af10ac698623c513c1cc01c9446c058a4e61e3bf6c19dff7335a2"}, + {file = "websockets-16.0-cp312-cp312-win32.whl", hash = "sha256:eaded469f5e5b7294e2bdca0ab06becb6756ea86894a47806456089298813c89"}, + {file = "websockets-16.0-cp312-cp312-win_amd64.whl", hash = "sha256:5569417dc80977fc8c2d43a86f78e0a5a22fee17565d78621b6bb264a115d4ea"}, + {file = "websockets-16.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:878b336ac47938b474c8f982ac2f7266a540adc3fa4ad74ae96fea9823a02cc9"}, + {file = "websockets-16.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:52a0fec0e6c8d9a784c2c78276a48a2bdf099e4ccc2a4cad53b27718dbfd0230"}, + {file = "websockets-16.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e6578ed5b6981005df1860a56e3617f14a6c307e6a71b4fff8c48fdc50f3ed2c"}, + {file = "websockets-16.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:95724e638f0f9c350bb1c2b0a7ad0e83d9cc0c9259f3ea94e40d7b02a2179ae5"}, + {file = "websockets-16.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c0204dc62a89dc9d50d682412c10b3542d748260d743500a85c13cd1ee4bde82"}, + {file = "websockets-16.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:52ac480f44d32970d66763115edea932f1c5b1312de36df06d6b219f6741eed8"}, + {file = "websockets-16.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6e5a82b677f8f6f59e8dfc34ec06ca6b5b48bc4fcda346acd093694cc2c24d8f"}, + {file = "websockets-16.0-cp313-cp313-win32.whl", hash = "sha256:abf050a199613f64c886ea10f38b47770a65154dc37181bfaff70c160f45315a"}, + {file = "websockets-16.0-cp313-cp313-win_amd64.whl", hash = "sha256:3425ac5cf448801335d6fdc7ae1eb22072055417a96cc6b31b3861f455fbc156"}, + {file = "websockets-16.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8cc451a50f2aee53042ac52d2d053d08bf89bcb31ae799cb4487587661c038a0"}, + {file = "websockets-16.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:daa3b6ff70a9241cf6c7fc9e949d41232d9d7d26fd3522b1ad2b4d62487e9904"}, + {file = "websockets-16.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:fd3cb4adb94a2a6e2b7c0d8d05cb94e6f1c81a0cf9dc2694fb65c7e8d94c42e4"}, + {file = "websockets-16.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:781caf5e8eee67f663126490c2f96f40906594cb86b408a703630f95550a8c3e"}, + {file = "websockets-16.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:caab51a72c51973ca21fa8a18bd8165e1a0183f1ac7066a182ff27107b71e1a4"}, + {file = "websockets-16.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:19c4dc84098e523fd63711e563077d39e90ec6702aff4b5d9e344a60cb3c0cb1"}, + {file = "websockets-16.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:a5e18a238a2b2249c9a9235466b90e96ae4795672598a58772dd806edc7ac6d3"}, + {file = "websockets-16.0-cp314-cp314-win32.whl", hash = "sha256:a069d734c4a043182729edd3e9f247c3b2a4035415a9172fd0f1b71658a320a8"}, + {file = "websockets-16.0-cp314-cp314-win_amd64.whl", hash = "sha256:c0ee0e63f23914732c6d7e0cce24915c48f3f1512ec1d079ed01fc629dab269d"}, + {file = "websockets-16.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:a35539cacc3febb22b8f4d4a99cc79b104226a756aa7400adc722e83b0d03244"}, + {file = "websockets-16.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:b784ca5de850f4ce93ec85d3269d24d4c82f22b7212023c974c401d4980ebc5e"}, + {file = "websockets-16.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:569d01a4e7fba956c5ae4fc988f0d4e187900f5497ce46339c996dbf24f17641"}, + {file = "websockets-16.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:50f23cdd8343b984957e4077839841146f67a3d31ab0d00e6b824e74c5b2f6e8"}, + {file = "websockets-16.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:152284a83a00c59b759697b7f9e9cddf4e3c7861dd0d964b472b70f78f89e80e"}, + {file = "websockets-16.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:bc59589ab64b0022385f429b94697348a6a234e8ce22544e3681b2e9331b5944"}, + {file = "websockets-16.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:32da954ffa2814258030e5a57bc73a3635463238e797c7375dc8091327434206"}, + {file = "websockets-16.0-cp314-cp314t-win32.whl", hash = "sha256:5a4b4cc550cb665dd8a47f868c8d04c8230f857363ad3c9caf7a0c3bf8c61ca6"}, + {file = "websockets-16.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b14dc141ed6d2dde437cddb216004bcac6a1df0935d79656387bd41632ba0bbd"}, + {file = "websockets-16.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:349f83cd6c9a415428ee1005cadb5c2c56f4389bc06a9af16103c3bc3dcc8b7d"}, + {file = "websockets-16.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:4a1aba3340a8dca8db6eb5a7986157f52eb9e436b74813764241981ca4888f03"}, + {file = "websockets-16.0-pp311-pypy311_pp73-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f4a32d1bd841d4bcbffdcb3d2ce50c09c3909fbead375ab28d0181af89fd04da"}, + {file = "websockets-16.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0298d07ee155e2e9fda5be8a9042200dd2e3bb0b8a38482156576f863a9d457c"}, + {file = "websockets-16.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:a653aea902e0324b52f1613332ddf50b00c06fdaf7e92624fbf8c77c78fa5767"}, + {file = "websockets-16.0-py3-none-any.whl", hash = "sha256:1637db62fad1dc833276dded54215f2c7fa46912301a24bd94d45d46a011ceec"}, + {file = "websockets-16.0.tar.gz", hash = "sha256:5f6261a5e56e8d5c42a4497b364ea24d94d9563e8fbd44e78ac40879c60179b5"}, ] [[package]] name = "xattr" -version = "1.1.4" +version = "1.3.0" description = "Python wrapper for extended filesystem attributes" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main"] markers = "sys_platform == \"darwin\"" files = [ - {file = "xattr-1.1.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:acb85b6249e9f3ea10cbb56df1021d43f4027212f0d004304bc9075dc7f54769"}, - {file = "xattr-1.1.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1a848ab125c0fafdc501ccd83b4c9018bba576a037a4ca5960a22f39e295552e"}, - {file = "xattr-1.1.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:467ee77471d26ae5187ee7081b82175b5ca56ead4b71467ec2e6119d1b08beed"}, - {file = "xattr-1.1.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fd35f46cb0154f7033f9d5d0960f226857acb0d1e0d71fd7af18ed84663007c"}, - {file = "xattr-1.1.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d956478e9bb98a1efd20ebc6e5703497c1d2d690d5a13c4df4abf59881eed50"}, - {file = "xattr-1.1.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f25dfdcd974b700fb04a40e14a664a80227ee58e02ea062ac241f0d7dc54b4e"}, - {file = "xattr-1.1.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:33b63365c1fcbc80a79f601575bac0d6921732e0245b776876f3db3fcfefe22d"}, - {file = "xattr-1.1.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:544542be95c9b49e211f0a463758f200de88ba6d5a94d3c4f42855a484341acd"}, - {file = "xattr-1.1.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ac14c9893f3ea046784b7702be30889b200d31adcd2e6781a8a190b6423f9f2d"}, - {file = "xattr-1.1.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bb4bbe37ba95542081890dd34fa5347bef4651e276647adaa802d5d0d7d86452"}, - {file = "xattr-1.1.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3da489ecef798705f9a39ea8cea4ead0d1eeed55f92c345add89740bd930bab6"}, - {file = "xattr-1.1.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:798dd0cbe696635a6f74b06fc430818bf9c3b24314e1502eadf67027ab60c9b0"}, - {file = "xattr-1.1.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b2b6361626efad5eb5a6bf8172c6c67339e09397ee8140ec41258737bea9681"}, - {file = "xattr-1.1.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e7fa20a0c9ce022d19123b1c5b848d00a68b837251835a7929fe041ee81dcd0"}, - {file = "xattr-1.1.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e20eeb08e2c57fc7e71f050b1cfae35cbb46105449853a582bf53fd23c5379e"}, - {file = "xattr-1.1.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:477370e75821bded901487e5e752cffe554d1bd3bd4839b627d4d1ee8c95a093"}, - {file = "xattr-1.1.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:a8682091cd34a9f4a93c8aaea4101aae99f1506e24da00a3cc3dd2eca9566f21"}, - {file = "xattr-1.1.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2e079b3b1a274ba2121cf0da38bbe5c8d2fb1cc49ecbceb395ce20eb7d69556d"}, - {file = "xattr-1.1.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ae6579dea05bf9f335a082f711d5924a98da563cac72a2d550f5b940c401c0e9"}, - {file = "xattr-1.1.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cd6038ec9df2e67af23c212693751481d5f7e858156924f14340376c48ed9ac7"}, - {file = "xattr-1.1.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:608b2877526674eb15df4150ef4b70b7b292ae00e65aecaae2f192af224be200"}, - {file = "xattr-1.1.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c54dad1a6a998c6a23edfd25e99f4d38e9b942d54e518570044edf8c767687ea"}, - {file = "xattr-1.1.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c0dab6ff72bb2b508f3850c368f8e53bd706585012676e1f71debba3310acde8"}, - {file = "xattr-1.1.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a3c54c6af7cf09432b2c461af257d5f4b1cb2d59eee045f91bacef44421a46d"}, - {file = "xattr-1.1.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e346e05a158d554639fbf7a0db169dc693c2d2260c7acb3239448f1ff4a9d67f"}, - {file = "xattr-1.1.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3ff6d9e2103d0d6e5fcd65b85a2005b66ea81c0720a37036445faadc5bbfa424"}, - {file = "xattr-1.1.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7a2ee4563c6414dfec0d1ac610f59d39d5220531ae06373eeb1a06ee37cd193f"}, - {file = "xattr-1.1.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:878df1b38cfdadf3184ad8c7b0f516311128d5597b60ac0b3486948953658a83"}, - {file = "xattr-1.1.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0c9b8350244a1c5454f93a8d572628ff71d7e2fc2f7480dcf4c4f0e8af3150fe"}, - {file = "xattr-1.1.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a46bf48fb662b8bd745b78bef1074a1e08f41a531168de62b5d7bd331dadb11a"}, - {file = "xattr-1.1.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83fc3c07b583777b1dda6355329f75ca6b7179fe0d1002f1afe0ef96f7e3b5de"}, - {file = "xattr-1.1.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6308b19cff71441513258699f0538394fad5d66e1d324635207a97cb076fd439"}, - {file = "xattr-1.1.4-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48c00ddc15ddadc9c729cd9504dabf50adb3d9c28f647d4ac9a3df45a046b1a0"}, - {file = "xattr-1.1.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a06136196f26293758e1b244200b73156a0274af9a7349fa201c71c7af3bb9e8"}, - {file = "xattr-1.1.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:8fc2631a3c6cfcdc71f7f0f847461839963754e76a2015de71e7e71e3304abc0"}, - {file = "xattr-1.1.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d6e1e835f9c938d129dd45e7eb52ebf7d2d6816323dab93ce311bf331f7d2328"}, - {file = "xattr-1.1.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:60dea2d369a6484e8b7136224fc2971e10e2c46340d83ab780924afe78c90066"}, - {file = "xattr-1.1.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:85c2b778b09d919523f80f244d799a142302582d76da18903dc693207c4020b0"}, - {file = "xattr-1.1.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ee0abba9e1b890d39141714ff43e9666864ca635ea8a5a2194d989e6b17fe862"}, - {file = "xattr-1.1.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e4174ba7f51f46b95ea7918d907c91cd579575d59e6a2f22ca36a0551026737"}, - {file = "xattr-1.1.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2b05e52e99d82d87528c54c2c5c8c5fb0ba435f85ac6545511aeea136e49925"}, - {file = "xattr-1.1.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a3696fad746be37de34eb73c60ea67144162bd08106a5308a90ce9dea9a3287"}, - {file = "xattr-1.1.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:a3a7149439a26b68904c14fdc4587cde4ac7d80303e9ff0fefcfd893b698c976"}, - {file = "xattr-1.1.4-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:507b36a126ce900dbfa35d4e2c2db92570c933294cba5d161ecd6a89f7b52f43"}, - {file = "xattr-1.1.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:9392b417b54923e031041940d396b1d709df1d3779c6744454e1f1c1f4dad4f5"}, - {file = "xattr-1.1.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e9f00315e6c02943893b77f544776b49c756ac76960bea7cb8d7e1b96aefc284"}, - {file = "xattr-1.1.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c8f98775065260140efb348b1ff8d50fd66ddcbf0c685b76eb1e87b380aaffb3"}, - {file = "xattr-1.1.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b471c6a515f434a167ca16c5c15ff34ee42d11956baa749173a8a4e385ff23e7"}, - {file = "xattr-1.1.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee0763a1b7ceb78ba2f78bee5f30d1551dc26daafcce4ac125115fa1def20519"}, - {file = "xattr-1.1.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:099e6e9ce7999b403d36d9cf943105a3d25d8233486b54ec9d1b78623b050433"}, - {file = "xattr-1.1.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3e56faef9dde8d969f0d646fb6171883693f88ae39163ecd919ec707fbafa85"}, - {file = "xattr-1.1.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:328156d4e594c9ae63e1072503c168849e601a153ad37f0290743544332d6b6f"}, - {file = "xattr-1.1.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:a57a55a27c7864d6916344c9a91776afda6c3b8b2209f8a69b79cdba93fbe128"}, - {file = "xattr-1.1.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3c19cdde08b040df1e99d2500bf8a9cff775ab0e6fa162bf8afe6d84aa93ed04"}, - {file = "xattr-1.1.4-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7c72667f19d3a9acf324aed97f58861d398d87e42314731e7c6ab3ac7850c971"}, - {file = "xattr-1.1.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:67ae934d75ea2563fc48a27c5945749575c74a6de19fdd38390917ddcb0e4f24"}, - {file = "xattr-1.1.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a1b0c348dd8523554dc535540d2046c0c8a535bb086561d8359f3667967b6ca"}, - {file = "xattr-1.1.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22284255d2a8e8f3da195bd8e8d43ce674dbc7c38d38cb6ecfb37fae7755d31f"}, - {file = "xattr-1.1.4-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b38aac5ef4381c26d3ce147ca98fba5a78b1e5bcd6be6755b4908659f2705c6d"}, - {file = "xattr-1.1.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:803f864af528f6f763a5be1e7b1ccab418e55ae0e4abc8bda961d162f850c991"}, - {file = "xattr-1.1.4-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:40354ebfb5cecd60a5fbb9833a8a452d147486b0ffec547823658556625d98b5"}, - {file = "xattr-1.1.4-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2abaf5d06be3361bfa8e0db2ee123ba8e92beab5bceed5e9d7847f2145a32e04"}, - {file = "xattr-1.1.4-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3e638e5ffedc3565242b5fa3296899d35161bad771f88d66277b58f03a1ba9fe"}, - {file = "xattr-1.1.4-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0597e919d116ec39997804288d77bec3777228368efc0f2294b84a527fc4f9c2"}, - {file = "xattr-1.1.4-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:3cee9455c501d19f065527afda974418b3ef7c61e85d9519d122cd6eb3cb7a00"}, - {file = "xattr-1.1.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:89ed62ce430f5789e15cfc1ccabc172fd8b349c3a17c52d9e6c64ecedf08c265"}, - {file = "xattr-1.1.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e25b824f4b9259cd8bb6e83c4873cf8bf080f6e4fa034a02fe778e07aba8d345"}, - {file = "xattr-1.1.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8fba66faa0016dfc0af3dd7ac5782b5786a1dfb851f9f3455e266f94c2a05a04"}, - {file = "xattr-1.1.4-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ec4b0c3e0a7bcd103f3cf31dd40c349940b2d4223ce43d384a3548992138ef1"}, - {file = "xattr-1.1.4.tar.gz", hash = "sha256:b7b02ecb2270da5b7e7deaeea8f8b528c17368401c2b9d5f63e91f545b45d372"}, + {file = "xattr-1.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a80c4617e08670cdc3ba71f1dbb275c1627744c5c3641280879cb3bc95a07237"}, + {file = "xattr-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:51cdaa359f5cd2861178ae01ea3647b56dbdfd98e724a8aa3c04f77123b78217"}, + {file = "xattr-1.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2fea070768d7d2d25797817bea93bf0a6fda6449e88cfee8bb3d75de9ed11c7b"}, + {file = "xattr-1.3.0-cp310-cp310-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:69bca34be2d7a928389aff4e32f27857e1c62d04c91ec7c1519b1636870bd58f"}, + {file = "xattr-1.3.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:05f8e068409742d246babba60cff8310b2c577745491f498b08bf068e0c867a3"}, + {file = "xattr-1.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:bbd06987102bc11f5cbd08b15d1029832b862cf5bc61780573fc0828812f01ca"}, + {file = "xattr-1.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b8589744116d2c37928b771c50383cb281675cd6dcfd740abfab6883e3d4af85"}, + {file = "xattr-1.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:331a51bf8f20c27822f44054b0d760588462d3ed472d5e52ba135cf0bea510e8"}, + {file = "xattr-1.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:196360f068b74fa0132a8c6001ce1333f095364b8f43b6fd8cdaf2f18741ef89"}, + {file = "xattr-1.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:405d2e4911d37f2b9400fa501acd920fe0c97fe2b2ec252cb23df4b59c000811"}, + {file = "xattr-1.3.0-cp311-cp311-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:4ae3a66ae1effd40994f64defeeaa97da369406485e60bfb421f2d781be3b75d"}, + {file = "xattr-1.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:69cd3bfe779f7ba87abe6473fdfa428460cf9e78aeb7e390cfd737b784edf1b5"}, + {file = "xattr-1.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c5742ca61761a99ae0c522f90a39d5fb8139280f27b254e3128482296d1df2db"}, + {file = "xattr-1.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4a04ada131e9bdfd32db3ab1efa9f852646f4f7c9d6fde0596c3825c67161be3"}, + {file = "xattr-1.3.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:dd4e63614722d183e81842cb237fd1cc978d43384166f9fe22368bfcb187ebe5"}, + {file = "xattr-1.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:995843ef374af73e3370b0c107319611f3cdcdb6d151d629449efecad36be4c4"}, + {file = "xattr-1.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fa23a25220e29d956cedf75746e3df6cc824cc1553326d6516479967c540e386"}, + {file = "xattr-1.3.0-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b4345387087fffcd28f709eb45aae113d911e1a1f4f0f70d46b43ba81e69ccdd"}, + {file = "xattr-1.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fe92bb05eb849ab468fe13e942be0f8d7123f15d074f3aba5223fad0c4b484de"}, + {file = "xattr-1.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6c42ef5bdac3febbe28d3db14d3a8a159d84ba5daca2b13deae6f9f1fc0d4092"}, + {file = "xattr-1.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2aaa5d66af6523332189108f34e966ca120ff816dfa077ca34b31e6263f8a236"}, + {file = "xattr-1.3.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:937d8c91f6f372788aff8cc0984c4be3f0928584839aaa15ff1c95d64562071c"}, + {file = "xattr-1.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e470b3f15e9c3e263662506ff26e73b3027e1c9beac2cbe9ab89cad9c70c0495"}, + {file = "xattr-1.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f2238b2a973fcbf5fefa1137db97c296d27f4721f7b7243a1fac51514565e9ec"}, + {file = "xattr-1.3.0-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f32bb00395371f4a3bed87080ae315b19171ba114e8a5aa403a2c8508998ce78"}, + {file = "xattr-1.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:78df56bfe3dd4912548561ed880225437d6d49ef082fe6ccd45670810fa53cfe"}, + {file = "xattr-1.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:864c34c14728f21c3ef89a9f276d75ae5e31dd34f48064e0d37e4bf0f671fc6e"}, + {file = "xattr-1.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1fd185b3f01121bd172c98b943f9341ca3b9ea6c6d3eb7fe7074723614d959ff"}, + {file = "xattr-1.3.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:630c85020282bd0bcb72c3d031491c4e91d7f29bb4c094ebdfb9db51375c5b07"}, + {file = "xattr-1.3.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:95f1e14a4d9ca160b4b78c527bf2bac6addbeb0fd9882c405fc0b5e3073a8752"}, + {file = "xattr-1.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:88557c0769f64b1d014aada916c9630cfefa38b0be6c247eae20740d2d8f7b47"}, + {file = "xattr-1.3.0-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c6992eb5da32c0a1375a9eeacfab15c66eebc8bd34be63ebd1eae80cc2f8bf03"}, + {file = "xattr-1.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:da5954424099ca9d402933eaf6112c29ddde26e6da59b32f0bf5a4e35eec0b28"}, + {file = "xattr-1.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:726b4d0b66724759132cacdcd84a5b19e00b0cdf704f4c2cf96d0c08dc5eaeb5"}, + {file = "xattr-1.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:928c49ceb0c70fc04732e46fa236d7c8281bfc3db1b40875e5f548bb14d2668c"}, + {file = "xattr-1.3.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:f3bef26fd2d5d7b17488f4cc4424a69894c5a8ed71dd5f657fbbf69f77f68a51"}, + {file = "xattr-1.3.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:64f1fb511f8463851e0d97294eb0e0fde54b059150da90582327fb43baa1bb92"}, + {file = "xattr-1.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1e6c216927b16fd4b72df655d5124b69b2a406cb3132b5231179021182f0f0d1"}, + {file = "xattr-1.3.0-cp314-cp314t-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c0d9ab346cdd20539afddf2f9e123efee0fe8d54254d9fc580b4e2b4e6d77351"}, + {file = "xattr-1.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2c5e7ba0e893042deef4e8638db7a497680f587ac7bd6d68925f29af633dfa6b"}, + {file = "xattr-1.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:1e0dabb39596d8d7b83d6f9f7fa30be68cf15bfb135cb633e2aad9887d308a32"}, + {file = "xattr-1.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5eeaa944516b7507ec51456751334b4880e421de169bbd067c4f32242670d606"}, + {file = "xattr-1.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:03712f84e056dcd23c36db03a1f45417a26eef2c73d47c2c7d425bf932601587"}, + {file = "xattr-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:45f85233a51c71659969ce364abe6bd0c9048a302b7fcdbea675dc63071e47ff"}, + {file = "xattr-1.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:31fefcf20d040e79ec3bf6e7dc0fdcfd972f70f740d5a69ed67b20c699bb9cea"}, + {file = "xattr-1.3.0-cp39-cp39-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9e68a02adde8a5f8675be5e8edc837eb6fdbe214a6ee089956fae11d633c0e51"}, + {file = "xattr-1.3.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:50c12d92f5214b0416cf4b4fafcd02dca5434166657553b74b8ba6abc66cb4b4"}, + {file = "xattr-1.3.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2c69999ed70411ac2859f1f8c918eb48a6fd2a71ef41dc03ee846f69e2200bb2"}, + {file = "xattr-1.3.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b3cf29da6840eb94b881eab692ae83b1421c9c15a0cd92ffb97a0696ceac8cac"}, + {file = "xattr-1.3.0.tar.gz", hash = "sha256:30439fabd7de0787b27e9a6e1d569c5959854cb322f64ce7380fedbfa5035036"}, ] [package.dependencies] @@ -4790,130 +5957,306 @@ cffi = ">=1.16.0" [package.extras] test = ["pytest"] +[[package]] +name = "xxhash" +version = "3.6.0" +description = "Python binding for xxHash" +optional = false +python-versions = ">=3.7" +groups = ["main", "torch-cuda"] +files = [ + {file = "xxhash-3.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:87ff03d7e35c61435976554477a7f4cd1704c3596a89a8300d5ce7fc83874a71"}, + {file = "xxhash-3.6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f572dfd3d0e2eb1a57511831cf6341242f5a9f8298a45862d085f5b93394a27d"}, + {file = "xxhash-3.6.0-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:89952ea539566b9fed2bbd94e589672794b4286f342254fad28b149f9615fef8"}, + {file = "xxhash-3.6.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:48e6f2ffb07a50b52465a1032c3cf1f4a5683f944acaca8a134a2f23674c2058"}, + {file = "xxhash-3.6.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b5b848ad6c16d308c3ac7ad4ba6bede80ed5df2ba8ed382f8932df63158dd4b2"}, + {file = "xxhash-3.6.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a034590a727b44dd8ac5914236a7b8504144447a9682586c3327e935f33ec8cc"}, + {file = "xxhash-3.6.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8a8f1972e75ebdd161d7896743122834fe87378160c20e97f8b09166213bf8cc"}, + {file = "xxhash-3.6.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ee34327b187f002a596d7b167ebc59a1b729e963ce645964bbc050d2f1b73d07"}, + {file = "xxhash-3.6.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:339f518c3c7a850dd033ab416ea25a692759dc7478a71131fe8869010d2b75e4"}, + {file = "xxhash-3.6.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:bf48889c9630542d4709192578aebbd836177c9f7a4a2778a7d6340107c65f06"}, + {file = "xxhash-3.6.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:5576b002a56207f640636056b4160a378fe36a58db73ae5c27a7ec8db35f71d4"}, + {file = "xxhash-3.6.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:af1f3278bd02814d6dedc5dec397993b549d6f16c19379721e5a1d31e132c49b"}, + {file = "xxhash-3.6.0-cp310-cp310-win32.whl", hash = "sha256:aed058764db109dc9052720da65fafe84873b05eb8b07e5e653597951af57c3b"}, + {file = "xxhash-3.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:e82da5670f2d0d98950317f82a0e4a0197150ff19a6df2ba40399c2a3b9ae5fb"}, + {file = "xxhash-3.6.0-cp310-cp310-win_arm64.whl", hash = "sha256:4a082ffff8c6ac07707fb6b671caf7c6e020c75226c561830b73d862060f281d"}, + {file = "xxhash-3.6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b47bbd8cf2d72797f3c2772eaaac0ded3d3af26481a26d7d7d41dc2d3c46b04a"}, + {file = "xxhash-3.6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2b6821e94346f96db75abaa6e255706fb06ebd530899ed76d32cd99f20dc52fa"}, + {file = "xxhash-3.6.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d0a9751f71a1a65ce3584e9cae4467651c7e70c9d31017fa57574583a4540248"}, + {file = "xxhash-3.6.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b29ee68625ab37b04c0b40c3fafdf24d2f75ccd778333cfb698f65f6c463f62"}, + {file = "xxhash-3.6.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6812c25fe0d6c36a46ccb002f40f27ac903bf18af9f6dd8f9669cb4d176ab18f"}, + {file = "xxhash-3.6.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4ccbff013972390b51a18ef1255ef5ac125c92dc9143b2d1909f59abc765540e"}, + {file = "xxhash-3.6.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:297b7fbf86c82c550e12e8fb71968b3f033d27b874276ba3624ea868c11165a8"}, + {file = "xxhash-3.6.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dea26ae1eb293db089798d3973a5fc928a18fdd97cc8801226fae705b02b14b0"}, + {file = "xxhash-3.6.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7a0b169aafb98f4284f73635a8e93f0735f9cbde17bd5ec332480484241aaa77"}, + {file = "xxhash-3.6.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:08d45aef063a4531b785cd72de4887766d01dc8f362a515693df349fdb825e0c"}, + {file = "xxhash-3.6.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:929142361a48ee07f09121fe9e96a84950e8d4df3bb298ca5d88061969f34d7b"}, + {file = "xxhash-3.6.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:51312c768403d8540487dbbfb557454cfc55589bbde6424456951f7fcd4facb3"}, + {file = "xxhash-3.6.0-cp311-cp311-win32.whl", hash = "sha256:d1927a69feddc24c987b337ce81ac15c4720955b667fe9b588e02254b80446fd"}, + {file = "xxhash-3.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:26734cdc2d4ffe449b41d186bbeac416f704a482ed835d375a5c0cb02bc63fef"}, + {file = "xxhash-3.6.0-cp311-cp311-win_arm64.whl", hash = "sha256:d72f67ef8bf36e05f5b6c65e8524f265bd61071471cd4cf1d36743ebeeeb06b7"}, + {file = "xxhash-3.6.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:01362c4331775398e7bb34e3ab403bc9ee9f7c497bc7dee6272114055277dd3c"}, + {file = "xxhash-3.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b7b2df81a23f8cb99656378e72501b2cb41b1827c0f5a86f87d6b06b69f9f204"}, + {file = "xxhash-3.6.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:dc94790144e66b14f67b10ac8ed75b39ca47536bf8800eb7c24b50271ea0c490"}, + {file = "xxhash-3.6.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:93f107c673bccf0d592cdba077dedaf52fe7f42dcd7676eba1f6d6f0c3efffd2"}, + {file = "xxhash-3.6.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2aa5ee3444c25b69813663c9f8067dcfaa2e126dc55e8dddf40f4d1c25d7effa"}, + {file = "xxhash-3.6.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f7f99123f0e1194fa59cc69ad46dbae2e07becec5df50a0509a808f90a0f03f0"}, + {file = "xxhash-3.6.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:49e03e6fe2cac4a1bc64952dd250cf0dbc5ef4ebb7b8d96bce82e2de163c82a2"}, + {file = "xxhash-3.6.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bd17fede52a17a4f9a7bc4472a5867cb0b160deeb431795c0e4abe158bc784e9"}, + {file = "xxhash-3.6.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:6fb5f5476bef678f69db04f2bd1efbed3030d2aba305b0fc1773645f187d6a4e"}, + {file = "xxhash-3.6.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:843b52f6d88071f87eba1631b684fcb4b2068cd2180a0224122fe4ef011a9374"}, + {file = "xxhash-3.6.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:7d14a6cfaf03b1b6f5f9790f76880601ccc7896aff7ab9cd8978a939c1eb7e0d"}, + {file = "xxhash-3.6.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:418daf3db71e1413cfe211c2f9a528456936645c17f46b5204705581a45390ae"}, + {file = "xxhash-3.6.0-cp312-cp312-win32.whl", hash = "sha256:50fc255f39428a27299c20e280d6193d8b63b8ef8028995323bf834a026b4fbb"}, + {file = "xxhash-3.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:c0f2ab8c715630565ab8991b536ecded9416d615538be8ecddce43ccf26cbc7c"}, + {file = "xxhash-3.6.0-cp312-cp312-win_arm64.whl", hash = "sha256:eae5c13f3bc455a3bbb68bdc513912dc7356de7e2280363ea235f71f54064829"}, + {file = "xxhash-3.6.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:599e64ba7f67472481ceb6ee80fa3bd828fd61ba59fb11475572cc5ee52b89ec"}, + {file = "xxhash-3.6.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7d8b8aaa30fca4f16f0c84a5c8d7ddee0e25250ec2796c973775373257dde8f1"}, + {file = "xxhash-3.6.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d597acf8506d6e7101a4a44a5e428977a51c0fadbbfd3c39650cca9253f6e5a6"}, + {file = "xxhash-3.6.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:858dc935963a33bc33490128edc1c12b0c14d9c7ebaa4e387a7869ecc4f3e263"}, + {file = "xxhash-3.6.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ba284920194615cb8edf73bf52236ce2e1664ccd4a38fdb543506413529cc546"}, + {file = "xxhash-3.6.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4b54219177f6c6674d5378bd862c6aedf64725f70dd29c472eaae154df1a2e89"}, + {file = "xxhash-3.6.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:42c36dd7dbad2f5238950c377fcbf6811b1cdb1c444fab447960030cea60504d"}, + {file = "xxhash-3.6.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f22927652cba98c44639ffdc7aaf35828dccf679b10b31c4ad72a5b530a18eb7"}, + {file = "xxhash-3.6.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b45fad44d9c5c119e9c6fbf2e1c656a46dc68e280275007bbfd3d572b21426db"}, + {file = "xxhash-3.6.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:6f2580ffab1a8b68ef2b901cde7e55fa8da5e4be0977c68f78fc80f3c143de42"}, + {file = "xxhash-3.6.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:40c391dd3cd041ebc3ffe6f2c862f402e306eb571422e0aa918d8070ba31da11"}, + {file = "xxhash-3.6.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f205badabde7aafd1a31e8ca2a3e5a763107a71c397c4481d6a804eb5063d8bd"}, + {file = "xxhash-3.6.0-cp313-cp313-win32.whl", hash = "sha256:2577b276e060b73b73a53042ea5bd5203d3e6347ce0d09f98500f418a9fcf799"}, + {file = "xxhash-3.6.0-cp313-cp313-win_amd64.whl", hash = "sha256:757320d45d2fbcce8f30c42a6b2f47862967aea7bf458b9625b4bbe7ee390392"}, + {file = "xxhash-3.6.0-cp313-cp313-win_arm64.whl", hash = "sha256:457b8f85dec5825eed7b69c11ae86834a018b8e3df5e77783c999663da2f96d6"}, + {file = "xxhash-3.6.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a42e633d75cdad6d625434e3468126c73f13f7584545a9cf34e883aa1710e702"}, + {file = "xxhash-3.6.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:568a6d743219e717b07b4e03b0a828ce593833e498c3b64752e0f5df6bfe84db"}, + {file = "xxhash-3.6.0-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:bec91b562d8012dae276af8025a55811b875baace6af510412a5e58e3121bc54"}, + {file = "xxhash-3.6.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:78e7f2f4c521c30ad5e786fdd6bae89d47a32672a80195467b5de0480aa97b1f"}, + {file = "xxhash-3.6.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3ed0df1b11a79856df5ffcab572cbd6b9627034c1c748c5566fa79df9048a7c5"}, + {file = "xxhash-3.6.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0e4edbfc7d420925b0dd5e792478ed393d6e75ff8fc219a6546fb446b6a417b1"}, + {file = "xxhash-3.6.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fba27a198363a7ef87f8c0f6b171ec36b674fe9053742c58dd7e3201c1ab30ee"}, + {file = "xxhash-3.6.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:794fe9145fe60191c6532fa95063765529770edcdd67b3d537793e8004cabbfd"}, + {file = "xxhash-3.6.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:6105ef7e62b5ac73a837778efc331a591d8442f8ef5c7e102376506cb4ae2729"}, + {file = "xxhash-3.6.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:f01375c0e55395b814a679b3eea205db7919ac2af213f4a6682e01220e5fe292"}, + {file = "xxhash-3.6.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:d706dca2d24d834a4661619dcacf51a75c16d65985718d6a7d73c1eeeb903ddf"}, + {file = "xxhash-3.6.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5f059d9faeacd49c0215d66f4056e1326c80503f51a1532ca336a385edadd033"}, + {file = "xxhash-3.6.0-cp313-cp313t-win32.whl", hash = "sha256:1244460adc3a9be84731d72b8e80625788e5815b68da3da8b83f78115a40a7ec"}, + {file = "xxhash-3.6.0-cp313-cp313t-win_amd64.whl", hash = "sha256:b1e420ef35c503869c4064f4a2f2b08ad6431ab7b229a05cce39d74268bca6b8"}, + {file = "xxhash-3.6.0-cp313-cp313t-win_arm64.whl", hash = "sha256:ec44b73a4220623235f67a996c862049f375df3b1052d9899f40a6382c32d746"}, + {file = "xxhash-3.6.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:a40a3d35b204b7cc7643cbcf8c9976d818cb47befcfac8bbefec8038ac363f3e"}, + {file = "xxhash-3.6.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a54844be970d3fc22630b32d515e79a90d0a3ddb2644d8d7402e3c4c8da61405"}, + {file = "xxhash-3.6.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:016e9190af8f0a4e3741343777710e3d5717427f175adfdc3e72508f59e2a7f3"}, + {file = "xxhash-3.6.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4f6f72232f849eb9d0141e2ebe2677ece15adfd0fa599bc058aad83c714bb2c6"}, + {file = "xxhash-3.6.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:63275a8aba7865e44b1813d2177e0f5ea7eadad3dd063a21f7cf9afdc7054063"}, + {file = "xxhash-3.6.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3cd01fa2aa00d8b017c97eb46b9a794fbdca53fc14f845f5a328c71254b0abb7"}, + {file = "xxhash-3.6.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0226aa89035b62b6a86d3c68df4d7c1f47a342b8683da2b60cedcddb46c4d95b"}, + {file = "xxhash-3.6.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c6e193e9f56e4ca4923c61238cdaced324f0feac782544eb4c6d55ad5cc99ddd"}, + {file = "xxhash-3.6.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:9176dcaddf4ca963d4deb93866d739a343c01c969231dbe21680e13a5d1a5bf0"}, + {file = "xxhash-3.6.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:c1ce4009c97a752e682b897aa99aef84191077a9433eb237774689f14f8ec152"}, + {file = "xxhash-3.6.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:8cb2f4f679b01513b7adbb9b1b2f0f9cdc31b70007eaf9d59d0878809f385b11"}, + {file = "xxhash-3.6.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:653a91d7c2ab54a92c19ccf43508b6a555440b9be1bc8be553376778be7f20b5"}, + {file = "xxhash-3.6.0-cp314-cp314-win32.whl", hash = "sha256:a756fe893389483ee8c394d06b5ab765d96e68fbbfe6fde7aa17e11f5720559f"}, + {file = "xxhash-3.6.0-cp314-cp314-win_amd64.whl", hash = "sha256:39be8e4e142550ef69629c9cd71b88c90e9a5db703fecbcf265546d9536ca4ad"}, + {file = "xxhash-3.6.0-cp314-cp314-win_arm64.whl", hash = "sha256:25915e6000338999236f1eb68a02a32c3275ac338628a7eaa5a269c401995679"}, + {file = "xxhash-3.6.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:c5294f596a9017ca5a3e3f8884c00b91ab2ad2933cf288f4923c3fd4346cf3d4"}, + {file = "xxhash-3.6.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1cf9dcc4ab9cff01dfbba78544297a3a01dafd60f3bde4e2bfd016cf7e4ddc67"}, + {file = "xxhash-3.6.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:01262da8798422d0685f7cef03b2bd3f4f46511b02830861df548d7def4402ad"}, + {file = "xxhash-3.6.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:51a73fb7cb3a3ead9f7a8b583ffd9b8038e277cdb8cb87cf890e88b3456afa0b"}, + {file = "xxhash-3.6.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b9c6df83594f7df8f7f708ce5ebeacfc69f72c9fbaaababf6cf4758eaada0c9b"}, + {file = "xxhash-3.6.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:627f0af069b0ea56f312fd5189001c24578868643203bca1abbc2c52d3a6f3ca"}, + {file = "xxhash-3.6.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:aa912c62f842dfd013c5f21a642c9c10cd9f4c4e943e0af83618b4a404d9091a"}, + {file = "xxhash-3.6.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:b465afd7909db30168ab62afe40b2fcf79eedc0b89a6c0ab3123515dc0df8b99"}, + {file = "xxhash-3.6.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:a881851cf38b0a70e7c4d3ce81fc7afd86fbc2a024f4cfb2a97cf49ce04b75d3"}, + {file = "xxhash-3.6.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:9b3222c686a919a0f3253cfc12bb118b8b103506612253b5baeaac10d8027cf6"}, + {file = "xxhash-3.6.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:c5aa639bc113e9286137cec8fadc20e9cd732b2cc385c0b7fa673b84fc1f2a93"}, + {file = "xxhash-3.6.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5c1343d49ac102799905e115aee590183c3921d475356cb24b4de29a4bc56518"}, + {file = "xxhash-3.6.0-cp314-cp314t-win32.whl", hash = "sha256:5851f033c3030dd95c086b4a36a2683c2ff4a799b23af60977188b057e467119"}, + {file = "xxhash-3.6.0-cp314-cp314t-win_amd64.whl", hash = "sha256:0444e7967dac37569052d2409b00a8860c2135cff05502df4da80267d384849f"}, + {file = "xxhash-3.6.0-cp314-cp314t-win_arm64.whl", hash = "sha256:bb79b1e63f6fd84ec778a4b1916dfe0a7c3fdb986c06addd5db3a0d413819d95"}, + {file = "xxhash-3.6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7dac94fad14a3d1c92affb661021e1d5cbcf3876be5f5b4d90730775ccb7ac41"}, + {file = "xxhash-3.6.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6965e0e90f1f0e6cb78da568c13d4a348eeb7f40acfd6d43690a666a459458b8"}, + {file = "xxhash-3.6.0-cp38-cp38-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:2ab89a6b80f22214b43d98693c30da66af910c04f9858dd39c8e570749593d7e"}, + {file = "xxhash-3.6.0-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4903530e866b7a9c1eadfd3fa2fbe1b97d3aed4739a80abf506eb9318561c850"}, + {file = "xxhash-3.6.0-cp38-cp38-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4da8168ae52c01ac64c511d6f4a709479da8b7a4a1d7621ed51652f93747dffa"}, + {file = "xxhash-3.6.0-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:97460eec202017f719e839a0d3551fbc0b2fcc9c6c6ffaa5af85bbd5de432788"}, + {file = "xxhash-3.6.0-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:45aae0c9df92e7fa46fbb738737324a563c727990755ec1965a6a339ea10a1df"}, + {file = "xxhash-3.6.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:0d50101e57aad86f4344ca9b32d091a2135a9d0a4396f19133426c88025b09f1"}, + {file = "xxhash-3.6.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9085e798c163ce310d91f8aa6b325dda3c2944c93c6ce1edb314030d4167cc65"}, + {file = "xxhash-3.6.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:a87f271a33fad0e5bf3be282be55d78df3a45ae457950deb5241998790326f87"}, + {file = "xxhash-3.6.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:9e040d3e762f84500961791fa3709ffa4784d4dcd7690afc655c095e02fff05f"}, + {file = "xxhash-3.6.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:b0359391c3dad6de872fefb0cf5b69d55b0655c55ee78b1bb7a568979b2ce96b"}, + {file = "xxhash-3.6.0-cp38-cp38-win32.whl", hash = "sha256:e4ff728a2894e7f436b9e94c667b0f426b9c74b71f900cf37d5468c6b5da0536"}, + {file = "xxhash-3.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:01be0c5b500c5362871fc9cfdf58c69b3e5c4f531a82229ddb9eb1eb14138004"}, + {file = "xxhash-3.6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cc604dc06027dbeb8281aeac5899c35fcfe7c77b25212833709f0bff4ce74d2a"}, + {file = "xxhash-3.6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:277175a73900ad43a8caeb8b99b9604f21fe8d7c842f2f9061a364a7e220ddb7"}, + {file = "xxhash-3.6.0-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cfbc5b91397c8c2972fdac13fb3e4ed2f7f8ccac85cd2c644887557780a9b6e2"}, + {file = "xxhash-3.6.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2762bfff264c4e73c0e507274b40634ff465e025f0eaf050897e88ec8367575d"}, + {file = "xxhash-3.6.0-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2f171a900d59d51511209f7476933c34a0c2c711078d3c80e74e0fe4f38680ec"}, + {file = "xxhash-3.6.0-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:780b90c313348f030b811efc37b0fa1431163cb8db8064cf88a7936b6ce5f222"}, + {file = "xxhash-3.6.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18b242455eccdfcd1fa4134c431a30737d2b4f045770f8fe84356b3469d4b919"}, + {file = "xxhash-3.6.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a75ffc1bd5def584129774c158e108e5d768e10b75813f2b32650bb041066ed6"}, + {file = "xxhash-3.6.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1fc1ed882d1e8df932a66e2999429ba6cc4d5172914c904ab193381fba825360"}, + {file = "xxhash-3.6.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:44e342e8cc11b4e79dae5c57f2fb6360c3c20cc57d32049af8f567f5b4bcb5f4"}, + {file = "xxhash-3.6.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:c2f9ccd5c4be370939a2e17602fbc49995299203da72a3429db013d44d590e86"}, + {file = "xxhash-3.6.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:02ea4cb627c76f48cd9fb37cf7ab22bd51e57e1b519807234b473faebe526796"}, + {file = "xxhash-3.6.0-cp39-cp39-win32.whl", hash = "sha256:6551880383f0e6971dc23e512c9ccc986147ce7bfa1cd2e4b520b876c53e9f3d"}, + {file = "xxhash-3.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:7c35c4cdc65f2a29f34425c446f2f5cdcd0e3c34158931e1cc927ece925ab802"}, + {file = "xxhash-3.6.0-cp39-cp39-win_arm64.whl", hash = "sha256:ffc578717a347baf25be8397cb10d2528802d24f94cfc005c0e44fef44b5cdd6"}, + {file = "xxhash-3.6.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0f7b7e2ec26c1666ad5fc9dbfa426a6a3367ceaf79db5dd76264659d509d73b0"}, + {file = "xxhash-3.6.0-pp311-pypy311_pp73-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5dc1e14d14fa0f5789ec29a7062004b5933964bb9b02aae6622b8f530dc40296"}, + {file = "xxhash-3.6.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:881b47fc47e051b37d94d13e7455131054b56749b91b508b0907eb07900d1c13"}, + {file = "xxhash-3.6.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c6dc31591899f5e5666f04cc2e529e69b4072827085c1ef15294d91a004bc1bd"}, + {file = "xxhash-3.6.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:15e0dac10eb9309508bfc41f7f9deaa7755c69e35af835db9cb10751adebc35d"}, + {file = "xxhash-3.6.0.tar.gz", hash = "sha256:f0162a78b13a0d7617b2845b90c763339d1f1d82bb04a4b07f4ab535cc5e05d6"}, +] + [[package]] name = "xyzservices" -version = "2025.4.0" +version = "2025.11.0" description = "Source of XYZ tiles providers" optional = false python-versions = ">=3.8" groups = ["main"] files = [ - {file = "xyzservices-2025.4.0-py3-none-any.whl", hash = "sha256:8d4db9a59213ccb4ce1cf70210584f30b10795bff47627cdfb862b39ff6e10c9"}, - {file = "xyzservices-2025.4.0.tar.gz", hash = "sha256:6fe764713648fac53450fbc61a3c366cb6ae5335a1b2ae0c3796b495de3709d8"}, + {file = "xyzservices-2025.11.0-py3-none-any.whl", hash = "sha256:de66a7599a8d6dad63980b77defd1d8f5a5a9cb5fc8774ea1c6e89ca7c2a3d2f"}, + {file = "xyzservices-2025.11.0.tar.gz", hash = "sha256:2fc72b49502b25023fd71e8f532fb4beddbbf0aa124d90ea25dba44f545e17ce"}, ] [[package]] name = "yarl" -version = "1.20.0" +version = "1.22.0" description = "Yet another URL library" optional = false python-versions = ">=3.9" -groups = ["main"] -files = [ - {file = "yarl-1.20.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f1f6670b9ae3daedb325fa55fbe31c22c8228f6e0b513772c2e1c623caa6ab22"}, - {file = "yarl-1.20.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:85a231fa250dfa3308f3c7896cc007a47bc76e9e8e8595c20b7426cac4884c62"}, - {file = "yarl-1.20.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1a06701b647c9939d7019acdfa7ebbfbb78ba6aa05985bb195ad716ea759a569"}, - {file = "yarl-1.20.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7595498d085becc8fb9203aa314b136ab0516c7abd97e7d74f7bb4eb95042abe"}, - {file = "yarl-1.20.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:af5607159085dcdb055d5678fc2d34949bd75ae6ea6b4381e784bbab1c3aa195"}, - {file = "yarl-1.20.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:95b50910e496567434cb77a577493c26bce0f31c8a305135f3bda6a2483b8e10"}, - {file = "yarl-1.20.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b594113a301ad537766b4e16a5a6750fcbb1497dcc1bc8a4daae889e6402a634"}, - {file = "yarl-1.20.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:083ce0393ea173cd37834eb84df15b6853b555d20c52703e21fbababa8c129d2"}, - {file = "yarl-1.20.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f1a350a652bbbe12f666109fbddfdf049b3ff43696d18c9ab1531fbba1c977a"}, - {file = "yarl-1.20.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:fb0caeac4a164aadce342f1597297ec0ce261ec4532bbc5a9ca8da5622f53867"}, - {file = "yarl-1.20.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:d88cc43e923f324203f6ec14434fa33b85c06d18d59c167a0637164863b8e995"}, - {file = "yarl-1.20.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e52d6ed9ea8fd3abf4031325dc714aed5afcbfa19ee4a89898d663c9976eb487"}, - {file = "yarl-1.20.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ce360ae48a5e9961d0c730cf891d40698a82804e85f6e74658fb175207a77cb2"}, - {file = "yarl-1.20.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:06d06c9d5b5bc3eb56542ceeba6658d31f54cf401e8468512447834856fb0e61"}, - {file = "yarl-1.20.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c27d98f4e5c4060582f44e58309c1e55134880558f1add7a87c1bc36ecfade19"}, - {file = "yarl-1.20.0-cp310-cp310-win32.whl", hash = "sha256:f4d3fa9b9f013f7050326e165c3279e22850d02ae544ace285674cb6174b5d6d"}, - {file = "yarl-1.20.0-cp310-cp310-win_amd64.whl", hash = "sha256:bc906b636239631d42eb8a07df8359905da02704a868983265603887ed68c076"}, - {file = "yarl-1.20.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fdb5204d17cb32b2de2d1e21c7461cabfacf17f3645e4b9039f210c5d3378bf3"}, - {file = "yarl-1.20.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:eaddd7804d8e77d67c28d154ae5fab203163bd0998769569861258e525039d2a"}, - {file = "yarl-1.20.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:634b7ba6b4a85cf67e9df7c13a7fb2e44fa37b5d34501038d174a63eaac25ee2"}, - {file = "yarl-1.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d409e321e4addf7d97ee84162538c7258e53792eb7c6defd0c33647d754172e"}, - {file = "yarl-1.20.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:ea52f7328a36960ba3231c6677380fa67811b414798a6e071c7085c57b6d20a9"}, - {file = "yarl-1.20.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c8703517b924463994c344dcdf99a2d5ce9eca2b6882bb640aa555fb5efc706a"}, - {file = "yarl-1.20.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:077989b09ffd2f48fb2d8f6a86c5fef02f63ffe6b1dd4824c76de7bb01e4f2e2"}, - {file = "yarl-1.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0acfaf1da020253f3533526e8b7dd212838fdc4109959a2c53cafc6db611bff2"}, - {file = "yarl-1.20.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b4230ac0b97ec5eeb91d96b324d66060a43fd0d2a9b603e3327ed65f084e41f8"}, - {file = "yarl-1.20.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0a6a1e6ae21cdd84011c24c78d7a126425148b24d437b5702328e4ba640a8902"}, - {file = "yarl-1.20.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:86de313371ec04dd2531f30bc41a5a1a96f25a02823558ee0f2af0beaa7ca791"}, - {file = "yarl-1.20.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:dd59c9dd58ae16eaa0f48c3d0cbe6be8ab4dc7247c3ff7db678edecbaf59327f"}, - {file = "yarl-1.20.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a0bc5e05f457b7c1994cc29e83b58f540b76234ba6b9648a4971ddc7f6aa52da"}, - {file = "yarl-1.20.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:c9471ca18e6aeb0e03276b5e9b27b14a54c052d370a9c0c04a68cefbd1455eb4"}, - {file = "yarl-1.20.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:40ed574b4df723583a26c04b298b283ff171bcc387bc34c2683235e2487a65a5"}, - {file = "yarl-1.20.0-cp311-cp311-win32.whl", hash = "sha256:db243357c6c2bf3cd7e17080034ade668d54ce304d820c2a58514a4e51d0cfd6"}, - {file = "yarl-1.20.0-cp311-cp311-win_amd64.whl", hash = "sha256:8c12cd754d9dbd14204c328915e23b0c361b88f3cffd124129955e60a4fbfcfb"}, - {file = "yarl-1.20.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e06b9f6cdd772f9b665e5ba8161968e11e403774114420737f7884b5bd7bdf6f"}, - {file = "yarl-1.20.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b9ae2fbe54d859b3ade40290f60fe40e7f969d83d482e84d2c31b9bff03e359e"}, - {file = "yarl-1.20.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6d12b8945250d80c67688602c891237994d203d42427cb14e36d1a732eda480e"}, - {file = "yarl-1.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:087e9731884621b162a3e06dc0d2d626e1542a617f65ba7cc7aeab279d55ad33"}, - {file = "yarl-1.20.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:69df35468b66c1a6e6556248e6443ef0ec5f11a7a4428cf1f6281f1879220f58"}, - {file = "yarl-1.20.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b2992fe29002fd0d4cbaea9428b09af9b8686a9024c840b8a2b8f4ea4abc16f"}, - {file = "yarl-1.20.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4c903e0b42aab48abfbac668b5a9d7b6938e721a6341751331bcd7553de2dcae"}, - {file = "yarl-1.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf099e2432131093cc611623e0b0bcc399b8cddd9a91eded8bfb50402ec35018"}, - {file = "yarl-1.20.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a7f62f5dc70a6c763bec9ebf922be52aa22863d9496a9a30124d65b489ea672"}, - {file = "yarl-1.20.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:54ac15a8b60382b2bcefd9a289ee26dc0920cf59b05368c9b2b72450751c6eb8"}, - {file = "yarl-1.20.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:25b3bc0763a7aca16a0f1b5e8ef0f23829df11fb539a1b70476dcab28bd83da7"}, - {file = "yarl-1.20.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b2586e36dc070fc8fad6270f93242124df68b379c3a251af534030a4a33ef594"}, - {file = "yarl-1.20.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:866349da9d8c5290cfefb7fcc47721e94de3f315433613e01b435473be63daa6"}, - {file = "yarl-1.20.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:33bb660b390a0554d41f8ebec5cd4475502d84104b27e9b42f5321c5192bfcd1"}, - {file = "yarl-1.20.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:737e9f171e5a07031cbee5e9180f6ce21a6c599b9d4b2c24d35df20a52fabf4b"}, - {file = "yarl-1.20.0-cp312-cp312-win32.whl", hash = "sha256:839de4c574169b6598d47ad61534e6981979ca2c820ccb77bf70f4311dd2cc64"}, - {file = "yarl-1.20.0-cp312-cp312-win_amd64.whl", hash = "sha256:3d7dbbe44b443b0c4aa0971cb07dcb2c2060e4a9bf8d1301140a33a93c98e18c"}, - {file = "yarl-1.20.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2137810a20b933b1b1b7e5cf06a64c3ed3b4747b0e5d79c9447c00db0e2f752f"}, - {file = "yarl-1.20.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:447c5eadd750db8389804030d15f43d30435ed47af1313303ed82a62388176d3"}, - {file = "yarl-1.20.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:42fbe577272c203528d402eec8bf4b2d14fd49ecfec92272334270b850e9cd7d"}, - {file = "yarl-1.20.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18e321617de4ab170226cd15006a565d0fa0d908f11f724a2c9142d6b2812ab0"}, - {file = "yarl-1.20.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4345f58719825bba29895011e8e3b545e6e00257abb984f9f27fe923afca2501"}, - {file = "yarl-1.20.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d9b980d7234614bc4674468ab173ed77d678349c860c3af83b1fffb6a837ddc"}, - {file = "yarl-1.20.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af4baa8a445977831cbaa91a9a84cc09debb10bc8391f128da2f7bd070fc351d"}, - {file = "yarl-1.20.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:123393db7420e71d6ce40d24885a9e65eb1edefc7a5228db2d62bcab3386a5c0"}, - {file = "yarl-1.20.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ab47acc9332f3de1b39e9b702d9c916af7f02656b2a86a474d9db4e53ef8fd7a"}, - {file = "yarl-1.20.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4a34c52ed158f89876cba9c600b2c964dfc1ca52ba7b3ab6deb722d1d8be6df2"}, - {file = "yarl-1.20.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:04d8cfb12714158abf2618f792c77bc5c3d8c5f37353e79509608be4f18705c9"}, - {file = "yarl-1.20.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7dc63ad0d541c38b6ae2255aaa794434293964677d5c1ec5d0116b0e308031f5"}, - {file = "yarl-1.20.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d02b591a64e4e6ca18c5e3d925f11b559c763b950184a64cf47d74d7e41877"}, - {file = "yarl-1.20.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:95fc9876f917cac7f757df80a5dda9de59d423568460fe75d128c813b9af558e"}, - {file = "yarl-1.20.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bb769ae5760cd1c6a712135ee7915f9d43f11d9ef769cb3f75a23e398a92d384"}, - {file = "yarl-1.20.0-cp313-cp313-win32.whl", hash = "sha256:70e0c580a0292c7414a1cead1e076c9786f685c1fc4757573d2967689b370e62"}, - {file = "yarl-1.20.0-cp313-cp313-win_amd64.whl", hash = "sha256:4c43030e4b0af775a85be1fa0433119b1565673266a70bf87ef68a9d5ba3174c"}, - {file = "yarl-1.20.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b6c4c3d0d6a0ae9b281e492b1465c72de433b782e6b5001c8e7249e085b69051"}, - {file = "yarl-1.20.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8681700f4e4df891eafa4f69a439a6e7d480d64e52bf460918f58e443bd3da7d"}, - {file = "yarl-1.20.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:84aeb556cb06c00652dbf87c17838eb6d92cfd317799a8092cee0e570ee11229"}, - {file = "yarl-1.20.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f166eafa78810ddb383e930d62e623d288fb04ec566d1b4790099ae0f31485f1"}, - {file = "yarl-1.20.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5d3d6d14754aefc7a458261027a562f024d4f6b8a798adb472277f675857b1eb"}, - {file = "yarl-1.20.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a8f64df8ed5d04c51260dbae3cc82e5649834eebea9eadfd829837b8093eb00"}, - {file = "yarl-1.20.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4d9949eaf05b4d30e93e4034a7790634bbb41b8be2d07edd26754f2e38e491de"}, - {file = "yarl-1.20.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c366b254082d21cc4f08f522ac201d0d83a8b8447ab562732931d31d80eb2a5"}, - {file = "yarl-1.20.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91bc450c80a2e9685b10e34e41aef3d44ddf99b3a498717938926d05ca493f6a"}, - {file = "yarl-1.20.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9c2aa4387de4bc3a5fe158080757748d16567119bef215bec643716b4fbf53f9"}, - {file = "yarl-1.20.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:d2cbca6760a541189cf87ee54ff891e1d9ea6406079c66341008f7ef6ab61145"}, - {file = "yarl-1.20.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:798a5074e656f06b9fad1a162be5a32da45237ce19d07884d0b67a0aa9d5fdda"}, - {file = "yarl-1.20.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:f106e75c454288472dbe615accef8248c686958c2e7dd3b8d8ee2669770d020f"}, - {file = "yarl-1.20.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:3b60a86551669c23dc5445010534d2c5d8a4e012163218fc9114e857c0586fdd"}, - {file = "yarl-1.20.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:3e429857e341d5e8e15806118e0294f8073ba9c4580637e59ab7b238afca836f"}, - {file = "yarl-1.20.0-cp313-cp313t-win32.whl", hash = "sha256:65a4053580fe88a63e8e4056b427224cd01edfb5f951498bfefca4052f0ce0ac"}, - {file = "yarl-1.20.0-cp313-cp313t-win_amd64.whl", hash = "sha256:53b2da3a6ca0a541c1ae799c349788d480e5144cac47dba0266c7cb6c76151fe"}, - {file = "yarl-1.20.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:119bca25e63a7725b0c9d20ac67ca6d98fa40e5a894bd5d4686010ff73397914"}, - {file = "yarl-1.20.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:35d20fb919546995f1d8c9e41f485febd266f60e55383090010f272aca93edcc"}, - {file = "yarl-1.20.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:484e7a08f72683c0f160270566b4395ea5412b4359772b98659921411d32ad26"}, - {file = "yarl-1.20.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d8a3d54a090e0fff5837cd3cc305dd8a07d3435a088ddb1f65e33b322f66a94"}, - {file = "yarl-1.20.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:f0cf05ae2d3d87a8c9022f3885ac6dea2b751aefd66a4f200e408a61ae9b7f0d"}, - {file = "yarl-1.20.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a884b8974729e3899d9287df46f015ce53f7282d8d3340fa0ed57536b440621c"}, - {file = "yarl-1.20.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f8d8aa8dd89ffb9a831fedbcb27d00ffd9f4842107d52dc9d57e64cb34073d5c"}, - {file = "yarl-1.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b4e88d6c3c8672f45a30867817e4537df1bbc6f882a91581faf1f6d9f0f1b5a"}, - {file = "yarl-1.20.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bdb77efde644d6f1ad27be8a5d67c10b7f769804fff7a966ccb1da5a4de4b656"}, - {file = "yarl-1.20.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:4ba5e59f14bfe8d261a654278a0f6364feef64a794bd456a8c9e823071e5061c"}, - {file = "yarl-1.20.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:d0bf955b96ea44ad914bc792c26a0edcd71b4668b93cbcd60f5b0aeaaed06c64"}, - {file = "yarl-1.20.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:27359776bc359ee6eaefe40cb19060238f31228799e43ebd3884e9c589e63b20"}, - {file = "yarl-1.20.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:04d9c7a1dc0a26efb33e1acb56c8849bd57a693b85f44774356c92d610369efa"}, - {file = "yarl-1.20.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:faa709b66ae0e24c8e5134033187a972d849d87ed0a12a0366bedcc6b5dc14a5"}, - {file = "yarl-1.20.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:44869ee8538208fe5d9342ed62c11cc6a7a1af1b3d0bb79bb795101b6e77f6e0"}, - {file = "yarl-1.20.0-cp39-cp39-win32.whl", hash = "sha256:b7fa0cb9fd27ffb1211cde944b41f5c67ab1c13a13ebafe470b1e206b8459da8"}, - {file = "yarl-1.20.0-cp39-cp39-win_amd64.whl", hash = "sha256:d4fad6e5189c847820288286732075f213eabf81be4d08d6cc309912e62be5b7"}, - {file = "yarl-1.20.0-py3-none-any.whl", hash = "sha256:5d0fe6af927a47a230f31e6004621fd0959eaa915fc62acfafa67ff7229a3124"}, - {file = "yarl-1.20.0.tar.gz", hash = "sha256:686d51e51ee5dfe62dec86e4866ee0e9ed66df700d55c828a615640adc885307"}, +groups = ["main", "torch-cuda"] +files = [ + {file = "yarl-1.22.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c7bd6683587567e5a49ee6e336e0612bec8329be1b7d4c8af5687dcdeb67ee1e"}, + {file = "yarl-1.22.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5cdac20da754f3a723cceea5b3448e1a2074866406adeb4ef35b469d089adb8f"}, + {file = "yarl-1.22.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:07a524d84df0c10f41e3ee918846e1974aba4ec017f990dc735aad487a0bdfdf"}, + {file = "yarl-1.22.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e1b329cb8146d7b736677a2440e422eadd775d1806a81db2d4cded80a48efc1a"}, + {file = "yarl-1.22.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:75976c6945d85dbb9ee6308cd7ff7b1fb9409380c82d6119bd778d8fcfe2931c"}, + {file = "yarl-1.22.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:80ddf7a5f8c86cb3eb4bc9028b07bbbf1f08a96c5c0bc1244be5e8fefcb94147"}, + {file = "yarl-1.22.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d332fc2e3c94dad927f2112395772a4e4fedbcf8f80efc21ed7cdfae4d574fdb"}, + {file = "yarl-1.22.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0cf71bf877efeac18b38d3930594c0948c82b64547c1cf420ba48722fe5509f6"}, + {file = "yarl-1.22.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:663e1cadaddae26be034a6ab6072449a8426ddb03d500f43daf952b74553bba0"}, + {file = "yarl-1.22.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:6dcbb0829c671f305be48a7227918cfcd11276c2d637a8033a99a02b67bf9eda"}, + {file = "yarl-1.22.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f0d97c18dfd9a9af4490631905a3f131a8e4c9e80a39353919e2cfed8f00aedc"}, + {file = "yarl-1.22.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:437840083abe022c978470b942ff832c3940b2ad3734d424b7eaffcd07f76737"}, + {file = "yarl-1.22.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a899cbd98dce6f5d8de1aad31cb712ec0a530abc0a86bd6edaa47c1090138467"}, + {file = "yarl-1.22.0-cp310-cp310-win32.whl", hash = "sha256:595697f68bd1f0c1c159fcb97b661fc9c3f5db46498043555d04805430e79bea"}, + {file = "yarl-1.22.0-cp310-cp310-win_amd64.whl", hash = "sha256:cb95a9b1adaa48e41815a55ae740cfda005758104049a640a398120bf02515ca"}, + {file = "yarl-1.22.0-cp310-cp310-win_arm64.whl", hash = "sha256:b85b982afde6df99ecc996990d4ad7ccbdbb70e2a4ba4de0aecde5922ba98a0b"}, + {file = "yarl-1.22.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1ab72135b1f2db3fed3997d7e7dc1b80573c67138023852b6efb336a5eae6511"}, + {file = "yarl-1.22.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:669930400e375570189492dc8d8341301578e8493aec04aebc20d4717f899dd6"}, + {file = "yarl-1.22.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:792a2af6d58177ef7c19cbf0097aba92ca1b9cb3ffdd9c7470e156c8f9b5e028"}, + {file = "yarl-1.22.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3ea66b1c11c9150f1372f69afb6b8116f2dd7286f38e14ea71a44eee9ec51b9d"}, + {file = "yarl-1.22.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3e2daa88dc91870215961e96a039ec73e4937da13cf77ce17f9cad0c18df3503"}, + {file = "yarl-1.22.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ba440ae430c00eee41509353628600212112cd5018d5def7e9b05ea7ac34eb65"}, + {file = "yarl-1.22.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e6438cc8f23a9c1478633d216b16104a586b9761db62bfacb6425bac0a36679e"}, + {file = "yarl-1.22.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4c52a6e78aef5cf47a98ef8e934755abf53953379b7d53e68b15ff4420e6683d"}, + {file = "yarl-1.22.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3b06bcadaac49c70f4c88af4ffcfbe3dc155aab3163e75777818092478bcbbe7"}, + {file = "yarl-1.22.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:6944b2dc72c4d7f7052683487e3677456050ff77fcf5e6204e98caf785ad1967"}, + {file = "yarl-1.22.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d5372ca1df0f91a86b047d1277c2aaf1edb32d78bbcefffc81b40ffd18f027ed"}, + {file = "yarl-1.22.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:51af598701f5299012b8416486b40fceef8c26fc87dc6d7d1f6fc30609ea0aa6"}, + {file = "yarl-1.22.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b266bd01fedeffeeac01a79ae181719ff848a5a13ce10075adbefc8f1daee70e"}, + {file = "yarl-1.22.0-cp311-cp311-win32.whl", hash = "sha256:a9b1ba5610a4e20f655258d5a1fdc7ebe3d837bb0e45b581398b99eb98b1f5ca"}, + {file = "yarl-1.22.0-cp311-cp311-win_amd64.whl", hash = "sha256:078278b9b0b11568937d9509b589ee83ef98ed6d561dfe2020e24a9fd08eaa2b"}, + {file = "yarl-1.22.0-cp311-cp311-win_arm64.whl", hash = "sha256:b6a6f620cfe13ccec221fa312139135166e47ae169f8253f72a0abc0dae94376"}, + {file = "yarl-1.22.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e340382d1afa5d32b892b3ff062436d592ec3d692aeea3bef3a5cfe11bbf8c6f"}, + {file = "yarl-1.22.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f1e09112a2c31ffe8d80be1b0988fa6a18c5d5cad92a9ffbb1c04c91bfe52ad2"}, + {file = "yarl-1.22.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:939fe60db294c786f6b7c2d2e121576628468f65453d86b0fe36cb52f987bd74"}, + {file = "yarl-1.22.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e1651bf8e0398574646744c1885a41198eba53dc8a9312b954073f845c90a8df"}, + {file = "yarl-1.22.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b8a0588521a26bf92a57a1705b77b8b59044cdceccac7151bd8d229e66b8dedb"}, + {file = "yarl-1.22.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:42188e6a615c1a75bcaa6e150c3fe8f3e8680471a6b10150c5f7e83f47cc34d2"}, + {file = "yarl-1.22.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f6d2cb59377d99718913ad9a151030d6f83ef420a2b8f521d94609ecc106ee82"}, + {file = "yarl-1.22.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50678a3b71c751d58d7908edc96d332af328839eea883bb554a43f539101277a"}, + {file = "yarl-1.22.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e8fbaa7cec507aa24ea27a01456e8dd4b6fab829059b69844bd348f2d467124"}, + {file = "yarl-1.22.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:433885ab5431bc3d3d4f2f9bd15bfa1614c522b0f1405d62c4f926ccd69d04fa"}, + {file = "yarl-1.22.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:b790b39c7e9a4192dc2e201a282109ed2985a1ddbd5ac08dc56d0e121400a8f7"}, + {file = "yarl-1.22.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:31f0b53913220599446872d757257be5898019c85e7971599065bc55065dc99d"}, + {file = "yarl-1.22.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a49370e8f711daec68d09b821a34e1167792ee2d24d405cbc2387be4f158b520"}, + {file = "yarl-1.22.0-cp312-cp312-win32.whl", hash = "sha256:70dfd4f241c04bd9239d53b17f11e6ab672b9f1420364af63e8531198e3f5fe8"}, + {file = "yarl-1.22.0-cp312-cp312-win_amd64.whl", hash = "sha256:8884d8b332a5e9b88e23f60bb166890009429391864c685e17bd73a9eda9105c"}, + {file = "yarl-1.22.0-cp312-cp312-win_arm64.whl", hash = "sha256:ea70f61a47f3cc93bdf8b2f368ed359ef02a01ca6393916bc8ff877427181e74"}, + {file = "yarl-1.22.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8dee9c25c74997f6a750cd317b8ca63545169c098faee42c84aa5e506c819b53"}, + {file = "yarl-1.22.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:01e73b85a5434f89fc4fe27dcda2aff08ddf35e4d47bbbea3bdcd25321af538a"}, + {file = "yarl-1.22.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:22965c2af250d20c873cdbee8ff958fb809940aeb2e74ba5f20aaf6b7ac8c70c"}, + {file = "yarl-1.22.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4f15793aa49793ec8d1c708ab7f9eded1aa72edc5174cae703651555ed1b601"}, + {file = "yarl-1.22.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5542339dcf2747135c5c85f68680353d5cb9ffd741c0f2e8d832d054d41f35a"}, + {file = "yarl-1.22.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5c401e05ad47a75869c3ab3e35137f8468b846770587e70d71e11de797d113df"}, + {file = "yarl-1.22.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:243dda95d901c733f5b59214d28b0120893d91777cb8aa043e6ef059d3cddfe2"}, + {file = "yarl-1.22.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bec03d0d388060058f5d291a813f21c011041938a441c593374da6077fe21b1b"}, + {file = "yarl-1.22.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b0748275abb8c1e1e09301ee3cf90c8a99678a4e92e4373705f2a2570d581273"}, + {file = "yarl-1.22.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:47fdb18187e2a4e18fda2c25c05d8251a9e4a521edaed757fef033e7d8498d9a"}, + {file = "yarl-1.22.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c7044802eec4524fde550afc28edda0dd5784c4c45f0be151a2d3ba017daca7d"}, + {file = "yarl-1.22.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:139718f35149ff544caba20fce6e8a2f71f1e39b92c700d8438a0b1d2a631a02"}, + {file = "yarl-1.22.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e1b51bebd221006d3d2f95fbe124b22b247136647ae5dcc8c7acafba66e5ee67"}, + {file = "yarl-1.22.0-cp313-cp313-win32.whl", hash = "sha256:d3e32536234a95f513bd374e93d717cf6b2231a791758de6c509e3653f234c95"}, + {file = "yarl-1.22.0-cp313-cp313-win_amd64.whl", hash = "sha256:47743b82b76d89a1d20b83e60d5c20314cbd5ba2befc9cda8f28300c4a08ed4d"}, + {file = "yarl-1.22.0-cp313-cp313-win_arm64.whl", hash = "sha256:5d0fcda9608875f7d052eff120c7a5da474a6796fe4d83e152e0e4d42f6d1a9b"}, + {file = "yarl-1.22.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:719ae08b6972befcba4310e49edb1161a88cdd331e3a694b84466bd938a6ab10"}, + {file = "yarl-1.22.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:47d8a5c446df1c4db9d21b49619ffdba90e77c89ec6e283f453856c74b50b9e3"}, + {file = "yarl-1.22.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:cfebc0ac8333520d2d0423cbbe43ae43c8838862ddb898f5ca68565e395516e9"}, + {file = "yarl-1.22.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4398557cbf484207df000309235979c79c4356518fd5c99158c7d38203c4da4f"}, + {file = "yarl-1.22.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2ca6fd72a8cd803be290d42f2dec5cdcd5299eeb93c2d929bf060ad9efaf5de0"}, + {file = "yarl-1.22.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca1f59c4e1ab6e72f0a23c13fca5430f889634166be85dbf1013683e49e3278e"}, + {file = "yarl-1.22.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c5010a52015e7c70f86eb967db0f37f3c8bd503a695a49f8d45700144667708"}, + {file = "yarl-1.22.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d7672ecf7557476642c88497c2f8d8542f8e36596e928e9bcba0e42e1e7d71f"}, + {file = "yarl-1.22.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:3b7c88eeef021579d600e50363e0b6ee4f7f6f728cd3486b9d0f3ee7b946398d"}, + {file = "yarl-1.22.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:f4afb5c34f2c6fecdcc182dfcfc6af6cccf1aa923eed4d6a12e9d96904e1a0d8"}, + {file = "yarl-1.22.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:59c189e3e99a59cf8d83cbb31d4db02d66cda5a1a4374e8a012b51255341abf5"}, + {file = "yarl-1.22.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:5a3bf7f62a289fa90f1990422dc8dff5a458469ea71d1624585ec3a4c8d6960f"}, + {file = "yarl-1.22.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:de6b9a04c606978fdfe72666fa216ffcf2d1a9f6a381058d4378f8d7b1e5de62"}, + {file = "yarl-1.22.0-cp313-cp313t-win32.whl", hash = "sha256:1834bb90991cc2999f10f97f5f01317f99b143284766d197e43cd5b45eb18d03"}, + {file = "yarl-1.22.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ff86011bd159a9d2dfc89c34cfd8aff12875980e3bd6a39ff097887520e60249"}, + {file = "yarl-1.22.0-cp313-cp313t-win_arm64.whl", hash = "sha256:7861058d0582b847bc4e3a4a4c46828a410bca738673f35a29ba3ca5db0b473b"}, + {file = "yarl-1.22.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:34b36c2c57124530884d89d50ed2c1478697ad7473efd59cfd479945c95650e4"}, + {file = "yarl-1.22.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:0dd9a702591ca2e543631c2a017e4a547e38a5c0f29eece37d9097e04a7ac683"}, + {file = "yarl-1.22.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:594fcab1032e2d2cc3321bb2e51271e7cd2b516c7d9aee780ece81b07ff8244b"}, + {file = "yarl-1.22.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f3d7a87a78d46a2e3d5b72587ac14b4c16952dd0887dbb051451eceac774411e"}, + {file = "yarl-1.22.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:852863707010316c973162e703bddabec35e8757e67fcb8ad58829de1ebc8590"}, + {file = "yarl-1.22.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:131a085a53bfe839a477c0845acf21efc77457ba2bcf5899618136d64f3303a2"}, + {file = "yarl-1.22.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:078a8aefd263f4d4f923a9677b942b445a2be970ca24548a8102689a3a8ab8da"}, + {file = "yarl-1.22.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bca03b91c323036913993ff5c738d0842fc9c60c4648e5c8d98331526df89784"}, + {file = "yarl-1.22.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:68986a61557d37bb90d3051a45b91fa3d5c516d177dfc6dd6f2f436a07ff2b6b"}, + {file = "yarl-1.22.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:4792b262d585ff0dff6bcb787f8492e40698443ec982a3568c2096433660c694"}, + {file = "yarl-1.22.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:ebd4549b108d732dba1d4ace67614b9545b21ece30937a63a65dd34efa19732d"}, + {file = "yarl-1.22.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:f87ac53513d22240c7d59203f25cc3beac1e574c6cd681bbfd321987b69f95fd"}, + {file = "yarl-1.22.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:22b029f2881599e2f1b06f8f1db2ee63bd309e2293ba2d566e008ba12778b8da"}, + {file = "yarl-1.22.0-cp314-cp314-win32.whl", hash = "sha256:6a635ea45ba4ea8238463b4f7d0e721bad669f80878b7bfd1f89266e2ae63da2"}, + {file = "yarl-1.22.0-cp314-cp314-win_amd64.whl", hash = "sha256:0d6e6885777af0f110b0e5d7e5dda8b704efed3894da26220b7f3d887b839a79"}, + {file = "yarl-1.22.0-cp314-cp314-win_arm64.whl", hash = "sha256:8218f4e98d3c10d683584cb40f0424f4b9fd6e95610232dd75e13743b070ee33"}, + {file = "yarl-1.22.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:45c2842ff0e0d1b35a6bf1cd6c690939dacb617a70827f715232b2e0494d55d1"}, + {file = "yarl-1.22.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:d947071e6ebcf2e2bee8fce76e10faca8f7a14808ca36a910263acaacef08eca"}, + {file = "yarl-1.22.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:334b8721303e61b00019474cc103bdac3d7b1f65e91f0bfedeec2d56dfe74b53"}, + {file = "yarl-1.22.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e7ce67c34138a058fd092f67d07a72b8e31ff0c9236e751957465a24b28910c"}, + {file = "yarl-1.22.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d77e1b2c6d04711478cb1c4ab90db07f1609ccf06a287d5607fcd90dc9863acf"}, + {file = "yarl-1.22.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c4647674b6150d2cae088fc07de2738a84b8bcedebef29802cf0b0a82ab6face"}, + {file = "yarl-1.22.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:efb07073be061c8f79d03d04139a80ba33cbd390ca8f0297aae9cce6411e4c6b"}, + {file = "yarl-1.22.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e51ac5435758ba97ad69617e13233da53908beccc6cfcd6c34bbed8dcbede486"}, + {file = "yarl-1.22.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:33e32a0dd0c8205efa8e83d04fc9f19313772b78522d1bdc7d9aed706bfd6138"}, + {file = "yarl-1.22.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:bf4a21e58b9cde0e401e683ebd00f6ed30a06d14e93f7c8fd059f8b6e8f87b6a"}, + {file = "yarl-1.22.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:e4b582bab49ac33c8deb97e058cd67c2c50dac0dd134874106d9c774fd272529"}, + {file = "yarl-1.22.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:0b5bcc1a9c4839e7e30b7b30dd47fe5e7e44fb7054ec29b5bb8d526aa1041093"}, + {file = "yarl-1.22.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c0232bce2170103ec23c454e54a57008a9a72b5d1c3105dc2496750da8cfa47c"}, + {file = "yarl-1.22.0-cp314-cp314t-win32.whl", hash = "sha256:8009b3173bcd637be650922ac455946197d858b3630b6d8787aa9e5c4564533e"}, + {file = "yarl-1.22.0-cp314-cp314t-win_amd64.whl", hash = "sha256:9fb17ea16e972c63d25d4a97f016d235c78dd2344820eb35bc034bc32012ee27"}, + {file = "yarl-1.22.0-cp314-cp314t-win_arm64.whl", hash = "sha256:9f6d73c1436b934e3f01df1e1b21ff765cd1d28c77dfb9ace207f746d4610ee1"}, + {file = "yarl-1.22.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3aa27acb6de7a23785d81557577491f6c38a5209a254d1191519d07d8fe51748"}, + {file = "yarl-1.22.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:af74f05666a5e531289cb1cc9c883d1de2088b8e5b4de48004e5ca8a830ac859"}, + {file = "yarl-1.22.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:62441e55958977b8167b2709c164c91a6363e25da322d87ae6dd9c6019ceecf9"}, + {file = "yarl-1.22.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b580e71cac3f8113d3135888770903eaf2f507e9421e5697d6ee6d8cd1c7f054"}, + {file = "yarl-1.22.0-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e81fda2fb4a07eda1a2252b216aa0df23ebcd4d584894e9612e80999a78fd95b"}, + {file = "yarl-1.22.0-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:99b6fc1d55782461b78221e95fc357b47ad98b041e8e20f47c1411d0aacddc60"}, + {file = "yarl-1.22.0-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:088e4e08f033db4be2ccd1f34cf29fe994772fb54cfe004bbf54db320af56890"}, + {file = "yarl-1.22.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e4e1f6f0b4da23e61188676e3ed027ef0baa833a2e633c29ff8530800edccba"}, + {file = "yarl-1.22.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:84fc3ec96fce86ce5aa305eb4aa9358279d1aa644b71fab7b8ed33fe3ba1a7ca"}, + {file = "yarl-1.22.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:5dbeefd6ca588b33576a01b0ad58aa934bc1b41ef89dee505bf2932b22ddffba"}, + {file = "yarl-1.22.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:14291620375b1060613f4aab9ebf21850058b6b1b438f386cc814813d901c60b"}, + {file = "yarl-1.22.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:a4fcfc8eb2c34148c118dfa02e6427ca278bfd0f3df7c5f99e33d2c0e81eae3e"}, + {file = "yarl-1.22.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:029866bde8d7b0878b9c160e72305bbf0a7342bcd20b9999381704ae03308dc8"}, + {file = "yarl-1.22.0-cp39-cp39-win32.whl", hash = "sha256:4dcc74149ccc8bba31ce1944acee24813e93cfdee2acda3c172df844948ddf7b"}, + {file = "yarl-1.22.0-cp39-cp39-win_amd64.whl", hash = "sha256:10619d9fdee46d20edc49d3479e2f8269d0779f1b031e6f7c2aa1c76be04b7ed"}, + {file = "yarl-1.22.0-cp39-cp39-win_arm64.whl", hash = "sha256:dd7afd3f8b0bfb4e0d9fc3c31bfe8a4ec7debe124cfd90619305def3c8ca8cd2"}, + {file = "yarl-1.22.0-py3-none-any.whl", hash = "sha256:1380560bdba02b6b6c90de54133c81c9f2a453dee9912fe58c1dcced1edb7cff"}, + {file = "yarl-1.22.0.tar.gz", hash = "sha256:bebf8557577d4401ba8bd9ff33906f1376c877aa78d1fe216ad01b4d6745af71"}, ] [package.dependencies] @@ -4923,15 +6266,15 @@ propcache = ">=0.2.1" [[package]] name = "zipp" -version = "3.21.0" +version = "3.23.0" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.9" groups = ["main"] markers = "python_version == \"3.11\"" files = [ - {file = "zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931"}, - {file = "zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4"}, + {file = "zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e"}, + {file = "zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166"}, ] [package.extras] @@ -4939,126 +6282,125 @@ check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \" cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] enabler = ["pytest-enabler (>=2.2)"] -test = ["big-O", "importlib-resources ; python_version < \"3.9\"", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] +test = ["big-O", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more_itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] type = ["pytest-mypy"] [[package]] name = "zstandard" -version = "0.23.0" +version = "0.25.0" description = "Zstandard bindings for Python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main"] files = [ - {file = "zstandard-0.23.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bf0a05b6059c0528477fba9054d09179beb63744355cab9f38059548fedd46a9"}, - {file = "zstandard-0.23.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fc9ca1c9718cb3b06634c7c8dec57d24e9438b2aa9a0f02b8bb36bf478538880"}, - {file = "zstandard-0.23.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77da4c6bfa20dd5ea25cbf12c76f181a8e8cd7ea231c673828d0386b1740b8dc"}, - {file = "zstandard-0.23.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2170c7e0367dde86a2647ed5b6f57394ea7f53545746104c6b09fc1f4223573"}, - {file = "zstandard-0.23.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c16842b846a8d2a145223f520b7e18b57c8f476924bda92aeee3a88d11cfc391"}, - {file = "zstandard-0.23.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:157e89ceb4054029a289fb504c98c6a9fe8010f1680de0201b3eb5dc20aa6d9e"}, - {file = "zstandard-0.23.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:203d236f4c94cd8379d1ea61db2fce20730b4c38d7f1c34506a31b34edc87bdd"}, - {file = "zstandard-0.23.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:dc5d1a49d3f8262be192589a4b72f0d03b72dcf46c51ad5852a4fdc67be7b9e4"}, - {file = "zstandard-0.23.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:752bf8a74412b9892f4e5b58f2f890a039f57037f52c89a740757ebd807f33ea"}, - {file = "zstandard-0.23.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:80080816b4f52a9d886e67f1f96912891074903238fe54f2de8b786f86baded2"}, - {file = "zstandard-0.23.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:84433dddea68571a6d6bd4fbf8ff398236031149116a7fff6f777ff95cad3df9"}, - {file = "zstandard-0.23.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ab19a2d91963ed9e42b4e8d77cd847ae8381576585bad79dbd0a8837a9f6620a"}, - {file = "zstandard-0.23.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:59556bf80a7094d0cfb9f5e50bb2db27fefb75d5138bb16fb052b61b0e0eeeb0"}, - {file = "zstandard-0.23.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:27d3ef2252d2e62476389ca8f9b0cf2bbafb082a3b6bfe9d90cbcbb5529ecf7c"}, - {file = "zstandard-0.23.0-cp310-cp310-win32.whl", hash = "sha256:5d41d5e025f1e0bccae4928981e71b2334c60f580bdc8345f824e7c0a4c2a813"}, - {file = "zstandard-0.23.0-cp310-cp310-win_amd64.whl", hash = "sha256:519fbf169dfac1222a76ba8861ef4ac7f0530c35dd79ba5727014613f91613d4"}, - {file = "zstandard-0.23.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:34895a41273ad33347b2fc70e1bff4240556de3c46c6ea430a7ed91f9042aa4e"}, - {file = "zstandard-0.23.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:77ea385f7dd5b5676d7fd943292ffa18fbf5c72ba98f7d09fc1fb9e819b34c23"}, - {file = "zstandard-0.23.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:983b6efd649723474f29ed42e1467f90a35a74793437d0bc64a5bf482bedfa0a"}, - {file = "zstandard-0.23.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80a539906390591dd39ebb8d773771dc4db82ace6372c4d41e2d293f8e32b8db"}, - {file = "zstandard-0.23.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:445e4cb5048b04e90ce96a79b4b63140e3f4ab5f662321975679b5f6360b90e2"}, - {file = "zstandard-0.23.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd30d9c67d13d891f2360b2a120186729c111238ac63b43dbd37a5a40670b8ca"}, - {file = "zstandard-0.23.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d20fd853fbb5807c8e84c136c278827b6167ded66c72ec6f9a14b863d809211c"}, - {file = "zstandard-0.23.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ed1708dbf4d2e3a1c5c69110ba2b4eb6678262028afd6c6fbcc5a8dac9cda68e"}, - {file = "zstandard-0.23.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:be9b5b8659dff1f913039c2feee1aca499cfbc19e98fa12bc85e037c17ec6ca5"}, - {file = "zstandard-0.23.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:65308f4b4890aa12d9b6ad9f2844b7ee42c7f7a4fd3390425b242ffc57498f48"}, - {file = "zstandard-0.23.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:98da17ce9cbf3bfe4617e836d561e433f871129e3a7ac16d6ef4c680f13a839c"}, - {file = "zstandard-0.23.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:8ed7d27cb56b3e058d3cf684d7200703bcae623e1dcc06ed1e18ecda39fee003"}, - {file = "zstandard-0.23.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:b69bb4f51daf461b15e7b3db033160937d3ff88303a7bc808c67bbc1eaf98c78"}, - {file = "zstandard-0.23.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:034b88913ecc1b097f528e42b539453fa82c3557e414b3de9d5632c80439a473"}, - {file = "zstandard-0.23.0-cp311-cp311-win32.whl", hash = "sha256:f2d4380bf5f62daabd7b751ea2339c1a21d1c9463f1feb7fc2bdcea2c29c3160"}, - {file = "zstandard-0.23.0-cp311-cp311-win_amd64.whl", hash = "sha256:62136da96a973bd2557f06ddd4e8e807f9e13cbb0bfb9cc06cfe6d98ea90dfe0"}, - {file = "zstandard-0.23.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b4567955a6bc1b20e9c31612e615af6b53733491aeaa19a6b3b37f3b65477094"}, - {file = "zstandard-0.23.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e172f57cd78c20f13a3415cc8dfe24bf388614324d25539146594c16d78fcc8"}, - {file = "zstandard-0.23.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0e166f698c5a3e914947388c162be2583e0c638a4703fc6a543e23a88dea3c1"}, - {file = "zstandard-0.23.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12a289832e520c6bd4dcaad68e944b86da3bad0d339ef7989fb7e88f92e96072"}, - {file = "zstandard-0.23.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d50d31bfedd53a928fed6707b15a8dbeef011bb6366297cc435accc888b27c20"}, - {file = "zstandard-0.23.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72c68dda124a1a138340fb62fa21b9bf4848437d9ca60bd35db36f2d3345f373"}, - {file = "zstandard-0.23.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:53dd9d5e3d29f95acd5de6802e909ada8d8d8cfa37a3ac64836f3bc4bc5512db"}, - {file = "zstandard-0.23.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:6a41c120c3dbc0d81a8e8adc73312d668cd34acd7725f036992b1b72d22c1772"}, - {file = "zstandard-0.23.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:40b33d93c6eddf02d2c19f5773196068d875c41ca25730e8288e9b672897c105"}, - {file = "zstandard-0.23.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9206649ec587e6b02bd124fb7799b86cddec350f6f6c14bc82a2b70183e708ba"}, - {file = "zstandard-0.23.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76e79bc28a65f467e0409098fa2c4376931fd3207fbeb6b956c7c476d53746dd"}, - {file = "zstandard-0.23.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:66b689c107857eceabf2cf3d3fc699c3c0fe8ccd18df2219d978c0283e4c508a"}, - {file = "zstandard-0.23.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9c236e635582742fee16603042553d276cca506e824fa2e6489db04039521e90"}, - {file = "zstandard-0.23.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a8fffdbd9d1408006baaf02f1068d7dd1f016c6bcb7538682622c556e7b68e35"}, - {file = "zstandard-0.23.0-cp312-cp312-win32.whl", hash = "sha256:dc1d33abb8a0d754ea4763bad944fd965d3d95b5baef6b121c0c9013eaf1907d"}, - {file = "zstandard-0.23.0-cp312-cp312-win_amd64.whl", hash = "sha256:64585e1dba664dc67c7cdabd56c1e5685233fbb1fc1966cfba2a340ec0dfff7b"}, - {file = "zstandard-0.23.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:576856e8594e6649aee06ddbfc738fec6a834f7c85bf7cadd1c53d4a58186ef9"}, - {file = "zstandard-0.23.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:38302b78a850ff82656beaddeb0bb989a0322a8bbb1bf1ab10c17506681d772a"}, - {file = "zstandard-0.23.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2240ddc86b74966c34554c49d00eaafa8200a18d3a5b6ffbf7da63b11d74ee2"}, - {file = "zstandard-0.23.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ef230a8fd217a2015bc91b74f6b3b7d6522ba48be29ad4ea0ca3a3775bf7dd5"}, - {file = "zstandard-0.23.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:774d45b1fac1461f48698a9d4b5fa19a69d47ece02fa469825b442263f04021f"}, - {file = "zstandard-0.23.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f77fa49079891a4aab203d0b1744acc85577ed16d767b52fc089d83faf8d8ed"}, - {file = "zstandard-0.23.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ac184f87ff521f4840e6ea0b10c0ec90c6b1dcd0bad2f1e4a9a1b4fa177982ea"}, - {file = "zstandard-0.23.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c363b53e257246a954ebc7c488304b5592b9c53fbe74d03bc1c64dda153fb847"}, - {file = "zstandard-0.23.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e7792606d606c8df5277c32ccb58f29b9b8603bf83b48639b7aedf6df4fe8171"}, - {file = "zstandard-0.23.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a0817825b900fcd43ac5d05b8b3079937073d2b1ff9cf89427590718b70dd840"}, - {file = "zstandard-0.23.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:9da6bc32faac9a293ddfdcb9108d4b20416219461e4ec64dfea8383cac186690"}, - {file = "zstandard-0.23.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:fd7699e8fd9969f455ef2926221e0233f81a2542921471382e77a9e2f2b57f4b"}, - {file = "zstandard-0.23.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d477ed829077cd945b01fc3115edd132c47e6540ddcd96ca169facff28173057"}, - {file = "zstandard-0.23.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa6ce8b52c5987b3e34d5674b0ab529a4602b632ebab0a93b07bfb4dfc8f8a33"}, - {file = "zstandard-0.23.0-cp313-cp313-win32.whl", hash = "sha256:a9b07268d0c3ca5c170a385a0ab9fb7fdd9f5fd866be004c4ea39e44edce47dd"}, - {file = "zstandard-0.23.0-cp313-cp313-win_amd64.whl", hash = "sha256:f3513916e8c645d0610815c257cbfd3242adfd5c4cfa78be514e5a3ebb42a41b"}, - {file = "zstandard-0.23.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2ef3775758346d9ac6214123887d25c7061c92afe1f2b354f9388e9e4d48acfc"}, - {file = "zstandard-0.23.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4051e406288b8cdbb993798b9a45c59a4896b6ecee2f875424ec10276a895740"}, - {file = "zstandard-0.23.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2d1a054f8f0a191004675755448d12be47fa9bebbcffa3cdf01db19f2d30a54"}, - {file = "zstandard-0.23.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f83fa6cae3fff8e98691248c9320356971b59678a17f20656a9e59cd32cee6d8"}, - {file = "zstandard-0.23.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:32ba3b5ccde2d581b1e6aa952c836a6291e8435d788f656fe5976445865ae045"}, - {file = "zstandard-0.23.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f146f50723defec2975fb7e388ae3a024eb7151542d1599527ec2aa9cacb152"}, - {file = "zstandard-0.23.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1bfe8de1da6d104f15a60d4a8a768288f66aa953bbe00d027398b93fb9680b26"}, - {file = "zstandard-0.23.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:29a2bc7c1b09b0af938b7a8343174b987ae021705acabcbae560166567f5a8db"}, - {file = "zstandard-0.23.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:61f89436cbfede4bc4e91b4397eaa3e2108ebe96d05e93d6ccc95ab5714be512"}, - {file = "zstandard-0.23.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:53ea7cdc96c6eb56e76bb06894bcfb5dfa93b7adcf59d61c6b92674e24e2dd5e"}, - {file = "zstandard-0.23.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:a4ae99c57668ca1e78597d8b06d5af837f377f340f4cce993b551b2d7731778d"}, - {file = "zstandard-0.23.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:379b378ae694ba78cef921581ebd420c938936a153ded602c4fea612b7eaa90d"}, - {file = "zstandard-0.23.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:50a80baba0285386f97ea36239855f6020ce452456605f262b2d33ac35c7770b"}, - {file = "zstandard-0.23.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:61062387ad820c654b6a6b5f0b94484fa19515e0c5116faf29f41a6bc91ded6e"}, - {file = "zstandard-0.23.0-cp38-cp38-win32.whl", hash = "sha256:b8c0bd73aeac689beacd4e7667d48c299f61b959475cdbb91e7d3d88d27c56b9"}, - {file = "zstandard-0.23.0-cp38-cp38-win_amd64.whl", hash = "sha256:a05e6d6218461eb1b4771d973728f0133b2a4613a6779995df557f70794fd60f"}, - {file = "zstandard-0.23.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3aa014d55c3af933c1315eb4bb06dd0459661cc0b15cd61077afa6489bec63bb"}, - {file = "zstandard-0.23.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0a7f0804bb3799414af278e9ad51be25edf67f78f916e08afdb983e74161b916"}, - {file = "zstandard-0.23.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb2b1ecfef1e67897d336de3a0e3f52478182d6a47eda86cbd42504c5cbd009a"}, - {file = "zstandard-0.23.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:837bb6764be6919963ef41235fd56a6486b132ea64afe5fafb4cb279ac44f259"}, - {file = "zstandard-0.23.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1516c8c37d3a053b01c1c15b182f3b5f5eef19ced9b930b684a73bad121addf4"}, - {file = "zstandard-0.23.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48ef6a43b1846f6025dde6ed9fee0c24e1149c1c25f7fb0a0585572b2f3adc58"}, - {file = "zstandard-0.23.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11e3bf3c924853a2d5835b24f03eeba7fc9b07d8ca499e247e06ff5676461a15"}, - {file = "zstandard-0.23.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2fb4535137de7e244c230e24f9d1ec194f61721c86ebea04e1581d9d06ea1269"}, - {file = "zstandard-0.23.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8c24f21fa2af4bb9f2c492a86fe0c34e6d2c63812a839590edaf177b7398f700"}, - {file = "zstandard-0.23.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a8c86881813a78a6f4508ef9daf9d4995b8ac2d147dcb1a450448941398091c9"}, - {file = "zstandard-0.23.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:fe3b385d996ee0822fd46528d9f0443b880d4d05528fd26a9119a54ec3f91c69"}, - {file = "zstandard-0.23.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:82d17e94d735c99621bf8ebf9995f870a6b3e6d14543b99e201ae046dfe7de70"}, - {file = "zstandard-0.23.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:c7c517d74bea1a6afd39aa612fa025e6b8011982a0897768a2f7c8ab4ebb78a2"}, - {file = "zstandard-0.23.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1fd7e0f1cfb70eb2f95a19b472ee7ad6d9a0a992ec0ae53286870c104ca939e5"}, - {file = "zstandard-0.23.0-cp39-cp39-win32.whl", hash = "sha256:43da0f0092281bf501f9c5f6f3b4c975a8a0ea82de49ba3f7100e64d422a1274"}, - {file = "zstandard-0.23.0-cp39-cp39-win_amd64.whl", hash = "sha256:f8346bfa098532bc1fb6c7ef06783e969d87a99dd1d2a5a18a892c1d7a643c58"}, - {file = "zstandard-0.23.0.tar.gz", hash = "sha256:b2d8c62d08e7255f68f7a740bae85b3c9b8e5466baa9cbf7f57f1cde0ac6bc09"}, + {file = "zstandard-0.25.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e59fdc271772f6686e01e1b3b74537259800f57e24280be3f29c8a0deb1904dd"}, + {file = "zstandard-0.25.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4d441506e9b372386a5271c64125f72d5df6d2a8e8a2a45a0ae09b03cb781ef7"}, + {file = "zstandard-0.25.0-cp310-cp310-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:ab85470ab54c2cb96e176f40342d9ed41e58ca5733be6a893b730e7af9c40550"}, + {file = "zstandard-0.25.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e05ab82ea7753354bb054b92e2f288afb750e6b439ff6ca78af52939ebbc476d"}, + {file = "zstandard-0.25.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:78228d8a6a1c177a96b94f7e2e8d012c55f9c760761980da16ae7546a15a8e9b"}, + {file = "zstandard-0.25.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:2b6bd67528ee8b5c5f10255735abc21aa106931f0dbaf297c7be0c886353c3d0"}, + {file = "zstandard-0.25.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4b6d83057e713ff235a12e73916b6d356e3084fd3d14ced499d84240f3eecee0"}, + {file = "zstandard-0.25.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9174f4ed06f790a6869b41cba05b43eeb9a35f8993c4422ab853b705e8112bbd"}, + {file = "zstandard-0.25.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:25f8f3cd45087d089aef5ba3848cd9efe3ad41163d3400862fb42f81a3a46701"}, + {file = "zstandard-0.25.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3756b3e9da9b83da1796f8809dd57cb024f838b9eeafde28f3cb472012797ac1"}, + {file = "zstandard-0.25.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:81dad8d145d8fd981b2962b686b2241d3a1ea07733e76a2f15435dfb7fb60150"}, + {file = "zstandard-0.25.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:a5a419712cf88862a45a23def0ae063686db3d324cec7edbe40509d1a79a0aab"}, + {file = "zstandard-0.25.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e7360eae90809efd19b886e59a09dad07da4ca9ba096752e61a2e03c8aca188e"}, + {file = "zstandard-0.25.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:75ffc32a569fb049499e63ce68c743155477610532da1eb38e7f24bf7cd29e74"}, + {file = "zstandard-0.25.0-cp310-cp310-win32.whl", hash = "sha256:106281ae350e494f4ac8a80470e66d1fe27e497052c8d9c3b95dc4cf1ade81aa"}, + {file = "zstandard-0.25.0-cp310-cp310-win_amd64.whl", hash = "sha256:ea9d54cc3d8064260114a0bbf3479fc4a98b21dffc89b3459edd506b69262f6e"}, + {file = "zstandard-0.25.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:933b65d7680ea337180733cf9e87293cc5500cc0eb3fc8769f4d3c88d724ec5c"}, + {file = "zstandard-0.25.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3f79487c687b1fc69f19e487cd949bf3aae653d181dfb5fde3bf6d18894706f"}, + {file = "zstandard-0.25.0-cp311-cp311-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:0bbc9a0c65ce0eea3c34a691e3c4b6889f5f3909ba4822ab385fab9057099431"}, + {file = "zstandard-0.25.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:01582723b3ccd6939ab7b3a78622c573799d5d8737b534b86d0e06ac18dbde4a"}, + {file = "zstandard-0.25.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:5f1ad7bf88535edcf30038f6919abe087f606f62c00a87d7e33e7fc57cb69fcc"}, + {file = "zstandard-0.25.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:06acb75eebeedb77b69048031282737717a63e71e4ae3f77cc0c3b9508320df6"}, + {file = "zstandard-0.25.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9300d02ea7c6506f00e627e287e0492a5eb0371ec1670ae852fefffa6164b072"}, + {file = "zstandard-0.25.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bfd06b1c5584b657a2892a6014c2f4c20e0db0208c159148fa78c65f7e0b0277"}, + {file = "zstandard-0.25.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f373da2c1757bb7f1acaf09369cdc1d51d84131e50d5fa9863982fd626466313"}, + {file = "zstandard-0.25.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6c0e5a65158a7946e7a7affa6418878ef97ab66636f13353b8502d7ea03c8097"}, + {file = "zstandard-0.25.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:c8e167d5adf59476fa3e37bee730890e389410c354771a62e3c076c86f9f7778"}, + {file = "zstandard-0.25.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:98750a309eb2f020da61e727de7d7ba3c57c97cf6213f6f6277bb7fb42a8e065"}, + {file = "zstandard-0.25.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:22a086cff1b6ceca18a8dd6096ec631e430e93a8e70a9ca5efa7561a00f826fa"}, + {file = "zstandard-0.25.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:72d35d7aa0bba323965da807a462b0966c91608ef3a48ba761678cb20ce5d8b7"}, + {file = "zstandard-0.25.0-cp311-cp311-win32.whl", hash = "sha256:f5aeea11ded7320a84dcdd62a3d95b5186834224a9e55b92ccae35d21a8b63d4"}, + {file = "zstandard-0.25.0-cp311-cp311-win_amd64.whl", hash = "sha256:daab68faadb847063d0c56f361a289c4f268706b598afbf9ad113cbe5c38b6b2"}, + {file = "zstandard-0.25.0-cp311-cp311-win_arm64.whl", hash = "sha256:22a06c5df3751bb7dc67406f5374734ccee8ed37fc5981bf1ad7041831fa1137"}, + {file = "zstandard-0.25.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7b3c3a3ab9daa3eed242d6ecceead93aebbb8f5f84318d82cee643e019c4b73b"}, + {file = "zstandard-0.25.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:913cbd31a400febff93b564a23e17c3ed2d56c064006f54efec210d586171c00"}, + {file = "zstandard-0.25.0-cp312-cp312-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:011d388c76b11a0c165374ce660ce2c8efa8e5d87f34996aa80f9c0816698b64"}, + {file = "zstandard-0.25.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6dffecc361d079bb48d7caef5d673c88c8988d3d33fb74ab95b7ee6da42652ea"}, + {file = "zstandard-0.25.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:7149623bba7fdf7e7f24312953bcf73cae103db8cae49f8154dd1eadc8a29ecb"}, + {file = "zstandard-0.25.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:6a573a35693e03cf1d67799fd01b50ff578515a8aeadd4595d2a7fa9f3ec002a"}, + {file = "zstandard-0.25.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5a56ba0db2d244117ed744dfa8f6f5b366e14148e00de44723413b2f3938a902"}, + {file = "zstandard-0.25.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:10ef2a79ab8e2974e2075fb984e5b9806c64134810fac21576f0668e7ea19f8f"}, + {file = "zstandard-0.25.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:aaf21ba8fb76d102b696781bddaa0954b782536446083ae3fdaa6f16b25a1c4b"}, + {file = "zstandard-0.25.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1869da9571d5e94a85a5e8d57e4e8807b175c9e4a6294e3b66fa4efb074d90f6"}, + {file = "zstandard-0.25.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:809c5bcb2c67cd0ed81e9229d227d4ca28f82d0f778fc5fea624a9def3963f91"}, + {file = "zstandard-0.25.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f27662e4f7dbf9f9c12391cb37b4c4c3cb90ffbd3b1fb9284dadbbb8935fa708"}, + {file = "zstandard-0.25.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:99c0c846e6e61718715a3c9437ccc625de26593fea60189567f0118dc9db7512"}, + {file = "zstandard-0.25.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:474d2596a2dbc241a556e965fb76002c1ce655445e4e3bf38e5477d413165ffa"}, + {file = "zstandard-0.25.0-cp312-cp312-win32.whl", hash = "sha256:23ebc8f17a03133b4426bcc04aabd68f8236eb78c3760f12783385171b0fd8bd"}, + {file = "zstandard-0.25.0-cp312-cp312-win_amd64.whl", hash = "sha256:ffef5a74088f1e09947aecf91011136665152e0b4b359c42be3373897fb39b01"}, + {file = "zstandard-0.25.0-cp312-cp312-win_arm64.whl", hash = "sha256:181eb40e0b6a29b3cd2849f825e0fa34397f649170673d385f3598ae17cca2e9"}, + {file = "zstandard-0.25.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ec996f12524f88e151c339688c3897194821d7f03081ab35d31d1e12ec975e94"}, + {file = "zstandard-0.25.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a1a4ae2dec3993a32247995bdfe367fc3266da832d82f8438c8570f989753de1"}, + {file = "zstandard-0.25.0-cp313-cp313-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:e96594a5537722fdfb79951672a2a63aec5ebfb823e7560586f7484819f2a08f"}, + {file = "zstandard-0.25.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bfc4e20784722098822e3eee42b8e576b379ed72cca4a7cb856ae733e62192ea"}, + {file = "zstandard-0.25.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:457ed498fc58cdc12fc48f7950e02740d4f7ae9493dd4ab2168a47c93c31298e"}, + {file = "zstandard-0.25.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:fd7a5004eb1980d3cefe26b2685bcb0b17989901a70a1040d1ac86f1d898c551"}, + {file = "zstandard-0.25.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8e735494da3db08694d26480f1493ad2cf86e99bdd53e8e9771b2752a5c0246a"}, + {file = "zstandard-0.25.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3a39c94ad7866160a4a46d772e43311a743c316942037671beb264e395bdd611"}, + {file = "zstandard-0.25.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:172de1f06947577d3a3005416977cce6168f2261284c02080e7ad0185faeced3"}, + {file = "zstandard-0.25.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3c83b0188c852a47cd13ef3bf9209fb0a77fa5374958b8c53aaa699398c6bd7b"}, + {file = "zstandard-0.25.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1673b7199bbe763365b81a4f3252b8e80f44c9e323fc42940dc8843bfeaf9851"}, + {file = "zstandard-0.25.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:0be7622c37c183406f3dbf0cba104118eb16a4ea7359eeb5752f0794882fc250"}, + {file = "zstandard-0.25.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:5f5e4c2a23ca271c218ac025bd7d635597048b366d6f31f420aaeb715239fc98"}, + {file = "zstandard-0.25.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f187a0bb61b35119d1926aee039524d1f93aaf38a9916b8c4b78ac8514a0aaf"}, + {file = "zstandard-0.25.0-cp313-cp313-win32.whl", hash = "sha256:7030defa83eef3e51ff26f0b7bfb229f0204b66fe18e04359ce3474ac33cbc09"}, + {file = "zstandard-0.25.0-cp313-cp313-win_amd64.whl", hash = "sha256:1f830a0dac88719af0ae43b8b2d6aef487d437036468ef3c2ea59c51f9d55fd5"}, + {file = "zstandard-0.25.0-cp313-cp313-win_arm64.whl", hash = "sha256:85304a43f4d513f5464ceb938aa02c1e78c2943b29f44a750b48b25ac999a049"}, + {file = "zstandard-0.25.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:e29f0cf06974c899b2c188ef7f783607dbef36da4c242eb6c82dcd8b512855e3"}, + {file = "zstandard-0.25.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:05df5136bc5a011f33cd25bc9f506e7426c0c9b3f9954f056831ce68f3b6689f"}, + {file = "zstandard-0.25.0-cp314-cp314-manylinux2010_i686.manylinux_2_12_i686.manylinux_2_28_i686.whl", hash = "sha256:f604efd28f239cc21b3adb53eb061e2a205dc164be408e553b41ba2ffe0ca15c"}, + {file = "zstandard-0.25.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:223415140608d0f0da010499eaa8ccdb9af210a543fac54bce15babbcfc78439"}, + {file = "zstandard-0.25.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2e54296a283f3ab5a26fc9b8b5d4978ea0532f37b231644f367aa588930aa043"}, + {file = "zstandard-0.25.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ca54090275939dc8ec5dea2d2afb400e0f83444b2fc24e07df7fdef677110859"}, + {file = "zstandard-0.25.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e09bb6252b6476d8d56100e8147b803befa9a12cea144bbe629dd508800d1ad0"}, + {file = "zstandard-0.25.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a9ec8c642d1ec73287ae3e726792dd86c96f5681eb8df274a757bf62b750eae7"}, + {file = "zstandard-0.25.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:a4089a10e598eae6393756b036e0f419e8c1d60f44a831520f9af41c14216cf2"}, + {file = "zstandard-0.25.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:f67e8f1a324a900e75b5e28ffb152bcac9fbed1cc7b43f99cd90f395c4375344"}, + {file = "zstandard-0.25.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:9654dbc012d8b06fc3d19cc825af3f7bf8ae242226df5f83936cb39f5fdc846c"}, + {file = "zstandard-0.25.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:4203ce3b31aec23012d3a4cf4a2ed64d12fea5269c49aed5e4c3611b938e4088"}, + {file = "zstandard-0.25.0-cp314-cp314-win32.whl", hash = "sha256:da469dc041701583e34de852d8634703550348d5822e66a0c827d39b05365b12"}, + {file = "zstandard-0.25.0-cp314-cp314-win_amd64.whl", hash = "sha256:c19bcdd826e95671065f8692b5a4aa95c52dc7a02a4c5a0cac46deb879a017a2"}, + {file = "zstandard-0.25.0-cp314-cp314-win_arm64.whl", hash = "sha256:d7541afd73985c630bafcd6338d2518ae96060075f9463d7dc14cfb33514383d"}, + {file = "zstandard-0.25.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b9af1fe743828123e12b41dd8091eca1074d0c1569cc42e6e1eee98027f2bbd0"}, + {file = "zstandard-0.25.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4b14abacf83dfb5c25eb4e4a79520de9e7e205f72c9ee7702f91233ae57d33a2"}, + {file = "zstandard-0.25.0-cp39-cp39-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:a51ff14f8017338e2f2e5dab738ce1ec3b5a851f23b18c1ae1359b1eecbee6df"}, + {file = "zstandard-0.25.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3b870ce5a02d4b22286cf4944c628e0f0881b11b3f14667c1d62185a99e04f53"}, + {file = "zstandard-0.25.0-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:05353cef599a7b0b98baca9b068dd36810c3ef0f42bf282583f438caf6ddcee3"}, + {file = "zstandard-0.25.0-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:19796b39075201d51d5f5f790bf849221e58b48a39a5fc74837675d8bafc7362"}, + {file = "zstandard-0.25.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:53e08b2445a6bc241261fea89d065536f00a581f02535f8122eba42db9375530"}, + {file = "zstandard-0.25.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1f3689581a72eaba9131b1d9bdbfe520ccd169999219b41000ede2fca5c1bfdb"}, + {file = "zstandard-0.25.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d8c56bb4e6c795fc77d74d8e8b80846e1fb8292fc0b5060cd8131d522974b751"}, + {file = "zstandard-0.25.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:53f94448fe5b10ee75d246497168e5825135d54325458c4bfffbaafabcc0a577"}, + {file = "zstandard-0.25.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:c2ba942c94e0691467ab901fc51b6f2085ff48f2eea77b1a48240f011e8247c7"}, + {file = "zstandard-0.25.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:07b527a69c1e1c8b5ab1ab14e2afe0675614a09182213f21a0717b62027b5936"}, + {file = "zstandard-0.25.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:51526324f1b23229001eb3735bc8c94f9c578b1bd9e867a0a646a3b17109f388"}, + {file = "zstandard-0.25.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:89c4b48479a43f820b749df49cd7ba2dbc2b1b78560ecb5ab52985574fd40b27"}, + {file = "zstandard-0.25.0-cp39-cp39-win32.whl", hash = "sha256:1cd5da4d8e8ee0e88be976c294db744773459d51bb32f707a0f166e5ad5c8649"}, + {file = "zstandard-0.25.0-cp39-cp39-win_amd64.whl", hash = "sha256:37daddd452c0ffb65da00620afb8e17abd4adaae6ce6310702841760c2c26860"}, + {file = "zstandard-0.25.0.tar.gz", hash = "sha256:7713e1179d162cf5c7906da876ec2ccb9c3a9dcbdffef0cc7f70c3667a205f0b"}, ] -[package.dependencies] -cffi = {version = ">=1.11", markers = "platform_python_implementation == \"PyPy\""} - [package.extras] -cffi = ["cffi (>=1.11)"] +cffi = ["cffi (>=1.17,<2.0) ; platform_python_implementation != \"PyPy\" and python_version < \"3.14\"", "cffi (>=2.0.0b0) ; platform_python_implementation != \"PyPy\" and python_version >= \"3.14\""] [extras] -multiprocessing = [] +multiprocessing = ["pydantic", "ray"] [metadata] lock-version = "2.1" -python-versions = ">=3.11,<3.13" -content-hash = "8e6477a51ffc6ead00322d565268133f1f37d5a7ba9f3d4818f4751d1d0843f6" +python-versions = ">=3.11,<3.14" +content-hash = "b48d33e2c6e66c3fa8aa5b42db423e8577a44e19090b766f65051f4b9587dde4" diff --git a/pyproject.toml b/pyproject.toml index afbe02f4..d6056275 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,13 +1,33 @@ [tool.poetry] name = "drevalpy" -version = "1.3.1" +version = "1.4.2" description = "Drug response evaluation of cancer cell line drug response models in a fair setting" authors = ["DrEvalPy development team"] license = "GPL-3.0" readme = "README.md" +[tool.poetry.scripts] +drevalpy = "drevalpy.cli:cli_main" +drevalpy-report = "drevalpy.visualization.create_report:main" +drevalpy-viability-preprocess = "drevalpy.cli_preprocess_custom:preprocess_raw_viability" +drevalpy-viability-postprocess = "drevalpy.cli_preprocess_custom:postprocess_viability" +drevalpy-load-response = "drevalpy.cli_run_cv:load_response" +drevalpy-make-cv-pkls = "drevalpy.cli_run_cv:cv_split" +drevalpy-make-hpam-yamls = "drevalpy.cli_run_cv:hpam_split" +drevalpy-train-cv = "drevalpy.cli_run_cv:train_and_predict_cv" +drevalpy-evaluate-hpams = "drevalpy.cli_run_cv:evaluate_and_find_max" +drevalpy-test-cv = "drevalpy.cli_model_testing:train_and_predict_final" +drevalpy-make-randomization-yamls = "drevalpy.cli_model_testing:randomization_split" +drevalpy-make-final-split-pkls = "drevalpy.cli_model_testing:final_split" +drevalpy-tune-final-model = "drevalpy.cli_model_testing:tune_final_model" +drevalpy-train-final-model = "drevalpy.cli_model_testing:train_final_model" +drevalpy-consolidate-single-drug = "drevalpy.cli_model_testing:consolidate_results" +drevalpy-evaluate-test = "drevalpy.cli_model_testing:evaluate_test_results" +drevalpy-collect-results = "drevalpy.cli_model_testing:collect_results" +drevalpy-make-pipeline-report = "drevalpy.visualization.create_report:pipeline_report" + [tool.poetry.dependencies] -python = ">=3.11,<3.13" +python = ">=3.11,<3.14" numpy = ">=1.20" scipy = "*" scikit-learn = ">=1.4" @@ -24,14 +44,22 @@ matplotlib = "*" importlib-resources = "*" scikit-posthocs = "*" curve-curator = "*" +subword-nmt = ">=0.3.8" toml = {version = "^0.10.2"} poetry = "^2.0.1" +starlette = ">=0.49.1" +pydantic = { version = ">=2.5", optional = true } +wandb = "^0.24.0" [tool.poetry.requires-plugins] poetry-plugin-export = ">=1.8" [tool.poetry.extras] -multiprocessing = ["ray"] +multiprocessing = ["ray", "pydantic"] + +[tool.poetry.dependencies.ray] +extras = ["tune"] +version = "*" [tool.poetry.group.development.dependencies] sphinx-autodoc-typehints = "*" @@ -55,6 +83,10 @@ pre-commit-hooks = "*" pyupgrade = "*" pep8-naming = "*" +[tool.poetry.group.torch-cuda] +optional = true +dependencies = { torch = ">=2.1", torch-geometric = "*" } + [tool.black] line-length = 120 diff --git a/requirements.txt b/requirements.txt index 229433fa..d89ba304 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,123 +1,140 @@ -aiohappyeyeballs==2.6.1 ; python_version >= "3.11" and python_version < "3.13" -aiohttp==3.11.18 ; python_version >= "3.11" and python_version < "3.13" -aiosignal==1.3.2 ; python_version >= "3.11" and python_version < "3.13" -anyio==4.9.0 ; python_version >= "3.11" and python_version < "3.13" -attrs==25.3.0 ; python_version >= "3.11" and python_version < "3.13" +aiohappyeyeballs==2.6.1 ; python_version >= "3.11" and python_version < "3.14" +aiohttp==3.13.3 ; python_version >= "3.11" and python_version < "3.14" +aiosignal==1.4.0 ; python_version >= "3.11" and python_version < "3.14" +annotated-types==0.7.0 ; python_version >= "3.11" and python_version < "3.14" +anyio==4.12.1 ; python_version >= "3.11" and python_version < "3.14" +attrs==25.4.0 ; python_version >= "3.11" and python_version < "3.14" backports-tarfile==1.2.0 ; python_version == "3.11" -bokeh==3.4.3 ; python_version >= "3.11" and python_version < "3.13" -build==1.2.2.post1 ; python_version >= "3.11" and python_version < "3.13" -cachecontrol==0.14.3 ; python_version >= "3.11" and python_version < "3.13" -certifi==2025.4.26 ; python_version >= "3.11" and python_version < "3.13" -cffi==1.17.1 ; python_version >= "3.11" and python_version < "3.13" and (sys_platform == "linux" or sys_platform == "darwin" or platform_python_implementation == "PyPy") -charset-normalizer==3.4.2 ; python_version >= "3.11" and python_version < "3.13" -cleo==2.1.0 ; python_version >= "3.11" and python_version < "3.13" -colorama==0.4.6 ; python_version >= "3.11" and python_version < "3.13" and (platform_system == "Windows" or sys_platform == "win32" or os_name == "nt") -contourpy==1.3.2 ; python_version >= "3.11" and python_version < "3.13" -crashtest==0.4.1 ; python_version >= "3.11" and python_version < "3.13" -cryptography==44.0.3 ; python_version >= "3.11" and python_version < "3.13" and sys_platform == "linux" -curve-curator==0.5.1 ; python_version >= "3.11" and python_version < "3.13" -cycler==0.12.1 ; python_version >= "3.11" and python_version < "3.13" -distlib==0.3.9 ; python_version >= "3.11" and python_version < "3.13" -dulwich==0.22.8 ; python_version >= "3.11" and python_version < "3.13" -fastjsonschema==2.21.1 ; python_version >= "3.11" and python_version < "3.13" -filelock==3.18.0 ; python_version >= "3.11" and python_version < "3.13" -findpython==0.6.3 ; python_version >= "3.11" and python_version < "3.13" -flaky==3.8.1 ; python_version >= "3.11" and python_version < "3.13" -fonttools==4.57.0 ; python_version >= "3.11" and python_version < "3.13" -frozenlist==1.6.0 ; python_version >= "3.11" and python_version < "3.13" -fsspec==2025.3.2 ; python_version >= "3.11" and python_version < "3.13" -h11==0.16.0 ; python_version >= "3.11" and python_version < "3.13" -httpcore==1.0.9 ; python_version >= "3.11" and python_version < "3.13" -httpx==0.28.1 ; python_version >= "3.11" and python_version < "3.13" -idna==3.10 ; python_version >= "3.11" and python_version < "3.13" -importlib-metadata==8.7.0 ; python_version == "3.11" -importlib-resources==6.5.2 ; python_version >= "3.11" and python_version < "3.13" -iniconfig==2.1.0 ; python_version >= "3.11" and python_version < "3.13" -installer==0.7.0 ; python_version >= "3.11" and python_version < "3.13" -jaraco-classes==3.4.0 ; python_version >= "3.11" and python_version < "3.13" -jaraco-context==6.0.1 ; python_version >= "3.11" and python_version < "3.13" -jaraco-functools==4.1.0 ; python_version >= "3.11" and python_version < "3.13" -jeepney==0.9.0 ; python_version >= "3.11" and python_version < "3.13" and sys_platform == "linux" -jinja2==3.1.6 ; python_version >= "3.11" and python_version < "3.13" -joblib==1.5.0 ; python_version >= "3.11" and python_version < "3.13" -keyring==25.6.0 ; python_version >= "3.11" and python_version < "3.13" -kiwisolver==1.4.8 ; python_version >= "3.11" and python_version < "3.13" -lightning-utilities==0.14.3 ; python_version >= "3.11" and python_version < "3.13" -markupsafe==3.0.2 ; python_version >= "3.11" and python_version < "3.13" -matplotlib==3.10.1 ; python_version >= "3.11" and python_version < "3.13" -more-itertools==10.7.0 ; python_version >= "3.11" and python_version < "3.13" -mpmath==1.3.0 ; python_version >= "3.11" and python_version < "3.13" -msgpack==1.1.0 ; python_version >= "3.11" and python_version < "3.13" -multidict==6.4.3 ; python_version >= "3.11" and python_version < "3.13" -narwhals==1.38.1 ; python_version >= "3.11" and python_version < "3.13" -networkx==3.4.2 ; python_version >= "3.11" and python_version < "3.13" -numpy==1.26.4 ; python_version >= "3.11" and python_version < "3.13" -nvidia-cublas-cu12==12.6.4.1 ; python_version >= "3.11" and python_version < "3.13" and platform_system == "Linux" and platform_machine == "x86_64" -nvidia-cuda-cupti-cu12==12.6.80 ; python_version >= "3.11" and python_version < "3.13" and platform_system == "Linux" and platform_machine == "x86_64" -nvidia-cuda-nvrtc-cu12==12.6.77 ; python_version >= "3.11" and python_version < "3.13" and platform_system == "Linux" and platform_machine == "x86_64" -nvidia-cuda-runtime-cu12==12.6.77 ; python_version >= "3.11" and python_version < "3.13" and platform_system == "Linux" and platform_machine == "x86_64" -nvidia-cudnn-cu12==9.5.1.17 ; python_version >= "3.11" and python_version < "3.13" and platform_system == "Linux" and platform_machine == "x86_64" -nvidia-cufft-cu12==11.3.0.4 ; python_version >= "3.11" and python_version < "3.13" and platform_system == "Linux" and platform_machine == "x86_64" -nvidia-cufile-cu12==1.11.1.6 ; python_version >= "3.11" and python_version < "3.13" and platform_system == "Linux" and platform_machine == "x86_64" -nvidia-curand-cu12==10.3.7.77 ; python_version >= "3.11" and python_version < "3.13" and platform_system == "Linux" and platform_machine == "x86_64" -nvidia-cusolver-cu12==11.7.1.2 ; python_version >= "3.11" and python_version < "3.13" and platform_system == "Linux" and platform_machine == "x86_64" -nvidia-cusparse-cu12==12.5.4.2 ; python_version >= "3.11" and python_version < "3.13" and platform_system == "Linux" and platform_machine == "x86_64" -nvidia-cusparselt-cu12==0.6.3 ; python_version >= "3.11" and python_version < "3.13" and platform_system == "Linux" and platform_machine == "x86_64" -nvidia-nccl-cu12==2.26.2 ; python_version >= "3.11" and python_version < "3.13" and platform_system == "Linux" and platform_machine == "x86_64" -nvidia-nvjitlink-cu12==12.6.85 ; python_version >= "3.11" and python_version < "3.13" and platform_system == "Linux" and platform_machine == "x86_64" -nvidia-nvtx-cu12==12.6.77 ; python_version >= "3.11" and python_version < "3.13" and platform_system == "Linux" and platform_machine == "x86_64" -packaging==25.0 ; python_version >= "3.11" and python_version < "3.13" -pandas==2.2.3 ; python_version >= "3.11" and python_version < "3.13" -patsy==1.0.1 ; python_version >= "3.11" and python_version < "3.13" -pbs-installer==2025.4.9 ; python_version >= "3.11" and python_version < "3.13" -pillow==11.2.1 ; python_version >= "3.11" and python_version < "3.13" -pkginfo==1.12.1.2 ; python_version >= "3.11" and python_version < "3.13" -platformdirs==4.3.8 ; python_version >= "3.11" and python_version < "3.13" -plotly==6.0.1 ; python_version >= "3.11" and python_version < "3.13" -pluggy==1.5.0 ; python_version >= "3.11" and python_version < "3.13" -poetry-core==2.1.3 ; python_version >= "3.11" and python_version < "3.13" -poetry==2.1.3 ; python_version >= "3.11" and python_version < "3.13" -propcache==0.3.1 ; python_version >= "3.11" and python_version < "3.13" -psutil==7.0.0 ; python_version >= "3.11" and python_version < "3.13" -pycparser==2.22 ; python_version >= "3.11" and python_version < "3.13" and (sys_platform == "linux" or sys_platform == "darwin" or platform_python_implementation == "PyPy") -pyparsing==3.2.3 ; python_version >= "3.11" and python_version < "3.13" -pyproject-hooks==1.2.0 ; python_version >= "3.11" and python_version < "3.13" -pytest==7.4.4 ; python_version >= "3.11" and python_version < "3.13" -python-dateutil==2.9.0.post0 ; python_version >= "3.11" and python_version < "3.13" -pytorch-lightning==2.5.1.post0 ; python_version >= "3.11" and python_version < "3.13" -pytz==2025.2 ; python_version >= "3.11" and python_version < "3.13" -pywin32-ctypes==0.2.3 ; python_version >= "3.11" and python_version < "3.13" and sys_platform == "win32" -pyyaml==6.0.2 ; python_version >= "3.11" and python_version < "3.13" -rapidfuzz==3.13.0 ; python_version >= "3.11" and python_version < "3.13" -requests-toolbelt==1.0.0 ; python_version >= "3.11" and python_version < "3.13" -requests==2.32.3 ; python_version >= "3.11" and python_version < "3.13" -scikit-learn==1.6.1 ; python_version >= "3.11" and python_version < "3.13" -scikit-posthocs==0.11.4 ; python_version >= "3.11" and python_version < "3.13" -scipy==1.15.2 ; python_version >= "3.11" and python_version < "3.13" -seaborn==0.13.2 ; python_version >= "3.11" and python_version < "3.13" -secretstorage==3.3.3 ; python_version >= "3.11" and python_version < "3.13" and sys_platform == "linux" -setuptools==80.3.1 ; python_version >= "3.11" and python_version < "3.13" -shellingham==1.5.4 ; python_version >= "3.11" and python_version < "3.13" -six==1.17.0 ; python_version >= "3.11" and python_version < "3.13" -sniffio==1.3.1 ; python_version >= "3.11" and python_version < "3.13" -statsmodels==0.14.4 ; python_version >= "3.11" and python_version < "3.13" -sympy==1.14.0 ; python_version >= "3.11" and python_version < "3.13" -threadpoolctl==3.6.0 ; python_version >= "3.11" and python_version < "3.13" -toml==0.10.2 ; python_version >= "3.11" and python_version < "3.13" -tomlkit==0.13.2 ; python_version >= "3.11" and python_version < "3.13" -torch-geometric==2.6.1 ; python_version >= "3.11" and python_version < "3.13" -torch==2.7.0 ; python_version >= "3.11" and python_version < "3.13" -torchmetrics==1.7.1 ; python_version >= "3.11" and python_version < "3.13" -tornado==6.4.2 ; python_version >= "3.11" and python_version < "3.13" -tqdm==4.67.1 ; python_version >= "3.11" and python_version < "3.13" -triton==3.3.0 ; python_version >= "3.11" and python_version < "3.13" and platform_system == "Linux" and platform_machine == "x86_64" -trove-classifiers==2025.5.8.13 ; python_version >= "3.11" and python_version < "3.13" -typing-extensions==4.13.2 ; python_version >= "3.11" and python_version < "3.13" -tzdata==2025.2 ; python_version >= "3.11" and python_version < "3.13" -urllib3==2.4.0 ; python_version >= "3.11" and python_version < "3.13" -virtualenv==20.31.1 ; python_version >= "3.11" and python_version < "3.13" -xattr==1.1.4 ; python_version >= "3.11" and python_version < "3.13" and sys_platform == "darwin" -xyzservices==2025.4.0 ; python_version >= "3.11" and python_version < "3.13" -yarl==1.20.0 ; python_version >= "3.11" and python_version < "3.13" -zipp==3.21.0 ; python_version == "3.11" -zstandard==0.23.0 ; python_version >= "3.11" and python_version < "3.13" +bokeh==3.7.3 ; python_version >= "3.11" and python_version < "3.14" +build==1.4.0 ; python_version >= "3.11" and python_version < "3.14" +cachecontrol==0.14.4 ; python_version >= "3.11" and python_version < "3.14" +certifi==2026.1.4 ; python_version >= "3.11" and python_version < "3.14" +cffi==2.0.0 ; python_version >= "3.11" and python_version < "3.14" and (platform_python_implementation != "PyPy" or sys_platform == "darwin") and (sys_platform == "linux" or sys_platform == "darwin") +charset-normalizer==3.4.4 ; python_version >= "3.11" and python_version < "3.14" +cleo==2.1.0 ; python_version >= "3.11" and python_version < "3.14" +click==8.3.1 ; python_version >= "3.11" and python_version < "3.14" +colorama==0.4.6 ; python_version >= "3.11" and python_version < "3.14" and (platform_system == "Windows" or sys_platform == "win32" or os_name == "nt") +contourpy==1.3.3 ; python_version >= "3.11" and python_version < "3.14" +crashtest==0.4.1 ; python_version >= "3.11" and python_version < "3.14" +cryptography==46.0.4 ; python_version >= "3.11" and python_version < "3.14" and sys_platform == "linux" +cuda-bindings==12.9.4 ; python_version >= "3.11" and python_version < "3.14" and platform_system == "Linux" and platform_machine == "x86_64" +cuda-pathfinder==1.3.3 ; python_version >= "3.11" and python_version < "3.14" and platform_system == "Linux" and platform_machine == "x86_64" +curve-curator==0.6.0 ; python_version >= "3.11" and python_version < "3.14" +cycler==0.12.1 ; python_version >= "3.11" and python_version < "3.14" +distlib==0.4.0 ; python_version >= "3.11" and python_version < "3.14" +dulwich==1.0.0 ; python_version >= "3.11" and python_version < "3.14" +fastjsonschema==2.21.2 ; python_version >= "3.11" and python_version < "3.14" +filelock==3.20.3 ; python_version >= "3.11" and python_version < "3.14" +findpython==0.7.1 ; python_version >= "3.11" and python_version < "3.14" +flaky==3.8.1 ; python_version >= "3.11" and python_version < "3.14" +fonttools==4.61.1 ; python_version >= "3.11" and python_version < "3.14" +frozenlist==1.8.0 ; python_version >= "3.11" and python_version < "3.14" +fsspec==2026.2.0 ; python_version >= "3.11" and python_version < "3.14" +gitdb==4.0.12 ; python_version >= "3.11" and python_version < "3.14" +gitpython==3.1.46 ; python_version >= "3.11" and python_version < "3.14" +h11==0.16.0 ; python_version >= "3.11" and python_version < "3.14" +httpcore==1.0.9 ; python_version >= "3.11" and python_version < "3.14" +httpx==0.28.1 ; python_version >= "3.11" and python_version < "3.14" +idna==3.11 ; python_version >= "3.11" and python_version < "3.14" +importlib-metadata==8.7.1 ; python_version == "3.11" +importlib-resources==6.5.2 ; python_version >= "3.11" and python_version < "3.14" +iniconfig==2.3.0 ; python_version >= "3.11" and python_version < "3.14" +installer==0.7.0 ; python_version >= "3.11" and python_version < "3.14" +jaraco-classes==3.4.0 ; python_version >= "3.11" and python_version < "3.14" +jaraco-context==6.1.0 ; python_version >= "3.11" and python_version < "3.14" +jaraco-functools==4.4.0 ; python_version >= "3.11" and python_version < "3.14" +jeepney==0.9.0 ; python_version >= "3.11" and python_version < "3.14" and sys_platform == "linux" +jinja2==3.1.6 ; python_version >= "3.11" and python_version < "3.14" +joblib==1.5.3 ; python_version >= "3.11" and python_version < "3.14" +keyring==25.7.0 ; python_version >= "3.11" and python_version < "3.14" +kiwisolver==1.4.9 ; python_version >= "3.11" and python_version < "3.14" +lightning-utilities==0.15.2 ; python_version >= "3.11" and python_version < "3.14" +markupsafe==3.0.3 ; python_version >= "3.11" and python_version < "3.14" +matplotlib==3.10.8 ; python_version >= "3.11" and python_version < "3.14" +mock==5.2.0 ; python_version >= "3.11" and python_version < "3.14" +more-itertools==10.8.0 ; python_version >= "3.11" and python_version < "3.14" +mpmath==1.3.0 ; python_version >= "3.11" and python_version < "3.14" +msgpack==1.1.2 ; python_version >= "3.11" and python_version < "3.14" +multidict==6.7.1 ; python_version >= "3.11" and python_version < "3.14" +narwhals==2.16.0 ; python_version >= "3.11" and python_version < "3.14" +networkx==3.6.1 ; python_version >= "3.11" and python_version < "3.14" +numpy==2.4.2 ; python_version >= "3.11" and python_version < "3.14" +nvidia-cublas-cu12==12.8.4.1 ; python_version >= "3.11" and python_version < "3.14" and platform_system == "Linux" and platform_machine == "x86_64" +nvidia-cuda-cupti-cu12==12.8.90 ; python_version >= "3.11" and python_version < "3.14" and platform_system == "Linux" and platform_machine == "x86_64" +nvidia-cuda-nvrtc-cu12==12.8.93 ; python_version >= "3.11" and python_version < "3.14" and platform_system == "Linux" and platform_machine == "x86_64" +nvidia-cuda-runtime-cu12==12.8.90 ; python_version >= "3.11" and python_version < "3.14" and platform_system == "Linux" and platform_machine == "x86_64" +nvidia-cudnn-cu12==9.10.2.21 ; python_version >= "3.11" and python_version < "3.14" and platform_system == "Linux" and platform_machine == "x86_64" +nvidia-cufft-cu12==11.3.3.83 ; python_version >= "3.11" and python_version < "3.14" and platform_system == "Linux" and platform_machine == "x86_64" +nvidia-cufile-cu12==1.13.1.3 ; python_version >= "3.11" and python_version < "3.14" and platform_system == "Linux" and platform_machine == "x86_64" +nvidia-curand-cu12==10.3.9.90 ; python_version >= "3.11" and python_version < "3.14" and platform_system == "Linux" and platform_machine == "x86_64" +nvidia-cusolver-cu12==11.7.3.90 ; python_version >= "3.11" and python_version < "3.14" and platform_system == "Linux" and platform_machine == "x86_64" +nvidia-cusparse-cu12==12.5.8.93 ; python_version >= "3.11" and python_version < "3.14" and platform_system == "Linux" and platform_machine == "x86_64" +nvidia-cusparselt-cu12==0.7.1 ; python_version >= "3.11" and python_version < "3.14" and platform_system == "Linux" and platform_machine == "x86_64" +nvidia-nccl-cu12==2.27.5 ; python_version >= "3.11" and python_version < "3.14" and platform_system == "Linux" and platform_machine == "x86_64" +nvidia-nvjitlink-cu12==12.8.93 ; python_version >= "3.11" and python_version < "3.14" and platform_system == "Linux" and platform_machine == "x86_64" +nvidia-nvshmem-cu12==3.4.5 ; python_version >= "3.11" and python_version < "3.14" and platform_system == "Linux" and platform_machine == "x86_64" +nvidia-nvtx-cu12==12.8.90 ; python_version >= "3.11" and python_version < "3.14" and platform_system == "Linux" and platform_machine == "x86_64" +packaging==26.0 ; python_version >= "3.11" and python_version < "3.14" +pandas==2.3.3 ; python_version >= "3.11" and python_version < "3.14" +patsy==1.0.2 ; python_version >= "3.11" and python_version < "3.14" +pbs-installer==2026.2.3 ; python_version >= "3.11" and python_version < "3.14" +pillow==12.1.0 ; python_version >= "3.11" and python_version < "3.14" +pkginfo==1.12.1.2 ; python_version >= "3.11" and python_version < "3.14" +platformdirs==4.5.1 ; python_version >= "3.11" and python_version < "3.14" +plotly==6.5.2 ; python_version >= "3.11" and python_version < "3.14" +pluggy==1.6.0 ; python_version >= "3.11" and python_version < "3.14" +poetry-core==2.3.1 ; python_version >= "3.11" and python_version < "3.14" +poetry==2.3.2 ; python_version >= "3.11" and python_version < "3.14" +propcache==0.4.1 ; python_version >= "3.11" and python_version < "3.14" +protobuf==6.33.5 ; python_version >= "3.11" and python_version < "3.14" +psutil==7.2.2 ; python_version >= "3.11" and python_version < "3.14" +pycparser==3.0 ; python_version >= "3.11" and python_version < "3.14" and implementation_name != "PyPy" and (platform_python_implementation != "PyPy" or sys_platform == "darwin") and (sys_platform == "linux" or sys_platform == "darwin") +pydantic-core==2.41.5 ; python_version >= "3.11" and python_version < "3.14" +pydantic==2.12.5 ; python_version >= "3.11" and python_version < "3.14" +pyparsing==3.3.2 ; python_version >= "3.11" and python_version < "3.14" +pyproject-hooks==1.2.0 ; python_version >= "3.11" and python_version < "3.14" +pytest==7.4.4 ; python_version >= "3.11" and python_version < "3.14" +python-dateutil==2.9.0.post0 ; python_version >= "3.11" and python_version < "3.14" +pytorch-lightning==2.6.1 ; python_version >= "3.11" and python_version < "3.14" +pytz==2025.2 ; python_version >= "3.11" and python_version < "3.14" +pywin32-ctypes==0.2.3 ; python_version >= "3.11" and python_version < "3.14" and sys_platform == "win32" +pyyaml==6.0.3 ; python_version >= "3.11" and python_version < "3.14" +rapidfuzz==3.14.3 ; python_version >= "3.11" and python_version < "3.14" +requests-toolbelt==1.0.0 ; python_version >= "3.11" and python_version < "3.14" +requests==2.32.5 ; python_version >= "3.11" and python_version < "3.14" +scikit-learn==1.8.0 ; python_version >= "3.11" and python_version < "3.14" +scikit-posthocs==0.11.4 ; python_version >= "3.11" and python_version < "3.14" +scipy==1.17.0 ; python_version >= "3.11" and python_version < "3.14" +seaborn==0.13.2 ; python_version >= "3.11" and python_version < "3.14" +secretstorage==3.5.0 ; python_version >= "3.11" and python_version < "3.14" and sys_platform == "linux" +sentry-sdk==2.52.0 ; python_version >= "3.11" and python_version < "3.14" +setuptools==82.0.0 ; python_version >= "3.11" and python_version < "3.14" +shellingham==1.5.4 ; python_version >= "3.11" and python_version < "3.14" +six==1.17.0 ; python_version >= "3.11" and python_version < "3.14" +smmap==5.0.2 ; python_version >= "3.11" and python_version < "3.14" +starlette==0.52.1 ; python_version >= "3.11" and python_version < "3.14" +statsmodels==0.14.6 ; python_version >= "3.11" and python_version < "3.14" +subword-nmt==0.3.8 ; python_version >= "3.11" and python_version < "3.14" +sympy==1.14.0 ; python_version >= "3.11" and python_version < "3.14" +threadpoolctl==3.6.0 ; python_version >= "3.11" and python_version < "3.14" +toml==0.10.2 ; python_version >= "3.11" and python_version < "3.14" +tomlkit==0.14.0 ; python_version >= "3.11" and python_version < "3.14" +torch-geometric==2.7.0 ; python_version >= "3.11" and python_version < "3.14" +torch==2.10.0 ; python_version >= "3.11" and python_version < "3.14" +torchmetrics==1.8.2 ; python_version >= "3.11" and python_version < "3.14" +tornado==6.5.4 ; python_version >= "3.11" and python_version < "3.14" and sys_platform != "emscripten" +tqdm==4.67.3 ; python_version >= "3.11" and python_version < "3.14" +triton==3.6.0 ; python_version >= "3.11" and python_version < "3.14" and platform_system == "Linux" and platform_machine == "x86_64" +trove-classifiers==2026.1.14.14 ; python_version >= "3.11" and python_version < "3.14" +typing-extensions==4.15.0 ; python_version >= "3.11" and python_version < "3.14" +typing-inspection==0.4.2 ; python_version >= "3.11" and python_version < "3.14" +tzdata==2025.3 ; python_version >= "3.11" and python_version < "3.14" +urllib3==2.6.3 ; python_version >= "3.11" and python_version < "3.14" +virtualenv==20.36.1 ; python_version >= "3.11" and python_version < "3.14" +wandb==0.24.2 ; python_version >= "3.11" and python_version < "3.14" +xattr==1.3.0 ; python_version >= "3.11" and python_version < "3.14" and sys_platform == "darwin" +xxhash==3.6.0 ; python_version >= "3.11" and python_version < "3.14" +xyzservices==2025.11.0 ; python_version >= "3.11" and python_version < "3.14" +yarl==1.22.0 ; python_version >= "3.11" and python_version < "3.14" +zipp==3.23.0 ; python_version == "3.11" +zstandard==0.25.0 ; python_version >= "3.11" and python_version < "3.14" diff --git a/run_suite.py b/run_suite.py deleted file mode 100644 index 8677f3fe..00000000 --- a/run_suite.py +++ /dev/null @@ -1,8 +0,0 @@ -"""Main script to run the drug response evaluation pipeline.""" - -from drevalpy.utils import get_parser, main - -if __name__ == "__main__": - # PIPELINE: PARAMS_CHECK - arguments = get_parser().parse_args() - main(arguments) diff --git a/tests/CTRPv2_sample_test/CTRPv2_sample_test_raw.csv b/tests/CTRPv2_sample_test/CTRPv2_sample_test_raw.csv deleted file mode 100644 index 8af4b0a2..00000000 --- a/tests/CTRPv2_sample_test/CTRPv2_sample_test_raw.csv +++ /dev/null @@ -1,113 +0,0 @@ -,dose,response,sample,drug,replicate -8390,0.002,1.0955079850281488,2004,afatinib,1 -8391,0.002,0.9369539186580808,2004,afatinib,2 -8392,0.0041,0.8294920158973823,2004,afatinib,1 -8393,0.0041,0.9105435966967405,2004,afatinib,2 -8394,0.0081,1.0098562889944274,2004,afatinib,1 -8395,0.0081,1.0455847467457329,2004,afatinib,2 -8396,0.016,0.7997383630343657,2004,afatinib,1 -8397,0.016,0.8839888023747461,2004,afatinib,2 -8398,0.032,0.8273100425752845,2004,afatinib,1 -8399,0.032,0.8408964152537145,2004,afatinib,2 -8400,0.065,0.8947769516844151,2004,afatinib,1 -8401,0.065,1.042899400329442,2004,afatinib,2 -8402,0.13,1.0853798270461994,2004,afatinib,1 -8403,0.13,0.917576278566009,2004,afatinib,2 -8404,0.26,0.672870137616213,2004,afatinib,1 -8405,0.26,0.5671884265995343,2004,afatinib,2 -8406,0.52,0.7038305298908818,2004,afatinib,1 -8407,0.52,0.7630238195861496,2004,afatinib,2 -8408,1.0,0.7775460358825583,2004,afatinib,1 -8409,1.0,0.7411821282906099,2004,afatinib,2 -8410,2.1,0.7033915944835474,2004,afatinib,1 -8411,2.1,0.6444766524849002,2004,afatinib,2 -8412,4.2,0.5389786383267785,2004,afatinib,1 -8413,4.2,0.4623316390568497,2004,afatinib,2 -8414,8.3,0.1767766952966369,2004,afatinib,1 -8415,8.3,0.25366563664522,2004,afatinib,2 -8416,17.0,0.0616822841178651,2004,afatinib,1 -8417,17.0,0.0207175900046665,2004,afatinib,2 -8418,33.0,0.0303954671066339,2004,afatinib,1 -8419,33.0,0.0209486342434427,2004,afatinib,2 -8420,66.0,0.0114302439117525,2004,afatinib,1 -8421,66.0,0.0172411521881556,2004,afatinib,2 -10938,0.002,1.0731858962374974,2004,lapatinib,1 -10939,0.002,1.1915999762950489,2004,lapatinib,2 -10940,0.0041,0.9126920057518458,2004,lapatinib,1 -10941,0.0041,1.007025349315796,2004,lapatinib,2 -10942,0.0081,0.7846928718872889,2004,lapatinib,1 -10943,0.0081,1.146232732176102,2004,lapatinib,2 -10944,0.016,1.0700809956566426,2004,lapatinib,1 -10945,0.016,1.163603870176683,2004,lapatinib,2 -10946,0.032,0.9392037019011334,2004,lapatinib,1 -10947,0.032,1.061003929954875,2004,lapatinib,2 -10948,0.065,0.9427714662399728,2004,lapatinib,1 -10949,0.065,0.925240293045082,2004,lapatinib,2 -10950,0.13,0.8787349618012162,2004,lapatinib,1 -10951,0.13,1.0684356354627889,2004,lapatinib,2 -10952,0.26,1.1941631870745897,2004,lapatinib,1 -10953,0.26,1.1120333073823458,2004,lapatinib,2 -10954,0.52,0.8703695562159134,2004,lapatinib,1 -10955,0.52,1.4400311304072253,2004,lapatinib,2 -10956,1.0,1.0551733260722722,2004,lapatinib,1 -10957,1.0,1.0025227668357692,2004,lapatinib,2 -10958,2.1,1.2177348208537884,2004,lapatinib,1 -10959,2.1,1.0322339596514074,2004,lapatinib,2 -10960,4.2,0.8959561310220235,2004,lapatinib,1 -10961,4.2,1.1028984805171396,2004,lapatinib,2 -10962,8.3,0.6167680767672187,2004,lapatinib,1 -10963,8.3,0.5458589076649897,2004,lapatinib,2 -10964,17.0,0.2506941089752694,2004,lapatinib,1 -10965,17.0,0.2895732015486608,2004,lapatinib,2 -10966,33.0,0.02948244534048,2004,lapatinib,1 -10967,33.0,0.0204607097356807,2004,lapatinib,2 -10968,66.0,0.8762412270452258,2004,lapatinib,1 -10969,66.0,0.8129282899636412,2004,lapatinib,2 -12457260,0.002,1.025928365774697,LC1F,afatinib,1 -12457261,0.002,0.6766585868878507,LC1F,afatinib,2 -12457262,0.0041,1.444529833683516,LC1F,afatinib,1 -12457263,0.0041,0.5180272874509741,LC1F,afatinib,2 -12457264,0.0081,0.4746710604752596,LC1F,afatinib,1 -12457265,0.0081,1.1920956518590946,LC1F,afatinib,2 -12457266,0.016,0.875330654293931,LC1F,afatinib,1 -12457267,0.016,0.8643574745348869,LC1F,afatinib,2 -12457268,0.032,0.5833363976667916,LC1F,afatinib,1 -12457269,0.032,0.3755299817352323,LC1F,afatinib,2 -12457270,0.065,0.5921358059268162,LC1F,afatinib,1 -12457271,0.065,0.3942000870281391,LC1F,afatinib,2 -12457272,0.13,0.972668431366438,LC1F,afatinib,1 -12457273,0.13,0.3570009949212661,LC1F,afatinib,2 -12457274,0.26,0.222518933313124,LC1F,afatinib,1 -12457275,0.26,0.4652248288515076,LC1F,afatinib,2 -12457276,0.52,0.4733568156183569,LC1F,afatinib,1 -12457277,0.52,0.7747485205636878,LC1F,afatinib,2 -12457278,1.0,0.874299815700005,LC1F,afatinib,1 -12457279,1.0,0.4989613594995253,LC1F,afatinib,2 -12457280,2.1,0.4266130490560336,LC1F,afatinib,1 -12457281,2.1,0.7323981235615232,LC1F,afatinib,2 -12457282,4.2,0.3612325994808814,LC1F,afatinib,1 -12457283,4.2,0.2242220399155036,LC1F,afatinib,2 -12457284,8.3,0.5695522088920328,LC1F,afatinib,1 -12457285,8.3,0.4490661864419671,LC1F,afatinib,2 -12457286,17.0,0.1640264068239951,LC1F,afatinib,1 -12457287,17.0,0.8542320898502386,LC1F,afatinib,2 -12457288,33.0,0.0726446317198823,LC1F,afatinib,1 -12457289,33.0,0.593286146203179,LC1F,afatinib,2 -12457290,66.0,0.0564454068844888,LC1F,afatinib,1 -12457291,66.0,0.0905588846596799,LC1F,afatinib,2 -12457569,0.002,0.6217471954827811,LC1F,lapatinib,1 -12457570,0.002,0.5792668457284896,LC1F,lapatinib,2 -12457571,0.0041,0.5893105503848409,LC1F,lapatinib,1 -12457572,0.0041,0.421031476804208,LC1F,lapatinib,2 -12457573,0.0081,0.7349917696370422,LC1F,lapatinib,1 -12457574,0.0081,0.6763303497309292,LC1F,lapatinib,2 -12457575,0.016,0.7469585019797846,LC1F,lapatinib,1 -12457576,0.016,0.4986156256760348,LC1F,lapatinib,2 -12457577,0.032,0.6383413456828999,LC1F,lapatinib,1 -12457578,0.032,0.5027105948821384,LC1F,lapatinib,2 -12457579,0.065,0.5600393097018835,LC1F,lapatinib,1 -12457580,0.065,0.3498964663987989,LC1F,lapatinib,2 -12457581,0.13,0.6767993087159954,LC1F,lapatinib,1 -12457582,0.13,0.3866231687276585,LC1F,lapatinib,2 -12457583,0.26,0.4310717725087979,LC1F,lapatinib,1 -12457584,0.26,0.3112185588455425,LC1F,lapatinib,2 diff --git a/tests/conftest.py b/tests/conftest.py index 47774d1b..48fa7703 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,11 +1,108 @@ """Pytest configuration file for the tests directory.""" import os +import pathlib import pytest +from drevalpy.datasets.dataset import DrugResponseDataset +from drevalpy.datasets.loader import load_toyv1, load_toyv2 + @pytest.hookimpl(tryfirst=True) -def pytest_configure() -> None: - """Change to the tests directory.""" +def pytest_configure(config) -> None: + """ + Change to the tests directory and adjust pytest settings. + + :param config: pytest config object + """ os.chdir(os.path.dirname(os.path.abspath(__file__))) + + # Reduce flaky plugin verbosity + config.option.flaky_report = "none" + config.option.tbstyle = "short" + + +@pytest.fixture(scope="session") +def sample_dataset() -> DrugResponseDataset: + """ + Sample dataset for testing individual models. + + :returns: drug_response, cell_line_input, drug_input + """ + path_data = str((pathlib.Path("..") / "data").resolve()) + drug_response = load_toyv1(path_data) + drug_response.remove_nan_responses() + return drug_response + + +@pytest.fixture(scope="session") +def cross_study_dataset() -> DrugResponseDataset: + """ + Sample dataset for testing individual models. + + :returns: drug_response, cell_line_input, drug_input + """ + path_data = str((pathlib.Path("..") / "data").resolve()) + drug_response = load_toyv2(path_data) + drug_response.remove_nan_responses() + return drug_response + + +@pytest.fixture(scope="session", autouse=True) +def ensure_bpe_features() -> None: + """ + Ensure BPE SMILES features are created for TOYv1 and TOYv2 before tests run. + + This fixture runs automatically before any tests to ensure that PharmaFormer + and other models requiring BPE features have the necessary data available. + """ + # Ensure we're in the tests directory (pytest_configure should have done this) + tests_dir = pathlib.Path(__file__).parent.resolve() + path_data = str((tests_dir.parent / "data").resolve()) + + try: + from drevalpy.datasets.featurizer.create_pharmaformer_drug_embeddings import ( + create_pharmaformer_drug_embeddings, + ) + except ImportError: + # If subword-nmt is not installed, skip BPE feature creation + # Tests that require BPE features will fail with a clear error message + return + + # Ensure datasets are loaded first (this will download them if needed) + try: + load_toyv1(path_data) + load_toyv2(path_data) + except Exception as e: + # If dataset loading fails, skip BPE creation + print(f"Warning: Could not load datasets for BPE feature creation: {e}") + return + + # Create BPE features for both TOYv1 and TOYv2 + for dataset_name in ["TOYv1", "TOYv2"]: + dataset_dir = pathlib.Path(path_data) / dataset_name + bpe_smiles_file = dataset_dir / "drug_bpe_smiles.csv" + smiles_file = dataset_dir / "drug_smiles.csv" + + # Only create if it doesn't exist and if drug_smiles.csv exists + if not bpe_smiles_file.exists(): + if not smiles_file.exists(): + print(f"Warning: drug_smiles.csv not found for {dataset_name}, skipping BPE creation") + continue + + try: + print(f"Creating BPE SMILES features for {dataset_name}...") + create_pharmaformer_drug_embeddings( + data_path=path_data, + dataset_name=dataset_name, + num_symbols=10000, + max_length=128, + ) + print(f"BPE SMILES features created for {dataset_name}") + except Exception as e: + # Log but don't fail - let individual tests handle missing features + print(f"Warning: Could not create BPE features for {dataset_name}: {e}") + import traceback + + traceback.print_exc() diff --git a/tests/individual_models/conftest.py b/tests/individual_models/conftest.py deleted file mode 100644 index 7954ebaa..00000000 --- a/tests/individual_models/conftest.py +++ /dev/null @@ -1,34 +0,0 @@ -"""Sample_dataset fixture for testing individual models.""" - -import os - -import pytest - -from drevalpy.datasets.dataset import DrugResponseDataset -from drevalpy.datasets.loader import load_toyv1, load_toyv2 - - -@pytest.fixture(scope="session") -def sample_dataset() -> DrugResponseDataset: - """ - Sample dataset for testing individual models. - - :returns: drug_response, cell_line_input, drug_input - """ - path_data = os.path.join("..", "data") - drug_response = load_toyv1(path_data) - drug_response.remove_nan_responses() - return drug_response - - -@pytest.fixture(scope="session") -def cross_study_dataset() -> DrugResponseDataset: - """ - Sample dataset for testing individual models. - - :returns: drug_response, cell_line_input, drug_input - """ - path_data = "../data" - drug_response = load_toyv2(path_data) - drug_response.remove_nan_responses() - return drug_response diff --git a/tests/individual_models/__init__.py b/tests/models/__init__.py similarity index 100% rename from tests/individual_models/__init__.py rename to tests/models/__init__.py diff --git a/tests/individual_models/test_baselines.py b/tests/models/test_baselines.py similarity index 72% rename from tests/individual_models/test_baselines.py rename to tests/models/test_baselines.py index e4c34c54..4ec601f8 100644 --- a/tests/individual_models/test_baselines.py +++ b/tests/models/test_baselines.py @@ -8,6 +8,7 @@ from sklearn.linear_model import ElasticNet, Ridge from drevalpy.datasets.dataset import DrugResponseDataset, FeatureDataset +from drevalpy.datasets.utils import TISSUE_IDENTIFIER from drevalpy.evaluation import evaluate from drevalpy.experiment import cross_study_prediction from drevalpy.models import ( @@ -16,6 +17,7 @@ NaiveDrugMeanPredictor, NaiveMeanEffectsPredictor, NaivePredictor, + NaiveTissueDrugMeanPredictor, NaiveTissueMeanPredictor, ) from drevalpy.models.baselines.sklearn_models import SklearnModel @@ -29,6 +31,7 @@ "NaiveDrugMeanPredictor", "NaiveCellLineMeanPredictor", "NaiveMeanEffectsPredictor", + "NaiveTissueDrugMeanPredictor", "ElasticNet", "RandomForest", "SVR", @@ -113,6 +116,14 @@ def test_baselines( drug_input, test_mode, ) + elif model_name == "NaiveTissueDrugMeanPredictor": + model = _call_naive_tissue_drug_predictor( + train_dataset, + val_dataset, + cell_line_input, + drug_input, + test_mode, + ) else: model = _call_other_baselines( model_name, @@ -121,6 +132,26 @@ def test_baselines( cell_line_input, drug_input, ) + # Save and load test + with tempfile.TemporaryDirectory() as model_dir: + model.save(model_dir) + loaded_model = MODEL_FACTORY[model_name].load(model_dir) + + preds_before = model.predict( + drug_ids=val_dataset.drug_ids, + cell_line_ids=val_dataset.cell_line_ids, + drug_input=drug_input, + cell_line_input=cell_line_input, + ) + preds_after = loaded_model.predict( + drug_ids=val_dataset.drug_ids, + cell_line_ids=val_dataset.cell_line_ids, + drug_input=drug_input, + cell_line_input=cell_line_input, + ) + assert isinstance(preds_after, np.ndarray) + assert preds_after.shape == preds_before.shape + # make temporary directory with tempfile.TemporaryDirectory() as temp_dir: print(f"Running cross-study prediction for {model_name}") @@ -292,6 +323,7 @@ def _call_other_baselines( """ model_class = cast(type[DRPModel], MODEL_FACTORY[model]) hpams = model_class.get_hyperparameter_set() + if len(hpams) > 2: hpams = hpams[:2] model_instance = model_class() @@ -347,6 +379,7 @@ def _call_naive_mean_effects_predictor( :returns: NaiveMeanEffectsPredictor model """ naive = NaiveMeanEffectsPredictor() + naive.train(output=train_dataset, cell_line_input=cell_line_input, drug_input=drug_input) val_dataset._predictions = naive.predict( cell_line_ids=val_dataset.cell_line_ids, @@ -360,10 +393,84 @@ def _call_naive_mean_effects_predictor( # Check that predictions are within a reasonable range assert np.all(np.isfinite(val_dataset.predictions)) - assert np.all(val_dataset.predictions >= np.min(train_dataset.response)) - assert np.all(val_dataset.predictions <= np.max(train_dataset.response)) + assert np.all( + val_dataset.predictions >= 2 * np.min(train_dataset.response) - 1e-6 + ), f"Predictions below min response: {np.min(val_dataset.predictions)} < {np.min(train_dataset.response)}" + assert np.all(val_dataset.predictions <= 2 * np.max(train_dataset.response) + 1e-6), ( + f"Predictions above max response: {np.max(val_dataset.predictions)} > {np.max(train_dataset.response)}," + f"Problematic cell line: {val_dataset.cell_line_ids[np.argmax(val_dataset.predictions)]}, " + f"Problematic drug: {val_dataset.drug_ids[np.argmax(val_dataset.predictions)]}," + f"CL effect: {naive.cell_line_effects[val_dataset.cell_line_ids[np.argmax(val_dataset.predictions)]]}, " + f"Drug effect: {naive.drug_effects[val_dataset.drug_ids[np.argmax(val_dataset.predictions)]]}, " + f"Dataset mean: {naive.dataset_mean}" + ) metrics = evaluate(val_dataset, metric=["Pearson"]) print(f"{test_mode}: Performance of NaiveMeanEffectsPredictor: PCC = {metrics['Pearson']}") assert metrics["Pearson"] >= -1 # Should be within valid Pearson range return naive + + +def _call_naive_tissue_drug_predictor( + train_dataset: DrugResponseDataset, + val_dataset: DrugResponseDataset, + cell_line_input: FeatureDataset, + drug_input: FeatureDataset, + test_mode: str, +) -> DRPModel: + """ + Test the NaiveTissueDrugMeanPredictor model. + + :param train_dataset: training dataset + :param val_dataset: validation dataset + :param cell_line_input: tissue features + :param drug_input: drug id features + :param test_mode: either LPO, LCO, LDO, or LTO + :returns: NaiveTissueDrugMeanPredictor model + """ + naive = NaiveTissueDrugMeanPredictor() + + naive.train(output=train_dataset, cell_line_input=cell_line_input, drug_input=drug_input) + val_dataset._predictions = naive.predict( + cell_line_ids=val_dataset.cell_line_ids, + drug_ids=val_dataset.drug_ids, + cell_line_input=cell_line_input, + drug_input=drug_input, + ) + + assert val_dataset.predictions is not None + train_mean = train_dataset.response.mean() + assert train_mean == naive.dataset_mean + + # Check that predictions are within a reasonable range + assert np.all(np.isfinite(val_dataset.predictions)) + assert np.all(val_dataset.predictions >= np.min(train_dataset.response) - 1e-6) + assert np.all(val_dataset.predictions <= np.max(train_dataset.response) + 1e-6) + + # If all (tissue, drug) combinations in validation are unseen, predictions should be dataset mean + if val_dataset.tissue is not None: + tissues_val = cell_line_input.get_feature_matrix(view=TISSUE_IDENTIFIER, identifiers=val_dataset.cell_line_ids) + tissues_val_flat = np.array([t.item() if isinstance(t, np.ndarray) else t for t in tissues_val]).flatten() + drugs_val_flat = val_dataset.drug_ids + + # Check if any (tissue, drug) combination from validation was seen in training + seen_combos = set(naive.tissue_drug_means.keys()) + val_combos = {(str(tissue), str(drug)) for tissue, drug in zip(tissues_val_flat, drugs_val_flat, strict=True)} + common_combos = seen_combos & val_combos + + if len(common_combos) == 0: + # All combinations are unseen, should predict dataset mean + assert np.allclose(val_dataset.predictions, train_mean, atol=1e-6) + else: + # At least some combinations were seen, verify they use the correct mean + for combo_key in common_combos: + tissue, drug = combo_key + mask = (tissues_val_flat == tissue) & (drugs_val_flat == drug) + if np.any(mask): + expected_mean = naive.tissue_drug_means[combo_key] + assert np.allclose(val_dataset.predictions[mask], expected_mean, atol=1e-6) + + metrics = evaluate(val_dataset, metric=["Pearson"]) + print(f"{test_mode}: Performance of NaiveTissueDrugMeanPredictor: PCC = {metrics['Pearson']}") + assert metrics["Pearson"] >= -1 # Should be within valid Pearson range + return naive diff --git a/tests/individual_models/test_global_models.py b/tests/models/test_global_models.py similarity index 75% rename from tests/individual_models/test_global_models.py rename to tests/models/test_global_models.py index e8c7edf7..69e20b2b 100644 --- a/tests/individual_models/test_global_models.py +++ b/tests/models/test_global_models.py @@ -4,6 +4,7 @@ import tempfile from typing import cast +import numpy as np import pytest from drevalpy.datasets.dataset import DrugResponseDataset @@ -14,7 +15,18 @@ @pytest.mark.parametrize("test_mode", ["LTO"]) -@pytest.mark.parametrize("model_name", ["SRMF", "DIPK", "SimpleNeuralNetwork", "MultiOmicsNeuralNetwork"]) +@pytest.mark.parametrize( + "model_name", + [ + "DrugGNN", + "ChemBERTaNeuralNetwork", + "SRMF", + "DIPK", + "SimpleNeuralNetwork", + "MultiOmicsNeuralNetwork", + "PharmaFormer", + ], +) def test_global_models( sample_dataset: DrugResponseDataset, model_name: str, @@ -60,9 +72,13 @@ def test_global_models( if model_name == "DIPK": hpam_combi["epochs"] = 1 hpam_combi["epochs_autoencoder"] = 1 + hpam_combi["heads"] = 1 elif model_name in ["SimpleNeuralNetwork", "MultiOmicsNeuralNetwork"]: hpam_combi["units_per_layer"] = [2, 2] hpam_combi["max_epochs"] = 1 + elif model_name == "PharmaFormer": + hpam_combi["epochs"] = 1 + hpam_combi["patience"] = 2 model.build_model(hyperparameters=hpam_combi) with tempfile.TemporaryDirectory() as tmpdirname: @@ -97,6 +113,30 @@ def test_global_models( drug_input=drug_input, cell_line_input=cell_line_input, ) + # Save and load test (should either succeed or raise NotImplementedError) + with tempfile.TemporaryDirectory() as model_dir: + try: + model.save(model_dir) + loaded_model = model_class.load(model_dir) + assert isinstance(loaded_model, DRPModel) + + preds_before = model.predict( + drug_ids=prediction_dataset.drug_ids, + cell_line_ids=prediction_dataset.cell_line_ids, + drug_input=drug_input, + cell_line_input=cell_line_input, + ) + preds_after = loaded_model.predict( + drug_ids=prediction_dataset.drug_ids, + cell_line_ids=prediction_dataset.cell_line_ids, + drug_input=drug_input, + cell_line_input=cell_line_input, + ) + + assert preds_before.shape == preds_after.shape + assert isinstance(preds_after, np.ndarray) + except NotImplementedError: + print(f"{model_name}: save/load not implemented") metrics = evaluate(prediction_dataset, metric=["Pearson"]) print(f"Model: {model_name}, Pearson: {metrics['Pearson']}") diff --git a/tests/individual_models/test_single_drug_models.py b/tests/models/test_single_drug_models.py similarity index 79% rename from tests/individual_models/test_single_drug_models.py rename to tests/models/test_single_drug_models.py index 663f575f..707fcb29 100644 --- a/tests/individual_models/test_single_drug_models.py +++ b/tests/models/test_single_drug_models.py @@ -79,6 +79,7 @@ def test_single_drug_models( hpam_combi["max_depth"] = 2 # reduce test time elif model_name in ["MOLIR", "SuperFELTR"]: hpam_combi["epochs"] = 1 + for random_drug in random_drugs: model = MODEL_FACTORY[model_name]() predictions_path = generate_data_saving_path( @@ -99,6 +100,7 @@ def test_single_drug_models( reduce_to_drugs = np.array(list(set(train_dataset.drug_ids) - {random_drug})) train_dataset.reduce_to(cell_line_ids=None, drug_ids=reduce_to_drugs) train_dataset.shuffle(random_state=42) + test_dataset = train_and_predict( model=model, hpams=hpam_combi, @@ -109,6 +111,35 @@ def test_single_drug_models( response_transformation=None, model_checkpoint_dir="TEMPORARY", ) + + # Save and load test (should either succeed or raise NotImplementedError) + if len(train_dataset) == 0: + print(f"Training dataset empty for drug {random_drug}, continuing with train_and_predict anyway") + else: + with tempfile.TemporaryDirectory() as model_dir: + try: + + model.save(model_dir) + loaded_model = MODEL_FACTORY[model_name].load(model_dir) + + # Re-run prediction with loaded model + preds_original = model.predict( + drug_ids=test_dataset.drug_ids, + cell_line_ids=test_dataset.cell_line_ids, + drug_input=model.load_drug_features("../data", "TOYv1"), + cell_line_input=model.load_cell_line_features("../data", "TOYv1"), + ) + preds_loaded = loaded_model.predict( + drug_ids=test_dataset.drug_ids, + cell_line_ids=test_dataset.cell_line_ids, + drug_input=model.load_drug_features("../data", "TOYv1"), + cell_line_input=model.load_cell_line_features("../data", "TOYv1"), + ) + assert isinstance(preds_loaded, np.ndarray) + assert preds_loaded.shape == preds_original.shape + except NotImplementedError: + print(f"{model_name} does not implement save/load") + cross_study_dataset.remove_nan_responses() parent_dir = str(pathlib.Path(predictions_path).parent) cross_study_prediction( @@ -152,4 +183,4 @@ def test_single_drug_models( ) = evaluate_file(pred_file=file, test_mode=test_mode, model_name=model_name) assert len(overall_eval) == 1 print(f"Performance of {model_name}: PCC = {overall_eval['Pearson'][0]}") - assert overall_eval["Pearson"][0] >= -1.0 + assert overall_eval["Pearson"].iloc[0] >= -1.0 diff --git a/tests/test_available_data.py b/tests/test_available_data.py index 217b9ad1..da072262 100644 --- a/tests/test_available_data.py +++ b/tests/test_available_data.py @@ -1,7 +1,5 @@ """Tests for the available datasets.""" -import tempfile - from drevalpy.datasets import AVAILABLE_DATASETS @@ -14,53 +12,6 @@ def test_factory() -> None: assert "TOYv2" in AVAILABLE_DATASETS assert "CTRPv1" in AVAILABLE_DATASETS assert "CTRPv2" in AVAILABLE_DATASETS - assert len(AVAILABLE_DATASETS) == 7 - - -def test_gdsc1() -> None: - """Test the GDSC1 dataset.""" - tempdir = tempfile.TemporaryDirectory() - gdsc1 = AVAILABLE_DATASETS["GDSC1"](path_data=tempdir.name) - assert len(gdsc1) == 316506 - - -def test_gdsc2(): - """Test the GDSC2 dataset.""" - tempdir = tempfile.TemporaryDirectory() - gdsc2 = AVAILABLE_DATASETS["GDSC2"](path_data=tempdir.name) - assert len(gdsc2) == 234436 - - -def test_ccle(): - """Test the CCLE dataset.""" - tempdir = tempfile.TemporaryDirectory() - ccle = AVAILABLE_DATASETS["CCLE"](path_data=tempdir.name) - assert len(ccle) == 11670 - - -def test_ctrpv1(): - """Test the CTRPv1 dataset.""" - tempdir = tempfile.TemporaryDirectory() - ctrpv1 = AVAILABLE_DATASETS["CTRPv1"](path_data=tempdir.name) - assert len(ctrpv1) == 60757 - - -def test_ctrpv2(): - """Test the CTRPv2 dataset.""" - tempdir = tempfile.TemporaryDirectory() - ctrpv2 = AVAILABLE_DATASETS["CTRPv2"](path_data=tempdir.name) - assert len(ctrpv2) == 395024 - - -def test_toyv1(): - """Test the TOYv1 dataset.""" - tempdir = tempfile.TemporaryDirectory() - toyv1 = AVAILABLE_DATASETS["TOYv1"](path_data=tempdir.name) - assert len(toyv1) == 2711 - - -def test_toyv2(): - """Test the TOYv2 dataset.""" - tempdir = tempfile.TemporaryDirectory() - toyv2 = AVAILABLE_DATASETS["TOYv2"](path_data=tempdir.name) - assert len(toyv2) == 2784 + assert "BeatAML2" in AVAILABLE_DATASETS + assert "PDX_Bruna" in AVAILABLE_DATASETS + assert len(AVAILABLE_DATASETS) == 9 diff --git a/tests/test_cv_split_integrity.py b/tests/test_cv_split_integrity.py new file mode 100644 index 00000000..42609e23 --- /dev/null +++ b/tests/test_cv_split_integrity.py @@ -0,0 +1,427 @@ +"""Tests for CV split integrity - ensuring no data leakage and proper tissue column handling. + +These tests verify the fixes for: + +- GitHub Issue #349: Validation data accumulation bug - where validation data was + inadvertently accumulated into training data across sequential model runs. +- Tissue column preservation when loading splits from CSV files. +""" + +import tempfile +from pathlib import Path + +import numpy as np +import pytest + +from drevalpy.datasets.dataset import DrugResponseDataset +from drevalpy.experiment import get_datasets_from_cv_split +from drevalpy.models import MODEL_FACTORY + + +class TestTissueColumnPreservation: + """Tests for tissue column preservation when saving/loading splits.""" + + def test_tissue_column_preserved_in_csv_roundtrip(self): + """Test that tissue column is preserved when saving and loading from CSV.""" + # Create dataset with tissue information + dataset = DrugResponseDataset( + response=np.array([1.0, 2.0, 3.0, 4.0, 5.0]), + cell_line_ids=np.array(["CL1", "CL2", "CL3", "CL4", "CL5"]), + drug_ids=np.array(["D1", "D2", "D3", "D4", "D5"]), + tissues=np.array(["Breast", "Lung", "Kidney", "Brain", "Liver"]), + ) + + with tempfile.TemporaryDirectory() as temp_dir: + csv_path = Path(temp_dir) / "test_dataset.csv" + dataset.to_csv(csv_path) + + # Load the dataset back - tissue_column now defaults to "tissue" + loaded_dataset = DrugResponseDataset.from_csv(csv_path) + + assert loaded_dataset.tissue is not None, "Tissue column should be loaded" + np.testing.assert_array_equal( + loaded_dataset.tissue, + dataset.tissue, + err_msg="Tissue values should match after roundtrip", + ) + + def test_tissue_column_preserved_in_split_roundtrip(self): + """Test that tissue column is preserved when saving and loading CV splits.""" + # Create dataset with tissue information + dataset = DrugResponseDataset( + response=np.random.random(100), + cell_line_ids=np.repeat([f"CL-{i}" for i in range(10)], 10), + drug_ids=np.tile([f"Drug-{i}" for i in range(10)], 10), + tissues=np.array( + ["Breast", "Lung", "Kidney", "Brain", "Liver", "Pancreas", "Colon", "Skin", "Bone", "Blood"] * 10 + ), + ) + + # Create splits + dataset.split_dataset(n_cv_splits=3, mode="LPO", split_validation=True, validation_ratio=0.5, random_state=42) + + with tempfile.TemporaryDirectory() as temp_dir: + # Save splits + dataset.save_splits(path=temp_dir) + + # Create new dataset and load splits + new_dataset = DrugResponseDataset( + response=np.array([]), + cell_line_ids=np.array([]), + drug_ids=np.array([]), + dataset_name=dataset.dataset_name, + ) + new_dataset.load_splits(path=temp_dir) + + # Check that tissue is preserved in all splits + for i, split in enumerate(new_dataset.cv_splits): + for split_name in ["train", "test", "validation", "validation_es", "early_stopping"]: + if split_name in split: + assert ( + split[split_name].tissue is not None + ), f"Tissue column should be loaded for split {i} {split_name}" + assert len(split[split_name].tissue) == len( + split[split_name].response + ), f"Tissue array length should match response length for split {i} {split_name}" + + def test_from_csv_default_tissue_column(self): + """Test that from_csv defaults to loading tissue column when present.""" + dataset = DrugResponseDataset( + response=np.array([1.0, 2.0, 3.0]), + cell_line_ids=np.array(["CL1", "CL2", "CL3"]), + drug_ids=np.array(["D1", "D2", "D3"]), + tissues=np.array(["Breast", "Lung", "Kidney"]), + ) + + with tempfile.TemporaryDirectory() as temp_dir: + csv_path = Path(temp_dir) / "test.csv" + dataset.to_csv(csv_path) + + # Load without explicitly specifying tissue_column - should still load tissue + loaded = DrugResponseDataset.from_csv(csv_path) + assert loaded.tissue is not None + np.testing.assert_array_equal(loaded.tissue, dataset.tissue) + + def test_from_csv_missing_tissue_column(self): + """Test that from_csv handles missing tissue column gracefully.""" + # Create dataset without tissue + dataset = DrugResponseDataset( + response=np.array([1.0, 2.0, 3.0]), + cell_line_ids=np.array(["CL1", "CL2", "CL3"]), + drug_ids=np.array(["D1", "D2", "D3"]), + ) + + with tempfile.TemporaryDirectory() as temp_dir: + csv_path = Path(temp_dir) / "test.csv" + dataset.to_csv(csv_path) + + # Load - should handle missing tissue column gracefully + loaded = DrugResponseDataset.from_csv(csv_path) + assert loaded.tissue is None + + +class TestCVSplitDataLeakage: + """Tests for ensuring no data leakage between models when using CV splits.""" + + @pytest.fixture + def sample_cv_split(self): + """Create a sample CV split with all dataset types. + + :returns: dictionary with train, validation, validation_es, early_stopping, and test datasets + """ + np.random.seed(42) + n_samples = 100 + + train = DrugResponseDataset( + response=np.random.random(n_samples), + cell_line_ids=np.array([f"CL-{i}" for i in range(n_samples)]), + drug_ids=np.array([f"Drug-{i % 10}" for i in range(n_samples)]), + tissues=np.array([f"Tissue-{i % 5}" for i in range(n_samples)]), + ) + + validation = DrugResponseDataset( + response=np.random.random(30), + cell_line_ids=np.array([f"CL-V{i}" for i in range(30)]), + drug_ids=np.array([f"Drug-{i % 10}" for i in range(30)]), + tissues=np.array([f"Tissue-{i % 5}" for i in range(30)]), + ) + + validation_es = DrugResponseDataset( + response=np.random.random(20), + cell_line_ids=np.array([f"CL-VE{i}" for i in range(20)]), + drug_ids=np.array([f"Drug-{i % 10}" for i in range(20)]), + tissues=np.array([f"Tissue-{i % 5}" for i in range(20)]), + ) + + early_stopping = DrugResponseDataset( + response=np.random.random(10), + cell_line_ids=np.array([f"CL-ES{i}" for i in range(10)]), + drug_ids=np.array([f"Drug-{i % 10}" for i in range(10)]), + tissues=np.array([f"Tissue-{i % 5}" for i in range(10)]), + ) + + test = DrugResponseDataset( + response=np.random.random(25), + cell_line_ids=np.array([f"CL-T{i}" for i in range(25)]), + drug_ids=np.array([f"Drug-{i % 10}" for i in range(25)]), + tissues=np.array([f"Tissue-{i % 5}" for i in range(25)]), + ) + + return { + "train": train, + "validation": validation, + "validation_es": validation_es, + "early_stopping": early_stopping, + "test": test, + } + + def test_get_datasets_returns_copies(self, sample_cv_split): + """Test that get_datasets_from_cv_split returns copies, not references. + + :param sample_cv_split: pytest fixture providing sample CV split data + """ + model_class = MODEL_FACTORY["ElasticNet"] + + train, val, es, test = get_datasets_from_cv_split( + split=sample_cv_split, model_class=model_class, model_name="ElasticNet" + ) + + # Verify that returned datasets are copies, not references + assert train is not sample_cv_split["train"] + assert val is not sample_cv_split["validation"] + assert test is not sample_cv_split["test"] + + # Verify that modifying returned datasets doesn't affect originals + original_train_len = len(sample_cv_split["train"].response) + train.add_rows(val) + + assert ( + len(sample_cv_split["train"].response) == original_train_len + ), "Original train dataset should not be modified when adding rows to the copy" + + def test_get_datasets_returns_copies_with_early_stopping(self, sample_cv_split): + """Test that early stopping datasets are also copies. + + :param sample_cv_split: pytest fixture providing sample CV split data + """ + model_class = MODEL_FACTORY["SimpleNeuralNetwork"] # Uses early stopping + + train, val, es, test = get_datasets_from_cv_split( + split=sample_cv_split, model_class=model_class, model_name="SimpleNeuralNetwork" + ) + + # For early stopping models, validation should be validation_es + assert val is not sample_cv_split["validation_es"] + assert es is not sample_cv_split["early_stopping"] + + # Verify modifications don't affect originals + original_es_len = len(sample_cv_split["early_stopping"].response) + es.remove_rows(np.array([0, 1, 2])) + + assert ( + len(sample_cv_split["early_stopping"].response) == original_es_len + ), "Original early_stopping dataset should not be modified" + + def test_no_validation_accumulation_across_models(self, sample_cv_split): + """Test that validation data is not accumulated into training data across models. + + This is the core test for the bug fix in GitHub Issue #349. + + :param sample_cv_split: pytest fixture providing sample CV split data + """ + original_train_len = len(sample_cv_split["train"].response) + original_val_len = len(sample_cv_split["validation"].response) + + # Simulate running multiple models sequentially + models_to_test = ["ElasticNet", "RandomForest", "ElasticNet"] + + for model_name in models_to_test: + model_class = MODEL_FACTORY[model_name] + + train, val, es, test = get_datasets_from_cv_split( + split=sample_cv_split, model_class=model_class, model_name=model_name + ) + + # Simulate what happens in experiment.py: train.add_rows(val) + train.add_rows(val) + + # After each model, verify original split is unchanged + assert len(sample_cv_split["train"].response) == original_train_len, ( + f"Original train dataset should remain {original_train_len} samples " + f"after processing {model_name}, but got {len(sample_cv_split['train'].response)}" + ) + assert len(sample_cv_split["validation"].response) == original_val_len, ( + f"Original validation dataset should remain {original_val_len} samples " + f"after processing {model_name}" + ) + + def test_no_test_data_leakage(self, sample_cv_split): + """Test that test data is never added to training data. + + :param sample_cv_split: pytest fixture providing sample CV split data + """ + original_test_cell_lines = set(sample_cv_split["test"].cell_line_ids) + + for model_name in ["ElasticNet", "SimpleNeuralNetwork"]: + model_class = MODEL_FACTORY[model_name] + + train, val, es, test = get_datasets_from_cv_split( + split=sample_cv_split, model_class=model_class, model_name=model_name + ) + + # Simulate adding validation to train (as done in experiment.py) + train.add_rows(val) + + # Verify no test cell lines leaked into training + train_cell_lines = set(train.cell_line_ids) + + # Check for intersection (should be empty for our test data setup) + leaked_cell_lines = train_cell_lines & original_test_cell_lines + assert len(leaked_cell_lines) == 0, f"Test cell lines leaked into training: {leaked_cell_lines}" + + def test_datasets_have_correct_sizes(self, sample_cv_split): + """Test that returned datasets have the expected sizes. + + :param sample_cv_split: pytest fixture providing sample CV split data + """ + model_class = MODEL_FACTORY["ElasticNet"] + + train, val, es, test = get_datasets_from_cv_split( + split=sample_cv_split, model_class=model_class, model_name="ElasticNet" + ) + + # For non-early-stopping models, validation should be from "validation" key + assert len(train.response) == len(sample_cv_split["train"].response) + assert len(val.response) == len(sample_cv_split["validation"].response) + assert len(test.response) == len(sample_cv_split["test"].response) + assert es is None # ElasticNet doesn't use early stopping + + def test_datasets_have_correct_sizes_early_stopping(self, sample_cv_split): + """Test that early stopping models get correct dataset sizes. + + :param sample_cv_split: pytest fixture providing sample CV split data + """ + model_class = MODEL_FACTORY["SimpleNeuralNetwork"] + + train, val, es, test = get_datasets_from_cv_split( + split=sample_cv_split, model_class=model_class, model_name="SimpleNeuralNetwork" + ) + + # For early-stopping models, validation should be from "validation_es" key + assert len(train.response) == len(sample_cv_split["train"].response) + assert len(val.response) == len(sample_cv_split["validation_es"].response) + assert len(es.response) == len(sample_cv_split["early_stopping"].response) + assert len(test.response) == len(sample_cv_split["test"].response) + + def test_tissue_preserved_in_get_datasets(self, sample_cv_split): + """Test that tissue information is preserved when getting datasets from split. + + :param sample_cv_split: pytest fixture providing sample CV split data + """ + model_class = MODEL_FACTORY["ElasticNet"] + + train, val, es, test = get_datasets_from_cv_split( + split=sample_cv_split, model_class=model_class, model_name="ElasticNet" + ) + + # Verify tissue is preserved in all returned datasets + assert train.tissue is not None + assert val.tissue is not None + assert test.tissue is not None + + # Verify tissue values match originals + np.testing.assert_array_equal(train.tissue, sample_cv_split["train"].tissue) + np.testing.assert_array_equal(val.tissue, sample_cv_split["validation"].tissue) + np.testing.assert_array_equal(test.tissue, sample_cv_split["test"].tissue) + + +class TestSingleDrugModelSplits: + """Tests specific to single-drug model handling in CV splits.""" + + @pytest.fixture + def sample_cv_split_multi_drug(self): + """Create a sample CV split with multiple drugs for single-drug model testing. + + :returns: dictionary with train, validation, and test datasets containing multiple drugs + """ + np.random.seed(42) + + # Create data with multiple drugs + drugs = ["DrugA", "DrugB", "DrugC"] + n_per_drug = 20 + + train = DrugResponseDataset( + response=np.random.random(n_per_drug * len(drugs)), + cell_line_ids=np.array([f"CL-{i}" for i in range(n_per_drug * len(drugs))]), + drug_ids=np.array(drugs * n_per_drug), + tissues=np.array([f"Tissue-{i % 3}" for i in range(n_per_drug * len(drugs))]), + ) + + validation = DrugResponseDataset( + response=np.random.random(10 * len(drugs)), + cell_line_ids=np.array([f"CL-V{i}" for i in range(10 * len(drugs))]), + drug_ids=np.array(drugs * 10), + tissues=np.array([f"Tissue-{i % 3}" for i in range(10 * len(drugs))]), + ) + + test = DrugResponseDataset( + response=np.random.random(5 * len(drugs)), + cell_line_ids=np.array([f"CL-T{i}" for i in range(5 * len(drugs))]), + drug_ids=np.array(drugs * 5), + tissues=np.array([f"Tissue-{i % 3}" for i in range(5 * len(drugs))]), + ) + + return { + "train": train, + "validation": validation, + "test": test, + } + + def test_single_drug_model_masks_correctly(self, sample_cv_split_multi_drug): + """Test that single-drug models only get data for their specific drug. + + :param sample_cv_split_multi_drug: pytest fixture providing sample CV split with multiple drugs + """ + from drevalpy.models import SINGLE_DRUG_MODEL_FACTORY + + if len(SINGLE_DRUG_MODEL_FACTORY) == 0: + pytest.skip("No single-drug models available") + + # Get the first available single-drug model + model_name = list(SINGLE_DRUG_MODEL_FACTORY.keys())[0] + model_class = SINGLE_DRUG_MODEL_FACTORY[model_name] + + target_drug = "DrugA" + + train, val, es, test = get_datasets_from_cv_split( + split=sample_cv_split_multi_drug, model_class=model_class, model_name=model_name, drug_id=target_drug + ) + + # Verify only target drug data is returned + assert all(drug == target_drug for drug in train.drug_ids) + assert all(drug == target_drug for drug in val.drug_ids) + assert all(drug == target_drug for drug in test.drug_ids) + + def test_single_drug_model_doesnt_modify_original(self, sample_cv_split_multi_drug): + """Test that single-drug model masking doesn't modify original split. + + :param sample_cv_split_multi_drug: pytest fixture providing sample CV split with multiple drugs + """ + from drevalpy.models import SINGLE_DRUG_MODEL_FACTORY + + if len(SINGLE_DRUG_MODEL_FACTORY) == 0: + pytest.skip("No single-drug models available") + + model_name = list(SINGLE_DRUG_MODEL_FACTORY.keys())[0] + model_class = SINGLE_DRUG_MODEL_FACTORY[model_name] + + original_train_len = len(sample_cv_split_multi_drug["train"].response) + original_drugs = set(sample_cv_split_multi_drug["train"].drug_ids) + + train, val, es, test = get_datasets_from_cv_split( + split=sample_cv_split_multi_drug, model_class=model_class, model_name=model_name, drug_id="DrugA" + ) + + # Original should be unchanged + assert len(sample_cv_split_multi_drug["train"].response) == original_train_len + assert set(sample_cv_split_multi_drug["train"].drug_ids) == original_drugs diff --git a/tests/test_dataset.py b/tests/test_dataset.py index 5c0181d6..3f729d9f 100644 --- a/tests/test_dataset.py +++ b/tests/test_dataset.py @@ -21,7 +21,7 @@ def test_response_dataset_load() -> None: """Test if the dataset loads correctly from CSV files.""" # Create a temporary CSV file with mock data data = { - "cell_line_id": np.array([1, 2, 3]), + "cell_line_id": np.array(["1", "2", "3"]), "drug_id": np.array(["A", "B", "C"]), "response": np.array([0.1, 0.2, 0.3]), } @@ -44,17 +44,23 @@ def test_response_dataset_load() -> None: assert np.allclose(dataset.response, data["response"]) -def test_fitting_and_loading_custom_dataset(): - """Test CurveCurator fitting of raw viability dataset and loading it.""" +def test_fitting_and_loading_custom_dataset(sample_dataset: DrugResponseDataset): + """ + Test CurveCurator fitting of raw viability dataset and loading it. + + :param sample_dataset: sample viability dataset + """ + assert sample_dataset.dataset_name == "TOYv1" dataset_name = "CTRPv2_sample_test" + path_data = str((Path("..") / "data").resolve()) load_dataset( dataset_name=dataset_name, - path_data=str(Path(__file__).parent), + path_data=path_data, measure="IC50", curve_curator=True, cores=200, ) - for item in (Path(__file__).parent / dataset_name).iterdir(): + for item in ((Path("..") / "data").resolve() / dataset_name).iterdir(): if item.name == f"{dataset_name}_raw.csv": continue if item.is_dir(): @@ -63,24 +69,69 @@ def test_fitting_and_loading_custom_dataset(): item.unlink() +def _curve_function(x, wanted_ec50, front, back, slope): + return (front - back) / (1 + (x / wanted_ec50) ** slope) + back + + +def test_curvecurator_measures(): + """Tests if CurveCurator computes the response measures correctly.""" + temp_dir = tempfile.TemporaryDirectory() + path_to_temp_dir = Path(temp_dir.name) + Path.mkdir(path_to_temp_dir / "toy_curves", exist_ok=True) + + expected_ec50 = 6 + front = 1.0 + back = 0.3 + slope = 1.5 + xvals = 10 ** np.linspace(np.log10(0.001) - 2, np.log10(1000) + 2, 50) + yvals = _curve_function(xvals, expected_ec50, front, back, slope) + expected_ic50 = expected_ec50 * (((front - back) / (0.5 - back)) - 1) ** (1 / slope) + """ + import matplotlib.pyplot as plt + plt.scatter(xvals, yvals, s=1) + plt.xscale('log') + plt.show() + """ + df = pd.DataFrame({"dose": xvals, "response": yvals, "sample": "cell_line_1", "drug": "drug_1", "replicate": "1"}) + df.to_csv(path_to_temp_dir / "toy_curves" / "toy_curves_raw.csv", index=False) + load_dataset( + dataset_name="toy_curves", + path_data=str(path_to_temp_dir), + measure="IC50", + curve_curator=True, + cores=200, + ) + assert Path(path_to_temp_dir / "toy_curves" / "toy_curves.csv").exists() + df_processed = pd.read_csv(path_to_temp_dir / "toy_curves" / "toy_curves.csv", index_col=0) + # assert that df_processed["EC50_curvecurator"] is approximately expected_ec50 + assert np.isclose(df_processed.loc["cell_line_1|drug_1"]["EC50_curvecurator"], expected_ec50, atol=0.1) + assert np.isclose(df_processed.loc["cell_line_1|drug_1"]["IC50_curvecurator"], expected_ic50, atol=0.1) + assert round(np.log(df_processed.loc["cell_line_1|drug_1"]["IC50_curvecurator"]), 4) == round( + df_processed.loc["cell_line_1|drug_1"]["LN_IC50_curvecurator"], 4 + ) + assert round(-np.log10(df_processed.loc["cell_line_1|drug_1"]["EC50_curvecurator"] * 10**-6), 4) == round( + df_processed.loc["cell_line_1|drug_1"]["pEC50_curvecurator"], 4 + ) + + def test_response_dataset_add_rows() -> None: """Test if the add_rows method works correctly.""" dataset1 = DrugResponseDataset( response=np.array([1, 2, 3]), - cell_line_ids=np.array([101, 102, 103]), + cell_line_ids=np.array(["101", "102", "103"]), drug_ids=np.array(["A", "B", "C"]), tissues=np.array(["Tissue1", "Tissue2", "Tissue3"]), ) dataset2 = DrugResponseDataset( response=np.array([4, 5, 6]), - cell_line_ids=np.array([104, 105, 106]), + cell_line_ids=np.array(["104", "105", "106"]), drug_ids=np.array(["D", "E", "F"]), tissues=np.array(["Tissue4", "Tissue5", "Tissue6"]), ) dataset1.add_rows(dataset2) assert np.array_equal(dataset1.response, np.array([1, 2, 3, 4, 5, 6])) - assert np.array_equal(dataset1.cell_line_ids, np.array([101, 102, 103, 104, 105, 106])) + assert np.array_equal(dataset1.cell_line_ids, np.array(["101", "102", "103", "104", "105", "106"])) assert np.array_equal(dataset1.drug_ids, np.array(["A", "B", "C", "D", "E", "F"])) assert np.array_equal(dataset1.tissue, np.array(["Tissue1", "Tissue2", "Tissue3", "Tissue4", "Tissue5", "Tissue6"])) @@ -89,13 +140,13 @@ def test_remove_nan_responses() -> None: """Test if the remove_nan_responses method works correctly.""" dataset = DrugResponseDataset( response=np.array([1, 2, 3, np.nan, 5, 6]), - cell_line_ids=np.array([101, 102, 103, 104, 105, 106]), + cell_line_ids=np.array(["101", "102", "103", "104", "105", "106"]), drug_ids=np.array(["A", "B", "C", "D", "E", "F"]), tissues=np.array(["Tissue1", "Tissue2", "Tissue3", "Tissue4", "Tissue5", "Tissue6"]), ) dataset.remove_nan_responses() assert np.array_equal(dataset.response, np.array([1, 2, 3, 5, 6])) - assert np.array_equal(dataset.cell_line_ids, np.array([101, 102, 103, 105, 106])) + assert np.array_equal(dataset.cell_line_ids, np.array(["101", "102", "103", "105", "106"])) assert np.array_equal(dataset.drug_ids, np.array(["A", "B", "C", "E", "F"])) assert np.array_equal(dataset.tissue, np.array(["Tissue1", "Tissue2", "Tissue3", "Tissue5", "Tissue6"])) @@ -105,7 +156,7 @@ def test_response_dataset_shuffle(): # Create a dataset with known values dataset = DrugResponseDataset( response=np.array([1, 2, 3, 4, 5, 6]), - cell_line_ids=np.array([101, 102, 103, 104, 105, 106]), + cell_line_ids=np.array(["101", "102", "103", "104", "105", "106"]), drug_ids=np.array(["A", "B", "C", "D", "E", "F"]), tissues=np.array(["Tissue1", "Tissue2", "Tissue3", "Tissue4", "Tissue5", "Tissue6"]), ) @@ -121,7 +172,7 @@ def test_response_dataset_shuffle(): # Check if the response, cell_line_ids, and drug_ids arrays are shuffled assert not np.array_equal(dataset.response, np.array([1, 2, 3, 4, 5, 6])) - assert not np.array_equal(dataset.cell_line_ids, np.array([101, 102, 103, 104, 105, 106])) + assert not np.array_equal(dataset.cell_line_ids, np.array(["101", "102", "103", "104", "105", "106"])) assert not np.array_equal(dataset.drug_ids, np.array(["A", "B", "C", "D", "E", "F"])) assert not np.array_equal( dataset.tissue, np.array(["Tissue1", "Tissue2", "Tissue3", "Tissue4", "Tissue5", "Tissue6"]) @@ -133,20 +184,20 @@ def test_response_data_remove_drugs_and_cell_lines(): # Create a dataset with known values dataset = DrugResponseDataset( response=np.array([1, 2, 3, 4, 5]), - cell_line_ids=np.array([101, 102, 103, 104, 105]), + cell_line_ids=np.array(["101", "102", "103", "104", "105"]), drug_ids=np.array(["A", "B", "C", "D", "E"]), tissues=np.array(["Tissue1", "Tissue2", "Tissue3", "Tissue4", "Tissue5"]), ) # Remove specific drugs and cell lines dataset._remove_drugs(["A", "C"]) - dataset._remove_cell_lines([101, 103]) + dataset._remove_cell_lines(["101", "103"]) # Check if the removed drugs and cell lines are not present in the dataset assert "A" not in dataset.drug_ids assert "C" not in dataset.drug_ids - assert 101 not in dataset.cell_line_ids - assert 103 not in dataset.cell_line_ids + assert "101" not in dataset.cell_line_ids + assert "103" not in dataset.cell_line_ids # Check if the length of response, cell_line_ids, and drug_ids arrays is reduced accordingly assert len(dataset.response) == 3 @@ -159,13 +210,13 @@ def test_remove_rows(): """Test if the remove_rows method works correctly.""" dataset = DrugResponseDataset( response=np.array([1, 2, 3, 4, 5]), - cell_line_ids=np.array([101, 102, 103, 104, 105]), + cell_line_ids=np.array(["101", "102", "103", "104", "105"]), drug_ids=np.array(["A", "B", "C", "D", "E"]), tissues=np.array(["Tissue1", "Tissue2", "Tissue3", "Tissue4", "Tissue5"]), ) dataset.remove_rows(np.array([0, 2, 4])) assert np.array_equal(dataset.response, np.array([2, 4])) - assert np.array_equal(dataset.cell_line_ids, np.array([102, 104])) + assert np.array_equal(dataset.cell_line_ids, np.array(["102", "104"])) assert np.array_equal(dataset.drug_ids, np.array(["B", "D"])) assert np.array_equal(dataset.tissue, np.array(["Tissue2", "Tissue4"])) @@ -182,7 +233,7 @@ def test_response_dataset_reduce_to(): dataset.reduce_to(cell_line_ids=np.array([102, 104]), drug_ids=np.array(["B", "D"])) - assert all(cell_line_id in [102, 104] for cell_line_id in dataset.cell_line_ids) + assert all(cell_line_id in ["102", "104"] for cell_line_id in dataset.cell_line_ids) assert all(drug_id in ["B", "D"] for drug_id in dataset.drug_ids) assert len(dataset.response) == 2 assert len(dataset.cell_line_ids) == 2 @@ -192,7 +243,7 @@ def test_response_dataset_reduce_to(): # Case 2: reduce_to(None, None) does nothing dataset = DrugResponseDataset( response=np.array([1, 2]), - cell_line_ids=np.array([201, 202]), + cell_line_ids=np.array(["201", "202"]), drug_ids=np.array(["X", "Y"]), tissues=np.array(["T1", "T2"]), ) @@ -200,13 +251,13 @@ def test_response_dataset_reduce_to(): dataset.reduce_to(cell_line_ids=None, drug_ids=None) assert len(dataset.response) == 2 - assert set(dataset.cell_line_ids) == {201, 202} + assert set(dataset.cell_line_ids) == {"201", "202"} assert set(dataset.drug_ids) == {"X", "Y"} # Case 3: reduce_to with empty lists removes all dataset = DrugResponseDataset( response=np.array([1, 2]), - cell_line_ids=np.array([301, 302]), + cell_line_ids=np.array(["301", "302"]), drug_ids=np.array(["M", "N"]), tissues=np.array(["T1", "T2"]), ) @@ -332,7 +383,7 @@ def test_transform(resp_transform: str): dataset = DrugResponseDataset( response=np.array([1, 2, 3, 4, 5]), - cell_line_ids=np.array([101, 102, 103, 104, 105]), + cell_line_ids=np.array(["101", "102", "103", "104", "105"]), drug_ids=np.array(["A", "B", "C", "D", "E"]), tissues=np.array(["Tissue1", "Tissue2", "Tissue3", "Tissue4", "Tissue5"]), ) @@ -357,7 +408,7 @@ def test_transform(resp_transform: str): @pytest.fixture -def sample_dataset() -> FeatureDataset: +def sample_feature_dataset() -> FeatureDataset: """ Create a sample FeatureDataset for testing. @@ -449,78 +500,80 @@ def graph_dataset() -> FeatureDataset: return FeatureDataset(features=features, meta_info=meta_info) -def test_feature_dataset_get_ids(sample_dataset: FeatureDataset) -> None: +def test_feature_dataset_get_ids(sample_feature_dataset: FeatureDataset) -> None: """ Test if the get_ids method works correctly. - :param sample_dataset: sample FeatureDataset + :param sample_feature_dataset: sample FeatureDataset """ - assert np.all(sample_dataset.identifiers == ["drug1", "drug2", "drug3", "drug4", "drug5"]) + assert np.all(sample_feature_dataset.identifiers == ["drug1", "drug2", "drug3", "drug4", "drug5"]) -def test_feature_dataset_get_view_names(sample_dataset: FeatureDataset) -> None: +def test_feature_dataset_get_view_names(sample_feature_dataset: FeatureDataset) -> None: """ Test if the get_view_names method works correctly. - :param sample_dataset: sample FeatureDataset + :param sample_feature_dataset: sample FeatureDataset """ - assert sample_dataset.view_names == [ + assert sample_feature_dataset.view_names == [ "fingerprints", "chemical_features", ] -def test_feature_dataset_get_feature_matrix(sample_dataset: FeatureDataset) -> None: +def test_feature_dataset_get_feature_matrix(sample_feature_dataset: FeatureDataset) -> None: """ Test if the get_feature_matrix method works correctly. - :param sample_dataset: sample FeatureDataset + :param sample_feature_dataset: sample FeatureDataset """ - feature_matrix = sample_dataset.get_feature_matrix("fingerprints", np.array(["drug1", "drug2"])) + feature_matrix = sample_feature_dataset.get_feature_matrix("fingerprints", np.array(["drug1", "drug2"])) assert feature_matrix.shape == (2, 5) assert np.allclose( feature_matrix, np.array( [ - sample_dataset.features["drug1"]["fingerprints"], - sample_dataset.features["drug2"]["fingerprints"], + sample_feature_dataset.features["drug1"]["fingerprints"], + sample_feature_dataset.features["drug2"]["fingerprints"], ] ), ) assert isinstance(feature_matrix, np.ndarray) -def test_feature_dataset_copy(sample_dataset: FeatureDataset) -> None: +def test_feature_dataset_copy(sample_feature_dataset: FeatureDataset) -> None: """ Test if the copy method works correctly. - :param sample_dataset: sample FeatureDataset + :param sample_feature_dataset: sample FeatureDataset """ - copied_dataset = sample_dataset.copy() - assert copied_dataset.features["drug1"]["fingerprints"] is not sample_dataset.features["drug1"]["fingerprints"] + copied_dataset = sample_feature_dataset.copy() + assert ( + copied_dataset.features["drug1"]["fingerprints"] is not sample_feature_dataset.features["drug1"]["fingerprints"] + ) assert np.allclose( copied_dataset.features["drug1"]["fingerprints"], - sample_dataset.features["drug1"]["fingerprints"], + sample_feature_dataset.features["drug1"]["fingerprints"], ) - assert copied_dataset.features is not sample_dataset.features + assert copied_dataset.features is not sample_feature_dataset.features copied_dataset.features["drug1"]["fingerprints"] = np.zeros(5) assert not np.allclose( copied_dataset.features["drug1"]["fingerprints"], - sample_dataset.features["drug1"]["fingerprints"], + sample_feature_dataset.features["drug1"]["fingerprints"], ) @flaky(max_runs=25) # permutation randomization might map to the same feature vector for some tries -def test_permutation_randomization(sample_dataset: FeatureDataset) -> None: +def test_permutation_randomization(sample_feature_dataset: FeatureDataset) -> None: """ Test if the permutation randomization works correctly. - :param sample_dataset: sample FeatureDataset + :param sample_feature_dataset: sample FeatureDataset """ views_to_randomize, randomization_type = "fingerprints", "permutation" - start_sample_dataset = sample_dataset.copy() - sample_dataset.randomize_features(views_to_randomize, randomization_type) - for drug, features in sample_dataset.features.items(): + start_sample_dataset = sample_feature_dataset.copy() + sample_feature_dataset.randomize_features(views_to_randomize, randomization_type) + for drug, features in sample_feature_dataset.features.items(): assert not np.allclose( features[views_to_randomize], start_sample_dataset.features[drug][views_to_randomize], @@ -545,16 +598,16 @@ def test_permutation_randomization_graph(graph_dataset: FeatureDataset) -> None: ) -def test_invariant_randomization_array(sample_dataset: FeatureDataset) -> None: +def test_invariant_randomization_array(sample_feature_dataset: FeatureDataset) -> None: """ Test if the invariant randomization works correctly. - :param sample_dataset: sample FeatureDataset + :param sample_feature_dataset: sample FeatureDataset """ views_to_randomize, randomization_type = "chemical_features", "invariant" - start_sample_dataset = sample_dataset.copy() - sample_dataset.randomize_features(views_to_randomize, randomization_type) - for drug, features in sample_dataset.features.items(): + start_sample_dataset = sample_feature_dataset.copy() + sample_feature_dataset.randomize_features(views_to_randomize, randomization_type) + for drug, features in sample_feature_dataset.features.items(): assert not np.allclose( features[views_to_randomize], start_sample_dataset.features[drug][views_to_randomize], @@ -578,72 +631,89 @@ def test_invariant_randomization_graph(graph_dataset: FeatureDataset) -> None: ) -def test_add_features(sample_dataset: FeatureDataset, graph_dataset: FeatureDataset) -> None: +def test_add_features(sample_feature_dataset: FeatureDataset, graph_dataset: FeatureDataset) -> None: """ Test if the add_features method works correctly. - :param sample_dataset: sample FeatureDataset + :param sample_feature_dataset: sample FeatureDataset :param graph_dataset: sample FeatureDataset with molecular graphs """ - sample_dataset.add_features(graph_dataset) - assert sample_dataset.meta_info is not None - assert "molecular_graph" in sample_dataset.meta_info - assert "molecular_graph" in sample_dataset.view_names + sample_feature_dataset.add_features(graph_dataset) + assert sample_feature_dataset.meta_info is not None + assert "molecular_graph" in sample_feature_dataset.meta_info + assert "molecular_graph" in sample_feature_dataset.view_names -def test_feature_dataset_csv_methods(): - """Test the `from_csv` and `to_csv` methods of the FeatureDataset class.""" - # Create temporary directory for testing +def test_feature_dataset_csv_meta_handling(): + """Test `from_csv` and `to_csv` methods with and without meta_info handling.""" with tempfile.TemporaryDirectory() as temp_dir: temp_dir = Path(temp_dir) - # Create test data - test_csv_path = temp_dir / "test_features.csv" - data = { - "id": ["A", "B", "C"], - "feature_1": [1.0, 2.0, 3.0], - "feature_2": [4.0, 5.0, 6.0], - } - df = pd.DataFrame(data) - df.to_csv(test_csv_path, index=False) - - # Test `from_csv` method + # ------------------------------------ + # 0. Create initial test DataFrame/CSV + # ------------------------------------ + df_with_named_cols = pd.DataFrame( + { + "id": ["A", "B", "C"], + "feature_1": [1.0, 2.0, 3.0], + "feature_2": [4.0, 5.0, 6.0], + } + ) + csv_with_meta = temp_dir / "input_with_meta.csv" + df_with_named_cols.to_csv(csv_with_meta, index=False) + view_name = "example_view" - feature_dataset = FeatureDataset.from_csv( - path_to_csv=test_csv_path, id_column="id", view_name=view_name, drop_columns=None + + # ------------------------------------ + # 1. Load from CSV → should extract meta_info + # ------------------------------------ + dataset = FeatureDataset.from_csv( + path_to_csv=csv_with_meta, + id_column="id", + view_name=view_name, ) - # Validate loaded data - assert set(feature_dataset.identifiers) == {"A", "B", "C"}, "Identifiers mismatch." - assert feature_dataset.view_names == [view_name], "View names mismatch." - expected_features = { - "A": {"example_view": np.array([1.0, 4.0])}, - "B": {"example_view": np.array([2.0, 5.0])}, - "C": {"example_view": np.array([3.0, 6.0])}, - } - for identifier in expected_features: - np.testing.assert_array_equal( - feature_dataset.features[identifier][view_name], - expected_features[identifier][view_name], - f"Feature mismatch for identifier {identifier}.", - ) - - # Test `to_csv` method - output_csv_path = temp_dir / "output_features.csv" - feature_dataset.to_csv(path=output_csv_path, id_column="id", view_name=view_name) - - # Validate saved data - saved_df = pd.read_csv(output_csv_path) - expected_saved_df = pd.DataFrame( + assert dataset.meta_info == {view_name: ["feature_1", "feature_2"]} + assert set(dataset.identifiers) == {"A", "B", "C"} + assert dataset.view_names == [view_name] + + # ------------------------------------ + # 2. Save with meta_info → column names should be preserved + # ------------------------------------ + csv_out_with_meta = temp_dir / "saved_with_meta.csv" + dataset.to_csv(csv_out_with_meta, id_column="id", view_name=view_name) + + saved_df = pd.read_csv(csv_out_with_meta) + pd.testing.assert_frame_equal(saved_df, df_with_named_cols, check_dtype=False) + + # ------------------------------------ + # 3. Save without meta_info → fallback to generic feature_0, feature_1 + # ------------------------------------ + dataset._meta_info = {} # simulate no meta info + csv_out_no_meta = temp_dir / "saved_no_meta.csv" + dataset.to_csv(csv_out_no_meta, id_column="id", view_name=view_name) + + df_fallback = pd.DataFrame( { "id": ["A", "B", "C"], "feature_0": [1.0, 2.0, 3.0], "feature_1": [4.0, 5.0, 6.0], } ) - pd.testing.assert_frame_equal( - saved_df, - expected_saved_df, - check_dtype=False, # Relax dtype check for cross-platform compatibility - obj="Saved CSV data", + saved_fallback_df = pd.read_csv(csv_out_no_meta) + pd.testing.assert_frame_equal(saved_fallback_df, df_fallback, check_dtype=False) + + # ------------------------------------ + # 4. Load fallback CSV → should reconstruct generic meta_info + # ------------------------------------ + dataset_fallback = FeatureDataset.from_csv( + path_to_csv=csv_out_no_meta, + id_column="id", + view_name=view_name, + ) + + assert dataset_fallback.meta_info == {view_name: ["feature_0", "feature_1"]} + np.testing.assert_array_equal( + dataset_fallback.features["B"][view_name], + np.array([2.0, 5.0]), ) diff --git a/tests/test_drp_model.py b/tests/test_drp_model.py index 00dabfea..82c035f2 100644 --- a/tests/test_drp_model.py +++ b/tests/test_drp_model.py @@ -1,6 +1,7 @@ """Tests for the DRPModel.""" import os +import pathlib import tempfile from typing import Optional @@ -8,8 +9,8 @@ import pandas as pd import pytest -from drevalpy.datasets.loader import load_toyv1, load_toyv2 -from drevalpy.datasets.utils import TISSUE_IDENTIFIER +from drevalpy.datasets.dataset import DrugResponseDataset +from drevalpy.datasets.utils import DRUG_IDENTIFIER, TISSUE_IDENTIFIER from drevalpy.models import MODEL_FACTORY from drevalpy.models.utils import ( get_multiomics_feature_dataset, @@ -29,6 +30,7 @@ def test_factory() -> None: assert "NaiveDrugMeanPredictor" in MODEL_FACTORY assert "NaiveCellLineMeanPredictor" in MODEL_FACTORY assert "NaiveMeanEffectsPredictor" in MODEL_FACTORY + assert "NaiveTissueDrugMeanPredictor" in MODEL_FACTORY assert "ElasticNet" in MODEL_FACTORY assert "RandomForest" in MODEL_FACTORY assert "SVR" in MODEL_FACTORY @@ -50,7 +52,7 @@ def test_load_cl_ids_from_csv() -> None: temp_file = os.path.join(temp.name, "GDSC1_small", "cell_line_names.csv") with open(temp_file, "w") as f: f.write( - "cellosaurus_id,CELL_LINE_NAME\nCVCL_X481,201T\nCVCL_1045,22Rv1\n" + "cellosaurus_id,cell_line_name\nCVCL_X481,201T\nCVCL_1045,22Rv1\n" "CVCL_1046,23132/87\nCVCL_1798,42-MG-BA\n" ) @@ -66,7 +68,7 @@ def test_load_tissues_from_csv() -> None: temp_file = os.path.join(temp_dir, "GDSC1_small", "cell_line_names.csv") with open(temp_file, "w") as f: f.write( - "cellosaurus_id,CELL_LINE_NAME,tissue\n" + "cellosaurus_id,cell_line_name,tissue\n" "CVCL_X481,201T,lung\n" "CVCL_1045,22Rv1,breast\n" "CVCL_1046,23132/87,liver\n" @@ -97,9 +99,9 @@ def _write_gene_list(temp_dir: tempfile.TemporaryDirectory, gene_list: Optional[ :param temp_dir: temporary directory :param gene_list: either None, landmark_genes, drug_target_genes_all_drugs, or gene_list_paccmann_network_prop """ - os.mkdir(os.path.join(temp_dir.name, "GDSC1_small", "gene_lists")) - temp_file = os.path.join(temp_dir.name, "GDSC1_small", "gene_lists", f"{gene_list}.csv") - if gene_list == "landmark_genes": + os.makedirs(os.path.join(temp_dir.name, "meta", "gene_lists")) + temp_file = os.path.join(temp_dir.name, "meta", "gene_lists", f"{gene_list}.csv") + if gene_list == "landmark_genes_reduced": with open(temp_file, "w") as f: f.write( "Entrez ID,Symbol,Name,Gene Family,Type,RNA-Seq Correlation,RNA-Seq Correlation Self-Rank\n" @@ -121,7 +123,7 @@ def _write_gene_list(temp_dir: tempfile.TemporaryDirectory, gene_list: Optional[ "gene_list", [ None, - "landmark_genes", + "landmark_genes_reduced", "drug_target_genes_all_drugs", "gene_list_paccmann_network_prop", ], @@ -137,7 +139,7 @@ def test_load_and_select_gene_features(gene_list: Optional[str]) -> None: temp_file = os.path.join(temp.name, "GDSC1_small", "gene_expression.csv") with open(temp_file, "w") as f: f.write( - "cellosaurus_id,CELL_LINE_NAME,TSPAN6,TNMD,BRCA1,SCYL3,HDAC1,INSIG1,FOXO3\n" + "cellosaurus_id,cell_line_name,TSPAN6,TNMD,BRCA1,SCYL3,HDAC1,INSIG1,FOXO3\n" "CVCL_1104,CAL-120,7.632023171463389,2.9645851205892404,10.3795526353077,3.61479404843988," "3.38068143582194,7.09344749430946,3.0222634357817597\n" "CVCL_1174,DMS 114,7.54867116637172,2.77771614989839,11.807341248845802,4.066886747621," @@ -163,7 +165,7 @@ def test_load_and_select_gene_features(gene_list: Optional[str]) -> None: assert len(gene_features_gdsc1.meta_info["gene_expression"]) == 7 gene_names = ["TSPAN6", "TNMD", "BRCA1", "SCYL3", "HDAC1", "INSIG1", "FOXO3"] assert np.all(gene_features_gdsc1.meta_info["gene_expression"] == gene_names) - elif gene_list == "landmark_genes": + elif gene_list == "landmark_genes_reduced": assert len(gene_features_gdsc1.features) == 5 assert gene_features_gdsc1.meta_info is not None assert len(gene_features_gdsc1.meta_info["gene_expression"]) == 4 @@ -181,12 +183,18 @@ def test_load_and_select_gene_features(gene_list: Optional[str]) -> None: assert "The following genes are missing from the dataset GDSC1_small" in str(valerr.value) -def test_order_load_and_select_gene_features() -> None: - """Test the order of the features after loading and reducing gene features. it should be maintained.""" - path_data = os.path.join("..", "data") +def test_order_load_and_select_gene_features( + sample_dataset: DrugResponseDataset, cross_study_dataset: DrugResponseDataset +) -> None: + """ + Test the order of the features after loading and reducing gene features. it should be maintained. - load_toyv1(path_data) - load_toyv2(path_data) + :param sample_dataset: TOYv1 dataset + :param cross_study_dataset: TOYv2 dataset + """ + path_data = str((pathlib.Path("..") / "data").resolve()) + assert sample_dataset.dataset_name == "TOYv1" + assert cross_study_dataset.dataset_name == "TOYv2" gene_list = "gene_expression_intersection" a = load_and_select_gene_features("gene_expression", gene_list, path_data, "TOYv1") b = load_and_select_gene_features("gene_expression", gene_list, path_data, "TOYv2") @@ -216,7 +224,7 @@ def test_load_drug_ids_from_csv() -> None: os.mkdir(os.path.join(temp.name, "GDSC1_small")) temp_file = os.path.join(temp.name, "GDSC1_small", "drug_names.csv") with open(temp_file, "w") as f: - f.write("DRUG_NAME\n(5Z)-7-Oxozeaenol\n5-Fluorouracil\nA-443654\nA-770041\n") + f.write(f"{DRUG_IDENTIFIER}\n(5Z)-7-Oxozeaenol\n5-Fluorouracil\nA-443654\nA-770041\n") drug_ids_gdsc1 = load_drug_ids_from_csv(temp.name, "GDSC1_small") assert len(drug_ids_gdsc1.features) == 4 assert drug_ids_gdsc1.identifiers[0] == "(5Z)-7-Oxozeaenol" @@ -258,7 +266,7 @@ def test_load_drugs_from_fingerprints() -> None: "gene_list", [ None, - "landmark_genes", + "landmark_genes_reduced", "drug_target_genes_all_drugs", "gene_list_paccmann_network_prop", ], @@ -275,7 +283,7 @@ def test_get_multiomics_feature_dataset(gene_list: Optional[str]) -> None: temp_file = os.path.join(temp.name, "GDSC1_small", "gene_expression.csv") with open(temp_file, "w") as f: f.write( - "cellosaurus_id,CELL_LINE_NAME,TSPAN6,TNMD,BRCA1,SCYL3,HDAC1,INSIG1,FOXO3\n" + "cellosaurus_id,cell_line_name,TSPAN6,TNMD,BRCA1,SCYL3,HDAC1,INSIG1,FOXO3\n" "CVCL_1104,CAL-120,7.632023171463389,2.9645851205892404,10.3795526353077,3.61479404843988," "3.38068143582194,7.09344749430946,3.0222634357817597\n" "CVCL_1174,DMS 114,7.54867116637172,2.77771614989839,11.807341248845802,4.066886747621," @@ -292,7 +300,7 @@ def test_get_multiomics_feature_dataset(gene_list: Optional[str]) -> None: temp_file = os.path.join(temp.name, "GDSC1_small", "methylation.csv") with open(temp_file, "w") as f: f.write( - "cellosaurus_id,CELL_LINE_NAME,chr1:10003165-10003585,chr1:100315420-100316009," + "cellosaurus_id,cell_line_name,chr1:10003165-10003585,chr1:100315420-100316009," "chr1:100435297-100436070,chr1:100503482-100504404,chr1:10057121-10058108," "chr11:107728949-107729586,chr11:107798958-107799980\n" "CVCL_1045,22Rv1,0.192212286,0.20381998,0.277913619,0.1909300789999999,0.544058696\n" @@ -304,7 +312,7 @@ def test_get_multiomics_feature_dataset(gene_list: Optional[str]) -> None: temp_file = os.path.join(temp.name, "GDSC1_small", "mutations.csv") with open(temp_file, "w") as f: f.write( - "cellosaurus_id,CELL_LINE_NAME,TSPAN6,TNMD,BRCA1,SCYL3,HDAC1,INSIG1,FOXO3\n" + "cellosaurus_id,cell_line_name,TSPAN6,TNMD,BRCA1,SCYL3,HDAC1,INSIG1,FOXO3\n" "CVCL_X481,201T,False,False,False,False,False,True,True\n" "CVCL_1045,22Rv1,False,True,False,True,False,False,True\n" "CVCL_1046,23132/87,False,False,True,True,False,False,False\n" @@ -315,7 +323,7 @@ def test_get_multiomics_feature_dataset(gene_list: Optional[str]) -> None: temp_file = os.path.join(temp.name, "GDSC1_small", "copy_number_variation_gistic.csv") with open(temp_file, "w") as f: f.write( - "cellosaurus_id,CELL_LINE_NAME,TSPAN6,TNMD,BRCA1,SCYL3,HDAC1,INSIG1,FOXO3\n" + "cellosaurus_id,cell_line_name,TSPAN6,TNMD,BRCA1,SCYL3,HDAC1,INSIG1,FOXO3\n" "CVCL_X481,201T,0.0,0.0,-1.0,0.0,0.0,1.0,-1.0\n" "CVCL_1762,TE-12,-1.0,-1.0,0.0,1.0,1.0,0.0,0.0\n" "CVCL_1104,CAL-120,0.0,0.0,0.0,-1.0,-1.0,1.0,0.0\n" @@ -357,7 +365,7 @@ def test_get_multiomics_feature_dataset(gene_list: Optional[str]) -> None: assert len(dataset.meta_info[key]) == 7 else: feature_names: list[str] = [] - if gene_list == "landmark_genes": + if gene_list == "landmark_genes_reduced": assert dataset.meta_info is not None for key in dataset.meta_info: if key == "methylation": diff --git a/tests/test_featurizers.py b/tests/test_featurizers.py new file mode 100644 index 00000000..a2db9b69 --- /dev/null +++ b/tests/test_featurizers.py @@ -0,0 +1,157 @@ +"""Tests for drug featurizers.""" + +import sys +from unittest.mock import patch + +import pandas as pd +import torch + + +def test_chemberta_featurizer(tmp_path): + """ + Test ChemBERTa featurizer end-to-end. + + :param tmp_path: Temporary path provided by pytest. + """ + try: + import drevalpy.datasets.featurizer.create_chemberta_drug_embeddings as chemberta + except ImportError: + print("transformers package not installed; skipping ChemBERTa featurizer test.") + return + dataset = "testset" + data_dir = tmp_path / dataset + data_dir.mkdir(parents=True) + + # fake input CSV + df = pd.DataFrame({"pubchem_id": ["X1"], "canonical_smiles": ["CCO"]}) + (data_dir / "drug_smiles.csv").write_text(df.to_csv(index=False)) + + fake_embedding = [1.0, 2.0, 3.0] + + with patch.object(chemberta, "_smiles_to_chemberta", return_value=fake_embedding), patch.object( + sys, "argv", ["prog", dataset, "--data_path", str(tmp_path)] + ): + + chemberta.main() + + out_file = data_dir / "drug_chemberta_embeddings.csv" + assert out_file.exists() + + df_out = pd.read_csv(out_file) + assert df_out.pubchem_id.tolist() == ["X1"] + assert df_out.iloc[0, 1:].tolist() == fake_embedding + + +def test_graph_featurizer(tmp_path): + """ + Test graph featurizer end-to-end. + + :param tmp_path: Temporary path provided by pytest. + """ + try: + import drevalpy.datasets.featurizer.create_drug_graphs as graphs + except ImportError: + print("rdkit package not installed; skipping graph featurizer test.") + return + dataset = "testset" + data_dir = tmp_path / dataset + data_dir.mkdir(parents=True) + + # write minimal SMILES CSV + df = pd.DataFrame({"pubchem_id": ["D1"], "canonical_smiles": ["CCO"]}) + (data_dir / "drug_smiles.csv").write_text(df.to_csv(index=False)) + + # run main exactly as the script would + sys.argv = ["prog", dataset, "--data_path", str(tmp_path)] + graphs.main() + + # expected output file + out_file = data_dir / "drug_graphs" / "D1.pt" + assert out_file.exists() + + +def test_molgnet_featurizer(tmp_path): + """ + Test MolGNet featurizer end-to-end. + + :param tmp_path: Temporary path provided by pytest. + """ + try: + import drevalpy.datasets.featurizer.create_molgnet_embeddings as molg + except ImportError: + print("rdkit package not installed; skipping molgnet featurizer test.") + return + ds = "testset" + ds_dir = tmp_path / ds + ds_dir.mkdir(parents=True) + + # minimal SMILES CSV + df = pd.DataFrame({"pubchem_id": ["D1"], "canonical_smiles": ["CCO"]}) + (ds_dir / "drug_smiles.csv").write_text(df.to_csv(index=False)) + + with ( + # we dont need real model weights for this test, takes too long to load + patch("drevalpy.datasets.featurizer.create_molgnet_embeddings.torch.load", return_value={}), + # prevent load_state_dict from complaining + patch.object(molg.MolGNet, "load_state_dict", return_value=None), + # cheap forward pass + patch.object(molg.MolGNet, "forward", return_value=torch.zeros((1, 768))), + # avoid writing pickles + patch.object(molg.pickle, "dump", return_value=None), + # simulate CLI + patch.object( + sys, + "argv", + ["prog", ds, "--data_path", str(tmp_path), "--checkpoint", "MolGNet.pt"], + ), + ): + args = molg.parse_args() + molg.run(args) + + # verify outputs + assert (ds_dir / "DIPK_features/Drugs" / "MolGNet_D1.csv").exists() + + +def test_bpe_smiles_featurizer(tmp_path): + """ + Test BPE SMILES featurizer end-to-end. + + :param tmp_path: Temporary path provided by pytest. + """ + try: + import drevalpy.datasets.featurizer.create_pharmaformer_drug_embeddings as bpe_feat + except ImportError: + print("subword-nmt package not installed; skipping BPE SMILES featurizer test.") + return + dataset = "testset" + data_dir = tmp_path / dataset + data_dir.mkdir(parents=True) + + # write minimal SMILES CSV with multiple SMILES for BPE learning + df = pd.DataFrame( + { + "pubchem_id": ["D1", "D2", "D3", "D4", "D5"], + "canonical_smiles": ["CCO", "CC(=O)O", "c1ccccc1", "CCN(CC)CC", "C1CCC(CC1)O"], + } + ) + (data_dir / "drug_smiles.csv").write_text(df.to_csv(index=False)) + + # run main exactly as the script would + sys.argv = ["prog", dataset, "--data_path", str(tmp_path), "--num-symbols", "100", "--max-length", "128"] + bpe_feat.main() + + # expected output files + out_file = data_dir / "drug_bpe_smiles.csv" + bpe_codes_file = data_dir / "bpe.codes" + assert out_file.exists() + assert bpe_codes_file.exists() + + # verify output format + df_out = pd.read_csv(out_file) + assert "pubchem_id" in df_out.columns + assert df_out.pubchem_id.tolist() == ["D1", "D2", "D3", "D4", "D5"] + # Should have 128 feature columns + feature_cols = [col for col in df_out.columns if col.startswith("feature_")] + assert len(feature_cols) == 128 + # Values should be numeric (character ordinals, may be stored as float in CSV) + assert pd.api.types.is_numeric_dtype(df_out[feature_cols[0]]) diff --git a/tests/test_hpam_tune.py b/tests/test_hpam_tune.py new file mode 100644 index 00000000..ccbcd8e0 --- /dev/null +++ b/tests/test_hpam_tune.py @@ -0,0 +1,71 @@ +"""test hpam tune.""" + +import numpy as np + +from drevalpy import experiment +from drevalpy.datasets.dataset import DrugResponseDataset +from drevalpy.models import MODEL_FACTORY + + +def test_hpam_tune(tmp_path): + """ + Test hpam_tune with a toy dataset and ElasticNet model. + + :param tmp_path: pytest temporary path fixture + """ + hpam_set = [ + {"alpha": [1.0, 2.0], "l1_ratio": [0.2, 0.8]}, + ] + + model = MODEL_FACTORY["ElasticNet"]() + cell_line_input = model.load_cell_line_features(data_path="../data", dataset_name="TOYv1") + drug_input = model.load_drug_features(data_path="../data", dataset_name="TOYv1") + + valid_cell_lines = list(cell_line_input.identifiers)[:2] + valid_drugs = list(drug_input.identifiers)[:2] + responses = np.array([1.0, 2.0, 3.0, 4.0], dtype=float) + cell_line_ids = np.array([valid_cell_lines[0], valid_cell_lines[0], valid_cell_lines[1], valid_cell_lines[1]]) + drug_ids = np.array([valid_drugs[0], valid_drugs[1], valid_drugs[0], valid_drugs[1]]) + train_dataset = DrugResponseDataset( + response=responses, + cell_line_ids=cell_line_ids, + drug_ids=drug_ids, + dataset_name="TOYv1", + ) + val_dataset = DrugResponseDataset( + response=responses.copy(), + cell_line_ids=cell_line_ids.copy(), + drug_ids=drug_ids.copy(), + dataset_name="TOYv1", + ) + + model = MODEL_FACTORY["ElasticNet"]() + cell_line_input = model.load_cell_line_features(data_path="../data", dataset_name="TOYv1") + drug_input = model.load_drug_features(data_path="../data", dataset_name="TOYv1") + + cell_lines_to_keep = cell_line_input.identifiers + drugs_to_keep = drug_input.identifiers + + len_train_before = len(train_dataset) + len_val_before = len(val_dataset) + train_dataset.reduce_to(cell_line_ids=cell_lines_to_keep, drug_ids=drugs_to_keep) + val_dataset.reduce_to(cell_line_ids=cell_lines_to_keep, drug_ids=drugs_to_keep) + print(f"Reduced training dataset from {len_train_before} to {len(train_dataset)}") + print(f"Reduced val dataset from {len_val_before} to {len(val_dataset)}") + + best = experiment.hpam_tune( + model=model, + train_dataset=train_dataset, + validation_dataset=val_dataset, + early_stopping_dataset=None, + hpam_set=hpam_set, + response_transformation=None, + metric="RMSE", + path_data="../data", + model_checkpoint_dir="TEMPORARY", + split_index=None, + wandb_project=None, + wandb_base_config=None, + ) + + assert best in hpam_set diff --git a/tests/test_hpam_tune_raytune.py b/tests/test_hpam_tune_raytune.py new file mode 100644 index 00000000..a7c156af --- /dev/null +++ b/tests/test_hpam_tune_raytune.py @@ -0,0 +1,62 @@ +"""test hpam tune with multiprocessing (raytune).""" + +import numpy as np + +from drevalpy import experiment +from drevalpy.datasets.dataset import DrugResponseDataset +from drevalpy.models import MODEL_FACTORY + + +def test_hpam_tune_raytune(tmp_path): + """ + Test hpam_tune_raytune with a toy dataset and ElasticNet model. + + :param tmp_path: pytest temporary path fixture + """ + try: + import ray # noqa: F401 + except ImportError: + print("Ray is not installed, skipping test_hpam_tune_raytune.") + return + hpam_set = [ + {"alpha": 1.0, "l1_ratio": 0.0}, + {"alpha": 2.5, "l1_ratio": 0.5}, + {"alpha": 5.0, "l1_ratio": 1.0}, + ] + + model = MODEL_FACTORY["ElasticNet"]() + cell_line_input = model.load_cell_line_features(data_path="../data", dataset_name="TOYv1") + drug_input = model.load_drug_features(data_path="../data", dataset_name="TOYv1") + + valid_cell_lines = list(cell_line_input.identifiers)[:2] + valid_drugs = list(drug_input.identifiers)[:2] + responses = np.array([1.0, 2.0, 3.0, 4.0], dtype=float) + cell_line_ids = np.array([valid_cell_lines[0], valid_cell_lines[0], valid_cell_lines[1], valid_cell_lines[1]]) + drug_ids = np.array([valid_drugs[0], valid_drugs[1], valid_drugs[0], valid_drugs[1]]) + train_dataset = DrugResponseDataset( + response=responses, + cell_line_ids=cell_line_ids, + drug_ids=drug_ids, + dataset_name="TOYv1", + ) + val_dataset = DrugResponseDataset( + response=responses.copy(), + cell_line_ids=cell_line_ids.copy(), + drug_ids=drug_ids.copy(), + dataset_name="TOYv1", + ) + + best = experiment.hpam_tune_raytune( + model=model, + train_dataset=train_dataset, + validation_dataset=val_dataset, + early_stopping_dataset=None, + hpam_set=hpam_set, + response_transformation=None, + metric="RMSE", + ray_path=str(tmp_path), + path_data="../data", + model_checkpoint_dir="TEMPORARY", + ) + + assert best in hpam_set diff --git a/tests/test_main.py b/tests/test_main.py new file mode 100644 index 00000000..cadc9312 --- /dev/null +++ b/tests/test_main.py @@ -0,0 +1,134 @@ +"""Test suite for the main functionality of drevalpy.""" + +import os +import pathlib +import tempfile +from argparse import Namespace + +import pytest + +from drevalpy.utils import check_arguments, get_parser, main +from drevalpy.visualization.create_report import create_report +from drevalpy.visualization.utils import ( + create_output_directories, + parse_results, + prep_results, +) + + +@pytest.mark.parametrize( + "args", + [ + { + "run_id": "test_run", + "dataset_name": "TOYv1", + "models": ["ElasticNet"], + "baselines": ["NaiveMeanEffectsPredictor", "NaivePredictor"], + "test_mode": ["LPO"], + "randomization_mode": ["SVRC"], + "randomization_type": "permutation", + "n_trials_robustness": 2, + "cross_study_datasets": ["TOYv2"], + "no_refitting": False, + "curve_curator_cores": 1, + "measure": "LN_IC50", + "overwrite": False, + "optim_metric": "RMSE", + "n_cv_splits": 2, + "response_transformation": "standard", + "multiprocessing": False, + "path_data": "../data", + "model_checkpoint_dir": "TEMPORARY", + "no_hyperparameter_tuning": True, + "final_model_on_full_data": True, + "wandb_project": None, + } + ], +) +def test_drevalpy_main(args): + """ + Tests drevalpy, i.e., all functionality of the main experiment and report. + + :param args: arguments for the main function + """ + with tempfile.TemporaryDirectory() as temp_dir: + args["path_out"] = temp_dir + args = Namespace(**args) + get_parser() + check_arguments(args) + + try: + main(args) + except Exception as e: + pytest.fail(f"Main function failed: {e}") + + # Check output directory contains the run_id folder + assert args.run_id in os.listdir(temp_dir) + + # Run report generation on the output of the main run + try: + create_report(args.run_id, args.dataset_name, args.path_data, temp_dir) + except Exception as e: + pytest.fail(f"Report generation failed: {e}") + + result_path = pathlib.Path(temp_dir).resolve() + path_data = pathlib.Path(args.path_data).resolve() + + # Parse and prep results + ( + evaluation_results, + evaluation_results_per_drug, + evaluation_results_per_cell_line, + true_vs_pred, + ) = parse_results(path_to_results=f"{result_path}/{args.run_id}", dataset=args.dataset_name) + + ( + evaluation_results, + evaluation_results_per_drug, + evaluation_results_per_cell_line, + true_vs_pred, + ) = prep_results( + eval_results=evaluation_results, + eval_results_per_drug=evaluation_results_per_drug, + eval_results_per_cell_line=evaluation_results_per_cell_line, + t_vs_p=true_vs_pred, + path_data=path_data, + ) + + # Basic structural assertions + expected_eval_cols = 15 + expected_tvp_cols = 11 + assert len(evaluation_results.columns) == expected_eval_cols + assert len(evaluation_results_per_drug.columns) == expected_eval_cols + assert len(evaluation_results_per_cell_line.columns) == expected_eval_cols + assert len(true_vs_pred.columns) == expected_tvp_cols + + # Check models and baselines present in evaluation results + assert all(model in evaluation_results.algorithm.unique() for model in args.models) + assert all(baseline in evaluation_results.algorithm.unique() for baseline in args.baselines) + assert "predictions" in evaluation_results.rand_setting.unique() + + # Check randomization modes in rand_setting + if args.randomization_mode: + for rand_setting in args.randomization_mode: + assert any( + setting.startswith(f"randomize-{rand_setting}") + for setting in evaluation_results.rand_setting.unique() + ) + + # Check robustness trials presence + if args.n_trials_robustness > 0: + assert any( + setting.startswith(f"robustness-{args.n_trials_robustness}") + for setting in evaluation_results.rand_setting.unique() + ) + + # Check test modes and CV splits + assert all(test_mode in evaluation_results.test_mode.unique() for test_mode in args.test_mode) + assert evaluation_results.CV_split.astype(int).max() == (args.n_cv_splits - 1) + + # Check some metric threshold + assert evaluation_results.Pearson.astype(float).max() > 0.5 + + # Verify output directories exist (from report generation) + create_output_directories(result_path, args.run_id) diff --git a/tests/test_run_suite.py b/tests/test_run_suite.py deleted file mode 100644 index f28a4fa5..00000000 --- a/tests/test_run_suite.py +++ /dev/null @@ -1,154 +0,0 @@ -"""Tests whether the main function of the package runs without errors and produces the expected output.""" - -import os -import pathlib -import tempfile -from argparse import Namespace - -import pytest - -from drevalpy.utils import check_arguments, get_parser, main -from drevalpy.visualization.utils import ( - create_html, - create_index_html, - create_output_directories, - draw_algorithm_plots, - draw_test_mode_plots, - parse_results, - prep_results, -) - - -@pytest.mark.parametrize( - "args", - [ - { - "run_id": "test_run", - "dataset_name": "TOYv1", - "models": ["ElasticNet"], - "baselines": ["NaiveMeanEffectsPredictor", "NaivePredictor"], - "test_mode": ["LPO"], - "randomization_mode": ["SVRC"], - "randomization_type": "permutation", - "n_trials_robustness": 2, - "cross_study_datasets": ["TOYv2"], - "curve_curator": True, - "curve_curator_cores": 1, - "measure": "LN_IC50", - "overwrite": False, - "optim_metric": "RMSE", - "n_cv_splits": 2, - "response_transformation": "None", - "multiprocessing": False, - "path_data": "../data", - "model_checkpoint_dir": "TEMPORARY", - } - ], -) -def test_run_suite(args): - """ - Tests run_suite.py, i.e., all functionality of the main package. - - :param args: arguments for the main function - """ - temp_dir = tempfile.TemporaryDirectory() - args["path_out"] = temp_dir.name - args = Namespace(**args) - get_parser() - check_arguments(args) - main(args, hyperparameter_tuning=False) - assert os.listdir(temp_dir.name) == ["test_run"] - result_path = pathlib.Path(temp_dir.name).resolve() - path_data = pathlib.Path(args.path_data).resolve() - - ( - evaluation_results, - evaluation_results_per_drug, - evaluation_results_per_cell_line, - true_vs_pred, - ) = parse_results(path_to_results=f"{result_path}/{args.run_id}", dataset="TOYv1") - - ( - evaluation_results, - evaluation_results_per_drug, - evaluation_results_per_cell_line, - true_vs_pred, - ) = prep_results( - eval_results=evaluation_results, - eval_results_per_drug=evaluation_results_per_drug, - eval_results_per_cell_line=evaluation_results_per_cell_line, - t_vs_p=true_vs_pred, - path_data=path_data, - ) - assert len(evaluation_results.columns) == 15 - assert len(evaluation_results_per_drug.columns) == 15 - assert len(evaluation_results_per_cell_line.columns) == 15 - assert len(true_vs_pred.columns) == 11 - - assert all(model in evaluation_results.algorithm.unique() for model in args.models) - assert all(baseline in evaluation_results.algorithm.unique() for baseline in args.baselines) - assert "predictions" in evaluation_results.rand_setting.unique() - if len(args.randomization_mode) > 0: - for rand_setting in args.randomization_mode: - assert any( - setting.startswith(f"randomize-{rand_setting}") for setting in evaluation_results.rand_setting.unique() - ) - if args.n_trials_robustness > 0: - assert any( - setting.startswith(f"robustness-{args.n_trials_robustness}") - for setting in evaluation_results.rand_setting.unique() - ) - assert all(test_mode in evaluation_results.test_mode.unique() for test_mode in args.test_mode) - assert evaluation_results.CV_split.astype(int).max() == (args.n_cv_splits - 1) - assert evaluation_results.Pearson.astype(float).max() > 0.5 - - create_output_directories(result_path, args.run_id) - setting = args.test_mode[0] - unique_algos = draw_test_mode_plots( - test_mode=setting, - ev_res=evaluation_results, - ev_res_per_drug=evaluation_results_per_drug, - ev_res_per_cell_line=evaluation_results_per_cell_line, - custom_id=args.run_id, - path_data=path_data, - result_path=result_path, - ) - # draw figures for each algorithm with all randomizations etc - unique_algos = set(unique_algos) - { - "NaiveMeanEffectsPredictor", - "NaivePredictor", - "NaiveCellLineMeansPredictor", - "NaiveDrugMeanPredictor", - } - for algorithm in unique_algos: - draw_algorithm_plots( - model=algorithm, - ev_res=evaluation_results, - ev_res_per_drug=evaluation_results_per_drug, - ev_res_per_cell_line=evaluation_results_per_cell_line, - t_vs_p=true_vs_pred, - test_mode=setting, - custom_id=args.run_id, - result_path=result_path, - ) - # get all html files from {result_path}/{run_id} - all_files = [] - for _, _, files in os.walk(f"{result_path}/{args.run_id}"): # type: ignore[assignment] - for file in files: - if file.endswith("json") or ( - file.endswith(".html") and file not in ["index.html", "LPO.html", "LCO.html", "LDO.html"] - ): - all_files.append(file) - # PIPELINE: WRITE_HTML - create_html( - run_id=args.run_id, - test_mode=setting, - files=all_files, - prefix_results=f"{result_path}/{args.run_id}", - ) - # PIPELINE: WRITE_INDEX - create_index_html( - custom_id=args.run_id, - test_modes=args.test_mode, - prefix_results=f"{result_path}/{args.run_id}", - ) diff --git a/tests/test_tissue_mapping.py b/tests/test_tissue_mapping.py new file mode 100644 index 00000000..3f5d7752 --- /dev/null +++ b/tests/test_tissue_mapping.py @@ -0,0 +1,100 @@ +"""Test suite for tissue mapping functionality in the drevalpy package.""" + +import pandas as pd +import pytest + +from drevalpy.datasets.map_tissues import main + + +@pytest.fixture +def test_data(tmp_path): + """Create a temporary directory with dummy data for testing. + + :param tmp_path: pytest fixture for creating temporary directories. + :returns: Tuple containing the root directory and dataset name. + """ + # Setup directory + root = tmp_path / "data" + root.mkdir() + meta = root / "meta" + meta.mkdir() + + # Create dummy dataset + ds_name = "TESTSET" + ds_path = root / ds_name + ds_path.mkdir() + df = pd.DataFrame({"cellosaurus_id": ["CVCL_TEST1", "CVCL_TEST2"]}) + df.to_csv(ds_path / f"{ds_name}.csv", index=False) + + # Create dummy depmap metadata + depmap = pd.DataFrame( + { + "DepMap_ID": ["ACH-000001", "ACH-000002"], + "stripped_cell_line_name": ["testcl1", "testcl2"], + "disease": ["lung", ""], + "disease_sutype": ["lung cancer", "leukemia"], + "disease_sub_subtype": ["adenocarcinoma", "AML"], + "culture_type": ["Adherent", "Suspension"], + "culture_medium": ["RPMI", "DMEM"], + "gender": ["Male", "Female"], + "source": ["Broad", "Broad"], + } + ) + + depmap.to_csv(meta / "DepMap_sample_info.csv", index=False) + + # Create dummy Cellosaurus file + cellosaurus_text = ( + "ID TestCL1\n" + "AC CVCL_TEST1;\n" + "CC Derived from site: lung; lung\n" + "DI ; NCIt; Lung adenocarcinoma\n" + "//\n" + "ID TestCL2\n" + "AC CVCL_TEST2;\n" + "CC Derived from site: blood; blood\n" + "DI ; NCIt; Acute myeloid leukemia\n" + "//\n" + ) + (meta / "cellosaurus.txt").write_text(cellosaurus_text, encoding="utf-8") + + return root, ds_name + + +def test_map_tissues(monkeypatch, test_data): + """Test the map_tissues function. + + :param monkeypatch: pytest fixture to modify the environment for testing. + :param test_data: fixture providing a temporary directory with dummy data. + """ + root, ds_name = test_data + + monkeypatch.setattr("sys.argv", ["script.py", str(root), ds_name, "--save_tissue_mapping"]) + main() + + # Check output file exists + output_path = root / "meta" / "tissue_mapping.csv" + assert output_path.exists() + + # Load and check contents + df_out = pd.read_csv(output_path) + print("\n=== tissue_mapping.csv ===") + print(df_out) + + assert "tissue" in df_out.columns + print("\n=== tissue for CVCL_TEST1 ===") + print(df_out.loc[df_out["cellosaurus_id"] == "CVCL_TEST1", "tissue"]) + + print("\n=== tissue for CVCL_TEST2 ===") + print(df_out.loc[df_out["cellosaurus_id"] == "CVCL_TEST2", "tissue"]) + + assert df_out.loc[df_out["cellosaurus_id"] == "CVCL_TEST1", "tissue"].values[0] == "Lung" + assert df_out.loc[df_out["cellosaurus_id"] == "CVCL_TEST2", "tissue"].values[0] == "Blood" + + # Check the updated dataset has a tissue column + updated = pd.read_csv(root / ds_name / f"{ds_name}.csv") + print("\n=== Updated dataset ===") + print(updated) + + assert "tissue" in updated.columns + assert set(updated["tissue"]) == {"Lung", "Blood"} diff --git a/tests/test_train_mutability.py b/tests/test_train_mutability.py new file mode 100644 index 00000000..3232edf5 --- /dev/null +++ b/tests/test_train_mutability.py @@ -0,0 +1,61 @@ +"""Test for train_and_predict dataset mutation fix.""" + +import numpy as np + +from drevalpy.datasets.dataset import DrugResponseDataset, FeatureDataset +from drevalpy.experiment import train_and_predict +from drevalpy.models import MODEL_FACTORY + + +def test_train_and_predict_does_not_mutate_with_reduce_to(): + """Test that reduce_to etc. doesn't mutate the original datasets. + + Before the fix: reduce_to was called directly on input datasets. + After the fix: train_and_predict copies datasets first. + """ + np.random.seed(42) + + train = DrugResponseDataset( + response=np.array([1.0, 2.0, 3.0, 4.0, 5.0]), + cell_line_ids=np.array(["CL-1", "CL-2", "CL-3", "CL-4", "CL-5"]), + drug_ids=np.array(["Drug-1", "Drug-1", "Drug-1", "Drug-1", "Drug-1"]), + dataset_name="Toy_Data", + ) + + test = DrugResponseDataset( + response=np.array([1.5, 2.5, 3.5]), + cell_line_ids=np.array(["CL-1", "CL-2", "CL-3"]), + drug_ids=np.array(["Drug-1", "Drug-1", "Drug-1"]), + dataset_name="Toy_Data", + ) + + original_train_len = len(train) + original_test_len = len(test) + + model = MODEL_FACTORY["NaivePredictor"]() + + # Create FeatureDataset with only some cell lines, forces reduce_to to remove rows + cl_features = FeatureDataset( + features={ + "CL-1": {"cell_line_id": np.array(["CL-1"])}, + "CL-2": {"cell_line_id": np.array(["CL-2"])}, + } + ) + drug_features = FeatureDataset(features={"Drug-1": {"drug_id": np.array(["Drug-1"])}}) + + train_and_predict( + model=model, + hpams={}, + path_data="data", + train_dataset=train, + prediction_dataset=test, + cl_features=cl_features, + drug_features=drug_features, + ) + + # Before fix: these fail because reduce_to removes rows from original datasets + # After fix: these pass because train_and_predict copies datasets first + assert ( + len(train) == original_train_len + ), f"train_dataset was mutated by reduce_to: {original_train_len} -> {len(train)}" + assert len(test) == original_test_len, f"test_dataset was mutated by reduce_to: {original_test_len} -> {len(test)}"