diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index 814d7b2..0000000 --- a/.editorconfig +++ /dev/null @@ -1,24 +0,0 @@ -# http://editorconfig.org - -root = true - -[*] -indent_style = space -indent_size = 4 -trim_trailing_whitespace = true -insert_final_newline = true -charset = utf-8 -end_of_line = lf - -[*.bat] -indent_style = tab -end_of_line = crlf - -[LICENSE] -insert_final_newline = false - -[Makefile] -indent_style = tab - -[*.{yml, yaml}] -indent_size = 2 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml deleted file mode 100644 index 0a59609..0000000 --- a/.pre-commit-config.yaml +++ /dev/null @@ -1,39 +0,0 @@ -repos: - - repo: https://github.com/Lucas-C/pre-commit-hooks - rev: v1.1.9 - hooks: - - id: forbid-crlf - - id: remove-crlf - - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v3.4.0 - hooks: - - id: trailing-whitespace - - id: end-of-file-fixer - - id: check-merge-conflict - - id: check-yaml - args: [ --unsafe ] - - repo: https://github.com/pre-commit/mirrors-isort - rev: v5.8.0 - hooks: - - id: isort - args: [ "--filter-files" ] - - repo: https://github.com/ambv/black - rev: 21.5b1 - hooks: - - id: black - language_version: python3.8 - - repo: https://github.com/pycqa/flake8 - rev: 3.9.2 - hooks: - - id: flake8 - additional_dependencies: [ flake8-typing-imports==1.10.0 ] - - repo: https://github.com/pre-commit/mirrors-mypy - rev: v0.901 - hooks: - - id: mypy - exclude: tests/ - - repo: https://github.com/nbQA-dev/nbQA - rev: 1.2.2 - hooks: - - id: nbqa-black - - id: nbqa-isort diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index 28666c7..0000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,5 +0,0 @@ -# Changelog - -## 0.1.0 (2021-12-17) - -* First release on PyPI. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index 546f2a0..0000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,152 +0,0 @@ -# Contributing - -Contributions are welcome, and they are greatly appreciated! Every little bit -helps, and credit will always be given. - -You can contribute in many ways: - -## Types of Contributions - -### Report Bugs - -Report bugs at [https://github.com/pietrolesci/energizer/issues](https://github.com/pietrolesci/energizer/issues). - -If you are reporting a bug, please include: - -* Your operating system name and version. -* Any details about your local setup that might be helpful in troubleshooting. -* Detailed steps to reproduce the bug. - -### Fix Bugs - -Look through the GitHub issues for bugs. Anything tagged with "bug" and "help -wanted" is open to whoever wants to implement it. - -### Implement Features - -Look through the GitHub issues for features. Anything tagged with "enhancement" -and "help wanted" is open to whoever wants to implement it. - -### Write Documentation - -Pytorch-Energizer could always use more documentation, whether as part of the -official Pytorch-Energizer docs, in docstrings, or even on the web in blog posts, -articles, and such. - -### Submit Feedback - -The best way to send feedback is to file an issue at https://github.com/pietrolesci/energizer/issues. - -If you are proposing a feature: - -* Explain in detail how it would work. -* Keep the scope as narrow as possible, to make it easier to implement. -* Remember that this is a volunteer-driven project, and that contributions - are welcome :) - -## Set up local development environment! - -Ready to contribute? Here's how to set up `energizer` for local development. - -1. Fork the `energizer` repo on GitHub. - -1. Clone your fork locally - - ```bash - git clone git@github.com:your_name_here/energizer.git - ``` - -1. Ensure [conda](https://docs.conda.io/en/latest/miniconda.html#latest-miniconda-installer-links) is installed, otherwise install it - - ```bash - LINK_TO_CONDA_INSTALLER= #(1) - wget $LINK_TO_CONDA_INSTALLER - #(2) - ``` - - 1. Check [here](https://docs.conda.io/en/latest/miniconda.html#latest-miniconda-installer-links) for a suitable version of the conda installer, copy the link, and paste it here to download the file. - - 2. Run the installer. - -1. Create a new conda environment - ```bash - CONDA_ENV_NAME= #(1) - conda create -n $CONDA_ENV_NAME python=3.9 -y - conda activate $CONDA_ENV_NAME - ``` - - 1. Put here the name of the conda environment. - -1. Ensure [poetry](https://python-poetry.org/docs/) is installed, otherwise install it - - ```bash - curl -sSL https://install.python-poetry.org | python3 - - ``` - -1. Install dependencies and start your virtualenv: - - ```bash - poetry install --all-extras --sync - ``` - -1. Create a branch for local development: - - ```bash - git checkout -b name-of-your-bugfix-or-feature - ``` - - Now you can make your changes locally. - -1. When you're done making changes, check that your changes pass the - tests, including testing other Python versions, with tox: - - ```bash - poetry run tox - ``` - -1. Commit your changes and push your branch to GitHub: - - ```bash - git add . - git commit -m "Your detailed description of your changes." - git push origin name-of-your-bugfix-or-feature - ``` - -1. Submit a pull request through the GitHub website. - -## Pull Request Guidelines - -Before you submit a pull request, check that it meets these guidelines: - -1. The pull request should include tests. -2. If the pull request adds functionality, the docs should be updated. Put - your new functionality into a function with a docstring, and add the - feature to the list in README.md. -3. The pull request should work for Python 3.7, 3.8, 3.9, 3.10. Check - https://github.com/pietrolesci/energizer/actions - and make sure that the tests pass for all supported Python versions. - -## Tips - -```bash -poetry run pytest tests/some_test_file.py -``` - -To run a subset of tests. - - -## Deploying - -A reminder for the maintainers on how to deploy. -Make sure all your changes are committed (including an entry in CHANGELOG.md). -Then run: - -```bash -poetry run bump2version patch #(1) -git push -git push --tags -``` - -1. Possible values: `major` / `minor` / `patch`. - -GitHub Actions will then deploy to PyPI if tests pass. diff --git a/docs/api/acquisition_functions.md b/docs/api/acquisition_functions.md deleted file mode 100644 index cb5d6a8..0000000 --- a/docs/api/acquisition_functions.md +++ /dev/null @@ -1 +0,0 @@ -::: energizer.acquisition_functions diff --git a/docs/api/query_strategies.md b/docs/api/query_strategies.md deleted file mode 100644 index a2384bd..0000000 --- a/docs/api/query_strategies.md +++ /dev/null @@ -1,33 +0,0 @@ -## Random strategies - -::: energizer.query_strategies.RandomStrategy - options: - show_root_heading: true - - -## Uncertainty-based query strategies - -Uncertainty-based query strategies select instance with high aleatoric uncertainty -or epistemic uncertainty. Aleatoric uncertainty refers to the uncertainty -in data due the data generation processes (sometimes called irreducible uncertainty). -Epistemic uncertainty comes from the modeling/learning process and is caused by a -lack of knowledge. - -::: energizer.query_strategies.LeastConfidenceStrategy - options: - show_root_heading: true - -::: energizer.query_strategies.MarginStrategy - options: - show_root_heading: true - -::: energizer.query_strategies.EntropyStrategy - options: - show_root_heading: true - - - ---- - -## Base classes -::: energizer.query_strategies.base diff --git a/docs/api/trainer.md b/docs/api/trainer.md deleted file mode 100644 index f152302..0000000 --- a/docs/api/trainer.md +++ /dev/null @@ -1 +0,0 @@ -::: energizer.trainer diff --git a/docs/changelog.md b/docs/changelog.md deleted file mode 100644 index 67259da..0000000 --- a/docs/changelog.md +++ /dev/null @@ -1,3 +0,0 @@ -{% - include-markdown "../CHANGELOG.md" -%} diff --git a/docs/contributing.md b/docs/contributing.md deleted file mode 100644 index a485597..0000000 --- a/docs/contributing.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -hide: - - navigation ---- - -{% - include-markdown "../CONTRIBUTING.md" -%} diff --git a/docs/examples/bert-agnews.ipynb b/docs/examples/bert-agnews.ipynb deleted file mode 100644 index aab2969..0000000 --- a/docs/examples/bert-agnews.ipynb +++ /dev/null @@ -1,417 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# %load_ext autoreload\n", - "# %autoreload 2" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "MODEL_NAME = \"google/bert_uncased_L-2_H-128_A-2\"\n", - "BATCH_SIZE = 32\n", - "EVAL_BATCH_SIZE = 512\n", - "LEARNING_RATE = 0.0001\n", - "\n", - "trainer_kwargs = {\n", - " \"query_size\": 1,\n", - " \"max_epochs\": 3,\n", - " \"max_labelling_epochs\": 5,\n", - " \"test_after_labelling\": True,\n", - " \"accelerator\": \"gpu\",\n", - " \"limit_val_batches\": 1,\n", - " # total_budget=5,\n", - " # for testing purposes\n", - " # limit_train_batches=10,\n", - " # limit_test_batches=10,\n", - " # limit_pool_batches=10,\n", - " # log_every_n_steps=1,\n", - "}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Pre" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import json\n", - "import os\n", - "from copy import deepcopy\n", - "from typing import Any, Dict, Tuple\n", - "\n", - "import matplotlib.pyplot as plt\n", - "import pandas as pd\n", - "import torch\n", - "import torch.nn.functional as F\n", - "from datasets import load_dataset\n", - "from pytorch_lightning import LightningModule\n", - "from pytorch_lightning import Trainer as PLTrainer\n", - "from pytorch_lightning import seed_everything\n", - "from torch import Tensor, nn\n", - "from torch.utils.data import DataLoader\n", - "from torchmetrics import Accuracy, F1Score, MetricCollection, Precision, Recall\n", - "from transformers import (\n", - " AdamW,\n", - " AutoModelForSequenceClassification,\n", - " AutoTokenizer,\n", - " DataCollatorWithPadding,\n", - " get_constant_schedule_with_warmup,\n", - ")\n", - "\n", - "from energizer import Trainer\n", - "from energizer.acquisition_functions import entropy, expected_entropy\n", - "from energizer.query_strategies import RandomStrategy\n", - "from energizer.query_strategies.base import AccumulatorStrategy" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)\n", - "os.environ[\"TOKENIZERS_PARALLELISM\"] = \"false\"\n", - "\n", - "# renames \"label\" to \"labels\"\n", - "collator = DataCollatorWithPadding(\n", - " tokenizer=tokenizer, padding=True, return_tensors=\"pt\"\n", - ")\n", - "\n", - "# load dataset\n", - "dataset = load_dataset(\"pietrolesci/ag_news\", \"concat\")\n", - "\n", - "# tokenize\n", - "dataset = dataset.map(lambda ex: tokenizer(ex[\"text\"]), batched=True)\n", - "columns_to_keep = [\"label\", \"input_ids\", \"token_type_ids\", \"attention_mask\"]\n", - "\n", - "# train-val split and record datasets\n", - "train_set, test_set = dataset[\"train\"], dataset[\"test\"]\n", - "_split = train_set.train_test_split(0.3)\n", - "_, val_set = _split[\"train\"], _split[\"test\"]\n", - "\n", - "labels = train_set.features[\"label\"].names\n", - "num_classes = len(labels)\n", - "\n", - "# create dataloaders\n", - "batch_size = BATCH_SIZE\n", - "eval_batch_size = EVAL_BATCH_SIZE # this is use when evaluating on the pool too\n", - "train_dl = DataLoader(\n", - " train_set.with_format(columns=columns_to_keep),\n", - " batch_size=batch_size,\n", - " collate_fn=collator,\n", - " num_workers=2,\n", - ")\n", - "val_dl = DataLoader(\n", - " val_set.with_format(columns=columns_to_keep),\n", - " batch_size=eval_batch_size,\n", - " collate_fn=collator,\n", - " num_workers=2,\n", - ")\n", - "test_dl = DataLoader(\n", - " test_set.with_format(columns=columns_to_keep),\n", - " batch_size=eval_batch_size,\n", - " collate_fn=collator,\n", - " num_workers=2,\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "class TransformerModel(LightningModule):\n", - " def __init__(\n", - " self,\n", - " model_name: str,\n", - " num_classes: int,\n", - " learning_rate: float = 0.00001,\n", - " num_warmup_steps: int = 50,\n", - " ) -> None:\n", - " super().__init__()\n", - " self.model_name = model_name\n", - " self.num_classes = num_classes\n", - " self.model = AutoModelForSequenceClassification.from_pretrained(\n", - " self.model_name,\n", - " num_labels=self.num_classes,\n", - " )\n", - " self.learning_rate = learning_rate\n", - " self.num_warmup_steps = num_warmup_steps\n", - " for stage in (\"train\", \"val\", \"test\"):\n", - " metrics = MetricCollection(\n", - " {\n", - " \"accuracy\": Accuracy(),\n", - " \"precision_macro\": Precision(\n", - " num_classes=num_classes, average=\"macro\"\n", - " ),\n", - " \"recall_macro\": Recall(num_classes=num_classes, average=\"macro\"),\n", - " \"f1_macro\": F1Score(num_classes=num_classes, average=\"macro\"),\n", - " \"f1_micro\": F1Score(num_classes=num_classes, average=\"micro\"),\n", - " }\n", - " )\n", - " setattr(self, f\"{stage}_metrics\", metrics)\n", - "\n", - " def common_step(self, batch: Any, stage: str):\n", - " \"\"\"Outputs loss and logits, logs loss and metrics.\"\"\"\n", - " out = self(batch)\n", - " logits, loss = out.logits, out.loss\n", - " self.log(f\"{stage}/loss\", loss)\n", - "\n", - " metrics = getattr(self, f\"{stage}_metrics\")(logits, batch[\"labels\"])\n", - " self.log_dict(metrics)\n", - "\n", - " return loss\n", - "\n", - " def forward(self, batch) -> torch.Tensor:\n", - " return self.model(**batch)\n", - "\n", - " def training_step(\n", - " self, batch: Any, batch_idx: int = 0, optimizer_idx: int = 0\n", - " ) -> Dict[str, Any]:\n", - " return self.common_step(batch, \"train\")\n", - "\n", - " def validation_step(self, batch: Any, batch_idx: int = 0) -> Dict[str, Any]:\n", - " return self.common_step(batch, \"val\")\n", - "\n", - " def test_step(self, batch: Any, batch_idx: int = 0) -> Dict[str, Any]:\n", - " return self.common_step(batch, \"test\")\n", - "\n", - " def configure_optimizers(self) -> Dict[str, Any]:\n", - " optimizer = AdamW(\n", - " filter(lambda p: p.requires_grad, self.parameters()),\n", - " lr=self.learning_rate,\n", - " )\n", - " return {\n", - " \"optimizer\": optimizer,\n", - " \"lr_scheduler\": {\n", - " \"scheduler\": get_constant_schedule_with_warmup(\n", - " optimizer=optimizer, num_warmup_steps=self.num_warmup_steps\n", - " ),\n", - " \"monitor\": \"val/loss\",\n", - " \"frequency\": 1,\n", - " \"interval\": \"step\",\n", - " },\n", - " }" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Active fit" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "model = TransformerModel(\n", - " model_name=MODEL_NAME, num_classes=num_classes, learning_rate=LEARNING_RATE\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Random strategy" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "random_strategy = RandomStrategy(deepcopy(model))\n", - "\n", - "seed_everything(1994)\n", - "trainer = Trainer(**trainer_kwargs)\n", - "results = trainer.active_fit(\n", - " model=random_strategy,\n", - " train_dataloaders=train_dl,\n", - " val_dataloaders=val_dl,\n", - " test_dataloaders=test_dl,\n", - ")\n", - "random_df = results.to_pandas()\n", - "random_df" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### AccumulatorStrategy" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "class EntropyStrategy(AccumulatorStrategy):\n", - " \"\"\"A implememntation of the `Entropy` active learning strategy.\"\"\"\n", - "\n", - " def get_inputs_from_batch(self, batch: Dict[str, Tensor]) -> Dict[str, Tensor]:\n", - " batch.pop(\"labels\")\n", - " return batch\n", - "\n", - " def pool_step(self, batch: Dict[str, Tensor], batch_idx: int) -> Tensor:\n", - " logits = self(batch).logits\n", - " return entropy(logits)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "entropy_strategy = EntropyStrategy(deepcopy(model))\n", - "\n", - "seed_everything(1994)\n", - "trainer = Trainer(**trainer_kwargs)\n", - "results = trainer.active_fit(\n", - " model=entropy_strategy,\n", - " train_dataloaders=train_dl,\n", - " val_dataloaders=val_dl,\n", - " test_dataloaders=test_dl,\n", - ")\n", - "entropy_df = results.to_pandas()\n", - "entropy_df" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### AnchorPointsStrategy" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# class MyRandomArchorPointsStrategy(RandomArchorPointsStrategy):\n", - "# def get_search_query_from_batch(self, batch: Any) -> Tensor:\n", - "# return batch[\"input_ids\"]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# random_anchor_points_strategy = RandomArchorPointsStrategy(deepcopy(model), 10)\n", - "\n", - "# datastore = ActiveDataModuleWithIndex(\n", - "# train_dataloader=train_dl,\n", - "# val_dataloaders=val_dl,\n", - "# test_dataloaders=test_dl,\n", - "# faiss_index_path=\"all-mpnet-base-v2_ag-news_train.faiss\",\n", - "# )\n", - "\n", - "# seed_everything(1994)\n", - "# trainer = Trainer(**trainer_kwargs)\n", - "# results = trainer.active_fit(\n", - "# model=random_anchor_points_strategy,\n", - "# datastore=datastore,\n", - "# )\n", - "# rap_df = results.to_pandas()\n", - "# rap_df" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "----" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "plt.plot(random_df[\"train_size\"], random_df[\"accuracy\"], label=\"random\")\n", - "plt.plot(entropy_df[\"train_size\"], entropy_df[\"accuracy\"], label=\"entropy\")\n", - "plt.legend()\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "random_df[\"strategy\"] = \"random\"\n", - "entropy_df[\"strategy\"] = \"entropy\"\n", - "results = pd.concat([random_df, entropy_df], ignore_index=False, axis=0)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# results.to_parquet(\"results_al.parquet\", index=False)\n", - "# with open(\"results_al_metadata.json\", \"w\") as fl:\n", - "# json.dump(trainer_kwargs, fl)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3.9.13 ('energizer-dev')", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.13" - }, - "orig_nbformat": 4, - "vscode": { - "interpreter": { - "hash": "944ffd4f8dbdaa69d919c942d599fc997735694f55f2ea363be8b6b69a40ba5a" - } - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/docs/examples/cnn-mnist.ipynb b/docs/examples/cnn-mnist.ipynb deleted file mode 100644 index 747549a..0000000 --- a/docs/examples/cnn-mnist.ipynb +++ /dev/null @@ -1,1388 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Imports" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "from typing import Tuple, Union\n", - "\n", - "import matplotlib.pyplot as plt\n", - "import numpy as np\n", - "import pandas as pd\n", - "import seaborn as sns\n", - "import torch\n", - "import torch.nn.functional as F\n", - "from pytorch_lightning import LightningModule, seed_everything\n", - "from torch import Tensor, nn\n", - "from torch.utils.data import DataLoader, random_split\n", - "from torchmetrics import Accuracy, F1Score, MetricCollection, Precision, Recall\n", - "from torchvision import transforms\n", - "from torchvision.datasets import MNIST\n", - "\n", - "from energizer import Trainer\n", - "from energizer.query_strategies import (\n", - " BALDStrategy,\n", - " EntropyStrategy,\n", - " LeastConfidenceStrategy,\n", - " MarginStrategy,\n", - " RandomStrategy,\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Data preparation\n", - "\n", - "Load and preprocess data, and prepare dataloaders" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "data_dir = \"./data\"\n", - "\n", - "preprocessing_pipe = transforms.Compose(\n", - " [\n", - " transforms.ToTensor(),\n", - " transforms.Normalize((0.1307,), (0.3081,)),\n", - " ]\n", - ")\n", - "\n", - "# create train and test sets\n", - "train_set = MNIST(data_dir, train=True, download=True, transform=preprocessing_pipe)\n", - "test_set = MNIST(data_dir, train=False, download=True, transform=preprocessing_pipe)\n", - "\n", - "# train-val split to create a validation set\n", - "train_set, val_set = random_split(train_set, [55000, 5000])\n", - "\n", - "# create dataloaders\n", - "batch_size = 32\n", - "eval_batch_size = 128 # this is use when evaluating on the pool too\n", - "num_workers = os.cpu_count()\n", - "\n", - "# dataloaders\n", - "train_dl = DataLoader(train_set, batch_size=batch_size, num_workers=num_workers)\n", - "val_dl = DataLoader(val_set, batch_size=eval_batch_size, num_workers=num_workers)\n", - "test_dl = DataLoader(test_set, batch_size=eval_batch_size, num_workers=num_workers)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Model definition\n", - "Define the model" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "class MNISTCNNModel(LightningModule):\n", - " def __init__(self) -> None:\n", - " \"\"\"Here we define the model architecture and the metrics.\"\"\"\n", - " super().__init__()\n", - "\n", - " # create the CNN\n", - " self.model = nn.Sequential(\n", - " nn.Conv2d(1, 32, kernel_size=5),\n", - " nn.ReLU(),\n", - " nn.MaxPool2d(kernel_size=2),\n", - " nn.Dropout2d(),\n", - " nn.Conv2d(32, 64, kernel_size=5),\n", - " nn.ReLU(),\n", - " nn.MaxPool2d(kernel_size=2),\n", - " nn.Dropout2d(),\n", - " nn.Flatten(),\n", - " nn.Linear(1024, 128),\n", - " nn.Dropout(),\n", - " nn.Linear(128, self.num_classes),\n", - " )\n", - "\n", - " # implement metrics\n", - " for stage in (\"train\", \"val\", \"test\"):\n", - " metrics = MetricCollection(\n", - " {\n", - " \"accuracy\": Accuracy(),\n", - " \"precision_macro\": Precision(\n", - " num_classes=self.num_classes, average=\"macro\"\n", - " ),\n", - " \"recall_macro\": Recall(\n", - " num_classes=self.num_classes, average=\"macro\"\n", - " ),\n", - " \"f1_macro\": F1Score(\n", - " num_classes=self.num_classes, average=\"macro\"\n", - " ),\n", - " \"f1_micro\": F1Score(\n", - " num_classes=self.num_classes, average=\"micro\"\n", - " ),\n", - " }\n", - " )\n", - " setattr(self, f\"{stage}_metrics\", metrics)\n", - "\n", - " @property\n", - " def num_classes(self) -> int:\n", - " \"\"\"This is very tailored to MNIST, so hard-code this propoerty.\"\"\"\n", - " return 10\n", - "\n", - " def get_inputs_from_batch(self, batch: Tuple[Tensor, Tensor]) -> Tensor:\n", - " return batch[0]\n", - "\n", - " def forward(self, x: Tensor) -> Tensor:\n", - " return self.model(x)\n", - "\n", - " def common_step(self, batch: Tuple[Tensor, Tensor], stage: str) -> Tensor:\n", - " \"\"\"For convenience define a common step.\"\"\"\n", - "\n", - " # forward pass\n", - " x, y = batch\n", - " logits = self(x)\n", - "\n", - " # metrics\n", - " loss = F.cross_entropy(logits, y)\n", - " metrics = getattr(self, f\"{stage}_metrics\")(logits, y)\n", - "\n", - " # log\n", - " self.log(\"loss\", loss, on_step=False, on_epoch=True, prog_bar=False)\n", - " self.log_dict(metrics, on_step=False, on_epoch=True, prog_bar=False)\n", - "\n", - " return loss\n", - "\n", - " def training_step(self, batch: Tuple[Tensor, Tensor], batch_idx: int) -> Tensor:\n", - " return self.common_step(batch, \"train\")\n", - "\n", - " def validation_step(\n", - " self, batch: Tuple[Tensor, Tensor], batch_idx: int\n", - " ) -> Tensor:\n", - " return self.common_step(batch, \"val\")\n", - "\n", - " def test_step(self, batch: Tuple[Tensor, Tensor], batch_idx: int) -> Tensor:\n", - " return self.common_step(batch, \"test\")\n", - "\n", - " def configure_optimizers(self) -> None:\n", - " return torch.optim.SGD(self.parameters(), lr=0.001)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Active fit" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Instantiate model" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "model = MNISTCNNModel()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "!!! info \"Batch unpacking\"\n", - " When passing a model to build a strategy, internally a `deepcopy` will be created. This is done to avoid modifying the model state and passing it around when trying other strategies. It avoids messing up states." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "strategies = {\n", - " \"random\": RandomStrategy(model),\n", - " \"leastconfidence\": LeastConfidenceStrategy(model),\n", - " \"margin\": MarginStrategy(model),\n", - " \"entropy\": EntropyStrategy(model),\n", - " \"bald\": BALDStrategy(model),\n", - "}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "For clarity let's pack the trainer kwargs in a dictionary" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "trainer_kwargs = {\n", - " \"query_size\": 10, # new instances will be queried at each iteration\n", - " \"max_epochs\": 3, # the underlying model will be fit for 3 epochs\n", - " \"max_labelling_epochs\": 2, # how many times to run the active learning loop\n", - " \"accelerator\": \"cpu\", # use the gpu\n", - " \"test_after_labelling\": True, # since we have a test set, we test after each labelling iteration\n", - " \"limit_val_batches\": 0, # do not validate\n", - " \"log_every_n_steps\": 1, # we will have a few batches while training, so log on each\n", - "}\n", - "\n", - "results_dict = {}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Run experiments" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Global seed set to 42\n", - "GPU available: True (mps), used: False\n", - "TPU available: False, using: 0 TPU cores\n", - "IPU available: False, using: 0 IPUs\n", - "HPU available: False, using: 0 HPUs\n", - "/Users/lescipi/miniconda3/envs/energizer-dev/lib/python3.9/site-packages/pytorch_lightning/trainer/trainer.py:1789: UserWarning: MPS available but not used. Set `accelerator` and `devices` using `Trainer(accelerator='mps', devices=1)`.\n", - " rank_zero_warn(\n", - "\u001b[1;32m[2022-09-26 17:46:39] energizer/INFO\u001b[0m ~ \u001b[1;33mtrainer:269\u001b[0m$ \u001b[37mTrainer: trainer active_fit stage\u001b[0m\n", - "\n", - " | Name | Type | Params\n", - "---------------------------------------------------\n", - "0 | model | Sequential | 184 K \n", - "1 | train_metrics | MetricCollection | 0 \n", - "2 | val_metrics | MetricCollection | 0 \n", - "3 | test_metrics | MetricCollection | 0 \n", - "---------------------------------------------------\n", - "184 K Trainable params\n", - "0 Non-trainable params\n", - "184 K Total params\n", - "0.738 Total estimated model params size (MB)\n", - "\u001b[1;36m[2022-09-26 17:46:39] energizer/DEBUG\u001b[0m ~ \u001b[1;33mtrainer:466\u001b[0m$ \u001b[37mUsing `RandomStrategy`\u001b[0m\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "-------------------------Labelling Iteration 0--------------------------\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[1;36m[2022-09-26 17:46:39] energizer/DEBUG\u001b[0m ~ \u001b[1;33mtrainer:470\u001b[0m$ \u001b[37mUsing underlying `MNISTCNNModel`\u001b[0m\n" - ] - }, - { - "data": { - "text/html": [ - "
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
-       "┃        Test metric               DataLoader 0        ┃\n",
-       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
-       "│         accuracy              0.12139999866485596    │\n",
-       "│         f1_macro              0.05989480018615723    │\n",
-       "│         f1_micro              0.12139999866485596    │\n",
-       "│           loss                 2.302485466003418     │\n",
-       "│      precision_macro         0.050614677369594574    │\n",
-       "│       recall_macro            0.1247788593173027     │\n",
-       "└───────────────────────────┴───────────────────────────┘\n",
-       "
\n" - ], - "text/plain": [ - "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n", - "┃\u001b[1m \u001b[0m\u001b[1m Test metric \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m DataLoader 0 \u001b[0m\u001b[1m \u001b[0m┃\n", - "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n", - "│\u001b[36m \u001b[0m\u001b[36m accuracy \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.12139999866485596 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m f1_macro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.05989480018615723 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m f1_micro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.12139999866485596 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m loss \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 2.302485466003418 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m precision_macro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.050614677369594574 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m recall_macro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.1247788593173027 \u001b[0m\u001b[35m \u001b[0m│\n", - "└───────────────────────────┴───────────────────────────┘\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[1;36m[2022-09-26 17:46:41] energizer/DEBUG\u001b[0m ~ \u001b[1;33mtrainer:466\u001b[0m$ \u001b[37mUsing `RandomStrategy`\u001b[0m\n", - "\u001b[1;32m[2022-09-26 17:46:41] energizer/INFO\u001b[0m ~ \u001b[1;33mactive_learning_loop:193\u001b[0m$ \u001b[37mQueried 10 instance\u001b[0m\n", - "\u001b[1;32m[2022-09-26 17:46:41] energizer/INFO\u001b[0m ~ \u001b[1;33mactive_learning_loop:281\u001b[0m$ \u001b[37mAnnotated 10 instances\u001b[0m\n", - "\u001b[1;32m[2022-09-26 17:46:41] energizer/INFO\u001b[0m ~ \u001b[1;33mactive_learning_loop:282\u001b[0m$ \u001b[37mNew data statistics\n", - "num_pool_batches: 430\n", - "num_train_batches: 1\n", - "pool_size: 54990\n", - "total_data_size: 55000\n", - "train_size: 10\n", - "\u001b[0m\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "-------------------------Labelling Iteration 1--------------------------\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[1;36m[2022-09-26 17:46:41] energizer/DEBUG\u001b[0m ~ \u001b[1;33mtrainer:470\u001b[0m$ \u001b[37mUsing underlying `MNISTCNNModel`\u001b[0m\n", - "\u001b[1;36m[2022-09-26 17:46:41] energizer/DEBUG\u001b[0m ~ \u001b[1;33mactive_learning_loop:250\u001b[0m$ \u001b[37mMNISTCNNModel state dict has been re-initialized\u001b[0m\n", - "`Trainer.fit` stopped: `max_epochs=3` reached.\n", - "\u001b[1;36m[2022-09-26 17:46:46] energizer/DEBUG\u001b[0m ~ \u001b[1;33mtrainer:470\u001b[0m$ \u001b[37mUsing underlying `MNISTCNNModel`\u001b[0m\n" - ] - }, - { - "data": { - "text/html": [ - "
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
-       "┃        Test metric               DataLoader 0        ┃\n",
-       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
-       "│         accuracy              0.12540000677108765    │\n",
-       "│         f1_macro             0.050436750054359436    │\n",
-       "│         f1_micro              0.12540000677108765    │\n",
-       "│           loss                 2.302597761154175     │\n",
-       "│      precision_macro         0.033808622509241104    │\n",
-       "│       recall_macro            0.12841922044754028    │\n",
-       "└───────────────────────────┴───────────────────────────┘\n",
-       "
\n" - ], - "text/plain": [ - "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n", - "┃\u001b[1m \u001b[0m\u001b[1m Test metric \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m DataLoader 0 \u001b[0m\u001b[1m \u001b[0m┃\n", - "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n", - "│\u001b[36m \u001b[0m\u001b[36m accuracy \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.12540000677108765 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m f1_macro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.050436750054359436 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m f1_micro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.12540000677108765 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m loss \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 2.302597761154175 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m precision_macro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.033808622509241104 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m recall_macro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.12841922044754028 \u001b[0m\u001b[35m \u001b[0m│\n", - "└───────────────────────────┴───────────────────────────┘\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[1;36m[2022-09-26 17:46:49] energizer/DEBUG\u001b[0m ~ \u001b[1;33mtrainer:466\u001b[0m$ \u001b[37mUsing `RandomStrategy`\u001b[0m\n", - "\u001b[1;32m[2022-09-26 17:46:49] energizer/INFO\u001b[0m ~ \u001b[1;33mactive_learning_loop:193\u001b[0m$ \u001b[37mQueried 10 instance\u001b[0m\n", - "\u001b[1;32m[2022-09-26 17:46:49] energizer/INFO\u001b[0m ~ \u001b[1;33mactive_learning_loop:281\u001b[0m$ \u001b[37mAnnotated 10 instances\u001b[0m\n", - "\u001b[1;32m[2022-09-26 17:46:49] energizer/INFO\u001b[0m ~ \u001b[1;33mactive_learning_loop:282\u001b[0m$ \u001b[37mNew data statistics\n", - "num_pool_batches: 430\n", - "num_train_batches: 1\n", - "pool_size: 54980\n", - "total_data_size: 55000\n", - "train_size: 20\n", - "\u001b[0m\n", - "\u001b[1;36m[2022-09-26 17:46:49] energizer/DEBUG\u001b[0m ~ \u001b[1;33mtrainer:470\u001b[0m$ \u001b[37mUsing underlying `MNISTCNNModel`\u001b[0m\n", - "\u001b[1;36m[2022-09-26 17:46:49] energizer/DEBUG\u001b[0m ~ \u001b[1;33mactive_learning_loop:250\u001b[0m$ \u001b[37mMNISTCNNModel state dict has been re-initialized\u001b[0m\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "-----------------------------Last fit_loop------------------------------\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "`Trainer.fit` stopped: `max_epochs=3` reached.\n", - "\u001b[1;36m[2022-09-26 17:46:54] energizer/DEBUG\u001b[0m ~ \u001b[1;33mtrainer:470\u001b[0m$ \u001b[37mUsing underlying `MNISTCNNModel`\u001b[0m\n" - ] - }, - { - "data": { - "text/html": [ - "
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
-       "┃        Test metric               DataLoader 0        ┃\n",
-       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
-       "│         accuracy              0.1378999948501587     │\n",
-       "│         f1_macro              0.06494041532278061    │\n",
-       "│         f1_micro              0.1378999948501587     │\n",
-       "│           loss                 2.301481008529663     │\n",
-       "│      precision_macro         0.044325053691864014    │\n",
-       "│       recall_macro            0.1415809839963913     │\n",
-       "└───────────────────────────┴───────────────────────────┘\n",
-       "
\n" - ], - "text/plain": [ - "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n", - "┃\u001b[1m \u001b[0m\u001b[1m Test metric \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m DataLoader 0 \u001b[0m\u001b[1m \u001b[0m┃\n", - "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n", - "│\u001b[36m \u001b[0m\u001b[36m accuracy \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.1378999948501587 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m f1_macro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.06494041532278061 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m f1_micro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.1378999948501587 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m loss \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 2.301481008529663 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m precision_macro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.044325053691864014 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m recall_macro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.1415809839963913 \u001b[0m\u001b[35m \u001b[0m│\n", - "└───────────────────────────┴───────────────────────────┘\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[1;36m[2022-09-26 17:46:57] energizer/DEBUG\u001b[0m ~ \u001b[1;33mtrainer:466\u001b[0m$ \u001b[37mUsing `RandomStrategy`\u001b[0m\n", - "Global seed set to 42\n", - "GPU available: True (mps), used: False\n", - "TPU available: False, using: 0 TPU cores\n", - "IPU available: False, using: 0 IPUs\n", - "HPU available: False, using: 0 HPUs\n", - "/Users/lescipi/miniconda3/envs/energizer-dev/lib/python3.9/site-packages/pytorch_lightning/trainer/trainer.py:1789: UserWarning: MPS available but not used. Set `accelerator` and `devices` using `Trainer(accelerator='mps', devices=1)`.\n", - " rank_zero_warn(\n", - "\u001b[1;32m[2022-09-26 17:46:58] energizer/INFO\u001b[0m ~ \u001b[1;33mtrainer:269\u001b[0m$ \u001b[37mTrainer: trainer active_fit stage\u001b[0m\n", - "\n", - " | Name | Type | Params\n", - "---------------------------------------------------\n", - "0 | model | Sequential | 184 K \n", - "1 | train_metrics | MetricCollection | 0 \n", - "2 | val_metrics | MetricCollection | 0 \n", - "3 | test_metrics | MetricCollection | 0 \n", - "---------------------------------------------------\n", - "184 K Trainable params\n", - "0 Non-trainable params\n", - "184 K Total params\n", - "0.738 Total estimated model params size (MB)\n", - "\u001b[1;36m[2022-09-26 17:46:58] energizer/DEBUG\u001b[0m ~ \u001b[1;33mtrainer:466\u001b[0m$ \u001b[37mUsing `LeastConfidenceStrategy`\u001b[0m\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "-------------------------Labelling Iteration 0--------------------------\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[1;36m[2022-09-26 17:46:58] energizer/DEBUG\u001b[0m ~ \u001b[1;33mtrainer:470\u001b[0m$ \u001b[37mUsing underlying `MNISTCNNModel`\u001b[0m\n" - ] - }, - { - "data": { - "text/html": [ - "
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
-       "┃        Test metric               DataLoader 0        ┃\n",
-       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
-       "│         accuracy              0.12139999866485596    │\n",
-       "│         f1_macro              0.05989480018615723    │\n",
-       "│         f1_micro              0.12139999866485596    │\n",
-       "│           loss                 2.302485466003418     │\n",
-       "│      precision_macro         0.050614677369594574    │\n",
-       "│       recall_macro            0.1247788593173027     │\n",
-       "└───────────────────────────┴───────────────────────────┘\n",
-       "
\n" - ], - "text/plain": [ - "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n", - "┃\u001b[1m \u001b[0m\u001b[1m Test metric \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m DataLoader 0 \u001b[0m\u001b[1m \u001b[0m┃\n", - "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n", - "│\u001b[36m \u001b[0m\u001b[36m accuracy \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.12139999866485596 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m f1_macro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.05989480018615723 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m f1_micro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.12139999866485596 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m loss \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 2.302485466003418 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m precision_macro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.050614677369594574 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m recall_macro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.1247788593173027 \u001b[0m\u001b[35m \u001b[0m│\n", - "└───────────────────────────┴───────────────────────────┘\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[1;36m[2022-09-26 17:47:00] energizer/DEBUG\u001b[0m ~ \u001b[1;33mtrainer:466\u001b[0m$ \u001b[37mUsing `LeastConfidenceStrategy`\u001b[0m\n", - "\u001b[1;32m[2022-09-26 17:47:10] energizer/INFO\u001b[0m ~ \u001b[1;33mactive_learning_loop:193\u001b[0m$ \u001b[37mQueried 10 instance\u001b[0m\n", - "\u001b[1;32m[2022-09-26 17:47:10] energizer/INFO\u001b[0m ~ \u001b[1;33mactive_learning_loop:281\u001b[0m$ \u001b[37mAnnotated 10 instances\u001b[0m\n", - "\u001b[1;32m[2022-09-26 17:47:10] energizer/INFO\u001b[0m ~ \u001b[1;33mactive_learning_loop:282\u001b[0m$ \u001b[37mNew data statistics\n", - "num_pool_batches: 430\n", - "num_train_batches: 1\n", - "pool_size: 54990\n", - "total_data_size: 55000\n", - "train_size: 10\n", - "\u001b[0m\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "-------------------------Labelling Iteration 1--------------------------\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[1;36m[2022-09-26 17:47:10] energizer/DEBUG\u001b[0m ~ \u001b[1;33mtrainer:470\u001b[0m$ \u001b[37mUsing underlying `MNISTCNNModel`\u001b[0m\n", - "\u001b[1;36m[2022-09-26 17:47:10] energizer/DEBUG\u001b[0m ~ \u001b[1;33mactive_learning_loop:250\u001b[0m$ \u001b[37mMNISTCNNModel state dict has been re-initialized\u001b[0m\n", - "`Trainer.fit` stopped: `max_epochs=3` reached.\n", - "\u001b[1;36m[2022-09-26 17:47:15] energizer/DEBUG\u001b[0m ~ \u001b[1;33mtrainer:470\u001b[0m$ \u001b[37mUsing underlying `MNISTCNNModel`\u001b[0m\n" - ] - }, - { - "data": { - "text/html": [ - "
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
-       "┃        Test metric               DataLoader 0        ┃\n",
-       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
-       "│         accuracy              0.12439999729394913    │\n",
-       "│         f1_macro              0.05229624733328819    │\n",
-       "│         f1_micro              0.12439999729394913    │\n",
-       "│           loss                2.3006510734558105     │\n",
-       "│      precision_macro          0.03502652049064636    │\n",
-       "│       recall_macro            0.12720972299575806    │\n",
-       "└───────────────────────────┴───────────────────────────┘\n",
-       "
\n" - ], - "text/plain": [ - "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n", - "┃\u001b[1m \u001b[0m\u001b[1m Test metric \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m DataLoader 0 \u001b[0m\u001b[1m \u001b[0m┃\n", - "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n", - "│\u001b[36m \u001b[0m\u001b[36m accuracy \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.12439999729394913 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m f1_macro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.05229624733328819 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m f1_micro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.12439999729394913 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m loss \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 2.3006510734558105 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m precision_macro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.03502652049064636 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m recall_macro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.12720972299575806 \u001b[0m\u001b[35m \u001b[0m│\n", - "└───────────────────────────┴───────────────────────────┘\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[1;36m[2022-09-26 17:47:18] energizer/DEBUG\u001b[0m ~ \u001b[1;33mtrainer:466\u001b[0m$ \u001b[37mUsing `LeastConfidenceStrategy`\u001b[0m\n", - "\u001b[1;32m[2022-09-26 17:47:28] energizer/INFO\u001b[0m ~ \u001b[1;33mactive_learning_loop:193\u001b[0m$ \u001b[37mQueried 10 instance\u001b[0m\n", - "\u001b[1;32m[2022-09-26 17:47:28] energizer/INFO\u001b[0m ~ \u001b[1;33mactive_learning_loop:281\u001b[0m$ \u001b[37mAnnotated 10 instances\u001b[0m\n", - "\u001b[1;32m[2022-09-26 17:47:28] energizer/INFO\u001b[0m ~ \u001b[1;33mactive_learning_loop:282\u001b[0m$ \u001b[37mNew data statistics\n", - "num_pool_batches: 430\n", - "num_train_batches: 1\n", - "pool_size: 54980\n", - "total_data_size: 55000\n", - "train_size: 20\n", - "\u001b[0m\n", - "\u001b[1;36m[2022-09-26 17:47:28] energizer/DEBUG\u001b[0m ~ \u001b[1;33mtrainer:470\u001b[0m$ \u001b[37mUsing underlying `MNISTCNNModel`\u001b[0m\n", - "\u001b[1;36m[2022-09-26 17:47:28] energizer/DEBUG\u001b[0m ~ \u001b[1;33mactive_learning_loop:250\u001b[0m$ \u001b[37mMNISTCNNModel state dict has been re-initialized\u001b[0m\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "-----------------------------Last fit_loop------------------------------\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "`Trainer.fit` stopped: `max_epochs=3` reached.\n", - "\u001b[1;36m[2022-09-26 17:47:34] energizer/DEBUG\u001b[0m ~ \u001b[1;33mtrainer:470\u001b[0m$ \u001b[37mUsing underlying `MNISTCNNModel`\u001b[0m\n" - ] - }, - { - "data": { - "text/html": [ - "
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
-       "┃        Test metric               DataLoader 0        ┃\n",
-       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
-       "│         accuracy              0.1298999935388565     │\n",
-       "│         f1_macro             0.058535393327474594    │\n",
-       "│         f1_micro              0.1298999935388565     │\n",
-       "│           loss                 2.299091100692749     │\n",
-       "│      precision_macro         0.039099011570215225    │\n",
-       "│       recall_macro            0.1328250616788864     │\n",
-       "└───────────────────────────┴───────────────────────────┘\n",
-       "
\n" - ], - "text/plain": [ - "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n", - "┃\u001b[1m \u001b[0m\u001b[1m Test metric \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m DataLoader 0 \u001b[0m\u001b[1m \u001b[0m┃\n", - "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n", - "│\u001b[36m \u001b[0m\u001b[36m accuracy \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.1298999935388565 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m f1_macro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.058535393327474594 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m f1_micro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.1298999935388565 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m loss \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 2.299091100692749 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m precision_macro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.039099011570215225 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m recall_macro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.1328250616788864 \u001b[0m\u001b[35m \u001b[0m│\n", - "└───────────────────────────┴───────────────────────────┘\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[1;36m[2022-09-26 17:47:37] energizer/DEBUG\u001b[0m ~ \u001b[1;33mtrainer:466\u001b[0m$ \u001b[37mUsing `LeastConfidenceStrategy`\u001b[0m\n", - "Global seed set to 42\n", - "GPU available: True (mps), used: False\n", - "TPU available: False, using: 0 TPU cores\n", - "IPU available: False, using: 0 IPUs\n", - "HPU available: False, using: 0 HPUs\n", - "/Users/lescipi/miniconda3/envs/energizer-dev/lib/python3.9/site-packages/pytorch_lightning/trainer/trainer.py:1789: UserWarning: MPS available but not used. Set `accelerator` and `devices` using `Trainer(accelerator='mps', devices=1)`.\n", - " rank_zero_warn(\n", - "\u001b[1;32m[2022-09-26 17:47:37] energizer/INFO\u001b[0m ~ \u001b[1;33mtrainer:269\u001b[0m$ \u001b[37mTrainer: trainer active_fit stage\u001b[0m\n", - "\n", - " | Name | Type | Params\n", - "---------------------------------------------------\n", - "0 | model | Sequential | 184 K \n", - "1 | train_metrics | MetricCollection | 0 \n", - "2 | val_metrics | MetricCollection | 0 \n", - "3 | test_metrics | MetricCollection | 0 \n", - "---------------------------------------------------\n", - "184 K Trainable params\n", - "0 Non-trainable params\n", - "184 K Total params\n", - "0.738 Total estimated model params size (MB)\n", - "\u001b[1;36m[2022-09-26 17:47:37] energizer/DEBUG\u001b[0m ~ \u001b[1;33mtrainer:466\u001b[0m$ \u001b[37mUsing `MarginStrategy`\u001b[0m\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "-------------------------Labelling Iteration 0--------------------------\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[1;36m[2022-09-26 17:47:37] energizer/DEBUG\u001b[0m ~ \u001b[1;33mtrainer:470\u001b[0m$ \u001b[37mUsing underlying `MNISTCNNModel`\u001b[0m\n" - ] - }, - { - "data": { - "text/html": [ - "
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
-       "┃        Test metric               DataLoader 0        ┃\n",
-       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
-       "│         accuracy              0.12139999866485596    │\n",
-       "│         f1_macro              0.05989480018615723    │\n",
-       "│         f1_micro              0.12139999866485596    │\n",
-       "│           loss                 2.302485466003418     │\n",
-       "│      precision_macro         0.050614677369594574    │\n",
-       "│       recall_macro            0.1247788593173027     │\n",
-       "└───────────────────────────┴───────────────────────────┘\n",
-       "
\n" - ], - "text/plain": [ - "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n", - "┃\u001b[1m \u001b[0m\u001b[1m Test metric \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m DataLoader 0 \u001b[0m\u001b[1m \u001b[0m┃\n", - "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n", - "│\u001b[36m \u001b[0m\u001b[36m accuracy \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.12139999866485596 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m f1_macro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.05989480018615723 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m f1_micro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.12139999866485596 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m loss \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 2.302485466003418 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m precision_macro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.050614677369594574 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m recall_macro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.1247788593173027 \u001b[0m\u001b[35m \u001b[0m│\n", - "└───────────────────────────┴───────────────────────────┘\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[1;36m[2022-09-26 17:47:40] energizer/DEBUG\u001b[0m ~ \u001b[1;33mtrainer:466\u001b[0m$ \u001b[37mUsing `MarginStrategy`\u001b[0m\n", - "\u001b[1;32m[2022-09-26 17:47:49] energizer/INFO\u001b[0m ~ \u001b[1;33mactive_learning_loop:193\u001b[0m$ \u001b[37mQueried 10 instance\u001b[0m\n", - "\u001b[1;32m[2022-09-26 17:47:49] energizer/INFO\u001b[0m ~ \u001b[1;33mactive_learning_loop:281\u001b[0m$ \u001b[37mAnnotated 10 instances\u001b[0m\n", - "\u001b[1;32m[2022-09-26 17:47:49] energizer/INFO\u001b[0m ~ \u001b[1;33mactive_learning_loop:282\u001b[0m$ \u001b[37mNew data statistics\n", - "num_pool_batches: 430\n", - "num_train_batches: 1\n", - "pool_size: 54990\n", - "total_data_size: 55000\n", - "train_size: 10\n", - "\u001b[0m\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "-------------------------Labelling Iteration 1--------------------------\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[1;36m[2022-09-26 17:47:49] energizer/DEBUG\u001b[0m ~ \u001b[1;33mtrainer:470\u001b[0m$ \u001b[37mUsing underlying `MNISTCNNModel`\u001b[0m\n", - "\u001b[1;36m[2022-09-26 17:47:49] energizer/DEBUG\u001b[0m ~ \u001b[1;33mactive_learning_loop:250\u001b[0m$ \u001b[37mMNISTCNNModel state dict has been re-initialized\u001b[0m\n", - "`Trainer.fit` stopped: `max_epochs=3` reached.\n", - "\u001b[1;36m[2022-09-26 17:47:54] energizer/DEBUG\u001b[0m ~ \u001b[1;33mtrainer:470\u001b[0m$ \u001b[37mUsing underlying `MNISTCNNModel`\u001b[0m\n" - ] - }, - { - "data": { - "text/html": [ - "
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
-       "┃        Test metric               DataLoader 0        ┃\n",
-       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
-       "│         accuracy              0.11969999969005585    │\n",
-       "│         f1_macro             0.054541368037462234    │\n",
-       "│         f1_micro              0.11969999969005585    │\n",
-       "│           loss                 2.29711651802063      │\n",
-       "│      precision_macro         0.045692265033721924    │\n",
-       "│       recall_macro            0.12266905605792999    │\n",
-       "└───────────────────────────┴───────────────────────────┘\n",
-       "
\n" - ], - "text/plain": [ - "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n", - "┃\u001b[1m \u001b[0m\u001b[1m Test metric \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m DataLoader 0 \u001b[0m\u001b[1m \u001b[0m┃\n", - "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n", - "│\u001b[36m \u001b[0m\u001b[36m accuracy \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.11969999969005585 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m f1_macro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.054541368037462234 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m f1_micro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.11969999969005585 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m loss \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 2.29711651802063 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m precision_macro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.045692265033721924 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m recall_macro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.12266905605792999 \u001b[0m\u001b[35m \u001b[0m│\n", - "└───────────────────────────┴───────────────────────────┘\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[1;36m[2022-09-26 17:47:57] energizer/DEBUG\u001b[0m ~ \u001b[1;33mtrainer:466\u001b[0m$ \u001b[37mUsing `MarginStrategy`\u001b[0m\n", - "\u001b[1;32m[2022-09-26 17:48:07] energizer/INFO\u001b[0m ~ \u001b[1;33mactive_learning_loop:193\u001b[0m$ \u001b[37mQueried 10 instance\u001b[0m\n", - "\u001b[1;32m[2022-09-26 17:48:07] energizer/INFO\u001b[0m ~ \u001b[1;33mactive_learning_loop:281\u001b[0m$ \u001b[37mAnnotated 10 instances\u001b[0m\n", - "\u001b[1;32m[2022-09-26 17:48:07] energizer/INFO\u001b[0m ~ \u001b[1;33mactive_learning_loop:282\u001b[0m$ \u001b[37mNew data statistics\n", - "num_pool_batches: 430\n", - "num_train_batches: 1\n", - "pool_size: 54980\n", - "total_data_size: 55000\n", - "train_size: 20\n", - "\u001b[0m\n", - "\u001b[1;36m[2022-09-26 17:48:07] energizer/DEBUG\u001b[0m ~ \u001b[1;33mtrainer:470\u001b[0m$ \u001b[37mUsing underlying `MNISTCNNModel`\u001b[0m\n", - "\u001b[1;36m[2022-09-26 17:48:07] energizer/DEBUG\u001b[0m ~ \u001b[1;33mactive_learning_loop:250\u001b[0m$ \u001b[37mMNISTCNNModel state dict has been re-initialized\u001b[0m\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "-----------------------------Last fit_loop------------------------------\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "`Trainer.fit` stopped: `max_epochs=3` reached.\n", - "\u001b[1;36m[2022-09-26 17:48:13] energizer/DEBUG\u001b[0m ~ \u001b[1;33mtrainer:470\u001b[0m$ \u001b[37mUsing underlying `MNISTCNNModel`\u001b[0m\n" - ] - }, - { - "data": { - "text/html": [ - "
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
-       "┃        Test metric               DataLoader 0        ┃\n",
-       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
-       "│         accuracy              0.11890000104904175    │\n",
-       "│         f1_macro              0.05812247842550278    │\n",
-       "│         f1_micro              0.11890000104904175    │\n",
-       "│           loss                2.2988967895507812     │\n",
-       "│      precision_macro         0.054246868938207626    │\n",
-       "│       recall_macro            0.12245862185955048    │\n",
-       "└───────────────────────────┴───────────────────────────┘\n",
-       "
\n" - ], - "text/plain": [ - "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n", - "┃\u001b[1m \u001b[0m\u001b[1m Test metric \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m DataLoader 0 \u001b[0m\u001b[1m \u001b[0m┃\n", - "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n", - "│\u001b[36m \u001b[0m\u001b[36m accuracy \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.11890000104904175 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m f1_macro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.05812247842550278 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m f1_micro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.11890000104904175 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m loss \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 2.2988967895507812 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m precision_macro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.054246868938207626 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m recall_macro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.12245862185955048 \u001b[0m\u001b[35m \u001b[0m│\n", - "└───────────────────────────┴───────────────────────────┘\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[1;36m[2022-09-26 17:48:16] energizer/DEBUG\u001b[0m ~ \u001b[1;33mtrainer:466\u001b[0m$ \u001b[37mUsing `MarginStrategy`\u001b[0m\n", - "Global seed set to 42\n", - "GPU available: True (mps), used: False\n", - "TPU available: False, using: 0 TPU cores\n", - "IPU available: False, using: 0 IPUs\n", - "HPU available: False, using: 0 HPUs\n", - "/Users/lescipi/miniconda3/envs/energizer-dev/lib/python3.9/site-packages/pytorch_lightning/trainer/trainer.py:1789: UserWarning: MPS available but not used. Set `accelerator` and `devices` using `Trainer(accelerator='mps', devices=1)`.\n", - " rank_zero_warn(\n", - "\u001b[1;32m[2022-09-26 17:48:16] energizer/INFO\u001b[0m ~ \u001b[1;33mtrainer:269\u001b[0m$ \u001b[37mTrainer: trainer active_fit stage\u001b[0m\n", - "\n", - " | Name | Type | Params\n", - "---------------------------------------------------\n", - "0 | model | Sequential | 184 K \n", - "1 | train_metrics | MetricCollection | 0 \n", - "2 | val_metrics | MetricCollection | 0 \n", - "3 | test_metrics | MetricCollection | 0 \n", - "---------------------------------------------------\n", - "184 K Trainable params\n", - "0 Non-trainable params\n", - "184 K Total params\n", - "0.738 Total estimated model params size (MB)\n", - "\u001b[1;36m[2022-09-26 17:48:16] energizer/DEBUG\u001b[0m ~ \u001b[1;33mtrainer:466\u001b[0m$ \u001b[37mUsing `EntropyStrategy`\u001b[0m\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "-------------------------Labelling Iteration 0--------------------------\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[1;36m[2022-09-26 17:48:16] energizer/DEBUG\u001b[0m ~ \u001b[1;33mtrainer:470\u001b[0m$ \u001b[37mUsing underlying `MNISTCNNModel`\u001b[0m\n" - ] - }, - { - "data": { - "text/html": [ - "
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
-       "┃        Test metric               DataLoader 0        ┃\n",
-       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
-       "│         accuracy              0.12139999866485596    │\n",
-       "│         f1_macro              0.05989480018615723    │\n",
-       "│         f1_micro              0.12139999866485596    │\n",
-       "│           loss                 2.302485466003418     │\n",
-       "│      precision_macro         0.050614677369594574    │\n",
-       "│       recall_macro            0.1247788593173027     │\n",
-       "└───────────────────────────┴───────────────────────────┘\n",
-       "
\n" - ], - "text/plain": [ - "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n", - "┃\u001b[1m \u001b[0m\u001b[1m Test metric \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m DataLoader 0 \u001b[0m\u001b[1m \u001b[0m┃\n", - "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n", - "│\u001b[36m \u001b[0m\u001b[36m accuracy \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.12139999866485596 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m f1_macro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.05989480018615723 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m f1_micro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.12139999866485596 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m loss \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 2.302485466003418 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m precision_macro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.050614677369594574 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m recall_macro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.1247788593173027 \u001b[0m\u001b[35m \u001b[0m│\n", - "└───────────────────────────┴───────────────────────────┘\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[1;36m[2022-09-26 17:48:19] energizer/DEBUG\u001b[0m ~ \u001b[1;33mtrainer:466\u001b[0m$ \u001b[37mUsing `EntropyStrategy`\u001b[0m\n", - "\u001b[1;32m[2022-09-26 17:48:28] energizer/INFO\u001b[0m ~ \u001b[1;33mactive_learning_loop:193\u001b[0m$ \u001b[37mQueried 10 instance\u001b[0m\n", - "\u001b[1;32m[2022-09-26 17:48:28] energizer/INFO\u001b[0m ~ \u001b[1;33mactive_learning_loop:281\u001b[0m$ \u001b[37mAnnotated 10 instances\u001b[0m\n", - "\u001b[1;32m[2022-09-26 17:48:28] energizer/INFO\u001b[0m ~ \u001b[1;33mactive_learning_loop:282\u001b[0m$ \u001b[37mNew data statistics\n", - "num_pool_batches: 430\n", - "num_train_batches: 1\n", - "pool_size: 54990\n", - "total_data_size: 55000\n", - "train_size: 10\n", - "\u001b[0m\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "-------------------------Labelling Iteration 1--------------------------\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[1;36m[2022-09-26 17:48:28] energizer/DEBUG\u001b[0m ~ \u001b[1;33mtrainer:470\u001b[0m$ \u001b[37mUsing underlying `MNISTCNNModel`\u001b[0m\n", - "\u001b[1;36m[2022-09-26 17:48:28] energizer/DEBUG\u001b[0m ~ \u001b[1;33mactive_learning_loop:250\u001b[0m$ \u001b[37mMNISTCNNModel state dict has been re-initialized\u001b[0m\n", - "`Trainer.fit` stopped: `max_epochs=3` reached.\n", - "\u001b[1;36m[2022-09-26 17:48:34] energizer/DEBUG\u001b[0m ~ \u001b[1;33mtrainer:470\u001b[0m$ \u001b[37mUsing underlying `MNISTCNNModel`\u001b[0m\n" - ] - }, - { - "data": { - "text/html": [ - "
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
-       "┃        Test metric               DataLoader 0        ┃\n",
-       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
-       "│         accuracy              0.12999999523162842    │\n",
-       "│         f1_macro              0.06347090005874634    │\n",
-       "│         f1_micro              0.12999999523162842    │\n",
-       "│           loss                2.2974393367767334     │\n",
-       "│      precision_macro         0.046992816030979156    │\n",
-       "│       recall_macro            0.1336027979850769     │\n",
-       "└───────────────────────────┴───────────────────────────┘\n",
-       "
\n" - ], - "text/plain": [ - "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n", - "┃\u001b[1m \u001b[0m\u001b[1m Test metric \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m DataLoader 0 \u001b[0m\u001b[1m \u001b[0m┃\n", - "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n", - "│\u001b[36m \u001b[0m\u001b[36m accuracy \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.12999999523162842 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m f1_macro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.06347090005874634 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m f1_micro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.12999999523162842 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m loss \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 2.2974393367767334 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m precision_macro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.046992816030979156 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m recall_macro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.1336027979850769 \u001b[0m\u001b[35m \u001b[0m│\n", - "└───────────────────────────┴───────────────────────────┘\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[1;36m[2022-09-26 17:48:36] energizer/DEBUG\u001b[0m ~ \u001b[1;33mtrainer:466\u001b[0m$ \u001b[37mUsing `EntropyStrategy`\u001b[0m\n", - "\u001b[1;32m[2022-09-26 17:48:46] energizer/INFO\u001b[0m ~ \u001b[1;33mactive_learning_loop:193\u001b[0m$ \u001b[37mQueried 10 instance\u001b[0m\n", - "\u001b[1;32m[2022-09-26 17:48:46] energizer/INFO\u001b[0m ~ \u001b[1;33mactive_learning_loop:281\u001b[0m$ \u001b[37mAnnotated 10 instances\u001b[0m\n", - "\u001b[1;32m[2022-09-26 17:48:46] energizer/INFO\u001b[0m ~ \u001b[1;33mactive_learning_loop:282\u001b[0m$ \u001b[37mNew data statistics\n", - "num_pool_batches: 430\n", - "num_train_batches: 1\n", - "pool_size: 54980\n", - "total_data_size: 55000\n", - "train_size: 20\n", - "\u001b[0m\n", - "\u001b[1;36m[2022-09-26 17:48:46] energizer/DEBUG\u001b[0m ~ \u001b[1;33mtrainer:470\u001b[0m$ \u001b[37mUsing underlying `MNISTCNNModel`\u001b[0m\n", - "\u001b[1;36m[2022-09-26 17:48:46] energizer/DEBUG\u001b[0m ~ \u001b[1;33mactive_learning_loop:250\u001b[0m$ \u001b[37mMNISTCNNModel state dict has been re-initialized\u001b[0m\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "-----------------------------Last fit_loop------------------------------\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "`Trainer.fit` stopped: `max_epochs=3` reached.\n", - "\u001b[1;36m[2022-09-26 17:48:52] energizer/DEBUG\u001b[0m ~ \u001b[1;33mtrainer:470\u001b[0m$ \u001b[37mUsing underlying `MNISTCNNModel`\u001b[0m\n" - ] - }, - { - "data": { - "text/html": [ - "
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
-       "┃        Test metric               DataLoader 0        ┃\n",
-       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
-       "│         accuracy              0.12530000507831573    │\n",
-       "│         f1_macro              0.06157331541180611    │\n",
-       "│         f1_micro              0.12530000507831573    │\n",
-       "│           loss                 2.297584295272827     │\n",
-       "│      precision_macro          0.04746979475021362    │\n",
-       "│       recall_macro            0.1287963092327118     │\n",
-       "└───────────────────────────┴───────────────────────────┘\n",
-       "
\n" - ], - "text/plain": [ - "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n", - "┃\u001b[1m \u001b[0m\u001b[1m Test metric \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m DataLoader 0 \u001b[0m\u001b[1m \u001b[0m┃\n", - "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n", - "│\u001b[36m \u001b[0m\u001b[36m accuracy \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.12530000507831573 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m f1_macro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.06157331541180611 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m f1_micro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.12530000507831573 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m loss \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 2.297584295272827 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m precision_macro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.04746979475021362 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m recall_macro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.1287963092327118 \u001b[0m\u001b[35m \u001b[0m│\n", - "└───────────────────────────┴───────────────────────────┘\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[1;36m[2022-09-26 17:48:55] energizer/DEBUG\u001b[0m ~ \u001b[1;33mtrainer:466\u001b[0m$ \u001b[37mUsing `EntropyStrategy`\u001b[0m\n", - "Global seed set to 42\n", - "GPU available: True (mps), used: False\n", - "TPU available: False, using: 0 TPU cores\n", - "IPU available: False, using: 0 IPUs\n", - "HPU available: False, using: 0 HPUs\n", - "/Users/lescipi/miniconda3/envs/energizer-dev/lib/python3.9/site-packages/pytorch_lightning/trainer/trainer.py:1789: UserWarning: MPS available but not used. Set `accelerator` and `devices` using `Trainer(accelerator='mps', devices=1)`.\n", - " rank_zero_warn(\n", - "\u001b[1;32m[2022-09-26 17:48:55] energizer/INFO\u001b[0m ~ \u001b[1;33mtrainer:269\u001b[0m$ \u001b[37mTrainer: trainer active_fit stage\u001b[0m\n", - "\n", - " | Name | Type | Params\n", - "---------------------------------------------------\n", - "0 | model | Sequential | 184 K \n", - "1 | train_metrics | MetricCollection | 0 \n", - "2 | val_metrics | MetricCollection | 0 \n", - "3 | test_metrics | MetricCollection | 0 \n", - "---------------------------------------------------\n", - "184 K Trainable params\n", - "0 Non-trainable params\n", - "184 K Total params\n", - "0.738 Total estimated model params size (MB)\n", - "\u001b[1;36m[2022-09-26 17:48:55] energizer/DEBUG\u001b[0m ~ \u001b[1;33mtrainer:466\u001b[0m$ \u001b[37mUsing `BALDStrategy`\u001b[0m\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "-------------------------Labelling Iteration 0--------------------------\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[1;36m[2022-09-26 17:48:55] energizer/DEBUG\u001b[0m ~ \u001b[1;33mtrainer:470\u001b[0m$ \u001b[37mUsing underlying `MNISTCNNModel`\u001b[0m\n" - ] - }, - { - "data": { - "text/html": [ - "
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
-       "┃        Test metric               DataLoader 0        ┃\n",
-       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
-       "│         accuracy              0.09989999979734421    │\n",
-       "│         f1_macro              0.07487398386001587    │\n",
-       "│         f1_micro              0.09989999979734421    │\n",
-       "│           loss                 2.383131742477417     │\n",
-       "│      precision_macro          0.09914936870336533    │\n",
-       "│       recall_macro            0.10110820829868317    │\n",
-       "└───────────────────────────┴───────────────────────────┘\n",
-       "
\n" - ], - "text/plain": [ - "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n", - "┃\u001b[1m \u001b[0m\u001b[1m Test metric \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m DataLoader 0 \u001b[0m\u001b[1m \u001b[0m┃\n", - "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n", - "│\u001b[36m \u001b[0m\u001b[36m accuracy \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.09989999979734421 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m f1_macro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.07487398386001587 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m f1_micro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.09989999979734421 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m loss \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 2.383131742477417 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m precision_macro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.09914936870336533 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m recall_macro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.10110820829868317 \u001b[0m\u001b[35m \u001b[0m│\n", - "└───────────────────────────┴───────────────────────────┘\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[1;36m[2022-09-26 17:48:57] energizer/DEBUG\u001b[0m ~ \u001b[1;33mtrainer:466\u001b[0m$ \u001b[37mUsing `BALDStrategy`\u001b[0m\n", - "\u001b[1;32m[2022-09-26 17:49:59] energizer/INFO\u001b[0m ~ \u001b[1;33mactive_learning_loop:193\u001b[0m$ \u001b[37mQueried 10 instance\u001b[0m\n", - "\u001b[1;32m[2022-09-26 17:49:59] energizer/INFO\u001b[0m ~ \u001b[1;33mactive_learning_loop:281\u001b[0m$ \u001b[37mAnnotated 10 instances\u001b[0m\n", - "\u001b[1;32m[2022-09-26 17:49:59] energizer/INFO\u001b[0m ~ \u001b[1;33mactive_learning_loop:282\u001b[0m$ \u001b[37mNew data statistics\n", - "num_pool_batches: 430\n", - "num_train_batches: 1\n", - "pool_size: 54990\n", - "total_data_size: 55000\n", - "train_size: 10\n", - "\u001b[0m\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "-------------------------Labelling Iteration 1--------------------------\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[1;36m[2022-09-26 17:49:59] energizer/DEBUG\u001b[0m ~ \u001b[1;33mtrainer:470\u001b[0m$ \u001b[37mUsing underlying `MNISTCNNModel`\u001b[0m\n", - "\u001b[1;36m[2022-09-26 17:49:59] energizer/DEBUG\u001b[0m ~ \u001b[1;33mactive_learning_loop:250\u001b[0m$ \u001b[37mMNISTCNNModel state dict has been re-initialized\u001b[0m\n", - "`Trainer.fit` stopped: `max_epochs=3` reached.\n", - "\u001b[1;36m[2022-09-26 17:50:04] energizer/DEBUG\u001b[0m ~ \u001b[1;33mtrainer:470\u001b[0m$ \u001b[37mUsing underlying `MNISTCNNModel`\u001b[0m\n" - ] - }, - { - "data": { - "text/html": [ - "
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
-       "┃        Test metric               DataLoader 0        ┃\n",
-       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
-       "│         accuracy              0.10409999638795853    │\n",
-       "│         f1_macro              0.07243089377880096    │\n",
-       "│         f1_micro              0.10409999638795853    │\n",
-       "│           loss                 2.390538215637207     │\n",
-       "│      precision_macro          0.10765033960342407    │\n",
-       "│       recall_macro            0.1064007356762886     │\n",
-       "└───────────────────────────┴───────────────────────────┘\n",
-       "
\n" - ], - "text/plain": [ - "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n", - "┃\u001b[1m \u001b[0m\u001b[1m Test metric \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m DataLoader 0 \u001b[0m\u001b[1m \u001b[0m┃\n", - "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n", - "│\u001b[36m \u001b[0m\u001b[36m accuracy \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.10409999638795853 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m f1_macro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.07243089377880096 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m f1_micro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.10409999638795853 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m loss \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 2.390538215637207 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m precision_macro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.10765033960342407 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m recall_macro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.1064007356762886 \u001b[0m\u001b[35m \u001b[0m│\n", - "└───────────────────────────┴───────────────────────────┘\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[1;36m[2022-09-26 17:50:08] energizer/DEBUG\u001b[0m ~ \u001b[1;33mtrainer:466\u001b[0m$ \u001b[37mUsing `BALDStrategy`\u001b[0m\n", - "\u001b[1;32m[2022-09-26 17:51:22] energizer/INFO\u001b[0m ~ \u001b[1;33mactive_learning_loop:193\u001b[0m$ \u001b[37mQueried 10 instance\u001b[0m\n", - "\u001b[1;32m[2022-09-26 17:51:22] energizer/INFO\u001b[0m ~ \u001b[1;33mactive_learning_loop:281\u001b[0m$ \u001b[37mAnnotated 10 instances\u001b[0m\n", - "\u001b[1;32m[2022-09-26 17:51:22] energizer/INFO\u001b[0m ~ \u001b[1;33mactive_learning_loop:282\u001b[0m$ \u001b[37mNew data statistics\n", - "num_pool_batches: 430\n", - "num_train_batches: 1\n", - "pool_size: 54980\n", - "total_data_size: 55000\n", - "train_size: 20\n", - "\u001b[0m\n", - "\u001b[1;36m[2022-09-26 17:51:22] energizer/DEBUG\u001b[0m ~ \u001b[1;33mtrainer:470\u001b[0m$ \u001b[37mUsing underlying `MNISTCNNModel`\u001b[0m\n", - "\u001b[1;36m[2022-09-26 17:51:22] energizer/DEBUG\u001b[0m ~ \u001b[1;33mactive_learning_loop:250\u001b[0m$ \u001b[37mMNISTCNNModel state dict has been re-initialized\u001b[0m\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "-----------------------------Last fit_loop------------------------------\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "`Trainer.fit` stopped: `max_epochs=3` reached.\n", - "\u001b[1;36m[2022-09-26 17:51:27] energizer/DEBUG\u001b[0m ~ \u001b[1;33mtrainer:470\u001b[0m$ \u001b[37mUsing underlying `MNISTCNNModel`\u001b[0m\n" - ] - }, - { - "data": { - "text/html": [ - "
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
-       "┃        Test metric               DataLoader 0        ┃\n",
-       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
-       "│         accuracy              0.10339999943971634    │\n",
-       "│         f1_macro              0.07382594794034958    │\n",
-       "│         f1_micro              0.10339999943971634    │\n",
-       "│           loss                 2.378535270690918     │\n",
-       "│      precision_macro          0.10162188857793808    │\n",
-       "│       recall_macro            0.10477112978696823    │\n",
-       "└───────────────────────────┴───────────────────────────┘\n",
-       "
\n" - ], - "text/plain": [ - "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n", - "┃\u001b[1m \u001b[0m\u001b[1m Test metric \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m DataLoader 0 \u001b[0m\u001b[1m \u001b[0m┃\n", - "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n", - "│\u001b[36m \u001b[0m\u001b[36m accuracy \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.10339999943971634 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m f1_macro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.07382594794034958 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m f1_micro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.10339999943971634 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m loss \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 2.378535270690918 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m precision_macro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.10162188857793808 \u001b[0m\u001b[35m \u001b[0m│\n", - "│\u001b[36m \u001b[0m\u001b[36m recall_macro \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.10477112978696823 \u001b[0m\u001b[35m \u001b[0m│\n", - "└───────────────────────────┴───────────────────────────┘\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[1;36m[2022-09-26 17:51:30] energizer/DEBUG\u001b[0m ~ \u001b[1;33mtrainer:466\u001b[0m$ \u001b[37mUsing `BALDStrategy`\u001b[0m\n" - ] - } - ], - "source": [ - "for name, strategy in strategies.items():\n", - " seed_everything(42) # for reproducibility (e.g., dropout)\n", - "\n", - " trainer = Trainer(**trainer_kwargs, enable_progress_bar=False)\n", - "\n", - " results = trainer.active_fit(\n", - " model=strategy,\n", - " train_dataloaders=train_dl,\n", - " val_dataloaders=val_dl,\n", - " test_dataloaders=test_dl,\n", - " )\n", - "\n", - " results_dict[name] = results.to_pandas()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Results\n", - "Now let's look at the results" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "metadata": {}, - "outputs": [], - "source": [ - "results_df = pd.concat([v.assign(query_strategy=k) for k, v in results_dict.items()])\n", - "results_df = results_df.melt(\n", - " id_vars=[\"train_size\", \"query_strategy\"], var_name=\"metrics\"\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 87, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAACUIAAAGhCAYAAACuvlz1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/NK7nSAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdeVhU5dsH8O8sMAvDDuICIuKOG25pkimUmWku5VZZaoulmb7+UnLXcAPLTE2tzLJN07Ky0jI1s81Kc00lQFZB2ZdhmBlm5rx/DBwZQWVcgIHv57q4YM6cc+Y5zwxnmXM/9y0RBEEAERERERERERERERERERERERGRA5PWdgOIiIiIiIiIiIiIiIiIiIiIiIhuFQOhiIiIiIiIiIiIiIiIiIiIiIjI4TEQioiIiIiIiIiIiIiIiIiIiIiIHB4DoYiIiIiIiIiIiIiIiIiIiIiIyOExEIqIiIiIiIiIiIiIiIiIiIiIiBweA6GIiIiIiIiIiIiIiIiIiIiIiMjhMRCKiIiIiIiIiIiIiIiIiIiIiIgcHgOhiIiIiIiIiIiIiIiIiIiIiIjI4TEQioiIiIiIiIiIiIiIiIiIiIiIHB4DoYiIiIiIiIiIiIiIiIiIiIiIyOExEIqIiIiIiIiIiIiIiIiIiIiIiBweA6GIiIiIiIiIiIiIiIiIiIiIiMjhMRCKiIiIiIiIiIiIiIiIiIiIiIgcHgOhiIiIiIiIiIiIiIiIiIiIiIjI4TEQioiIiIiIiIiIiIiIiIiIiIiIHB4DoYiIiIiIiKje2rVrF8LDw2u7GfVeWloa2rZti7S0tDv2GkajETt27Lhj669o3bp16N69O3r06IEPP/zwup+hV155Ba+88kqNtIvqtnXr1mH8+PG13YwGpSb3C3Rtt3IMuNE+NDw8HLt27bqV5hEREREREVEDw0AoIiIiIiIiIqrzvvvuO2zatOmOv05BQQHWr1+PyMhIfP311xg9ejQ+//zzO/665PgmTZqEdevW1XYzGpSa2i8QERERERERkeOQ13YDiIiIiIiIiIhuRBCEGnkdrVYLAOjTpw+aNWsGAFAqlTXy2uTYXFxcarsJDU5N7ReIiIiIiIiIyHEwIxQREREREVE9JQgCdEZTjf7Ye1O6vJzOW2+9hZ49e2LJkiXYtGkTwsPD0bFjR4SFhWH9+vXi/OPHj8fGjRvx9NNPo3PnznjggQfwyy+/iM9fvnwZzzzzDLp27YoRI0YgJSXF5vUSEhLw9NNPo1u3brjnnnuwfv16WCwWANayVrNnz0ZUVBRCQ0MRHh6OX3/9FR9//DHuvvtu9O7dGx9++OEtvCM3SRAAY3HN/txCcEFhYSFmzZqFbt26ISwsDFFRUdDr9eLzBw4cwPDhw9GpUyf06NEDM2fORHFxsbjstGnT0KNHD/Ts2RMvv/wytFot/vzzT8yZMwcXL14Uyy+ZTCasXr0aYWFh6N69O1566SXk5eUBAAwGA1atWoV7770XXbt2xfPPP4+MjAwAVz5z+/btw3333YdOnTph8uTJyM/PR1pamlgG77777sMrr7xSqbzi0aNHMXz4cHTu3BnTp09HSUmJzfb/+OOPGDx4MLp06YJHH30Uf/31l/jcjT6/OTk5mDFjBrp164a+ffti9erV4v9URkYGnn/+eXTp0gXh4eFYv349zGbzTb9PN0MQBOhKdTX6c7P7lEOHDiE8PByhoaFYunQp/vvvP4wcORJdu3bF5MmTodVqYTQasWLFCtxzzz0ICQlBeHg4PvvsM3Fd4eHhWLVqFcLCwjB8+HAIgoAzZ85g9OjR6Ny5M8aOHYs333xTLIdXsTTerl27MH78eKxduxZ33XUXevTogRUrVtR44I4gCLDodDX6czPbeK3P9/X6sar9wvjx4xEVFYWIiAj0798fWq0Wly5dwvTp09GrVy/cddddWLp0KYxGIwDr+zRu3Di89tprCA0NRf/+/bFz504AwLFjx9ChQwfk5uaK7Txz5gy6dOkiBkzWFEEQUGow19jPzX5Ov//+e/Tr1w/dunXDwoULxX7euXMnBg0ahI4dO+Kuu+7CkiVLrrn/2r59O/r3749u3bphw4YNN91nRERERERE1HAxIxQREREREVE9JAgCHt30B44l59Xo6/YI9MTO5/tAIpHYtdw///yDL774Art378bWrVuxevVqBAQE4JdffsHixYsxYMAAhISEAAA2bdqERYsWYdGiRXj99dexYMECHDx4EFKpFNOnT4darcbOnTsRFxeHefPmwdPTEwCQm5uLxx57DOHh4di5cycSExMxf/58aDQaTJgwAQCwZ88ePPPMM/j666+xevVqzJgxAz169MBHH32E77//HtHR0RgyZAi8vLxua79dkyAAWx4AUv+smdcrF9AbmPQ9YOf7CADz5s1DaWkptm3bBoPBgKVLl+LVV1/F8uXLkZKSgunTp2PhwoW4++67kZSUhJdffhk7duzAxIkTsXbtWmRlZWHbtm0wmUyYNWsWNmzYgBkzZmDu3LnYsmULPv/8c3h5eWHNmjX46quvsHz5cjRt2lT8TKxduxaLFi3CP//8g+joaHh4eOC1117DlClT8MUXX4jt3LRpkxho9MILL+D999/HSy+9hJ07d2LUqFHYuXMngoKC8OOPP4rL5ObmYvLkyRgzZgxWr16N7777DuvXr8eIESMAAOfPn0dkZCSWLFmCzp074+eff8azzz6L3bt3IzAwUHzda31+p06dCplMho8//hjFxcX4v//7PzRq1AiPP/44XnzxRbRr1w5ffvklsrKysHDhQkgkEkydOvUW3+zqEQQBT+59EieyTtTI65ULbRSKrYO22r1Peeedd7BhwwbEx8fjf//7Hw4fPoxFixZBqVRiypQp+Pzzz6HVanHo0CGsW7cO3t7e+PLLL8UgGh8fHwDAN998g/feew+CIECr1eKZZ57Bgw8+iJUrV+L333/HihUr0K1btyrbcPz4cfj4+GDbtm04ffo0XnnlFfTr1w99+/a95X6pDkEQkPzY4yg5frxGXq+cqls3BH7ycbXfM0EQrvn5btKkyTX7sWfPnpX2C4A1uOm9996Ds7MznJ2d8dRTTyEwMBAfffQRcnNzsWDBAgDA/PnzAQCnT5+GWq3GZ599hlOnTmHx4sVo0qQJ+vbtCz8/P/z4448YM2YMAGDv3r249957odFo7kDPXbt/dq36B5cuFNTYazYJdseIl7vZ/X+3Y8cOvPHGGzCbzZg9ezbefvttMfhs1apV6NChA86cOYNZs2ahT58+GDhwoM3yv/zyC5YtW4aoqCiEhIRg9erVuHjx4u3cNCIiIiIiImoAmBGKiIiIiIionrI/hKX2PPXUU2jevLmY7aNPnz7w9/fHuHHj4Ovri7i4OHHee++9FyNHjkTz5s3xwgsvICMjA1lZWYiLi8Px48exdOlStG7dGoMHD8a4cePE5b799luoVCpERUUhODgY9913H6ZPn47NmzeL83h6emL69Olo3rw5RowYgaKiIsybNw/BwcF4+umnYTKZkJycXKN940jvpMViwf79+7Fq1Sq0bdsWnTt3RlRUFL788ksUFRXBYrFg/vz5GD16NPz9/REWFoa7775bfH8vXrwIFxcX+Pv7o3379njzzTfxyCOPwNnZGa6urpDJZPD19YVUKsWOHTvwf//3f+jXrx9atWqFJUuWoHXr1igoKMDXX3+NhQsXonfv3mjXrh1ee+01JCYm4rfffhPb+tJLL6Fz587o0qULhg4ditOnT0Mmk4nBFF5eXnB1dbXZvr1798LLywuzZs1Cy5YtMW3aNHTq1El8/r333sPo0aMxdOhQBAYG4sknn0S/fv2wbds2cZ5rfX7Pnz+P48ePY+XKlejQoQN69uyJxYsXw83NDUeOHEF6ejqioqLQsmVL3HXXXYiMjKzxDGX2BkXUpilTpqBdu3YYMmQIvL298dBDD6Fv377o3r07+vTpgwsXLqBdu3ZYtmwZunbtioCAADz//PMoLS1FUlKSuJ6HH34Ybdu2Rbt27bBnzx6o1WrMnz8fLVu2xBNPPIEHHnjgmm0wm83iezZs2DC0a9cOp0+froGtr8AB3rMbfb6v1Y9X7xdkMhkAiNmEOnbsiF9++QWXL18W90l9+vTBwoULsW3bNjETnUQiQUxMDNq0aYNHH30UDz30EHbs2AGJRILBgwfj+++/F9v6/fff46GHHqrxPnKAtxEAMHfuXHTv3h29evXC9OnTsX37dqjVaixbtgwDBw6Ev78/Bg0ahA4dOtgc18vt3LkTQ4cOxfDhw9G6dWssX74cCoWiFraEiIiIiIiIHBkzQhEREREREdVDEokEO5/vg5LSmi2dpXKS3VSwRLNmzQAAvXv3xsmTJ/H6668jISEB586dQ1ZWlli+DgBatGgh/l2elcNkMiE+Ph4eHh5o2rSp+HynTp3Em9gJCQkICQmBXH7lUjg0NBRZWVkoLCwEAPj7+4vtVyqVNm0rf1xe6qdGSCTWzEylupp7TQBwUt/UnffDhw/DYrGgX79+NtMtFguSk5PRsWNHODs7Y+PGjYiLi0NcXBzi4+MxbNgwAMCTTz6JKVOmoE+fPujTpw8eeOABDB06tNLr5OXlIT8/X8wSBgCtWrXCtGnTcPLkSVgsFnTp0kV8zsPDA0FBQUhISEBQUBAAiBmaAOvnqLS09IbbFx8fj3bt2tl8xjt16iSWx0tISMDevXttyquVlpYiLCxMfHytz29iYiI8PDwQEBAgPn/fffcBAD7++GPk5+eje/fuNn2q1+uRl5cnZj27kyQSCbYO2ooSU8mNZ76NVHLVTe1TKvajUqkU/4/LHxuNRtx333347bffsHLlSly4cAFnz54FAJuSXRWXi42NRUhIiBhwAwBdu3a1yRpWkbe3t03mII1GA5PJZPe23CyJRILATz6GUFKz75lEZd97lpCQcM3Pd35+vt39WPE9S0hIQIsWLeDu7i5O69atG0wmk1g6NTAwEN7e3uLzHTt2xPbt2wEAQ4YMwQcffIC8vDykpqYiLy8P/fv3r/a23Q4SiQQjXu4Gk9Fy45lvE7mz9Kb+7zp37iz+3aFDB2RnZyMgIABKpRJr165FfHw8YmNjkZycbLNfLJeQkICxY8eKjz09PW3+l4mIiIiIiIiqg4FQRERERERE9ZREIoHa2TEu+8ozPuzcuRPLly/HqFGjMHDgQERGRuLJJ5+0mdfJyanS8oIg2Pyuat6qskqUB1iVBz5UDJIqJ5XWcjJliQRwdqndNlSTyWSCq6urTQm6cn5+fjh//jzGjRuH8PBw9OjRAxMmTMDWrVvFefr06YOff/4ZBw4cwKFDh7Bw4UL8+uuveO2112zWVdX7VO5a2UPMZrNNQF1Vn6PqqOozVh4IZTab8eyzz2L48OE285QH0V3rdQVBuG57TCYTWrZsiQ0bNlR67uqsVXeSRCKB2kldY693KyoGKwFV/x+/8cYb2LlzJ0aOHInhw4dj0aJFCA8Pt5mn4udJJpNVev+vflyRs7NzpWnXm/9OkEgkkKjr9nt2vc/3X3/9ZXc/VnzPqtoflO/vr7XfN5vN4uelffv2aN68Ofbv34+kpCRERETUSoYiiUQCJ4XsxjPWsor/Z+Xv0d9//42ZM2di+PDhuOeeezB16lQsWbLkmuu43nGciIiIiIiIqDpYGo+IiIiIiIjqjG3btmHq1KmYO3cuhg8fDk9PT+Tk5FQreKBNmzYoKCiwKV137tw58e+goCD8+++/Npl/jh8/Di8vL3h4eNzW7Wio7rnnHhQVFVkz0QQGIjAwEHq9HjExMTAajfj666/Rs2dPvP7663jsscfQuXNnJCcni+/vBx98gH///RcjRozAm2++iRUrVmDfvn0AbMuyubm5wdPTE+fPnxennTt3Dv369YO/vz/kcjlOnDghPpeXl4fk5GQxG9TNat26Nc6ePWuTMejqz1haWpq47YGBgfjss89w+PDhG647MDAQ+fn5yMjIEKd9+OGHmDJlCoKCgpCeng4vLy9xvWlpaVi7dq1Dlaura7Zv344FCxbg5ZdfxuDBg8WAtmvtb1q3bo1z587ZBNT9+++/NdLW+ux6n+8budHnPygoCElJScjPzxennThxAnK5HM2bNwcAJCcni2XyAODMmTNo06aN+HjIkCH46aef8PPPP9dKWTxH8t9//4l/nzp1Co0bN8bu3bvxyCOP4NVXX8WoUaMQHByMlJSUKv/PWrdubVM+UqvV1kI5WiIiIiIiInJ0DIQiIiIiIiKiOsPT0xN//PEHEhMTcebMGfzf//0fSktLq1WOLjg4GH369MHcuXNx/vx57N+/Hx9//LH4/NChQ2E0GrFw4UIkJCRg//79WLduHcaNG8dgkttEoVDgnnvuwcsvv4xTp07h33//xZw5c6DT6eDm5gYPDw/Exsbi1KlTSExMxMqVK3H69Gnx/b106RJeffVVnDhxAklJSfjhhx/QoUMHAIBKpUJBQQGSkpJgMpkwfvx4vPnmmzhy5Aji4uKwbNkydO3aFRqNBqNGjUJUVBT+/PNPnD9/HrNmzULjxo3Rt2/fW9q+hx56CCUlJVi2bBkuXLiAzZs349ixY+LzEyZMwJ49e/Dhhx8iJSUFH3zwAT744AObcnjX0rp1a/Tu3Rvz5s1DbGws/vzzT7zzzjvo27cvwsLC0KxZM8yaNQuxsbE4evQoFixYAJVKVSnzEVWfh4cHfvrpJ6SmpuLo0aOYPXs2gGuXv3zooYeg1WqxYsUKJCYmYseOHdizZ09NNrleupXP99X7hav17dsXAQEBmD17NmJjY3HkyBFERUVhyJAhcHNzAwDodDosWrQICQkJ2LFjB77//ns89thj4jqGDBmCX3/9FVlZWbe8D6nvoqKicPLkSfz2229Yu3YtJkyYAA8PDxw/fhyxsbGIi4vDK6+8gqysrCr/z5544gns3bsXO3bsQEJCAhYuXAi9Xl8LW0JERERERESOjIFQREREREREVGfMnTsXWq0Ww4YNw7Rp09C2bVvcf//9Nll3rueNN96Ap6cnxo4di9WrV2P8+PHicxqNBps3b0ZKSgqGDx+OqKgoPPXUU3jxxRfv1OY0SDExMfD398eECRMwceJEBAUFYfXq1QCA8ePHo2vXrpgwYQIee+wxpKenY+rUqTh79iwAYPr06ejWrRteeOEFDBs2DDqdDqtWrQIA9O7dG4GBgRg6dCjOnTuH5557DgMHDsSMGTMwbtw4NG7cGFFRUQCAyMhI3H333XjppZcwbtw4KBQKfPDBB1WW2LKHu7s7Nm/ejNOnT2PYsGH4/fffMWzYMPH5rl27IiYmBp9++ikGDx6MHTt24PXXX0fPnj2rtf5Vq1ZBpVJhzJgx+N///ocxY8bgscceg0wmw8aNG2GxWDB69GhMmzYN9957L+bPn39L29PQLV++HOfOncNDDz2EOXPmYNCgQejcufM19zcuLi7YtGkT/v77bwwdOhRffvklhg4desufq4buVj7fV+8Xqlp3ecm90aNHY+bMmYiIiMCrr74qztOkSRP4+vri0UcfxebNm7Fq1Sp0795dfD4wMBCtWrXC/fffzzJtNzBu3Di88MILmDFjBoYNGyYeY729vTFmzBhMnDgRCoUC48aNq/L96tGjB1asWIG3334bjz76KLy8vNC+ffta2BIiIiIiIiJyZBKhOvUFiIiIiIiIiIiIGrDU1FRcvnwZPXr0EKctWbIEJSUlWLlyZS22jG7Wrl27sH79ehw8ePCa81gsFgwYMADR0dHo3bt3DbaOiIiIiIiIiG4GM0IRERERERERERHdgFarxcSJE/H999/j4sWL2LdvH77++msMGjSotptGd8ihQ4ewfPlyKJVK9OrVq7abQ0RERERERETVIK/tBhAREREREREREdV17du3x8KFC7F69WpkZGSgadOmmDNnDvr371/bTaM75L333kNiYiLWrFkDqZTjSYmIiIiIiIgcAUvjERERERERERERERERERERERGRw+NQJiIiIiIiIiIiIiIiIiIiIiIicngMhCIiIiIiIiIiIiIiIiIiIiIiIofHQCgiIiIiIiIiIiIiIiIiIiIiInJ4DIQiIiIiIiIiIiIiIiIiIiIiIiKHx0AoIiIiIiIiIiIiIiIiIiIiIiJyeAyEIiIiIiIiIiIiIiIiIiIiIiIih8dAKCIiIiIiIiIiIiIiIiIiIiIicngMhCIiIiIiIiIiIiIiIiIiIiIiIofHQCgiIiIiIiIiIiIiIiIiIiIiInJ4DIQiIiIiIiIiIiIiIiIiIiIiIiKHx0AoIiIiIiIiIiIiIiIiIiIiIiJyeAyEIiIiIiIiIiIiIiIiIiIiIiIih8dAKCIiIiIiIiIiIiIiIiIiIiIicngMhCIiIiIiIiIiIiIiIiIiIiIiIofHQCgiIiIiIiIiIiIiIiIiIiIiInJ4DIQiIiIiIiIiIiIiIiIiIiIiIiKHx0AoIiIiIiIiIiIiIiIiIiIiIiJyeAyEIiIiIiIiIiIiIiIiIiIiIiIih8dAKCIiIiIiIiIiIiIiIiIiIiIicngMhCIiIiIiIiIiIiIiIiIiIiIiIofHQCgiIiIiIiIiIiIiIiIiIiIiInJ4DIQiIiIiIiIiIiIiIiIiIiIiIiKHx0AoIiIiIiIiIiIiIiIiIiIiIiJyeAyEIiIiIiIiIiIiIiIiIiIiIiIih8dAKCIiIiIiIiIiIiIiIiIiIiIicngMhCIiIiIiIiIiIiIiIiIiIiIiIofHQChq0HJycrB3795rPr9r1y6Eh4fXYIsqGz9+PNatW1erbSAicnSOsL8nIqLa5QjHitzcXDzxxBPo1KkTIiMjbZ7buHEjXnnllVpqGRFRw8PjxvXx+ywicgSOsC+vSeHh4di1a9dtm4+IqCHiscVWxeuCV155hd9dUY2R13YDiGrTa6+9BkEQ8OCDD1b5/ODBg9G/f/+abRQREd123N8TEdGNOMKxYvfu3UhKSsJXX30FT09Pcfq3336LdevW4eGHH67F1hERNSw8blzfunXr4OTkdMfWT0R0OzjCvrwmff7551Cr1bdtPiKihojHFqK6gYFQ1KAJgnDd55VKJZRKZQ21hoiI7hTu74mI6EYc4Vih1WrRokULBAcHAwBMJhOioqLw5ZdfIiAgoFbbRkTU0PC4cX0eHh53dP1ERLeDI+zLa5KXl9dtnY+IqCHisYWobmBpPHIoaWlpaNu2LQ4dOoTw8HCEhoZi6dKl+O+//zBy5Eh07doVkydPhlarFZfZvn27OO/48eMRGxsLwDoy7csvv8SXX34ppiBs27Yt3nzzTdx11114/vnnK6UnPHXqFMaNG4cuXbrggQcewHfffQcAKC0txfz583HXXXchNDQUzz//PC5fvlzlNowfPx5t27at9DN+/Phq9cGuXbvw4IMPonPnzhg5ciT+/vtv8bk//vgDw4YNQ6dOnRAREYHt27eLz+3ZswcPPPAAOnXqhMGDB2P//v3V7HUioprXEPf3Wq0Wc+bMQZ8+fdCxY0cMGjTIZl+dk5ODGTNmoFu3bujbty9Wr14tXlQlJyfj6aefRmhoKPr3748PP/wQAPDnn3+ibdu2Nq9TMf3sunXrMGXKFDz++OPo1asX/vrrL1y+fBkvvfQSevbsiY4dO2LEiBE4duyYuPy1XmvixIlYunSpzWs9//zzWLNmTZXbS0R0qxrasWLdunVYt24d/v77b7Rt2xZ//vkndDodYmNjsWPHDoSGhtrVf3/++SfCw8Px+eefo2/fvujZsyfeffdd/P333xg0aBBCQ0Mxe/ZsWCwWADd/nCp/n9566y307NkTr776KgDgp59+wogRI9C5c2cMHjwY+/bts6v9RET24nGjZo8bV5fGe//998W+fPrpp5GamirOFxUVhYiICPTv3x9arRaXLl3C9OnT0atXL9x1111YunQpjEajXe0lovqpoe3Ly+dfv369+LqPPfYYEhISbPrj6nPtH3/8EYMHD0aXLl3w6KOP4q+//hLXZzKZsHr1aoSFhaF79+546aWXkJeXB8C25N358+cxduxYdOnSBffccw/Wr18vrqPifBaLBZs3b0ZERAQ6d+5s08flffr1119jyJAh6NixIx577DHxGHAj69atw+zZsxEVFYXQ0FCEh4fj119/xccff4y7774bvXv3Fr+XAoD4+HjxO6tOnTrZ9NX13r9du3Zh7NixmDp1Krp3747du3ffcLuIqP5oqMeWq8/BMzIy8Pzzz6NLly4IDw/H+vXrYTabxWUOHz6MESNGoEuXLnj44Yfxxx9/ALAGfm3atAnh4eHo2LEjwsLCbI4ZN2v8+PF47733MHHiRHTu3BmPPvookpOTsWDBAoSGhmLgwIE2x7cDBw5g+PDh6NSpE3r06IGZM2eiuLhYfP7rr7/GoEGD0KVLF4wdOxZnz54FcOV+ycMPP4w+ffogKSkJBQUFWLBgAe6++250794ds2bNQkFBwS1vE9UwgciBpKamCm3atBHGjRsnnDt3Tvjmm2+ENm3aCPfff7/w66+/CkePHhV69eolvP/++4IgCMKBAweEvn37CgcPHhQSExOFN954Q+jVq5eQn58vaLVaYfr06cL06dOFnJwcQRAEoU2bNsKwYcOEhIQEIS4uTvjiiy+EAQMGCIIgCNnZ2UL37t2FJUuWCAkJCcIXX3whhISECOfOnRPef/99YeDAgcKZM2eE+Ph44YknnhBeeumlKrchLy9PyMzMrPSTl5dX5fxPPPGEsHbtWkEQBOGLL74QunbtKnz55ZdCQkKCsGrVKqFr167CpUuX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Pi22Yfz48di9eze+/PJLJCcnY8WKFRAEoVK5P8BaBq9fv36IjIzEqVOncOrUKURGRqJnz55o06ZNjW0T3TpmhKJ6bfDgwcjOzsbatWuRnZ2NVq1aYePGjeJJ/7BhwzB16lQ8/PDDOHLkyHXX5ebmhrfffhvLly/HRx99hICAALz++uto37492rZti0uXLmHWrFkoKChAx44dsXHjxkppFG/n9mRlZaF9+/bYsmWLeHDdsGEDli9fjocffhguLi549NFHMWrUKEilUqxbtw6vvfYaNm3aBG9vb8ycOVO8cU1E5OgcfX/v7OyMVatWITo6Gh999BH8/f3xwgsvYM2aNTh37hyCg4OxatUqLFmyBGPGjIFGo8GYMWPw2GOPQSKRYMOGDXj11VcxYsQI+Pj4YPbs2ejfvz8AICoqCm+88QY++ugj3H///Xj88ceRl5dXZTsaN26MxYsX46233sLq1asRFBSE+fPnIzIyEmfPnkVoaOh1X6v8vfj222/5xRAR1TmOfqyoTbdynLp48WKl9XXp0gUxMTFYt24dVq1ahaCgIKxZs6ZSWnkiotrE48btM2zYMFy+fBlLliyBVqtFr169sHbt2irnlclk2LBhA6KiojB69Gi4uLhg6NChmDlzZg23mojqg/qyLx86dCi2b9+ORYsWoUePHnj33XevWeana9eu4rl2TEwMmjdvjtdffx09e/YEYC15V1RUhBkzZsBkMqF///5YsGBBpfW88cYbePXVV/Hoo49CLpdj0KBBmDJlSqX5Jk2aBK1WiwULFkCr1SI0NBQfffRRpSxLd1poaCimTp2KJUuWwGAwoG3btli4cCHmzZuHy5cvw8/P75rv39VZTurSdhFR3VNfji0VyWQybNy4UTwHV6vVGDRoECIjIwEAzZs3x7p16/D6669j9erVaN26NTZt2gQ/Pz/MnTsXc+fOxbBhw+Dt7Y0HH3wQKpWqyn3rnTJ+/HicPXsWEyZMgEKhQM+ePTF16lR89913AICePXti0aJFeOutt5CVlYWOHTti06ZN1ywdGB0djaVLl2LChAmQyWSIiIjAnDlzamx76PaQCDWZl4yIiIiI6rUdO3Zg9+7d+Pjjj2u7KUREREREREREDm38+PHo1asXpk2bVttNISIiInIYzAhFRERERLcsOTkZZ86cwcaNGzFjxozabg4RERERERERERER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BjOHwwGbzZbwG5LdbkcgEIDL5UJKSkrC+k899RQA4PXXX2+zr/YSmlJTU1FZWQmHwwEACc/b7XYAQGVlpaJEqO5MUd7f05sPNmwvZdheyrHNlOmr9mIiFBERERER9bi8vDyo1WoUFhbGy4QXFBRgypQpba7AmzZtGjZt2gRZliEIAmRZxu7du/GjH/0Isizj0ksvxY9//OP4dEderxcnTpzA6NGjFR2HiIiIiIiIiIjOTD6fLyEJCkD8cetq4qfi9/vb3VcwGITf70/Y9+kc53SmKOeU8MqwvZRheynHNlOmt9uLiVBERERERNTjDAYDFi9ejNWrV+Ohhx5CdXU1Nm/ejPXr1wOIXqVnsVig1+uxYMECPPbYY1i3bh2WLVuGrVu3wufzYeHChRAEARdddBF+97vfISsrCykpKXj88ccxbNgwXHjhhVCpVJ0eh4iIiIiIiIiIznw6na5NIlLTY71e3yP7MhgMCUlPOp0u4TgGg0HRcbozRTmnhFeG7aUM20s5tpkyp9tednvXEqiYCEVERERERL1i1apVWL16NW688UaYzWbccccdmD9/PgBg7ty5WL9+PZYsWQKz2Yxnn30WDzzwAF599VVMmDABzz33HIxGIwDgrrvuglqtxp133gmPx4NzzjkHzz33HFQq1SmPQ0REREREREREZ76MjAzU1dUhHA5DrY4OgTscDuj1eiQlJSnel9PpTFjmdDqRlpaGjIyM+L5HjBgRvw8AaWlpio5zOlOUc3pzZdheyrC9lGObKdPb7cVEKCIiIiIi6hUGgwEbNmzAhg0b2jx38ODBhMdTp07FG2+80e5+dDodfvGLX+AXv/iF4uMQEREREREREdGZLy8vD2q1GoWFhZg9ezYAoKCgAFOmTIEoior2NW3aNBQUFGDJkiUAgIqKClRUVGDatGnIyMhAZmYmCgoK4olQBQUFyMzMRHp6es++KCIi6hYmQhERERERERERERERERER0aBlMBiwePFirF69Gg899BCqq6uxefNmrF+/HkC0apPFYunSNHnXXnstrr/+ekyfPh1TpkzBunXrcNFFFyE7Ozv+/KOPPophw4YBAB577DEsX768914cEREpMugToQSh+9t0Z9uhiO2lHNtMGbaXcmwzZbrbTmxnZdheyrC9lGObKcP2Uo59i77BNlOG7aUM20s5tpky7Fv0DbaXMmwv5dhmyrC9lGPfom+wzZRheynD9lJuILTZqlWrsHr1atx4440wm8244447MH/+fADA3LlzsX79+niVp87MmDEDDz74IJ544gnU19fjvPPOw9q1a+PP33zzzaipqcHtt98OlUqFpUuX4qabblJ8vowXvY/tpQzbSzm2mTJ91V6CLHOmQiIiIiIiIiIiIiIiIiIiIiIiGtyUTYhKREREREREREREREREREREREQ0ADERioiIiIiIiIiIiIiIiIiIiIiIBj0mQhERERERERERERERERERERER0aDHRCgiIiIiIiIiIiIiIiIiIiIiIhr0mAhFRERERERERERERERERERERESDHhOhiIiIiIiIiIiIiIiIiIiIiIho0GMiFBERERERERERERERERERERERDXpMhCIiIiIiIiIiIiIiIiIiIiIiokGPiVBERERERERERERERERERERERDToDblEqEAggHvuuQezZ8/G3LlzsXnz5v4+pQHtvffew4QJExL+VqxY0d+nNSAFg0F861vfwueffx5fVlpaiptuugnTp0/H5Zdfjo8++qgfz3Bgaa+9fvWrX7V5v23ZsqUfz7L/VVVVYcWKFTjrrLNw/vnnY/369QgEAgD4/upNjBXKMV50DWOFcowXXcN40T8YL5RhrOg6xgtlGCu6hrGifzBWKMd40TWMFcoxXnQN40X/YLxQhrGi6xgvlGGs6BrGiv7DeKEM40XXMFYox3jRNf0ZL9Q9urdBYOPGjdi7dy9efPFFlJeXY+XKlcjMzMSCBQv6+9QGpCNHjmDevHlYu3ZtfJlOp+vHMxqYAoEA7rzzThw+fDi+TJZl3HbbbRg/fjxee+01vP/++7j99tvx9ttvIzMzsx/Ptv+1114AUFxcjDvvvBNXXnllfJnZbO7r0xswZFnGihUrkJSUhJdffhn19fW45557IIoi7r77br6/ehFjhXKMF6fGWKEc40XXMF70H8YLZRgruobxQhnGiq5hrOg/jBXKMV6cGmOFcowXXcN40X8YL5RhrOgaxgtlGCu6hrGifzFeKMN4cWqMFcoxXnRNf8eLIZUI5fV6sW3bNmzatAn5+fnIz8/H4cOH8fLLLzNAdKC4uBjjx49HWlpaf5/KgHXkyBHceeedkGU5Yflnn32G0tJSbN26FUajEWPGjMGnn36K1157DXfccUc/nW3/66i9gOj77eabb+b7Lebo0aMoLCzExx9/DLvdDgBYsWIFNmzYgAsuuIDvr17CWNE9jBedY6xQjvGi6xgv+gfjhXKMFafGeKEMY0XXMVb0D8aK7mG86BxjhXKMF13HeNE/GC+UY6w4NcYLZRgruo6xov8wXijHeNE5xgrlGC+6rr/jxZCaGu/AgQMIh8OYMWNGfNmsWbNQVFQESZL68cwGruLiYowcObK/T2NA++KLL3D22Wfjz3/+c8LyoqIiTJo0CUajMb5s1qxZKCws7OMzHFg6ai+Px4Oqqiq+31pIS0vDH/7wh3hwaOLxePj+6kWMFd3DeNE5xgrlGC+6jvGifzBeKMdYcWqMF8owVnQdY0X/YKzoHsaLzjFWKMd40XWMF/2D8UI5xopTY7xQhrGi6xgr+g/jhXKMF51jrFCO8aLr+jteDKmKUA6HAzabDVqtNr7MbrcjEAjA5XIhJSWlH89u4JFlGceOHcNHH32EZ599FpFIBAsWLMCKFSsS2nCo++53v9vucofDgfT09IRlqampqKys7IvTGrA6aq/i4mIIgoBnnnkGO3bsgNVqxfe///2E8oFDTVJSEs4///z4Y0mSsGXLFpxzzjl8f/UixgrlGC9OjbFCOcaLrmO86B+MF8owVnQN44UyjBVdx1jRPxgrlGO8ODXGCuUYL7qO8aJ/MF4ow1jRNYwXyjBWdB1jRf9hvFCG8eLUGCuUY7zouv6OF0MqEcrn87X5h63pcTAY7I9TGtDKy8vjbfbb3/4WJ0+exK9+9Sv4/X7cd999/X16A15H7ze+19p39OhRCIKA0aNH43vf+x527tyJ+++/H2azGZdeeml/n96A8Mgjj2Dfvn3Yvn07/vjHP/L91UsYK5RjvOg+xgrlGC9OjfGibzBeKMNYcXoYL5RhrDg1xoq+wVihHONF9zFWKMd4cWqMF32D8UIZxorTw3ihDGPFqTFW9B3GC2UYL7qPsUI5xotT6+t4MaQSoXQ6XZvGa3qs1+v745QGtKysLHz++edITk6GIAjIy8uDJEm46667sGrVKqhUqv4+xQFNp9PB5XIlLAsGg3yvdWDx4sWYN28erFYrAGDixIk4fvw4XnnlFQYIRIPDiy++iN/85jcYP34831+9iLFCOcaL7uNnWTnGi84xXvQdxgtlGCtODz/LyjBWdI6xou8wVijHeNF9/Cwrx3jROcaLvsN4oQxjxenhZ1kZxorOMVb0LcYLZRgvuo+fZeUYLzrXH/FC7LE9DQIZGRmoq6tDOByOL3M4HNDr9UhKSurHMxu4rFYrBEGIPx4zZgwCgQDq6+v78awGh4yMDDidzoRlTqezTZk3ihIEIR4cmowePRpVVVX9c0IDyNq1a/HCCy/gkUcewWWXXQaA76/exFjRPYwX3cPPsnKMFx1jvOhbjBfKMVZ0Hz/LyjBWdIyxom8xVnQP40X38LOsHONFxxgv+hbjhXKMFd3Hz7IyjBUdY6zoe4wXyjFedA8/y8oxXnSsv+LFkEqEysvLg1qtRmFhYXxZQUEBpkyZAlEcUk3RJf/9739x9tlnw+fzxZft378fVquV88x2wbRp0/D111/D7/fHlxUUFGDatGn9eFYD1+OPP46bbropYdmBAwcwevTo/jmhAeLJJ5/E1q1b8etf/xpXXHFFfDnfX72HsUI5xovu42dZOcaL9jFe9D3GC2UYK04PP8vKMFa0j7Gi7zFWKMd40X38LCvHeNE+xou+x3ihDGPF6eFnWRnGivYxVvQPxgtlGC+6j59l5Rgv2tef8WJI/atoMBiwePFirF69Gnv27MH777+PzZs344YbbujvUxuQZsyYAZ1Oh/vuuw9Hjx7Ff/7zH2zcuBE/+MEP+vvUBoWzzjoLw4cPx6pVq3D48GE899xz2LNnD5YuXdrfpzYgzZs3Dzt37sTzzz+PkpIS/OlPf8Jf/vIXLF++vL9Prd8UFxfjqaeewi233IJZs2bB4XDE//j+6j2MFcoxXnQfP8vKMV60xXjRPxgvlGGsOD38LCvDWNEWY0X/YKxQjvGi+/hZVo7xoi3Gi/7BeKEMY8Xp4WdZGcaKthgr+g/jhTKMF93Hz7JyjBdt9Xu8kIcYr9cr33333fL06dPluXPnyi+88EJ/n9KAdujQIfmmm26Sp0+fLp933nny7373O1mSpP4+rQFr/Pjx8meffRZ/fPz4cfm6666TJ0+eLF9xxRXyxx9/3I9nN/C0bq/33ntPXrRokTxlyhR5wYIF8j//+c9+PLv+9+yzz8rjx49v90+W+f7qTYwVyjFedB1jhXKMF51jvOg/jBfKMFYow3ihDGNF5xgr+g9jhXKMF13HWKEc40XnGC/6D+OFMowVyjBeKMNY0TnGiv7FeKEM40XXMVYox3jRuf6OF4Isy3LPpVURERERERERERERERERERERERH1vSE1NR4REREREREREREREREREREREZ2ZmAhFRERERERERERERERERERERESDHhOhiIiIiIiIiIiIiIiIiIiIiIho0GMiFBERERERERERERERERERERERDXpMhCIiIiIiIiIiIiIiIiIiIiIiokGPiVBERERERERERERERERERERERDToMRGKiIiIiIiIiIiIiIiIiIiIiIgGPSZCERERERERERERERERERERERHRoMdEKCIiIiIiIiIiIiIiIiIiIiIiGvSYCEVERERERERERERERERERERERIMeE6GIiIiIiIiIiIiIiIiIiIiIiGjQYyIUERERERERERERERERERERERENev8ft3nLUX/si0QAAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "import warnings\n", - "\n", - "with warnings.catch_warnings():\n", - " warnings.simplefilter(\"ignore\")\n", - "\n", - " sns.set_style(\"darkgrid\")\n", - " g = sns.FacetGrid(\n", - " data=results_df,\n", - " col=\"metrics\",\n", - " sharex=True,\n", - " sharey=False,\n", - " height=4,\n", - " hue=\"query_strategy\",\n", - " legend_out=False,\n", - " )\n", - " p = g.map(sns.lineplot, \"train_size\", \"value\")\n", - " p = p.add_legend()\n", - " sns.move_legend(\n", - " p,\n", - " \"lower center\",\n", - " bbox_to_anchor=(0.5, 1),\n", - " ncol=5,\n", - " title=None,\n", - " frameon=False,\n", - " )\n", - " p.set(ylabel=None, xlabel=None)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3.9.13 ('energizer-dev')", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.13" - }, - "orig_nbformat": 4, - "vscode": { - "interpreter": { - "hash": "944ffd4f8dbdaa69d919c942d599fc997735694f55f2ea363be8b6b69a40ba5a" - } - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/docs/examples/index.md b/docs/examples/index.md deleted file mode 100644 index fdf702f..0000000 --- a/docs/examples/index.md +++ /dev/null @@ -1 +0,0 @@ -Coming soon... \ No newline at end of file diff --git a/docs/index.md b/docs/index.md deleted file mode 100644 index c111bed..0000000 --- a/docs/index.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -hide: -- navigation ---- - -# Getting started with `Energizer` - -{% include-markdown "../README.md" %} \ No newline at end of file diff --git a/docs/javascript/mathjax.js b/docs/javascript/mathjax.js deleted file mode 100644 index 8552839..0000000 --- a/docs/javascript/mathjax.js +++ /dev/null @@ -1,16 +0,0 @@ -window.MathJax = { - tex: { - inlineMath: [["\\(", "\\)"]], - displayMath: [["\\[", "\\]"]], - processEscapes: true, - processEnvironments: true - }, - options: { - ignoreHtmlClass: ".*|", - processHtmlClass: "arithmatex" - } - }; - - document$.subscribe(() => { - MathJax.typesetPromise() - }) diff --git a/docs/overrides/main.html b/docs/overrides/main.html deleted file mode 100644 index 2ace027..0000000 --- a/docs/overrides/main.html +++ /dev/null @@ -1,21 +0,0 @@ -{% extends "base.html" %} - -{% block announce %} - For updates follow - - @pietro_lesci - - on - - Twitter - -{% endblock %} diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css deleted file mode 100644 index 67e43d5..0000000 --- a/docs/stylesheets/extra.css +++ /dev/null @@ -1,15 +0,0 @@ -/* make code font-size smaller: JetBrains Mono is bigger than others */ - -/* .md-typeset .code { - font-size: 0.7rem; -} - -.highlighttable .linenos { - font-size: 0.7rem; -} */ - -.highlighttable .linenos a { - - /* make link in linenumber of the same color as background */ - background-color: var(--md-code-bg-color); -} \ No newline at end of file diff --git a/energizer/active_learning/callbacks.py b/energizer/active_learning/callbacks.py index f825933..49044d7 100644 --- a/energizer/active_learning/callbacks.py +++ b/energizer/active_learning/callbacks.py @@ -1,5 +1,5 @@ import time -from typing import Any, List +from typing import Any from lightning.fabric.wrappers import _FabricModule @@ -50,7 +50,7 @@ def on_query_start(self, estimator: ActiveEstimator, model: _FabricModule, datas ... def on_query_end( - self, estimator: ActiveEstimator, model: _FabricModule, datastore: Datastore, indices: List[int] + self, estimator: ActiveEstimator, model: _FabricModule, datastore: Datastore, indices: list[int] ) -> None: ... diff --git a/energizer/active_learning/clustering_utilities.py b/energizer/active_learning/clustering_utilities.py index a379908..9eb11c9 100644 --- a/energizer/active_learning/clustering_utilities.py +++ b/energizer/active_learning/clustering_utilities.py @@ -1,5 +1,3 @@ -from typing import List - import numpy as np from numpy.random import RandomState @@ -16,11 +14,11 @@ def _similarity(centers: np.ndarray, X: np.ndarray, normalized: bool) -> np.ndar return sim -def _get_nearest_to_centers_batch(centers: np.ndarray, X: np.ndarray, normalized: bool) -> List[int]: +def _get_nearest_to_centers_batch(centers: np.ndarray, X: np.ndarray, normalized: bool) -> list[int]: return _similarity(centers, X, normalized).argmax(axis=1).tolist() -def _get_nearest_to_centers_iterative(centers: np.ndarray, X: np.ndarray, normalized: bool) -> List[int]: +def _get_nearest_to_centers_iterative(centers: np.ndarray, X: np.ndarray, normalized: bool) -> list[int]: indices = np.empty(centers.shape[0], dtype=int) for i in range(centers.shape[0]): sim = _similarity(centers[None, i], X, normalized) @@ -30,7 +28,7 @@ def _get_nearest_to_centers_iterative(centers: np.ndarray, X: np.ndarray, normal return indices.tolist() -def _get_nearest_to_centers(centers: np.ndarray, X: np.ndarray, normalized: bool, num_clusters: int) -> List[int]: +def _get_nearest_to_centers(centers: np.ndarray, X: np.ndarray, normalized: bool, num_clusters: int) -> list[int]: indices = _get_nearest_to_centers_batch(centers, X, normalized) # fall back to an iterative version if one or more vectors are most similar @@ -59,7 +57,7 @@ def _silhouette_k_select(X: np.ndarray, max_k: int, rng: RandomState) -> int: def _kmeans( X: np.ndarray, num_clusters: int, rng: RandomState, use_silhouette: bool = False, normalize: bool = True -) -> List[int]: +) -> list[int]: if normalize: X = StandardScaler().fit_transform(X) @@ -74,15 +72,15 @@ def _kmeans( return _get_nearest_to_centers(centers, X, normalize, num_clusters) -def kmeans_sampling(X: np.ndarray, num_clusters: int, rng: RandomState, normalize: bool = True) -> List[int]: +def kmeans_sampling(X: np.ndarray, num_clusters: int, rng: RandomState, normalize: bool = True) -> list[int]: return _kmeans(X, num_clusters, rng, False, normalize) -def kmeans_silhouette_sampling(X: np.ndarray, num_clusters: int, rng: RandomState, normalize: bool = True) -> List[int]: +def kmeans_silhouette_sampling(X: np.ndarray, num_clusters: int, rng: RandomState, normalize: bool = True) -> list[int]: return _kmeans(X, num_clusters, rng, True, normalize) -def kmeans_pp_sampling(X: np.ndarray, num_clusters: int, rng: RandomState, *args, **kwargs) -> List[int]: +def kmeans_pp_sampling(X: np.ndarray, num_clusters: int, rng: RandomState, *args, **kwargs) -> list[int]: _, indices = kmeans_plusplus(X, num_clusters, random_state=rng) unique_ids = list(set(indices.tolist())) diff --git a/energizer/active_learning/datastores/base.py b/energizer/active_learning/datastores/base.py index d3c37e9..4eade8e 100644 --- a/energizer/active_learning/datastores/base.py +++ b/energizer/active_learning/datastores/base.py @@ -1,7 +1,7 @@ from abc import ABC, abstractmethod from math import floor from pathlib import Path -from typing import List, Literal, Optional, Union +from typing import Literal, Optional, Union import numpy as np import pandas as pd @@ -9,7 +9,7 @@ from numpy.random import RandomState from torch.utils.data import DataLoader -from energizer.datastores.base import Datastore, IndexMixin, PandasDataStore +from energizer.datastores.base import Datastore, IndexMixin, PandasDatastore from energizer.enums import InputKeys, RunningStage, SpecialKeys from energizer.utilities import sample @@ -34,7 +34,7 @@ def total_rounds(self) -> int: @abstractmethod def label( self, - indices: List[int], + indices: list[int], round: int, validation_perc: Optional[float] = None, validation_sampling: Optional[Literal["uniform", "stratified"]] = "uniform", @@ -47,9 +47,9 @@ def sample_from_pool( size: int, round: Optional[int] = None, random_state: Optional[RandomState] = None, - with_indices: Optional[List[int]] = None, + with_indices: Optional[list[int]] = None, **kwargs, - ) -> List[int]: + ) -> list[int]: ... @abstractmethod @@ -64,23 +64,23 @@ def reset(self) -> None: ... @abstractmethod - def get_train_ids(self, round: Optional[int] = None) -> List[int]: + def get_train_ids(self, round: Optional[int] = None) -> list[int]: ... @abstractmethod - def get_validation_ids(self, round: Optional[int] = None) -> List[int]: + def get_validation_ids(self, round: Optional[int] = None) -> list[int]: ... @abstractmethod - def get_pool_ids(self, round: Optional[int] = None) -> List[int]: + def get_pool_ids(self, round: Optional[int] = None) -> list[int]: ... -class ActiveDataStore(ActiveLearningMixin, Datastore): +class ActiveDatastore(ActiveLearningMixin, Datastore): ... -class ActivePandasDataStore(ActiveLearningMixin, PandasDataStore): +class ActivePandasDatastore(ActiveLearningMixin, PandasDatastore): _train_data: pd.DataFrame _test_data: Optional[Dataset] @@ -108,7 +108,7 @@ def total_rounds(self) -> int: return self._train_data[SpecialKeys.LABELLING_ROUND].max() def train_dataset( - self, round: Optional[int] = None, passive: Optional[bool] = False, with_indices: Optional[List[int]] = None + self, round: Optional[int] = None, passive: Optional[bool] = False, with_indices: Optional[list[int]] = None ) -> Optional[Dataset]: if passive: return super().train_dataset() @@ -127,7 +127,7 @@ def validation_dataset(self, round: Optional[int] = None) -> Optional[Dataset]: if mask.sum() > 0: return Dataset.from_pandas(self._train_data.loc[mask], preserve_index=False) - def pool_dataset(self, round: Optional[int] = None, with_indices: Optional[List[int]] = None) -> Optional[Dataset]: + def pool_dataset(self, round: Optional[int] = None, with_indices: Optional[list[int]] = None) -> Optional[Dataset]: mask = self._pool_mask(round) if with_indices is not None: mask = mask & self._train_data[SpecialKeys.ID].isin(with_indices) @@ -137,7 +137,7 @@ def pool_dataset(self, round: Optional[int] = None, with_indices: Optional[List[ def label( self, - indices: List[int], + indices: list[int], round: int, validation_perc: Optional[float] = None, validation_sampling: Literal["uniform", "stratified"] = "uniform", @@ -172,9 +172,9 @@ def sample_from_pool( size: int, round: Optional[int] = None, random_state: Optional[RandomState] = None, - with_indices: Optional[List[int]] = None, + with_indices: Optional[list[int]] = None, **kwargs, - ) -> List[int]: + ) -> list[int]: """Performs `uniform` or `stratified` sampling from the pool.""" mask = self._pool_mask(round) @@ -217,21 +217,21 @@ def _pool_mask(self, round: Optional[int] = None) -> pd.Series: mask = mask | (self._train_data[SpecialKeys.LABELLING_ROUND] > round) return mask - def get_train_ids(self, round: Optional[int] = None) -> List[int]: + def get_train_ids(self, round: Optional[int] = None) -> list[int]: return self._train_data.loc[self._train_mask(round), SpecialKeys.ID].tolist() - def get_validation_ids(self, round: Optional[int] = None) -> List[int]: + def get_validation_ids(self, round: Optional[int] = None) -> list[int]: return self._train_data.loc[self._validation_mask(round), SpecialKeys.ID].tolist() - def get_pool_ids(self, round: Optional[int] = None) -> List[int]: + def get_pool_ids(self, round: Optional[int] = None) -> list[int]: return self._train_data.loc[self._pool_mask(round), SpecialKeys.ID].tolist() class ActiveIndexMixin(IndexMixin): - def get_pool_embeddings(self, ids: List[int]) -> np.ndarray: + def get_pool_embeddings(self, ids: list[int]) -> np.ndarray: return np.stack(self.index.get_items(ids)) - def get_train_embeddings(self, ids: List[int]) -> np.ndarray: + def get_train_embeddings(self, ids: list[int]) -> np.ndarray: # check all the ids are training ids train_ids = self.get_train_ids() # type: ignore assert all(i in train_ids for i in ids), set(train_ids).difference(set(ids)) @@ -245,18 +245,18 @@ def get_train_embeddings(self, ids: List[int]) -> np.ndarray: return emb - def get_embeddings(self, ids: List[int]) -> None: + def get_embeddings(self, ids: list[int]) -> None: raise ValueError("Use `get_{train/pool}_embeddings` methods instead.") -class ActiveDataStoreWithIndex(ActiveIndexMixin, ActiveDataStore): +class ActiveDatastoreWithIndex(ActiveIndexMixin, ActiveDatastore): ... -class ActivePandasDataStoreWithIndex(ActiveIndexMixin, ActivePandasDataStore): +class ActivePandasDatastoreWithIndex(ActiveIndexMixin, ActivePandasDatastore): def label( self, - indices: List[int], + indices: list[int], round: int, validation_perc: Optional[float] = None, validation_sampling: Literal["uniform", "stratified"] = "uniform", diff --git a/energizer/active_learning/datastores/classification.py b/energizer/active_learning/datastores/classification.py index cec50f9..c179862 100644 --- a/energizer/active_learning/datastores/classification.py +++ b/energizer/active_learning/datastores/classification.py @@ -1,21 +1,21 @@ -from typing import List, Optional +from typing import Optional from datasets import Dataset from transformers import PreTrainedTokenizerBase from typing_extensions import Self -from energizer.active_learning.datastores.base import ActivePandasDataStoreWithIndex +from energizer.active_learning.datastores.base import ActivePandasDatastoreWithIndex from energizer.datastores.classification import SequenceClassificationMixin, _from_datasets from energizer.enums import SpecialKeys -class ActivePandasDataStoreForSequenceClassification(SequenceClassificationMixin, ActivePandasDataStoreWithIndex): +class ActivePandasDatastoreForSequenceClassification(SequenceClassificationMixin, ActivePandasDatastoreWithIndex): @classmethod def from_datasets( cls, tokenizer: PreTrainedTokenizerBase, uid_name: Optional[str] = None, - on_cpu: Optional[List[str]] = None, + on_cpu: Optional[list[str]] = None, seed: Optional[int] = 42, train_dataset: Optional[Dataset] = None, validation_dataset: Optional[Dataset] = None, diff --git a/energizer/active_learning/strategies/base.py b/energizer/active_learning/strategies/base.py index b18b998..ab35c76 100644 --- a/energizer/active_learning/strategies/base.py +++ b/energizer/active_learning/strategies/base.py @@ -1,13 +1,14 @@ from abc import ABC, abstractmethod +from collections.abc import Callable from pathlib import Path -from typing import Any, Callable, Dict, List, Literal, Optional, Tuple, Union +from typing import Any, Literal, Optional, Union import numpy as np import torch from lightning.fabric.wrappers import _FabricDataLoader, _FabricModule, _FabricOptimizer from torch.optim.lr_scheduler import _LRScheduler -from energizer.active_learning.datastores.base import ActiveDataStore +from energizer.active_learning.datastores.base import ActiveDatastore from energizer.active_learning.trackers import ActiveProgressTracker from energizer.enums import InputKeys, OutputKeys, RunningStage, SpecialKeys from energizer.estimator import Estimator, OptimizationArgs, SchedulerArgs @@ -31,7 +32,7 @@ def tracker(self) -> ActiveProgressTracker: def active_fit( self, - datastore: ActiveDataStore, + datastore: ActiveDatastore, query_size: int, max_rounds: Optional[int] = None, max_budget: Optional[int] = None, @@ -47,9 +48,9 @@ def active_fit( gradient_accumulation_steps: Optional[int] = None, learning_rate: Optional[float] = None, optimizer: Optional[str] = None, - optimizer_kwargs: Optional[Union[Dict, OptimizationArgs]] = None, + optimizer_kwargs: Optional[Union[dict, OptimizationArgs]] = None, scheduler: Optional[str] = None, - scheduler_kwargs: Optional[Union[Dict, SchedulerArgs]] = None, + scheduler_kwargs: Optional[Union[dict, SchedulerArgs]] = None, log_interval: int = 1, enable_progress_bar: bool = True, limit_train_batches: Optional[int] = None, @@ -102,11 +103,7 @@ def active_fit( ) def run_active_fit( - self, - datastore: ActiveDataStore, - reinit_model: bool, - model_cache_dir: Union[str, Path], - **kwargs, + self, datastore: ActiveDatastore, reinit_model: bool, model_cache_dir: Union[str, Path], **kwargs ) -> Any: if reinit_model: self.save_state_dict(model_cache_dir) @@ -150,21 +147,17 @@ def run_active_fit( def run_round( self, - datastore: ActiveDataStore, + datastore: ActiveDatastore, query_size: int, replay: bool, - fit_loop_kwargs: Dict, - fit_opt_kwargs: Dict, - test_kwargs: Dict, - query_kwargs: Dict, - label_kwargs: Dict, + fit_loop_kwargs: dict, + fit_opt_kwargs: dict, + test_kwargs: dict, + query_kwargs: dict, + label_kwargs: dict, ) -> ROUND_OUTPUT: model, optimizer, scheduler, train_loader, validation_loader, test_loader = self._setup_round( - datastore, - replay, - fit_loop_kwargs, - fit_opt_kwargs, - test_kwargs, + datastore, replay, fit_loop_kwargs, fit_opt_kwargs, test_kwargs ) output = {} @@ -194,14 +187,8 @@ def run_round( return output def run_annotation( - self, - model: _FabricModule, - datastore: ActiveDataStore, - query_size: int, - query_kwargs: Dict, - label_kwargs: Dict, + self, model: _FabricModule, datastore: ActiveDatastore, query_size: int, query_kwargs: dict, label_kwargs: dict ) -> int: - # === QUERY === # self.callback("on_query_start", model=model, datastore=datastore) @@ -235,29 +222,18 @@ def run_annotation( return n_labelled - def run_query( - self, - model: _FabricModule, - datastore: ActiveDataStore, - query_size: int, - **kwargs, - ) -> List[int]: + def run_query(self, model: _FabricModule, datastore: ActiveDatastore, query_size: int, **kwargs) -> list[int]: raise NotImplementedError - def active_fit_end(self, datastore: ActiveDataStore, output: List[ROUND_OUTPUT]) -> Any: + def active_fit_end(self, datastore: ActiveDatastore, output: list[ROUND_OUTPUT]) -> Any: return output - def round_end(self, datastore: ActiveDataStore, output: ROUND_OUTPUT) -> ROUND_OUTPUT: + def round_end(self, datastore: ActiveDatastore, output: ROUND_OUTPUT) -> ROUND_OUTPUT: return output def _setup_round( - self, - datastore: ActiveDataStore, - replay: bool, - fit_loop_kwargs: Dict, - fit_opt_kwargs: Dict, - test_kwargs: Dict, - ) -> Tuple[ + self, datastore: ActiveDatastore, replay: bool, fit_loop_kwargs: dict, fit_opt_kwargs: dict, test_kwargs: dict + ) -> tuple[ _FabricModule, _FabricOptimizer, Optional[_LRScheduler], @@ -278,9 +254,7 @@ def _setup_round( **fit_loop_kwargs, ) model, optimizer, scheduler, train_loader, validation_loader = self._setup_fit( - train_loader, - validation_loader, - **fit_opt_kwargs, + train_loader, validation_loader, **fit_opt_kwargs ) # configuration test @@ -297,8 +271,8 @@ class PoolBasedMixin(ABC): POOL_OUTPUT_KEY: OutputKeys - def run_pool_evaluation(self, model: _FabricModule, loader: _FabricDataLoader) -> Dict[str, np.ndarray]: - out: List[Dict] = self.run_evaluation(model, loader, RunningStage.POOL) # type: ignore + def run_pool_evaluation(self, model: _FabricModule, loader: _FabricDataLoader) -> dict[str, np.ndarray]: + out: list[dict] = self.run_evaluation(model, loader, RunningStage.POOL) # type: ignore _out = ld_to_dl(out) return {k: np.concatenate(v) for k, v in _out.items()} @@ -310,7 +284,7 @@ def evaluation_step( loss_fn: Optional[Union[torch.nn.Module, Callable]], metrics: Optional[METRIC], stage: Union[str, RunningStage], - ) -> Union[Dict, BATCH_OUTPUT]: + ) -> Union[dict, BATCH_OUTPUT]: if stage != RunningStage.POOL: return super().evaluation_step(model, batch, batch_idx, loss_fn, metrics, stage) # type: ignore @@ -334,10 +308,10 @@ def pool_step( ) -> torch.Tensor: ... - def pool_epoch_end(self, output: List[Dict], metrics: Optional[METRIC]) -> List[Dict]: + def pool_epoch_end(self, output: list[dict], metrics: Optional[METRIC]) -> list[dict]: return output - def get_pool_loader(self, datastore: ActiveDataStore, **kwargs) -> Optional[_FabricDataLoader]: + def get_pool_loader(self, datastore: ActiveDatastore, **kwargs) -> Optional[_FabricDataLoader]: subpool_ids = kwargs.get("subpool_ids", None) loader = datastore.pool_loader(with_indices=subpool_ids) if subpool_ids is not None else datastore.pool_loader() @@ -350,13 +324,13 @@ def get_pool_loader(self, datastore: ActiveDataStore, **kwargs) -> Optional[_Fab ) return pool_loader - def get_train_loader(self, datastore: ActiveDataStore, **kwargs) -> Optional[_FabricDataLoader]: - + def get_train_loader(self, datastore: ActiveDatastore, **kwargs) -> Optional[_FabricDataLoader]: # NOTE: hack -- load train dataloader with the evaluation batch size - batch_size = datastore.loading_params["batch_size"] - datastore._loading_params["batch_size"] = datastore.loading_params["eval_batch_size"] + assert datastore._loading_params is not None + batch_size = datastore.loading_params.batch_size + datastore._loading_params.batch_size = datastore.loading_params.eval_batch_size loader = datastore.train_loader(**kwargs) - datastore._loading_params["batch_size"] = batch_size + datastore._loading_params.batch_size = batch_size if loader is not None: train_loader = self.configure_dataloader(loader) # type: ignore diff --git a/energizer/active_learning/strategies/diversity.py b/energizer/active_learning/strategies/diversity.py index 32381f5..310ea03 100644 --- a/energizer/active_learning/strategies/diversity.py +++ b/energizer/active_learning/strategies/diversity.py @@ -1,5 +1,6 @@ from abc import ABC, abstractmethod -from typing import Any, Callable, List, Literal, Optional, Tuple, Union +from collections.abc import Callable +from typing import Any, Literal, Optional, Union import numpy as np import torch @@ -7,7 +8,7 @@ from numpy.random import RandomState from sklearn.utils.validation import check_random_state -from energizer.active_learning.datastores.base import ActiveDataStore +from energizer.active_learning.datastores.base import ActiveDatastore from energizer.active_learning.registries import CLUSTERING_FUNCTIONS from energizer.active_learning.strategies.base import ActiveEstimator, PoolBasedMixin from energizer.enums import OutputKeys, SpecialKeys @@ -27,13 +28,7 @@ def __init__(self, *args, seed: int = 42, **kwargs) -> None: self.seed = seed self.rng = check_random_state(seed) # reproducibility - def run_query( - self, - model: _FabricModule, - datastore: ActiveDataStore, - query_size: int, - **kwargs, - ) -> List[int]: + def run_query(self, model: _FabricModule, datastore: ActiveDatastore, query_size: int, **kwargs) -> list[int]: embeddings_and_ids = self.get_embeddings_and_ids(model, datastore, query_size, **kwargs) if embeddings_and_ids is None: return [] @@ -43,12 +38,8 @@ def run_query( @abstractmethod def get_embeddings_and_ids( - self, - model: _FabricModule, - datastore: ActiveDataStore, - query_size: int, - **kwargs, - ) -> Optional[Tuple[np.ndarray, np.ndarray]]: + self, model: _FabricModule, datastore: ActiveDatastore, query_size: int, **kwargs + ) -> Optional[tuple[np.ndarray, np.ndarray]]: # NOTE: Always need the ids because you might not return the entire pool ... @@ -56,12 +47,12 @@ def get_embeddings_and_ids( def select_from_embeddings( self, model: _FabricModule, - datastore: ActiveDataStore, + datastore: ActiveDatastore, query_size: int, embeddings: np.ndarray, ids: np.ndarray, **kwargs, - ) -> List[int]: + ) -> list[int]: ... @@ -69,12 +60,8 @@ class DiversityBasedStrategyWithPool(PoolBasedMixin, DiversityBasedStrategy): POOL_OUTPUT_KEY: OutputKeys = OutputKeys.EMBEDDINGS def get_embeddings_and_ids( - self, - model: _FabricModule, - datastore: ActiveDataStore, - query_size: int, - **kwargs, - ) -> Optional[Tuple[np.ndarray, np.ndarray]]: + self, model: _FabricModule, datastore: ActiveDatastore, query_size: int, **kwargs + ) -> Optional[tuple[np.ndarray, np.ndarray]]: pool_loader = self.get_pool_loader(datastore, **kwargs) if pool_loader is not None and len(pool_loader.dataset or []) > query_size: # type: ignore # enough instances @@ -95,12 +82,12 @@ def __init__( def select_from_embeddings( self, model: _FabricModule, - datastore: ActiveDataStore, + datastore: ActiveDatastore, query_size: int, embeddings: np.ndarray, ids: np.ndarray, **kwargs, - ) -> List[int]: + ) -> list[int]: center_ids = self.clustering_fn(embeddings, query_size, rng=self.rng) # type: ignore return ids[center_ids].tolist() diff --git a/energizer/active_learning/strategies/hybrid.py b/energizer/active_learning/strategies/hybrid.py index 9c46697..9630d13 100644 --- a/energizer/active_learning/strategies/hybrid.py +++ b/energizer/active_learning/strategies/hybrid.py @@ -1,4 +1,5 @@ -from typing import Any, Callable, Dict, List, Optional, Tuple, Union +from collections.abc import Callable +from typing import Any, Optional, Union import numpy as np import torch @@ -8,7 +9,7 @@ from torch.nn.functional import one_hot from energizer.active_learning.clustering_utilities import kmeans_pp_sampling -from energizer.active_learning.datastores.base import ActiveDataStore, ActiveDataStoreWithIndex +from energizer.active_learning.datastores.base import ActiveDatastore, ActiveDatastoreWithIndex from energizer.active_learning.registries import CLUSTERING_FUNCTIONS from energizer.active_learning.strategies.diversity import DiversityBasedStrategy, DiversityBasedStrategyWithPool from energizer.active_learning.strategies.uncertainty import UncertaintyBasedStrategy @@ -42,7 +43,7 @@ def __init__( seed: int = 42, r_factor: int, clustering_algorithm: str = "kmeans", - clustering_kwargs: Optional[Dict] = None, + clustering_kwargs: Optional[dict] = None, **kwargs, ) -> None: super().__init__(*args, score_fn=score_fn, seed=seed, **kwargs) @@ -60,13 +61,8 @@ def clustering_fn(self) -> Callable: return self._clustering_fn def run_query( - self, - model: _FabricModule, - datastore: ActiveDataStoreWithIndex, - query_size: int, - **kwargs, - ) -> List[int]: - + self, model: _FabricModule, datastore: ActiveDatastoreWithIndex, query_size: int, **kwargs + ) -> list[int]: # === DIVERSITY === # embeddings_and_ids = self.get_embeddings_and_ids(model, datastore, query_size, **kwargs) if embeddings_and_ids is None: @@ -84,25 +80,20 @@ def run_query( return self.compute_most_uncertain(model, pool_loader, query_size) def get_embeddings_and_ids( - self, - model: _FabricModule, - datastore: ActiveDataStoreWithIndex, - query_size: int, - **kwargs, - ) -> Optional[Tuple[np.ndarray, np.ndarray]]: + self, model: _FabricModule, datastore: ActiveDatastoreWithIndex, query_size: int, **kwargs + ) -> Optional[tuple[np.ndarray, np.ndarray]]: pool_ids = kwargs.get("subpool_ids", None) or datastore.get_pool_ids() return datastore.get_pool_embeddings(pool_ids), np.array(pool_ids) def select_from_embeddings( self, model: _FabricModule, - datastore: ActiveDataStoreWithIndex, + datastore: ActiveDatastoreWithIndex, query_size: int, embeddings: np.ndarray, ids: np.ndarray, **kwargs, - ) -> List[int]: - + ) -> list[int]: num_clusters = query_size * self.r_factor centers_ids = self.clustering_fn(embeddings, num_clusters, rng=self.clustering_rng, **self.clustering_kwargs) @@ -114,12 +105,12 @@ class BADGE(DiversityBasedStrategyWithPool): def select_from_embeddings( self, model: _FabricModule, - datastore: ActiveDataStore, + datastore: ActiveDatastore, query_size: int, embeddings: np.ndarray, ids: np.ndarray, **kwargs, - ) -> List[int]: + ) -> list[int]: # k-means++ sampling center_ids = kmeans_pp_sampling(embeddings, query_size, rng=self.rng) return ids[center_ids].tolist() diff --git a/energizer/active_learning/strategies/random.py b/energizer/active_learning/strategies/random.py index a04ae74..8c3fc73 100644 --- a/energizer/active_learning/strategies/random.py +++ b/energizer/active_learning/strategies/random.py @@ -1,12 +1,10 @@ -from typing import List - from lightning.fabric.wrappers import _FabricModule from numpy.random import RandomState # https://scikit-learn.org/stable/developers/develop.html#random-numbers from sklearn.utils.validation import check_random_state -from energizer.active_learning.datastores.base import ActiveDataStore +from energizer.active_learning.datastores.base import ActiveDatastore from energizer.active_learning.strategies.base import ActiveEstimator @@ -18,11 +16,5 @@ def __init__(self, *args, seed: int = 42, **kwargs) -> None: self.seed = seed self.rng = check_random_state(seed) # reproducibility - def run_query( - self, - model: _FabricModule, - datastore: ActiveDataStore, - query_size: int, - **kwargs, - ) -> List[int]: + def run_query(self, model: _FabricModule, datastore: ActiveDatastore, query_size: int, **kwargs) -> list[int]: return datastore.sample_from_pool(size=query_size, random_state=self.rng) diff --git a/energizer/active_learning/strategies/two_stage.py b/energizer/active_learning/strategies/two_stage.py index ee7bbd9..e7e3a18 100644 --- a/energizer/active_learning/strategies/two_stage.py +++ b/energizer/active_learning/strategies/two_stage.py @@ -1,5 +1,5 @@ from abc import ABC, abstractmethod -from typing import Any, List, Optional +from typing import Any, Optional import numpy as np import pandas as pd @@ -7,7 +7,7 @@ from numpy.random import RandomState from sklearn.utils import check_random_state -from energizer.active_learning.datastores.base import ActiveDataStore, ActiveDataStoreWithIndex +from energizer.active_learning.datastores.base import ActiveDatastore, ActiveDatastoreWithIndex from energizer.active_learning.strategies.base import ActiveEstimator from energizer.enums import SpecialKeys @@ -42,13 +42,7 @@ def subpool_size(self) -> int: def base_strategy(self) -> ActiveEstimator: return self._base_strategy - def run_query( - self, - model: _FabricModule, - datastore: ActiveDataStore, - query_size: int, - **kwargs, - ) -> List[int]: + def run_query(self, model: _FabricModule, datastore: ActiveDatastore, query_size: int, **kwargs) -> list[int]: if datastore.pool_size() > self.subpool_size: subpool_ids = self.select_pool_subset(model, datastore, query_size, **kwargs) kwargs["subpool_ids"] = subpool_ids @@ -57,8 +51,8 @@ def run_query( @abstractmethod def select_pool_subset( - self, model: _FabricModule, datastore: ActiveDataStore, query_size: int, **kwargs - ) -> List[int]: + self, model: _FabricModule, datastore: ActiveDatastore, query_size: int, **kwargs + ) -> list[int]: ... def __getattr__(self, attr: str) -> Any: @@ -69,8 +63,8 @@ def __getattr__(self, attr: str) -> Any: class RandomSubsetStrategy(BaseSubsetStrategy): def select_pool_subset( - self, model: _FabricModule, datastore: ActiveDataStore, query_size: int, **kwargs - ) -> List[int]: + self, model: _FabricModule, datastore: ActiveDatastore, query_size: int, **kwargs + ) -> list[int]: subpool_size = min(datastore.pool_size(), self.subpool_size) return datastore.sample_from_pool(size=subpool_size, random_state=self.rng) @@ -82,9 +76,8 @@ def __init__(self, *args, num_neighbours: int, max_search_size: Optional[int] = self.max_search_size = max_search_size def select_pool_subset( - self, model: _FabricModule, datastore: ActiveDataStoreWithIndex, query_size: int, **kwargs - ) -> List[int]: - + self, model: _FabricModule, datastore: ActiveDatastoreWithIndex, query_size: int, **kwargs + ) -> list[int]: # SELECT QUERIES search_query_ids = self.select_search_query(model, datastore, query_size, **kwargs) @@ -101,7 +94,7 @@ def select_pool_subset( return self.get_subpool_ids_from_search_results(candidate_df, datastore) def search_pool( - self, datastore: ActiveDataStoreWithIndex, search_query_embeddings: np.ndarray, search_query_ids: List[int] + self, datastore: ActiveDatastoreWithIndex, search_query_embeddings: np.ndarray, search_query_ids: list[int] ) -> pd.DataFrame: num_neighbours = self.num_neighbours if self.max_search_size is not None: @@ -123,34 +116,28 @@ def search_pool( @abstractmethod def select_search_query( - self, model: _FabricModule, datastore: ActiveDataStore, query_size: int, **kwargs - ) -> List[int]: + self, model: _FabricModule, datastore: ActiveDatastore, query_size: int, **kwargs + ) -> list[int]: ... @abstractmethod - def get_query_embeddings(self, datastore: ActiveDataStoreWithIndex, search_query_ids: List[int]) -> np.ndarray: + def get_query_embeddings(self, datastore: ActiveDatastoreWithIndex, search_query_ids: list[int]) -> np.ndarray: ... @abstractmethod def get_subpool_ids_from_search_results( - self, candidate_df: pd.DataFrame, datastore: ActiveDataStoreWithIndex - ) -> List[int]: + self, candidate_df: pd.DataFrame, datastore: ActiveDatastoreWithIndex + ) -> list[int]: ... class SEALSStrategy(BaseSubsetWithSearchStrategy): """Colemann et al. (2020) `Similarity Search for Efficient Active Learning and Search of Rare Concepts`.""" - to_search: List[int] = [] - subpool_ids: List[int] = [] + to_search: list[int] = [] + subpool_ids: list[int] = [] - def run_query( - self, - model: _FabricModule, - datastore: ActiveDataStore, - query_size: int, - **kwargs, - ) -> List[int]: + def run_query(self, model: _FabricModule, datastore: ActiveDatastore, query_size: int, **kwargs) -> list[int]: annotated_ids = super().run_query(model, datastore, query_size, **kwargs) # in the next round we only need to search the newly labelled data @@ -161,20 +148,20 @@ def run_query( return annotated_ids def select_search_query( - self, model: _FabricModule, datastore: ActiveDataStore, query_size: int, **kwargs - ) -> List[int]: + self, model: _FabricModule, datastore: ActiveDatastore, query_size: int, **kwargs + ) -> list[int]: if len(self.to_search) < 1: return datastore.get_train_ids() # we only search the newly labelled data at the previous round return self.to_search - def get_query_embeddings(self, datastore: ActiveDataStoreWithIndex, search_query_ids: List[int]) -> np.ndarray: + def get_query_embeddings(self, datastore: ActiveDatastoreWithIndex, search_query_ids: list[int]) -> np.ndarray: # queries are always from the training set return datastore.get_train_embeddings(search_query_ids) def get_subpool_ids_from_search_results( - self, candidate_df: pd.DataFrame, datastore: ActiveDataStoreWithIndex - ) -> List[int]: + self, candidate_df: pd.DataFrame, datastore: ActiveDatastoreWithIndex + ) -> list[int]: # we return all unique instances from the pool that are neighbours of the training set selected_ids = candidate_df[SpecialKeys.ID].unique().tolist() diff --git a/energizer/active_learning/strategies/uncertainty.py b/energizer/active_learning/strategies/uncertainty.py index 33d76dd..8849b3b 100644 --- a/energizer/active_learning/strategies/uncertainty.py +++ b/energizer/active_learning/strategies/uncertainty.py @@ -1,10 +1,11 @@ -from typing import Callable, List, Union +from collections.abc import Callable +from typing import Union from lightning.fabric.wrappers import _FabricDataLoader, _FabricModule from numpy.random import RandomState from sklearn.utils.validation import check_random_state -from energizer.active_learning.datastores.base import ActiveDataStore +from energizer.active_learning.datastores.base import ActiveDatastore from energizer.active_learning.registries import SCORING_FUNCTIONS from energizer.active_learning.strategies.base import ActiveEstimator, PoolBasedMixin from energizer.enums import OutputKeys, SpecialKeys @@ -26,21 +27,14 @@ def __init__(self, *args, score_fn: Union[str, Callable], seed: int = 42, **kwar def score_fn(self) -> Callable: return self._score_fn - def run_query( - self, - model: _FabricModule, - datastore: ActiveDataStore, - query_size: int, - **kwargs, - ) -> List[int]: + def run_query(self, model: _FabricModule, datastore: ActiveDatastore, query_size: int, **kwargs) -> list[int]: pool_loader = self.get_pool_loader(datastore, **kwargs) if pool_loader is None or len(pool_loader.dataset or []) <= query_size: # type: ignore # not enough instances return [] return self.compute_most_uncertain(model, pool_loader, query_size) - def compute_most_uncertain(self, model: _FabricModule, loader: _FabricDataLoader, query_size: int) -> List[int]: - + def compute_most_uncertain(self, model: _FabricModule, loader: _FabricDataLoader, query_size: int) -> list[int]: # run evaluation out = self.run_pool_evaluation(model, loader) scores = out[self.POOL_OUTPUT_KEY] diff --git a/energizer/active_learning/trackers.py b/energizer/active_learning/trackers.py index 71e522d..459aa9d 100644 --- a/energizer/active_learning/trackers.py +++ b/energizer/active_learning/trackers.py @@ -4,7 +4,7 @@ import numpy as np from tqdm.auto import tqdm -from energizer.active_learning.datastores.base import ActiveDataStore +from energizer.active_learning.datastores.base import ActiveDatastore from energizer.enums import RunningStage from energizer.trackers import ProgressTracker, StageTracker, Tracker @@ -17,11 +17,7 @@ def reset(self) -> None: def make_progress_bar(self) -> None: self.progress_bar = tqdm( - total=self.max, - desc="Completed rounds", - dynamic_ncols=True, - leave=True, - colour="#32a852", + total=self.max, desc="Completed rounds", dynamic_ncols=True, leave=True, colour="#32a852" ) def increment(self) -> None: @@ -40,13 +36,7 @@ def reset(self) -> None: return super().reset() def make_progress_bar(self) -> None: - self.progress_bar = tqdm( - total=self.max, - desc="Labelled", - dynamic_ncols=True, - leave=True, - colour="#32a852", - ) + self.progress_bar = tqdm(total=self.max, desc="Labelled", dynamic_ncols=True, leave=True, colour="#32a852") if self.current > 0: self.progress_bar.update(self.current) @@ -80,7 +70,7 @@ def setup_active( max_rounds: Optional[int], max_budget: Optional[int], query_size: int, - datastore: ActiveDataStore, + datastore: ActiveDatastore, validation_perc: Optional[float], log_interval: int, enable_progress_bar: bool, @@ -101,9 +91,7 @@ def setup_active( ), "At least one of `max_rounds` or `max_budget` must be not None." assert max_budget > initial_budget, ValueError(f"`{max_budget=}` must be bigger than `{initial_budget=}`.") - max_rounds = min( - int(np.ceil((max_budget - initial_budget) / query_size)), max_rounds or float("Inf") - ) # type: ignore + max_rounds = min(int(np.ceil((max_budget - initial_budget) / query_size)), max_rounds or float("Inf")) # type: ignore max_budget = (query_size * max_rounds) + initial_budget # type: ignore self.has_test = datastore.test_size() is not None and datastore.test_size() > 0 # type: ignore diff --git a/energizer/callbacks/__init__.py b/energizer/callbacks/__init__.py index bbaab84..98ff789 100644 --- a/energizer/callbacks/__init__.py +++ b/energizer/callbacks/__init__.py @@ -1,6 +1,6 @@ from energizer.callbacks.base import Callback from energizer.callbacks.early_stopping import EarlyStopping -from energizer.callbacks.grad_norm import GradNorm +from energizer.callbacks.grad_stats import GradNorm from energizer.callbacks.model_checkpoint import ModelCheckpoint from energizer.callbacks.pytorch_profiler import PytorchTensorboardProfiler from energizer.callbacks.timer import Timer diff --git a/energizer/callbacks/base.py b/energizer/callbacks/base.py index 46e6fda..68e3449 100644 --- a/energizer/callbacks/base.py +++ b/energizer/callbacks/base.py @@ -1,8 +1,10 @@ -from typing import Any, Callable, Dict, List, Union +from collections.abc import Callable +from typing import Any, Optional, Union import numpy as np from lightning.fabric.wrappers import _FabricModule, _FabricOptimizer from torch.optim import Optimizer +from torch.optim.lr_scheduler import _LRScheduler from energizer.enums import RunningStage from energizer.estimator import Estimator @@ -24,7 +26,7 @@ class Callback: def on_fit_start(self, estimator: Estimator, model: _FabricModule) -> None: ... - def on_fit_end(self, estimator: Estimator, model: _FabricModule, output: List[FIT_OUTPUT]) -> None: + def on_fit_end(self, estimator: Estimator, model: _FabricModule, output: list[FIT_OUTPUT]) -> None: ... """ @@ -86,12 +88,7 @@ def on_batch_start( ... def on_train_batch_start( - self, - estimator: Estimator, - model: _FabricModule, - batch: Any, - batch_idx: int, - optimizer: Optimizer, + self, estimator: Estimator, model: _FabricModule, batch: Any, batch_idx: int, optimizer: Optimizer ) -> None: return self.on_batch_start(RunningStage.TRAIN, estimator, model, batch, batch_idx, optimizer=optimizer) @@ -133,6 +130,16 @@ def on_before_optimizer(self, estimator: Estimator, model: _FabricModule, optimi def on_after_optimizer(self, estimator: Estimator, model: _FabricModule, optimizer: _FabricOptimizer) -> None: ... + def on_before_scheduler( + self, estimator: Estimator, model: _FabricModule, optimizer: _FabricOptimizer, scheduler: _LRScheduler + ) -> None: + ... + + def on_after_scheduler( + self, estimator: Estimator, model: _FabricModule, optimizer: _FabricOptimizer, scheduler: _LRScheduler + ) -> None: + ... + class CallbackWithMonitor(Callback): mode: str @@ -153,8 +160,8 @@ def optim_op(self) -> Callable: def reverse_optim_op(self) -> Callable: return self.reverse_optim_dict[self.mode] - def _get_monitor(self, output: Union[BATCH_OUTPUT, EPOCH_OUTPUT]) -> float: - if not isinstance(output, Dict): + def _get_monitor(self, output: Optional[Union[BATCH_OUTPUT, EPOCH_OUTPUT]]) -> float: + if not isinstance(output, dict) or output is None: raise RuntimeError( "From `*_step` and `*_epoch_end` method you need to return dict to use ", "monitoring Callbacks like EarlyStopping and ModelCheckpoint.", diff --git a/energizer/callbacks/early_stopping.py b/energizer/callbacks/early_stopping.py index 4557941..052b796 100644 --- a/energizer/callbacks/early_stopping.py +++ b/energizer/callbacks/early_stopping.py @@ -1,5 +1,5 @@ from pathlib import Path -from typing import Any, Optional, Tuple, Union +from typing import Any, Optional, Union import numpy as np import srsly @@ -41,7 +41,7 @@ def __init__( def _check_stopping_criteria( self, output: Union[BATCH_OUTPUT, EPOCH_OUTPUT], step: int - ) -> Tuple[bool, Union[str, None]]: + ) -> tuple[bool, Union[str, None]]: current = self._get_monitor(output) should_stop = False diff --git a/energizer/callbacks/grad_norm.py b/energizer/callbacks/grad_norm.py deleted file mode 100644 index 6508b0a..0000000 --- a/energizer/callbacks/grad_norm.py +++ /dev/null @@ -1,31 +0,0 @@ -from typing import Union - -from lightning.fabric.wrappers import _FabricModule, _FabricOptimizer -from lightning.pytorch.utilities.grads import grad_norm - -from energizer.callbacks import Callback -from energizer.estimator import Estimator - - -class GradNorm(Callback): - def __init__(self, norm_type: Union[float, int, str], group_separator: str = "/") -> None: - """Compute each parameter's gradient's norm and their overall norm. - - The overall norm is computed over all gradients together, as if they - were concatenated into a single vector. - - Args: - norm_type: The type of the used p-norm, cast to float if necessary. - Can be ``'inf'`` for infinity norm. - group_separator: The separator string used by the logger to group - the gradients norms in their own subfolder instead of the logs one. - - """ - self.group_separator = group_separator - self.norm_type = float(norm_type) - if self.norm_type <= 0: - raise ValueError(f"`norm_type` must be a positive number or 'inf' (infinity norm). Got {self.norm_type}") - - def on_before_optimizer(self, estimator: Estimator, model: _FabricModule, optimizer: _FabricOptimizer) -> None: - norms = grad_norm(model, norm_type=self.norm_type, group_separator=self.group_separator) - estimator.log_dict(norms, step=estimator.tracker.global_step) diff --git a/energizer/callbacks/grad_stats.py b/energizer/callbacks/grad_stats.py new file mode 100644 index 0000000..eb2cc8f --- /dev/null +++ b/energizer/callbacks/grad_stats.py @@ -0,0 +1,218 @@ +from collections.abc import Iterable +from typing import Union + +import torch +from lightning.fabric.wrappers import _FabricModule, _FabricOptimizer + +from energizer.callbacks import Callback +from energizer.estimator import Estimator + + +def grad_norm(module: torch.nn.Module, norm_types: list[float], group_separator: str = "/") -> dict[str, float]: + # compute on device + return { + f"grad_{norm_type}_norm{group_separator}{n}": torch.linalg.vector_norm( + p.grad.detach().data.flatten(), ord=norm_type + ).item() + for norm_type in norm_types + for n, p in module.named_parameters() + if p.grad is not None and p.requires_grad + } + + +def empirical_fim_norm( + module: torch.nn.Module, norm_types: list[float], group_separator: str = "/" +) -> dict[str, float]: + # compute on device + return { + f"efim_{norm_type}_norm{group_separator}{n}": torch.linalg.vector_norm( + p.grad.detach().data.flatten() ** 2, ord=norm_type + ).item() + for norm_type in norm_types + for n, p in module.named_parameters() + if p.grad is not None and p.requires_grad + } + + +def empirical_fim_trace(module: torch.nn.Module, group_separator: str = "/") -> dict[str, float]: + # compute on device + return { + f"efim_trace{group_separator}{n}": torch.sum(p.grad.detach().data.flatten() ** 2).item() + for n, p in module.named_parameters() + if p.grad is not None and p.requires_grad + } + + +def update_size_norm( + differences: list[tuple[str, torch.Tensor]], norm_types: list[float], group_separator: str = "/" +) -> dict[str, float]: + """Compute each parameter's gradient update (difference between after and before update) norm. + + Args: + current_params: the new parameters after the update + previous_params: the paramenters before the update + norm_type: The type of the used p-norm, cast to float if necessary. + Can be ``'inf'`` for infinity norm. + group_separator: The separator string used by the logger to group + the gradients norms in their own subfolder instead of the logs one. + + Return: + norms: The dictionary of p-norms of each parameter's gradient and + a special entry for the total p-norm of the gradients viewed + as a single vector. + + """ + + # compute on device + return { + f"update_{norm_type}_norm{group_separator}{n}": torch.linalg.vector_norm(diff.flatten(), ord=norm_type).item() + for norm_type in norm_types + for n, diff in differences + } + + +def relative_stdlog10_update_size( + differences: list[tuple[str, torch.Tensor]], previous_params: list[torch.Tensor], group_separator: str = "/" +) -> dict[str, float]: + # compute on device + return { + f"relative_stdlog10_update{group_separator}{n}": (diff.std() / p_before.std()).log10().item() + for (n, diff), p_before in zip(differences, previous_params) + } + + +def relative_norm_update_size( + differences: list[tuple[str, torch.Tensor]], + previous_params: list[torch.Tensor], + norm_types: list[float], + group_separator: str = "/", +) -> dict[str, float]: + # compute on device + return { + f"relative_update_{norm_type}_norm{group_separator}{n}": torch.linalg.vector_norm( + diff.flatten(), ord=norm_type + ).item() + / torch.linalg.vector_norm(p_before.flatten(), ord=norm_type).item() + for norm_type in norm_types + for (n, diff), p_before in zip(differences, previous_params) + } + + +class GradNorm(Callback): + def __init__( + self, norm_types: Union[float, int, str, list[Union[float, int, str]]], group_separator: str = "/" + ) -> None: + """Compute each parameter's gradient's norm and their overall norm. + + The overall norm is computed over all gradients together, as if they + were concatenated into a single vector. + + Args: + norm_type: The type of the used p-norm, cast to float if necessary. + Can be ``'inf'`` for infinity norm. + group_separator: The separator string used by the logger to group + the gradients norms in their own subfolder instead of the logs one. + + """ + self.group_separator = group_separator + + if not isinstance(norm_types, Iterable) or isinstance(norm_types, str): + norm_types = [norm_types] + + self.norm_types = [float(i) for i in norm_types] + + assert all(i > 0 for i in self.norm_types), ValueError( + f"`norm_type` must be a positive number or 'inf' (infinity norm). Got {self.norm_types}" + ) + + def on_before_optimizer(self, estimator: Estimator, model: _FabricModule, optimizer: _FabricOptimizer) -> None: + norms = grad_norm(model, norm_types=self.norm_types, group_separator=self.group_separator) + estimator.log_dict(norms, step=estimator.tracker.global_step) + + +class EmpiricalFIMNorm(GradNorm): + def on_before_optimizer(self, estimator: Estimator, model: _FabricModule, optimizer: _FabricOptimizer) -> None: + norms = empirical_fim_norm(model, norm_types=self.norm_types, group_separator=self.group_separator) + estimator.log_dict(norms, step=estimator.tracker.global_step) + + +class EmpiricalFIMTrace(Callback): + def __init__(self, group_separator: str = "/") -> None: + self.group_separator = group_separator + + def on_before_optimizer(self, estimator: Estimator, model: _FabricModule, optimizer: _FabricOptimizer) -> None: + norms = empirical_fim_trace(model, group_separator=self.group_separator) + estimator.log_dict(norms, step=estimator.tracker.global_step) + + +class ParameterUpdateStats(GradNorm): + _previous_params: list[torch.Tensor] = [] + + def __init__( + self, + norm_types: Union[float, int, str, list[Union[float, int, str]]], + group_separator: str = "/", + return_update_size_norm: bool = True, + return_relative_std_update: bool = True, + return_relative_norm_update: bool = True, + ) -> None: + """Compute each parameter's gradient's norm and their overall norm. + + The overall norm is computed over all gradients together, as if they + were concatenated into a single vector. + + Args: + norm_type: The type of the used p-norm, cast to float if necessary. + Can be ``'inf'`` for infinity norm. + group_separator: The separator string used by the logger to group + the gradients norms in their own subfolder instead of the logs one. + + """ + super().__init__(norm_types, group_separator) + self.return_update_size_norm = return_update_size_norm + self.return_relative_std_update = return_relative_std_update + self.return_relative_norm_update = return_relative_norm_update + + def on_before_optimizer(self, estimator: Estimator, model: _FabricModule, optimizer: _FabricOptimizer) -> None: + self._previous_params = [ + p.data.clone().detach() for _, p in model.named_parameters() if p.grad is not None and p.requires_grad + ] + + def on_after_optimizer(self, estimator: Estimator, model: _FabricModule, optimizer: _FabricOptimizer) -> None: + # assert len(current_params) == len(previous_params), ValueError( + # f"Current and previous parameter lists are not the same: {len(current_params)=} and {len(previous_params)=}" + # ) + + current_params = ( + (n, p.data.clone().detach()) for n, p in model.named_parameters() if p.grad is not None and p.requires_grad + ) + + diffs = [(n, p_after - p_before) for (n, p_after), p_before in zip(current_params, self._previous_params)] + + logs = {} + if self.return_update_size_norm: + update_size_norms = update_size_norm( + differences=diffs, norm_types=self.norm_types, group_separator=self.group_separator + ) + logs.update(update_size_norms) + + if self.return_relative_std_update: + relative_std = relative_stdlog10_update_size( + differences=diffs, previous_params=self._previous_params, group_separator=self.group_separator + ) + logs.update(relative_std) + + if self.return_relative_norm_update: + relative_norms = relative_norm_update_size( + differences=diffs, + previous_params=self._previous_params, + norm_types=self.norm_types, + group_separator=self.group_separator, + ) + logs.update(relative_norms) + + if len(logs) > 0: + estimator.log_dict(logs, step=estimator.tracker.global_step) + + # free memory + self._previous_params = [] diff --git a/energizer/callbacks/lr_monitor.py b/energizer/callbacks/lr_monitor.py new file mode 100644 index 0000000..d7d745d --- /dev/null +++ b/energizer/callbacks/lr_monitor.py @@ -0,0 +1,19 @@ +from lightning.fabric.wrappers import _FabricModule, _FabricOptimizer + +from energizer.callbacks import Callback +from energizer.estimator import Estimator + + +class LearningRateMonitor(Callback): + def __init__(self, prefix: str = "lr_monitor/") -> None: + super().__init__() + self.prefix = prefix + + def on_before_optimizer(self, estimator: Estimator, model: _FabricModule, optimizer: _FabricOptimizer) -> None: + last_lrs = [group["lr"] for group in optimizer.param_groups] + + if len(last_lrs) > 1: + lrs = {f"{self.prefix}lr_param_group{idx}": lr for idx, lr in enumerate(last_lrs)} + estimator.log_dict(lrs, step=estimator.tracker.global_step) + else: + estimator.log(f"{self.prefix}lr", next(iter(last_lrs)), step=estimator.tracker.global_step) diff --git a/energizer/callbacks/model_checkpoint.py b/energizer/callbacks/model_checkpoint.py index e20d240..62dc97b 100644 --- a/energizer/callbacks/model_checkpoint.py +++ b/energizer/callbacks/model_checkpoint.py @@ -1,60 +1,67 @@ import os +import shutil from pathlib import Path -from typing import Dict, Optional, Union +from typing import Any, Optional, Union import srsly from lightning.fabric.wrappers import _FabricModule +from lightning_utilities.core.rank_zero import rank_zero_info from energizer.callbacks.base import CallbackWithMonitor -from energizer.enums import RunningStage +from energizer.enums import Interval, RunningStage from energizer.estimator import Estimator -from energizer.types import EPOCH_OUTPUT, METRIC +from energizer.types import BATCH_OUTPUT, EPOCH_OUTPUT, METRIC from energizer.utilities import make_dict_json_serializable class ModelCheckpoint(CallbackWithMonitor): - _best_k_models: Dict[str, float] = {} + _best_k_models: dict[str, float] = {} + monitor: Optional[str] = None + mode: Optional[str] = "min" def __init__( self, dirpath: Union[Path, str], - monitor: str, stage: Union[str, RunningStage], - mode: str = "min", - save_last: Optional[bool] = None, - save_top_k: int = 1, + frequency: str = "1:epoch", + monitor: Optional[str] = None, + mode: Optional[str] = "min", + save_last: Optional[bool] = False, + save_top_k: Optional[int] = 1, verbose: bool = True, ) -> None: super().__init__() self.dirpath = Path(dirpath) - self.monitor = monitor self.stage = stage + + # monitor + self.monitor = monitor self.mode = mode self.save_last = save_last self.save_top_k = save_top_k self.verbose = verbose + # frequency + self.frequency = frequency + every_n, interval = self.frequency.split(":") + every_n = int(every_n) + assert every_n > 0 + assert interval in list(Interval) + + rank_zero_info(f"Running ModelCheckpoint callback every {every_n} {interval}") + self.every_n = every_n + self.interval = interval + @property def best_model_path(self) -> str: return self.optim_op(self._best_k_models, key=self._best_k_models.get) - def on_train_epoch_end( - self, estimator: Estimator, model: _FabricModule, output: EPOCH_OUTPUT, metrics: METRIC - ) -> None: - self.epoch_end(estimator, output, RunningStage.TRAIN) - - def on_validation_epoch_end( - self, estimator: Estimator, model: _FabricModule, output: EPOCH_OUTPUT, metrics: METRIC - ) -> None: - self.epoch_end(estimator, output, RunningStage.VALIDATION) - def on_fit_start(self, *args, **kwargs) -> None: # prepare directory if self.dirpath.exists(): # during active learning we do not want to keep checkpoints from previous iterations for ckpt_path in self.dirpath.glob("*.pt"): ckpt_path.unlink() - # shutil.rmtree(str(i)) self.dirpath.mkdir(parents=True, exist_ok=True) self._best_k_models = {} @@ -64,12 +71,9 @@ def on_fit_end(self, estimator: Estimator, *args, **kwargs) -> None: estimator.load_state_dict(self.dirpath, self.best_model_path) if self.verbose: - logs = { - "selected": self.best_model_path, - "step": estimator.tracker.safe_global_epoch, - } + logs = {"selected": self.best_model_path, "step": estimator.tracker.safe_global_epoch} if hasattr(estimator.tracker, "global_round"): - logs["round"] = getattr(estimator.tracker, "global_round") + logs["round"] = estimator.tracker.global_round srsly.write_jsonl( self.dirpath / "checkpoint_logs.jsonl", @@ -82,32 +86,59 @@ def on_fit_end(self, estimator: Estimator, *args, **kwargs) -> None: Helpers """ - def epoch_end(self, estimator: Estimator, output: EPOCH_OUTPUT, stage: Union[str, RunningStage]) -> None: - if stage != self.stage: - return + def should_checkpoint(self, stage: Union[str, RunningStage], interval: Interval, step_or_epoch: int) -> bool: + # when we get to batch_end or epoch_end the step tracker has already been incremented! + step_or_epoch = step_or_epoch + 1 if interval == Interval.EPOCH else step_or_epoch + return stage == self.stage and interval == self.interval and step_or_epoch % self.every_n == 0 - current = self._get_monitor(output) + def on_epoch_end( + self, + stage: Union[str, RunningStage], + estimator: Estimator, + model: _FabricModule, + output: EPOCH_OUTPUT, + metrics: METRIC, + ) -> None: + if self.should_checkpoint(stage, Interval.EPOCH, estimator.tracker.global_epoch): + self.checkpoint(stage, estimator, output) - if self._check_should_save(stage, current): - # checkpoint - name = self._get_name(estimator, current) - estimator.save_state_dict(self.dirpath, name) - self._update_best_models(name, current) + def on_batch_end( + self, + stage: Union[str, RunningStage], + estimator: Estimator, + model: _FabricModule, + output: BATCH_OUTPUT, + batch: Any, + batch_idx: int, + ) -> None: + if self.should_checkpoint(stage, Interval.STEP, estimator.tracker.global_step): + self.checkpoint(stage, estimator, output) - # log - if self.verbose: - logs = { - "step": estimator.tracker.global_step, - **self._best_k_models, - } - if hasattr(estimator.tracker, "global_round"): - logs["round"] = getattr(estimator.tracker, "global_round", None) - srsly.write_jsonl( - self.dirpath / "checkpoint_logs.jsonl", - [make_dict_json_serializable(logs)], - append=True, - append_new_line=False, - ) + def checkpoint( + self, stage: Union[str, RunningStage], estimator: Estimator, output: Union[EPOCH_OUTPUT, BATCH_OUTPUT] + ) -> None: + if self.monitor is not None: + current = self._get_monitor(output) + if self._check_should_save(stage, current): + # checkpoint + name = self._get_name(estimator, current) + estimator.save_state_dict(self.dirpath, name) + self._update_best_models(name, current) + + # log + if self.verbose: + logs = {"step": estimator.tracker.global_step, **self._best_k_models} + if hasattr(estimator.tracker, "global_round"): + logs["round"] = getattr(estimator.tracker, "global_round", None) + srsly.write_jsonl( + self.dirpath / "checkpoint_logs.jsonl", + [make_dict_json_serializable(logs)], + append=True, + append_new_line=False, + ) + else: + name = f"{self.interval}_{getattr(estimator.tracker, f'global_{self.interval}')}" + estimator.save_state_dict(self.dirpath, name) def _check_should_save(self, stage: Union[str, RunningStage], current: Optional[float]) -> bool: should_save = False @@ -142,5 +173,8 @@ def _update_best_models(self, name: str, current: Optional[float]) -> None: if self.save_top_k is not None and len(self._best_k_models) >= self.save_top_k: worst_ckpt = self.reverse_optim_op(self._best_k_models, key=self._best_k_models.get) self._best_k_models.pop(worst_ckpt) - os.remove(self.dirpath / worst_ckpt) + if (self.dirpath / worst_ckpt).is_dir(): + shutil.rmtree(self.dirpath / worst_ckpt) + else: + os.remove(self.dirpath / worst_ckpt) self._best_k_models[name] = current diff --git a/energizer/callbacks/pytorch_profiler.py b/energizer/callbacks/pytorch_profiler.py index 6d5c733..8569ca1 100644 --- a/energizer/callbacks/pytorch_profiler.py +++ b/energizer/callbacks/pytorch_profiler.py @@ -8,13 +8,7 @@ class PytorchTensorboardProfiler(Callback): def __init__( - self, - dirpath: Union[str, Path], - wait: int = 1, - warmup: int = 1, - active: int = 1, - repeat: int = 2, - **kwargs, + self, dirpath: Union[str, Path], wait: int = 1, warmup: int = 1, active: int = 1, repeat: int = 2, **kwargs ) -> None: self.prof = torch.profiler.profile( schedule=torch.profiler.schedule(wait=wait, warmup=warmup, active=active, repeat=repeat), diff --git a/energizer/datastores/base.py b/energizer/datastores/base.py index ed727e9..bf37fc1 100644 --- a/energizer/datastores/base.py +++ b/energizer/datastores/base.py @@ -3,25 +3,24 @@ """ from abc import ABC, abstractmethod -from pathlib import Path -from typing import Any, Callable, Dict, List, Optional, Tuple, Union +from collections.abc import Callable +from dataclasses import dataclass +from typing import Any, Optional, Union -import hnswlib as hb -import numpy as np import pandas as pd -import srsly import torch from datasets import Dataset -from lightning_utilities.core.rank_zero import rank_zero_warn from numpy.random import RandomState from sklearn.utils import check_random_state # type: ignore from torch.utils.data import DataLoader, RandomSampler, Sampler, SequentialSampler +from energizer.datastores.mixins import IndexMixin from energizer.enums import RunningStage, SpecialKeys from energizer.types import DATA_SOURCE, DATASET +from energizer.utilities import Args -class BaseDataStore(ABC): +class BaseDatastore(ABC): """General container for data.""" """ @@ -103,11 +102,25 @@ def test_size(self, *args, **kwargs) -> Optional[int]: ... -class Datastore(BaseDataStore): +@dataclass +class DataloaderArgs(Args): + batch_size: int + eval_batch_size: int + num_workers: int + pin_memory: bool + drop_last: bool + persistent_workers: bool + shuffle: bool + replacement: bool + data_seed: int + multiprocessing_context: Optional[str] + + +class Datastore(BaseDatastore): """Defines dataloading for training and evaluation.""" _collate_fn: Optional[Callable] - _loading_params: Dict[str, Any] = {} + _loading_params: Optional[DataloaderArgs] = None _rng: RandomState def __init__(self, seed: Optional[int] = 42) -> None: @@ -124,10 +137,11 @@ def prepare_for_loading( drop_last: bool = False, persistent_workers: bool = False, shuffle: bool = True, - data_seed: int = 42, replacement: bool = False, + data_seed: int = 42, + multiprocessing_context: Optional[str] = None, ) -> None: - self._loading_params = dict( + self._loading_params = DataloaderArgs( batch_size=batch_size, eval_batch_size=eval_batch_size, num_workers=num_workers, @@ -137,13 +151,13 @@ def prepare_for_loading( shuffle=shuffle, replacement=replacement, data_seed=data_seed, + multiprocessing_context=multiprocessing_context, ) @property - def loading_params(self) -> Dict[str, Any]: - if len(self._loading_params) > 0: - return self._loading_params - raise ValueError("You need to `prepare_for_loading`") + def loading_params(self) -> DataloaderArgs: + assert self._loading_params is not None, ValueError("You need to `prepare_for_loading`") + return self._loading_params def reset_rng(self, seed: Optional[int]) -> None: self._rng = check_random_state(seed) @@ -158,32 +172,35 @@ def show_batch(self, stage: Union[str, RunningStage] = RunningStage.TRAIN, *args return next(iter(loader)) def get_loader(self, stage: str, *args, **kwargs) -> Optional[DataLoader]: - # get dataset dataset = getattr(self, f"{stage}_dataset")(*args, **kwargs) if dataset is None: return batch_size = ( - self.loading_params["batch_size"] if stage == RunningStage.TRAIN else self.loading_params["eval_batch_size"] + self.loading_params.batch_size if stage == RunningStage.TRAIN else self.loading_params.eval_batch_size ) batch_size = min(batch_size, len(dataset)) # sampler sampler = _get_sampler( dataset, - shuffle=self.loading_params["shuffle"] if stage == RunningStage.TRAIN else False, - replacement=self.loading_params["replacement"], - seed=self.loading_params["data_seed"], + shuffle=self.loading_params.shuffle if stage == RunningStage.TRAIN else False, + replacement=self.loading_params.replacement, + seed=self.loading_params.data_seed, ) # put everything together return DataLoader( dataset=dataset, - batch_size=self.loading_params["batch_size"], + batch_size=batch_size, sampler=sampler, collate_fn=self.get_collate_fn(stage), - drop_last=self.loading_params["drop_last"], + drop_last=self.loading_params.drop_last, + num_workers=min(batch_size, self.loading_params.num_workers), + pin_memory=self.loading_params.pin_memory, + persistent_workers=self.loading_params.persistent_workers, + multiprocessing_context=self.loading_params.multiprocessing_context, ) def _get_size(self, stage: RunningStage, *args, **kwargs) -> Optional[int]: @@ -211,15 +228,9 @@ def validation_size(self, *args, **kwargs) -> Optional[int]: def test_size(self, *args, **kwargs) -> Optional[int]: return self._get_size(RunningStage.TEST, *args, **kwargs) - -class PandasDataStore(Datastore): - _train_data: Optional[pd.DataFrame] - _validation_data: Optional[Dataset] - _test_data: Optional[Dataset] - def train_dataset(self) -> Optional[Dataset]: if self._train_data is not None: - return Dataset.from_pandas(self._train_data, preserve_index=False) + return self._train_data def validation_dataset(self) -> Optional[Dataset]: if self._validation_data is not None: @@ -229,57 +240,22 @@ def test_dataset(self) -> Optional[Dataset]: if self._test_data is not None: return self._test_data - def get_by_ids(self, ids: List[int]) -> pd.DataFrame: + +class PandasDatastore(Datastore): + _train_data: Optional[pd.DataFrame] + _validation_data: Optional[Dataset] + _test_data: Optional[Dataset] + + def train_dataset(self) -> Optional[Dataset]: + if self._train_data is not None: + return Dataset.from_pandas(self._train_data, preserve_index=False) + + def get_by_ids(self, ids: list[int]) -> pd.DataFrame: assert self._train_data is not None, "To `get_by_ids` you need to specify the train_data." # type: ignore return self._train_data.loc[self._train_data[SpecialKeys.ID].isin(ids)] # type: ignore -class IndexMixin: - index: hb.Index = None - embedding_name: str - - def search(self, query: np.ndarray, query_size: int, query_in_set: bool = True) -> Tuple[np.ndarray, np.ndarray]: - # retrieve one additional element if the query is in the set we are looking in - # because the query itself is returned as the most similar element and we need to remove it - query_size = query_size + 1 if query_in_set else query_size - indices, distances = self.index.knn_query(data=query, k=query_size) - if query_in_set: - # remove the first element retrieved if the query is in the set since it's the element itself - indices, distances = indices[:, 1:], distances[:, 1:] - return indices, distances - - def load_index(self, index_path: Union[str, Path], metadata_path: Union[str, Path]) -> None: - meta: Dict = srsly.read_json(metadata_path) # type: ignore - index = hb.Index(space=meta["metric"], dim=meta["dim"]) - index.load_index(str(index_path)) - self.index = index - - # consistency check: data in index must be the same or more - assert self._train_data is not None # type: ignore - assert len(index.get_ids_list()) >= len(self._train_data[SpecialKeys.ID]), "Index is not compatible with data." # type: ignore - - # if dataset has been downsampled, mask the ids - if len(index.get_ids_list()) > len(self._train_data[SpecialKeys.ID]): # type: ignore - rank_zero_warn( - "Index has more ids than dataset. Masking the missing ids from the index. " - "If this is expected (e.g., you downsampled your dataset), everything is fine." - ) - missing_ids = set(index.get_ids_list()).difference(set(self._train_data[SpecialKeys.ID])) # type: ignore - self.mask_ids_from_index(list(missing_ids)) - - def mask_ids_from_index(self, ids: List[int]) -> None: - for i in ids: - self.index.mark_deleted(i) - - def unmask_ids_from_index(self, ids: List[int]) -> None: - for i in ids: - self.index.unmark_deleted(i) - - def get_embeddings(self, ids: List[int]) -> np.ndarray: - return np.stack(self.index.get_items(ids)) - - -class PandasDataStoreWithIndex(IndexMixin, PandasDataStore): +class PandasDatastoreWithIndex(IndexMixin, PandasDatastore): """DataModule that defines dataloading and indexing logic.""" @@ -288,12 +264,7 @@ class PandasDataStoreWithIndex(IndexMixin, PandasDataStore): """ -def _get_sampler( - dataset: DATASET, - shuffle: bool, - replacement: bool, - seed: int, -) -> Sampler: +def _get_sampler(dataset: DATASET, shuffle: bool, replacement: bool, seed: int) -> Sampler: """Get a sampler optimizer to work with `datasets.Dataset`. ref: https://huggingface.co/docs/datasets/use_with_pytorch diff --git a/energizer/datastores/classification.py b/energizer/datastores/classification.py index 5db06a5..f5138c4 100644 --- a/energizer/datastores/classification.py +++ b/energizer/datastores/classification.py @@ -1,29 +1,59 @@ -from abc import ABC from collections import Counter +from collections.abc import Callable +from dataclasses import dataclass from functools import partial -from typing import Any, Callable, Dict, List, Optional, Union +from typing import Optional, Union import torch -from datasets import Dataset, DatasetDict # type: ignore +from datasets import Dataset from torch import Tensor from transformers import PreTrainedTokenizerBase -from typing_extensions import Self -from energizer.datastores.base import PandasDataStoreWithIndex -from energizer.enums import InputKeys, RunningStage, SpecialKeys -from energizer.utilities import _pad, ld_to_dl, sequential_numbers +from energizer.datastores.base import DataloaderArgs, Datastore, PandasDatastoreWithIndex +from energizer.datastores.mixins import TextMixin +from energizer.enums import InputKeys, RunningStage +from energizer.utilities import _pad, ld_to_dl -class SequenceClassificationMixin(ABC): - MANDATORY_INPUT_NAMES: List[str] = [InputKeys.INPUT_IDS, InputKeys.ATT_MASK] - OPTIONAL_INPUT_NAMES: List[str] = [InputKeys.TOKEN_TYPE_IDS] - MANDATORY_TARGET_NAME: str = InputKeys.LABELS +def collate_fn_for_sequence_classification( + batch: list[dict[str, Union[list[str], Tensor]]], + input_names: list[str], + on_cpu: list[str], + max_length: Optional[int], + pad_token_id: Optional[int], + pad_fn: Callable, +) -> dict[str, Union[list[str], Tensor]]: + new_batch = ld_to_dl(batch) + + # remove string columns that cannot be transfered on gpu + values_on_cpu = {col: new_batch.pop(col, None) for col in on_cpu if col in new_batch} + + labels = new_batch.pop(InputKeys.LABELS, None) - _tokenizer: PreTrainedTokenizerBase - _labels: List[str] - _label_distribution: Dict[str, int] - input_names: List[str] - on_cpu: List[str] + # input_ids and attention_mask to tensor: truncate -> convert to tensor -> pad + new_batch = {k: pad_fn(inputs=new_batch[k], padding_value=pad_token_id, max_length=max_length) for k in input_names} + + if labels is not None: + new_batch[InputKeys.LABELS] = torch.tensor(labels, dtype=torch.long) + + # add things that need to remain on cpu + if len(values_on_cpu) > 0: + new_batch[InputKeys.ON_CPU] = values_on_cpu + + return new_batch + + +@dataclass +class SequenceClassificationDataloaderArgs(DataloaderArgs): + max_length: int + + +class SequenceClassificationMixin(TextMixin): + MANDATORY_TARGET_NAME: Optional[str] = InputKeys.LABELS + _loading_params: Optional[SequenceClassificationDataloaderArgs] = None + + _labels: list[str] + _label_distribution: dict[str, dict[str, int]] def prepare_for_loading( self, @@ -34,235 +64,84 @@ def prepare_for_loading( drop_last: bool = False, persistent_workers: bool = False, shuffle: bool = True, - seed: int = 42, replacement: bool = False, + data_seed: int = 42, + multiprocessing_context: Optional[str] = None, max_length: int = 512, ) -> None: - super().prepare_for_loading( # type: ignore - batch_size, - eval_batch_size, - num_workers, - pin_memory, - drop_last, - persistent_workers, - shuffle, - seed, - replacement, + self._loading_params = SequenceClassificationDataloaderArgs( + batch_size=batch_size, + eval_batch_size=eval_batch_size, + num_workers=num_workers, + pin_memory=pin_memory, + drop_last=drop_last, + persistent_workers=persistent_workers, + shuffle=shuffle, + replacement=replacement, + data_seed=data_seed, + multiprocessing_context=multiprocessing_context, + max_length=max_length, ) - self._loading_params["max_length"] = max_length # type: ignore - - @property - def tokenizer(self) -> PreTrainedTokenizerBase: - return self._tokenizer @property - def labels(self) -> List[str]: + def labels(self) -> list[str]: return self._labels @property - def id2label(self) -> Dict[int, str]: + def id2label(self) -> dict[int, str]: return dict(enumerate(self.labels)) @property - def label2id(self) -> Dict[str, int]: + def label2id(self) -> dict[str, int]: return {v: k for k, v in self.id2label.items()} - def label_distribution(self, normalized: bool = False) -> Dict[str, Union[float, int]]: + def label_distribution(self, normalized: bool = False) -> dict[str, dict]: if normalized: - total = sum(self._label_distribution.values()) - return {k: self._label_distribution[k] / total for k in self._label_distribution} - return dict(self._label_distribution) - - @classmethod - def from_datasets( - cls, - tokenizer: PreTrainedTokenizerBase, - uid_name: Optional[str] = None, - on_cpu: Optional[List[str]] = None, - seed: Optional[int] = 42, - train_dataset: Optional[Dataset] = None, - validation_dataset: Optional[Dataset] = None, - test_dataset: Optional[Dataset] = None, - ) -> Self: - obj = cls(seed) # type: ignore - return _from_datasets( - obj=obj, - mandatory_input_names=cls.MANDATORY_INPUT_NAMES, - optional_input_names=cls.OPTIONAL_INPUT_NAMES, - mandatory_target_name=cls.MANDATORY_TARGET_NAME, - tokenizer=tokenizer, - uid_name=uid_name, - on_cpu=on_cpu, - train_dataset=train_dataset, - validation_dataset=validation_dataset, - test_dataset=test_dataset, - ) - - @classmethod - def from_dataset_dict( - cls, - dataset_dict: DatasetDict, - tokenizer: PreTrainedTokenizerBase, - uid_name: Optional[str] = None, - on_cpu: Optional[List[str]] = None, - seed: Optional[int] = 42, - ) -> Self: - return cls.from_datasets( - tokenizer=tokenizer, - uid_name=uid_name, - on_cpu=on_cpu, - seed=seed, - train_dataset=dataset_dict.get(RunningStage.TRAIN), - validation_dataset=dataset_dict.get(RunningStage.VALIDATION), - test_dataset=dataset_dict.get(RunningStage.TEST), - ) + norm_label_distribution = {} + for split, label_dist in self._label_distribution.items(): + total = sum(label_dist.values()) + norm_label_distribution[split] = {k: label_dist[k] / total for k in label_dist} + return norm_label_distribution + + return self._label_distribution + + def _set_attributes(self, dataset_dict: dict[RunningStage, Dataset], tokenizer: PreTrainedTokenizerBase) -> None: + super()._set_attributes(dataset_dict, tokenizer) + + # === SET ATTRIBUTES === # + _label_distribution = {} + for k in dataset_dict: + _label_distribution[k] = dict(Counter(dataset_dict[k][self.MANDATORY_TARGET_NAME])) # type: ignore + self._label_distribution = _label_distribution + self._labels = next(iter(dataset_dict.values())).features[self.MANDATORY_TARGET_NAME].names + + def _check_labels(self, dataset_dict: dict[RunningStage, Dataset], mandatory_target_name: str) -> None: + labels = [] + for split, dataset in dataset_dict.items(): + assert ( + mandatory_target_name in dataset.features + ), f"Mandatory column {mandatory_target_name} not in dataset[{split}]." + labels.append(set(dataset.features[mandatory_target_name].names)) + + # check labels are consistent + assert all(s == labels[0] for s in labels), "Labels are inconsistent across splits" def get_collate_fn(self, stage: Optional[RunningStage] = None, show_batch: bool = False) -> Optional[Callable]: return partial( - collate_fn, + collate_fn_for_sequence_classification, input_names=self.input_names, on_cpu=self.on_cpu, - max_length=None if show_batch else self.loading_params["max_length"], # type: ignore + max_length=None if show_batch else self.loading_params.max_length, # type: ignore pad_token_id=self.tokenizer.pad_token_id, pad_fn=_pad, ) -class PandasDataStoreForSequenceClassification(SequenceClassificationMixin, PandasDataStoreWithIndex): +class DatastoreForSequenceClassification(SequenceClassificationMixin, Datastore): ... -""" -Utilities -""" - - -def collate_fn( - batch: List[Dict[str, Union[List[str], Tensor]]], - input_names: List[str], - on_cpu: List[str], - max_length: Optional[int], - pad_token_id: Optional[int], - pad_fn: Callable, -) -> Dict[str, Union[List[str], Tensor]]: - new_batch = ld_to_dl(batch) - - # remove string columns that cannot be transfered on gpu - values_on_cpu = {col: new_batch.pop(col, None) for col in on_cpu if col in new_batch} - - labels = new_batch.pop(InputKeys.LABELS, None) - - # input_ids and attention_mask to tensor: truncate -> convert to tensor -> pad - new_batch = { - k: pad_fn( - inputs=new_batch[k], - padding_value=pad_token_id, - max_length=max_length, - ) - for k in input_names - } - - if labels is not None: - new_batch[InputKeys.LABELS] = torch.tensor(labels, dtype=torch.long) - - # add things that need to remain on cpu - if len(on_cpu) > 0: - new_batch[InputKeys.ON_CPU] = values_on_cpu - - return new_batch - - -def _from_datasets( - obj, - mandatory_input_names: List[str], - optional_input_names: List[str], - mandatory_target_name: str, - tokenizer: PreTrainedTokenizerBase, - uid_name: Optional[str] = None, - on_cpu: Optional[List[str]] = None, - train_dataset: Optional[Dataset] = None, - validation_dataset: Optional[Dataset] = None, - test_dataset: Optional[Dataset] = None, -) -> Any: - - _datasets = { - RunningStage.TRAIN: train_dataset, - RunningStage.VALIDATION: validation_dataset, - RunningStage.TEST: test_dataset, - } - datasets: Dict[RunningStage, Dataset] = {k: v for k, v in _datasets.items() if v is not None} - if len(datasets) < 1: - raise ValueError("You need to pass at least one dataset.") - - # === INPUT NAMES === # - input_names = [] - for name in mandatory_input_names: - for split, dataset in datasets.items(): - if name in dataset.features: - input_names.append(name) - else: - raise ValueError(f"Mandatory column {name} not in dataset[{split}].") - - for name in optional_input_names: - for dataset in datasets.values(): - if name in dataset.features: - input_names.append(name) - - # === TARGET NAME === # - labels = [] - for split, dataset in datasets.items(): - assert ( - mandatory_target_name in dataset.features - ), f"Mandatory column {mandatory_target_name} not in dataset[{split}]." - labels.append(set(dataset.features[mandatory_target_name].names)) - - # check labels are consistent - assert all(s == labels[0] for s in labels), "Labels are inconsistent across splits" - - # === ON_CPU === # - if on_cpu is not None: - for name in on_cpu: - for split, dataset in datasets.items(): - assert name in dataset.features, f"{name=} not in dataset[{split}]={dataset.features.keys()}" - else: - on_cpu = [] - - # === UID NAME === # - uid_generator = sequential_numbers() - new_datasets = {} - for k, d in datasets.items(): - if uid_name is None: - uids = [next(uid_generator) for _ in range(len(d))] - new_dataset = d.add_column(SpecialKeys.ID, uids) # type: ignore - print(f"UID column {SpecialKeys.ID} automatically created in dataset[{k}]") - else: - assert uid_name in d.features, f"{uid_name=} not in dataset[{k}]={d.features.keys()}" - ids = d[uid_name] - assert len(set(ids)) == len(ids), f"`uid_column` {uid_name} is not unique." - - new_dataset = d - if uid_name != SpecialKeys.ID: - new_dataset = new_dataset.rename_columns({uid_name: SpecialKeys.ID}) - print(f"UID column {uid_name} automatically renamed to {SpecialKeys.ID} in dataset[{k}]") - - new_datasets[k] = new_dataset - - on_cpu += [SpecialKeys.ID] - - # === FORMAT (KEEP ONLY USEFUL COLUMNS) === # - columns = input_names + on_cpu + [mandatory_target_name] - new_datasets = {k: v.with_format(columns=columns) for k, v in new_datasets.items()} - - # === SET ATTRIBUTES === # - if RunningStage.TRAIN in new_datasets: - obj._label_distribution = Counter(new_datasets[RunningStage.TRAIN][mandatory_target_name]) - - obj._labels = next(iter(new_datasets.values())).features[mandatory_target_name].names - obj.input_names = input_names - obj.on_cpu = on_cpu - obj._tokenizer = tokenizer - obj._train_data = new_datasets[RunningStage.TRAIN].to_pandas() # type: ignore - obj._validation_data = new_datasets.get(RunningStage.VALIDATION) # type: ignore - obj._test_data = new_datasets.get(RunningStage.TEST) # type: ignore - - return obj +class PandasDatastoreForSequenceClassification(SequenceClassificationMixin, PandasDatastoreWithIndex): + def _set_attributes(self, dataset_dict: dict[RunningStage, Dataset], tokenizer: PreTrainedTokenizerBase) -> None: + super()._set_attributes(dataset_dict, tokenizer) + self._train_data = self._train_data.to_pandas() # type: ignore diff --git a/energizer/datastores/language_modelling.py b/energizer/datastores/language_modelling.py index b2e926a..0b07b93 100644 --- a/energizer/datastores/language_modelling.py +++ b/energizer/datastores/language_modelling.py @@ -1,22 +1,88 @@ +from collections.abc import Callable # , Generator, Any +from dataclasses import dataclass from functools import partial -from itertools import chain -from typing import Any, Callable, Dict, List, Optional, Union +from typing import Optional, Union -from datasets import Dataset, DatasetDict # type: ignore +from datasets import Dataset +from lightning_utilities.core.rank_zero import rank_zero_info from torch import Tensor from transformers import PreTrainedTokenizerBase -from typing_extensions import Self -from energizer.datastores.base import PandasDataStoreWithIndex -from energizer.enums import InputKeys, RunningStage, SpecialKeys -from energizer.utilities import _pad, ld_to_dl, sequential_numbers +from energizer.datastores.base import DataloaderArgs, Datastore, PandasDatastoreWithIndex +from energizer.datastores.mixins import TextMixin +from energizer.enums import InputKeys, RunningStage +from energizer.utilities import _pad, ld_to_dl +# from itertools import islice -class LanguageModellingMixin: - _tokenizer: PreTrainedTokenizerBase - input_names: List[str] - on_cpu: List[str] +def collate_fn_for_language_modelling( + batch: list[dict[str, Union[list[str], Tensor]]], + input_names: list[str], + on_cpu: list[str], + max_length: Optional[int], + pad_token_id: Optional[int], + pad_fn: Callable, + return_labels: bool, +) -> dict[str, Union[list[str], Tensor]]: + new_batch = ld_to_dl(batch) + + # remove string columns that cannot be transfered on gpu + values_on_cpu = {col: new_batch.pop(col, None) for col in on_cpu if col in new_batch} + + labels = new_batch.pop(InputKeys.LABELS, None) + + # input_ids and attention_mask to tensor: truncate -> convert to tensor -> pad + new_batch = {k: pad_fn(inputs=new_batch[k], padding_value=pad_token_id, max_length=max_length) for k in input_names} + + # labels substitute pad_token_id with -100 + if return_labels: + labels = new_batch[InputKeys.INPUT_IDS].clone() + if pad_token_id is not None: + labels[labels == pad_token_id] = -100 + new_batch[InputKeys.LABELS] = labels + + # add things that need to remain on cpu + if len(values_on_cpu) > 0: + new_batch[InputKeys.ON_CPU] = values_on_cpu + + return new_batch + + +@dataclass +class LanguageModellingDataloaderArgs(DataloaderArgs): + max_length: int + + +class LanguageModellingMixin(TextMixin): + MANDATORY_INPUT_NAMES: list[str] = [InputKeys.INPUT_IDS] + MANDATORY_TARGET_NAME: Optional[str] = None + OPTIONAL_INPUT_NAMES: list[str] = [] + + _loading_params: Optional[LanguageModellingDataloaderArgs] = None + _return_labels: bool = True + + def set_return_labels(self, mode: bool = True) -> None: + self._return_labels = mode + msg = f"Return labels is {self._return_labels}." + if not self._return_labels: + msg += " Remeber that you now need to manually shift the `input_ids` to obtain the labels." + rank_zero_info(msg) + + @property + def return_labels(self) -> bool: + return self._return_labels + + def get_collate_fn(self, stage: Optional[RunningStage] = None, show_batch: bool = False) -> Optional[Callable]: + return partial( + collate_fn_for_language_modelling, + input_names=self.input_names, + on_cpu=self.on_cpu, + max_length=None if show_batch else self.loading_params.max_length, # type: ignore + pad_token_id=self.tokenizer.pad_token_id, + pad_fn=_pad, + return_labels=self.return_labels, + ) def prepare_for_loading( self, @@ -27,207 +93,77 @@ def prepare_for_loading( drop_last: bool = False, persistent_workers: bool = False, shuffle: bool = True, - seed: int = 42, replacement: bool = False, + data_seed: int = 42, + multiprocessing_context: Optional[str] = None, max_length: int = 512, ) -> None: - super().prepare_for_loading( - batch_size, - eval_batch_size, - num_workers, - pin_memory, - drop_last, - persistent_workers, - shuffle, - seed, - replacement, + self._loading_params = LanguageModellingDataloaderArgs( + batch_size=batch_size, + eval_batch_size=eval_batch_size, + num_workers=num_workers, + pin_memory=pin_memory, + drop_last=drop_last, + persistent_workers=persistent_workers, + shuffle=shuffle, + data_seed=data_seed, + replacement=replacement, + multiprocessing_context=multiprocessing_context, + max_length=max_length, ) - self._loading_params["max_length"] = max_length - @property - def tokenizer(self) -> PreTrainedTokenizerBase: - return self._tokenizer - - @classmethod - def from_datasets( - cls, - tokenizer: PreTrainedTokenizerBase, - uid_name: Optional[str] = None, - on_cpu: Optional[List[str]] = None, - seed: Optional[int] = 42, - train_dataset: Optional[Dataset] = None, - validation_dataset: Optional[Dataset] = None, - test_dataset: Optional[Dataset] = None, - ) -> Self: - obj = cls(seed) - return _from_datasets( - obj=obj, - tokenizer=tokenizer, - uid_name=uid_name, - on_cpu=on_cpu, - train_dataset=train_dataset, - validation_dataset=validation_dataset, - test_dataset=test_dataset, - ) + # def get_packed_dataset(self, dataset: Dataset, block_size: int) -> Dataset: + # iterable_dataset = dataset.to_iterable_dataset() + # input_ids_iterator = iter(token for ex in iterable_dataset for token in ex[InputKeys.INPUT_IDS]) + # packed_dataset = Dataset.from_generator(batched(input_ids_iterator, block_size)) + # return packed_dataset - @classmethod - def from_dataset_dict( - cls, - dataset_dict: DatasetDict, - tokenizer: PreTrainedTokenizerBase, - uid_name: Optional[str] = None, - on_cpu: Optional[List[str]] = None, - seed: Optional[int] = 42, - ) -> Self: - return cls.from_datasets( - tokenizer=tokenizer, - uid_name=uid_name, - on_cpu=on_cpu, - seed=seed, - train_dataset=dataset_dict.get(RunningStage.TRAIN), - validation_dataset=dataset_dict.get(RunningStage.VALIDATION), - test_dataset=dataset_dict.get(RunningStage.TEST), - ) + # def train_dataset(self) -> Optional[Dataset]: + # if self._train_data is not None: + # return self._train_data - def get_collate_fn(self, stage: Optional[RunningStage] = None, show_batch: bool = False) -> Optional[Callable]: - return partial( - collate_fn, - input_names=self.input_names, - on_cpu=self.on_cpu, - max_length=None if show_batch else self.loading_params["max_length"], - pad_token_id=self.tokenizer.pad_token_id, - pad_fn=_pad, - ) + # def validation_dataset(self) -> Optional[Dataset]: + # if self._validation_data is not None: + # return self._validation_data - def group_texts(self, block_size: int) -> None: - dataset = self.train_dataset() - dataset = dataset.with_format(columns=self.input_names) - dataset = dataset.map(lambda ex: group_texts(ex, block_size=block_size), batched=True) - self._train_data = dataset.to_pandas() + # def test_dataset(self) -> Optional[Dataset]: + # if self._test_data is not None: + # return self._test_data -class PandasDataStoreForLanguageModelling(LanguageModellingMixin, PandasDataStoreWithIndex): +class DatastoreForLanguageModelling(LanguageModellingMixin, Datastore): ... -""" -Utilities -""" +class PandasDatastoreForLanguageModelling(LanguageModellingMixin, PandasDatastoreWithIndex): + def _set_attributes(self, dataset_dict: dict[RunningStage, Dataset], tokenizer: PreTrainedTokenizerBase) -> None: + super()._set_attributes(dataset_dict, tokenizer) + self._train_data = self._train_data.to_pandas() # type: ignore -def collate_fn( - batch: List[Dict[str, Union[List[str], Tensor]]], - input_names: str, - on_cpu: List[str], - max_length: Optional[int], - pad_token_id: Optional[int], - pad_fn: Callable, -) -> Dict[str, Union[List[str], Tensor]]: - new_batch = ld_to_dl(batch) +# def batched(iterator, chunk_size) -> Generator[list[Any], Any, None]: +# while chunk := list(islice(iterator, chunk_size)): +# yield chunk - # remove string columns that cannot be transfered on gpu - values_on_cpu = {col: new_batch.pop(col, None) for col in on_cpu if col in new_batch} +# def group_texts(examples: dict, block_size: int) -> dict: +# """Concatenate all texts from our dataset and generate chunks of block_size. - labels = new_batch.pop(InputKeys.LABELS, None) +# Refs: https://github.com/huggingface/transformers/blob/bfb1895e3346cb8a2bf2560c75d45e70edf46a47/examples/pytorch/language-modeling/run_clm_no_trainer.py#L456 +# """ - # input_ids and attention_mask to tensor: truncate -> convert to tensor -> pad - new_batch = { - k: pad_fn( - inputs=new_batch[k], - padding_value=pad_token_id, - max_length=max_length, - ) - for k in input_names - } +# # Concatenate all texts +# concatenated_examples = {k: list(chain(*examples[k])) for k in examples.keys()} +# # concatenated_examples = {k: sum(examples[k], []) for k in examples.keys()} - # labels substitute pad_token_id with -100 - labels = new_batch[InputKeys.INPUT_IDS].clone() - if pad_token_id is not None: - labels[labels == pad_token_id] = -100 - new_batch[InputKeys.LABELS] = labels +# total_length = len(concatenated_examples[next(iter(examples.keys()))]) - # add things that need to remain on cpu - if len(on_cpu) > 0: - new_batch[InputKeys.ON_CPU] = values_on_cpu - - return new_batch +# # We drop the small remainder, and if the total_length < block_size we exclude this batch and return an empty dict +# # We could add padding if the model supported it instead of this drop, you can customize this part to your needs. +# total_length = (total_length // block_size) * block_size +# # Split by chunks of max_len +# result = { +# k: [t[i : i + block_size] for i in range(0, total_length, block_size)] for k, t in concatenated_examples.items() +# } -def _from_datasets( - obj: Any, - tokenizer: PreTrainedTokenizerBase, - uid_name: Optional[str] = None, - on_cpu: Optional[List[str]] = None, - train_dataset: Optional[Dataset] = None, - validation_dataset: Optional[Dataset] = None, - test_dataset: Optional[Dataset] = None, -) -> Any: - obj._tokenizer = tokenizer - obj.input_names = [InputKeys.INPUT_IDS, InputKeys.ATT_MASK] - obj.on_cpu = on_cpu or [] - - _datasets = { - RunningStage.TRAIN: train_dataset, - RunningStage.VALIDATION: validation_dataset, - RunningStage.TEST: test_dataset, - } - datasets: Dict[RunningStage, Dataset] = {k: v for k, v in _datasets.items() if v is not None} - if len(datasets) < 1: - raise ValueError("You need to pass at least one dataset.") - - uid_generator = sequential_numbers() - columns = obj.input_names + obj.on_cpu - if uid_name is not None: - columns.append(uid_name) - - new_datasets = {} - for k, d in datasets.items(): - # check all columns are present in all datasets - for col in columns: - assert col in d.features.keys(), f"{col=} not in dataset={d.features.keys()}" - - if uid_name is None: - uids = [next(uid_generator) for _ in range(len(d))] - new_dataset = d.add_column(SpecialKeys.ID, uids) - else: - # check - col = list(datasets[RunningStage.TRAIN][SpecialKeys.ID]) - assert len(set(col)) == len(col), f"`uid_column` {uid_name} is not unique." - new_dataset = d.rename_columns({uid_name: SpecialKeys.ID}) - - new_datasets[k] = new_dataset - - obj.on_cpu += [SpecialKeys.ID] - - # set data sources - new_datasets = {k: v.with_format(columns=obj.input_names + obj.on_cpu) for k, v in new_datasets.items()} - - obj._train_data = new_datasets[RunningStage.TRAIN].to_pandas() - obj._validation_data = new_datasets.get(RunningStage.VALIDATION) - obj._test_data = new_datasets.get(RunningStage.TEST) - - return obj - - -def group_texts(examples: Dict, block_size: int) -> Dict: - """Concatenate all texts from our dataset and generate chunks of block_size. - - Refs: https://github.com/huggingface/transformers/blob/bfb1895e3346cb8a2bf2560c75d45e70edf46a47/examples/pytorch/language-modeling/run_clm_no_trainer.py#L456 - """ - - # Concatenate all texts - concatenated_examples = {k: list(chain(*examples[k])) for k in examples.keys()} - # concatenated_examples = {k: sum(examples[k], []) for k in examples.keys()} - - total_length = len(concatenated_examples[list(examples.keys())[0]]) - - # We drop the small remainder, and if the total_length < block_size we exclude this batch and return an empty dict - # We could add padding if the model supported it instead of this drop, you can customize this part to your needs. - total_length = (total_length // block_size) * block_size - - # Split by chunks of max_len - result = { - k: [t[i : i + block_size] for i in range(0, total_length, block_size)] for k, t in concatenated_examples.items() - } - - return result +# return result diff --git a/energizer/datastores/mixins.py b/energizer/datastores/mixins.py new file mode 100644 index 0000000..ba06b96 --- /dev/null +++ b/energizer/datastores/mixins.py @@ -0,0 +1,239 @@ +from abc import ABC, abstractmethod +from collections.abc import Callable +from pathlib import Path +from typing import Optional, Union + +import hnswlib as hb +import numpy as np +import srsly +from datasets import Dataset, DatasetDict # type: ignore +from lightning_utilities.core.rank_zero import rank_zero_warn +from transformers import PreTrainedTokenizerBase +from typing_extensions import Self + +from energizer.enums import InputKeys, RunningStage, SpecialKeys +from energizer.utilities import sequential_numbers + + +class TextMixin(ABC): + MANDATORY_INPUT_NAMES: list[str] = [InputKeys.INPUT_IDS, InputKeys.ATT_MASK] + OPTIONAL_INPUT_NAMES: list[str] = [InputKeys.TOKEN_TYPE_IDS] + MANDATORY_TARGET_NAME: Optional[str] = None + + _tokenizer: PreTrainedTokenizerBase + input_names: list[str] + on_cpu: list[str] + + @abstractmethod + def get_collate_fn(self, stage: Optional[RunningStage] = None, show_batch: bool = False) -> Optional[Callable]: + ... + + @property + def tokenizer(self) -> PreTrainedTokenizerBase: + return self._tokenizer + + @classmethod + def from_datasets( + cls, + tokenizer: PreTrainedTokenizerBase, + uid_name: Optional[str] = None, + on_cpu: Optional[list[str]] = None, + seed: Optional[int] = 42, + train_dataset: Optional[Dataset] = None, + validation_dataset: Optional[Dataset] = None, + test_dataset: Optional[Dataset] = None, + ) -> Self: + obj = cls(seed) # type: ignore + obj.load_datasets( + tokenizer=tokenizer, + uid_name=uid_name, + on_cpu=on_cpu, + train_dataset=train_dataset, + validation_dataset=validation_dataset, + test_dataset=test_dataset, + mandatory_input_names=obj.MANDATORY_INPUT_NAMES, + optional_input_names=obj.OPTIONAL_INPUT_NAMES, + mandatory_target_name=obj.MANDATORY_TARGET_NAME, + ) + return obj + + @classmethod + def from_dataset_dict( + cls, + dataset_dict: DatasetDict, + tokenizer: PreTrainedTokenizerBase, + uid_name: Optional[str] = None, + on_cpu: Optional[list[str]] = None, + seed: Optional[int] = 42, + ) -> Self: + obj = cls(seed) # type: ignore + obj.load_datasets( + tokenizer=tokenizer, + uid_name=uid_name, + on_cpu=on_cpu, + train_dataset=dataset_dict.get(RunningStage.TRAIN), + validation_dataset=dataset_dict.get(RunningStage.VALIDATION), + test_dataset=dataset_dict.get(RunningStage.TEST), + mandatory_input_names=obj.MANDATORY_INPUT_NAMES, + optional_input_names=obj.OPTIONAL_INPUT_NAMES, + mandatory_target_name=obj.MANDATORY_TARGET_NAME, + ) + return obj + + def load_datasets( + self, + mandatory_input_names: list[str], + optional_input_names: list[str], + mandatory_target_name: Optional[str], + tokenizer: PreTrainedTokenizerBase, + uid_name: Optional[str] = None, + on_cpu: Optional[list[str]] = None, + train_dataset: Optional[Dataset] = None, + validation_dataset: Optional[Dataset] = None, + test_dataset: Optional[Dataset] = None, + ) -> None: + _datasets = { + RunningStage.TRAIN: train_dataset, + RunningStage.VALIDATION: validation_dataset, + RunningStage.TEST: test_dataset, + } + datasets: dict[RunningStage, Dataset] = {k: v for k, v in _datasets.items() if v is not None} + if len(datasets) < 1: + raise ValueError("You need to pass at least one dataset.") + + # === INPUT NAMES === # + self._check_input_names(datasets, mandatory_input_names, optional_input_names) + + # === TARGET NAME === # + if mandatory_target_name is not None: + self._check_labels(datasets, mandatory_target_name) + + # === ON_CPU === # + self._check_on_cpu(datasets, on_cpu) + + # === UID NAME === # + datasets = self._check_uid(datasets, uid_name) + self.on_cpu += [SpecialKeys.ID] + + # === FORMAT (KEEP ONLY USEFUL COLUMNS) === # + datasets = self._format_datasets(datasets) + + # === SET ATTRIBUTES === # + self._set_attributes(datasets, tokenizer) + + def _check_input_names( + self, + dataset_dict: dict[RunningStage, Dataset], + mandatory_input_names: list[str], + optional_input_names: list[str], + ) -> None: + input_names = [] + for name in mandatory_input_names: + for split, dataset in dataset_dict.items(): + if name in dataset.features: + input_names.append(name) + else: + raise ValueError(f"Mandatory column {name} not in dataset[{split}].") + + for name in optional_input_names: + for dataset in dataset_dict.values(): + if name in dataset.features: + input_names.append(name) + + self.input_names = list(set(input_names)) + + def _check_on_cpu(self, dataset_dict: dict[RunningStage, Dataset], on_cpu: Optional[list[str]]) -> None: + _on_cpu = [] + if on_cpu is not None: + for name in on_cpu: + for split, dataset in dataset_dict.items(): + assert name in dataset.features, f"{name=} not in dataset[{split}]={dataset.features.keys()}" + _on_cpu.append(name) + self.on_cpu = list(set(_on_cpu)) + + def _check_uid( + self, dataset_dict: dict[RunningStage, Dataset], uid_name: Optional[str] + ) -> dict[RunningStage, Dataset]: + uid_generator = sequential_numbers() + new_datasets = {} + for k, d in dataset_dict.items(): + if uid_name is None: + uids = [next(uid_generator) for _ in range(len(d))] + new_dataset = d.add_column(SpecialKeys.ID, uids) # type: ignore + print(f"UID column {SpecialKeys.ID} automatically created in dataset[{k}]") + else: + assert uid_name in d.features, f"{uid_name=} not in dataset[{k}]={d.features.keys()}" + ids = d[uid_name] + assert len(set(ids)) == len(ids), f"`uid_column` {uid_name} is not unique." + + new_dataset = d + if uid_name != SpecialKeys.ID: + new_dataset = new_dataset.rename_columns({uid_name: SpecialKeys.ID}) + print(f"UID column {uid_name} automatically renamed to {SpecialKeys.ID} in dataset[{k}]") + + new_datasets[k] = new_dataset + + return new_datasets + + def _check_labels(self, dataset_dict: dict[RunningStage, Dataset], mandatory_target_name: str) -> None: + for split, dataset in dataset_dict.items(): + assert ( + mandatory_target_name in dataset.features + ), f"Mandatory column {mandatory_target_name} not in dataset[{split}]." + + def _format_datasets(self, dataset_dict: dict[RunningStage, Dataset]) -> dict[RunningStage, Dataset]: + columns = self.input_names + self.on_cpu + if self.MANDATORY_TARGET_NAME is not None: + columns.append(self.MANDATORY_TARGET_NAME) + return {k: v.with_format(columns=columns) for k, v in dataset_dict.items()} + + def _set_attributes(self, dataset_dict: dict[RunningStage, Dataset], tokenizer: PreTrainedTokenizerBase) -> None: + self._tokenizer = tokenizer + self._train_data = dataset_dict.get(RunningStage.TRAIN) # type: ignore + self._validation_data = dataset_dict.get(RunningStage.VALIDATION) # type: ignore + self._test_data = dataset_dict.get(RunningStage.TEST) # type: ignore + + +class IndexMixin: + index: hb.Index = None + embedding_name: str + + def search(self, query: np.ndarray, query_size: int, query_in_set: bool = True) -> tuple[np.ndarray, np.ndarray]: + # retrieve one additional element if the query is in the set we are looking in + # because the query itself is returned as the most similar element and we need to remove it + query_size = query_size + 1 if query_in_set else query_size + indices, distances = self.index.knn_query(data=query, k=query_size) + if query_in_set: + # remove the first element retrieved if the query is in the set since it's the element itself + indices, distances = indices[:, 1:], distances[:, 1:] + return indices, distances + + def load_index(self, index_path: Union[str, Path], metadata_path: Union[str, Path]) -> None: + meta: dict = srsly.read_json(metadata_path) # type: ignore + index = hb.Index(space=meta["metric"], dim=meta["dim"]) + index.load_index(str(index_path)) + self.index = index + + # consistency check: data in index must be the same or more + assert self._train_data is not None # type: ignore + assert len(index.get_ids_list()) >= len(self._train_data[SpecialKeys.ID]), "Index is not compatible with data." # type: ignore + + # if dataset has been downsampled, mask the ids + if len(index.get_ids_list()) > len(self._train_data[SpecialKeys.ID]): # type: ignore + rank_zero_warn( + "Index has more ids than dataset. Masking the missing ids from the index. " + "If this is expected (e.g., you downsampled your dataset), everything is fine." + ) + missing_ids = set(index.get_ids_list()).difference(set(self._train_data[SpecialKeys.ID])) # type: ignore + self.mask_ids_from_index(list(missing_ids)) + + def mask_ids_from_index(self, ids: list[int]) -> None: + for i in ids: + self.index.mark_deleted(i) + + def unmask_ids_from_index(self, ids: list[int]) -> None: + for i in ids: + self.index.unmark_deleted(i) + + def get_embeddings(self, ids: list[int]) -> np.ndarray: + return np.stack(self.index.get_items(ids)) diff --git a/energizer/datastores/seq2seq.py b/energizer/datastores/seq2seq.py new file mode 100644 index 0000000..8a869ee --- /dev/null +++ b/energizer/datastores/seq2seq.py @@ -0,0 +1,109 @@ +from collections.abc import Callable +from dataclasses import dataclass +from functools import partial +from typing import Optional, Union + +from datasets import Dataset +from torch import Tensor +from transformers import PreTrainedTokenizerBase + +from energizer.datastores.base import DataloaderArgs, Datastore, PandasDatastoreWithIndex +from energizer.datastores.mixins import TextMixin +from energizer.enums import InputKeys, RunningStage +from energizer.utilities import _pad, ld_to_dl + + +def collate_fn_for_seq2seq( + batch: list[dict[str, Union[list[str], Tensor]]], + input_names: list[str], + on_cpu: list[str], + max_source_length: Optional[int], + max_target_length: Optional[int], + pad_token_id: Optional[int], + pad_fn: Callable, +) -> dict[str, Union[list[str], Tensor]]: + new_batch = ld_to_dl(batch) + + # remove string columns that cannot be transfered on gpu + values_on_cpu = {col: new_batch.pop(col, None) for col in on_cpu if col in new_batch} + + labels = new_batch.pop(InputKeys.LABELS, None) + + # input_ids and attention_mask to tensor: truncate -> convert to tensor -> pad + new_batch = { + k: pad_fn(inputs=new_batch[k], padding_value=pad_token_id, max_length=max_source_length) for k in input_names + } + + # labels substitute pad_token_id with -100 + labels = pad_fn(inputs=labels, padding_value=-100, max_length=max_target_length) + new_batch[InputKeys.LABELS] = labels + + # add things that need to remain on cpu + if len(values_on_cpu) > 0: + new_batch[InputKeys.ON_CPU] = values_on_cpu + + return new_batch + + +@dataclass +class Seq2SeqDataloaderArgs(DataloaderArgs): + max_source_length: int + max_target_length: int + + +class Seq2SeqMixin(TextMixin): + MANDATORY_TARGET_NAME: Optional[str] = InputKeys.LABELS + OPTIONAL_INPUT_NAMES: list[str] = [] + BLOCK_SIZE: int = 1_000 + _loading_params: Optional[Seq2SeqDataloaderArgs] = None + + def prepare_for_loading( + self, + batch_size: int = 32, + eval_batch_size: int = 32, + num_workers: int = 0, + pin_memory: bool = True, + drop_last: bool = False, + persistent_workers: bool = False, + shuffle: bool = True, + replacement: bool = False, + data_seed: int = 42, + multiprocessing_context: Optional[str] = None, + max_source_length: int = 512, + max_target_length: int = 512, + ) -> None: + self._loading_params = Seq2SeqDataloaderArgs( + batch_size=batch_size, + eval_batch_size=eval_batch_size, + num_workers=num_workers, + pin_memory=pin_memory, + drop_last=drop_last, + persistent_workers=persistent_workers, + shuffle=shuffle, + replacement=replacement, + data_seed=data_seed, + multiprocessing_context=multiprocessing_context, + max_source_length=max_source_length, + max_target_length=max_target_length, + ) + + def get_collate_fn(self, stage: Optional[RunningStage] = None, show_batch: bool = False) -> Optional[Callable]: + return partial( + collate_fn_for_seq2seq, + input_names=self.input_names, + on_cpu=self.on_cpu, + max_source_length=None if show_batch else self.loading_params.max_source_length, # type: ignore + max_target_length=None if show_batch else self.loading_params.max_target_length, # type: ignore + pad_token_id=self.tokenizer.pad_token_id, + pad_fn=_pad, + ) + + +class DatastoreForSeq2Seq(Seq2SeqMixin, Datastore): + ... + + +class PandasDatastoreForSeq2Seq(Seq2SeqMixin, PandasDatastoreWithIndex): + def _set_attributes(self, dataset_dict: dict[RunningStage, Dataset], tokenizer: PreTrainedTokenizerBase) -> None: + super()._set_attributes(dataset_dict, tokenizer) + self._train_data = self._train_data.to_pandas() # type: ignore diff --git a/energizer/enums.py b/energizer/enums.py index aad60e7..e485569 100644 --- a/energizer/enums.py +++ b/energizer/enums.py @@ -1,5 +1,6 @@ +from collections.abc import Generator from enum import Enum, EnumMeta -from typing import Any, Generator +from typing import Any class ValueOnlyEnumMeta(EnumMeta): diff --git a/energizer/estimator.py b/energizer/estimator.py index f1c01bd..5895320 100644 --- a/energizer/estimator.py +++ b/energizer/estimator.py @@ -1,15 +1,19 @@ -import copy +from collections.abc import Callable, Mapping from dataclasses import dataclass, field from pathlib import Path -from typing import Any, Callable, Dict, List, Literal, Mapping, Optional, Tuple, Union +from typing import Any, Literal, Optional, Union +import bitsandbytes as bnb import numpy as np import torch from lightning.fabric import Fabric from lightning.fabric.accelerators.accelerator import Accelerator +from lightning.fabric.connector import _PLUGIN_INPUT from lightning.fabric.loggers.logger import Logger +from lightning.fabric.plugins.precision.bitsandbytes import BitsandbytesPrecision from lightning.fabric.plugins.precision.precision import _PRECISION_INPUT from lightning.fabric.wrappers import _FabricDataLoader, _FabricModule, _FabricOptimizer +from lightning_utilities.core.rank_zero import rank_zero_info from torch.optim.lr_scheduler import _LRScheduler from torch.optim.optimizer import Optimizer from torch.utils.data import DataLoader @@ -18,23 +22,16 @@ from energizer.registries import OPTIMIZER_REGISTRY, SCHEDULER_REGISTRY from energizer.trackers import ProgressTracker from energizer.types import BATCH_OUTPUT, EPOCH_OUTPUT, FIT_OUTPUT, METRIC -from energizer.utilities import move_to_cpu, set_deterministic +from energizer.utilities import Args, move_to_cpu, set_deterministic from energizer.utilities.model_summary import summarize -@dataclass -class Args: - def to_dict(self) -> Dict[str, Any]: - out = copy.deepcopy(self.__dict__) - return out - - @dataclass class SchedulerArgs(Args): name: Optional[str] = None num_warmup_steps: Optional[int] = None num_training_steps: Optional[int] = None - init_kwargs: Dict = field(default_factory=dict) + init_kwargs: dict = field(default_factory=dict) @dataclass @@ -42,17 +39,19 @@ class OptimizationArgs(Args): name: Optional[str] = None lr: Optional[float] = None weight_decay: Optional[float] = None - no_decay: Optional[List[str]] = None + no_decay: Optional[list[str]] = None set_to_none: bool = False clip_val: Optional[Union[float, int]] = None max_norm: Optional[Union[float, int]] = None norm_type: Union[float, int] = 2.0 - init_kwargs: Dict = field(default_factory=dict) + init_kwargs: dict = field(default_factory=dict) scheduler_kwargs: SchedulerArgs = field(default_factory=lambda: SchedulerArgs()) + backward_create_graph: bool = False + backward_retain_graph: Optional[bool] = None class Estimator: - _model: Union[torch.nn.Module, Callable] + _model: torch.nn.Module _tracker: ProgressTracker _optimization_args: OptimizationArgs _is_compiled: bool = False @@ -62,10 +61,11 @@ def __init__( model: Any, accelerator: Union[str, Accelerator] = "cpu", precision: _PRECISION_INPUT = 32, - callbacks: Optional[Union[List[Any], Any]] = None, - loggers: Optional[Union[Logger, List[Logger]]] = None, + callbacks: Optional[Union[list[Any], Any]] = None, + loggers: Optional[Union[Logger, list[Logger]]] = None, deterministic: Union[bool, Literal["warn_only"]] = "warn_only", tf32_mode: Literal["highest", "high", "medium"] = "highest", + plugins: Optional[Union[_PLUGIN_INPUT, list[_PLUGIN_INPUT]]] = None, **kwargs, ) -> None: super().__init__() @@ -76,16 +76,24 @@ def __init__( loggers=loggers, devices=1, # only works with single-GPU num_nodes=1, # only works with single-node + plugins=plugins, ) self.set_deterministic(deterministic) self.set_torch_matmul_precision(tf32_mode) - self.init_model(model, **kwargs) self.init_tracker() + self.configure_model(model, **kwargs) + + def init_tracker(self) -> None: + self._tracker = ProgressTracker() + + """ + Properties + """ @property - def model(self) -> Union[torch.nn.Module, Callable]: + def model(self) -> torch.nn.Module: return self._model @property @@ -98,10 +106,44 @@ def device(self) -> torch.device: @property def precision(self) -> str: + # NOTE: doing this because model is not cast at __init__ but only when `self.fabric.setup` is called + if self.is_quantized: + rank_zero_info( + "Model is loaded with the `BitsandbytesPrecision` plugin thus it currently is not cast to the correct dtype. " + f"It will only be cast during `fit` or `test`. Furthermore, the linear layers will be cast to {self.quantization_mode}" + ) + dtype = self.fabric._precision.dtype # type: ignore + return "bf16-true" if dtype == torch.bfloat16 else "16-true" return self.fabric._precision.precision @property - def loggers(self) -> List[Logger]: + def is_quantized(self) -> bool: + # NOTE: hacky -- this is very specific to the BitsandbytesPrecision plugin + return isinstance(self.fabric._precision, BitsandbytesPrecision) + + @property + def quantization_mode(self) -> Optional[str]: + # NOTE: look at the BitsandbytesPrecision class + cls_to_mode = { + "_NF4Linear": "nf4", + "_NF4DQLinear": "nf4-dq", + "_FP4Linear": "fp4", + "_FP4DQLinear": "fp4-dq", + "_Linear8bitLt": "int8-training", + "_Int8LinearInference": "int8", + } + if self.is_quantized: + return cls_to_mode[self.fabric._precision._linear_cls.__name__] # type: ignore + rank_zero_info("Model is not quantized") + + @property + def dtypes(self) -> set[str]: + # need to setup for changes to take effect + model = self.fabric.setup(self.model) + return {str(p.dtype) for p in model.parameters()} + + @property + def loggers(self) -> list[Logger]: """Returns all loggers passed to Fabric.""" return self.fabric.loggers @@ -110,14 +152,6 @@ def logger(self) -> Logger: """Returns the first logger in the list passed to Fabric, which is considered the main logger.""" return self.fabric.logger - # @property - # def prediction_dtype(self) -> torch.dtype: - # dtype = self.precision - # if "-" in dtype: - # dtype = dtype.split("-")[0] - # dtype = f"bfloat{dtype[2:]}" if dtype.startswith("b") else f"float{dtype}" - # return getattr(torch, dtype) - @property def model_summary(self) -> str: return summarize(self) @@ -130,32 +164,9 @@ def is_compiled(self) -> bool: def optimization_args(self) -> OptimizationArgs: return self._optimization_args - def init_tracker(self) -> None: - self._tracker = ProgressTracker() - - def init_model(self, model: Any, **kwargs) -> None: - self._model = model - - def compile(self, **kwargs) -> None: - # model becomes a Callable - self._model = torch.compile(self._model, **kwargs) - self._is_compiled = True - - def set_torch_matmul_precision(self, tf32_mode: Literal["highest", "high", "medium"] = "highest") -> None: - # equivalent to `torch.backends.cudnn.allow_tf32 = True` - # convolutions are not changed, to do that you need - # `torch.backends.cudnn.allow_tf32 = True` - torch.set_float32_matmul_precision(tf32_mode) - - def set_deterministic(self, deterministic: Union[bool, Literal["warn_only"]]) -> None: - # sets deterministic convolutions too - set_deterministic(deterministic) - - def set_eval_mode(self) -> None: - self.model.eval() - - def set_train_mode(self, mode: bool = True) -> None: - self.model.train(mode) + @property + def callbacks(self) -> list: + return self.fabric._callbacks """ Entry points @@ -165,7 +176,7 @@ def fit( self, train_loader: DataLoader, validation_loader: Optional[DataLoader] = None, - max_epochs: Optional[int] = 3, + max_epochs: Optional[int] = None, min_epochs: Optional[int] = None, max_steps: Optional[int] = None, min_steps: Optional[int] = None, @@ -173,14 +184,14 @@ def fit( gradient_accumulation_steps: Optional[int] = None, learning_rate: Optional[float] = None, optimizer: Optional[str] = None, - optimizer_kwargs: Optional[Union[Dict, OptimizationArgs]] = None, + optimizer_kwargs: Optional[Union[dict, OptimizationArgs]] = None, scheduler: Optional[str] = None, - scheduler_kwargs: Optional[Union[Dict, SchedulerArgs]] = None, + scheduler_kwargs: Optional[Union[dict, SchedulerArgs]] = None, log_interval: int = 1, enable_progress_bar: bool = True, limit_train_batches: Optional[int] = None, limit_validation_batches: Optional[int] = None, - ) -> List[FIT_OUTPUT]: + ) -> list[FIT_OUTPUT]: """Entry point for model training. Calls `fit -> run_fit -> run_epoch -> run_training_step`. @@ -207,13 +218,7 @@ def fit( ) model, _optimizer, _scheduler, _train_loader, _validation_loader = self._setup_fit( - train_loader, - validation_loader, - learning_rate, - optimizer, - optimizer_kwargs, - scheduler, - scheduler_kwargs, + train_loader, validation_loader, learning_rate, optimizer, optimizer_kwargs, scheduler, scheduler_kwargs ) return self.run_fit(model, _optimizer, _scheduler, _train_loader, _validation_loader) # type: ignore @@ -253,7 +258,7 @@ def run_fit( scheduler: Optional[_LRScheduler], train_loader: _FabricDataLoader, validation_loader: Optional[_FabricDataLoader], - ) -> List[FIT_OUTPUT]: + ) -> list[FIT_OUTPUT]: self.tracker.start_fit() self.callback("on_fit_start", model=model) @@ -303,18 +308,16 @@ def run_epoch( self.callback("on_train_batch_start", model=model, optimizer=optimizer, batch=batch, batch_idx=batch_idx) - # print("=======") - # run model on batch batch_out = self.run_training_step(model, optimizer, scheduler, batch, batch_idx, loss_fn, metrics) self.callback("on_train_batch_end", model=model, output=batch_out, batch=batch, batch_idx=batch_idx) # record output - train_out.append(move_to_cpu(batch_out)) + if batch_out is not None: + train_out.append(move_to_cpu(batch_out)) # validation loop - # print("IN ->", self.tracker.should_validate, "Step:", self.tracker.global_step, "Batch:", self.tracker.global_batch) if self.tracker.should_validate: out = self.run_evaluation(model, validation_loader, RunningStage.VALIDATION) # type: ignore if out is not None: @@ -329,7 +332,6 @@ def run_epoch( self.callback("on_train_epoch_end", model=model, output=train_out, metrics=metrics) # validation loop - # print("OUT ->", self.tracker.should_validate) if self.tracker.should_validate: out = self.run_evaluation(model, validation_loader, RunningStage.VALIDATION) # type: ignore if out is not None: @@ -337,7 +339,8 @@ def run_epoch( self.tracker.end() - return train_out, validation_out + # validation_out is already on cpu, but here we might need to move + return move_to_cpu(train_out), validation_out def run_training_step( self, @@ -350,17 +353,19 @@ def run_training_step( metrics: Optional[METRIC], ) -> BATCH_OUTPUT: """Runs over a single batch of data.""" - # print(self.tracker.is_accumulating, self.tracker.global_batch) with self.fabric.no_backward_sync(model, enabled=self.tracker.is_accumulating): # compute loss output = self.train_step(model, batch, batch_idx, loss_fn, metrics) loss = output if isinstance(output, torch.Tensor) else output[OutputKeys.LOSS] - # compute gradients - self.fabric.backward(loss / self.tracker.gradient_accumulation_steps) # instead of loss.backward() + # compute gradients (instead of loss.backward()) + self.fabric.backward( + loss / self.tracker.gradient_accumulation_steps, + create_graph=self.optimization_args.backward_create_graph, + retain_graph=self.optimization_args.backward_retain_graph, + ) - # print("Accumulating?", self.tracker.is_accumulating) if not self.tracker.is_accumulating: # clip gradients if self.optimization_args.clip_val or self.optimization_args.max_norm: @@ -377,17 +382,18 @@ def run_training_step( optimizer.step() self.callback("on_after_optimizer", model=model, optimizer=optimizer) + # reset the gradients optimizer.zero_grad(set_to_none=self.optimization_args.set_to_none) # type: ignore # update scheduler if scheduler is not None: + self.callback("on_before_scheduler", model=model, optimizer=optimizer, scheduler=scheduler) scheduler.step() + self.callback("on_after_scheduler", model=model, optimizer=optimizer, scheduler=scheduler) # update tracker self.tracker.increment_step() - # print("UPDATED") - return output def run_evaluation( @@ -442,7 +448,7 @@ def run_evaluation( self.tracker.end() - return output + return move_to_cpu(output) def evaluation_step( self, @@ -499,30 +505,33 @@ def test_step( return self.step(RunningStage.TEST, model, batch, batch_idx, loss_fn, metrics) def epoch_end( - self, stage: Union[str, RunningStage], output: List[BATCH_OUTPUT], metrics: Optional[METRIC] + self, stage: Union[str, RunningStage], output: list[BATCH_OUTPUT], metrics: Optional[METRIC] ) -> EPOCH_OUTPUT: return output - def train_epoch_end(self, output: List[BATCH_OUTPUT], metrics: Optional[METRIC]) -> EPOCH_OUTPUT: + def train_epoch_end(self, output: list[BATCH_OUTPUT], metrics: Optional[METRIC]) -> EPOCH_OUTPUT: return self.epoch_end(RunningStage.TRAIN, output, metrics) - def validation_epoch_end(self, output: List[BATCH_OUTPUT], metrics: Optional[METRIC]) -> EPOCH_OUTPUT: + def validation_epoch_end(self, output: list[BATCH_OUTPUT], metrics: Optional[METRIC]) -> EPOCH_OUTPUT: return self.epoch_end(RunningStage.VALIDATION, output, metrics) - def test_epoch_end(self, output: List[BATCH_OUTPUT], metrics: Optional[METRIC]) -> EPOCH_OUTPUT: + def test_epoch_end(self, output: list[BATCH_OUTPUT], metrics: Optional[METRIC]) -> EPOCH_OUTPUT: return self.epoch_end(RunningStage.TEST, output, metrics) """ Configuration """ + def configure_model(self, model: Any, **kwargs) -> None: + self._model = model + def configure_optimization_args( self, learning_rate: Optional[float] = None, optimizer: Optional[str] = None, - optimizer_kwargs: Optional[Union[Dict, OptimizationArgs]] = None, + optimizer_kwargs: Optional[Union[dict, OptimizationArgs]] = None, scheduler: Optional[str] = None, - scheduler_kwargs: Optional[Union[Dict, SchedulerArgs]] = None, + scheduler_kwargs: Optional[Union[dict, SchedulerArgs]] = None, ) -> None: # parse optimizer args opt_kwargs = optimizer_kwargs or {} # if None @@ -542,6 +551,7 @@ def configure_optimization_args( sch_kwargs = scheduler_kwargs or {} # if None sch_kwargs = sch_kwargs.to_dict() if isinstance(sch_kwargs, SchedulerArgs) else sch_kwargs + # defaults to constant schedule sch_kwargs["name"] = scheduler or sch_kwargs.get("name") num_train_steps = self.tracker.step_tracker.max @@ -622,19 +632,18 @@ def log(self, name: str, value: Any, step: int) -> None: def log_dict(self, value_dict: Mapping[str, Any], step: int) -> None: """Automatically moves to cpu and then logs mapping of values.""" if self.tracker.should_log: - self.fabric.log_dict(value_dict, step) + self.fabric.log_dict(move_to_cpu(value_dict), step) - def save_state_dict(self, cache_dir: Union[str, Path], name: str = "state_dict.pt") -> None: + def save_state_dict(self, cache_dir: Union[str, Path], name: str = "state_dict.pt", **kwargs) -> None: cache_dir = Path(cache_dir) cache_dir.mkdir(parents=True, exist_ok=True) self.fabric.save(state=self.model.state_dict(), path=cache_dir / name) - def load_state_dict(self, cache_dir: Union[str, Path], name: str = "state_dict.pt") -> None: + def load_state_dict(self, cache_dir: Union[str, Path], name: str = "state_dict.pt", **kwargs) -> None: cache_dir = Path(cache_dir) self.model.load_state_dict(self.fabric.load(cache_dir / name)) def callback(self, hook: str, *args, **kwargs) -> Optional[Any]: - # if estimator has the method method = getattr(self, hook, None) if method is not None and callable(method): @@ -643,16 +652,82 @@ def callback(self, hook: str, *args, **kwargs) -> Optional[Any]: # passes self as first argument return self.fabric.call(hook, self, *args, **kwargs) + def compile(self, **kwargs) -> None: + # model becomes a Callable + self._model = torch.compile(self._model, **kwargs) # type: ignore + self._is_compiled = True + + def set_torch_matmul_precision(self, tf32_mode: Literal["highest", "high", "medium"] = "highest") -> None: + # equivalent to `torch.backends.cudnn.allow_tf32 = True` + # convolutions are not changed, to do that you need + # `torch.backends.cudnn.allow_tf32 = True` + torch.set_float32_matmul_precision(tf32_mode) + + def set_deterministic(self, deterministic: Union[bool, Literal["warn_only"]]) -> None: + # sets deterministic convolutions too + set_deterministic(deterministic) + + def set_eval_mode(self) -> None: + self.model.eval() + + def set_train_mode(self, mode: bool = True) -> None: + self.model.train(mode) + + def num_parameters(self, only_trainable: bool = False, exclude_embeddings: bool = False) -> int: + """Get number of (optionally, trainable or non-embeddings) parameters in the module. + + Refs: https://github.com/huggingface/transformers/blob/ae093eef016533a3670561fa9e26addb42d446d1/src/transformers/modeling_utils.py#L976-L1021 + + Args: + only_trainable (`bool`, *optional*, defaults to `False`): + Whether or not to return only the number of trainable parameters + + exclude_embeddings (`bool`, *optional*, defaults to `False`): + Whether or not to return only the number of non-embeddings parameters + + Returns: + `int`: The number of parameters. + """ + + if exclude_embeddings: + embedding_param_names = [ + f"{name}.weight" + for name, module_type in self.model.named_modules() + if isinstance(module_type, torch.nn.Embedding) + ] + total_parameters = [ + parameter for name, parameter in self.model.named_parameters() if name not in embedding_param_names + ] + else: + total_parameters = list(self.model.parameters()) + + total_numel = [] + is_loaded_in_4bit = self.is_quantized and "4" in self.quantization_mode # type: ignore + for param in total_parameters: + if param.requires_grad or not only_trainable: + # For 4bit models, we need to multiply the number of parameters by 2 as half of the parameters are + # used for the 4bit quantization (uint8 tensors are stored) + if is_loaded_in_4bit and isinstance(param, bnb.nn.Params4bit): + total_numel.append(param.numel() * 2) + else: + total_numel.append(param.numel()) + + return sum(total_numel) + + """ + Private methods + """ + def _setup_fit( self, train_loader: Optional[DataLoader], validation_loader: Optional[DataLoader], learning_rate: Optional[float], optimizer: Optional[str], - optimizer_kwargs: Optional[Union[Dict, OptimizationArgs]], + optimizer_kwargs: Optional[Union[dict, OptimizationArgs]], scheduler: Optional[str], - scheduler_kwargs: Optional[Union[Dict, SchedulerArgs]], - ) -> Tuple[_FabricModule, _FabricOptimizer, Optional[_LRScheduler], _FabricDataLoader, Optional[_FabricDataLoader]]: + scheduler_kwargs: Optional[Union[dict, SchedulerArgs]], + ) -> tuple[_FabricModule, _FabricOptimizer, Optional[_LRScheduler], _FabricDataLoader, Optional[_FabricDataLoader]]: # configuration _train_loader = self.configure_dataloader(train_loader) _validation_loader = self.configure_dataloader(validation_loader) diff --git a/energizer/loggers/tensorboard.py b/energizer/loggers/tensorboard.py index a7f4139..b2b6d9e 100644 --- a/energizer/loggers/tensorboard.py +++ b/energizer/loggers/tensorboard.py @@ -1,5 +1,5 @@ from pathlib import Path -from typing import Union +from typing import Optional, Union from lightning.fabric.loggers.tensorboard import TensorBoardLogger as _TensorBoardLogger from tbparse import SummaryReader @@ -8,6 +8,14 @@ class TensorBoardLogger(_TensorBoardLogger): LOGGER_NAME: str = "tensorboard" + def __init__( + self, + root_dir: Union[str, Path], + name: Optional[str] = "tensorboard_logs", + version: Optional[Union[int, str]] = None, + ) -> None: + super().__init__(root_dir, name, version) + @property def logger_name(self) -> str: return self.LOGGER_NAME diff --git a/energizer/loggers/wandb.py b/energizer/loggers/wandb.py index 0943642..4ed8a3e 100644 --- a/energizer/loggers/wandb.py +++ b/energizer/loggers/wandb.py @@ -1,7 +1,7 @@ import os from argparse import Namespace from pathlib import Path -from typing import Any, Dict, Mapping, Optional, Union +from typing import Any, Optional, Union import pandas as pd import torch.nn as nn @@ -24,12 +24,13 @@ def __init__( name: Optional[str] = None, dir: _PATH = ".", anonymous: Optional[bool] = None, + start_method: Optional[str] = None, **kwargs: Any, ) -> None: super().__init__() # set wandb init arguments - self._wandb_init: Dict[str, Any] = { + self._wandb_init: dict[str, Any] = { "project": project or os.environ.get("WANDB_PROJECT", "energizer_logs"), "dir": os.fspath(dir) if dir is not None else dir, "name": name, @@ -37,12 +38,14 @@ def __init__( "anonymous": ("allow" if anonymous else None), **kwargs, } + if start_method is not None: + self._wandb_init["settings"] = wandb.Settings(start_method=start_method) # start wandb run (to create an attach_id for distributed modes) wandb.require("service") # type: ignore _ = self.experiment - def __getstate__(self) -> Dict[str, Any]: + def __getstate__(self) -> dict[str, Any]: state = self.__dict__.copy() # args needed to reload correct experiment if self._experiment is not None: @@ -124,17 +127,18 @@ def watch(self, model: nn.Module, log: str = "gradients", log_freq: int = 100, l @rank_zero_only def finalize(self, status: str) -> None: self.experiment.finish() + wandb.finish() @rank_zero_only - def log_hyperparams(self, params: Union[Dict[str, Any], Namespace]) -> None: + def log_hyperparams(self, params: Union[dict[str, Any], Namespace]) -> None: params = _convert_params(params) params = _sanitize_callable_params(params) self.experiment.config.update(params, allow_val_change=True) @rank_zero_only - def log_metrics(self, metrics: Mapping, step: int) -> None: + def log_metrics(self, metrics: dict, step: int) -> None: assert rank_zero_only.rank == 0, "experiment tried to log from global_rank != 0" - self.experiment.log(dict(metrics, **{"step": step})) + self.experiment.log({**metrics, "step": step}) def save_to_parquet(self, path: Union[str, Path]) -> None: run = wandb.Api().run(self.run_path) diff --git a/energizer/registries.py b/energizer/registries.py index 9301b74..ed3adc7 100644 --- a/energizer/registries.py +++ b/energizer/registries.py @@ -1,6 +1,7 @@ import inspect +from collections.abc import Callable, Generator from types import ModuleType -from typing import Any, Callable, Generator, List, Optional, Tuple, Type +from typing import Any, Optional import torch import torch_optimizer @@ -18,11 +19,7 @@ def register_functions(self, module: ModuleType, filter_fn: Optional[Callable] = self[k.lower()] = v def register_classes( - self, - module: ModuleType, - base_cls: Type, - override: bool = False, - to_snake_case: bool = False, + self, module: ModuleType, base_cls: type, override: bool = False, to_snake_case: bool = False ) -> None: """This function is an utility to register all classes from a module.""" for cls in self.get_members(module, base_cls): @@ -31,7 +28,7 @@ def register_classes( self[key.lower()] = cls @staticmethod - def get_members(module: ModuleType, base_cls: Type) -> Generator[Type, None, None]: + def get_members(module: ModuleType, base_cls: type) -> Generator[type, None, None]: return ( cls for _, cls in inspect.getmembers(module, predicate=inspect.isclass) @@ -39,12 +36,12 @@ def get_members(module: ModuleType, base_cls: Type) -> Generator[Type, None, Non ) @property - def names(self) -> List[str]: + def names(self) -> list[str]: """Returns the registered names.""" return list(self.keys()) @property - def classes(self) -> Tuple[Type, ...]: + def classes(self) -> tuple[type, ...]: """Returns the registered classes.""" return tuple(self.values()) diff --git a/energizer/trackers.py b/energizer/trackers.py index 341b550..bb7e217 100644 --- a/energizer/trackers.py +++ b/energizer/trackers.py @@ -2,6 +2,7 @@ from typing import Optional, Union import numpy as np +from lightning_utilities.core.rank_zero import rank_zero_info from tqdm.auto import tqdm from energizer.enums import Interval, RunningStage @@ -53,23 +54,13 @@ def close_progress_bar(self) -> None: @dataclass class EpochTracker(Tracker): def make_progress_bar(self) -> Optional[tqdm]: - self.progress_bar = tqdm( - total=self.max, - desc="Completed epochs", - dynamic_ncols=True, - leave=True, - ) + self.progress_bar = tqdm(total=self.max, desc="Completed epochs", dynamic_ncols=True, leave=True) @dataclass class StepTracker(Tracker): def make_progress_bar(self) -> Optional[tqdm]: - self.progress_bar = tqdm( - total=self.max, - desc="Optimisation steps", - dynamic_ncols=True, - leave=True, - ) + self.progress_bar = tqdm(total=self.max, desc="Optimisation steps", dynamic_ncols=True, leave=True) @dataclass @@ -78,12 +69,7 @@ class StageTracker(Tracker): def make_progress_bar(self) -> Optional[tqdm]: desc = f"Epoch {self.total}".strip() if self.stage == RunningStage.TRAIN else f"{self.stage.title()}" - self.progress_bar = tqdm( - total=self.max, - desc=desc, - dynamic_ncols=True, - leave=True, - ) + self.progress_bar = tqdm(total=self.max, desc=desc, dynamic_ncols=True, leave=True) @dataclass @@ -101,9 +87,14 @@ def __post_init__(self) -> None: self.log_interval: int = 1 self.enable_progress_bar: bool = True self.current_stage: Optional[RunningStage] = None + + # validation logic self.has_validation: bool = False self.validate_every_n: Optional[int] = None self.validation_interval: Optional[str] = None + self.validate_on_epoch_end: bool = False + self._last_epoch_num_steps: int = 0 + self._xepoch_set: bool = False def setup(self, stage: Union[str, RunningStage], log_interval: int, enable_progress_bar: bool, **kwargs) -> None: """Do all the math here and create progress bars for every stage.""" @@ -172,19 +163,37 @@ def setup_fit( # validation schedule if validation_freq is not None and max_validation_batches > 0: - every_n, interval = validation_freq.split(":") - every_n = int(every_n) - assert interval in list(Interval) - assert every_n > 0 - + if validation_freq.endswith("+"): + self.validate_on_epoch_end = True + validation_freq = validation_freq.removesuffix("+") + + if "xepoch" in validation_freq: + # automatically compute number of times per epoch + times_per_epoch = int(validation_freq.split("x")[0]) + assert times_per_epoch > 0 + every_n = int(np.floor(np.ceil(total_steps / total_epochs) / times_per_epoch)) + # print(f"{total_steps=}\n{total_epochs=}\n{every_n=}") + interval = Interval.STEP + self._xepoch_set = True + msg = f"Validating {times_per_epoch} times per epoch" + else: + every_n, interval = validation_freq.split(":") + every_n = int(every_n) + assert every_n > 0 + assert interval in list(Interval) + msg = f"Validating every {every_n} {interval}" + + if self.validate_on_epoch_end and interval != Interval.EPOCH: + msg += ". You passed `+` so will always validate on epoch end" + + rank_zero_info(msg) self.has_validation = True self.validate_every_n = every_n self.validation_interval = interval + self.validation_tracker.max = max_validation_batches else: self.has_validation = False - self.validation_tracker.max = max_validation_batches - def setup_eval(self, stage: Union[str, RunningStage], num_batches: int, limit_batches: Optional[int]) -> None: getattr(self, f"{stage}_tracker").max = int(min(num_batches, limit_batches or float("Inf"))) @@ -220,9 +229,7 @@ def is_accumulating(self) -> bool: def is_done(self) -> bool: """Whether a stage is done.""" return ( - self.get_stage_tracker().max_reached() - or self.current_stage == RunningStage.TRAIN - and self.stop_training + self.get_stage_tracker().max_reached() or self.current_stage == RunningStage.TRAIN and self.stop_training # or (self.epoch_tracker.remaining() <= 1 and self.gradient_accumulation_steps > self.train_tracker.remaining()) ) @@ -243,6 +250,7 @@ def _check(iter: int) -> bool: return (iter + 1) % self.validate_every_n == 0 # type: ignore should_validate = False + if self.validation_interval == Interval.EPOCH: should_validate = _check(self.global_epoch) and self.is_done @@ -250,11 +258,22 @@ def _check(iter: int) -> bool: should_validate = _check(self.global_batch) and not self.is_done # type: ignore elif self.validation_interval == Interval.STEP: - should_validate = _check(self.global_step) and not self.is_done and not self.is_accumulating + # this makes sure that when we pass xepoch we exactly validate the same number of times per epoch + # if we use `self.global_step` some epochs mights have more validations + step = self.global_step - self._last_epoch_num_steps if self._xepoch_set else self.global_step + should_validate = ( + (_check(step) and not self.is_done and not self.is_accumulating) + or (self.validate_on_epoch_end and self.is_done) + # this check avoids validating on epoch end when the steps happens to be at the end of the epoch + # not _check(self.global_step) + ) else: raise NotImplementedError + if should_validate: + print(f"{self.global_epoch=} {self.global_step=} {self.is_done=}") + return should_validate """Methods""" @@ -262,6 +281,7 @@ def _check(iter: int) -> bool: def start_fit(self) -> None: self.epoch_tracker.reset() self.step_tracker.reset() + self._last_epoch_num_steps = 0 def start(self, stage: Union[str, RunningStage]) -> None: """Make progress bars and reset the counters of stage trackers.""" @@ -287,12 +307,16 @@ def start(self, stage: Union[str, RunningStage]) -> None: def end(self) -> None: """Close progress bars of stage tracker when testing or re-attach training when validating.""" + + # NOTE: when testing we directly close the progress bar when we are done if not self.is_fitting: return self.get_stage_tracker().close_progress_bar() self.get_stage_tracker().terminate_progress_bar() + + # NOTE: if this is the end of the validation stage we need to reattach the training tracker if self.current_stage == RunningStage.VALIDATION: - self.current_stage = RunningStage.TRAIN # reattach training + self.current_stage = RunningStage.TRAIN if self.train_tracker.progress_bar is not None: self.train_tracker.progress_bar.set_postfix_str("") @@ -309,9 +333,12 @@ def increment(self) -> None: def increment_epoch(self) -> None: self.epoch_tracker.increment() + self._last_epoch_num_steps += self.global_step def increment_step(self) -> None: self.step_tracker.increment() + if self.step_tracker.max_reached(): + self.stop_training = True """Helpers""" diff --git a/energizer/types.py b/energizer/types.py index 8be1c19..615ee27 100644 --- a/energizer/types.py +++ b/energizer/types.py @@ -1,15 +1,16 @@ -from typing import Any, Dict, List, Mapping, Tuple, Union +from collections.abc import Mapping +from typing import Any, Union from torch import Tensor from torchmetrics import Metric METRIC = Union[Metric, Any] -DATASET = List[Mapping] +DATASET = list[Mapping] DATA_SOURCE = Any -BATCH_OUTPUT = Union[Tensor, Dict] +BATCH_OUTPUT = Union[Tensor, dict] -EPOCH_OUTPUT = Union[List[BATCH_OUTPUT], Any] -FIT_OUTPUT = Tuple[EPOCH_OUTPUT, EPOCH_OUTPUT] +EPOCH_OUTPUT = Union[list[BATCH_OUTPUT], Any] +FIT_OUTPUT = tuple[EPOCH_OUTPUT, EPOCH_OUTPUT] ROUND_OUTPUT = Union[Mapping[str, Any], Any] diff --git a/energizer/utilities/__init__.py b/energizer/utilities/__init__.py index dd76f9d..457a26b 100644 --- a/energizer/utilities/__init__.py +++ b/energizer/utilities/__init__.py @@ -1,9 +1,12 @@ # import inspect import contextlib +import copy import os import random import re -from typing import Any, Dict, Generator, List, Literal, Union +from collections.abc import Generator, Iterator +from dataclasses import dataclass +from typing import Any, Literal, Union import numpy as np import torch @@ -16,7 +19,25 @@ from torch.nn.utils.rnn import pad_sequence -def parse_locals(vars) -> Dict: +@dataclass +class Args: + """Dataclass which is subscriptable like a dict""" + + def to_dict(self) -> dict[str, Any]: + out = copy.deepcopy(self.__dict__) + return out + + def __getitem__(self, k: str) -> Any: + return self.__dict__[k] + + def __iter__(self) -> Iterator[str]: + return iter(self.__dict__) + + def __len__(self) -> int: + return len(self.__dict__) + + +def parse_locals(vars) -> dict: return {k: v for k, v in vars.items() if k not in ("self", "__class__")} @@ -35,7 +56,7 @@ def tensor_to_python(t: Tensor, *_) -> Union[ndarray, float, int]: # return round(t.detach().cpu().item(), 6) -def make_dict_json_serializable(d: Dict) -> Dict: +def make_dict_json_serializable(d: dict) -> dict: return {k: round(v.item(), 6) if isinstance(v, (ndarray, generic)) else v for k, v in d.items()} @@ -44,10 +65,14 @@ def move_to_cpu(output: Any) -> Any: return apply_to_collection(output, *args) -def ld_to_dl(ld: List[Dict]) -> Dict[str, List]: +def ld_to_dl(ld: list[dict]) -> dict[str, list]: return {k: [dic[k] for dic in ld] for k in ld[0]} +def dl_to_ld(dl: dict[str, list]) -> list[dict]: + return [dict(zip(dl, t)) for t in zip(*dl.values())] + + @contextlib.contextmanager def local_seed(seed: int) -> Generator[None, None, None]: """A context manager that allows to locally change the seed. @@ -94,22 +119,18 @@ def set_deterministic(deterministic: Union[bool, Literal["warn_only"]]) -> None: torch.backends.cudnn.benchmark = False # type: ignore -def _pad(inputs: List[Tensor], padding_value: float, max_length: int) -> Tensor: +def _pad(inputs: list[list[Union[int, float]]], padding_value: Union[int, float], max_length: int) -> Tensor: # truncate -> convert to tensor -> pad - return pad_sequence( - [torch.tensor(t[:max_length]) for t in inputs], - batch_first=True, - padding_value=padding_value, - ) + return pad_sequence([torch.tensor(t[:max_length]) for t in inputs], batch_first=True, padding_value=padding_value) def sample( - indices: List[int], + indices: list[int], size: int, random_state: RandomState, mode: Literal["uniform", "stratified"] = "uniform", **kwargs, -) -> List[int]: +) -> list[int]: """Makes sure to seed everything consistently.""" if mode == "uniform": @@ -118,11 +139,7 @@ def sample( elif mode == "stratified": assert "labels" in kwargs, ValueError("Must pass `labels` for stratified sampling.") sample = resample( - indices, - replace=False, - stratify=kwargs.get("labels"), - n_samples=size, - random_state=random_state, + indices, replace=False, stratify=kwargs.get("labels"), n_samples=size, random_state=random_state ) else: diff --git a/energizer/utilities/model_summary.py b/energizer/utilities/model_summary.py index a2314bf..bd9068d 100644 --- a/energizer/utilities/model_summary.py +++ b/energizer/utilities/model_summary.py @@ -1,5 +1,5 @@ from collections import OrderedDict -from typing import Dict, List, Tuple, cast +from typing import cast import numpy as np import torch @@ -43,8 +43,8 @@ def __init__(self, estimator, max_depth: int = 1) -> None: self._precision_megabytes = (precision / 8.0) * 1e-6 @property - def named_modules(self) -> List[Tuple[str, torch.nn.Module]]: - mods: List[Tuple[str, torch.nn.Module]] + def named_modules(self) -> list[tuple[str, torch.nn.Module]]: + mods: list[tuple[str, torch.nn.Module]] if self._max_depth == 0: mods = [] elif self._max_depth == 1: @@ -56,23 +56,23 @@ def named_modules(self) -> List[Tuple[str, torch.nn.Module]]: return mods @property - def layer_names(self) -> List[str]: + def layer_names(self) -> list[str]: return list(self._layer_summary.keys()) @property - def layer_types(self) -> List[str]: + def layer_types(self) -> list[str]: return [layer.layer_type for layer in self._layer_summary.values()] @property - def in_sizes(self) -> List: + def in_sizes(self) -> list: return [layer.in_size for layer in self._layer_summary.values()] # type: ignore @property - def out_sizes(self) -> List: + def out_sizes(self) -> list: return [layer.out_size for layer in self._layer_summary.values()] # type: ignore @property - def param_nums(self) -> List[int]: + def param_nums(self) -> list[int]: return [layer.num_parameters for layer in self._layer_summary.values()] @property @@ -92,7 +92,7 @@ def model_size(self) -> float: # todo: seems it does not work with quantized models - it returns 0.0 return self.total_parameters * self._precision_megabytes - def summarize(self) -> Dict[str, LayerSummary]: + def summarize(self) -> dict[str, LayerSummary]: summary = OrderedDict((name, LayerSummary(module)) for name, module in self.named_modules) if self._max_depth >= 1: @@ -102,7 +102,7 @@ def summarize(self) -> Dict[str, LayerSummary]: return summary - def _get_summary_data(self) -> List[Tuple[str, List[str]]]: + def _get_summary_data(self) -> list[tuple[str, list[str]]]: """Makes a summary listing with: Layer Name, Layer Type, Number of Parameters, Input Sizes, Output Sizes, Model Size diff --git a/examples/active_estimators.ipynb b/examples/active_estimators.ipynb index 740045b..b927bfa 100644 --- a/examples/active_estimators.ipynb +++ b/examples/active_estimators.ipynb @@ -16,21 +16,20 @@ "metadata": {}, "outputs": [], "source": [ - "from energizer.datastores import PandasDataStoreForSequenceClassification\n", - "from energizer.estimator import Estimator\n", - "from transformers import AutoModelForSequenceClassification\n", - "from typing import Dict, List\n", + "import numpy as np\n", "import torch\n", + "from lightning.fabric import seed_everything\n", + "from lightning.fabric.loggers import TensorBoardLogger\n", "from torchmetrics import MetricCollection\n", "from torchmetrics.classification import Accuracy, F1Score, Precision, Recall\n", "from transformers import AutoModelForSequenceClassification\n", + "\n", + "from energizer.callbacks import EarlyStopping, GradNorm, ModelCheckpoint\n", + "from energizer.datastores import PandasDatastoreForSequenceClassification\n", "from energizer.enums import InputKeys, OutputKeys, RunningStage\n", - "import numpy as np\n", - "from energizer.utilities import move_to_cpu\n", - "from lightning.fabric.loggers import TensorBoardLogger\n", - "from lightning.fabric import seed_everything\n", - "from energizer.callbacks import GradNorm, PytorchTensorboardProfiler, EarlyStopping, ModelCheckpoint\n", - "from energizer.strategies import RandomStrategy, UncertaintyBasedStrategy" + "from energizer.estimator import Estimator\n", + "from energizer.strategies import RandomStrategy, UncertaintyBasedStrategy\n", + "from energizer.utilities import move_to_cpu" ] }, { @@ -39,7 +38,7 @@ "metadata": {}, "outputs": [], "source": [ - "ds = PandasDataStoreForSequenceClassification.load(\"./agnews_datastore/\")" + "ds = PandasDatastoreForSequenceClassification.load(\"./agnews_datastore/\")" ] }, { @@ -48,27 +47,26 @@ "metadata": {}, "outputs": [], "source": [ - "class EstimatorForSequenceClassification(Estimator):\n", - "\n", - " def train_step(self, model, batch, batch_idx, loss_fn, metrics: MetricCollection) -> Dict:\n", + "class HFEstimatorForSequenceClassification(Estimator):\n", + " def train_step(self, model, batch, batch_idx, loss_fn, metrics: MetricCollection) -> dict:\n", " return self.step(model, batch, metrics, RunningStage.TRAIN)\n", "\n", - " def validation_step(self, model, batch, batch_idx, loss_fn, metrics: MetricCollection) -> Dict:\n", + " def validation_step(self, model, batch, batch_idx, loss_fn, metrics: MetricCollection) -> dict:\n", " return self.step(model, batch, metrics, RunningStage.VALIDATION)\n", "\n", - " def test_step(self, model, batch, batch_idx, loss_fn, metrics: MetricCollection) -> Dict:\n", + " def test_step(self, model, batch, batch_idx, loss_fn, metrics: MetricCollection) -> dict:\n", " return self.step(model, batch, metrics, RunningStage.TEST)\n", - " \n", - " def train_epoch_end(self, output: List[np.ndarray], metrics: MetricCollection) -> Dict:\n", + "\n", + " def train_epoch_end(self, output: list[np.ndarray], metrics: MetricCollection) -> dict:\n", " return self.epoch_end(output, metrics, RunningStage.TRAIN)\n", "\n", - " def validation_epoch_end(self, output: List[np.ndarray], metrics: MetricCollection) -> Dict:\n", + " def validation_epoch_end(self, output: list[np.ndarray], metrics: MetricCollection) -> dict:\n", " return self.epoch_end(output, metrics, RunningStage.VALIDATION)\n", "\n", - " def test_epoch_end(self, output: List[np.ndarray], metrics: MetricCollection) -> Dict:\n", + " def test_epoch_end(self, output: list[np.ndarray], metrics: MetricCollection) -> dict:\n", " return self.epoch_end(output, metrics, RunningStage.TEST)\n", "\n", - " def step(self, model, batch: Dict, metrics: MetricCollection, stage: RunningStage) -> torch.Tensor:\n", + " def step(self, model, batch: dict, metrics: MetricCollection, stage: RunningStage) -> torch.Tensor:\n", " _ = batch.pop(InputKeys.ON_CPU, None)\n", "\n", " out = model(**batch)\n", @@ -79,11 +77,11 @@ " self.log_dict({f\"{stage}/{k}\": v for k, v in logs.items()}, step=self.tracker.global_batch)\n", "\n", " return out.loss\n", - " \n", - " def epoch_end(self, output: List[np.ndarray], metrics: MetricCollection, stage: RunningStage) -> float:\n", + "\n", + " def epoch_end(self, output: list[np.ndarray], metrics: MetricCollection, stage: RunningStage) -> float:\n", " aggregated_metrics = move_to_cpu(metrics.compute()) # NOTE: metrics are still on device\n", " aggregated_loss = round(np.mean(output).item(), 6)\n", - " \n", + "\n", " logs = {OutputKeys.LOSS: aggregated_loss, **aggregated_metrics}\n", " self.log_dict({f\"{stage}_end/{k}\": v for k, v in logs.items()}, step=self.tracker.safe_global_epoch)\n", "\n", @@ -120,24 +118,21 @@ "metadata": {}, "outputs": [], "source": [ - "class RandomStrategyForSequenceClassification(EstimatorForSequenceClassification, RandomStrategy):\n", + "class RandomStrategyForSequenceClassification(HFEstimatorForSequenceClassification, RandomStrategy):\n", " ...\n", "\n", "\n", "seed_everything(42)\n", "model = AutoModelForSequenceClassification.from_pretrained(\n", - " ds.tokenizer.name_or_path,\n", - " id2label=ds.id2label,\n", - " label2id=ds.label2id,\n", - " num_labels=len(ds.labels),\n", + " ds.tokenizer.name_or_path, id2label=ds.id2label, label2id=ds.label2id, num_labels=len(ds.labels)\n", ")\n", "\n", "estimator = RandomStrategyForSequenceClassification(\n", - " model, \n", - " accelerator=\"gpu\", \n", + " model,\n", + " accelerator=\"gpu\",\n", " loggers=[TensorBoardLogger(\"./\", name=\"tb_logs\")],\n", " callbacks=[\n", - " GradNorm(2), \n", + " GradNorm(2),\n", " ModelCheckpoint(\"./checkpoints\", monitor=\"f1_macro\", stage=\"train\", mode=\"max\"),\n", " EarlyStopping(monitor=\"f1_macro\", stage=\"train\", interval=\"epoch\", mode=\"max\"),\n", " ],\n", @@ -153,12 +148,12 @@ "source": [ "ds.prepare_for_loading()\n", "results = estimator.active_fit(\n", - " datastore=ds, \n", + " datastore=ds,\n", " query_size=50,\n", - " max_rounds=20, \n", + " max_rounds=20,\n", " min_steps=50,\n", " reinit_model=False,\n", - " # limit_pool_batches=10, \n", + " # limit_pool_batches=10,\n", " # limit_test_batches=10,\n", ")" ] @@ -177,27 +172,25 @@ "metadata": {}, "outputs": [], "source": [ - "class UncertaintyBasedStrategyForSequenceClassification(EstimatorForSequenceClassification, UncertaintyBasedStrategy):\n", - " def pool_step( self, model, batch: Dict, batch_idx: int, metrics: MetricCollection) -> Dict:\n", + "class UncertaintyBasedStrategyForSequenceClassification(HFEstimatorForSequenceClassification, UncertaintyBasedStrategy):\n", + " def pool_step(self, model, batch: dict, batch_idx: int, metrics: MetricCollection) -> dict:\n", " _ = batch.pop(InputKeys.ON_CPU) # this is already handled in the `evaluation_step`\n", " logits = model(**batch).logits\n", " return self.score_fn(logits)\n", "\n", + "\n", "seed_everything(42)\n", "model = AutoModelForSequenceClassification.from_pretrained(\n", - " ds.tokenizer.name_or_path,\n", - " id2label=ds.id2label,\n", - " label2id=ds.label2id,\n", - " num_labels=len(ds.labels),\n", + " ds.tokenizer.name_or_path, id2label=ds.id2label, label2id=ds.label2id, num_labels=len(ds.labels)\n", ")\n", "\n", "estimator = UncertaintyBasedStrategyForSequenceClassification(\n", " score_fn=\"entropy\",\n", - " model=model, \n", - " accelerator=\"gpu\", \n", + " model=model,\n", + " accelerator=\"gpu\",\n", " loggers=[TensorBoardLogger(\"./\", name=\"tb_logs\")],\n", " callbacks=[\n", - " GradNorm(2), \n", + " GradNorm(2),\n", " ModelCheckpoint(\"./checkpoints\", monitor=\"f1_macro\", stage=\"train\", mode=\"max\"),\n", " EarlyStopping(monitor=\"f1_macro\", stage=\"train\", interval=\"epoch\", mode=\"max\"),\n", " ],\n", @@ -211,12 +204,7 @@ "outputs": [], "source": [ "ds.prepare_for_loading()\n", - "results = estimator.active_fit(\n", - " datastore=ds, \n", - " query_size=50,\n", - " max_rounds=20, \n", - " min_steps=50,\n", - ")" + "results = estimator.active_fit(datastore=ds, query_size=50, max_rounds=20, min_steps=50)" ] }, { diff --git a/examples/bert_badge.py b/examples/bert_badge.py index ae43e8d..a01776a 100644 --- a/examples/bert_badge.py +++ b/examples/bert_badge.py @@ -1,4 +1,4 @@ -from typing import Any, Dict, List +from typing import Any import numpy as np import torch @@ -9,7 +9,7 @@ from transformers import AutoModelForSequenceClassification, AutoTokenizer from energizer import seed_everything -from energizer.active_learning.datastores.classification import ActivePandasDataStoreForSequenceClassification +from energizer.active_learning.datastores.classification import ActivePandasDatastoreForSequenceClassification from energizer.active_learning.strategies.diversity import BADGE from energizer.enums import InputKeys, OutputKeys, RunningStage from energizer.utilities import move_to_cpu @@ -29,13 +29,7 @@ def get_logits_from_penultimate_layer_out( return model.classifier(penultimate_layer_out) def step( - self, - stage: RunningStage, - model, - batch: Dict, - batch_idx: int, - loss_fn, - metrics: MetricCollection, + self, stage: RunningStage, model, batch: dict, batch_idx: int, loss_fn, metrics: MetricCollection ) -> torch.Tensor: _ = batch.pop(InputKeys.ON_CPU, None) out = model(**batch) @@ -47,7 +41,7 @@ def step( return out.loss - def epoch_end(self, stage: RunningStage, output: List[np.ndarray], metrics: MetricCollection) -> float: + def epoch_end(self, stage: RunningStage, output: list[np.ndarray], metrics: MetricCollection) -> float: # aggregate and log aggregated_metrics = move_to_cpu(metrics.compute()) # NOTE: metrics are still on device aggregated_loss = round(np.mean(output).item(), 6) @@ -87,7 +81,7 @@ def configure_metrics(self, *_) -> MetricCollection: dataset_dict = dataset_dict.map(lambda ex: tokenizer(ex["text"]), batched=True) # create datastore - datastore = ActivePandasDataStoreForSequenceClassification.from_dataset_dict( + datastore = ActivePandasDatastoreForSequenceClassification.from_dataset_dict( dataset_dict=dataset_dict, input_names=["input_ids", "attention_mask"], target_name="labels", @@ -100,10 +94,7 @@ def configure_metrics(self, *_) -> MetricCollection: # model model = AutoModelForSequenceClassification.from_pretrained( - MODEL_NAME, - id2label=datastore.id2label, - label2id=datastore.label2id, - num_labels=len(datastore.labels), + MODEL_NAME, id2label=datastore.id2label, label2id=datastore.label2id, num_labels=len(datastore.labels) ) # active learning loop diff --git a/examples/bert_entropy.py b/examples/bert_entropy.py index 66529cc..a6b5f6d 100644 --- a/examples/bert_entropy.py +++ b/examples/bert_entropy.py @@ -1,4 +1,5 @@ -from typing import Any, Callable, Dict, List, Optional, Union +from collections.abc import Callable +from typing import Any, Optional, Union import numpy as np import torch @@ -9,7 +10,7 @@ from transformers import AutoModelForSequenceClassification, AutoTokenizer from energizer import seed_everything -from energizer.active_learning.datastores.classification import ActivePandasDataStoreForSequenceClassification +from energizer.active_learning.datastores.classification import ActivePandasDatastoreForSequenceClassification from energizer.active_learning.strategies.uncertainty import UncertaintyBasedStrategy from energizer.enums import InputKeys, OutputKeys, RunningStage from energizer.utilities import move_to_cpu @@ -20,13 +21,7 @@ class UncertaintyStrategyForSequenceClassification(UncertaintyBasedStrategy): def step( - self, - stage: RunningStage, - model, - batch: Dict, - batch_idx: int, - loss_fn, - metrics: MetricCollection, + self, stage: RunningStage, model, batch: dict, batch_idx: int, loss_fn, metrics: MetricCollection ) -> torch.Tensor: _ = batch.pop(InputKeys.ON_CPU, None) out = model(**batch) @@ -52,7 +47,7 @@ def pool_step( # simply redirect to step return self.step(RunningStage.POOL, model, batch, batch_idx, loss_fn, metrics) - def epoch_end(self, stage: RunningStage, output: List[np.ndarray], metrics: MetricCollection) -> float: + def epoch_end(self, stage: RunningStage, output: list[np.ndarray], metrics: MetricCollection) -> float: # aggregate and log aggregated_metrics = move_to_cpu(metrics.compute()) # NOTE: metrics are still on device aggregated_loss = round(np.mean(output).item(), 6) @@ -92,7 +87,7 @@ def configure_metrics(self, *_) -> MetricCollection: dataset_dict = dataset_dict.map(lambda ex: tokenizer(ex["text"]), batched=True) # create datastore - datastore = ActivePandasDataStoreForSequenceClassification.from_dataset_dict( + datastore = ActivePandasDatastoreForSequenceClassification.from_dataset_dict( dataset_dict=dataset_dict, input_names=["input_ids", "attention_mask"], target_name="labels", @@ -105,10 +100,7 @@ def configure_metrics(self, *_) -> MetricCollection: # model model = AutoModelForSequenceClassification.from_pretrained( - MODEL_NAME, - id2label=datastore.id2label, - label2id=datastore.label2id, - num_labels=len(datastore.labels), + MODEL_NAME, id2label=datastore.id2label, label2id=datastore.label2id, num_labels=len(datastore.labels) ) # active learning loop diff --git a/examples/bert_random.py b/examples/bert_random.py index 9af74f7..05ccaa4 100755 --- a/examples/bert_random.py +++ b/examples/bert_random.py @@ -1,5 +1,3 @@ -from typing import Dict, List - import numpy as np import torch from datasets import DatasetDict, load_dataset @@ -8,7 +6,7 @@ from transformers import AutoModelForSequenceClassification, AutoTokenizer from energizer import seed_everything -from energizer.active_learning.datastores.classification import ActivePandasDataStoreForSequenceClassification +from energizer.active_learning.datastores.classification import ActivePandasDatastoreForSequenceClassification from energizer.active_learning.strategies.random import RandomStrategy from energizer.enums import InputKeys, OutputKeys, RunningStage from energizer.utilities import move_to_cpu @@ -19,13 +17,7 @@ class RandomStrategyForSequenceClassification(RandomStrategy): def step( - self, - stage: RunningStage, - model, - batch: Dict, - batch_idx: int, - loss_fn, - metrics: MetricCollection, + self, stage: RunningStage, model, batch: dict, batch_idx: int, loss_fn, metrics: MetricCollection ) -> torch.Tensor: _ = batch.pop(InputKeys.ON_CPU, None) out = model(**batch) @@ -37,7 +29,7 @@ def step( return out.loss - def epoch_end(self, stage: RunningStage, output: List[np.ndarray], metrics: MetricCollection) -> float: + def epoch_end(self, stage: RunningStage, output: list[np.ndarray], metrics: MetricCollection) -> float: # aggregate and log aggregated_metrics = move_to_cpu(metrics.compute()) # NOTE: metrics are still on device aggregated_loss = round(np.mean(output).item(), 6) @@ -77,7 +69,7 @@ def configure_metrics(self, *_) -> MetricCollection: dataset_dict = dataset_dict.map(lambda ex: tokenizer(ex["text"]), batched=True) # create datastore - datastore = ActivePandasDataStoreForSequenceClassification.from_dataset_dict( + datastore = ActivePandasDatastoreForSequenceClassification.from_dataset_dict( dataset_dict=dataset_dict, input_names=["input_ids", "attention_mask"], target_name="labels", @@ -90,10 +82,7 @@ def configure_metrics(self, *_) -> MetricCollection: # model model = AutoModelForSequenceClassification.from_pretrained( - MODEL_NAME, - id2label=datastore.id2label, - label2id=datastore.label2id, - num_labels=len(datastore.labels), + MODEL_NAME, id2label=datastore.id2label, label2id=datastore.label2id, num_labels=len(datastore.labels) ) # active learning loop diff --git a/examples/datastores.ipynb b/examples/datastores.ipynb index 7012346..2ee6511 100644 --- a/examples/datastores.ipynb +++ b/examples/datastores.ipynb @@ -26,10 +26,10 @@ "outputs": [], "source": [ "from datasets import load_dataset, load_from_disk\n", - "from energizer.active_learning.datastores.classification import ActivePandasDataStoreForSequenceClassification\n", - "\n", + "from sentence_transformers import SentenceTransformer\n", "from transformers import AutoTokenizer\n", - "from sentence_transformers import SentenceTransformer" + "\n", + "from energizer.active_learning.datastores.classification import ActivePandasDatastoreForSequenceClassification" ] }, { @@ -58,7 +58,7 @@ "metadata": {}, "outputs": [], "source": [ - "datastore = ActivePandasDataStoreForSequenceClassification.from_dataset_dict(\n", + "datastore = ActivePandasDatastoreForSequenceClassification.from_dataset_dict(\n", " dataset_dict=dataset_dict, # type:ignore\n", " input_names=[\"input_ids\", \"attention_mask\"],\n", " target_name=\"labels\",\n", @@ -140,12 +140,8 @@ "dataset_dict = load_dataset(\"ag_news\").rename_columns({\"label\": \"labels\"})\n", "\n", "# embed training data\n", - "dataset_dict[\"train\"] = (\n", - " dataset_dict[\"train\"]\n", - " .map(\n", - " lambda ex: {\"embedding\": embedder.encode(ex[\"text\"], device=\"cuda\", batch_size=512)},\n", - " batched=True,\n", - " )\n", + "dataset_dict[\"train\"] = dataset_dict[\"train\"].map(\n", + " lambda ex: {\"embedding\": embedder.encode(ex[\"text\"], device=\"cuda\", batch_size=512)}, batched=True\n", ")\n", "\n", "dataset_dict.save_to_disk(\"agnews\")" @@ -175,9 +171,9 @@ "metadata": {}, "outputs": [], "source": [ - "datastore = PandasDataStoreForSequenceClassification()\n", + "datastore = PandasDatastoreForSequenceClassification()\n", "datastore.from_dataset_dict(\n", - " dataset_dict=dataset_dict, \n", + " dataset_dict=dataset_dict,\n", " tokenizer=tokenizer,\n", " # on_cpu=[\"embedding\", \"text\"],\n", " input_names=[\"input_ids\", \"attention_mask\"],\n", @@ -209,7 +205,7 @@ "metadata": {}, "outputs": [], "source": [ - "ds = PandasDataStoreForSequenceClassification.load(\"./agnews_datastore\")" + "ds = PandasDatastoreForSequenceClassification.load(\"./agnews_datastore\")" ] }, { diff --git a/examples/docarray.ipynb b/examples/docarray.ipynb index 243f039..1245aef 100644 --- a/examples/docarray.ipynb +++ b/examples/docarray.ipynb @@ -16,14 +16,13 @@ "metadata": {}, "outputs": [], "source": [ + "import numpy as np\n", "from datasets import load_dataset\n", - "from transformers import AutoTokenizer\n", "from docarray import BaseDoc, DocList\n", + "from docarray.index import HnswDocumentIndex\n", "from docarray.typing import NdArray\n", "from sentence_transformers import SentenceTransformer\n", - "from docarray.index import HnswDocumentIndex\n", - "import numpy as np\n", - "from typing import List" + "from transformers import AutoTokenizer" ] }, { @@ -82,7 +81,10 @@ "source": [ "ds_dict = (\n", " load_dataset(\"pietrolesci/ag_news\", \"concat\")[\"test\"]\n", - " .map(lambda ex: {**tokenizer(ex[\"text\"]), \"embedding\": embedder.encode(ex[\"text\"], device=\"cuda\", batch_size=256)}, batched=True)\n", + " .map(\n", + " lambda ex: {**tokenizer(ex[\"text\"]), \"embedding\": embedder.encode(ex[\"text\"], device=\"cuda\", batch_size=256)},\n", + " batched=True,\n", + " )\n", " .rename_columns({\"label\": \"labels\"})\n", ")" ] @@ -176,16 +178,16 @@ "db.configure(\n", " default_column_config={\n", " np.ndarray: {\n", - " 'dim': -1,\n", - " 'index': True,\n", - " 'space': 'cosine',\n", - " 'max_elements': 10^10,\n", - " 'ef_construction': 200,\n", - " 'ef': 15,\n", - " 'M': 8,\n", - " 'allow_replace_deleted': True,\n", - " 'num_threads': 5,\n", - " },\n", + " \"dim\": -1,\n", + " \"index\": True,\n", + " \"space\": \"cosine\",\n", + " \"max_elements\": 10 ^ 10,\n", + " \"ef_construction\": 200,\n", + " \"ef\": 15,\n", + " \"M\": 8,\n", + " \"allow_replace_deleted\": True,\n", + " \"num_threads\": 5,\n", + " }\n", " # None: {},\n", " }\n", ")" @@ -243,11 +245,8 @@ "metadata": {}, "outputs": [], "source": [ - "datastore = PandasDataStoreForSequenceClassification()\n", - "datastore.from_dataset_dict(\n", - " dataset_dict=ds_dict, \n", - " tokenizer=tokenizer,\n", - ")" + "datastore = PandasDatastoreForSequenceClassification()\n", + "datastore.from_dataset_dict(dataset_dict=ds_dict, tokenizer=tokenizer)" ] }, { diff --git a/examples/estimators.ipynb b/examples/estimators.ipynb index f75d5d4..feec504 100644 --- a/examples/estimators.ipynb +++ b/examples/estimators.ipynb @@ -16,22 +16,21 @@ "metadata": {}, "outputs": [], "source": [ - "from energizer.datastores.classification import PandasDataStoreForSequenceClassification\n", - "from energizer.estimator import Estimator\n", - "from energizer.utilities import move_to_cpu\n", - "from energizer.enums import InputKeys, OutputKeys, RunningStage\n", - "from energizer import seed_everything\n", - "from energizer.callbacks import GradNorm\n", - "from energizer.active_learning.datastores.classification import ActivePandasDataStoreForSequenceClassification\n", - "from typing import List, Dict\n", - "import torch\n", "import numpy as np\n", - "from transformers import AutoModelForSequenceClassification, AutoTokenizer\n", + "import torch\n", + "from datasets import load_dataset\n", "from torchmetrics import MetricCollection\n", "from torchmetrics.classification import Accuracy, F1Score, Precision, Recall\n", - "from datasets import load_dataset\n", + "from transformers import AutoModelForSequenceClassification, AutoTokenizer\n", + "\n", + "from energizer import seed_everything\n", + "from energizer.active_learning.datastores.classification import ActivePandasDatastoreForSequenceClassification\n", "from energizer.active_learning.strategies.random import RandomStrategy\n", - "from energizer.active_learning.strategies.uncertainty import UncertaintyBasedStrategy" + "from energizer.active_learning.strategies.uncertainty import UncertaintyBasedStrategy\n", + "from energizer.datastores.classification import PandasDatastoreForSequenceClassification\n", + "from energizer.enums import InputKeys, OutputKeys, RunningStage\n", + "from energizer.estimator import Estimator\n", + "from energizer.utilities import move_to_cpu" ] }, { @@ -90,11 +89,8 @@ } ], "source": [ - "ds = PandasDataStoreForSequenceClassification.from_dataset_dict(\n", - " dataset_dict=dataset_dict,\n", - " input_names=[\"input_ids\", \"attention_mask\"],\n", - " target_name=\"labels\",\n", - " tokenizer=tokenizer,\n", + "ds = PandasDatastoreForSequenceClassification.from_dataset_dict(\n", + " dataset_dict=dataset_dict, input_names=[\"input_ids\", \"attention_mask\"], target_name=\"labels\", tokenizer=tokenizer\n", ")" ] }, @@ -104,18 +100,10 @@ "metadata": {}, "outputs": [], "source": [ - "class EstimatorForSequenceClassification(Estimator):\n", - "\n", + "class HFEstimatorForSequenceClassification(Estimator):\n", " def step(\n", - " self,\n", - " stage: RunningStage,\n", - " model,\n", - " batch: Dict,\n", - " batch_idx: int,\n", - " loss_fn,\n", - " metrics: MetricCollection,\n", + " self, stage: RunningStage, model, batch: dict, batch_idx: int, loss_fn, metrics: MetricCollection\n", " ) -> torch.Tensor:\n", - " \n", " _ = batch.pop(InputKeys.ON_CPU, None)\n", "\n", " out = model(**batch)\n", @@ -129,11 +117,11 @@ " self.log_dict({f\"{stage}/{k}\": v for k, v in logs.items()}, step=self.tracker.global_batch)\n", "\n", " return out.loss\n", - " \n", - " def epoch_end(self, stage: RunningStage, output: List[np.ndarray], metrics: MetricCollection) -> float:\n", + "\n", + " def epoch_end(self, stage: RunningStage, output: list[np.ndarray], metrics: MetricCollection) -> float:\n", " aggregated_metrics = move_to_cpu(metrics.compute()) # NOTE: metrics are still on device\n", " aggregated_loss = round(np.mean(output).item(), 6)\n", - " \n", + "\n", " logs = {OutputKeys.LOSS: aggregated_loss, **aggregated_metrics}\n", " self.log_dict({f\"{stage}_end/{k}\": v for k, v in logs.items()}, step=self.tracker.safe_global_epoch)\n", "\n", @@ -153,8 +141,7 @@ " \"precision_micro\": Precision(task, num_classes=num_classes, average=\"micro\"),\n", " \"recall_micro\": Recall(task, num_classes=num_classes, average=\"micro\"),\n", " }\n", - " ).to(self.device)\n", - " \n" + " ).to(self.device)" ] }, { @@ -175,11 +162,8 @@ "source": [ "seed_everything(42)\n", "model = AutoModelForSequenceClassification.from_pretrained(\n", - " ds.tokenizer.name_or_path,\n", - " id2label=ds.id2label,\n", - " label2id=ds.label2id,\n", - " num_labels=len(ds.labels),\n", - ")\n" + " ds.tokenizer.name_or_path, id2label=ds.id2label, label2id=ds.label2id, num_labels=len(ds.labels)\n", + ")" ] }, { @@ -269,8 +253,8 @@ "source": [ "ds.prepare_for_loading()\n", "\n", - "estimator = EstimatorForSequenceClassification(\n", - " model, \n", + "estimator = HFEstimatorForSequenceClassification(\n", + " model,\n", " accelerator=\"gpu\",\n", " tf32_mode=\"high\",\n", " # loggers=[TensorBoardLogger(\"./\")],\n", @@ -288,7 +272,7 @@ " optimizer=\"adamw\",\n", " gradient_accumulation_steps=2,\n", " scheduler=\"cosine_schedule_with_warmup\",\n", - " scheduler_kwargs={\"num_warmup_steps\": .1},\n", + " scheduler_kwargs={\"num_warmup_steps\": 0.1},\n", ")\n", "\n", "estimator.test(loader=ds.test_loader())" @@ -300,18 +284,14 @@ "metadata": {}, "outputs": [], "source": [ - "class RandomStrategyForSequenceClassification(EstimatorForSequenceClassification, RandomStrategy):\n", + "class RandomStrategyForSequenceClassification(HFEstimatorForSequenceClassification, RandomStrategy):\n", " ...\n", "\n", - "random = RandomStrategyForSequenceClassification(\n", - " model=model, accelerator=\"gpu\", tf32_mode=\"high\",\n", - ")\n", "\n", - "ads = ActivePandasDataStoreForSequenceClassification.from_dataset_dict(\n", - " dataset_dict=dataset_dict,\n", - " input_names=[\"input_ids\", \"attention_mask\"],\n", - " target_name=\"labels\",\n", - " tokenizer=tokenizer,\n", + "random = RandomStrategyForSequenceClassification(model=model, accelerator=\"gpu\", tf32_mode=\"high\")\n", + "\n", + "ads = ActivePandasDatastoreForSequenceClassification.from_dataset_dict(\n", + " dataset_dict=dataset_dict, input_names=[\"input_ids\", \"attention_mask\"], target_name=\"labels\", tokenizer=tokenizer\n", ")\n", "\n", "ads.prepare_for_loading()\n", @@ -327,10 +307,10 @@ " optimizer=\"adamw\",\n", " gradient_accumulation_steps=2,\n", " scheduler=\"cosine_schedule_with_warmup\",\n", - " scheduler_kwargs={\"num_warmup_steps\": .1},\n", + " scheduler_kwargs={\"num_warmup_steps\": 0.1},\n", " query_size=15,\n", - " limit_test_batches=2\n", - ")\n" + " limit_test_batches=2,\n", + ")" ] }, { @@ -339,20 +319,14 @@ "metadata": {}, "outputs": [], "source": [ - "\n", - "class UncertaintyStrategy(EstimatorForSequenceClassification, UncertaintyBasedStrategy):\n", + "class UncertaintyStrategy(HFEstimatorForSequenceClassification, UncertaintyBasedStrategy):\n", " def pool_step(self, model, batch, batch_idx: int, metrics):\n", " return super().step(RunningStage.POOL, model, batch, batch_idx, None, metrics)\n", "\n", "\n", - "least_conf = UncertaintyStrategy(\n", - " model=model, accelerator=\"gpu\", tf32_mode=\"high\", score_fn=\"least_confidence\",\n", - ")\n", - "ads = ActivePandasDataStoreForSequenceClassification.from_dataset_dict(\n", - " dataset_dict=dataset_dict,\n", - " input_names=[\"input_ids\", \"attention_mask\"],\n", - " target_name=\"labels\",\n", - " tokenizer=tokenizer,\n", + "least_conf = UncertaintyStrategy(model=model, accelerator=\"gpu\", tf32_mode=\"high\", score_fn=\"least_confidence\")\n", + "ads = ActivePandasDatastoreForSequenceClassification.from_dataset_dict(\n", + " dataset_dict=dataset_dict, input_names=[\"input_ids\", \"attention_mask\"], target_name=\"labels\", tokenizer=tokenizer\n", ")\n", "\n", "ads.prepare_for_loading()\n", @@ -367,10 +341,10 @@ " optimizer=\"adamw\",\n", " gradient_accumulation_steps=2,\n", " scheduler=\"cosine_schedule_with_warmup\",\n", - " scheduler_kwargs={\"num_warmup_steps\": .1},\n", + " scheduler_kwargs={\"num_warmup_steps\": 0.1},\n", " query_size=15,\n", - " limit_test_batches=2\n", - ")\n" + " limit_test_batches=2,\n", + ")" ] }, { diff --git a/makefile b/makefile index 012f79c..fcbd267 100644 --- a/makefile +++ b/makefile @@ -4,14 +4,11 @@ sources = energizer test: format lint unittest format: - isort $(sources) tests examples - black $(sources) tests examples - nbqa isort docs/examples - nbqa black docs/examples --line-length 85 + ruff format $(sources) lint: - flake8 $(sources) tests - # mypy $(sources) tests + ruff check $(sources) --fix + torchfix $(sources) --fix unittest: pytest @@ -31,4 +28,7 @@ clean: rm -rf site serve_docs: - mkdocs serve --watch . \ No newline at end of file + mkdocs serve --watch . + +clean-poetry-cache: + rm -rf ~/.cache/pypoetry/virtualenvs/ diff --git a/mkdocs.yml b/mkdocs.yml deleted file mode 100644 index 1413105..0000000 --- a/mkdocs.yml +++ /dev/null @@ -1,166 +0,0 @@ -# docs here: https://squidfunk.github.io/mkdocs-material/ - -site_name: Energizer -site_url: https://pietrolesci.github.io/energizer -repo_url: https://github.com/pietrolesci/energizer -repo_name: pietrolesci/energizer -edit_uri: tree/main/docs - -nav: - - Home: index.md - - Examples: - - examples/index.md - # - Simple CNN on MNIST: examples/cnn-mnist.ipynb - # - BERT on AG-News: examples/bert-agnews.ipynb - - API Reference: - - Trainer: api/trainer.md - - Query strategies: api/query_strategies.md - - Acquisition function: api/acquisition_functions.md - - Contributing: contributing.md - - Changelog: changelog.md - -theme: - name: material - custom_dir: docs/overrides - language: en - icon: - logo: material/book-education-outline - repo: fontawesome/brands/github - font: - text: Fira Sans Condensed - code: JetBrains Mono - - #logo: assets/logo.png - palette: - - # Palette toggle for automatic mode - - media: "(prefers-color-scheme)" - primary: teal - accent: teal - toggle: - icon: material/brightness-auto - name: Switch to light mode - - # Palette toggle for light mode - - scheme: default - primary: teal - accent: teal - toggle: - icon: material/brightness-7 - name: Switch to dark mode - - # Palette toggle for dark mode - - scheme: slate - primary: teal - accent: teal - toggle: - icon: material/brightness-4 - name: Switch to light mode - - features: - - navigation.expand - - navigation.sections - - navigation.instant - - navigation.tracking - - navigation.tabs - - navigation.tabs.sticky - - navigation.indexes - # - toc.integrate - - navigation.top - - search.suggest - - search.highlight - - search.share - - header.autohide - - announce.dismiss - - content.tabs.link - - content.code.annotate - -markdown_extensions: - - admonition - - pymdownx.details - - pymdownx.critic - - pymdownx.superfences - - tables - - def_list - - footnotes - - md_in_html - - pymdownx.emoji: - emoji_index: !!python/name:materialx.emoji.twemoji - emoji_generator: !!python/name:materialx.emoji.to_svg - - pymdownx.caret - - pymdownx.mark - - pymdownx.tilde - - pymdownx.betterem - - pymdownx.tabbed: - alternate_style: true - - pymdownx.tasklist: - custom_checkbox: true - - attr_list - - pymdownx.arithmatex: - generic: true - - pymdownx.highlight: - linenums: true - use_pygments: true - anchor_linenums: true - - pymdownx.inlinehilite - - pymdownx.keys - - pymdownx.smartsymbols - - pymdownx.snippets - - toc: - permalink: true - slugify: !!python/name:pymdownx.slugs.uslugify - -plugins: - - tags - - include-markdown - - mknotebooks - # binder: true - # binder_service_name: "gh" - # binder_branch: "main" - # binder_ui: "lab" - - git-revision-date-localized: - enable_creation_date: true - - search: - lang: en - - mkdocstrings: - default_handler: python - handlers: - python: - options: - show_source: true - show_root_heading: false - heading_level: 3 - -extra: - version: - provider: mike - default: stable - - social: - - icon: fontawesome/brands/twitter - link: https://twitter.com/pietro_lesci - name: Twitter - - icon: fontawesome/brands/linkedin - link: https://www.linkedin.com/in/pietrolesci - name: LinkedIn - - icon: fontawesome/brands/github - link: https://github.com/pietrolesci/ - name: Github - - icon: material/email - link: "mailto:pietrolesci@outlook.com" - -extra_javascript: - - javascripts/mathjax.js - - https://polyfill.io/v3/polyfill.min.js?features=es6 - - https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js - -extra_css: - - stylesheets/extra.css - -copyright: Copyright © 2022 - Pietro Lesci - # to enable disqus, uncomment the following and put your disqus id below - # disqus: disqus_id -# uncomment the following and put your google tracking id below to enable GA -#google_analytics: - #- UA-xxx - #- auto diff --git a/poetry.lock b/poetry.lock index ac1580f..25e5d6f 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,110 +1,110 @@ -# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. [[package]] name = "absl-py" -version = "1.4.0" +version = "2.0.0" description = "Abseil Python Common Libraries, see https://github.com/abseil/abseil-py." optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "absl-py-1.4.0.tar.gz", hash = "sha256:d2c244d01048ba476e7c080bd2c6df5e141d211de80223460d5b3b8a2a58433d"}, - {file = "absl_py-1.4.0-py3-none-any.whl", hash = "sha256:0d3fe606adfa4f7db64792dd4c7aee4ee0c38ab75dfd353b7a83ed3e957fcb47"}, + {file = "absl-py-2.0.0.tar.gz", hash = "sha256:d9690211c5fcfefcdd1a45470ac2b5c5acd45241c3af71eed96bc5441746c0d5"}, + {file = "absl_py-2.0.0-py3-none-any.whl", hash = "sha256:9a28abb62774ae4e8edbe2dd4c49ffcd45a6a848952a5eccc6a49f3f0fc1e2f3"}, ] [[package]] name = "aiohttp" -version = "3.8.5" +version = "3.8.6" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.6" files = [ - {file = "aiohttp-3.8.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a94159871304770da4dd371f4291b20cac04e8c94f11bdea1c3478e557fbe0d8"}, - {file = "aiohttp-3.8.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:13bf85afc99ce6f9ee3567b04501f18f9f8dbbb2ea11ed1a2e079670403a7c84"}, - {file = "aiohttp-3.8.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2ce2ac5708501afc4847221a521f7e4b245abf5178cf5ddae9d5b3856ddb2f3a"}, - {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96943e5dcc37a6529d18766597c491798b7eb7a61d48878611298afc1fca946c"}, - {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ad5c3c4590bb3cc28b4382f031f3783f25ec223557124c68754a2231d989e2b"}, - {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0c413c633d0512df4dc7fd2373ec06cc6a815b7b6d6c2f208ada7e9e93a5061d"}, - {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df72ac063b97837a80d80dec8d54c241af059cc9bb42c4de68bd5b61ceb37caa"}, - {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c48c5c0271149cfe467c0ff8eb941279fd6e3f65c9a388c984e0e6cf57538e14"}, - {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:368a42363c4d70ab52c2c6420a57f190ed3dfaca6a1b19afda8165ee16416a82"}, - {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7607ec3ce4993464368505888af5beb446845a014bc676d349efec0e05085905"}, - {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:0d21c684808288a98914e5aaf2a7c6a3179d4df11d249799c32d1808e79503b5"}, - {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:312fcfbacc7880a8da0ae8b6abc6cc7d752e9caa0051a53d217a650b25e9a691"}, - {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ad093e823df03bb3fd37e7dec9d4670c34f9e24aeace76808fc20a507cace825"}, - {file = "aiohttp-3.8.5-cp310-cp310-win32.whl", hash = "sha256:33279701c04351a2914e1100b62b2a7fdb9a25995c4a104259f9a5ead7ed4802"}, - {file = "aiohttp-3.8.5-cp310-cp310-win_amd64.whl", hash = "sha256:6e4a280e4b975a2e7745573e3fc9c9ba0d1194a3738ce1cbaa80626cc9b4f4df"}, - {file = "aiohttp-3.8.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ae871a964e1987a943d83d6709d20ec6103ca1eaf52f7e0d36ee1b5bebb8b9b9"}, - {file = "aiohttp-3.8.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:461908b2578955045efde733719d62f2b649c404189a09a632d245b445c9c975"}, - {file = "aiohttp-3.8.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:72a860c215e26192379f57cae5ab12b168b75db8271f111019509a1196dfc780"}, - {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc14be025665dba6202b6a71cfcdb53210cc498e50068bc088076624471f8bb9"}, - {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8af740fc2711ad85f1a5c034a435782fbd5b5f8314c9a3ef071424a8158d7f6b"}, - {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:841cd8233cbd2111a0ef0a522ce016357c5e3aff8a8ce92bcfa14cef890d698f"}, - {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ed1c46fb119f1b59304b5ec89f834f07124cd23ae5b74288e364477641060ff"}, - {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:84f8ae3e09a34f35c18fa57f015cc394bd1389bce02503fb30c394d04ee6b938"}, - {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62360cb771707cb70a6fd114b9871d20d7dd2163a0feafe43fd115cfe4fe845e"}, - {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:23fb25a9f0a1ca1f24c0a371523546366bb642397c94ab45ad3aedf2941cec6a"}, - {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0ba0d15164eae3d878260d4c4df859bbdc6466e9e6689c344a13334f988bb53"}, - {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5d20003b635fc6ae3f96d7260281dfaf1894fc3aa24d1888a9b2628e97c241e5"}, - {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0175d745d9e85c40dcc51c8f88c74bfbaef9e7afeeeb9d03c37977270303064c"}, - {file = "aiohttp-3.8.5-cp311-cp311-win32.whl", hash = "sha256:2e1b1e51b0774408f091d268648e3d57f7260c1682e7d3a63cb00d22d71bb945"}, - {file = "aiohttp-3.8.5-cp311-cp311-win_amd64.whl", hash = "sha256:043d2299f6dfdc92f0ac5e995dfc56668e1587cea7f9aa9d8a78a1b6554e5755"}, - {file = "aiohttp-3.8.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cae533195e8122584ec87531d6df000ad07737eaa3c81209e85c928854d2195c"}, - {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f21e83f355643c345177a5d1d8079f9f28b5133bcd154193b799d380331d5d3"}, - {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a7a75ef35f2df54ad55dbf4b73fe1da96f370e51b10c91f08b19603c64004acc"}, - {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e2e9839e14dd5308ee773c97115f1e0a1cb1d75cbeeee9f33824fa5144c7634"}, - {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44e65da1de4403d0576473e2344828ef9c4c6244d65cf4b75549bb46d40b8dd"}, - {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78d847e4cde6ecc19125ccbc9bfac4a7ab37c234dd88fbb3c5c524e8e14da543"}, - {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:c7a815258e5895d8900aec4454f38dca9aed71085f227537208057853f9d13f2"}, - {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:8b929b9bd7cd7c3939f8bcfffa92fae7480bd1aa425279d51a89327d600c704d"}, - {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:5db3a5b833764280ed7618393832e0853e40f3d3e9aa128ac0ba0f8278d08649"}, - {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:a0215ce6041d501f3155dc219712bc41252d0ab76474615b9700d63d4d9292af"}, - {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:fd1ed388ea7fbed22c4968dd64bab0198de60750a25fe8c0c9d4bef5abe13824"}, - {file = "aiohttp-3.8.5-cp36-cp36m-win32.whl", hash = "sha256:6e6783bcc45f397fdebc118d772103d751b54cddf5b60fbcc958382d7dd64f3e"}, - {file = "aiohttp-3.8.5-cp36-cp36m-win_amd64.whl", hash = "sha256:b5411d82cddd212644cf9360879eb5080f0d5f7d809d03262c50dad02f01421a"}, - {file = "aiohttp-3.8.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:01d4c0c874aa4ddfb8098e85d10b5e875a70adc63db91f1ae65a4b04d3344cda"}, - {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5980a746d547a6ba173fd5ee85ce9077e72d118758db05d229044b469d9029a"}, - {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a482e6da906d5e6e653be079b29bc173a48e381600161c9932d89dfae5942ef"}, - {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80bd372b8d0715c66c974cf57fe363621a02f359f1ec81cba97366948c7fc873"}, - {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1161b345c0a444ebcf46bf0a740ba5dcf50612fd3d0528883fdc0eff578006a"}, - {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd56db019015b6acfaaf92e1ac40eb8434847d9bf88b4be4efe5bfd260aee692"}, - {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:153c2549f6c004d2754cc60603d4668899c9895b8a89397444a9c4efa282aaf4"}, - {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4a01951fabc4ce26ab791da5f3f24dca6d9a6f24121746eb19756416ff2d881b"}, - {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bfb9162dcf01f615462b995a516ba03e769de0789de1cadc0f916265c257e5d8"}, - {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:7dde0009408969a43b04c16cbbe252c4f5ef4574ac226bc8815cd7342d2028b6"}, - {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4149d34c32f9638f38f544b3977a4c24052042affa895352d3636fa8bffd030a"}, - {file = "aiohttp-3.8.5-cp37-cp37m-win32.whl", hash = "sha256:68c5a82c8779bdfc6367c967a4a1b2aa52cd3595388bf5961a62158ee8a59e22"}, - {file = "aiohttp-3.8.5-cp37-cp37m-win_amd64.whl", hash = "sha256:2cf57fb50be5f52bda004b8893e63b48530ed9f0d6c96c84620dc92fe3cd9b9d"}, - {file = "aiohttp-3.8.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:eca4bf3734c541dc4f374ad6010a68ff6c6748f00451707f39857f429ca36ced"}, - {file = "aiohttp-3.8.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1274477e4c71ce8cfe6c1ec2f806d57c015ebf84d83373676036e256bc55d690"}, - {file = "aiohttp-3.8.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:28c543e54710d6158fc6f439296c7865b29e0b616629767e685a7185fab4a6b9"}, - {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:910bec0c49637d213f5d9877105d26e0c4a4de2f8b1b29405ff37e9fc0ad52b8"}, - {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5443910d662db951b2e58eb70b0fbe6b6e2ae613477129a5805d0b66c54b6cb7"}, - {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e460be6978fc24e3df83193dc0cc4de46c9909ed92dd47d349a452ef49325b7"}, - {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb1558def481d84f03b45888473fc5a1f35747b5f334ef4e7a571bc0dfcb11f8"}, - {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34dd0c107799dcbbf7d48b53be761a013c0adf5571bf50c4ecad5643fe9cfcd0"}, - {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aa1990247f02a54185dc0dff92a6904521172a22664c863a03ff64c42f9b5410"}, - {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0e584a10f204a617d71d359fe383406305a4b595b333721fa50b867b4a0a1548"}, - {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:a3cf433f127efa43fee6b90ea4c6edf6c4a17109d1d037d1a52abec84d8f2e42"}, - {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:c11f5b099adafb18e65c2c997d57108b5bbeaa9eeee64a84302c0978b1ec948b"}, - {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:84de26ddf621d7ac4c975dbea4c945860e08cccde492269db4e1538a6a6f3c35"}, - {file = "aiohttp-3.8.5-cp38-cp38-win32.whl", hash = "sha256:ab88bafedc57dd0aab55fa728ea10c1911f7e4d8b43e1d838a1739f33712921c"}, - {file = "aiohttp-3.8.5-cp38-cp38-win_amd64.whl", hash = "sha256:5798a9aad1879f626589f3df0f8b79b3608a92e9beab10e5fda02c8a2c60db2e"}, - {file = "aiohttp-3.8.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a6ce61195c6a19c785df04e71a4537e29eaa2c50fe745b732aa937c0c77169f3"}, - {file = "aiohttp-3.8.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:773dd01706d4db536335fcfae6ea2440a70ceb03dd3e7378f3e815b03c97ab51"}, - {file = "aiohttp-3.8.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f83a552443a526ea38d064588613aca983d0ee0038801bc93c0c916428310c28"}, - {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f7372f7341fcc16f57b2caded43e81ddd18df53320b6f9f042acad41f8e049a"}, - {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea353162f249c8097ea63c2169dd1aa55de1e8fecbe63412a9bc50816e87b761"}, - {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5d47ae48db0b2dcf70bc8a3bc72b3de86e2a590fc299fdbbb15af320d2659de"}, - {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d827176898a2b0b09694fbd1088c7a31836d1a505c243811c87ae53a3f6273c1"}, - {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3562b06567c06439d8b447037bb655ef69786c590b1de86c7ab81efe1c9c15d8"}, - {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4e874cbf8caf8959d2adf572a78bba17cb0e9d7e51bb83d86a3697b686a0ab4d"}, - {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6809a00deaf3810e38c628e9a33271892f815b853605a936e2e9e5129762356c"}, - {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:33776e945d89b29251b33a7e7d006ce86447b2cfd66db5e5ded4e5cd0340585c"}, - {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:eaeed7abfb5d64c539e2db173f63631455f1196c37d9d8d873fc316470dfbacd"}, - {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e91d635961bec2d8f19dfeb41a539eb94bd073f075ca6dae6c8dc0ee89ad6f91"}, - {file = "aiohttp-3.8.5-cp39-cp39-win32.whl", hash = "sha256:00ad4b6f185ec67f3e6562e8a1d2b69660be43070bd0ef6fcec5211154c7df67"}, - {file = "aiohttp-3.8.5-cp39-cp39-win_amd64.whl", hash = "sha256:c0a9034379a37ae42dea7ac1e048352d96286626251862e448933c0f59cbd79c"}, - {file = "aiohttp-3.8.5.tar.gz", hash = "sha256:b9552ec52cc147dbf1944ac7ac98af7602e51ea2dcd076ed194ca3c0d1c7d0bc"}, + {file = "aiohttp-3.8.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:41d55fc043954cddbbd82503d9cc3f4814a40bcef30b3569bc7b5e34130718c1"}, + {file = "aiohttp-3.8.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1d84166673694841d8953f0a8d0c90e1087739d24632fe86b1a08819168b4566"}, + {file = "aiohttp-3.8.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:253bf92b744b3170eb4c4ca2fa58f9c4b87aeb1df42f71d4e78815e6e8b73c9e"}, + {file = "aiohttp-3.8.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3fd194939b1f764d6bb05490987bfe104287bbf51b8d862261ccf66f48fb4096"}, + {file = "aiohttp-3.8.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6c5f938d199a6fdbdc10bbb9447496561c3a9a565b43be564648d81e1102ac22"}, + {file = "aiohttp-3.8.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2817b2f66ca82ee699acd90e05c95e79bbf1dc986abb62b61ec8aaf851e81c93"}, + {file = "aiohttp-3.8.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fa375b3d34e71ccccf172cab401cd94a72de7a8cc01847a7b3386204093bb47"}, + {file = "aiohttp-3.8.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9de50a199b7710fa2904be5a4a9b51af587ab24c8e540a7243ab737b45844543"}, + {file = "aiohttp-3.8.6-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e1d8cb0b56b3587c5c01de3bf2f600f186da7e7b5f7353d1bf26a8ddca57f965"}, + {file = "aiohttp-3.8.6-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8e31e9db1bee8b4f407b77fd2507337a0a80665ad7b6c749d08df595d88f1cf5"}, + {file = "aiohttp-3.8.6-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:7bc88fc494b1f0311d67f29fee6fd636606f4697e8cc793a2d912ac5b19aa38d"}, + {file = "aiohttp-3.8.6-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ec00c3305788e04bf6d29d42e504560e159ccaf0be30c09203b468a6c1ccd3b2"}, + {file = "aiohttp-3.8.6-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ad1407db8f2f49329729564f71685557157bfa42b48f4b93e53721a16eb813ed"}, + {file = "aiohttp-3.8.6-cp310-cp310-win32.whl", hash = "sha256:ccc360e87341ad47c777f5723f68adbb52b37ab450c8bc3ca9ca1f3e849e5fe2"}, + {file = "aiohttp-3.8.6-cp310-cp310-win_amd64.whl", hash = "sha256:93c15c8e48e5e7b89d5cb4613479d144fda8344e2d886cf694fd36db4cc86865"}, + {file = "aiohttp-3.8.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e2f9cc8e5328f829f6e1fb74a0a3a939b14e67e80832975e01929e320386b34"}, + {file = "aiohttp-3.8.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e6a00ffcc173e765e200ceefb06399ba09c06db97f401f920513a10c803604ca"}, + {file = "aiohttp-3.8.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:41bdc2ba359032e36c0e9de5a3bd00d6fb7ea558a6ce6b70acedf0da86458321"}, + {file = "aiohttp-3.8.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14cd52ccf40006c7a6cd34a0f8663734e5363fd981807173faf3a017e202fec9"}, + {file = "aiohttp-3.8.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2d5b785c792802e7b275c420d84f3397668e9d49ab1cb52bd916b3b3ffcf09ad"}, + {file = "aiohttp-3.8.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1bed815f3dc3d915c5c1e556c397c8667826fbc1b935d95b0ad680787896a358"}, + {file = "aiohttp-3.8.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96603a562b546632441926cd1293cfcb5b69f0b4159e6077f7c7dbdfb686af4d"}, + {file = "aiohttp-3.8.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d76e8b13161a202d14c9584590c4df4d068c9567c99506497bdd67eaedf36403"}, + {file = "aiohttp-3.8.6-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e3f1e3f1a1751bb62b4a1b7f4e435afcdade6c17a4fd9b9d43607cebd242924a"}, + {file = "aiohttp-3.8.6-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:76b36b3124f0223903609944a3c8bf28a599b2cc0ce0be60b45211c8e9be97f8"}, + {file = "aiohttp-3.8.6-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:a2ece4af1f3c967a4390c284797ab595a9f1bc1130ef8b01828915a05a6ae684"}, + {file = "aiohttp-3.8.6-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:16d330b3b9db87c3883e565340d292638a878236418b23cc8b9b11a054aaa887"}, + {file = "aiohttp-3.8.6-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:42c89579f82e49db436b69c938ab3e1559e5a4409eb8639eb4143989bc390f2f"}, + {file = "aiohttp-3.8.6-cp311-cp311-win32.whl", hash = "sha256:efd2fcf7e7b9d7ab16e6b7d54205beded0a9c8566cb30f09c1abe42b4e22bdcb"}, + {file = "aiohttp-3.8.6-cp311-cp311-win_amd64.whl", hash = "sha256:3b2ab182fc28e7a81f6c70bfbd829045d9480063f5ab06f6e601a3eddbbd49a0"}, + {file = "aiohttp-3.8.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:fdee8405931b0615220e5ddf8cd7edd8592c606a8e4ca2a00704883c396e4479"}, + {file = "aiohttp-3.8.6-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d25036d161c4fe2225d1abff2bd52c34ed0b1099f02c208cd34d8c05729882f0"}, + {file = "aiohttp-3.8.6-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d791245a894be071d5ab04bbb4850534261a7d4fd363b094a7b9963e8cdbd31"}, + {file = "aiohttp-3.8.6-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0cccd1de239afa866e4ce5c789b3032442f19c261c7d8a01183fd956b1935349"}, + {file = "aiohttp-3.8.6-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f13f60d78224f0dace220d8ab4ef1dbc37115eeeab8c06804fec11bec2bbd07"}, + {file = "aiohttp-3.8.6-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a9b5a0606faca4f6cc0d338359d6fa137104c337f489cd135bb7fbdbccb1e39"}, + {file = "aiohttp-3.8.6-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:13da35c9ceb847732bf5c6c5781dcf4780e14392e5d3b3c689f6d22f8e15ae31"}, + {file = "aiohttp-3.8.6-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:4d4cbe4ffa9d05f46a28252efc5941e0462792930caa370a6efaf491f412bc66"}, + {file = "aiohttp-3.8.6-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:229852e147f44da0241954fc6cb910ba074e597f06789c867cb7fb0621e0ba7a"}, + {file = "aiohttp-3.8.6-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:713103a8bdde61d13490adf47171a1039fd880113981e55401a0f7b42c37d071"}, + {file = "aiohttp-3.8.6-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:45ad816b2c8e3b60b510f30dbd37fe74fd4a772248a52bb021f6fd65dff809b6"}, + {file = "aiohttp-3.8.6-cp36-cp36m-win32.whl", hash = "sha256:2b8d4e166e600dcfbff51919c7a3789ff6ca8b3ecce16e1d9c96d95dd569eb4c"}, + {file = "aiohttp-3.8.6-cp36-cp36m-win_amd64.whl", hash = "sha256:0912ed87fee967940aacc5306d3aa8ba3a459fcd12add0b407081fbefc931e53"}, + {file = "aiohttp-3.8.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e2a988a0c673c2e12084f5e6ba3392d76c75ddb8ebc6c7e9ead68248101cd446"}, + {file = "aiohttp-3.8.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebf3fd9f141700b510d4b190094db0ce37ac6361a6806c153c161dc6c041ccda"}, + {file = "aiohttp-3.8.6-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3161ce82ab85acd267c8f4b14aa226047a6bee1e4e6adb74b798bd42c6ae1f80"}, + {file = "aiohttp-3.8.6-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d95fc1bf33a9a81469aa760617b5971331cdd74370d1214f0b3109272c0e1e3c"}, + {file = "aiohttp-3.8.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c43ecfef7deaf0617cee936836518e7424ee12cb709883f2c9a1adda63cc460"}, + {file = "aiohttp-3.8.6-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca80e1b90a05a4f476547f904992ae81eda5c2c85c66ee4195bb8f9c5fb47f28"}, + {file = "aiohttp-3.8.6-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:90c72ebb7cb3a08a7f40061079817133f502a160561d0675b0a6adf231382c92"}, + {file = "aiohttp-3.8.6-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bb54c54510e47a8c7c8e63454a6acc817519337b2b78606c4e840871a3e15349"}, + {file = "aiohttp-3.8.6-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:de6a1c9f6803b90e20869e6b99c2c18cef5cc691363954c93cb9adeb26d9f3ae"}, + {file = "aiohttp-3.8.6-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:a3628b6c7b880b181a3ae0a0683698513874df63783fd89de99b7b7539e3e8a8"}, + {file = "aiohttp-3.8.6-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:fc37e9aef10a696a5a4474802930079ccfc14d9f9c10b4662169671ff034b7df"}, + {file = "aiohttp-3.8.6-cp37-cp37m-win32.whl", hash = "sha256:f8ef51e459eb2ad8e7a66c1d6440c808485840ad55ecc3cafefadea47d1b1ba2"}, + {file = "aiohttp-3.8.6-cp37-cp37m-win_amd64.whl", hash = "sha256:b2fe42e523be344124c6c8ef32a011444e869dc5f883c591ed87f84339de5976"}, + {file = "aiohttp-3.8.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:9e2ee0ac5a1f5c7dd3197de309adfb99ac4617ff02b0603fd1e65b07dc772e4b"}, + {file = "aiohttp-3.8.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:01770d8c04bd8db568abb636c1fdd4f7140b284b8b3e0b4584f070180c1e5c62"}, + {file = "aiohttp-3.8.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3c68330a59506254b556b99a91857428cab98b2f84061260a67865f7f52899f5"}, + {file = "aiohttp-3.8.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89341b2c19fb5eac30c341133ae2cc3544d40d9b1892749cdd25892bbc6ac951"}, + {file = "aiohttp-3.8.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:71783b0b6455ac8f34b5ec99d83e686892c50498d5d00b8e56d47f41b38fbe04"}, + {file = "aiohttp-3.8.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f628dbf3c91e12f4d6c8b3f092069567d8eb17814aebba3d7d60c149391aee3a"}, + {file = "aiohttp-3.8.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b04691bc6601ef47c88f0255043df6f570ada1a9ebef99c34bd0b72866c217ae"}, + {file = "aiohttp-3.8.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ee912f7e78287516df155f69da575a0ba33b02dd7c1d6614dbc9463f43066e3"}, + {file = "aiohttp-3.8.6-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9c19b26acdd08dd239e0d3669a3dddafd600902e37881f13fbd8a53943079dbc"}, + {file = "aiohttp-3.8.6-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:99c5ac4ad492b4a19fc132306cd57075c28446ec2ed970973bbf036bcda1bcc6"}, + {file = "aiohttp-3.8.6-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:f0f03211fd14a6a0aed2997d4b1c013d49fb7b50eeb9ffdf5e51f23cfe2c77fa"}, + {file = "aiohttp-3.8.6-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:8d399dade330c53b4106160f75f55407e9ae7505263ea86f2ccca6bfcbdb4921"}, + {file = "aiohttp-3.8.6-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ec4fd86658c6a8964d75426517dc01cbf840bbf32d055ce64a9e63a40fd7b771"}, + {file = "aiohttp-3.8.6-cp38-cp38-win32.whl", hash = "sha256:33164093be11fcef3ce2571a0dccd9041c9a93fa3bde86569d7b03120d276c6f"}, + {file = "aiohttp-3.8.6-cp38-cp38-win_amd64.whl", hash = "sha256:bdf70bfe5a1414ba9afb9d49f0c912dc524cf60141102f3a11143ba3d291870f"}, + {file = "aiohttp-3.8.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d52d5dc7c6682b720280f9d9db41d36ebe4791622c842e258c9206232251ab2b"}, + {file = "aiohttp-3.8.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4ac39027011414dbd3d87f7edb31680e1f430834c8cef029f11c66dad0670aa5"}, + {file = "aiohttp-3.8.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3f5c7ce535a1d2429a634310e308fb7d718905487257060e5d4598e29dc17f0b"}, + {file = "aiohttp-3.8.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b30e963f9e0d52c28f284d554a9469af073030030cef8693106d918b2ca92f54"}, + {file = "aiohttp-3.8.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:918810ef188f84152af6b938254911055a72e0f935b5fbc4c1a4ed0b0584aed1"}, + {file = "aiohttp-3.8.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:002f23e6ea8d3dd8d149e569fd580c999232b5fbc601c48d55398fbc2e582e8c"}, + {file = "aiohttp-3.8.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4fcf3eabd3fd1a5e6092d1242295fa37d0354b2eb2077e6eb670accad78e40e1"}, + {file = "aiohttp-3.8.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:255ba9d6d5ff1a382bb9a578cd563605aa69bec845680e21c44afc2670607a95"}, + {file = "aiohttp-3.8.6-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d67f8baed00870aa390ea2590798766256f31dc5ed3ecc737debb6e97e2ede78"}, + {file = "aiohttp-3.8.6-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:86f20cee0f0a317c76573b627b954c412ea766d6ada1a9fcf1b805763ae7feeb"}, + {file = "aiohttp-3.8.6-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:39a312d0e991690ccc1a61f1e9e42daa519dcc34ad03eb6f826d94c1190190dd"}, + {file = "aiohttp-3.8.6-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e827d48cf802de06d9c935088c2924e3c7e7533377d66b6f31ed175c1620e05e"}, + {file = "aiohttp-3.8.6-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bd111d7fc5591ddf377a408ed9067045259ff2770f37e2d94e6478d0f3fc0c17"}, + {file = "aiohttp-3.8.6-cp39-cp39-win32.whl", hash = "sha256:caf486ac1e689dda3502567eb89ffe02876546599bbf915ec94b1fa424eeffd4"}, + {file = "aiohttp-3.8.6-cp39-cp39-win_amd64.whl", hash = "sha256:3f0e27e5b733803333bb2371249f41cf42bae8884863e8e8965ec69bebe53132"}, + {file = "aiohttp-3.8.6.tar.gz", hash = "sha256:b0cf2a4501bff9330a8a5248b4ce951851e415bdcce9dc158e76cfd55e15085c"}, ] [package.dependencies] @@ -133,51 +133,26 @@ files = [ [package.dependencies] frozenlist = ">=1.1.0" -[[package]] -name = "annotated-types" -version = "0.5.0" -description = "Reusable constraint types to use with typing.Annotated" -optional = false -python-versions = ">=3.7" -files = [ - {file = "annotated_types-0.5.0-py3-none-any.whl", hash = "sha256:58da39888f92c276ad970249761ebea80ba544b77acddaa1a4d6cf78287d45fd"}, - {file = "annotated_types-0.5.0.tar.gz", hash = "sha256:47cdc3490d9ac1506ce92c7aaa76c579dc3509ff11e098fc867e5130ab7be802"}, -] - -[package.dependencies] -typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.9\""} - -[[package]] -name = "ansicon" -version = "1.89.0" -description = "Python wrapper for loading Jason Hood's ANSICON" -optional = false -python-versions = "*" -files = [ - {file = "ansicon-1.89.0-py2.py3-none-any.whl", hash = "sha256:f1def52d17f65c2c9682cf8370c03f541f410c1752d6a14029f97318e4b9dfec"}, - {file = "ansicon-1.89.0.tar.gz", hash = "sha256:e4d039def5768a47e4afec8e89e83ec3ae5a26bf00ad851f914d1240b444d2b1"}, -] - [[package]] name = "anyio" -version = "3.7.1" +version = "4.0.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "anyio-3.7.1-py3-none-any.whl", hash = "sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5"}, - {file = "anyio-3.7.1.tar.gz", hash = "sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780"}, + {file = "anyio-4.0.0-py3-none-any.whl", hash = "sha256:cfdb2b588b9fc25ede96d8db56ed50848b0b649dca3dd1df0b11f683bb9e0b5f"}, + {file = "anyio-4.0.0.tar.gz", hash = "sha256:f7ed51751b2c2add651e5747c891b47e26d2a21be5d32d9311dfe9692f3e5d7a"}, ] [package.dependencies] -exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} +exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} idna = ">=2.8" sniffio = ">=1.1" [package.extras] -doc = ["Sphinx", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme (>=1.2.2)", "sphinxcontrib-jquery"] -test = ["anyio[trio]", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] -trio = ["trio (<0.22)"] +doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (>=0.22)"] [[package]] name = "appdirs" @@ -260,34 +235,40 @@ tests = ["pytest"] [[package]] name = "arrow" -version = "1.2.3" +version = "1.3.0" description = "Better dates & times for Python" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "arrow-1.2.3-py3-none-any.whl", hash = "sha256:5a49ab92e3b7b71d96cd6bfcc4df14efefc9dfa96ea19045815914a6ab6b1fe2"}, - {file = "arrow-1.2.3.tar.gz", hash = "sha256:3934b30ca1b9f292376d9db15b19446088d12ec58629bc3f0da28fd55fb633a1"}, + {file = "arrow-1.3.0-py3-none-any.whl", hash = "sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80"}, + {file = "arrow-1.3.0.tar.gz", hash = "sha256:d4540617648cb5f895730f1ad8c82a65f2dad0166f57b75f3ca54759c4d67a85"}, ] [package.dependencies] python-dateutil = ">=2.7.0" +types-python-dateutil = ">=2.8.10" + +[package.extras] +doc = ["doc8", "sphinx (>=7.0.0)", "sphinx-autobuild", "sphinx-autodoc-typehints", "sphinx_rtd_theme (>=1.3.0)"] +test = ["dateparser (==1.*)", "pre-commit", "pytest", "pytest-cov", "pytest-mock", "pytz (==2021.1)", "simplejson (==3.*)"] [[package]] name = "asttokens" -version = "2.4.0" +version = "2.4.1" description = "Annotate AST trees with source code positions" optional = false python-versions = "*" files = [ - {file = "asttokens-2.4.0-py2.py3-none-any.whl", hash = "sha256:cf8fc9e61a86461aa9fb161a14a0841a03c405fa829ac6b202670b3495d2ce69"}, - {file = "asttokens-2.4.0.tar.gz", hash = "sha256:2e0171b991b2c959acc6c49318049236844a5da1d65ba2672c4880c1c894834e"}, + {file = "asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24"}, + {file = "asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"}, ] [package.dependencies] six = ">=1.12.0" [package.extras] -test = ["astroid", "pytest"] +astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"] +test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] [[package]] name = "async-lru" @@ -349,39 +330,20 @@ tomli = {version = "*", markers = "python_version < \"3.11\""} [[package]] name = "babel" -version = "2.12.1" +version = "2.13.1" description = "Internationalization utilities" optional = false python-versions = ">=3.7" files = [ - {file = "Babel-2.12.1-py3-none-any.whl", hash = "sha256:b4246fb7677d3b98f501a39d43396d3cafdc8eadb045f4a31be01863f655c610"}, - {file = "Babel-2.12.1.tar.gz", hash = "sha256:cc2d99999cd01d44420ae725a21c9e3711b3aadc7976d6147f622d8581963455"}, + {file = "Babel-2.13.1-py3-none-any.whl", hash = "sha256:7077a4984b02b6727ac10f1f7294484f737443d7e2e66c5e4380e41a3ae0b4ed"}, + {file = "Babel-2.13.1.tar.gz", hash = "sha256:33e0952d7dd6374af8dbf6768cc4ddf3ccfefc244f9986d4074704f2fbd18900"}, ] [package.dependencies] -pytz = {version = ">=2015.7", markers = "python_version < \"3.9\""} +setuptools = {version = "*", markers = "python_version >= \"3.12\""} -[[package]] -name = "backcall" -version = "0.2.0" -description = "Specifications for callback functions passed in to an API" -optional = false -python-versions = "*" -files = [ - {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, - {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, -] - -[[package]] -name = "backoff" -version = "2.2.1" -description = "Function decoration for backoff and retry" -optional = false -python-versions = ">=3.7,<4.0" -files = [ - {file = "backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8"}, - {file = "backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba"}, -] +[package.extras] +dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] [[package]] name = "beautifulsoup4" @@ -402,49 +364,25 @@ html5lib = ["html5lib"] lxml = ["lxml"] [[package]] -name = "black" -version = "22.12.0" -description = "The uncompromising code formatter." +name = "bitsandbytes" +version = "0.41.2.post2" +description = "k-bit optimizers and matrix multiplication routines." optional = false -python-versions = ">=3.7" +python-versions = "*" files = [ - {file = "black-22.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eedd20838bd5d75b80c9f5487dbcb06836a43833a37846cf1d8c1cc01cef59d"}, - {file = "black-22.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:159a46a4947f73387b4d83e87ea006dbb2337eab6c879620a3ba52699b1f4351"}, - {file = "black-22.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d30b212bffeb1e252b31dd269dfae69dd17e06d92b87ad26e23890f3efea366f"}, - {file = "black-22.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:7412e75863aa5c5411886804678b7d083c7c28421210180d67dfd8cf1221e1f4"}, - {file = "black-22.12.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c116eed0efb9ff870ded8b62fe9f28dd61ef6e9ddd28d83d7d264a38417dcee2"}, - {file = "black-22.12.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1f58cbe16dfe8c12b7434e50ff889fa479072096d79f0a7f25e4ab8e94cd8350"}, - {file = "black-22.12.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77d86c9f3db9b1bf6761244bc0b3572a546f5fe37917a044e02f3166d5aafa7d"}, - {file = "black-22.12.0-cp38-cp38-win_amd64.whl", hash = "sha256:82d9fe8fee3401e02e79767016b4907820a7dc28d70d137eb397b92ef3cc5bfc"}, - {file = "black-22.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:101c69b23df9b44247bd88e1d7e90154336ac4992502d4197bdac35dd7ee3320"}, - {file = "black-22.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:559c7a1ba9a006226f09e4916060982fd27334ae1998e7a38b3f33a37f7a2148"}, - {file = "black-22.12.0-py3-none-any.whl", hash = "sha256:436cc9167dd28040ad90d3b404aec22cedf24a6e4d7de221bec2730ec0c97bcf"}, - {file = "black-22.12.0.tar.gz", hash = "sha256:229351e5a18ca30f447bf724d007f890f97e13af070bb6ad4c0a441cd7596a2f"}, + {file = "bitsandbytes-0.41.2.post2-py3-none-any.whl", hash = "sha256:98e5e1979aea3d481ed06181c689f3a154d7f5dc1af770c5173485bc54cf7b72"}, + {file = "bitsandbytes-0.41.2.post2.tar.gz", hash = "sha256:d374da4700651f36a285ed53e012ee527736109614e3f5c0249985d41027136d"}, ] -[package.dependencies] -click = ">=8.0.0" -mypy-extensions = ">=0.4.3" -pathspec = ">=0.9.0" -platformdirs = ">=2" -tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""} -typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} - -[package.extras] -colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.7.4)"] -jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] -uvloop = ["uvloop (>=0.15.2)"] - [[package]] name = "bleach" -version = "6.0.0" +version = "6.1.0" description = "An easy safelist-based HTML-sanitizing tool." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "bleach-6.0.0-py3-none-any.whl", hash = "sha256:33c16e3353dbd13028ab4799a0f89a83f113405c766e9c122df8a06f5b85b3f4"}, - {file = "bleach-6.0.0.tar.gz", hash = "sha256:1a1a85c1595e07d8db14c5f09f09e6433502c51c595970edc090551f0db99414"}, + {file = "bleach-6.1.0-py3-none-any.whl", hash = "sha256:3225f354cfc436b9789c66c4ee030194bee0568fbf9cbdad3bc8b5c26c5f12b6"}, + {file = "bleach-6.1.0.tar.gz", hash = "sha256:0a31f1837963c41d46bbf1331b8778e1308ea0791db03cc4e7357b97cf42a8fe"}, ] [package.dependencies] @@ -452,44 +390,28 @@ six = ">=1.9.0" webencodings = "*" [package.extras] -css = ["tinycss2 (>=1.1.0,<1.2)"] - -[[package]] -name = "blessed" -version = "1.20.0" -description = "Easy, practical library for making terminal apps, by providing an elegant, well-documented interface to Colors, Keyboard input, and screen Positioning capabilities." -optional = false -python-versions = ">=2.7" -files = [ - {file = "blessed-1.20.0-py2.py3-none-any.whl", hash = "sha256:0c542922586a265e699188e52d5f5ac5ec0dd517e5a1041d90d2bbf23f906058"}, - {file = "blessed-1.20.0.tar.gz", hash = "sha256:2cdd67f8746e048f00df47a2880f4d6acbcdb399031b604e34ba8f71d5787680"}, -] - -[package.dependencies] -jinxed = {version = ">=1.1.0", markers = "platform_system == \"Windows\""} -six = ">=1.9.0" -wcwidth = ">=0.1.4" +css = ["tinycss2 (>=1.1.0,<1.3)"] [[package]] name = "cachetools" -version = "5.3.1" +version = "5.3.2" description = "Extensible memoizing collections and decorators" optional = false python-versions = ">=3.7" files = [ - {file = "cachetools-5.3.1-py3-none-any.whl", hash = "sha256:95ef631eeaea14ba2e36f06437f36463aac3a096799e876ee55e5cdccb102590"}, - {file = "cachetools-5.3.1.tar.gz", hash = "sha256:dce83f2d9b4e1f732a8cd44af8e8fab2dbe46201467fc98b3ef8f269092bf62b"}, + {file = "cachetools-5.3.2-py3-none-any.whl", hash = "sha256:861f35a13a451f94e301ce2bec7cac63e881232ccce7ed67fab9b5df4d3beaa1"}, + {file = "cachetools-5.3.2.tar.gz", hash = "sha256:086ee420196f7b2ab9ca2db2520aca326318b68fe5ba8bc4d49cca91add450f2"}, ] [[package]] name = "catalogue" -version = "2.0.9" +version = "2.0.10" description = "Super lightweight function registries for your library" optional = false python-versions = ">=3.6" files = [ - {file = "catalogue-2.0.9-py3-none-any.whl", hash = "sha256:5817ce97de17ace366a15eadd4987ac022b28f262006147549cdb3467265dc4d"}, - {file = "catalogue-2.0.9.tar.gz", hash = "sha256:d204c423ec436f2545341ec8a0e026ae033b3ce5911644f95e94d6b887cf631c"}, + {file = "catalogue-2.0.10-py3-none-any.whl", hash = "sha256:58c2de0020aa90f4a2da7dfad161bf7b3b054c86a5f09fcedc0b2b740c109a9f"}, + {file = "catalogue-2.0.10.tar.gz", hash = "sha256:4f56daa940913d3f09d589c191c74e5a6d51762b3a9e37dd53b7437afd6cda15"}, ] [[package]] @@ -505,75 +427,63 @@ files = [ [[package]] name = "cffi" -version = "1.15.1" +version = "1.16.0" description = "Foreign Function Interface for Python calling C code." optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, - {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, - {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, - {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, - {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, - {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, - {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, - {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, - {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, - {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, - {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, - {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, - {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, - {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, - {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, - {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, - {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, - {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, - {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, + {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, + {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, + {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, + {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, + {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, + {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, + {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, + {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, + {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, + {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, + {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, + {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, + {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, ] [package.dependencies] @@ -581,86 +491,101 @@ pycparser = "*" [[package]] name = "charset-normalizer" -version = "3.2.0" +version = "3.3.2" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7.0" files = [ - {file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, - {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, ] [[package]] @@ -690,58 +615,43 @@ files = [ [[package]] name = "comm" -version = "0.1.4" +version = "0.2.0" description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "comm-0.1.4-py3-none-any.whl", hash = "sha256:6d52794cba11b36ed9860999cd10fd02d6b2eac177068fdd585e1e2f8a96e67a"}, - {file = "comm-0.1.4.tar.gz", hash = "sha256:354e40a59c9dd6db50c5cc6b4acc887d82e9603787f83b68c01a80a923984d15"}, + {file = "comm-0.2.0-py3-none-any.whl", hash = "sha256:2da8d9ebb8dd7bfc247adaff99f24dce705638a8042b85cb995066793e391001"}, + {file = "comm-0.2.0.tar.gz", hash = "sha256:a517ea2ca28931c7007a7a99c562a0fa5883cfb48963140cf642c41c948498be"}, ] [package.dependencies] traitlets = ">=4" [package.extras] -lint = ["black (>=22.6.0)", "mdformat (>0.7)", "mdformat-gfm (>=0.3.5)", "ruff (>=0.0.156)"] test = ["pytest"] -typing = ["mypy (>=0.990)"] - -[[package]] -name = "croniter" -version = "1.4.1" -description = "croniter provides iteration for datetime object with cron like format" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "croniter-1.4.1-py2.py3-none-any.whl", hash = "sha256:9595da48af37ea06ec3a9f899738f1b2c1c13da3c38cea606ef7cd03ea421128"}, - {file = "croniter-1.4.1.tar.gz", hash = "sha256:1a6df60eacec3b7a0aa52a8f2ef251ae3dd2a7c7c8b9874e73e791636d55a361"}, -] - -[package.dependencies] -python-dateutil = "*" [[package]] name = "datasets" -version = "2.14.5" +version = "2.15.0" description = "HuggingFace community-driven open-source library of datasets" optional = false python-versions = ">=3.8.0" files = [ - {file = "datasets-2.14.5-py3-none-any.whl", hash = "sha256:dd4155091034cba04d5a28711f2ed3944275ed15c5d0c5a2d0b6b9ea34a2bdfe"}, - {file = "datasets-2.14.5.tar.gz", hash = "sha256:b738a86540ab8e1a7806c8a3790b67be0056318d0c5d5a58a1b0dbdd76c0f568"}, + {file = "datasets-2.15.0-py3-none-any.whl", hash = "sha256:6d658d23811393dfc982d026082e1650bdaaae28f6a86e651966cb072229a228"}, + {file = "datasets-2.15.0.tar.gz", hash = "sha256:a26d059370bd7503bd60e9337977199a13117a83f72fb61eda7e66f0c4d50b2b"}, ] [package.dependencies] aiohttp = "*" dill = ">=0.3.0,<0.3.8" -fsspec = {version = ">=2023.1.0,<2023.9.0", extras = ["http"]} -huggingface-hub = ">=0.14.0,<1.0.0" +fsspec = {version = ">=2023.1.0,<=2023.10.0", extras = ["http"]} +huggingface-hub = ">=0.18.0" multiprocess = "*" numpy = ">=1.17" packaging = "*" pandas = "*" pyarrow = ">=8.0.0" +pyarrow-hotfix = "*" pyyaml = ">=5.1" requests = ">=2.19.0" tqdm = ">=4.62.1" @@ -751,33 +661,18 @@ xxhash = "*" apache-beam = ["apache-beam (>=2.26.0,<2.44.0)"] audio = ["librosa", "soundfile (>=0.12.1)"] benchmarks = ["tensorflow (==2.12.0)", "torch (==2.0.1)", "transformers (==4.30.1)"] -dev = ["Pillow (>=6.2.1)", "absl-py", "apache-beam (>=2.26.0,<2.44.0)", "black (>=23.1,<24.0)", "elasticsearch (<8.0.0)", "faiss-cpu (>=1.6.4)", "joblib (<1.3.0)", "joblibspark", "librosa", "lz4", "py7zr", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "pyyaml (>=5.3.1)", "rarfile (>=4.0)", "ruff (>=0.0.241)", "s3fs", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "sqlalchemy (<2.0.0)", "tensorflow (>=2.2.0,!=2.6.0,!=2.6.1)", "tensorflow (>=2.3,!=2.6.0,!=2.6.1)", "tensorflow-macos", "tiktoken", "torch", "transformers", "zstandard"] +dev = ["Pillow (>=6.2.1)", "absl-py", "apache-beam (>=2.26.0,<2.44.0)", "black (>=23.1,<24.0)", "elasticsearch (<8.0.0)", "faiss-cpu (>=1.6.4)", "jax (>=0.3.14)", "jaxlib (>=0.3.14)", "joblib (<1.3.0)", "joblibspark", "librosa", "lz4", "py7zr", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "pyyaml (>=5.3.1)", "rarfile (>=4.0)", "ruff (>=0.0.241)", "s3fs", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "sqlalchemy (<2.0.0)", "tensorflow (>=2.2.0,!=2.6.0,!=2.6.1)", "tensorflow (>=2.3,!=2.6.0,!=2.6.1)", "tensorflow-macos", "tiktoken", "torch", "transformers", "typing-extensions (>=4.6.1)", "zstandard"] docs = ["s3fs", "tensorflow (>=2.2.0,!=2.6.0,!=2.6.1)", "tensorflow-macos", "torch", "transformers"] -jax = ["jax (>=0.2.8,!=0.3.2,<=0.3.25)", "jaxlib (>=0.1.65,<=0.3.25)"] +jax = ["jax (>=0.3.14)", "jaxlib (>=0.3.14)"] metrics-tests = ["Werkzeug (>=1.0.1)", "accelerate", "bert-score (>=0.3.6)", "jiwer", "langdetect", "mauve-text", "nltk", "requests-file (>=1.5.1)", "rouge-score", "sacrebleu", "sacremoses", "scikit-learn", "scipy", "sentencepiece", "seqeval", "six (>=1.15.0,<1.16.0)", "spacy (>=3.0.0)", "texttable (>=1.6.3)", "tldextract", "tldextract (>=3.1.0)", "toml (>=0.10.1)", "typer (<0.5.0)"] quality = ["black (>=23.1,<24.0)", "pyyaml (>=5.3.1)", "ruff (>=0.0.241)"] s3 = ["s3fs"] tensorflow = ["tensorflow (>=2.2.0,!=2.6.0,!=2.6.1)", "tensorflow-macos"] tensorflow-gpu = ["tensorflow-gpu (>=2.2.0,!=2.6.0,!=2.6.1)"] -tests = ["Pillow (>=6.2.1)", "absl-py", "apache-beam (>=2.26.0,<2.44.0)", "elasticsearch (<8.0.0)", "faiss-cpu (>=1.6.4)", "joblib (<1.3.0)", "joblibspark", "librosa", "lz4", "py7zr", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "sqlalchemy (<2.0.0)", "tensorflow (>=2.3,!=2.6.0,!=2.6.1)", "tensorflow-macos", "tiktoken", "torch", "transformers", "zstandard"] +tests = ["Pillow (>=6.2.1)", "absl-py", "apache-beam (>=2.26.0,<2.44.0)", "elasticsearch (<8.0.0)", "faiss-cpu (>=1.6.4)", "jax (>=0.3.14)", "jaxlib (>=0.3.14)", "joblib (<1.3.0)", "joblibspark", "librosa", "lz4", "py7zr", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "sqlalchemy (<2.0.0)", "tensorflow (>=2.3,!=2.6.0,!=2.6.1)", "tensorflow-macos", "tiktoken", "torch", "transformers", "typing-extensions (>=4.6.1)", "zstandard"] torch = ["torch"] vision = ["Pillow (>=6.2.1)"] -[[package]] -name = "dateutils" -version = "0.6.12" -description = "Various utilities for working with date and datetime objects" -optional = false -python-versions = "*" -files = [ - {file = "dateutils-0.6.12-py2.py3-none-any.whl", hash = "sha256:f33b6ab430fa4166e7e9cb8b21ee9f6c9843c48df1a964466f52c79b2a8d53b3"}, - {file = "dateutils-0.6.12.tar.gz", hash = "sha256:03dd90bcb21541bd4eb4b013637e4f1b5f944881c46cc6e4b67a6059e370e3f1"}, -] - -[package.dependencies] -python-dateutil = "*" -pytz = "*" - [[package]] name = "debugpy" version = "1.8.0" @@ -816,24 +711,6 @@ files = [ {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, ] -[[package]] -name = "deepdiff" -version = "6.5.0" -description = "Deep Difference and Search of any Python object/data. Recreate objects by adding adding deltas to each other." -optional = false -python-versions = ">=3.7" -files = [ - {file = "deepdiff-6.5.0-py3-none-any.whl", hash = "sha256:acdc1651a3e802415e0337b7e1192df5cd7c17b72fbab480466fdd799b9a72e7"}, - {file = "deepdiff-6.5.0.tar.gz", hash = "sha256:080b1359d6128f3f5f1738c6be3064f0ad9b0cc41994aa90a028065f6ad11f25"}, -] - -[package.dependencies] -ordered-set = ">=4.0.2,<4.2.0" - -[package.extras] -cli = ["click (==8.1.3)", "pyyaml (==6.0.1)"] -optimize = ["orjson"] - [[package]] name = "defusedxml" version = "0.7.1" @@ -900,47 +777,27 @@ test = ["pytest (>=6)"] [[package]] name = "executing" -version = "1.2.0" +version = "2.0.1" description = "Get the currently executing AST node of a frame, and other information" optional = false -python-versions = "*" -files = [ - {file = "executing-1.2.0-py2.py3-none-any.whl", hash = "sha256:0314a69e37426e3608aada02473b4161d4caf5a4b244d1d0c48072b8fee7bacc"}, - {file = "executing-1.2.0.tar.gz", hash = "sha256:19da64c18d2d851112f09c287f8d3dbbdf725ab0e569077efb6cdcbd3497c107"}, -] - -[package.extras] -tests = ["asttokens", "littleutils", "pytest", "rich"] - -[[package]] -name = "fastapi" -version = "0.103.1" -description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" -optional = false -python-versions = ">=3.7" +python-versions = ">=3.5" files = [ - {file = "fastapi-0.103.1-py3-none-any.whl", hash = "sha256:5e5f17e826dbd9e9b5a5145976c5cd90bcaa61f2bf9a69aca423f2bcebe44d83"}, - {file = "fastapi-0.103.1.tar.gz", hash = "sha256:345844e6a82062f06a096684196aaf96c1198b25c06b72c1311b882aa2d8a35d"}, + {file = "executing-2.0.1-py2.py3-none-any.whl", hash = "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc"}, + {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"}, ] -[package.dependencies] -anyio = ">=3.7.1,<4.0.0" -pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.1.0 || >2.1.0,<3.0.0" -starlette = ">=0.27.0,<0.28.0" -typing-extensions = ">=4.5.0" - [package.extras] -all = ["email-validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.5)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] +tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] [[package]] name = "fastjsonschema" -version = "2.18.0" +version = "2.19.0" description = "Fastest Python implementation of JSON schema" optional = false python-versions = "*" files = [ - {file = "fastjsonschema-2.18.0-py3-none-any.whl", hash = "sha256:128039912a11a807068a7c87d0da36660afbfd7202780db26c4aa7153cfdc799"}, - {file = "fastjsonschema-2.18.0.tar.gz", hash = "sha256:e820349dd16f806e4bd1467a138dced9def4bc7d6213a34295272a6cac95b5bd"}, + {file = "fastjsonschema-2.19.0-py3-none-any.whl", hash = "sha256:b9fd1a2dd6971dbc7fee280a95bd199ae0dd9ce22beb91cc75e9c1c528a5170e"}, + {file = "fastjsonschema-2.19.0.tar.gz", hash = "sha256:e25df6647e1bc4a26070b700897b07b542ec898dd4f1f6ea013e7f6a88417225"}, ] [package.extras] @@ -948,21 +805,35 @@ devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benc [[package]] name = "filelock" -version = "3.12.3" +version = "3.13.1" description = "A platform independent file lock." optional = false python-versions = ">=3.8" files = [ - {file = "filelock-3.12.3-py3-none-any.whl", hash = "sha256:f067e40ccc40f2b48395a80fcbd4728262fab54e232e090a4063ab804179efeb"}, - {file = "filelock-3.12.3.tar.gz", hash = "sha256:0ecc1dd2ec4672a10c8550a8182f1bd0c0a5088470ecd5a125e45f49472fac3d"}, + {file = "filelock-3.13.1-py3-none-any.whl", hash = "sha256:57dbda9b35157b05fb3e58ee91448612eb674172fab98ee235ccb0b5bee19a1c"}, + {file = "filelock-3.13.1.tar.gz", hash = "sha256:521f5f56c50f8426f5e03ad3b281b490a87ef15bc6c526f168290f0c7148d44e"}, ] -[package.dependencies] -typing-extensions = {version = ">=4.7.1", markers = "python_version < \"3.11\""} - [package.extras] -docs = ["furo (>=2023.7.26)", "sphinx (>=7.1.2)", "sphinx-autodoc-typehints (>=1.24)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.3)", "diff-cover (>=7.7)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)", "pytest-timeout (>=2.1)"] +docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.24)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] +typing = ["typing-extensions (>=4.8)"] + +[[package]] +name = "flake8" +version = "6.1.0" +description = "the modular source code checker: pep8 pyflakes and co" +optional = false +python-versions = ">=3.8.1" +files = [ + {file = "flake8-6.1.0-py2.py3-none-any.whl", hash = "sha256:ffdfce58ea94c6580c77888a86506937f9a1a227dfcd15f245d694ae20a6b6e5"}, + {file = "flake8-6.1.0.tar.gz", hash = "sha256:d5b3857f07c030bdb5bf41c7f53799571d75c4491748a3adcd47de929e34cd23"}, +] + +[package.dependencies] +mccabe = ">=0.7.0,<0.8.0" +pycodestyle = ">=2.11.0,<2.12.0" +pyflakes = ">=3.1.0,<3.2.0" [[package]] name = "fqdn" @@ -1047,13 +918,13 @@ files = [ [[package]] name = "fsspec" -version = "2023.6.0" +version = "2023.10.0" description = "File-system specification" optional = false python-versions = ">=3.8" files = [ - {file = "fsspec-2023.6.0-py3-none-any.whl", hash = "sha256:1cbad1faef3e391fba6dc005ae9b5bdcbf43005c9167ce78c915549c352c869a"}, - {file = "fsspec-2023.6.0.tar.gz", hash = "sha256:d0b2f935446169753e7a5c5c55681c54ea91996cc67be93c39a154fb3a2742af"}, + {file = "fsspec-2023.10.0-py3-none-any.whl", hash = "sha256:346a8f024efeb749d2a5fca7ba8854474b1ff9af7c3faaf636a4548781136529"}, + {file = "fsspec-2023.10.0.tar.gz", hash = "sha256:330c66757591df346ad3091a53bd907e15348c2ba17d63fd54f5c39c4457d2a5"}, ] [package.dependencies] @@ -1086,13 +957,13 @@ tqdm = ["tqdm"] [[package]] name = "gitdb" -version = "4.0.10" +version = "4.0.11" description = "Git Object Database" optional = false python-versions = ">=3.7" files = [ - {file = "gitdb-4.0.10-py3-none-any.whl", hash = "sha256:c286cf298426064079ed96a9e4a9d39e7f3e9bf15ba60701e95f5492f28415c7"}, - {file = "gitdb-4.0.10.tar.gz", hash = "sha256:6eb990b69df4e15bad899ea868dc46572c3f75339735663b81de79b06f17eb9a"}, + {file = "gitdb-4.0.11-py3-none-any.whl", hash = "sha256:81a3407ddd2ee8df444cbacea00e2d038e40150acfa3001696fe0dcf1d3adfa4"}, + {file = "gitdb-4.0.11.tar.gz", hash = "sha256:bf5421126136d6d0af55bc1e7c1af1c397a34f5b7bd79e776cd3e89785c2b04b"}, ] [package.dependencies] @@ -1100,37 +971,36 @@ smmap = ">=3.0.1,<6" [[package]] name = "gitpython" -version = "3.1.36" +version = "3.1.40" description = "GitPython is a Python library used to interact with Git repositories" optional = false python-versions = ">=3.7" files = [ - {file = "GitPython-3.1.36-py3-none-any.whl", hash = "sha256:8d22b5cfefd17c79914226982bb7851d6ade47545b1735a9d010a2a4c26d8388"}, - {file = "GitPython-3.1.36.tar.gz", hash = "sha256:4bb0c2a6995e85064140d31a33289aa5dce80133a23d36fcd372d716c54d3ebf"}, + {file = "GitPython-3.1.40-py3-none-any.whl", hash = "sha256:cf14627d5a8049ffbf49915732e5eddbe8134c3bdb9d476e6182b676fc573f8a"}, + {file = "GitPython-3.1.40.tar.gz", hash = "sha256:22b126e9ffb671fdd0c129796343a02bf67bf2994b35449ffc9321aa755e18a4"}, ] [package.dependencies] gitdb = ">=4.0.1,<5" [package.extras] -test = ["black", "coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mypy", "pre-commit", "pytest", "pytest-cov", "pytest-sugar", "virtualenv"] +test = ["black", "coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", "pytest", "pytest-cov", "pytest-instafail", "pytest-subtests", "pytest-sugar"] [[package]] name = "google-auth" -version = "2.23.0" +version = "2.23.4" description = "Google Authentication Library" optional = false python-versions = ">=3.7" files = [ - {file = "google-auth-2.23.0.tar.gz", hash = "sha256:753a26312e6f1eaeec20bc6f2644a10926697da93446e1f8e24d6d32d45a922a"}, - {file = "google_auth-2.23.0-py2.py3-none-any.whl", hash = "sha256:2cec41407bd1e207f5b802638e32bb837df968bb5c05f413d0fa526fac4cf7a7"}, + {file = "google-auth-2.23.4.tar.gz", hash = "sha256:79905d6b1652187def79d491d6e23d0cbb3a21d3c7ba0dbaa9c8a01906b13ff3"}, + {file = "google_auth-2.23.4-py2.py3-none-any.whl", hash = "sha256:d4bbc92fe4b8bfd2f3e8d88e5ba7085935da208ee38a134fc280e7ce682a05f2"}, ] [package.dependencies] cachetools = ">=2.0.0,<6.0" pyasn1-modules = ">=0.2.1" rsa = ">=3.1.4,<5" -urllib3 = "<2.0" [package.extras] aiohttp = ["aiohttp (>=3.6.2,<4.0.0.dev0)", "requests (>=2.20.0,<3.0.0.dev0)"] @@ -1141,13 +1011,13 @@ requests = ["requests (>=2.20.0,<3.0.0.dev0)"] [[package]] name = "google-auth-oauthlib" -version = "1.0.0" +version = "1.1.0" description = "Google Authentication Library" optional = false python-versions = ">=3.6" files = [ - {file = "google-auth-oauthlib-1.0.0.tar.gz", hash = "sha256:e375064964820b47221a7e1b7ee1fd77051b6323c3f9e3e19785f78ab67ecfc5"}, - {file = "google_auth_oauthlib-1.0.0-py2.py3-none-any.whl", hash = "sha256:95880ca704928c300f48194d1770cf5b1462835b6e49db61445a520f793fd5fb"}, + {file = "google-auth-oauthlib-1.1.0.tar.gz", hash = "sha256:83ea8c3b0881e453790baff4448e8a6112ac8778d1de9da0b68010b843937afb"}, + {file = "google_auth_oauthlib-1.1.0-py2.py3-none-any.whl", hash = "sha256:089c6e587d36f4803ac7e0720c045c6a8b1fd1790088b8424975b90d0ee61c12"}, ] [package.dependencies] @@ -1159,76 +1029,74 @@ tool = ["click (>=6.0.0)"] [[package]] name = "grpcio" -version = "1.58.0" +version = "1.59.3" description = "HTTP/2-based RPC framework" optional = false python-versions = ">=3.7" files = [ - {file = "grpcio-1.58.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:3e6bebf1dfdbeb22afd95650e4f019219fef3ab86d3fca8ebade52e4bc39389a"}, - {file = "grpcio-1.58.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:cde11577d5b6fd73a00e6bfa3cf5f428f3f33c2d2878982369b5372bbc4acc60"}, - {file = "grpcio-1.58.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:a2d67ff99e70e86b2be46c1017ae40b4840d09467d5455b2708de6d4c127e143"}, - {file = "grpcio-1.58.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1ed979b273a81de36fc9c6716d9fb09dd3443efa18dcc8652501df11da9583e9"}, - {file = "grpcio-1.58.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:458899d2ebd55d5ca2350fd3826dfd8fcb11fe0f79828ae75e2b1e6051d50a29"}, - {file = "grpcio-1.58.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bc7ffef430b80345729ff0a6825e9d96ac87efe39216e87ac58c6c4ef400de93"}, - {file = "grpcio-1.58.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5b23d75e5173faa3d1296a7bedffb25afd2fddb607ef292dfc651490c7b53c3d"}, - {file = "grpcio-1.58.0-cp310-cp310-win32.whl", hash = "sha256:fad9295fe02455d4f158ad72c90ef8b4bcaadfdb5efb5795f7ab0786ad67dd58"}, - {file = "grpcio-1.58.0-cp310-cp310-win_amd64.whl", hash = "sha256:bc325fed4d074367bebd465a20763586e5e1ed5b943e9d8bc7c162b1f44fd602"}, - {file = "grpcio-1.58.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:652978551af02373a5a313e07bfef368f406b5929cf2d50fa7e4027f913dbdb4"}, - {file = "grpcio-1.58.0-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:9f13a171281ebb4d7b1ba9f06574bce2455dcd3f2f6d1fbe0fd0d84615c74045"}, - {file = "grpcio-1.58.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:8774219e21b05f750eef8adc416e9431cf31b98f6ce9def288e4cea1548cbd22"}, - {file = "grpcio-1.58.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09206106848462763f7f273ca93d2d2d4d26cab475089e0de830bb76be04e9e8"}, - {file = "grpcio-1.58.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62831d5e251dd7561d9d9e83a0b8655084b2a1f8ea91e4bd6b3cedfefd32c9d2"}, - {file = "grpcio-1.58.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:212f38c6a156862098f6bdc9a79bf850760a751d259d8f8f249fc6d645105855"}, - {file = "grpcio-1.58.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4b12754af201bb993e6e2efd7812085ddaaef21d0a6f0ff128b97de1ef55aa4a"}, - {file = "grpcio-1.58.0-cp311-cp311-win32.whl", hash = "sha256:3886b4d56bd4afeac518dbc05933926198aa967a7d1d237a318e6fbc47141577"}, - {file = "grpcio-1.58.0-cp311-cp311-win_amd64.whl", hash = "sha256:002f228d197fea12797a14e152447044e14fb4fdb2eb5d6cfa496f29ddbf79ef"}, - {file = "grpcio-1.58.0-cp37-cp37m-linux_armv7l.whl", hash = "sha256:b5e8db0aff0a4819946215f156bd722b6f6c8320eb8419567ffc74850c9fd205"}, - {file = "grpcio-1.58.0-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:201e550b7e2ede113b63e718e7ece93cef5b0fbf3c45e8fe4541a5a4305acd15"}, - {file = "grpcio-1.58.0-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:d79b660681eb9bc66cc7cbf78d1b1b9e335ee56f6ea1755d34a31108b80bd3c8"}, - {file = "grpcio-1.58.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ef8d4a76d2c7d8065aba829f8d0bc0055495c998dce1964ca5b302d02514fb3"}, - {file = "grpcio-1.58.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6cba491c638c76d3dc6c191d9c75041ca5b8f5c6de4b8327ecdcab527f130bb4"}, - {file = "grpcio-1.58.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:6801ff6652ecd2aae08ef994a3e49ff53de29e69e9cd0fd604a79ae4e545a95c"}, - {file = "grpcio-1.58.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:24edec346e69e672daf12b2c88e95c6f737f3792d08866101d8c5f34370c54fd"}, - {file = "grpcio-1.58.0-cp37-cp37m-win_amd64.whl", hash = "sha256:7e473a7abad9af48e3ab5f3b5d237d18208024d28ead65a459bd720401bd2f8f"}, - {file = "grpcio-1.58.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:4891bbb4bba58acd1d620759b3be11245bfe715eb67a4864c8937b855b7ed7fa"}, - {file = "grpcio-1.58.0-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:e9f995a8a421405958ff30599b4d0eec244f28edc760de82f0412c71c61763d2"}, - {file = "grpcio-1.58.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:2f85f87e2f087d9f632c085b37440a3169fda9cdde80cb84057c2fc292f8cbdf"}, - {file = "grpcio-1.58.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb6b92036ff312d5b4182fa72e8735d17aceca74d0d908a7f08e375456f03e07"}, - {file = "grpcio-1.58.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d81c2b2b24c32139dd2536972f1060678c6b9fbd106842a9fcdecf07b233eccd"}, - {file = "grpcio-1.58.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:fbcecb6aedd5c1891db1d70efbfbdc126c986645b5dd616a045c07d6bd2dfa86"}, - {file = "grpcio-1.58.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:92ae871a902cf19833328bd6498ec007b265aabf2fda845ab5bd10abcaf4c8c6"}, - {file = "grpcio-1.58.0-cp38-cp38-win32.whl", hash = "sha256:dc72e04620d49d3007771c0e0348deb23ca341c0245d610605dddb4ac65a37cb"}, - {file = "grpcio-1.58.0-cp38-cp38-win_amd64.whl", hash = "sha256:1c1c5238c6072470c7f1614bf7c774ffde6b346a100521de9ce791d1e4453afe"}, - {file = "grpcio-1.58.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:fe643af248442221db027da43ed43e53b73e11f40c9043738de9a2b4b6ca7697"}, - {file = "grpcio-1.58.0-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:128eb1f8e70676d05b1b0c8e6600320fc222b3f8c985a92224248b1367122188"}, - {file = "grpcio-1.58.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:039003a5e0ae7d41c86c768ef8b3ee2c558aa0a23cf04bf3c23567f37befa092"}, - {file = "grpcio-1.58.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8f061722cad3f9aabb3fbb27f3484ec9d4667b7328d1a7800c3c691a98f16bb0"}, - {file = "grpcio-1.58.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba0af11938acf8cd4cf815c46156bcde36fa5850518120920d52620cc3ec1830"}, - {file = "grpcio-1.58.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d4cef77ad2fed42b1ba9143465856d7e737279854e444925d5ba45fc1f3ba727"}, - {file = "grpcio-1.58.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:24765a627eb4d9288ace32d5104161c3654128fe27f2808ecd6e9b0cfa7fc8b9"}, - {file = "grpcio-1.58.0-cp39-cp39-win32.whl", hash = "sha256:f0241f7eb0d2303a545136c59bc565a35c4fc3b924ccbd69cb482f4828d6f31c"}, - {file = "grpcio-1.58.0-cp39-cp39-win_amd64.whl", hash = "sha256:dcfba7befe3a55dab6fe1eb7fc9359dc0c7f7272b30a70ae0af5d5b063842f28"}, - {file = "grpcio-1.58.0.tar.gz", hash = "sha256:532410c51ccd851b706d1fbc00a87be0f5312bd6f8e5dbf89d4e99c7f79d7499"}, + {file = "grpcio-1.59.3-cp310-cp310-linux_armv7l.whl", hash = "sha256:aca028a6c7806e5b61e5f9f4232432c52856f7fcb98e330b20b6bc95d657bdcc"}, + {file = "grpcio-1.59.3-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:19ad26a7967f7999c8960d2b9fe382dae74c55b0c508c613a6c2ba21cddf2354"}, + {file = "grpcio-1.59.3-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:72b71dad2a3d1650e69ad42a5c4edbc59ee017f08c32c95694172bc501def23c"}, + {file = "grpcio-1.59.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c0f0a11d82d0253656cc42e04b6a149521e02e755fe2e4edd21123de610fd1d4"}, + {file = "grpcio-1.59.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60cddafb70f9a2c81ba251b53b4007e07cca7389e704f86266e22c4bffd8bf1d"}, + {file = "grpcio-1.59.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6c75a1fa0e677c1d2b6d4196ad395a5c381dfb8385f07ed034ef667cdcdbcc25"}, + {file = "grpcio-1.59.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e1d8e01438d5964a11167eec1edb5f85ed8e475648f36c834ed5db4ffba24ac8"}, + {file = "grpcio-1.59.3-cp310-cp310-win32.whl", hash = "sha256:c4b0076f0bf29ee62335b055a9599f52000b7941f577daa001c7ef961a1fbeab"}, + {file = "grpcio-1.59.3-cp310-cp310-win_amd64.whl", hash = "sha256:b1f00a3e6e0c3dccccffb5579fc76ebfe4eb40405ba308505b41ef92f747746a"}, + {file = "grpcio-1.59.3-cp311-cp311-linux_armv7l.whl", hash = "sha256:3996aaa21231451161dc29df6a43fcaa8b332042b6150482c119a678d007dd86"}, + {file = "grpcio-1.59.3-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:cb4e9cbd9b7388fcb06412da9f188c7803742d06d6f626304eb838d1707ec7e3"}, + {file = "grpcio-1.59.3-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:8022ca303d6c694a0d7acfb2b472add920217618d3a99eb4b14edc7c6a7e8fcf"}, + {file = "grpcio-1.59.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b36683fad5664283755a7f4e2e804e243633634e93cd798a46247b8e54e3cb0d"}, + {file = "grpcio-1.59.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8239b853226e4824e769517e1b5232e7c4dda3815b200534500338960fcc6118"}, + {file = "grpcio-1.59.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:0511af8653fbda489ff11d542a08505d56023e63cafbda60e6e00d4e0bae86ea"}, + {file = "grpcio-1.59.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e78dc982bda74cef2ddfce1c91d29b96864c4c680c634e279ed204d51e227473"}, + {file = "grpcio-1.59.3-cp311-cp311-win32.whl", hash = "sha256:6a5c3a96405966c023e139c3bcccb2c7c776a6f256ac6d70f8558c9041bdccc3"}, + {file = "grpcio-1.59.3-cp311-cp311-win_amd64.whl", hash = "sha256:ed26826ee423b11477297b187371cdf4fa1eca874eb1156422ef3c9a60590dd9"}, + {file = "grpcio-1.59.3-cp312-cp312-linux_armv7l.whl", hash = "sha256:45dddc5cb5227d30fa43652d8872dc87f086d81ab4b500be99413bad0ae198d7"}, + {file = "grpcio-1.59.3-cp312-cp312-macosx_10_10_universal2.whl", hash = "sha256:1736496d74682e53dd0907fd515f2694d8e6a96c9a359b4080b2504bf2b2d91b"}, + {file = "grpcio-1.59.3-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:ddbd1a16138e52e66229047624de364f88a948a4d92ba20e4e25ad7d22eef025"}, + {file = "grpcio-1.59.3-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fcfa56f8d031ffda902c258c84c4b88707f3a4be4827b4e3ab8ec7c24676320d"}, + {file = "grpcio-1.59.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2eb8f0c7c0c62f7a547ad7a91ba627a5aa32a5ae8d930783f7ee61680d7eb8d"}, + {file = "grpcio-1.59.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8d993399cc65e3a34f8fd48dd9ad7a376734564b822e0160dd18b3d00c1a33f9"}, + {file = "grpcio-1.59.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c0bd141f4f41907eb90bda74d969c3cb21c1c62779419782a5b3f5e4b5835718"}, + {file = "grpcio-1.59.3-cp312-cp312-win32.whl", hash = "sha256:33b8fd65d4e97efa62baec6171ce51f9cf68f3a8ba9f866f4abc9d62b5c97b79"}, + {file = "grpcio-1.59.3-cp312-cp312-win_amd64.whl", hash = "sha256:0e735ed002f50d4f3cb9ecfe8ac82403f5d842d274c92d99db64cfc998515e07"}, + {file = "grpcio-1.59.3-cp37-cp37m-linux_armv7l.whl", hash = "sha256:ea40ce4404e7cca0724c91a7404da410f0144148fdd58402a5942971e3469b94"}, + {file = "grpcio-1.59.3-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:83113bcc393477b6f7342b9f48e8a054330c895205517edc66789ceea0796b53"}, + {file = "grpcio-1.59.3-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:73afbac602b8f1212a50088193601f869b5073efa9855b3e51aaaec97848fc8a"}, + {file = "grpcio-1.59.3-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:575d61de1950b0b0699917b686b1ca108690702fcc2df127b8c9c9320f93e069"}, + {file = "grpcio-1.59.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cd76057b5c9a4d68814610ef9226925f94c1231bbe533fdf96f6181f7d2ff9e"}, + {file = "grpcio-1.59.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:95d6fd804c81efe4879e38bfd84d2b26e339a0a9b797e7615e884ef4686eb47b"}, + {file = "grpcio-1.59.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0d42048b8a3286ea4134faddf1f9a59cf98192b94aaa10d910a25613c5eb5bfb"}, + {file = "grpcio-1.59.3-cp37-cp37m-win_amd64.whl", hash = "sha256:4619fea15c64bcdd9d447cdbdde40e3d5f1da3a2e8ae84103d94a9c1df210d7e"}, + {file = "grpcio-1.59.3-cp38-cp38-linux_armv7l.whl", hash = "sha256:95b5506e70284ac03b2005dd9ffcb6708c9ae660669376f0192a710687a22556"}, + {file = "grpcio-1.59.3-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:9e17660947660ccfce56c7869032910c179a5328a77b73b37305cd1ee9301c2e"}, + {file = "grpcio-1.59.3-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:00912ce19914d038851be5cd380d94a03f9d195643c28e3ad03d355cc02ce7e8"}, + {file = "grpcio-1.59.3-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e58b3cadaa3c90f1efca26ba33e0d408b35b497307027d3d707e4bcd8de862a6"}, + {file = "grpcio-1.59.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d787ecadea865bdf78f6679f6f5bf4b984f18f659257ba612979df97a298b3c3"}, + {file = "grpcio-1.59.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0814942ba1bba269db4e760a34388640c601dece525c6a01f3b4ff030cc0db69"}, + {file = "grpcio-1.59.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fb111aa99d3180c361a35b5ae1e2c63750220c584a1344229abc139d5c891881"}, + {file = "grpcio-1.59.3-cp38-cp38-win32.whl", hash = "sha256:eb8ba504c726befe40a356ecbe63c6c3c64c9a439b3164f5a718ec53c9874da0"}, + {file = "grpcio-1.59.3-cp38-cp38-win_amd64.whl", hash = "sha256:cdbc6b32fadab9bebc6f49d3e7ec4c70983c71e965497adab7f87de218e84391"}, + {file = "grpcio-1.59.3-cp39-cp39-linux_armv7l.whl", hash = "sha256:c82ca1e4be24a98a253d6dbaa216542e4163f33f38163fc77964b0f0d255b552"}, + {file = "grpcio-1.59.3-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:36636babfda14f9e9687f28d5b66d349cf88c1301154dc71c6513de2b6c88c59"}, + {file = "grpcio-1.59.3-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:5f9b2e591da751ac7fdd316cc25afafb7a626dededa9b414f90faad7f3ccebdb"}, + {file = "grpcio-1.59.3-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a93a82876a4926bf451db82ceb725bd87f42292bacc94586045261f501a86994"}, + {file = "grpcio-1.59.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce31fa0bfdd1f2bb15b657c16105c8652186eab304eb512e6ae3b99b2fdd7d13"}, + {file = "grpcio-1.59.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:16da0e40573962dab6cba16bec31f25a4f468e6d05b658e589090fe103b03e3d"}, + {file = "grpcio-1.59.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d1d1a17372fd425addd5812049fa7374008ffe689585f27f802d0935522cf4b7"}, + {file = "grpcio-1.59.3-cp39-cp39-win32.whl", hash = "sha256:52cc38a7241b5f7b4a91aaf9000fdd38e26bb00d5e8a71665ce40cfcee716281"}, + {file = "grpcio-1.59.3-cp39-cp39-win_amd64.whl", hash = "sha256:b491e5bbcad3020a96842040421e508780cade35baba30f402df9d321d1c423e"}, + {file = "grpcio-1.59.3.tar.gz", hash = "sha256:7800f99568a74a06ebdccd419dd1b6e639b477dcaf6da77ea702f8fb14ce5f80"}, ] [package.extras] -protobuf = ["grpcio-tools (>=1.58.0)"] - -[[package]] -name = "h11" -version = "0.14.0" -description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -optional = false -python-versions = ">=3.7" -files = [ - {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, - {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, -] +protobuf = ["grpcio-tools (>=1.59.3)"] [[package]] name = "hnswlib" version = "0.7.0" -description = "hnswlib" +description = "" optional = false python-versions = "*" files = [] @@ -1245,18 +1113,18 @@ resolved_reference = "359b2ba87358224963986f709e593d799064ace6" [[package]] name = "huggingface-hub" -version = "0.17.1" +version = "0.19.4" description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" optional = false python-versions = ">=3.8.0" files = [ - {file = "huggingface_hub-0.17.1-py3-none-any.whl", hash = "sha256:7a9dc262a2e0ecf8c1749c8b9a7510a7a22981849f561af4345942d421822451"}, - {file = "huggingface_hub-0.17.1.tar.gz", hash = "sha256:dd828d2a24ee6af86392042cc1052c482c053eb574864669f0cae4d29620e62c"}, + {file = "huggingface_hub-0.19.4-py3-none-any.whl", hash = "sha256:dba013f779da16f14b606492828f3760600a1e1801432d09fe1c33e50b825bb5"}, + {file = "huggingface_hub-0.19.4.tar.gz", hash = "sha256:176a4fc355a851c17550e7619488f383189727eab209534d7cef2114dae77b22"}, ] [package.dependencies] filelock = "*" -fsspec = "*" +fsspec = ">=2023.5.0" packaging = ">=20.9" pyyaml = ">=5.1" requests = "*" @@ -1264,17 +1132,17 @@ tqdm = ">=4.42.1" typing-extensions = ">=3.7.4.3" [package.extras] -all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "black (==23.7)", "gradio", "jedi", "mypy (==1.5.1)", "numpy", "pydantic (<2.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-vcr", "pytest-xdist", "ruff (>=0.0.241)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "urllib3 (<2.0)"] +all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "jedi", "mypy (==1.5.1)", "numpy", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-vcr", "pytest-xdist", "ruff (>=0.1.3)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] cli = ["InquirerPy (==0.3.4)"] -dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "black (==23.7)", "gradio", "jedi", "mypy (==1.5.1)", "numpy", "pydantic (<2.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-vcr", "pytest-xdist", "ruff (>=0.0.241)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "urllib3 (<2.0)"] -docs = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "black (==23.7)", "gradio", "hf-doc-builder", "jedi", "mypy (==1.5.1)", "numpy", "pydantic (<2.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-vcr", "pytest-xdist", "ruff (>=0.0.241)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "urllib3 (<2.0)", "watchdog"] +dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "jedi", "mypy (==1.5.1)", "numpy", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-vcr", "pytest-xdist", "ruff (>=0.1.3)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] +docs = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "hf-doc-builder", "jedi", "mypy (==1.5.1)", "numpy", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-vcr", "pytest-xdist", "ruff (>=0.1.3)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)", "watchdog"] fastai = ["fastai (>=2.4)", "fastcore (>=1.3.27)", "toml"] -inference = ["aiohttp", "pydantic (<2.0)"] -quality = ["black (==23.7)", "mypy (==1.5.1)", "ruff (>=0.0.241)"] +inference = ["aiohttp", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)"] +quality = ["mypy (==1.5.1)", "ruff (>=0.1.3)"] tensorflow = ["graphviz", "pydot", "tensorflow"] -testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "jedi", "numpy", "pydantic (<2.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"] +testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "jedi", "numpy", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"] torch = ["torch"] -typing = ["pydantic (<2.0)", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3"] +typing = ["types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)"] [[package]] name = "idna" @@ -1306,24 +1174,6 @@ docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker perf = ["ipython"] testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] -[[package]] -name = "importlib-resources" -version = "6.0.1" -description = "Read resources from Python packages" -optional = false -python-versions = ">=3.8" -files = [ - {file = "importlib_resources-6.0.1-py3-none-any.whl", hash = "sha256:134832a506243891221b88b4ae1213327eea96ceb4e407a00d790bb0626f45cf"}, - {file = "importlib_resources-6.0.1.tar.gz", hash = "sha256:4359457e42708462b9626a04657c6208ad799ceb41e5c58c57ffa0e6a098a5d4"}, -] - -[package.dependencies] -zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff"] - [[package]] name = "iniconfig" version = "2.0.0" @@ -1335,31 +1185,15 @@ files = [ {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, ] -[[package]] -name = "inquirer" -version = "3.1.3" -description = "Collection of common interactive command line user interfaces, based on Inquirer.js" -optional = false -python-versions = ">=3.8" -files = [ - {file = "inquirer-3.1.3-py3-none-any.whl", hash = "sha256:a7441fd74d06fcac4385218a1f5e8703f7a113f7944e01af47b8c58e84f95ce5"}, - {file = "inquirer-3.1.3.tar.gz", hash = "sha256:aac309406f5b49d4b8ab7c6872117f43bf082a552dc256aa16bc95e16bb58bec"}, -] - -[package.dependencies] -blessed = ">=1.19.0" -python-editor = ">=1.0.4" -readchar = ">=3.0.6" - [[package]] name = "ipykernel" -version = "6.25.2" +version = "6.26.0" description = "IPython Kernel for Jupyter" optional = false python-versions = ">=3.8" files = [ - {file = "ipykernel-6.25.2-py3-none-any.whl", hash = "sha256:2e2ee359baba19f10251b99415bb39de1e97d04e1fab385646f24f0596510b77"}, - {file = "ipykernel-6.25.2.tar.gz", hash = "sha256:f468ddd1f17acb48c8ce67fcfa49ba6d46d4f9ac0438c1f441be7c3d1372230b"}, + {file = "ipykernel-6.26.0-py3-none-any.whl", hash = "sha256:3ba3dc97424b87b31bb46586b5167b3161b32d7820b9201a9e698c71e271602c"}, + {file = "ipykernel-6.26.0.tar.gz", hash = "sha256:553856658eb8430bbe9653ea041a41bff63e9606fc4628873fc92a6cf3abd404"}, ] [package.dependencies] @@ -1386,24 +1220,23 @@ test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio" [[package]] name = "ipython" -version = "8.12.2" +version = "8.17.2" description = "IPython: Productive Interactive Computing" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "ipython-8.12.2-py3-none-any.whl", hash = "sha256:ea8801f15dfe4ffb76dea1b09b847430ffd70d827b41735c64a0638a04103bfc"}, - {file = "ipython-8.12.2.tar.gz", hash = "sha256:c7b80eb7f5a855a88efc971fda506ff7a91c280b42cdae26643e0f601ea281ea"}, + {file = "ipython-8.17.2-py3-none-any.whl", hash = "sha256:1e4d1d666a023e3c93585ba0d8e962867f7a111af322efff6b9c58062b3e5444"}, + {file = "ipython-8.17.2.tar.gz", hash = "sha256:126bb57e1895594bb0d91ea3090bbd39384f6fe87c3d57fd558d0670f50339bb"}, ] [package.dependencies] appnope = {version = "*", markers = "sys_platform == \"darwin\""} -backcall = "*" colorama = {version = "*", markers = "sys_platform == \"win32\""} decorator = "*" +exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} jedi = ">=0.16" matplotlib-inline = "*" pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} -pickleshare = "*" prompt-toolkit = ">=3.0.30,<3.0.37 || >3.0.37,<3.1.0" pygments = ">=2.4.0" stack-data = "*" @@ -1411,17 +1244,17 @@ traitlets = ">=5" typing-extensions = {version = "*", markers = "python_version < \"3.10\""} [package.extras] -all = ["black", "curio", "docrepr", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.21)", "pandas", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] +all = ["black", "curio", "docrepr", "exceptiongroup", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.22)", "pandas", "pickleshare", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio (<0.22)", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] black = ["black"] -doc = ["docrepr", "ipykernel", "matplotlib", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] +doc = ["docrepr", "exceptiongroup", "ipykernel", "matplotlib", "pickleshare", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio (<0.22)", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] kernel = ["ipykernel"] nbconvert = ["nbconvert"] nbformat = ["nbformat"] notebook = ["ipywidgets", "notebook"] parallel = ["ipyparallel"] qtconsole = ["qtconsole"] -test = ["pytest (<7.1)", "pytest-asyncio", "testpath"] -test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pandas", "pytest (<7.1)", "pytest-asyncio", "testpath", "trio"] +test = ["pickleshare", "pytest (<7.1)", "pytest-asyncio (<0.22)", "testpath"] +test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.22)", "pandas", "pickleshare", "pytest (<7.1)", "pytest-asyncio (<0.22)", "testpath", "trio"] [[package]] name = "ipython-genutils" @@ -1470,43 +1303,15 @@ files = [ [package.dependencies] arrow = ">=0.15.0" -[[package]] -name = "isort" -version = "5.12.0" -description = "A Python utility / library to sort Python imports." -optional = false -python-versions = ">=3.8.0" -files = [ - {file = "isort-5.12.0-py3-none-any.whl", hash = "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6"}, - {file = "isort-5.12.0.tar.gz", hash = "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504"}, -] - -[package.extras] -colors = ["colorama (>=0.4.3)"] -pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"] -plugins = ["setuptools"] -requirements-deprecated-finder = ["pip-api", "pipreqs"] - -[[package]] -name = "itsdangerous" -version = "2.1.2" -description = "Safely pass data to untrusted environments and back." -optional = false -python-versions = ">=3.7" -files = [ - {file = "itsdangerous-2.1.2-py3-none-any.whl", hash = "sha256:2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44"}, - {file = "itsdangerous-2.1.2.tar.gz", hash = "sha256:5dbbc68b317e5e42f327f9021763545dc3fc3bfe22e6deb96aaf1fc38874156a"}, -] - [[package]] name = "jedi" -version = "0.19.0" +version = "0.19.1" description = "An autocompletion tool for Python that can be used for text editors." optional = false python-versions = ">=3.6" files = [ - {file = "jedi-0.19.0-py2.py3-none-any.whl", hash = "sha256:cb8ce23fbccff0025e9386b5cf85e892f94c9b822378f8da49970471335ac64e"}, - {file = "jedi-0.19.0.tar.gz", hash = "sha256:bcf9894f1753969cbac8022a8c2eaee06bfa3724e4192470aaffe7eb6272b0c4"}, + {file = "jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"}, + {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"}, ] [package.dependencies] @@ -1515,7 +1320,7 @@ parso = ">=0.8.3,<0.9.0" [package.extras] docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] -testing = ["Django (<3.1)", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] +testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] [[package]] name = "jinja2" @@ -1534,20 +1339,6 @@ MarkupSafe = ">=2.0" [package.extras] i18n = ["Babel (>=2.7)"] -[[package]] -name = "jinxed" -version = "1.2.0" -description = "Jinxed Terminal Library" -optional = false -python-versions = "*" -files = [ - {file = "jinxed-1.2.0-py2.py3-none-any.whl", hash = "sha256:cfc2b2e4e3b4326954d546ba6d6b9a7a796ddcb0aef8d03161d005177eb0d48b"}, - {file = "jinxed-1.2.0.tar.gz", hash = "sha256:032acda92d5c57cd216033cbbd53de731e6ed50deb63eb4781336ca55f72cda5"}, -] - -[package.dependencies] -ansicon = {version = "*", markers = "platform_system == \"Windows\""} - [[package]] name = "joblib" version = "1.3.2" @@ -1586,24 +1377,22 @@ files = [ [[package]] name = "jsonschema" -version = "4.19.0" +version = "4.20.0" description = "An implementation of JSON Schema validation for Python" optional = false python-versions = ">=3.8" files = [ - {file = "jsonschema-4.19.0-py3-none-any.whl", hash = "sha256:043dc26a3845ff09d20e4420d6012a9c91c9aa8999fa184e7efcfeccb41e32cb"}, - {file = "jsonschema-4.19.0.tar.gz", hash = "sha256:6e1e7569ac13be8139b2dd2c21a55d350066ee3f80df06c608b398cdc6f30e8f"}, + {file = "jsonschema-4.20.0-py3-none-any.whl", hash = "sha256:ed6231f0429ecf966f5bc8dfef245998220549cbbcf140f913b7464c52c3b6b3"}, + {file = "jsonschema-4.20.0.tar.gz", hash = "sha256:4f614fd46d8d61258610998997743ec5492a648b33cf478c1ddc23ed4598a5fa"}, ] [package.dependencies] attrs = ">=22.2.0" fqdn = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} idna = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} -importlib-resources = {version = ">=1.4.0", markers = "python_version < \"3.9\""} isoduration = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} jsonpointer = {version = ">1.13", optional = true, markers = "extra == \"format-nongpl\""} jsonschema-specifications = ">=2023.03.6" -pkgutil-resolve-name = {version = ">=1.3.10", markers = "python_version < \"3.9\""} referencing = ">=0.28.4" rfc3339-validator = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} rfc3986-validator = {version = ">0.1.0", optional = true, markers = "extra == \"format-nongpl\""} @@ -1617,28 +1406,27 @@ format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339- [[package]] name = "jsonschema-specifications" -version = "2023.7.1" +version = "2023.11.1" description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" optional = false python-versions = ">=3.8" files = [ - {file = "jsonschema_specifications-2023.7.1-py3-none-any.whl", hash = "sha256:05adf340b659828a004220a9613be00fa3f223f2b82002e273dee62fd50524b1"}, - {file = "jsonschema_specifications-2023.7.1.tar.gz", hash = "sha256:c91a50404e88a1f6ba40636778e2ee08f6e24c5613fe4c53ac24578a5a7f72bb"}, + {file = "jsonschema_specifications-2023.11.1-py3-none-any.whl", hash = "sha256:f596778ab612b3fd29f72ea0d990393d0540a5aab18bf0407a46632eab540779"}, + {file = "jsonschema_specifications-2023.11.1.tar.gz", hash = "sha256:c9b234904ffe02f079bf91b14d79987faa685fd4b39c377a0996954c0090b9ca"}, ] [package.dependencies] -importlib-resources = {version = ">=1.4.0", markers = "python_version < \"3.9\""} -referencing = ">=0.28.0" +referencing = ">=0.31.0" [[package]] name = "jupyter-client" -version = "8.3.1" +version = "8.6.0" description = "Jupyter protocol implementation and client libraries" optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_client-8.3.1-py3-none-any.whl", hash = "sha256:5eb9f55eb0650e81de6b7e34308d8b92d04fe4ec41cd8193a913979e33d8e1a5"}, - {file = "jupyter_client-8.3.1.tar.gz", hash = "sha256:60294b2d5b869356c893f57b1a877ea6510d60d45cf4b38057f1672d85699ac9"}, + {file = "jupyter_client-8.6.0-py3-none-any.whl", hash = "sha256:909c474dbe62582ae62b758bca86d6518c85234bdee2d908c778db6d72f39d99"}, + {file = "jupyter_client-8.6.0.tar.gz", hash = "sha256:0642244bb83b4764ae60d07e010e15f0e2d275ec4e918a8f7b80fbbef3ca60c7"}, ] [package.dependencies] @@ -1655,13 +1443,13 @@ test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pyt [[package]] name = "jupyter-core" -version = "5.3.1" +version = "5.5.0" description = "Jupyter core package. A base package on which Jupyter projects rely." optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_core-5.3.1-py3-none-any.whl", hash = "sha256:ae9036db959a71ec1cac33081eeb040a79e681f08ab68b0883e9a676c7a90dce"}, - {file = "jupyter_core-5.3.1.tar.gz", hash = "sha256:5ba5c7938a7f97a6b0481463f7ff0dbac7c15ba48cf46fa4035ca6e838aa1aba"}, + {file = "jupyter_core-5.5.0-py3-none-any.whl", hash = "sha256:e11e02cd8ae0a9de5c6c44abf5727df9f2581055afe00b22183f621ba3585805"}, + {file = "jupyter_core-5.5.0.tar.gz", hash = "sha256:880b86053bf298a8724994f95e99b99130659022a4f7f45f563084b6223861d3"}, ] [package.dependencies] @@ -1670,18 +1458,18 @@ pywin32 = {version = ">=300", markers = "sys_platform == \"win32\" and platform_ traitlets = ">=5.3" [package.extras] -docs = ["myst-parser", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] [[package]] name = "jupyter-events" -version = "0.7.0" +version = "0.9.0" description = "Jupyter Event System library" optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_events-0.7.0-py3-none-any.whl", hash = "sha256:4753da434c13a37c3f3c89b500afa0c0a6241633441421f6adafe2fb2e2b924e"}, - {file = "jupyter_events-0.7.0.tar.gz", hash = "sha256:7be27f54b8388c03eefea123a4f79247c5b9381c49fb1cd48615ee191eb12615"}, + {file = "jupyter_events-0.9.0-py3-none-any.whl", hash = "sha256:d853b3c10273ff9bc8bb8b30076d65e2c9685579db736873de6c2232dde148bf"}, + {file = "jupyter_events-0.9.0.tar.gz", hash = "sha256:81ad2e4bc710881ec274d31c6c50669d71bbaa5dd9d01e600b56faa85700d399"}, ] [package.dependencies] @@ -1715,13 +1503,13 @@ jupyter-server = ">=1.1.2" [[package]] name = "jupyter-server" -version = "2.7.3" +version = "2.10.1" description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_server-2.7.3-py3-none-any.whl", hash = "sha256:8e4b90380b59d7a1e31086c4692231f2a2ea4cb269f5516e60aba72ce8317fc9"}, - {file = "jupyter_server-2.7.3.tar.gz", hash = "sha256:d4916c8581c4ebbc534cebdaa8eca2478d9f3bfdd88eae29fcab0120eac57649"}, + {file = "jupyter_server-2.10.1-py3-none-any.whl", hash = "sha256:20519e355d951fc5e1b6ac5952854fe7620d0cfb56588fa4efe362a758977ed3"}, + {file = "jupyter_server-2.10.1.tar.gz", hash = "sha256:e6da2657a954a7879eed28cc08e0817b01ffd81d7eab8634660397b55f926472"}, ] [package.dependencies] @@ -1730,7 +1518,7 @@ argon2-cffi = "*" jinja2 = "*" jupyter-client = ">=7.4.4" jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" -jupyter-events = ">=0.6.0" +jupyter-events = ">=0.9.0" jupyter-server-terminals = "*" nbconvert = ">=6.4.4" nbformat = ">=5.3.0" @@ -1770,19 +1558,18 @@ test = ["coverage", "jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-cov", [[package]] name = "jupyterlab" -version = "4.0.5" +version = "4.0.8" description = "JupyterLab computational environment" optional = false python-versions = ">=3.8" files = [ - {file = "jupyterlab-4.0.5-py3-none-any.whl", hash = "sha256:13b3a326e7b95d72746fe20dbe80ee1e71165d6905e01ceaf1320eb809cb1b47"}, - {file = "jupyterlab-4.0.5.tar.gz", hash = "sha256:de49deb75f9b9aec478ed04754cbefe9c5d22fd796a5783cdc65e212983d3611"}, + {file = "jupyterlab-4.0.8-py3-none-any.whl", hash = "sha256:2ff5aa2a51eb21df241d6011c236e88bd1ff9a5dbb75bebc54472f9c18bfffa4"}, + {file = "jupyterlab-4.0.8.tar.gz", hash = "sha256:c4fe93f977bcc987bd395d7fae5ab02e0c042bf4e0f7c95196f3e2e578c2fb3a"}, ] [package.dependencies] async-lru = ">=1.0.0" importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} -importlib-resources = {version = ">=1.4", markers = "python_version < \"3.9\""} ipykernel = "*" jinja2 = ">=3.0.3" jupyter-core = "*" @@ -1796,8 +1583,8 @@ tornado = ">=6.2.0" traitlets = "*" [package.extras] -dev = ["black[jupyter] (==23.3.0)", "build", "bump2version", "coverage", "hatch", "pre-commit", "pytest-cov", "ruff (==0.0.271)"] -docs = ["jsx-lexer", "myst-parser", "pydata-sphinx-theme (>=0.13.0)", "pytest", "pytest-check-links", "pytest-tornasync", "sphinx (>=1.8)", "sphinx-copybutton"] +dev = ["black[jupyter] (==23.10.1)", "build", "bump2version", "coverage", "hatch", "pre-commit", "pytest-cov", "ruff (==0.0.292)"] +docs = ["jsx-lexer", "myst-parser", "pydata-sphinx-theme (>=0.13.0)", "pytest", "pytest-check-links", "pytest-tornasync", "sphinx (>=1.8,<7.2.0)", "sphinx-copybutton"] docs-screenshots = ["altair (==5.0.1)", "ipython (==8.14.0)", "ipywidgets (==8.0.6)", "jupyterlab-geojson (==3.4.0)", "jupyterlab-language-pack-zh-cn (==4.0.post0)", "matplotlib (==3.7.1)", "nbconvert (>=7.0.0)", "pandas (==2.0.2)", "scipy (==1.10.1)", "vega-datasets (==0.9.0)"] test = ["coverage", "pytest (>=7.0)", "pytest-check-links (>=0.7)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter (>=0.5.3)", "pytest-timeout", "pytest-tornasync", "requests", "requests-cache", "virtualenv"] @@ -1814,13 +1601,13 @@ files = [ [[package]] name = "jupyterlab-server" -version = "2.25.0" +version = "2.25.1" description = "A set of server components for JupyterLab and JupyterLab like applications." optional = false python-versions = ">=3.8" files = [ - {file = "jupyterlab_server-2.25.0-py3-none-any.whl", hash = "sha256:c9f67a98b295c5dee87f41551b0558374e45d449f3edca153dd722140630dcb2"}, - {file = "jupyterlab_server-2.25.0.tar.gz", hash = "sha256:77c2f1f282d610f95e496e20d5bf1d2a7706826dfb7b18f3378ae2870d272fb7"}, + {file = "jupyterlab_server-2.25.1-py3-none-any.whl", hash = "sha256:dce9714d91fb3e53d2b37d0e0619fa26ed223c8e7b8c81cca112926de19b53a4"}, + {file = "jupyterlab_server-2.25.1.tar.gz", hash = "sha256:6491283b0000698eae1a38c48507930560dfcf7461aea0015368698aab34dd9c"}, ] [package.dependencies] @@ -1836,7 +1623,7 @@ requests = ">=2.31" [package.extras] docs = ["autodoc-traits", "jinja2 (<3.2.0)", "mistune (<4)", "myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-copybutton", "sphinxcontrib-openapi (>0.8)"] openapi = ["openapi-core (>=0.18.0,<0.19.0)", "ruamel-yaml"] -test = ["hatch", "ipykernel", "openapi-core (>=0.18.0,<0.19.0)", "openapi-spec-validator (>=0.6.0,<0.7.0)", "pytest (>=7.0)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter[server] (>=0.6.2)", "pytest-timeout", "requests-mock", "ruamel-yaml", "sphinxcontrib-spelling", "strict-rfc3339", "werkzeug"] +test = ["hatch", "ipykernel", "openapi-core (>=0.18.0,<0.19.0)", "openapi-spec-validator (>=0.6.0,<0.8.0)", "pytest (>=7.0)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter[server] (>=0.6.2)", "pytest-timeout", "requests-mock", "ruamel-yaml", "sphinxcontrib-spelling", "strict-rfc3339", "werkzeug"] [[package]] name = "jupyterlab-widgets" @@ -1849,169 +1636,151 @@ files = [ {file = "jupyterlab_widgets-3.0.9.tar.gz", hash = "sha256:6005a4e974c7beee84060fdfba341a3218495046de8ae3ec64888e5fe19fdb4c"}, ] +[[package]] +name = "libcst" +version = "1.0.1" +description = "A concrete syntax tree with AST-like properties for Python 3.5, 3.6, 3.7, 3.8, 3.9, and 3.10 programs." +optional = false +python-versions = ">=3.7" +files = [ + {file = "libcst-1.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:80423311f09fc5fc3270ede44d30d9d8d3c2d3dd50dbf703a581ca7346949fa6"}, + {file = "libcst-1.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9d6dec2a3c443792e6af7c36fadc256e4ea586214c76b52f0d18118811dbe351"}, + {file = "libcst-1.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4840a3de701778f0a19582bb3085c61591329153f801dc25da84689a3733960b"}, + {file = "libcst-1.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0138068baf09561268c7f079373bda45f0e2b606d2d19df1307ca8a5134fc465"}, + {file = "libcst-1.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a4931feceab171e6fce73de94e13880424367247dad6ff2b49cabfec733e144"}, + {file = "libcst-1.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:47dba43855e9c7b06d8b256ee81f0ebec6a4f43605456519577e09dfe4b4288c"}, + {file = "libcst-1.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8c50541c3fd6b1d5a3765c4bb5ee8ecbba9d0e798e48f79fd5adf3b6752de4d0"}, + {file = "libcst-1.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5599166d5fec40e18601fb8868519dde99f77b6e4ad6074958018f9545da7abd"}, + {file = "libcst-1.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:600c4d3a9a2f75d5a055fed713a5a4d812709947909610aa6527abe08a31896f"}, + {file = "libcst-1.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6b5aea04c35e13109edad3cf83bc6dcd74309b150a781d2189eecb288b73a87"}, + {file = "libcst-1.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ddd4e0eeec499d1c824ab545e62e957dbbd69a16bc4273208817638eb7d6b3c6"}, + {file = "libcst-1.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:414350df5e334ddf0db1732d63da44e81b734d45abe1c597b5e5c0dd46aa4156"}, + {file = "libcst-1.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:1adcfa7cafb6a0d39a1a0bec541355608038b45815e0c5019c95f91921d42884"}, + {file = "libcst-1.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d31ce2790eab59c1bd8e33fe72d09cfc78635c145bdc3f08296b360abb5f443"}, + {file = "libcst-1.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2cb687e1514625e91024e50a5d2e485c0ad3be24f199874ebf32b5de0346150"}, + {file = "libcst-1.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6caa33430c0c7a0fcad921b0deeec61ddb96796b6f88dca94966f6db62065f4f"}, + {file = "libcst-1.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:b97f652b15c50e91df411a9c8d5e6f75882b30743a49b387dcedd3f68ed94d75"}, + {file = "libcst-1.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:967c66fabd52102954207bf1541312b467afc210fdf7033f32da992fb6c2372c"}, + {file = "libcst-1.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b666a605f4205c8357696f3b6571a38f6a8537cdcbb8f357587d35168298af34"}, + {file = "libcst-1.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae49dcbfadefb82e830d41d9f0a1db0af3b771224768f431f1b7b3a9803ed7e3"}, + {file = "libcst-1.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c90c74a8a314f0774f045122323fb60bacba79cbf5f71883c0848ecd67179541"}, + {file = "libcst-1.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0533de4e35396c61aeb3a6266ac30369a855910c2385aaa902ff4aabd60d409"}, + {file = "libcst-1.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:5e3293e77657ba62533553bb9f0c5fb173780e164c65db1ea2a3e0d03944a284"}, + {file = "libcst-1.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:119ba709f1dcb785a4458cf36cedb51d6f9cb2eec0acd7bb171f730eac7cb6ce"}, + {file = "libcst-1.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4b4e336f6d68456017671cdda8ddebf9caebce8052cc21a3f494b03d7bd28386"}, + {file = "libcst-1.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8420926791b0b6206cb831a7ec73d26ae820e65bdf07ce9813c7754c7722c07a"}, + {file = "libcst-1.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d237e9164a43caa7d6765ee560412264484e7620c546a2ee10a8d01bd56884e0"}, + {file = "libcst-1.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:440887e5f82efb299f2e98d4bfa5663851a878cfc0efed652ab8c50205191436"}, + {file = "libcst-1.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:ae7f4e71d714f256b5f2ff98b5a9effba0f9dff4d779d8f35d7eb157bef78f59"}, + {file = "libcst-1.0.1.tar.gz", hash = "sha256:37187337f979ba426d8bfefc08008c3c1b09b9e9f9387050804ed2da88107570"}, +] + +[package.dependencies] +pyyaml = ">=5.2" +typing-extensions = ">=3.7.4.2" +typing-inspect = ">=0.4.0" + +[package.extras] +dev = ["Sphinx (>=5.1.1)", "black (==23.3.0)", "build (>=0.10.0)", "coverage (>=4.5.4)", "fixit (==0.1.1)", "flake8 (>=3.7.8,<5)", "hypothesis (>=4.36.0)", "hypothesmith (>=0.0.4)", "jinja2 (==3.1.2)", "jupyter (>=1.0.0)", "maturin (>=0.8.3,<0.16)", "nbsphinx (>=0.4.2)", "prompt-toolkit (>=2.0.9)", "pyre-check (==0.9.10)", "setuptools-rust (>=1.5.2)", "setuptools-scm (>=6.0.1)", "slotscheck (>=0.7.1)", "sphinx-rtd-theme (>=0.4.3)", "ufmt (==2.1.0)", "usort (==1.0.7)"] + [[package]] name = "lightning" -version = "2.0.8" +version = "2.1.2" description = "The Deep Learning framework to train, deploy, and ship AI products Lightning fast." optional = false python-versions = ">=3.8" files = [ - {file = "lightning-2.0.8-py3-none-any.whl", hash = "sha256:42ccc2b622d5ee54322d8f96170da00abc35ace97ec8acaa25e709cf017fd0c8"}, - {file = "lightning-2.0.8.tar.gz", hash = "sha256:db914e211b5c3b079a821be6e4344e72d0a729163676a65c4e00aae98390ae7b"}, + {file = "lightning-2.1.2-py3-none-any.whl", hash = "sha256:f23358dedd8f5f1151475c9d95f33e4529591c992a99cb9ae89c84bca7289525"}, + {file = "lightning-2.1.2.tar.gz", hash = "sha256:3b2599a8a719916cb03526e6570356809729680c6cda09391232e2aba0a4ed4b"}, ] [package.dependencies] -arrow = ">=1.2.0,<3.0" -backoff = ">=2.2.1,<4.0" -beautifulsoup4 = ">=4.8.0,<6.0" -click = "<10.0" -croniter = ">=1.3.0,<1.5.0" -dateutils = "<2.0" -deepdiff = ">=5.7.0,<8.0" -fastapi = ">=0.92.0,<2.0" -fsspec = [ - {version = ">=2022.5.0,<2025.0"}, - {version = ">2021.06.0,<2025.0", extras = ["http"]}, -] -inquirer = ">=2.10.0,<5.0" -Jinja2 = "<5.0" -lightning-cloud = ">=0.5.37" -lightning-utilities = ">=0.7.0,<2.0" +fsspec = {version = ">2021.06.0,<2025.0", extras = ["http"]} +lightning-utilities = ">=0.8.0,<2.0" numpy = ">=1.17.2,<3.0" -packaging = ">=17.1,<25.0" -psutil = "<7.0" -pydantic = ">=1.7.4,<2.2.0" -python-multipart = ">=0.0.5,<2.0" +packaging = ">=20.0,<25.0" pytorch-lightning = "*" PyYAML = ">=5.4,<8.0" -requests = "<4.0" -rich = ">=12.3.0,<15.0" -starlette = "*" -starsessions = ">=1.2.1,<2.0" -torch = ">=1.11.0,<4.0" -torchmetrics = ">=0.7.0,<2.0" +torch = ">=1.12.0,<4.0" +torchmetrics = ">=0.7.0,<3.0" tqdm = ">=4.57.0,<6.0" -traitlets = ">=5.3.0,<7.0" typing-extensions = ">=4.0.0,<6.0" -urllib3 = "<4.0" -uvicorn = "<2.0" -websocket-client = "<3.0" -websockets = "<13.0" [package.extras] -all = ["aiohttp (>=3.8.0,<4.0)", "deepspeed (>=0.8.2,<1.0)", "docker (>=5.0.0,<7.0)", "gym[classic-control] (>=0.17.0,<1.0)", "hydra-core (>=1.0.5,<2.0)", "ipython[all] (<9.0)", "jsonargparse[signatures] (>=4.18.0,<4.23.0)", "lightning-api-access (>=0.0.3)", "lightning-fabric (>=1.9.0)", "lightning-utilities (>=0.7.0,<1.0)", "lightning-utilities (>=0.8.0,<1.0)", "matplotlib (>3.1,<4.0)", "omegaconf (>=2.0.5,<3.0)", "panel (>=1.0.0,<2.0)", "pytorch-lightning (>=1.9.0)", "redis (>=4.0.1,<5.0)", "rich (>=12.3.0,<14.0)", "s3fs (>=2022.5.0,<2024.0)", "streamlit (>=1.13.0,<2.0)", "tensorboardX (>=2.2,<3.0)", "torchmetrics (>=0.10.0,<2.0)", "torchvision (>=0.12.0,<1.0)"] -app-all = ["aiohttp (>=3.8.0,<4.0)", "docker (>=5.0.0,<7.0)", "lightning-api-access (>=0.0.3)", "lightning-fabric (>=1.9.0)", "panel (>=1.0.0,<2.0)", "pytorch-lightning (>=1.9.0)", "redis (>=4.0.1,<5.0)", "s3fs (>=2022.5.0,<2024.0)", "streamlit (>=1.13.0,<2.0)"] -app-cloud = ["docker (>=5.0.0,<7.0)", "redis (>=4.0.1,<5.0)", "s3fs (>=2022.5.0,<2024.0)"] +all = ["Jinja2 (<4.0)", "Pillow (>=9.5.0)", "PyYAML (<7.0)", "aiohttp (>=3.8.0,<4.0)", "arrow (>=1.2.0,<2.0)", "backoff (>=2.2.1,<3.0)", "beautifulsoup4 (>=4.8.0,<5.0)", "bitsandbytes (<1.0)", "click (<9.0)", "croniter (>=1.3.0,<1.5.0)", "dateutils (<1.0)", "deepdiff (>=5.7.0,<7.0)", "deepspeed (>=0.8.2,<=0.9.3)", "docker (>=5.0.0,<7.0)", "fastapi (>=0.92.0,<1.0)", "fsspec (>=2022.5.0,<2024.0)", "fsspec[http] (>2021.06.0,<2024.0)", "gym[classic-control] (>=0.17.0,<1.0)", "hydra-core (>=1.0.5,<2.0)", "inquirer (>=2.10.0,<4.0)", "ipython[all] (<9.0)", "jsonargparse[signatures] (>=4.18.0,<5.0)", "lightning-api-access (>=0.0.3)", "lightning-cloud (==0.5.52)", "lightning-fabric (>=1.9.0)", "lightning-utilities (>=0.8.0,<1.0)", "matplotlib (>3.1,<4.0)", "omegaconf (>=2.0.5,<3.0)", "packaging", "psutil (<6.0)", "pydantic (>=1.7.4)", "python-multipart (>=0.0.5,<1.0)", "pytorch-lightning (>=1.9.0)", "redis (>=4.0.1,<6.0)", "requests (<3.0)", "rich (>=12.3.0,<14.0)", "s3fs (>=2022.5.0,<2024.0)", "starlette", "starsessions (>=1.2.1,<2.0)", "tensorboardX (>=2.2,<3.0)", "torch (>0.14.0,<3.0)", "torchdata (>0.5.9,<1.0)", "torchmetrics (>=0.10.0,<2.0)", "torchvision (>=0.13.0,<1.0)", "torchvision (>=0.15.2,<1.0)", "traitlets (>=5.3.0,<6.0)", "typing-extensions (>=4.0.0,<5.0)", "urllib3 (<3.0)", "uvicorn (<1.0)", "websocket-client (<2.0)", "websockets (<12.0)"] +app = ["Jinja2 (<4.0)", "PyYAML (<7.0)", "arrow (>=1.2.0,<2.0)", "backoff (>=2.2.1,<3.0)", "beautifulsoup4 (>=4.8.0,<5.0)", "click (<9.0)", "croniter (>=1.3.0,<1.5.0)", "dateutils (<1.0)", "deepdiff (>=5.7.0,<7.0)", "fastapi (>=0.92.0,<1.0)", "fsspec (>=2022.5.0,<2024.0)", "inquirer (>=2.10.0,<4.0)", "lightning-cloud (==0.5.52)", "lightning-utilities (>=0.8.0,<1.0)", "packaging", "psutil (<6.0)", "pydantic (>=1.7.4)", "python-multipart (>=0.0.5,<1.0)", "requests (<3.0)", "rich (>=12.3.0,<14.0)", "starlette", "starsessions (>=1.2.1,<2.0)", "traitlets (>=5.3.0,<6.0)", "typing-extensions (>=4.0.0,<5.0)", "urllib3 (<3.0)", "uvicorn (<1.0)", "websocket-client (<2.0)", "websockets (<12.0)"] +app-all = ["Jinja2 (<4.0)", "PyYAML (<7.0)", "aiohttp (>=3.8.0,<4.0)", "arrow (>=1.2.0,<2.0)", "backoff (>=2.2.1,<3.0)", "beautifulsoup4 (>=4.8.0,<5.0)", "click (<9.0)", "croniter (>=1.3.0,<1.5.0)", "dateutils (<1.0)", "deepdiff (>=5.7.0,<7.0)", "docker (>=5.0.0,<7.0)", "fastapi (>=0.92.0,<1.0)", "fsspec (>=2022.5.0,<2024.0)", "inquirer (>=2.10.0,<4.0)", "lightning-api-access (>=0.0.3)", "lightning-cloud (==0.5.52)", "lightning-fabric (>=1.9.0)", "lightning-utilities (>=0.8.0,<1.0)", "packaging", "psutil (<6.0)", "pydantic (>=1.7.4)", "python-multipart (>=0.0.5,<1.0)", "pytorch-lightning (>=1.9.0)", "redis (>=4.0.1,<6.0)", "requests (<3.0)", "rich (>=12.3.0,<14.0)", "s3fs (>=2022.5.0,<2024.0)", "starlette", "starsessions (>=1.2.1,<2.0)", "traitlets (>=5.3.0,<6.0)", "typing-extensions (>=4.0.0,<5.0)", "urllib3 (<3.0)", "uvicorn (<1.0)", "websocket-client (<2.0)", "websockets (<12.0)"] +app-cloud = ["docker (>=5.0.0,<7.0)", "redis (>=4.0.1,<6.0)", "s3fs (>=2022.5.0,<2024.0)"] app-components = ["aiohttp (>=3.8.0,<4.0)", "lightning-api-access (>=0.0.3)", "lightning-fabric (>=1.9.0)", "pytorch-lightning (>=1.9.0)"] -app-dev = ["aiohttp (>=3.8.0,<4.0)", "coverage (==7.3.0)", "docker (>=5.0.0,<7.0)", "httpx (==0.24.1)", "lightning-api-access (>=0.0.3)", "lightning-fabric (>=1.9.0)", "panel (>=1.0.0,<2.0)", "playwright (==1.36.0)", "psutil (<6.0)", "pympler", "pytest (==7.4.0)", "pytest-asyncio (==0.21.1)", "pytest-cov (==4.1.0)", "pytest-doctestplus (>=0.9.0)", "pytest-rerunfailures (<12.0)", "pytest-timeout (==2.1.0)", "pytorch-lightning (>=1.9.0)", "redis (>=4.0.1,<5.0)", "requests-mock (==1.11.0)", "s3fs (>=2022.5.0,<2024.0)", "setuptools (<69.0)", "streamlit (>=1.13.0,<2.0)", "trio (<0.22.0)"] -app-extra = ["aiohttp (>=3.8.0,<4.0)", "docker (>=5.0.0,<7.0)", "lightning-api-access (>=0.0.3)", "lightning-fabric (>=1.9.0)", "panel (>=1.0.0,<2.0)", "pytorch-lightning (>=1.9.0)", "redis (>=4.0.1,<5.0)", "s3fs (>=2022.5.0,<2024.0)", "streamlit (>=1.13.0,<2.0)"] -app-test = ["coverage (==7.3.0)", "httpx (==0.24.1)", "playwright (==1.36.0)", "psutil (<6.0)", "pympler", "pytest (==7.4.0)", "pytest-asyncio (==0.21.1)", "pytest-cov (==4.1.0)", "pytest-doctestplus (>=0.9.0)", "pytest-rerunfailures (<12.0)", "pytest-timeout (==2.1.0)", "requests-mock (==1.11.0)", "setuptools (<69.0)", "trio (<0.22.0)"] -app-ui = ["panel (>=1.0.0,<2.0)", "streamlit (>=1.13.0,<2.0)"] -cloud = ["docker (>=5.0.0,<7.0)", "redis (>=4.0.1,<5.0)", "s3fs (>=2022.5.0,<2024.0)"] +app-dev = ["Jinja2 (<4.0)", "PyYAML (<7.0)", "aiohttp (>=3.8.0,<4.0)", "arrow (>=1.2.0,<2.0)", "backoff (>=2.2.1,<3.0)", "beautifulsoup4 (>=4.8.0,<5.0)", "click (<9.0)", "coverage (==7.3.1)", "croniter (>=1.3.0,<1.5.0)", "dateutils (<1.0)", "deepdiff (>=5.7.0,<7.0)", "docker (>=5.0.0,<7.0)", "fastapi (>=0.92.0,<1.0)", "fsspec (>=2022.5.0,<2024.0)", "httpx (==0.25.0)", "inquirer (>=2.10.0,<4.0)", "lightning-api-access (>=0.0.3)", "lightning-cloud (==0.5.52)", "lightning-fabric (>=1.9.0)", "lightning-utilities (>=0.8.0,<1.0)", "packaging", "pandas", "playwright (==1.38.0)", "psutil (<6.0)", "pydantic (>=1.7.4)", "pympler", "pytest (==7.4.0)", "pytest-asyncio (==0.21.1)", "pytest-cov (==4.1.0)", "pytest-doctestplus (==0.9.0)", "pytest-rerunfailures (==12.0)", "pytest-timeout (==2.1.0)", "pytest-xdist (==3.3.1)", "python-multipart (>=0.0.5,<1.0)", "pytorch-lightning (>=1.9.0)", "redis (>=4.0.1,<6.0)", "requests (<3.0)", "requests-mock (==1.11.0)", "rich (>=12.3.0,<14.0)", "s3fs (>=2022.5.0,<2024.0)", "setuptools (<69.0)", "starlette", "starsessions (>=1.2.1,<2.0)", "traitlets (>=5.3.0,<6.0)", "trio (<0.22.0)", "typing-extensions (>=4.0.0,<5.0)", "urllib3 (<3.0)", "uvicorn (<1.0)", "websocket-client (<2.0)", "websockets (<12.0)"] +app-extra = ["Jinja2 (<4.0)", "PyYAML (<7.0)", "aiohttp (>=3.8.0,<4.0)", "arrow (>=1.2.0,<2.0)", "backoff (>=2.2.1,<3.0)", "beautifulsoup4 (>=4.8.0,<5.0)", "click (<9.0)", "croniter (>=1.3.0,<1.5.0)", "dateutils (<1.0)", "deepdiff (>=5.7.0,<7.0)", "docker (>=5.0.0,<7.0)", "fastapi (>=0.92.0,<1.0)", "fsspec (>=2022.5.0,<2024.0)", "inquirer (>=2.10.0,<4.0)", "lightning-api-access (>=0.0.3)", "lightning-cloud (==0.5.52)", "lightning-fabric (>=1.9.0)", "lightning-utilities (>=0.8.0,<1.0)", "packaging", "psutil (<6.0)", "pydantic (>=1.7.4)", "python-multipart (>=0.0.5,<1.0)", "pytorch-lightning (>=1.9.0)", "redis (>=4.0.1,<6.0)", "requests (<3.0)", "rich (>=12.3.0,<14.0)", "s3fs (>=2022.5.0,<2024.0)", "starlette", "starsessions (>=1.2.1,<2.0)", "traitlets (>=5.3.0,<6.0)", "typing-extensions (>=4.0.0,<5.0)", "urllib3 (<3.0)", "uvicorn (<1.0)", "websocket-client (<2.0)", "websockets (<12.0)"] +app-test = ["coverage (==7.3.1)", "httpx (==0.25.0)", "pandas", "playwright (==1.38.0)", "psutil (<6.0)", "pympler", "pytest (==7.4.0)", "pytest-asyncio (==0.21.1)", "pytest-cov (==4.1.0)", "pytest-doctestplus (==0.9.0)", "pytest-rerunfailures (==12.0)", "pytest-timeout (==2.1.0)", "pytest-xdist (==3.3.1)", "requests-mock (==1.11.0)", "setuptools (<69.0)", "trio (<0.22.0)"] +cloud = ["docker (>=5.0.0,<7.0)", "fsspec[http] (>2021.06.0,<2024.0)", "redis (>=4.0.1,<6.0)", "s3fs (>=2022.5.0,<2024.0)"] components = ["aiohttp (>=3.8.0,<4.0)", "lightning-api-access (>=0.0.3)", "lightning-fabric (>=1.9.0)", "pytorch-lightning (>=1.9.0)"] -dev = ["aiohttp (>=3.8.0,<4.0)", "click (==8.1.6)", "cloudpickle (>=1.3,<3.0)", "coverage (==7.3.0)", "deepspeed (>=0.8.2,<1.0)", "docker (>=5.0.0,<7.0)", "fastapi (<1.0)", "gym[classic-control] (>=0.17.0,<1.0)", "httpx (==0.24.1)", "hydra-core (>=1.0.5,<2.0)", "ipython[all] (<9.0)", "jsonargparse[signatures] (>=4.18.0,<4.23.0)", "lightning-api-access (>=0.0.3)", "lightning-fabric (>=1.9.0)", "lightning-utilities (>=0.7.0,<1.0)", "lightning-utilities (>=0.8.0,<1.0)", "matplotlib (>3.1,<4.0)", "omegaconf (>=2.0.5,<3.0)", "onnx (<2.0)", "onnxruntime (<2.0)", "pandas (>1.0,<3.0)", "panel (>=1.0.0,<2.0)", "playwright (==1.36.0)", "protobuf (<=3.20.1)", "psutil (<6.0)", "pympler", "pytest (==7.4.0)", "pytest-asyncio (==0.21.1)", "pytest-cov (==4.1.0)", "pytest-doctestplus (>=0.9.0)", "pytest-forked (==1.4.0)", "pytest-rerunfailures (<12.0)", "pytest-rerunfailures (==10.3)", "pytest-timeout (==2.1.0)", "pytorch-lightning (>=1.9.0)", "redis (>=4.0.1,<5.0)", "requests-mock (==1.11.0)", "rich (>=12.3.0,<14.0)", "s3fs (>=2022.5.0,<2024.0)", "scikit-learn (>0.22.1,<2.0)", "setuptools (<69.0)", "streamlit (>=1.13.0,<2.0)", "tensorboard (>=2.9.1,<3.0)", "tensorboardX (>=2.2,<3.0)", "torchmetrics (>=0.10.0,<2.0)", "torchvision (>=0.12.0,<1.0)", "trio (<0.22.0)", "uvicorn (<1.0)"] -examples = ["gym[classic-control] (>=0.17.0,<1.0)", "ipython[all] (<9.0)", "lightning-utilities (>=0.7.0,<1.0)", "lightning-utilities (>=0.8.0,<1.0)", "torchmetrics (>=0.10.0,<2.0)", "torchvision (>=0.12.0,<1.0)"] -extra = ["aiohttp (>=3.8.0,<4.0)", "docker (>=5.0.0,<7.0)", "hydra-core (>=1.0.5,<2.0)", "jsonargparse[signatures] (>=4.18.0,<4.23.0)", "lightning-api-access (>=0.0.3)", "lightning-fabric (>=1.9.0)", "matplotlib (>3.1,<4.0)", "omegaconf (>=2.0.5,<3.0)", "panel (>=1.0.0,<2.0)", "pytorch-lightning (>=1.9.0)", "redis (>=4.0.1,<5.0)", "rich (>=12.3.0,<14.0)", "s3fs (>=2022.5.0,<2024.0)", "streamlit (>=1.13.0,<2.0)", "tensorboardX (>=2.2,<3.0)"] -fabric-all = ["deepspeed (>=0.8.2,<1.0)", "lightning-utilities (>=0.8.0,<1.0)", "torchmetrics (>=0.10.0,<2.0)", "torchvision (>=0.12.0,<1.0)"] -fabric-dev = ["click (==8.1.6)", "coverage (==7.3.0)", "deepspeed (>=0.8.2,<1.0)", "lightning-utilities (>=0.8.0,<1.0)", "pytest (==7.4.0)", "pytest-cov (==4.1.0)", "pytest-rerunfailures (==10.3)", "tensorboardX (>=2.2,<3.0)", "torchmetrics (>=0.10.0,<2.0)", "torchvision (>=0.12.0,<1.0)"] -fabric-examples = ["lightning-utilities (>=0.8.0,<1.0)", "torchmetrics (>=0.10.0,<2.0)", "torchvision (>=0.12.0,<1.0)"] -fabric-strategies = ["deepspeed (>=0.8.2,<1.0)"] -fabric-test = ["click (==8.1.6)", "coverage (==7.3.0)", "pytest (==7.4.0)", "pytest-cov (==4.1.0)", "pytest-rerunfailures (==10.3)", "tensorboardX (>=2.2,<3.0)"] -pytorch-all = ["deepspeed (>=0.8.2,<1.0)", "gym[classic-control] (>=0.17.0,<1.0)", "hydra-core (>=1.0.5,<2.0)", "ipython[all] (<9.0)", "jsonargparse[signatures] (>=4.18.0,<4.23.0)", "lightning-utilities (>=0.7.0,<1.0)", "matplotlib (>3.1,<4.0)", "omegaconf (>=2.0.5,<3.0)", "rich (>=12.3.0,<14.0)", "tensorboardX (>=2.2,<3.0)", "torchmetrics (>=0.10.0,<2.0)", "torchvision (>=0.12.0,<1.0)"] -pytorch-dev = ["cloudpickle (>=1.3,<3.0)", "coverage (==7.3.0)", "deepspeed (>=0.8.2,<1.0)", "fastapi (<1.0)", "gym[classic-control] (>=0.17.0,<1.0)", "hydra-core (>=1.0.5,<2.0)", "ipython[all] (<9.0)", "jsonargparse[signatures] (>=4.18.0,<4.23.0)", "lightning-utilities (>=0.7.0,<1.0)", "matplotlib (>3.1,<4.0)", "omegaconf (>=2.0.5,<3.0)", "onnx (<2.0)", "onnxruntime (<2.0)", "pandas (>1.0,<3.0)", "protobuf (<=3.20.1)", "psutil (<6.0)", "pytest (==7.4.0)", "pytest-cov (==4.1.0)", "pytest-forked (==1.4.0)", "pytest-rerunfailures (==10.3)", "rich (>=12.3.0,<14.0)", "scikit-learn (>0.22.1,<2.0)", "tensorboard (>=2.9.1,<3.0)", "tensorboardX (>=2.2,<3.0)", "torchmetrics (>=0.10.0,<2.0)", "torchvision (>=0.12.0,<1.0)", "uvicorn (<1.0)"] -pytorch-examples = ["gym[classic-control] (>=0.17.0,<1.0)", "ipython[all] (<9.0)", "lightning-utilities (>=0.7.0,<1.0)", "torchmetrics (>=0.10.0,<2.0)", "torchvision (>=0.12.0,<1.0)"] -pytorch-extra = ["hydra-core (>=1.0.5,<2.0)", "jsonargparse[signatures] (>=4.18.0,<4.23.0)", "matplotlib (>3.1,<4.0)", "omegaconf (>=2.0.5,<3.0)", "rich (>=12.3.0,<14.0)", "tensorboardX (>=2.2,<3.0)"] -pytorch-strategies = ["deepspeed (>=0.8.2,<1.0)"] -pytorch-test = ["cloudpickle (>=1.3,<3.0)", "coverage (==7.3.0)", "fastapi (<1.0)", "onnx (<2.0)", "onnxruntime (<2.0)", "pandas (>1.0,<3.0)", "protobuf (<=3.20.1)", "psutil (<6.0)", "pytest (==7.4.0)", "pytest-cov (==4.1.0)", "pytest-forked (==1.4.0)", "pytest-rerunfailures (==10.3)", "scikit-learn (>0.22.1,<2.0)", "tensorboard (>=2.9.1,<3.0)", "uvicorn (<1.0)"] -strategies = ["deepspeed (>=0.8.2,<1.0)"] -test = ["click (==8.1.6)", "cloudpickle (>=1.3,<3.0)", "coverage (==7.3.0)", "fastapi (<1.0)", "httpx (==0.24.1)", "onnx (<2.0)", "onnxruntime (<2.0)", "pandas (>1.0,<3.0)", "playwright (==1.36.0)", "protobuf (<=3.20.1)", "psutil (<6.0)", "pympler", "pytest (==7.4.0)", "pytest-asyncio (==0.21.1)", "pytest-cov (==4.1.0)", "pytest-doctestplus (>=0.9.0)", "pytest-forked (==1.4.0)", "pytest-rerunfailures (<12.0)", "pytest-rerunfailures (==10.3)", "pytest-timeout (==2.1.0)", "requests-mock (==1.11.0)", "scikit-learn (>0.22.1,<2.0)", "setuptools (<69.0)", "tensorboard (>=2.9.1,<3.0)", "tensorboardX (>=2.2,<3.0)", "trio (<0.22.0)", "uvicorn (<1.0)"] -ui = ["panel (>=1.0.0,<2.0)", "streamlit (>=1.13.0,<2.0)"] - -[[package]] -name = "lightning-cloud" -version = "0.5.38" -description = "Lightning Cloud" -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "lightning_cloud-0.5.38-py3-none-any.whl", hash = "sha256:cd783977f46cfa41791747307f0b1f7772d6a6315b3a5bbef565b3537d0b5070"}, - {file = "lightning_cloud-0.5.38.tar.gz", hash = "sha256:86fd5144b721bb289e9fd863604a67d55515688ccbadf0d858adfca1cefaf78f"}, -] - -[package.dependencies] -click = "*" -fastapi = "*" -pyjwt = "*" -python-multipart = "*" -requests = "*" -rich = "*" -six = "*" -urllib3 = "*" -uvicorn = "*" -websocket-client = "*" +data = ["Jinja2 (<4.0)", "PyYAML (<7.0)", "arrow (>=1.2.0,<2.0)", "backoff (>=2.2.1,<3.0)", "beautifulsoup4 (>=4.8.0,<5.0)", "click (<9.0)", "croniter (>=1.3.0,<1.5.0)", "dateutils (<1.0)", "deepdiff (>=5.7.0,<7.0)", "fastapi (>=0.92.0,<1.0)", "fsspec (>=2022.5.0,<2024.0)", "inquirer (>=2.10.0,<4.0)", "lightning-cloud (==0.5.52)", "lightning-utilities (>=0.8.0,<1.0)", "packaging", "psutil (<6.0)", "pydantic (>=1.7.4)", "python-multipart (>=0.0.5,<1.0)", "requests (<3.0)", "rich (>=12.3.0,<14.0)", "starlette", "starsessions (>=1.2.1,<2.0)", "torch (>0.14.0,<3.0)", "torchdata (>0.5.9,<1.0)", "traitlets (>=5.3.0,<6.0)", "typing-extensions (>=4.0.0,<5.0)", "urllib3 (<3.0)", "uvicorn (<1.0)", "websocket-client (<2.0)", "websockets (<12.0)"] +data-all = ["Jinja2 (<4.0)", "Pillow (>=9.5.0)", "PyYAML (<7.0)", "arrow (>=1.2.0,<2.0)", "backoff (>=2.2.1,<3.0)", "beautifulsoup4 (>=4.8.0,<5.0)", "click (<9.0)", "croniter (>=1.3.0,<1.5.0)", "dateutils (<1.0)", "deepdiff (>=5.7.0,<7.0)", "fastapi (>=0.92.0,<1.0)", "fsspec (>=2022.5.0,<2024.0)", "fsspec[http] (>2021.06.0,<2024.0)", "inquirer (>=2.10.0,<4.0)", "lightning-cloud (==0.5.52)", "lightning-utilities (>=0.8.0,<1.0)", "packaging", "psutil (<6.0)", "pydantic (>=1.7.4)", "python-multipart (>=0.0.5,<1.0)", "requests (<3.0)", "rich (>=12.3.0,<14.0)", "s3fs (>=2022.5.0,<2024.0)", "starlette", "starsessions (>=1.2.1,<2.0)", "torch (>0.14.0,<3.0)", "torchdata (>0.5.9,<1.0)", "torchvision (>=0.15.2,<1.0)", "traitlets (>=5.3.0,<6.0)", "typing-extensions (>=4.0.0,<5.0)", "urllib3 (<3.0)", "uvicorn (<1.0)", "websocket-client (<2.0)", "websockets (<12.0)"] +data-cloud = ["fsspec[http] (>2021.06.0,<2024.0)", "s3fs (>=2022.5.0,<2024.0)"] +data-dev = ["Jinja2 (<4.0)", "Pillow (>=9.5.0)", "PyYAML (<7.0)", "arrow (>=1.2.0,<2.0)", "backoff (>=2.2.1,<3.0)", "beautifulsoup4 (>=4.8.0,<5.0)", "click (<9.0)", "coverage (==7.3.1)", "croniter (>=1.3.0,<1.5.0)", "dateutils (<1.0)", "deepdiff (>=5.7.0,<7.0)", "fastapi (>=0.92.0,<1.0)", "fsspec (>=2022.5.0,<2024.0)", "fsspec[http] (>2021.06.0,<2024.0)", "inquirer (>=2.10.0,<4.0)", "lightning-cloud (==0.5.52)", "lightning-utilities (>=0.8.0,<1.0)", "packaging", "psutil (<6.0)", "pydantic (>=1.7.4)", "pytest (==7.4.0)", "pytest-cov (==4.1.0)", "pytest-random-order (==1.1.0)", "pytest-rerunfailures (==12.0)", "pytest-timeout (==2.1.0)", "python-multipart (>=0.0.5,<1.0)", "requests (<3.0)", "rich (>=12.3.0,<14.0)", "s3fs (>=2022.5.0,<2024.0)", "starlette", "starsessions (>=1.2.1,<2.0)", "torch (>0.14.0,<3.0)", "torchdata (>0.5.9,<1.0)", "torchvision (>=0.15.2,<1.0)", "traitlets (>=5.3.0,<6.0)", "typing-extensions (>=4.0.0,<5.0)", "urllib3 (<3.0)", "uvicorn (<1.0)", "websocket-client (<2.0)", "websockets (<12.0)"] +data-examples = ["Pillow (>=9.5.0)", "torchvision (>=0.15.2,<1.0)"] +data-test = ["coverage (==7.3.1)", "pytest (==7.4.0)", "pytest-cov (==4.1.0)", "pytest-random-order (==1.1.0)", "pytest-rerunfailures (==12.0)", "pytest-timeout (==2.1.0)"] +dev = ["Jinja2 (<4.0)", "Pillow (>=9.5.0)", "PyYAML (<7.0)", "aiohttp (>=3.8.0,<4.0)", "arrow (>=1.2.0,<2.0)", "backoff (>=2.2.1,<3.0)", "beautifulsoup4 (>=4.8.0,<5.0)", "bitsandbytes (<1.0)", "click (<9.0)", "click (==8.1.7)", "cloudpickle (>=1.3,<3.0)", "coverage (==7.3.1)", "croniter (>=1.3.0,<1.5.0)", "dateutils (<1.0)", "deepdiff (>=5.7.0,<7.0)", "deepspeed (>=0.8.2,<=0.9.3)", "docker (>=5.0.0,<7.0)", "fastapi", "fastapi (>=0.92.0,<1.0)", "fsspec (>=2022.5.0,<2024.0)", "fsspec[http] (>2021.06.0,<2024.0)", "gym[classic-control] (>=0.17.0,<1.0)", "httpx (==0.25.0)", "hydra-core (>=1.0.5,<2.0)", "inquirer (>=2.10.0,<4.0)", "ipython[all] (<9.0)", "jsonargparse[signatures] (>=4.18.0,<5.0)", "lightning-api-access (>=0.0.3)", "lightning-cloud (==0.5.52)", "lightning-fabric (>=1.9.0)", "lightning-utilities (>=0.8.0,<1.0)", "matplotlib (>3.1,<4.0)", "omegaconf (>=2.0.5,<3.0)", "onnx (>=0.14.0,<2.0)", "onnxruntime (>=0.15.0,<2.0)", "packaging", "pandas", "pandas (>1.0,<3.0)", "playwright (==1.38.0)", "psutil (<6.0)", "pydantic (>=1.7.4)", "pympler", "pytest (==7.4.0)", "pytest-asyncio (==0.21.1)", "pytest-cov (==4.1.0)", "pytest-doctestplus (==0.9.0)", "pytest-random-order (==1.1.0)", "pytest-rerunfailures (==12.0)", "pytest-timeout (==2.1.0)", "pytest-xdist (==3.3.1)", "python-multipart (>=0.0.5,<1.0)", "pytorch-lightning (>=1.9.0)", "redis (>=4.0.1,<6.0)", "requests (<3.0)", "requests-mock (==1.11.0)", "rich (>=12.3.0,<14.0)", "s3fs (>=2022.5.0,<2024.0)", "scikit-learn (>0.22.1,<2.0)", "setuptools (<69.0)", "starlette", "starsessions (>=1.2.1,<2.0)", "tensorboard (>=2.9.1,<3.0)", "tensorboardX (>=2.2,<3.0)", "torch (>0.14.0,<3.0)", "torchdata (>0.5.9,<1.0)", "torchmetrics (>=0.10.0,<2.0)", "torchmetrics (>=0.7.0,<2.0)", "torchvision (>=0.13.0,<1.0)", "torchvision (>=0.15.2,<1.0)", "traitlets (>=5.3.0,<6.0)", "trio (<0.22.0)", "typing-extensions (>=4.0.0,<5.0)", "urllib3 (<3.0)", "uvicorn", "uvicorn (<1.0)", "websocket-client (<2.0)", "websockets (<12.0)"] +examples = ["Pillow (>=9.5.0)", "gym[classic-control] (>=0.17.0,<1.0)", "ipython[all] (<9.0)", "lightning-utilities (>=0.8.0,<1.0)", "torchmetrics (>=0.10.0,<2.0)", "torchvision (>=0.13.0,<1.0)", "torchvision (>=0.15.2,<1.0)"] +extra = ["Jinja2 (<4.0)", "PyYAML (<7.0)", "aiohttp (>=3.8.0,<4.0)", "arrow (>=1.2.0,<2.0)", "backoff (>=2.2.1,<3.0)", "beautifulsoup4 (>=4.8.0,<5.0)", "bitsandbytes (<1.0)", "click (<9.0)", "croniter (>=1.3.0,<1.5.0)", "dateutils (<1.0)", "deepdiff (>=5.7.0,<7.0)", "docker (>=5.0.0,<7.0)", "fastapi (>=0.92.0,<1.0)", "fsspec (>=2022.5.0,<2024.0)", "hydra-core (>=1.0.5,<2.0)", "inquirer (>=2.10.0,<4.0)", "jsonargparse[signatures] (>=4.18.0,<5.0)", "lightning-api-access (>=0.0.3)", "lightning-cloud (==0.5.52)", "lightning-fabric (>=1.9.0)", "lightning-utilities (>=0.8.0,<1.0)", "matplotlib (>3.1,<4.0)", "omegaconf (>=2.0.5,<3.0)", "packaging", "psutil (<6.0)", "pydantic (>=1.7.4)", "python-multipart (>=0.0.5,<1.0)", "pytorch-lightning (>=1.9.0)", "redis (>=4.0.1,<6.0)", "requests (<3.0)", "rich (>=12.3.0,<14.0)", "s3fs (>=2022.5.0,<2024.0)", "starlette", "starsessions (>=1.2.1,<2.0)", "tensorboardX (>=2.2,<3.0)", "traitlets (>=5.3.0,<6.0)", "typing-extensions (>=4.0.0,<5.0)", "urllib3 (<3.0)", "uvicorn (<1.0)", "websocket-client (<2.0)", "websockets (<12.0)"] +fabric-all = ["deepspeed (>=0.8.2,<=0.9.3)", "lightning-utilities (>=0.8.0,<1.0)", "torchmetrics (>=0.10.0,<2.0)", "torchvision (>=0.13.0,<1.0)"] +fabric-dev = ["click (==8.1.7)", "coverage (==7.3.1)", "deepspeed (>=0.8.2,<=0.9.3)", "lightning-utilities (>=0.8.0,<1.0)", "pytest (==7.4.0)", "pytest-cov (==4.1.0)", "pytest-random-order (==1.1.0)", "pytest-rerunfailures (==12.0)", "pytest-timeout (==2.1.0)", "tensorboardX (>=2.2,<3.0)", "torchmetrics (>=0.10.0,<2.0)", "torchmetrics (>=0.7.0,<2.0)", "torchvision (>=0.13.0,<1.0)"] +fabric-examples = ["lightning-utilities (>=0.8.0,<1.0)", "torchmetrics (>=0.10.0,<2.0)", "torchvision (>=0.13.0,<1.0)"] +fabric-strategies = ["deepspeed (>=0.8.2,<=0.9.3)"] +fabric-test = ["click (==8.1.7)", "coverage (==7.3.1)", "pytest (==7.4.0)", "pytest-cov (==4.1.0)", "pytest-random-order (==1.1.0)", "pytest-rerunfailures (==12.0)", "pytest-timeout (==2.1.0)", "tensorboardX (>=2.2,<3.0)", "torchmetrics (>=0.7.0,<2.0)"] +pytorch-all = ["bitsandbytes (<1.0)", "deepspeed (>=0.8.2,<=0.9.3)", "gym[classic-control] (>=0.17.0,<1.0)", "hydra-core (>=1.0.5,<2.0)", "ipython[all] (<9.0)", "jsonargparse[signatures] (>=4.18.0,<5.0)", "lightning-utilities (>=0.8.0,<1.0)", "matplotlib (>3.1,<4.0)", "omegaconf (>=2.0.5,<3.0)", "rich (>=12.3.0,<14.0)", "tensorboardX (>=2.2,<3.0)", "torchmetrics (>=0.10.0,<2.0)", "torchvision (>=0.13.0,<1.0)"] +pytorch-dev = ["bitsandbytes (<1.0)", "cloudpickle (>=1.3,<3.0)", "coverage (==7.3.1)", "deepspeed (>=0.8.2,<=0.9.3)", "fastapi", "gym[classic-control] (>=0.17.0,<1.0)", "hydra-core (>=1.0.5,<2.0)", "ipython[all] (<9.0)", "jsonargparse[signatures] (>=4.18.0,<5.0)", "lightning-utilities (>=0.8.0,<1.0)", "matplotlib (>3.1,<4.0)", "omegaconf (>=2.0.5,<3.0)", "onnx (>=0.14.0,<2.0)", "onnxruntime (>=0.15.0,<2.0)", "pandas (>1.0,<3.0)", "psutil (<6.0)", "pytest (==7.4.0)", "pytest-cov (==4.1.0)", "pytest-random-order (==1.1.0)", "pytest-rerunfailures (==12.0)", "pytest-timeout (==2.1.0)", "rich (>=12.3.0,<14.0)", "scikit-learn (>0.22.1,<2.0)", "tensorboard (>=2.9.1,<3.0)", "tensorboardX (>=2.2,<3.0)", "torchmetrics (>=0.10.0,<2.0)", "torchvision (>=0.13.0,<1.0)", "uvicorn"] +pytorch-examples = ["gym[classic-control] (>=0.17.0,<1.0)", "ipython[all] (<9.0)", "lightning-utilities (>=0.8.0,<1.0)", "torchmetrics (>=0.10.0,<2.0)", "torchvision (>=0.13.0,<1.0)"] +pytorch-extra = ["bitsandbytes (<1.0)", "hydra-core (>=1.0.5,<2.0)", "jsonargparse[signatures] (>=4.18.0,<5.0)", "matplotlib (>3.1,<4.0)", "omegaconf (>=2.0.5,<3.0)", "rich (>=12.3.0,<14.0)", "tensorboardX (>=2.2,<3.0)"] +pytorch-strategies = ["deepspeed (>=0.8.2,<=0.9.3)"] +pytorch-test = ["cloudpickle (>=1.3,<3.0)", "coverage (==7.3.1)", "fastapi", "onnx (>=0.14.0,<2.0)", "onnxruntime (>=0.15.0,<2.0)", "pandas (>1.0,<3.0)", "psutil (<6.0)", "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,<2.0)", "tensorboard (>=2.9.1,<3.0)", "uvicorn"] +store = ["Jinja2 (<4.0)", "PyYAML (<7.0)", "arrow (>=1.2.0,<2.0)", "backoff (>=2.2.1,<3.0)", "beautifulsoup4 (>=4.8.0,<5.0)", "click (<9.0)", "croniter (>=1.3.0,<1.5.0)", "dateutils (<1.0)", "deepdiff (>=5.7.0,<7.0)", "fastapi (>=0.92.0,<1.0)", "fsspec (>=2022.5.0,<2024.0)", "inquirer (>=2.10.0,<4.0)", "lightning-cloud (==0.5.52)", "lightning-utilities (>=0.8.0,<1.0)", "packaging", "psutil (<6.0)", "pydantic (>=1.7.4)", "python-multipart (>=0.0.5,<1.0)", "requests (<3.0)", "rich (>=12.3.0,<14.0)", "starlette", "starsessions (>=1.2.1,<2.0)", "traitlets (>=5.3.0,<6.0)", "typing-extensions (>=4.0.0,<5.0)", "urllib3 (<3.0)", "uvicorn (<1.0)", "websocket-client (<2.0)", "websockets (<12.0)"] +store-test = ["coverage (==7.3.1)", "pytest (==7.4.0)", "pytest-cov (==4.1.0)", "pytest-random-order (==1.1.0)", "pytest-rerunfailures (==12.0)", "pytest-timeout (==2.1.0)"] +strategies = ["deepspeed (>=0.8.2,<=0.9.3)"] +test = ["click (==8.1.7)", "cloudpickle (>=1.3,<3.0)", "coverage (==7.3.1)", "fastapi", "httpx (==0.25.0)", "onnx (>=0.14.0,<2.0)", "onnxruntime (>=0.15.0,<2.0)", "pandas", "pandas (>1.0,<3.0)", "playwright (==1.38.0)", "psutil (<6.0)", "pympler", "pytest (==7.4.0)", "pytest-asyncio (==0.21.1)", "pytest-cov (==4.1.0)", "pytest-doctestplus (==0.9.0)", "pytest-random-order (==1.1.0)", "pytest-rerunfailures (==12.0)", "pytest-timeout (==2.1.0)", "pytest-xdist (==3.3.1)", "requests-mock (==1.11.0)", "scikit-learn (>0.22.1,<2.0)", "setuptools (<69.0)", "tensorboard (>=2.9.1,<3.0)", "tensorboardX (>=2.2,<3.0)", "torchmetrics (>=0.7.0,<2.0)", "trio (<0.22.0)", "uvicorn"] [[package]] name = "lightning-utilities" -version = "0.9.0" +version = "0.10.0" description = "PyTorch Lightning Sample project." optional = false python-versions = ">=3.7" files = [ - {file = "lightning-utilities-0.9.0.tar.gz", hash = "sha256:efbf2c488c257f942abdfd06cf646fb84ca215a9663b60081811e22a15ee033b"}, - {file = "lightning_utilities-0.9.0-py3-none-any.whl", hash = "sha256:918dd90c775719e3855631db6282ad75c14da4c5727c4cebdd1589d865fad03d"}, + {file = "lightning-utilities-0.10.0.tar.gz", hash = "sha256:9e31617eccbbadc6b737a2432fd7076ff8e24957f9c63aeba2530b189e19319c"}, + {file = "lightning_utilities-0.10.0-py3-none-any.whl", hash = "sha256:84d09b11fe9bc16c803ae5e412874748239d73ad2f3d1b90862f99ce15a03aa0"}, ] [package.dependencies] packaging = ">=17.1" +setuptools = "*" typing-extensions = "*" [package.extras] cli = ["fire"] docs = ["requests (>=2.0.0)"] -typing = ["mypy (>=1.0.0)"] +typing = ["mypy (>=1.0.0)", "types-setuptools"] [[package]] name = "markdown" -version = "3.4.4" +version = "3.5.1" description = "Python implementation of John Gruber's Markdown." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "Markdown-3.4.4-py3-none-any.whl", hash = "sha256:a4c1b65c0957b4bd9e7d86ddc7b3c9868fb9670660f6f99f6d1bca8954d5a941"}, - {file = "Markdown-3.4.4.tar.gz", hash = "sha256:225c6123522495d4119a90b3a3ba31a1e87a70369e03f14799ea9c0d7183a3d6"}, + {file = "Markdown-3.5.1-py3-none-any.whl", hash = "sha256:5874b47d4ee3f0b14d764324d2c94c03ea66bee56f2d929da9f2508d65e722dc"}, + {file = "Markdown-3.5.1.tar.gz", hash = "sha256:b65d7beb248dc22f2e8a31fb706d93798093c308dc1aba295aedeb9d41a813bd"}, ] [package.dependencies] importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} [package.extras] -docs = ["mdx-gh-links (>=0.2)", "mkdocs (>=1.0)", "mkdocs-nature (>=0.4)"] +docs = ["mdx-gh-links (>=0.2)", "mkdocs (>=1.5)", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-nature (>=0.6)", "mkdocs-section-index", "mkdocstrings[python]"] testing = ["coverage", "pyyaml"] -[[package]] -name = "markdown-it-py" -version = "3.0.0" -description = "Python port of markdown-it. Markdown parsing, done right!" -optional = false -python-versions = ">=3.8" -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"}, -] - -[package.dependencies] -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)"] -linkify = ["linkify-it-py (>=1,<3)"] -plugins = ["mdit-py-plugins"] -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"] - [[package]] name = "markupsafe" version = "2.1.3" @@ -2086,25 +1855,25 @@ files = [ traitlets = "*" [[package]] -name = "mdurl" -version = "0.1.2" -description = "Markdown URL utilities" +name = "mccabe" +version = "0.7.0" +description = "McCabe checker, plugin for flake8" optional = false -python-versions = ">=3.7" +python-versions = ">=3.6" files = [ - {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, - {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, ] [[package]] name = "mistune" -version = "3.0.1" +version = "3.0.2" description = "A sane and fast Markdown parser with useful plugins and renderers" optional = false python-versions = ">=3.7" files = [ - {file = "mistune-3.0.1-py3-none-any.whl", hash = "sha256:b9b3e438efbb57c62b5beb5e134dab664800bdf1284a7ee09e8b12b13eb1aac6"}, - {file = "mistune-3.0.1.tar.gz", hash = "sha256:e912116c13aa0944f9dc530db38eb88f6a77087ab128f49f84a48f4c05ea163c"}, + {file = "mistune-3.0.2-py3-none-any.whl", hash = "sha256:71481854c30fdbc938963d3605b72501f5c10a9320ecd412c121c163a1c7d205"}, + {file = "mistune-3.0.2.tar.gz", hash = "sha256:fc7f93ded930c92394ef2cb6f04a8aabab4117a91449e72dcc8dfa646a508be8"}, ] [[package]] @@ -2248,13 +2017,13 @@ files = [ [[package]] name = "nbclient" -version = "0.8.0" +version = "0.9.0" description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." optional = false python-versions = ">=3.8.0" files = [ - {file = "nbclient-0.8.0-py3-none-any.whl", hash = "sha256:25e861299e5303a0477568557c4045eccc7a34c17fc08e7959558707b9ebe548"}, - {file = "nbclient-0.8.0.tar.gz", hash = "sha256:f9b179cd4b2d7bca965f900a2ebf0db4a12ebff2f36a711cb66861e4ae158e55"}, + {file = "nbclient-0.9.0-py3-none-any.whl", hash = "sha256:a3a1ddfb34d4a9d17fc744d655962714a866639acd30130e9be84191cd97cd15"}, + {file = "nbclient-0.9.0.tar.gz", hash = "sha256:4b28c207877cf33ef3a9838cdc7a54c5ceff981194a82eac59d558f05487295e"}, ] [package.dependencies] @@ -2270,13 +2039,13 @@ test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>= [[package]] name = "nbconvert" -version = "7.8.0" +version = "7.11.0" description = "Converting Jupyter Notebooks" optional = false python-versions = ">=3.8" files = [ - {file = "nbconvert-7.8.0-py3-none-any.whl", hash = "sha256:aec605e051fa682ccc7934ccc338ba1e8b626cfadbab0db592106b630f63f0f2"}, - {file = "nbconvert-7.8.0.tar.gz", hash = "sha256:f5bc15a1247e14dd41ceef0c0a3bc70020e016576eb0578da62f1c5b4f950479"}, + {file = "nbconvert-7.11.0-py3-none-any.whl", hash = "sha256:d1d417b7f34a4e38887f8da5bdfd12372adf3b80f995d57556cb0972c68909fe"}, + {file = "nbconvert-7.11.0.tar.gz", hash = "sha256:abedc01cf543177ffde0bfc2a69726d5a478f6af10a332fc1bf29fcb4f0cf000"}, ] [package.dependencies] @@ -2303,7 +2072,7 @@ docs = ["ipykernel", "ipython", "myst-parser", "nbsphinx (>=0.2.12)", "pydata-sp qtpdf = ["nbconvert[qtpng]"] qtpng = ["pyqtwebengine (>=5.15)"] serve = ["tornado (>=6.1)"] -test = ["flaky", "ipykernel", "ipywidgets (>=7)", "pre-commit", "pytest", "pytest-dependency"] +test = ["flaky", "ipykernel", "ipywidgets (>=7)", "pytest"] webpdf = ["playwright"] [[package]] @@ -2349,42 +2118,42 @@ toolchain = ["black", "blacken-docs", "flake8", "isort", "jupytext", "mypy", "py [[package]] name = "nest-asyncio" -version = "1.5.7" +version = "1.5.8" description = "Patch asyncio to allow nested event loops" optional = false python-versions = ">=3.5" files = [ - {file = "nest_asyncio-1.5.7-py3-none-any.whl", hash = "sha256:5301c82941b550b3123a1ea772ba9a1c80bad3a182be8c1a5ae6ad3be57a9657"}, - {file = "nest_asyncio-1.5.7.tar.gz", hash = "sha256:6a80f7b98f24d9083ed24608977c09dd608d83f91cccc24c9d2cba6d10e01c10"}, + {file = "nest_asyncio-1.5.8-py3-none-any.whl", hash = "sha256:accda7a339a70599cb08f9dd09a67e0c2ef8d8d6f4c07f96ab203f2ae254e48d"}, + {file = "nest_asyncio-1.5.8.tar.gz", hash = "sha256:25aa2ca0d2a5b5531956b9e273b45cf664cae2b145101d73b86b199978d48fdb"}, ] [[package]] name = "networkx" -version = "3.1" +version = "3.2.1" description = "Python package for creating and manipulating graphs and networks" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "networkx-3.1-py3-none-any.whl", hash = "sha256:4f33f68cb2afcf86f28a45f43efc27a9386b535d567d2127f8f61d51dec58d36"}, - {file = "networkx-3.1.tar.gz", hash = "sha256:de346335408f84de0eada6ff9fafafff9bcda11f0a0dfaa931133debb146ab61"}, + {file = "networkx-3.2.1-py3-none-any.whl", hash = "sha256:f18c69adc97877c42332c170849c96cefa91881c99a7cb3e95b7c659ebdc1ec2"}, + {file = "networkx-3.2.1.tar.gz", hash = "sha256:9f1bb5cf3409bf324e0a722c20bdb4c20ee39bf1c30ce8ae499c8502b0b5e0c6"}, ] [package.extras] -default = ["matplotlib (>=3.4)", "numpy (>=1.20)", "pandas (>=1.3)", "scipy (>=1.8)"] -developer = ["mypy (>=1.1)", "pre-commit (>=3.2)"] -doc = ["nb2plots (>=0.6)", "numpydoc (>=1.5)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.13)", "sphinx (>=6.1)", "sphinx-gallery (>=0.12)", "texext (>=0.6.7)"] -extra = ["lxml (>=4.6)", "pydot (>=1.4.2)", "pygraphviz (>=1.10)", "sympy (>=1.10)"] -test = ["codecov (>=2.1)", "pytest (>=7.2)", "pytest-cov (>=4.0)"] +default = ["matplotlib (>=3.5)", "numpy (>=1.22)", "pandas (>=1.4)", "scipy (>=1.9,!=1.11.0,!=1.11.1)"] +developer = ["changelist (==0.4)", "mypy (>=1.1)", "pre-commit (>=3.2)", "rtoml"] +doc = ["nb2plots (>=0.7)", "nbconvert (<7.9)", "numpydoc (>=1.6)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.14)", "sphinx (>=7)", "sphinx-gallery (>=0.14)", "texext (>=0.6.7)"] +extra = ["lxml (>=4.6)", "pydot (>=1.4.2)", "pygraphviz (>=1.11)", "sympy (>=1.10)"] +test = ["pytest (>=7.2)", "pytest-cov (>=4.0)"] [[package]] name = "notebook" -version = "7.0.3" +version = "7.0.6" description = "Jupyter Notebook - A web-based notebook environment for interactive computing" optional = false python-versions = ">=3.8" files = [ - {file = "notebook-7.0.3-py3-none-any.whl", hash = "sha256:786ab2e3287c068667adce3029b540dd18fc5d23f49181b4b4ee4f6b48a7ca81"}, - {file = "notebook-7.0.3.tar.gz", hash = "sha256:07f3c5062fd0e6e69864437a0347abc485d991aae87a92c47d659699f571b729"}, + {file = "notebook-7.0.6-py3-none-any.whl", hash = "sha256:0fe8f67102fea3744fedf652e4c15339390902ca70c5a31c4f547fa23da697cc"}, + {file = "notebook-7.0.6.tar.gz", hash = "sha256:ec6113b06529019f7f287819af06c97a2baf7a95ac21a8f6e32192898e9f9a58"}, ] [package.dependencies] @@ -2418,61 +2187,210 @@ test = ["pytest", "pytest-console-scripts", "pytest-jupyter", "pytest-tornasync" [[package]] name = "numpy" -version = "1.24.4" +version = "1.26.2" description = "Fundamental package for array computing in Python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" +files = [ + {file = "numpy-1.26.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3703fc9258a4a122d17043e57b35e5ef1c5a5837c3db8be396c82e04c1cf9b0f"}, + {file = "numpy-1.26.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cc392fdcbd21d4be6ae1bb4475a03ce3b025cd49a9be5345d76d7585aea69440"}, + {file = "numpy-1.26.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36340109af8da8805d8851ef1d74761b3b88e81a9bd80b290bbfed61bd2b4f75"}, + {file = "numpy-1.26.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bcc008217145b3d77abd3e4d5ef586e3bdfba8fe17940769f8aa09b99e856c00"}, + {file = "numpy-1.26.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3ced40d4e9e18242f70dd02d739e44698df3dcb010d31f495ff00a31ef6014fe"}, + {file = "numpy-1.26.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b272d4cecc32c9e19911891446b72e986157e6a1809b7b56518b4f3755267523"}, + {file = "numpy-1.26.2-cp310-cp310-win32.whl", hash = "sha256:22f8fc02fdbc829e7a8c578dd8d2e15a9074b630d4da29cda483337e300e3ee9"}, + {file = "numpy-1.26.2-cp310-cp310-win_amd64.whl", hash = "sha256:26c9d33f8e8b846d5a65dd068c14e04018d05533b348d9eaeef6c1bd787f9919"}, + {file = "numpy-1.26.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b96e7b9c624ef3ae2ae0e04fa9b460f6b9f17ad8b4bec6d7756510f1f6c0c841"}, + {file = "numpy-1.26.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:aa18428111fb9a591d7a9cc1b48150097ba6a7e8299fb56bdf574df650e7d1f1"}, + {file = "numpy-1.26.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06fa1ed84aa60ea6ef9f91ba57b5ed963c3729534e6e54055fc151fad0423f0a"}, + {file = "numpy-1.26.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96ca5482c3dbdd051bcd1fce8034603d6ebfc125a7bd59f55b40d8f5d246832b"}, + {file = "numpy-1.26.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:854ab91a2906ef29dc3925a064fcd365c7b4da743f84b123002f6139bcb3f8a7"}, + {file = "numpy-1.26.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f43740ab089277d403aa07567be138fc2a89d4d9892d113b76153e0e412409f8"}, + {file = "numpy-1.26.2-cp311-cp311-win32.whl", hash = "sha256:a2bbc29fcb1771cd7b7425f98b05307776a6baf43035d3b80c4b0f29e9545186"}, + {file = "numpy-1.26.2-cp311-cp311-win_amd64.whl", hash = "sha256:2b3fca8a5b00184828d12b073af4d0fc5fdd94b1632c2477526f6bd7842d700d"}, + {file = "numpy-1.26.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a4cd6ed4a339c21f1d1b0fdf13426cb3b284555c27ac2f156dfdaaa7e16bfab0"}, + {file = "numpy-1.26.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5d5244aabd6ed7f312268b9247be47343a654ebea52a60f002dc70c769048e75"}, + {file = "numpy-1.26.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a3cdb4d9c70e6b8c0814239ead47da00934666f668426fc6e94cce869e13fd7"}, + {file = "numpy-1.26.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa317b2325f7aa0a9471663e6093c210cb2ae9c0ad824732b307d2c51983d5b6"}, + {file = "numpy-1.26.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:174a8880739c16c925799c018f3f55b8130c1f7c8e75ab0a6fa9d41cab092fd6"}, + {file = "numpy-1.26.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f79b231bf5c16b1f39c7f4875e1ded36abee1591e98742b05d8a0fb55d8a3eec"}, + {file = "numpy-1.26.2-cp312-cp312-win32.whl", hash = "sha256:4a06263321dfd3598cacb252f51e521a8cb4b6df471bb12a7ee5cbab20ea9167"}, + {file = "numpy-1.26.2-cp312-cp312-win_amd64.whl", hash = "sha256:b04f5dc6b3efdaab541f7857351aac359e6ae3c126e2edb376929bd3b7f92d7e"}, + {file = "numpy-1.26.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4eb8df4bf8d3d90d091e0146f6c28492b0be84da3e409ebef54349f71ed271ef"}, + {file = "numpy-1.26.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1a13860fdcd95de7cf58bd6f8bc5a5ef81c0b0625eb2c9a783948847abbef2c2"}, + {file = "numpy-1.26.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64308ebc366a8ed63fd0bf426b6a9468060962f1a4339ab1074c228fa6ade8e3"}, + {file = "numpy-1.26.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baf8aab04a2c0e859da118f0b38617e5ee65d75b83795055fb66c0d5e9e9b818"}, + {file = "numpy-1.26.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d73a3abcac238250091b11caef9ad12413dab01669511779bc9b29261dd50210"}, + {file = "numpy-1.26.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b361d369fc7e5e1714cf827b731ca32bff8d411212fccd29ad98ad622449cc36"}, + {file = "numpy-1.26.2-cp39-cp39-win32.whl", hash = "sha256:bd3f0091e845164a20bd5a326860c840fe2af79fa12e0469a12768a3ec578d80"}, + {file = "numpy-1.26.2-cp39-cp39-win_amd64.whl", hash = "sha256:2beef57fb031dcc0dc8fa4fe297a742027b954949cabb52a2a376c144e5e6060"}, + {file = "numpy-1.26.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:1cc3d5029a30fb5f06704ad6b23b35e11309491c999838c31f124fee32107c79"}, + {file = "numpy-1.26.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94cc3c222bb9fb5a12e334d0479b97bb2df446fbe622b470928f5284ffca3f8d"}, + {file = "numpy-1.26.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fe6b44fb8fcdf7eda4ef4461b97b3f63c466b27ab151bec2366db8b197387841"}, + {file = "numpy-1.26.2.tar.gz", hash = "sha256:f65738447676ab5777f11e6bbbdb8ce11b785e105f690bc45966574816b6d3ea"}, +] + +[[package]] +name = "nvidia-cublas-cu12" +version = "12.1.3.1" +description = "CUBLAS native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cublas_cu12-12.1.3.1-py3-none-manylinux1_x86_64.whl", hash = "sha256:ee53ccca76a6fc08fb9701aa95b6ceb242cdaab118c3bb152af4e579af792728"}, + {file = "nvidia_cublas_cu12-12.1.3.1-py3-none-win_amd64.whl", hash = "sha256:2b964d60e8cf11b5e1073d179d85fa340c120e99b3067558f3cf98dd69d02906"}, +] + +[[package]] +name = "nvidia-cuda-cupti-cu12" +version = "12.1.105" +description = "CUDA profiling tools runtime libs." +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cuda_cupti_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:e54fde3983165c624cb79254ae9818a456eb6e87a7fd4d56a2352c24ee542d7e"}, + {file = "nvidia_cuda_cupti_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:bea8236d13a0ac7190bd2919c3e8e6ce1e402104276e6f9694479e48bb0eb2a4"}, +] + +[[package]] +name = "nvidia-cuda-nvrtc-cu12" +version = "12.1.105" +description = "NVRTC native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:339b385f50c309763ca65456ec75e17bbefcbbf2893f462cb8b90584cd27a1c2"}, + {file = "nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:0a98a522d9ff138b96c010a65e145dc1b4850e9ecb75a0172371793752fd46ed"}, +] + +[[package]] +name = "nvidia-cuda-runtime-cu12" +version = "12.1.105" +description = "CUDA Runtime native Libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cuda_runtime_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:6e258468ddf5796e25f1dc591a31029fa317d97a0a94ed93468fc86301d61e40"}, + {file = "nvidia_cuda_runtime_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:dfb46ef84d73fababab44cf03e3b83f80700d27ca300e537f85f636fac474344"}, +] + +[[package]] +name = "nvidia-cudnn-cu12" +version = "8.9.2.26" +description = "cuDNN runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cudnn_cu12-8.9.2.26-py3-none-manylinux1_x86_64.whl", hash = "sha256:5ccb288774fdfb07a7e7025ffec286971c06d8d7b4fb162525334616d7629ff9"}, +] + +[package.dependencies] +nvidia-cublas-cu12 = "*" + +[[package]] +name = "nvidia-cufft-cu12" +version = "11.0.2.54" +description = "CUFFT native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cufft_cu12-11.0.2.54-py3-none-manylinux1_x86_64.whl", hash = "sha256:794e3948a1aa71fd817c3775866943936774d1c14e7628c74f6f7417224cdf56"}, + {file = "nvidia_cufft_cu12-11.0.2.54-py3-none-win_amd64.whl", hash = "sha256:d9ac353f78ff89951da4af698f80870b1534ed69993f10a4cf1d96f21357e253"}, +] + +[[package]] +name = "nvidia-curand-cu12" +version = "10.3.2.106" +description = "CURAND native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_curand_cu12-10.3.2.106-py3-none-manylinux1_x86_64.whl", hash = "sha256:9d264c5036dde4e64f1de8c50ae753237c12e0b1348738169cd0f8a536c0e1e0"}, + {file = "nvidia_curand_cu12-10.3.2.106-py3-none-win_amd64.whl", hash = "sha256:75b6b0c574c0037839121317e17fd01f8a69fd2ef8e25853d826fec30bdba74a"}, +] + +[[package]] +name = "nvidia-cusolver-cu12" +version = "11.4.5.107" +description = "CUDA solver native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cusolver_cu12-11.4.5.107-py3-none-manylinux1_x86_64.whl", hash = "sha256:8a7ec542f0412294b15072fa7dab71d31334014a69f953004ea7a118206fe0dd"}, + {file = "nvidia_cusolver_cu12-11.4.5.107-py3-none-win_amd64.whl", hash = "sha256:74e0c3a24c78612192a74fcd90dd117f1cf21dea4822e66d89e8ea80e3cd2da5"}, +] + +[package.dependencies] +nvidia-cublas-cu12 = "*" +nvidia-cusparse-cu12 = "*" +nvidia-nvjitlink-cu12 = "*" + +[[package]] +name = "nvidia-cusparse-cu12" +version = "12.1.0.106" +description = "CUSPARSE native runtime libraries" +optional = false +python-versions = ">=3" files = [ - {file = "numpy-1.24.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c0bfb52d2169d58c1cdb8cc1f16989101639b34c7d3ce60ed70b19c63eba0b64"}, - {file = "numpy-1.24.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ed094d4f0c177b1b8e7aa9cba7d6ceed51c0e569a5318ac0ca9a090680a6a1b1"}, - {file = "numpy-1.24.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79fc682a374c4a8ed08b331bef9c5f582585d1048fa6d80bc6c35bc384eee9b4"}, - {file = "numpy-1.24.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ffe43c74893dbf38c2b0a1f5428760a1a9c98285553c89e12d70a96a7f3a4d6"}, - {file = "numpy-1.24.4-cp310-cp310-win32.whl", hash = "sha256:4c21decb6ea94057331e111a5bed9a79d335658c27ce2adb580fb4d54f2ad9bc"}, - {file = "numpy-1.24.4-cp310-cp310-win_amd64.whl", hash = "sha256:b4bea75e47d9586d31e892a7401f76e909712a0fd510f58f5337bea9572c571e"}, - {file = "numpy-1.24.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f136bab9c2cfd8da131132c2cf6cc27331dd6fae65f95f69dcd4ae3c3639c810"}, - {file = "numpy-1.24.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e2926dac25b313635e4d6cf4dc4e51c8c0ebfed60b801c799ffc4c32bf3d1254"}, - {file = "numpy-1.24.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:222e40d0e2548690405b0b3c7b21d1169117391c2e82c378467ef9ab4c8f0da7"}, - {file = "numpy-1.24.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7215847ce88a85ce39baf9e89070cb860c98fdddacbaa6c0da3ffb31b3350bd5"}, - {file = "numpy-1.24.4-cp311-cp311-win32.whl", hash = "sha256:4979217d7de511a8d57f4b4b5b2b965f707768440c17cb70fbf254c4b225238d"}, - {file = "numpy-1.24.4-cp311-cp311-win_amd64.whl", hash = "sha256:b7b1fc9864d7d39e28f41d089bfd6353cb5f27ecd9905348c24187a768c79694"}, - {file = "numpy-1.24.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1452241c290f3e2a312c137a9999cdbf63f78864d63c79039bda65ee86943f61"}, - {file = "numpy-1.24.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:04640dab83f7c6c85abf9cd729c5b65f1ebd0ccf9de90b270cd61935eef0197f"}, - {file = "numpy-1.24.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5425b114831d1e77e4b5d812b69d11d962e104095a5b9c3b641a218abcc050e"}, - {file = "numpy-1.24.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd80e219fd4c71fc3699fc1dadac5dcf4fd882bfc6f7ec53d30fa197b8ee22dc"}, - {file = "numpy-1.24.4-cp38-cp38-win32.whl", hash = "sha256:4602244f345453db537be5314d3983dbf5834a9701b7723ec28923e2889e0bb2"}, - {file = "numpy-1.24.4-cp38-cp38-win_amd64.whl", hash = "sha256:692f2e0f55794943c5bfff12b3f56f99af76f902fc47487bdfe97856de51a706"}, - {file = "numpy-1.24.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2541312fbf09977f3b3ad449c4e5f4bb55d0dbf79226d7724211acc905049400"}, - {file = "numpy-1.24.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9667575fb6d13c95f1b36aca12c5ee3356bf001b714fc354eb5465ce1609e62f"}, - {file = "numpy-1.24.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3a86ed21e4f87050382c7bc96571755193c4c1392490744ac73d660e8f564a9"}, - {file = "numpy-1.24.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d11efb4dbecbdf22508d55e48d9c8384db795e1b7b51ea735289ff96613ff74d"}, - {file = "numpy-1.24.4-cp39-cp39-win32.whl", hash = "sha256:6620c0acd41dbcb368610bb2f4d83145674040025e5536954782467100aa8835"}, - {file = "numpy-1.24.4-cp39-cp39-win_amd64.whl", hash = "sha256:befe2bf740fd8373cf56149a5c23a0f601e82869598d41f8e188a0e9869926f8"}, - {file = "numpy-1.24.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:31f13e25b4e304632a4619d0e0777662c2ffea99fcae2029556b17d8ff958aef"}, - {file = "numpy-1.24.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95f7ac6540e95bc440ad77f56e520da5bf877f87dca58bd095288dce8940532a"}, - {file = "numpy-1.24.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e98f220aa76ca2a977fe435f5b04d7b3470c0a2e6312907b37ba6068f26787f2"}, - {file = "numpy-1.24.4.tar.gz", hash = "sha256:80f5e3a4e498641401868df4208b74581206afbee7cf7b8329daae82676d9463"}, + {file = "nvidia_cusparse_cu12-12.1.0.106-py3-none-manylinux1_x86_64.whl", hash = "sha256:f3b50f42cf363f86ab21f720998517a659a48131e8d538dc02f8768237bd884c"}, + {file = "nvidia_cusparse_cu12-12.1.0.106-py3-none-win_amd64.whl", hash = "sha256:b798237e81b9719373e8fae8d4f091b70a0cf09d9d85c95a557e11df2d8e9a5a"}, ] +[package.dependencies] +nvidia-nvjitlink-cu12 = "*" + [[package]] name = "nvidia-ml-py" -version = "12.535.108" +version = "12.535.133" description = "Python Bindings for the NVIDIA Management Library" optional = false python-versions = "*" files = [ - {file = "nvidia-ml-py-12.535.108.tar.gz", hash = "sha256:141fe818771a165fb93f75dbe7f01f767c3bafa7c13f6876f53583511b078ee1"}, - {file = "nvidia_ml_py-12.535.108-py3-none-any.whl", hash = "sha256:f4e260ad0adb06d7ca1ea5574862ed4ef70f0a17720836854594fe188a3acaf4"}, + {file = "nvidia-ml-py-12.535.133.tar.gz", hash = "sha256:b1559af0d57dd20955bf58d05afff7b166ddd44947eb3051c9905638799eb1dc"}, + {file = "nvidia_ml_py-12.535.133-py3-none-any.whl", hash = "sha256:91d808d3f246d30bead2a0a2540b74b9e9fc584a9c3f1f55abfc2940c4e44fd2"}, +] + +[[package]] +name = "nvidia-nccl-cu12" +version = "2.18.1" +description = "NVIDIA Collective Communication Library (NCCL) Runtime" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_nccl_cu12-2.18.1-py3-none-manylinux1_x86_64.whl", hash = "sha256:1a6c4acefcbebfa6de320f412bf7866de856e786e0462326ba1bac40de0b5e71"}, +] + +[[package]] +name = "nvidia-nvjitlink-cu12" +version = "12.3.101" +description = "Nvidia JIT LTO Library" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_nvjitlink_cu12-12.3.101-py3-none-manylinux1_x86_64.whl", hash = "sha256:64335a8088e2b9d196ae8665430bc6a2b7e6ef2eb877a9c735c804bd4ff6467c"}, + {file = "nvidia_nvjitlink_cu12-12.3.101-py3-none-win_amd64.whl", hash = "sha256:1b2e317e437433753530792f13eece58f0aec21a2b05903be7bffe58a606cbd1"}, +] + +[[package]] +name = "nvidia-nvtx-cu12" +version = "12.1.105" +description = "NVIDIA Tools Extension" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_nvtx_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:dc21cf308ca5691e7c04d962e213f8a4aa9bbfa23d95412f452254c2caeb09e5"}, + {file = "nvidia_nvtx_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:65f4d98982b31b60026e0e6de73fbdfc09d08a96f4656dd3665ca616a11e1e82"}, ] [[package]] name = "nvitop" -version = "1.3.0" +version = "1.3.1" description = "An interactive NVIDIA-GPU process viewer and beyond, the one-stop solution for GPU process management." optional = false python-versions = ">=3.7" files = [ - {file = "nvitop-1.3.0-py3-none-any.whl", hash = "sha256:bb311716b708a7991c6ecbcb2809f2cd1f47f168c3958888e70207f41d03c23e"}, - {file = "nvitop-1.3.0.tar.gz", hash = "sha256:dc52a82cb7af78de9500adbf44a2eaed58277052da8753fde081199c40453e65"}, + {file = "nvitop-1.3.1-py3-none-any.whl", hash = "sha256:1840921af6f1009de44b8ddef1b631ee7917133f768cb91a39c1bd748e3f97d2"}, + {file = "nvitop-1.3.1.tar.gz", hash = "sha256:10334472fd8e1825cbaa18680f2bfade688e784e4b91741e5f9b99a1df6ced95"}, ] [package.dependencies] @@ -2497,6 +2415,7 @@ pynvml-11-515-75 = ["nvidia-ml-py (==11.515.75)"] pynvml-11-525-112 = ["nvidia-ml-py (==11.525.112)"] pynvml-11-525-131 = ["nvidia-ml-py (==11.525.131)"] pynvml-11-525-84 = ["nvidia-ml-py (==11.525.84)"] +pynvml-12-535-108 = ["nvidia-ml-py (==12.535.108)"] pynvml-12-535-77 = ["nvidia-ml-py (==12.535.77)"] [[package]] @@ -2529,20 +2448,6 @@ files = [ [package.dependencies] et-xmlfile = "*" -[[package]] -name = "ordered-set" -version = "4.1.0" -description = "An OrderedSet is a custom MutableSet that remembers its order, so that every" -optional = false -python-versions = ">=3.7" -files = [ - {file = "ordered-set-4.1.0.tar.gz", hash = "sha256:694a8e44c87657c59292ede72891eb91d34131f6531463aab3009191c77364a8"}, - {file = "ordered_set-4.1.0-py3-none-any.whl", hash = "sha256:046e1132c71fcf3330438a539928932caf51ddbc582496833e23de611de14562"}, -] - -[package.extras] -dev = ["black", "mypy", "pytest"] - [[package]] name = "overrides" version = "7.4.0" @@ -2556,81 +2461,82 @@ files = [ [[package]] name = "packaging" -version = "23.1" +version = "23.2" description = "Core utilities for Python packages" optional = false python-versions = ">=3.7" files = [ - {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, - {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, + {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, + {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, ] [[package]] name = "pandas" -version = "2.0.3" +version = "2.1.3" description = "Powerful data structures for data analysis, time series, and statistics" optional = false -python-versions = ">=3.8" -files = [ - {file = "pandas-2.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e4c7c9f27a4185304c7caf96dc7d91bc60bc162221152de697c98eb0b2648dd8"}, - {file = "pandas-2.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f167beed68918d62bffb6ec64f2e1d8a7d297a038f86d4aed056b9493fca407f"}, - {file = "pandas-2.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce0c6f76a0f1ba361551f3e6dceaff06bde7514a374aa43e33b588ec10420183"}, - {file = "pandas-2.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba619e410a21d8c387a1ea6e8a0e49bb42216474436245718d7f2e88a2f8d7c0"}, - {file = "pandas-2.0.3-cp310-cp310-win32.whl", hash = "sha256:3ef285093b4fe5058eefd756100a367f27029913760773c8bf1d2d8bebe5d210"}, - {file = "pandas-2.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:9ee1a69328d5c36c98d8e74db06f4ad518a1840e8ccb94a4ba86920986bb617e"}, - {file = "pandas-2.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b084b91d8d66ab19f5bb3256cbd5ea661848338301940e17f4492b2ce0801fe8"}, - {file = "pandas-2.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:37673e3bdf1551b95bf5d4ce372b37770f9529743d2498032439371fc7b7eb26"}, - {file = "pandas-2.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9cb1e14fdb546396b7e1b923ffaeeac24e4cedd14266c3497216dd4448e4f2d"}, - {file = "pandas-2.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9cd88488cceb7635aebb84809d087468eb33551097d600c6dad13602029c2df"}, - {file = "pandas-2.0.3-cp311-cp311-win32.whl", hash = "sha256:694888a81198786f0e164ee3a581df7d505024fbb1f15202fc7db88a71d84ebd"}, - {file = "pandas-2.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:6a21ab5c89dcbd57f78d0ae16630b090eec626360085a4148693def5452d8a6b"}, - {file = "pandas-2.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9e4da0d45e7f34c069fe4d522359df7d23badf83abc1d1cef398895822d11061"}, - {file = "pandas-2.0.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:32fca2ee1b0d93dd71d979726b12b61faa06aeb93cf77468776287f41ff8fdc5"}, - {file = "pandas-2.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:258d3624b3ae734490e4d63c430256e716f488c4fcb7c8e9bde2d3aa46c29089"}, - {file = "pandas-2.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eae3dc34fa1aa7772dd3fc60270d13ced7346fcbcfee017d3132ec625e23bb0"}, - {file = "pandas-2.0.3-cp38-cp38-win32.whl", hash = "sha256:f3421a7afb1a43f7e38e82e844e2bca9a6d793d66c1a7f9f0ff39a795bbc5e02"}, - {file = "pandas-2.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:69d7f3884c95da3a31ef82b7618af5710dba95bb885ffab339aad925c3e8ce78"}, - {file = "pandas-2.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5247fb1ba347c1261cbbf0fcfba4a3121fbb4029d95d9ef4dc45406620b25c8b"}, - {file = "pandas-2.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:81af086f4543c9d8bb128328b5d32e9986e0c84d3ee673a2ac6fb57fd14f755e"}, - {file = "pandas-2.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1994c789bf12a7c5098277fb43836ce090f1073858c10f9220998ac74f37c69b"}, - {file = "pandas-2.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ec591c48e29226bcbb316e0c1e9423622bc7a4eaf1ef7c3c9fa1a3981f89641"}, - {file = "pandas-2.0.3-cp39-cp39-win32.whl", hash = "sha256:04dbdbaf2e4d46ca8da896e1805bc04eb85caa9a82e259e8eed00254d5e0c682"}, - {file = "pandas-2.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:1168574b036cd8b93abc746171c9b4f1b83467438a5e45909fed645cf8692dbc"}, - {file = "pandas-2.0.3.tar.gz", hash = "sha256:c02f372a88e0d17f36d3093a644c73cfc1788e876a7c4bcb4020a77512e2043c"}, +python-versions = ">=3.9" +files = [ + {file = "pandas-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:acf08a73b5022b479c1be155d4988b72f3020f308f7a87c527702c5f8966d34f"}, + {file = "pandas-2.1.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3cc4469ff0cf9aa3a005870cb49ab8969942b7156e0a46cc3f5abd6b11051dfb"}, + {file = "pandas-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35172bff95f598cc5866c047f43c7f4df2c893acd8e10e6653a4b792ed7f19bb"}, + {file = "pandas-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59dfe0e65a2f3988e940224e2a70932edc964df79f3356e5f2997c7d63e758b4"}, + {file = "pandas-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0296a66200dee556850d99b24c54c7dfa53a3264b1ca6f440e42bad424caea03"}, + {file = "pandas-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:465571472267a2d6e00657900afadbe6097c8e1dc43746917db4dfc862e8863e"}, + {file = "pandas-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:04d4c58e1f112a74689da707be31cf689db086949c71828ef5da86727cfe3f82"}, + {file = "pandas-2.1.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7fa2ad4ff196768ae63a33f8062e6838efed3a319cf938fdf8b95e956c813042"}, + {file = "pandas-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4441ac94a2a2613e3982e502ccec3bdedefe871e8cea54b8775992485c5660ef"}, + {file = "pandas-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5ded6ff28abbf0ea7689f251754d3789e1edb0c4d0d91028f0b980598418a58"}, + {file = "pandas-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fca5680368a5139d4920ae3dc993eb5106d49f814ff24018b64d8850a52c6ed2"}, + {file = "pandas-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:de21e12bf1511190fc1e9ebc067f14ca09fccfb189a813b38d63211d54832f5f"}, + {file = "pandas-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a5d53c725832e5f1645e7674989f4c106e4b7249c1d57549023ed5462d73b140"}, + {file = "pandas-2.1.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7cf4cf26042476e39394f1f86868d25b265ff787c9b2f0d367280f11afbdee6d"}, + {file = "pandas-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72c84ec1b1d8e5efcbff5312abe92bfb9d5b558f11e0cf077f5496c4f4a3c99e"}, + {file = "pandas-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f539e113739a3e0cc15176bf1231a553db0239bfa47a2c870283fd93ba4f683"}, + {file = "pandas-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fc77309da3b55732059e484a1efc0897f6149183c522390772d3561f9bf96c00"}, + {file = "pandas-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:08637041279b8981a062899da0ef47828df52a1838204d2b3761fbd3e9fcb549"}, + {file = "pandas-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b99c4e51ef2ed98f69099c72c75ec904dd610eb41a32847c4fcbc1a975f2d2b8"}, + {file = "pandas-2.1.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f7ea8ae8004de0381a2376662c0505bb0a4f679f4c61fbfd122aa3d1b0e5f09d"}, + {file = "pandas-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fcd76d67ca2d48f56e2db45833cf9d58f548f97f61eecd3fdc74268417632b8a"}, + {file = "pandas-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1329dbe93a880a3d7893149979caa82d6ba64a25e471682637f846d9dbc10dd2"}, + {file = "pandas-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:321ecdb117bf0f16c339cc6d5c9a06063854f12d4d9bc422a84bb2ed3207380a"}, + {file = "pandas-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:11a771450f36cebf2a4c9dbd3a19dfa8c46c4b905a3ea09dc8e556626060fe71"}, + {file = "pandas-2.1.3.tar.gz", hash = "sha256:22929f84bca106921917eb73c1521317ddd0a4c71b395bcf767a106e3494209f"}, ] [package.dependencies] numpy = [ - {version = ">=1.20.3", markers = "python_version < \"3.10\""}, - {version = ">=1.21.0", markers = "python_version >= \"3.10\""}, - {version = ">=1.23.2", markers = "python_version >= \"3.11\""}, + {version = ">=1.22.4,<2", markers = "python_version < \"3.11\""}, + {version = ">=1.23.2,<2", markers = "python_version == \"3.11\""}, + {version = ">=1.26.0,<2", markers = "python_version >= \"3.12\""}, ] python-dateutil = ">=2.8.2" pytz = ">=2020.1" tzdata = ">=2022.1" [package.extras] -all = ["PyQt5 (>=5.15.1)", "SQLAlchemy (>=1.4.16)", "beautifulsoup4 (>=4.9.3)", "bottleneck (>=1.3.2)", "brotlipy (>=0.7.0)", "fastparquet (>=0.6.3)", "fsspec (>=2021.07.0)", "gcsfs (>=2021.07.0)", "html5lib (>=1.1)", "hypothesis (>=6.34.2)", "jinja2 (>=3.0.0)", "lxml (>=4.6.3)", "matplotlib (>=3.6.1)", "numba (>=0.53.1)", "numexpr (>=2.7.3)", "odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pandas-gbq (>=0.15.0)", "psycopg2 (>=2.8.6)", "pyarrow (>=7.0.0)", "pymysql (>=1.0.2)", "pyreadstat (>=1.1.2)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)", "python-snappy (>=0.6.0)", "pyxlsb (>=1.0.8)", "qtpy (>=2.2.0)", "s3fs (>=2021.08.0)", "scipy (>=1.7.1)", "tables (>=3.6.1)", "tabulate (>=0.8.9)", "xarray (>=0.21.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)", "zstandard (>=0.15.2)"] -aws = ["s3fs (>=2021.08.0)"] -clipboard = ["PyQt5 (>=5.15.1)", "qtpy (>=2.2.0)"] -compression = ["brotlipy (>=0.7.0)", "python-snappy (>=0.6.0)", "zstandard (>=0.15.2)"] -computation = ["scipy (>=1.7.1)", "xarray (>=0.21.0)"] -excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pyxlsb (>=1.0.8)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)"] +all = ["PyQt5 (>=5.15.6)", "SQLAlchemy (>=1.4.36)", "beautifulsoup4 (>=4.11.1)", "bottleneck (>=1.3.4)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=0.8.1)", "fsspec (>=2022.05.0)", "gcsfs (>=2022.05.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.8.0)", "matplotlib (>=3.6.1)", "numba (>=0.55.2)", "numexpr (>=2.8.0)", "odfpy (>=1.4.1)", "openpyxl (>=3.0.10)", "pandas-gbq (>=0.17.5)", "psycopg2 (>=2.9.3)", "pyarrow (>=7.0.0)", "pymysql (>=1.0.2)", "pyreadstat (>=1.1.5)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "pyxlsb (>=1.0.9)", "qtpy (>=2.2.0)", "s3fs (>=2022.05.0)", "scipy (>=1.8.1)", "tables (>=3.7.0)", "tabulate (>=0.8.10)", "xarray (>=2022.03.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.3)", "zstandard (>=0.17.0)"] +aws = ["s3fs (>=2022.05.0)"] +clipboard = ["PyQt5 (>=5.15.6)", "qtpy (>=2.2.0)"] +compression = ["zstandard (>=0.17.0)"] +computation = ["scipy (>=1.8.1)", "xarray (>=2022.03.0)"] +consortium-standard = ["dataframe-api-compat (>=0.1.7)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.0.10)", "pyxlsb (>=1.0.9)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.3)"] feather = ["pyarrow (>=7.0.0)"] -fss = ["fsspec (>=2021.07.0)"] -gcp = ["gcsfs (>=2021.07.0)", "pandas-gbq (>=0.15.0)"] -hdf5 = ["tables (>=3.6.1)"] -html = ["beautifulsoup4 (>=4.9.3)", "html5lib (>=1.1)", "lxml (>=4.6.3)"] -mysql = ["SQLAlchemy (>=1.4.16)", "pymysql (>=1.0.2)"] -output-formatting = ["jinja2 (>=3.0.0)", "tabulate (>=0.8.9)"] +fss = ["fsspec (>=2022.05.0)"] +gcp = ["gcsfs (>=2022.05.0)", "pandas-gbq (>=0.17.5)"] +hdf5 = ["tables (>=3.7.0)"] +html = ["beautifulsoup4 (>=4.11.1)", "html5lib (>=1.1)", "lxml (>=4.8.0)"] +mysql = ["SQLAlchemy (>=1.4.36)", "pymysql (>=1.0.2)"] +output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.8.10)"] parquet = ["pyarrow (>=7.0.0)"] -performance = ["bottleneck (>=1.3.2)", "numba (>=0.53.1)", "numexpr (>=2.7.1)"] +performance = ["bottleneck (>=1.3.4)", "numba (>=0.55.2)", "numexpr (>=2.8.0)"] plot = ["matplotlib (>=3.6.1)"] -postgresql = ["SQLAlchemy (>=1.4.16)", "psycopg2 (>=2.8.6)"] -spss = ["pyreadstat (>=1.1.2)"] -sql-other = ["SQLAlchemy (>=1.4.16)"] -test = ["hypothesis (>=6.34.2)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)"] -xml = ["lxml (>=4.6.3)"] +postgresql = ["SQLAlchemy (>=1.4.36)", "psycopg2 (>=2.9.3)"] +spss = ["pyreadstat (>=1.1.5)"] +sql-other = ["SQLAlchemy (>=1.4.36)"] +test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"] +xml = ["lxml (>=4.8.0)"] [[package]] name = "pandocfilters" @@ -2658,17 +2564,6 @@ files = [ qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] testing = ["docopt", "pytest (<6.0.0)"] -[[package]] -name = "pathspec" -version = "0.11.2" -description = "Utility library for gitignore style pattern matching of file paths." -optional = false -python-versions = ">=3.7" -files = [ - {file = "pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"}, - {file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"}, -] - [[package]] name = "pathtools" version = "0.1.2" @@ -2693,37 +2588,15 @@ files = [ [package.dependencies] ptyprocess = ">=0.5" -[[package]] -name = "pickleshare" -version = "0.7.5" -description = "Tiny 'shelve'-like database with concurrency support" -optional = false -python-versions = "*" -files = [ - {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, - {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, -] - -[[package]] -name = "pkgutil-resolve-name" -version = "1.3.10" -description = "Resolve a name to an object." -optional = false -python-versions = ">=3.6" -files = [ - {file = "pkgutil_resolve_name-1.3.10-py3-none-any.whl", hash = "sha256:ca27cc078d25c5ad71a9de0a7a330146c4e014c2462d9af19c6b828280649c5e"}, - {file = "pkgutil_resolve_name-1.3.10.tar.gz", hash = "sha256:357d6c9e6a755653cfd78893817c0853af365dd51ec97f3d358a819373bbd174"}, -] - [[package]] name = "platformdirs" -version = "3.10.0" +version = "4.0.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." optional = false python-versions = ">=3.7" files = [ - {file = "platformdirs-3.10.0-py3-none-any.whl", hash = "sha256:d7c24979f292f916dc9cbf8648319032f551ea8c49a4c9bf2fb556a02070ec1d"}, - {file = "platformdirs-3.10.0.tar.gz", hash = "sha256:b45696dab2d7cc691a3226759c0d3b00c47c8b6e293d96f6436f733303f77f6d"}, + {file = "platformdirs-4.0.0-py3-none-any.whl", hash = "sha256:118c954d7e949b35437270383a3f2531e99dd93cf7ce4dc8340d3356d30f173b"}, + {file = "platformdirs-4.0.0.tar.gz", hash = "sha256:cb633b2bcf10c51af60beb0ab06d2f1d69064b43abf4c185ca6b28865f3f9731"}, ] [package.extras] @@ -2747,13 +2620,13 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "prometheus-client" -version = "0.17.1" +version = "0.18.0" description = "Python client for the Prometheus monitoring system." optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "prometheus_client-0.17.1-py3-none-any.whl", hash = "sha256:e537f37160f6807b8202a6fc4764cdd19bac5480ddd3e0d463c3002b34462101"}, - {file = "prometheus_client-0.17.1.tar.gz", hash = "sha256:21e674f39831ae3f8acde238afd9a27a37d0d2fb5a28ea094f0ce25d2cbf2091"}, + {file = "prometheus_client-0.18.0-py3-none-any.whl", hash = "sha256:8de3ae2755f890826f4b6479e5571d4f74ac17a81345fe69a6778fdb92579184"}, + {file = "prometheus_client-0.18.0.tar.gz", hash = "sha256:35f7a8c22139e2bb7ca5a698e92d38145bc8dc74c1c0bf56f25cca886a764e17"}, ] [package.extras] @@ -2761,13 +2634,13 @@ twisted = ["twisted"] [[package]] name = "prompt-toolkit" -version = "3.0.39" +version = "3.0.41" description = "Library for building powerful interactive command lines in Python" optional = false python-versions = ">=3.7.0" files = [ - {file = "prompt_toolkit-3.0.39-py3-none-any.whl", hash = "sha256:9dffbe1d8acf91e3de75f3b544e4842382fc06c6babe903ac9acb74dc6e08d88"}, - {file = "prompt_toolkit-3.0.39.tar.gz", hash = "sha256:04505ade687dc26dc4284b1ad19a83be2f2afe83e7a828ace0c72f3a1df72aac"}, + {file = "prompt_toolkit-3.0.41-py3-none-any.whl", hash = "sha256:f36fe301fafb7470e86aaf90f036eef600a3210be4decf461a5b1ca8403d3cb2"}, + {file = "prompt_toolkit-3.0.41.tar.gz", hash = "sha256:941367d97fc815548822aa26c2a269fdc4eb21e9ec05fc5d447cf09bad5d75f0"}, ] [package.dependencies] @@ -2775,47 +2648,49 @@ wcwidth = "*" [[package]] name = "protobuf" -version = "4.24.3" +version = "4.23.4" description = "" optional = false python-versions = ">=3.7" files = [ - {file = "protobuf-4.24.3-cp310-abi3-win32.whl", hash = "sha256:20651f11b6adc70c0f29efbe8f4a94a74caf61b6200472a9aea6e19898f9fcf4"}, - {file = "protobuf-4.24.3-cp310-abi3-win_amd64.whl", hash = "sha256:3d42e9e4796a811478c783ef63dc85b5a104b44aaaca85d4864d5b886e4b05e3"}, - {file = "protobuf-4.24.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:6e514e8af0045be2b56e56ae1bb14f43ce7ffa0f68b1c793670ccbe2c4fc7d2b"}, - {file = "protobuf-4.24.3-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:ba53c2f04798a326774f0e53b9c759eaef4f6a568ea7072ec6629851c8435959"}, - {file = "protobuf-4.24.3-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:f6ccbcf027761a2978c1406070c3788f6de4a4b2cc20800cc03d52df716ad675"}, - {file = "protobuf-4.24.3-cp37-cp37m-win32.whl", hash = "sha256:1b182c7181a2891e8f7f3a1b5242e4ec54d1f42582485a896e4de81aa17540c2"}, - {file = "protobuf-4.24.3-cp37-cp37m-win_amd64.whl", hash = "sha256:b0271a701e6782880d65a308ba42bc43874dabd1a0a0f41f72d2dac3b57f8e76"}, - {file = "protobuf-4.24.3-cp38-cp38-win32.whl", hash = "sha256:e29d79c913f17a60cf17c626f1041e5288e9885c8579832580209de8b75f2a52"}, - {file = "protobuf-4.24.3-cp38-cp38-win_amd64.whl", hash = "sha256:067f750169bc644da2e1ef18c785e85071b7c296f14ac53e0900e605da588719"}, - {file = "protobuf-4.24.3-cp39-cp39-win32.whl", hash = "sha256:2da777d34b4f4f7613cdf85c70eb9a90b1fbef9d36ae4a0ccfe014b0b07906f1"}, - {file = "protobuf-4.24.3-cp39-cp39-win_amd64.whl", hash = "sha256:f631bb982c5478e0c1c70eab383af74a84be66945ebf5dd6b06fc90079668d0b"}, - {file = "protobuf-4.24.3-py3-none-any.whl", hash = "sha256:f6f8dc65625dadaad0c8545319c2e2f0424fede988368893ca3844261342c11a"}, - {file = "protobuf-4.24.3.tar.gz", hash = "sha256:12e9ad2ec079b833176d2921be2cb24281fa591f0b119b208b788adc48c2561d"}, + {file = "protobuf-4.23.4-cp310-abi3-win32.whl", hash = "sha256:5fea3c64d41ea5ecf5697b83e41d09b9589e6f20b677ab3c48e5f242d9b7897b"}, + {file = "protobuf-4.23.4-cp310-abi3-win_amd64.whl", hash = "sha256:7b19b6266d92ca6a2a87effa88ecc4af73ebc5cfde194dc737cf8ef23a9a3b12"}, + {file = "protobuf-4.23.4-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:8547bf44fe8cec3c69e3042f5c4fb3e36eb2a7a013bb0a44c018fc1e427aafbd"}, + {file = "protobuf-4.23.4-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:fee88269a090ada09ca63551bf2f573eb2424035bcf2cb1b121895b01a46594a"}, + {file = "protobuf-4.23.4-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:effeac51ab79332d44fba74660d40ae79985901ac21bca408f8dc335a81aa597"}, + {file = "protobuf-4.23.4-cp37-cp37m-win32.whl", hash = "sha256:c3e0939433c40796ca4cfc0fac08af50b00eb66a40bbbc5dee711998fb0bbc1e"}, + {file = "protobuf-4.23.4-cp37-cp37m-win_amd64.whl", hash = "sha256:9053df6df8e5a76c84339ee4a9f5a2661ceee4a0dab019e8663c50ba324208b0"}, + {file = "protobuf-4.23.4-cp38-cp38-win32.whl", hash = "sha256:e1c915778d8ced71e26fcf43c0866d7499891bca14c4368448a82edc61fdbc70"}, + {file = "protobuf-4.23.4-cp38-cp38-win_amd64.whl", hash = "sha256:351cc90f7d10839c480aeb9b870a211e322bf05f6ab3f55fcb2f51331f80a7d2"}, + {file = "protobuf-4.23.4-cp39-cp39-win32.whl", hash = "sha256:6dd9b9940e3f17077e820b75851126615ee38643c2c5332aa7a359988820c720"}, + {file = "protobuf-4.23.4-cp39-cp39-win_amd64.whl", hash = "sha256:0a5759f5696895de8cc913f084e27fd4125e8fb0914bb729a17816a33819f474"}, + {file = "protobuf-4.23.4-py3-none-any.whl", hash = "sha256:e9d0be5bf34b275b9f87ba7407796556abeeba635455d036c7351f7c183ef8ff"}, + {file = "protobuf-4.23.4.tar.gz", hash = "sha256:ccd9430c0719dce806b93f89c91de7977304729e55377f872a92465d548329a9"}, ] [[package]] name = "psutil" -version = "5.9.5" +version = "5.9.6" description = "Cross-platform lib for process and system monitoring in Python." optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" files = [ - {file = "psutil-5.9.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:be8929ce4313f9f8146caad4272f6abb8bf99fc6cf59344a3167ecd74f4f203f"}, - {file = "psutil-5.9.5-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ab8ed1a1d77c95453db1ae00a3f9c50227ebd955437bcf2a574ba8adbf6a74d5"}, - {file = "psutil-5.9.5-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:4aef137f3345082a3d3232187aeb4ac4ef959ba3d7c10c33dd73763fbc063da4"}, - {file = "psutil-5.9.5-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:ea8518d152174e1249c4f2a1c89e3e6065941df2fa13a1ab45327716a23c2b48"}, - {file = "psutil-5.9.5-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:acf2aef9391710afded549ff602b5887d7a2349831ae4c26be7c807c0a39fac4"}, - {file = "psutil-5.9.5-cp27-none-win32.whl", hash = "sha256:5b9b8cb93f507e8dbaf22af6a2fd0ccbe8244bf30b1baad6b3954e935157ae3f"}, - {file = "psutil-5.9.5-cp27-none-win_amd64.whl", hash = "sha256:8c5f7c5a052d1d567db4ddd231a9d27a74e8e4a9c3f44b1032762bd7b9fdcd42"}, - {file = "psutil-5.9.5-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:3c6f686f4225553615612f6d9bc21f1c0e305f75d7d8454f9b46e901778e7217"}, - {file = "psutil-5.9.5-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7a7dd9997128a0d928ed4fb2c2d57e5102bb6089027939f3b722f3a210f9a8da"}, - {file = "psutil-5.9.5-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89518112647f1276b03ca97b65cc7f64ca587b1eb0278383017c2a0dcc26cbe4"}, - {file = "psutil-5.9.5-cp36-abi3-win32.whl", hash = "sha256:104a5cc0e31baa2bcf67900be36acde157756b9c44017b86b2c049f11957887d"}, - {file = "psutil-5.9.5-cp36-abi3-win_amd64.whl", hash = "sha256:b258c0c1c9d145a1d5ceffab1134441c4c5113b2417fafff7315a917a026c3c9"}, - {file = "psutil-5.9.5-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:c607bb3b57dc779d55e1554846352b4e358c10fff3abf3514a7a6601beebdb30"}, - {file = "psutil-5.9.5.tar.gz", hash = "sha256:5410638e4df39c54d957fc51ce03048acd8e6d60abc0f5107af51e5fb566eb3c"}, + {file = "psutil-5.9.6-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:fb8a697f11b0f5994550555fcfe3e69799e5b060c8ecf9e2f75c69302cc35c0d"}, + {file = "psutil-5.9.6-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:91ecd2d9c00db9817a4b4192107cf6954addb5d9d67a969a4f436dbc9200f88c"}, + {file = "psutil-5.9.6-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:10e8c17b4f898d64b121149afb136c53ea8b68c7531155147867b7b1ac9e7e28"}, + {file = "psutil-5.9.6-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:18cd22c5db486f33998f37e2bb054cc62fd06646995285e02a51b1e08da97017"}, + {file = "psutil-5.9.6-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:ca2780f5e038379e520281e4c032dddd086906ddff9ef0d1b9dcf00710e5071c"}, + {file = "psutil-5.9.6-cp27-none-win32.whl", hash = "sha256:70cb3beb98bc3fd5ac9ac617a327af7e7f826373ee64c80efd4eb2856e5051e9"}, + {file = "psutil-5.9.6-cp27-none-win_amd64.whl", hash = "sha256:51dc3d54607c73148f63732c727856f5febec1c7c336f8f41fcbd6315cce76ac"}, + {file = "psutil-5.9.6-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c69596f9fc2f8acd574a12d5f8b7b1ba3765a641ea5d60fb4736bf3c08a8214a"}, + {file = "psutil-5.9.6-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:92e0cc43c524834af53e9d3369245e6cc3b130e78e26100d1f63cdb0abeb3d3c"}, + {file = "psutil-5.9.6-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:748c9dd2583ed86347ed65d0035f45fa8c851e8d90354c122ab72319b5f366f4"}, + {file = "psutil-5.9.6-cp36-cp36m-win32.whl", hash = "sha256:3ebf2158c16cc69db777e3c7decb3c0f43a7af94a60d72e87b2823aebac3d602"}, + {file = "psutil-5.9.6-cp36-cp36m-win_amd64.whl", hash = "sha256:ff18b8d1a784b810df0b0fff3bcb50ab941c3b8e2c8de5726f9c71c601c611aa"}, + {file = "psutil-5.9.6-cp37-abi3-win32.whl", hash = "sha256:a6f01f03bf1843280f4ad16f4bde26b817847b4c1a0db59bf6419807bc5ce05c"}, + {file = "psutil-5.9.6-cp37-abi3-win_amd64.whl", hash = "sha256:6e5fb8dc711a514da83098bc5234264e551ad980cec5f85dabf4d38ed6f15e9a"}, + {file = "psutil-5.9.6-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:daecbcbd29b289aac14ece28eca6a3e60aa361754cf6da3dfb20d4d32b6c7f57"}, + {file = "psutil-5.9.6.tar.gz", hash = "sha256:e4b92ddcd7dd4cdd3f900180ea1e104932c7bce234fb88976e2a3b296441225a"}, ] [package.extras] @@ -2848,45 +2723,63 @@ tests = ["pytest"] [[package]] name = "pyarrow" -version = "13.0.0" +version = "14.0.1" description = "Python library for Apache Arrow" optional = false python-versions = ">=3.8" files = [ - {file = "pyarrow-13.0.0-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:1afcc2c33f31f6fb25c92d50a86b7a9f076d38acbcb6f9e74349636109550148"}, - {file = "pyarrow-13.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:70fa38cdc66b2fc1349a082987f2b499d51d072faaa6b600f71931150de2e0e3"}, - {file = "pyarrow-13.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd57b13a6466822498238877892a9b287b0a58c2e81e4bdb0b596dbb151cbb73"}, - {file = "pyarrow-13.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8ce69f7bf01de2e2764e14df45b8404fc6f1a5ed9871e8e08a12169f87b7a26"}, - {file = "pyarrow-13.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:588f0d2da6cf1b1680974d63be09a6530fd1bd825dc87f76e162404779a157dc"}, - {file = "pyarrow-13.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:6241afd72b628787b4abea39e238e3ff9f34165273fad306c7acf780dd850956"}, - {file = "pyarrow-13.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:fda7857e35993673fcda603c07d43889fca60a5b254052a462653f8656c64f44"}, - {file = "pyarrow-13.0.0-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:aac0ae0146a9bfa5e12d87dda89d9ef7c57a96210b899459fc2f785303dcbb67"}, - {file = "pyarrow-13.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d7759994217c86c161c6a8060509cfdf782b952163569606bb373828afdd82e8"}, - {file = "pyarrow-13.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:868a073fd0ff6468ae7d869b5fc1f54de5c4255b37f44fb890385eb68b68f95d"}, - {file = "pyarrow-13.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51be67e29f3cfcde263a113c28e96aa04362ed8229cb7c6e5f5c719003659d33"}, - {file = "pyarrow-13.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:d1b4e7176443d12610874bb84d0060bf080f000ea9ed7c84b2801df851320295"}, - {file = "pyarrow-13.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:69b6f9a089d116a82c3ed819eea8fe67dae6105f0d81eaf0fdd5e60d0c6e0944"}, - {file = "pyarrow-13.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:ab1268db81aeb241200e321e220e7cd769762f386f92f61b898352dd27e402ce"}, - {file = "pyarrow-13.0.0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:ee7490f0f3f16a6c38f8c680949551053c8194e68de5046e6c288e396dccee80"}, - {file = "pyarrow-13.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e3ad79455c197a36eefbd90ad4aa832bece7f830a64396c15c61a0985e337287"}, - {file = "pyarrow-13.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68fcd2dc1b7d9310b29a15949cdd0cb9bc34b6de767aff979ebf546020bf0ba0"}, - {file = "pyarrow-13.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc6fd330fd574c51d10638e63c0d00ab456498fc804c9d01f2a61b9264f2c5b2"}, - {file = "pyarrow-13.0.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:e66442e084979a97bb66939e18f7b8709e4ac5f887e636aba29486ffbf373763"}, - {file = "pyarrow-13.0.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:0f6eff839a9e40e9c5610d3ff8c5bdd2f10303408312caf4c8003285d0b49565"}, - {file = "pyarrow-13.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b30a27f1cddf5c6efcb67e598d7823a1e253d743d92ac32ec1eb4b6a1417867"}, - {file = "pyarrow-13.0.0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:09552dad5cf3de2dc0aba1c7c4b470754c69bd821f5faafc3d774bedc3b04bb7"}, - {file = "pyarrow-13.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3896ae6c205d73ad192d2fc1489cd0edfab9f12867c85b4c277af4d37383c18c"}, - {file = "pyarrow-13.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6647444b21cb5e68b593b970b2a9a07748dd74ea457c7dadaa15fd469c48ada1"}, - {file = "pyarrow-13.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47663efc9c395e31d09c6aacfa860f4473815ad6804311c5433f7085415d62a7"}, - {file = "pyarrow-13.0.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:b9ba6b6d34bd2563345488cf444510588ea42ad5613df3b3509f48eb80250afd"}, - {file = "pyarrow-13.0.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:d00d374a5625beeb448a7fa23060df79adb596074beb3ddc1838adb647b6ef09"}, - {file = "pyarrow-13.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:c51afd87c35c8331b56f796eff954b9c7f8d4b7fef5903daf4e05fcf017d23a8"}, - {file = "pyarrow-13.0.0.tar.gz", hash = "sha256:83333726e83ed44b0ac94d8d7a21bbdee4a05029c3b1e8db58a863eec8fd8a33"}, + {file = "pyarrow-14.0.1-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:96d64e5ba7dceb519a955e5eeb5c9adcfd63f73a56aea4722e2cc81364fc567a"}, + {file = "pyarrow-14.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1a8ae88c0038d1bc362a682320112ee6774f006134cd5afc291591ee4bc06505"}, + {file = "pyarrow-14.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f6f053cb66dc24091f5511e5920e45c83107f954a21032feadc7b9e3a8e7851"}, + {file = "pyarrow-14.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:906b0dc25f2be12e95975722f1e60e162437023f490dbd80d0deb7375baf3171"}, + {file = "pyarrow-14.0.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:78d4a77a46a7de9388b653af1c4ce539350726cd9af62e0831e4f2bd0c95a2f4"}, + {file = "pyarrow-14.0.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:06ca79080ef89d6529bb8e5074d4b4f6086143b2520494fcb7cf8a99079cde93"}, + {file = "pyarrow-14.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:32542164d905002c42dff896efdac79b3bdd7291b1b74aa292fac8450d0e4dcd"}, + {file = "pyarrow-14.0.1-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:c7331b4ed3401b7ee56f22c980608cf273f0380f77d0f73dd3c185f78f5a6220"}, + {file = "pyarrow-14.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:922e8b49b88da8633d6cac0e1b5a690311b6758d6f5d7c2be71acb0f1e14cd61"}, + {file = "pyarrow-14.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58c889851ca33f992ea916b48b8540735055201b177cb0dcf0596a495a667b00"}, + {file = "pyarrow-14.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:30d8494870d9916bb53b2a4384948491444741cb9a38253c590e21f836b01222"}, + {file = "pyarrow-14.0.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:be28e1a07f20391bb0b15ea03dcac3aade29fc773c5eb4bee2838e9b2cdde0cb"}, + {file = "pyarrow-14.0.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:981670b4ce0110d8dcb3246410a4aabf5714db5d8ea63b15686bce1c914b1f83"}, + {file = "pyarrow-14.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:4756a2b373a28f6166c42711240643fb8bd6322467e9aacabd26b488fa41ec23"}, + {file = "pyarrow-14.0.1-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:cf87e2cec65dd5cf1aa4aba918d523ef56ef95597b545bbaad01e6433851aa10"}, + {file = "pyarrow-14.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:470ae0194fbfdfbf4a6b65b4f9e0f6e1fa0ea5b90c1ee6b65b38aecee53508c8"}, + {file = "pyarrow-14.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6263cffd0c3721c1e348062997babdf0151301f7353010c9c9a8ed47448f82ab"}, + {file = "pyarrow-14.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a8089d7e77d1455d529dbd7cff08898bbb2666ee48bc4085203af1d826a33cc"}, + {file = "pyarrow-14.0.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:fada8396bc739d958d0b81d291cfd201126ed5e7913cb73de6bc606befc30226"}, + {file = "pyarrow-14.0.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:2a145dab9ed7849fc1101bf03bcdc69913547f10513fdf70fc3ab6c0a50c7eee"}, + {file = "pyarrow-14.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:05fe7994745b634c5fb16ce5717e39a1ac1fac3e2b0795232841660aa76647cd"}, + {file = "pyarrow-14.0.1-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:a8eeef015ae69d104c4c3117a6011e7e3ecd1abec79dc87fd2fac6e442f666ee"}, + {file = "pyarrow-14.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3c76807540989fe8fcd02285dd15e4f2a3da0b09d27781abec3adc265ddbeba1"}, + {file = "pyarrow-14.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:450e4605e3c20e558485f9161a79280a61c55efe585d51513c014de9ae8d393f"}, + {file = "pyarrow-14.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:323cbe60210173ffd7db78bfd50b80bdd792c4c9daca8843ef3cd70b186649db"}, + {file = "pyarrow-14.0.1-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:0140c7e2b740e08c5a459439d87acd26b747fc408bde0a8806096ee0baaa0c15"}, + {file = "pyarrow-14.0.1-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:e592e482edd9f1ab32f18cd6a716c45b2c0f2403dc2af782f4e9674952e6dd27"}, + {file = "pyarrow-14.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:d264ad13605b61959f2ae7c1d25b1a5b8505b112715c961418c8396433f213ad"}, + {file = "pyarrow-14.0.1-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:01e44de9749cddc486169cb632f3c99962318e9dacac7778315a110f4bf8a450"}, + {file = "pyarrow-14.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d0351fecf0e26e152542bc164c22ea2a8e8c682726fce160ce4d459ea802d69c"}, + {file = "pyarrow-14.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33c1f6110c386464fd2e5e4ea3624466055bbe681ff185fd6c9daa98f30a3f9a"}, + {file = "pyarrow-14.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11e045dfa09855b6d3e7705a37c42e2dc2c71d608fab34d3c23df2e02df9aec3"}, + {file = "pyarrow-14.0.1-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:097828b55321897db0e1dbfc606e3ff8101ae5725673498cbfa7754ee0da80e4"}, + {file = "pyarrow-14.0.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:1daab52050a1c48506c029e6fa0944a7b2436334d7e44221c16f6f1b2cc9c510"}, + {file = "pyarrow-14.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:3f6d5faf4f1b0d5a7f97be987cf9e9f8cd39902611e818fe134588ee99bf0283"}, + {file = "pyarrow-14.0.1.tar.gz", hash = "sha256:b8b3f4fe8d4ec15e1ef9b599b94683c5216adaed78d5cb4c606180546d1e2ee1"}, ] [package.dependencies] numpy = ">=1.16.6" +[[package]] +name = "pyarrow-hotfix" +version = "0.5" +description = "" +optional = false +python-versions = ">=3.5" +files = [ + {file = "pyarrow_hotfix-0.5-py3-none-any.whl", hash = "sha256:7e20a1195f2e0dd7b50dffb9f90699481acfce3176bfbfb53eded04f34c4f7c6"}, + {file = "pyarrow_hotfix-0.5.tar.gz", hash = "sha256:ba697c743d435545e99bfbd89818b284e4404c19119c0ed63380a92998c4d0b1"}, +] + [[package]] name = "pyasn1" version = "0.5.0" @@ -2914,13 +2807,13 @@ pyasn1 = ">=0.4.6,<0.6.0" [[package]] name = "pycodestyle" -version = "2.11.0" +version = "2.11.1" description = "Python style guide checker" optional = false python-versions = ">=3.8" files = [ - {file = "pycodestyle-2.11.0-py2.py3-none-any.whl", hash = "sha256:5d1013ba8dc7895b548be5afb05740ca82454fd899971563d2ef625d090326f8"}, - {file = "pycodestyle-2.11.0.tar.gz", hash = "sha256:259bcc17857d8a8b3b4a2327324b79e5f020a13c16074670f9c8c8f872ea76d0"}, + {file = "pycodestyle-2.11.1-py2.py3-none-any.whl", hash = "sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67"}, + {file = "pycodestyle-2.11.1.tar.gz", hash = "sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f"}, ] [[package]] @@ -2935,137 +2828,16 @@ files = [ ] [[package]] -name = "pydantic" -version = "2.1.1" -description = "Data validation using Python type hints" +name = "pyflakes" +version = "3.1.0" +description = "passive checker of Python programs" optional = false -python-versions = ">=3.7" -files = [ - {file = "pydantic-2.1.1-py3-none-any.whl", hash = "sha256:43bdbf359d6304c57afda15c2b95797295b702948082d4c23851ce752f21da70"}, - {file = "pydantic-2.1.1.tar.gz", hash = "sha256:22d63db5ce4831afd16e7c58b3192d3faf8f79154980d9397d9867254310ba4b"}, -] - -[package.dependencies] -annotated-types = ">=0.4.0" -pydantic-core = "2.4.0" -typing-extensions = ">=4.6.1" - -[package.extras] -email = ["email-validator (>=2.0.0)"] - -[[package]] -name = "pydantic-core" -version = "2.4.0" -description = "" -optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pydantic_core-2.4.0-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:2ca4687dd996bde7f3c420def450797feeb20dcee2b9687023e3323c73fc14a2"}, - {file = "pydantic_core-2.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:782fced7d61469fd1231b184a80e4f2fa7ad54cd7173834651a453f96f29d673"}, - {file = "pydantic_core-2.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6213b471b68146af97b8551294e59e7392c2117e28ffad9c557c65087f4baee3"}, - {file = "pydantic_core-2.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63797499a219d8e81eb4e0c42222d0a4c8ec896f5c76751d4258af95de41fdf1"}, - {file = "pydantic_core-2.4.0-cp310-cp310-manylinux_2_24_armv7l.whl", hash = "sha256:0455876d575a35defc4da7e0a199596d6c773e20d3d42fa1fc29f6aa640369ed"}, - {file = "pydantic_core-2.4.0-cp310-cp310-manylinux_2_24_ppc64le.whl", hash = "sha256:8c938c96294d983dcf419b54dba2d21056959c22911d41788efbf949a29ae30d"}, - {file = "pydantic_core-2.4.0-cp310-cp310-manylinux_2_24_s390x.whl", hash = "sha256:878a5017d93e776c379af4e7b20f173c82594d94fa073059bcc546789ad50bf8"}, - {file = "pydantic_core-2.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:69159afc2f2dc43285725f16143bc5df3c853bc1cb7df6021fce7ef1c69e8171"}, - {file = "pydantic_core-2.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:54df7df399b777c1fd144f541c95d351b3aa110535a6810a6a569905d106b6f3"}, - {file = "pydantic_core-2.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e412607ca89a0ced10758dfb8f9adcc365ce4c1c377e637c01989a75e9a9ec8a"}, - {file = "pydantic_core-2.4.0-cp310-none-win32.whl", hash = "sha256:853f103e2b9a58832fdd08a587a51de8b552ae90e1a5d167f316b7eabf8d7dde"}, - {file = "pydantic_core-2.4.0-cp310-none-win_amd64.whl", hash = "sha256:3ba2c9c94a9176f6321a879c8b864d7c5b12d34f549a4c216c72ce213d7d953c"}, - {file = "pydantic_core-2.4.0-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:a8b7acd04896e8f161e1500dc5f218017db05c1d322f054e89cbd089ce5d0071"}, - {file = "pydantic_core-2.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:16468bd074fa4567592d3255bf25528ed41e6b616d69bf07096bdb5b66f947d1"}, - {file = "pydantic_core-2.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cba5ad5eef02c86a1f3da00544cbc59a510d596b27566479a7cd4d91c6187a11"}, - {file = "pydantic_core-2.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7206e41e04b443016e930e01685bab7a308113c0b251b3f906942c8d4b48fcb"}, - {file = "pydantic_core-2.4.0-cp311-cp311-manylinux_2_24_armv7l.whl", hash = "sha256:c1375025f0bfc9155286ebae8eecc65e33e494c90025cda69e247c3ccd2bab00"}, - {file = "pydantic_core-2.4.0-cp311-cp311-manylinux_2_24_ppc64le.whl", hash = "sha256:3534118289e33130ed3f1cc487002e8d09b9f359be48b02e9cd3de58ce58fba9"}, - {file = "pydantic_core-2.4.0-cp311-cp311-manylinux_2_24_s390x.whl", hash = "sha256:94d2b36a74623caab262bf95f0e365c2c058396082bd9d6a9e825657d0c1e7fa"}, - {file = "pydantic_core-2.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:af24ad4fbaa5e4a2000beae0c3b7fd1c78d7819ab90f9370a1cfd8998e3f8a3c"}, - {file = "pydantic_core-2.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bf10963d8aed8bbe0165b41797c9463d4c5c8788ae6a77c68427569be6bead41"}, - {file = "pydantic_core-2.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:68199ada7c310ddb8c76efbb606a0de656b40899388a7498954f423e03fc38be"}, - {file = "pydantic_core-2.4.0-cp311-none-win32.whl", hash = "sha256:6f855bcc96ed3dd56da7373cfcc9dcbabbc2073cac7f65c185772d08884790ce"}, - {file = "pydantic_core-2.4.0-cp311-none-win_amd64.whl", hash = "sha256:de39eb3bab93a99ddda1ac1b9aa331b944d8bcc4aa9141148f7fd8ee0299dafc"}, - {file = "pydantic_core-2.4.0-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:f773b39780323a0499b53ebd91a28ad11cde6705605d98d999dfa08624caf064"}, - {file = "pydantic_core-2.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a297c0d6c61963c5c3726840677b798ca5b7dfc71bc9c02b9a4af11d23236008"}, - {file = "pydantic_core-2.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:546064c55264156b973b5e65e5fafbe5e62390902ce3cf6b4005765505e8ff56"}, - {file = "pydantic_core-2.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36ba9e728588588f0196deaf6751b9222492331b5552f865a8ff120869d372e0"}, - {file = "pydantic_core-2.4.0-cp312-cp312-manylinux_2_24_armv7l.whl", hash = "sha256:57a53a75010c635b3ad6499e7721eaa3b450e03f6862afe2dbef9c8f66e46ec8"}, - {file = "pydantic_core-2.4.0-cp312-cp312-manylinux_2_24_ppc64le.whl", hash = "sha256:4b262bbc13022f2097c48a21adcc360a81d83dc1d854c11b94953cd46d7d3c07"}, - {file = "pydantic_core-2.4.0-cp312-cp312-manylinux_2_24_s390x.whl", hash = "sha256:01947ad728f426fa07fcb26457ebf90ce29320259938414bc0edd1476e75addb"}, - {file = "pydantic_core-2.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b2799c2eaf182769889761d4fb4d78b82bc47dae833799fedbf69fc7de306faa"}, - {file = "pydantic_core-2.4.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a08fd490ba36d1fbb2cd5dcdcfb9f3892deb93bd53456724389135712b5fc735"}, - {file = "pydantic_core-2.4.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1e8a7c62d15a5c4b307271e4252d76ebb981d6251c6ecea4daf203ef0179ea4f"}, - {file = "pydantic_core-2.4.0-cp312-none-win32.whl", hash = "sha256:9206c14a67c38de7b916e486ae280017cf394fa4b1aa95cfe88621a4e1d79725"}, - {file = "pydantic_core-2.4.0-cp312-none-win_amd64.whl", hash = "sha256:884235507549a6b2d3c4113fb1877ae263109e787d9e0eb25c35982ab28d0399"}, - {file = "pydantic_core-2.4.0-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:4cbe929efa77a806e8f1a97793f2dc3ea3475ae21a9ed0f37c21320fe93f6f50"}, - {file = "pydantic_core-2.4.0-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:9137289de8fe845c246a8c3482dd0cb40338846ba683756d8f489a4bd8fddcae"}, - {file = "pydantic_core-2.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5d8e764b5646623e57575f624f8ebb8f7a9f7fd1fae682ef87869ca5fec8dcf"}, - {file = "pydantic_core-2.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8fba0aff4c407d0274e43697e785bcac155ad962be57518d1c711f45e72da70f"}, - {file = "pydantic_core-2.4.0-cp37-cp37m-manylinux_2_24_armv7l.whl", hash = "sha256:30527d173e826f2f7651f91c821e337073df1555e3b5a0b7b1e2c39e26e50678"}, - {file = "pydantic_core-2.4.0-cp37-cp37m-manylinux_2_24_ppc64le.whl", hash = "sha256:bd7d1dde70ff3e09e4bc7a1cbb91a7a538add291bfd5b3e70ef1e7b45192440f"}, - {file = "pydantic_core-2.4.0-cp37-cp37m-manylinux_2_24_s390x.whl", hash = "sha256:72f1216ca8cef7b8adacd4c4c6b89c3b0c4f97503197f5284c80f36d6e4edd30"}, - {file = "pydantic_core-2.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b013c7861a7c7bfcec48fd709513fea6f9f31727e7a0a93ca0dd12e056740717"}, - {file = "pydantic_core-2.4.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:478f5f6d7e32bd4a04d102160efb2d389432ecf095fe87c555c0a6fc4adfc1a4"}, - {file = "pydantic_core-2.4.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d9610b47b5fe4aacbbba6a9cb5f12cbe864eec99dbfed5710bd32ef5dd8a5d5b"}, - {file = "pydantic_core-2.4.0-cp37-none-win32.whl", hash = "sha256:ff246c0111076c8022f9ba325c294f2cb5983403506989253e04dbae565e019b"}, - {file = "pydantic_core-2.4.0-cp37-none-win_amd64.whl", hash = "sha256:d0c2b713464a8e263a243ae7980d81ce2de5ac59a9f798a282e44350b42dc516"}, - {file = "pydantic_core-2.4.0-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:12ef6838245569fd60a179fade81ca4b90ae2fa0ef355d616f519f7bb27582db"}, - {file = "pydantic_core-2.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:49db206eb8fdc4b4f30e6e3e410584146d813c151928f94ec0db06c4f2595538"}, - {file = "pydantic_core-2.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a507d7fa44688bbac76af6521e488b3da93de155b9cba6f2c9b7833ce243d59"}, - {file = "pydantic_core-2.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffe18407a4d000c568182ce5388bbbedeb099896904e43fc14eee76cfae6dec5"}, - {file = "pydantic_core-2.4.0-cp38-cp38-manylinux_2_24_armv7l.whl", hash = "sha256:fa8e48001b39d54d97d7b380a0669fa99fc0feeb972e35a2d677ba59164a9a22"}, - {file = "pydantic_core-2.4.0-cp38-cp38-manylinux_2_24_ppc64le.whl", hash = "sha256:394f12a2671ff8c4dfa2e85be6c08be0651ad85bc1e6aa9c77c21671baaf28cd"}, - {file = "pydantic_core-2.4.0-cp38-cp38-manylinux_2_24_s390x.whl", hash = "sha256:2f9ea0355f90db2a76af530245fa42f04d98f752a1236ed7c6809ec484560d5b"}, - {file = "pydantic_core-2.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:61d4e713f467abcdd59b47665d488bb898ad3dd47ce7446522a50e0cbd8e8279"}, - {file = "pydantic_core-2.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:453862ab268f6326b01f067ed89cb3a527d34dc46f6f4eeec46a15bbc706d0da"}, - {file = "pydantic_core-2.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:56a85fa0dab1567bd0cac10f0c3837b03e8a0d939e6a8061a3a420acd97e9421"}, - {file = "pydantic_core-2.4.0-cp38-none-win32.whl", hash = "sha256:0d726108c1c0380b88b6dd4db559f0280e0ceda9e077f46ff90bc85cd4d03e77"}, - {file = "pydantic_core-2.4.0-cp38-none-win_amd64.whl", hash = "sha256:047580388644c473b934d27849f8ed8dbe45df0adb72104e78b543e13bf69762"}, - {file = "pydantic_core-2.4.0-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:867d3eea954bea807cabba83cfc939c889a18576d66d197c60025b15269d7cc0"}, - {file = "pydantic_core-2.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:664402ef0c238a7f8a46efb101789d5f2275600fb18114446efec83cfadb5b66"}, - {file = "pydantic_core-2.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64e8012ad60a5f0da09ed48725e6e923d1be25f2f091a640af6079f874663813"}, - {file = "pydantic_core-2.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac2b680de398f293b68183317432b3d67ab3faeba216aec18de0c395cb5e3060"}, - {file = "pydantic_core-2.4.0-cp39-cp39-manylinux_2_24_armv7l.whl", hash = "sha256:8efc1be43b036c2b6bcfb1451df24ee0ddcf69c31351003daf2699ed93f5687b"}, - {file = "pydantic_core-2.4.0-cp39-cp39-manylinux_2_24_ppc64le.whl", hash = "sha256:d93aedbc4614cc21b9ab0d0c4ccd7143354c1f7cffbbe96ae5216ad21d1b21b5"}, - {file = "pydantic_core-2.4.0-cp39-cp39-manylinux_2_24_s390x.whl", hash = "sha256:af788b64e13d52fc3600a68b16d31fa8d8573e3ff2fc9a38f8a60b8d94d1f012"}, - {file = "pydantic_core-2.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:97c6349c81cee2e69ef59eba6e6c08c5936e6b01c2d50b9e4ac152217845ae09"}, - {file = "pydantic_core-2.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:cc086ddb6dc654a15deeed1d1f2bcb1cb924ebd70df9dca738af19f64229b06c"}, - {file = "pydantic_core-2.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e953353180bec330c3b830891d260b6f8e576e2d18db3c78d314e56bb2276066"}, - {file = "pydantic_core-2.4.0-cp39-none-win32.whl", hash = "sha256:6feb4b64d11d5420e517910d60a907d08d846cacaf4e029668725cd21d16743c"}, - {file = "pydantic_core-2.4.0-cp39-none-win_amd64.whl", hash = "sha256:153a61ac4030fa019b70b31fb7986461119230d3ba0ab661c757cfea652f4332"}, - {file = "pydantic_core-2.4.0-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:3fcf529382b282a30b466bd7af05be28e22aa620e016135ac414f14e1ee6b9e1"}, - {file = "pydantic_core-2.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2edef05b63d82568b877002dc4cb5cc18f8929b59077120192df1e03e0c633f8"}, - {file = "pydantic_core-2.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da055a1b0bfa8041bb2ff586b2cb0353ed03944a3472186a02cc44a557a0e661"}, - {file = "pydantic_core-2.4.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:77dadc764cf7c5405e04866181c5bd94a447372a9763e473abb63d1dfe9b7387"}, - {file = "pydantic_core-2.4.0-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:a4ea23b07f29487a7bef2a869f68c7ee0e05424d81375ce3d3de829314c6b5ec"}, - {file = "pydantic_core-2.4.0-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:382f0baa044d674ad59455a5eff83d7965572b745cc72df35c52c2ce8c731d37"}, - {file = "pydantic_core-2.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:08f89697625e453421401c7f661b9d1eb4c9e4c0a12fd256eeb55b06994ac6af"}, - {file = "pydantic_core-2.4.0-pp37-pypy37_pp73-macosx_10_7_x86_64.whl", hash = "sha256:43a405ce520b45941df9ff55d0cd09762017756a7b413bbad3a6e8178e64a2c2"}, - {file = "pydantic_core-2.4.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:584a7a818c84767af16ce8bda5d4f7fedb37d3d231fc89928a192f567e4ef685"}, - {file = "pydantic_core-2.4.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:04922fea7b13cd480586fa106345fe06e43220b8327358873c22d8dfa7a711c7"}, - {file = "pydantic_core-2.4.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:17156abac20a9feed10feec867fddd91a80819a485b0107fe61f09f2117fe5f3"}, - {file = "pydantic_core-2.4.0-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:4e562cc63b04636cde361fd47569162f1daa94c759220ff202a8129902229114"}, - {file = "pydantic_core-2.4.0-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:90f3785146f701e053bb6b9e8f53acce2c919aca91df88bd4975be0cb926eb41"}, - {file = "pydantic_core-2.4.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:e40b1e97edd3dc127aa53d8a5e539a3d0c227d71574d3f9ac1af02d58218a122"}, - {file = "pydantic_core-2.4.0-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:b27f3e67f6e031f6620655741b7d0d6bebea8b25d415924b3e8bfef2dd7bd841"}, - {file = "pydantic_core-2.4.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be86c2eb12fb0f846262ace9d8f032dc6978b8cb26a058920ecb723dbcb87d05"}, - {file = "pydantic_core-2.4.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4665f7ed345012a8d2eddf4203ef145f5f56a291d010382d235b94e91813f88a"}, - {file = "pydantic_core-2.4.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:79262be5a292d1df060f29b9a7cdd66934801f987a817632d7552534a172709a"}, - {file = "pydantic_core-2.4.0-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:5fd905a69ac74eaba5041e21a1e8b1a479dab2b41c93bdcc4c1cede3c12a8d86"}, - {file = "pydantic_core-2.4.0-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:2ad538b7e07343001934417cdc8584623b4d8823c5b8b258e75ec8d327cec969"}, - {file = "pydantic_core-2.4.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:dd2429f7635ad4857b5881503f9c310be7761dc681c467a9d27787b674d1250a"}, - {file = "pydantic_core-2.4.0-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:efff8b6761a1f6e45cebd1b7a6406eb2723d2d5710ff0d1b624fe11313693989"}, - {file = "pydantic_core-2.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32a1e0352558cd7ccc014ffe818c7d87b15ec6145875e2cc5fa4bb7351a1033d"}, - {file = "pydantic_core-2.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a027f41c5008571314861744d83aff75a34cf3a07022e0be32b214a5bc93f7f1"}, - {file = "pydantic_core-2.4.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1927f0e15d190f11f0b8344373731e28fd774c6d676d8a6cfadc95c77214a48b"}, - {file = "pydantic_core-2.4.0-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:7aa82d483d5fb867d4fb10a138ffd57b0f1644e99f2f4f336e48790ada9ada5e"}, - {file = "pydantic_core-2.4.0-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b85778308bf945e9b33ac604e6793df9b07933108d20bdf53811bc7c2798a4af"}, - {file = "pydantic_core-2.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3ded19dcaefe2f6706d81e0db787b59095f4ad0fbadce1edffdf092294c8a23f"}, - {file = "pydantic_core-2.4.0.tar.gz", hash = "sha256:ec3473c9789cc00c7260d840c3db2c16dbfc816ca70ec87a00cddfa3e1a1cdd5"}, + {file = "pyflakes-3.1.0-py2.py3-none-any.whl", hash = "sha256:4132f6d49cb4dae6819e5379898f2b8cce3c5f23994194c24b77d5da2e36f774"}, + {file = "pyflakes-3.1.0.tar.gz", hash = "sha256:a0aae034c444db0071aa077972ba4768d40c830d9539fd45bf4cd3f8f6992efc"}, ] -[package.dependencies] -typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" - [[package]] name = "pygments" version = "2.16.1" @@ -3080,32 +2852,15 @@ files = [ [package.extras] plugins = ["importlib-metadata"] -[[package]] -name = "pyjwt" -version = "2.8.0" -description = "JSON Web Token implementation in Python" -optional = false -python-versions = ">=3.7" -files = [ - {file = "PyJWT-2.8.0-py3-none-any.whl", hash = "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320"}, - {file = "PyJWT-2.8.0.tar.gz", hash = "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de"}, -] - -[package.extras] -crypto = ["cryptography (>=3.4.0)"] -dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] -docs = ["sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] -tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] - [[package]] name = "pytest" -version = "7.4.2" +version = "7.4.3" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.7" files = [ - {file = "pytest-7.4.2-py3-none-any.whl", hash = "sha256:1d881c6124e08ff0a1bb75ba3ec0bfd8b5354a01c194ddd5a0a870a48d99b002"}, - {file = "pytest-7.4.2.tar.gz", hash = "sha256:a766259cfab564a2ad52cb1aae1b881a75c3eb7e34ca3779697c23ed47c47069"}, + {file = "pytest-7.4.3-py3-none-any.whl", hash = "sha256:0d009c083ea859a71b76adf7c1d502e4bc170b80a8ef002da5806527b9591fac"}, + {file = "pytest-7.4.3.tar.gz", hash = "sha256:d989d136982de4e3b29dabcc838ad581c64e8ed52c11fbe86ddebd9da0818cd5"}, ] [package.dependencies] @@ -3133,18 +2888,6 @@ files = [ [package.dependencies] six = ">=1.5" -[[package]] -name = "python-editor" -version = "1.0.4" -description = "Programmatically open an editor, capture the result." -optional = false -python-versions = "*" -files = [ - {file = "python-editor-1.0.4.tar.gz", hash = "sha256:51fda6bcc5ddbbb7063b2af7509e43bd84bfc32a4ff71349ec7847713882327b"}, - {file = "python_editor-1.0.4-py2-none-any.whl", hash = "sha256:5f98b069316ea1c2ed3f67e7f5df6c0d8f10b689964a4a811ff64f0106819ec8"}, - {file = "python_editor-1.0.4-py3-none-any.whl", hash = "sha256:1bf6e860a8ad52a14c3ee1252d5dc25b2030618ed80c022598f00176adc8367d"}, -] - [[package]] name = "python-json-logger" version = "2.0.7" @@ -3156,50 +2899,36 @@ files = [ {file = "python_json_logger-2.0.7-py3-none-any.whl", hash = "sha256:f380b826a991ebbe3de4d897aeec42760035ac760345e57b812938dc8b35e2bd"}, ] -[[package]] -name = "python-multipart" -version = "0.0.6" -description = "A streaming multipart parser for Python" -optional = false -python-versions = ">=3.7" -files = [ - {file = "python_multipart-0.0.6-py3-none-any.whl", hash = "sha256:ee698bab5ef148b0a760751c261902cd096e57e10558e11aca17646b74ee1c18"}, - {file = "python_multipart-0.0.6.tar.gz", hash = "sha256:e9925a80bb668529f1b67c7fdb0a5dacdd7cbfc6fb0bff3ea443fe22bdd62132"}, -] - -[package.extras] -dev = ["atomicwrites (==1.2.1)", "attrs (==19.2.0)", "coverage (==6.5.0)", "hatch", "invoke (==1.7.3)", "more-itertools (==4.3.0)", "pbr (==4.3.0)", "pluggy (==1.0.0)", "py (==1.11.0)", "pytest (==7.2.0)", "pytest-cov (==4.0.0)", "pytest-timeout (==2.1.0)", "pyyaml (==5.1)"] - [[package]] name = "pytorch-lightning" -version = "2.0.8" +version = "2.1.2" description = "PyTorch Lightning is the lightweight PyTorch wrapper for ML researchers. Scale your models. Write less boilerplate." optional = false python-versions = ">=3.8" files = [ - {file = "pytorch-lightning-2.0.8.tar.gz", hash = "sha256:fb7e8fbe473158b2c1666b6b31fb996c8aa2c3f5e8e2a54a3f50a7b5b2d00a20"}, - {file = "pytorch_lightning-2.0.8-py3-none-any.whl", hash = "sha256:718d11f22551d95ef38614b4727433553c95ea2b50cf843938fb13baf34325a6"}, + {file = "pytorch-lightning-2.1.2.tar.gz", hash = "sha256:58e26406215f3bfafe1b9b5b4bf37c9b8cff16494f7fd60e4db1ae37461b2b28"}, + {file = "pytorch_lightning-2.1.2-py3-none-any.whl", hash = "sha256:8cf4a45f74e11f8ef3ad46bebb4a621eca7a990826226390767f948e86fff542"}, ] [package.dependencies] fsspec = {version = ">2021.06.0", extras = ["http"]} -lightning-utilities = ">=0.7.0" +lightning-utilities = ">=0.8.0" numpy = ">=1.17.2" -packaging = ">=17.1" +packaging = ">=20.0" PyYAML = ">=5.4" -torch = ">=1.11.0" +torch = ">=1.12.0" torchmetrics = ">=0.7.0" tqdm = ">=4.57.0" typing-extensions = ">=4.0.0" [package.extras] -all = ["deepspeed (>=0.8.2)", "gym[classic-control] (>=0.17.0)", "hydra-core (>=1.0.5)", "ipython[all] (<8.14.1)", "jsonargparse[signatures] (>=4.18.0,<4.23.0)", "lightning-utilities (>=0.7.0)", "matplotlib (>3.1)", "omegaconf (>=2.0.5)", "rich (>=12.3.0)", "tensorboardX (>=2.2)", "torchmetrics (>=0.10.0)", "torchvision (>=0.12.0)"] -deepspeed = ["deepspeed (>=0.8.2)"] -dev = ["cloudpickle (>=1.3)", "coverage (==7.3.0)", "deepspeed (>=0.8.2)", "fastapi (<0.100.0)", "gym[classic-control] (>=0.17.0)", "hydra-core (>=1.0.5)", "ipython[all] (<8.14.1)", "jsonargparse[signatures] (>=4.18.0,<4.23.0)", "lightning-utilities (>=0.7.0)", "matplotlib (>3.1)", "omegaconf (>=2.0.5)", "onnx (<1.15.0)", "onnxruntime (<1.16.0)", "pandas (>1.0)", "protobuf (<=3.20.1)", "psutil (<5.9.6)", "pytest (==7.4.0)", "pytest-cov (==4.1.0)", "pytest-forked (==1.4.0)", "pytest-rerunfailures (==10.3)", "rich (>=12.3.0)", "scikit-learn (>0.22.1)", "tensorboard (>=2.9.1)", "tensorboardX (>=2.2)", "torchmetrics (>=0.10.0)", "torchvision (>=0.12.0)", "uvicorn (<0.23.3)"] -examples = ["gym[classic-control] (>=0.17.0)", "ipython[all] (<8.14.1)", "lightning-utilities (>=0.7.0)", "torchmetrics (>=0.10.0)", "torchvision (>=0.12.0)"] -extra = ["hydra-core (>=1.0.5)", "jsonargparse[signatures] (>=4.18.0,<4.23.0)", "matplotlib (>3.1)", "omegaconf (>=2.0.5)", "rich (>=12.3.0)", "tensorboardX (>=2.2)"] -strategies = ["deepspeed (>=0.8.2)"] -test = ["cloudpickle (>=1.3)", "coverage (==7.3.0)", "fastapi (<0.100.0)", "onnx (<1.15.0)", "onnxruntime (<1.16.0)", "pandas (>1.0)", "protobuf (<=3.20.1)", "psutil (<5.9.6)", "pytest (==7.4.0)", "pytest-cov (==4.1.0)", "pytest-forked (==1.4.0)", "pytest-rerunfailures (==10.3)", "scikit-learn (>0.22.1)", "tensorboard (>=2.9.1)", "uvicorn (<0.23.3)"] +all = ["bitsandbytes (<=0.41.1)", "deepspeed (>=0.8.2,<=0.9.3)", "gym[classic-control] (>=0.17.0)", "hydra-core (>=1.0.5)", "ipython[all] (<8.15.0)", "jsonargparse[signatures] (>=4.18.0)", "lightning-utilities (>=0.8.0)", "matplotlib (>3.1)", "omegaconf (>=2.0.5)", "rich (>=12.3.0)", "tensorboardX (>=2.2)", "torchmetrics (>=0.10.0)", "torchvision (>=0.13.0)"] +deepspeed = ["deepspeed (>=0.8.2,<=0.9.3)"] +dev = ["bitsandbytes (<=0.41.1)", "cloudpickle (>=1.3)", "coverage (==7.3.1)", "deepspeed (>=0.8.2,<=0.9.3)", "fastapi", "gym[classic-control] (>=0.17.0)", "hydra-core (>=1.0.5)", "ipython[all] (<8.15.0)", "jsonargparse[signatures] (>=4.18.0)", "lightning-utilities (>=0.8.0)", "matplotlib (>3.1)", "omegaconf (>=2.0.5)", "onnx (>=0.14.0)", "onnxruntime (>=0.15.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)", "rich (>=12.3.0)", "scikit-learn (>0.22.1)", "tensorboard (>=2.9.1)", "tensorboardX (>=2.2)", "torchmetrics (>=0.10.0)", "torchvision (>=0.13.0)", "uvicorn"] +examples = ["gym[classic-control] (>=0.17.0)", "ipython[all] (<8.15.0)", "lightning-utilities (>=0.8.0)", "torchmetrics (>=0.10.0)", "torchvision (>=0.13.0)"] +extra = ["bitsandbytes (<=0.41.1)", "hydra-core (>=1.0.5)", "jsonargparse[signatures] (>=4.18.0)", "matplotlib (>3.1)", "omegaconf (>=2.0.5)", "rich (>=12.3.0)", "tensorboardX (>=2.2)"] +strategies = ["deepspeed (>=0.8.2,<=0.9.3)"] +test = ["cloudpickle (>=1.3)", "coverage (==7.3.1)", "fastapi", "onnx (>=0.14.0)", "onnxruntime (>=0.15.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"] [[package]] name = "pytorch-ranger" @@ -3251,16 +2980,17 @@ files = [ [[package]] name = "pywinpty" -version = "2.0.11" +version = "2.0.12" description = "Pseudo terminal support for Windows from Python." optional = false python-versions = ">=3.8" files = [ - {file = "pywinpty-2.0.11-cp310-none-win_amd64.whl", hash = "sha256:452f10ac9ff8ab9151aa8cea9e491a9612a12250b1899278c6a56bc184afb47f"}, - {file = "pywinpty-2.0.11-cp311-none-win_amd64.whl", hash = "sha256:6701867d42aec1239bc0fedf49a336570eb60eb886e81763db77ea2b6c533cc3"}, - {file = "pywinpty-2.0.11-cp38-none-win_amd64.whl", hash = "sha256:0ffd287751ad871141dc9724de70ea21f7fc2ff1af50861e0d232cf70739d8c4"}, - {file = "pywinpty-2.0.11-cp39-none-win_amd64.whl", hash = "sha256:e4e7f023c28ca7aa8e1313e53ba80a4d10171fe27857b7e02f99882dfe3e8638"}, - {file = "pywinpty-2.0.11.tar.gz", hash = "sha256:e244cffe29a894876e2cd251306efd0d8d64abd5ada0a46150a4a71c0b9ad5c5"}, + {file = "pywinpty-2.0.12-cp310-none-win_amd64.whl", hash = "sha256:21319cd1d7c8844fb2c970fb3a55a3db5543f112ff9cfcd623746b9c47501575"}, + {file = "pywinpty-2.0.12-cp311-none-win_amd64.whl", hash = "sha256:853985a8f48f4731a716653170cd735da36ffbdc79dcb4c7b7140bce11d8c722"}, + {file = "pywinpty-2.0.12-cp312-none-win_amd64.whl", hash = "sha256:1617b729999eb6713590e17665052b1a6ae0ad76ee31e60b444147c5b6a35dca"}, + {file = "pywinpty-2.0.12-cp38-none-win_amd64.whl", hash = "sha256:189380469ca143d06e19e19ff3fba0fcefe8b4a8cc942140a6b863aed7eebb2d"}, + {file = "pywinpty-2.0.12-cp39-none-win_amd64.whl", hash = "sha256:7520575b6546db23e693cbd865db2764097bd6d4ef5dc18c92555904cd62c3d4"}, + {file = "pywinpty-2.0.12.tar.gz", hash = "sha256:8197de460ae8ebb7f5d1701dfa1b5df45b157bb832e92acba316305e18ca00dd"}, ] [[package]] @@ -3417,29 +3147,15 @@ files = [ [package.dependencies] cffi = {version = "*", markers = "implementation_name == \"pypy\""} -[[package]] -name = "readchar" -version = "4.0.5" -description = "Library to easily read single chars and key strokes" -optional = false -python-versions = ">=3.7" -files = [ - {file = "readchar-4.0.5-py3-none-any.whl", hash = "sha256:76ec784a5dd2afac3b7da8003329834cdd9824294c260027f8c8d2e4d0a78f43"}, - {file = "readchar-4.0.5.tar.gz", hash = "sha256:08a456c2d7c1888cde3f4688b542621b676eb38cd6cfed7eb6cb2e2905ddc826"}, -] - -[package.dependencies] -setuptools = ">=41.0" - [[package]] name = "referencing" -version = "0.30.2" +version = "0.31.0" description = "JSON Referencing + Python" optional = false python-versions = ">=3.8" files = [ - {file = "referencing-0.30.2-py3-none-any.whl", hash = "sha256:449b6669b6121a9e96a7f9e410b245d471e8d48964c67113ce9afe50c8dd7bdf"}, - {file = "referencing-0.30.2.tar.gz", hash = "sha256:794ad8003c65938edcdbc027f1933215e0d0ccc0291e3ce20a4d87432b59efc0"}, + {file = "referencing-0.31.0-py3-none-any.whl", hash = "sha256:381b11e53dd93babb55696c71cf42aef2d36b8a150c49bf0bc301e36d536c882"}, + {file = "referencing-0.31.0.tar.gz", hash = "sha256:cc28f2c88fbe7b961a7817a0abc034c09a1e36358f82fedb4ffdf29a25398863"}, ] [package.dependencies] @@ -3448,99 +3164,99 @@ rpds-py = ">=0.7.0" [[package]] name = "regex" -version = "2023.8.8" +version = "2023.10.3" description = "Alternative regular expression module, to replace re." optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "regex-2023.8.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:88900f521c645f784260a8d346e12a1590f79e96403971241e64c3a265c8ecdb"}, - {file = "regex-2023.8.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3611576aff55918af2697410ff0293d6071b7e00f4b09e005d614686ac4cd57c"}, - {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8a0ccc8f2698f120e9e5742f4b38dc944c38744d4bdfc427616f3a163dd9de5"}, - {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c662a4cbdd6280ee56f841f14620787215a171c4e2d1744c9528bed8f5816c96"}, - {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cf0633e4a1b667bfe0bb10b5e53fe0d5f34a6243ea2530eb342491f1adf4f739"}, - {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:551ad543fa19e94943c5b2cebc54c73353ffff08228ee5f3376bd27b3d5b9800"}, - {file = "regex-2023.8.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54de2619f5ea58474f2ac211ceea6b615af2d7e4306220d4f3fe690c91988a61"}, - {file = "regex-2023.8.8-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5ec4b3f0aebbbe2fc0134ee30a791af522a92ad9f164858805a77442d7d18570"}, - {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3ae646c35cb9f820491760ac62c25b6d6b496757fda2d51be429e0e7b67ae0ab"}, - {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ca339088839582d01654e6f83a637a4b8194d0960477b9769d2ff2cfa0fa36d2"}, - {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:d9b6627408021452dcd0d2cdf8da0534e19d93d070bfa8b6b4176f99711e7f90"}, - {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:bd3366aceedf274f765a3a4bc95d6cd97b130d1dda524d8f25225d14123c01db"}, - {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7aed90a72fc3654fba9bc4b7f851571dcc368120432ad68b226bd593f3f6c0b7"}, - {file = "regex-2023.8.8-cp310-cp310-win32.whl", hash = "sha256:80b80b889cb767cc47f31d2b2f3dec2db8126fbcd0cff31b3925b4dc6609dcdb"}, - {file = "regex-2023.8.8-cp310-cp310-win_amd64.whl", hash = "sha256:b82edc98d107cbc7357da7a5a695901b47d6eb0420e587256ba3ad24b80b7d0b"}, - {file = "regex-2023.8.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1e7d84d64c84ad97bf06f3c8cb5e48941f135ace28f450d86af6b6512f1c9a71"}, - {file = "regex-2023.8.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ce0f9fbe7d295f9922c0424a3637b88c6c472b75eafeaff6f910494a1fa719ef"}, - {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06c57e14ac723b04458df5956cfb7e2d9caa6e9d353c0b4c7d5d54fcb1325c46"}, - {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e7a9aaa5a1267125eef22cef3b63484c3241aaec6f48949b366d26c7250e0357"}, - {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b7408511fca48a82a119d78a77c2f5eb1b22fe88b0d2450ed0756d194fe7a9a"}, - {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14dc6f2d88192a67d708341f3085df6a4f5a0c7b03dec08d763ca2cd86e9f559"}, - {file = "regex-2023.8.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48c640b99213643d141550326f34f0502fedb1798adb3c9eb79650b1ecb2f177"}, - {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0085da0f6c6393428bf0d9c08d8b1874d805bb55e17cb1dfa5ddb7cfb11140bf"}, - {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:964b16dcc10c79a4a2be9f1273fcc2684a9eedb3906439720598029a797b46e6"}, - {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7ce606c14bb195b0e5108544b540e2c5faed6843367e4ab3deb5c6aa5e681208"}, - {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:40f029d73b10fac448c73d6eb33d57b34607f40116e9f6e9f0d32e9229b147d7"}, - {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3b8e6ea6be6d64104d8e9afc34c151926f8182f84e7ac290a93925c0db004bfd"}, - {file = "regex-2023.8.8-cp311-cp311-win32.whl", hash = "sha256:942f8b1f3b223638b02df7df79140646c03938d488fbfb771824f3d05fc083a8"}, - {file = "regex-2023.8.8-cp311-cp311-win_amd64.whl", hash = "sha256:51d8ea2a3a1a8fe4f67de21b8b93757005213e8ac3917567872f2865185fa7fb"}, - {file = "regex-2023.8.8-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e951d1a8e9963ea51efd7f150450803e3b95db5939f994ad3d5edac2b6f6e2b4"}, - {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:704f63b774218207b8ccc6c47fcef5340741e5d839d11d606f70af93ee78e4d4"}, - {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22283c769a7b01c8ac355d5be0715bf6929b6267619505e289f792b01304d898"}, - {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:91129ff1bb0619bc1f4ad19485718cc623a2dc433dff95baadbf89405c7f6b57"}, - {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de35342190deb7b866ad6ba5cbcccb2d22c0487ee0cbb251efef0843d705f0d4"}, - {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b993b6f524d1e274a5062488a43e3f9f8764ee9745ccd8e8193df743dbe5ee61"}, - {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3026cbcf11d79095a32d9a13bbc572a458727bd5b1ca332df4a79faecd45281c"}, - {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:293352710172239bf579c90a9864d0df57340b6fd21272345222fb6371bf82b3"}, - {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:d909b5a3fff619dc7e48b6b1bedc2f30ec43033ba7af32f936c10839e81b9217"}, - {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:3d370ff652323c5307d9c8e4c62efd1956fb08051b0e9210212bc51168b4ff56"}, - {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:b076da1ed19dc37788f6a934c60adf97bd02c7eea461b73730513921a85d4235"}, - {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:e9941a4ada58f6218694f382e43fdd256e97615db9da135e77359da257a7168b"}, - {file = "regex-2023.8.8-cp36-cp36m-win32.whl", hash = "sha256:a8c65c17aed7e15a0c824cdc63a6b104dfc530f6fa8cb6ac51c437af52b481c7"}, - {file = "regex-2023.8.8-cp36-cp36m-win_amd64.whl", hash = "sha256:aadf28046e77a72f30dcc1ab185639e8de7f4104b8cb5c6dfa5d8ed860e57236"}, - {file = "regex-2023.8.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:423adfa872b4908843ac3e7a30f957f5d5282944b81ca0a3b8a7ccbbfaa06103"}, - {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ae594c66f4a7e1ea67232a0846649a7c94c188d6c071ac0210c3e86a5f92109"}, - {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e51c80c168074faa793685656c38eb7a06cbad7774c8cbc3ea05552d615393d8"}, - {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:09b7f4c66aa9d1522b06e31a54f15581c37286237208df1345108fcf4e050c18"}, - {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e73e5243af12d9cd6a9d6a45a43570dbe2e5b1cdfc862f5ae2b031e44dd95a8"}, - {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:941460db8fe3bd613db52f05259c9336f5a47ccae7d7def44cc277184030a116"}, - {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f0ccf3e01afeb412a1a9993049cb160d0352dba635bbca7762b2dc722aa5742a"}, - {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:2e9216e0d2cdce7dbc9be48cb3eacb962740a09b011a116fd7af8c832ab116ca"}, - {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:5cd9cd7170459b9223c5e592ac036e0704bee765706445c353d96f2890e816c8"}, - {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:4873ef92e03a4309b3ccd8281454801b291b689f6ad45ef8c3658b6fa761d7ac"}, - {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:239c3c2a339d3b3ddd51c2daef10874410917cd2b998f043c13e2084cb191684"}, - {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:1005c60ed7037be0d9dea1f9c53cc42f836188227366370867222bda4c3c6bd7"}, - {file = "regex-2023.8.8-cp37-cp37m-win32.whl", hash = "sha256:e6bd1e9b95bc5614a7a9c9c44fde9539cba1c823b43a9f7bc11266446dd568e3"}, - {file = "regex-2023.8.8-cp37-cp37m-win_amd64.whl", hash = "sha256:9a96edd79661e93327cfeac4edec72a4046e14550a1d22aa0dd2e3ca52aec921"}, - {file = "regex-2023.8.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f2181c20ef18747d5f4a7ea513e09ea03bdd50884a11ce46066bb90fe4213675"}, - {file = "regex-2023.8.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a2ad5add903eb7cdde2b7c64aaca405f3957ab34f16594d2b78d53b8b1a6a7d6"}, - {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9233ac249b354c54146e392e8a451e465dd2d967fc773690811d3a8c240ac601"}, - {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:920974009fb37b20d32afcdf0227a2e707eb83fe418713f7a8b7de038b870d0b"}, - {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd2b6c5dfe0929b6c23dde9624483380b170b6e34ed79054ad131b20203a1a63"}, - {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96979d753b1dc3b2169003e1854dc67bfc86edf93c01e84757927f810b8c3c93"}, - {file = "regex-2023.8.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ae54a338191e1356253e7883d9d19f8679b6143703086245fb14d1f20196be9"}, - {file = "regex-2023.8.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2162ae2eb8b079622176a81b65d486ba50b888271302190870b8cc488587d280"}, - {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c884d1a59e69e03b93cf0dfee8794c63d7de0ee8f7ffb76e5f75be8131b6400a"}, - {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cf9273e96f3ee2ac89ffcb17627a78f78e7516b08f94dc435844ae72576a276e"}, - {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:83215147121e15d5f3a45d99abeed9cf1fe16869d5c233b08c56cdf75f43a504"}, - {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:3f7454aa427b8ab9101f3787eb178057c5250478e39b99540cfc2b889c7d0586"}, - {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0640913d2c1044d97e30d7c41728195fc37e54d190c5385eacb52115127b882"}, - {file = "regex-2023.8.8-cp38-cp38-win32.whl", hash = "sha256:0c59122ceccb905a941fb23b087b8eafc5290bf983ebcb14d2301febcbe199c7"}, - {file = "regex-2023.8.8-cp38-cp38-win_amd64.whl", hash = "sha256:c12f6f67495ea05c3d542d119d270007090bad5b843f642d418eb601ec0fa7be"}, - {file = "regex-2023.8.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:82cd0a69cd28f6cc3789cc6adeb1027f79526b1ab50b1f6062bbc3a0ccb2dbc3"}, - {file = "regex-2023.8.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bb34d1605f96a245fc39790a117ac1bac8de84ab7691637b26ab2c5efb8f228c"}, - {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:987b9ac04d0b38ef4f89fbc035e84a7efad9cdd5f1e29024f9289182c8d99e09"}, - {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9dd6082f4e2aec9b6a0927202c85bc1b09dcab113f97265127c1dc20e2e32495"}, - {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7eb95fe8222932c10d4436e7a6f7c99991e3fdd9f36c949eff16a69246dee2dc"}, - {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7098c524ba9f20717a56a8d551d2ed491ea89cbf37e540759ed3b776a4f8d6eb"}, - {file = "regex-2023.8.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b694430b3f00eb02c594ff5a16db30e054c1b9589a043fe9174584c6efa8033"}, - {file = "regex-2023.8.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b2aeab3895d778155054abea5238d0eb9a72e9242bd4b43f42fd911ef9a13470"}, - {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:988631b9d78b546e284478c2ec15c8a85960e262e247b35ca5eaf7ee22f6050a"}, - {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:67ecd894e56a0c6108ec5ab1d8fa8418ec0cff45844a855966b875d1039a2e34"}, - {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:14898830f0a0eb67cae2bbbc787c1a7d6e34ecc06fbd39d3af5fe29a4468e2c9"}, - {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:f2200e00b62568cfd920127782c61bc1c546062a879cdc741cfcc6976668dfcf"}, - {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9691a549c19c22d26a4f3b948071e93517bdf86e41b81d8c6ac8a964bb71e5a6"}, - {file = "regex-2023.8.8-cp39-cp39-win32.whl", hash = "sha256:6ab2ed84bf0137927846b37e882745a827458689eb969028af8032b1b3dac78e"}, - {file = "regex-2023.8.8-cp39-cp39-win_amd64.whl", hash = "sha256:5543c055d8ec7801901e1193a51570643d6a6ab8751b1f7dd9af71af467538bb"}, - {file = "regex-2023.8.8.tar.gz", hash = "sha256:fcbdc5f2b0f1cd0f6a56cdb46fe41d2cce1e644e3b68832f3eeebc5fb0f7712e"}, + {file = "regex-2023.10.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4c34d4f73ea738223a094d8e0ffd6d2c1a1b4c175da34d6b0de3d8d69bee6bcc"}, + {file = "regex-2023.10.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a8f4e49fc3ce020f65411432183e6775f24e02dff617281094ba6ab079ef0915"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4cd1bccf99d3ef1ab6ba835308ad85be040e6a11b0977ef7ea8c8005f01a3c29"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:81dce2ddc9f6e8f543d94b05d56e70d03a0774d32f6cca53e978dc01e4fc75b8"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c6b4d23c04831e3ab61717a707a5d763b300213db49ca680edf8bf13ab5d91b"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c15ad0aee158a15e17e0495e1e18741573d04eb6da06d8b84af726cfc1ed02ee"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6239d4e2e0b52c8bd38c51b760cd870069f0bdf99700a62cd509d7a031749a55"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4a8bf76e3182797c6b1afa5b822d1d5802ff30284abe4599e1247be4fd6b03be"}, + {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d9c727bbcf0065cbb20f39d2b4f932f8fa1631c3e01fcedc979bd4f51fe051c5"}, + {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3ccf2716add72f80714b9a63899b67fa711b654be3fcdd34fa391d2d274ce767"}, + {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:107ac60d1bfdc3edb53be75e2a52aff7481b92817cfdddd9b4519ccf0e54a6ff"}, + {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:00ba3c9818e33f1fa974693fb55d24cdc8ebafcb2e4207680669d8f8d7cca79a"}, + {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f0a47efb1dbef13af9c9a54a94a0b814902e547b7f21acb29434504d18f36e3a"}, + {file = "regex-2023.10.3-cp310-cp310-win32.whl", hash = "sha256:36362386b813fa6c9146da6149a001b7bd063dabc4d49522a1f7aa65b725c7ec"}, + {file = "regex-2023.10.3-cp310-cp310-win_amd64.whl", hash = "sha256:c65a3b5330b54103e7d21cac3f6bf3900d46f6d50138d73343d9e5b2900b2353"}, + {file = "regex-2023.10.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:90a79bce019c442604662d17bf69df99090e24cdc6ad95b18b6725c2988a490e"}, + {file = "regex-2023.10.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c7964c2183c3e6cce3f497e3a9f49d182e969f2dc3aeeadfa18945ff7bdd7051"}, + {file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ef80829117a8061f974b2fda8ec799717242353bff55f8a29411794d635d964"}, + {file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5addc9d0209a9afca5fc070f93b726bf7003bd63a427f65ef797a931782e7edc"}, + {file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c148bec483cc4b421562b4bcedb8e28a3b84fcc8f0aa4418e10898f3c2c0eb9b"}, + {file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d1f21af4c1539051049796a0f50aa342f9a27cde57318f2fc41ed50b0dbc4ac"}, + {file = "regex-2023.10.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b9ac09853b2a3e0d0082104036579809679e7715671cfbf89d83c1cb2a30f58"}, + {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ebedc192abbc7fd13c5ee800e83a6df252bec691eb2c4bedc9f8b2e2903f5e2a"}, + {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d8a993c0a0ffd5f2d3bda23d0cd75e7086736f8f8268de8a82fbc4bd0ac6791e"}, + {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:be6b7b8d42d3090b6c80793524fa66c57ad7ee3fe9722b258aec6d0672543fd0"}, + {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4023e2efc35a30e66e938de5aef42b520c20e7eda7bb5fb12c35e5d09a4c43f6"}, + {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0d47840dc05e0ba04fe2e26f15126de7c755496d5a8aae4a08bda4dd8d646c54"}, + {file = "regex-2023.10.3-cp311-cp311-win32.whl", hash = "sha256:9145f092b5d1977ec8c0ab46e7b3381b2fd069957b9862a43bd383e5c01d18c2"}, + {file = "regex-2023.10.3-cp311-cp311-win_amd64.whl", hash = "sha256:b6104f9a46bd8743e4f738afef69b153c4b8b592d35ae46db07fc28ae3d5fb7c"}, + {file = "regex-2023.10.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:bff507ae210371d4b1fe316d03433ac099f184d570a1a611e541923f78f05037"}, + {file = "regex-2023.10.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:be5e22bbb67924dea15039c3282fa4cc6cdfbe0cbbd1c0515f9223186fc2ec5f"}, + {file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a992f702c9be9c72fa46f01ca6e18d131906a7180950958f766c2aa294d4b41"}, + {file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7434a61b158be563c1362d9071358f8ab91b8d928728cd2882af060481244c9e"}, + {file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2169b2dcabf4e608416f7f9468737583ce5f0a6e8677c4efbf795ce81109d7c"}, + {file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9e908ef5889cda4de038892b9accc36d33d72fb3e12c747e2799a0e806ec841"}, + {file = "regex-2023.10.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12bd4bc2c632742c7ce20db48e0d99afdc05e03f0b4c1af90542e05b809a03d9"}, + {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bc72c231f5449d86d6c7d9cc7cd819b6eb30134bb770b8cfdc0765e48ef9c420"}, + {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bce8814b076f0ce5766dc87d5a056b0e9437b8e0cd351b9a6c4e1134a7dfbda9"}, + {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:ba7cd6dc4d585ea544c1412019921570ebd8a597fabf475acc4528210d7c4a6f"}, + {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b0c7d2f698e83f15228ba41c135501cfe7d5740181d5903e250e47f617eb4292"}, + {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5a8f91c64f390ecee09ff793319f30a0f32492e99f5dc1c72bc361f23ccd0a9a"}, + {file = "regex-2023.10.3-cp312-cp312-win32.whl", hash = "sha256:ad08a69728ff3c79866d729b095872afe1e0557251da4abb2c5faff15a91d19a"}, + {file = "regex-2023.10.3-cp312-cp312-win_amd64.whl", hash = "sha256:39cdf8d141d6d44e8d5a12a8569d5a227f645c87df4f92179bd06e2e2705e76b"}, + {file = "regex-2023.10.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4a3ee019a9befe84fa3e917a2dd378807e423d013377a884c1970a3c2792d293"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76066d7ff61ba6bf3cb5efe2428fc82aac91802844c022d849a1f0f53820502d"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bfe50b61bab1b1ec260fa7cd91106fa9fece57e6beba05630afe27c71259c59b"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fd88f373cb71e6b59b7fa597e47e518282455c2734fd4306a05ca219a1991b0"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3ab05a182c7937fb374f7e946f04fb23a0c0699c0450e9fb02ef567412d2fa3"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dac37cf08fcf2094159922edc7a2784cfcc5c70f8354469f79ed085f0328ebdf"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e54ddd0bb8fb626aa1f9ba7b36629564544954fff9669b15da3610c22b9a0991"}, + {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3367007ad1951fde612bf65b0dffc8fd681a4ab98ac86957d16491400d661302"}, + {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:16f8740eb6dbacc7113e3097b0a36065a02e37b47c936b551805d40340fb9971"}, + {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:f4f2ca6df64cbdd27f27b34f35adb640b5d2d77264228554e68deda54456eb11"}, + {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:39807cbcbe406efca2a233884e169d056c35aa7e9f343d4e78665246a332f597"}, + {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7eece6fbd3eae4a92d7c748ae825cbc1ee41a89bb1c3db05b5578ed3cfcfd7cb"}, + {file = "regex-2023.10.3-cp37-cp37m-win32.whl", hash = "sha256:ce615c92d90df8373d9e13acddd154152645c0dc060871abf6bd43809673d20a"}, + {file = "regex-2023.10.3-cp37-cp37m-win_amd64.whl", hash = "sha256:0f649fa32fe734c4abdfd4edbb8381c74abf5f34bc0b3271ce687b23729299ed"}, + {file = "regex-2023.10.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9b98b7681a9437262947f41c7fac567c7e1f6eddd94b0483596d320092004533"}, + {file = "regex-2023.10.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:91dc1d531f80c862441d7b66c4505cd6ea9d312f01fb2f4654f40c6fdf5cc37a"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82fcc1f1cc3ff1ab8a57ba619b149b907072e750815c5ba63e7aa2e1163384a4"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7979b834ec7a33aafae34a90aad9f914c41fd6eaa8474e66953f3f6f7cbd4368"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef71561f82a89af6cfcbee47f0fabfdb6e63788a9258e913955d89fdd96902ab"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd829712de97753367153ed84f2de752b86cd1f7a88b55a3a775eb52eafe8a94"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00e871d83a45eee2f8688d7e6849609c2ca2a04a6d48fba3dff4deef35d14f07"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:706e7b739fdd17cb89e1fbf712d9dc21311fc2333f6d435eac2d4ee81985098c"}, + {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:cc3f1c053b73f20c7ad88b0d1d23be7e7b3901229ce89f5000a8399746a6e039"}, + {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6f85739e80d13644b981a88f529d79c5bdf646b460ba190bffcaf6d57b2a9863"}, + {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:741ba2f511cc9626b7561a440f87d658aabb3d6b744a86a3c025f866b4d19e7f"}, + {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e77c90ab5997e85901da85131fd36acd0ed2221368199b65f0d11bca44549711"}, + {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:979c24cbefaf2420c4e377ecd1f165ea08cc3d1fbb44bdc51bccbbf7c66a2cb4"}, + {file = "regex-2023.10.3-cp38-cp38-win32.whl", hash = "sha256:58837f9d221744d4c92d2cf7201c6acd19623b50c643b56992cbd2b745485d3d"}, + {file = "regex-2023.10.3-cp38-cp38-win_amd64.whl", hash = "sha256:c55853684fe08d4897c37dfc5faeff70607a5f1806c8be148f1695be4a63414b"}, + {file = "regex-2023.10.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2c54e23836650bdf2c18222c87f6f840d4943944146ca479858404fedeb9f9af"}, + {file = "regex-2023.10.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:69c0771ca5653c7d4b65203cbfc5e66db9375f1078689459fe196fe08b7b4930"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ac965a998e1388e6ff2e9781f499ad1eaa41e962a40d11c7823c9952c77123e"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1c0e8fae5b27caa34177bdfa5a960c46ff2f78ee2d45c6db15ae3f64ecadde14"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6c56c3d47da04f921b73ff9415fbaa939f684d47293f071aa9cbb13c94afc17d"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ef1e014eed78ab650bef9a6a9cbe50b052c0aebe553fb2881e0453717573f52"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d29338556a59423d9ff7b6eb0cb89ead2b0875e08fe522f3e068b955c3e7b59b"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9c6d0ced3c06d0f183b73d3c5920727268d2201aa0fe6d55c60d68c792ff3588"}, + {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:994645a46c6a740ee8ce8df7911d4aee458d9b1bc5639bc968226763d07f00fa"}, + {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:66e2fe786ef28da2b28e222c89502b2af984858091675044d93cb50e6f46d7af"}, + {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:11175910f62b2b8c055f2b089e0fedd694fe2be3941b3e2633653bc51064c528"}, + {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:06e9abc0e4c9ab4779c74ad99c3fc10d3967d03114449acc2c2762ad4472b8ca"}, + {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:fb02e4257376ae25c6dd95a5aec377f9b18c09be6ebdefa7ad209b9137b73d48"}, + {file = "regex-2023.10.3-cp39-cp39-win32.whl", hash = "sha256:3b2c3502603fab52d7619b882c25a6850b766ebd1b18de3df23b2f939360e1bd"}, + {file = "regex-2023.10.3-cp39-cp39-win_amd64.whl", hash = "sha256:adbccd17dcaff65704c856bd29951c58a1bd4b2b0f8ad6b826dbd543fe740988"}, + {file = "regex-2023.10.3.tar.gz", hash = "sha256:3fef4f844d2290ee0ba57addcec17eec9e3df73f10a2748485dfd6a3a188cc0f"}, ] [[package]] @@ -3607,129 +3323,112 @@ files = [ {file = "rfc3986_validator-0.1.1.tar.gz", hash = "sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055"}, ] -[[package]] -name = "rich" -version = "13.5.2" -description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "rich-13.5.2-py3-none-any.whl", hash = "sha256:146a90b3b6b47cac4a73c12866a499e9817426423f57c5a66949c086191a8808"}, - {file = "rich-13.5.2.tar.gz", hash = "sha256:fb9d6c0a0f643c99eed3875b5377a184132ba9be4d61516a55273d3554d75a39"}, -] - -[package.dependencies] -markdown-it-py = ">=2.2.0" -pygments = ">=2.13.0,<3.0.0" -typing-extensions = {version = ">=4.0.0,<5.0", markers = "python_version < \"3.9\""} - -[package.extras] -jupyter = ["ipywidgets (>=7.5.1,<9)"] - [[package]] name = "rpds-py" -version = "0.10.3" +version = "0.13.0" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.8" files = [ - {file = "rpds_py-0.10.3-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:485747ee62da83366a44fbba963c5fe017860ad408ccd6cd99aa66ea80d32b2e"}, - {file = "rpds_py-0.10.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c55f9821f88e8bee4b7a72c82cfb5ecd22b6aad04033334f33c329b29bfa4da0"}, - {file = "rpds_py-0.10.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3b52a67ac66a3a64a7e710ba629f62d1e26ca0504c29ee8cbd99b97df7079a8"}, - {file = "rpds_py-0.10.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3aed39db2f0ace76faa94f465d4234aac72e2f32b009f15da6492a561b3bbebd"}, - {file = "rpds_py-0.10.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:271c360fdc464fe6a75f13ea0c08ddf71a321f4c55fc20a3fe62ea3ef09df7d9"}, - {file = "rpds_py-0.10.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef5fddfb264e89c435be4adb3953cef5d2936fdeb4463b4161a6ba2f22e7b740"}, - {file = "rpds_py-0.10.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a771417c9c06c56c9d53d11a5b084d1de75de82978e23c544270ab25e7c066ff"}, - {file = "rpds_py-0.10.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:52b5cbc0469328e58180021138207e6ec91d7ca2e037d3549cc9e34e2187330a"}, - {file = "rpds_py-0.10.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6ac3fefb0d168c7c6cab24fdfc80ec62cd2b4dfd9e65b84bdceb1cb01d385c33"}, - {file = "rpds_py-0.10.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:8d54bbdf5d56e2c8cf81a1857250f3ea132de77af543d0ba5dce667183b61fec"}, - {file = "rpds_py-0.10.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cd2163f42868865597d89399a01aa33b7594ce8e2c4a28503127c81a2f17784e"}, - {file = "rpds_py-0.10.3-cp310-none-win32.whl", hash = "sha256:ea93163472db26ac6043e8f7f93a05d9b59e0505c760da2a3cd22c7dd7111391"}, - {file = "rpds_py-0.10.3-cp310-none-win_amd64.whl", hash = "sha256:7cd020b1fb41e3ab7716d4d2c3972d4588fdfbab9bfbbb64acc7078eccef8860"}, - {file = "rpds_py-0.10.3-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:1d9b5ee46dcb498fa3e46d4dfabcb531e1f2e76b477e0d99ef114f17bbd38453"}, - {file = "rpds_py-0.10.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:563646d74a4b4456d0cf3b714ca522e725243c603e8254ad85c3b59b7c0c4bf0"}, - {file = "rpds_py-0.10.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e626b864725680cd3904414d72e7b0bd81c0e5b2b53a5b30b4273034253bb41f"}, - {file = "rpds_py-0.10.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:485301ee56ce87a51ccb182a4b180d852c5cb2b3cb3a82f7d4714b4141119d8c"}, - {file = "rpds_py-0.10.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:42f712b4668831c0cd85e0a5b5a308700fe068e37dcd24c0062904c4e372b093"}, - {file = "rpds_py-0.10.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6c9141af27a4e5819d74d67d227d5047a20fa3c7d4d9df43037a955b4c748ec5"}, - {file = "rpds_py-0.10.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef750a20de1b65657a1425f77c525b0183eac63fe7b8f5ac0dd16f3668d3e64f"}, - {file = "rpds_py-0.10.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e1a0ffc39f51aa5f5c22114a8f1906b3c17eba68c5babb86c5f77d8b1bba14d1"}, - {file = "rpds_py-0.10.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f4c179a7aeae10ddf44c6bac87938134c1379c49c884529f090f9bf05566c836"}, - {file = "rpds_py-0.10.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:176287bb998fd1e9846a9b666e240e58f8d3373e3bf87e7642f15af5405187b8"}, - {file = "rpds_py-0.10.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6446002739ca29249f0beaaf067fcbc2b5aab4bc7ee8fb941bd194947ce19aff"}, - {file = "rpds_py-0.10.3-cp311-none-win32.whl", hash = "sha256:c7aed97f2e676561416c927b063802c8a6285e9b55e1b83213dfd99a8f4f9e48"}, - {file = "rpds_py-0.10.3-cp311-none-win_amd64.whl", hash = "sha256:8bd01ff4032abaed03f2db702fa9a61078bee37add0bd884a6190b05e63b028c"}, - {file = "rpds_py-0.10.3-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:4cf0855a842c5b5c391dd32ca273b09e86abf8367572073bd1edfc52bc44446b"}, - {file = "rpds_py-0.10.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:69b857a7d8bd4f5d6e0db4086da8c46309a26e8cefdfc778c0c5cc17d4b11e08"}, - {file = "rpds_py-0.10.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:975382d9aa90dc59253d6a83a5ca72e07f4ada3ae3d6c0575ced513db322b8ec"}, - {file = "rpds_py-0.10.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:35fbd23c1c8732cde7a94abe7fb071ec173c2f58c0bd0d7e5b669fdfc80a2c7b"}, - {file = "rpds_py-0.10.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:106af1653007cc569d5fbb5f08c6648a49fe4de74c2df814e234e282ebc06957"}, - {file = "rpds_py-0.10.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ce5e7504db95b76fc89055c7f41e367eaadef5b1d059e27e1d6eabf2b55ca314"}, - {file = "rpds_py-0.10.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5aca759ada6b1967fcfd4336dcf460d02a8a23e6abe06e90ea7881e5c22c4de6"}, - {file = "rpds_py-0.10.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b5d4bdd697195f3876d134101c40c7d06d46c6ab25159ed5cbd44105c715278a"}, - {file = "rpds_py-0.10.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a657250807b6efd19b28f5922520ae002a54cb43c2401e6f3d0230c352564d25"}, - {file = "rpds_py-0.10.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:177c9dd834cdf4dc39c27436ade6fdf9fe81484758885f2d616d5d03c0a83bd2"}, - {file = "rpds_py-0.10.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e22491d25f97199fc3581ad8dd8ce198d8c8fdb8dae80dea3512e1ce6d5fa99f"}, - {file = "rpds_py-0.10.3-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:2f3e1867dd574014253b4b8f01ba443b9c914e61d45f3674e452a915d6e929a3"}, - {file = "rpds_py-0.10.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c22211c165166de6683de8136229721f3d5c8606cc2c3d1562da9a3a5058049c"}, - {file = "rpds_py-0.10.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40bc802a696887b14c002edd43c18082cb7b6f9ee8b838239b03b56574d97f71"}, - {file = "rpds_py-0.10.3-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e271dd97c7bb8eefda5cca38cd0b0373a1fea50f71e8071376b46968582af9b"}, - {file = "rpds_py-0.10.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:95cde244e7195b2c07ec9b73fa4c5026d4a27233451485caa1cd0c1b55f26dbd"}, - {file = "rpds_py-0.10.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08a80cf4884920863623a9ee9a285ee04cef57ebedc1cc87b3e3e0f24c8acfe5"}, - {file = "rpds_py-0.10.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:763ad59e105fca09705d9f9b29ecffb95ecdc3b0363be3bb56081b2c6de7977a"}, - {file = "rpds_py-0.10.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:187700668c018a7e76e89424b7c1042f317c8df9161f00c0c903c82b0a8cac5c"}, - {file = "rpds_py-0.10.3-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:5267cfda873ad62591b9332fd9472d2409f7cf02a34a9c9cb367e2c0255994bf"}, - {file = "rpds_py-0.10.3-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:2ed83d53a8c5902ec48b90b2ac045e28e1698c0bea9441af9409fc844dc79496"}, - {file = "rpds_py-0.10.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:255f1a10ae39b52122cce26ce0781f7a616f502feecce9e616976f6a87992d6b"}, - {file = "rpds_py-0.10.3-cp38-none-win32.whl", hash = "sha256:a019a344312d0b1f429c00d49c3be62fa273d4a1094e1b224f403716b6d03be1"}, - {file = "rpds_py-0.10.3-cp38-none-win_amd64.whl", hash = "sha256:efb9ece97e696bb56e31166a9dd7919f8f0c6b31967b454718c6509f29ef6fee"}, - {file = "rpds_py-0.10.3-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:570cc326e78ff23dec7f41487aa9c3dffd02e5ee9ab43a8f6ccc3df8f9327623"}, - {file = "rpds_py-0.10.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cff7351c251c7546407827b6a37bcef6416304fc54d12d44dbfecbb717064717"}, - {file = "rpds_py-0.10.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:177914f81f66c86c012311f8c7f46887ec375cfcfd2a2f28233a3053ac93a569"}, - {file = "rpds_py-0.10.3-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:448a66b8266de0b581246ca7cd6a73b8d98d15100fb7165974535fa3b577340e"}, - {file = "rpds_py-0.10.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bbac1953c17252f9cc675bb19372444aadf0179b5df575ac4b56faaec9f6294"}, - {file = "rpds_py-0.10.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9dd9d9d9e898b9d30683bdd2b6c1849449158647d1049a125879cb397ee9cd12"}, - {file = "rpds_py-0.10.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8c71ea77536149e36c4c784f6d420ffd20bea041e3ba21ed021cb40ce58e2c9"}, - {file = "rpds_py-0.10.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:16a472300bc6c83fe4c2072cc22b3972f90d718d56f241adabc7ae509f53f154"}, - {file = "rpds_py-0.10.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:b9255e7165083de7c1d605e818025e8860636348f34a79d84ec533546064f07e"}, - {file = "rpds_py-0.10.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:53d7a3cd46cdc1689296348cb05ffd4f4280035770aee0c8ead3bbd4d6529acc"}, - {file = "rpds_py-0.10.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:22da15b902f9f8e267020d1c8bcfc4831ca646fecb60254f7bc71763569f56b1"}, - {file = "rpds_py-0.10.3-cp39-none-win32.whl", hash = "sha256:850c272e0e0d1a5c5d73b1b7871b0a7c2446b304cec55ccdb3eaac0d792bb065"}, - {file = "rpds_py-0.10.3-cp39-none-win_amd64.whl", hash = "sha256:de61e424062173b4f70eec07e12469edde7e17fa180019a2a0d75c13a5c5dc57"}, - {file = "rpds_py-0.10.3-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:af247fd4f12cca4129c1b82090244ea5a9d5bb089e9a82feb5a2f7c6a9fe181d"}, - {file = "rpds_py-0.10.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:3ad59efe24a4d54c2742929001f2d02803aafc15d6d781c21379e3f7f66ec842"}, - {file = "rpds_py-0.10.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:642ed0a209ced4be3a46f8cb094f2d76f1f479e2a1ceca6de6346a096cd3409d"}, - {file = "rpds_py-0.10.3-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:37d0c59548ae56fae01c14998918d04ee0d5d3277363c10208eef8c4e2b68ed6"}, - {file = "rpds_py-0.10.3-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aad6ed9e70ddfb34d849b761fb243be58c735be6a9265b9060d6ddb77751e3e8"}, - {file = "rpds_py-0.10.3-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8f94fdd756ba1f79f988855d948ae0bad9ddf44df296770d9a58c774cfbcca72"}, - {file = "rpds_py-0.10.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77076bdc8776a2b029e1e6ffbe6d7056e35f56f5e80d9dc0bad26ad4a024a762"}, - {file = "rpds_py-0.10.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:87d9b206b1bd7a0523375dc2020a6ce88bca5330682ae2fe25e86fd5d45cea9c"}, - {file = "rpds_py-0.10.3-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:8efaeb08ede95066da3a3e3c420fcc0a21693fcd0c4396d0585b019613d28515"}, - {file = "rpds_py-0.10.3-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:a4d9bfda3f84fc563868fe25ca160c8ff0e69bc4443c5647f960d59400ce6557"}, - {file = "rpds_py-0.10.3-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:d27aa6bbc1f33be920bb7adbb95581452cdf23005d5611b29a12bb6a3468cc95"}, - {file = "rpds_py-0.10.3-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:ed8313809571a5463fd7db43aaca68ecb43ca7a58f5b23b6e6c6c5d02bdc7882"}, - {file = "rpds_py-0.10.3-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:e10e6a1ed2b8661201e79dff5531f8ad4cdd83548a0f81c95cf79b3184b20c33"}, - {file = "rpds_py-0.10.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:015de2ce2af1586ff5dc873e804434185199a15f7d96920ce67e50604592cae9"}, - {file = "rpds_py-0.10.3-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ae87137951bb3dc08c7d8bfb8988d8c119f3230731b08a71146e84aaa919a7a9"}, - {file = "rpds_py-0.10.3-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0bb4f48bd0dd18eebe826395e6a48b7331291078a879295bae4e5d053be50d4c"}, - {file = "rpds_py-0.10.3-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:09362f86ec201288d5687d1dc476b07bf39c08478cde837cb710b302864e7ec9"}, - {file = "rpds_py-0.10.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:821392559d37759caa67d622d0d2994c7a3f2fb29274948ac799d496d92bca73"}, - {file = "rpds_py-0.10.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7170cbde4070dc3c77dec82abf86f3b210633d4f89550fa0ad2d4b549a05572a"}, - {file = "rpds_py-0.10.3-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:5de11c041486681ce854c814844f4ce3282b6ea1656faae19208ebe09d31c5b8"}, - {file = "rpds_py-0.10.3-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:4ed172d0c79f156c1b954e99c03bc2e3033c17efce8dd1a7c781bc4d5793dfac"}, - {file = "rpds_py-0.10.3-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:11fdd1192240dda8d6c5d18a06146e9045cb7e3ba7c06de6973000ff035df7c6"}, - {file = "rpds_py-0.10.3-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:f602881d80ee4228a2355c68da6b296a296cd22bbb91e5418d54577bbf17fa7c"}, - {file = "rpds_py-0.10.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:691d50c99a937709ac4c4cd570d959a006bd6a6d970a484c84cc99543d4a5bbb"}, - {file = "rpds_py-0.10.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24cd91a03543a0f8d09cb18d1cb27df80a84b5553d2bd94cba5979ef6af5c6e7"}, - {file = "rpds_py-0.10.3-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fc2200e79d75b5238c8d69f6a30f8284290c777039d331e7340b6c17cad24a5a"}, - {file = "rpds_py-0.10.3-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea65b59882d5fa8c74a23f8960db579e5e341534934f43f3b18ec1839b893e41"}, - {file = "rpds_py-0.10.3-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:829e91f3a8574888b73e7a3feb3b1af698e717513597e23136ff4eba0bc8387a"}, - {file = "rpds_py-0.10.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eab75a8569a095f2ad470b342f2751d9902f7944704f0571c8af46bede438475"}, - {file = "rpds_py-0.10.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:061c3ff1f51ecec256e916cf71cc01f9975af8fb3af9b94d3c0cc8702cfea637"}, - {file = "rpds_py-0.10.3-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:39d05e65f23a0fe897b6ac395f2a8d48c56ac0f583f5d663e0afec1da89b95da"}, - {file = "rpds_py-0.10.3-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:4eca20917a06d2fca7628ef3c8b94a8c358f6b43f1a621c9815243462dcccf97"}, - {file = "rpds_py-0.10.3-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e8d0f0eca087630d58b8c662085529781fd5dc80f0a54eda42d5c9029f812599"}, - {file = "rpds_py-0.10.3.tar.gz", hash = "sha256:fcc1ebb7561a3e24a6588f7c6ded15d80aec22c66a070c757559b57b17ffd1cb"}, + {file = "rpds_py-0.13.0-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:1758197cc8d7ff383c07405f188253535b4aa7fa745cbc54d221ae84b18e0702"}, + {file = "rpds_py-0.13.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:715df74cbcef4387d623c917f295352127f4b3e0388038d68fa577b4e4c6e540"}, + {file = "rpds_py-0.13.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c8a9cec0f49df9bac252d92f138c0d7708d98828e21fd57db78087d8f50b5656"}, + {file = "rpds_py-0.13.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5c2545bba02f68abdf398ef4990dc77592cc1e5d29438b35b3a3ca34d171fb4b"}, + {file = "rpds_py-0.13.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:95375c44ffb9ea2bc25d67fb66e726ea266ff1572df50b9556fe28a5f3519cd7"}, + {file = "rpds_py-0.13.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:54e513df45a8a9419e7952ffd26ac9a5b7b1df97fe72530421794b0de29f9d72"}, + {file = "rpds_py-0.13.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a25f514a53927b6b4bd04a9a6a13b55209df54f548660eeed673336c0c946d14"}, + {file = "rpds_py-0.13.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c1a920fa679ec2758411d66bf68840b0a21317b9954ab0e973742d723bb67709"}, + {file = "rpds_py-0.13.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f9339d1404b87e6d8cb35e485945753be57a99ab9bb389f42629215b2f6bda0f"}, + {file = "rpds_py-0.13.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c99f9dda2c959f7bb69a7125e192c74fcafb7a534a95ccf49313ae3a04807804"}, + {file = "rpds_py-0.13.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bad6758df5f1042b35683bd1811d5432ac1b17700a5a2a51fdc293f7df5f7827"}, + {file = "rpds_py-0.13.0-cp310-none-win32.whl", hash = "sha256:2a29ec68fa9655ce9501bc6ae074b166e8b45c2dfcd2d71d90d1a61758ed8c73"}, + {file = "rpds_py-0.13.0-cp310-none-win_amd64.whl", hash = "sha256:244be953f13f148b0071d67a610f89cd72eb5013a147e517d6ca3f3f3b7e0380"}, + {file = "rpds_py-0.13.0-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:240279ca0b2afd6d4710afce1c94bf9e75fc161290bf62c0feba64d64780d80b"}, + {file = "rpds_py-0.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:25c9727da2dabc93664a18eda7a70feedf478f0c4c8294e4cdba7f60a479a246"}, + {file = "rpds_py-0.13.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:981e46e1e5064f95460381bff4353783b4b5ce351c930e5b507ebe0278c61dac"}, + {file = "rpds_py-0.13.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6052bb47ea583646b8ff562acacb9a2ec5ec847267049cbae3919671929e94c6"}, + {file = "rpds_py-0.13.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87f591ff8cc834fa01ca5899ab5edcd7ee590492a9cdcf43424ac142e731ce3e"}, + {file = "rpds_py-0.13.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:62772259b3381e2aabf274c74fd1e1ac03b0524de0a6593900684becfa8cfe4b"}, + {file = "rpds_py-0.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4de9d20fe68c16b4d97f551a09920745add0c86430262230528b83c2ed2fe90"}, + {file = "rpds_py-0.13.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b70a54fb628c1d6400e351674a31ba63d2912b8c5b707f99b408674a5d8b69ab"}, + {file = "rpds_py-0.13.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2063ab9cd1be7ef6b5ed0f408e2bdf32c060b6f40c097a468f32864731302636"}, + {file = "rpds_py-0.13.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:84f7f3f18d29a1c645729634003d21d84028bd9c2fd78eba9d028998f46fa5aa"}, + {file = "rpds_py-0.13.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f7c7ddc8d1a64623068da5a15e28001fbd0f0aff754aae7a75a4be5042191638"}, + {file = "rpds_py-0.13.0-cp311-none-win32.whl", hash = "sha256:8a33d2b6340261191bb59adb5a453fa6c7d99de85552bd4e8196411f0509c9bf"}, + {file = "rpds_py-0.13.0-cp311-none-win_amd64.whl", hash = "sha256:8b9c1dd90461940315981499df62a627571c4f0992e8bafc5396d33916224cac"}, + {file = "rpds_py-0.13.0-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:15a2d542de5cbfc6abddc4846d9412b59f8ee9c8dfa0b9c92a29321297c91745"}, + {file = "rpds_py-0.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8dd69e01b29ff45a0062cad5c480d8aa9301c3ef09da471f86337a78eb2d3405"}, + {file = "rpds_py-0.13.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efdd02971a02f98492a72b25484f1f6125fb9f2166e48cc4c9bfa563349c851b"}, + {file = "rpds_py-0.13.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:91ca9aaee7ccdfa66d800b5c4ec634fefca947721bab52d6ad2f6350969a3771"}, + {file = "rpds_py-0.13.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:afcec1f5b09d0db70aeb2d90528a9164acb61841a3124e28f6ac0137f4c36cb4"}, + {file = "rpds_py-0.13.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c6824673f66c47f7ee759c21e973bfce3ceaf2c25cb940cb45b41105dc914e8"}, + {file = "rpds_py-0.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50b6d80925dfeb573fc5e38582fb9517c6912dc462cc858a11c8177b0837127a"}, + {file = "rpds_py-0.13.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3a1a38512925829784b5dc38591c757b80cfce115c72c594dc59567dab62b9c4"}, + {file = "rpds_py-0.13.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:977c6123c359dcc70ce3161b781ab70b0d342de2666944b776617e01a0a7822a"}, + {file = "rpds_py-0.13.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c472409037e05ed87b99430f97a6b82130328bb977502813547e8ee6a3392502"}, + {file = "rpds_py-0.13.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:28bb22019f4a783ea06a6b81437d5996551869e8a722ee8720b744f7684d97f4"}, + {file = "rpds_py-0.13.0-cp312-none-win32.whl", hash = "sha256:46be9c0685cce2ea02151aa8308f2c1b78581be41a5dd239448a941a210ef5dd"}, + {file = "rpds_py-0.13.0-cp312-none-win_amd64.whl", hash = "sha256:3c5b9ad4d3e05dfcf8629f0d534f92610e9805dbce2fcb9b3c801ddb886431d5"}, + {file = "rpds_py-0.13.0-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:66eb5aa36e857f768c598d2082fafb733eaf53e06e1169c6b4de65636e04ffd0"}, + {file = "rpds_py-0.13.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c9f4c2b7d989426e9fe9b720211172cf10eb5f7aa16c63de2e5dc61457abcf35"}, + {file = "rpds_py-0.13.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1e37dfffe8959a492b7b331995f291847a41a035b4aad82d6060f38e8378a2b"}, + {file = "rpds_py-0.13.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8220321f2dccd9d66f72639185247cb7bbdd90753bf0b6bfca0fa31dba8af23c"}, + {file = "rpds_py-0.13.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e8f1d466a9747213d3cf7e1afec849cc51edb70d5b4ae9a82eca0f172bfbb6d0"}, + {file = "rpds_py-0.13.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c4c4b4ff3de834ec5c1c690e5a18233ca78547d003eb83664668ccf09ef1398"}, + {file = "rpds_py-0.13.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:525d19ef0a999229ef0f0a7687ab2c9a00d1b6a47a005006f4d8c4b8975fdcec"}, + {file = "rpds_py-0.13.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0982b59d014efb84a57128e7e69399fb29ad8f2da5b0a5bcbfd12e211c00492e"}, + {file = "rpds_py-0.13.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:f714dd5b705f1c394d1b361d96486c4981055c434a7eafb1a3147ac75e34a3de"}, + {file = "rpds_py-0.13.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:766b573a964389ef0d91a26bb31e1b59dbc5d06eff7707f3dfcec23d93080ba3"}, + {file = "rpds_py-0.13.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:2ed65ad3fc5065d13e31e90794e0b52e405b63ae4fab1080caeaadc10a3439c5"}, + {file = "rpds_py-0.13.0-cp38-none-win32.whl", hash = "sha256:9645f7fe10a68b2396d238250b4b264c2632d2eb6ce2cb90aa0fe08adee194be"}, + {file = "rpds_py-0.13.0-cp38-none-win_amd64.whl", hash = "sha256:42d0ad129c102856a364ccc7d356faec017af86b3543a8539795f22b6cabad11"}, + {file = "rpds_py-0.13.0-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:95c11647fac2a3515ea2614a79e14b7c75025724ad54c91c7db4a6ea5c25ef19"}, + {file = "rpds_py-0.13.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9435bf4832555c4f769c6be9401664357be33d5f5d8dc58f5c20fb8d21e2c45d"}, + {file = "rpds_py-0.13.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b1d671a74395344239ee3adbcd8c496525f6a2b2e54c40fec69620a31a8dcb"}, + {file = "rpds_py-0.13.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:13c8061115f1468de6ffdfb1d31b446e1bd814f1ff6e556862169aacb9fbbc5d"}, + {file = "rpds_py-0.13.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a78861123b002725633871a2096c3a4313224aab3d11b953dced87cfba702418"}, + {file = "rpds_py-0.13.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:97c1be5a018cdad54fa7e5f7d36b9ab45ef941a1d185987f18bdab0a42344012"}, + {file = "rpds_py-0.13.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e33b17915c8e4fb2ea8b91bb4c46cba92242c63dd38b87e869ead5ba217e2970"}, + {file = "rpds_py-0.13.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:153b6d8cf7ae4b9ffd09de6abeda661e351e3e06eaafd18a8c104ea00099b131"}, + {file = "rpds_py-0.13.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:da2852201e8e00c86be82c43d6893e6c380ef648ae53f337ffd1eaa35e3dfb8a"}, + {file = "rpds_py-0.13.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:a2383f400691fd7bd63347d4d75eb2fd525de9d901799a33a4e896c9885609f8"}, + {file = "rpds_py-0.13.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d5bf560634ea6e9a59ceb2181a6cd6195a03f48cef9a400eb15e197e18f14548"}, + {file = "rpds_py-0.13.0-cp39-none-win32.whl", hash = "sha256:fdaef49055cc0c701fb17b9b34a38ef375e5cdb230b3722d4a12baf9b7cbc6d3"}, + {file = "rpds_py-0.13.0-cp39-none-win_amd64.whl", hash = "sha256:26660c74a20fe249fad75ca00bbfcf60e57c3fdbde92971c88a20e07fea1de64"}, + {file = "rpds_py-0.13.0-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:28324f2f0247d407daabf7ff357ad9f36126075c92a0cf5319396d96ff4e1248"}, + {file = "rpds_py-0.13.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b431c2c0ff1ea56048a2b066d99d0c2d151ae7625b20be159b7e699f3e80390b"}, + {file = "rpds_py-0.13.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7472bd60a8293217444bdc6a46e516feb8d168da44d5f3fccea0336e88e3b79a"}, + {file = "rpds_py-0.13.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:169063f346b8fd84f47d986c9c48e6094eb38b839c1287e7cb886b8a2b32195d"}, + {file = "rpds_py-0.13.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eef7ee7c70f8b8698be468d54f9f5e01804f3a1dd5657e8a96363dbd52b9b5ec"}, + {file = "rpds_py-0.13.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:762013dd59df12380c5444f61ccbf9ae1297027cabbd7aa25891f724ebf8c8f7"}, + {file = "rpds_py-0.13.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:152570689a27ae0be1d5f50b21dad38d450b9227d0974f23bd400400ea087e88"}, + {file = "rpds_py-0.13.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d70a93a40e55da117c511ddc514642bc7d59a95a99137168a5f3f2f876b47962"}, + {file = "rpds_py-0.13.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:e6c6fed07d13b9e0fb689356c40c81f1aa92e3c9d91d8fd5816a0348ccd999f7"}, + {file = "rpds_py-0.13.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:cdded3cf9e36840b09ccef714d5fa74a03f4eb6cf81e694226ed9cb5e6f90de0"}, + {file = "rpds_py-0.13.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e1f40faf406c52c7ae7d208b9140377c06397248978ccb03fbfbb30a0571e359"}, + {file = "rpds_py-0.13.0-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:c10326e30c97a95b7e1d75e5200ef0b9827aa0f861e331e43b15dfdfd63e669b"}, + {file = "rpds_py-0.13.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:afde37e3763c602d0385bce5c12f262e7b1dd2a0f323e239fa9d7b2d4d5d8509"}, + {file = "rpds_py-0.13.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4084ab6840bd4d79eff3b5f497add847a7db31ce5a0c2d440c90b2d2b7011857"}, + {file = "rpds_py-0.13.0-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1c9c9cb48ab77ebfa47db25b753f594d4f44959cfe43b713439ca6e3c9329671"}, + {file = "rpds_py-0.13.0-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:533d728ea5ad5253af3395102723ca8a77b62de47b2295155650c9a88fcdeec8"}, + {file = "rpds_py-0.13.0-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f22cab655b41033d430f20266bf563b35038a7f01c9a099b0ccfd30a7fb9247"}, + {file = "rpds_py-0.13.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b9a0507342c37132813449393e6e6f351bbff376031cfff1ee6e616402ac7908"}, + {file = "rpds_py-0.13.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4eb1faf8e2ee9a2de3cb3ae4c8c355914cdc85f2cd7f27edf76444c9550ce1e7"}, + {file = "rpds_py-0.13.0-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:a61a152d61e3ae26e0bbba7b2f568f6f25ca0abdeb6553eca7e7c45b59d9b1a9"}, + {file = "rpds_py-0.13.0-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:e499bf2200eb74774a6f85a7465e3bc5273fa8ef0055590d97a88c1e7ea02eea"}, + {file = "rpds_py-0.13.0-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:1e5becd0de924616ca9a12abeb6458568d1dc8fe5c670d5cdb738402a8a8429d"}, + {file = "rpds_py-0.13.0-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:70cfe098d915f566eeebcb683f49f9404d2f948432891b6e075354336eda9dfb"}, + {file = "rpds_py-0.13.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:2e73511e88368f93c24efe7c9a20b319eaa828bc7431f8a17713efb9e31a39fa"}, + {file = "rpds_py-0.13.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c07cb9bcccd08f9bc2fd05bf586479df4272ea5a6a70fbcb59b018ed48a5a84d"}, + {file = "rpds_py-0.13.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8c4e84016ba225e09df20fed8befe8c68d14fbeff6078f4a0ff907ae2095e17e"}, + {file = "rpds_py-0.13.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6ad465e5a70580ca9c1944f43a9a71bca3a7b74554347fc96ca0479eca8981f9"}, + {file = "rpds_py-0.13.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:189aebd44a07fa7b7966cf78b85bde8335b0b6c3b1c4ef5589f8c03176830107"}, + {file = "rpds_py-0.13.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f50ca0460f1f7a89ab9b8355d83ac993d5998ad4218e76654ecf8afe648d8aa"}, + {file = "rpds_py-0.13.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f6c225011467021879c0482316e42d8a28852fc29f0c15d2a435ff457cadccd4"}, + {file = "rpds_py-0.13.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1e63b32b856c0f08a56b76967d61b6ad811d8d330a8aebb9d21afadd82a296f6"}, + {file = "rpds_py-0.13.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:7e5fbe9800f09c56967fda88c4d9272955e781699a66102bd098f22511a3f260"}, + {file = "rpds_py-0.13.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:fea99967d4a978ce95dd52310bcb4a943b77c61725393bca631b0908047d6e2f"}, + {file = "rpds_py-0.13.0.tar.gz", hash = "sha256:35cc91cbb0b775705e0feb3362490b8418c408e9e3c3b9cb3b02f6e495f03ee7"}, ] [[package]] @@ -3746,103 +3445,189 @@ files = [ [package.dependencies] pyasn1 = ">=0.1.3" +[[package]] +name = "ruff" +version = "0.1.6" +description = "An extremely fast Python linter and code formatter, written in Rust." +optional = false +python-versions = ">=3.7" +files = [ + {file = "ruff-0.1.6-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:88b8cdf6abf98130991cbc9f6438f35f6e8d41a02622cc5ee130a02a0ed28703"}, + {file = "ruff-0.1.6-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:5c549ed437680b6105a1299d2cd30e4964211606eeb48a0ff7a93ef70b902248"}, + {file = "ruff-0.1.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cf5f701062e294f2167e66d11b092bba7af6a057668ed618a9253e1e90cfd76"}, + {file = "ruff-0.1.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:05991ee20d4ac4bb78385360c684e4b417edd971030ab12a4fbd075ff535050e"}, + {file = "ruff-0.1.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:87455a0c1f739b3c069e2f4c43b66479a54dea0276dd5d4d67b091265f6fd1dc"}, + {file = "ruff-0.1.6-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:683aa5bdda5a48cb8266fcde8eea2a6af4e5700a392c56ea5fb5f0d4bfdc0240"}, + {file = "ruff-0.1.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:137852105586dcbf80c1717facb6781555c4e99f520c9c827bd414fac67ddfb6"}, + {file = "ruff-0.1.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bd98138a98d48a1c36c394fd6b84cd943ac92a08278aa8ac8c0fdefcf7138f35"}, + {file = "ruff-0.1.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a0cd909d25f227ac5c36d4e7e681577275fb74ba3b11d288aff7ec47e3ae745"}, + {file = "ruff-0.1.6-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e8fd1c62a47aa88a02707b5dd20c5ff20d035d634aa74826b42a1da77861b5ff"}, + {file = "ruff-0.1.6-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:fd89b45d374935829134a082617954120d7a1470a9f0ec0e7f3ead983edc48cc"}, + {file = "ruff-0.1.6-py3-none-musllinux_1_2_i686.whl", hash = "sha256:491262006e92f825b145cd1e52948073c56560243b55fb3b4ecb142f6f0e9543"}, + {file = "ruff-0.1.6-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:ea284789861b8b5ca9d5443591a92a397ac183d4351882ab52f6296b4fdd5462"}, + {file = "ruff-0.1.6-py3-none-win32.whl", hash = "sha256:1610e14750826dfc207ccbcdd7331b6bd285607d4181df9c1c6ae26646d6848a"}, + {file = "ruff-0.1.6-py3-none-win_amd64.whl", hash = "sha256:4558b3e178145491e9bc3b2ee3c4b42f19d19384eaa5c59d10acf6e8f8b57e33"}, + {file = "ruff-0.1.6-py3-none-win_arm64.whl", hash = "sha256:03910e81df0d8db0e30050725a5802441c2022ea3ae4fe0609b76081731accbc"}, + {file = "ruff-0.1.6.tar.gz", hash = "sha256:1b09f29b16c6ead5ea6b097ef2764b42372aebe363722f1605ecbcd2b9207184"}, +] + [[package]] name = "safetensors" -version = "0.3.3" -description = "Fast and Safe Tensor serialization" +version = "0.4.0" +description = "" optional = false -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "safetensors-0.3.3-cp310-cp310-macosx_10_11_x86_64.whl", hash = "sha256:92e4d0c8b2836120fddd134474c5bda8963f322333941f8b9f643e5b24f041eb"}, - {file = "safetensors-0.3.3-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:3dcadb6153c42addc9c625a622ebde9293fabe1973f9ef31ba10fb42c16e8536"}, - {file = "safetensors-0.3.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:08f26b61e1b0a14dc959aa9d568776bd038805f611caef1de04a80c468d4a7a4"}, - {file = "safetensors-0.3.3-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:17f41344d9a075f2f21b289a49a62e98baff54b5754240ba896063bce31626bf"}, - {file = "safetensors-0.3.3-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:f1045f798e1a16a6ced98d6a42ec72936d367a2eec81dc5fade6ed54638cd7d2"}, - {file = "safetensors-0.3.3-cp310-cp310-macosx_13_0_x86_64.whl", hash = "sha256:eaf0e4bc91da13f21ac846a39429eb3f3b7ed06295a32321fa3eb1a59b5c70f3"}, - {file = "safetensors-0.3.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a07121f427e646a50d18c1be0fa1a2cbf6398624c31149cd7e6b35486d72189e"}, - {file = "safetensors-0.3.3-cp310-cp310-win32.whl", hash = "sha256:a85e29cbfddfea86453cc0f4889b4bcc6b9c155be9a60e27be479a34e199e7ef"}, - {file = "safetensors-0.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:e13adad4a3e591378f71068d14e92343e626cf698ff805f61cdb946e684a218e"}, - {file = "safetensors-0.3.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:cbc3312f134baf07334dd517341a4b470b2931f090bd9284888acb7dfaf4606f"}, - {file = "safetensors-0.3.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:d15030af39d5d30c22bcbc6d180c65405b7ea4c05b7bab14a570eac7d7d43722"}, - {file = "safetensors-0.3.3-cp311-cp311-macosx_12_0_universal2.whl", hash = "sha256:f84a74cbe9859b28e3d6d7715ac1dd3097bebf8d772694098f6d42435245860c"}, - {file = "safetensors-0.3.3-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:10d637423d98ab2e6a4ad96abf4534eb26fcaf8ca3115623e64c00759374e90d"}, - {file = "safetensors-0.3.3-cp311-cp311-macosx_13_0_universal2.whl", hash = "sha256:3b46f5de8b44084aff2e480874c550c399c730c84b2e8ad1bddb062c94aa14e9"}, - {file = "safetensors-0.3.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e8fdf7407dba44587ed5e79d5de3533d242648e1f2041760b21474bd5ea5c8c"}, - {file = "safetensors-0.3.3-cp311-cp311-win32.whl", hash = "sha256:7d3b744cee8d7a46ffa68db1a2ff1a1a432488e3f7a5a97856fe69e22139d50c"}, - {file = "safetensors-0.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:f579877d30feec9b6ba409d05fa174633a4fc095675a4a82971d831a8bb60b97"}, - {file = "safetensors-0.3.3-cp37-cp37m-macosx_10_11_x86_64.whl", hash = "sha256:2fff5b19a1b462c17322998b2f4b8bce43c16fe208968174d2f3a1446284ceed"}, - {file = "safetensors-0.3.3-cp37-cp37m-macosx_11_0_x86_64.whl", hash = "sha256:41adb1d39e8aad04b16879e3e0cbcb849315999fad73bc992091a01e379cb058"}, - {file = "safetensors-0.3.3-cp37-cp37m-macosx_12_0_x86_64.whl", hash = "sha256:0f2b404250b3b877b11d34afcc30d80e7035714a1116a3df56acaca6b6c00096"}, - {file = "safetensors-0.3.3-cp37-cp37m-macosx_13_0_x86_64.whl", hash = "sha256:b43956ef20e9f4f2e648818a9e7b3499edd6b753a0f5526d4f6a6826fbee8446"}, - {file = "safetensors-0.3.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c32ee08f61cea56a5d62bbf94af95df6040c8ab574afffaeb7b44ae5da1e9e3"}, - {file = "safetensors-0.3.3-cp37-cp37m-win32.whl", hash = "sha256:351600f367badd59f7bfe86d317bb768dd8c59c1561c6fac43cafbd9c1af7827"}, - {file = "safetensors-0.3.3-cp37-cp37m-win_amd64.whl", hash = "sha256:034717e297849dae1af0a7027a14b8647bd2e272c24106dced64d83e10d468d1"}, - {file = "safetensors-0.3.3-cp38-cp38-macosx_10_11_x86_64.whl", hash = "sha256:8530399666748634bc0b301a6a5523756931b0c2680d188e743d16304afe917a"}, - {file = "safetensors-0.3.3-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:9d741c1f1621e489ba10aa3d135b54202684f6e205df52e219d5eecd673a80c9"}, - {file = "safetensors-0.3.3-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:0c345fd85b4d2093a5109596ff4cd9dfc2e84992e881b4857fbc4a93a3b89ddb"}, - {file = "safetensors-0.3.3-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:69ccee8d05f55cdf76f7e6c87d2bdfb648c16778ef8acfd2ecc495e273e9233e"}, - {file = "safetensors-0.3.3-cp38-cp38-macosx_13_0_arm64.whl", hash = "sha256:c08a9a4b7a4ca389232fa8d097aebc20bbd4f61e477abc7065b5c18b8202dede"}, - {file = "safetensors-0.3.3-cp38-cp38-macosx_13_0_x86_64.whl", hash = "sha256:a002868d2e3f49bbe81bee2655a411c24fa1f8e68b703dec6629cb989d6ae42e"}, - {file = "safetensors-0.3.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ab43aeeb9eadbb6b460df3568a662e6f1911ecc39387f8752afcb6a7d96c087"}, - {file = "safetensors-0.3.3-cp38-cp38-win32.whl", hash = "sha256:f2f59fce31dd3429daca7269a6b06f65e6547a0c248f5116976c3f1e9b73f251"}, - {file = "safetensors-0.3.3-cp38-cp38-win_amd64.whl", hash = "sha256:c31ca0d8610f57799925bf08616856b39518ab772c65093ef1516762e796fde4"}, - {file = "safetensors-0.3.3-cp39-cp39-macosx_10_11_x86_64.whl", hash = "sha256:59a596b3225c96d59af412385981f17dd95314e3fffdf359c7e3f5bb97730a19"}, - {file = "safetensors-0.3.3-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:82a16e92210a6221edd75ab17acdd468dd958ef5023d9c6c1289606cc30d1479"}, - {file = "safetensors-0.3.3-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:98a929e763a581f516373ef31983ed1257d2d0da912a8e05d5cd12e9e441c93a"}, - {file = "safetensors-0.3.3-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:12b83f1986cd16ea0454c636c37b11e819d60dd952c26978310a0835133480b7"}, - {file = "safetensors-0.3.3-cp39-cp39-macosx_13_0_arm64.whl", hash = "sha256:f439175c827c2f1bbd54df42789c5204a10983a30bc4242bc7deaf854a24f3f0"}, - {file = "safetensors-0.3.3-cp39-cp39-macosx_13_0_x86_64.whl", hash = "sha256:0085be33b8cbcb13079b3a8e131656e05b0bc5e6970530d4c24150f7afd76d70"}, - {file = "safetensors-0.3.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad3cc8006e7a86ee7c88bd2813ec59cd7cc75b03e6fa4af89b9c7b235b438d68"}, - {file = "safetensors-0.3.3-cp39-cp39-win32.whl", hash = "sha256:ab29f54c6b8c301ca05fa014728996bd83aac6e21528f893aaf8945c71f42b6d"}, - {file = "safetensors-0.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:0fa82004eae1a71e2aa29843ef99de9350e459a0fc2f65fc6ee0da9690933d2d"}, - {file = "safetensors-0.3.3.tar.gz", hash = "sha256:edb7072d788c4f929d0f5735d3a2fb51e5a27f833587828583b7f5747af1a2b8"}, + {file = "safetensors-0.4.0-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:2289ae6dbe6d027ecee016b28ced13a2e21a0b3a3a757a23033a2d1c0b1bad55"}, + {file = "safetensors-0.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:bf6458959f310f551cbbeef2255527ade5f783f952738e73e4d0136198cc3bfe"}, + {file = "safetensors-0.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b6b60a58a8f7cc7aed3b5b73dce1f5259a53c83d9ba43a76a874e6ad868c1b4d"}, + {file = "safetensors-0.4.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:491b3477e4d0d4599bb75d79da4b75af2e6ed9b1f6ec2b715991f0bc927bf09a"}, + {file = "safetensors-0.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59d2e10b7e0cd18bb73ed7c17c624a5957b003b81345e18159591771c26ee428"}, + {file = "safetensors-0.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3f667a4c12fb593f5f66ce966cb1b14a7148898b2b1a7f79e0761040ae1e3c51"}, + {file = "safetensors-0.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f9909512bcb6f712bdd04c296cdfb0d8ff73d258ffc5af884bb62ea02d221e0"}, + {file = "safetensors-0.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d33d29e846821f0e4f92614022949b09ccf063cb36fe2f9fe099cde1efbfbb87"}, + {file = "safetensors-0.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4d512525a8e05a045ce6698066ba0c5378c174a83e0b3720a8c7799dc1bb06f3"}, + {file = "safetensors-0.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0219cea445177f6ad1f9acd3a8d025440c8ff436d70a4a7c7ba9c36066aa9474"}, + {file = "safetensors-0.4.0-cp310-none-win32.whl", hash = "sha256:67ab171eeaad6972d3971c53d29d53353c67f6743284c6d637b59fa3e54c8a94"}, + {file = "safetensors-0.4.0-cp310-none-win_amd64.whl", hash = "sha256:7ffc736039f08a9ca1f09816a7481b8e4469c06e8f8a5ffa8cb67ddd79e6d77f"}, + {file = "safetensors-0.4.0-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:4fe9e3737b30de458225a23926219ca30b902ee779b6a3df96eaab2b6d625ec2"}, + {file = "safetensors-0.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e7916e814a90008de767b1c164a1d83803693c661ffe9af5a697b22e2752edb0"}, + {file = "safetensors-0.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cbc4a4da01143472323c145f3c289e5f6fabde0ac0a3414dabf912a21692fff4"}, + {file = "safetensors-0.4.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a54c21654a47669b38e359e8f852af754b786c9da884bb61ad5e9af12bd71ccb"}, + {file = "safetensors-0.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:25cd407955bad5340ba17f9f8ac789a0d751601a311e2f7b2733f9384478c95e"}, + {file = "safetensors-0.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:82e8fc4e3503cd738fd40718a430fe0e5ce6e7ff91a73d6ce628bbb89c41e8ce"}, + {file = "safetensors-0.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48b92059b1a4ad163024d4f526e0e73ebe2bb3ae70537e15e347820b4de5dc27"}, + {file = "safetensors-0.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5daa05058f7dce85b5f9f60c4eab483ed7859d63978f08a76e52e78859ff20ca"}, + {file = "safetensors-0.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a86565a5c112dd855909e20144947b4f53abb78c4de207f36ca71ee63ba5b90d"}, + {file = "safetensors-0.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:38032078ed9fea52d06584e441bccc73fb475c4581600c6d6166de2fe2deb3d1"}, + {file = "safetensors-0.4.0-cp311-none-win32.whl", hash = "sha256:2f99d90c91b7c76b40a862acd9085bc77f7974a27dee7cfcebe46149af5a99a1"}, + {file = "safetensors-0.4.0-cp311-none-win_amd64.whl", hash = "sha256:74e2a448ffe19be188b457b130168190ee73b5a75e45ba96796320c1f5ae35d2"}, + {file = "safetensors-0.4.0-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:1e2f9c69b41d03b4826ffb96b29e07444bb6b34a78a7bafd0b88d59e8ec75b8a"}, + {file = "safetensors-0.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3910fb5bf747413b59f1a34e6d2a993b589fa7d919709518823c70efaaa350bd"}, + {file = "safetensors-0.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf8fdca709b2470a35a59b1e6dffea75cbe1214b22612b5dd4c93947697aea8b"}, + {file = "safetensors-0.4.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2f27b8ef814c5fb43456caeb7f3cbb889b76115180aad1f42402839c14a47c5b"}, + {file = "safetensors-0.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7b2d6101eccc43c7be0cb052f13ceda64288b3d8b344b988ed08d7133cbce2f3"}, + {file = "safetensors-0.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fdc34027b545a69be3d4220c140b276129523e4e46db06ad1a0b60d6a4cf9214"}, + {file = "safetensors-0.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db7bb48ca9e90bb9526c71b388d38d8de160c0354f4c5126df23e8701a870dcb"}, + {file = "safetensors-0.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a78ffc0795d3595cd9e4d453502e35f764276c49e434b25556a15a337db4dafc"}, + {file = "safetensors-0.4.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:8e735b0f79090f6855b55e205e820b7b595502ffca0009a5c13eef3661ce465b"}, + {file = "safetensors-0.4.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f8d2416734e850d5392afffbcb2b8985ea29fb171f1cb197e2ae51b8e35d6438"}, + {file = "safetensors-0.4.0-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:e853e189ba7d47eaf561094586692ba2bbdd258c096f1755805cac098de0e6ab"}, + {file = "safetensors-0.4.0-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:4b2aa57b5a4d576f3d1dd6e56980026340f156f8a13c13016bfac4e25295b53f"}, + {file = "safetensors-0.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b6c1316ffde6cb4bf22c7445bc9fd224b4d1b9dd7320695f5611c89e802e4b6"}, + {file = "safetensors-0.4.0-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:003077ec85261d00061058fa12e3c1d2055366b02ce8f2938929359ffbaff2b8"}, + {file = "safetensors-0.4.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bd63d83a92f1437a8b0431779320376030ae43ace980bea5686d515de0784100"}, + {file = "safetensors-0.4.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2077801800b4b13301d8d6290c7fb5bd60737320001717153ebc4371776643b5"}, + {file = "safetensors-0.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7abe0e157a49a75aeeccfbc4f3dac38d8f98512d3cdb35c200f8e628dc5773cf"}, + {file = "safetensors-0.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3bfed574f6b1e7e7fe1f17213278875ef6c6e8b1582ab6eda93947db1178cae6"}, + {file = "safetensors-0.4.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:964ef166a286ce3b023d0d0bd0e21d440a1c8028981c8abdb136bc7872ba9b3d"}, + {file = "safetensors-0.4.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:44f84373e42183bd56a13a1f2d8acb1db7fedaeffbd83e79cec861477eee1af4"}, + {file = "safetensors-0.4.0-cp37-none-win32.whl", hash = "sha256:c68132727dd86fb641102e494d445f705efe402f4d5e24b278183a15499ab400"}, + {file = "safetensors-0.4.0-cp37-none-win_amd64.whl", hash = "sha256:1db87155454c168aef118d5657a403aee48a4cb08d8851a981157f07351ea317"}, + {file = "safetensors-0.4.0-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:9e583fa68e5a07cc859c4e13c1ebff12029904aa2e27185cf04a1f57fe9a81c4"}, + {file = "safetensors-0.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:73e7696dcf3f72f99545eb1abe6106ad65ff1f62381d6ce4b34be3272552897a"}, + {file = "safetensors-0.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4936096a57c62e84e200f92620a536be067fc5effe46ecc7f230ebb496ecd579"}, + {file = "safetensors-0.4.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:87b328ee1591adac332543e1f5fc2c2d7f149b745ebb0d58d7850818ff9cee27"}, + {file = "safetensors-0.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b69554c143336256260eceff1d3c0969172a641b54d4668489a711b05f92a2c0"}, + {file = "safetensors-0.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ebf6bcece5d5d1bd6416472f94604d2c834ca752ac60ed42dba7157e595a990"}, + {file = "safetensors-0.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6686ce01b8602d55a7d9903c90d4a6e6f90aeb6ddced7cf4605892d0ba94bcb8"}, + {file = "safetensors-0.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9b8fd6cc2f3bda444a048b541c843c7b7fefc89c4120d7898ea7d5b026e93891"}, + {file = "safetensors-0.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8a6abfe67692f81b8bdb99c837f28351c17e624ebf136970c850ee989c720446"}, + {file = "safetensors-0.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:27a24ca8822c469ee452db4c13418ba983315a0d863c018a9af15f2305eac38c"}, + {file = "safetensors-0.4.0-cp38-none-win32.whl", hash = "sha256:c4a0a47c8640167792d8261ee21b26430bbc39130a7edaad7f4c0bc05669d00e"}, + {file = "safetensors-0.4.0-cp38-none-win_amd64.whl", hash = "sha256:a738970a367f39249e2abb900d9441a8a86d7ff50083e5eaa6e7760a9f216014"}, + {file = "safetensors-0.4.0-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:806379f37e1abd5d302288c4b2f4186dd7ea7143d4c7811f90a8077f0ae8967b"}, + {file = "safetensors-0.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2b9b94133ed2ae9dda0e95dcace7b7556eba023ffa4c4ae6df8f99377f571d6a"}, + {file = "safetensors-0.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b563a14c43614815a6b524d2e4edeaace50b717f7e7487bb227dd5b68350f5a"}, + {file = "safetensors-0.4.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:00a9b157be660fb7ba88fa2eedd05ec93793a5b61e43e783e10cb0b995372802"}, + {file = "safetensors-0.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c8f194f45ab6aa767993c24f0aeb950af169dbc5d611b94c9021a1d13b8a1a34"}, + {file = "safetensors-0.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:469360b9451db10bfed3881378d5a71b347ecb1ab4f42367d77b8164a13af70b"}, + {file = "safetensors-0.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5f75fa97ccf32a3c7af476c6a0e851023197d3c078f6de3612008fff94735f9"}, + {file = "safetensors-0.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:acf0180283c2efae72f1d8c0a4a7974662091df01be3aa43b5237b1e52ed0a01"}, + {file = "safetensors-0.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:cd02b495ba0814619f40bda46771bb06dbbf1d42524b66fa03b2a736c77e4515"}, + {file = "safetensors-0.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c42bdea183dbaa99e2f0e6120dc524df79cf4289a6f90f30a534444ef20f49fa"}, + {file = "safetensors-0.4.0-cp39-none-win32.whl", hash = "sha256:cef7bb5d9feae7146c3c3c7b3aef7d2c8b39ba7f5ff4252d368eb69462a47076"}, + {file = "safetensors-0.4.0-cp39-none-win_amd64.whl", hash = "sha256:79dd46fb1f19282fd12f544471efb97823ede927cedbf9cf35550d92b349fdd2"}, + {file = "safetensors-0.4.0-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:002301c1afa32909f83745b0c124d002e7ae07e15671f3b43cbebd0ffc5e6037"}, + {file = "safetensors-0.4.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:67762d36ae088c73d4a3c96bfc4ea8d31233554f35b6cace3a18533238d462ea"}, + {file = "safetensors-0.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f45230f20a206e5e4c7f7bbf9342178410c6f8b0af889843aa99045a76f7691"}, + {file = "safetensors-0.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f2ca939bbd8fb2f4dfa28e39a146dad03bc9325e9fc831b68f7b98f69a5a2f1"}, + {file = "safetensors-0.4.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:61a00f281391fae5ce91df70918bb61c12d2d514a493fd8056e12114be729911"}, + {file = "safetensors-0.4.0-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:435fd136a42492b280cb55126f9ce9535b35dd49df2c5d572a5945455a439448"}, + {file = "safetensors-0.4.0-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f0daa788273d683258fb1e4a5e16bef4486b2fca536451a2591bc0f4a6488895"}, + {file = "safetensors-0.4.0-pp37-pypy37_pp73-macosx_10_7_x86_64.whl", hash = "sha256:0620ab0d41e390ccb1c4ea8f63dc00cb5f0b96a5cdd3cd0d64c21765720c074a"}, + {file = "safetensors-0.4.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc1fa8d067733cb67f22926689ee808f08afacf7700d2ffb44efae90a0693eb1"}, + {file = "safetensors-0.4.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcaa40bc363edda145db75cd030f3b1822e5478d550c3500a42502ecef32c959"}, + {file = "safetensors-0.4.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b561fbc044db7beff2ece0ec219a291809d45a38d30c6b38e7cc46482582f4ba"}, + {file = "safetensors-0.4.0-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:79a983b09782dacf9a1adb19bb98f4a8f6c3144108939f572c047b5797e43cf5"}, + {file = "safetensors-0.4.0-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:10b65cd3ad79f5d0daf281523b4146bc271a34bb7430d4e03212e0de8622dab8"}, + {file = "safetensors-0.4.0-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:114decacc475a6a9e2f9102a00c171d113ddb5d35cb0bda0db2c0c82b2eaa9ce"}, + {file = "safetensors-0.4.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:72ddb741dd5fe42521db76a70e012f76995516a12e7e0ef26be03ea9be77802a"}, + {file = "safetensors-0.4.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c5556c2ec75f5a6134866eddd7341cb36062e6edaea343478a279591b63ddba"}, + {file = "safetensors-0.4.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed50f239b0ce7ae85b078395593b4a351ede7e6f73af25f4873e3392336f64c9"}, + {file = "safetensors-0.4.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:495dcaea8fbab70b927d2274e2547824462737acbf98ccd851a71124f779a5c6"}, + {file = "safetensors-0.4.0-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:3f4d90c79a65ba2fe2ff0876f6140748f0a3ce6a21e27a35190f4f96321803f8"}, + {file = "safetensors-0.4.0-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:7a524382b5c55b5fbb168e0e9d3f502450c8cf3fb81b93e880018437c206a482"}, + {file = "safetensors-0.4.0-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:9849ea60c7e840bfdd6030ad454d4a6ba837b3398c902f15a30460dd6961c28c"}, + {file = "safetensors-0.4.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:6c42623ae7045615d9eaa6877b9df1db4e9cc71ecc14bcc721ea1e475dddd595"}, + {file = "safetensors-0.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80cb8342f00f3c41b3b93b1a599b84723280d3ac90829bc62262efc03ab28793"}, + {file = "safetensors-0.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8c4f5ed4ede384dea8c99bae76b0718a828dbf7b2c8ced1f44e3b9b1a124475"}, + {file = "safetensors-0.4.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:40d7cf03493bfe75ef62e2c716314474b28d9ba5bf4909763e4b8dd14330c01a"}, + {file = "safetensors-0.4.0-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:232029f0a9fa6fa1f737324eda98a700409811186888536a2333cbbf64e41741"}, + {file = "safetensors-0.4.0-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:9ed55f4a20c78ff3e8477efb63c8303c2152cdfb3bfea4d025a80f54d38fd628"}, + {file = "safetensors-0.4.0.tar.gz", hash = "sha256:b985953c3cf11e942eac4317ef3db3da713e274109cf7cfb6076d877054f013e"}, ] [package.extras] -all = ["black (==22.3)", "click (==8.0.4)", "flake8 (>=3.8.3)", "flax (>=0.6.3)", "h5py (>=3.7.0)", "huggingface-hub (>=0.12.1)", "isort (>=5.5.4)", "jax (>=0.3.25)", "jaxlib (>=0.3.25)", "numpy (>=1.21.6)", "paddlepaddle (>=2.4.1)", "pytest (>=7.2.0)", "pytest-benchmark (>=4.0.0)", "setuptools-rust (>=1.5.2)", "tensorflow (==2.11.0)", "torch (>=1.10)"] -dev = ["black (==22.3)", "click (==8.0.4)", "flake8 (>=3.8.3)", "flax (>=0.6.3)", "h5py (>=3.7.0)", "huggingface-hub (>=0.12.1)", "isort (>=5.5.4)", "jax (>=0.3.25)", "jaxlib (>=0.3.25)", "numpy (>=1.21.6)", "paddlepaddle (>=2.4.1)", "pytest (>=7.2.0)", "pytest-benchmark (>=4.0.0)", "setuptools-rust (>=1.5.2)", "tensorflow (==2.11.0)", "torch (>=1.10)"] -jax = ["flax (>=0.6.3)", "jax (>=0.3.25)", "jaxlib (>=0.3.25)", "numpy (>=1.21.6)"] +all = ["safetensors[jax]", "safetensors[numpy]", "safetensors[paddlepaddle]", "safetensors[pinned-tf]", "safetensors[quality]", "safetensors[testing]", "safetensors[torch]"] +dev = ["safetensors[all]"] +jax = ["flax (>=0.6.3)", "jax (>=0.3.25)", "jaxlib (>=0.3.25)", "safetensors[numpy]"] numpy = ["numpy (>=1.21.6)"] -paddlepaddle = ["numpy (>=1.21.6)", "paddlepaddle (>=2.4.1)"] -pinned-tf = ["tensorflow (==2.11.0)"] +paddlepaddle = ["paddlepaddle (>=2.4.1)", "safetensors[numpy]"] +pinned-tf = ["safetensors[numpy]", "tensorflow (==2.11.0)"] quality = ["black (==22.3)", "click (==8.0.4)", "flake8 (>=3.8.3)", "isort (>=5.5.4)"] -tensorflow = ["numpy (>=1.21.6)", "tensorflow (>=2.11.0)"] -testing = ["h5py (>=3.7.0)", "huggingface-hub (>=0.12.1)", "numpy (>=1.21.6)", "pytest (>=7.2.0)", "pytest-benchmark (>=4.0.0)", "setuptools-rust (>=1.5.2)"] -torch = ["numpy (>=1.21.6)", "torch (>=1.10)"] +tensorflow = ["safetensors[numpy]", "tensorflow (>=2.11.0)"] +testing = ["h5py (>=3.7.0)", "huggingface_hub (>=0.12.1)", "hypothesis (>=6.70.2)", "pytest (>=7.2.0)", "pytest-benchmark (>=4.0.0)", "safetensors[numpy]", "setuptools_rust (>=1.5.2)"] +torch = ["safetensors[numpy]", "torch (>=1.10)"] [[package]] name = "scikit-learn" -version = "1.3.0" +version = "1.3.2" description = "A set of python modules for machine learning and data mining" optional = false python-versions = ">=3.8" files = [ - {file = "scikit-learn-1.3.0.tar.gz", hash = "sha256:8be549886f5eda46436b6e555b0e4873b4f10aa21c07df45c4bc1735afbccd7a"}, - {file = "scikit_learn-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:981287869e576d42c682cf7ca96af0c6ac544ed9316328fd0d9292795c742cf5"}, - {file = "scikit_learn-1.3.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:436aaaae2c916ad16631142488e4c82f4296af2404f480e031d866863425d2a2"}, - {file = "scikit_learn-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7e28d8fa47a0b30ae1bd7a079519dd852764e31708a7804da6cb6f8b36e3630"}, - {file = "scikit_learn-1.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae80c08834a473d08a204d966982a62e11c976228d306a2648c575e3ead12111"}, - {file = "scikit_learn-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:552fd1b6ee22900cf1780d7386a554bb96949e9a359999177cf30211e6b20df6"}, - {file = "scikit_learn-1.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:79970a6d759eb00a62266a31e2637d07d2d28446fca8079cf9afa7c07b0427f8"}, - {file = "scikit_learn-1.3.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:850a00b559e636b23901aabbe79b73dc604b4e4248ba9e2d6e72f95063765603"}, - {file = "scikit_learn-1.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee04835fb016e8062ee9fe9074aef9b82e430504e420bff51e3e5fffe72750ca"}, - {file = "scikit_learn-1.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d953531f5d9f00c90c34fa3b7d7cfb43ecff4c605dac9e4255a20b114a27369"}, - {file = "scikit_learn-1.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:151ac2bf65ccf363664a689b8beafc9e6aae36263db114b4ca06fbbbf827444a"}, - {file = "scikit_learn-1.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6a885a9edc9c0a341cab27ec4f8a6c58b35f3d449c9d2503a6fd23e06bbd4f6a"}, - {file = "scikit_learn-1.3.0-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:9877af9c6d1b15486e18a94101b742e9d0d2f343d35a634e337411ddb57783f3"}, - {file = "scikit_learn-1.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c470f53cea065ff3d588050955c492793bb50c19a92923490d18fcb637f6383a"}, - {file = "scikit_learn-1.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd6e2d7389542eae01077a1ee0318c4fec20c66c957f45c7aac0c6eb0fe3c612"}, - {file = "scikit_learn-1.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:3a11936adbc379a6061ea32fa03338d4ca7248d86dd507c81e13af428a5bc1db"}, - {file = "scikit_learn-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:998d38fcec96584deee1e79cd127469b3ad6fefd1ea6c2dfc54e8db367eb396b"}, - {file = "scikit_learn-1.3.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:ded35e810438a527e17623ac6deae3b360134345b7c598175ab7741720d7ffa7"}, - {file = "scikit_learn-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e8102d5036e28d08ab47166b48c8d5e5810704daecf3a476a4282d562be9a28"}, - {file = "scikit_learn-1.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7617164951c422747e7c32be4afa15d75ad8044f42e7d70d3e2e0429a50e6718"}, - {file = "scikit_learn-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:1d54fb9e6038284548072df22fd34777e434153f7ffac72c8596f2d6987110dd"}, + {file = "scikit-learn-1.3.2.tar.gz", hash = "sha256:a2f54c76accc15a34bfb9066e6c7a56c1e7235dda5762b990792330b52ccfb05"}, + {file = "scikit_learn-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e326c0eb5cf4d6ba40f93776a20e9a7a69524c4db0757e7ce24ba222471ee8a1"}, + {file = "scikit_learn-1.3.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:535805c2a01ccb40ca4ab7d081d771aea67e535153e35a1fd99418fcedd1648a"}, + {file = "scikit_learn-1.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1215e5e58e9880b554b01187b8c9390bf4dc4692eedeaf542d3273f4785e342c"}, + {file = "scikit_learn-1.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ee107923a623b9f517754ea2f69ea3b62fc898a3641766cb7deb2f2ce450161"}, + {file = "scikit_learn-1.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:35a22e8015048c628ad099da9df5ab3004cdbf81edc75b396fd0cff8699ac58c"}, + {file = "scikit_learn-1.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6fb6bc98f234fda43163ddbe36df8bcde1d13ee176c6dc9b92bb7d3fc842eb66"}, + {file = "scikit_learn-1.3.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:18424efee518a1cde7b0b53a422cde2f6625197de6af36da0b57ec502f126157"}, + {file = "scikit_learn-1.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3271552a5eb16f208a6f7f617b8cc6d1f137b52c8a1ef8edf547db0259b2c9fb"}, + {file = "scikit_learn-1.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc4144a5004a676d5022b798d9e573b05139e77f271253a4703eed295bde0433"}, + {file = "scikit_learn-1.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:67f37d708f042a9b8d59551cf94d30431e01374e00dc2645fa186059c6c5d78b"}, + {file = "scikit_learn-1.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8db94cd8a2e038b37a80a04df8783e09caac77cbe052146432e67800e430c028"}, + {file = "scikit_learn-1.3.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:61a6efd384258789aa89415a410dcdb39a50e19d3d8410bd29be365bcdd512d5"}, + {file = "scikit_learn-1.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb06f8dce3f5ddc5dee1715a9b9f19f20d295bed8e3cd4fa51e1d050347de525"}, + {file = "scikit_learn-1.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b2de18d86f630d68fe1f87af690d451388bb186480afc719e5f770590c2ef6c"}, + {file = "scikit_learn-1.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:0402638c9a7c219ee52c94cbebc8fcb5eb9fe9c773717965c1f4185588ad3107"}, + {file = "scikit_learn-1.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a19f90f95ba93c1a7f7924906d0576a84da7f3b2282ac3bfb7a08a32801add93"}, + {file = "scikit_learn-1.3.2-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:b8692e395a03a60cd927125eef3a8e3424d86dde9b2370d544f0ea35f78a8073"}, + {file = "scikit_learn-1.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15e1e94cc23d04d39da797ee34236ce2375ddea158b10bee3c343647d615581d"}, + {file = "scikit_learn-1.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:785a2213086b7b1abf037aeadbbd6d67159feb3e30263434139c98425e3dcfcf"}, + {file = "scikit_learn-1.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:64381066f8aa63c2710e6b56edc9f0894cc7bf59bd71b8ce5613a4559b6145e0"}, + {file = "scikit_learn-1.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6c43290337f7a4b969d207e620658372ba3c1ffb611f8bc2b6f031dc5c6d1d03"}, + {file = "scikit_learn-1.3.2-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:dc9002fc200bed597d5d34e90c752b74df516d592db162f756cc52836b38fe0e"}, + {file = "scikit_learn-1.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d08ada33e955c54355d909b9c06a4789a729977f165b8bae6f225ff0a60ec4a"}, + {file = "scikit_learn-1.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:763f0ae4b79b0ff9cca0bf3716bcc9915bdacff3cebea15ec79652d1cc4fa5c9"}, + {file = "scikit_learn-1.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:ed932ea780517b00dae7431e031faae6b49b20eb6950918eb83bd043237950e0"}, ] [package.dependencies] joblib = ">=1.1.1" -numpy = ">=1.17.3" +numpy = ">=1.17.3,<2.0" scipy = ">=1.5.0" threadpoolctl = ">=2.0.0" @@ -3854,41 +3639,45 @@ tests = ["black (>=23.3.0)", "matplotlib (>=3.1.3)", "mypy (>=1.3)", "numpydoc ( [[package]] name = "scipy" -version = "1.9.3" +version = "1.11.3" description = "Fundamental algorithms for scientific computing in Python" optional = false -python-versions = ">=3.8" -files = [ - {file = "scipy-1.9.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1884b66a54887e21addf9c16fb588720a8309a57b2e258ae1c7986d4444d3bc0"}, - {file = "scipy-1.9.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:83b89e9586c62e787f5012e8475fbb12185bafb996a03257e9675cd73d3736dd"}, - {file = "scipy-1.9.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a72d885fa44247f92743fc20732ae55564ff2a519e8302fb7e18717c5355a8b"}, - {file = "scipy-1.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d01e1dd7b15bd2449c8bfc6b7cc67d630700ed655654f0dfcf121600bad205c9"}, - {file = "scipy-1.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:68239b6aa6f9c593da8be1509a05cb7f9efe98b80f43a5861cd24c7557e98523"}, - {file = "scipy-1.9.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b41bc822679ad1c9a5f023bc93f6d0543129ca0f37c1ce294dd9d386f0a21096"}, - {file = "scipy-1.9.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:90453d2b93ea82a9f434e4e1cba043e779ff67b92f7a0e85d05d286a3625df3c"}, - {file = "scipy-1.9.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83c06e62a390a9167da60bedd4575a14c1f58ca9dfde59830fc42e5197283dab"}, - {file = "scipy-1.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abaf921531b5aeaafced90157db505e10345e45038c39e5d9b6c7922d68085cb"}, - {file = "scipy-1.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:06d2e1b4c491dc7d8eacea139a1b0b295f74e1a1a0f704c375028f8320d16e31"}, - {file = "scipy-1.9.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5a04cd7d0d3eff6ea4719371cbc44df31411862b9646db617c99718ff68d4840"}, - {file = "scipy-1.9.3-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:545c83ffb518094d8c9d83cce216c0c32f8c04aaf28b92cc8283eda0685162d5"}, - {file = "scipy-1.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d54222d7a3ba6022fdf5773931b5d7c56efe41ede7f7128c7b1637700409108"}, - {file = "scipy-1.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cff3a5295234037e39500d35316a4c5794739433528310e117b8a9a0c76d20fc"}, - {file = "scipy-1.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:2318bef588acc7a574f5bfdff9c172d0b1bf2c8143d9582e05f878e580a3781e"}, - {file = "scipy-1.9.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d644a64e174c16cb4b2e41dfea6af722053e83d066da7343f333a54dae9bc31c"}, - {file = "scipy-1.9.3-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:da8245491d73ed0a994ed9c2e380fd058ce2fa8a18da204681f2fe1f57f98f95"}, - {file = "scipy-1.9.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4db5b30849606a95dcf519763dd3ab6fe9bd91df49eba517359e450a7d80ce2e"}, - {file = "scipy-1.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c68db6b290cbd4049012990d7fe71a2abd9ffbe82c0056ebe0f01df8be5436b0"}, - {file = "scipy-1.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:5b88e6d91ad9d59478fafe92a7c757d00c59e3bdc3331be8ada76a4f8d683f58"}, - {file = "scipy-1.9.3.tar.gz", hash = "sha256:fbc5c05c85c1a02be77b1ff591087c83bc44579c6d2bd9fb798bb64ea5e1a027"}, +python-versions = "<3.13,>=3.9" +files = [ + {file = "scipy-1.11.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:370f569c57e1d888304052c18e58f4a927338eafdaef78613c685ca2ea0d1fa0"}, + {file = "scipy-1.11.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:9885e3e4f13b2bd44aaf2a1a6390a11add9f48d5295f7a592393ceb8991577a3"}, + {file = "scipy-1.11.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e04aa19acc324a1a076abb4035dabe9b64badb19f76ad9c798bde39d41025cdc"}, + {file = "scipy-1.11.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e1a8a4657673bfae1e05e1e1d6e94b0cabe5ed0c7c144c8aa7b7dbb774ce5c1"}, + {file = "scipy-1.11.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7abda0e62ef00cde826d441485e2e32fe737bdddee3324e35c0e01dee65e2a88"}, + {file = "scipy-1.11.3-cp310-cp310-win_amd64.whl", hash = "sha256:033c3fd95d55012dd1148b201b72ae854d5086d25e7c316ec9850de4fe776929"}, + {file = "scipy-1.11.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:925c6f09d0053b1c0f90b2d92d03b261e889b20d1c9b08a3a51f61afc5f58165"}, + {file = "scipy-1.11.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:5664e364f90be8219283eeb844323ff8cd79d7acbd64e15eb9c46b9bc7f6a42a"}, + {file = "scipy-1.11.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00f325434b6424952fbb636506f0567898dca7b0f7654d48f1c382ea338ce9a3"}, + {file = "scipy-1.11.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f290cf561a4b4edfe8d1001ee4be6da60c1c4ea712985b58bf6bc62badee221"}, + {file = "scipy-1.11.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:91770cb3b1e81ae19463b3c235bf1e0e330767dca9eb4cd73ba3ded6c4151e4d"}, + {file = "scipy-1.11.3-cp311-cp311-win_amd64.whl", hash = "sha256:e1f97cd89c0fe1a0685f8f89d85fa305deb3067d0668151571ba50913e445820"}, + {file = "scipy-1.11.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:dfcc1552add7cb7c13fb70efcb2389d0624d571aaf2c80b04117e2755a0c5d15"}, + {file = "scipy-1.11.3-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:0d3a136ae1ff0883fffbb1b05b0b2fea251cb1046a5077d0b435a1839b3e52b7"}, + {file = "scipy-1.11.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bae66a2d7d5768eaa33008fa5a974389f167183c87bf39160d3fefe6664f8ddc"}, + {file = "scipy-1.11.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2f6dee6cbb0e263b8142ed587bc93e3ed5e777f1f75448d24fb923d9fd4dce6"}, + {file = "scipy-1.11.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:74e89dc5e00201e71dd94f5f382ab1c6a9f3ff806c7d24e4e90928bb1aafb280"}, + {file = "scipy-1.11.3-cp312-cp312-win_amd64.whl", hash = "sha256:90271dbde4be191522b3903fc97334e3956d7cfb9cce3f0718d0ab4fd7d8bfd6"}, + {file = "scipy-1.11.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a63d1ec9cadecce838467ce0631c17c15c7197ae61e49429434ba01d618caa83"}, + {file = "scipy-1.11.3-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:5305792c7110e32ff155aed0df46aa60a60fc6e52cd4ee02cdeb67eaccd5356e"}, + {file = "scipy-1.11.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ea7f579182d83d00fed0e5c11a4aa5ffe01460444219dedc448a36adf0c3917"}, + {file = "scipy-1.11.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c77da50c9a91e23beb63c2a711ef9e9ca9a2060442757dffee34ea41847d8156"}, + {file = "scipy-1.11.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:15f237e890c24aef6891c7d008f9ff7e758c6ef39a2b5df264650eb7900403c0"}, + {file = "scipy-1.11.3-cp39-cp39-win_amd64.whl", hash = "sha256:4b4bb134c7aa457e26cc6ea482b016fef45db71417d55cc6d8f43d799cdf9ef2"}, + {file = "scipy-1.11.3.tar.gz", hash = "sha256:bba4d955f54edd61899776bad459bf7326e14b9fa1c552181f0479cc60a568cd"}, ] [package.dependencies] -numpy = ">=1.18.5,<1.26.0" +numpy = ">=1.21.6,<1.28.0" [package.extras] -dev = ["flake8", "mypy", "pycodestyle", "typing_extensions"] -doc = ["matplotlib (>2)", "numpydoc", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-panels (>=0.5.2)", "sphinx-tabs"] -test = ["asv", "gmpy2", "mpmath", "pytest", "pytest-cov", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] +dev = ["click", "cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy", "pycodestyle", "pydevtool", "rich-click", "ruff", "types-psutil", "typing_extensions"] +doc = ["jupytext", "matplotlib (>2)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] +test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] [[package]] name = "send2trash" @@ -3908,13 +3697,13 @@ win32 = ["pywin32"] [[package]] name = "sentry-sdk" -version = "1.31.0" +version = "1.35.0" description = "Python client for Sentry (https://sentry.io)" optional = false python-versions = "*" files = [ - {file = "sentry-sdk-1.31.0.tar.gz", hash = "sha256:6de2e88304873484207fed836388e422aeff000609b104c802749fd89d56ba5b"}, - {file = "sentry_sdk-1.31.0-py2.py3-none-any.whl", hash = "sha256:64a7141005fb775b9db298a30de93e3b83e0ddd1232dc6f36eb38aebc1553291"}, + {file = "sentry-sdk-1.35.0.tar.gz", hash = "sha256:04e392db9a0d59bd49a51b9e3a92410ac5867556820465057c2ef89a38e953e9"}, + {file = "sentry_sdk-1.35.0-py2.py3-none-any.whl", hash = "sha256:a7865952701e46d38b41315c16c075367675c48d049b90a4cc2e41991ebc7efa"}, ] [package.dependencies] @@ -3953,83 +3742,99 @@ tornado = ["tornado (>=5)"] [[package]] name = "setproctitle" -version = "1.3.2" +version = "1.3.3" description = "A Python module to customize the process title" optional = false python-versions = ">=3.7" files = [ - {file = "setproctitle-1.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:288943dec88e178bb2fd868adf491197cc0fc8b6810416b1c6775e686bab87fe"}, - {file = "setproctitle-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:630f6fe5e24a619ccf970c78e084319ee8be5be253ecc9b5b216b0f474f5ef18"}, - {file = "setproctitle-1.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c877691b90026670e5a70adfbcc735460a9f4c274d35ec5e8a43ce3f8443005"}, - {file = "setproctitle-1.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7a55fe05f15c10e8c705038777656fe45e3bd676d49ad9ac8370b75c66dd7cd7"}, - {file = "setproctitle-1.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ab45146c71ca6592c9cc8b354a2cc9cc4843c33efcbe1d245d7d37ce9696552d"}, - {file = "setproctitle-1.3.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e00c9d5c541a2713ba0e657e0303bf96ddddc412ef4761676adc35df35d7c246"}, - {file = "setproctitle-1.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:265ecbe2c6eafe82e104f994ddd7c811520acdd0647b73f65c24f51374cf9494"}, - {file = "setproctitle-1.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c2c46200656280a064073447ebd363937562debef329482fd7e570c8d498f806"}, - {file = "setproctitle-1.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:fa2f50678f04fda7a75d0fe5dd02bbdd3b13cbe6ed4cf626e4472a7ccf47ae94"}, - {file = "setproctitle-1.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7f2719a398e1a2c01c2a63bf30377a34d0b6ef61946ab9cf4d550733af8f1ef1"}, - {file = "setproctitle-1.3.2-cp310-cp310-win32.whl", hash = "sha256:e425be62524dc0c593985da794ee73eb8a17abb10fe692ee43bb39e201d7a099"}, - {file = "setproctitle-1.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:e85e50b9c67854f89635a86247412f3ad66b132a4d8534ac017547197c88f27d"}, - {file = "setproctitle-1.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2a97d51c17d438cf5be284775a322d57b7ca9505bb7e118c28b1824ecaf8aeaa"}, - {file = "setproctitle-1.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:587c7d6780109fbd8a627758063d08ab0421377c0853780e5c356873cdf0f077"}, - {file = "setproctitle-1.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d17c8bd073cbf8d141993db45145a70b307385b69171d6b54bcf23e5d644de"}, - {file = "setproctitle-1.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e932089c35a396dc31a5a1fc49889dd559548d14cb2237adae260382a090382e"}, - {file = "setproctitle-1.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e4f8f12258a8739c565292a551c3db62cca4ed4f6b6126664e2381acb4931bf"}, - {file = "setproctitle-1.3.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:570d255fd99c7f14d8f91363c3ea96bd54f8742275796bca67e1414aeca7d8c3"}, - {file = "setproctitle-1.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a8e0881568c5e6beff91ef73c0ec8ac2a9d3ecc9edd6bd83c31ca34f770910c4"}, - {file = "setproctitle-1.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4bba3be4c1fabf170595b71f3af46c6d482fbe7d9e0563999b49999a31876f77"}, - {file = "setproctitle-1.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:37ece938110cab2bb3957e3910af8152ca15f2b6efdf4f2612e3f6b7e5459b80"}, - {file = "setproctitle-1.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:db684d6bbb735a80bcbc3737856385b55d53f8a44ce9b46e9a5682c5133a9bf7"}, - {file = "setproctitle-1.3.2-cp311-cp311-win32.whl", hash = "sha256:ca58cd260ea02759238d994cfae844fc8b1e206c684beb8f38877dcab8451dfc"}, - {file = "setproctitle-1.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:88486e6cce2a18a033013d17b30a594f1c5cb42520c49c19e6ade40b864bb7ff"}, - {file = "setproctitle-1.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:92c626edc66169a1b09e9541b9c0c9f10488447d8a2b1d87c8f0672e771bc927"}, - {file = "setproctitle-1.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:710e16fa3bade3b026907e4a5e841124983620046166f355bbb84be364bf2a02"}, - {file = "setproctitle-1.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f29b75e86260b0ab59adb12661ef9f113d2f93a59951373eb6d68a852b13e83"}, - {file = "setproctitle-1.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c8d9650154afaa86a44ff195b7b10d683c73509d085339d174e394a22cccbb9"}, - {file = "setproctitle-1.3.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0452282258dfcc01697026a8841258dd2057c4438b43914b611bccbcd048f10"}, - {file = "setproctitle-1.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:e49ae693306d7624015f31cb3e82708916759d592c2e5f72a35c8f4cc8aef258"}, - {file = "setproctitle-1.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1ff863a20d1ff6ba2c24e22436a3daa3cd80be1dfb26891aae73f61b54b04aca"}, - {file = "setproctitle-1.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:55ce1e9925ce1765865442ede9dca0ba9bde10593fcd570b1f0fa25d3ec6b31c"}, - {file = "setproctitle-1.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7fe9df7aeb8c64db6c34fc3b13271a363475d77bc157d3f00275a53910cb1989"}, - {file = "setproctitle-1.3.2-cp37-cp37m-win32.whl", hash = "sha256:e5c50e164cd2459bc5137c15288a9ef57160fd5cbf293265ea3c45efe7870865"}, - {file = "setproctitle-1.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:a499fff50387c1520c085a07578a000123f519e5f3eee61dd68e1d301659651f"}, - {file = "setproctitle-1.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5b932c3041aa924163f4aab970c2f0e6b4d9d773f4d50326e0ea1cd69240e5c5"}, - {file = "setproctitle-1.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f4bfc89bd33ebb8e4c0e9846a09b1f5a4a86f5cb7a317e75cc42fee1131b4f4f"}, - {file = "setproctitle-1.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fcd3cf4286a60fdc95451d8d14e0389a6b4f5cebe02c7f2609325eb016535963"}, - {file = "setproctitle-1.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5fb4f769c02f63fac90989711a3fee83919f47ae9afd4758ced5d86596318c65"}, - {file = "setproctitle-1.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5194b4969f82ea842a4f6af2f82cd16ebdc3f1771fb2771796e6add9835c1973"}, - {file = "setproctitle-1.3.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f0cde41857a644b7353a0060b5f94f7ba7cf593ebde5a1094da1be581ac9a31"}, - {file = "setproctitle-1.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9124bedd8006b0e04d4e8a71a0945da9b67e7a4ab88fdad7b1440dc5b6122c42"}, - {file = "setproctitle-1.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c8a09d570b39517de10ee5b718730e171251ce63bbb890c430c725c8c53d4484"}, - {file = "setproctitle-1.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:8ff3c8cb26afaed25e8bca7b9dd0c1e36de71f35a3a0706b5c0d5172587a3827"}, - {file = "setproctitle-1.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:589be87172b238f839e19f146b9ea47c71e413e951ef0dc6db4218ddacf3c202"}, - {file = "setproctitle-1.3.2-cp38-cp38-win32.whl", hash = "sha256:4749a2b0c9ac52f864d13cee94546606f92b981b50e46226f7f830a56a9dc8e1"}, - {file = "setproctitle-1.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:e43f315c68aa61cbdef522a2272c5a5b9b8fd03c301d3167b5e1343ef50c676c"}, - {file = "setproctitle-1.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:de3a540cd1817ede31f530d20e6a4935bbc1b145fd8f8cf393903b1e02f1ae76"}, - {file = "setproctitle-1.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4058564195b975ddc3f0462375c533cce310ccdd41b80ac9aed641c296c3eff4"}, - {file = "setproctitle-1.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c5d5dad7c28bdd1ec4187d818e43796f58a845aa892bb4481587010dc4d362b"}, - {file = "setproctitle-1.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ffc61a388a5834a97953d6444a2888c24a05f2e333f9ed49f977a87bb1ad4761"}, - {file = "setproctitle-1.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fa1a0fbee72b47dc339c87c890d3c03a72ea65c061ade3204f285582f2da30f"}, - {file = "setproctitle-1.3.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe8a988c7220c002c45347430993830666e55bc350179d91fcee0feafe64e1d4"}, - {file = "setproctitle-1.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bae283e85fc084b18ffeb92e061ff7ac5af9e183c9d1345c93e178c3e5069cbe"}, - {file = "setproctitle-1.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:fed18e44711c5af4b681c2b3b18f85e6f0f1b2370a28854c645d636d5305ccd8"}, - {file = "setproctitle-1.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:b34baef93bfb20a8ecb930e395ccd2ae3268050d8cf4fe187de5e2bd806fd796"}, - {file = "setproctitle-1.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7f0bed90a216ef28b9d227d8d73e28a8c9b88c0f48a082d13ab3fa83c581488f"}, - {file = "setproctitle-1.3.2-cp39-cp39-win32.whl", hash = "sha256:4d8938249a7cea45ab7e1e48b77685d0f2bab1ebfa9dde23e94ab97968996a7c"}, - {file = "setproctitle-1.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:a47d97a75fd2d10c37410b180f67a5835cb1d8fdea2648fd7f359d4277f180b9"}, - {file = "setproctitle-1.3.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:dad42e676c5261eb50fdb16bdf3e2771cf8f99a79ef69ba88729aeb3472d8575"}, - {file = "setproctitle-1.3.2-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c91b9bc8985d00239f7dc08a49927a7ca1ca8a6af2c3890feec3ed9665b6f91e"}, - {file = "setproctitle-1.3.2-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8579a43eafd246e285eb3a5b939e7158073d5087aacdd2308f23200eac2458b"}, - {file = "setproctitle-1.3.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:2fbd8187948284293f43533c150cd69a0e4192c83c377da837dbcd29f6b83084"}, - {file = "setproctitle-1.3.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:faec934cfe5fd6ac1151c02e67156c3f526e82f96b24d550b5d51efa4a5527c6"}, - {file = "setproctitle-1.3.2-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1aafc91cbdacc9e5fe712c52077369168e6b6c346f3a9d51bf600b53eae56bb"}, - {file = "setproctitle-1.3.2-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b617f12c9be61e8f4b2857be4a4319754756845dbbbd9c3718f468bbb1e17bcb"}, - {file = "setproctitle-1.3.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:b2c9cb2705fc84cb8798f1ba74194f4c080aaef19d9dae843591c09b97678e98"}, - {file = "setproctitle-1.3.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a149a5f7f2c5a065d4e63cb0d7a4b6d3b66e6e80f12e3f8827c4f63974cbf122"}, - {file = "setproctitle-1.3.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e3ac25bfc4a0f29d2409650c7532d5ddfdbf29f16f8a256fc31c47d0dc05172"}, - {file = "setproctitle-1.3.2-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65d884e22037b23fa25b2baf1a3316602ed5c5971eb3e9d771a38c3a69ce6e13"}, - {file = "setproctitle-1.3.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7aa0aac1711fadffc1d51e9d00a3bea61f68443d6ac0241a224e4d622489d665"}, - {file = "setproctitle-1.3.2.tar.gz", hash = "sha256:b9fb97907c830d260fa0658ed58afd48a86b2b88aac521135c352ff7fd3477fd"}, + {file = "setproctitle-1.3.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:897a73208da48db41e687225f355ce993167079eda1260ba5e13c4e53be7f754"}, + {file = "setproctitle-1.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8c331e91a14ba4076f88c29c777ad6b58639530ed5b24b5564b5ed2fd7a95452"}, + {file = "setproctitle-1.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbbd6c7de0771c84b4aa30e70b409565eb1fc13627a723ca6be774ed6b9d9fa3"}, + {file = "setproctitle-1.3.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c05ac48ef16ee013b8a326c63e4610e2430dbec037ec5c5b58fcced550382b74"}, + {file = "setproctitle-1.3.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1342f4fdb37f89d3e3c1c0a59d6ddbedbde838fff5c51178a7982993d238fe4f"}, + {file = "setproctitle-1.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc74e84fdfa96821580fb5e9c0b0777c1c4779434ce16d3d62a9c4d8c710df39"}, + {file = "setproctitle-1.3.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9617b676b95adb412bb69645d5b077d664b6882bb0d37bfdafbbb1b999568d85"}, + {file = "setproctitle-1.3.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6a249415f5bb88b5e9e8c4db47f609e0bf0e20a75e8d744ea787f3092ba1f2d0"}, + {file = "setproctitle-1.3.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:38da436a0aaace9add67b999eb6abe4b84397edf4a78ec28f264e5b4c9d53cd5"}, + {file = "setproctitle-1.3.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:da0d57edd4c95bf221b2ebbaa061e65b1788f1544977288bdf95831b6e44e44d"}, + {file = "setproctitle-1.3.3-cp310-cp310-win32.whl", hash = "sha256:a1fcac43918b836ace25f69b1dca8c9395253ad8152b625064415b1d2f9be4fb"}, + {file = "setproctitle-1.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:200620c3b15388d7f3f97e0ae26599c0c378fdf07ae9ac5a13616e933cbd2086"}, + {file = "setproctitle-1.3.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:334f7ed39895d692f753a443102dd5fed180c571eb6a48b2a5b7f5b3564908c8"}, + {file = "setproctitle-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:950f6476d56ff7817a8fed4ab207727fc5260af83481b2a4b125f32844df513a"}, + {file = "setproctitle-1.3.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:195c961f54a09eb2acabbfc90c413955cf16c6e2f8caa2adbf2237d1019c7dd8"}, + {file = "setproctitle-1.3.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f05e66746bf9fe6a3397ec246fe481096664a9c97eb3fea6004735a4daf867fd"}, + {file = "setproctitle-1.3.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b5901a31012a40ec913265b64e48c2a4059278d9f4e6be628441482dd13fb8b5"}, + {file = "setproctitle-1.3.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64286f8a995f2cd934082b398fc63fca7d5ffe31f0e27e75b3ca6b4efda4e353"}, + {file = "setproctitle-1.3.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:184239903bbc6b813b1a8fc86394dc6ca7d20e2ebe6f69f716bec301e4b0199d"}, + {file = "setproctitle-1.3.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:664698ae0013f986118064b6676d7dcd28fefd0d7d5a5ae9497cbc10cba48fa5"}, + {file = "setproctitle-1.3.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e5119a211c2e98ff18b9908ba62a3bd0e3fabb02a29277a7232a6fb4b2560aa0"}, + {file = "setproctitle-1.3.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:417de6b2e214e837827067048f61841f5d7fc27926f2e43954567094051aff18"}, + {file = "setproctitle-1.3.3-cp311-cp311-win32.whl", hash = "sha256:6a143b31d758296dc2f440175f6c8e0b5301ced3b0f477b84ca43cdcf7f2f476"}, + {file = "setproctitle-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:a680d62c399fa4b44899094027ec9a1bdaf6f31c650e44183b50d4c4d0ccc085"}, + {file = "setproctitle-1.3.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d4460795a8a7a391e3567b902ec5bdf6c60a47d791c3b1d27080fc203d11c9dc"}, + {file = "setproctitle-1.3.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:bdfd7254745bb737ca1384dee57e6523651892f0ea2a7344490e9caefcc35e64"}, + {file = "setproctitle-1.3.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:477d3da48e216d7fc04bddab67b0dcde633e19f484a146fd2a34bb0e9dbb4a1e"}, + {file = "setproctitle-1.3.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ab2900d111e93aff5df9fddc64cf51ca4ef2c9f98702ce26524f1acc5a786ae7"}, + {file = "setproctitle-1.3.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:088b9efc62d5aa5d6edf6cba1cf0c81f4488b5ce1c0342a8b67ae39d64001120"}, + {file = "setproctitle-1.3.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6d50252377db62d6a0bb82cc898089916457f2db2041e1d03ce7fadd4a07381"}, + {file = "setproctitle-1.3.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:87e668f9561fd3a457ba189edfc9e37709261287b52293c115ae3487a24b92f6"}, + {file = "setproctitle-1.3.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:287490eb90e7a0ddd22e74c89a92cc922389daa95babc833c08cf80c84c4df0a"}, + {file = "setproctitle-1.3.3-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:4fe1c49486109f72d502f8be569972e27f385fe632bd8895f4730df3c87d5ac8"}, + {file = "setproctitle-1.3.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4a6ba2494a6449b1f477bd3e67935c2b7b0274f2f6dcd0f7c6aceae10c6c6ba3"}, + {file = "setproctitle-1.3.3-cp312-cp312-win32.whl", hash = "sha256:2df2b67e4b1d7498632e18c56722851ba4db5d6a0c91aaf0fd395111e51cdcf4"}, + {file = "setproctitle-1.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:f38d48abc121263f3b62943f84cbaede05749047e428409c2c199664feb6abc7"}, + {file = "setproctitle-1.3.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:816330675e3504ae4d9a2185c46b573105d2310c20b19ea2b4596a9460a4f674"}, + {file = "setproctitle-1.3.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68f960bc22d8d8e4ac886d1e2e21ccbd283adcf3c43136161c1ba0fa509088e0"}, + {file = "setproctitle-1.3.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:00e6e7adff74796ef12753ff399491b8827f84f6c77659d71bd0b35870a17d8f"}, + {file = "setproctitle-1.3.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:53bc0d2358507596c22b02db079618451f3bd720755d88e3cccd840bafb4c41c"}, + {file = "setproctitle-1.3.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad6d20f9541f5f6ac63df553b6d7a04f313947f550eab6a61aa758b45f0d5657"}, + {file = "setproctitle-1.3.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c1c84beab776b0becaa368254801e57692ed749d935469ac10e2b9b825dbdd8e"}, + {file = "setproctitle-1.3.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:507e8dc2891021350eaea40a44ddd887c9f006e6b599af8d64a505c0f718f170"}, + {file = "setproctitle-1.3.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b1067647ac7aba0b44b591936118a22847bda3c507b0a42d74272256a7a798e9"}, + {file = "setproctitle-1.3.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2e71f6365744bf53714e8bd2522b3c9c1d83f52ffa6324bd7cbb4da707312cd8"}, + {file = "setproctitle-1.3.3-cp37-cp37m-win32.whl", hash = "sha256:7f1d36a1e15a46e8ede4e953abb104fdbc0845a266ec0e99cc0492a4364f8c44"}, + {file = "setproctitle-1.3.3-cp37-cp37m-win_amd64.whl", hash = "sha256:c9a402881ec269d0cc9c354b149fc29f9ec1a1939a777f1c858cdb09c7a261df"}, + {file = "setproctitle-1.3.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ff814dea1e5c492a4980e3e7d094286077054e7ea116cbeda138819db194b2cd"}, + {file = "setproctitle-1.3.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:accb66d7b3ccb00d5cd11d8c6e07055a4568a24c95cf86109894dcc0c134cc89"}, + {file = "setproctitle-1.3.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:554eae5a5b28f02705b83a230e9d163d645c9a08914c0ad921df363a07cf39b1"}, + {file = "setproctitle-1.3.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a911b26264dbe9e8066c7531c0591cfab27b464459c74385b276fe487ca91c12"}, + {file = "setproctitle-1.3.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2982efe7640c4835f7355fdb4da313ad37fb3b40f5c69069912f8048f77b28c8"}, + {file = "setproctitle-1.3.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df3f4274b80709d8bcab2f9a862973d453b308b97a0b423a501bcd93582852e3"}, + {file = "setproctitle-1.3.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:af2c67ae4c795d1674a8d3ac1988676fa306bcfa1e23fddb5e0bd5f5635309ca"}, + {file = "setproctitle-1.3.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:af4061f67fd7ec01624c5e3c21f6b7af2ef0e6bab7fbb43f209e6506c9ce0092"}, + {file = "setproctitle-1.3.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:37a62cbe16d4c6294e84670b59cf7adcc73faafe6af07f8cb9adaf1f0e775b19"}, + {file = "setproctitle-1.3.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a83ca086fbb017f0d87f240a8f9bbcf0809f3b754ee01cec928fff926542c450"}, + {file = "setproctitle-1.3.3-cp38-cp38-win32.whl", hash = "sha256:059f4ce86f8cc92e5860abfc43a1dceb21137b26a02373618d88f6b4b86ba9b2"}, + {file = "setproctitle-1.3.3-cp38-cp38-win_amd64.whl", hash = "sha256:ab92e51cd4a218208efee4c6d37db7368fdf182f6e7ff148fb295ecddf264287"}, + {file = "setproctitle-1.3.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c7951820b77abe03d88b114b998867c0f99da03859e5ab2623d94690848d3e45"}, + {file = "setproctitle-1.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5bc94cf128676e8fac6503b37763adb378e2b6be1249d207630f83fc325d9b11"}, + {file = "setproctitle-1.3.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f5d9027eeda64d353cf21a3ceb74bb1760bd534526c9214e19f052424b37e42"}, + {file = "setproctitle-1.3.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e4a8104db15d3462e29d9946f26bed817a5b1d7a47eabca2d9dc2b995991503"}, + {file = "setproctitle-1.3.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c32c41ace41f344d317399efff4cffb133e709cec2ef09c99e7a13e9f3b9483c"}, + {file = "setproctitle-1.3.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cbf16381c7bf7f963b58fb4daaa65684e10966ee14d26f5cc90f07049bfd8c1e"}, + {file = "setproctitle-1.3.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e18b7bd0898398cc97ce2dfc83bb192a13a087ef6b2d5a8a36460311cb09e775"}, + {file = "setproctitle-1.3.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:69d565d20efe527bd8a9b92e7f299ae5e73b6c0470f3719bd66f3cd821e0d5bd"}, + {file = "setproctitle-1.3.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:ddedd300cd690a3b06e7eac90ed4452348b1348635777ce23d460d913b5b63c3"}, + {file = "setproctitle-1.3.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:415bfcfd01d1fbf5cbd75004599ef167a533395955305f42220a585f64036081"}, + {file = "setproctitle-1.3.3-cp39-cp39-win32.whl", hash = "sha256:21112fcd2195d48f25760f0eafa7a76510871bbb3b750219310cf88b04456ae3"}, + {file = "setproctitle-1.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:5a740f05d0968a5a17da3d676ce6afefebeeeb5ce137510901bf6306ba8ee002"}, + {file = "setproctitle-1.3.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6b9e62ddb3db4b5205c0321dd69a406d8af9ee1693529d144e86bd43bcb4b6c0"}, + {file = "setproctitle-1.3.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e3b99b338598de0bd6b2643bf8c343cf5ff70db3627af3ca427a5e1a1a90dd9"}, + {file = "setproctitle-1.3.3-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38ae9a02766dad331deb06855fb7a6ca15daea333b3967e214de12cfae8f0ef5"}, + {file = "setproctitle-1.3.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:200ede6fd11233085ba9b764eb055a2a191fb4ffb950c68675ac53c874c22e20"}, + {file = "setproctitle-1.3.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0d3a953c50776751e80fe755a380a64cb14d61e8762bd43041ab3f8cc436092f"}, + {file = "setproctitle-1.3.3-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5e08e232b78ba3ac6bc0d23ce9e2bee8fad2be391b7e2da834fc9a45129eb87"}, + {file = "setproctitle-1.3.3-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1da82c3e11284da4fcbf54957dafbf0655d2389cd3d54e4eaba636faf6d117a"}, + {file = "setproctitle-1.3.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:aeaa71fb9568ebe9b911ddb490c644fbd2006e8c940f21cb9a1e9425bd709574"}, + {file = "setproctitle-1.3.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:59335d000c6250c35989394661eb6287187854e94ac79ea22315469ee4f4c244"}, + {file = "setproctitle-1.3.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3ba57029c9c50ecaf0c92bb127224cc2ea9fda057b5d99d3f348c9ec2855ad3"}, + {file = "setproctitle-1.3.3-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d876d355c53d975c2ef9c4f2487c8f83dad6aeaaee1b6571453cb0ee992f55f6"}, + {file = "setproctitle-1.3.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:224602f0939e6fb9d5dd881be1229d485f3257b540f8a900d4271a2c2aa4e5f4"}, + {file = "setproctitle-1.3.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d7f27e0268af2d7503386e0e6be87fb9b6657afd96f5726b733837121146750d"}, + {file = "setproctitle-1.3.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f5e7266498cd31a4572378c61920af9f6b4676a73c299fce8ba93afd694f8ae7"}, + {file = "setproctitle-1.3.3-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33c5609ad51cd99d388e55651b19148ea99727516132fb44680e1f28dd0d1de9"}, + {file = "setproctitle-1.3.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:eae8988e78192fd1a3245a6f4f382390b61bce6cfcc93f3809726e4c885fa68d"}, + {file = "setproctitle-1.3.3.tar.gz", hash = "sha256:c913e151e7ea01567837ff037a23ca8740192880198b7fbb90b16d181607caae"}, ] [package.extras] @@ -4064,13 +3869,13 @@ files = [ [[package]] name = "smmap" -version = "5.0.0" +version = "5.0.1" description = "A pure Python implementation of a sliding window memory map manager" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"}, - {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"}, + {file = "smmap-5.0.1-py3-none-any.whl", hash = "sha256:e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da"}, + {file = "smmap-5.0.1.tar.gz", hash = "sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62"}, ] [[package]] @@ -4097,39 +3902,45 @@ files = [ [[package]] name = "srsly" -version = "2.4.7" +version = "2.4.8" description = "Modern high-performance serialization utilities for Python" optional = false python-versions = ">=3.6" files = [ - {file = "srsly-2.4.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:38506074cfac43f5581b6b22c335dc4d43ef9a82cbe9fe2557452e149d4540f5"}, - {file = "srsly-2.4.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:efd401ac0b239f3c7c0070fcd613f10a4a01478ff5fe7fc8527ea7a23dfa3709"}, - {file = "srsly-2.4.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd1be19502fda87108c8055bce6537ec332266057f595133623a4a18e56a91a1"}, - {file = "srsly-2.4.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87e86be5fd655ed554e4bf6b63a4eb3380ffb40752d0621323a3df879d3e6407"}, - {file = "srsly-2.4.7-cp310-cp310-win_amd64.whl", hash = "sha256:7be5def9b6ac7896ce326997498b8155b9167ddc672fb209a200090c7fe45a4b"}, - {file = "srsly-2.4.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bb3d54563e33816d33695b58f9daaea410fcd0b9272aba27050410a5279ba8d8"}, - {file = "srsly-2.4.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2848735a9fcb0ad9ec23a6986466de7942280a01dbcb7b66583288f1378afba1"}, - {file = "srsly-2.4.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:282d59a37c271603dd790ab25fa6521c3d3fdbca67bef3ee838fd664c773ea0d"}, - {file = "srsly-2.4.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7affecb281db0683fe78181d644f6d6a061948fa318884c5669a064b97869f54"}, - {file = "srsly-2.4.7-cp311-cp311-win_amd64.whl", hash = "sha256:76d991167dc83f8684fb366a092a03f51f7582741885ba42444ab577e61ae198"}, - {file = "srsly-2.4.7-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7a7278470bbad3831c9d8abd7f7b9fa9a3d6cd29f797f913f7a04ade5668715"}, - {file = "srsly-2.4.7-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:654496a07fcf11ba823e9a16f263001271f04d8b1bfd8d94ba6130a1649fc6d8"}, - {file = "srsly-2.4.7-cp36-cp36m-win_amd64.whl", hash = "sha256:89e35ead948349b2a8d47600544dbf49ff737d15a899bc5a71928220daee2807"}, - {file = "srsly-2.4.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3e0f0410faf9d5dc5c58caf907a4b0b94e6dc766289e329a15ddf8adca264d1c"}, - {file = "srsly-2.4.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c3422ab7ed37438086a178e611be85b7001e0071882655fcb8dca83c4f5f57d"}, - {file = "srsly-2.4.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a81186f9c1beb0892fcef4fd6350e6ee0d2d700da5042e400ec6da65a0b52fb"}, - {file = "srsly-2.4.7-cp37-cp37m-win_amd64.whl", hash = "sha256:1fe4a9bf004174f0b73b3fc3a96d35811c218e0441f4246ac4cb3f06daf0ca12"}, - {file = "srsly-2.4.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:86501eb25c6615d934bde0aea98d705ce7edd11d070536162bd2fa8606034f0f"}, - {file = "srsly-2.4.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f46bc563a7b80f81aed8dd12f86ef43b93852d937666f44a3d04bcdaa630376c"}, - {file = "srsly-2.4.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e60cd20f08b8a0e200017c6e8f5af51321878b17bf7da284dd81c7604825c6e"}, - {file = "srsly-2.4.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c90953a58dfde2eeaea15749c7dddad2a508b48b17d084b491d56d5213ef2a37"}, - {file = "srsly-2.4.7-cp38-cp38-win_amd64.whl", hash = "sha256:7c9a1dc7077b4a101fd018c1c567ec735203887e016a813588557f5c4ce2de8b"}, - {file = "srsly-2.4.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c8ada26613f49f72baa573dbd7e911f3af88b647c3559cb6641c97ca8dd7cfe0"}, - {file = "srsly-2.4.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:267f6ac1b8388a4649a6e6299114ff2f6af03bafd60fc8f267e890a9becf7057"}, - {file = "srsly-2.4.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:75f2777cc44ad34c5f2239d44c8cd56b0263bf19bc6c1593dcc765e2a21fc5e7"}, - {file = "srsly-2.4.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2059d447cfe5bf6692634cbfbbb2d5663f554023b0aa0ee3d348387d9ec9345a"}, - {file = "srsly-2.4.7-cp39-cp39-win_amd64.whl", hash = "sha256:422e44d702da4420c47012d309fc56b5081ca06a500393d83114eb09d71bf1ce"}, - {file = "srsly-2.4.7.tar.gz", hash = "sha256:93c2cc4588778261ccb23dd0543b24ded81015dd8ab4ec137cd7d04965035d08"}, + {file = "srsly-2.4.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:17f3bcb418bb4cf443ed3d4dcb210e491bd9c1b7b0185e6ab10b6af3271e63b2"}, + {file = "srsly-2.4.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0b070a58e21ab0e878fd949f932385abb4c53dd0acb6d3a7ee75d95d447bc609"}, + {file = "srsly-2.4.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98286d20014ed2067ad02b0be1e17c7e522255b188346e79ff266af51a54eb33"}, + {file = "srsly-2.4.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18685084e2e0cc47c25158cbbf3e44690e494ef77d6418c2aae0598c893f35b0"}, + {file = "srsly-2.4.8-cp310-cp310-win_amd64.whl", hash = "sha256:980a179cbf4eb5bc56f7507e53f76720d031bcf0cef52cd53c815720eb2fc30c"}, + {file = "srsly-2.4.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5472ed9f581e10c32e79424c996cf54c46c42237759f4224806a0cd4bb770993"}, + {file = "srsly-2.4.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:50f10afe9230072c5aad9f6636115ea99b32c102f4c61e8236d8642c73ec7a13"}, + {file = "srsly-2.4.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c994a89ba247a4d4f63ef9fdefb93aa3e1f98740e4800d5351ebd56992ac75e3"}, + {file = "srsly-2.4.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ace7ed4a0c20fa54d90032be32f9c656b6d75445168da78d14fe9080a0c208ad"}, + {file = "srsly-2.4.8-cp311-cp311-win_amd64.whl", hash = "sha256:7a919236a090fb93081fbd1cec030f675910f3863825b34a9afbcae71f643127"}, + {file = "srsly-2.4.8-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7583c03d114b4478b7a357a1915305163e9eac2dfe080da900555c975cca2a11"}, + {file = "srsly-2.4.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:94ccdd2f6db824c31266aaf93e0f31c1c43b8bc531cd2b3a1d924e3c26a4f294"}, + {file = "srsly-2.4.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db72d2974f91aee652d606c7def98744ca6b899bd7dd3009fd75ebe0b5a51034"}, + {file = "srsly-2.4.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a60c905fd2c15e848ce1fc315fd34d8a9cc72c1dee022a0d8f4c62991131307"}, + {file = "srsly-2.4.8-cp312-cp312-win_amd64.whl", hash = "sha256:e0b8d5722057000694edf105b8f492e7eb2f3aa6247a5f0c9170d1e0d074151c"}, + {file = "srsly-2.4.8-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:196b4261f9d6372d1d3d16d1216b90c7e370b4141471322777b7b3c39afd1210"}, + {file = "srsly-2.4.8-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4750017e6d78590b02b12653e97edd25aefa4734281386cc27501d59b7481e4e"}, + {file = "srsly-2.4.8-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa034cd582ba9e4a120c8f19efa263fcad0f10fc481e73fb8c0d603085f941c4"}, + {file = "srsly-2.4.8-cp36-cp36m-win_amd64.whl", hash = "sha256:5a78ab9e9d177ee8731e950feb48c57380036d462b49e3fb61a67ce529ff5f60"}, + {file = "srsly-2.4.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:087e36439af517e259843df93eb34bb9e2d2881c34fa0f541589bcfbc757be97"}, + {file = "srsly-2.4.8-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad141d8a130cb085a0ed3a6638b643e2b591cb98a4591996780597a632acfe20"}, + {file = "srsly-2.4.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24d05367b2571c0d08d00459636b951e3ca2a1e9216318c157331f09c33489d3"}, + {file = "srsly-2.4.8-cp37-cp37m-win_amd64.whl", hash = "sha256:3fd661a1c4848deea2849b78f432a70c75d10968e902ca83c07c89c9b7050ab8"}, + {file = "srsly-2.4.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ec37233fe39af97b00bf20dc2ceda04d39b9ea19ce0ee605e16ece9785e11f65"}, + {file = "srsly-2.4.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d2fd4bc081f1d6a6063396b6d97b00d98e86d9d3a3ac2949dba574a84e148080"}, + {file = "srsly-2.4.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7347cff1eb4ef3fc335d9d4acc89588051b2df43799e5d944696ef43da79c873"}, + {file = "srsly-2.4.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a9dc1da5cc94d77056b91ba38365c72ae08556b6345bef06257c7e9eccabafe"}, + {file = "srsly-2.4.8-cp38-cp38-win_amd64.whl", hash = "sha256:dc0bf7b6f23c9ecb49ec0924dc645620276b41e160e9b283ed44ca004c060d79"}, + {file = "srsly-2.4.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ff8df21d00d73c371bead542cefef365ee87ca3a5660de292444021ff84e3b8c"}, + {file = "srsly-2.4.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0ac3e340e65a9fe265105705586aa56054dc3902789fcb9a8f860a218d6c0a00"}, + {file = "srsly-2.4.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06d1733f4275eff4448e96521cc7dcd8fdabd68ba9b54ca012dcfa2690db2644"}, + {file = "srsly-2.4.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be5b751ad88fdb58fb73871d456248c88204f213aaa3c9aab49b6a1802b3fa8d"}, + {file = "srsly-2.4.8-cp39-cp39-win_amd64.whl", hash = "sha256:822a38b8cf112348f3accbc73274a94b7bf82515cb14a85ba586d126a5a72851"}, + {file = "srsly-2.4.8.tar.gz", hash = "sha256:b24d95a65009c2447e0b49cda043ac53fecf4f09e358d87a57446458f91b8a91"}, ] [package.dependencies] @@ -4137,13 +3948,13 @@ catalogue = ">=2.0.3,<2.1.0" [[package]] name = "stack-data" -version = "0.6.2" +version = "0.6.3" description = "Extract data from python stack frames and tracebacks for informative displays" optional = false python-versions = "*" files = [ - {file = "stack_data-0.6.2-py3-none-any.whl", hash = "sha256:cbb2a53eb64e5785878201a97ed7c7b94883f48b87bfb0bbe8b623c74679e4a8"}, - {file = "stack_data-0.6.2.tar.gz", hash = "sha256:32d2dd0376772d01b6cb9fc996f3c8b57a357089dec328ed4b6553d037eaf815"}, + {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, + {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, ] [package.dependencies] @@ -4154,42 +3965,6 @@ pure-eval = "*" [package.extras] tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] -[[package]] -name = "starlette" -version = "0.27.0" -description = "The little ASGI library that shines." -optional = false -python-versions = ">=3.7" -files = [ - {file = "starlette-0.27.0-py3-none-any.whl", hash = "sha256:918416370e846586541235ccd38a474c08b80443ed31c578a418e2209b3eef91"}, - {file = "starlette-0.27.0.tar.gz", hash = "sha256:6a6b0d042acb8d469a01eba54e9cda6cbd24ac602c4cd016723117d6a7e73b75"}, -] - -[package.dependencies] -anyio = ">=3.4.0,<5" -typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} - -[package.extras] -full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart", "pyyaml"] - -[[package]] -name = "starsessions" -version = "1.3.0" -description = "Pluggable session support for Starlette." -optional = false -python-versions = ">=3.6.2,<4.0.0" -files = [ - {file = "starsessions-1.3.0-py3-none-any.whl", hash = "sha256:c0758f2a1a2438ec7ba88b232e82008f2261a75584f01179c787b3636fae6040"}, - {file = "starsessions-1.3.0.tar.gz", hash = "sha256:8d3b509d4e6d235655f7dd495fcf0afc1bd86da84de3a8d434e6f82137ebcde8"}, -] - -[package.dependencies] -itsdangerous = ">=2.0.1,<3.0.0" -starlette = ">=0,<1" - -[package.extras] -redis = ["aioredis (>=2.0.0,<3.0.0)"] - [[package]] name = "sympy" version = "1.12" @@ -4238,38 +4013,38 @@ testing = ["flake8", "mypy", "nbsphinx", "pylint", "pytest", "pytest-cov", "seab [[package]] name = "tensorboard" -version = "2.14.0" +version = "2.15.1" description = "TensorBoard lets you watch Tensors Flow" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "tensorboard-2.14.0-py3-none-any.whl", hash = "sha256:3667f9745d99280836ad673022362c840f60ed8fefd5a3e30bf071f5a8fd0017"}, + {file = "tensorboard-2.15.1-py3-none-any.whl", hash = "sha256:c46c1d1cf13a458c429868a78b2531d8ff5f682058d69ec0840b0bc7a38f1c0f"}, ] [package.dependencies] absl-py = ">=0.4" google-auth = ">=1.6.3,<3" -google-auth-oauthlib = ">=0.5,<1.1" +google-auth-oauthlib = ">=0.5,<2" grpcio = ">=1.48.2" markdown = ">=2.6.8" numpy = ">=1.12.0" -protobuf = ">=3.19.6" +protobuf = ">=3.19.6,<4.24" requests = ">=2.21.0,<3" setuptools = ">=41.0.0" +six = ">1.9" tensorboard-data-server = ">=0.7.0,<0.8.0" werkzeug = ">=1.0.1" -wheel = ">=0.26" [[package]] name = "tensorboard-data-server" -version = "0.7.1" +version = "0.7.2" description = "Fast data loading for TensorBoard" optional = false python-versions = ">=3.7" files = [ - {file = "tensorboard_data_server-0.7.1-py3-none-any.whl", hash = "sha256:9938bd39f5041797b33921066fba0eab03a0dd10d1887a05e62ae58841ad4c3f"}, - {file = "tensorboard_data_server-0.7.1-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:be8d016a1aa394e6198280d4a3dc37898f56467310c5f5e617cac10a783e055a"}, - {file = "tensorboard_data_server-0.7.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:255c02b7f5b03dd5c0a88c928e563441ff39e1d4b4a234cdbe09f016e53d9594"}, + {file = "tensorboard_data_server-0.7.2-py3-none-any.whl", hash = "sha256:7e0610d205889588983836ec05dc098e80f97b7e7bbff7e994ebb78f578d0ddb"}, + {file = "tensorboard_data_server-0.7.2-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:9fe5d24221b29625dbc7328b0436ca7fc1c23de4acf4d272f1180856e32f9f60"}, + {file = "tensorboard_data_server-0.7.2-py3-none-manylinux_2_31_x86_64.whl", hash = "sha256:ef687163c24185ae9754ed5650eb5bc4d84ff257aabdc33f0cc6f74d8ba54530"}, ] [[package]] @@ -4288,13 +4063,13 @@ tests = ["pytest", "pytest-cov"] [[package]] name = "terminado" -version = "0.17.1" +version = "0.18.0" description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "terminado-0.17.1-py3-none-any.whl", hash = "sha256:8650d44334eba354dd591129ca3124a6ba42c3d5b70df5051b6921d506fdaeae"}, - {file = "terminado-0.17.1.tar.gz", hash = "sha256:6ccbbcd3a4f8a25a5ec04991f39a0b8db52dfcd487ea0e578d977e6752380333"}, + {file = "terminado-0.18.0-py3-none-any.whl", hash = "sha256:87b0d96642d0fe5f5abd7783857b9cab167f221a39ff98e3b9619a788a3c0f2e"}, + {file = "terminado-0.18.0.tar.gz", hash = "sha256:1ea08a89b835dd1b8c0c900d92848147cef2537243361b2e3f4dc15df9b6fded"}, ] [package.dependencies] @@ -4305,6 +4080,7 @@ tornado = ">=6.1.0" [package.extras] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] test = ["pre-commit", "pytest (>=7.0)", "pytest-timeout"] +typing = ["mypy (>=1.6,<2.0)", "traitlets (>=5.11.1)"] [[package]] name = "threadpoolctl" @@ -4348,56 +4124,117 @@ files = [ [[package]] name = "tokenizers" -version = "0.13.3" -description = "Fast and Customizable Tokenizers" +version = "0.15.0" +description = "" optional = false -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "tokenizers-0.13.3-cp310-cp310-macosx_10_11_x86_64.whl", hash = "sha256:f3835c5be51de8c0a092058a4d4380cb9244fb34681fd0a295fbf0a52a5fdf33"}, - {file = "tokenizers-0.13.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:4ef4c3e821730f2692489e926b184321e887f34fb8a6b80b8096b966ba663d07"}, - {file = "tokenizers-0.13.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5fd1a6a25353e9aa762e2aae5a1e63883cad9f4e997c447ec39d071020459bc"}, - {file = "tokenizers-0.13.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee0b1b311d65beab83d7a41c56a1e46ab732a9eed4460648e8eb0bd69fc2d059"}, - {file = "tokenizers-0.13.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ef4215284df1277dadbcc5e17d4882bda19f770d02348e73523f7e7d8b8d396"}, - {file = "tokenizers-0.13.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4d53976079cff8a033f778fb9adca2d9d69d009c02fa2d71a878b5f3963ed30"}, - {file = "tokenizers-0.13.3-cp310-cp310-win32.whl", hash = "sha256:1f0e3b4c2ea2cd13238ce43548959c118069db7579e5d40ec270ad77da5833ce"}, - {file = "tokenizers-0.13.3-cp310-cp310-win_amd64.whl", hash = "sha256:89649c00d0d7211e8186f7a75dfa1db6996f65edce4b84821817eadcc2d3c79e"}, - {file = "tokenizers-0.13.3-cp311-cp311-macosx_10_11_universal2.whl", hash = "sha256:56b726e0d2bbc9243872b0144515ba684af5b8d8cd112fb83ee1365e26ec74c8"}, - {file = "tokenizers-0.13.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:cc5c022ce692e1f499d745af293ab9ee6f5d92538ed2faf73f9708c89ee59ce6"}, - {file = "tokenizers-0.13.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f55c981ac44ba87c93e847c333e58c12abcbb377a0c2f2ef96e1a266e4184ff2"}, - {file = "tokenizers-0.13.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f247eae99800ef821a91f47c5280e9e9afaeed9980fc444208d5aa6ba69ff148"}, - {file = "tokenizers-0.13.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4b3e3215d048e94f40f1c95802e45dcc37c5b05eb46280fc2ccc8cd351bff839"}, - {file = "tokenizers-0.13.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ba2b0bf01777c9b9bc94b53764d6684554ce98551fec496f71bc5be3a03e98b"}, - {file = "tokenizers-0.13.3-cp311-cp311-win32.whl", hash = "sha256:cc78d77f597d1c458bf0ea7c2a64b6aa06941c7a99cb135b5969b0278824d808"}, - {file = "tokenizers-0.13.3-cp311-cp311-win_amd64.whl", hash = "sha256:ecf182bf59bd541a8876deccf0360f5ae60496fd50b58510048020751cf1724c"}, - {file = "tokenizers-0.13.3-cp37-cp37m-macosx_10_11_x86_64.whl", hash = "sha256:0527dc5436a1f6bf2c0327da3145687d3bcfbeab91fed8458920093de3901b44"}, - {file = "tokenizers-0.13.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07cbb2c307627dc99b44b22ef05ff4473aa7c7cc1fec8f0a8b37d8a64b1a16d2"}, - {file = "tokenizers-0.13.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4560dbdeaae5b7ee0d4e493027e3de6d53c991b5002d7ff95083c99e11dd5ac0"}, - {file = "tokenizers-0.13.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:64064bd0322405c9374305ab9b4c07152a1474370327499911937fd4a76d004b"}, - {file = "tokenizers-0.13.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8c6e2ab0f2e3d939ca66aa1d596602105fe33b505cd2854a4c1717f704c51de"}, - {file = "tokenizers-0.13.3-cp37-cp37m-win32.whl", hash = "sha256:6cc29d410768f960db8677221e497226e545eaaea01aa3613fa0fdf2cc96cff4"}, - {file = "tokenizers-0.13.3-cp37-cp37m-win_amd64.whl", hash = "sha256:fc2a7fdf864554a0dacf09d32e17c0caa9afe72baf9dd7ddedc61973bae352d8"}, - {file = "tokenizers-0.13.3-cp38-cp38-macosx_10_11_x86_64.whl", hash = "sha256:8791dedba834c1fc55e5f1521be325ea3dafb381964be20684b92fdac95d79b7"}, - {file = "tokenizers-0.13.3-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:d607a6a13718aeb20507bdf2b96162ead5145bbbfa26788d6b833f98b31b26e1"}, - {file = "tokenizers-0.13.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3791338f809cd1bf8e4fee6b540b36822434d0c6c6bc47162448deee3f77d425"}, - {file = "tokenizers-0.13.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2f35f30e39e6aab8716f07790f646bdc6e4a853816cc49a95ef2a9016bf9ce6"}, - {file = "tokenizers-0.13.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:310204dfed5aa797128b65d63538a9837cbdd15da2a29a77d67eefa489edda26"}, - {file = "tokenizers-0.13.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0f9b92ea052305166559f38498b3b0cae159caea712646648aaa272f7160963"}, - {file = "tokenizers-0.13.3-cp38-cp38-win32.whl", hash = "sha256:9a3fa134896c3c1f0da6e762d15141fbff30d094067c8f1157b9fdca593b5806"}, - {file = "tokenizers-0.13.3-cp38-cp38-win_amd64.whl", hash = "sha256:8e7b0cdeace87fa9e760e6a605e0ae8fc14b7d72e9fc19c578116f7287bb873d"}, - {file = "tokenizers-0.13.3-cp39-cp39-macosx_10_11_x86_64.whl", hash = "sha256:00cee1e0859d55507e693a48fa4aef07060c4bb6bd93d80120e18fea9371c66d"}, - {file = "tokenizers-0.13.3-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:a23ff602d0797cea1d0506ce69b27523b07e70f6dda982ab8cf82402de839088"}, - {file = "tokenizers-0.13.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70ce07445050b537d2696022dafb115307abdffd2a5c106f029490f84501ef97"}, - {file = "tokenizers-0.13.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:280ffe95f50eaaf655b3a1dc7ff1d9cf4777029dbbc3e63a74e65a056594abc3"}, - {file = "tokenizers-0.13.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:97acfcec592f7e9de8cadcdcda50a7134423ac8455c0166b28c9ff04d227b371"}, - {file = "tokenizers-0.13.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd7730c98a3010cd4f523465867ff95cd9d6430db46676ce79358f65ae39797b"}, - {file = "tokenizers-0.13.3-cp39-cp39-win32.whl", hash = "sha256:48625a108029cb1ddf42e17a81b5a3230ba6888a70c9dc14e81bc319e812652d"}, - {file = "tokenizers-0.13.3-cp39-cp39-win_amd64.whl", hash = "sha256:bc0a6f1ba036e482db6453571c9e3e60ecd5489980ffd95d11dc9f960483d783"}, - {file = "tokenizers-0.13.3.tar.gz", hash = "sha256:2e546dbb68b623008a5442353137fbb0123d311a6d7ba52f2667c8862a75af2e"}, + {file = "tokenizers-0.15.0-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:cd3cd0299aaa312cd2988957598f80becd04d5a07338741eca076057a2b37d6e"}, + {file = "tokenizers-0.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8a922c492c721744ee175f15b91704be2d305569d25f0547c77cd6c9f210f9dc"}, + {file = "tokenizers-0.15.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:331dd786d02fc38698f835fff61c99480f98b73ce75a4c65bd110c9af5e4609a"}, + {file = "tokenizers-0.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88dd0961c437d413ab027f8b115350c121d49902cfbadf08bb8f634b15fa1814"}, + {file = "tokenizers-0.15.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6fdcc55339df7761cd52e1fbe8185d3b3963bc9e3f3545faa6c84f9e8818259a"}, + {file = "tokenizers-0.15.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1480b0051d8ab5408e8e4db2dc832f7082ea24aa0722c427bde2418c6f3bd07"}, + {file = "tokenizers-0.15.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9855e6c258918f9cf62792d4f6ddfa6c56dccd8c8118640f867f6393ecaf8bd7"}, + {file = "tokenizers-0.15.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de9529fe75efcd54ba8d516aa725e1851df9199f0669b665c55e90df08f5af86"}, + {file = "tokenizers-0.15.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8edcc90a36eab0705fe9121d6c77c6e42eeef25c7399864fd57dfb27173060bf"}, + {file = "tokenizers-0.15.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ae17884aafb3e94f34fb7cfedc29054f5f54e142475ebf8a265a4e388fee3f8b"}, + {file = "tokenizers-0.15.0-cp310-none-win32.whl", hash = "sha256:9a3241acdc9b44cff6e95c4a55b9be943ef3658f8edb3686034d353734adba05"}, + {file = "tokenizers-0.15.0-cp310-none-win_amd64.whl", hash = "sha256:4b31807cb393d6ea31926b307911c89a1209d5e27629aa79553d1599c8ffdefe"}, + {file = "tokenizers-0.15.0-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:af7e9be8c05d30bb137b9fd20f9d99354816599e5fd3d58a4b1e28ba3b36171f"}, + {file = "tokenizers-0.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c3d7343fa562ea29661783344a2d83662db0d3d17a6fa6a403cac8e512d2d9fd"}, + {file = "tokenizers-0.15.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:32371008788aeeb0309a9244809a23e4c0259625e6b74a103700f6421373f395"}, + {file = "tokenizers-0.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca9db64c7c9954fbae698884c5bb089764edc549731e5f9b7fa1dd4e4d78d77f"}, + {file = "tokenizers-0.15.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:dbed5944c31195514669cf6381a0d8d47f164943000d10f93d6d02f0d45c25e0"}, + {file = "tokenizers-0.15.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aab16c4a26d351d63e965b0c792f5da7227a37b69a6dc6d922ff70aa595b1b0c"}, + {file = "tokenizers-0.15.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3c2b60b12fdd310bf85ce5d7d3f823456b9b65eed30f5438dd7761879c495983"}, + {file = "tokenizers-0.15.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0344d6602740e44054a9e5bbe9775a5e149c4dddaff15959bb07dcce95a5a859"}, + {file = "tokenizers-0.15.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4525f6997d81d9b6d9140088f4f5131f6627e4c960c2c87d0695ae7304233fc3"}, + {file = "tokenizers-0.15.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:65975094fef8cc68919644936764efd2ce98cf1bacbe8db2687155d2b0625bee"}, + {file = "tokenizers-0.15.0-cp311-none-win32.whl", hash = "sha256:ff5d2159c5d93015f5a4542aac6c315506df31853123aa39042672031768c301"}, + {file = "tokenizers-0.15.0-cp311-none-win_amd64.whl", hash = "sha256:2dd681b53cf615e60a31a115a3fda3980e543d25ca183797f797a6c3600788a3"}, + {file = "tokenizers-0.15.0-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:c9cce6ee149a3d703f86877bc2a6d997e34874b2d5a2d7839e36b2273f31d3d9"}, + {file = "tokenizers-0.15.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a0a94bc3370e6f1cc8a07a8ae867ce13b7c1b4291432a773931a61f256d44ea"}, + {file = "tokenizers-0.15.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:309cfcccfc7e502cb1f1de2c9c1c94680082a65bfd3a912d5a5b2c90c677eb60"}, + {file = "tokenizers-0.15.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8413e994dd7d875ab13009127fc85633916c71213917daf64962bafd488f15dc"}, + {file = "tokenizers-0.15.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d0ebf9430f901dbdc3dcb06b493ff24a3644c9f88c08e6a1d6d0ae2228b9b818"}, + {file = "tokenizers-0.15.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10361e9c7864b22dd791ec5126327f6c9292fb1d23481d4895780688d5e298ac"}, + {file = "tokenizers-0.15.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:babe42635b8a604c594bdc56d205755f73414fce17ba8479d142a963a6c25cbc"}, + {file = "tokenizers-0.15.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3768829861e964c7a4556f5f23307fce6a23872c2ebf030eb9822dbbbf7e9b2a"}, + {file = "tokenizers-0.15.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9c91588a630adc88065e1c03ac6831e3e2112558869b9ebcb2b8afd8a14c944d"}, + {file = "tokenizers-0.15.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:77606994e793ca54ecf3a3619adc8a906a28ca223d9354b38df41cb8766a0ed6"}, + {file = "tokenizers-0.15.0-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:6fe143939f3b596681922b2df12a591a5b010e7dcfbee2202482cd0c1c2f2459"}, + {file = "tokenizers-0.15.0-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:b7bee0f1795e3e3561e9a557061b1539e5255b8221e3f928f58100282407e090"}, + {file = "tokenizers-0.15.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5d37e7f4439b4c46192ab4f2ff38ab815e4420f153caa13dec9272ef14403d34"}, + {file = "tokenizers-0.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:caadf255cf7f951b38d10097836d1f3bcff4aeaaffadfdf748bab780bf5bff95"}, + {file = "tokenizers-0.15.0-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:05accb9162bf711a941b1460b743d62fec61c160daf25e53c5eea52c74d77814"}, + {file = "tokenizers-0.15.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:26a2ef890740127cb115ee5260878f4a677e36a12831795fd7e85887c53b430b"}, + {file = "tokenizers-0.15.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e54c5f26df14913620046b33e822cb3bcd091a332a55230c0e63cc77135e2169"}, + {file = "tokenizers-0.15.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:669b8ed653a578bcff919566631156f5da3aab84c66f3c0b11a6281e8b4731c7"}, + {file = "tokenizers-0.15.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0ea480d943297df26f06f508dab6e012b07f42bf3dffdd36e70799368a5f5229"}, + {file = "tokenizers-0.15.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:bc80a0a565ebfc7cd89de7dd581da8c2b3238addfca6280572d27d763f135f2f"}, + {file = "tokenizers-0.15.0-cp37-none-win32.whl", hash = "sha256:cdd945e678bbdf4517d5d8de66578a5030aeefecdb46f5320b034de9cad8d4dd"}, + {file = "tokenizers-0.15.0-cp37-none-win_amd64.whl", hash = "sha256:1ab96ab7dc706e002c32b2ea211a94c1c04b4f4de48354728c3a6e22401af322"}, + {file = "tokenizers-0.15.0-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:f21c9eb71c9a671e2a42f18b456a3d118e50c7f0fc4dd9fa8f4eb727fea529bf"}, + {file = "tokenizers-0.15.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2a5f4543a35889679fc3052086e69e81880b2a5a28ff2a52c5a604be94b77a3f"}, + {file = "tokenizers-0.15.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f8aa81afec893e952bd39692b2d9ef60575ed8c86fce1fd876a06d2e73e82dca"}, + {file = "tokenizers-0.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1574a5a4af22c3def93fe8fe4adcc90a39bf5797ed01686a4c46d1c3bc677d2f"}, + {file = "tokenizers-0.15.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7c7982fd0ec9e9122d03b209dac48cebfea3de0479335100ef379a9a959b9a5a"}, + {file = "tokenizers-0.15.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8d16b647032df2ce2c1f9097236e046ea9fedd969b25637b9d5d734d78aa53b"}, + {file = "tokenizers-0.15.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b3cdf29e6f9653da330515dc8fa414be5a93aae79e57f8acc50d4028dd843edf"}, + {file = "tokenizers-0.15.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7286f3df10de840867372e3e64b99ef58c677210e3ceb653cd0e740a5c53fe78"}, + {file = "tokenizers-0.15.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aabc83028baa5a36ce7a94e7659250f0309c47fa4a639e5c2c38e6d5ea0de564"}, + {file = "tokenizers-0.15.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:72f78b0e0e276b1fc14a672fa73f3acca034ba8db4e782124a2996734a9ba9cf"}, + {file = "tokenizers-0.15.0-cp38-none-win32.whl", hash = "sha256:9680b0ecc26e7e42f16680c1aa62e924d58d1c2dd992707081cc10a374896ea2"}, + {file = "tokenizers-0.15.0-cp38-none-win_amd64.whl", hash = "sha256:f17cbd88dab695911cbdd385a5a7e3709cc61dff982351f5d1b5939f074a2466"}, + {file = "tokenizers-0.15.0-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:3661862df7382c5eb23ac4fbf7c75e69b02dc4f5784e4c5a734db406b5b24596"}, + {file = "tokenizers-0.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c3045d191dad49647f5a5039738ecf1c77087945c7a295f7bcf051c37067e883"}, + {file = "tokenizers-0.15.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a9fcaad9ab0801f14457d7c820d9f246b5ab590c407fc6b073819b1573097aa7"}, + {file = "tokenizers-0.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a79f17027f24fe9485701c8dbb269b9c713954ec3bdc1e7075a66086c0c0cd3c"}, + {file = "tokenizers-0.15.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:01a3aa332abc4bee7640563949fcfedca4de8f52691b3b70f2fc6ca71bfc0f4e"}, + {file = "tokenizers-0.15.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05b83896a893cdfedad8785250daa3ba9f0504848323471524d4783d7291661e"}, + {file = "tokenizers-0.15.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cbbf2489fcf25d809731ba2744ff278dd07d9eb3f8b7482726bd6cae607073a4"}, + {file = "tokenizers-0.15.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab806ad521a5e9de38078b7add97589c313915f6f5fec6b2f9f289d14d607bd6"}, + {file = "tokenizers-0.15.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4a522612d5c88a41563e3463226af64e2fa00629f65cdcc501d1995dd25d23f5"}, + {file = "tokenizers-0.15.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e58a38c4e6075810bdfb861d9c005236a72a152ebc7005941cc90d1bbf16aca9"}, + {file = "tokenizers-0.15.0-cp39-none-win32.whl", hash = "sha256:b8034f1041fd2bd2b84ff9f4dc4ae2e1c3b71606820a9cd5c562ebd291a396d1"}, + {file = "tokenizers-0.15.0-cp39-none-win_amd64.whl", hash = "sha256:edde9aa964145d528d0e0dbf14f244b8a85ebf276fb76869bc02e2530fa37a96"}, + {file = "tokenizers-0.15.0-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:309445d10d442b7521b98083dc9f0b5df14eca69dbbfebeb98d781ee2cef5d30"}, + {file = "tokenizers-0.15.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d3125a6499226d4d48efc54f7498886b94c418e93a205b673bc59364eecf0804"}, + {file = "tokenizers-0.15.0-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ed56ddf0d54877bb9c6d885177db79b41576e61b5ef6defeb579dcb803c04ad5"}, + {file = "tokenizers-0.15.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b22cd714706cc5b18992a232b023f736e539495f5cc61d2d28d176e55046f6c"}, + {file = "tokenizers-0.15.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fac2719b1e9bc8e8e7f6599b99d0a8e24f33d023eb8ef644c0366a596f0aa926"}, + {file = "tokenizers-0.15.0-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:85ddae17570ec7e5bfaf51ffa78d044f444a8693e1316e1087ee6150596897ee"}, + {file = "tokenizers-0.15.0-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:76f1bed992e396bf6f83e3df97b64ff47885e45e8365f8983afed8556a0bc51f"}, + {file = "tokenizers-0.15.0-pp37-pypy37_pp73-macosx_10_7_x86_64.whl", hash = "sha256:3bb0f4df6dce41a1c7482087b60d18c372ef4463cb99aa8195100fcd41e0fd64"}, + {file = "tokenizers-0.15.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:22c27672c27a059a5f39ff4e49feed8c7f2e1525577c8a7e3978bd428eb5869d"}, + {file = "tokenizers-0.15.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78104f5d035c9991f92831fc0efe9e64a05d4032194f2a69f67aaa05a4d75bbb"}, + {file = "tokenizers-0.15.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a40b73dc19d82c3e3ffb40abdaacca8fbc95eeb26c66b7f9f860aebc07a73998"}, + {file = "tokenizers-0.15.0-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d801d1368188c74552cd779b1286e67cb9fd96f4c57a9f9a2a09b6def9e1ab37"}, + {file = "tokenizers-0.15.0-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:82641ffb13a4da1293fcc9f437d457647e60ed0385a9216cd135953778b3f0a1"}, + {file = "tokenizers-0.15.0-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:160f9d1810f2c18fffa94aa98bf17632f6bd2dabc67fcb01a698ca80c37d52ee"}, + {file = "tokenizers-0.15.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:8d7d6eea831ed435fdeeb9bcd26476226401d7309d115a710c65da4088841948"}, + {file = "tokenizers-0.15.0-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f6456bec6c557d63d8ec0023758c32f589e1889ed03c055702e84ce275488bed"}, + {file = "tokenizers-0.15.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1eef39a502fad3bf104b9e1906b4fb0cee20e44e755e51df9a98f8922c3bf6d4"}, + {file = "tokenizers-0.15.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1e4664c5b797e093c19b794bbecc19d2367e782b4a577d8b7c1821db5dc150d"}, + {file = "tokenizers-0.15.0-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:ca003fb5f3995ff5cf676db6681b8ea5d54d3b30bea36af1120e78ee1a4a4cdf"}, + {file = "tokenizers-0.15.0-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:7f17363141eb0c53752c89e10650b85ef059a52765d0802ba9613dbd2d21d425"}, + {file = "tokenizers-0.15.0-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:8a765db05581c7d7e1280170f2888cda351760d196cc059c37ea96f121125799"}, + {file = "tokenizers-0.15.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:2a0dd641a72604486cd7302dd8f87a12c8a9b45e1755e47d2682733f097c1af5"}, + {file = "tokenizers-0.15.0-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0a1a3c973e4dc97797fc19e9f11546c95278ffc55c4492acb742f69e035490bc"}, + {file = "tokenizers-0.15.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4fab75642aae4e604e729d6f78e0addb9d7e7d49e28c8f4d16b24da278e5263"}, + {file = "tokenizers-0.15.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65f80be77f6327a86d8fd35a4467adcfe6174c159b4ab52a1a8dd4c6f2d7d9e1"}, + {file = "tokenizers-0.15.0-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:a8da7533dbe66b88afd430c56a2f2ce1fd82e2681868f857da38eeb3191d7498"}, + {file = "tokenizers-0.15.0-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:fa8eb4584fc6cbe6a84d7a7864be3ed28e23e9fd2146aa8ef1814d579df91958"}, + {file = "tokenizers-0.15.0.tar.gz", hash = "sha256:10c7e6e7b4cabd757da59e93f5f8d1126291d16f8b54f28510825ef56a3e5d0e"}, ] +[package.dependencies] +huggingface_hub = ">=0.16.4,<1.0" + [package.extras] -dev = ["black (==22.3)", "datasets", "numpy", "pytest", "requests"] -docs = ["setuptools-rust", "sphinx", "sphinx-rtd-theme"] +dev = ["tokenizers[testing]"] +docs = ["setuptools_rust", "sphinx", "sphinx_rtd_theme"] testing = ["black (==22.3)", "datasets", "numpy", "pytest", "requests"] [[package]] @@ -4413,41 +4250,55 @@ files = [ [[package]] name = "torch" -version = "2.0.1" +version = "2.1.1" description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" optional = false python-versions = ">=3.8.0" files = [ - {file = "torch-2.0.1-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:8ced00b3ba471856b993822508f77c98f48a458623596a4c43136158781e306a"}, - {file = "torch-2.0.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:359bfaad94d1cda02ab775dc1cc386d585712329bb47b8741607ef6ef4950747"}, - {file = "torch-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:7c84e44d9002182edd859f3400deaa7410f5ec948a519cc7ef512c2f9b34d2c4"}, - {file = "torch-2.0.1-cp310-none-macosx_10_9_x86_64.whl", hash = "sha256:567f84d657edc5582d716900543e6e62353dbe275e61cdc36eda4929e46df9e7"}, - {file = "torch-2.0.1-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:787b5a78aa7917465e9b96399b883920c88a08f4eb63b5a5d2d1a16e27d2f89b"}, - {file = "torch-2.0.1-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:e617b1d0abaf6ced02dbb9486803abfef0d581609b09641b34fa315c9c40766d"}, - {file = "torch-2.0.1-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:b6019b1de4978e96daa21d6a3ebb41e88a0b474898fe251fd96189587408873e"}, - {file = "torch-2.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:dbd68cbd1cd9da32fe5d294dd3411509b3d841baecb780b38b3b7b06c7754434"}, - {file = "torch-2.0.1-cp311-none-macosx_10_9_x86_64.whl", hash = "sha256:ef654427d91600129864644e35deea761fb1fe131710180b952a6f2e2207075e"}, - {file = "torch-2.0.1-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:25aa43ca80dcdf32f13da04c503ec7afdf8e77e3a0183dd85cd3e53b2842e527"}, - {file = "torch-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:5ef3ea3d25441d3957348f7e99c7824d33798258a2bf5f0f0277cbcadad2e20d"}, - {file = "torch-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:0882243755ff28895e8e6dc6bc26ebcf5aa0911ed81b2a12f241fc4b09075b13"}, - {file = "torch-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:f66aa6b9580a22b04d0af54fcd042f52406a8479e2b6a550e3d9f95963e168c8"}, - {file = "torch-2.0.1-cp38-none-macosx_10_9_x86_64.whl", hash = "sha256:1adb60d369f2650cac8e9a95b1d5758e25d526a34808f7448d0bd599e4ae9072"}, - {file = "torch-2.0.1-cp38-none-macosx_11_0_arm64.whl", hash = "sha256:1bcffc16b89e296826b33b98db5166f990e3b72654a2b90673e817b16c50e32b"}, - {file = "torch-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:e10e1597f2175365285db1b24019eb6f04d53dcd626c735fc502f1e8b6be9875"}, - {file = "torch-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:423e0ae257b756bb45a4b49072046772d1ad0c592265c5080070e0767da4e490"}, - {file = "torch-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:8742bdc62946c93f75ff92da00e3803216c6cce9b132fbca69664ca38cfb3e18"}, - {file = "torch-2.0.1-cp39-none-macosx_10_9_x86_64.whl", hash = "sha256:c62df99352bd6ee5a5a8d1832452110435d178b5164de450831a3a8cc14dc680"}, - {file = "torch-2.0.1-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:671a2565e3f63b8fe8e42ae3e36ad249fe5e567435ea27b94edaa672a7d0c416"}, + {file = "torch-2.1.1-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:5ebc43f5355a9b7be813392b3fb0133991f0380f6f0fcc8218d5468dc45d1071"}, + {file = "torch-2.1.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:84fefd63356416c0cd20578637ccdbb82164993400ed17b57c951dd6376dcee8"}, + {file = "torch-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:0a7a9da0c324409bcb5a7bdad1b4e94e936d21c2590aaa7ac2f63968da8c62f7"}, + {file = "torch-2.1.1-cp310-none-macosx_10_9_x86_64.whl", hash = "sha256:1e1e5faddd43a8f2c0e0e22beacd1e235a2e447794d807483c94a9e31b54a758"}, + {file = "torch-2.1.1-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:e76bf3c5c354874f1da465c852a2fb60ee6cbce306e935337885760f080f9baa"}, + {file = "torch-2.1.1-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:98fea993639b0bb432dfceb7b538f07c0f1c33386d63f635219f49254968c80f"}, + {file = "torch-2.1.1-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:61b51b33c61737c287058b0c3061e6a9d3c363863e4a094f804bc486888a188a"}, + {file = "torch-2.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:1d70920da827e2276bf07f7ec46958621cad18d228c97da8f9c19638474dbd52"}, + {file = "torch-2.1.1-cp311-none-macosx_10_9_x86_64.whl", hash = "sha256:a70593806f1d7e6b53657d96810518da0f88ef2608c98a402955765b8c79d52c"}, + {file = "torch-2.1.1-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:e312f7e82e49565f7667b0bbf9559ab0c597063d93044740781c02acd5a87978"}, + {file = "torch-2.1.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:1e3cbecfa5a7314d828f4a37b0c286714dc9aa2e69beb7a22f7aca76567ed9f4"}, + {file = "torch-2.1.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:9ca0fcbf3d5ba644d6a8572c83a9abbdf5f7ff575bc38529ef6c185a3a71bde9"}, + {file = "torch-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:2dc9f312fc1fa0d61a565a0292ad73119d4b74c9f8b5031b55f8b4722abca079"}, + {file = "torch-2.1.1-cp38-none-macosx_10_9_x86_64.whl", hash = "sha256:d56b032176458e2af4709627bbd2c20fe2917eff8cd087a7fe313acccf5ce2f1"}, + {file = "torch-2.1.1-cp38-none-macosx_11_0_arm64.whl", hash = "sha256:29e3b90a8c281f6660804a939d1f4218604c80162e521e1e6d8c8557325902a0"}, + {file = "torch-2.1.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:bd95cee8511584b67ddc0ba465c3f1edeb5708d833ee02af1206b4486f1d9096"}, + {file = "torch-2.1.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:b31230bd058424e56dba7f899280dbc6ac8b9948e43902e0c84a44666b1ec151"}, + {file = "torch-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:403f1095e665e4f35971b43797a920725b8b205723aa68254a4050c6beca29b6"}, + {file = "torch-2.1.1-cp39-none-macosx_10_9_x86_64.whl", hash = "sha256:715b50d8c1de5da5524a68287eb000f73e026e74d5f6b12bc450ef6995fcf5f9"}, + {file = "torch-2.1.1-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:db67e8725c76f4c7f4f02e7551bb16e81ba1a1912867bc35d7bb96d2be8c78b4"}, ] [package.dependencies] filelock = "*" +fsspec = "*" jinja2 = "*" networkx = "*" +nvidia-cublas-cu12 = {version = "12.1.3.1", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-cupti-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-nvrtc-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-runtime-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cudnn-cu12 = {version = "8.9.2.26", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cufft-cu12 = {version = "11.0.2.54", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-curand-cu12 = {version = "10.3.2.106", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cusolver-cu12 = {version = "11.4.5.107", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cusparse-cu12 = {version = "12.1.0.106", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-nccl-cu12 = {version = "2.18.1", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-nvtx-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} sympy = "*" +triton = {version = "2.1.0", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} typing-extensions = "*" [package.extras] +dynamo = ["jinja2"] opt-einsum = ["opt-einsum (>=3.3)"] [[package]] @@ -4467,13 +4318,13 @@ torch = ">=1.5.0" [[package]] name = "torch-tb-profiler" -version = "0.4.1" +version = "0.4.3" description = "PyTorch Profiler TensorBoard Plugin" optional = false python-versions = ">=3.6.2" files = [ - {file = "torch_tb_profiler-0.4.1-py3-none-any.whl", hash = "sha256:df7428ce5564e8357d0d03c0f246398c448fc8cd91b3075370ca5c25defbc635"}, - {file = "torch_tb_profiler-0.4.1.tar.gz", hash = "sha256:f2c7fb27d420be443ffde50ada655c19f76a245d21e7772de753196fd0967685"}, + {file = "torch_tb_profiler-0.4.3-py3-none-any.whl", hash = "sha256:207a49b05572dd983e4ab29eb5e0fcadd60374a8f93c78ec638217e8d18788dc"}, + {file = "torch_tb_profiler-0.4.3.tar.gz", hash = "sha256:8b8d29b2de960b3c4423087b23cec29beaf9ac3a8c7b046c18fd25b218f726b1"}, ] [package.dependencies] @@ -4483,33 +4334,49 @@ tensorboard = ">=1.15,<2.1.0 || >2.1.0" [package.extras] blob = ["azure-storage-blob"] gs = ["google-cloud-storage"] +hdfs = ["fsspec", "pyarrow"] s3 = ["boto3"] +[[package]] +name = "torchfix" +version = "0.1.1" +description = "" +optional = false +python-versions = "*" +files = [ + {file = "TorchFix-0.1.1-py3-none-any.whl", hash = "sha256:a5e21bed15d971c590737217ae0bc35601f25fd5e5e62b467971ff7f329d38ff"}, + {file = "TorchFix-0.1.1.tar.gz", hash = "sha256:a95ed088bafcacc7ea03cb2b28f1c7c20edb5a649f6146a9f7dd002804c7dda7"}, +] + +[package.dependencies] +flake8 = ">=3.8.2" +libcst = ">=1.0.1,<1.1.0" +PyYAML = "*" + [[package]] name = "torchmetrics" -version = "1.1.2" +version = "1.2.0" description = "PyTorch native Metrics" optional = false python-versions = ">=3.8" files = [ - {file = "torchmetrics-1.1.2-py3-none-any.whl", hash = "sha256:19538ccf2a8556233ffc29ca288bd65a3532c49dc9b66feb8c201198b34f9504"}, - {file = "torchmetrics-1.1.2.tar.gz", hash = "sha256:44b01d3c7ca6aa925ac888adff0b0b7c2b2194ff662cf58eb6e05e0e8eb51b00"}, + {file = "torchmetrics-1.2.0-py3-none-any.whl", hash = "sha256:da2cb18822b285786d082c40efb9e1d861aac425f58230234fe6ce233cf002f8"}, + {file = "torchmetrics-1.2.0.tar.gz", hash = "sha256:7eb28340bde45e13187a9ad54a4a7010a50417815d8181a5df6131f116ffe1b7"}, ] [package.dependencies] lightning-utilities = ">=0.8.0" numpy = ">1.20.0" torch = ">=1.8.1" -typing-extensions = {version = "*", markers = "python_version < \"3.9\""} [package.extras] all = ["SciencePlots (>=2.0.0)", "lpips (<=0.1.4)", "matplotlib (>=3.2.0)", "mypy (==1.5.1)", "nltk (>=3.6)", "piq (<=0.8.0)", "pycocotools (>2.0.0)", "pystoi (>=0.3.0)", "regex (>=2021.9.24)", "scipy (>1.0.0)", "torch-fidelity (<=0.4.0)", "torchaudio (>=0.10.0)", "torchvision (>=0.8)", "tqdm (>=4.41.0)", "transformers (>4.4.0)", "transformers (>=4.10.0)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"] audio = ["pystoi (>=0.3.0)", "torchaudio (>=0.10.0)"] detection = ["pycocotools (>2.0.0)", "torchvision (>=0.8)"] -dev = ["SciencePlots (>=2.0.0)", "bert-score (==0.3.13)", "cloudpickle (>1.3)", "coverage (==7.3.0)", "dython (<=0.7.4)", "fairlearn", "fast-bss-eval (>=0.1.0)", "fire (<=0.5.0)", "huggingface-hub (<0.16)", "jiwer (>=2.3.0)", "kornia (>=0.6.7)", "lpips (<=0.1.4)", "matplotlib (>=3.2.0)", "mir-eval (>=0.6)", "mypy (==1.5.1)", "netcal (>1.0.0)", "nltk (>=3.6)", "numpy (<1.25.0)", "pandas (>1.0.0)", "pandas (>=1.4.0)", "phmdoctest (==1.4.0)", "piq (<=0.8.0)", "psutil (<=5.9.5)", "pycocotools (>2.0.0)", "pystoi (>=0.3.0)", "pytest (==7.4.1)", "pytest-cov (==4.1.0)", "pytest-doctestplus (==1.0.0)", "pytest-rerunfailures (==12.0)", "pytest-timeout (==2.1.0)", "pytorch-msssim (==1.0.0)", "regex (>=2021.9.24)", "requests (<=2.31.0)", "rouge-score (>0.1.0)", "sacrebleu (>=2.0.0)", "scikit-image (>=0.19.0)", "scikit-learn (>=1.1.1)", "scipy (>1.0.0)", "sewar (>=0.4.4)", "statsmodels (>0.13.5)", "torch-complex (<=0.4.3)", "torch-fidelity (<=0.4.0)", "torchaudio (>=0.10.0)", "torchvision (>=0.8)", "tqdm (>=4.41.0)", "transformers (>4.4.0)", "transformers (>=4.10.0)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"] +dev = ["SciencePlots (>=2.0.0)", "bert-score (==0.3.13)", "cloudpickle (>1.3)", "coverage (==7.3.1)", "dython (<=0.7.4)", "fairlearn", "fast-bss-eval (>=0.1.0)", "faster-coco-eval (>=1.3.3)", "fire (<=0.5.0)", "huggingface-hub (<0.18)", "jiwer (>=2.3.0)", "kornia (>=0.6.7)", "lpips (<=0.1.4)", "matplotlib (>=3.2.0)", "mir-eval (>=0.6)", "mypy (==1.5.1)", "netcal (>1.0.0)", "nltk (>=3.6)", "numpy (<1.25.0)", "pandas (>1.0.0)", "pandas (>=1.4.0)", "phmdoctest (==1.4.0)", "piq (<=0.8.0)", "psutil (<=5.9.5)", "pycocotools (>2.0.0)", "pystoi (>=0.3.0)", "pytest (==7.4.2)", "pytest-cov (==4.1.0)", "pytest-doctestplus (==1.0.0)", "pytest-rerunfailures (==12.0)", "pytest-timeout (==2.1.0)", "pytorch-msssim (==1.0.0)", "regex (>=2021.9.24)", "requests (<=2.31.0)", "rouge-score (>0.1.0)", "sacrebleu (>=2.0.0)", "scikit-image (>=0.19.0)", "scikit-learn (>=1.1.1)", "scipy (>1.0.0)", "sewar (>=0.4.4)", "statsmodels (>0.13.5)", "torch-complex (<=0.4.3)", "torch-fidelity (<=0.4.0)", "torchaudio (>=0.10.0)", "torchvision (>=0.8)", "tqdm (>=4.41.0)", "transformers (>4.4.0)", "transformers (>=4.10.0)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"] image = ["lpips (<=0.1.4)", "scipy (>1.0.0)", "torch-fidelity (<=0.4.0)", "torchvision (>=0.8)"] multimodal = ["piq (<=0.8.0)", "transformers (>=4.10.0)"] -test = ["bert-score (==0.3.13)", "cloudpickle (>1.3)", "coverage (==7.3.0)", "dython (<=0.7.4)", "fairlearn", "fast-bss-eval (>=0.1.0)", "fire (<=0.5.0)", "huggingface-hub (<0.16)", "jiwer (>=2.3.0)", "kornia (>=0.6.7)", "mir-eval (>=0.6)", "netcal (>1.0.0)", "numpy (<1.25.0)", "pandas (>1.0.0)", "pandas (>=1.4.0)", "phmdoctest (==1.4.0)", "psutil (<=5.9.5)", "pytest (==7.4.1)", "pytest-cov (==4.1.0)", "pytest-doctestplus (==1.0.0)", "pytest-rerunfailures (==12.0)", "pytest-timeout (==2.1.0)", "pytorch-msssim (==1.0.0)", "requests (<=2.31.0)", "rouge-score (>0.1.0)", "sacrebleu (>=2.0.0)", "scikit-image (>=0.19.0)", "scikit-learn (>=1.1.1)", "scipy (>1.0.0)", "sewar (>=0.4.4)", "statsmodels (>0.13.5)", "torch-complex (<=0.4.3)"] +test = ["bert-score (==0.3.13)", "cloudpickle (>1.3)", "coverage (==7.3.1)", "dython (<=0.7.4)", "fairlearn", "fast-bss-eval (>=0.1.0)", "faster-coco-eval (>=1.3.3)", "fire (<=0.5.0)", "huggingface-hub (<0.18)", "jiwer (>=2.3.0)", "kornia (>=0.6.7)", "mir-eval (>=0.6)", "netcal (>1.0.0)", "numpy (<1.25.0)", "pandas (>1.0.0)", "pandas (>=1.4.0)", "phmdoctest (==1.4.0)", "psutil (<=5.9.5)", "pytest (==7.4.2)", "pytest-cov (==4.1.0)", "pytest-doctestplus (==1.0.0)", "pytest-rerunfailures (==12.0)", "pytest-timeout (==2.1.0)", "pytorch-msssim (==1.0.0)", "requests (<=2.31.0)", "rouge-score (>0.1.0)", "sacrebleu (>=2.0.0)", "scikit-image (>=0.19.0)", "scikit-learn (>=1.1.1)", "scipy (>1.0.0)", "sewar (>=0.4.4)", "statsmodels (>0.13.5)", "torch-complex (<=0.4.3)"] text = ["nltk (>=3.6)", "regex (>=2021.9.24)", "tqdm (>=4.41.0)", "transformers (>4.4.0)"] typing = ["mypy (==1.5.1)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"] visual = ["SciencePlots (>=2.0.0)", "matplotlib (>=3.2.0)"] @@ -4556,56 +4423,55 @@ telegram = ["requests"] [[package]] name = "traitlets" -version = "5.9.0" +version = "5.13.0" description = "Traitlets Python configuration system" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "traitlets-5.9.0-py3-none-any.whl", hash = "sha256:9e6ec080259b9a5940c797d58b613b5e31441c2257b87c2e795c5228ae80d2d8"}, - {file = "traitlets-5.9.0.tar.gz", hash = "sha256:f6cde21a9c68cf756af02035f72d5a723bf607e862e7be33ece505abf4a3bad9"}, + {file = "traitlets-5.13.0-py3-none-any.whl", hash = "sha256:baf991e61542da48fe8aef8b779a9ea0aa38d8a54166ee250d5af5ecf4486619"}, + {file = "traitlets-5.13.0.tar.gz", hash = "sha256:9b232b9430c8f57288c1024b34a8f0251ddcc47268927367a0dd3eeaca40deb5"}, ] [package.extras] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] -test = ["argcomplete (>=2.0)", "pre-commit", "pytest", "pytest-mock"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.6.0)", "pre-commit", "pytest (>=7.0,<7.5)", "pytest-mock", "pytest-mypy-testing"] [[package]] name = "transformers" -version = "4.33.1" +version = "4.35.2" description = "State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow" optional = false python-versions = ">=3.8.0" files = [ - {file = "transformers-4.33.1-py3-none-any.whl", hash = "sha256:0630c2d26448d7c6cb78435e6c43910c89e99387badea6be1f565ffa3f093f1d"}, - {file = "transformers-4.33.1.tar.gz", hash = "sha256:744265e9f0724d22c229938f28376af54abce730ef647f35bd1685abf49912a4"}, + {file = "transformers-4.35.2-py3-none-any.whl", hash = "sha256:9dfa76f8692379544ead84d98f537be01cd1070de75c74efb13abcbc938fbe2f"}, + {file = "transformers-4.35.2.tar.gz", hash = "sha256:2d125e197d77b0cdb6c9201df9fa7e2101493272e448b9fba9341c695bee2f52"}, ] [package.dependencies] filelock = "*" -huggingface-hub = ">=0.15.1,<1.0" +huggingface-hub = ">=0.16.4,<1.0" numpy = ">=1.17" packaging = ">=20.0" pyyaml = ">=5.1" regex = "!=2019.12.17" requests = "*" safetensors = ">=0.3.1" -tokenizers = ">=0.11.1,<0.11.3 || >0.11.3,<0.14" +tokenizers = ">=0.14,<0.19" tqdm = ">=4.27" [package.extras] accelerate = ["accelerate (>=0.20.3)"] agents = ["Pillow (<10.0.0)", "accelerate (>=0.20.3)", "datasets (!=2.5.0)", "diffusers", "opencv-python", "sentencepiece (>=0.1.91,!=0.1.92)", "torch (>=1.10,!=1.12.0)"] -all = ["Pillow (<10.0.0)", "accelerate (>=0.20.3)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune]", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>=2.6,<2.15)", "tensorflow-text (<2.15)", "tf2onnx", "timm", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "torch (>=1.10,!=1.12.0)", "torchaudio", "torchvision"] +all = ["Pillow (<10.0.0)", "accelerate (>=0.20.3)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune]", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>=2.6,<2.15)", "tensorflow-text (<2.15)", "tf2onnx", "timm", "tokenizers (>=0.14,<0.19)", "torch (>=1.10,!=1.12.0)", "torchaudio", "torchvision"] audio = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] codecarbon = ["codecarbon (==1.2.0)"] deepspeed = ["accelerate (>=0.20.3)", "deepspeed (>=0.9.3)"] -deepspeed-testing = ["GitPython (<3.1.19)", "accelerate (>=0.20.3)", "beautifulsoup4", "black (>=23.1,<24.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "deepspeed (>=0.9.3)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder (>=0.3.0)", "nltk", "optuna", "parameterized", "protobuf", "psutil", "pytest (>=7.2.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "timeout-decorator"] -dev = ["GitPython (<3.1.19)", "Pillow (<10.0.0)", "accelerate (>=0.20.3)", "av (==9.2.0)", "beautifulsoup4", "black (>=23.1,<24.0)", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "decord (==0.6.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flax (>=0.4.1,<=0.7.0)", "fugashi (>=1.0)", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pytest (>=7.2.0)", "pytest-timeout", "pytest-xdist", "ray[tune]", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (>=0.0.241,<=0.0.259)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorflow (>=2.6,<2.15)", "tensorflow-text (<2.15)", "tf2onnx", "timeout-decorator", "timm", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "torch (>=1.10,!=1.12.0)", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] -dev-tensorflow = ["GitPython (<3.1.19)", "Pillow (<10.0.0)", "beautifulsoup4", "black (>=23.1,<24.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "isort (>=5.5.4)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pytest (>=7.2.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (>=0.0.241,<=0.0.259)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorflow (>=2.6,<2.15)", "tensorflow-text (<2.15)", "tf2onnx", "timeout-decorator", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "urllib3 (<2.0.0)"] -dev-torch = ["GitPython (<3.1.19)", "Pillow (<10.0.0)", "accelerate (>=0.20.3)", "beautifulsoup4", "black (>=23.1,<24.0)", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "fugashi (>=1.0)", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "kenlm", "librosa", "nltk", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pytest (>=7.2.0)", "pytest-timeout", "pytest-xdist", "ray[tune]", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (>=0.0.241,<=0.0.259)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "timeout-decorator", "timm", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "torch (>=1.10,!=1.12.0)", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] -docs = ["Pillow (<10.0.0)", "accelerate (>=0.20.3)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.7.0)", "hf-doc-builder", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune]", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>=2.6,<2.15)", "tensorflow-text (<2.15)", "tf2onnx", "timm", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "torch (>=1.10,!=1.12.0)", "torchaudio", "torchvision"] +deepspeed-testing = ["GitPython (<3.1.19)", "accelerate (>=0.20.3)", "beautifulsoup4", "black (>=23.1,<24.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "deepspeed (>=0.9.3)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder (>=0.3.0)", "nltk", "optuna", "parameterized", "protobuf", "psutil", "pytest (>=7.2.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] +dev = ["GitPython (<3.1.19)", "Pillow (<10.0.0)", "accelerate (>=0.20.3)", "av (==9.2.0)", "beautifulsoup4", "black (>=23.1,<24.0)", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "decord (==0.6.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flax (>=0.4.1,<=0.7.0)", "fugashi (>=1.0)", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pytest (>=7.2.0)", "pytest-timeout", "pytest-xdist", "ray[tune]", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (>=0.0.241,<=0.0.259)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "tensorflow (>=2.6,<2.15)", "tensorflow-text (<2.15)", "tf2onnx", "timeout-decorator", "timm", "tokenizers (>=0.14,<0.19)", "torch (>=1.10,!=1.12.0)", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] +dev-tensorflow = ["GitPython (<3.1.19)", "Pillow (<10.0.0)", "beautifulsoup4", "black (>=23.1,<24.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "isort (>=5.5.4)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pytest (>=7.2.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (>=0.0.241,<=0.0.259)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "tensorflow (>=2.6,<2.15)", "tensorflow-text (<2.15)", "tf2onnx", "timeout-decorator", "tokenizers (>=0.14,<0.19)", "urllib3 (<2.0.0)"] +dev-torch = ["GitPython (<3.1.19)", "Pillow (<10.0.0)", "accelerate (>=0.20.3)", "beautifulsoup4", "black (>=23.1,<24.0)", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "fugashi (>=1.0)", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "kenlm", "librosa", "nltk", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pytest (>=7.2.0)", "pytest-timeout", "pytest-xdist", "ray[tune]", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (>=0.0.241,<=0.0.259)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "timeout-decorator", "timm", "tokenizers (>=0.14,<0.19)", "torch (>=1.10,!=1.12.0)", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] +docs = ["Pillow (<10.0.0)", "accelerate (>=0.20.3)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.7.0)", "hf-doc-builder", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune]", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>=2.6,<2.15)", "tensorflow-text (<2.15)", "tf2onnx", "timm", "tokenizers (>=0.14,<0.19)", "torch (>=1.10,!=1.12.0)", "torchaudio", "torchvision"] docs-specific = ["hf-doc-builder"] -fairscale = ["fairscale (>0.3)"] flax = ["flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "optax (>=0.0.8,<=0.1.4)"] flax-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] ftfy = ["ftfy"] @@ -4625,30 +4491,81 @@ serving = ["fastapi", "pydantic (<2)", "starlette", "uvicorn"] sigopt = ["sigopt"] sklearn = ["scikit-learn"] speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] -testing = ["GitPython (<3.1.19)", "beautifulsoup4", "black (>=23.1,<24.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder (>=0.3.0)", "nltk", "parameterized", "protobuf", "psutil", "pytest (>=7.2.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "timeout-decorator"] +testing = ["GitPython (<3.1.19)", "beautifulsoup4", "black (>=23.1,<24.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder (>=0.3.0)", "nltk", "parameterized", "protobuf", "psutil", "pytest (>=7.2.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "tensorboard", "timeout-decorator"] tf = ["keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow (>=2.6,<2.15)", "tensorflow-text (<2.15)", "tf2onnx"] tf-cpu = ["keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow-cpu (>=2.6,<2.15)", "tensorflow-text (<2.15)", "tf2onnx"] tf-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] timm = ["timm"] -tokenizers = ["tokenizers (>=0.11.1,!=0.11.3,<0.14)"] +tokenizers = ["tokenizers (>=0.14,<0.19)"] torch = ["accelerate (>=0.20.3)", "torch (>=1.10,!=1.12.0)"] torch-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] torch-vision = ["Pillow (<10.0.0)", "torchvision"] -torchhub = ["filelock", "huggingface-hub (>=0.15.1,<1.0)", "importlib-metadata", "numpy (>=1.17)", "packaging (>=20.0)", "protobuf", "regex (!=2019.12.17)", "requests", "sentencepiece (>=0.1.91,!=0.1.92)", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "torch (>=1.10,!=1.12.0)", "tqdm (>=4.27)"] +torchhub = ["filelock", "huggingface-hub (>=0.16.4,<1.0)", "importlib-metadata", "numpy (>=1.17)", "packaging (>=20.0)", "protobuf", "regex (!=2019.12.17)", "requests", "sentencepiece (>=0.1.91,!=0.1.92)", "tokenizers (>=0.14,<0.19)", "torch (>=1.10,!=1.12.0)", "tqdm (>=4.27)"] video = ["av (==9.2.0)", "decord (==0.6.0)"] vision = ["Pillow (<10.0.0)"] +[[package]] +name = "triton" +version = "2.1.0" +description = "A language and compiler for custom Deep Learning operations" +optional = false +python-versions = "*" +files = [ + {file = "triton-2.1.0-0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:66439923a30d5d48399b08a9eae10370f6c261a5ec864a64983bae63152d39d7"}, + {file = "triton-2.1.0-0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:919b06453f0033ea52c13eaf7833de0e57db3178d23d4e04f9fc71c4f2c32bf8"}, + {file = "triton-2.1.0-0-cp37-cp37m-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ae4bb8a91de790e1866405211c4d618379781188f40d5c4c399766914e84cd94"}, + {file = "triton-2.1.0-0-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:39f6fb6bdccb3e98f3152e3fbea724f1aeae7d749412bbb1fa9c441d474eba26"}, + {file = "triton-2.1.0-0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:21544e522c02005a626c8ad63d39bdff2f31d41069592919ef281e964ed26446"}, + {file = "triton-2.1.0-0-pp37-pypy37_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:143582ca31dd89cd982bd3bf53666bab1c7527d41e185f9e3d8a3051ce1b663b"}, + {file = "triton-2.1.0-0-pp38-pypy38_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:82fc5aeeedf6e36be4e4530cbdcba81a09d65c18e02f52dc298696d45721f3bd"}, + {file = "triton-2.1.0-0-pp39-pypy39_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:81a96d110a738ff63339fc892ded095b31bd0d205e3aace262af8400d40b6fa8"}, +] + +[package.dependencies] +filelock = "*" + +[package.extras] +build = ["cmake (>=3.18)", "lit"] +tests = ["autopep8", "flake8", "isort", "numpy", "pytest", "scipy (>=1.7.1)"] +tutorials = ["matplotlib", "pandas", "tabulate"] + +[[package]] +name = "types-python-dateutil" +version = "2.8.19.14" +description = "Typing stubs for python-dateutil" +optional = false +python-versions = "*" +files = [ + {file = "types-python-dateutil-2.8.19.14.tar.gz", hash = "sha256:1f4f10ac98bb8b16ade9dbee3518d9ace017821d94b057a425b069f834737f4b"}, + {file = "types_python_dateutil-2.8.19.14-py3-none-any.whl", hash = "sha256:f977b8de27787639986b4e28963263fd0e5158942b3ecef91b9335c130cb1ce9"}, +] + [[package]] name = "typing-extensions" -version = "4.7.1" -description = "Backported and Experimental Type Hints for Python 3.7+" +version = "4.8.0" +description = "Backported and Experimental Type Hints for Python 3.8+" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.8.0-py3-none-any.whl", hash = "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0"}, + {file = "typing_extensions-4.8.0.tar.gz", hash = "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef"}, +] + +[[package]] +name = "typing-inspect" +version = "0.9.0" +description = "Runtime inspection utilities for typing module." +optional = false +python-versions = "*" files = [ - {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, - {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, + {file = "typing_inspect-0.9.0-py3-none-any.whl", hash = "sha256:9ee6fc59062311ef8547596ab6b955e1b8aa46242d854bfc78f4f6b0eff35f9f"}, + {file = "typing_inspect-0.9.0.tar.gz", hash = "sha256:b23fc42ff6f6ef6954e4852c1fb512cdd18dbea03134f91f856a95ccc9461f78"}, ] +[package.dependencies] +mypy-extensions = ">=0.3.0" +typing-extensions = ">=3.7.4" + [[package]] name = "tzdata" version = "2023.3" @@ -4676,48 +4593,29 @@ dev = ["flake8", "flake8-annotations", "flake8-bandit", "flake8-bugbear", "flake [[package]] name = "urllib3" -version = "1.26.16" +version = "2.1.0" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" -files = [ - {file = "urllib3-1.26.16-py2.py3-none-any.whl", hash = "sha256:8d36afa7616d8ab714608411b4a3b13e58f463aee519024578e062e141dce20f"}, - {file = "urllib3-1.26.16.tar.gz", hash = "sha256:8f135f6502756bde6b2a9b28989df5fbe87c9970cecaa69041edcce7f0589b14"}, -] - -[package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] -secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] - -[[package]] -name = "uvicorn" -version = "0.23.2" -description = "The lightning-fast ASGI server." -optional = false python-versions = ">=3.8" files = [ - {file = "uvicorn-0.23.2-py3-none-any.whl", hash = "sha256:1f9be6558f01239d4fdf22ef8126c39cb1ad0addf76c40e760549d2c2f43ab53"}, - {file = "uvicorn-0.23.2.tar.gz", hash = "sha256:4d3cc12d7727ba72b64d12d3cc7743124074c0a69f7b201512fc50c3e3f1569a"}, + {file = "urllib3-2.1.0-py3-none-any.whl", hash = "sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3"}, + {file = "urllib3-2.1.0.tar.gz", hash = "sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54"}, ] -[package.dependencies] -click = ">=7.0" -h11 = ">=0.8" -typing-extensions = {version = ">=4.0", markers = "python_version < \"3.11\""} - [package.extras] -standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] [[package]] name = "wandb" -version = "0.15.10" +version = "0.15.12" description = "A CLI and library for interacting with the Weights & Biases API." optional = false python-versions = ">=3.6" files = [ - {file = "wandb-0.15.10-py3-none-any.whl", hash = "sha256:bc810879fecd1b62ccd498658e55ade3702939090a94b99418630e77e1f43d50"}, - {file = "wandb-0.15.10.tar.gz", hash = "sha256:5ce6d2d6be904da726b591a19ac22d2e71aa4b6a9ed450d8cd817d1712969b13"}, + {file = "wandb-0.15.12-py3-none-any.whl", hash = "sha256:75c57b5bb8ddae21d45a02f644628585bdd112fea686de3177099a0996f1c41c"}, + {file = "wandb-0.15.12.tar.gz", hash = "sha256:c344d92fb8044b072a6138afd9adc5d3801ad050cf11378fe2af2fe899dcca84"}, ] [package.dependencies] @@ -4727,7 +4625,6 @@ docker-pycreds = ">=0.4.0" GitPython = ">=1.0.0,<3.1.29 || >3.1.29" pathtools = "*" protobuf = [ - {version = ">=3.12.0,<4.21.0 || >4.21.0,<5", markers = "python_version < \"3.9\" and sys_platform == \"linux\""}, {version = ">=3.15.0,<4.21.0 || >4.21.0,<5", markers = "python_version == \"3.9\" and sys_platform == \"linux\""}, {version = ">=3.19.0,<4.21.0 || >4.21.0,<5", markers = "python_version > \"3.9\" or sys_platform != \"linux\""}, ] @@ -4745,21 +4642,22 @@ aws = ["boto3"] azure = ["azure-identity", "azure-storage-blob"] gcp = ["google-cloud-storage"] kubeflow = ["google-cloud-storage", "kubernetes", "minio", "sh"] -launch = ["awscli", "azure-containerregistry", "azure-identity", "azure-storage-blob", "boto3", "botocore", "chardet", "google-auth", "google-cloud-artifact-registry", "google-cloud-compute", "google-cloud-storage", "iso8601", "kubernetes", "nbconvert", "nbformat", "optuna", "typing-extensions"] +launch = ["PyYAML (>=6.0.0)", "awscli", "azure-containerregistry", "azure-identity", "azure-storage-blob", "boto3", "botocore", "chardet", "google-auth", "google-cloud-artifact-registry", "google-cloud-compute", "google-cloud-storage", "iso8601", "kubernetes", "nbconvert", "nbformat", "optuna", "typing-extensions"] media = ["bokeh", "moviepy", "numpy", "pillow", "plotly", "rdkit-pypi", "soundfile"] models = ["cloudpickle"] +nexus = ["wandb-core (>=0.16.0b1)"] perf = ["orjson"] sweeps = ["sweeps (>=0.2.0)"] [[package]] name = "wcwidth" -version = "0.2.6" +version = "0.2.10" description = "Measures the displayed width of unicode strings in a terminal" optional = false python-versions = "*" files = [ - {file = "wcwidth-0.2.6-py2.py3-none-any.whl", hash = "sha256:795b138f6875577cd91bba52baf9e445cd5118fd32723b460e30a0af30ea230e"}, - {file = "wcwidth-0.2.6.tar.gz", hash = "sha256:a5220780a404dbe3353789870978e472cfe477761f06ee55077256e509b156d0"}, + {file = "wcwidth-0.2.10-py2.py3-none-any.whl", hash = "sha256:aec5179002dd0f0d40c456026e74a729661c9d468e1ed64405e3a6c2176ca36f"}, + {file = "wcwidth-0.2.10.tar.gz", hash = "sha256:390c7454101092a6a5e43baad8f83de615463af459201709556b6e4b1c861f97"}, ] [[package]] @@ -4790,13 +4688,13 @@ files = [ [[package]] name = "websocket-client" -version = "1.6.3" +version = "1.6.4" description = "WebSocket client for Python with low level API options" optional = false python-versions = ">=3.8" files = [ - {file = "websocket-client-1.6.3.tar.gz", hash = "sha256:3aad25d31284266bcfcfd1fd8a743f63282305a364b8d0948a43bd606acc652f"}, - {file = "websocket_client-1.6.3-py3-none-any.whl", hash = "sha256:6cfc30d051ebabb73a5fa246efdcc14c8fbebbd0330f8984ac3bb6d9edd2ad03"}, + {file = "websocket-client-1.6.4.tar.gz", hash = "sha256:b3324019b3c28572086c4a319f91d1dcd44e6e11cd340232978c684a7650d0df"}, + {file = "websocket_client-1.6.4-py3-none-any.whl", hash = "sha256:084072e0a7f5f347ef2ac3d8698a5e0b4ffbfcab607628cadabc650fc9a83a24"}, ] [package.extras] @@ -4804,94 +4702,15 @@ docs = ["Sphinx (>=6.0)", "sphinx-rtd-theme (>=1.1.0)"] optional = ["python-socks", "wsaccel"] test = ["websockets"] -[[package]] -name = "websockets" -version = "11.0.3" -description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" -optional = false -python-versions = ">=3.7" -files = [ - {file = "websockets-11.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3ccc8a0c387629aec40f2fc9fdcb4b9d5431954f934da3eaf16cdc94f67dbfac"}, - {file = "websockets-11.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d67ac60a307f760c6e65dad586f556dde58e683fab03323221a4e530ead6f74d"}, - {file = "websockets-11.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84d27a4832cc1a0ee07cdcf2b0629a8a72db73f4cf6de6f0904f6661227f256f"}, - {file = "websockets-11.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffd7dcaf744f25f82190856bc26ed81721508fc5cbf2a330751e135ff1283564"}, - {file = "websockets-11.0.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7622a89d696fc87af8e8d280d9b421db5133ef5b29d3f7a1ce9f1a7bf7fcfa11"}, - {file = "websockets-11.0.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bceab846bac555aff6427d060f2fcfff71042dba6f5fca7dc4f75cac815e57ca"}, - {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:54c6e5b3d3a8936a4ab6870d46bdd6ec500ad62bde9e44462c32d18f1e9a8e54"}, - {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:41f696ba95cd92dc047e46b41b26dd24518384749ed0d99bea0a941ca87404c4"}, - {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:86d2a77fd490ae3ff6fae1c6ceaecad063d3cc2320b44377efdde79880e11526"}, - {file = "websockets-11.0.3-cp310-cp310-win32.whl", hash = "sha256:2d903ad4419f5b472de90cd2d40384573b25da71e33519a67797de17ef849b69"}, - {file = "websockets-11.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:1d2256283fa4b7f4c7d7d3e84dc2ece74d341bce57d5b9bf385df109c2a1a82f"}, - {file = "websockets-11.0.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e848f46a58b9fcf3d06061d17be388caf70ea5b8cc3466251963c8345e13f7eb"}, - {file = "websockets-11.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aa5003845cdd21ac0dc6c9bf661c5beddd01116f6eb9eb3c8e272353d45b3288"}, - {file = "websockets-11.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b58cbf0697721120866820b89f93659abc31c1e876bf20d0b3d03cef14faf84d"}, - {file = "websockets-11.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:660e2d9068d2bedc0912af508f30bbeb505bbbf9774d98def45f68278cea20d3"}, - {file = "websockets-11.0.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c1f0524f203e3bd35149f12157438f406eff2e4fb30f71221c8a5eceb3617b6b"}, - {file = "websockets-11.0.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:def07915168ac8f7853812cc593c71185a16216e9e4fa886358a17ed0fd9fcf6"}, - {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b30c6590146e53149f04e85a6e4fcae068df4289e31e4aee1fdf56a0dead8f97"}, - {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:619d9f06372b3a42bc29d0cd0354c9bb9fb39c2cbc1a9c5025b4538738dbffaf"}, - {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:01f5567d9cf6f502d655151645d4e8b72b453413d3819d2b6f1185abc23e82dd"}, - {file = "websockets-11.0.3-cp311-cp311-win32.whl", hash = "sha256:e1459677e5d12be8bbc7584c35b992eea142911a6236a3278b9b5ce3326f282c"}, - {file = "websockets-11.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:e7837cb169eca3b3ae94cc5787c4fed99eef74c0ab9506756eea335e0d6f3ed8"}, - {file = "websockets-11.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9f59a3c656fef341a99e3d63189852be7084c0e54b75734cde571182c087b152"}, - {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2529338a6ff0eb0b50c7be33dc3d0e456381157a31eefc561771ee431134a97f"}, - {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34fd59a4ac42dff6d4681d8843217137f6bc85ed29722f2f7222bd619d15e95b"}, - {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:332d126167ddddec94597c2365537baf9ff62dfcc9db4266f263d455f2f031cb"}, - {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6505c1b31274723ccaf5f515c1824a4ad2f0d191cec942666b3d0f3aa4cb4007"}, - {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f467ba0050b7de85016b43f5a22b46383ef004c4f672148a8abf32bc999a87f0"}, - {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9d9acd80072abcc98bd2c86c3c9cd4ac2347b5a5a0cae7ed5c0ee5675f86d9af"}, - {file = "websockets-11.0.3-cp37-cp37m-win32.whl", hash = "sha256:e590228200fcfc7e9109509e4d9125eace2042fd52b595dd22bbc34bb282307f"}, - {file = "websockets-11.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:b16fff62b45eccb9c7abb18e60e7e446998093cdcb50fed33134b9b6878836de"}, - {file = "websockets-11.0.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fb06eea71a00a7af0ae6aefbb932fb8a7df3cb390cc217d51a9ad7343de1b8d0"}, - {file = "websockets-11.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8a34e13a62a59c871064dfd8ffb150867e54291e46d4a7cf11d02c94a5275bae"}, - {file = "websockets-11.0.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4841ed00f1026dfbced6fca7d963c4e7043aa832648671b5138008dc5a8f6d99"}, - {file = "websockets-11.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a073fc9ab1c8aff37c99f11f1641e16da517770e31a37265d2755282a5d28aa"}, - {file = "websockets-11.0.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68b977f21ce443d6d378dbd5ca38621755f2063d6fdb3335bda981d552cfff86"}, - {file = "websockets-11.0.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1a99a7a71631f0efe727c10edfba09ea6bee4166a6f9c19aafb6c0b5917d09c"}, - {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bee9fcb41db2a23bed96c6b6ead6489702c12334ea20a297aa095ce6d31370d0"}, - {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4b253869ea05a5a073ebfdcb5cb3b0266a57c3764cf6fe114e4cd90f4bfa5f5e"}, - {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1553cb82942b2a74dd9b15a018dce645d4e68674de2ca31ff13ebc2d9f283788"}, - {file = "websockets-11.0.3-cp38-cp38-win32.whl", hash = "sha256:f61bdb1df43dc9c131791fbc2355535f9024b9a04398d3bd0684fc16ab07df74"}, - {file = "websockets-11.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:03aae4edc0b1c68498f41a6772d80ac7c1e33c06c6ffa2ac1c27a07653e79d6f"}, - {file = "websockets-11.0.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:777354ee16f02f643a4c7f2b3eff8027a33c9861edc691a2003531f5da4f6bc8"}, - {file = "websockets-11.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8c82f11964f010053e13daafdc7154ce7385ecc538989a354ccc7067fd7028fd"}, - {file = "websockets-11.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3580dd9c1ad0701169e4d6fc41e878ffe05e6bdcaf3c412f9d559389d0c9e016"}, - {file = "websockets-11.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f1a3f10f836fab6ca6efa97bb952300b20ae56b409414ca85bff2ad241d2a61"}, - {file = "websockets-11.0.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df41b9bc27c2c25b486bae7cf42fccdc52ff181c8c387bfd026624a491c2671b"}, - {file = "websockets-11.0.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:279e5de4671e79a9ac877427f4ac4ce93751b8823f276b681d04b2156713b9dd"}, - {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1fdf26fa8a6a592f8f9235285b8affa72748dc12e964a5518c6c5e8f916716f7"}, - {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:69269f3a0b472e91125b503d3c0b3566bda26da0a3261c49f0027eb6075086d1"}, - {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:97b52894d948d2f6ea480171a27122d77af14ced35f62e5c892ca2fae9344311"}, - {file = "websockets-11.0.3-cp39-cp39-win32.whl", hash = "sha256:c7f3cb904cce8e1be667c7e6fef4516b98d1a6a0635a58a57528d577ac18a128"}, - {file = "websockets-11.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c792ea4eabc0159535608fc5658a74d1a81020eb35195dd63214dcf07556f67e"}, - {file = "websockets-11.0.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f2e58f2c36cc52d41f2659e4c0cbf7353e28c8c9e63e30d8c6d3494dc9fdedcf"}, - {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de36fe9c02995c7e6ae6efe2e205816f5f00c22fd1fbf343d4d18c3d5ceac2f5"}, - {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0ac56b661e60edd453585f4bd68eb6a29ae25b5184fd5ba51e97652580458998"}, - {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e052b8467dd07d4943936009f46ae5ce7b908ddcac3fda581656b1b19c083d9b"}, - {file = "websockets-11.0.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:42cc5452a54a8e46a032521d7365da775823e21bfba2895fb7b77633cce031bb"}, - {file = "websockets-11.0.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e6316827e3e79b7b8e7d8e3b08f4e331af91a48e794d5d8b099928b6f0b85f20"}, - {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8531fdcad636d82c517b26a448dcfe62f720e1922b33c81ce695d0edb91eb931"}, - {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c114e8da9b475739dde229fd3bc6b05a6537a88a578358bc8eb29b4030fac9c9"}, - {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e063b1865974611313a3849d43f2c3f5368093691349cf3c7c8f8f75ad7cb280"}, - {file = "websockets-11.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:92b2065d642bf8c0a82d59e59053dd2fdde64d4ed44efe4870fa816c1232647b"}, - {file = "websockets-11.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0ee68fe502f9031f19d495dae2c268830df2760c0524cbac5d759921ba8c8e82"}, - {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcacf2c7a6c3a84e720d1bb2b543c675bf6c40e460300b628bab1b1efc7c034c"}, - {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b67c6f5e5a401fc56394f191f00f9b3811fe843ee93f4a70df3c389d1adf857d"}, - {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d5023a4b6a5b183dc838808087033ec5df77580485fc533e7dab2567851b0a4"}, - {file = "websockets-11.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ed058398f55163a79bb9f06a90ef9ccc063b204bb346c4de78efc5d15abfe602"}, - {file = "websockets-11.0.3-py3-none-any.whl", hash = "sha256:6681ba9e7f8f3b19440921e99efbb40fc89f26cd71bf539e45d8c8a25c976dc6"}, - {file = "websockets-11.0.3.tar.gz", hash = "sha256:88fc51d9a26b10fc331be344f1781224a375b78488fc343620184e95a4b27016"}, -] - [[package]] name = "werkzeug" -version = "2.3.7" +version = "3.0.1" description = "The comprehensive WSGI web application library." optional = false python-versions = ">=3.8" files = [ - {file = "werkzeug-2.3.7-py3-none-any.whl", hash = "sha256:effc12dba7f3bd72e605ce49807bbe692bd729c3bb122a3b91747a6ae77df528"}, - {file = "werkzeug-2.3.7.tar.gz", hash = "sha256:2b8c0e447b4b9dbcc85dd97b6eeb4dcbaf6c8b6c3be0bd654e25553e0a2157d8"}, + {file = "werkzeug-3.0.1-py3-none-any.whl", hash = "sha256:90a285dc0e42ad56b34e696398b8122ee4c681833fb35b8334a095d82c56da10"}, + {file = "werkzeug-3.0.1.tar.gz", hash = "sha256:507e811ecea72b18a404947aded4b3390e1db8f826b494d76550ef45bb3b1dcc"}, ] [package.dependencies] @@ -4900,20 +4719,6 @@ MarkupSafe = ">=2.1.1" [package.extras] watchdog = ["watchdog (>=2.3)"] -[[package]] -name = "wheel" -version = "0.41.2" -description = "A built-package format for Python" -optional = false -python-versions = ">=3.7" -files = [ - {file = "wheel-0.41.2-py3-none-any.whl", hash = "sha256:75909db2664838d015e3d9139004ee16711748a52c8f336b52882266540215d8"}, - {file = "wheel-0.41.2.tar.gz", hash = "sha256:0c5ac5ff2afb79ac23ab82bab027a0be7b5dbcf2e54dc50efe4bf507de1f7985"}, -] - -[package.extras] -test = ["pytest (>=6.0.0)", "setuptools (>=65)"] - [[package]] name = "widgetsnbextension" version = "3.6.6" @@ -4930,117 +4735,142 @@ notebook = ">=4.4.1" [[package]] name = "windows-curses" -version = "2.3.1" +version = "2.3.2" description = "Support for the standard curses module on Windows" optional = false python-versions = "*" files = [ - {file = "windows_curses-2.3.1-cp310-cp310-win32.whl", hash = "sha256:2644f4547ae5124ce5129b66faa59ee0995b7b7205ed5e3920f6ecfef2e46275"}, - {file = "windows_curses-2.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:8b541520895649c0835771775034a2b4edf36da3c3d9381c5022b5b4f9a5014e"}, - {file = "windows_curses-2.3.1-cp311-cp311-win32.whl", hash = "sha256:25e7ff3d77aed6c747456b06fbc1528d67fc59d1ef3be9ca244774e65e6bdbb2"}, - {file = "windows_curses-2.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:395656bfe88d6f60cb18604605d423e0f2d1c3a8f550507dca5877a9d0b3a0f3"}, - {file = "windows_curses-2.3.1-cp36-cp36m-win32.whl", hash = "sha256:6ea8e1c4536fee248ee3f88e5010871df749932b7e829e2f012e5d23bd2fe31d"}, - {file = "windows_curses-2.3.1-cp36-cp36m-win_amd64.whl", hash = "sha256:59856b41676c4b3eb527eb6b1478803d4dc92413b2e63aea762407807ffcd3ac"}, - {file = "windows_curses-2.3.1-cp37-cp37m-win32.whl", hash = "sha256:9cd0ba6efde23930736eff45a0aa0af6fd82e60b4787a46157ef4956d2c52b06"}, - {file = "windows_curses-2.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:f9a7fcd03934e40238f9bbeddae51e3fdc442f28bca50afccdc521245ed39439"}, - {file = "windows_curses-2.3.1-cp38-cp38-win32.whl", hash = "sha256:5c55ebafdb402cfa927174a03d651cd1b1e76d6e6cf71818f9d3378636c00e74"}, - {file = "windows_curses-2.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:a551aaa09d6ec28f64ade8e85fd0c52880c8e9114729a79c34803104e49bed71"}, - {file = "windows_curses-2.3.1-cp39-cp39-win32.whl", hash = "sha256:aab7e28133bf81769cddf8b3c3c8ab89e76cd43effd371c6370e918b6dfccf1b"}, - {file = "windows_curses-2.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:85675de4ae7058348140daae83a8a7b81147a84ef9ab699307b3168f9490292f"}, + {file = "windows_curses-2.3.2-cp310-cp310-win32.whl", hash = "sha256:0286d35c9a2589731af3cf2b1251635a400f4b61aef2b9c081f6c98e7887a170"}, + {file = "windows_curses-2.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:b5e68520c7e92dff72914e4126cadb5b8eb3b6c968d955de6d35ff42306da8c0"}, + {file = "windows_curses-2.3.2-cp311-cp311-win32.whl", hash = "sha256:95d2a288af6172270da5ca9225aa99eeae98595c6e90f3574aa9b9f2fc1d2619"}, + {file = "windows_curses-2.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:9b7ecd0f21f643e22a979effff25f62200626bb9853ea8b9aacf0bbcaab0950d"}, + {file = "windows_curses-2.3.2-cp312-cp312-win32.whl", hash = "sha256:4546122f5bec2fb46c1706c020d971bcfc4d9a5158372f25ba7472a834b0f165"}, + {file = "windows_curses-2.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:e3f27939f39143c513f444a8c0419b2737e8de55fbe5d63d765992512125366d"}, + {file = "windows_curses-2.3.2-cp36-cp36m-win32.whl", hash = "sha256:a570f744a62108d024a7775b3b156b2ae2380fc971237c3bd2742341e7151f22"}, + {file = "windows_curses-2.3.2-cp36-cp36m-win_amd64.whl", hash = "sha256:f81294465a67e43ddc50c1b52711b100b002fa1238f87d84d0cf94b785c4fe75"}, + {file = "windows_curses-2.3.2-cp37-cp37m-win32.whl", hash = "sha256:72ff5d8963fbb3aa662bfced2c5ea22dc3ed58bac827a3bff74a1de5eacdbe57"}, + {file = "windows_curses-2.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:70d8cb4ddad43f695a266f79c7a31d40ac8aee2a17cf8e06ecfd4a71589ad30d"}, + {file = "windows_curses-2.3.2-cp38-cp38-win32.whl", hash = "sha256:6bc698058081408685975256f46f570c32f8d7e1f4f82f9d6c66c300c6daff89"}, + {file = "windows_curses-2.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:f73bfd283f86d3ac0a72b74307ccc99ea0fd008a732d80db95d31fbafeee3c66"}, + {file = "windows_curses-2.3.2-cp39-cp39-win32.whl", hash = "sha256:e4ec5245f0c00ede45b033a885511eea80d5928c9bd3ceb523fbfb086370a4df"}, + {file = "windows_curses-2.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:00d5d000b68db38bd97b6a5b90ee4b4c915a7cef7492fc5aa9ecc7794ee2ca93"}, ] [[package]] name = "xxhash" -version = "3.3.0" +version = "3.4.1" description = "Python binding for xxHash" optional = false python-versions = ">=3.7" files = [ - {file = "xxhash-3.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:70ef7288d1cb1ad16e02d101ea43bb0e392d985d60b9b0035aee80663530960d"}, - {file = "xxhash-3.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:44ff8c673cab50be46784e0aec62aa6f0ca9ea765e2b0690e8945d0cd950dcaf"}, - {file = "xxhash-3.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfebc90273ae2beb813d8118a2bfffb5a5a81ac054fbfd061ea18fd0a81db0ac"}, - {file = "xxhash-3.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9084e68bedbd665c7e9241a7b597c28f4775edeb3941bf608ecb38732a5f8fb5"}, - {file = "xxhash-3.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d72493a14a3e89564b1a6c7400b9b40621e8f4692410706ef27c66aeadc7b431"}, - {file = "xxhash-3.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98779cbe9068dd7734cc3210693894d5cc9b156920e9c336f10fb99f46bebbd8"}, - {file = "xxhash-3.3.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:499f8a12767dd28b98ab6b7c7da7d294564e4c9024a2aaa5d0b0b98a8bef2f92"}, - {file = "xxhash-3.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4dabda7f42c548f98d8e07e390bda2953fc58302c0e07ded7b3fe0637e7ecd2f"}, - {file = "xxhash-3.3.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c416409646c793c46370f0f1859253302ee70aeda5278c2a0ca41462f8ec1244"}, - {file = "xxhash-3.3.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b8bd31aaad8a80a7302730676cec26bea3ef1fd9835875aa47fea073aca9fe05"}, - {file = "xxhash-3.3.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:3af8e3bcd630f905efbdfe7a51b51fc1ca3c9dca8b155f841925f3ad41685d41"}, - {file = "xxhash-3.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d86b79c707fc7025d967af71db652429a06a8179175e45bd2e9f17b8af6f5949"}, - {file = "xxhash-3.3.0-cp310-cp310-win32.whl", hash = "sha256:98fe771f36ee9d3a1f5741424a956a2ba9651d9508a9f64a024b57f2cf796414"}, - {file = "xxhash-3.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:0a65131f7f731ecf7e3dd27f09d877aff3000a79a446caaa2c0d8d0ec0bc7186"}, - {file = "xxhash-3.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a9761e425e79d23797fa0bec2d781dbadb9fe5dcc2bf69030855f5e393c3bec8"}, - {file = "xxhash-3.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d28c7ef1deb3c3ac5f5290176ca3d501daa97c2e1f7443bf5d8b61ac651794b2"}, - {file = "xxhash-3.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:701b7cefffc25de1b7ddfae6505da70a3b3a11e312c2e2b33b09e180bbceb43d"}, - {file = "xxhash-3.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b1644f8b8e19a242c3047a089541067248a651038cabb9fcab3c13eb1dfcd757"}, - {file = "xxhash-3.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:20e7d0e3488cc0f0dbe360731b7fe32e1f2df46bf2de2db3317d301efb93084c"}, - {file = "xxhash-3.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:156c52eca2b20f9839723bef0b929a290f6c2f1c98ccb24e82f58f96f3c16007"}, - {file = "xxhash-3.3.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d6ce4d3828d79044ed08994e196c20f69c18133ed8a4286afe3e98989adeeac"}, - {file = "xxhash-3.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b85b63757ade2439c8d7d71842c40d42c0ab3b69279ed02afbd3b1635f7d2b4b"}, - {file = "xxhash-3.3.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b2b9051e40b7b649a9a2a38fb223ca6a593d332012df885746b81968948f9435"}, - {file = "xxhash-3.3.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:81b7ce050f26fc1daaaa0d24e320815306736d14608e1ba31920e693a7ca9afb"}, - {file = "xxhash-3.3.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:7442500fcce71669953ca959682dcd47452bc3f9c95c8d88315874aeabec9f82"}, - {file = "xxhash-3.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:36a05bf59a515cfb07f3f83373c527fff2ecaa77eaf30c968c788aea582070a1"}, - {file = "xxhash-3.3.0-cp311-cp311-win32.whl", hash = "sha256:da16f9cd62c6fde74683be1b28c28ef865e706da13e3bee4ba836fcc520de0cc"}, - {file = "xxhash-3.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:40fd49ef6964b1c90c0bea63cd184f6d0b36e59144a080e8b3ac2c4c06bf6bf2"}, - {file = "xxhash-3.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:672c60cce1f8026ae32c651f877aa64f342876083a36a4b1ff91bc876aaf0e34"}, - {file = "xxhash-3.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bb6c83d7a65dd3065566c77425ba72df96982174e8ef613d809052d68ae77ab"}, - {file = "xxhash-3.3.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a4170f3016b621e3200ebfcc18de6f50eb8e8fc1303e16324b1f5625afd51b57"}, - {file = "xxhash-3.3.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bfb9c45d502ab38c0f4edf98a678694ae0f345613ef4900ade98c71f64db4d78"}, - {file = "xxhash-3.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48af026a2b1569666da42a478248a1f03f4e2350a34eb661afe3cb45429ca1d7"}, - {file = "xxhash-3.3.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe627de8fe8ddfa8b6477bda4ae5d5843ad1a0c83601dcff72247039465cc901"}, - {file = "xxhash-3.3.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:427fc60a188e345534f35b0aa76f7640c5ddf0354f1c9ad826a2bc086282982d"}, - {file = "xxhash-3.3.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:d80acb20c7f268fe3150ac0be6a6b798062af56a1795eef855b26c9eae11a99c"}, - {file = "xxhash-3.3.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:e71100818943422d1fbbe460e7be7fc4f2d2ba9371b2a745eb09e29ef0493f4a"}, - {file = "xxhash-3.3.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:e3b9bb5fdbe284c7b61c5d82c76688e52bbaf48ab1e53de98c072cc696fa331f"}, - {file = "xxhash-3.3.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:1e25f6c8c46cf1ed8237f610abb231093a748c97d6c2c092789a7cad7e7ef290"}, - {file = "xxhash-3.3.0-cp37-cp37m-win32.whl", hash = "sha256:928208dfecc563be59ae91868d1658e78809cb1e6a0bd74960a96c915db6390c"}, - {file = "xxhash-3.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:bd1b4531a66da6dde1974662c1fd6fb1a2f27e40542e3df5e5e5dbab8ea4aee7"}, - {file = "xxhash-3.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:deebb296df92e082b6d0171a7d6227b503e2897cea4f8bdd3d708094974d4cf6"}, - {file = "xxhash-3.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cd96e9cb0e2baa294e6d572207d9731c3bb8e2511f1ff70f2bf17266b4488bd9"}, - {file = "xxhash-3.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3756b44bf247e422a2e47a38f25d03cf4a5ed539fdc2be3c60043e872e6ff13d"}, - {file = "xxhash-3.3.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69550c3c053b8f135ceac97b85dc1b2bc54b7613a966f550f32b43bed81c788a"}, - {file = "xxhash-3.3.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fc8736fc3e0c5aad435520873b9d2e27ddcc5a830b07e00e9c4d3a61ded9675"}, - {file = "xxhash-3.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80ead7774392efbd95f9f701155048f9ca26cf55133db6f5bb5a0ec69376bda5"}, - {file = "xxhash-3.3.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b8737c9b3fd944d856faafa92c95f6198649ad57987935b6d965d086938be917"}, - {file = "xxhash-3.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2c8e078d0b9f85212801c41bd9eec8122003929686b0ee33360ffbfdf1a189ab"}, - {file = "xxhash-3.3.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:f399269d20ef1dd910331f9ad49e8510c3ba2aa657b623293b536038f266a5c5"}, - {file = "xxhash-3.3.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:f3661decef5f9ff7ab50edbef463bf7dc717621b56755dbae5458a946a033b10"}, - {file = "xxhash-3.3.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:5ec374d0f1e7d43ef48a4ff643600833d7a325ecc6933b4d6ad9282f55751cf7"}, - {file = "xxhash-3.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:39a947ff02d9a85673f5ce1f6f34059e24c714a797440485bd81b2c3cb69a7ff"}, - {file = "xxhash-3.3.0-cp38-cp38-win32.whl", hash = "sha256:4a4f0645a0ec03b229fb04f2e66bdbcb1ffd341a70d6c86c3ee015ffdcd70fad"}, - {file = "xxhash-3.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:8af5a687c0fb4357c230eec8a57ca07d3172faa3cb69beb0cbad40672ae6fa4b"}, - {file = "xxhash-3.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e5bfafda019ecc6202af6f3cf08220fa66af9612ba16ef831033ae3ac7bd1f89"}, - {file = "xxhash-3.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3d113b433bc817adf845689a051363777835577858263ec4325d1934fcb7e394"}, - {file = "xxhash-3.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56aacf4bf65f575c0392be958aceff719d850950bb6af7d804b32d4bc293159c"}, - {file = "xxhash-3.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f5d3e4e0937dad05585e9bd772bbdf0ca40cd8b2f54789d7a1f3091b608118c"}, - {file = "xxhash-3.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:23605d7fc67bc7daa0d263b3a26de3375cfcc0b51ab7de5026625415c05b6fed"}, - {file = "xxhash-3.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe525be0392d493558a2b10d764bcaae9850cc262b417176a8b001f16e085fc6"}, - {file = "xxhash-3.3.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b234d08786884f5c8d55dfebb839cfbd846d812e3a052c39ca7e8ce7055fed68"}, - {file = "xxhash-3.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b031395b4b9c3085d9ea1ce89896ab01a65fc63172b2bfda5dd318fefe5e2f93"}, - {file = "xxhash-3.3.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:5afe44da46b48c75169e622a532dca3fe585343c0577cfd7c18ecd3f1200305d"}, - {file = "xxhash-3.3.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c59f233f38b6a49d5e4ddf16be910a5bbf36a2989b6b2c8591853fb9f5a5e691"}, - {file = "xxhash-3.3.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:ed016e278c5c4633270903c7cf3b9dfb0bd293b7335e43fe695cb95541da53c9"}, - {file = "xxhash-3.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7a8bd6612fb35487e9ab329bb37b3df44f58baf752010dde9282593edbfed7e7"}, - {file = "xxhash-3.3.0-cp39-cp39-win32.whl", hash = "sha256:015a0498bde85364abc53fcc713af962dd4555391929736d9c0ff2c555436a03"}, - {file = "xxhash-3.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:06a484097af32caf1cfffadd60c3ca140c9e52b40a551fb1f6f0fdfd6f7f8977"}, - {file = "xxhash-3.3.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6c3809740124bbc777d29e3ae53de24f4c13fd5e62878086a8feadf0dcb654a5"}, - {file = "xxhash-3.3.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae092f0daaeece2acdd6ec46e2ab307d8d6f22b01ecca14dc6078844dbd88339"}, - {file = "xxhash-3.3.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3498e72ff2610b049b97bb81d1ea6e7bfa5b7a45efb3f255d77ec2fa2bc91653"}, - {file = "xxhash-3.3.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0004dded9d86f129961326e980420187640fb7ba65a184009429861c1d09df7"}, - {file = "xxhash-3.3.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:41c8bfd27191928bae6fd2b66872965532267785094a03c0ee5f358d9dba51c2"}, - {file = "xxhash-3.3.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:71db8498e329cef3588b0617f762a3fe31d899872e76a68ce2840e35a1318a5b"}, - {file = "xxhash-3.3.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d1d24d71b6209bc0124286932c4f0660c1103cb996fe34cb374bc12ac251940"}, - {file = "xxhash-3.3.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61004587a09b5b385e43d95ffe3a76c9d934dfd79ea38272d5c20ddfba8eab8f"}, - {file = "xxhash-3.3.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3f0c92e3fa826425c73acafb31e022a719c85423847a9433d3a9e61e4ac97543"}, - {file = "xxhash-3.3.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:367e03f1484ce471c94e731b98f5e4a05b43e7188b16692998e1cc89fd1159a5"}, - {file = "xxhash-3.3.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ed04c47dfaab98fcda0b748af9ee6fe8c888a0a0fbd13720e0f0221671e387e1"}, - {file = "xxhash-3.3.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7cbfde62516435ca198220aff048a8793383cb7047c7b88714a061968bca786d"}, - {file = "xxhash-3.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73682225faa973ee56743f0fcd36bfcbfec503be258e0e420fb34313f52f1e7b"}, - {file = "xxhash-3.3.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d49efdce2086c2c506af20ed18a1115b40af7aad6d4ee27cb31d7c810585a3f2"}, - {file = "xxhash-3.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:546a0bb8e5a657cadf0da290b30ccd561cb89c256a5421ab8d5eb12eaf087349"}, - {file = "xxhash-3.3.0.tar.gz", hash = "sha256:c3f9e322b1ebeebd44e3d9d2d9b124e0c550c1ef41bd552afdcdd719516ee41a"}, + {file = "xxhash-3.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:91dbfa55346ad3e18e738742236554531a621042e419b70ad8f3c1d9c7a16e7f"}, + {file = "xxhash-3.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:665a65c2a48a72068fcc4d21721510df5f51f1142541c890491afc80451636d2"}, + {file = "xxhash-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb11628470a6004dc71a09fe90c2f459ff03d611376c1debeec2d648f44cb693"}, + {file = "xxhash-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5bef2a7dc7b4f4beb45a1edbba9b9194c60a43a89598a87f1a0226d183764189"}, + {file = "xxhash-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c0f7b2d547d72c7eda7aa817acf8791f0146b12b9eba1d4432c531fb0352228"}, + {file = "xxhash-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00f2fdef6b41c9db3d2fc0e7f94cb3db86693e5c45d6de09625caad9a469635b"}, + {file = "xxhash-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:23cfd9ca09acaf07a43e5a695143d9a21bf00f5b49b15c07d5388cadf1f9ce11"}, + {file = "xxhash-3.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6a9ff50a3cf88355ca4731682c168049af1ca222d1d2925ef7119c1a78e95b3b"}, + {file = "xxhash-3.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:f1d7c69a1e9ca5faa75546fdd267f214f63f52f12692f9b3a2f6467c9e67d5e7"}, + {file = "xxhash-3.4.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:672b273040d5d5a6864a36287f3514efcd1d4b1b6a7480f294c4b1d1ee1b8de0"}, + {file = "xxhash-3.4.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:4178f78d70e88f1c4a89ff1ffe9f43147185930bb962ee3979dba15f2b1cc799"}, + {file = "xxhash-3.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9804b9eb254d4b8cc83ab5a2002128f7d631dd427aa873c8727dba7f1f0d1c2b"}, + {file = "xxhash-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c09c49473212d9c87261d22c74370457cfff5db2ddfc7fd1e35c80c31a8c14ce"}, + {file = "xxhash-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:ebbb1616435b4a194ce3466d7247df23499475c7ed4eb2681a1fa42ff766aff6"}, + {file = "xxhash-3.4.1-cp310-cp310-win_arm64.whl", hash = "sha256:25dc66be3db54f8a2d136f695b00cfe88018e59ccff0f3b8f545869f376a8a46"}, + {file = "xxhash-3.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:58c49083801885273e262c0f5bbeac23e520564b8357fbb18fb94ff09d3d3ea5"}, + {file = "xxhash-3.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b526015a973bfbe81e804a586b703f163861da36d186627e27524f5427b0d520"}, + {file = "xxhash-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36ad4457644c91a966f6fe137d7467636bdc51a6ce10a1d04f365c70d6a16d7e"}, + {file = "xxhash-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:248d3e83d119770f96003271fe41e049dd4ae52da2feb8f832b7a20e791d2920"}, + {file = "xxhash-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2070b6d5bbef5ee031666cf21d4953c16e92c2f8a24a94b5c240f8995ba3b1d0"}, + {file = "xxhash-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2746035f518f0410915e247877f7df43ef3372bf36cfa52cc4bc33e85242641"}, + {file = "xxhash-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a8ba6181514681c2591840d5632fcf7356ab287d4aff1c8dea20f3c78097088"}, + {file = "xxhash-3.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0aac5010869240e95f740de43cd6a05eae180c59edd182ad93bf12ee289484fa"}, + {file = "xxhash-3.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4cb11d8debab1626181633d184b2372aaa09825bde709bf927704ed72765bed1"}, + {file = "xxhash-3.4.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b29728cff2c12f3d9f1d940528ee83918d803c0567866e062683f300d1d2eff3"}, + {file = "xxhash-3.4.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:a15cbf3a9c40672523bdb6ea97ff74b443406ba0ab9bca10ceccd9546414bd84"}, + {file = "xxhash-3.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6e66df260fed01ed8ea790c2913271641c58481e807790d9fca8bfd5a3c13844"}, + {file = "xxhash-3.4.1-cp311-cp311-win32.whl", hash = "sha256:e867f68a8f381ea12858e6d67378c05359d3a53a888913b5f7d35fbf68939d5f"}, + {file = "xxhash-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:200a5a3ad9c7c0c02ed1484a1d838b63edcf92ff538770ea07456a3732c577f4"}, + {file = "xxhash-3.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:1d03f1c0d16d24ea032e99f61c552cb2b77d502e545187338bea461fde253583"}, + {file = "xxhash-3.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c4bbba9b182697a52bc0c9f8ec0ba1acb914b4937cd4a877ad78a3b3eeabefb3"}, + {file = "xxhash-3.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9fd28a9da300e64e434cfc96567a8387d9a96e824a9be1452a1e7248b7763b78"}, + {file = "xxhash-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6066d88c9329ab230e18998daec53d819daeee99d003955c8db6fc4971b45ca3"}, + {file = "xxhash-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93805bc3233ad89abf51772f2ed3355097a5dc74e6080de19706fc447da99cd3"}, + {file = "xxhash-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:64da57d5ed586ebb2ecdde1e997fa37c27fe32fe61a656b77fabbc58e6fbff6e"}, + {file = "xxhash-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a97322e9a7440bf3c9805cbaac090358b43f650516486746f7fa482672593df"}, + {file = "xxhash-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bbe750d512982ee7d831838a5dee9e9848f3fb440e4734cca3f298228cc957a6"}, + {file = "xxhash-3.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:fd79d4087727daf4d5b8afe594b37d611ab95dc8e29fe1a7517320794837eb7d"}, + {file = "xxhash-3.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:743612da4071ff9aa4d055f3f111ae5247342931dedb955268954ef7201a71ff"}, + {file = "xxhash-3.4.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:b41edaf05734092f24f48c0958b3c6cbaaa5b7e024880692078c6b1f8247e2fc"}, + {file = "xxhash-3.4.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:a90356ead70d715fe64c30cd0969072de1860e56b78adf7c69d954b43e29d9fa"}, + {file = "xxhash-3.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ac56eebb364e44c85e1d9e9cc5f6031d78a34f0092fea7fc80478139369a8b4a"}, + {file = "xxhash-3.4.1-cp312-cp312-win32.whl", hash = "sha256:911035345932a153c427107397c1518f8ce456f93c618dd1c5b54ebb22e73747"}, + {file = "xxhash-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:f31ce76489f8601cc7b8713201ce94b4bd7b7ce90ba3353dccce7e9e1fee71fa"}, + {file = "xxhash-3.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:b5beb1c6a72fdc7584102f42c4d9df232ee018ddf806e8c90906547dfb43b2da"}, + {file = "xxhash-3.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6d42b24d1496deb05dee5a24ed510b16de1d6c866c626c2beb11aebf3be278b9"}, + {file = "xxhash-3.4.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b685fab18876b14a8f94813fa2ca80cfb5ab6a85d31d5539b7cd749ce9e3624"}, + {file = "xxhash-3.4.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:419ffe34c17ae2df019a4685e8d3934d46b2e0bbe46221ab40b7e04ed9f11137"}, + {file = "xxhash-3.4.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0e041ce5714f95251a88670c114b748bca3bf80cc72400e9f23e6d0d59cf2681"}, + {file = "xxhash-3.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc860d887c5cb2f524899fb8338e1bb3d5789f75fac179101920d9afddef284b"}, + {file = "xxhash-3.4.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:312eba88ffe0a05e332e3a6f9788b73883752be63f8588a6dc1261a3eaaaf2b2"}, + {file = "xxhash-3.4.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:e01226b6b6a1ffe4e6bd6d08cfcb3ca708b16f02eb06dd44f3c6e53285f03e4f"}, + {file = "xxhash-3.4.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9f3025a0d5d8cf406a9313cd0d5789c77433ba2004b1c75439b67678e5136537"}, + {file = "xxhash-3.4.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:6d3472fd4afef2a567d5f14411d94060099901cd8ce9788b22b8c6f13c606a93"}, + {file = "xxhash-3.4.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:43984c0a92f06cac434ad181f329a1445017c33807b7ae4f033878d860a4b0f2"}, + {file = "xxhash-3.4.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a55e0506fdb09640a82ec4f44171273eeabf6f371a4ec605633adb2837b5d9d5"}, + {file = "xxhash-3.4.1-cp37-cp37m-win32.whl", hash = "sha256:faec30437919555b039a8bdbaba49c013043e8f76c999670aef146d33e05b3a0"}, + {file = "xxhash-3.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:c9e1b646af61f1fc7083bb7b40536be944f1ac67ef5e360bca2d73430186971a"}, + {file = "xxhash-3.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:961d948b7b1c1b6c08484bbce3d489cdf153e4122c3dfb07c2039621243d8795"}, + {file = "xxhash-3.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:719a378930504ab159f7b8e20fa2aa1896cde050011af838af7e7e3518dd82de"}, + {file = "xxhash-3.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74fb5cb9406ccd7c4dd917f16630d2e5e8cbbb02fc2fca4e559b2a47a64f4940"}, + {file = "xxhash-3.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5dab508ac39e0ab988039bc7f962c6ad021acd81fd29145962b068df4148c476"}, + {file = "xxhash-3.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c59f3e46e7daf4c589e8e853d700ef6607afa037bfad32c390175da28127e8c"}, + {file = "xxhash-3.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cc07256eff0795e0f642df74ad096f8c5d23fe66bc138b83970b50fc7f7f6c5"}, + {file = "xxhash-3.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e9f749999ed80f3955a4af0eb18bb43993f04939350b07b8dd2f44edc98ffee9"}, + {file = "xxhash-3.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7688d7c02149a90a3d46d55b341ab7ad1b4a3f767be2357e211b4e893efbaaf6"}, + {file = "xxhash-3.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a8b4977963926f60b0d4f830941c864bed16aa151206c01ad5c531636da5708e"}, + {file = "xxhash-3.4.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:8106d88da330f6535a58a8195aa463ef5281a9aa23b04af1848ff715c4398fb4"}, + {file = "xxhash-3.4.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4c76a77dbd169450b61c06fd2d5d436189fc8ab7c1571d39265d4822da16df22"}, + {file = "xxhash-3.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:11f11357c86d83e53719c592021fd524efa9cf024dc7cb1dfb57bbbd0d8713f2"}, + {file = "xxhash-3.4.1-cp38-cp38-win32.whl", hash = "sha256:0c786a6cd74e8765c6809892a0d45886e7c3dc54de4985b4a5eb8b630f3b8e3b"}, + {file = "xxhash-3.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:aabf37fb8fa27430d50507deeab2ee7b1bcce89910dd10657c38e71fee835594"}, + {file = "xxhash-3.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6127813abc1477f3a83529b6bbcfeddc23162cece76fa69aee8f6a8a97720562"}, + {file = "xxhash-3.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ef2e194262f5db16075caea7b3f7f49392242c688412f386d3c7b07c7733a70a"}, + {file = "xxhash-3.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71be94265b6c6590f0018bbf73759d21a41c6bda20409782d8117e76cd0dfa8b"}, + {file = "xxhash-3.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10e0a619cdd1c0980e25eb04e30fe96cf8f4324758fa497080af9c21a6de573f"}, + {file = "xxhash-3.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fa122124d2e3bd36581dd78c0efa5f429f5220313479fb1072858188bc2d5ff1"}, + {file = "xxhash-3.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17032f5a4fea0a074717fe33477cb5ee723a5f428de7563e75af64bfc1b1e10"}, + {file = "xxhash-3.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca7783b20e3e4f3f52f093538895863f21d18598f9a48211ad757680c3bd006f"}, + {file = "xxhash-3.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d77d09a1113899fad5f354a1eb4f0a9afcf58cefff51082c8ad643ff890e30cf"}, + {file = "xxhash-3.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:21287bcdd299fdc3328cc0fbbdeaa46838a1c05391264e51ddb38a3f5b09611f"}, + {file = "xxhash-3.4.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:dfd7a6cc483e20b4ad90224aeb589e64ec0f31e5610ab9957ff4314270b2bf31"}, + {file = "xxhash-3.4.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:543c7fcbc02bbb4840ea9915134e14dc3dc15cbd5a30873a7a5bf66039db97ec"}, + {file = "xxhash-3.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:fe0a98d990e433013f41827b62be9ab43e3cf18e08b1483fcc343bda0d691182"}, + {file = "xxhash-3.4.1-cp39-cp39-win32.whl", hash = "sha256:b9097af00ebf429cc7c0e7d2fdf28384e4e2e91008130ccda8d5ae653db71e54"}, + {file = "xxhash-3.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:d699b921af0dcde50ab18be76c0d832f803034d80470703700cb7df0fbec2832"}, + {file = "xxhash-3.4.1-cp39-cp39-win_arm64.whl", hash = "sha256:2be491723405e15cc099ade1280133ccfbf6322d2ef568494fb7d07d280e7eee"}, + {file = "xxhash-3.4.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:431625fad7ab5649368c4849d2b49a83dc711b1f20e1f7f04955aab86cd307bc"}, + {file = "xxhash-3.4.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc6dbd5fc3c9886a9e041848508b7fb65fd82f94cc793253990f81617b61fe49"}, + {file = "xxhash-3.4.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3ff8dbd0ec97aec842476cb8ccc3e17dd288cd6ce3c8ef38bff83d6eb927817"}, + {file = "xxhash-3.4.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef73a53fe90558a4096e3256752268a8bdc0322f4692ed928b6cd7ce06ad4fe3"}, + {file = "xxhash-3.4.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:450401f42bbd274b519d3d8dcf3c57166913381a3d2664d6609004685039f9d3"}, + {file = "xxhash-3.4.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a162840cf4de8a7cd8720ff3b4417fbc10001eefdd2d21541a8226bb5556e3bb"}, + {file = "xxhash-3.4.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b736a2a2728ba45017cb67785e03125a79d246462dfa892d023b827007412c52"}, + {file = "xxhash-3.4.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d0ae4c2e7698adef58710d6e7a32ff518b66b98854b1c68e70eee504ad061d8"}, + {file = "xxhash-3.4.1-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6322c4291c3ff174dcd104fae41500e75dad12be6f3085d119c2c8a80956c51"}, + {file = "xxhash-3.4.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:dd59ed668801c3fae282f8f4edadf6dc7784db6d18139b584b6d9677ddde1b6b"}, + {file = "xxhash-3.4.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:92693c487e39523a80474b0394645b393f0ae781d8db3474ccdcead0559ccf45"}, + {file = "xxhash-3.4.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4603a0f642a1e8d7f3ba5c4c25509aca6a9c1cc16f85091004a7028607ead663"}, + {file = "xxhash-3.4.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fa45e8cbfbadb40a920fe9ca40c34b393e0b067082d94006f7f64e70c7490a6"}, + {file = "xxhash-3.4.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:595b252943b3552de491ff51e5bb79660f84f033977f88f6ca1605846637b7c6"}, + {file = "xxhash-3.4.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:562d8b8f783c6af969806aaacf95b6c7b776929ae26c0cd941d54644ea7ef51e"}, + {file = "xxhash-3.4.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:41ddeae47cf2828335d8d991f2d2b03b0bdc89289dc64349d712ff8ce59d0647"}, + {file = "xxhash-3.4.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c44d584afdf3c4dbb3277e32321d1a7b01d6071c1992524b6543025fb8f4206f"}, + {file = "xxhash-3.4.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd7bddb3a5b86213cc3f2c61500c16945a1b80ecd572f3078ddbbe68f9dabdfb"}, + {file = "xxhash-3.4.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9ecb6c987b62437c2f99c01e97caf8d25660bf541fe79a481d05732e5236719c"}, + {file = "xxhash-3.4.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:696b4e18b7023527d5c50ed0626ac0520edac45a50ec7cf3fc265cd08b1f4c03"}, + {file = "xxhash-3.4.1.tar.gz", hash = "sha256:0379d6cf1ff987cd421609a264ce025e74f346e3e145dd106c0cc2e3ec3f99a9"}, ] [[package]] @@ -5132,20 +4962,20 @@ multidict = ">=4.0" [[package]] name = "zipp" -version = "3.16.2" +version = "3.17.0" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.16.2-py3-none-any.whl", hash = "sha256:679e51dd4403591b2d6838a48de3d283f3d188412a9782faadf845f298736ba0"}, - {file = "zipp-3.16.2.tar.gz", hash = "sha256:ebc15946aa78bd63458992fc81ec3b6f7b1e92d51c35e6de1c3804e73b799147"}, + {file = "zipp-3.17.0-py3-none-any.whl", hash = "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31"}, + {file = "zipp-3.17.0.tar.gz", hash = "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] [metadata] lock-version = "2.0" -python-versions = "^3.8" -content-hash = "d70c0dbbce4fab0587a87febf4438d7df0d7d46d4700d06a74012aed77e9307b" +python-versions = ">=3.9,<3.13" +content-hash = "2bf6f97721a25934da3330f640d1826bb556fe75eb10a95f9c0d948475dbbbaa" diff --git a/pyproject.toml b/pyproject.toml index 882734a..0134bbd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,3 +1,7 @@ +[build-system] +requires = [ "poetry-core" ] +build-backend = "poetry.core.masonry.api" + [tool.poetry] name = "energizer" version = "0.1.0" @@ -8,72 +12,98 @@ readme = "README.md" packages = [ { include = "energizer" } ] [tool.poetry.dependencies] -python = "^3.8" -lightning = "^2.0.6" -transformers = "^4.31.0" -datasets = "^2.14.1" +python = ">=3.9,<3.13" +lightning = "^2.1.0" +transformers = "^4.34.0" +datasets = "^2.14.5" torch-optimizer = "^0.3.0" -srsly = "^2.4.5" +srsly = "^2.4.8" hnswlib = { git = "https://github.com/nmslib/hnswlib.git" } torch-tb-profiler = "^0.4.1" -tensorboard = "^2.12.0" +tensorboard = "^2.14.1" tbparse = "^0.0.7" wandb = "^0.15.4" -pandas = "^2.0.3" +pandas = "^2.1.1" tabulate = "^0.9.0" -openpyxl = "^3.1.1" -tqdm = "^4.65.0" -scikit-learn = "^1.3.0" +openpyxl = "^3.1.2" +tqdm = "^4.66.1" +scikit-learn = "^1.3.1" +bitsandbytes = "^0.41.1" [tool.poetry.group.dev] optional = true [tool.poetry.group.dev.dependencies] -black = "^22.12.0" nbqa = "^1.6.1" ipykernel = "^6.20.2" ipywidgets = "7.7.1" -isort = "^5.11.4" pytest = "^7.2.1" nvitop = "^1.0.0" +ruff = "^0.1.3" +torchfix = "^0.1.1" +[tool.ruff] +# Exclude a variety of commonly ignored directories. +exclude = [ +".bzr", +".direnv", +".eggs", +".git", +".git-rewrite", +".hg", +".mypy_cache", +".nox", +".pants.d", +".pytype", +".ruff_cache", +".svn", +".tox", +".venv", +"__pypackages__", +"_build", +"buck-out", +"build", +"dist", +"node_modules", +"venv", +] + +extend-include = [ "*.ipynb" ] -[tool.black] +# Same as Black. line-length = 120 -skip-string-normalization = false -target-version = [ 'py38' ] -include = '\.pyi?$' -exclude = ''' -/( - \.eggs - | \.git - | \.hg - | \.mypy_cache - | \.tox - | \.venv - | _build - | buck-out - | build - | dist -)/ -''' -[tool.ruff] -line-length = 120 -src = [ "src", "test" ] -target-version = "py38" +# Assume Python 3.10 +target-version = "py310" +[tool.ruff.mccabe] +# Unlike Flake8, default to a complexity level of 10. +max-complexity = 10 -[tool.isort] -multi_line_output = 3 -include_trailing_comma = true -force_grid_wrap = 0 -use_parentheses = true -ensure_newline_before_comments = true -line_length = 120 -skip_gitignore = true +[tool.ruff.format] +quote-style = "double" +indent-style = "space" +skip-magic-trailing-comma = true -[build-system] -requires = [ "poetry-core" ] -build-backend = "poetry.core.masonry.api" + +[tool.ruff.isort] +combine-as-imports = true +split-on-trailing-comma = false + + +[tool.ruff.lint] +select = [ +# pycodestyle +"E", +# Pyflakes +"F", +# pyupgrade +"UP", +# flake8-bugbear +"B", +# flake8-simplify +"SIM", +# isort +"I", +] diff --git a/setup.cfg b/setup.cfg deleted file mode 100644 index 211da2c..0000000 --- a/setup.cfg +++ /dev/null @@ -1,94 +0,0 @@ -[flake8] -max-line-length = 120 -max-complexity = 18 -ignore = E203, E266, W503, D104, D100, D105, D107, D101, D102 -docstring-convention = google -per-file-ignores = __init__.py:F401,D107 -exclude = .git, - __pycache__, - setup.py, - build, - dist, - docs, - releases, - .venv, - .tox, - .mypy_cache, - .pytest_cache, - .vscode, - .github, - # By default test codes will be linted. - tests - -[mypy] -ignore_missing_imports = True - -[coverage:run] -# uncomment the following to omit files during running -#omit = -[coverage:report] -exclude_lines = - pragma: no cover - def __repr__ - if self.debug: - if settings.DEBUG - raise AssertionError - raise NotImplementedError - if 0: - if __name__ == .__main__.: - def main - -[tox:tox] -isolated_build = true -envlist = py38, py39, format, lint, build - -[gh-actions] -python = - 3.9: py39, format, lint, build - 3.8: py38, format, lint, build - -[testenv] -allowlist_externals = pytest -extras = - test - text - vision -passenv = * -setenv = - PYTHONPATH = {toxinidir} - PYTHONWARNINGS = ignore -commands = - pytest --cov=energizer --cov-branch --cov-report=xml --cov-report=term-missing tests - -[testenv:format] -allowlist_externals = - isort - black -extras = - test -commands = - isort energizer tests - black energizer tests - -[testenv:lint] -allowlist_externals = - flake8 - # mypy -extras = - test -commands = - flake8 energizer - # mypy energizer - -[testenv:build] -allowlist_externals = - poetry - mkdocs - twine -extras = - doc - dev -commands = - poetry build - mkdocs build - twine check dist/* diff --git a/tests/__init__.py b/tests/__init__.py deleted file mode 100644 index 8709fe4..0000000 --- a/tests/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Unit test package for energizer.""" diff --git a/tests/conftest.py b/tests/conftest.py deleted file mode 100644 index c82d2d8..0000000 --- a/tests/conftest.py +++ /dev/null @@ -1,56 +0,0 @@ -import datasets -import pytest -from torch import nn -from torch.utils.data import DataLoader -from transformers import default_data_collator - -from tests.utils import BoringModel, RandomSupervisedDataset - - -@pytest.fixture -def mock_dataset(): - return RandomSupervisedDataset() - - -@pytest.fixture -def mock_hf_dataset(): - dataset = RandomSupervisedDataset() - return datasets.Dataset.from_dict({"inputs": dataset.x, "labels": dataset.y}) - - -@pytest.fixture -def dataloader(request): - return request.getfixturevalue(request.param) - - -@pytest.fixture -def dataloader(mock_dataset): - return DataLoader(mock_dataset, batch_size=10) - - -@pytest.fixture -def mock_hf_dataloader(mock_hf_dataset): - return DataLoader(mock_hf_dataset, batch_size=10, collate_fn=default_data_collator) - - -@pytest.fixture -def dataloader_arg(request): - return request.getfixturevalue(request.param) - - -@pytest.fixture -def boring_model(): - return BoringModel - - -@pytest.fixture -def dropout_module(): - module = nn.Sequential( - nn.Linear(1, 1), - nn.Dropout(0.1), - nn.Dropout2d(0.2), - nn.Dropout3d(0.3), - nn.AlphaDropout(0.4), - nn.FeatureAlphaDropout(0.5), - ) - return module diff --git a/tests/unit/data/test_datamodule.py b/tests/unit/data/test_datamodule.py deleted file mode 100644 index eb0dc79..0000000 --- a/tests/unit/data/test_datamodule.py +++ /dev/null @@ -1,132 +0,0 @@ -import pytest - -from energizer.datastores.datamodule import ActiveDataModule - - -def test_len(dataloader): - """Test that measures of length are consistent.""" - # no instances - dm = ActiveDataModule(train_dataloader=dataloader) - assert len(dataloader.dataset) == dm.train_size + dm.pool_size - assert len(dataloader.dataset) == dm.total_data_size - pool_size = dm.pool_size - - dm.label(0) - assert len(dataloader.dataset) == dm.train_size + dm.pool_size - assert len(dataloader.dataset) == dm.total_data_size - assert dm.train_size == 1 - assert dm.pool_size == pool_size - 1 - - -def test_indexing(dataloader): - """Test that ActiveDataModule is not indexable directly.""" - dm = ActiveDataModule(train_dataloader=dataloader) - with pytest.raises(TypeError): - assert dm[0] - - -def test_labelling(dataloader): - """Test that labelling changes all the required states.""" - dm = ActiveDataModule(train_dataloader=dataloader) - len_dataset = len(dataloader.dataset) - - with pytest.raises(AssertionError): - dm.label("0") - - with pytest.raises(ValueError): - dm.label(list(range(len_dataset + 100))) - - with pytest.raises(ValueError): - dm.label(int(1e6)) - - assert dm.last_labelling_step == 0 - assert dm.train_size == 0 - assert dm.pool_size == len_dataset - assert dm.has_labelled_data is False - assert dm.has_unlabelled_data is True - assert dm.train_dataset.indices == [] - - for i in range(1, len_dataset + 1): - dm.label(0) # always label the first instance in the pool - - assert dm.last_labelling_step == i - assert dm.train_size == i - assert dm.pool_size == len_dataset - dm.train_size - assert dm.has_labelled_data is True - if i < len_dataset: - assert dm.has_unlabelled_data is True - else: - assert dm.has_unlabelled_data is False - assert dm.train_dataset.indices == list(range(i)) - - assert dm.last_labelling_step == len_dataset - assert dm.train_size == len_dataset - assert dm.pool_size == len_dataset - dm.train_size - assert dm.has_labelled_data is True - assert dm.has_unlabelled_data is False - assert dm.train_dataset.indices == list(range(len_dataset)) - - -def test_labelling_multiple_indices(dataloader): - """Test labelling multiple instances at once.""" - dm = ActiveDataModule(train_dataloader=dataloader) - pool_ids = [0, 8, 7] # they are the first to be labelled so correspond to ids in oracle - dm.label(pool_ids) - - assert dm.train_dataset.indices == sorted(pool_ids) - - -def test_labelling_duplicates(dataloader): - """Test that labelling duplicate indices results in a single instance to be labelled.""" - - # check behaviour when batch of indices contains - dm = ActiveDataModule(train_dataloader=dataloader) - pool_ids = [0, 0] # they are the first to be labelled so correspond to ids in oracle - dm.label(pool_ids) - assert dm.train_size == 1 - - -def test_reset_at_labelling_step(dataloader): - """Test that resetting the labelling steps sets the correct states.""" - dm = ActiveDataModule(train_dataloader=dataloader) - len_dataset = len(dataloader.dataset) - - dm.label(0) # label first - assert dm.last_labelling_step == 1 - assert dm.train_size == 1 - assert dm.pool_size == len_dataset - dm.train_size - assert dm.has_labelled_data is True - assert dm.has_unlabelled_data is True - assert dm.train_dataset.indices == [0] - - dm.label(list(range(len_dataset - 1))) # label the rest - assert dm.train_size == len_dataset - assert dm.pool_size == len_dataset - dm.train_size - assert dm.has_labelled_data is True - assert dm.has_unlabelled_data is False - assert dm.train_dataset.indices == list(range(len_dataset)) - - dm.reset_at_labelling_step(1) # go back to when there was one instance - assert dm.train_size == 1 - assert dm.pool_size == len_dataset - dm.train_size - assert dm.has_labelled_data is True - assert dm.has_unlabelled_data is True - assert dm.train_dataset.indices == [0] - - dm.reset_at_labelling_step(0) # go back to when there was nothing labelled - assert dm.last_labelling_step == 2 - assert dm.train_size == 0 - assert dm.pool_size == len_dataset - dm.train_size - assert dm.has_labelled_data is False - assert dm.has_unlabelled_data is True - assert dm.train_dataset.indices == [] - - dm.reset_at_labelling_step(dm.last_labelling_step) # reset to the last step - assert dm.train_size == len_dataset - assert dm.pool_size == len_dataset - dm.train_size - assert dm.has_labelled_data is True - assert dm.has_unlabelled_data is False - assert dm.train_dataset.indices == list(range(len_dataset)) - - with pytest.raises(ValueError): - assert dm.reset_at_labelling_step(100) diff --git a/tests/unit/mcdropout/test_replacement.py b/tests/unit/mcdropout/test_replacement.py deleted file mode 100644 index eb01702..0000000 --- a/tests/unit/mcdropout/test_replacement.py +++ /dev/null @@ -1,58 +0,0 @@ -from typing import List, Tuple - -import pytest -from pytorch_lightning.utilities.exceptions import MisconfigurationException -from torch import nn - -from energizer.utilities.mcdropout import replace_dropout_layers, replace_energizer_dropout_layers - - -def get_dropout_modules(module: nn.Module) -> List[Tuple[str, float]]: - return [ - (m.__class__.__name__, m.p) for _, m in module.named_modules() if isinstance(m, nn.modules.dropout._DropoutNd) - ] - - -def test_replace_dropout(dropout_module): - """Checks that replacement of layers works. - - In particular, it checks that the layer type is change but the original - probabilty for each layer is preserved. - """ - - original_target = get_dropout_modules(dropout_module) - new_target = [(f"MC{m}", p) for (m, p) in original_target] - - # silly check to see whether it works - assert get_dropout_modules(dropout_module) == original_target - - # now replace torch dropout with energizer dropout - replace_dropout_layers(dropout_module) - assert get_dropout_modules(dropout_module) == new_target - - # now replace energizer dropout with torch dropout - replace_energizer_dropout_layers(dropout_module) - assert get_dropout_modules(dropout_module) == original_target - - # change probability - replace_dropout_layers(dropout_module, 0.9) - assert get_dropout_modules(dropout_module) == [(m, 0.9) for (m, _) in new_target] - - # change probability - replace_energizer_dropout_layers(dropout_module, 0.9) - assert get_dropout_modules(dropout_module) == [(m, 0.9) for (m, _) in original_target] - - -def test_consistent_inputs(dropout_module): - # checks inputs - with pytest.raises(MisconfigurationException): - replace_dropout_layers(dropout_module, consistent=True) - - with pytest.raises(AssertionError): - replace_dropout_layers(dropout_module, consistent=True, num_inference_iters=10, seeds=[0]) - - -def test_consistent_dropout(dropout_module): - replace_dropout_layers(dropout_module, consistent=True, num_inference_iters=10) - - # outputs = diff --git a/tests/utils.py b/tests/utils.py deleted file mode 100644 index a9d76ec..0000000 --- a/tests/utils.py +++ /dev/null @@ -1,71 +0,0 @@ -from typing import Dict, Tuple, Union - -import torch -from pytorch_lightning import LightningModule -from torch import Tensor -from torch.utils.data import Dataset - -NUM_CLASSES = 2 -NUM_FEATURES = 100 - - -class RandomSupervisedDataset(Dataset): - """Generate a dummy dataset with inputs and labels.""" - - def __init__( - self, num_classes: int = NUM_CLASSES, num_features: int = NUM_FEATURES, num_samples: int = 250 - ) -> None: - """ - It generates a dataset where each instance is a Tuple[Tensor, Tensor] - where the first element is a tensor of inputs of size `(num_samples, num_features)` - and the second element is a tensor of labels of size `(num_samples,)` and `num_labels` - unique elements. - - Args: - num_classes (int): The number of classes. - num_features (int): The number of features. - num_samples (int): The number of instances. - """ - self.len = num_samples - self.x = torch.randn(size=(num_samples, num_features)) - self.y = torch.randint(low=0, high=num_classes, size=(num_samples,)) - - def __getitem__(self, idx: int) -> Tuple[Tensor, Tensor]: - return self.x[idx], self.y - - def __len__(self): - return self.len - - -class BoringModel(LightningModule): - """A simple LightningModule with a linear layer.""" - - def __init__( - self, backbone: torch.nn.Module, num_classes: int = NUM_CLASSES, num_features: int = NUM_FEATURES - ) -> None: - super().__init__() - self.backbone = backbone - self.head = torch.nn.Linear(num_features, num_classes) - self.loss = torch.nn.CrossEntropyLoss() - - def forward(self, x: Tensor) -> Tensor: - return self.head(self.backbone(x)) - - def step(self, batch: Union[Tuple[Tensor, Tensor], Dict[str, Tensor]]) -> Tensor: - if isinstance(batch, dict): - batch = (batch["inputs"], batch["labels"]) - inputs, targets = batch - preds = self(inputs) - return self.loss(preds, targets) - - def training_step(self, batch, *args, **kwargs) -> Dict[str, Tensor]: - return {"loss": self.step(batch)} - - def validation_step(self, batch, *args, **kwargs) -> Dict[str, Tensor]: - return {"loss": self.step(batch)} - - def test_step(self, batch, *args, **kwargs) -> Dict[str, Tensor]: - return {"loss": self.step(batch)} - - def configure_optimizers(self): - return torch.optim.SGD(self.layer.parameters(), lr=0.01)