From 2ce3c97badd539985b371a428b3ad582b092eb1a Mon Sep 17 00:00:00 2001 From: Thomas van Dongen Date: Thu, 10 Oct 2024 19:18:39 +0200 Subject: [PATCH 01/30] Bump version (#74) * Bumped version * Bumped version * Bumped version --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 61ef3a5..ae7af19 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ name = "model2vec" description = "Distill a Small Fast Model from any Sentence Transformer" readme = { file = "README.md", content-type = "text/markdown" } license = { file = "LICENSE" } -version = "0.2.3" +version = "0.2.4" requires-python = ">=3.10" authors = [{ name = "Stéphan Tulkens", email = "stephantul@gmail.com"}, {name = "Thomas van Dongen", email = "thomas123@live.nl"}] From 84570b680b7ee49aeb0bb8267a6612b8f42b6af7 Mon Sep 17 00:00:00 2001 From: Thomas van Dongen Date: Fri, 11 Oct 2024 15:30:29 +0200 Subject: [PATCH 02/30] fix: Fix token type ids not supported (#77) * Fixed token type ids not supported for every model error * Updated test * Updated test * Changed to inspect --- model2vec/distill/inference.py | 24 ++++++++++++++++-------- tests/conftest.py | 6 +++++- uv.lock | 2 +- 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/model2vec/distill/inference.py b/model2vec/distill/inference.py index 6459336..e480cbf 100644 --- a/model2vec/distill/inference.py +++ b/model2vec/distill/inference.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- +import inspect import logging from pathlib import Path from typing import Protocol @@ -127,20 +128,27 @@ def create_output_embeddings_from_model_name( for batch_idx in tqdm(range(0, len(stacked), _DEFAULT_BATCH_SIZE)): batch = stacked[batch_idx : batch_idx + _DEFAULT_BATCH_SIZE].to(model.device) with torch.no_grad(): - # NOTE: we create these masks because nomic embed requires them. - # Normally, we could set them to None - token_type_ids = torch.zeros_like(batch) attention_mask = torch.ones_like(batch) - encoded: BaseModelOutputWithPoolingAndCrossAttentions = model( - input_ids=batch.to(device), attention_mask=attention_mask, token_type_ids=token_type_ids - ) - out: torch.Tensor = encoded.last_hidden_state + # Prepare model inputs + model_inputs = {"input_ids": batch.to(device), "attention_mask": attention_mask} + + # Add token_type_ids only if the model supports it + if "token_type_ids" in inspect.getfullargspec(model.forward).args: + model_inputs["token_type_ids"] = torch.zeros_like(batch) + + # Perform the forward pass + encoded_output: BaseModelOutputWithPoolingAndCrossAttentions = model(**model_inputs) + out: torch.Tensor = encoded_output.last_hidden_state # NOTE: If the dtype is bfloat 16, we convert to float32, # because numpy does not suport bfloat16 # See here: https://github.com/numpy/numpy/issues/19808 if out.dtype == torch.bfloat16: out = out.float() - intermediate_weights.append(out[:, 1].cpu().numpy()) + + # Add the output to the intermediate weights + intermediate_weights.append(out[:, 1].detach().cpu().numpy()) + + # Concatenate the intermediate weights out_weights = np.concatenate(intermediate_weights) return tokenizer.convert_ids_to_tokens(ids), out_weights diff --git a/tests/conftest.py b/tests/conftest.py index ae83008..f7d2222 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -44,7 +44,7 @@ def to(self, device: str) -> MockPreTrainedModel: self.device = device return self - def __call__(self, *args: Any, **kwargs: Any) -> Any: + def forward(self, *args: Any, **kwargs: Any) -> Any: # Simulate a last_hidden_state output for a transformer model batch_size, seq_length = kwargs["input_ids"].shape # Return a tensor of shape (batch_size, seq_length, 768) @@ -56,6 +56,10 @@ def __call__(self, *args: Any, **kwargs: Any) -> Any: }, ) + def __call__(self, *args: Any, **kwargs: Any) -> Any: + # Simply call the forward method to simulate the same behavior as transformers models + return self.forward(*args, **kwargs) + return MockPreTrainedModel() diff --git a/uv.lock b/uv.lock index 73c7d3b..30ee1f4 100644 --- a/uv.lock +++ b/uv.lock @@ -433,7 +433,7 @@ wheels = [ [[package]] name = "model2vec" -version = "0.2.2" +version = "0.2.4" source = { editable = "." } dependencies = [ { name = "click" }, From 1836fefe5225801078b5f295765f5344e8895cbd Mon Sep 17 00:00:00 2001 From: Thomas van Dongen Date: Fri, 11 Oct 2024 20:22:57 +0200 Subject: [PATCH 03/30] docs: Add deduplication tutorial (#72) * WIP * Updated deduplication notebook * Updated readme * Updated notebook * Added some baselines * Added some baselines * Added some baselines * Added train test bleed example * Added train test bleed example * Added train test bleed example * Added train test bleed example * Updates * Updates * Updated print --- tutorials/README.md | 3 +- tutorials/semantic_deduplication.ipynb | 552 +++++++++++++++++++++++++ 2 files changed, 554 insertions(+), 1 deletion(-) create mode 100644 tutorials/semantic_deduplication.ipynb diff --git a/tutorials/README.md b/tutorials/README.md index 642935b..2331d2f 100644 --- a/tutorials/README.md +++ b/tutorials/README.md @@ -11,4 +11,5 @@ This is a list of all our tutorials. They are all self-contained ipython noteboo | | what? | Link | |--------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------| -| **Recipe search** | Learn how to do lightning-fast semantic search by distilling a small model. Compare a really tiny model to a larger with one with a better vocabulary. Learn what Fattoush is (delicious). | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/minishlab/model2vec/blob/master/tutorials/recipe_search.ipynb) | +| **Recipe search** | Learn how to do lightning-fast semantic search by distilling a small model. Compare a really tiny model to a larger with one with a better vocabulary. Learn what Fattoush is (delicious). | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/minishlab/model2vec/blob/master/tutorials/recipe_search.ipynb) | +| **Semantic deduplication** | Learn how Model2Vec can be used to detect duplicate texts. Clean your dataset efficiently by finding both exact and semantic duplicates. Detect train-test leakage. | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/minishlab/model2vec/blob/master/tutorials/semantic_deduplication.ipynb) | diff --git a/tutorials/semantic_deduplication.ipynb b/tutorials/semantic_deduplication.ipynb new file mode 100644 index 0000000..82c0b62 --- /dev/null +++ b/tutorials/semantic_deduplication.ipynb @@ -0,0 +1,552 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Semantic Deduplication with Model2Vec**\n", + "\n", + "In this tutorial, we’ll explore how Model2Vec can help identify duplicates in text data that traditional exact matching would miss. While exact matching works for identical texts, it fails to detect near-duplicates—documents that may differ slightly in wording but convey the same meaning. Using Model2Vec, we embed documents into vectors and measure their similarity. This allows us to catch both exact and semantic duplicates, improving the quality of our dataset. With Model2Vec’s speed and efficiency, we can very efficiently perform deduplication on large datasets, ensuring cleaner, more robust data for downstream tasks. Additionally, we will use Model2Vec to detect train-test overlap, ensuring our models are not overfitting." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!pip install datasets model2vec reach numpy wordllama tqdm datasketch\n", + "\n", + "from difflib import ndiff\n", + "from time import perf_counter\n", + "\n", + "from datasets import load_dataset\n", + "from datasketch import MinHash, MinHashLSH\n", + "import numpy as np\n", + "from model2vec import StaticModel\n", + "from reach import Reach\n", + "from tqdm import tqdm\n", + "from wordllama import WordLlama" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Loading data and model**\n", + "\n", + "We will use the AG News dataset and the Model2Vec pretrained model for deduplication." + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [], + "source": [ + "# Load the model and dataset\n", + "model = StaticModel.from_pretrained(\"minishlab/M2V_base_output\")\n", + "ds = load_dataset(\"ag_news\")[\"train\"]\n", + "texts = ds['text']" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exact overlap baseline**\n", + "\n", + "We will first try to find exact matches in the dataset as a baseline." + ] + }, + { + "cell_type": "code", + "execution_count": 96, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of deduplicated docs: 120000\n" + ] + } + ], + "source": [ + "seen = set()\n", + "deduplicated_text_indices = []\n", + "\n", + "for i, text in enumerate(texts):\n", + " if text not in seen:\n", + " deduplicated_text_indices.append(i)\n", + " seen.add(text)\n", + "\n", + "print(\"Number of deduplicated docs:\", len(deduplicated_text_indices))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As can be seen, we find no duplicate instances using exact string matching. \n", + "\n", + "**Deduplication using Model2Vec**\n", + "\n", + "Let's now use Model2Vec to embed our documents and identify duplicates." + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 118/118 [00:02<00:00, 45.65it/s]\n" + ] + } + ], + "source": [ + "# Encode texts into embeddings\n", + "embedding_matrix = model.encode(texts, show_progressbar=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [], + "source": [ + "def deduplicate(embedding_matrix: np.ndarray, threshold: float, batch_size: int = 1024) -> tuple[np.ndarray, dict[int, int]]:\n", + " \"\"\"\n", + " Deduplicate embeddings and return the deduplicated indices and a mapping of removed indices to their corresponding original indices.\n", + " \n", + " :param embedding_matrix: The embeddings to deduplicate.\n", + " :param threshold: The similarity threshold to use for deduplication.\n", + " :param batch_size: The batch size to use for similarity computation.\n", + " :return: A tuple containing the deduplicated indices and a dictionary mapping removed indices to original indices.\n", + " \"\"\"\n", + " reach = Reach(vectors=embedding_matrix, items=[str(i) for i in range(len(embedding_matrix))])\n", + " \n", + " # Use a set for deduplicated indices and keep track of duplicates\n", + " deduplicated_indices = set(range(len(embedding_matrix))) # Start with all indices as deduplicated\n", + " duplicate_to_original_mapping = {}\n", + "\n", + " results = reach.nearest_neighbor_threshold(\n", + " embedding_matrix, \n", + " threshold=threshold, \n", + " batch_size=batch_size, \n", + " show_progressbar=True\n", + " )\n", + " \n", + " # Process duplicates\n", + " for i, similar_items in enumerate(tqdm(results)):\n", + " if i not in deduplicated_indices:\n", + " continue # Skip already marked duplicates\n", + "\n", + " # Similar items are returned as (index, score), we are only interested in the index\n", + " similar_indices = [int(item[0]) for item in similar_items if int(item[0]) != i]\n", + " \n", + " # Mark similar documents as duplicates and map them to the original\n", + " for sim_idx in similar_indices:\n", + " if sim_idx in deduplicated_indices:\n", + " deduplicated_indices.remove(sim_idx)\n", + " duplicate_to_original_mapping[sim_idx] = i # Map duplicate to original\n", + "\n", + " return np.array(list(deduplicated_indices)), duplicate_to_original_mapping\n" + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 118/118 [00:25<00:00, 4.64it/s]\n", + "100%|██████████| 120000/120000 [00:00<00:00, 679800.97it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of deduplicated docs: 118769\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "# Deduplicate (with a high threshold)\n", + "deduplicated_indices, duplicate_to_original_mapping = deduplicate(embedding_matrix, threshold=0.99)\n", + "print(f\"Number of deduplicated docs: {len(deduplicated_indices)}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Using Model2Vec, we find > 1000 duplicates with a very high threshold, in < 30 seconds. Now, let's look at a few examples to see if these are indeed duplicates." + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Original text:\n", + "Oil and Economy Cloud Stocks' Outlook (Reuters) Reuters - Soaring crude prices plus worries\\about the economy and the outlook for earnings are expected to\\hang over the stock market next week during the depth of the\\summer doldrums.\n", + "Duplicate text:\n", + "Oil and Economy Cloud Stocks' Outlook (Reuters) Reuters - Soaring crude prices plus worries\\about the economy and the outlook for earnings are expected to\\hang over the stock market this week during the depth of the\\summer doldrums.\n", + "Differences:\n", + "- next + this\n", + "--------------------------------------------------\n", + "Original text:\n", + "Oil and Economy Cloud Stocks' Outlook NEW YORK (Reuters) - Soaring crude prices plus worries about the economy and the outlook for earnings are expected to hang over the stock market next week during the depth of the summer doldrums.\n", + "Duplicate text:\n", + "Oil and Economy Cloud Stocks' Outlook NEW YORK (Reuters) - Soaring crude prices plus worries about the economy and the outlook for earnings are expected to hang over the stock market this week during the depth of the summer doldrums.\n", + "Differences:\n", + "- next + this\n", + "--------------------------------------------------\n", + "Original text:\n", + "Phelps, Thorpe Advance in 200 Freestyle ATHENS, Greece - Michael Phelps took care of qualifying for the Olympic 200-meter freestyle semifinals Sunday, and then found out he had been added to the American team for the evening's 400 freestyle relay final. Phelps' rivals Ian Thorpe and Pieter van den Hoogenband and teammate Klete Keller were faster than the teenager in the 200 free preliminaries...\n", + "Duplicate text:\n", + "Phelps, Thorpe Advance in 200 Freestyle ATHENS, Greece - Michael Phelps took care of qualifying for the Olympic 200-meter freestyle semifinals Sunday, and then found out he had been added to the American team for the evening's 400 freestyle relay final. Phelps' rivals Ian Thorpe and Pieter van den Hoogenband and teammate Klete Keller were faster than the teenager in the 200 free preliminaries...\n", + "Differences:\n", + "\n", + "--------------------------------------------------\n", + "Original text:\n", + "Government Spending Up Sharply Locally Federal procurement spending in the Washington area rose last year at its highest rate since the 1980s, according to a study to be released today, creating tens of thousands of jobs and increasing economic growth disproportionately in Northern Virginia.\n", + "Duplicate text:\n", + "Government Spending Up Sharply Locally Federal procurement spending in the Washington area rose last year at its highest rate since the 1980s, according to a study to be released today, creating tens of thousands of jobs and increasing economic growth disproportionately in Northern Virginia.\n", + "Differences:\n", + "\n", + "--------------------------------------------------\n", + "Original text:\n", + "F.B.I. Goes Knocking for Political Troublemakers The F.B.I. has been questioning demonstrators in an effort to forestall violent protests at the Republican National Convention.\n", + "Duplicate text:\n", + "F.B.I. Goes Knocking for Political Troublemakers The F.B.I. has been questioning demonstrators in an effort to forestall violent protests at the Republican convention.\n", + "Differences:\n", + "- National - Convention. + convention.\n", + "--------------------------------------------------\n" + ] + } + ], + "source": [ + "def display_word_differences(x: str, y: str) -> str:\n", + " diff = ndiff(x.split(), y.split())\n", + " return \" \".join([f\"{word}\" for word in diff if word.startswith(('+', '-'))])\n", + "\n", + "# Show a few duplicates with their originals, highlighting word-level differences\n", + "num_examples = 5\n", + "for duplicate_idx, original_idx in list(duplicate_to_original_mapping.items())[:num_examples]:\n", + " print(f\"Original text:\\n{texts[original_idx]}\")\n", + " print(f\"Duplicate text:\\n{texts[duplicate_idx]}\")\n", + " print(\"Differences:\")\n", + " print(display_word_differences(texts[original_idx], texts[duplicate_idx]))\n", + " print(\"-\" * 50)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The found texts do indeed seem to be duplicates, nice! In a normal workflow where we use Model2Vec to embed our documents, deduplication our training corpus is essentially free. This gives us an easy to use, easy to integrate, fast way to deduplicate.\n", + "\n", + "**Deduplication using WordLlama**\n", + "\n", + "For comparison, let's also try a different library (WordLlama), which also uses static embeddings to deduplicate text data." + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of deduplicated docs: 119128\n", + "Time taken: 42.821428374998504\n" + ] + } + ], + "source": [ + "wl = WordLlama.load()\n", + "\n", + "time = perf_counter()\n", + "deduplicated_docs = wl.deduplicate(texts, threshold=0.99)\n", + "print(f\"Number of deduplicated docs: {len(deduplicated_docs)}\")\n", + "print(f\"Time taken: {perf_counter() - time}\")\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This approach is considerably slower than Model2Vec for encoding + deduplication (43 vs 27 seconds). It also finds less duplicates with the same threshold.\n", + "\n", + "**Deduplication using MinHash**\n", + "\n", + "As a last comparison, let's use MinHash, a common method for deduplication. We will use the datasketch library to find duplicates." + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of deduplicated docs: 118653\n", + "Time taken: 56.46521229199425\n" + ] + } + ], + "source": [ + "def get_minhash(text: str, num_perm: int = 128) -> MinHash:\n", + " m = MinHash(num_perm=num_perm)\n", + " for word in text.split():\n", + " m.update(word.encode('utf8'))\n", + " return m\n", + "\n", + "def deduplicate_with_minhash(texts: list[str], threshold: float = 0.9) -> list[int]:\n", + " \"\"\"\n", + " Deduplicate texts using MinHash and return the indices of unique texts.\n", + "\n", + " :param texts: List of texts to deduplicate.\n", + " :param threshold: Jaccard similarity threshold for considering texts as duplicates.\n", + " :return: List of indices of deduplicated texts.\n", + " \"\"\"\n", + " lsh = MinHashLSH(threshold=threshold)\n", + " deduplicated_text_indices = []\n", + "\n", + " for i, text in enumerate(texts):\n", + " # Generate MinHash for the current text\n", + " minhash = get_minhash(text)\n", + "\n", + " # Check if the MinHash is already in the LSH (i.e., if it is a duplicate)\n", + " if not lsh.query(minhash):\n", + " # If it's not a duplicate, add the MinHash and keep the index\n", + " deduplicated_text_indices.append(i)\n", + " lsh.insert(i, minhash)\n", + "\n", + " return deduplicated_text_indices\n", + "\n", + "\n", + "time = perf_counter()\n", + "deduplicated_text_indices = deduplicate_with_minhash(texts)\n", + "print(f\"Number of deduplicated docs: {len(deduplicated_text_indices)}\")\n", + "print(f\"Time taken: {perf_counter() - time}\")\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Model2Vec is again much faster, with 27 seconds vs 56 seconds for MinHash. The number of found duplicates is roughly the same using the default settings for MinHash.\n", + "\n", + "**Train test leakage detection using Model2Vec**\n", + "\n", + "Now, as a last experiment, let's also embed the test set, and see if there are any duplicates between the training and test set. This is a common issue in NLP, where the test set may contain instances that are also in the training set.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 118/118 [00:02<00:00, 45.36it/s]\n", + "100%|██████████| 8/8 [00:00<00:00, 51.05it/s]\n", + "100%|██████████| 8/8 [00:01<00:00, 5.40it/s]\n", + "100%|██████████| 7600/7600 [00:00<00:00, 901108.42it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of duplicates found between train and test: 138\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "# Load the datasets\n", + "ds_train = load_dataset(\"ag_news\")[\"train\"]\n", + "ds_test = load_dataset(\"ag_news\")[\"test\"]\n", + "\n", + "texts_train = ds_train['text']\n", + "texts_test = ds_test['text']\n", + "\n", + "# Encode texts into embeddings\n", + "embedding_matrix_train = model.encode(texts_train, show_progressbar=True)\n", + "embedding_matrix_test = model.encode(texts_test, show_progressbar=True)\n", + "\n", + "def deduplicate_across_datasets(embedding_matrix_1: np.ndarray, embedding_matrix_2: np.ndarray, threshold: float, batch_size: int = 1024) -> tuple[list[int], dict[int, int]]:\n", + " \"\"\"\n", + " Deduplicate embeddings across two datasets and return the indices of duplicates between them.\n", + " \n", + " :param embedding_matrix_1: The embeddings of the first dataset (e.g., train).\n", + " :param embedding_matrix_2: The embeddings of the second dataset (e.g., test).\n", + " :param threshold: The similarity threshold to use for deduplication.\n", + " :param batch_size: The batch size to use for similarity computation.\n", + " :return: A tuple containing the duplicate indices and a dictionary mapping removed indices in the second dataset to their corresponding indices in the first dataset.\n", + " \"\"\"\n", + " reach = Reach(vectors=embedding_matrix_1, items=[str(i) for i in range(len(embedding_matrix_1))])\n", + "\n", + " # Keep track of duplicates in the second dataset\n", + " duplicate_indices_in_test = []\n", + " duplicate_to_original_mapping = {}\n", + "\n", + " # Find nearest neighbors from the test set in the train set\n", + " results = reach.nearest_neighbor_threshold(\n", + " embedding_matrix_2, \n", + " threshold=threshold, \n", + " batch_size=batch_size, \n", + " show_progressbar=True\n", + " )\n", + " \n", + " # Process duplicates\n", + " for i, similar_items in enumerate(tqdm(results)):\n", + " # Similar items are returned as (index, score), we are only interested in the index\n", + " similar_indices = [int(item[0]) for item in similar_items if item[1] >= threshold] # Keep those above the threshold\n", + " \n", + " # If we find a similar item in the train set, mark it as a duplicate\n", + " if similar_indices:\n", + " duplicate_indices_in_test.append(i)\n", + " duplicate_to_original_mapping[i] = similar_indices[0] # Map duplicate in test to original in train\n", + "\n", + " return duplicate_indices_in_test, duplicate_to_original_mapping\n", + "\n", + "# Check for train/test bleed\n", + "duplicate_indices_in_test, duplicate_to_original_mapping = deduplicate_across_datasets(\n", + " embedding_matrix_train, \n", + " embedding_matrix_test, \n", + " threshold=0.99 # High threshold for deduplication\n", + ")\n", + "\n", + "print(f\"Number of duplicates found between train and test: {len(duplicate_indices_in_test)}\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train text:\n", + "Jackson Squares Off With Attorney SANTA MARIA, Calif. - Fans of Michael Jackson erupted in cheers Monday as the pop star emerged from a double-decker tour bus and went into court for a showdown with the prosecutor who has pursued him for years on child molestation charges...\n", + "Test text:\n", + "Jackson Squares Off With Prosecutor SANTA MARIA, Calif. - Fans of Michael Jackson erupted in cheers Monday as the pop star emerged from a double-decker tour bus and went into court for a showdown with the prosecutor who has pursued him for years on child molestation charges...\n", + "Differences:\n", + "- Attorney + Prosecutor\n", + "--------------------------------------------------\n", + "Train text:\n", + "Cassini Spies Two Moons Around Saturn (AP) AP - NASA's Cassini spacecraft has spied two new little moons around satellite-rich Saturn, the space agency said.\n", + "Test text:\n", + "Cassini Spies Two Little Saturn Moons (AP) AP - NASA's Cassini spacecraft has spied two new little moons around satellite-rich Saturn, the space agency said Monday.\n", + "Differences:\n", + "+ Little + Saturn - Around - Saturn - said. + said + Monday.\n", + "--------------------------------------------------\n", + "Train text:\n", + "Intel to Delay Product for High-Definition TVs SAN FRANCISCO (Reuters) - In the latest of a series of product delays, Intel Corp. has postponed the launch of a video display chip it had previously planned to introduce by year end, putting off a showdown with Texas Instruments Inc. in the fast-growing market for high-definition television displays.\n", + "Test text:\n", + "Intel to delay product aimed for high-definition TVs SAN FRANCISCO -- In the latest of a series of product delays, Intel Corp. has postponed the launch of a video display chip it had previously planned to introduce by year end, putting off a showdown with Texas Instruments Inc. in the fast-growing market for high-definition television displays.\n", + "Differences:\n", + "- Delay + delay - Product + product + aimed - High-Definition + high-definition + -- - (Reuters) - -\n", + "--------------------------------------------------\n", + "Train text:\n", + "Staples Profit Up Sharply, to Enter China NEW YORK (Reuters) - Staples Inc. <A HREF=\"http://www.investor.reuters.com/FullQuote.aspx?ticker=SPLS.O target=/stocks/quickinfo/fullquote\">SPLS.O</A>, the top U.S. office products retailer, on Tuesday reported a 39 percent jump in quarterly profit, raised its full-year forecast and said it plans to enter the fast-growing Chinese market.\n", + "Test text:\n", + "Staples Profit Up, to Enter China Market NEW YORK (Reuters) - Staples Inc. <A HREF=\"http://www.investor.reuters.com/FullQuote.aspx?ticker=SPLS.O target=/stocks/quickinfo/fullquote\">SPLS.O</A>, the top U.S. office products retailer, on Tuesday reported a 39 percent jump in quarterly profit, raised its full-year forecast and said it plans to enter the fast-growing Chinese market, sending its shares higher.\n", + "Differences:\n", + "- Up + Up, - Sharply, + Market - market. + market, + sending + its + shares + higher.\n", + "--------------------------------------------------\n", + "Train text:\n", + "Stocks Climb on Drop in Consumer Prices NEW YORK - Stocks rose for a second straight session Tuesday as a drop in consumer prices Tuesday allowed investors to put aside worries about inflation, at least for the short term. With gasoline prices falling to eight-month lows, the Consumer Price Index registered a small drop in July, giving consumers a respite from soaring energy prices...\n", + "Test text:\n", + "Stocks Climb on Drop in Consumer Prices NEW YORK - Stocks rose for a second straight session Tuesday as a drop in consumer prices allowed investors to put aside worries about inflation, at least for the short term. With gasoline prices falling to eight-month lows, the Consumer Price Index registered a small drop in July, giving consumers a respite from soaring energy prices...\n", + "Differences:\n", + "- Tuesday\n", + "--------------------------------------------------\n" + ] + } + ], + "source": [ + "# Show a few duplicates with their originals, highlighting word-level differences\n", + "num_examples = 5\n", + "for i, test_idx in enumerate(duplicate_indices_in_test[:num_examples]):\n", + " train_idx = duplicate_to_original_mapping[test_idx]\n", + "\n", + " print(f\"Train text:\\n{texts_train[train_idx]}\")\n", + " print(f\"Test text:\\n{texts_test[test_idx]}\")\n", + " print(\"Differences:\")\n", + " print(display_word_differences(texts_train[train_idx], texts_test[test_idx]))\n", + " print(\"-\" * 50)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "These again look like duplicates. We can very efficiently find train/test leakage examples using Model2Vec, ensuring that our test set is clean and does not contain any duplicates from the training set.\n", + "\n", + "**Conclusion**\n", + "\n", + "Model2Vec provides an efficient and fast solution for semantic deduplication, outperforming other methods like WordLlama and MinHash in terms of speed. Additionally, its ability to detect train-test overlap makes it a valuable tool for preparing clean datasets for machine learning tasks." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "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.10.11" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 97d367795239de23f2020a9b8d3a30c87075a660 Mon Sep 17 00:00:00 2001 From: Zecheng Zhang Date: Sat, 12 Oct 2024 06:41:07 -0700 Subject: [PATCH 04/30] fix: Fix distill model bos and eos token (#78) --- model2vec/distill/distillation.py | 2 +- model2vec/distill/inference.py | 4 ++-- model2vec/model.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/model2vec/distill/distillation.py b/model2vec/distill/distillation.py index 35a98e3..8870f53 100644 --- a/model2vec/distill/distillation.py +++ b/model2vec/distill/distillation.py @@ -53,7 +53,7 @@ def distill_from_model( :param device: The device to use. :param pca_dims: The number of components to use for PCA. If this is None, we don't apply PCA. - If this is 'auto', we don't reduce dimenionality, but still apply PCA. + If this is 'auto', we don't reduce dimensionality, but still apply PCA. :param apply_zipf: Whether to apply Zipf weighting to the embeddings. :param use_subword: Whether to keep subword tokens in the vocabulary. If this is False, you must pass a vocabulary, and the returned tokenizer will only detect full words. :raises: ValueError if the PCA dimension is larger than the number of dimensions in the embeddings. diff --git a/model2vec/distill/inference.py b/model2vec/distill/inference.py index e480cbf..400c0ac 100644 --- a/model2vec/distill/inference.py +++ b/model2vec/distill/inference.py @@ -117,10 +117,10 @@ def create_output_embeddings_from_model_name( # Work-around to get the eos and bos token ids without having to go into tokenizer internals. dummy_encoding = tokenizer.encode("A") - eos_token_id, bos_token_id = dummy_encoding[0], dummy_encoding[-1] + bos_token_id, eos_token_id = dummy_encoding[0], dummy_encoding[-1] - eos = torch.full([len(ids)], fill_value=eos_token_id) bos = torch.full([len(ids)], fill_value=bos_token_id) + eos = torch.full([len(ids)], fill_value=eos_token_id) stacked = torch.stack([bos, ids, eos], dim=1) diff --git a/model2vec/model.py b/model2vec/model.py index 4cadf82..017207c 100644 --- a/model2vec/model.py +++ b/model2vec/model.py @@ -184,7 +184,7 @@ def from_pretrained( :param path: The path to load your static model from. :param token: The huggingface token to use. - :return: A StaticEmbedder + :return: A StaticModel """ embeddings, tokenizer, config, metadata = load_pretrained(path, token=token) From 4a2a27b8f9eeb38e774a1b730a04972b5120e001 Mon Sep 17 00:00:00 2001 From: Thomas van Dongen Date: Sun, 13 Oct 2024 08:55:53 +0200 Subject: [PATCH 05/30] Updated readme (#80) --- README.md | 65 +++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 49 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index ad58703..8f797c3 100644 --- a/README.md +++ b/README.md @@ -91,25 +91,29 @@ m2v_model = distill(model_name=model_name, pca_dims=256) m2v_model.save_pretrained("m2v_model") ``` -If you already have a model loaded, or need to load a model in some special way, we also offer an interface to distill models in memory. +Distillation is really fast, and only takes about 5 seconds on a 2024 macbook using the MPS backend, 30 seconds on CPU. Best of all, distillation requires no training data. +You can also directly use Model2Vec in [Sentence Transformers](https://github.com/UKPLab/sentence-transformers) using the [StaticEmbedding](https://github.com/UKPLab/sentence-transformers/blob/master/sentence_transformers/models/StaticEmbedding.py) module. You can either load a Model2Vec model into a Sentence Transformer with the following code snippet: ```python -from transformers import AutoModel, AutoTokenizer +from sentence_transformers import SentenceTransformer +from sentence_transformers.models import StaticEmbedding -from model2vec.distill import distill_from_model - -# Assuming a loaded model and tokenizer -model_name = "baai/bge-base-en-v1.5" -model = AutoModel.from_pretrained(model_name) -tokenizer = AutoTokenizer.from_pretrained(model_name) - -m2v_model = distill_from_model(model=model, tokenizer=tokenizer, pca_dims=256) +# Initialize a StaticEmbedding module +static_embedding = StaticEmbedding.from_model2vec("minishlab/M2V_base_output") +model = SentenceTransformer(modules=[static_embedding]) +embeddings = model.encode(["It's dangerous to go alone!", "It's a secret to everybody."]) +``` -m2v_model.save_pretrained("m2v_model") +Or you can distill a model directly into a Sentence Transformer model: +```python +from sentence_transformers import SentenceTransformer +from sentence_transformers.models import StaticEmbedding +static_embedding = StaticEmbedding.from_distillation("BAAI/bge-base-en-v1.5", device="cpu", pca_dims=256) +model = SentenceTransformer(modules=[static_embedding]) +embeddings = model.encode(["It's dangerous to go alone!", "It's a secret to everybody."]) ``` - -Distillation is really fast, and only takes about 5 seconds on a 2024 macbook using the MPS backend, 30 seconds on CPU. Best of all, distillation requires no training data. +For more documentation, please refer to the [Sentence Transformers documentation](https://sbert.net/docs/package_reference/sentence_transformer/models.html#sentence_transformers.models.StaticEmbedding). ## What is Model2Vec? @@ -132,6 +136,7 @@ Model2Vec is: - **Fast inference**: up to 500 times faster on CPU than the original model. Go green or go home. - **No data needed**: Distillation happens directly on the token level, so no dataset is needed. - **Simple to use**: An easy to use interface for distilling and inferencing. +- **Integrated into Sentence Transformers**: Model2Vec can be used directly in [Sentence Transformers](https://github.com/UKPLab/sentence-transformers). - **Bring your own model**: Can be applied to any Sentence Transformer model. - **Bring your own vocabulary**: Can be applied to any vocabulary, allowing you to use your own domain-specific vocabulary. Need biomedical? Just get a medical dictionary, a biomedical model, and inference it. - **Multi-lingual**: Use any language. Need a French model? [Pick one](https://huggingface.co/models?library=sentence-transformers&language=fr&sort=trending). Need multilingual? [Here you go](https://huggingface.co/sentence-transformers/LaBSE). @@ -157,6 +162,25 @@ m2v_model.save_pretrained("m2v_model") ``` + +If you already have a model loaded, or need to load a model in some special way, we also offer an interface to distill models in memory. + +```python +from transformers import AutoModel, AutoTokenizer + +from model2vec.distill import distill_from_model + +# Assuming a loaded model and tokenizer +model_name = "baai/bge-base-en-v1.5" +model = AutoModel.from_pretrained(model_name) +tokenizer = AutoTokenizer.from_pretrained(model_name) + +m2v_model = distill_from_model(model=model, tokenizer=tokenizer, pca_dims=256) + +m2v_model.save_pretrained("m2v_model") + +``` + If you pass a vocabulary, you get a set of static word embeddings, together with a custom tokenizer for exactly that vocabulary. This is comparable to how you would use GLoVe or traditional word2vec, but doesn't actually require a corpus or data. ```python from model2vec.distill import distill @@ -204,13 +228,21 @@ token_embeddings = model.encode_as_sequence(["It's dangerous to go alone!", "It' ``` ### Evaluating a Model2Vec model +Our models can be evaluated using our [evaluation package](https://github.com/MinishLab/evaluation). +
+ Installation +Install the evaluation package with: -Our models can be evaluated using our [evaluation package](https://github.com/MinishLab/evaluation). To run this, first install the optional evaluation package: ```bash -pip install evaluation@git+https://github.com/MinishLab/evaluation@main +pip install evaluation@git+https://github.com MinishLab/evaluation@main ``` +
+ +
+ Evaluation Code -Then, the following code snippet shows how to evaluate a Model2Vec model: + +The following code snippet shows how to evaluate a Model2Vec model: ```python from model2vec import StaticModel @@ -241,6 +273,7 @@ task_scores = summarize_results(parsed_results) # Print the results in a leaderboard format print(make_leaderboard(task_scores)) ``` +
## Model List From 464c50461a4f1d4fa4c8f7c8aa14bab6e0e1fb8c Mon Sep 17 00:00:00 2001 From: Thomas van Dongen Date: Sun, 13 Oct 2024 17:01:51 +0200 Subject: [PATCH 06/30] docs: Update readme (#81) * Updated image * Added light and dark mode image * Added light and dark mode image * Updated logo * Updated logo * Updated logo * Updated logo * Added more dropdowns * Added more dropdowns * Added more dropdowns * Added more dropdowns * Added more dropdowns * Added more dropdowns * Revised model table * Revised model table * Removed image * Updated width --- README.md | 116 +++++++++++++++--- assets/images/logo_v2.png | Bin 0 -> 246524 bytes ...del2vec_model_diagram_transparant_dark.png | Bin 0 -> 108226 bytes ...el2vec_model_diagram_transparant_light.png | Bin 0 -> 92725 bytes 4 files changed, 96 insertions(+), 20 deletions(-) create mode 100644 assets/images/logo_v2.png create mode 100644 assets/images/model2vec_model_diagram_transparant_dark.png create mode 100644 assets/images/model2vec_model_diagram_transparant_light.png diff --git a/README.md b/README.md index 8f797c3..a634689 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@
- Model2Vec logo + Model2Vec logo
@@ -33,10 +33,10 @@ - -

- Model2Vec -

+
+ + +
Model2Vec is a technique to turn any sentence transformer into a really small fast model, reducing model size by 15x and making the models up to 500x faster, with a small drop in performance. See our results [here](#classification-and-speed-benchmarks), or dive in to see how it works. @@ -145,9 +145,14 @@ Model2Vec is: ## Usage + ### Distilling a Model2Vec model -Distilling a model from the output embeddings of a Sentence Transformer model. As mentioned above, this leads to really small model that might be less performant. +
+ Distilling from a Sentence Transformer +
+ +The following code can be used to distill a model from a Sentence Transformer. As mentioned above, this leads to really small model that might be less performant. ```python from model2vec.distill import distill @@ -161,7 +166,11 @@ m2v_model = distill(model_name=model_name, pca_dims=256) m2v_model.save_pretrained("m2v_model") ``` +
+
+ Distilling from a loaded model +
If you already have a model loaded, or need to load a model in some special way, we also offer an interface to distill models in memory. @@ -181,6 +190,30 @@ m2v_model.save_pretrained("m2v_model") ``` +
+ +
+ Distilling with the Sentence Transformers library +
+ +The following code snippet shows how to distill a model using the [Sentence Transformers](https://github.com/UKPLab/sentence-transformers) library. This is useful if you want to use the model in a Sentence Transformers pipeline. + +```python +from sentence_transformers import SentenceTransformer +from sentence_transformers.models import StaticEmbedding + +static_embedding = StaticEmbedding.from_distillation("BAAI/bge-base-en-v1.5", device="cpu", pca_dims=256) +model = SentenceTransformer(modules=[static_embedding]) +embeddings = model.encode(["It's dangerous to go alone!", "It's a secret to everybody."]) +``` + +
+ + +
+ Distilling with a custom vocabulary +
+ If you pass a vocabulary, you get a set of static word embeddings, together with a custom tokenizer for exactly that vocabulary. This is comparable to how you would use GLoVe or traditional word2vec, but doesn't actually require a corpus or data. ```python from model2vec.distill import distill @@ -191,10 +224,7 @@ vocabulary = ["word1", "word2", "word3"] model_name = "BAAI/bge-base-en-v1.5" # Distill the model with the custom vocabulary -m2v_model = distill(model_name=model_name, - vocabulary=vocabulary, - pca_dims=None, - apply_zipf=True) +m2v_model = distill(model_name=model_name, vocabulary=vocabulary) # Save the model m2v_model.save_pretrained("m2v_model") @@ -203,14 +233,33 @@ m2v_model.save_pretrained("m2v_model") m2v_model.push_to_hub("my_organization/my_model", token="") ``` +By default, this will distill a model with a subword tokenizer, combining the models (subword) vocab with the new vocabulary. If you want to get a word-level tokenizer instead (with only the passed vocabulary), the `use_subword` parameter can be set to `False`, e.g.: + +```python +m2v_model = distill(model_name=model_name, vocabulary=vocabulary, use_subword=False) +``` + **Important note:** we assume the passed vocabulary is sorted in rank frequency. i.e., we don't care about the actual word frequencies, but do assume that the most frequent word is first, and the least frequent word is last. If you're not sure whether this is case, set `apply_zipf` to `False`. This disables the weighting, but will also make performance a little bit worse. +
+ +
+ Distilling via CLI +
+ We also provide a command line interface for distillation. Note that `vocab.txt` should be a file with one word per line. ```bash python3 -m model2vec.distill --model-name BAAI/bge-base-en-v1.5 --vocabulary-path vocab.txt --device mps --save-path model2vec_model ``` -### Inference with a Model2Vec model +
+ +### Inference with Model2Vec + +
+ Inference a pretrained model +
+ Inference works as follows. The example shows one of our own models, but you can also just load a local one, or another one from the hub. ```python from model2vec import StaticModel @@ -226,12 +275,36 @@ embeddings = model.encode(["It's dangerous to go alone!", "It's a secret to ever # Make sequences of token embeddings token_embeddings = model.encode_as_sequence(["It's dangerous to go alone!", "It's a secret to everybody."]) ``` +
+ + +
+ Inference with the Sentence Transformers library +
+ +The following code snippet shows how to use a Model2Vec model in the [Sentence Transformers](https://github.com/UKPLab/sentence-transformers) library. This is useful if you want to use the model in a Sentence Transformers pipeline. + +```python +from sentence_transformers import SentenceTransformer +from sentence_transformers.models import StaticEmbedding + +# Initialize a StaticEmbedding module +static_embedding = StaticEmbedding.from_model2vec("minishlab/M2V_base_output") +model = SentenceTransformer(modules=[static_embedding]) +embeddings = model.encode(["It's dangerous to go alone!", "It's a secret to everybody."]) +``` + +
+ ### Evaluating a Model2Vec model -Our models can be evaluated using our [evaluation package](https://github.com/MinishLab/evaluation). + +
Installation -Install the evaluation package with: +
+ +Our models can be evaluated using our [evaluation package](https://github.com/MinishLab/evaluation). Install the evaluation package with: ```bash pip install evaluation@git+https://github.com MinishLab/evaluation@main @@ -240,7 +313,7 @@ pip install evaluation@git+https://github.com MinishLab/evaluation@main
Evaluation Code - +
The following code snippet shows how to evaluate a Model2Vec model: ```python @@ -277,13 +350,16 @@ print(make_leaderboard(task_scores)) ## Model List +We provide a number of models that can be used out of the box. These models are available on the [HuggingFace hub](https://huggingface.co/collections/minishlab/model2vec-base-models-66fd9dd9b7c3b3c0f25ca90e) and can be loaded using the `from_pretrained` method. The models are listed below. + +| Model | Language | Vocab | Sentence Transformer | Tokenizer Type | Params | +|------------------------|-------------|------------------|----------------------|----------------|--------------| +| [M2V_base_glove](https://huggingface.co/minishlab/M2V_base_glove) | English | GloVe | [bge-base-en-v1.5](https://huggingface.co/BAAI/bge-base-en-v1.5) | Word-level | 102M | +| [M2V_base_output](https://huggingface.co/minishlab/M2V_base_output) | English | Output | [bge-base-en-v1.5](https://huggingface.co/BAAI/bge-base-en-v1.5) | Subword | 7.5M | +| [M2V_base_glove_subword](https://huggingface.co/minishlab/M2V_base_glove_subword) | English | Output + GloVe | [bge-base-en-v1.5](https://huggingface.co/BAAI/bge-base-en-v1.5) | Subword | 103M | +| [M2V_multilingual_output](https://huggingface.co/minishlab/M2V_multilingual_output) | Multilingual | Output | [LaBSE](https://huggingface.co/sentence-transformers/LaBSE) | Subword | 471M | + -| Model | Language | Description | Vocab | Sentence Transformer | Params | -|------------------------|-------------|-----------------------------------------------------------------------|----------------|-----------------------|--------------| -| [M2V_base_glove](https://huggingface.co/minishlab/M2V_base_glove) | English | Flagship embedding model based on GloVe vocab. | GloVe | [bge-base-en-v1.5](https://huggingface.co/BAAI/bge-base-en-v1.5) | 102M | -| [M2V_base_output](https://huggingface.co/minishlab/M2V_base_output) | English | Flagship embedding model based on bge-base-en-v1.5 vocab. Uses a subword tokenizer. | Output | [bge-base-en-v1.5](https://huggingface.co/BAAI/bge-base-en-v1.5) | 7.5M | -| [M2V_base_glove_subword](https://huggingface.co/minishlab/M2V_base_glove_subword) | English | Flagship embedding model based on bge-base-en-v1.5 + glove vocab. Uses a subword tokenizer. | Output + GloVe | [bge-base-en-v1.5](https://huggingface.co/BAAI/bge-base-en-v1.5) | 103M | -| [M2V_multilingual_output](https://huggingface.co/minishlab/M2V_multilingual_output) | Multilingual | Flagship multilingual embedding model based on LaBSE vocab. Uses a subword tokenizer. | Output | [LaBSE](https://huggingface.co/sentence-transformers/LaBSE) | 471M | ## Results ### Main Results diff --git a/assets/images/logo_v2.png b/assets/images/logo_v2.png new file mode 100644 index 0000000000000000000000000000000000000000..3a11ec9bc91bc923a69d72d8a99be6475cf3ec6a GIT binary patch literal 246524 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 T^N0ou{F9Sbf)z+Tefj?YsPikK literal 0 HcmV?d00001 diff --git a/assets/images/model2vec_model_diagram_transparant_dark.png b/assets/images/model2vec_model_diagram_transparant_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..6b9488490f8576ba8409648e8cafa1a874d4814b GIT binary patch literal 108226 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

814tC;c}E}zL^a6%|-;d%l~;s0?KI=u2f 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 LqFI;h_&V}GTJOKV literal 0 HcmV?d00001 diff --git a/assets/images/model2vec_model_diagram_transparant_light.png b/assets/images/model2vec_model_diagram_transparant_light.png new file mode 100644 index 0000000000000000000000000000000000000000..6adb7fa1d92af05b994d33b65dd81cf1329a7e5f GIT binary patch literal 92725 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

5om$WBr*BWh}4Y(L_9w(K7e#FYdfrb5N`Jb&T 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 Date: Mon, 14 Oct 2024 19:40:16 +0200 Subject: [PATCH 07/30] docs: Move results and add blogpost (#82) * Moved results * Added blog link * Moved section * Moved section * Updates * Updates --- .gitignore | 1 - README.md | 107 +++++++++++++--------------------------------- results/README.md | 88 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 117 insertions(+), 79 deletions(-) create mode 100644 results/README.md diff --git a/.gitignore b/.gitignore index 6503faf..0f614e1 100644 --- a/.gitignore +++ b/.gitignore @@ -168,7 +168,6 @@ models checkpoints/* features/* model2vec_models -results/* counts/* results_old/* local/* diff --git a/README.md b/README.md index a634689..f416a01 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,8 @@

🤗 Models | 📚 Tutorials | - 📖 Website + 💻 Website | + 📖 Blog

@@ -42,8 +43,8 @@ Model2Vec is a technique to turn any sentence transformer into a really small fa ## Table of Contents - [Quickstart](#quickstart) -- [What is Model2Vec?](#what-is-model2vec) - [Main Features](#main-features) +- [What is Model2Vec?](#what-is-model2vec) - [Usage](#usage) - [Distilling a Model2Vec model](#distilling-a-model2vec-model) - [Inferencing a Model2Vec model](#inference-with-a-model2vec-model) @@ -115,23 +116,12 @@ embeddings = model.encode(["It's dangerous to go alone!", "It's a secret to ever ``` For more documentation, please refer to the [Sentence Transformers documentation](https://sbert.net/docs/package_reference/sentence_transformer/models.html#sentence_transformers.models.StaticEmbedding). -## What is Model2Vec? - -Model2vec creates a small, fast, and powerful model that outperforms other static embedding models by a large margin on all tasks we could find, while being much faster to create than traditional static embedding models such as GloVe. Like BPEmb, it can create subword embeddings, but with much better performance. Best of all, you don't need _any_ data to distill a model using Model2Vec. - -It works by passing a vocabulary through a sentence transformer model, then reducing the dimensionality of the resulting embeddings using PCA, and finally weighting the embeddings using zipf weighting. During inference, we simply take the mean of all token embeddings occurring in a sentence. - -Model2vec has 3 modes: -- **Output**: behaves much like a real sentence transformer, i.e., it uses a subword tokenizer and simply encodes all wordpieces in its vocab. This is really quick to create (30 seconds on a CPU), very small (30 MB in float32), but might be less performant on some tasks. -- **Vocab (word level)**: creates a word-level tokenizer and only encodes words that are in the vocabulary. This is a bit slower to create and creates a larger model, but might be more performant on some tasks. Note that this model can go out-of-vocabulary, which might be beneficial if your domain is very noisy -- **Vocab (subword)**: a combination of the two methods above. In this mode, you can pass your own vocabulary, but it also uses the subword vocabulary to create representations for words not in the passed vocabulary. - ## Main Features Model2Vec is: -- **Small**: reduces the size of a Sentence Transformer model by a factor of 15, from 120M params, down to 7.5M (30 MB on disk!). -- **Static, but better**: smaller than GLoVe, but much more performant, even with the same vocabulary. +- **Small**: reduces the size of a Sentence Transformer model by a factor of 15, from 120M params, down to 7.5M (30 MB on disk, making it the smallest model on [MTEB](https://huggingface.co/spaces/mteb/leaderboard)!). +- **Static, but better**: smaller than GLoVe and BPEmb, but [much more performant](results/README.md), even with the same vocabulary. - **Fast distillation**: make your own model in 30 seconds. - **Fast inference**: up to 500 times faster on CPU than the original model. Go green or go home. - **No data needed**: Distillation happens directly on the token level, so no dataset is needed. @@ -143,10 +133,25 @@ Model2Vec is: - **Tightly integrated with HuggingFace hub**: easily share and load models from the HuggingFace hub, using the familiar `from_pretrained` and `push_to_hub`. Our own models can be found [here](https://huggingface.co/minishlab). Feel free to share your own. - **Easy Evaluation**: evaluate your models on MTEB and some of our own tasks to measure the performance of the distilled model. Model2Vec models work out of the box on [MTEB](https://huggingface.co/spaces/mteb/leaderboard). +## What is Model2Vec? + +Model2vec creates a small, fast, and powerful model that outperforms other static embedding models by a large margin on all tasks we could find, while being much faster to create than traditional static embedding models such as GloVe. Like BPEmb, it can create subword embeddings, but with much better performance. Best of all, you don't need _any_ data to distill a model using Model2Vec. + +It works by passing a vocabulary through a sentence transformer model, then reducing the dimensionality of the resulting embeddings using PCA, and finally weighting the embeddings using zipf weighting. During inference, we simply take the mean of all token embeddings occurring in a sentence. + +Model2vec has 3 modes: +- **Output**: behaves much like a real sentence transformer, i.e., it uses a subword tokenizer and simply encodes all wordpieces in its vocab. This is really quick to create (30 seconds on a CPU), very small (30 MB in float32), but might be less performant on some tasks. +- **Vocab (word level)**: creates a word-level tokenizer and only encodes words that are in the vocabulary. This is a bit slower to create and creates a larger model, but might be more performant on some tasks. Note that this model can go out-of-vocabulary, which might be beneficial if your domain is very noisy +- **Vocab (subword)**: a combination of the two methods above. In this mode, you can pass your own vocabulary, but it also uses the subword vocabulary to create representations for words not in the passed vocabulary. + +For a technical deepdive into Model2Vec, please refer to our [blog post](https://huggingface.co/blog/Pringled/model2vec). + + + ## Usage -### Distilling a Model2Vec model +### Distillation
Distilling from a Sentence Transformer @@ -254,10 +259,10 @@ python3 -m model2vec.distill --model-name BAAI/bge-base-en-v1.5 --vocabulary-pat
-### Inference with Model2Vec +### Inference
- Inference a pretrained model + Inference using pretrained model
Inference works as follows. The example shows one of our own models, but you can also just load a local one, or another one from the hub. @@ -279,7 +284,7 @@ token_embeddings = model.encode_as_sequence(["It's dangerous to go alone!", "It'
- Inference with the Sentence Transformers library + Inference using the Sentence Transformers library
The following code snippet shows how to use a Model2Vec model in the [Sentence Transformers](https://github.com/UKPLab/sentence-transformers) library. This is useful if you want to use the model in a Sentence Transformers pipeline. @@ -297,7 +302,7 @@ embeddings = model.encode(["It's dangerous to go alone!", "It's a secret to ever
-### Evaluating a Model2Vec model +### Evaluation
@@ -362,64 +367,10 @@ We provide a number of models that can be used out of the box. These models are ## Results -### Main Results - -Model2Vec is evaluated on MTEB, as well as two additional tasks: [PEARL](https://github.com/tigerchen52/PEARL) (a phrase representation task) and WordSim (a collection of _word_ similarity tasks). The results are shown in the table below. - - - -| Model | Avg (All) | Avg (MTEB) | Class | Clust | PairClass | Rank | Ret | STS | Sum | Pearl | WordSim | -|:-----------------------|:---------:|:----------:|:------:|:------:|:---------:|:------:|:------:|:------:|:------:|:------:|:-------:| -| all-MiniLM-L6-v2 | 56.08 | 56.09 | 62.62 | 41.94 | 82.37 | 58.04 | 41.95 | 78.90 | 30.81 | 60.83 | 49.91 | -| M2V_base_glove_subword | 49.06 | 46.69 | 61.27 | 30.03 | 74.71 | 49.15 | 27.16 | 69.09 | 30.08 | 56.82 | 57.99 | -| M2V_base_glove | 48.58 | 47.60 | 61.35 | 30.52 | 75.34 | 48.50 | 29.26 | 70.31 | 31.50 | 50.28 | 54.29 | -| M2V_base_output | 46.79 | 45.34 | 61.25 | 25.58 | 74.90 | 47.63 | 26.14 | 68.58 | 29.20 | 54.02 | 49.18 | -| GloVe_300d | 42.84 | 42.36 | 57.31 | 27.66 | 72.48 | 43.30 | 22.78 | 61.90 | 28.81 | 45.65 | 43.05 | -| BPEmb_50k_300d | 39.34 | 37.78 | 55.76 | 23.35 | 57.86 | 43.21 | 17.50 | 55.10 | 29.74 | 47.56 | 41.28 | -| WL256* | 48.88 | 49.36 | 58.98 | 33.34 | 74.00 | 52.03 | 33.12 | 73.34 | 29.05 | 48.81 | 45.16 | - - -
- Task Abbreviations - -For readability, the MTEB task names are abbreviated as follows: -- Class: Classification -- Clust: Clustering -- PairClass: PairClassification -- Rank: Reranking -- Ret: Retrieval -- STS: Semantic Textual Similarity -- Sum: Summarization -
- -\ -\* WL256, introduced in the [WordLlama](https://github.com/dleemiller/WordLlama/tree/main) package is included for comparison due to its similarities to Model2Vec. However, we believe it is heavily overfit to the MTEB dataset since it is trained on datasets used in MTEB itself. This can be seen by the fact that the WL256 model performs much worse on the non-MTEB tasks (PEARL and WordSim) than our models and GLoVe. The results shown in the [Classification and Speed Benchmarks](#classification-and-speed-benchmarks) further support this. - -### Classification and Speed Benchmarks - -In addition to the MTEB evaluation, we evaluate Model2Vec on a number of classification datasets. These are used as additional evidence to avoid overfitting to the MTEB dataset and to benchmark the speed of the model. The results are shown in the table below. - - -| Model | Average | SST2 | IMDB | TREC | AG News | -|:-----------------------|:-------:|:------:|:-----:|:------:|:-------:| -| bge-base-en-v1.5 | 90.00 | 91.54 | 91.88 | 85.16 | 91.45 | -| all-MiniLM-L6-v2 | 84.10 | 83.95 | 81.36 | 81.31 | 89.77 | -| M2V_base_output | 82.23 | 80.92 | 84.56 | 75.27 | 88.17 | -| M2V_base_glove_subword | 81.95 | 82.84 | 85.96 | 70.51 | 88.49 | -| BPEmb_50k_300d | 81.15 | 80.42 | 84.04 | 71.25 | 88.92 | -| M2V_base_glove | 80.76 | 83.07 | 85.24 | 66.12 | 88.61 | -| WL256 | 78.48 | 76.88 | 80.12 | 69.23 | 87.68 | -| GloVe_300d | 77.77 | 81.68 | 84.00 | 55.67 | 89.71 | - - -As can be seen, Model2Vec models outperform the GloVe, BPEmb, and WL256 models on all classification tasks, and are competitive with the all-MiniLM-L6-v2 model, while being much faster. - -The figure below shows the relationship between the number of sentences per second and the average classification score. The circle sizes correspond to the number of parameters in the models (larger = more parameters). -This plot shows that the Model2Vec models are much faster than the other models, while still being competitive in terms of classification performance with the [all-MiniLM-L6-v2](https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2) model. - -| ![Description](assets/images/speed_vs_accuracy_v3.png) | -|:--:| -|*Figure: The average accuracy over all classification datasets plotted against sentence per second. The circle size indicates model size.*| +We have performed extensive experiments to evaluate the performance of Model2Vec models. The results are documented in the [results](results/README.md) folder. The results are presented in the following sections: +- [MTEB Results](results/README.md#mteb-results) +- [Classification and Speed Benchmarks](results/README.md#classification-and-speed-benchmarks) +- [Ablations](results/README.md#ablations) ## Related work diff --git a/results/README.md b/results/README.md new file mode 100644 index 0000000..7c4c7b3 --- /dev/null +++ b/results/README.md @@ -0,0 +1,88 @@ +# Results + +This page contains the experiments results of the Model2Vec project. The results are presented in the following sections: +- [MTEB Results](#mteb-results) +- [Classification and Speed Benchmarks](#classification-and-speed-benchmarks) +- [Ablations](#ablations) + +## MTEB Results + +Model2Vec is evaluated on MTEB, as well as two additional tasks: [PEARL](https://github.com/tigerchen52/PEARL) (a phrase representation task) and WordSim (a collection of _word_ similarity tasks). The results are shown in the table below. + + + +| Model | Avg (All) | Avg (MTEB) | Class | Clust | PairClass | Rank | Ret | STS | Sum | Pearl | WordSim | +|:-----------------------|:---------:|:----------:|:------:|:------:|:---------:|:------:|:------:|:------:|:------:|:------:|:-------:| +| all-MiniLM-L6-v2 | 56.08 | 56.09 | 62.62 | 41.94 | 82.37 | 58.04 | 41.95 | 78.90 | 30.81 | 60.83 | 49.91 | +| M2V_base_glove_subword | 49.06 | 46.69 | 61.27 | 30.03 | 74.71 | 49.15 | 27.16 | 69.09 | 30.08 | 56.82 | 57.99 | +| M2V_base_glove | 48.58 | 47.60 | 61.35 | 30.52 | 75.34 | 48.50 | 29.26 | 70.31 | 31.50 | 50.28 | 54.29 | +| M2V_base_output | 46.79 | 45.34 | 61.25 | 25.58 | 74.90 | 47.63 | 26.14 | 68.58 | 29.20 | 54.02 | 49.18 | +| GloVe_300d | 42.84 | 42.36 | 57.31 | 27.66 | 72.48 | 43.30 | 22.78 | 61.90 | 28.81 | 45.65 | 43.05 | +| BPEmb_50k_300d | 39.34 | 37.78 | 55.76 | 23.35 | 57.86 | 43.21 | 17.50 | 55.10 | 29.74 | 47.56 | 41.28 | +| WL256* | 48.88 | 49.36 | 58.98 | 33.34 | 74.00 | 52.03 | 33.12 | 73.34 | 29.05 | 48.81 | 45.16 | + + +
+ Task Abbreviations + +For readability, the MTEB task names are abbreviated as follows: +- Class: Classification +- Clust: Clustering +- PairClass: PairClassification +- Rank: Reranking +- Ret: Retrieval +- STS: Semantic Textual Similarity +- Sum: Summarization +
+ +\ +\* WL256, introduced in the [WordLlama](https://github.com/dleemiller/WordLlama/tree/main) package is included for comparison due to its similarities to Model2Vec. However, we believe it is heavily overfit to the MTEB dataset since it is trained on datasets used in MTEB itself. This can be seen by the fact that the WL256 model performs much worse on the non-MTEB tasks (PEARL and WordSim) than our models and GLoVe. The results shown in the [Classification and Speed Benchmarks](#classification-and-speed-benchmarks) further support this. + +## Classification and Speed Benchmarks + +In addition to the MTEB evaluation, we evaluate Model2Vec on a number of classification datasets. These are used as additional evidence to avoid overfitting to the MTEB dataset and to benchmark the speed of the model. The results are shown in the table below. + + +| Model | Average | SST2 | IMDB | TREC | AG News | +|:-----------------------|:-------:|:------:|:-----:|:------:|:-------:| +| bge-base-en-v1.5 | 90.00 | 91.54 | 91.88 | 85.16 | 91.45 | +| all-MiniLM-L6-v2 | 84.10 | 83.95 | 81.36 | 81.31 | 89.77 | +| M2V_base_output | 82.23 | 80.92 | 84.56 | 75.27 | 88.17 | +| M2V_base_glove_subword | 81.95 | 82.84 | 85.96 | 70.51 | 88.49 | +| BPEmb_50k_300d | 81.15 | 80.42 | 84.04 | 71.25 | 88.92 | +| M2V_base_glove | 80.76 | 83.07 | 85.24 | 66.12 | 88.61 | +| WL256 | 78.48 | 76.88 | 80.12 | 69.23 | 87.68 | +| GloVe_300d | 77.77 | 81.68 | 84.00 | 55.67 | 89.71 | + + +As can be seen, Model2Vec models outperform the GloVe, BPEmb, and WL256 models on all classification tasks, and are competitive with the all-MiniLM-L6-v2 model, while being much faster. + +The figure below shows the relationship between the number of sentences per second and the average classification score. The circle sizes correspond to the number of parameters in the models (larger = more parameters). +This plot shows that the Model2Vec models are much faster than the other models, while still being competitive in terms of classification performance with the [all-MiniLM-L6-v2](https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2) model. + +| ![Description](../assets/images/speed_vs_accuracy_v3.png) | +|:--:| +|*Figure: The average accuracy over all classification datasets plotted against sentence per second. The circle size indicates model size.*| + + +## Ablations + +To better understand the factors contributing to the performance of Model2Vec, we conducted a comprehensive set of ablation studies, covering various aspects of the model's architecture and preprocessing methods. In these studies, we examined the impact of key elements such as PCA, Zipf weighting, and the use of Sentence Transformers versus regular transformer models. We also compared the performance of input embeddings versus output embeddings, since it would seem plausible that these should also work well. The results are shown in the table below. + + +| Model | Avg (All) | Avg (MTEB) | Class | Clust | PairClass | Rank | Ret | STS | Sum | Pearl | WordSim | +|:-----------------------------|------------:|-------------:|--------:|--------:|------------:|-------:|------:|------:|------:|--------:|----------:| +| M2V_base_output | 46.79 | 45.34 | 61.25 | 25.58 | 74.9 | 47.63 | 26.14 | 68.58 | 29.2 | 54.02 | 49.18 | +| M2V_base_output_nopca | 44.04 | 42.31 | 61.42 | 20.15 | 68.21 | 44.67 | 25.25 | 61.87 | 29.85 | 51.02 | 48.96 | +| M2V_base_output_nozipf | 43.61 | 41.52 | 60.44 | 21.62 | 72.15 | 45.57 | 20.35 | 62.71 | 30.66 | 52.28 | 49.17 | +| M2V_base_input_nozipf_nopca | 40.97 | 39.55 | 54.16 | 18.62 | 68.3 | 43.65 | 23.63 | 59.38 | 32.04 | 50.19 | 40.52 | +| M2V_base_output_nozipf_nopca | 40.8 | 38.44 | 59.78 | 19.31 | 62.39 | 42.26 | 19.01 | 55.16 | 30 | 49.09 | 48.97 | +| M2V_base_input | 40.74 | 39.93 | 60.35 | 22.66 | 59.63 | 43.02 | 25.47 | 50.05 | 29.35 | 50.61 | 34.47 | +| M2V_bert_output_nozipf_nopca | 35.54 | 34.82 | 55.69 | 15.42 | 58.68 | 39.87 | 12.92 | 55.24 | 30.15 | 46.9 | 26.72 | + + +There's four main findings in these results: +1. Non-Sentence Transformers do not work well. This can be seen by comparing `M2V_bert_output_nozipf_nopca` (which uses [BERT](https://huggingface.co/google-bert/bert-base-uncased), a non-Sentence Transformer) and `M2V_base_output_nozipf_nopca` (which uses [BGE-base](https://huggingface.co/BAAI/bge-base-en-v1.5), a Sentence Transformer). Using a Sentence Transformer gives a ~5.2% increase in performance. +2. PCA is crucial for performance. This can be seen by comparing `M2V_base_output_nozipf_nopca` and `M2V_base_output_nozipf` which gives a ~2.8% increase in performance. Furthermore, PCA improves performance on _all_ tasks. +3. Zipf weighting is crucial for performance. This can be seen by comparing `M2V_base_output_nozipf_nopca` and `M2V_base_output_nopca` which gives a ~3.1% increase in performance. +4. Output embeddings outperform input embeddings. This can be seen by comparing `M2V_base_input` and `M2V_base_output` which gives a ~6.1% increase in performance. Note that input embeddings do work well for some tasks. We hypothesize that this is because input embeddings are inherently normalized. From b4927e17494bd03e14ff51c1fa2aca059680df2d Mon Sep 17 00:00:00 2001 From: Thomas van Dongen Date: Tue, 15 Oct 2024 08:56:38 +0200 Subject: [PATCH 08/30] Fixed broken link (#84) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f416a01..63d4d3f 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ -Model2Vec is a technique to turn any sentence transformer into a really small fast model, reducing model size by 15x and making the models up to 500x faster, with a small drop in performance. See our results [here](#classification-and-speed-benchmarks), or dive in to see how it works. +Model2Vec is a technique to turn any sentence transformer into a really small fast model, reducing model size by 15x and making the models up to 500x faster, with a small drop in performance. See our results [here](results/README.md), or dive in to see how it works. ## Table of Contents - [Quickstart](#quickstart) From 5c1ba3211136dd88e607c2b8173d3104489518d1 Mon Sep 17 00:00:00 2001 From: Stephan Tulkens Date: Tue, 15 Oct 2024 13:01:32 +0200 Subject: [PATCH 09/30] fix: move tensor to cpu (#86) --- model2vec/model.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/model2vec/model.py b/model2vec/model.py index 017207c..2d88e94 100644 --- a/model2vec/model.py +++ b/model2vec/model.py @@ -111,7 +111,7 @@ def save_pretrained(self, path: PathLike, model_name: str | None = None) -> None """ save_pretrained( folder_path=Path(path), - embeddings=self.embedding.weight.numpy(), + embeddings=self.embedding.weight.cpu().numpy(), tokenizer=self.tokenizer, config=self.config, base_model_name=self.base_model_name, From 010a7b7347e72e6fa5a92e52314674359253a409 Mon Sep 17 00:00:00 2001 From: Stephan Tulkens Date: Wed, 16 Oct 2024 09:11:06 +0200 Subject: [PATCH 10/30] feat: Numpy inference (#87) * Add numpy inference * Fix numpy inference * Add flexible import mechanism * Fix readme * Re-add examples * Separate utils and hf_utils * Fix test * Fix readme --- README.md | 10 +- model2vec/__init__.py | 3 +- model2vec/distill/__init__.py | 7 ++ model2vec/hf_utils.py | 202 +++++++++++++++++++++++++++++ model2vec/model.py | 112 +++++++---------- model2vec/utils.py | 231 +++++----------------------------- pyproject.toml | 8 +- tests/conftest.py | 1 - tests/test_distillation.py | 4 +- tests/test_model.py | 22 +--- tests/test_utils.py | 22 +++- uv.lock | 20 +-- 12 files changed, 335 insertions(+), 307 deletions(-) create mode 100644 model2vec/hf_utils.py diff --git a/README.md b/README.md index 63d4d3f..1264fbd 100644 --- a/README.md +++ b/README.md @@ -56,7 +56,13 @@ Model2Vec is a technique to turn any sentence transformer into a really small fa ## Quickstart -Install the package with: +Install the package and all required extras with: +```bash +pip install model2vec[distill] +``` + +If you want a light-weight version of the package which only requires `numpy`, omit the `distill` extra. This means you can't distill your own models, but you can use pre-trained models. This is useful for inference pipelines. + ```bash pip install model2vec ``` @@ -118,7 +124,7 @@ For more documentation, please refer to the [Sentence Transformers documentation ## Main Features -Model2Vec is: +Model2Vec has the following features: - **Small**: reduces the size of a Sentence Transformer model by a factor of 15, from 120M params, down to 7.5M (30 MB on disk, making it the smallest model on [MTEB](https://huggingface.co/spaces/mteb/leaderboard)!). - **Static, but better**: smaller than GLoVe and BPEmb, but [much more performant](results/README.md), even with the same vocabulary. diff --git a/model2vec/__init__.py b/model2vec/__init__.py index e3b3e53..21cd126 100644 --- a/model2vec/__init__.py +++ b/model2vec/__init__.py @@ -1,4 +1,3 @@ -from model2vec.distill import distill from model2vec.model import StaticModel -__all__ = ["distill", "StaticModel"] +__all__ = ["StaticModel"] diff --git a/model2vec/distill/__init__.py b/model2vec/distill/__init__.py index 93abcf8..fbc59f1 100644 --- a/model2vec/distill/__init__.py +++ b/model2vec/distill/__init__.py @@ -1,3 +1,10 @@ +from model2vec.utils import get_package_extras, importable + +_REQUIRED_EXTRA = "distill" + +for extra_dependency in get_package_extras("model2vec", _REQUIRED_EXTRA): + importable(extra_dependency, _REQUIRED_EXTRA) + from model2vec.distill.distillation import distill, distill_from_model __all__ = ["distill", "distill_from_model"] diff --git a/model2vec/hf_utils.py b/model2vec/hf_utils.py new file mode 100644 index 0000000..63b7ec3 --- /dev/null +++ b/model2vec/hf_utils.py @@ -0,0 +1,202 @@ +import json +import logging +from pathlib import Path +from typing import Any, Protocol, cast + +import huggingface_hub +import huggingface_hub.errors +import numpy as np +import safetensors +from huggingface_hub import ModelCard, ModelCardData +from safetensors.numpy import save_file +from tokenizers import Tokenizer + +logger = logging.getLogger(__name__) + + +class SafeOpenProtocol(Protocol): + """Protocol to fix safetensors safe open.""" + + def get_tensor(self, key: str) -> np.ndarray: + """Get a tensor.""" + ... + + +def save_pretrained( + folder_path: Path, + embeddings: np.ndarray, + tokenizer: Tokenizer, + config: dict[str, Any], + create_model_card: bool = True, + **kwargs: Any, +) -> None: + """ + Save a model to a folder. + + :param folder_path: The path to the folder. + :param embeddings: The embeddings. + :param tokenizer: The tokenizer. + :param config: A metadata config. + :param create_model_card: Whether to create a model card. + :param **kwargs: Any additional arguments. + """ + folder_path.mkdir(exist_ok=True, parents=True) + save_file({"embeddings": embeddings}, folder_path / "model.safetensors") + tokenizer.save(str(folder_path / "tokenizer.json")) + json.dump(config, open(folder_path / "config.json", "w")) + + logger.info(f"Saved model to {folder_path}") + + # Optionally create the model card + if create_model_card: + _create_model_card(folder_path, **kwargs) + + +def _create_model_card( + folder_path: Path, + base_model_name: str = "unknown", + license: str = "mit", + language: list[str] | None = None, + model_name: str | None = None, + **kwargs: Any, +) -> None: + """ + Create a model card and store it in the specified path. + + :param folder_path: The path where the model card will be stored. + :param base_model_name: The name of the base model. + :param license: The license to use. + :param language: The language of the model. + :param model_name: The name of the model to use in the Model Card. + :param **kwargs: Additional metadata for the model card (e.g., model_name, base_model, etc.). + """ + folder_path = Path(folder_path) + model_name = model_name or folder_path.name + template_path = Path(__file__).parent / "model_card_template.md" + + model_card_data = ModelCardData( + model_name=model_name, + base_model=base_model_name, + license=license, + language=language, + tags=["embeddings", "static-embeddings"], + library_name="model2vec", + **kwargs, + ) + model_card = ModelCard.from_template(model_card_data, template_path=template_path) + model_card.save(folder_path / "README.md") + + +def load_pretrained( + folder_or_repo_path: str | Path, token: str | None = None +) -> tuple[np.ndarray, Tokenizer, dict[str, Any], dict[str, Any]]: + """ + Loads a pretrained model from a folder. + + :param folder_or_repo_path: The folder or repo path to load from. + - If this is a local path, we will load from the local path. + - If the local path is not found, we will attempt to load from the huggingface hub. + :param token: The huggingface token to use. + :raises: FileNotFoundError if the folder exists, but the file does not exist locally. + :return: The embeddings, tokenizer, config, and metadata. + + """ + folder_or_repo_path = Path(folder_or_repo_path) + if folder_or_repo_path.exists(): + embeddings_path = folder_or_repo_path / "model.safetensors" + if not embeddings_path.exists(): + old_embeddings_path = folder_or_repo_path / "embeddings.safetensors" + if old_embeddings_path.exists(): + logger.warning("Old embeddings file found. Please rename to `model.safetensors` and re-save.") + embeddings_path = old_embeddings_path + else: + raise FileNotFoundError(f"Embeddings file does not exist in {folder_or_repo_path}") + + config_path = folder_or_repo_path / "config.json" + if not config_path.exists(): + raise FileNotFoundError(f"Config file does not exist in {folder_or_repo_path}") + + tokenizer_path = folder_or_repo_path / "tokenizer.json" + if not tokenizer_path.exists(): + raise FileNotFoundError(f"Tokenizer file does not exist in {folder_or_repo_path}") + + # README is optional, so this is a bit finicky. + readme_path = folder_or_repo_path / "README.md" + metadata = _get_metadata_from_readme(readme_path) + + else: + logger.info("Folder does not exist locally, attempting to use huggingface hub.") + try: + embeddings_path = huggingface_hub.hf_hub_download( + folder_or_repo_path.as_posix(), "model.safetensors", token=token + ) + except huggingface_hub.utils.EntryNotFoundError as e: + try: + embeddings_path = huggingface_hub.hf_hub_download( + folder_or_repo_path.as_posix(), "embeddings.safetensors", token=token + ) + except huggingface_hub.utils.EntryNotFoundError: + # Raise original exception. + raise e + + try: + readme_path = huggingface_hub.hf_hub_download(folder_or_repo_path.as_posix(), "README.md", token=token) + metadata = _get_metadata_from_readme(Path(readme_path)) + except huggingface_hub.utils.EntryNotFoundError: + logger.info("No README found in the model folder. No model card loaded.") + metadata = {} + + config_path = huggingface_hub.hf_hub_download(folder_or_repo_path.as_posix(), "config.json", token=token) + tokenizer_path = huggingface_hub.hf_hub_download(folder_or_repo_path.as_posix(), "tokenizer.json", token=token) + + opened_tensor_file = cast(SafeOpenProtocol, safetensors.safe_open(embeddings_path, framework="numpy")) + embeddings = opened_tensor_file.get_tensor("embeddings") + + tokenizer: Tokenizer = Tokenizer.from_file(str(tokenizer_path)) + config = json.load(open(config_path)) + + if len(tokenizer.get_vocab()) != len(embeddings): + logger.warning( + f"Number of tokens does not match number of embeddings: `{len(tokenizer.get_vocab())}` vs `{len(embeddings)}`" + ) + + return embeddings, tokenizer, config, metadata + + +def _get_metadata_from_readme(readme_path: Path) -> dict[str, Any]: + """Get metadata from a README file.""" + if not readme_path.exists(): + logger.info(f"README file not found in {readme_path}. No model card loaded.") + return {} + model_card = ModelCard.load(readme_path) + data: dict[str, Any] = model_card.data.to_dict() + if not data: + logger.info("File README.md exists, but was empty. No model card loaded.") + return data + + +def push_folder_to_hub(folder_path: Path, repo_id: str, private: bool, token: str | None) -> None: + """ + Push a model folder to the huggingface hub, including model card. + + :param folder_path: The path to the folder. + :param repo_id: The repo name. + :param private: Whether the repo is private. + :param token: The huggingface token. + """ + if not huggingface_hub.repo_exists(repo_id=repo_id, token=token): + huggingface_hub.create_repo(repo_id, token=token, private=private) + + # Push model card and all model files to the Hugging Face hub + huggingface_hub.upload_folder(repo_id=repo_id, folder_path=folder_path, token=token) + + # Check if the model card exists, and push it if available + model_card_path = folder_path / "README.md" + if model_card_path.exists(): + card = ModelCard.load(model_card_path) + card.push_to_hub(repo_id=repo_id, token=token) + logger.info(f"Pushed model card to {repo_id}") + else: + logger.warning(f"Model card README.md not found in {folder_path}. Skipping model card upload.") + + logger.info(f"Pushed model to {repo_id}") diff --git a/model2vec/model.py b/model2vec/model.py index 2d88e94..367e23b 100644 --- a/model2vec/model.py +++ b/model2vec/model.py @@ -6,13 +6,10 @@ from typing import Any, Iterator import numpy as np -import torch from tokenizers import Encoding, Tokenizer -from torch import nn -from torch.nn import Embedding, EmbeddingBag from tqdm import tqdm -from model2vec.utils import load_pretrained, push_folder_to_hub, save_pretrained +from model2vec.hf_utils import load_pretrained, push_folder_to_hub, save_pretrained PathLike = Path | str @@ -20,7 +17,7 @@ logger = getLogger(__name__) -class StaticModel(nn.Module): +class StaticModel: def __init__( self, vectors: np.ndarray, @@ -44,13 +41,8 @@ def __init__( super().__init__() tokens, _ = zip(*sorted(tokenizer.get_vocab().items(), key=lambda x: x[1])) self.tokens = tokens - tensor = torch.from_numpy(vectors) - # NOTE: We make two embedding modules, but since they share the same memory, - # there's no overhead. - # Gradients are also integrated into both. - self.embedding_bag = EmbeddingBag.from_pretrained(tensor, mode="mean") - self.embedding = Embedding.from_pretrained(tensor) + self.embedding = vectors if len(tokens) != vectors.shape[0]: raise ValueError(f"Number of tokens ({len(tokens)}) does not match number of vectors ({vectors.shape[0]})") @@ -75,12 +67,7 @@ def __init__( @property def dim(self) -> int: """Get the dimension of the model.""" - return self.embedding.weight.shape[1] - - @property - def device(self) -> torch.device: - """Get the device of the model.""" - return next(self.parameters()).device + return self.embedding.shape[1] @property def normalize(self) -> bool: @@ -111,7 +98,7 @@ def save_pretrained(self, path: PathLike, model_name: str | None = None) -> None """ save_pretrained( folder_path=Path(path), - embeddings=self.embedding.weight.cpu().numpy(), + embeddings=self.embedding, tokenizer=self.tokenizer, config=self.config, base_model_name=self.base_model_name, @@ -119,31 +106,7 @@ def save_pretrained(self, path: PathLike, model_name: str | None = None) -> None model_name=model_name, ) - def forward(self, X: tuple[torch.Tensor, torch.Tensor]) -> torch.Tensor: - """ - Helper method to facilitate training. - - :param X: a tuple of ids and offsets. - :return: A padded output tensor. - """ - ids, offsets = X - return self.embedding_bag(ids, offsets) - - def forward_mean(self, ids: torch.Tensor, offsets: torch.Tensor) -> torch.Tensor: - """ - Forward pass of the model. - - :param ids: The input tensor. - :param offsets: The offsets tensor. - :return: The output tensor. - """ - means = self.embedding_bag(ids, offsets) - - if self.normalize: - return torch.nn.functional.normalize(means) - return means - - def tokenize(self, sentences: list[str], max_length: int | None = None) -> tuple[torch.Tensor, torch.Tensor]: + def tokenize(self, sentences: list[str], max_length: int | None = None) -> list[int]: """ Tokenize a sentence. @@ -166,10 +129,7 @@ def tokenize(self, sentences: list[str], max_length: int | None = None) -> tuple if max_length is not None: encodings_ids = [token_ids[:max_length] for token_ids in encodings_ids] - offsets = torch.from_numpy(np.cumsum([0] + [len(token_ids) for token_ids in encodings_ids[:-1]])) - ids = torch.tensor([token_id for token_ids in encodings_ids for token_id in token_ids], dtype=torch.long) - - return ids, offsets + return encodings_ids @classmethod def from_pretrained( @@ -193,7 +153,11 @@ def from_pretrained( ) def encode_as_sequence( - self, sentences: list[str] | str, max_length: int | None = None + self, + sentences: list[str] | str, + max_length: int | None = None, + batch_size: int = 1024, + show_progressbar: bool = False, ) -> list[np.ndarray] | np.ndarray: """ Encode a list of sentences as a list of numpy arrays of tokens. @@ -207,31 +171,35 @@ def encode_as_sequence( :param sentences: The list of sentences to encode. :param max_length: The maximum length of the sentences. Any tokens beyond this length will be truncated. If this is None, no truncation is done. + :param batch_size: The batch size to use. + :param show_progressbar: Whether to show the progress bar. :return: The encoded sentences with an embedding per token. """ was_single = False if isinstance(sentences, str): - was_single = True sentences = [sentences] + was_single = True - ids, offsets = self.tokenize(sentences=sentences, max_length=max_length) - ids = ids.to(self.device) - offsets = offsets.to(self.device) - - out = [tensor.cpu().numpy() for tensor in self._sub_encode_as_sequence(ids, offsets)] + out_array: list[np.ndarray] = [] + for batch in tqdm( + self._batch(sentences, batch_size), total=(len(sentences) // batch_size) + 1, disable=not show_progressbar + ): + out_array.extend(self._encode_batch_as_sequence(batch, max_length)) if was_single: - return out[0] + return out_array[0] - return out + return out_array - def _sub_encode_as_sequence(self, ids: torch.Tensor, offsets: torch.Tensor) -> list[torch.Tensor]: - """Helper function to reduce deduplication.""" - out = [] - for x in range(len(offsets) - 1): - start, end = offsets[x], offsets[x + 1] - out.append(self.embedding(ids[start:end])) - out.append(self.embedding(ids[offsets[-1] :])) + def _encode_batch_as_sequence(self, sentences: list[str], max_length: int | None) -> list[np.ndarray]: + """Encode a batch of sentences as a sequence.""" + ids = self.tokenize(sentences=sentences, max_length=max_length) + out: list[np.ndarray] = [] + for id_list in ids: + if id_list: + out.append(self.embedding[id_list]) + else: + out.append(np.zeros((0, self.dim))) return out @@ -275,13 +243,21 @@ def encode( return out_array - @torch.no_grad() def _encode_batch(self, sentences: list[str], max_length: int | None) -> np.ndarray: """Encode a batch of sentences.""" - ids, offsets = self.tokenize(sentences, max_length) - ids = ids.to(self.device) - offsets = offsets.to(self.device) - return self.forward_mean(ids, offsets).cpu().numpy() + ids = self.tokenize(sentences=sentences, max_length=max_length) + out: list[np.ndarray] = [] + for id_list in ids: + if id_list: + out.append(self.embedding[id_list].mean(0)) + else: + out.append(np.zeros(self.dim)) + + out_array = np.stack(out) + if self.normalize: + out_array = out_array / np.linalg.norm(out_array, axis=1, keepdims=True) + + return out_array @staticmethod def _batch(sentences: list[str], batch_size: int) -> Iterator[list[str]]: diff --git a/model2vec/utils.py b/model2vec/utils.py index 7ec8ee7..66763c2 100644 --- a/model2vec/utils.py +++ b/model2vec/utils.py @@ -1,28 +1,43 @@ # -*- coding: utf-8 -*- -import json import logging -from pathlib import Path -from typing import Any, Protocol, cast +from importlib import import_module +from importlib.metadata import metadata +from typing import Iterator -import click -import huggingface_hub -import huggingface_hub.errors -import numpy as np -import safetensors -from huggingface_hub import ModelCard, ModelCardData from rich.logging import RichHandler -from safetensors.numpy import save_file -from tokenizers import Tokenizer logger = logging.getLogger(__name__) -class SafeOpenProtocol(Protocol): - """Protocol to fix safetensors safe open.""" - - def get_tensor(self, key: str) -> np.ndarray: - """Get a tensor.""" - ... +_MODULE_MAP = (("scikit-learn", "sklearn"),) + + +def get_package_extras(package: str, extra: str) -> Iterator[str]: + """Get the extras of the package.""" + message = metadata(package) + all_packages = message.get_all("Requires-Dist") + if all_packages is None: + return + for package in all_packages: + name, *rest = package.split(";", maxsplit=1) + if not rest: + continue + _, found_extra = rest[0].split("==", maxsplit=1) + # Strip off quotes + found_extra = found_extra.strip(' "') + if found_extra == extra: + yield name + + +def importable(module: str, extra: str) -> None: + """Check if a module is importable.""" + module = dict(_MODULE_MAP).get(module, module) + try: + import_module(module) + except ImportError: + raise ImportError( + f"`{module}`, is required. Please reinstall model2vec with the `distill` extra. `pip install model2vec[{extra}]`" + ) def setup_logging() -> None: @@ -31,185 +46,5 @@ def setup_logging() -> None: level="INFO", format="%(name)s - %(message)s", datefmt="%Y-%m-%d %H:%M:%S", - handlers=[RichHandler(rich_tracebacks=True, tracebacks_suppress=[click])], - ) - - -def save_pretrained( - folder_path: Path, - embeddings: np.ndarray, - tokenizer: Tokenizer, - config: dict[str, Any], - create_model_card: bool = True, - **kwargs: Any, -) -> None: - """ - Save a model to a folder. - - :param folder_path: The path to the folder. - :param embeddings: The embeddings. - :param tokenizer: The tokenizer. - :param config: A metadata config. - :param create_model_card: Whether to create a model card. - :param **kwargs: Any additional arguments. - """ - folder_path.mkdir(exist_ok=True, parents=True) - save_file({"embeddings": embeddings}, folder_path / "model.safetensors") - tokenizer.save(str(folder_path / "tokenizer.json")) - json.dump(config, open(folder_path / "config.json", "w")) - - logger.info(f"Saved model to {folder_path}") - - # Optionally create the model card - if create_model_card: - _create_model_card(folder_path, **kwargs) - - -def _create_model_card( - folder_path: Path, - base_model_name: str = "unknown", - license: str = "mit", - language: list[str] | None = None, - model_name: str | None = None, - **kwargs: Any, -) -> None: - """ - Create a model card and store it in the specified path. - - :param folder_path: The path where the model card will be stored. - :param base_model_name: The name of the base model. - :param license: The license to use. - :param language: The language of the model. - :param model_name: The name of the model to use in the Model Card. - :param **kwargs: Additional metadata for the model card (e.g., model_name, base_model, etc.). - """ - folder_path = Path(folder_path) - model_name = model_name or folder_path.name - template_path = Path(__file__).parent / "model_card_template.md" - - model_card_data = ModelCardData( - model_name=model_name, - base_model=base_model_name, - license=license, - language=language, - tags=["embeddings", "static-embeddings"], - library_name="model2vec", - **kwargs, + handlers=[RichHandler(rich_tracebacks=True)], ) - model_card = ModelCard.from_template(model_card_data, template_path=template_path) - model_card.save(folder_path / "README.md") - - -def load_pretrained( - folder_or_repo_path: str | Path, token: str | None = None -) -> tuple[np.ndarray, Tokenizer, dict[str, Any], dict[str, Any]]: - """ - Loads a pretrained model from a folder. - - :param folder_or_repo_path: The folder or repo path to load from. - - If this is a local path, we will load from the local path. - - If the local path is not found, we will attempt to load from the huggingface hub. - :param token: The huggingface token to use. - :raises: FileNotFoundError if the folder exists, but the file does not exist locally. - :return: The embeddings, tokenizer, config, and metadata. - - """ - folder_or_repo_path = Path(folder_or_repo_path) - if folder_or_repo_path.exists(): - embeddings_path = folder_or_repo_path / "model.safetensors" - if not embeddings_path.exists(): - old_embeddings_path = folder_or_repo_path / "embeddings.safetensors" - if old_embeddings_path.exists(): - logger.warning("Old embeddings file found. Please rename to `model.safetensors` and re-save.") - embeddings_path = old_embeddings_path - else: - raise FileNotFoundError(f"Embeddings file does not exist in {folder_or_repo_path}") - - config_path = folder_or_repo_path / "config.json" - if not config_path.exists(): - raise FileNotFoundError(f"Config file does not exist in {folder_or_repo_path}") - - tokenizer_path = folder_or_repo_path / "tokenizer.json" - if not tokenizer_path.exists(): - raise FileNotFoundError(f"Tokenizer file does not exist in {folder_or_repo_path}") - - # README is optional, so this is a bit finicky. - readme_path = folder_or_repo_path / "README.md" - metadata = _get_metadata_from_readme(readme_path) - - else: - logger.info("Folder does not exist locally, attempting to use huggingface hub.") - try: - embeddings_path = huggingface_hub.hf_hub_download( - folder_or_repo_path.as_posix(), "model.safetensors", token=token - ) - except huggingface_hub.utils.EntryNotFoundError as e: - try: - embeddings_path = huggingface_hub.hf_hub_download( - folder_or_repo_path.as_posix(), "embeddings.safetensors", token=token - ) - except huggingface_hub.utils.EntryNotFoundError: - # Raise original exception. - raise e - - try: - readme_path = huggingface_hub.hf_hub_download(folder_or_repo_path.as_posix(), "README.md", token=token) - metadata = _get_metadata_from_readme(Path(readme_path)) - except huggingface_hub.utils.EntryNotFoundError: - logger.info("No README found in the model folder. No model card loaded.") - metadata = {} - - config_path = huggingface_hub.hf_hub_download(folder_or_repo_path.as_posix(), "config.json", token=token) - tokenizer_path = huggingface_hub.hf_hub_download(folder_or_repo_path.as_posix(), "tokenizer.json", token=token) - - opened_tensor_file = cast(SafeOpenProtocol, safetensors.safe_open(embeddings_path, framework="numpy")) - embeddings = opened_tensor_file.get_tensor("embeddings") - - tokenizer: Tokenizer = Tokenizer.from_file(str(tokenizer_path)) - config = json.load(open(config_path)) - - if len(tokenizer.get_vocab()) != len(embeddings): - logger.warning( - f"Number of tokens does not match number of embeddings: `{len(tokenizer.get_vocab())}` vs `{len(embeddings)}`" - ) - - return embeddings, tokenizer, config, metadata - - -def _get_metadata_from_readme(readme_path: Path) -> dict[str, Any]: - """Get metadata from a README file.""" - if not readme_path.exists(): - logger.info(f"README file not found in {readme_path}. No model card loaded.") - return {} - model_card = ModelCard.load(readme_path) - data: dict[str, Any] = model_card.data.to_dict() - if not data: - logger.info("File README.md exists, but was empty. No model card loaded.") - return data - - -def push_folder_to_hub(folder_path: Path, repo_id: str, private: bool, token: str | None) -> None: - """ - Push a model folder to the huggingface hub, including model card. - - :param folder_path: The path to the folder. - :param repo_id: The repo name. - :param private: Whether the repo is private. - :param token: The huggingface token. - """ - if not huggingface_hub.repo_exists(repo_id=repo_id, token=token): - huggingface_hub.create_repo(repo_id, token=token, private=private) - - # Push model card and all model files to the Hugging Face hub - huggingface_hub.upload_folder(repo_id=repo_id, folder_path=folder_path, token=token) - - # Check if the model card exists, and push it if available - model_card_path = folder_path / "README.md" - if model_card_path.exists(): - card = ModelCard.load(model_card_path) - card.push_to_hub(repo_id=repo_id, token=token) - logger.info(f"Pushed model card to {repo_id}") - else: - logger.warning(f"Model card README.md not found in {folder_path}. Skipping model card upload.") - - logger.info(f"Pushed model to {repo_id}") diff --git a/pyproject.toml b/pyproject.toml index ae7af19..939e3dd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -22,15 +22,10 @@ classifiers = [ ] dependencies = [ - "click", "numpy", "rich", "tqdm", - "typer", - "transformers", - "torch", "tokenizers", - "scikit-learn", "setuptools", ] @@ -55,14 +50,13 @@ dev = [ "pytest-coverage", "ruff", ] - +distill = ["torch", "transformers", "scikit-learn", "typer"] [project.urls] "Homepage" = "https://github.com/MinishLab" "Bug Reports" = "https://github.com/MinishLab/model2vec/issues" "Source" = "https://github.com/MinishLab/model2vec" - [tool.ruff] exclude = [".venv/"] line-length = 120 diff --git a/tests/conftest.py b/tests/conftest.py index f7d2222..c407b8e 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,6 +1,5 @@ from __future__ import annotations -from pathlib import Path from typing import Any import numpy as np diff --git a/tests/test_distillation.py b/tests/test_distillation.py index 36da266..819c95d 100644 --- a/tests/test_distillation.py +++ b/tests/test_distillation.py @@ -90,7 +90,7 @@ def test_distill_from_model( use_subword=use_subword, ) - assert static_model.embedding.weight.shape == static_model2.embedding.weight.shape + assert static_model.embedding.shape == static_model2.embedding.shape assert static_model.config == static_model2.config assert json.loads(static_model.tokenizer.to_str()) == json.loads(static_model2.tokenizer.to_str()) assert static_model.base_model_name == static_model2.base_model_name @@ -159,7 +159,7 @@ def test_distill( # Assert the model is correctly generated assert isinstance(static_model, StaticModel) - assert static_model.embedding.weight.shape == expected_shape + assert static_model.embedding.shape == expected_shape assert "mock-model" in static_model.config["tokenizer_name"] assert static_model.tokenizer is not None diff --git a/tests/test_model.py b/tests/test_model.py index f6d8810..39be599 100644 --- a/tests/test_model.py +++ b/tests/test_model.py @@ -10,7 +10,7 @@ def test_initialization(mock_vectors: np.ndarray, mock_tokenizer: Tokenizer, mock_config: dict[str, str]) -> None: """Test successful initialization of StaticModel.""" model = StaticModel(vectors=mock_vectors, tokenizer=mock_tokenizer, config=mock_config) - assert model.embedding.weight.shape == (5, 2) + assert model.embedding.shape == (5, 2) assert len(model.tokens) == 5 assert model.tokenizer == mock_tokenizer assert model.config == mock_config @@ -60,21 +60,11 @@ def test_encode_as_tokens_empty( """Test encoding of an empty list of sentences.""" model = StaticModel(vectors=mock_vectors, tokenizer=mock_tokenizer, config=mock_config) encoded = model.encode_as_sequence("") - assert np.array_equal(encoded, np.zeros(shape=(0, 2), dtype=model.embedding.weight.numpy().dtype)) + assert np.array_equal(encoded, np.zeros(shape=(0, 2), dtype=model.embedding.dtype)) encoded = model.encode_as_sequence(["", ""]) - out = [np.zeros(shape=(0, 2), dtype=model.embedding.weight.numpy().dtype) for _ in range(2)] - assert np.array_equal(encoded, out) - - -def test_forward(mock_vectors: np.ndarray, mock_tokenizer: Tokenizer, mock_config: dict[str, str]) -> None: - """Test forward pass of the model.""" - model = StaticModel(vectors=mock_vectors, tokenizer=mock_tokenizer, config=mock_config) - encoded = model.forward(model.tokenize(["word1 word2"])) - assert encoded.shape == (1, model.embedding.weight.shape[1]) - - encoded = model.forward(model.tokenize(["word1", "word1 word2 word1"])) - assert encoded.shape == (2, model.embedding.weight.shape[1]) + out = [np.zeros(shape=(0, 2), dtype=model.embedding.dtype) for _ in range(2)] + assert [np.array_equal(x, y) for x, y in zip(encoded, out)] def test_encode_empty_sentence( @@ -130,7 +120,7 @@ def test_load_pretrained( loaded_model = StaticModel.from_pretrained(save_path) # Assert that the loaded model has the same properties as the original one - np.testing.assert_array_equal(loaded_model.embedding.weight.numpy(), mock_vectors) + np.testing.assert_array_equal(loaded_model.embedding, mock_vectors) assert loaded_model.tokenizer.get_vocab() == mock_tokenizer.get_vocab() assert loaded_model.config == mock_config @@ -166,4 +156,4 @@ def test_dim(mock_vectors: np.ndarray, mock_tokenizer: Tokenizer, mock_config: d """Tests the dimensionality of the model.""" model = StaticModel(mock_vectors, mock_tokenizer, mock_config) assert model.dim == 2 - assert model.dim == model.embedding.weight.shape[1] + assert model.dim == model.embedding.shape[1] diff --git a/tests/test_utils.py b/tests/test_utils.py index d6219e0..704b33e 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -5,7 +5,8 @@ import pytest from model2vec.distill.utils import select_optimal_device -from model2vec.utils import _get_metadata_from_readme +from model2vec.hf_utils import _get_metadata_from_readme +from model2vec.utils import get_package_extras, importable def test__get_metadata_from_readme_not_exists() -> None: @@ -50,3 +51,22 @@ def test_select_optimal_device(device: str | None, expected: str, cuda: bool, mp patch("torch.backends.mps.is_available", return_value=mps), ): assert select_optimal_device(device) == expected + + +def test_importable() -> None: + """Test the importable function.""" + with pytest.raises(ImportError): + importable("clown", "clown") + + importable("os", "clown") + + +def test_get_package_extras() -> None: + """Test package extras.""" + extras = set(get_package_extras("model2vec", "distill")) + assert extras == {"torch", "transformers", "typer", "scikit-learn"} + + +def test_get_package_extras_empty() -> None: + """Test package extras with an empty package.""" + assert not list(get_package_extras("tqdm", "clown")) diff --git a/uv.lock b/uv.lock index 30ee1f4..c5102b8 100644 --- a/uv.lock +++ b/uv.lock @@ -436,16 +436,11 @@ name = "model2vec" version = "0.2.4" source = { editable = "." } dependencies = [ - { name = "click" }, { name = "numpy" }, { name = "rich" }, - { name = "scikit-learn" }, { name = "setuptools" }, { name = "tokenizers" }, - { name = "torch" }, { name = "tqdm" }, - { name = "transformers" }, - { name = "typer" }, ] [package.optional-dependencies] @@ -458,11 +453,16 @@ dev = [ { name = "pytest-coverage" }, { name = "ruff" }, ] +distill = [ + { name = "scikit-learn" }, + { name = "torch" }, + { name = "transformers" }, + { name = "typer" }, +] [package.metadata] requires-dist = [ { name = "black", marker = "extra == 'dev'" }, - { name = "click" }, { name = "ipython", marker = "extra == 'dev'" }, { name = "mypy", marker = "extra == 'dev'" }, { name = "numpy" }, @@ -471,13 +471,13 @@ requires-dist = [ { name = "pytest-coverage", marker = "extra == 'dev'" }, { name = "rich" }, { name = "ruff", marker = "extra == 'dev'" }, - { name = "scikit-learn" }, + { name = "scikit-learn", marker = "extra == 'distill'" }, { name = "setuptools" }, { name = "tokenizers" }, - { name = "torch" }, + { name = "torch", marker = "extra == 'distill'" }, { name = "tqdm" }, - { name = "transformers" }, - { name = "typer" }, + { name = "transformers", marker = "extra == 'distill'" }, + { name = "typer", marker = "extra == 'distill'" }, ] [[package]] From a0f8c2b40aa5b53b44054480d74d4771677c38fe Mon Sep 17 00:00:00 2001 From: Stephan Tulkens Date: Wed, 16 Oct 2024 14:58:26 +0200 Subject: [PATCH 11/30] feat: local loading (#88) * Add numpy inference * Fix numpy inference * Add flexible import mechanism * Fix readme * Re-add examples * Separate utils and hf_utils * Fix test * Add superfast local loading * Add imports within functions * feat: add extremely fast loading * add more tests * Fix tests --- model2vec/hf_utils.py | 12 +++------- model2vec/model.py | 35 ++++++++++++++++++++++++++-- model2vec/utils.py | 46 +++++++++++++++++++++++++++++++++---- tests/test_model.py | 22 ++++++++++++++++++ tests/test_utils.py | 53 ++++++++++++++++++++++++++++++++++++++++--- 5 files changed, 149 insertions(+), 19 deletions(-) diff --git a/model2vec/hf_utils.py b/model2vec/hf_utils.py index 63b7ec3..0a2363a 100644 --- a/model2vec/hf_utils.py +++ b/model2vec/hf_utils.py @@ -1,7 +1,7 @@ import json import logging from pathlib import Path -from typing import Any, Protocol, cast +from typing import Any, cast import huggingface_hub import huggingface_hub.errors @@ -11,15 +11,9 @@ from safetensors.numpy import save_file from tokenizers import Tokenizer -logger = logging.getLogger(__name__) - +from model2vec.utils import SafeOpenProtocol -class SafeOpenProtocol(Protocol): - """Protocol to fix safetensors safe open.""" - - def get_tensor(self, key: str) -> np.ndarray: - """Get a tensor.""" - ... +logger = logging.getLogger(__name__) def save_pretrained( diff --git a/model2vec/model.py b/model2vec/model.py index 367e23b..8645fb4 100644 --- a/model2vec/model.py +++ b/model2vec/model.py @@ -9,7 +9,7 @@ from tokenizers import Encoding, Tokenizer from tqdm import tqdm -from model2vec.hf_utils import load_pretrained, push_folder_to_hub, save_pretrained +from model2vec.utils import load_local_model PathLike = Path | str @@ -52,7 +52,7 @@ def __init__( if hasattr(self.tokenizer.model, "unk_token") and self.tokenizer.model.unk_token is not None: self.unk_token_id = tokenizer.get_vocab()[self.tokenizer.model.unk_token] else: - self.unk_token_id = None + self.unk_token_id = None # pragma: no cover # Doesn't actually happen, but can happen. self.median_token_length = int(np.median([len(token) for token in self.tokens])) self.config = config or {} @@ -96,6 +96,8 @@ def save_pretrained(self, path: PathLike, model_name: str | None = None) -> None :param path: The path to save to. :param model_name: The model name to use in the Model Card. """ + from model2vec.hf_utils import save_pretrained + save_pretrained( folder_path=Path(path), embeddings=self.embedding, @@ -146,6 +148,8 @@ def from_pretrained( :param token: The huggingface token to use. :return: A StaticModel """ + from model2vec.hf_utils import load_pretrained + embeddings, tokenizer, config, metadata = load_pretrained(path, token=token) return cls( @@ -275,6 +279,33 @@ def push_to_hub(self, repo_id: str, private: bool = False, token: str | None = N If the repo already exists, this doesn't change the visibility. :param token: The huggingface token to use. """ + from model2vec.hf_utils import push_folder_to_hub + with TemporaryDirectory() as temp_dir: self.save_pretrained(temp_dir, model_name=repo_id) push_folder_to_hub(Path(temp_dir), repo_id, private, token) + + @classmethod + def load_local(cls: type[StaticModel], path: PathLike) -> StaticModel: + """ + Loads a model from a local path. + + You should only use this code path if you are concerned with start-up time. + Loading via the `from_pretrained` method is safer, and auto-downloads, but + also means we import a whole bunch of huggingface code that we don't need. + + Additionally, huggingface will check the most recent version of the model, + which can be slow. + + :param path: The path to load the model from. The path is a directory saved by the + `save_pretrained` method. + :return: A StaticModel + :raises: ValueError if the path is not a directory. + """ + path = Path(path) + if not path.is_dir(): + raise ValueError(f"Path {path} is not a directory.") + + embeddings, tokenizer, config = load_local_model(path) + + return StaticModel(embeddings, tokenizer, config) diff --git a/model2vec/utils.py b/model2vec/utils.py index 66763c2..073f5d0 100644 --- a/model2vec/utils.py +++ b/model2vec/utils.py @@ -1,23 +1,33 @@ # -*- coding: utf-8 -*- +import json import logging from importlib import import_module from importlib.metadata import metadata -from typing import Iterator +from pathlib import Path +from typing import Iterator, Protocol, cast -from rich.logging import RichHandler +import numpy as np +import safetensors +from tokenizers import Tokenizer logger = logging.getLogger(__name__) +class SafeOpenProtocol(Protocol): + """Protocol to fix safetensors safe open.""" + + def get_tensor(self, key: str) -> np.ndarray: + """Get a tensor.""" + ... # pragma: no cover + + _MODULE_MAP = (("scikit-learn", "sklearn"),) def get_package_extras(package: str, extra: str) -> Iterator[str]: """Get the extras of the package.""" message = metadata(package) - all_packages = message.get_all("Requires-Dist") - if all_packages is None: - return + all_packages = message.get_all("Requires-Dist") or [] for package in all_packages: name, *rest = package.split(";", maxsplit=1) if not rest: @@ -42,9 +52,35 @@ def importable(module: str, extra: str) -> None: def setup_logging() -> None: """Simple logging setup.""" + from rich.logging import RichHandler + logging.basicConfig( level="INFO", format="%(name)s - %(message)s", datefmt="%Y-%m-%d %H:%M:%S", handlers=[RichHandler(rich_tracebacks=True)], ) + + +def load_local_model(folder: Path) -> tuple[np.ndarray, Tokenizer, dict[str, str]]: + """Load a local model.""" + embeddings_path = folder / "model.safetensors" + tokenizer_path = folder / "tokenizer.json" + config_path = folder / "config.json" + + opened_tensor_file = cast(SafeOpenProtocol, safetensors.safe_open(embeddings_path, framework="numpy")) + embeddings = opened_tensor_file.get_tensor("embeddings") + + if config_path.exists(): + config = json.load(open(config_path)) + else: + config = {} + + tokenizer: Tokenizer = Tokenizer.from_file(str(tokenizer_path)) + + if len(tokenizer.get_vocab()) != len(embeddings): + logger.warning( + f"Number of tokens does not match number of embeddings: `{len(tokenizer.get_vocab())}` vs `{len(embeddings)}`" + ) + + return embeddings, tokenizer, config diff --git a/tests/test_model.py b/tests/test_model.py index 39be599..3064407 100644 --- a/tests/test_model.py +++ b/tests/test_model.py @@ -1,7 +1,9 @@ from pathlib import Path +from tempfile import TemporaryDirectory import numpy as np import pytest +import safetensors from tokenizers import Tokenizer from model2vec import StaticModel @@ -157,3 +159,23 @@ def test_dim(mock_vectors: np.ndarray, mock_tokenizer: Tokenizer, mock_config: d model = StaticModel(mock_vectors, mock_tokenizer, mock_config) assert model.dim == 2 assert model.dim == model.embedding.shape[1] + + +def test_local_load_from_model(mock_tokenizer: Tokenizer) -> None: + """Test local load from a model.""" + x = np.ones((mock_tokenizer.get_vocab_size(), 2)) + with TemporaryDirectory() as tempdir: + tempdir_path = Path(tempdir) + safetensors.numpy.save_file({"embeddings": x}, Path(tempdir) / "model.safetensors") + mock_tokenizer.save(str(Path(tempdir) / "tokenizer.json")) + + model = StaticModel.load_local(tempdir_path) + assert model.embedding.shape == x.shape + assert model.tokenizer.to_str() == mock_tokenizer.to_str() + assert model.config == {"normalize": False} + + +def test_local_load_from_model_no_folder() -> None: + """Test local load from a model with no folder.""" + with pytest.raises(ValueError): + StaticModel.load_local("woahbuddy_relax_this_is_just_a_test") diff --git a/tests/test_utils.py b/tests/test_utils.py index 704b33e..2e9c794 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -1,12 +1,18 @@ +import json from pathlib import Path -from tempfile import NamedTemporaryFile +from tempfile import NamedTemporaryFile, TemporaryDirectory +from typing import Any from unittest.mock import patch +import numpy as np import pytest +import safetensors +import safetensors.numpy +from tokenizers import Tokenizer from model2vec.distill.utils import select_optimal_device from model2vec.hf_utils import _get_metadata_from_readme -from model2vec.utils import get_package_extras, importable +from model2vec.utils import get_package_extras, importable, load_local_model def test__get_metadata_from_readme_not_exists() -> None: @@ -69,4 +75,45 @@ def test_get_package_extras() -> None: def test_get_package_extras_empty() -> None: """Test package extras with an empty package.""" - assert not list(get_package_extras("tqdm", "clown")) + assert not list(get_package_extras("tqdm", "")) + + +@pytest.mark.parametrize( + "config, expected", + [ + ({"dog": "cat"}, {"dog": "cat"}), + ({}, {}), + (None, {}), + ], +) +def test_local_load(mock_tokenizer: Tokenizer, config: dict[str, Any], expected: dict[str, Any]) -> None: + """Test local loading.""" + x = np.ones((mock_tokenizer.get_vocab_size(), 2)) + + with TemporaryDirectory() as tempdir: + tempdir_path = Path(tempdir) + safetensors.numpy.save_file({"embeddings": x}, Path(tempdir) / "model.safetensors") + mock_tokenizer.save(str(Path(tempdir) / "tokenizer.json")) + if config is not None: + json.dump(config, open(tempdir_path / "config.json", "w")) + arr, tokenizer, config = load_local_model(tempdir_path) + assert config == expected + assert tokenizer.to_str() == mock_tokenizer.to_str() + assert arr.shape == x.shape + + +def test_local_load_mismatch(mock_tokenizer: Tokenizer, caplog: pytest.LogCaptureFixture) -> None: + """Test local loading.""" + x = np.ones((10, 2)) + + with TemporaryDirectory() as tempdir: + tempdir_path = Path(tempdir) + safetensors.numpy.save_file({"embeddings": x}, Path(tempdir) / "model.safetensors") + mock_tokenizer.save(str(Path(tempdir) / "tokenizer.json")) + + load_local_model(tempdir_path) + expected = ( + f"Number of tokens does not match number of embeddings: `{len(mock_tokenizer.get_vocab())}` vs `{len(x)}`" + ) + assert len(caplog.records) == 1 + assert caplog.records[0].message == expected From 29e8ebcd09343297f1ee070237ed492a55499173 Mon Sep 17 00:00:00 2001 From: Pringled Date: Wed, 16 Oct 2024 17:13:44 +0200 Subject: [PATCH 12/30] Switched to math ceil --- model2vec/model.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/model2vec/model.py b/model2vec/model.py index 8645fb4..ec105da 100644 --- a/model2vec/model.py +++ b/model2vec/model.py @@ -1,5 +1,6 @@ from __future__ import annotations +import math from logging import getLogger from pathlib import Path from tempfile import TemporaryDirectory @@ -186,7 +187,9 @@ def encode_as_sequence( out_array: list[np.ndarray] = [] for batch in tqdm( - self._batch(sentences, batch_size), total=(len(sentences) // batch_size) + 1, disable=not show_progressbar + self._batch(sentences, batch_size), + total=math.ceil(len(sentences) / batch_size), + disable=not show_progressbar, ): out_array.extend(self._encode_batch_as_sequence(batch, max_length)) @@ -236,7 +239,9 @@ def encode( out_arrays: list[np.ndarray] = [] for batch in tqdm( - self._batch(sentences, batch_size), total=(len(sentences) // batch_size) + 1, disable=not show_progressbar + self._batch(sentences, batch_size), + total=math.ceil(len(sentences) / batch_size), + disable=not show_progressbar, ): out_arrays.append(self._encode_batch(batch, max_length)) From 70a4fe8ec42bc664f888ce3a82e915b02aa35983 Mon Sep 17 00:00:00 2001 From: Stephan Tulkens Date: Wed, 16 Oct 2024 21:53:44 +0200 Subject: [PATCH 13/30] feat: faster tokenization (#89) --- model2vec/model.py | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/model2vec/model.py b/model2vec/model.py index ec105da..9b83b53 100644 --- a/model2vec/model.py +++ b/model2vec/model.py @@ -121,7 +121,7 @@ def tokenize(self, sentences: list[str], max_length: int | None = None) -> list[ m = max_length * self.median_token_length sentences = [sentence[:m] for sentence in sentences] - encodings: list[Encoding] = self.tokenizer.encode_batch(sentences, add_special_tokens=False) + encodings: list[Encoding] = self.tokenizer.encode_batch_fast(sentences, add_special_tokens=False) encodings_ids = [encoding.ids for encoding in encodings] if self.unk_token_id is not None: diff --git a/pyproject.toml b/pyproject.toml index 939e3dd..b7714e5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -25,7 +25,7 @@ dependencies = [ "numpy", "rich", "tqdm", - "tokenizers", + "tokenizers>=0.20", "setuptools", ] From 31e74ec9b36d7ac41d00f2a00f08ec7ef4cba490 Mon Sep 17 00:00:00 2001 From: Stephan Tulkens Date: Thu, 17 Oct 2024 09:28:30 +0200 Subject: [PATCH 14/30] enhancement: Add dynamic version (#91) * feat: add dynamic version * Add dynamic versioning --- model2vec/__init__.py | 3 +- model2vec/version.py | 2 + pyproject.toml | 5 ++- uv.lock | 100 +++++++++++++++++++++--------------------- 4 files changed, 58 insertions(+), 52 deletions(-) create mode 100644 model2vec/version.py diff --git a/model2vec/__init__.py b/model2vec/__init__.py index 21cd126..7112ba0 100644 --- a/model2vec/__init__.py +++ b/model2vec/__init__.py @@ -1,3 +1,4 @@ from model2vec.model import StaticModel +from model2vec.version import __version__ -__all__ = ["StaticModel"] +__all__ = ["StaticModel", "__version__"] diff --git a/model2vec/version.py b/model2vec/version.py new file mode 100644 index 0000000..5feea58 --- /dev/null +++ b/model2vec/version.py @@ -0,0 +1,2 @@ +__version_triple__ = (0, 2, 4) +__version__ = ".".join(map(str, __version_triple__)) diff --git a/pyproject.toml b/pyproject.toml index b7714e5..c4523a9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,9 +3,9 @@ name = "model2vec" description = "Distill a Small Fast Model from any Sentence Transformer" readme = { file = "README.md", content-type = "text/markdown" } license = { file = "LICENSE" } -version = "0.2.4" requires-python = ">=3.10" authors = [{ name = "Stéphan Tulkens", email = "stephantul@gmail.com"}, {name = "Thomas van Dongen", email = "thomas123@live.nl"}] +dynamic = ["version"] classifiers = [ "Development Status :: 4 - Beta", @@ -102,3 +102,6 @@ ignore_missing_imports = true [tool.setuptools_scm] # can be empty if no extra settings are needed, presence enables setuptools_scm + +[tool.setuptools.dynamic] +version = {attr = "model2vec.version.__version__"} diff --git a/uv.lock b/uv.lock index c5102b8..104b22a 100644 --- a/uv.lock +++ b/uv.lock @@ -473,7 +473,7 @@ requires-dist = [ { name = "ruff", marker = "extra == 'dev'" }, { name = "scikit-learn", marker = "extra == 'distill'" }, { name = "setuptools" }, - { name = "tokenizers" }, + { name = "tokenizers", specifier = ">=0.20" }, { name = "torch", marker = "extra == 'distill'" }, { name = "tqdm" }, { name = "transformers", marker = "extra == 'distill'" }, @@ -1200,56 +1200,56 @@ wheels = [ [[package]] name = "tokenizers" -version = "0.19.1" +version = "0.20.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "huggingface-hub" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/48/04/2071c150f374aab6d5e92aaec38d0f3c368d227dd9e0469a1f0966ac68d1/tokenizers-0.19.1.tar.gz", hash = "sha256:ee59e6680ed0fdbe6b724cf38bd70400a0c1dd623b07ac729087270caeac88e3", size = 321039 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/60/91cac8d496b304ec5a22f07606893cad35ea8e1a8406dc8909e365f97a80/tokenizers-0.19.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:952078130b3d101e05ecfc7fc3640282d74ed26bcf691400f872563fca15ac97", size = 2533301 }, - { url = "https://files.pythonhosted.org/packages/4c/12/9cb68762ff5fee1efd51aefe2f62cb225f26f060a68a3779e1060bbc7a59/tokenizers-0.19.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:82c8b8063de6c0468f08e82c4e198763e7b97aabfe573fd4cf7b33930ca4df77", size = 2440223 }, - { url = "https://files.pythonhosted.org/packages/e4/03/b2020e6a78fb994cff1ec962adc157c23109172a46b4fe451d6d0dd33fdb/tokenizers-0.19.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f03727225feaf340ceeb7e00604825addef622d551cbd46b7b775ac834c1e1c4", size = 3683779 }, - { url = "https://files.pythonhosted.org/packages/50/4e/2e5549a26dc6f9e434f83bebf16c2d7dc9dc3477cc0ec8b23ede4d465b90/tokenizers-0.19.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:453e4422efdfc9c6b6bf2eae00d5e323f263fff62b29a8c9cd526c5003f3f642", size = 3569431 }, - { url = "https://files.pythonhosted.org/packages/75/79/158626bd794e75551e0c6bb93f1cd3c9ba08ba14b181b98f09e95994f609/tokenizers-0.19.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:02e81bf089ebf0e7f4df34fa0207519f07e66d8491d963618252f2e0729e0b46", size = 3424739 }, - { url = "https://files.pythonhosted.org/packages/65/8e/5f4316976c26009f1ae0b6543f3d97af29afa5ba5dc145251e6a07314618/tokenizers-0.19.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b07c538ba956843833fee1190cf769c60dc62e1cf934ed50d77d5502194d63b1", size = 3965791 }, - { url = "https://files.pythonhosted.org/packages/6a/e1/5dbac9618709972434eea072670cd69fba1aa988e6200f16057722b4bf96/tokenizers-0.19.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e28cab1582e0eec38b1f38c1c1fb2e56bce5dc180acb1724574fc5f47da2a4fe", size = 4049879 }, - { url = "https://files.pythonhosted.org/packages/40/4f/eb78de4af3b17b589f43a369cbf0c3a7173f25c3d2cd93068852c07689aa/tokenizers-0.19.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b01afb7193d47439f091cd8f070a1ced347ad0f9144952a30a41836902fe09e", size = 3607049 }, - { url = "https://files.pythonhosted.org/packages/f5/f8/141dcb0f88e9452af8d20d14dd53aab5937222a2bb4f2c04bfed6829263c/tokenizers-0.19.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7fb297edec6c6841ab2e4e8f357209519188e4a59b557ea4fafcf4691d1b4c98", size = 9634084 }, - { url = "https://files.pythonhosted.org/packages/2e/be/debb7caa3f88ed54015170db16e07aa3a5fea2d3983d0dde92f98d888dc8/tokenizers-0.19.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2e8a3dd055e515df7054378dc9d6fa8c8c34e1f32777fb9a01fea81496b3f9d3", size = 9949480 }, - { url = "https://files.pythonhosted.org/packages/7a/e7/26bedf5d270d293d572a90bd66b0b030012aedb95d8ee87e8bcd446b76fb/tokenizers-0.19.1-cp310-none-win32.whl", hash = "sha256:7ff898780a155ea053f5d934925f3902be2ed1f4d916461e1a93019cc7250837", size = 2041462 }, - { url = "https://files.pythonhosted.org/packages/f4/85/d999b9a05fd101d48f1a365d68be0b109277bb25c89fb37a389d669f9185/tokenizers-0.19.1-cp310-none-win_amd64.whl", hash = "sha256:bea6f9947e9419c2fda21ae6c32871e3d398cba549b93f4a65a2d369662d9403", size = 2220036 }, - { url = "https://files.pythonhosted.org/packages/c8/d6/6e1d728d765eb4102767f071bf7f6439ab10d7f4a975c9217db65715207a/tokenizers-0.19.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:5c88d1481f1882c2e53e6bb06491e474e420d9ac7bdff172610c4f9ad3898059", size = 2533448 }, - { url = "https://files.pythonhosted.org/packages/90/79/d17a0f491d10817cd30f1121a07aa09c8e97a81114b116e473baf1577f09/tokenizers-0.19.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ddf672ed719b4ed82b51499100f5417d7d9f6fb05a65e232249268f35de5ed14", size = 2440254 }, - { url = "https://files.pythonhosted.org/packages/c7/28/2d11c3ff94f9d42eceb2ea549a06e3f166fe391c5a025e5d96fac898a3ac/tokenizers-0.19.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dadc509cc8a9fe460bd274c0e16ac4184d0958117cf026e0ea8b32b438171594", size = 3684971 }, - { url = "https://files.pythonhosted.org/packages/36/c6/537f22b57e6003904d35d07962dbde2f2e9bdd791d0241da976a4c7f8194/tokenizers-0.19.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfedf31824ca4915b511b03441784ff640378191918264268e6923da48104acc", size = 3568894 }, - { url = "https://files.pythonhosted.org/packages/af/ef/3c1deed14ec59b2c8e7e2fa27b2a53f7d101181277a43b89ab17d891ef2e/tokenizers-0.19.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac11016d0a04aa6487b1513a3a36e7bee7eec0e5d30057c9c0408067345c48d2", size = 3426873 }, - { url = "https://files.pythonhosted.org/packages/06/db/c0320c4798ac6bd12d2ef895bec9d10d216a3b4d6fff10e9d68883ea7edc/tokenizers-0.19.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76951121890fea8330d3a0df9a954b3f2a37e3ec20e5b0530e9a0044ca2e11fe", size = 3965050 }, - { url = "https://files.pythonhosted.org/packages/4c/8a/a166888d6cb14db55f5eb7ce0b1d4777d145aa27cbf4f945712cf6c29935/tokenizers-0.19.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b342d2ce8fc8d00f376af068e3274e2e8649562e3bc6ae4a67784ded6b99428d", size = 4047855 }, - { url = "https://files.pythonhosted.org/packages/a7/03/fb50fc03f86016b227a967c8d474f90230c885c0d18f78acdfda7a96ce56/tokenizers-0.19.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d16ff18907f4909dca9b076b9c2d899114dd6abceeb074eca0c93e2353f943aa", size = 3608228 }, - { url = "https://files.pythonhosted.org/packages/5b/cd/0385e1026e1e03732fd398e964792a3a8433918b166748c82507e014d748/tokenizers-0.19.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:706a37cc5332f85f26efbe2bdc9ef8a9b372b77e4645331a405073e4b3a8c1c6", size = 9633115 }, - { url = "https://files.pythonhosted.org/packages/25/50/8f8ad0bbdaf09d04b15e6502d1fa1c653754ed7e016e4ae009726aa1a4e4/tokenizers-0.19.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:16baac68651701364b0289979ecec728546133e8e8fe38f66fe48ad07996b88b", size = 9949062 }, - { url = "https://files.pythonhosted.org/packages/db/11/31be66710f1d14526f3588a441efadeb184e1e68458067007b20ead03c59/tokenizers-0.19.1-cp311-none-win32.whl", hash = "sha256:9ed240c56b4403e22b9584ee37d87b8bfa14865134e3e1c3fb4b2c42fafd3256", size = 2041039 }, - { url = "https://files.pythonhosted.org/packages/65/8e/6d7d72b28f22c422cff8beae10ac3c2e4376b9be721ef8167b7eecd1da62/tokenizers-0.19.1-cp311-none-win_amd64.whl", hash = "sha256:ad57d59341710b94a7d9dbea13f5c1e7d76fd8d9bcd944a7a6ab0b0da6e0cc66", size = 2220386 }, - { url = "https://files.pythonhosted.org/packages/63/90/2890cd096898dcdb596ee172cde40c0f54a9cf43b0736aa260a5501252af/tokenizers-0.19.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:621d670e1b1c281a1c9698ed89451395d318802ff88d1fc1accff0867a06f153", size = 2530580 }, - { url = "https://files.pythonhosted.org/packages/74/d1/f4e1e950adb36675dfd8f9d0f4be644f3f3aaf22a5677a4f5c81282b662e/tokenizers-0.19.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d924204a3dbe50b75630bd16f821ebda6a5f729928df30f582fb5aade90c818a", size = 2436682 }, - { url = "https://files.pythonhosted.org/packages/ed/30/89b321a16c58d233e301ec15072c0d3ed5014825e72da98604cd3ab2fba1/tokenizers-0.19.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4f3fefdc0446b1a1e6d81cd4c07088ac015665d2e812f6dbba4a06267d1a2c95", size = 3693494 }, - { url = "https://files.pythonhosted.org/packages/05/40/fa899f32de483500fbc78befd378fd7afba4270f17db707d1a78c0a4ddc3/tokenizers-0.19.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9620b78e0b2d52ef07b0d428323fb34e8ea1219c5eac98c2596311f20f1f9266", size = 3566541 }, - { url = "https://files.pythonhosted.org/packages/67/14/e7da32ae5fb4971830f1ef335932fae3fa57e76b537e852f146c850aefdf/tokenizers-0.19.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04ce49e82d100594715ac1b2ce87d1a36e61891a91de774755f743babcd0dd52", size = 3430792 }, - { url = "https://files.pythonhosted.org/packages/f2/4b/aae61bdb6ab584d2612170801703982ee0e35f8b6adacbeefe5a3b277621/tokenizers-0.19.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5c2ff13d157afe413bf7e25789879dd463e5a4abfb529a2d8f8473d8042e28f", size = 3962812 }, - { url = "https://files.pythonhosted.org/packages/0a/b6/f7b7ef89c4da7b20256e6eab23d3835f05d1ca8f451d31c16cbfe3cd9eb6/tokenizers-0.19.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3174c76efd9d08f836bfccaca7cfec3f4d1c0a4cf3acbc7236ad577cc423c840", size = 4024688 }, - { url = "https://files.pythonhosted.org/packages/80/54/12047a69f5b382d7ee72044dc89151a2dd0d13b2c9bdcc22654883704d31/tokenizers-0.19.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c9d5b6c0e7a1e979bec10ff960fae925e947aab95619a6fdb4c1d8ff3708ce3", size = 3610961 }, - { url = "https://files.pythonhosted.org/packages/52/b7/1e8a913d18ac28feeda42d4d2d51781874398fb59cd1c1e2653a4b5742ed/tokenizers-0.19.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a179856d1caee06577220ebcfa332af046d576fb73454b8f4d4b0ba8324423ea", size = 9631367 }, - { url = "https://files.pythonhosted.org/packages/ac/3d/2284f6d99f8f21d09352b88b8cfefa24ab88468d962aeb0aa15c20d76b32/tokenizers-0.19.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:952b80dac1a6492170f8c2429bd11fcaa14377e097d12a1dbe0ef2fb2241e16c", size = 9950121 }, - { url = "https://files.pythonhosted.org/packages/2a/94/ec3369dbc9b7200c14c8c7a1a04c78b7a7398d0c001e1b7d1ffe30eb93a0/tokenizers-0.19.1-cp312-none-win32.whl", hash = "sha256:01d62812454c188306755c94755465505836fd616f75067abcae529c35edeb57", size = 2044069 }, - { url = "https://files.pythonhosted.org/packages/0c/97/80bff6937e0c67d30c0facacd4f0bcf4254e581aa4995c73cef8c8640e56/tokenizers-0.19.1-cp312-none-win_amd64.whl", hash = "sha256:b70bfbe3a82d3e3fb2a5e9b22a39f8d1740c96c68b6ace0086b39074f08ab89a", size = 2214527 }, - { url = "https://files.pythonhosted.org/packages/cf/7b/38fb7207cde3d1dc5272411cd18178e6437cdc1ef08cac5d0e8cfd57f38c/tokenizers-0.19.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3b11853f17b54c2fe47742c56d8a33bf49ce31caf531e87ac0d7d13d327c9334", size = 2532668 }, - { url = "https://files.pythonhosted.org/packages/1d/0d/2c452fe17fc17f0cdb713acb811eebb1f714b8c21d497c4672af4f491229/tokenizers-0.19.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d26194ef6c13302f446d39972aaa36a1dda6450bc8949f5eb4c27f51191375bd", size = 2438321 }, - { url = "https://files.pythonhosted.org/packages/19/e0/f9e915d028b45798723eab59c253da28040aa66b9f31dcb7cfc3be88fa37/tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e8d1ed93beda54bbd6131a2cb363a576eac746d5c26ba5b7556bc6f964425594", size = 3682304 }, - { url = "https://files.pythonhosted.org/packages/ce/2b/db8a94608c392752681c2ca312487b7cd5bcc4f77e24a90daa4916138271/tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca407133536f19bdec44b3da117ef0d12e43f6d4b56ac4c765f37eca501c7bda", size = 3566208 }, - { url = "https://files.pythonhosted.org/packages/d8/58/2e998462677c4c0eb5123ce386bcb488a155664d273d0283122866515f09/tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce05fde79d2bc2e46ac08aacbc142bead21614d937aac950be88dc79f9db9022", size = 3605791 }, - { url = "https://files.pythonhosted.org/packages/83/ac/26bc2e2bb2a054dc2e51699628936f5474e093b68da6ccdde04b2fc39ab8/tokenizers-0.19.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:35583cd46d16f07c054efd18b5d46af4a2f070a2dd0a47914e66f3ff5efb2b1e", size = 9632867 }, - { url = "https://files.pythonhosted.org/packages/45/b6/36c1bb106bbe96012c9367df89ed01599cada036c0b96d38fbbdbeb75c9f/tokenizers-0.19.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:43350270bfc16b06ad3f6f07eab21f089adb835544417afda0f83256a8bf8b75", size = 9945103 }, +sdist = { url = "https://files.pythonhosted.org/packages/d7/fb/373b66ba58cbf5eda371480e4e051d8892ea1433a73f1f92c48657a699a6/tokenizers-0.20.1.tar.gz", hash = "sha256:84edcc7cdeeee45ceedb65d518fffb77aec69311c9c8e30f77ad84da3025f002", size = 339552 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/72/d2/3c05efeeccefa833b82038ce49ee736756eed10ab66fc723ce423a747b0e/tokenizers-0.20.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:439261da7c0a5c88bda97acb284d49fbdaf67e9d3b623c0bfd107512d22787a9", size = 2673220 }, + { url = "https://files.pythonhosted.org/packages/24/d4/a529aa06db71600c1688210ce035cbff637ece919dcaca599c9235ad832d/tokenizers-0.20.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:03dae629d99068b1ea5416d50de0fea13008f04129cc79af77a2a6392792d93c", size = 2563056 }, + { url = "https://files.pythonhosted.org/packages/25/e2/5046ad3b0426548b37c96cc4262a7f2ba6ac9593ee10be69effc78a91764/tokenizers-0.20.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b61f561f329ffe4b28367798b89d60c4abf3f815d37413b6352bc6412a359867", size = 2943369 }, + { url = "https://files.pythonhosted.org/packages/5f/f0/c1ed45ff90088eba4f15eca9763b5e439cb86b71fc9e66a827318b61e44d/tokenizers-0.20.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ec870fce1ee5248a10be69f7a8408a234d6f2109f8ea827b4f7ecdbf08c9fd15", size = 2827000 }, + { url = "https://files.pythonhosted.org/packages/22/09/6e0a378a35f215b40ae1c04b4d0fe43e9ddfaf3a08a2b7d7fab8953a6587/tokenizers-0.20.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d388d1ea8b7447da784e32e3b86a75cce55887e3b22b31c19d0b186b1c677800", size = 3090881 }, + { url = "https://files.pythonhosted.org/packages/cf/03/801e91d41e2134a32089af2d382a6c40b3d8b932b42fa96443d77258ab28/tokenizers-0.20.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:299c85c1d21135bc01542237979bf25c32efa0d66595dd0069ae259b97fb2dbe", size = 3096826 }, + { url = "https://files.pythonhosted.org/packages/2a/39/3d11780b82d9ba4d8fda093daa48622ed5f2616d6ac8cb638ac290d39d95/tokenizers-0.20.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e96f6c14c9752bb82145636b614d5a78e9cde95edfbe0a85dad0dd5ddd6ec95c", size = 3417666 }, + { url = "https://files.pythonhosted.org/packages/4b/35/326b9642307a53b3d9ae145b5c7f157aae9ecaa930888f920124412e0bd2/tokenizers-0.20.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc9e95ad49c932b80abfbfeaf63b155761e695ad9f8a58c52a47d962d76e310f", size = 2984468 }, + { url = "https://files.pythonhosted.org/packages/db/b2/5e45632799d816291de4d04149decf19cf6c2faf42bb99574d80050c87bd/tokenizers-0.20.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f22dee205329a636148c325921c73cf3e412e87d31f4d9c3153b302a0200057b", size = 8981675 }, + { url = "https://files.pythonhosted.org/packages/df/f7/8c0ec102f0a723d09347ff6cd617c7e5e8d44efd342305f52a7fcd3e30e2/tokenizers-0.20.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a2ffd9a8895575ac636d44500c66dffaef133823b6b25067604fa73bbc5ec09d", size = 9300378 }, + { url = "https://files.pythonhosted.org/packages/e8/54/22825bc3d00ae8a801314a6d96e7e83c180b626a40299179073364c7eac7/tokenizers-0.20.1-cp310-none-win32.whl", hash = "sha256:2847843c53f445e0f19ea842a4e48b89dd0db4e62ba6e1e47a2749d6ec11f50d", size = 2203820 }, + { url = "https://files.pythonhosted.org/packages/7a/da/c7728bb6be0ccfbd5662f054ee28d8ba7883558cc9fcd102e6cdce07bbbf/tokenizers-0.20.1-cp310-none-win_amd64.whl", hash = "sha256:f9aa93eacd865f2798b9e62f7ce4533cfff4f5fbd50c02926a78e81c74e432cd", size = 2384778 }, + { url = "https://files.pythonhosted.org/packages/61/9a/be5f00cd37ad4fab0e5d1dbf31404a66ac2c1c33973beda9fc8e248a37ab/tokenizers-0.20.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4a717dcb08f2dabbf27ae4b6b20cbbb2ad7ed78ce05a829fae100ff4b3c7ff15", size = 2673182 }, + { url = "https://files.pythonhosted.org/packages/26/a2/92af8a5f19d0e8bc480759a9975489ebd429b94a81ad46e1422c7927f246/tokenizers-0.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3f84dad1ff1863c648d80628b1b55353d16303431283e4efbb6ab1af56a75832", size = 2562556 }, + { url = "https://files.pythonhosted.org/packages/2d/ca/f3a294ed89f2a1b900fba072ef4cb5331d4f156e2d5ea2d34f60160ef5bd/tokenizers-0.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:929c8f3afa16a5130a81ab5079c589226273ec618949cce79b46d96e59a84f61", size = 2943343 }, + { url = "https://files.pythonhosted.org/packages/31/88/740a6a069e997dc3e96941083fe3264162f4d198a5e5841acb625f84adbd/tokenizers-0.20.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d10766473954397e2d370f215ebed1cc46dcf6fd3906a2a116aa1d6219bfedc3", size = 2825954 }, + { url = "https://files.pythonhosted.org/packages/ff/71/b220deba78e42e483e2856c9cc83a8352c7c5d7322dad61eed4e1ca09c49/tokenizers-0.20.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9300fac73ddc7e4b0330acbdda4efaabf74929a4a61e119a32a181f534a11b47", size = 3091324 }, + { url = "https://files.pythonhosted.org/packages/fe/f4/4302dce958ce0e7f2d85a4725cebe6b02161c2d82990a89317580e17469a/tokenizers-0.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0ecaf7b0e39caeb1aa6dd6e0975c405716c82c1312b55ac4f716ef563a906969", size = 3098587 }, + { url = "https://files.pythonhosted.org/packages/7e/0f/9136bc0ea492d29f1d72217c6231dc584bccd3ba41dde12d4a85c75eb12a/tokenizers-0.20.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5170be9ec942f3d1d317817ced8d749b3e1202670865e4fd465e35d8c259de83", size = 3414366 }, + { url = "https://files.pythonhosted.org/packages/09/6c/1b573998fe3f0e18ac5d434e43966de2d225d6837f099ce0df7df4274c87/tokenizers-0.20.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef3f1ae08fa9aea5891cbd69df29913e11d3841798e0bfb1ff78b78e4e7ea0a4", size = 2984510 }, + { url = "https://files.pythonhosted.org/packages/d3/92/e5b80e42c24e564ac892c9135e4b9ec34bbcd6cdf0cc7a04735c44fe2ced/tokenizers-0.20.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ee86d4095d3542d73579e953c2e5e07d9321af2ffea6ecc097d16d538a2dea16", size = 8982324 }, + { url = "https://files.pythonhosted.org/packages/d0/42/c287d28ebcb3ba4f712e7a58d8f170a7b569528acf2d2a8fd1f684c24c0c/tokenizers-0.20.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:86dcd08da163912e17b27bbaba5efdc71b4fbffb841530fdb74c5707f3c49216", size = 9301853 }, + { url = "https://files.pythonhosted.org/packages/ea/48/7d4ac79588b5b1c3651b753b0a1bdd1343d81af57be18138dfdb304a710a/tokenizers-0.20.1-cp311-none-win32.whl", hash = "sha256:9af2dc4ee97d037bc6b05fa4429ddc87532c706316c5e11ce2f0596dfcfa77af", size = 2201968 }, + { url = "https://files.pythonhosted.org/packages/f1/95/f1b56f4b1fbd54bd7f170aa64258d0650500e9f45de217ffe4d4663809b6/tokenizers-0.20.1-cp311-none-win_amd64.whl", hash = "sha256:899152a78b095559c287b4c6d0099469573bb2055347bb8154db106651296f39", size = 2384963 }, + { url = "https://files.pythonhosted.org/packages/8e/8d/a051f979f955c6717099718054d7f51fea0a92d807a7d078a48f2684e54f/tokenizers-0.20.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:407ab666b38e02228fa785e81f7cf79ef929f104bcccf68a64525a54a93ceac9", size = 2667300 }, + { url = "https://files.pythonhosted.org/packages/99/c3/2132487ca51148392f0d1ed7f35c23179f67d66fd64c233ff50f091258b4/tokenizers-0.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2f13a2d16032ebc8bd812eb8099b035ac65887d8f0c207261472803b9633cf3e", size = 2556581 }, + { url = "https://files.pythonhosted.org/packages/f4/6e/9dfd1afcfd38fcc5b3a84bca54c33025561f7cab8ea375fa88f03407adc1/tokenizers-0.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e98eee4dca22849fbb56a80acaa899eec5b72055d79637dd6aa15d5e4b8628c9", size = 2937857 }, + { url = "https://files.pythonhosted.org/packages/28/51/92e3b25eb41be7fd65219c832c4ff61bf5c8cc1c3d0543e9a117d63a0876/tokenizers-0.20.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:47c1bcdd61e61136087459cb9e0b069ff23b5568b008265e5cbc927eae3387ce", size = 2823012 }, + { url = "https://files.pythonhosted.org/packages/f7/59/185ff0bb35d46d88613e87bd76b03989ef8537ebf4f39876bddf9bed2fc1/tokenizers-0.20.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:128c1110e950534426e2274837fc06b118ab5f2fa61c3436e60e0aada0ccfd67", size = 3086473 }, + { url = "https://files.pythonhosted.org/packages/a4/2a/da72c32446ad7f3e6e5cb3c625222a5b9b0bc10b50456f6cb79f6230ae1f/tokenizers-0.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e2e2d47a819d2954f2c1cd0ad51bb58ffac6f53a872d5d82d65d79bf76b9896d", size = 3101655 }, + { url = "https://files.pythonhosted.org/packages/cf/7d/c895f076e552cb39ea0491f62ff6551cb3e60323a7496017182bd57cc314/tokenizers-0.20.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bdd67a0e3503a9a7cf8bc5a4a49cdde5fa5bada09a51e4c7e1c73900297539bd", size = 3405410 }, + { url = "https://files.pythonhosted.org/packages/24/59/664121cb41b4f738479e2e1271013a2a7c9160955922536fb723a9c690b7/tokenizers-0.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:689b93d2e26d04da337ac407acec8b5d081d8d135e3e5066a88edd5bdb5aff89", size = 2977249 }, + { url = "https://files.pythonhosted.org/packages/d4/ab/ceb7bdb3394431e92b18123faef9862877009f61377bfa45ffe5135747a5/tokenizers-0.20.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0c6a796ddcd9a19ad13cf146997cd5895a421fe6aec8fd970d69f9117bddb45c", size = 8989781 }, + { url = "https://files.pythonhosted.org/packages/bb/37/eaa072b848471d31ae3df6e6d5be5ae594ed5fe39ca921e65cabf193dbde/tokenizers-0.20.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3ea919687aa7001a8ff1ba36ac64f165c4e89035f57998fa6cedcfd877be619d", size = 9304427 }, + { url = "https://files.pythonhosted.org/packages/41/ff/4aeb924d09f6561209b57af9123a0a28fa69472cc71ee40415f036253203/tokenizers-0.20.1-cp312-none-win32.whl", hash = "sha256:6d3ac5c1f48358ffe20086bf065e843c0d0a9fce0d7f0f45d5f2f9fba3609ca5", size = 2195986 }, + { url = "https://files.pythonhosted.org/packages/7e/ba/18bf6a7ad04f8225b71aa862b57188748d1d81e268de4a9aac1aed237246/tokenizers-0.20.1-cp312-none-win_amd64.whl", hash = "sha256:b0874481aea54a178f2bccc45aa2d0c99cd3f79143a0948af6a9a21dcc49173b", size = 2377984 }, + { url = "https://files.pythonhosted.org/packages/4b/9e/cf0911565ae302e4e4ed3d53bba28f2db75a9418f4e89e2434246723f01a/tokenizers-0.20.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48689da7a395df41114f516208d6550e3e905e1239cc5ad386686d9358e9cef0", size = 2666975 }, + { url = "https://files.pythonhosted.org/packages/37/98/8221a62aed679aefcbc1793ed8bb33f1e060f8b7d95bb20809db1b5c0e0e/tokenizers-0.20.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:712f90ea33f9bd2586b4a90d697c26d56d0a22fd3c91104c5858c4b5b6489a79", size = 2557365 }, + { url = "https://files.pythonhosted.org/packages/97/e3/167ca1981b3f512030a28f591b8ef786585b625d45f0fbf1c42723474ecd/tokenizers-0.20.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:359eceb6a620c965988fc559cebc0a98db26713758ec4df43fb76d41486a8ed5", size = 2940885 }, + { url = "https://files.pythonhosted.org/packages/c1/e6/ec76a7761eb7ba3cf95e2485cb2e7999a8eb0900d771616c0efa61beb1cd/tokenizers-0.20.1-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d3caf244ce89d24c87545aafc3448be15870096e796c703a0d68547187192e1", size = 3092338 }, + { url = "https://files.pythonhosted.org/packages/9c/2c/9f04aa030ba8994d478ab35464f8c541aad264556811f12afce9369cc0d3/tokenizers-0.20.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03b03cf8b9a32254b1bf8a305fb95c6daf1baae0c1f93b27f2b08c9759f41dee", size = 2981389 }, + { url = "https://files.pythonhosted.org/packages/cb/f7/79a74f8c54d1232ddbd68967ce56a00cc9589a31b94bee4cf9f34af91ace/tokenizers-0.20.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:218e5a3561561ea0f0ef1559c6d95b825308dbec23fb55b70b92589e7ff2e1e8", size = 8986321 }, + { url = "https://files.pythonhosted.org/packages/d4/f2/ea998aaf69966a87f92e31db7cba887125994bb9cd9a4dfcc83ac202d446/tokenizers-0.20.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f40df5e0294a95131cc5f0e0eb91fe86d88837abfbee46b9b3610b09860195a7", size = 9300207 }, ] [[package]] @@ -1323,7 +1323,7 @@ wheels = [ [[package]] name = "transformers" -version = "4.44.2" +version = "4.45.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "filelock" }, @@ -1337,9 +1337,9 @@ dependencies = [ { name = "tokenizers" }, { name = "tqdm" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f8/a3/81de49357a3c6ac4421d48d9662b53293838f217baf3f3bb9eb55f89fab6/transformers-4.44.2.tar.gz", hash = "sha256:36aa17cc92ee154058e426d951684a2dab48751b35b49437896f898931270826", size = 8110312 } +sdist = { url = "https://files.pythonhosted.org/packages/4b/4c/3862b2dd6cdf83b187897bd351da0f7fb74d0df642b03c6f5d06353a3ca0/transformers-4.45.2.tar.gz", hash = "sha256:72bc390f6b203892561f05f86bbfaa0e234aab8e927a83e62b9d92ea7e3ae101", size = 8478357 } wheels = [ - { url = "https://files.pythonhosted.org/packages/75/35/07c9879163b603f0e464b0f6e6e628a2340cfc7cdc5ca8e7d52d776710d4/transformers-4.44.2-py3-none-any.whl", hash = "sha256:1c02c65e7bfa5e52a634aff3da52138b583fc6f263c1f28d547dc144ba3d412d", size = 9465369 }, + { url = "https://files.pythonhosted.org/packages/f9/9d/030cc1b3e88172967e22ee1d012e0d5e0384eb70d2a098d1669d549aea29/transformers-4.45.2-py3-none-any.whl", hash = "sha256:c551b33660cfc815bae1f9f097ecfd1e65be623f13c6ee0dda372bd881460210", size = 9881312 }, ] [[package]] From 0fefc5f1e55268a171e235395d86c79c39472dfb Mon Sep 17 00:00:00 2001 From: Stephan Tulkens Date: Thu, 17 Oct 2024 13:36:28 +0200 Subject: [PATCH 15/30] Add explained variance messages (#92) --- model2vec/distill/distillation.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/model2vec/distill/distillation.py b/model2vec/distill/distillation.py index 8870f53..734a37d 100644 --- a/model2vec/distill/distillation.py +++ b/model2vec/distill/distillation.py @@ -214,9 +214,17 @@ def _post_process_embeddings(embeddings: np.ndarray, pca_dims: PCADimType, apply elif pca_dims <= embeddings.shape[1]: logger.info(f"Applying PCA with n_components {pca_dims}") + orig_dims = embeddings.shape[1] p = PCA(n_components=pca_dims, whiten=False) embeddings = p.fit_transform(embeddings) + if embeddings.shape[1] < orig_dims: + explained_variance_ratio = np.sum(p.explained_variance_ratio_) + explained_variance = np.sum(p.explained_variance_) + logger.info(f"Reduced dimensionality from {orig_dims} to {embeddings.shape[1]}.") + logger.info(f"Explained variance ratio: {explained_variance_ratio:.3f}.") + logger.info(f"Explained variance: {explained_variance:.3f}.") + if apply_zipf: logger.info("Applying Zipf weighting") embeddings *= np.log(1 + np.arange(embeddings.shape[0]))[:, None] From 2fa168e27666e5a55cf10adcfc065ce80fb7aec7 Mon Sep 17 00:00:00 2001 From: Thomas van Dongen Date: Fri, 18 Oct 2024 11:20:39 +0200 Subject: [PATCH 16/30] Updated slogan (#94) --- README.md | 4 ++-- pyproject.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 1264fbd..9f23101 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@
-

Distill a Small Fast Model from any Sentence Transformer

+

Distill a Small Static Model from any Sentence Transformer

@@ -39,7 +39,7 @@
-Model2Vec is a technique to turn any sentence transformer into a really small fast model, reducing model size by 15x and making the models up to 500x faster, with a small drop in performance. See our results [here](results/README.md), or dive in to see how it works. +Model2Vec is a technique to turn any sentence transformer into a really small static model, reducing model size by 15x and making the models up to 500x faster, with a small drop in performance. See our results [here](results/README.md), or dive in to see how it works. ## Table of Contents - [Quickstart](#quickstart) diff --git a/pyproject.toml b/pyproject.toml index c4523a9..9e49c94 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "model2vec" -description = "Distill a Small Fast Model from any Sentence Transformer" +description = "Distill a Small Static Model from any Sentence Transformer" readme = { file = "README.md", content-type = "text/markdown" } license = { file = "LICENSE" } requires-python = ">=3.10" From 0624c840b4956284c92c501010d2fd2999bb8563 Mon Sep 17 00:00:00 2001 From: Thomas van Dongen Date: Sat, 19 Oct 2024 18:42:52 +0200 Subject: [PATCH 17/30] feat: Add python3.9 support (#96) * Added python3.9 support * Added annotations import * Updated type * Updated type * Removed match case * Removed match case * Added type * Updated CI * Updated CI --- .github/workflows/ci.yaml | 9 +++- model2vec/distill/__main__.py | 2 + model2vec/distill/distillation.py | 6 ++- model2vec/distill/inference.py | 6 ++- model2vec/distill/tokenizer.py | 74 ++++++++++++++++--------------- model2vec/distill/utils.py | 2 + model2vec/hf_utils.py | 2 + model2vec/model.py | 4 +- pyproject.toml | 3 +- tests/test_distillation.py | 2 + tests/test_utils.py | 2 + 11 files changed, 69 insertions(+), 43 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index a54ffe4..a882fe6 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -10,7 +10,14 @@ jobs: strategy: matrix: os: ["ubuntu-latest", "windows-latest"] - python-version: ["3.10"] + python-version: ["3.9", "3.10", "3.11", "3.12"] + exclude: + - os: windows-latest + python-version: "3.9" + - os: windows-latest + python-version: "3.11" + - os: windows-latest + python-version: "3.12" fail-fast: false steps: diff --git a/model2vec/distill/__main__.py b/model2vec/distill/__main__.py index 3193ce6..f75c283 100644 --- a/model2vec/distill/__main__.py +++ b/model2vec/distill/__main__.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import logging from pathlib import Path from typing import Annotated, Optional diff --git a/model2vec/distill/distillation.py b/model2vec/distill/distillation.py index 734a37d..da32bba 100644 --- a/model2vec/distill/distillation.py +++ b/model2vec/distill/distillation.py @@ -1,5 +1,7 @@ +from __future__ import annotations + import logging -from typing import Literal +from typing import Literal, Union import numpy as np from huggingface_hub import model_info @@ -26,7 +28,7 @@ logger = logging.getLogger(__name__) -PCADimType = int | None | Literal["auto"] +PCADimType = Union[int, None, Literal["auto"]] def distill_from_model( diff --git a/model2vec/distill/inference.py b/model2vec/distill/inference.py index 400c0ac..81ac348 100644 --- a/model2vec/distill/inference.py +++ b/model2vec/distill/inference.py @@ -1,8 +1,10 @@ # -*- coding: utf-8 -*- +from __future__ import annotations + import inspect import logging from pathlib import Path -from typing import Protocol +from typing import Protocol, Union import numpy as np import torch @@ -13,7 +15,7 @@ logger = logging.getLogger(__name__) -PathLike = str | Path +PathLike = Union[Path, str] _DEFAULT_BATCH_SIZE = 1024 diff --git a/model2vec/distill/tokenizer.py b/model2vec/distill/tokenizer.py index 8022b76..173a2f2 100644 --- a/model2vec/distill/tokenizer.py +++ b/model2vec/distill/tokenizer.py @@ -49,29 +49,31 @@ def remove_tokens(tokenizer: Tokenizer, tokens_to_remove: list[str]) -> Tokenize # Load the vocabulary. model_type = tokenizer_data["model"]["type"] - match model_type: - case "WordPiece": - # Vocab is a dictionary. - vocab: dict[str, int] = tokenizer_data["model"]["vocab"] - n_tokens = len(vocab) - - # Remove the tokens. - for token in tokens_to_remove: - if vocab.pop(token, None) is None: - logger.warning(f"Token {token} was not in the vocabulary.") - - n_removed = n_tokens - len(vocab) - logger.info(f"Removed {n_removed} tokens from the vocabulary.") - - # Reindex the vocabulary so that it is contiguous. - reindexed = {token: idx for idx, (token, _) in enumerate(sorted(vocab.items(), key=lambda x: x[1]))} - tokenizer_data["model"]["vocab"] = reindexed - case "Unigram": - raise ValueError("Removing tokens from a unigram tokenizer is not supported.") - case "BPE": - raise ValueError("Removing tokens from a bpe tokenizer is not supported.") - case _: - raise ValueError(f"Unknown model type {model_type}") + if model_type == "WordPiece": + # Vocab is a dictionary. + vocab: dict[str, int] = tokenizer_data["model"]["vocab"] + n_tokens = len(vocab) + + # Remove the tokens. + for token in tokens_to_remove: + if vocab.pop(token, None) is None: + logger.warning(f"Token {token} was not in the vocabulary.") + + n_removed = n_tokens - len(vocab) + logger.info(f"Removed {n_removed} tokens from the vocabulary.") + + # Reindex the vocabulary so that it is contiguous. + reindexed = {token: idx for idx, (token, _) in enumerate(sorted(vocab.items(), key=lambda x: x[1]))} + tokenizer_data["model"]["vocab"] = reindexed + + elif model_type == "Unigram": + raise ValueError("Removing tokens from a unigram tokenizer is not supported.") + + elif model_type == "BPE": + raise ValueError("Removing tokens from a BPE tokenizer is not supported.") + + else: + raise ValueError(f"Unknown model type {model_type}") # Reindex the special tokens (i.e., CLS and SEP for BertTokenizers.) special_tokens_post_processor: dict[str, dict] = tokenizer_data["post_processor"]["special_tokens"] @@ -97,18 +99,20 @@ def add_tokens(tokenizer: Tokenizer, tokens_to_add: list[str]) -> Tokenizer: model = data["model"]["type"] - match model: - case "WordPiece": - wordpiece_vocab: dict[str, int] = data["model"]["vocab"] - for token in tokens_to_add: - if token not in wordpiece_vocab: - wordpiece_vocab[token] = len(wordpiece_vocab) - case "Unigram": - raise ValueError("Adding tokens to a unigram tokenizer is not supported.") - case "BPE": - raise ValueError("Adding tokens to a bpe tokenizer is not supported.") - case _: - raise ValueError(f"Unknown model type {model}") + if model == "WordPiece": + wordpiece_vocab: dict[str, int] = data["model"]["vocab"] + for token in tokens_to_add: + if token not in wordpiece_vocab: + wordpiece_vocab[token] = len(wordpiece_vocab) + + elif model == "Unigram": + raise ValueError("Adding tokens to a unigram tokenizer is not supported.") + + elif model == "BPE": + raise ValueError("Adding tokens to a BPE tokenizer is not supported.") + + else: + raise ValueError(f"Unknown model type {model}") tokenizer = Tokenizer.from_str(json.dumps(data)) diff --git a/model2vec/distill/utils.py b/model2vec/distill/utils.py index cf16977..3e81004 100644 --- a/model2vec/distill/utils.py +++ b/model2vec/distill/utils.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from logging import getLogger import torch diff --git a/model2vec/hf_utils.py b/model2vec/hf_utils.py index 0a2363a..0fa3514 100644 --- a/model2vec/hf_utils.py +++ b/model2vec/hf_utils.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import json import logging from pathlib import Path diff --git a/model2vec/model.py b/model2vec/model.py index 9b83b53..c1692f1 100644 --- a/model2vec/model.py +++ b/model2vec/model.py @@ -4,7 +4,7 @@ from logging import getLogger from pathlib import Path from tempfile import TemporaryDirectory -from typing import Any, Iterator +from typing import Any, Iterator, Union import numpy as np from tokenizers import Encoding, Tokenizer @@ -12,7 +12,7 @@ from model2vec.utils import load_local_model -PathLike = Path | str +PathLike = Union[Path, str] logger = getLogger(__name__) diff --git a/pyproject.toml b/pyproject.toml index 9e49c94..634e9ec 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ name = "model2vec" description = "Distill a Small Static Model from any Sentence Transformer" readme = { file = "README.md", content-type = "text/markdown" } license = { file = "LICENSE" } -requires-python = ">=3.10" +requires-python = ">=3.9" authors = [{ name = "Stéphan Tulkens", email = "stephantul@gmail.com"}, {name = "Thomas van Dongen", email = "thomas123@live.nl"}] dynamic = ["version"] @@ -15,6 +15,7 @@ classifiers = [ "Topic :: Software Development :: Libraries", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3 :: Only", + "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", diff --git a/tests/test_distillation.py b/tests/test_distillation.py index 819c95d..c0c3707 100644 --- a/tests/test_distillation.py +++ b/tests/test_distillation.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import json from importlib import import_module from unittest.mock import MagicMock, patch diff --git a/tests/test_utils.py b/tests/test_utils.py index 2e9c794..cfc6ceb 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import json from pathlib import Path from tempfile import NamedTemporaryFile, TemporaryDirectory From 0e4de3034f2bbab5958a8ca544d44148749f917d Mon Sep 17 00:00:00 2001 From: Stephan Tulkens Date: Sat, 19 Oct 2024 19:57:58 +0200 Subject: [PATCH 18/30] enh: remove CLI command (#98) * enh: remove CLI command * Don't use pre-commit in CI * Fix misspelling * relock, just to test * Fix command again --- .github/workflows/ci.yaml | 3 +- Makefile | 3 + README.md | 11 - model2vec/distill/__main__.py | 55 ----- pyproject.toml | 2 +- tests/test_utils.py | 2 +- uv.lock | 400 +++++++++++++++++++++------------- 7 files changed, 257 insertions(+), 219 deletions(-) delete mode 100644 model2vec/distill/__main__.py diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index a882fe6..8e49c87 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -49,8 +49,7 @@ jobs: # Install dependencies using uv pip - name: Install dependencies - run: make install - # run: uv pip install -e ".[pytest]" + run: make install-no-pre-commit # Run tests with coverage - name: Run tests under coverage diff --git a/Makefile b/Makefile index f27bf9e..2861817 100644 --- a/Makefile +++ b/Makefile @@ -8,6 +8,9 @@ install: uv sync --all-extras uv run pre-commit install +install-no-pre-commit: + uv pip install ".[dev,distill]" + install-base: uv sync --extra dev diff --git a/README.md b/README.md index 9f23101..d8a11e7 100644 --- a/README.md +++ b/README.md @@ -254,17 +254,6 @@ m2v_model = distill(model_name=model_name, vocabulary=vocabulary, use_subword=Fa
-
- Distilling via CLI -
- -We also provide a command line interface for distillation. Note that `vocab.txt` should be a file with one word per line. -```bash -python3 -m model2vec.distill --model-name BAAI/bge-base-en-v1.5 --vocabulary-path vocab.txt --device mps --save-path model2vec_model -``` - -
- ### Inference
diff --git a/model2vec/distill/__main__.py b/model2vec/distill/__main__.py deleted file mode 100644 index f75c283..0000000 --- a/model2vec/distill/__main__.py +++ /dev/null @@ -1,55 +0,0 @@ -from __future__ import annotations - -import logging -from pathlib import Path -from typing import Annotated, Optional - -import typer - -from model2vec.distill.distillation import distill -from model2vec.utils import setup_logging - -logger = logging.getLogger(__name__) - -app = typer.Typer() - - -@app.command() -def main( - model_name: Annotated[str, typer.Option(help="The model name to initialize the embedder model with.")], - save_path: Annotated[str, typer.Option(help="The folder to save the model to.")], - vocabulary_path: Annotated[ - Optional[str], - typer.Option( - help="The path to the vocabulary file, which is a .txt file with one word per line. If this is not passed, we use the model's vocabulary." - ), - ] = None, - device: Annotated[str, typer.Option(help="The device to train the model on.")] = "cpu", - pca_dims: Annotated[ - int | None, typer.Option(help="The PCA dimensionality to use. If this is None, no PCA is applied.") - ] = 256, - apply_zipf: Annotated[bool, typer.Option(help="Whether to apply Zipf weighting.")] = True, - use_subword: Annotated[ - bool, typer.Option(help="Whether to use subword tokenization. If this is False, you must pass a vocabulary.") - ] = True, -) -> None: - """Creates output embeddings for a sentencetransformer.""" - if vocabulary_path is not None: - vocabulary = open(vocabulary_path).read().splitlines() - else: - vocabulary = None - - model = distill( - model_name=model_name, - vocabulary=vocabulary, - device=device, - pca_dims=pca_dims, - apply_zipf=apply_zipf, - use_subword=use_subword, - ) - model.save_pretrained(Path(save_path)) - - -if __name__ == "__main__": - setup_logging() - typer.run(main) diff --git a/pyproject.toml b/pyproject.toml index 634e9ec..5385728 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -51,7 +51,7 @@ dev = [ "pytest-coverage", "ruff", ] -distill = ["torch", "transformers", "scikit-learn", "typer"] +distill = ["torch", "transformers", "scikit-learn"] [project.urls] "Homepage" = "https://github.com/MinishLab" diff --git a/tests/test_utils.py b/tests/test_utils.py index cfc6ceb..f7910ec 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -72,7 +72,7 @@ def test_importable() -> None: def test_get_package_extras() -> None: """Test package extras.""" extras = set(get_package_extras("model2vec", "distill")) - assert extras == {"torch", "transformers", "typer", "scikit-learn"} + assert extras == {"torch", "transformers", "scikit-learn"} def test_get_package_extras_empty() -> None: diff --git a/uv.lock b/uv.lock index 104b22a..5c9b79f 100644 --- a/uv.lock +++ b/uv.lock @@ -1,7 +1,7 @@ version = 1 -requires-python = ">=3.10" +requires-python = ">=3.9" resolution-markers = [ - "python_full_version < '3.11'", + "python_full_version == '3.10.*'", "python_full_version == '3.11.*'", "python_full_version == '3.12.*'", "python_full_version >= '3.13'", @@ -12,7 +12,7 @@ name = "asttokens" version = "2.4.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "six" }, + { name = "six", marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/45/1d/f03bcb60c4a3212e15f99a56085d93093a497718adf828d050b9d675da81/asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0", size = 62284 } wheels = [ @@ -24,13 +24,13 @@ name = "black" version = "24.8.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "click" }, - { name = "mypy-extensions" }, - { name = "packaging" }, - { name = "pathspec" }, - { name = "platformdirs" }, - { name = "tomli", marker = "python_full_version < '3.11'" }, - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, + { name = "click", marker = "python_full_version >= '3.10'" }, + { name = "mypy-extensions", marker = "python_full_version >= '3.10'" }, + { name = "packaging", marker = "python_full_version >= '3.10'" }, + { name = "pathspec", marker = "python_full_version >= '3.10'" }, + { name = "platformdirs", marker = "python_full_version >= '3.10'" }, + { name = "tomli", marker = "python_full_version == '3.10.*'" }, + { name = "typing-extensions", marker = "python_full_version == '3.10.*'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/04/b0/46fb0d4e00372f4a86a6f8efa3cb193c9f64863615e39010b1477e010578/black-24.8.0.tar.gz", hash = "sha256:2500945420b6784c38b9ee885af039f5e7471ef284ab03fa35ecdde4688cd83f", size = 644810 } wheels = [ @@ -46,6 +46,10 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/41/77/8d9ce42673e5cb9988f6df73c1c5c1d4e9e788053cccd7f5fb14ef100982/black-24.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:649f6d84ccbae73ab767e206772cc2d7a393a001070a4c814a546afd0d423aed", size = 1448665 }, { url = "https://files.pythonhosted.org/packages/cc/94/eff1ddad2ce1d3cc26c162b3693043c6b6b575f538f602f26fe846dfdc75/black-24.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2b59b250fdba5f9a9cd9d0ece6e6d993d91ce877d121d161e4698af3eb9c1018", size = 1762458 }, { url = "https://files.pythonhosted.org/packages/28/ea/18b8d86a9ca19a6942e4e16759b2fa5fc02bbc0eb33c1b866fcd387640ab/black-24.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:6e55d30d44bed36593c3163b9bc63bf58b3b30e4611e4d88a0c3c239930ed5b2", size = 1436109 }, + { url = "https://files.pythonhosted.org/packages/13/b2/b3f24fdbb46f0e7ef6238e131f13572ee8279b70f237f221dd168a9dba1a/black-24.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:eab4dd44ce80dea27dc69db40dab62d4ca96112f87996bca68cd75639aeb2e4c", size = 1631706 }, + { url = "https://files.pythonhosted.org/packages/d9/35/31010981e4a05202a84a3116423970fd1a59d2eda4ac0b3570fbb7029ddc/black-24.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3c4285573d4897a7610054af5a890bde7c65cb466040c5f0c8b732812d7f0e5e", size = 1457429 }, + { url = "https://files.pythonhosted.org/packages/27/25/3f706b4f044dd569a20a4835c3b733dedea38d83d2ee0beb8178a6d44945/black-24.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e84e33b37be070ba135176c123ae52a51f82306def9f7d063ee302ecab2cf47", size = 1756488 }, + { url = "https://files.pythonhosted.org/packages/63/72/79375cd8277cbf1c5670914e6bd4c1b15dea2c8f8e906dc21c448d0535f0/black-24.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:73bbf84ed136e45d451a260c6b73ed674652f90a2b3211d6a35e78054563a9bb", size = 1417721 }, { url = "https://files.pythonhosted.org/packages/27/1e/83fa8a787180e1632c3d831f7e58994d7aaf23a0961320d21e84f922f919/black-24.8.0-py3-none-any.whl", hash = "sha256:972085c618ee94f402da1af548a4f218c754ea7e5dc70acb168bfaca4c2542ed", size = 206504 }, ] @@ -118,6 +122,21 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5b/ae/ce2c12fcac59cb3860b2e2d76dc405253a4475436b1861d95fe75bdea520/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4", size = 142167 }, { url = "https://files.pythonhosted.org/packages/ed/3a/a448bf035dce5da359daf9ae8a16b8a39623cc395a2ffb1620aa1bce62b0/charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7", size = 93041 }, { url = "https://files.pythonhosted.org/packages/b6/7c/8debebb4f90174074b827c63242c23851bdf00a532489fba57fef3416e40/charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001", size = 100397 }, + { url = "https://files.pythonhosted.org/packages/f7/9d/bcf4a449a438ed6f19790eee543a86a740c77508fbc5ddab210ab3ba3a9a/charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4", size = 194198 }, + { url = "https://files.pythonhosted.org/packages/66/fe/c7d3da40a66a6bf2920cce0f436fa1f62ee28aaf92f412f0bf3b84c8ad6c/charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d", size = 122494 }, + { url = "https://files.pythonhosted.org/packages/2a/9d/a6d15bd1e3e2914af5955c8eb15f4071997e7078419328fee93dfd497eb7/charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0", size = 120393 }, + { url = "https://files.pythonhosted.org/packages/3d/85/5b7416b349609d20611a64718bed383b9251b5a601044550f0c8983b8900/charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269", size = 138331 }, + { url = "https://files.pythonhosted.org/packages/79/66/8946baa705c588521afe10b2d7967300e49380ded089a62d38537264aece/charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c", size = 148097 }, + { url = "https://files.pythonhosted.org/packages/44/80/b339237b4ce635b4af1c73742459eee5f97201bd92b2371c53e11958392e/charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519", size = 140711 }, + { url = "https://files.pythonhosted.org/packages/98/69/5d8751b4b670d623aa7a47bef061d69c279e9f922f6705147983aa76c3ce/charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796", size = 142251 }, + { url = "https://files.pythonhosted.org/packages/1f/8d/33c860a7032da5b93382cbe2873261f81467e7b37f4ed91e25fed62fd49b/charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185", size = 144636 }, + { url = "https://files.pythonhosted.org/packages/c2/65/52aaf47b3dd616c11a19b1052ce7fa6321250a7a0b975f48d8c366733b9f/charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c", size = 139514 }, + { url = "https://files.pythonhosted.org/packages/51/fd/0ee5b1c2860bb3c60236d05b6e4ac240cf702b67471138571dad91bcfed8/charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458", size = 145528 }, + { url = "https://files.pythonhosted.org/packages/e1/9c/60729bf15dc82e3aaf5f71e81686e42e50715a1399770bcde1a9e43d09db/charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2", size = 149804 }, + { url = "https://files.pythonhosted.org/packages/53/cd/aa4b8a4d82eeceb872f83237b2d27e43e637cac9ffaef19a1321c3bafb67/charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8", size = 141708 }, + { url = "https://files.pythonhosted.org/packages/54/7f/cad0b328759630814fcf9d804bfabaf47776816ad4ef2e9938b7e1123d04/charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561", size = 142708 }, + { url = "https://files.pythonhosted.org/packages/c1/9d/254a2f1bcb0ce9acad838e94ed05ba71a7cb1e27affaa4d9e1ca3958cdb6/charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f", size = 92830 }, + { url = "https://files.pythonhosted.org/packages/2f/0e/d7303ccae9735ff8ff01e36705ad6233ad2002962e8668a970fc000c5e1b/charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d", size = 100376 }, { url = "https://files.pythonhosted.org/packages/28/76/e6222113b83e3622caa4bb41032d0b1bf785250607392e1b778aca0b8a7d/charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc", size = 48543 }, ] @@ -126,7 +145,7 @@ name = "click" version = "8.1.7" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "colorama", marker = "platform_system == 'Windows'" }, + { name = "colorama", marker = "python_full_version >= '3.10' and platform_system == 'Windows'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/96/d3/f04c7bfcf5c1862a2a5b845c6b2b360488cf47af55dfa79c98f6a6bf98b5/click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de", size = 336121 } wheels = [ @@ -198,12 +217,22 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/52/76/1766bb8b803a88f93c3a2d07e30ffa359467810e5cbc68e375ebe6906efb/coverage-7.6.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3", size = 247598 }, { url = "https://files.pythonhosted.org/packages/66/8b/f54f8db2ae17188be9566e8166ac6df105c1c611e25da755738025708d54/coverage-7.6.1-cp313-cp313t-win32.whl", hash = "sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f", size = 210307 }, { url = "https://files.pythonhosted.org/packages/9f/b0/e0dca6da9170aefc07515cce067b97178cefafb512d00a87a1c717d2efd5/coverage-7.6.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657", size = 211453 }, + { url = "https://files.pythonhosted.org/packages/19/d3/d54c5aa83268779d54c86deb39c1c4566e5d45c155369ca152765f8db413/coverage-7.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:abd5fd0db5f4dc9289408aaf34908072f805ff7792632250dcb36dc591d24255", size = 206688 }, + { url = "https://files.pythonhosted.org/packages/a5/fe/137d5dca72e4a258b1bc17bb04f2e0196898fe495843402ce826a7419fe3/coverage-7.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:547f45fa1a93154bd82050a7f3cddbc1a7a4dd2a9bf5cb7d06f4ae29fe94eaf8", size = 207120 }, + { url = "https://files.pythonhosted.org/packages/78/5b/a0a796983f3201ff5485323b225d7c8b74ce30c11f456017e23d8e8d1945/coverage-7.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:645786266c8f18a931b65bfcefdbf6952dd0dea98feee39bd188607a9d307ed2", size = 235249 }, + { url = "https://files.pythonhosted.org/packages/4e/e1/76089d6a5ef9d68f018f65411fcdaaeb0141b504587b901d74e8587606ad/coverage-7.6.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e0b2df163b8ed01d515807af24f63de04bebcecbd6c3bfeff88385789fdf75a", size = 233237 }, + { url = "https://files.pythonhosted.org/packages/9a/6f/eef79b779a540326fee9520e5542a8b428cc3bfa8b7c8f1022c1ee4fc66c/coverage-7.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:609b06f178fe8e9f89ef676532760ec0b4deea15e9969bf754b37f7c40326dbc", size = 234311 }, + { url = "https://files.pythonhosted.org/packages/75/e1/656d65fb126c29a494ef964005702b012f3498db1a30dd562958e85a4049/coverage-7.6.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:702855feff378050ae4f741045e19a32d57d19f3e0676d589df0575008ea5004", size = 233453 }, + { url = "https://files.pythonhosted.org/packages/68/6a/45f108f137941a4a1238c85f28fd9d048cc46b5466d6b8dda3aba1bb9d4f/coverage-7.6.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2bdb062ea438f22d99cba0d7829c2ef0af1d768d1e4a4f528087224c90b132cb", size = 231958 }, + { url = "https://files.pythonhosted.org/packages/9b/e7/47b809099168b8b8c72ae311efc3e88c8d8a1162b3ba4b8da3cfcdb85743/coverage-7.6.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9c56863d44bd1c4fe2abb8a4d6f5371d197f1ac0ebdee542f07f35895fc07f36", size = 232938 }, + { url = "https://files.pythonhosted.org/packages/52/80/052222ba7058071f905435bad0ba392cc12006380731c37afaf3fe749b88/coverage-7.6.1-cp39-cp39-win32.whl", hash = "sha256:6e2cd258d7d927d09493c8df1ce9174ad01b381d4729a9d8d4e38670ca24774c", size = 209352 }, + { url = "https://files.pythonhosted.org/packages/b8/d8/1b92e0b3adcf384e98770a00ca095da1b5f7b483e6563ae4eb5e935d24a1/coverage-7.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:06a737c882bd26d0d6ee7269b20b12f14a8704807a01056c80bb881a4b2ce6ca", size = 210153 }, { url = "https://files.pythonhosted.org/packages/a5/2b/0354ed096bca64dc8e32a7cbcae28b34cb5ad0b1fe2125d6d99583313ac0/coverage-7.6.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:e9a6e0eb86070e8ccaedfbd9d38fec54864f3125ab95419970575b42af7541df", size = 198926 }, ] [package.optional-dependencies] toml = [ - { name = "tomli", marker = "python_full_version <= '3.11'" }, + { name = "tomli", marker = "python_full_version >= '3.10' and python_full_version <= '3.11'" }, ] [[package]] @@ -265,13 +294,13 @@ name = "huggingface-hub" version = "0.24.6" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "filelock" }, - { name = "fsspec" }, - { name = "packaging" }, - { name = "pyyaml" }, - { name = "requests" }, - { name = "tqdm" }, - { name = "typing-extensions" }, + { name = "filelock", marker = "python_full_version >= '3.10'" }, + { name = "fsspec", marker = "python_full_version >= '3.10'" }, + { name = "packaging", marker = "python_full_version >= '3.10'" }, + { name = "pyyaml", marker = "python_full_version >= '3.10'" }, + { name = "requests", marker = "python_full_version >= '3.10'" }, + { name = "tqdm", marker = "python_full_version >= '3.10'" }, + { name = "typing-extensions", marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/65/24/b98fce967b7d63700e5805b915012ba25bb538a81fcf11e97f3cc3f4f012/huggingface_hub-0.24.6.tar.gz", hash = "sha256:cc2579e761d070713eaa9c323e3debe39d5b464ae3a7261c39a9195b27bb8000", size = 349200 } wheels = [ @@ -310,17 +339,17 @@ name = "ipython" version = "8.27.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "decorator" }, - { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, - { name = "jedi" }, - { name = "matplotlib-inline" }, - { name = "pexpect", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, - { name = "prompt-toolkit" }, - { name = "pygments" }, - { name = "stack-data" }, - { name = "traitlets" }, - { name = "typing-extensions", marker = "python_full_version < '3.12'" }, + { name = "colorama", marker = "python_full_version >= '3.10' and sys_platform == 'win32'" }, + { name = "decorator", marker = "python_full_version >= '3.10'" }, + { name = "exceptiongroup", marker = "python_full_version == '3.10.*'" }, + { name = "jedi", marker = "python_full_version >= '3.10'" }, + { name = "matplotlib-inline", marker = "python_full_version >= '3.10'" }, + { name = "pexpect", marker = "python_full_version >= '3.10' and sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "prompt-toolkit", marker = "python_full_version >= '3.10'" }, + { name = "pygments", marker = "python_full_version >= '3.10'" }, + { name = "stack-data", marker = "python_full_version >= '3.10'" }, + { name = "traitlets", marker = "python_full_version >= '3.10'" }, + { name = "typing-extensions", marker = "python_full_version >= '3.10' and python_full_version < '3.12'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/57/24/d4fabaca03c8804bf0b8d994c8ae3a20e57e9330d277fb43d83e558dec5e/ipython-8.27.0.tar.gz", hash = "sha256:0b99a2dc9f15fd68692e898e5568725c6d49c527d36a9fb5960ffbdeaa82ff7e", size = 5494984 } wheels = [ @@ -332,7 +361,7 @@ name = "jedi" version = "0.19.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "parso" }, + { name = "parso", marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/d6/99/99b493cec4bf43176b678de30f81ed003fd6a647a301b9c927280c600f0a/jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd", size = 1227821 } wheels = [ @@ -344,7 +373,7 @@ name = "jinja2" version = "3.1.4" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "markupsafe" }, + { name = "markupsafe", marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ed/55/39036716d19cab0747a5020fc7e907f362fbf48c984b14e62127f7e68e5d/jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369", size = 240245 } wheels = [ @@ -365,7 +394,7 @@ name = "markdown-it-py" version = "3.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "mdurl" }, + { name = "mdurl", marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596 } wheels = [ @@ -408,6 +437,16 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/88/07/2dc76aa51b481eb96a4c3198894f38b480490e834479611a4053fbf08623/MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169", size = 33038 }, { url = "https://files.pythonhosted.org/packages/96/0c/620c1fb3661858c0e37eb3cbffd8c6f732a67cd97296f725789679801b31/MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad", size = 16572 }, { url = "https://files.pythonhosted.org/packages/3f/14/c3554d512d5f9100a95e737502f4a2323a1959f6d0d01e0d0997b35f7b10/MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb", size = 17127 }, + { url = "https://files.pythonhosted.org/packages/0f/31/780bb297db036ba7b7bbede5e1d7f1e14d704ad4beb3ce53fb495d22bc62/MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf", size = 18193 }, + { url = "https://files.pythonhosted.org/packages/6c/77/d77701bbef72892affe060cdacb7a2ed7fd68dae3b477a8642f15ad3b132/MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2", size = 14073 }, + { url = "https://files.pythonhosted.org/packages/d9/a7/1e558b4f78454c8a3a0199292d96159eb4d091f983bc35ef258314fe7269/MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8", size = 26486 }, + { url = "https://files.pythonhosted.org/packages/5f/5a/360da85076688755ea0cceb92472923086993e86b5613bbae9fbc14136b0/MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3", size = 25685 }, + { url = "https://files.pythonhosted.org/packages/6a/18/ae5a258e3401f9b8312f92b028c54d7026a97ec3ab20bfaddbdfa7d8cce8/MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465", size = 25338 }, + { url = "https://files.pythonhosted.org/packages/0b/cc/48206bd61c5b9d0129f4d75243b156929b04c94c09041321456fd06a876d/MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e", size = 30439 }, + { url = "https://files.pythonhosted.org/packages/d1/06/a41c112ab9ffdeeb5f77bc3e331fdadf97fa65e52e44ba31880f4e7f983c/MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea", size = 29531 }, + { url = "https://files.pythonhosted.org/packages/02/8c/ab9a463301a50dab04d5472e998acbd4080597abc048166ded5c7aa768c8/MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6", size = 29823 }, + { url = "https://files.pythonhosted.org/packages/bc/29/9bc18da763496b055d8e98ce476c8e718dcfd78157e17f555ce6dd7d0895/MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf", size = 16658 }, + { url = "https://files.pythonhosted.org/packages/f6/f8/4da07de16f10551ca1f640c92b5f316f9394088b183c6a57183df6de5ae4/MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5", size = 17211 }, ] [[package]] @@ -415,7 +454,7 @@ name = "matplotlib-inline" version = "0.1.7" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "traitlets" }, + { name = "traitlets", marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/99/5b/a36a337438a14116b16480db471ad061c36c3694df7c2084a0da7ba538b7/matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90", size = 8159 } wheels = [ @@ -436,28 +475,27 @@ name = "model2vec" version = "0.2.4" source = { editable = "." } dependencies = [ - { name = "numpy" }, - { name = "rich" }, - { name = "setuptools" }, - { name = "tokenizers" }, - { name = "tqdm" }, + { name = "numpy", marker = "python_full_version >= '3.10'" }, + { name = "rich", marker = "python_full_version >= '3.10'" }, + { name = "setuptools", marker = "python_full_version >= '3.10'" }, + { name = "tokenizers", marker = "python_full_version >= '3.10'" }, + { name = "tqdm", marker = "python_full_version >= '3.10'" }, ] [package.optional-dependencies] dev = [ - { name = "black" }, - { name = "ipython" }, - { name = "mypy" }, - { name = "pre-commit" }, - { name = "pytest" }, - { name = "pytest-coverage" }, - { name = "ruff" }, + { name = "black", marker = "python_full_version >= '3.10'" }, + { name = "ipython", marker = "python_full_version >= '3.10'" }, + { name = "mypy", marker = "python_full_version >= '3.10'" }, + { name = "pre-commit", marker = "python_full_version >= '3.10'" }, + { name = "pytest", marker = "python_full_version >= '3.10'" }, + { name = "pytest-coverage", marker = "python_full_version >= '3.10'" }, + { name = "ruff", marker = "python_full_version >= '3.10'" }, ] distill = [ - { name = "scikit-learn" }, - { name = "torch" }, - { name = "transformers" }, - { name = "typer" }, + { name = "scikit-learn", marker = "python_full_version >= '3.10'" }, + { name = "torch", marker = "python_full_version >= '3.10'" }, + { name = "transformers", marker = "python_full_version >= '3.10'" }, ] [package.metadata] @@ -477,7 +515,6 @@ requires-dist = [ { name = "torch", marker = "extra == 'distill'" }, { name = "tqdm" }, { name = "transformers", marker = "extra == 'distill'" }, - { name = "typer", marker = "extra == 'distill'" }, ] [[package]] @@ -494,9 +531,9 @@ name = "mypy" version = "1.11.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "mypy-extensions" }, - { name = "tomli", marker = "python_full_version < '3.11'" }, - { name = "typing-extensions" }, + { name = "mypy-extensions", marker = "python_full_version >= '3.10'" }, + { name = "tomli", marker = "python_full_version == '3.10.*'" }, + { name = "typing-extensions", marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/5c/86/5d7cbc4974fd564550b80fbb8103c05501ea11aa7835edf3351d90095896/mypy-1.11.2.tar.gz", hash = "sha256:7f9993ad3e0ffdc95c2a14b66dee63729f021968bff8ad911867579c65d13a79", size = 3078806 } wheels = [ @@ -515,6 +552,11 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f3/3c/350a9da895f8a7e87ade0028b962be0252d152e0c2fbaafa6f0658b4d0d4/mypy-1.11.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6e7184632d89d677973a14d00ae4d03214c8bc301ceefcdaf5c474866814c987", size = 12506856 }, { url = "https://files.pythonhosted.org/packages/b6/49/ee5adf6a49ff13f4202d949544d3d08abb0ea1f3e7f2a6d5b4c10ba0360a/mypy-1.11.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3a66169b92452f72117e2da3a576087025449018afc2d8e9bfe5ffab865709ca", size = 12952066 }, { url = "https://files.pythonhosted.org/packages/27/c0/b19d709a42b24004d720db37446a42abadf844d5c46a2c442e2a074d70d9/mypy-1.11.2-cp312-cp312-win_amd64.whl", hash = "sha256:969ea3ef09617aff826885a22ece0ddef69d95852cdad2f60c8bb06bf1f71f70", size = 9664000 }, + { url = "https://files.pythonhosted.org/packages/16/64/bb5ed751487e2bea0dfaa6f640a7e3bb88083648f522e766d5ef4a76f578/mypy-1.11.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:801ca29f43d5acce85f8e999b1e431fb479cb02d0e11deb7d2abb56bdaf24fd6", size = 10937294 }, + { url = "https://files.pythonhosted.org/packages/a9/a3/67a0069abed93c3bf3b0bebb8857e2979a02828a4a3fd82f107f8f1143e8/mypy-1.11.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:af8d155170fcf87a2afb55b35dc1a0ac21df4431e7d96717621962e4b9192e70", size = 10107707 }, + { url = "https://files.pythonhosted.org/packages/2f/4d/0379daf4258b454b1f9ed589a9dabd072c17f97496daea7b72fdacf7c248/mypy-1.11.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f7821776e5c4286b6a13138cc935e2e9b6fde05e081bdebf5cdb2bb97c9df81d", size = 12498367 }, + { url = "https://files.pythonhosted.org/packages/3b/dc/3976a988c280b3571b8eb6928882dc4b723a403b21735a6d8ae6ed20e82b/mypy-1.11.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:539c570477a96a4e6fb718b8d5c3e0c0eba1f485df13f86d2970c91f0673148d", size = 13018014 }, + { url = "https://files.pythonhosted.org/packages/83/84/adffc7138fb970e7e2a167bd20b33bb78958370179853a4ebe9008139342/mypy-1.11.2-cp39-cp39-win_amd64.whl", hash = "sha256:3f14cd3d386ac4d05c5a39a51b84387403dadbd936e17cb35882134d4f8f0d24", size = 9568056 }, { url = "https://files.pythonhosted.org/packages/42/3a/bdf730640ac523229dd6578e8a581795720a9321399de494374afc437ec5/mypy-1.11.2-py3-none-any.whl", hash = "sha256:b499bc07dbdcd3de92b0a8b29fdf592c111276f6a12fe29c30f6c417dd546d12", size = 2619625 }, ] @@ -575,6 +617,17 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/76/8c/2ba3902e1a0fc1c74962ea9bb33a534bb05984ad7ff9515bf8d07527cadd/numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0", size = 17786643 }, { url = "https://files.pythonhosted.org/packages/28/4a/46d9e65106879492374999e76eb85f87b15328e06bd1550668f79f7b18c6/numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110", size = 5677803 }, { url = "https://files.pythonhosted.org/packages/16/2e/86f24451c2d530c88daf997cb8d6ac622c1d40d19f5a031ed68a4b73a374/numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818", size = 15517754 }, + { url = "https://files.pythonhosted.org/packages/7d/24/ce71dc08f06534269f66e73c04f5709ee024a1afe92a7b6e1d73f158e1f8/numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c", size = 20636301 }, + { url = "https://files.pythonhosted.org/packages/ae/8c/ab03a7c25741f9ebc92684a20125fbc9fc1b8e1e700beb9197d750fdff88/numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be", size = 13971216 }, + { url = "https://files.pythonhosted.org/packages/6d/64/c3bcdf822269421d85fe0d64ba972003f9bb4aa9a419da64b86856c9961f/numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764", size = 14226281 }, + { url = "https://files.pythonhosted.org/packages/54/30/c2a907b9443cf42b90c17ad10c1e8fa801975f01cb9764f3f8eb8aea638b/numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3", size = 18249516 }, + { url = "https://files.pythonhosted.org/packages/43/12/01a563fc44c07095996d0129b8899daf89e4742146f7044cdbdb3101c57f/numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd", size = 13882132 }, + { url = "https://files.pythonhosted.org/packages/16/ee/9df80b06680aaa23fc6c31211387e0db349e0e36d6a63ba3bd78c5acdf11/numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c", size = 18084181 }, + { url = "https://files.pythonhosted.org/packages/28/7d/4b92e2fe20b214ffca36107f1a3e75ef4c488430e64de2d9af5db3a4637d/numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6", size = 5976360 }, + { url = "https://files.pythonhosted.org/packages/b5/42/054082bd8220bbf6f297f982f0a8f5479fcbc55c8b511d928df07b965869/numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea", size = 15814633 }, + { url = "https://files.pythonhosted.org/packages/3f/72/3df6c1c06fc83d9cfe381cccb4be2532bbd38bf93fbc9fad087b6687f1c0/numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30", size = 20455961 }, + { url = "https://files.pythonhosted.org/packages/8e/02/570545bac308b58ffb21adda0f4e220ba716fb658a63c151daecc3293350/numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c", size = 18061071 }, + { url = "https://files.pythonhosted.org/packages/f4/5f/fafd8c51235f60d49f7a88e2275e13971e90555b67da52dd6416caec32fe/numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0", size = 15709730 }, ] [[package]] @@ -614,7 +667,7 @@ name = "nvidia-cudnn-cu12" version = "9.1.0.70" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-cublas-cu12" }, + { name = "nvidia-cublas-cu12", marker = "python_full_version >= '3.10'" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/9f/fd/713452cd72343f682b1c7b9321e23829f00b842ceaedcda96e742ea0b0b3/nvidia_cudnn_cu12-9.1.0.70-py3-none-manylinux2014_x86_64.whl", hash = "sha256:165764f44ef8c61fcdfdfdbe769d687e06374059fbb388b6c89ecb0e28793a6f", size = 664752741 }, @@ -641,9 +694,9 @@ name = "nvidia-cusolver-cu12" version = "11.4.5.107" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-cublas-cu12" }, - { name = "nvidia-cusparse-cu12" }, - { name = "nvidia-nvjitlink-cu12" }, + { name = "nvidia-cublas-cu12", marker = "python_full_version >= '3.10'" }, + { name = "nvidia-cusparse-cu12", marker = "python_full_version >= '3.10'" }, + { name = "nvidia-nvjitlink-cu12", marker = "python_full_version >= '3.10'" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/bc/1d/8de1e5c67099015c834315e333911273a8c6aaba78923dd1d1e25fc5f217/nvidia_cusolver_cu12-11.4.5.107-py3-none-manylinux1_x86_64.whl", hash = "sha256:8a7ec542f0412294b15072fa7dab71d31334014a69f953004ea7a118206fe0dd", size = 124161928 }, @@ -654,7 +707,7 @@ name = "nvidia-cusparse-cu12" version = "12.1.0.106" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-nvjitlink-cu12" }, + { name = "nvidia-nvjitlink-cu12", marker = "python_full_version >= '3.10'" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/65/5b/cfaeebf25cd9fdec14338ccb16f6b2c4c7fa9163aefcf057d86b9cc248bb/nvidia_cusparse_cu12-12.1.0.106-py3-none-manylinux1_x86_64.whl", hash = "sha256:f3b50f42cf363f86ab21f720998517a659a48131e8d538dc02f8768237bd884c", size = 195958278 }, @@ -718,7 +771,7 @@ name = "pexpect" version = "4.9.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "ptyprocess" }, + { name = "ptyprocess", marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450 } wheels = [ @@ -748,11 +801,11 @@ name = "pre-commit" version = "3.8.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "cfgv" }, - { name = "identify" }, - { name = "nodeenv" }, - { name = "pyyaml" }, - { name = "virtualenv" }, + { name = "cfgv", marker = "python_full_version >= '3.10'" }, + { name = "identify", marker = "python_full_version >= '3.10'" }, + { name = "nodeenv", marker = "python_full_version >= '3.10'" }, + { name = "pyyaml", marker = "python_full_version >= '3.10'" }, + { name = "virtualenv", marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/64/10/97ee2fa54dff1e9da9badbc5e35d0bbaef0776271ea5907eccf64140f72f/pre_commit-3.8.0.tar.gz", hash = "sha256:8bb6494d4a20423842e198980c9ecf9f96607a07ea29549e180eef9ae80fe7af", size = 177815 } wheels = [ @@ -764,7 +817,7 @@ name = "prompt-toolkit" version = "3.0.47" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "wcwidth" }, + { name = "wcwidth", marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/47/6d/0279b119dafc74c1220420028d490c4399b790fc1256998666e3a341879f/prompt_toolkit-3.0.47.tar.gz", hash = "sha256:1e1b29cb58080b1e69f207c893a1a7bf16d127a5c30c9d17a25a5d77792e5360", size = 425859 } wheels = [ @@ -803,12 +856,12 @@ name = "pytest" version = "8.3.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, - { name = "iniconfig" }, - { name = "packaging" }, - { name = "pluggy" }, - { name = "tomli", marker = "python_full_version < '3.11'" }, + { name = "colorama", marker = "python_full_version >= '3.10' and sys_platform == 'win32'" }, + { name = "exceptiongroup", marker = "python_full_version == '3.10.*'" }, + { name = "iniconfig", marker = "python_full_version >= '3.10'" }, + { name = "packaging", marker = "python_full_version >= '3.10'" }, + { name = "pluggy", marker = "python_full_version >= '3.10'" }, + { name = "tomli", marker = "python_full_version == '3.10.*'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/b4/8c/9862305bdcd6020bc7b45b1b5e7397a6caf1a33d3025b9a003b39075ffb2/pytest-8.3.2.tar.gz", hash = "sha256:c132345d12ce551242c87269de812483f5bcc87cdbb4722e48487ba194f9fdce", size = 1439314 } wheels = [ @@ -820,8 +873,8 @@ name = "pytest-cov" version = "5.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "coverage", extra = ["toml"] }, - { name = "pytest" }, + { name = "coverage", extra = ["toml"], marker = "python_full_version >= '3.10'" }, + { name = "pytest", marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/74/67/00efc8d11b630c56f15f4ad9c7f9223f1e5ec275aaae3fa9118c6a223ad2/pytest-cov-5.0.0.tar.gz", hash = "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857", size = 63042 } wheels = [ @@ -833,7 +886,7 @@ name = "pytest-cover" version = "3.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pytest-cov" }, + { name = "pytest-cov", marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/30/27/20964101a7cdb260f8d6c4e854659026968321d10c90552b1fe7f6c5f913/pytest-cover-3.0.0.tar.gz", hash = "sha256:5bdb6c1cc3dd75583bb7bc2c57f5e1034a1bfcb79d27c71aceb0b16af981dbf4", size = 3211 } wheels = [ @@ -845,7 +898,7 @@ name = "pytest-coverage" version = "0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pytest-cover" }, + { name = "pytest-cover", marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/01/81/1d954849aed17b254d1c397eb4447a05eedce612a56b627c071df2ce00c1/pytest-coverage-0.0.tar.gz", hash = "sha256:db6af2cbd7e458c7c9fd2b4207cee75258243c8a81cad31a7ee8cfad5be93c05", size = 873 } wheels = [ @@ -894,6 +947,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597 }, { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527 }, { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446 }, + { url = "https://files.pythonhosted.org/packages/65/d8/b7a1db13636d7fb7d4ff431593c510c8b8fca920ade06ca8ef20015493c5/PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d", size = 184777 }, + { url = "https://files.pythonhosted.org/packages/0a/02/6ec546cd45143fdf9840b2c6be8d875116a64076218b61d68e12548e5839/PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f", size = 172318 }, + { url = "https://files.pythonhosted.org/packages/0e/9a/8cc68be846c972bda34f6c2a93abb644fb2476f4dcc924d52175786932c9/PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290", size = 720891 }, + { url = "https://files.pythonhosted.org/packages/e9/6c/6e1b7f40181bc4805e2e07f4abc10a88ce4648e7e95ff1abe4ae4014a9b2/PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12", size = 722614 }, + { url = "https://files.pythonhosted.org/packages/3d/32/e7bd8535d22ea2874cef6a81021ba019474ace0d13a4819c2a4bce79bd6a/PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19", size = 737360 }, + { url = "https://files.pythonhosted.org/packages/d7/12/7322c1e30b9be969670b672573d45479edef72c9a0deac3bb2868f5d7469/PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e", size = 699006 }, + { url = "https://files.pythonhosted.org/packages/82/72/04fcad41ca56491995076630c3ec1e834be241664c0c09a64c9a2589b507/PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725", size = 723577 }, + { url = "https://files.pythonhosted.org/packages/ed/5e/46168b1f2757f1fcd442bc3029cd8767d88a98c9c05770d8b420948743bb/PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631", size = 144593 }, + { url = "https://files.pythonhosted.org/packages/19/87/5124b1c1f2412bb95c59ec481eaf936cd32f0fe2a7b16b97b81c4c017a6a/PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8", size = 162312 }, ] [[package]] @@ -948,6 +1010,22 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ff/04/2b79ad0bb9bc05ab4386caa2c19aa047a66afcbdfc2640618ffc729841e4/regex-2024.7.24-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:eaef80eac3b4cfbdd6de53c6e108b4c534c21ae055d1dbea2de6b3b8ff3def38", size = 781414 }, { url = "https://files.pythonhosted.org/packages/bf/71/d0af58199283ada7d25b20e416f5b155f50aad99b0e791c0966ff5a1cd00/regex-2024.7.24-cp312-cp312-win32.whl", hash = "sha256:185e029368d6f89f36e526764cf12bf8d6f0e3a2a7737da625a76f594bdfcbfc", size = 258125 }, { url = "https://files.pythonhosted.org/packages/95/b3/10e875c45c60b010b66fc109b899c6fc4f05d485fe1d54abff98ce791124/regex-2024.7.24-cp312-cp312-win_amd64.whl", hash = "sha256:2f1baff13cc2521bea83ab2528e7a80cbe0ebb2c6f0bfad15be7da3aed443908", size = 269162 }, + { url = "https://files.pythonhosted.org/packages/dc/c6/78f26fe25efb7bec46028eff4db9fae07852defc7d2fe48fcbdba47ff3d1/regex-2024.7.24-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0ffe3f9d430cd37d8fa5632ff6fb36d5b24818c5c986893063b4e5bdb84cdf24", size = 470815 }, + { url = "https://files.pythonhosted.org/packages/3d/c9/580ff2b99482ca90785e28720269f352a015f30430bb583ff7bcc519bb9a/regex-2024.7.24-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:25419b70ba00a16abc90ee5fce061228206173231f004437730b67ac77323f0d", size = 282117 }, + { url = "https://files.pythonhosted.org/packages/14/58/283c749340e4d7aad87a1fb93c6bf11f377a0da8aaff6f7f863b28050752/regex-2024.7.24-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:33e2614a7ce627f0cdf2ad104797d1f68342d967de3695678c0cb84f530709f8", size = 278915 }, + { url = "https://files.pythonhosted.org/packages/3a/72/2667206ef348d8e4cdd349d6f0e064002e8d393b66093181d1a865b94a11/regex-2024.7.24-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d33a0021893ede5969876052796165bab6006559ab845fd7b515a30abdd990dc", size = 777146 }, + { url = "https://files.pythonhosted.org/packages/93/14/a9123402a27d1a11d034cb51236a9f6e5ba01a38e8599ede95d46e4362fa/regex-2024.7.24-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04ce29e2c5fedf296b1a1b0acc1724ba93a36fb14031f3abfb7abda2806c1535", size = 818435 }, + { url = "https://files.pythonhosted.org/packages/04/72/fbab33403723b661cbfed09c635bf6ecfc07268df1a56555d19f6f0da6af/regex-2024.7.24-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b16582783f44fbca6fcf46f61347340c787d7530d88b4d590a397a47583f31dd", size = 803404 }, + { url = "https://files.pythonhosted.org/packages/36/67/851cf82e2c47d46846cca15ba84f845e876257a54cb82f229d335cd5c67e/regex-2024.7.24-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:836d3cc225b3e8a943d0b02633fb2f28a66e281290302a79df0e1eaa984ff7c1", size = 775901 }, + { url = "https://files.pythonhosted.org/packages/7f/02/19abc35bbc20f05d4a4147319923dc880c4005a01917d41b3340bf0f84ae/regex-2024.7.24-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:438d9f0f4bc64e8dea78274caa5af971ceff0f8771e1a2333620969936ba10be", size = 766357 }, + { url = "https://files.pythonhosted.org/packages/18/fb/1e35f8cfe3cd1a086449db7bbf91b6e0051b91ebb71e67915b1b01d3a3cf/regex-2024.7.24-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:973335b1624859cb0e52f96062a28aa18f3a5fc77a96e4a3d6d76e29811a0e6e", size = 691636 }, + { url = "https://files.pythonhosted.org/packages/46/29/3561d53e0cb7a1d98385206a133988616637f98a4517ada9b714d6dff5c9/regex-2024.7.24-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c5e69fd3eb0b409432b537fe3c6f44ac089c458ab6b78dcec14478422879ec5f", size = 762342 }, + { url = "https://files.pythonhosted.org/packages/28/8b/f7fb2feb45e2c16e6e49c55979519c7ac76f3432267bf64d4aabd5d3b47b/regex-2024.7.24-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:fbf8c2f00904eaf63ff37718eb13acf8e178cb940520e47b2f05027f5bb34ce3", size = 771548 }, + { url = "https://files.pythonhosted.org/packages/03/d1/629e72e8f04639e6fadfe67b8823cc94fdcd19192b0175bd086950fefca8/regex-2024.7.24-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ae2757ace61bc4061b69af19e4689fa4416e1a04840f33b441034202b5cd02d4", size = 840214 }, + { url = "https://files.pythonhosted.org/packages/44/af/e523b6e074f90c0471d25898916d05a1b7a774b259be192f8bc6683c5966/regex-2024.7.24-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:44fc61b99035fd9b3b9453f1713234e5a7c92a04f3577252b45feefe1b327759", size = 838533 }, + { url = "https://files.pythonhosted.org/packages/3c/2a/af44a6747d1c331234f57d48cf2dcab221770cd755a7c16b5c358b485952/regex-2024.7.24-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:84c312cdf839e8b579f504afcd7b65f35d60b6285d892b19adea16355e8343c9", size = 767083 }, + { url = "https://files.pythonhosted.org/packages/90/86/865208eb0f0790d3e4c726d291acc5cbbfed4c5133a44dc99d7d746ff0bf/regex-2024.7.24-cp39-cp39-win32.whl", hash = "sha256:ca5b2028c2f7af4e13fb9fc29b28d0ce767c38c7facdf64f6c2cd040413055f1", size = 257737 }, + { url = "https://files.pythonhosted.org/packages/7f/61/b60849cd13f26a25b7aa61a0118c86c76b933a032d38b4657f4baeaeab5b/regex-2024.7.24-cp39-cp39-win_amd64.whl", hash = "sha256:7c479f5ae937ec9985ecaf42e2e10631551d909f203e31308c12d703922742f9", size = 269711 }, ] [[package]] @@ -955,10 +1033,10 @@ name = "requests" version = "2.32.3" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "certifi" }, - { name = "charset-normalizer" }, - { name = "idna" }, - { name = "urllib3" }, + { name = "certifi", marker = "python_full_version >= '3.10'" }, + { name = "charset-normalizer", marker = "python_full_version >= '3.10'" }, + { name = "idna", marker = "python_full_version >= '3.10'" }, + { name = "urllib3", marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218 } wheels = [ @@ -970,8 +1048,8 @@ name = "rich" version = "13.8.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "markdown-it-py" }, - { name = "pygments" }, + { name = "markdown-it-py", marker = "python_full_version >= '3.10'" }, + { name = "pygments", marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/cf/60/5959113cae0ce512cf246a6871c623117330105a0d5f59b4e26138f2c9cc/rich-13.8.0.tar.gz", hash = "sha256:a5ac1f1cd448ade0d59cc3356f7db7a7ccda2c8cbae9c7a90c28ff463d3e91f4", size = 222072 } wheels = [ @@ -1055,6 +1133,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5e/6c/7a3233c08bde558d6c33a41219119866cb596139a4673cc6c24024710ffd/safetensors-0.4.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d94581aab8c6b204def4d7320f07534d6ee34cd4855688004a4354e63b639a35", size = 457382 }, { url = "https://files.pythonhosted.org/packages/a0/58/0b7bcba3788ff503990cf9278d611b56c029400612ba93e772c987b5aa03/safetensors-0.4.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:67e1e7cb8678bb1b37ac48ec0df04faf689e2f4e9e81e566b5c63d9f23748523", size = 619301 }, { url = "https://files.pythonhosted.org/packages/82/cc/9c2cf58611daf1c83ce5d37f9de66353e23fcda36008b13fd3409a760aa3/safetensors-0.4.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:dbd280b07e6054ea68b0cb4b16ad9703e7d63cd6890f577cb98acc5354780142", size = 605580 }, + { url = "https://files.pythonhosted.org/packages/78/a7/47e05af6b39964a98396d593fd164723e442871dcf55fff0202dfff50b3b/safetensors-0.4.5-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:cf727bb1281d66699bef5683b04d98c894a2803442c490a8d45cd365abfbdeb2", size = 393129 }, + { url = "https://files.pythonhosted.org/packages/a4/1e/643a04fa43e070da11e11c6defdf0930fb5216aa5e734fa00e238fd09ebb/safetensors-0.4.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:96f1d038c827cdc552d97e71f522e1049fef0542be575421f7684756a748e457", size = 383165 }, + { url = "https://files.pythonhosted.org/packages/08/94/7760694760f1e5001bd62c93155b8b7ccb652d1f4d0161d1e72b5bf9581a/safetensors-0.4.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:139fbee92570ecea774e6344fee908907db79646d00b12c535f66bc78bd5ea2c", size = 442391 }, + { url = "https://files.pythonhosted.org/packages/03/1c/0db6e6e5cb293907b2242447b48cc09f31478aa02f08773155c2a2db22de/safetensors-0.4.5-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c36302c1c69eebb383775a89645a32b9d266878fab619819ce660309d6176c9b", size = 440015 }, + { url = "https://files.pythonhosted.org/packages/15/58/9658bf7ca3a4e77577fbd2c7afda4701c558db66b01daf7cd4d9dbd9781e/safetensors-0.4.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d641f5b8149ea98deb5ffcf604d764aad1de38a8285f86771ce1abf8e74c4891", size = 478099 }, + { url = "https://files.pythonhosted.org/packages/9e/fa/44d9723a988dd54f43a5fcfa6b4d3a721e9294bb55d1c3e539a88619f1b2/safetensors-0.4.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b4db6a61d968de73722b858038c616a1bebd4a86abe2688e46ca0cc2d17558f2", size = 497170 }, + { url = "https://files.pythonhosted.org/packages/5d/80/81ba44fc82afbf5ca553913ac49460e325dc5cf00c317b34c14d43ebd76b/safetensors-0.4.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b75a616e02f21b6f1d5785b20cecbab5e2bd3f6358a90e8925b813d557666ec1", size = 436076 }, + { url = "https://files.pythonhosted.org/packages/2e/ad/7880a359b0f93322689804bdbe1e9a3110652963478712933ff04a3d45c3/safetensors-0.4.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:788ee7d04cc0e0e7f944c52ff05f52a4415b312f5efd2ee66389fb7685ee030c", size = 456901 }, + { url = "https://files.pythonhosted.org/packages/89/4f/0b61e4add7ea9dfa8141d0bb1b8357e3a08730a020c3a287f0e889c386b5/safetensors-0.4.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:87bc42bd04fd9ca31396d3ca0433db0be1411b6b53ac5a32b7845a85d01ffc2e", size = 620159 }, + { url = "https://files.pythonhosted.org/packages/a9/60/544687daf8ce8dc9a74260992ac058d7e3f20c91eada5ca232898d005149/safetensors-0.4.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4037676c86365a721a8c9510323a51861d703b399b78a6b4486a54a65a975fca", size = 605993 }, + { url = "https://files.pythonhosted.org/packages/98/9a/2889d9df45ee09a02a17b3349c5649dc5516d1d167515b520e4aa79bdc5b/safetensors-0.4.5-cp39-none-win32.whl", hash = "sha256:1500418454529d0ed5c1564bda376c4ddff43f30fce9517d9bee7bcce5a8ef50", size = 272930 }, + { url = "https://files.pythonhosted.org/packages/ce/00/a4bdf45a5f2e1db08aaf95bb97f8ca30ec9568573eda03ec0db9ce5ed5d2/safetensors-0.4.5-cp39-none-win_amd64.whl", hash = "sha256:9d1a94b9d793ed8fe35ab6d5cea28d540a46559bafc6aae98f30ee0867000cab", size = 286065 }, { url = "https://files.pythonhosted.org/packages/cf/ff/037ae4c0ee32db496669365e66079b6329906c6814722b159aa700e67208/safetensors-0.4.5-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:fdadf66b5a22ceb645d5435a0be7a0292ce59648ca1d46b352f13cff3ea80410", size = 392951 }, { url = "https://files.pythonhosted.org/packages/f1/d6/6621e16b35bf83ae099eaab07338f04991a26c9aa43879d05f19f35e149c/safetensors-0.4.5-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d42ffd4c2259f31832cb17ff866c111684c87bd930892a1ba53fed28370c918c", size = 383417 }, { url = "https://files.pythonhosted.org/packages/ae/88/3068e1bb16f5e9f9068901de3cf7b3db270b9bfe6e7d51d4b55c1da0425d/safetensors-0.4.5-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd8a1f6d2063a92cd04145c7fd9e31a1c7d85fbec20113a14b487563fdbc0597", size = 442311 }, @@ -1062,6 +1152,13 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ec/79/9608c4546cdbfe3860dd7aa59e3562c9289113398b1a0bd89b68ce0a9d41/safetensors-0.4.5-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6ac85d9a8c1af0e3132371d9f2d134695a06a96993c2e2f0bbe25debb9e3f67a", size = 457316 }, { url = "https://files.pythonhosted.org/packages/0f/23/b17b483f2857835962ad33e38014efd4911791187e177bc23b057d35bee8/safetensors-0.4.5-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:e3cec4a29eb7fe8da0b1c7988bc3828183080439dd559f720414450de076fcab", size = 620565 }, { url = "https://files.pythonhosted.org/packages/19/46/5d11dc300feaad285c2f1bd784ff3f689f5e0ab6be49aaf568f3a77019eb/safetensors-0.4.5-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:21742b391b859e67b26c0b2ac37f52c9c0944a879a25ad2f9f9f3cd61e7fda8f", size = 606660 }, + { url = "https://files.pythonhosted.org/packages/5b/f9/539335e927cfeca8effc972d47e06155c4a39989905082c02b5c72769c41/safetensors-0.4.5-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f4beb84b6073b1247a773141a6331117e35d07134b3bb0383003f39971d414bb", size = 393986 }, + { url = "https://files.pythonhosted.org/packages/72/c6/988925bae113bb280642329fcbbfb502ba1bc9720b6be47c1f4c1fb7cc87/safetensors-0.4.5-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:68814d599d25ed2fdd045ed54d370d1d03cf35e02dce56de44c651f828fb9b7b", size = 384563 }, + { url = "https://files.pythonhosted.org/packages/b3/ff/b26d78b6100a08e57a1986ab71a2f9f093ba9943626f4967cd514cd43de2/safetensors-0.4.5-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0b6453c54c57c1781292c46593f8a37254b8b99004c68d6c3ce229688931a22", size = 442275 }, + { url = "https://files.pythonhosted.org/packages/71/29/6ac541358a07ec593ec9e88636908010bc9bf56c8018e0d25b4481adb64a/safetensors-0.4.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:adaa9c6dead67e2dd90d634f89131e43162012479d86e25618e821a03d1eb1dc", size = 437217 }, + { url = "https://files.pythonhosted.org/packages/2b/f8/258564b71fe95d0117356e6915b1c0128f1ec3031cf8522a28f9d2108b47/safetensors-0.4.5-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:73e7d408e9012cd17511b382b43547850969c7979efc2bc353f317abaf23c84c", size = 458132 }, + { url = "https://files.pythonhosted.org/packages/18/ac/510eebf3ac521fec3b0ea78e654e22d85de3406613209d20133b5b3cca33/safetensors-0.4.5-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:775409ce0fcc58b10773fdb4221ed1eb007de10fe7adbdf8f5e8a56096b6f0bc", size = 621171 }, + { url = "https://files.pythonhosted.org/packages/e0/c8/a02b635e39f3b904f52aff099505bdfbb40252d2d18a05e7fedc0bb64a28/safetensors-0.4.5-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:834001bed193e4440c4a3950a31059523ee5090605c907c66808664c932b549c", size = 607366 }, ] [[package]] @@ -1069,10 +1166,10 @@ name = "scikit-learn" version = "1.5.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "joblib" }, - { name = "numpy" }, - { name = "scipy" }, - { name = "threadpoolctl" }, + { name = "joblib", marker = "python_full_version >= '3.10'" }, + { name = "numpy", marker = "python_full_version >= '3.10'" }, + { name = "scipy", marker = "python_full_version >= '3.10'" }, + { name = "threadpoolctl", marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/92/72/2961b9874a9ddf2b0f95f329d4e67f67c3301c1d88ba5e239ff25661bb85/scikit_learn-1.5.1.tar.gz", hash = "sha256:0ea5d40c0e3951df445721927448755d3fe1d80833b0b7308ebff5d2a45e6414", size = 6958368 } wheels = [ @@ -1091,6 +1188,11 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d3/a9/15774b178bcd1cde1c470adbdb554e1504dce7c302e02ff736c90d65e014/scikit_learn-1.5.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:508907e5f81390e16d754e8815f7497e52139162fd69c4fdbd2dfa5d6cc88915", size = 12089887 }, { url = "https://files.pythonhosted.org/packages/8a/5d/047cde25131eef3a38d03317fa7d25d6f60ce6e8ccfd24ac88b3e309fc00/scikit_learn-1.5.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97625f217c5c0c5d0505fa2af28ae424bd37949bb2f16ace3ff5f2f81fb4498b", size = 13079093 }, { url = "https://files.pythonhosted.org/packages/cb/be/dec2a8d31d133034a8ec51ae68ac564ec9bde1c78a64551f1438c3690b9e/scikit_learn-1.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:da3f404e9e284d2b0a157e1b56b6566a34eb2798205cba35a211df3296ab7a74", size = 10945350 }, + { url = "https://files.pythonhosted.org/packages/cb/9f/d2837e96be692f99b92a3cb192e8f46501f7ddab6c93a07a9b206f7b3297/scikit_learn-1.5.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:88e0672c7ac21eb149d409c74cc29f1d611d5158175846e7a9c2427bd12b3956", size = 12138083 }, + { url = "https://files.pythonhosted.org/packages/18/3e/b46f298305c243395b88f0f201c32946bdd448e9583315255d87706c3170/scikit_learn-1.5.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:7b073a27797a283187a4ef4ee149959defc350b46cbf63a84d8514fe16b69855", size = 11005997 }, + { url = "https://files.pythonhosted.org/packages/00/84/8d2174ef802da1b9eedc8691883ed08a16318e2189fd5377e5bc2d404c0b/scikit_learn-1.5.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b59e3e62d2be870e5c74af4e793293753565c7383ae82943b83383fdcf5cc5c1", size = 12532003 }, + { url = "https://files.pythonhosted.org/packages/12/f8/d6bc56d20c60b2b66e005dfed16fdf8c46dbe559d40896d06c448a65f134/scikit_learn-1.5.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bd8d3a19d4bd6dc5a7d4f358c8c3a60934dc058f363c34c0ac1e9e12a31421d", size = 13393818 }, + { url = "https://files.pythonhosted.org/packages/a8/ed/941b210029c1051233b082a19c36b930f56dda34a8a5227dbbd1bc08f7eb/scikit_learn-1.5.1-cp39-cp39-win_amd64.whl", hash = "sha256:5f57428de0c900a98389c4a433d4a3cf89de979b3aa24d1c1d251802aa15e44d", size = 10993525 }, ] [[package]] @@ -1098,7 +1200,7 @@ name = "scipy" version = "1.14.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy" }, + { name = "numpy", marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/62/11/4d44a1f274e002784e4dbdb81e0ea96d2de2d1045b2132d5af62cc31fd28/scipy-1.14.1.tar.gz", hash = "sha256:5a275584e726026a5699459aa72f828a610821006228e841b94275c4a7c08417", size = 58620554 } wheels = [ @@ -1145,15 +1247,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ff/ae/f19306b5a221f6a436d8f2238d5b80925004093fa3edea59835b514d9057/setuptools-75.1.0-py3-none-any.whl", hash = "sha256:35ab7fd3bcd95e6b7fd704e4a1539513edad446c097797f2985e0e4b960772f2", size = 1248506 }, ] -[[package]] -name = "shellingham" -version = "1.5.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755 }, -] - [[package]] name = "six" version = "1.16.0" @@ -1168,9 +1261,9 @@ name = "stack-data" version = "0.6.3" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "asttokens" }, - { name = "executing" }, - { name = "pure-eval" }, + { name = "asttokens", marker = "python_full_version >= '3.10'" }, + { name = "executing", marker = "python_full_version >= '3.10'" }, + { name = "pure-eval", marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707 } wheels = [ @@ -1182,7 +1275,7 @@ name = "sympy" version = "1.13.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "mpmath" }, + { name = "mpmath", marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/94/15/4a041424c7187f41cce678f5a02189b244e9aac61a18b45cd415a3a470f3/sympy-1.13.2.tar.gz", hash = "sha256:401449d84d07be9d0c7a46a64bd54fe097667d5e7181bfe67ec777be9e01cb13", size = 7532926 } wheels = [ @@ -1203,7 +1296,7 @@ name = "tokenizers" version = "0.20.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "huggingface-hub" }, + { name = "huggingface-hub", marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/d7/fb/373b66ba58cbf5eda371480e4e051d8892ea1433a73f1f92c48657a699a6/tokenizers-0.20.1.tar.gz", hash = "sha256:84edcc7cdeeee45ceedb65d518fffb77aec69311c9c8e30f77ad84da3025f002", size = 339552 } wheels = [ @@ -1243,6 +1336,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/bb/37/eaa072b848471d31ae3df6e6d5be5ae594ed5fe39ca921e65cabf193dbde/tokenizers-0.20.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3ea919687aa7001a8ff1ba36ac64f165c4e89035f57998fa6cedcfd877be619d", size = 9304427 }, { url = "https://files.pythonhosted.org/packages/41/ff/4aeb924d09f6561209b57af9123a0a28fa69472cc71ee40415f036253203/tokenizers-0.20.1-cp312-none-win32.whl", hash = "sha256:6d3ac5c1f48358ffe20086bf065e843c0d0a9fce0d7f0f45d5f2f9fba3609ca5", size = 2195986 }, { url = "https://files.pythonhosted.org/packages/7e/ba/18bf6a7ad04f8225b71aa862b57188748d1d81e268de4a9aac1aed237246/tokenizers-0.20.1-cp312-none-win_amd64.whl", hash = "sha256:b0874481aea54a178f2bccc45aa2d0c99cd3f79143a0948af6a9a21dcc49173b", size = 2377984 }, + { url = "https://files.pythonhosted.org/packages/2c/7f/63333364e618d60d6f82da364e6ea28e09e98f0c479ca4baf09591067cd0/tokenizers-0.20.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a25dcb2f41a0a6aac31999e6c96a75e9152fa0127af8ece46c2f784f23b8197a", size = 2673564 }, + { url = "https://files.pythonhosted.org/packages/80/eb/95af53d2072c01c8a6e14114434099370d45344875b53be8df1dfaea9b6d/tokenizers-0.20.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a12c3cebb8c92e9c35a23ab10d3852aee522f385c28d0b4fe48c0b7527d59762", size = 2562859 }, + { url = "https://files.pythonhosted.org/packages/22/0c/18437327596682446be04597ffb6296cc472886857a057b726bbe7fc18c6/tokenizers-0.20.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02e18da58cf115b7c40de973609c35bde95856012ba42a41ee919c77935af251", size = 2944209 }, + { url = "https://files.pythonhosted.org/packages/06/b9/029fbb476bda0e51b16e8c0bbbef759eb11d4cdbfca7d48b6b971e849270/tokenizers-0.20.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f326a1ac51ae909b9760e34671c26cd0dfe15662f447302a9d5bb2d872bab8ab", size = 2826552 }, + { url = "https://files.pythonhosted.org/packages/14/9d/2eb09e02be5c581535efb550ff3920db067526d380a154cdacf3e82a3cb2/tokenizers-0.20.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b4872647ea6f25224e2833b044b0b19084e39400e8ead3cfe751238b0802140", size = 3091813 }, + { url = "https://files.pythonhosted.org/packages/ba/6b/f8d3f5eb484ba4ca92d3ce0fd050ed796aec23b28f2582e85e48c76d14d2/tokenizers-0.20.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce6238a3311bb8e4c15b12600927d35c267b92a52c881ef5717a900ca14793f7", size = 3097801 }, + { url = "https://files.pythonhosted.org/packages/9b/5f/9bfd63eb6e36a42af0b3f9313e66b13ec48c348ddb2e9398560daddd0206/tokenizers-0.20.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57b7a8880b208866508b06ce365dc631e7a2472a3faa24daa430d046fb56c885", size = 3417691 }, + { url = "https://files.pythonhosted.org/packages/63/04/1ce87a3eae86aa4e301e863d42d6907deaf61f3e9178210d9ebe653e948c/tokenizers-0.20.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a908c69c2897a68f412aa05ba38bfa87a02980df70f5a72fa8490479308b1f2d", size = 2985534 }, + { url = "https://files.pythonhosted.org/packages/00/fd/805bbbabe081de0f36120206e1d8c5d408336ff914f3a3b9fa1e77928794/tokenizers-0.20.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:da1001aa46f4490099c82e2facc4fbc06a6a32bf7de3918ba798010954b775e0", size = 8982707 }, + { url = "https://files.pythonhosted.org/packages/8f/9e/bce3fecf89901de85c12b27430aa61ada6388a0df6b11e8b1a6793399d9c/tokenizers-0.20.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:42c097390e2f0ed0a5c5d569e6669dd4e9fff7b31c6a5ce6e9c66a61687197de", size = 9301829 }, + { url = "https://files.pythonhosted.org/packages/68/bf/911ca80c5928bf8728c7f4d052ab8487512dc34f5ce872dcad0f561734bc/tokenizers-0.20.1-cp39-none-win32.whl", hash = "sha256:3d4d218573a3d8b121a1f8c801029d70444ffb6d8f129d4cca1c7b672ee4a24c", size = 2203769 }, + { url = "https://files.pythonhosted.org/packages/31/95/ba6461cbb58e38d725564a74ce1ec56c63cb4abf13131ec400522d4f7ce8/tokenizers-0.20.1-cp39-none-win_amd64.whl", hash = "sha256:37d1e6f616c84fceefa7c6484a01df05caf1e207669121c66213cb5b2911d653", size = 2385395 }, { url = "https://files.pythonhosted.org/packages/4b/9e/cf0911565ae302e4e4ed3d53bba28f2db75a9418f4e89e2434246723f01a/tokenizers-0.20.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48689da7a395df41114f516208d6550e3e905e1239cc5ad386686d9358e9cef0", size = 2666975 }, { url = "https://files.pythonhosted.org/packages/37/98/8221a62aed679aefcbc1793ed8bb33f1e060f8b7d95bb20809db1b5c0e0e/tokenizers-0.20.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:712f90ea33f9bd2586b4a90d697c26d56d0a22fd3c91104c5858c4b5b6489a79", size = 2557365 }, { url = "https://files.pythonhosted.org/packages/97/e3/167ca1981b3f512030a28f591b8ef786585b625d45f0fbf1c42723474ecd/tokenizers-0.20.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:359eceb6a620c965988fc559cebc0a98db26713758ec4df43fb76d41486a8ed5", size = 2940885 }, @@ -1250,6 +1355,13 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9c/2c/9f04aa030ba8994d478ab35464f8c541aad264556811f12afce9369cc0d3/tokenizers-0.20.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03b03cf8b9a32254b1bf8a305fb95c6daf1baae0c1f93b27f2b08c9759f41dee", size = 2981389 }, { url = "https://files.pythonhosted.org/packages/cb/f7/79a74f8c54d1232ddbd68967ce56a00cc9589a31b94bee4cf9f34af91ace/tokenizers-0.20.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:218e5a3561561ea0f0ef1559c6d95b825308dbec23fb55b70b92589e7ff2e1e8", size = 8986321 }, { url = "https://files.pythonhosted.org/packages/d4/f2/ea998aaf69966a87f92e31db7cba887125994bb9cd9a4dfcc83ac202d446/tokenizers-0.20.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f40df5e0294a95131cc5f0e0eb91fe86d88837abfbee46b9b3610b09860195a7", size = 9300207 }, + { url = "https://files.pythonhosted.org/packages/3c/89/969b427a3882c029f968e44d5bb1cff14606f878fd7c7d5b6010767881d6/tokenizers-0.20.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:89d5c337d74ea6e5e7dc8af124cf177be843bbb9ca6e58c01f75ea103c12c8a9", size = 2668512 }, + { url = "https://files.pythonhosted.org/packages/8f/35/643727d36c409f71ddd9b914513ed793dcaa56d92e4310a5f3a0d6b84138/tokenizers-0.20.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:0b7f515c83397e73292accdbbbedc62264e070bae9682f06061e2ddce67cacaf", size = 2559268 }, + { url = "https://files.pythonhosted.org/packages/f1/9f/ffcf52c1d0f27778ec2e5c526ee7c727c24441254ef5732d0b391583ff7b/tokenizers-0.20.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e0305fc1ec6b1e5052d30d9c1d5c807081a7bd0cae46a33d03117082e91908c", size = 2941961 }, + { url = "https://files.pythonhosted.org/packages/f6/38/977e4ca1dc955fb368fa900050d08b9bf67f8d5de3bd364f0d04ed4eedfd/tokenizers-0.20.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5dc611e6ac0fa00a41de19c3bf6391a05ea201d2d22b757d63f5491ec0e67faa", size = 3094239 }, + { url = "https://files.pythonhosted.org/packages/24/e8/20d71cb85d3f3f39e01246f7827b42b6f9862332c500433f20307addc212/tokenizers-0.20.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c5ffe0d7f7bfcfa3b2585776ecf11da2e01c317027c8573c78ebcb8985279e23", size = 2982637 }, + { url = "https://files.pythonhosted.org/packages/2a/63/a640fc3e011bb0392e05c9e5f7054c039d3542426dec46f6b7c8e753d999/tokenizers-0.20.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:e7edb8ec12c100d5458d15b1e47c0eb30ad606a05641f19af7563bc3d1608c14", size = 8989341 }, + { url = "https://files.pythonhosted.org/packages/da/96/1603264112ce0fb5da7dae215de037d21dcd9b7c6947ed575b9e81a0d05a/tokenizers-0.20.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:de291633fb9303555793cc544d4a86e858da529b7d0b752bcaf721ae1d74b2c9", size = 9301114 }, ] [[package]] @@ -1266,24 +1378,24 @@ name = "torch" version = "2.4.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "filelock" }, - { name = "fsspec" }, - { name = "jinja2" }, - { name = "networkx" }, - { name = "nvidia-cublas-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-cuda-cupti-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-cuda-nvrtc-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-cuda-runtime-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-cudnn-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-cufft-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-curand-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-cusolver-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-cusparse-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-nccl-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-nvtx-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "sympy" }, - { name = "triton", marker = "python_full_version < '3.13' and platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "typing-extensions" }, + { name = "filelock", marker = "python_full_version >= '3.10'" }, + { name = "fsspec", marker = "python_full_version >= '3.10'" }, + { name = "jinja2", marker = "python_full_version >= '3.10'" }, + { name = "networkx", marker = "python_full_version >= '3.10'" }, + { name = "nvidia-cublas-cu12", marker = "python_full_version >= '3.10' and platform_machine == 'x86_64' and platform_system == 'Linux'" }, + { name = "nvidia-cuda-cupti-cu12", marker = "python_full_version >= '3.10' and platform_machine == 'x86_64' and platform_system == 'Linux'" }, + { name = "nvidia-cuda-nvrtc-cu12", marker = "python_full_version >= '3.10' and platform_machine == 'x86_64' and platform_system == 'Linux'" }, + { name = "nvidia-cuda-runtime-cu12", marker = "python_full_version >= '3.10' and platform_machine == 'x86_64' and platform_system == 'Linux'" }, + { name = "nvidia-cudnn-cu12", marker = "python_full_version >= '3.10' and platform_machine == 'x86_64' and platform_system == 'Linux'" }, + { name = "nvidia-cufft-cu12", marker = "python_full_version >= '3.10' and platform_machine == 'x86_64' and platform_system == 'Linux'" }, + { name = "nvidia-curand-cu12", marker = "python_full_version >= '3.10' and platform_machine == 'x86_64' and platform_system == 'Linux'" }, + { name = "nvidia-cusolver-cu12", marker = "python_full_version >= '3.10' and platform_machine == 'x86_64' and platform_system == 'Linux'" }, + { name = "nvidia-cusparse-cu12", marker = "python_full_version >= '3.10' and platform_machine == 'x86_64' and platform_system == 'Linux'" }, + { name = "nvidia-nccl-cu12", marker = "python_full_version >= '3.10' and platform_machine == 'x86_64' and platform_system == 'Linux'" }, + { name = "nvidia-nvtx-cu12", marker = "python_full_version >= '3.10' and platform_machine == 'x86_64' and platform_system == 'Linux'" }, + { name = "sympy", marker = "python_full_version >= '3.10'" }, + { name = "triton", marker = "python_full_version >= '3.10' and python_full_version < '3.13' and platform_machine == 'x86_64' and platform_system == 'Linux'" }, + { name = "typing-extensions", marker = "python_full_version >= '3.10'" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/41/05/d540049b1832d1062510efc6829634b7fbef5394c757d8312414fb65a3cb/torch-2.4.1-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:362f82e23a4cd46341daabb76fba08f04cd646df9bfaf5da50af97cb60ca4971", size = 797072810 }, @@ -1298,6 +1410,10 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/4f/16/d23a689e5ef8001ed2ace1a3a59f2fda842889b0c3f3877799089925282a/torch-2.4.1-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:18835374f599207a9e82c262153c20ddf42ea49bc76b6eadad8e5f49729f6e4d", size = 89613802 }, { url = "https://files.pythonhosted.org/packages/a8/e0/ca8354dfb8d834a76da51b06e8248b70fc182bc163540507919124974bdf/torch-2.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:ebea70ff30544fc021d441ce6b219a88b67524f01170b1c538d7d3ebb5e7f56c", size = 199387694 }, { url = "https://files.pythonhosted.org/packages/ac/30/8b6f77ea4ce84f015ee024b8dfef0dac289396254e8bfd493906d4cbb848/torch-2.4.1-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:72b484d5b6cec1a735bf3fa5a1c4883d01748698c5e9cfdbeb4ffab7c7987e0d", size = 62123443 }, + { url = "https://files.pythonhosted.org/packages/14/d6/caa3ccde685a3bfedeed1454d82b2eb520e611d1b36bf748f54475de333f/torch-2.4.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:40f6d3fe3bae74efcf08cb7f8295eaddd8a838ce89e9d26929d4edd6d5e4329d", size = 797088350 }, + { url = "https://files.pythonhosted.org/packages/3d/5d/4e9a7e5b7f11710519c38fe6a9f588a91fd23e6e9722e79f90f03823222d/torch-2.4.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:c9299c16c9743001ecef515536ac45900247f4338ecdf70746f2461f9e4831db", size = 89706796 }, + { url = "https://files.pythonhosted.org/packages/ef/44/238ef95daf345bab21afa0ca37b2896dfc20cd93b6b75722717685fdeb10/torch-2.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:6bce130f2cd2d52ba4e2c6ada461808de7e5eccbac692525337cfb4c19421846", size = 199332260 }, + { url = "https://files.pythonhosted.org/packages/e7/81/c05013695bfb3762f3c657a557407f152a0a0452b3ccec437a4a59848fb5/torch-2.4.1-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:a38de2803ee6050309aac032676536c3d3b6a9804248537e38e098d0e14817ec", size = 62139344 }, ] [[package]] @@ -1305,7 +1421,7 @@ name = "tqdm" version = "4.66.5" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "colorama", marker = "platform_system == 'Windows'" }, + { name = "colorama", marker = "python_full_version >= '3.10' and platform_system == 'Windows'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/58/83/6ba9844a41128c62e810fddddd72473201f3eacde02046066142a2d96cc5/tqdm-4.66.5.tar.gz", hash = "sha256:e1020aef2e5096702d8a025ac7d16b1577279c9d63f8375b63083e9a5f0fcbad", size = 169504 } wheels = [ @@ -1326,16 +1442,16 @@ name = "transformers" version = "4.45.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "filelock" }, - { name = "huggingface-hub" }, - { name = "numpy" }, - { name = "packaging" }, - { name = "pyyaml" }, - { name = "regex" }, - { name = "requests" }, - { name = "safetensors" }, - { name = "tokenizers" }, - { name = "tqdm" }, + { name = "filelock", marker = "python_full_version >= '3.10'" }, + { name = "huggingface-hub", marker = "python_full_version >= '3.10'" }, + { name = "numpy", marker = "python_full_version >= '3.10'" }, + { name = "packaging", marker = "python_full_version >= '3.10'" }, + { name = "pyyaml", marker = "python_full_version >= '3.10'" }, + { name = "regex", marker = "python_full_version >= '3.10'" }, + { name = "requests", marker = "python_full_version >= '3.10'" }, + { name = "safetensors", marker = "python_full_version >= '3.10'" }, + { name = "tokenizers", marker = "python_full_version >= '3.10'" }, + { name = "tqdm", marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/4b/4c/3862b2dd6cdf83b187897bd351da0f7fb74d0df642b03c6f5d06353a3ca0/transformers-4.45.2.tar.gz", hash = "sha256:72bc390f6b203892561f05f86bbfaa0e234aab8e927a83e62b9d92ea7e3ae101", size = 8478357 } wheels = [ @@ -1347,27 +1463,13 @@ name = "triton" version = "3.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "filelock", marker = "python_full_version < '3.13'" }, + { name = "filelock", marker = "python_full_version >= '3.10' and python_full_version < '3.13'" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/45/27/14cc3101409b9b4b9241d2ba7deaa93535a217a211c86c4cc7151fb12181/triton-3.0.0-1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e1efef76935b2febc365bfadf74bcb65a6f959a9872e5bddf44cc9e0adce1e1a", size = 209376304 }, { url = "https://files.pythonhosted.org/packages/33/3e/a2f59384587eff6aeb7d37b6780de7fedd2214935e27520430ca9f5b7975/triton-3.0.0-1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5ce8520437c602fb633f1324cc3871c47bee3b67acf9756c1a66309b60e3216c", size = 209438883 }, { url = "https://files.pythonhosted.org/packages/fe/7b/7757205dee3628f75e7991021d15cd1bd0c9b044ca9affe99b50879fc0e1/triton-3.0.0-1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:34e509deb77f1c067d8640725ef00c5cbfcb2052a1a3cb6a6d343841f92624eb", size = 209464695 }, -] - -[[package]] -name = "typer" -version = "0.12.5" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "click" }, - { name = "rich" }, - { name = "shellingham" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c5/58/a79003b91ac2c6890fc5d90145c662fd5771c6f11447f116b63300436bc9/typer-0.12.5.tar.gz", hash = "sha256:f592f089bedcc8ec1b974125d64851029c3b1af145f04aca64d69410f0c9b722", size = 98953 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a8/2b/886d13e742e514f704c33c4caa7df0f3b89e5a25ef8db02aa9ca3d9535d5/typer-0.12.5-py3-none-any.whl", hash = "sha256:62fe4e471711b147e3365034133904df3e235698399bc4de2b36c8579298d52b", size = 47288 }, + { url = "https://files.pythonhosted.org/packages/6c/bf/55cccf57c14787ad81ee827526ddd48fd0aff0291fcc7b8c2e2bdf28da0a/triton-3.0.0-1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6e5727202f7078c56f91ff13ad0c1abab14a0e7f2c87e91b12b6f64f3e8ae609", size = 209377082 }, ] [[package]] @@ -1393,9 +1495,9 @@ name = "virtualenv" version = "20.26.3" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "distlib" }, - { name = "filelock" }, - { name = "platformdirs" }, + { name = "distlib", marker = "python_full_version >= '3.10'" }, + { name = "filelock", marker = "python_full_version >= '3.10'" }, + { name = "platformdirs", marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/68/60/db9f95e6ad456f1872486769c55628c7901fb4de5a72c2f7bdd912abf0c1/virtualenv-20.26.3.tar.gz", hash = "sha256:4c43a2a236279d9ea36a0d76f98d84bd6ca94ac4e0f4a3b9d46d05e10fea542a", size = 9057588 } wheels = [ From 4e7446313aeb30b9e69fab9139440e3fa7acd9d5 Mon Sep 17 00:00:00 2001 From: Stephan Tulkens Date: Sat, 19 Oct 2024 22:22:02 +0200 Subject: [PATCH 19/30] fix: rename show progress bar argument (#99) * fix: rename show_progressbar to show_progress_bar, remove from tutorial for backwards compat * Fix progress bar --- model2vec/model.py | 12 +- tutorials/semantic_deduplication.ipynb | 6 +- uv.lock | 1344 +++++++++++++----------- 3 files changed, 718 insertions(+), 644 deletions(-) diff --git a/model2vec/model.py b/model2vec/model.py index c1692f1..8160c69 100644 --- a/model2vec/model.py +++ b/model2vec/model.py @@ -162,7 +162,7 @@ def encode_as_sequence( sentences: list[str] | str, max_length: int | None = None, batch_size: int = 1024, - show_progressbar: bool = False, + show_progress_bar: bool = False, ) -> list[np.ndarray] | np.ndarray: """ Encode a list of sentences as a list of numpy arrays of tokens. @@ -177,7 +177,7 @@ def encode_as_sequence( :param max_length: The maximum length of the sentences. Any tokens beyond this length will be truncated. If this is None, no truncation is done. :param batch_size: The batch size to use. - :param show_progressbar: Whether to show the progress bar. + :param show_progress_bar: Whether to show the progress bar. :return: The encoded sentences with an embedding per token. """ was_single = False @@ -189,7 +189,7 @@ def encode_as_sequence( for batch in tqdm( self._batch(sentences, batch_size), total=math.ceil(len(sentences) / batch_size), - disable=not show_progressbar, + disable=not show_progress_bar, ): out_array.extend(self._encode_batch_as_sequence(batch, max_length)) @@ -213,7 +213,7 @@ def _encode_batch_as_sequence(self, sentences: list[str], max_length: int | None def encode( self, sentences: list[str] | str, - show_progressbar: bool = False, + show_progress_bar: bool = False, max_length: int | None = 512, batch_size: int = 1024, **kwargs: Any, @@ -225,7 +225,7 @@ def encode( For ease of use, we don't batch sentences together. :param sentences: The list of sentences to encode. You can also pass a single sentence. - :param show_progressbar: Whether to show the progress bar. + :param show_progress_bar: Whether to show the progress bar. :param max_length: The maximum length of the sentences. Any tokens beyond this length will be truncated. If this is None, no truncation is done. :param batch_size: The batch size to use. @@ -241,7 +241,7 @@ def encode( for batch in tqdm( self._batch(sentences, batch_size), total=math.ceil(len(sentences) / batch_size), - disable=not show_progressbar, + disable=not show_progress_bar, ): out_arrays.append(self._encode_batch(batch, max_length)) diff --git a/tutorials/semantic_deduplication.ipynb b/tutorials/semantic_deduplication.ipynb index 82c0b62..e3b30a5 100644 --- a/tutorials/semantic_deduplication.ipynb +++ b/tutorials/semantic_deduplication.ipynb @@ -110,7 +110,7 @@ ], "source": [ "# Encode texts into embeddings\n", - "embedding_matrix = model.encode(texts, show_progressbar=True)" + "embedding_matrix = model.encode(texts)" ] }, { @@ -407,8 +407,8 @@ "texts_test = ds_test['text']\n", "\n", "# Encode texts into embeddings\n", - "embedding_matrix_train = model.encode(texts_train, show_progressbar=True)\n", - "embedding_matrix_test = model.encode(texts_test, show_progressbar=True)\n", + "embedding_matrix_train = model.encode(texts_train)\n", + "embedding_matrix_test = model.encode(texts_test)\n", "\n", "def deduplicate_across_datasets(embedding_matrix_1: np.ndarray, embedding_matrix_2: np.ndarray, threshold: float, batch_size: int = 1024) -> tuple[list[int], dict[int, int]]:\n", " \"\"\"\n", diff --git a/uv.lock b/uv.lock index 5c9b79f..5c7056d 100644 --- a/uv.lock +++ b/uv.lock @@ -1,18 +1,12 @@ version = 1 requires-python = ">=3.9" -resolution-markers = [ - "python_full_version == '3.10.*'", - "python_full_version == '3.11.*'", - "python_full_version == '3.12.*'", - "python_full_version >= '3.13'", -] [[package]] name = "asttokens" version = "2.4.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "six", marker = "python_full_version >= '3.10'" }, + { name = "six" }, ] sdist = { url = "https://files.pythonhosted.org/packages/45/1d/f03bcb60c4a3212e15f99a56085d93093a497718adf828d050b9d675da81/asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0", size = 62284 } wheels = [ @@ -21,36 +15,40 @@ wheels = [ [[package]] name = "black" -version = "24.8.0" +version = "24.10.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "click", marker = "python_full_version >= '3.10'" }, - { name = "mypy-extensions", marker = "python_full_version >= '3.10'" }, - { name = "packaging", marker = "python_full_version >= '3.10'" }, - { name = "pathspec", marker = "python_full_version >= '3.10'" }, - { name = "platformdirs", marker = "python_full_version >= '3.10'" }, - { name = "tomli", marker = "python_full_version == '3.10.*'" }, - { name = "typing-extensions", marker = "python_full_version == '3.10.*'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/04/b0/46fb0d4e00372f4a86a6f8efa3cb193c9f64863615e39010b1477e010578/black-24.8.0.tar.gz", hash = "sha256:2500945420b6784c38b9ee885af039f5e7471ef284ab03fa35ecdde4688cd83f", size = 644810 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/47/6e/74e29edf1fba3887ed7066930a87f698ffdcd52c5dbc263eabb06061672d/black-24.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:09cdeb74d494ec023ded657f7092ba518e8cf78fa8386155e4a03fdcc44679e6", size = 1632092 }, - { url = "https://files.pythonhosted.org/packages/ab/49/575cb6c3faee690b05c9d11ee2e8dba8fbd6d6c134496e644c1feb1b47da/black-24.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:81c6742da39f33b08e791da38410f32e27d632260e599df7245cccee2064afeb", size = 1457529 }, - { url = "https://files.pythonhosted.org/packages/7a/b4/d34099e95c437b53d01c4aa37cf93944b233066eb034ccf7897fa4e5f286/black-24.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:707a1ca89221bc8a1a64fb5e15ef39cd755633daa672a9db7498d1c19de66a42", size = 1757443 }, - { url = "https://files.pythonhosted.org/packages/87/a0/6d2e4175ef364b8c4b64f8441ba041ed65c63ea1db2720d61494ac711c15/black-24.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:d6417535d99c37cee4091a2f24eb2b6d5ec42b144d50f1f2e436d9fe1916fe1a", size = 1418012 }, - { url = "https://files.pythonhosted.org/packages/08/a6/0a3aa89de9c283556146dc6dbda20cd63a9c94160a6fbdebaf0918e4a3e1/black-24.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fb6e2c0b86bbd43dee042e48059c9ad7830abd5c94b0bc518c0eeec57c3eddc1", size = 1615080 }, - { url = "https://files.pythonhosted.org/packages/db/94/b803d810e14588bb297e565821a947c108390a079e21dbdcb9ab6956cd7a/black-24.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:837fd281f1908d0076844bc2b801ad2d369c78c45cf800cad7b61686051041af", size = 1438143 }, - { url = "https://files.pythonhosted.org/packages/a5/b5/f485e1bbe31f768e2e5210f52ea3f432256201289fd1a3c0afda693776b0/black-24.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62e8730977f0b77998029da7971fa896ceefa2c4c4933fcd593fa599ecbf97a4", size = 1738774 }, - { url = "https://files.pythonhosted.org/packages/a8/69/a000fc3736f89d1bdc7f4a879f8aaf516fb03613bb51a0154070383d95d9/black-24.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:72901b4913cbac8972ad911dc4098d5753704d1f3c56e44ae8dce99eecb0e3af", size = 1427503 }, - { url = "https://files.pythonhosted.org/packages/a2/a8/05fb14195cfef32b7c8d4585a44b7499c2a4b205e1662c427b941ed87054/black-24.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7c046c1d1eeb7aea9335da62472481d3bbf3fd986e093cffd35f4385c94ae368", size = 1646132 }, - { url = "https://files.pythonhosted.org/packages/41/77/8d9ce42673e5cb9988f6df73c1c5c1d4e9e788053cccd7f5fb14ef100982/black-24.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:649f6d84ccbae73ab767e206772cc2d7a393a001070a4c814a546afd0d423aed", size = 1448665 }, - { url = "https://files.pythonhosted.org/packages/cc/94/eff1ddad2ce1d3cc26c162b3693043c6b6b575f538f602f26fe846dfdc75/black-24.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2b59b250fdba5f9a9cd9d0ece6e6d993d91ce877d121d161e4698af3eb9c1018", size = 1762458 }, - { url = "https://files.pythonhosted.org/packages/28/ea/18b8d86a9ca19a6942e4e16759b2fa5fc02bbc0eb33c1b866fcd387640ab/black-24.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:6e55d30d44bed36593c3163b9bc63bf58b3b30e4611e4d88a0c3c239930ed5b2", size = 1436109 }, - { url = "https://files.pythonhosted.org/packages/13/b2/b3f24fdbb46f0e7ef6238e131f13572ee8279b70f237f221dd168a9dba1a/black-24.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:eab4dd44ce80dea27dc69db40dab62d4ca96112f87996bca68cd75639aeb2e4c", size = 1631706 }, - { url = "https://files.pythonhosted.org/packages/d9/35/31010981e4a05202a84a3116423970fd1a59d2eda4ac0b3570fbb7029ddc/black-24.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3c4285573d4897a7610054af5a890bde7c65cb466040c5f0c8b732812d7f0e5e", size = 1457429 }, - { url = "https://files.pythonhosted.org/packages/27/25/3f706b4f044dd569a20a4835c3b733dedea38d83d2ee0beb8178a6d44945/black-24.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e84e33b37be070ba135176c123ae52a51f82306def9f7d063ee302ecab2cf47", size = 1756488 }, - { url = "https://files.pythonhosted.org/packages/63/72/79375cd8277cbf1c5670914e6bd4c1b15dea2c8f8e906dc21c448d0535f0/black-24.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:73bbf84ed136e45d451a260c6b73ed674652f90a2b3211d6a35e78054563a9bb", size = 1417721 }, - { url = "https://files.pythonhosted.org/packages/27/1e/83fa8a787180e1632c3d831f7e58994d7aaf23a0961320d21e84f922f919/black-24.8.0-py3-none-any.whl", hash = "sha256:972085c618ee94f402da1af548a4f218c754ea7e5dc70acb168bfaca4c2542ed", size = 206504 }, + { name = "click" }, + { name = "mypy-extensions" }, + { name = "packaging" }, + { name = "pathspec" }, + { name = "platformdirs" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d8/0d/cc2fb42b8c50d80143221515dd7e4766995bd07c56c9a3ed30baf080b6dc/black-24.10.0.tar.gz", hash = "sha256:846ea64c97afe3bc677b761787993be4991810ecc7a4a937816dd6bddedc4875", size = 645813 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a3/f3/465c0eb5cddf7dbbfe1fecd9b875d1dcf51b88923cd2c1d7e9ab95c6336b/black-24.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6668650ea4b685440857138e5fe40cde4d652633b1bdffc62933d0db4ed9812", size = 1623211 }, + { url = "https://files.pythonhosted.org/packages/df/57/b6d2da7d200773fdfcc224ffb87052cf283cec4d7102fab450b4a05996d8/black-24.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1c536fcf674217e87b8cc3657b81809d3c085d7bf3ef262ead700da345bfa6ea", size = 1457139 }, + { url = "https://files.pythonhosted.org/packages/6e/c5/9023b7673904a5188f9be81f5e129fff69f51f5515655fbd1d5a4e80a47b/black-24.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:649fff99a20bd06c6f727d2a27f401331dc0cc861fb69cde910fe95b01b5928f", size = 1753774 }, + { url = "https://files.pythonhosted.org/packages/e1/32/df7f18bd0e724e0d9748829765455d6643ec847b3f87e77456fc99d0edab/black-24.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:fe4d6476887de70546212c99ac9bd803d90b42fc4767f058a0baa895013fbb3e", size = 1414209 }, + { url = "https://files.pythonhosted.org/packages/c2/cc/7496bb63a9b06a954d3d0ac9fe7a73f3bf1cd92d7a58877c27f4ad1e9d41/black-24.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5a2221696a8224e335c28816a9d331a6c2ae15a2ee34ec857dcf3e45dbfa99ad", size = 1607468 }, + { url = "https://files.pythonhosted.org/packages/2b/e3/69a738fb5ba18b5422f50b4f143544c664d7da40f09c13969b2fd52900e0/black-24.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f9da3333530dbcecc1be13e69c250ed8dfa67f43c4005fb537bb426e19200d50", size = 1437270 }, + { url = "https://files.pythonhosted.org/packages/c9/9b/2db8045b45844665c720dcfe292fdaf2e49825810c0103e1191515fc101a/black-24.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4007b1393d902b48b36958a216c20c4482f601569d19ed1df294a496eb366392", size = 1737061 }, + { url = "https://files.pythonhosted.org/packages/a3/95/17d4a09a5be5f8c65aa4a361444d95edc45def0de887810f508d3f65db7a/black-24.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:394d4ddc64782e51153eadcaaca95144ac4c35e27ef9b0a42e121ae7e57a9175", size = 1423293 }, + { url = "https://files.pythonhosted.org/packages/90/04/bf74c71f592bcd761610bbf67e23e6a3cff824780761f536512437f1e655/black-24.10.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b5e39e0fae001df40f95bd8cc36b9165c5e2ea88900167bddf258bacef9bbdc3", size = 1644256 }, + { url = "https://files.pythonhosted.org/packages/4c/ea/a77bab4cf1887f4b2e0bce5516ea0b3ff7d04ba96af21d65024629afedb6/black-24.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d37d422772111794b26757c5b55a3eade028aa3fde43121ab7b673d050949d65", size = 1448534 }, + { url = "https://files.pythonhosted.org/packages/4e/3e/443ef8bc1fbda78e61f79157f303893f3fddf19ca3c8989b163eb3469a12/black-24.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:14b3502784f09ce2443830e3133dacf2c0110d45191ed470ecb04d0f5f6fcb0f", size = 1761892 }, + { url = "https://files.pythonhosted.org/packages/52/93/eac95ff229049a6901bc84fec6908a5124b8a0b7c26ea766b3b8a5debd22/black-24.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:30d2c30dc5139211dda799758559d1b049f7f14c580c409d6ad925b74a4208a8", size = 1434796 }, + { url = "https://files.pythonhosted.org/packages/d0/a0/a993f58d4ecfba035e61fca4e9f64a2ecae838fc9f33ab798c62173ed75c/black-24.10.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1cbacacb19e922a1d75ef2b6ccaefcd6e93a2c05ede32f06a21386a04cedb981", size = 1643986 }, + { url = "https://files.pythonhosted.org/packages/37/d5/602d0ef5dfcace3fb4f79c436762f130abd9ee8d950fa2abdbf8bbc555e0/black-24.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1f93102e0c5bb3907451063e08b9876dbeac810e7da5a8bfb7aeb5a9ef89066b", size = 1448085 }, + { url = "https://files.pythonhosted.org/packages/47/6d/a3a239e938960df1a662b93d6230d4f3e9b4a22982d060fc38c42f45a56b/black-24.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ddacb691cdcdf77b96f549cf9591701d8db36b2f19519373d60d31746068dbf2", size = 1760928 }, + { url = "https://files.pythonhosted.org/packages/dd/cf/af018e13b0eddfb434df4d9cd1b2b7892bab119f7a20123e93f6910982e8/black-24.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:680359d932801c76d2e9c9068d05c6b107f2584b2a5b88831c83962eb9984c1b", size = 1436875 }, + { url = "https://files.pythonhosted.org/packages/fe/02/f408c804e0ee78c367dcea0a01aedde4f1712af93b8b6e60df981e0228c7/black-24.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:17374989640fbca88b6a448129cd1745c5eb8d9547b464f281b251dd00155ccd", size = 1622516 }, + { url = "https://files.pythonhosted.org/packages/f8/b9/9b706ed2f55bfb28b436225a9c57da35990c9005b90b8c91f03924454ad7/black-24.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:63f626344343083322233f175aaf372d326de8436f5928c042639a4afbbf1d3f", size = 1456181 }, + { url = "https://files.pythonhosted.org/packages/0a/1c/314d7f17434a5375682ad097f6f4cc0e3f414f3c95a9b1bb4df14a0f11f9/black-24.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfa1d0cb6200857f1923b602f978386a3a2758a65b52e0950299ea014be6800", size = 1752801 }, + { url = "https://files.pythonhosted.org/packages/39/a7/20e5cd9237d28ad0b31438de5d9f01c8b99814576f4c0cda1edd62caf4b0/black-24.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:2cd9c95431d94adc56600710f8813ee27eea544dd118d45896bb734e9d7a0dc7", size = 1413626 }, + { url = "https://files.pythonhosted.org/packages/8d/a7/4b27c50537ebca8bec139b872861f9d2bf501c5ec51fcf897cb924d9e264/black-24.10.0-py3-none-any.whl", hash = "sha256:3bb2b7a1f7b685f85b11fed1ef10f8a9148bceb49853e47a294a3dd963c1dd7d", size = 206898 }, ] [[package]] @@ -73,71 +71,86 @@ wheels = [ [[package]] name = "charset-normalizer" -version = "3.3.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/63/09/c1bc53dab74b1816a00d8d030de5bf98f724c52c1635e07681d312f20be8/charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5", size = 104809 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2b/61/095a0aa1a84d1481998b534177c8566fdc50bb1233ea9a0478cd3cc075bd/charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3", size = 194219 }, - { url = "https://files.pythonhosted.org/packages/cc/94/f7cf5e5134175de79ad2059edf2adce18e0685ebdb9227ff0139975d0e93/charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027", size = 122521 }, - { url = "https://files.pythonhosted.org/packages/46/6a/d5c26c41c49b546860cc1acabdddf48b0b3fb2685f4f5617ac59261b44ae/charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03", size = 120383 }, - { url = "https://files.pythonhosted.org/packages/b8/60/e2f67915a51be59d4539ed189eb0a2b0d292bf79270410746becb32bc2c3/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d", size = 138223 }, - { url = "https://files.pythonhosted.org/packages/05/8c/eb854996d5fef5e4f33ad56927ad053d04dc820e4a3d39023f35cad72617/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e", size = 148101 }, - { url = "https://files.pythonhosted.org/packages/f6/93/bb6cbeec3bf9da9b2eba458c15966658d1daa8b982c642f81c93ad9b40e1/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6", size = 140699 }, - { url = "https://files.pythonhosted.org/packages/da/f1/3702ba2a7470666a62fd81c58a4c40be00670e5006a67f4d626e57f013ae/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5", size = 142065 }, - { url = "https://files.pythonhosted.org/packages/3f/ba/3f5e7be00b215fa10e13d64b1f6237eb6ebea66676a41b2bcdd09fe74323/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537", size = 144505 }, - { url = "https://files.pythonhosted.org/packages/33/c3/3b96a435c5109dd5b6adc8a59ba1d678b302a97938f032e3770cc84cd354/charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c", size = 139425 }, - { url = "https://files.pythonhosted.org/packages/43/05/3bf613e719efe68fb3a77f9c536a389f35b95d75424b96b426a47a45ef1d/charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12", size = 145287 }, - { url = "https://files.pythonhosted.org/packages/58/78/a0bc646900994df12e07b4ae5c713f2b3e5998f58b9d3720cce2aa45652f/charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f", size = 149929 }, - { url = "https://files.pythonhosted.org/packages/eb/5c/97d97248af4920bc68687d9c3b3c0f47c910e21a8ff80af4565a576bd2f0/charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269", size = 141605 }, - { url = "https://files.pythonhosted.org/packages/a8/31/47d018ef89f95b8aded95c589a77c072c55e94b50a41aa99c0a2008a45a4/charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519", size = 142646 }, - { url = "https://files.pythonhosted.org/packages/ae/d5/4fecf1d58bedb1340a50f165ba1c7ddc0400252d6832ff619c4568b36cc0/charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73", size = 92846 }, - { url = "https://files.pythonhosted.org/packages/a2/a0/4af29e22cb5942488cf45630cbdd7cefd908768e69bdd90280842e4e8529/charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09", size = 100343 }, - { url = "https://files.pythonhosted.org/packages/68/77/02839016f6fbbf808e8b38601df6e0e66c17bbab76dff4613f7511413597/charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db", size = 191647 }, - { url = "https://files.pythonhosted.org/packages/3e/33/21a875a61057165e92227466e54ee076b73af1e21fe1b31f1e292251aa1e/charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96", size = 121434 }, - { url = "https://files.pythonhosted.org/packages/dd/51/68b61b90b24ca35495956b718f35a9756ef7d3dd4b3c1508056fa98d1a1b/charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e", size = 118979 }, - { url = "https://files.pythonhosted.org/packages/e4/a6/7ee57823d46331ddc37dd00749c95b0edec2c79b15fc0d6e6efb532e89ac/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f", size = 136582 }, - { url = "https://files.pythonhosted.org/packages/74/f1/0d9fe69ac441467b737ba7f48c68241487df2f4522dd7246d9426e7c690e/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574", size = 146645 }, - { url = "https://files.pythonhosted.org/packages/05/31/e1f51c76db7be1d4aef220d29fbfa5dbb4a99165d9833dcbf166753b6dc0/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4", size = 139398 }, - { url = "https://files.pythonhosted.org/packages/40/26/f35951c45070edc957ba40a5b1db3cf60a9dbb1b350c2d5bef03e01e61de/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8", size = 140273 }, - { url = "https://files.pythonhosted.org/packages/07/07/7e554f2bbce3295e191f7e653ff15d55309a9ca40d0362fcdab36f01063c/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc", size = 142577 }, - { url = "https://files.pythonhosted.org/packages/d8/b5/eb705c313100defa57da79277d9207dc8d8e45931035862fa64b625bfead/charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae", size = 137747 }, - { url = "https://files.pythonhosted.org/packages/19/28/573147271fd041d351b438a5665be8223f1dd92f273713cb882ddafe214c/charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887", size = 143375 }, - { url = "https://files.pythonhosted.org/packages/cf/7c/f3b682fa053cc21373c9a839e6beba7705857075686a05c72e0f8c4980ca/charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae", size = 148474 }, - { url = "https://files.pythonhosted.org/packages/1e/49/7ab74d4ac537ece3bc3334ee08645e231f39f7d6df6347b29a74b0537103/charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce", size = 140232 }, - { url = "https://files.pythonhosted.org/packages/2d/dc/9dacba68c9ac0ae781d40e1a0c0058e26302ea0660e574ddf6797a0347f7/charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f", size = 140859 }, - { url = "https://files.pythonhosted.org/packages/6c/c2/4a583f800c0708dd22096298e49f887b49d9746d0e78bfc1d7e29816614c/charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab", size = 92509 }, - { url = "https://files.pythonhosted.org/packages/57/ec/80c8d48ac8b1741d5b963797b7c0c869335619e13d4744ca2f67fc11c6fc/charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77", size = 99870 }, - { url = "https://files.pythonhosted.org/packages/d1/b2/fcedc8255ec42afee97f9e6f0145c734bbe104aac28300214593eb326f1d/charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8", size = 192892 }, - { url = "https://files.pythonhosted.org/packages/2e/7d/2259318c202f3d17f3fe6438149b3b9e706d1070fe3fcbb28049730bb25c/charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b", size = 122213 }, - { url = "https://files.pythonhosted.org/packages/3a/52/9f9d17c3b54dc238de384c4cb5a2ef0e27985b42a0e5cc8e8a31d918d48d/charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6", size = 119404 }, - { url = "https://files.pythonhosted.org/packages/99/b0/9c365f6d79a9f0f3c379ddb40a256a67aa69c59609608fe7feb6235896e1/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a", size = 137275 }, - { url = "https://files.pythonhosted.org/packages/91/33/749df346e93d7a30cdcb90cbfdd41a06026317bfbfb62cd68307c1a3c543/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389", size = 147518 }, - { url = "https://files.pythonhosted.org/packages/72/1a/641d5c9f59e6af4c7b53da463d07600a695b9824e20849cb6eea8a627761/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa", size = 140182 }, - { url = "https://files.pythonhosted.org/packages/ee/fb/14d30eb4956408ee3ae09ad34299131fb383c47df355ddb428a7331cfa1e/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b", size = 141869 }, - { url = "https://files.pythonhosted.org/packages/df/3e/a06b18788ca2eb6695c9b22325b6fde7dde0f1d1838b1792a0076f58fe9d/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed", size = 144042 }, - { url = "https://files.pythonhosted.org/packages/45/59/3d27019d3b447a88fe7e7d004a1e04be220227760264cc41b405e863891b/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26", size = 138275 }, - { url = "https://files.pythonhosted.org/packages/7b/ef/5eb105530b4da8ae37d506ccfa25057961b7b63d581def6f99165ea89c7e/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d", size = 144819 }, - { url = "https://files.pythonhosted.org/packages/a2/51/e5023f937d7f307c948ed3e5c29c4b7a3e42ed2ee0b8cdf8f3a706089bf0/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068", size = 149415 }, - { url = "https://files.pythonhosted.org/packages/24/9d/2e3ef673dfd5be0154b20363c5cdcc5606f35666544381bee15af3778239/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143", size = 141212 }, - { url = "https://files.pythonhosted.org/packages/5b/ae/ce2c12fcac59cb3860b2e2d76dc405253a4475436b1861d95fe75bdea520/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4", size = 142167 }, - { url = "https://files.pythonhosted.org/packages/ed/3a/a448bf035dce5da359daf9ae8a16b8a39623cc395a2ffb1620aa1bce62b0/charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7", size = 93041 }, - { url = "https://files.pythonhosted.org/packages/b6/7c/8debebb4f90174074b827c63242c23851bdf00a532489fba57fef3416e40/charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001", size = 100397 }, - { url = "https://files.pythonhosted.org/packages/f7/9d/bcf4a449a438ed6f19790eee543a86a740c77508fbc5ddab210ab3ba3a9a/charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4", size = 194198 }, - { url = "https://files.pythonhosted.org/packages/66/fe/c7d3da40a66a6bf2920cce0f436fa1f62ee28aaf92f412f0bf3b84c8ad6c/charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d", size = 122494 }, - { url = "https://files.pythonhosted.org/packages/2a/9d/a6d15bd1e3e2914af5955c8eb15f4071997e7078419328fee93dfd497eb7/charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0", size = 120393 }, - { url = "https://files.pythonhosted.org/packages/3d/85/5b7416b349609d20611a64718bed383b9251b5a601044550f0c8983b8900/charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269", size = 138331 }, - { url = "https://files.pythonhosted.org/packages/79/66/8946baa705c588521afe10b2d7967300e49380ded089a62d38537264aece/charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c", size = 148097 }, - { url = "https://files.pythonhosted.org/packages/44/80/b339237b4ce635b4af1c73742459eee5f97201bd92b2371c53e11958392e/charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519", size = 140711 }, - { url = "https://files.pythonhosted.org/packages/98/69/5d8751b4b670d623aa7a47bef061d69c279e9f922f6705147983aa76c3ce/charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796", size = 142251 }, - { url = "https://files.pythonhosted.org/packages/1f/8d/33c860a7032da5b93382cbe2873261f81467e7b37f4ed91e25fed62fd49b/charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185", size = 144636 }, - { url = "https://files.pythonhosted.org/packages/c2/65/52aaf47b3dd616c11a19b1052ce7fa6321250a7a0b975f48d8c366733b9f/charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c", size = 139514 }, - { url = "https://files.pythonhosted.org/packages/51/fd/0ee5b1c2860bb3c60236d05b6e4ac240cf702b67471138571dad91bcfed8/charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458", size = 145528 }, - { url = "https://files.pythonhosted.org/packages/e1/9c/60729bf15dc82e3aaf5f71e81686e42e50715a1399770bcde1a9e43d09db/charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2", size = 149804 }, - { url = "https://files.pythonhosted.org/packages/53/cd/aa4b8a4d82eeceb872f83237b2d27e43e637cac9ffaef19a1321c3bafb67/charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8", size = 141708 }, - { url = "https://files.pythonhosted.org/packages/54/7f/cad0b328759630814fcf9d804bfabaf47776816ad4ef2e9938b7e1123d04/charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561", size = 142708 }, - { url = "https://files.pythonhosted.org/packages/c1/9d/254a2f1bcb0ce9acad838e94ed05ba71a7cb1e27affaa4d9e1ca3958cdb6/charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f", size = 92830 }, - { url = "https://files.pythonhosted.org/packages/2f/0e/d7303ccae9735ff8ff01e36705ad6233ad2002962e8668a970fc000c5e1b/charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d", size = 100376 }, - { url = "https://files.pythonhosted.org/packages/28/76/e6222113b83e3622caa4bb41032d0b1bf785250607392e1b778aca0b8a7d/charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc", size = 48543 }, +version = "3.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/4f/e1808dc01273379acc506d18f1504eb2d299bd4131743b9fc54d7be4df1e/charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e", size = 106620 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/8b/825cc84cf13a28bfbcba7c416ec22bf85a9584971be15b21dd8300c65b7f/charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6", size = 196363 }, + { url = "https://files.pythonhosted.org/packages/23/81/d7eef6a99e42c77f444fdd7bc894b0ceca6c3a95c51239e74a722039521c/charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b", size = 125639 }, + { url = "https://files.pythonhosted.org/packages/21/67/b4564d81f48042f520c948abac7079356e94b30cb8ffb22e747532cf469d/charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99", size = 120451 }, + { url = "https://files.pythonhosted.org/packages/c2/72/12a7f0943dd71fb5b4e7b55c41327ac0a1663046a868ee4d0d8e9c369b85/charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca", size = 140041 }, + { url = "https://files.pythonhosted.org/packages/67/56/fa28c2c3e31217c4c52158537a2cf5d98a6c1e89d31faf476c89391cd16b/charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d", size = 150333 }, + { url = "https://files.pythonhosted.org/packages/f9/d2/466a9be1f32d89eb1554cf84073a5ed9262047acee1ab39cbaefc19635d2/charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7", size = 142921 }, + { url = "https://files.pythonhosted.org/packages/f8/01/344ec40cf5d85c1da3c1f57566c59e0c9b56bcc5566c08804a95a6cc8257/charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3", size = 144785 }, + { url = "https://files.pythonhosted.org/packages/73/8b/2102692cb6d7e9f03b9a33a710e0164cadfce312872e3efc7cfe22ed26b4/charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907", size = 146631 }, + { url = "https://files.pythonhosted.org/packages/d8/96/cc2c1b5d994119ce9f088a9a0c3ebd489d360a2eb058e2c8049f27092847/charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b", size = 140867 }, + { url = "https://files.pythonhosted.org/packages/c9/27/cde291783715b8ec30a61c810d0120411844bc4c23b50189b81188b273db/charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912", size = 149273 }, + { url = "https://files.pythonhosted.org/packages/3a/a4/8633b0fc1a2d1834d5393dafecce4a1cc56727bfd82b4dc18fc92f0d3cc3/charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95", size = 152437 }, + { url = "https://files.pythonhosted.org/packages/64/ea/69af161062166b5975ccbb0961fd2384853190c70786f288684490913bf5/charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e", size = 150087 }, + { url = "https://files.pythonhosted.org/packages/3b/fd/e60a9d9fd967f4ad5a92810138192f825d77b4fa2a557990fd575a47695b/charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe", size = 145142 }, + { url = "https://files.pythonhosted.org/packages/6d/02/8cb0988a1e49ac9ce2eed1e07b77ff118f2923e9ebd0ede41ba85f2dcb04/charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc", size = 94701 }, + { url = "https://files.pythonhosted.org/packages/d6/20/f1d4670a8a723c46be695dff449d86d6092916f9e99c53051954ee33a1bc/charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749", size = 102191 }, + { url = "https://files.pythonhosted.org/packages/9c/61/73589dcc7a719582bf56aae309b6103d2762b526bffe189d635a7fcfd998/charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c", size = 193339 }, + { url = "https://files.pythonhosted.org/packages/77/d5/8c982d58144de49f59571f940e329ad6e8615e1e82ef84584c5eeb5e1d72/charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944", size = 124366 }, + { url = "https://files.pythonhosted.org/packages/bf/19/411a64f01ee971bed3231111b69eb56f9331a769072de479eae7de52296d/charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee", size = 118874 }, + { url = "https://files.pythonhosted.org/packages/4c/92/97509850f0d00e9f14a46bc751daabd0ad7765cff29cdfb66c68b6dad57f/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c", size = 138243 }, + { url = "https://files.pythonhosted.org/packages/e2/29/d227805bff72ed6d6cb1ce08eec707f7cfbd9868044893617eb331f16295/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6", size = 148676 }, + { url = "https://files.pythonhosted.org/packages/13/bc/87c2c9f2c144bedfa62f894c3007cd4530ba4b5351acb10dc786428a50f0/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea", size = 141289 }, + { url = "https://files.pythonhosted.org/packages/eb/5b/6f10bad0f6461fa272bfbbdf5d0023b5fb9bc6217c92bf068fa5a99820f5/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc", size = 142585 }, + { url = "https://files.pythonhosted.org/packages/3b/a0/a68980ab8a1f45a36d9745d35049c1af57d27255eff8c907e3add84cf68f/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5", size = 144408 }, + { url = "https://files.pythonhosted.org/packages/d7/a1/493919799446464ed0299c8eef3c3fad0daf1c3cd48bff9263c731b0d9e2/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594", size = 139076 }, + { url = "https://files.pythonhosted.org/packages/fb/9d/9c13753a5a6e0db4a0a6edb1cef7aee39859177b64e1a1e748a6e3ba62c2/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c", size = 146874 }, + { url = "https://files.pythonhosted.org/packages/75/d2/0ab54463d3410709c09266dfb416d032a08f97fd7d60e94b8c6ef54ae14b/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365", size = 150871 }, + { url = "https://files.pythonhosted.org/packages/8d/c9/27e41d481557be53d51e60750b85aa40eaf52b841946b3cdeff363105737/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129", size = 148546 }, + { url = "https://files.pythonhosted.org/packages/ee/44/4f62042ca8cdc0cabf87c0fc00ae27cd8b53ab68be3605ba6d071f742ad3/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236", size = 143048 }, + { url = "https://files.pythonhosted.org/packages/01/f8/38842422988b795220eb8038745d27a675ce066e2ada79516c118f291f07/charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99", size = 94389 }, + { url = "https://files.pythonhosted.org/packages/0b/6e/b13bd47fa9023b3699e94abf565b5a2f0b0be6e9ddac9812182596ee62e4/charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27", size = 101752 }, + { url = "https://files.pythonhosted.org/packages/d3/0b/4b7a70987abf9b8196845806198975b6aab4ce016632f817ad758a5aa056/charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6", size = 194445 }, + { url = "https://files.pythonhosted.org/packages/50/89/354cc56cf4dd2449715bc9a0f54f3aef3dc700d2d62d1fa5bbea53b13426/charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf", size = 125275 }, + { url = "https://files.pythonhosted.org/packages/fa/44/b730e2a2580110ced837ac083d8ad222343c96bb6b66e9e4e706e4d0b6df/charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db", size = 119020 }, + { url = "https://files.pythonhosted.org/packages/9d/e4/9263b8240ed9472a2ae7ddc3e516e71ef46617fe40eaa51221ccd4ad9a27/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1", size = 139128 }, + { url = "https://files.pythonhosted.org/packages/6b/e3/9f73e779315a54334240353eaea75854a9a690f3f580e4bd85d977cb2204/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03", size = 149277 }, + { url = "https://files.pythonhosted.org/packages/1a/cf/f1f50c2f295312edb8a548d3fa56a5c923b146cd3f24114d5adb7e7be558/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284", size = 142174 }, + { url = "https://files.pythonhosted.org/packages/16/92/92a76dc2ff3a12e69ba94e7e05168d37d0345fa08c87e1fe24d0c2a42223/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15", size = 143838 }, + { url = "https://files.pythonhosted.org/packages/a4/01/2117ff2b1dfc61695daf2babe4a874bca328489afa85952440b59819e9d7/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8", size = 146149 }, + { url = "https://files.pythonhosted.org/packages/f6/9b/93a332b8d25b347f6839ca0a61b7f0287b0930216994e8bf67a75d050255/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2", size = 140043 }, + { url = "https://files.pythonhosted.org/packages/ab/f6/7ac4a01adcdecbc7a7587767c776d53d369b8b971382b91211489535acf0/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719", size = 148229 }, + { url = "https://files.pythonhosted.org/packages/9d/be/5708ad18161dee7dc6a0f7e6cf3a88ea6279c3e8484844c0590e50e803ef/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631", size = 151556 }, + { url = "https://files.pythonhosted.org/packages/5a/bb/3d8bc22bacb9eb89785e83e6723f9888265f3a0de3b9ce724d66bd49884e/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b", size = 149772 }, + { url = "https://files.pythonhosted.org/packages/f7/fa/d3fc622de05a86f30beea5fc4e9ac46aead4731e73fd9055496732bcc0a4/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565", size = 144800 }, + { url = "https://files.pythonhosted.org/packages/9a/65/bdb9bc496d7d190d725e96816e20e2ae3a6fa42a5cac99c3c3d6ff884118/charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7", size = 94836 }, + { url = "https://files.pythonhosted.org/packages/3e/67/7b72b69d25b89c0b3cea583ee372c43aa24df15f0e0f8d3982c57804984b/charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9", size = 102187 }, + { url = "https://files.pythonhosted.org/packages/f3/89/68a4c86f1a0002810a27f12e9a7b22feb198c59b2f05231349fbce5c06f4/charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114", size = 194617 }, + { url = "https://files.pythonhosted.org/packages/4f/cd/8947fe425e2ab0aa57aceb7807af13a0e4162cd21eee42ef5b053447edf5/charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed", size = 125310 }, + { url = "https://files.pythonhosted.org/packages/5b/f0/b5263e8668a4ee9becc2b451ed909e9c27058337fda5b8c49588183c267a/charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250", size = 119126 }, + { url = "https://files.pythonhosted.org/packages/ff/6e/e445afe4f7fda27a533f3234b627b3e515a1b9429bc981c9a5e2aa5d97b6/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920", size = 139342 }, + { url = "https://files.pythonhosted.org/packages/a1/b2/4af9993b532d93270538ad4926c8e37dc29f2111c36f9c629840c57cd9b3/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64", size = 149383 }, + { url = "https://files.pythonhosted.org/packages/fb/6f/4e78c3b97686b871db9be6f31d64e9264e889f8c9d7ab33c771f847f79b7/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23", size = 142214 }, + { url = "https://files.pythonhosted.org/packages/2b/c9/1c8fe3ce05d30c87eff498592c89015b19fade13df42850aafae09e94f35/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc", size = 144104 }, + { url = "https://files.pythonhosted.org/packages/ee/68/efad5dcb306bf37db7db338338e7bb8ebd8cf38ee5bbd5ceaaaa46f257e6/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d", size = 146255 }, + { url = "https://files.pythonhosted.org/packages/0c/75/1ed813c3ffd200b1f3e71121c95da3f79e6d2a96120163443b3ad1057505/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88", size = 140251 }, + { url = "https://files.pythonhosted.org/packages/7d/0d/6f32255c1979653b448d3c709583557a4d24ff97ac4f3a5be156b2e6a210/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90", size = 148474 }, + { url = "https://files.pythonhosted.org/packages/ac/a0/c1b5298de4670d997101fef95b97ac440e8c8d8b4efa5a4d1ef44af82f0d/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b", size = 151849 }, + { url = "https://files.pythonhosted.org/packages/04/4f/b3961ba0c664989ba63e30595a3ed0875d6790ff26671e2aae2fdc28a399/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d", size = 149781 }, + { url = "https://files.pythonhosted.org/packages/d8/90/6af4cd042066a4adad58ae25648a12c09c879efa4849c705719ba1b23d8c/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482", size = 144970 }, + { url = "https://files.pythonhosted.org/packages/cc/67/e5e7e0cbfefc4ca79025238b43cdf8a2037854195b37d6417f3d0895c4c2/charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67", size = 94973 }, + { url = "https://files.pythonhosted.org/packages/65/97/fc9bbc54ee13d33dc54a7fcf17b26368b18505500fc01e228c27b5222d80/charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b", size = 102308 }, + { url = "https://files.pythonhosted.org/packages/54/2f/28659eee7f5d003e0f5a3b572765bf76d6e0fe6601ab1f1b1dd4cba7e4f1/charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa", size = 196326 }, + { url = "https://files.pythonhosted.org/packages/d1/18/92869d5c0057baa973a3ee2af71573be7b084b3c3d428fe6463ce71167f8/charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a", size = 125614 }, + { url = "https://files.pythonhosted.org/packages/d6/27/327904c5a54a7796bb9f36810ec4173d2df5d88b401d2b95ef53111d214e/charset_normalizer-3.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0", size = 120450 }, + { url = "https://files.pythonhosted.org/packages/a4/23/65af317914a0308495133b2d654cf67b11bbd6ca16637c4e8a38f80a5a69/charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a", size = 140135 }, + { url = "https://files.pythonhosted.org/packages/f2/41/6190102ad521a8aa888519bb014a74251ac4586cde9b38e790901684f9ab/charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242", size = 150413 }, + { url = "https://files.pythonhosted.org/packages/7b/ab/f47b0159a69eab9bd915591106859f49670c75f9a19082505ff16f50efc0/charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b", size = 142992 }, + { url = "https://files.pythonhosted.org/packages/28/89/60f51ad71f63aaaa7e51a2a2ad37919985a341a1d267070f212cdf6c2d22/charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62", size = 144871 }, + { url = "https://files.pythonhosted.org/packages/0c/48/0050550275fea585a6e24460b42465020b53375017d8596c96be57bfabca/charset_normalizer-3.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0", size = 146756 }, + { url = "https://files.pythonhosted.org/packages/dc/b5/47f8ee91455946f745e6c9ddbb0f8f50314d2416dd922b213e7d5551ad09/charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd", size = 141034 }, + { url = "https://files.pythonhosted.org/packages/84/79/5c731059ebab43e80bf61fa51666b9b18167974b82004f18c76378ed31a3/charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be", size = 149434 }, + { url = "https://files.pythonhosted.org/packages/ca/f3/0719cd09fc4dc42066f239cb3c48ced17fc3316afca3e2a30a4756fe49ab/charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d", size = 152443 }, + { url = "https://files.pythonhosted.org/packages/f7/0e/c6357297f1157c8e8227ff337e93fd0a90e498e3d6ab96b2782204ecae48/charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3", size = 150294 }, + { url = "https://files.pythonhosted.org/packages/54/9a/acfa96dc4ea8c928040b15822b59d0863d6e1757fba8bd7de3dc4f761c13/charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742", size = 145314 }, + { url = "https://files.pythonhosted.org/packages/73/1c/b10a63032eaebb8d7bcb8544f12f063f41f5f463778ac61da15d9985e8b6/charset_normalizer-3.4.0-cp39-cp39-win32.whl", hash = "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2", size = 94724 }, + { url = "https://files.pythonhosted.org/packages/c5/77/3a78bf28bfaa0863f9cfef278dbeadf55efe064eafff8c7c424ae3c4c1bf/charset_normalizer-3.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca", size = 102159 }, + { url = "https://files.pythonhosted.org/packages/bf/9b/08c0432272d77b04803958a4598a51e2a4b51c06640af8b8f0f908c18bf2/charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079", size = 49446 }, ] [[package]] @@ -145,7 +158,7 @@ name = "click" version = "8.1.7" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "colorama", marker = "python_full_version >= '3.10' and platform_system == 'Windows'" }, + { name = "colorama", marker = "platform_system == 'Windows'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/96/d3/f04c7bfcf5c1862a2a5b845c6b2b360488cf47af55dfa79c98f6a6bf98b5/click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de", size = 336121 } wheels = [ @@ -163,76 +176,76 @@ wheels = [ [[package]] name = "coverage" -version = "7.6.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f7/08/7e37f82e4d1aead42a7443ff06a1e406aabf7302c4f00a546e4b320b994c/coverage-7.6.1.tar.gz", hash = "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d", size = 798791 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/61/eb7ce5ed62bacf21beca4937a90fe32545c91a3c8a42a30c6616d48fc70d/coverage-7.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16", size = 206690 }, - { url = "https://files.pythonhosted.org/packages/7d/73/041928e434442bd3afde5584bdc3f932fb4562b1597629f537387cec6f3d/coverage-7.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36", size = 207127 }, - { url = "https://files.pythonhosted.org/packages/c7/c8/6ca52b5147828e45ad0242388477fdb90df2c6cbb9a441701a12b3c71bc8/coverage-7.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61c0abb4c85b095a784ef23fdd4aede7a2628478e7baba7c5e3deba61070a02", size = 235654 }, - { url = "https://files.pythonhosted.org/packages/d5/da/9ac2b62557f4340270942011d6efeab9833648380109e897d48ab7c1035d/coverage-7.6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd21f6ae3f08b41004dfb433fa895d858f3f5979e7762d052b12aef444e29afc", size = 233598 }, - { url = "https://files.pythonhosted.org/packages/53/23/9e2c114d0178abc42b6d8d5281f651a8e6519abfa0ef460a00a91f80879d/coverage-7.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f59d57baca39b32db42b83b2a7ba6f47ad9c394ec2076b084c3f029b7afca23", size = 234732 }, - { url = "https://files.pythonhosted.org/packages/0f/7e/a0230756fb133343a52716e8b855045f13342b70e48e8ad41d8a0d60ab98/coverage-7.6.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a1ac0ae2b8bd743b88ed0502544847c3053d7171a3cff9228af618a068ed9c34", size = 233816 }, - { url = "https://files.pythonhosted.org/packages/28/7c/3753c8b40d232b1e5eeaed798c875537cf3cb183fb5041017c1fdb7ec14e/coverage-7.6.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e6a08c0be454c3b3beb105c0596ebdc2371fab6bb90c0c0297f4e58fd7e1012c", size = 232325 }, - { url = "https://files.pythonhosted.org/packages/57/e3/818a2b2af5b7573b4b82cf3e9f137ab158c90ea750a8f053716a32f20f06/coverage-7.6.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f5796e664fe802da4f57a168c85359a8fbf3eab5e55cd4e4569fbacecc903959", size = 233418 }, - { url = "https://files.pythonhosted.org/packages/c8/fb/4532b0b0cefb3f06d201648715e03b0feb822907edab3935112b61b885e2/coverage-7.6.1-cp310-cp310-win32.whl", hash = "sha256:7bb65125fcbef8d989fa1dd0e8a060999497629ca5b0efbca209588a73356232", size = 209343 }, - { url = "https://files.pythonhosted.org/packages/5a/25/af337cc7421eca1c187cc9c315f0a755d48e755d2853715bfe8c418a45fa/coverage-7.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:3115a95daa9bdba70aea750db7b96b37259a81a709223c8448fa97727d546fe0", size = 210136 }, - { url = "https://files.pythonhosted.org/packages/ad/5f/67af7d60d7e8ce61a4e2ddcd1bd5fb787180c8d0ae0fbd073f903b3dd95d/coverage-7.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7dea0889685db8550f839fa202744652e87c60015029ce3f60e006f8c4462c93", size = 206796 }, - { url = "https://files.pythonhosted.org/packages/e1/0e/e52332389e057daa2e03be1fbfef25bb4d626b37d12ed42ae6281d0a274c/coverage-7.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed37bd3c3b063412f7620464a9ac1314d33100329f39799255fb8d3027da50d3", size = 207244 }, - { url = "https://files.pythonhosted.org/packages/aa/cd/766b45fb6e090f20f8927d9c7cb34237d41c73a939358bc881883fd3a40d/coverage-7.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d85f5e9a5f8b73e2350097c3756ef7e785f55bd71205defa0bfdaf96c31616ff", size = 239279 }, - { url = "https://files.pythonhosted.org/packages/70/6c/a9ccd6fe50ddaf13442a1e2dd519ca805cbe0f1fcd377fba6d8339b98ccb/coverage-7.6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bc572be474cafb617672c43fe989d6e48d3c83af02ce8de73fff1c6bb3c198d", size = 236859 }, - { url = "https://files.pythonhosted.org/packages/14/6f/8351b465febb4dbc1ca9929505202db909c5a635c6fdf33e089bbc3d7d85/coverage-7.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6", size = 238549 }, - { url = "https://files.pythonhosted.org/packages/68/3c/289b81fa18ad72138e6d78c4c11a82b5378a312c0e467e2f6b495c260907/coverage-7.6.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1f4aa8219db826ce6be7099d559f8ec311549bfc4046f7f9fe9b5cea5c581c56", size = 237477 }, - { url = "https://files.pythonhosted.org/packages/ed/1c/aa1efa6459d822bd72c4abc0b9418cf268de3f60eeccd65dc4988553bd8d/coverage-7.6.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:fc5a77d0c516700ebad189b587de289a20a78324bc54baee03dd486f0855d234", size = 236134 }, - { url = "https://files.pythonhosted.org/packages/fb/c8/521c698f2d2796565fe9c789c2ee1ccdae610b3aa20b9b2ef980cc253640/coverage-7.6.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b48f312cca9621272ae49008c7f613337c53fadca647d6384cc129d2996d1133", size = 236910 }, - { url = "https://files.pythonhosted.org/packages/7d/30/033e663399ff17dca90d793ee8a2ea2890e7fdf085da58d82468b4220bf7/coverage-7.6.1-cp311-cp311-win32.whl", hash = "sha256:1125ca0e5fd475cbbba3bb67ae20bd2c23a98fac4e32412883f9bcbaa81c314c", size = 209348 }, - { url = "https://files.pythonhosted.org/packages/20/05/0d1ccbb52727ccdadaa3ff37e4d2dc1cd4d47f0c3df9eb58d9ec8508ca88/coverage-7.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:8ae539519c4c040c5ffd0632784e21b2f03fc1340752af711f33e5be83a9d6c6", size = 210230 }, - { url = "https://files.pythonhosted.org/packages/7e/d4/300fc921dff243cd518c7db3a4c614b7e4b2431b0d1145c1e274fd99bd70/coverage-7.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778", size = 206983 }, - { url = "https://files.pythonhosted.org/packages/e1/ab/6bf00de5327ecb8db205f9ae596885417a31535eeda6e7b99463108782e1/coverage-7.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391", size = 207221 }, - { url = "https://files.pythonhosted.org/packages/92/8f/2ead05e735022d1a7f3a0a683ac7f737de14850395a826192f0288703472/coverage-7.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8", size = 240342 }, - { url = "https://files.pythonhosted.org/packages/0f/ef/94043e478201ffa85b8ae2d2c79b4081e5a1b73438aafafccf3e9bafb6b5/coverage-7.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d", size = 237371 }, - { url = "https://files.pythonhosted.org/packages/1f/0f/c890339dd605f3ebc269543247bdd43b703cce6825b5ed42ff5f2d6122c7/coverage-7.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca", size = 239455 }, - { url = "https://files.pythonhosted.org/packages/d1/04/7fd7b39ec7372a04efb0f70c70e35857a99b6a9188b5205efb4c77d6a57a/coverage-7.6.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163", size = 238924 }, - { url = "https://files.pythonhosted.org/packages/ed/bf/73ce346a9d32a09cf369f14d2a06651329c984e106f5992c89579d25b27e/coverage-7.6.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a", size = 237252 }, - { url = "https://files.pythonhosted.org/packages/86/74/1dc7a20969725e917b1e07fe71a955eb34bc606b938316bcc799f228374b/coverage-7.6.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d", size = 238897 }, - { url = "https://files.pythonhosted.org/packages/b6/e9/d9cc3deceb361c491b81005c668578b0dfa51eed02cd081620e9a62f24ec/coverage-7.6.1-cp312-cp312-win32.whl", hash = "sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5", size = 209606 }, - { url = "https://files.pythonhosted.org/packages/47/c8/5a2e41922ea6740f77d555c4d47544acd7dc3f251fe14199c09c0f5958d3/coverage-7.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb", size = 210373 }, - { url = "https://files.pythonhosted.org/packages/8c/f9/9aa4dfb751cb01c949c990d136a0f92027fbcc5781c6e921df1cb1563f20/coverage-7.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106", size = 207007 }, - { url = "https://files.pythonhosted.org/packages/b9/67/e1413d5a8591622a46dd04ff80873b04c849268831ed5c304c16433e7e30/coverage-7.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9", size = 207269 }, - { url = "https://files.pythonhosted.org/packages/14/5b/9dec847b305e44a5634d0fb8498d135ab1d88330482b74065fcec0622224/coverage-7.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c", size = 239886 }, - { url = "https://files.pythonhosted.org/packages/7b/b7/35760a67c168e29f454928f51f970342d23cf75a2bb0323e0f07334c85f3/coverage-7.6.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a", size = 237037 }, - { url = "https://files.pythonhosted.org/packages/f7/95/d2fd31f1d638df806cae59d7daea5abf2b15b5234016a5ebb502c2f3f7ee/coverage-7.6.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060", size = 239038 }, - { url = "https://files.pythonhosted.org/packages/6e/bd/110689ff5752b67924efd5e2aedf5190cbbe245fc81b8dec1abaffba619d/coverage-7.6.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862", size = 238690 }, - { url = "https://files.pythonhosted.org/packages/d3/a8/08d7b38e6ff8df52331c83130d0ab92d9c9a8b5462f9e99c9f051a4ae206/coverage-7.6.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388", size = 236765 }, - { url = "https://files.pythonhosted.org/packages/d6/6a/9cf96839d3147d55ae713eb2d877f4d777e7dc5ba2bce227167d0118dfe8/coverage-7.6.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155", size = 238611 }, - { url = "https://files.pythonhosted.org/packages/74/e4/7ff20d6a0b59eeaab40b3140a71e38cf52547ba21dbcf1d79c5a32bba61b/coverage-7.6.1-cp313-cp313-win32.whl", hash = "sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a", size = 209671 }, - { url = "https://files.pythonhosted.org/packages/35/59/1812f08a85b57c9fdb6d0b383d779e47b6f643bc278ed682859512517e83/coverage-7.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129", size = 210368 }, - { url = "https://files.pythonhosted.org/packages/9c/15/08913be1c59d7562a3e39fce20661a98c0a3f59d5754312899acc6cb8a2d/coverage-7.6.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e", size = 207758 }, - { url = "https://files.pythonhosted.org/packages/c4/ae/b5d58dff26cade02ada6ca612a76447acd69dccdbb3a478e9e088eb3d4b9/coverage-7.6.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962", size = 208035 }, - { url = "https://files.pythonhosted.org/packages/b8/d7/62095e355ec0613b08dfb19206ce3033a0eedb6f4a67af5ed267a8800642/coverage-7.6.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb", size = 250839 }, - { url = "https://files.pythonhosted.org/packages/7c/1e/c2967cb7991b112ba3766df0d9c21de46b476d103e32bb401b1b2adf3380/coverage-7.6.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704", size = 246569 }, - { url = "https://files.pythonhosted.org/packages/8b/61/a7a6a55dd266007ed3b1df7a3386a0d760d014542d72f7c2c6938483b7bd/coverage-7.6.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b", size = 248927 }, - { url = "https://files.pythonhosted.org/packages/c8/fa/13a6f56d72b429f56ef612eb3bc5ce1b75b7ee12864b3bd12526ab794847/coverage-7.6.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f", size = 248401 }, - { url = "https://files.pythonhosted.org/packages/75/06/0429c652aa0fb761fc60e8c6b291338c9173c6aa0f4e40e1902345b42830/coverage-7.6.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223", size = 246301 }, - { url = "https://files.pythonhosted.org/packages/52/76/1766bb8b803a88f93c3a2d07e30ffa359467810e5cbc68e375ebe6906efb/coverage-7.6.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3", size = 247598 }, - { url = "https://files.pythonhosted.org/packages/66/8b/f54f8db2ae17188be9566e8166ac6df105c1c611e25da755738025708d54/coverage-7.6.1-cp313-cp313t-win32.whl", hash = "sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f", size = 210307 }, - { url = "https://files.pythonhosted.org/packages/9f/b0/e0dca6da9170aefc07515cce067b97178cefafb512d00a87a1c717d2efd5/coverage-7.6.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657", size = 211453 }, - { url = "https://files.pythonhosted.org/packages/19/d3/d54c5aa83268779d54c86deb39c1c4566e5d45c155369ca152765f8db413/coverage-7.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:abd5fd0db5f4dc9289408aaf34908072f805ff7792632250dcb36dc591d24255", size = 206688 }, - { url = "https://files.pythonhosted.org/packages/a5/fe/137d5dca72e4a258b1bc17bb04f2e0196898fe495843402ce826a7419fe3/coverage-7.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:547f45fa1a93154bd82050a7f3cddbc1a7a4dd2a9bf5cb7d06f4ae29fe94eaf8", size = 207120 }, - { url = "https://files.pythonhosted.org/packages/78/5b/a0a796983f3201ff5485323b225d7c8b74ce30c11f456017e23d8e8d1945/coverage-7.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:645786266c8f18a931b65bfcefdbf6952dd0dea98feee39bd188607a9d307ed2", size = 235249 }, - { url = "https://files.pythonhosted.org/packages/4e/e1/76089d6a5ef9d68f018f65411fcdaaeb0141b504587b901d74e8587606ad/coverage-7.6.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e0b2df163b8ed01d515807af24f63de04bebcecbd6c3bfeff88385789fdf75a", size = 233237 }, - { url = "https://files.pythonhosted.org/packages/9a/6f/eef79b779a540326fee9520e5542a8b428cc3bfa8b7c8f1022c1ee4fc66c/coverage-7.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:609b06f178fe8e9f89ef676532760ec0b4deea15e9969bf754b37f7c40326dbc", size = 234311 }, - { url = "https://files.pythonhosted.org/packages/75/e1/656d65fb126c29a494ef964005702b012f3498db1a30dd562958e85a4049/coverage-7.6.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:702855feff378050ae4f741045e19a32d57d19f3e0676d589df0575008ea5004", size = 233453 }, - { url = "https://files.pythonhosted.org/packages/68/6a/45f108f137941a4a1238c85f28fd9d048cc46b5466d6b8dda3aba1bb9d4f/coverage-7.6.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2bdb062ea438f22d99cba0d7829c2ef0af1d768d1e4a4f528087224c90b132cb", size = 231958 }, - { url = "https://files.pythonhosted.org/packages/9b/e7/47b809099168b8b8c72ae311efc3e88c8d8a1162b3ba4b8da3cfcdb85743/coverage-7.6.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9c56863d44bd1c4fe2abb8a4d6f5371d197f1ac0ebdee542f07f35895fc07f36", size = 232938 }, - { url = "https://files.pythonhosted.org/packages/52/80/052222ba7058071f905435bad0ba392cc12006380731c37afaf3fe749b88/coverage-7.6.1-cp39-cp39-win32.whl", hash = "sha256:6e2cd258d7d927d09493c8df1ce9174ad01b381d4729a9d8d4e38670ca24774c", size = 209352 }, - { url = "https://files.pythonhosted.org/packages/b8/d8/1b92e0b3adcf384e98770a00ca095da1b5f7b483e6563ae4eb5e935d24a1/coverage-7.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:06a737c882bd26d0d6ee7269b20b12f14a8704807a01056c80bb881a4b2ce6ca", size = 210153 }, - { url = "https://files.pythonhosted.org/packages/a5/2b/0354ed096bca64dc8e32a7cbcae28b34cb5ad0b1fe2125d6d99583313ac0/coverage-7.6.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:e9a6e0eb86070e8ccaedfbd9d38fec54864f3125ab95419970575b42af7541df", size = 198926 }, +version = "7.6.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/12/50/51ec496dd2ad84ca3e5f67de23f6de630be923dd6f5aed31bb60eda540e5/coverage-7.6.3.tar.gz", hash = "sha256:bb7d5fe92bd0dc235f63ebe9f8c6e0884f7360f88f3411bfed1350c872ef2054", size = 798337 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d3/c9/d0bb2e5720ea2182d8c22e15a74a4a0b5e8cfda2773dc8c524ff75a3f392/coverage-7.6.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6da42bbcec130b188169107ecb6ee7bd7b4c849d24c9370a0c884cf728d8e976", size = 206590 }, + { url = "https://files.pythonhosted.org/packages/00/b1/cd2e55ed5e88f157b97be34c5a0689668f2a1126eb59e9f17f37d507b275/coverage-7.6.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c222958f59b0ae091f4535851cbb24eb57fc0baea07ba675af718fb5302dddb2", size = 207022 }, + { url = "https://files.pythonhosted.org/packages/86/3b/f3bf339f2e1a30e81685bb2f90d7e4b3b50e102162ca83524e1f8ab0a6a9/coverage-7.6.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab84a8b698ad5a6c365b08061920138e7a7dd9a04b6feb09ba1bfae68346ce6d", size = 235464 }, + { url = "https://files.pythonhosted.org/packages/37/d0/ede5afa443e324d0dc19f1b9a1f9ec836cd2755d1735104ef6e8ab65dd8f/coverage-7.6.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70a6756ce66cd6fe8486c775b30889f0dc4cb20c157aa8c35b45fd7868255c5c", size = 233367 }, + { url = "https://files.pythonhosted.org/packages/97/9b/84dde4f3307227cc69ed579ba49efc3f38cbe608793a93e163be801eb72c/coverage-7.6.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c2e6fa98032fec8282f6b27e3f3986c6e05702828380618776ad794e938f53a", size = 234528 }, + { url = "https://files.pythonhosted.org/packages/b8/0c/b3a330b57d8ce70b08e383005f948ad78397f569edb75cd9b9e7f3d29932/coverage-7.6.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:921fbe13492caf6a69528f09d5d7c7d518c8d0e7b9f6701b7719715f29a71e6e", size = 233624 }, + { url = "https://files.pythonhosted.org/packages/72/b5/c068657f338cb26dfa0c8c4cec210e56c416d3f5a1d124ebc6dc5c1c5c54/coverage-7.6.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:6d99198203f0b9cb0b5d1c0393859555bc26b548223a769baf7e321a627ed4fc", size = 232085 }, + { url = "https://files.pythonhosted.org/packages/50/c9/a96b5c1865a5a84380bd8f74a27e9972c9f2f5b17c854662242e473c6afd/coverage-7.6.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:87cd2e29067ea397a47e352efb13f976eb1b03e18c999270bb50589323294c6e", size = 233218 }, + { url = "https://files.pythonhosted.org/packages/9f/bb/c05f8597095e713c73d2b9c142a914ee6bfea096afcbb37923a0d956c9b2/coverage-7.6.3-cp310-cp310-win32.whl", hash = "sha256:a3328c3e64ea4ab12b85999eb0779e6139295bbf5485f69d42cf794309e3d007", size = 209313 }, + { url = "https://files.pythonhosted.org/packages/40/ae/b0f027a7ea045e2c88f520a15ef73371cdf8ab544a109f7b8a9338d01e7d/coverage-7.6.3-cp310-cp310-win_amd64.whl", hash = "sha256:bca4c8abc50d38f9773c1ec80d43f3768df2e8576807d1656016b9d3eeaa96fd", size = 210124 }, + { url = "https://files.pythonhosted.org/packages/0f/77/8e5c0c6027ce0d06d0cb9569d372fb94247b5a49a7ef8bba288956696dcb/coverage-7.6.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c51ef82302386d686feea1c44dbeef744585da16fcf97deea2a8d6c1556f519b", size = 206698 }, + { url = "https://files.pythonhosted.org/packages/af/ca/0fe701e0bf0ba3062466ceeccb9857caa492886375bbf6eabeab118a4dd0/coverage-7.6.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0ca37993206402c6c35dc717f90d4c8f53568a8b80f0bf1a1b2b334f4d488fba", size = 207147 }, + { url = "https://files.pythonhosted.org/packages/78/4c/2705183ff384b1612170b70fb716dcd24941f9c71b02860f6bbdf7f2f780/coverage-7.6.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c77326300b839c44c3e5a8fe26c15b7e87b2f32dfd2fc9fee1d13604347c9b38", size = 239085 }, + { url = "https://files.pythonhosted.org/packages/1e/00/ada23862b99bf25218a74a116011982e20d1d4740fe4ad009c08f1090a5b/coverage-7.6.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e484e479860e00da1f005cd19d1c5d4a813324e5951319ac3f3eefb497cc549", size = 236492 }, + { url = "https://files.pythonhosted.org/packages/09/ec/c3c4dd9cdcd97f127141dfa348c737912d32130e6129e61645736106c341/coverage-7.6.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c6c0f4d53ef603397fc894a895b960ecd7d44c727df42a8d500031716d4e8d2", size = 238356 }, + { url = "https://files.pythonhosted.org/packages/f4/c3/5f4e50d1ecb0cfab9f8b988df65d2ae800299bc0e4bda8f508e06717fa49/coverage-7.6.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:37be7b5ea3ff5b7c4a9db16074dc94523b5f10dd1f3b362a827af66a55198175", size = 237281 }, + { url = "https://files.pythonhosted.org/packages/0d/ef/8650eea57f9a602ef7ddaa846f1aa760704cb6032c23d10b051b304ed4a3/coverage-7.6.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:43b32a06c47539fe275106b376658638b418c7cfdfff0e0259fbf877e845f14b", size = 235918 }, + { url = "https://files.pythonhosted.org/packages/76/f5/9e5b4cda520e07ff0e2bb61f6176cd9bf1a2a77c2f89caf8005ae9eba1d3/coverage-7.6.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ee77c7bef0724165e795b6b7bf9c4c22a9b8468a6bdb9c6b4281293c6b22a90f", size = 236692 }, + { url = "https://files.pythonhosted.org/packages/af/ad/b62d2f0367b5eba16aa950c9a4e691aaa59b153ba0d038ad15bd92b67ce2/coverage-7.6.3-cp311-cp311-win32.whl", hash = "sha256:43517e1f6b19f610a93d8227e47790722c8bf7422e46b365e0469fc3d3563d97", size = 209285 }, + { url = "https://files.pythonhosted.org/packages/87/66/2fc70e76d542e003da9c0321470f900c7021464f0617c5166b47c8493ca3/coverage-7.6.3-cp311-cp311-win_amd64.whl", hash = "sha256:04f2189716e85ec9192df307f7c255f90e78b6e9863a03223c3b998d24a3c6c6", size = 210117 }, + { url = "https://files.pythonhosted.org/packages/11/3d/b88ca9d63404ed1d2942236757d876c5fb30ab300fc6e68d6e1e8928dc34/coverage-7.6.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:27bd5f18d8f2879e45724b0ce74f61811639a846ff0e5c0395b7818fae87aec6", size = 206890 }, + { url = "https://files.pythonhosted.org/packages/90/d1/11307a6f28dc496ff8ee17258e20ecca1c48b537113146a114aa4e29d4e7/coverage-7.6.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d546cfa78844b8b9c1c0533de1851569a13f87449897bbc95d698d1d3cb2a30f", size = 207132 }, + { url = "https://files.pythonhosted.org/packages/61/5d/be9f27811e767b8bd8b5836c5f05708263cc1f2c24d8244f36a5f7baee75/coverage-7.6.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9975442f2e7a5cfcf87299c26b5a45266ab0696348420049b9b94b2ad3d40234", size = 240146 }, + { url = "https://files.pythonhosted.org/packages/37/0f/0b61bfa7aada98936cc433c8bd2e9f90c3fdc02607bdade04ffa1b8f83ba/coverage-7.6.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:583049c63106c0555e3ae3931edab5669668bbef84c15861421b94e121878d3f", size = 237177 }, + { url = "https://files.pythonhosted.org/packages/d3/d4/83dfe1cdabf7f574217ce431c8506c80c6afa5c4056b1159282ba54bb6f2/coverage-7.6.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2341a78ae3a5ed454d524206a3fcb3cec408c2a0c7c2752cd78b606a2ff15af4", size = 239248 }, + { url = "https://files.pythonhosted.org/packages/05/0a/f53ab3bf80bcf6a17bece8851d4687cf7e424505cf4ce7a3c4cb41b52d96/coverage-7.6.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a4fb91d5f72b7e06a14ff4ae5be625a81cd7e5f869d7a54578fc271d08d58ae3", size = 238737 }, + { url = "https://files.pythonhosted.org/packages/f7/81/74d797dbedf62b3d7f66af3277b7fc6be6430ed45df701e1ae1197ceb70d/coverage-7.6.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e279f3db904e3b55f520f11f983cc8dc8a4ce9b65f11692d4718ed021ec58b83", size = 237039 }, + { url = "https://files.pythonhosted.org/packages/ae/71/1750be153f73eb0e8b9a0f08c8cdb90f6a7c2a25b1795d35e313dd2d78f5/coverage-7.6.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:aa23ce39661a3e90eea5f99ec59b763b7d655c2cada10729ed920a38bfc2b167", size = 238703 }, + { url = "https://files.pythonhosted.org/packages/f6/2e/a60711bb0adcc849c61d9db9574f5d10419cfc73c43cee26a7de6c92f2e4/coverage-7.6.3-cp312-cp312-win32.whl", hash = "sha256:52ac29cc72ee7e25ace7807249638f94c9b6a862c56b1df015d2b2e388e51dbd", size = 209521 }, + { url = "https://files.pythonhosted.org/packages/d9/26/67a744fcc5de4433a1ebae2b227c66f744fb0d17ad4725b47cf24f7a4c2f/coverage-7.6.3-cp312-cp312-win_amd64.whl", hash = "sha256:40e8b1983080439d4802d80b951f4a93d991ef3261f69e81095a66f86cf3c3c6", size = 210304 }, + { url = "https://files.pythonhosted.org/packages/8c/8f/265a5f18ab2cb1cae3cf6d64e8fd2708ac66a57b7068963077456ec85294/coverage-7.6.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9134032f5aa445ae591c2ba6991d10136a1f533b1d2fa8f8c21126468c5025c6", size = 206919 }, + { url = "https://files.pythonhosted.org/packages/d0/d8/59b41c21237da09c2c09cfd594883f43e3f437d9d602afe09a23d8c3b768/coverage-7.6.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:99670790f21a96665a35849990b1df447993880bb6463a0a1d757897f30da929", size = 207175 }, + { url = "https://files.pythonhosted.org/packages/19/e8/9a18a78779e5c9d51c8c60de4e9e06c91a03f529fa5b31993b85f364a114/coverage-7.6.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dc7d6b380ca76f5e817ac9eef0c3686e7834c8346bef30b041a4ad286449990", size = 239695 }, + { url = "https://files.pythonhosted.org/packages/23/d5/6100bb2b104365634068aad82ec332663a32c7572f4bbe24825e79ecb712/coverage-7.6.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f7b26757b22faf88fcf232f5f0e62f6e0fd9e22a8a5d0d5016888cdfe1f6c1c4", size = 236840 }, + { url = "https://files.pythonhosted.org/packages/d8/11/7e5ac48885f4fed8edb4624425b60405c96c5cf92c2260305eeb6d179897/coverage-7.6.3-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c59d6a4a4633fad297f943c03d0d2569867bd5372eb5684befdff8df8522e39", size = 238829 }, + { url = "https://files.pythonhosted.org/packages/31/6c/4943c562bc8f541dbc466181c615743fe7987433b9ac00301b4f2c8bce60/coverage-7.6.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f263b18692f8ed52c8de7f40a0751e79015983dbd77b16906e5b310a39d3ca21", size = 238495 }, + { url = "https://files.pythonhosted.org/packages/b2/21/ff415e195eafc86ad6e3e6bdb04e6ebd2caa432d27ec261c0a6d849a171e/coverage-7.6.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:79644f68a6ff23b251cae1c82b01a0b51bc40c8468ca9585c6c4b1aeee570e0b", size = 236578 }, + { url = "https://files.pythonhosted.org/packages/28/81/08c1c7d2ecc14036b6fb71433ce51fb0942b39ef2bbb654fda82e4e16004/coverage-7.6.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:71967c35828c9ff94e8c7d405469a1fb68257f686bca7c1ed85ed34e7c2529c4", size = 238418 }, + { url = "https://files.pythonhosted.org/packages/c6/50/912a47a6fa3582c6694e0acdb4c5cf1264950a400a3a9d35a5552e7a91cd/coverage-7.6.3-cp313-cp313-win32.whl", hash = "sha256:e266af4da2c1a4cbc6135a570c64577fd3e6eb204607eaff99d8e9b710003c6f", size = 209584 }, + { url = "https://files.pythonhosted.org/packages/49/cb/44402ef105d8a77849fa019b975c9e35b184498ec7a6070c30deaad47fab/coverage-7.6.3-cp313-cp313-win_amd64.whl", hash = "sha256:ea52bd218d4ba260399a8ae4bb6b577d82adfc4518b93566ce1fddd4a49d1dce", size = 210316 }, + { url = "https://files.pythonhosted.org/packages/f6/c4/1e9b42abe9d381585d6f9384bbfbfce464234261e3e331ab98eeef3fc11a/coverage-7.6.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8d4c6ea0f498c7c79111033a290d060c517853a7bcb2f46516f591dab628ddd3", size = 207664 }, + { url = "https://files.pythonhosted.org/packages/29/74/62605f094604b85c98962fe29134e8f9df200106b5100a2db236f5c03993/coverage-7.6.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:331b200ad03dbaa44151d74daeb7da2cf382db424ab923574f6ecca7d3b30de3", size = 207936 }, + { url = "https://files.pythonhosted.org/packages/ff/8c/bbeadb2f3236fdd62c6c267096c2524af9a59ee0a124b6b237a943d274e8/coverage-7.6.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54356a76b67cf8a3085818026bb556545ebb8353951923b88292556dfa9f812d", size = 250658 }, + { url = "https://files.pythonhosted.org/packages/3a/a0/46fe77ef9d133867bf639ee68ebbcae86aa340d9e46900fbdf566557c9bf/coverage-7.6.3-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ebec65f5068e7df2d49466aab9128510c4867e532e07cb6960075b27658dca38", size = 246370 }, + { url = "https://files.pythonhosted.org/packages/9c/ba/b5722bec74017eaa1c5d35377f40a2a434e6c864cf3f1b46cddb62657642/coverage-7.6.3-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d33a785ea8354c480515e781554d3be582a86297e41ccbea627a5c632647f2cd", size = 248732 }, + { url = "https://files.pythonhosted.org/packages/a1/d1/1264cc9ad5079439f438fd49080cbb57a8c6c589919872eaacdbc30d3b1a/coverage-7.6.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:f7ddb920106bbbbcaf2a274d56f46956bf56ecbde210d88061824a95bdd94e92", size = 248221 }, + { url = "https://files.pythonhosted.org/packages/9d/b5/eacd2cfcb3406725e98bc6b9f1ac6794188b8231148f71281ffdcf5968e0/coverage-7.6.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:70d24936ca6c15a3bbc91ee9c7fc661132c6f4c9d42a23b31b6686c05073bde5", size = 246109 }, + { url = "https://files.pythonhosted.org/packages/56/71/0f0a713bf452ae3e6dd126841a25a0bd3a75105f2666c32ad1fb28b791da/coverage-7.6.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c30e42ea11badb147f0d2e387115b15e2bd8205a5ad70d6ad79cf37f6ac08c91", size = 247391 }, + { url = "https://files.pythonhosted.org/packages/ad/dd/29fb9c6b94a52da04613e5005d0a8875e57ca76b570d2625964fd92d7fab/coverage-7.6.3-cp313-cp313t-win32.whl", hash = "sha256:365defc257c687ce3e7d275f39738dcd230777424117a6c76043459db131dd43", size = 210230 }, + { url = "https://files.pythonhosted.org/packages/61/17/efb9ca2a5f9ccf8af267ff2c02ad976a2dc29f9b3c63209e2a89588d7f95/coverage-7.6.3-cp313-cp313t-win_amd64.whl", hash = "sha256:23bb63ae3f4c645d2d82fa22697364b0046fbafb6261b258a58587441c5f7bd0", size = 211380 }, + { url = "https://files.pythonhosted.org/packages/44/cf/ec610fdae6cacd6be3cc5ddf66207b4a6770eb3e9b5b4902bd34356c4da3/coverage-7.6.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:da29ceabe3025a1e5a5aeeb331c5b1af686daab4ff0fb4f83df18b1180ea83e2", size = 206588 }, + { url = "https://files.pythonhosted.org/packages/05/af/819d441400d71fee044940e55ea098bb12a8d662965d12eaadd32911799b/coverage-7.6.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:df8c05a0f574d480947cba11b947dc41b1265d721c3777881da2fb8d3a1ddfba", size = 207022 }, + { url = "https://files.pythonhosted.org/packages/1a/55/2dad75d1869278c4fc07d644fca77462e724bbc24888f425c2399dbe3805/coverage-7.6.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec1e3b40b82236d100d259854840555469fad4db64f669ab817279eb95cd535c", size = 235060 }, + { url = "https://files.pythonhosted.org/packages/38/d3/36e07e96cadb8c6c68226dfee8643e518483951885e61f565d15cd2882fa/coverage-7.6.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b4adeb878a374126f1e5cf03b87f66279f479e01af0e9a654cf6d1509af46c40", size = 232979 }, + { url = "https://files.pythonhosted.org/packages/a0/5b/8a4029ab21352e397dbfe5515699f9f7f0018f0838f4ecbb84b848a0df99/coverage-7.6.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43d6a66e33b1455b98fc7312b124296dad97a2e191c80320587234a77b1b736e", size = 234112 }, + { url = "https://files.pythonhosted.org/packages/83/81/2238abf2467435bb6200f6347e9fe190747f9821b27c9433f0b978d5d030/coverage-7.6.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1990b1f4e2c402beb317840030bb9f1b6a363f86e14e21b4212e618acdfce7f6", size = 233266 }, + { url = "https://files.pythonhosted.org/packages/42/07/a5d8e24d89458784eee903800983ff34fb54fcdaf4cdec05b98f3a9aec30/coverage-7.6.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:12f9515d875859faedb4144fd38694a761cd2a61ef9603bf887b13956d0bbfbb", size = 231740 }, + { url = "https://files.pythonhosted.org/packages/c8/39/f44344dd77c535f3264a6e6e95bef4e0bd53366e1eb82ce6980a17f1b0c4/coverage-7.6.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:99ded130555c021d99729fabd4ddb91a6f4cc0707df4b1daf912c7850c373b13", size = 232738 }, + { url = "https://files.pythonhosted.org/packages/67/a5/b8ff75aba81839c7a85f764f15214076b9e24655e196a63bc5e2053fa040/coverage-7.6.3-cp39-cp39-win32.whl", hash = "sha256:c3a79f56dee9136084cf84a6c7c4341427ef36e05ae6415bf7d787c96ff5eaa3", size = 209313 }, + { url = "https://files.pythonhosted.org/packages/1d/c0/4346b0a287b72c917ca9cbc7230d73035082ab2b5692830929967917035e/coverage-7.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:aac7501ae73d4a02f4b7ac8fcb9dc55342ca98ffb9ed9f2dfb8a25d53eda0e4d", size = 210091 }, + { url = "https://files.pythonhosted.org/packages/29/f7/80e7a36288785bf0a44f6fa2a778dae85d34d8761f4c0996066f3756bdf5/coverage-7.6.3-pp39.pp310-none-any.whl", hash = "sha256:b9853509b4bf57ba7b1f99b9d866c422c9c5248799ab20e652bbb8a184a38181", size = 198831 }, ] [package.optional-dependencies] toml = [ - { name = "tomli", marker = "python_full_version >= '3.10' and python_full_version <= '3.11'" }, + { name = "tomli", marker = "python_full_version <= '3.11'" }, ] [[package]] @@ -246,11 +259,11 @@ wheels = [ [[package]] name = "distlib" -version = "0.3.8" +version = "0.3.9" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c4/91/e2df406fb4efacdf46871c25cde65d3c6ee5e173b7e5a4547a47bae91920/distlib-0.3.8.tar.gz", hash = "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64", size = 609931 } +sdist = { url = "https://files.pythonhosted.org/packages/0d/dd/1bec4c5ddb504ca60fc29472f3d27e8d4da1257a854e1d96742f15c1d02d/distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403", size = 613923 } wheels = [ - { url = "https://files.pythonhosted.org/packages/8e/41/9307e4f5f9976bc8b7fea0b66367734e8faf3ec84bc0d412d8cfabbb66cd/distlib-0.3.8-py2.py3-none-any.whl", hash = "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784", size = 468850 }, + { url = "https://files.pythonhosted.org/packages/91/a1/cf2472db20f7ce4a6be1253a81cfdf85ad9c7885ffbed7047fb72c24cf87/distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87", size = 468973 }, ] [[package]] @@ -273,56 +286,56 @@ wheels = [ [[package]] name = "filelock" -version = "3.15.4" +version = "3.16.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/08/dd/49e06f09b6645156550fb9aee9cc1e59aba7efbc972d665a1bd6ae0435d4/filelock-3.15.4.tar.gz", hash = "sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb", size = 18007 } +sdist = { url = "https://files.pythonhosted.org/packages/9d/db/3ef5bb276dae18d6ec2124224403d1d67bccdbefc17af4cc8f553e341ab1/filelock-3.16.1.tar.gz", hash = "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435", size = 18037 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ae/f0/48285f0262fe47103a4a45972ed2f9b93e4c80b8fd609fa98da78b2a5706/filelock-3.15.4-py3-none-any.whl", hash = "sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7", size = 16159 }, + { url = "https://files.pythonhosted.org/packages/b9/f8/feced7779d755758a52d1f6635d990b8d98dc0a29fa568bbe0625f18fdf3/filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0", size = 16163 }, ] [[package]] name = "fsspec" -version = "2024.6.1" +version = "2024.9.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/90/b6/eba5024a9889fcfff396db543a34bef0ab9d002278f163129f9f01005960/fsspec-2024.6.1.tar.gz", hash = "sha256:fad7d7e209dd4c1208e3bbfda706620e0da5142bebbd9c384afb95b07e798e49", size = 284584 } +sdist = { url = "https://files.pythonhosted.org/packages/62/7c/12b0943011daaaa9c35c2a2e22e5eb929ac90002f08f1259d69aedad84de/fsspec-2024.9.0.tar.gz", hash = "sha256:4b0afb90c2f21832df142f292649035d80b421f60a9e1c027802e5a0da2b04e8", size = 286206 } wheels = [ - { url = "https://files.pythonhosted.org/packages/5e/44/73bea497ac69bafde2ee4269292fa3b41f1198f4bb7bbaaabde30ad29d4a/fsspec-2024.6.1-py3-none-any.whl", hash = "sha256:3cb443f8bcd2efb31295a5b9fdb02aee81d8452c80d28f97a6d0959e6cee101e", size = 177561 }, + { url = "https://files.pythonhosted.org/packages/1d/a0/6aaea0c2fbea2f89bfd5db25fb1e3481896a423002ebe4e55288907a97a3/fsspec-2024.9.0-py3-none-any.whl", hash = "sha256:a0947d552d8a6efa72cc2c730b12c41d043509156966cca4fb157b0f2a0c574b", size = 179253 }, ] [[package]] name = "huggingface-hub" -version = "0.24.6" +version = "0.26.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "filelock", marker = "python_full_version >= '3.10'" }, - { name = "fsspec", marker = "python_full_version >= '3.10'" }, - { name = "packaging", marker = "python_full_version >= '3.10'" }, - { name = "pyyaml", marker = "python_full_version >= '3.10'" }, - { name = "requests", marker = "python_full_version >= '3.10'" }, - { name = "tqdm", marker = "python_full_version >= '3.10'" }, - { name = "typing-extensions", marker = "python_full_version >= '3.10'" }, + { name = "filelock" }, + { name = "fsspec" }, + { name = "packaging" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "tqdm" }, + { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/65/24/b98fce967b7d63700e5805b915012ba25bb538a81fcf11e97f3cc3f4f012/huggingface_hub-0.24.6.tar.gz", hash = "sha256:cc2579e761d070713eaa9c323e3debe39d5b464ae3a7261c39a9195b27bb8000", size = 349200 } +sdist = { url = "https://files.pythonhosted.org/packages/2e/dd/7269e0bedd685898a17a16375c2e4a5db8b58b17ac241e4f5d739fd261d0/huggingface_hub-0.26.0.tar.gz", hash = "sha256:524fe9281b015b76aa73ff1a83bf1cbe8cab851c9ac5ae5fcd2a25d5173ce629", size = 375459 } wheels = [ - { url = "https://files.pythonhosted.org/packages/b9/8f/d6718641c14d98a5848c6a24d2376028d292074ffade0702940a4b1dde76/huggingface_hub-0.24.6-py3-none-any.whl", hash = "sha256:a990f3232aa985fe749bc9474060cbad75e8b2f115f6665a9fda5b9c97818970", size = 417509 }, + { url = "https://files.pythonhosted.org/packages/85/1f/21e2fb9564b53122105866c26daeb239911b003d1df3867dd113cf5a7694/huggingface_hub-0.26.0-py3-none-any.whl", hash = "sha256:e43b8f36042b2103b48dea822535e08f5f089c4aa7013a067fca7b4ebf7f85a3", size = 447434 }, ] [[package]] name = "identify" -version = "2.6.0" +version = "2.6.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/32/f4/8e8f7db397a7ce20fbdeac5f25adaf567fc362472432938d25556008e03a/identify-2.6.0.tar.gz", hash = "sha256:cb171c685bdc31bcc4c1734698736a7d5b6c8bf2e0c15117f4d469c8640ae5cf", size = 99116 } +sdist = { url = "https://files.pythonhosted.org/packages/29/bb/25024dbcc93516c492b75919e76f389bac754a3e4248682fba32b250c880/identify-2.6.1.tar.gz", hash = "sha256:91478c5fb7c3aac5ff7bf9b4344f803843dc586832d5f110d672b19aa1984c98", size = 99097 } wheels = [ - { url = "https://files.pythonhosted.org/packages/24/6c/a4f39abe7f19600b74528d0c717b52fff0b300bb0161081510d39c53cb00/identify-2.6.0-py2.py3-none-any.whl", hash = "sha256:e79ae4406387a9d300332b5fd366d8994f1525e8414984e1a59e058b2eda2dd0", size = 98962 }, + { url = "https://files.pythonhosted.org/packages/7d/0c/4ef72754c050979fdcc06c744715ae70ea37e734816bb6514f79df77a42f/identify-2.6.1-py2.py3-none-any.whl", hash = "sha256:53863bcac7caf8d2ed85bd20312ea5dcfc22226800f6d6881f232d861db5a8f0", size = 98972 }, ] [[package]] name = "idna" -version = "3.8" +version = "3.10" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e8/ac/e349c5e6d4543326c6883ee9491e3921e0d07b55fdf3cce184b40d63e72a/idna-3.8.tar.gz", hash = "sha256:d838c2c0ed6fced7693d5e8ab8e734d5f8fda53a039c0164afb0b82e771e3603", size = 189467 } +sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 } wheels = [ - { url = "https://files.pythonhosted.org/packages/22/7e/d71db821f177828df9dea8c42ac46473366f191be53080e552e628aad991/idna-3.8-py3-none-any.whl", hash = "sha256:050b4e5baadcd44d760cedbd2b8e639f2ff89bbc7a5730fcc662954303377aac", size = 66894 }, + { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, ] [[package]] @@ -336,24 +349,24 @@ wheels = [ [[package]] name = "ipython" -version = "8.27.0" +version = "8.18.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "colorama", marker = "python_full_version >= '3.10' and sys_platform == 'win32'" }, - { name = "decorator", marker = "python_full_version >= '3.10'" }, - { name = "exceptiongroup", marker = "python_full_version == '3.10.*'" }, - { name = "jedi", marker = "python_full_version >= '3.10'" }, - { name = "matplotlib-inline", marker = "python_full_version >= '3.10'" }, - { name = "pexpect", marker = "python_full_version >= '3.10' and sys_platform != 'emscripten' and sys_platform != 'win32'" }, - { name = "prompt-toolkit", marker = "python_full_version >= '3.10'" }, - { name = "pygments", marker = "python_full_version >= '3.10'" }, - { name = "stack-data", marker = "python_full_version >= '3.10'" }, - { name = "traitlets", marker = "python_full_version >= '3.10'" }, - { name = "typing-extensions", marker = "python_full_version >= '3.10' and python_full_version < '3.12'" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "decorator" }, + { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, + { name = "jedi" }, + { name = "matplotlib-inline" }, + { name = "pexpect", marker = "sys_platform != 'win32'" }, + { name = "prompt-toolkit" }, + { name = "pygments" }, + { name = "stack-data" }, + { name = "traitlets" }, + { name = "typing-extensions", marker = "python_full_version < '3.10'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/57/24/d4fabaca03c8804bf0b8d994c8ae3a20e57e9330d277fb43d83e558dec5e/ipython-8.27.0.tar.gz", hash = "sha256:0b99a2dc9f15fd68692e898e5568725c6d49c527d36a9fb5960ffbdeaa82ff7e", size = 5494984 } +sdist = { url = "https://files.pythonhosted.org/packages/b1/b9/3ba6c45a6df813c09a48bac313c22ff83efa26cbb55011218d925a46e2ad/ipython-8.18.1.tar.gz", hash = "sha256:ca6f079bb33457c66e233e4580ebfc4128855b4cf6370dddd73842a9563e8a27", size = 5486330 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a8/a2/6c725958e6f135d8e5de081e69841bb2c1d84b3fc259d02eb092b8fc203a/ipython-8.27.0-py3-none-any.whl", hash = "sha256:f68b3cb8bde357a5d7adc9598d57e22a45dfbea19eb6b98286fa3b288c9cd55c", size = 818986 }, + { url = "https://files.pythonhosted.org/packages/47/6b/d9fdcdef2eb6a23f391251fde8781c38d42acd82abe84d054cb74f7863b0/ipython-8.18.1-py3-none-any.whl", hash = "sha256:e8267419d72d81955ec1177f8a29aaa90ac80ad647499201119e2f05e99aa397", size = 808161 }, ] [[package]] @@ -361,7 +374,7 @@ name = "jedi" version = "0.19.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "parso", marker = "python_full_version >= '3.10'" }, + { name = "parso" }, ] sdist = { url = "https://files.pythonhosted.org/packages/d6/99/99b493cec4bf43176b678de30f81ed003fd6a647a301b9c927280c600f0a/jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd", size = 1227821 } wheels = [ @@ -373,7 +386,7 @@ name = "jinja2" version = "3.1.4" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "markupsafe", marker = "python_full_version >= '3.10'" }, + { name = "markupsafe" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ed/55/39036716d19cab0747a5020fc7e907f362fbf48c984b14e62127f7e68e5d/jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369", size = 240245 } wheels = [ @@ -394,7 +407,7 @@ name = "markdown-it-py" version = "3.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "mdurl", marker = "python_full_version >= '3.10'" }, + { name = "mdurl" }, ] sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596 } wheels = [ @@ -403,50 +416,70 @@ wheels = [ [[package]] name = "markupsafe" -version = "2.1.5" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/87/5b/aae44c6655f3801e81aa3eef09dbbf012431987ba564d7231722f68df02d/MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b", size = 19384 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e4/54/ad5eb37bf9d51800010a74e4665425831a9db4e7c4e0fde4352e391e808e/MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc", size = 18206 }, - { url = "https://files.pythonhosted.org/packages/6a/4a/a4d49415e600bacae038c67f9fecc1d5433b9d3c71a4de6f33537b89654c/MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5", size = 14079 }, - { url = "https://files.pythonhosted.org/packages/0a/7b/85681ae3c33c385b10ac0f8dd025c30af83c78cec1c37a6aa3b55e67f5ec/MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46", size = 26620 }, - { url = "https://files.pythonhosted.org/packages/7c/52/2b1b570f6b8b803cef5ac28fdf78c0da318916c7d2fe9402a84d591b394c/MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f", size = 25818 }, - { url = "https://files.pythonhosted.org/packages/29/fe/a36ba8c7ca55621620b2d7c585313efd10729e63ef81e4e61f52330da781/MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900", size = 25493 }, - { url = "https://files.pythonhosted.org/packages/60/ae/9c60231cdfda003434e8bd27282b1f4e197ad5a710c14bee8bea8a9ca4f0/MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff", size = 30630 }, - { url = "https://files.pythonhosted.org/packages/65/dc/1510be4d179869f5dafe071aecb3f1f41b45d37c02329dfba01ff59e5ac5/MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad", size = 29745 }, - { url = "https://files.pythonhosted.org/packages/30/39/8d845dd7d0b0613d86e0ef89549bfb5f61ed781f59af45fc96496e897f3a/MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd", size = 30021 }, - { url = "https://files.pythonhosted.org/packages/c7/5c/356a6f62e4f3c5fbf2602b4771376af22a3b16efa74eb8716fb4e328e01e/MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4", size = 16659 }, - { url = "https://files.pythonhosted.org/packages/69/48/acbf292615c65f0604a0c6fc402ce6d8c991276e16c80c46a8f758fbd30c/MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5", size = 17213 }, - { url = "https://files.pythonhosted.org/packages/11/e7/291e55127bb2ae67c64d66cef01432b5933859dfb7d6949daa721b89d0b3/MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f", size = 18219 }, - { url = "https://files.pythonhosted.org/packages/6b/cb/aed7a284c00dfa7c0682d14df85ad4955a350a21d2e3b06d8240497359bf/MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2", size = 14098 }, - { url = "https://files.pythonhosted.org/packages/1c/cf/35fe557e53709e93feb65575c93927942087e9b97213eabc3fe9d5b25a55/MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced", size = 29014 }, - { url = "https://files.pythonhosted.org/packages/97/18/c30da5e7a0e7f4603abfc6780574131221d9148f323752c2755d48abad30/MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5", size = 28220 }, - { url = "https://files.pythonhosted.org/packages/0c/40/2e73e7d532d030b1e41180807a80d564eda53babaf04d65e15c1cf897e40/MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c", size = 27756 }, - { url = "https://files.pythonhosted.org/packages/18/46/5dca760547e8c59c5311b332f70605d24c99d1303dd9a6e1fc3ed0d73561/MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f", size = 33988 }, - { url = "https://files.pythonhosted.org/packages/6d/c5/27febe918ac36397919cd4a67d5579cbbfa8da027fa1238af6285bb368ea/MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a", size = 32718 }, - { url = "https://files.pythonhosted.org/packages/f8/81/56e567126a2c2bc2684d6391332e357589a96a76cb9f8e5052d85cb0ead8/MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f", size = 33317 }, - { url = "https://files.pythonhosted.org/packages/00/0b/23f4b2470accb53285c613a3ab9ec19dc944eaf53592cb6d9e2af8aa24cc/MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906", size = 16670 }, - { url = "https://files.pythonhosted.org/packages/b7/a2/c78a06a9ec6d04b3445a949615c4c7ed86a0b2eb68e44e7541b9d57067cc/MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617", size = 17224 }, - { url = "https://files.pythonhosted.org/packages/53/bd/583bf3e4c8d6a321938c13f49d44024dbe5ed63e0a7ba127e454a66da974/MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1", size = 18215 }, - { url = "https://files.pythonhosted.org/packages/48/d6/e7cd795fc710292c3af3a06d80868ce4b02bfbbf370b7cee11d282815a2a/MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4", size = 14069 }, - { url = "https://files.pythonhosted.org/packages/51/b5/5d8ec796e2a08fc814a2c7d2584b55f889a55cf17dd1a90f2beb70744e5c/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee", size = 29452 }, - { url = "https://files.pythonhosted.org/packages/0a/0d/2454f072fae3b5a137c119abf15465d1771319dfe9e4acbb31722a0fff91/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5", size = 28462 }, - { url = "https://files.pythonhosted.org/packages/2d/75/fd6cb2e68780f72d47e6671840ca517bda5ef663d30ada7616b0462ad1e3/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b", size = 27869 }, - { url = "https://files.pythonhosted.org/packages/b0/81/147c477391c2750e8fc7705829f7351cf1cd3be64406edcf900dc633feb2/MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a", size = 33906 }, - { url = "https://files.pythonhosted.org/packages/8b/ff/9a52b71839d7a256b563e85d11050e307121000dcebc97df120176b3ad93/MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f", size = 32296 }, - { url = "https://files.pythonhosted.org/packages/88/07/2dc76aa51b481eb96a4c3198894f38b480490e834479611a4053fbf08623/MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169", size = 33038 }, - { url = "https://files.pythonhosted.org/packages/96/0c/620c1fb3661858c0e37eb3cbffd8c6f732a67cd97296f725789679801b31/MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad", size = 16572 }, - { url = "https://files.pythonhosted.org/packages/3f/14/c3554d512d5f9100a95e737502f4a2323a1959f6d0d01e0d0997b35f7b10/MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb", size = 17127 }, - { url = "https://files.pythonhosted.org/packages/0f/31/780bb297db036ba7b7bbede5e1d7f1e14d704ad4beb3ce53fb495d22bc62/MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf", size = 18193 }, - { url = "https://files.pythonhosted.org/packages/6c/77/d77701bbef72892affe060cdacb7a2ed7fd68dae3b477a8642f15ad3b132/MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2", size = 14073 }, - { url = "https://files.pythonhosted.org/packages/d9/a7/1e558b4f78454c8a3a0199292d96159eb4d091f983bc35ef258314fe7269/MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8", size = 26486 }, - { url = "https://files.pythonhosted.org/packages/5f/5a/360da85076688755ea0cceb92472923086993e86b5613bbae9fbc14136b0/MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3", size = 25685 }, - { url = "https://files.pythonhosted.org/packages/6a/18/ae5a258e3401f9b8312f92b028c54d7026a97ec3ab20bfaddbdfa7d8cce8/MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465", size = 25338 }, - { url = "https://files.pythonhosted.org/packages/0b/cc/48206bd61c5b9d0129f4d75243b156929b04c94c09041321456fd06a876d/MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e", size = 30439 }, - { url = "https://files.pythonhosted.org/packages/d1/06/a41c112ab9ffdeeb5f77bc3e331fdadf97fa65e52e44ba31880f4e7f983c/MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea", size = 29531 }, - { url = "https://files.pythonhosted.org/packages/02/8c/ab9a463301a50dab04d5472e998acbd4080597abc048166ded5c7aa768c8/MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6", size = 29823 }, - { url = "https://files.pythonhosted.org/packages/bc/29/9bc18da763496b055d8e98ce476c8e718dcfd78157e17f555ce6dd7d0895/MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf", size = 16658 }, - { url = "https://files.pythonhosted.org/packages/f6/f8/4da07de16f10551ca1f640c92b5f316f9394088b183c6a57183df6de5ae4/MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5", size = 17211 }, +version = "3.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/90/d08277ce111dd22f77149fd1a5d4653eeb3b3eaacbdfcbae5afb2600eebd/MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8", size = 14357 }, + { url = "https://files.pythonhosted.org/packages/04/e1/6e2194baeae0bca1fae6629dc0cbbb968d4d941469cbab11a3872edff374/MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158", size = 12393 }, + { url = "https://files.pythonhosted.org/packages/1d/69/35fa85a8ece0a437493dc61ce0bb6d459dcba482c34197e3efc829aa357f/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579", size = 21732 }, + { url = "https://files.pythonhosted.org/packages/22/35/137da042dfb4720b638d2937c38a9c2df83fe32d20e8c8f3185dbfef05f7/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d", size = 20866 }, + { url = "https://files.pythonhosted.org/packages/29/28/6d029a903727a1b62edb51863232152fd335d602def598dade38996887f0/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb", size = 20964 }, + { url = "https://files.pythonhosted.org/packages/cc/cd/07438f95f83e8bc028279909d9c9bd39e24149b0d60053a97b2bc4f8aa51/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b", size = 21977 }, + { url = "https://files.pythonhosted.org/packages/29/01/84b57395b4cc062f9c4c55ce0df7d3108ca32397299d9df00fedd9117d3d/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c", size = 21366 }, + { url = "https://files.pythonhosted.org/packages/bd/6e/61ebf08d8940553afff20d1fb1ba7294b6f8d279df9fd0c0db911b4bbcfd/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171", size = 21091 }, + { url = "https://files.pythonhosted.org/packages/11/23/ffbf53694e8c94ebd1e7e491de185124277964344733c45481f32ede2499/MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50", size = 15065 }, + { url = "https://files.pythonhosted.org/packages/44/06/e7175d06dd6e9172d4a69a72592cb3f7a996a9c396eee29082826449bbc3/MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a", size = 15514 }, + { url = "https://files.pythonhosted.org/packages/6b/28/bbf83e3f76936960b850435576dd5e67034e200469571be53f69174a2dfd/MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d", size = 14353 }, + { url = "https://files.pythonhosted.org/packages/6c/30/316d194b093cde57d448a4c3209f22e3046c5bb2fb0820b118292b334be7/MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93", size = 12392 }, + { url = "https://files.pythonhosted.org/packages/f2/96/9cdafba8445d3a53cae530aaf83c38ec64c4d5427d975c974084af5bc5d2/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832", size = 23984 }, + { url = "https://files.pythonhosted.org/packages/f1/a4/aefb044a2cd8d7334c8a47d3fb2c9f328ac48cb349468cc31c20b539305f/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84", size = 23120 }, + { url = "https://files.pythonhosted.org/packages/8d/21/5e4851379f88f3fad1de30361db501300d4f07bcad047d3cb0449fc51f8c/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca", size = 23032 }, + { url = "https://files.pythonhosted.org/packages/00/7b/e92c64e079b2d0d7ddf69899c98842f3f9a60a1ae72657c89ce2655c999d/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798", size = 24057 }, + { url = "https://files.pythonhosted.org/packages/f9/ac/46f960ca323037caa0a10662ef97d0a4728e890334fc156b9f9e52bcc4ca/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e", size = 23359 }, + { url = "https://files.pythonhosted.org/packages/69/84/83439e16197337b8b14b6a5b9c2105fff81d42c2a7c5b58ac7b62ee2c3b1/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4", size = 23306 }, + { url = "https://files.pythonhosted.org/packages/9a/34/a15aa69f01e2181ed8d2b685c0d2f6655d5cca2c4db0ddea775e631918cd/MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d", size = 15094 }, + { url = "https://files.pythonhosted.org/packages/da/b8/3a3bd761922d416f3dc5d00bfbed11f66b1ab89a0c2b6e887240a30b0f6b/MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b", size = 15521 }, + { url = "https://files.pythonhosted.org/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", size = 14274 }, + { url = "https://files.pythonhosted.org/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", size = 12348 }, + { url = "https://files.pythonhosted.org/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", size = 24149 }, + { url = "https://files.pythonhosted.org/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", size = 23118 }, + { url = "https://files.pythonhosted.org/packages/d5/da/f2eeb64c723f5e3777bc081da884b414671982008c47dcc1873d81f625b6/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", size = 22993 }, + { url = "https://files.pythonhosted.org/packages/da/0e/1f32af846df486dce7c227fe0f2398dc7e2e51d4a370508281f3c1c5cddc/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", size = 24178 }, + { url = "https://files.pythonhosted.org/packages/c4/f6/bb3ca0532de8086cbff5f06d137064c8410d10779c4c127e0e47d17c0b71/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", size = 23319 }, + { url = "https://files.pythonhosted.org/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", size = 23352 }, + { url = "https://files.pythonhosted.org/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", size = 15097 }, + { url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", size = 15601 }, + { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274 }, + { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352 }, + { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122 }, + { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085 }, + { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978 }, + { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208 }, + { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357 }, + { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344 }, + { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101 }, + { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603 }, + { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510 }, + { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486 }, + { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480 }, + { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914 }, + { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796 }, + { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473 }, + { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114 }, + { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098 }, + { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208 }, + { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739 }, + { url = "https://files.pythonhosted.org/packages/a7/ea/9b1530c3fdeeca613faeb0fb5cbcf2389d816072fab72a71b45749ef6062/MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a", size = 14344 }, + { url = "https://files.pythonhosted.org/packages/4b/c2/fbdbfe48848e7112ab05e627e718e854d20192b674952d9042ebd8c9e5de/MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff", size = 12389 }, + { url = "https://files.pythonhosted.org/packages/f0/25/7a7c6e4dbd4f867d95d94ca15449e91e52856f6ed1905d58ef1de5e211d0/MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13", size = 21607 }, + { url = "https://files.pythonhosted.org/packages/53/8f/f339c98a178f3c1e545622206b40986a4c3307fe39f70ccd3d9df9a9e425/MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144", size = 20728 }, + { url = "https://files.pythonhosted.org/packages/1a/03/8496a1a78308456dbd50b23a385c69b41f2e9661c67ea1329849a598a8f9/MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29", size = 20826 }, + { url = "https://files.pythonhosted.org/packages/e6/cf/0a490a4bd363048c3022f2f475c8c05582179bb179defcee4766fb3dcc18/MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0", size = 21843 }, + { url = "https://files.pythonhosted.org/packages/19/a3/34187a78613920dfd3cdf68ef6ce5e99c4f3417f035694074beb8848cd77/MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0", size = 21219 }, + { url = "https://files.pythonhosted.org/packages/17/d8/5811082f85bb88410ad7e452263af048d685669bbbfb7b595e8689152498/MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178", size = 20946 }, + { url = "https://files.pythonhosted.org/packages/7c/31/bd635fb5989440d9365c5e3c47556cfea121c7803f5034ac843e8f37c2f2/MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f", size = 15063 }, + { url = "https://files.pythonhosted.org/packages/b3/73/085399401383ce949f727afec55ec3abd76648d04b9f22e1c0e99cb4bec3/MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a", size = 15506 }, ] [[package]] @@ -454,7 +487,7 @@ name = "matplotlib-inline" version = "0.1.7" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "traitlets", marker = "python_full_version >= '3.10'" }, + { name = "traitlets" }, ] sdist = { url = "https://files.pythonhosted.org/packages/99/5b/a36a337438a14116b16480db471ad061c36c3694df7c2084a0da7ba538b7/matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90", size = 8159 } wheels = [ @@ -475,27 +508,27 @@ name = "model2vec" version = "0.2.4" source = { editable = "." } dependencies = [ - { name = "numpy", marker = "python_full_version >= '3.10'" }, - { name = "rich", marker = "python_full_version >= '3.10'" }, - { name = "setuptools", marker = "python_full_version >= '3.10'" }, - { name = "tokenizers", marker = "python_full_version >= '3.10'" }, - { name = "tqdm", marker = "python_full_version >= '3.10'" }, + { name = "numpy" }, + { name = "rich" }, + { name = "setuptools" }, + { name = "tokenizers" }, + { name = "tqdm" }, ] [package.optional-dependencies] dev = [ - { name = "black", marker = "python_full_version >= '3.10'" }, - { name = "ipython", marker = "python_full_version >= '3.10'" }, - { name = "mypy", marker = "python_full_version >= '3.10'" }, - { name = "pre-commit", marker = "python_full_version >= '3.10'" }, - { name = "pytest", marker = "python_full_version >= '3.10'" }, - { name = "pytest-coverage", marker = "python_full_version >= '3.10'" }, - { name = "ruff", marker = "python_full_version >= '3.10'" }, + { name = "black" }, + { name = "ipython" }, + { name = "mypy" }, + { name = "pre-commit" }, + { name = "pytest" }, + { name = "pytest-coverage" }, + { name = "ruff" }, ] distill = [ - { name = "scikit-learn", marker = "python_full_version >= '3.10'" }, - { name = "torch", marker = "python_full_version >= '3.10'" }, - { name = "transformers", marker = "python_full_version >= '3.10'" }, + { name = "scikit-learn" }, + { name = "torch" }, + { name = "transformers" }, ] [package.metadata] @@ -528,36 +561,41 @@ wheels = [ [[package]] name = "mypy" -version = "1.11.2" +version = "1.12.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "mypy-extensions", marker = "python_full_version >= '3.10'" }, - { name = "tomli", marker = "python_full_version == '3.10.*'" }, - { name = "typing-extensions", marker = "python_full_version >= '3.10'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/5c/86/5d7cbc4974fd564550b80fbb8103c05501ea11aa7835edf3351d90095896/mypy-1.11.2.tar.gz", hash = "sha256:7f9993ad3e0ffdc95c2a14b66dee63729f021968bff8ad911867579c65d13a79", size = 3078806 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/78/cd/815368cd83c3a31873e5e55b317551500b12f2d1d7549720632f32630333/mypy-1.11.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d42a6dd818ffce7be66cce644f1dff482f1d97c53ca70908dff0b9ddc120b77a", size = 10939401 }, - { url = "https://files.pythonhosted.org/packages/f1/27/e18c93a195d2fad75eb96e1f1cbc431842c332e8eba2e2b77eaf7313c6b7/mypy-1.11.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:801780c56d1cdb896eacd5619a83e427ce436d86a3bdf9112527f24a66618fef", size = 10111697 }, - { url = "https://files.pythonhosted.org/packages/dc/08/cdc1fc6d0d5a67d354741344cc4aa7d53f7128902ebcbe699ddd4f15a61c/mypy-1.11.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41ea707d036a5307ac674ea172875f40c9d55c5394f888b168033177fce47383", size = 12500508 }, - { url = "https://files.pythonhosted.org/packages/64/12/aad3af008c92c2d5d0720ea3b6674ba94a98cdb86888d389acdb5f218c30/mypy-1.11.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6e658bd2d20565ea86da7d91331b0eed6d2eee22dc031579e6297f3e12c758c8", size = 13020712 }, - { url = "https://files.pythonhosted.org/packages/03/e6/a7d97cc124a565be5e9b7d5c2a6ebf082379ffba99646e4863ed5bbcb3c3/mypy-1.11.2-cp310-cp310-win_amd64.whl", hash = "sha256:478db5f5036817fe45adb7332d927daa62417159d49783041338921dcf646fc7", size = 9567319 }, - { url = "https://files.pythonhosted.org/packages/e2/aa/cc56fb53ebe14c64f1fe91d32d838d6f4db948b9494e200d2f61b820b85d/mypy-1.11.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:75746e06d5fa1e91bfd5432448d00d34593b52e7e91a187d981d08d1f33d4385", size = 10859630 }, - { url = "https://files.pythonhosted.org/packages/04/c8/b19a760fab491c22c51975cf74e3d253b8c8ce2be7afaa2490fbf95a8c59/mypy-1.11.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a976775ab2256aadc6add633d44f100a2517d2388906ec4f13231fafbb0eccca", size = 10037973 }, - { url = "https://files.pythonhosted.org/packages/88/57/7e7e39f2619c8f74a22efb9a4c4eff32b09d3798335625a124436d121d89/mypy-1.11.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cd953f221ac1379050a8a646585a29574488974f79d8082cedef62744f0a0104", size = 12416659 }, - { url = "https://files.pythonhosted.org/packages/fc/a6/37f7544666b63a27e46c48f49caeee388bf3ce95f9c570eb5cfba5234405/mypy-1.11.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:57555a7715c0a34421013144a33d280e73c08df70f3a18a552938587ce9274f4", size = 12897010 }, - { url = "https://files.pythonhosted.org/packages/84/8b/459a513badc4d34acb31c736a0101c22d2bd0697b969796ad93294165cfb/mypy-1.11.2-cp311-cp311-win_amd64.whl", hash = "sha256:36383a4fcbad95f2657642a07ba22ff797de26277158f1cc7bd234821468b1b6", size = 9562873 }, - { url = "https://files.pythonhosted.org/packages/35/3a/ed7b12ecc3f6db2f664ccf85cb2e004d3e90bec928e9d7be6aa2f16b7cdf/mypy-1.11.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e8960dbbbf36906c5c0b7f4fbf2f0c7ffb20f4898e6a879fcf56a41a08b0d318", size = 10990335 }, - { url = "https://files.pythonhosted.org/packages/04/e4/1a9051e2ef10296d206519f1df13d2cc896aea39e8683302f89bf5792a59/mypy-1.11.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:06d26c277962f3fb50e13044674aa10553981ae514288cb7d0a738f495550b36", size = 10007119 }, - { url = "https://files.pythonhosted.org/packages/f3/3c/350a9da895f8a7e87ade0028b962be0252d152e0c2fbaafa6f0658b4d0d4/mypy-1.11.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6e7184632d89d677973a14d00ae4d03214c8bc301ceefcdaf5c474866814c987", size = 12506856 }, - { url = "https://files.pythonhosted.org/packages/b6/49/ee5adf6a49ff13f4202d949544d3d08abb0ea1f3e7f2a6d5b4c10ba0360a/mypy-1.11.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3a66169b92452f72117e2da3a576087025449018afc2d8e9bfe5ffab865709ca", size = 12952066 }, - { url = "https://files.pythonhosted.org/packages/27/c0/b19d709a42b24004d720db37446a42abadf844d5c46a2c442e2a074d70d9/mypy-1.11.2-cp312-cp312-win_amd64.whl", hash = "sha256:969ea3ef09617aff826885a22ece0ddef69d95852cdad2f60c8bb06bf1f71f70", size = 9664000 }, - { url = "https://files.pythonhosted.org/packages/16/64/bb5ed751487e2bea0dfaa6f640a7e3bb88083648f522e766d5ef4a76f578/mypy-1.11.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:801ca29f43d5acce85f8e999b1e431fb479cb02d0e11deb7d2abb56bdaf24fd6", size = 10937294 }, - { url = "https://files.pythonhosted.org/packages/a9/a3/67a0069abed93c3bf3b0bebb8857e2979a02828a4a3fd82f107f8f1143e8/mypy-1.11.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:af8d155170fcf87a2afb55b35dc1a0ac21df4431e7d96717621962e4b9192e70", size = 10107707 }, - { url = "https://files.pythonhosted.org/packages/2f/4d/0379daf4258b454b1f9ed589a9dabd072c17f97496daea7b72fdacf7c248/mypy-1.11.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f7821776e5c4286b6a13138cc935e2e9b6fde05e081bdebf5cdb2bb97c9df81d", size = 12498367 }, - { url = "https://files.pythonhosted.org/packages/3b/dc/3976a988c280b3571b8eb6928882dc4b723a403b21735a6d8ae6ed20e82b/mypy-1.11.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:539c570477a96a4e6fb718b8d5c3e0c0eba1f485df13f86d2970c91f0673148d", size = 13018014 }, - { url = "https://files.pythonhosted.org/packages/83/84/adffc7138fb970e7e2a167bd20b33bb78958370179853a4ebe9008139342/mypy-1.11.2-cp39-cp39-win_amd64.whl", hash = "sha256:3f14cd3d386ac4d05c5a39a51b84387403dadbd936e17cb35882134d4f8f0d24", size = 9568056 }, - { url = "https://files.pythonhosted.org/packages/42/3a/bdf730640ac523229dd6578e8a581795720a9321399de494374afc437ec5/mypy-1.11.2-py3-none-any.whl", hash = "sha256:b499bc07dbdcd3de92b0a8b29fdf592c111276f6a12fe29c30f6c417dd546d12", size = 2619625 }, + { name = "mypy-extensions" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f9/70/196a3339459fe22296ac9a883bbd998fcaf0db3e8d9a54cf4f53b722cad4/mypy-1.12.0.tar.gz", hash = "sha256:65a22d87e757ccd95cbbf6f7e181e6caa87128255eb2b6be901bb71b26d8a99d", size = 3149879 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/93/6d/9751ed6d77b42a5d704224fbadf6f1a18b5ab655c012d17bc8af819a7f06/mypy-1.12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4397081e620dc4dc18e2f124d5e1d2c288194c2c08df6bdb1db31c38cd1fe1ed", size = 11017763 }, + { url = "https://files.pythonhosted.org/packages/74/03/5fa6824555460f74873a414c7f42332c219fdfcfbd63b55b2442794b634b/mypy-1.12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:684a9c508a283f324804fea3f0effeb7858eb03f85c4402a967d187f64562469", size = 10181032 }, + { url = "https://files.pythonhosted.org/packages/89/56/20d3136d6904c369422423d267c5ceb312487586cdd81e90bf7e237b67e7/mypy-1.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6cabe4cda2fa5eca7ac94854c6c37039324baaa428ecbf4de4567279e9810f9e", size = 12587243 }, + { url = "https://files.pythonhosted.org/packages/53/cb/64043dec34fbcecaced207b077b8e5041e263da43003cc6309c90bc5e26e/mypy-1.12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:060a07b10e999ac9e7fa249ce2bdcfa9183ca2b70756f3bce9df7a92f78a3c0a", size = 13105170 }, + { url = "https://files.pythonhosted.org/packages/5e/59/e89758d47412ec6bd7a2fd9cae8074b7ffb2acee40456a4efbedd42e2dfd/mypy-1.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:0eff042d7257f39ba4ca06641d110ca7d2ad98c9c1fb52200fe6b1c865d360ff", size = 9633620 }, + { url = "https://files.pythonhosted.org/packages/21/68/9098b11b5c4371793237c7a2c5e9415ece358bed97bc849e9191d38c66b5/mypy-1.12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4b86de37a0da945f6d48cf110d5206c5ed514b1ca2614d7ad652d4bf099c7de7", size = 10940151 }, + { url = "https://files.pythonhosted.org/packages/7c/11/14a4373e5da6636fc4c8475cabe65084ff640528bc6c4f426d9c992736a9/mypy-1.12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:20c7c5ce0c1be0b0aea628374e6cf68b420bcc772d85c3c974f675b88e3e6e57", size = 10107645 }, + { url = "https://files.pythonhosted.org/packages/c7/07/b73faeeaadabb5aab23195bfd828392c9a5e21e7b8cdf8369a2546e00ce6/mypy-1.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a64ee25f05fc2d3d8474985c58042b6759100a475f8237da1f4faf7fcd7e6309", size = 12504561 }, + { url = "https://files.pythonhosted.org/packages/78/70/c35608364f9cdf97c048f0240be4d06d3baadede2767a5fbf60aad7c64f3/mypy-1.12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:faca7ab947c9f457a08dcb8d9a8664fd438080e002b0fa3e41b0535335edcf7f", size = 12983108 }, + { url = "https://files.pythonhosted.org/packages/74/fa/e5b0d4291ed9b94075fe13a0cdd1d9f1ba9d32ea1f8e88aec2ffcd057ac3/mypy-1.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:5bc81701d52cc8767005fdd2a08c19980de9ec61a25dbd2a937dfb1338a826f9", size = 9629293 }, + { url = "https://files.pythonhosted.org/packages/e7/c8/ef6e2a11f0de6cf4359552bf71f07a89f302d27e25bf4c9761649bf1b5a8/mypy-1.12.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8462655b6694feb1c99e433ea905d46c478041a8b8f0c33f1dab00ae881b2164", size = 11072079 }, + { url = "https://files.pythonhosted.org/packages/61/e7/1f9ba3965c3c445d863290d3f8521a7a726b878784f5ad642e82c038261f/mypy-1.12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:923ea66d282d8af9e0f9c21ffc6653643abb95b658c3a8a32dca1eff09c06475", size = 10071930 }, + { url = "https://files.pythonhosted.org/packages/3a/11/c84fb4c3a42ffd460c2a9b27105fbd538ec501e5aa34671fd3d14a1b94ba/mypy-1.12.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1ebf9e796521f99d61864ed89d1fb2926d9ab6a5fab421e457cd9c7e4dd65aa9", size = 12588227 }, + { url = "https://files.pythonhosted.org/packages/f0/ad/b55d070d2001e47c4c6c7d00b13f8dafb16b74db5a99904a183e3c0a3bd6/mypy-1.12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e478601cc3e3fa9d6734d255a59c7a2e5c2934da4378f3dd1e3411ea8a248642", size = 13037186 }, + { url = "https://files.pythonhosted.org/packages/28/c8/5fc9ef8d3ea89490939ecdfea7a84cede31a69534d468c34807941f5a79f/mypy-1.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:c72861b7139a4f738344faa0e150834467521a3fba42dc98264e5aa9507dd601", size = 9727738 }, + { url = "https://files.pythonhosted.org/packages/a6/07/0df1b099a4a725e61782f7d9a34947fc93be688f9dfa011d86e411b2f036/mypy-1.12.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:52b9e1492e47e1790360a43755fa04101a7ac72287b1a53ce817f35899ba0521", size = 11071648 }, + { url = "https://files.pythonhosted.org/packages/9a/60/2a8bdb4f822bcdb0fa4599b83c1ae9f9ab0e10c1bee262dd9c1ff4607b12/mypy-1.12.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:48d3e37dd7d9403e38fa86c46191de72705166d40b8c9f91a3de77350daa0893", size = 10065760 }, + { url = "https://files.pythonhosted.org/packages/cc/d9/065ec6bd21a0ae14b520574d531dc1aa23fdc30fd276dea25f71945172d2/mypy-1.12.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2f106db5ccb60681b622ac768455743ee0e6a857724d648c9629a9bd2ac3f721", size = 12584005 }, + { url = "https://files.pythonhosted.org/packages/e6/a8/31449fc5698d1a55062614790a885128e3b2a21de0f82a426942a5ae6a00/mypy-1.12.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:233e11b3f73ee1f10efada2e6da0f555b2f3a5316e9d8a4a1224acc10e7181d3", size = 13030941 }, + { url = "https://files.pythonhosted.org/packages/b5/8e/2347814cffccfb52fc02cbe457ae4a3fb5b660c5b361cdf72374266c231b/mypy-1.12.0-cp313-cp313-win_amd64.whl", hash = "sha256:4ae8959c21abcf9d73aa6c74a313c45c0b5a188752bf37dace564e29f06e9c1b", size = 9734383 }, + { url = "https://files.pythonhosted.org/packages/81/91/67f83e940b4e195b8c87ed9a64c48c6eb1513822b41df6594ef8fb4e0f9a/mypy-1.12.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b5df6c8a8224f6b86746bda716bbe4dbe0ce89fd67b1fa4661e11bfe38e8ec8", size = 11013910 }, + { url = "https://files.pythonhosted.org/packages/9d/df/437261d0f622878822e52682a4b41c4387c99a322bf352af52ab58cf7c5a/mypy-1.12.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5feee5c74eb9749e91b77f60b30771563327329e29218d95bedbe1257e2fe4b0", size = 10179201 }, + { url = "https://files.pythonhosted.org/packages/2a/4e/d2fed1aa4ee487ccd5818afc3f926c81508ad5618c124cfa22d586e60d53/mypy-1.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:77278e8c6ffe2abfba6db4125de55f1024de9a323be13d20e4f73b8ed3402bd1", size = 12585797 }, + { url = "https://files.pythonhosted.org/packages/6e/d1/a971f6abc11221019bb41b2d7d94e807bcf1d9a4f51cf50e4ee27e5d0921/mypy-1.12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:dcfb754dea911039ac12434d1950d69a2f05acd4d56f7935ed402be09fad145e", size = 13102159 }, + { url = "https://files.pythonhosted.org/packages/9b/d5/dde4feae6ff046899a4da883abe678beed7e8633e92c1d2cb2714bd4478c/mypy-1.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:06de0498798527451ffb60f68db0d368bd2bae2bbfb5237eae616d4330cc87aa", size = 9631514 }, + { url = "https://files.pythonhosted.org/packages/85/fd/2cc64da1ce9fada64b5d023dfbaf763548429145d08c958c78c02876c7f6/mypy-1.12.0-py3-none-any.whl", hash = "sha256:fd313226af375d52e1e36c383f39bf3836e1f192801116b31b090dfcd3ec5266", size = 2645791 }, ] [[package]] @@ -571,11 +609,11 @@ wheels = [ [[package]] name = "networkx" -version = "3.3" +version = "3.2.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/04/e6/b164f94c869d6b2c605b5128b7b0cfe912795a87fc90e78533920001f3ec/networkx-3.3.tar.gz", hash = "sha256:0c127d8b2f4865f59ae9cb8aafcd60b5c70f3241ebd66f7defad7c4ab90126c9", size = 2126579 } +sdist = { url = "https://files.pythonhosted.org/packages/c4/80/a84676339aaae2f1cfdf9f418701dd634aef9cc76f708ef55c36ff39c3ca/networkx-3.2.1.tar.gz", hash = "sha256:9f1bb5cf3409bf324e0a722c20bdb4c20ee39bf1c30ce8ae499c8502b0b5e0c6", size = 2073928 } wheels = [ - { url = "https://files.pythonhosted.org/packages/38/e9/5f72929373e1a0e8d142a130f3f97e6ff920070f87f91c4e13e40e0fba5a/networkx-3.3-py3-none-any.whl", hash = "sha256:28575580c6ebdaf4505b22c6256a2b9de86b316dc63ba9e93abde3d78dfdbcf2", size = 1702396 }, + { url = "https://files.pythonhosted.org/packages/d5/f0/8fbc882ca80cf077f1b246c0e3c3465f7f415439bdea6b899f6b19f61f70/networkx-3.2.1-py3-none-any.whl", hash = "sha256:f18c69adc97877c42332c170849c96cefa91881c99a7cb3e95b7c659ebdc1ec2", size = 1647772 }, ] [[package]] @@ -589,77 +627,90 @@ wheels = [ [[package]] name = "numpy" -version = "1.26.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/65/6e/09db70a523a96d25e115e71cc56a6f9031e7b8cd166c1ac8438307c14058/numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010", size = 15786129 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/94/ace0fdea5241a27d13543ee117cbc65868e82213fb31a8eb7fe9ff23f313/numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0", size = 20631468 }, - { url = "https://files.pythonhosted.org/packages/20/f7/b24208eba89f9d1b58c1668bc6c8c4fd472b20c45573cb767f59d49fb0f6/numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a", size = 13966411 }, - { url = "https://files.pythonhosted.org/packages/fc/a5/4beee6488160798683eed5bdb7eead455892c3b4e1f78d79d8d3f3b084ac/numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4", size = 14219016 }, - { url = "https://files.pythonhosted.org/packages/4b/d7/ecf66c1cd12dc28b4040b15ab4d17b773b87fa9d29ca16125de01adb36cd/numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f", size = 18240889 }, - { url = "https://files.pythonhosted.org/packages/24/03/6f229fe3187546435c4f6f89f6d26c129d4f5bed40552899fcf1f0bf9e50/numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a", size = 13876746 }, - { url = "https://files.pythonhosted.org/packages/39/fe/39ada9b094f01f5a35486577c848fe274e374bbf8d8f472e1423a0bbd26d/numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2", size = 18078620 }, - { url = "https://files.pythonhosted.org/packages/d5/ef/6ad11d51197aad206a9ad2286dc1aac6a378059e06e8cf22cd08ed4f20dc/numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07", size = 5972659 }, - { url = "https://files.pythonhosted.org/packages/19/77/538f202862b9183f54108557bfda67e17603fc560c384559e769321c9d92/numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5", size = 15808905 }, - { url = "https://files.pythonhosted.org/packages/11/57/baae43d14fe163fa0e4c47f307b6b2511ab8d7d30177c491960504252053/numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71", size = 20630554 }, - { url = "https://files.pythonhosted.org/packages/1a/2e/151484f49fd03944c4a3ad9c418ed193cfd02724e138ac8a9505d056c582/numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef", size = 13997127 }, - { url = "https://files.pythonhosted.org/packages/79/ae/7e5b85136806f9dadf4878bf73cf223fe5c2636818ba3ab1c585d0403164/numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e", size = 14222994 }, - { url = "https://files.pythonhosted.org/packages/3a/d0/edc009c27b406c4f9cbc79274d6e46d634d139075492ad055e3d68445925/numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5", size = 18252005 }, - { url = "https://files.pythonhosted.org/packages/09/bf/2b1aaf8f525f2923ff6cfcf134ae5e750e279ac65ebf386c75a0cf6da06a/numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a", size = 13885297 }, - { url = "https://files.pythonhosted.org/packages/df/a0/4e0f14d847cfc2a633a1c8621d00724f3206cfeddeb66d35698c4e2cf3d2/numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a", size = 18093567 }, - { url = "https://files.pythonhosted.org/packages/d2/b7/a734c733286e10a7f1a8ad1ae8c90f2d33bf604a96548e0a4a3a6739b468/numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20", size = 5968812 }, - { url = "https://files.pythonhosted.org/packages/3f/6b/5610004206cf7f8e7ad91c5a85a8c71b2f2f8051a0c0c4d5916b76d6cbb2/numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2", size = 15811913 }, - { url = "https://files.pythonhosted.org/packages/95/12/8f2020a8e8b8383ac0177dc9570aad031a3beb12e38847f7129bacd96228/numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218", size = 20335901 }, - { url = "https://files.pythonhosted.org/packages/75/5b/ca6c8bd14007e5ca171c7c03102d17b4f4e0ceb53957e8c44343a9546dcc/numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b", size = 13685868 }, - { url = "https://files.pythonhosted.org/packages/79/f8/97f10e6755e2a7d027ca783f63044d5b1bc1ae7acb12afe6a9b4286eac17/numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b", size = 13925109 }, - { url = "https://files.pythonhosted.org/packages/0f/50/de23fde84e45f5c4fda2488c759b69990fd4512387a8632860f3ac9cd225/numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed", size = 17950613 }, - { url = "https://files.pythonhosted.org/packages/4c/0c/9c603826b6465e82591e05ca230dfc13376da512b25ccd0894709b054ed0/numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a", size = 13572172 }, - { url = "https://files.pythonhosted.org/packages/76/8c/2ba3902e1a0fc1c74962ea9bb33a534bb05984ad7ff9515bf8d07527cadd/numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0", size = 17786643 }, - { url = "https://files.pythonhosted.org/packages/28/4a/46d9e65106879492374999e76eb85f87b15328e06bd1550668f79f7b18c6/numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110", size = 5677803 }, - { url = "https://files.pythonhosted.org/packages/16/2e/86f24451c2d530c88daf997cb8d6ac622c1d40d19f5a031ed68a4b73a374/numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818", size = 15517754 }, - { url = "https://files.pythonhosted.org/packages/7d/24/ce71dc08f06534269f66e73c04f5709ee024a1afe92a7b6e1d73f158e1f8/numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c", size = 20636301 }, - { url = "https://files.pythonhosted.org/packages/ae/8c/ab03a7c25741f9ebc92684a20125fbc9fc1b8e1e700beb9197d750fdff88/numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be", size = 13971216 }, - { url = "https://files.pythonhosted.org/packages/6d/64/c3bcdf822269421d85fe0d64ba972003f9bb4aa9a419da64b86856c9961f/numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764", size = 14226281 }, - { url = "https://files.pythonhosted.org/packages/54/30/c2a907b9443cf42b90c17ad10c1e8fa801975f01cb9764f3f8eb8aea638b/numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3", size = 18249516 }, - { url = "https://files.pythonhosted.org/packages/43/12/01a563fc44c07095996d0129b8899daf89e4742146f7044cdbdb3101c57f/numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd", size = 13882132 }, - { url = "https://files.pythonhosted.org/packages/16/ee/9df80b06680aaa23fc6c31211387e0db349e0e36d6a63ba3bd78c5acdf11/numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c", size = 18084181 }, - { url = "https://files.pythonhosted.org/packages/28/7d/4b92e2fe20b214ffca36107f1a3e75ef4c488430e64de2d9af5db3a4637d/numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6", size = 5976360 }, - { url = "https://files.pythonhosted.org/packages/b5/42/054082bd8220bbf6f297f982f0a8f5479fcbc55c8b511d928df07b965869/numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea", size = 15814633 }, - { url = "https://files.pythonhosted.org/packages/3f/72/3df6c1c06fc83d9cfe381cccb4be2532bbd38bf93fbc9fad087b6687f1c0/numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30", size = 20455961 }, - { url = "https://files.pythonhosted.org/packages/8e/02/570545bac308b58ffb21adda0f4e220ba716fb658a63c151daecc3293350/numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c", size = 18061071 }, - { url = "https://files.pythonhosted.org/packages/f4/5f/fafd8c51235f60d49f7a88e2275e13971e90555b67da52dd6416caec32fe/numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0", size = 15709730 }, +version = "2.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a9/75/10dd1f8116a8b796cb2c737b674e02d02e80454bda953fa7e65d8c12b016/numpy-2.0.2.tar.gz", hash = "sha256:883c987dee1880e2a864ab0dc9892292582510604156762362d9326444636e78", size = 18902015 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/21/91/3495b3237510f79f5d81f2508f9f13fea78ebfdf07538fc7444badda173d/numpy-2.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:51129a29dbe56f9ca83438b706e2e69a39892b5eda6cedcb6b0c9fdc9b0d3ece", size = 21165245 }, + { url = "https://files.pythonhosted.org/packages/05/33/26178c7d437a87082d11019292dce6d3fe6f0e9026b7b2309cbf3e489b1d/numpy-2.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f15975dfec0cf2239224d80e32c3170b1d168335eaedee69da84fbe9f1f9cd04", size = 13738540 }, + { url = "https://files.pythonhosted.org/packages/ec/31/cc46e13bf07644efc7a4bf68df2df5fb2a1a88d0cd0da9ddc84dc0033e51/numpy-2.0.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:8c5713284ce4e282544c68d1c3b2c7161d38c256d2eefc93c1d683cf47683e66", size = 5300623 }, + { url = "https://files.pythonhosted.org/packages/6e/16/7bfcebf27bb4f9d7ec67332ffebee4d1bf085c84246552d52dbb548600e7/numpy-2.0.2-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:becfae3ddd30736fe1889a37f1f580e245ba79a5855bff5f2a29cb3ccc22dd7b", size = 6901774 }, + { url = "https://files.pythonhosted.org/packages/f9/a3/561c531c0e8bf082c5bef509d00d56f82e0ea7e1e3e3a7fc8fa78742a6e5/numpy-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2da5960c3cf0df7eafefd806d4e612c5e19358de82cb3c343631188991566ccd", size = 13907081 }, + { url = "https://files.pythonhosted.org/packages/fa/66/f7177ab331876200ac7563a580140643d1179c8b4b6a6b0fc9838de2a9b8/numpy-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:496f71341824ed9f3d2fd36cf3ac57ae2e0165c143b55c3a035ee219413f3318", size = 19523451 }, + { url = "https://files.pythonhosted.org/packages/25/7f/0b209498009ad6453e4efc2c65bcdf0ae08a182b2b7877d7ab38a92dc542/numpy-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a61ec659f68ae254e4d237816e33171497e978140353c0c2038d46e63282d0c8", size = 19927572 }, + { url = "https://files.pythonhosted.org/packages/3e/df/2619393b1e1b565cd2d4c4403bdd979621e2c4dea1f8532754b2598ed63b/numpy-2.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d731a1c6116ba289c1e9ee714b08a8ff882944d4ad631fd411106a30f083c326", size = 14400722 }, + { url = "https://files.pythonhosted.org/packages/22/ad/77e921b9f256d5da36424ffb711ae79ca3f451ff8489eeca544d0701d74a/numpy-2.0.2-cp310-cp310-win32.whl", hash = "sha256:984d96121c9f9616cd33fbd0618b7f08e0cfc9600a7ee1d6fd9b239186d19d97", size = 6472170 }, + { url = "https://files.pythonhosted.org/packages/10/05/3442317535028bc29cf0c0dd4c191a4481e8376e9f0db6bcf29703cadae6/numpy-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:c7b0be4ef08607dd04da4092faee0b86607f111d5ae68036f16cc787e250a131", size = 15905558 }, + { url = "https://files.pythonhosted.org/packages/8b/cf/034500fb83041aa0286e0fb16e7c76e5c8b67c0711bb6e9e9737a717d5fe/numpy-2.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:49ca4decb342d66018b01932139c0961a8f9ddc7589611158cb3c27cbcf76448", size = 21169137 }, + { url = "https://files.pythonhosted.org/packages/4a/d9/32de45561811a4b87fbdee23b5797394e3d1504b4a7cf40c10199848893e/numpy-2.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:11a76c372d1d37437857280aa142086476136a8c0f373b2e648ab2c8f18fb195", size = 13703552 }, + { url = "https://files.pythonhosted.org/packages/c1/ca/2f384720020c7b244d22508cb7ab23d95f179fcfff33c31a6eeba8d6c512/numpy-2.0.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:807ec44583fd708a21d4a11d94aedf2f4f3c3719035c76a2bbe1fe8e217bdc57", size = 5298957 }, + { url = "https://files.pythonhosted.org/packages/0e/78/a3e4f9fb6aa4e6fdca0c5428e8ba039408514388cf62d89651aade838269/numpy-2.0.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:8cafab480740e22f8d833acefed5cc87ce276f4ece12fdaa2e8903db2f82897a", size = 6905573 }, + { url = "https://files.pythonhosted.org/packages/a0/72/cfc3a1beb2caf4efc9d0b38a15fe34025230da27e1c08cc2eb9bfb1c7231/numpy-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a15f476a45e6e5a3a79d8a14e62161d27ad897381fecfa4a09ed5322f2085669", size = 13914330 }, + { url = "https://files.pythonhosted.org/packages/ba/a8/c17acf65a931ce551fee11b72e8de63bf7e8a6f0e21add4c937c83563538/numpy-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13e689d772146140a252c3a28501da66dfecd77490b498b168b501835041f951", size = 19534895 }, + { url = "https://files.pythonhosted.org/packages/ba/86/8767f3d54f6ae0165749f84648da9dcc8cd78ab65d415494962c86fac80f/numpy-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9ea91dfb7c3d1c56a0e55657c0afb38cf1eeae4544c208dc465c3c9f3a7c09f9", size = 19937253 }, + { url = "https://files.pythonhosted.org/packages/df/87/f76450e6e1c14e5bb1eae6836478b1028e096fd02e85c1c37674606ab752/numpy-2.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c1c9307701fec8f3f7a1e6711f9089c06e6284b3afbbcd259f7791282d660a15", size = 14414074 }, + { url = "https://files.pythonhosted.org/packages/5c/ca/0f0f328e1e59f73754f06e1adfb909de43726d4f24c6a3f8805f34f2b0fa/numpy-2.0.2-cp311-cp311-win32.whl", hash = "sha256:a392a68bd329eafac5817e5aefeb39038c48b671afd242710b451e76090e81f4", size = 6470640 }, + { url = "https://files.pythonhosted.org/packages/eb/57/3a3f14d3a759dcf9bf6e9eda905794726b758819df4663f217d658a58695/numpy-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:286cd40ce2b7d652a6f22efdfc6d1edf879440e53e76a75955bc0c826c7e64dc", size = 15910230 }, + { url = "https://files.pythonhosted.org/packages/45/40/2e117be60ec50d98fa08c2f8c48e09b3edea93cfcabd5a9ff6925d54b1c2/numpy-2.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:df55d490dea7934f330006d0f81e8551ba6010a5bf035a249ef61a94f21c500b", size = 20895803 }, + { url = "https://files.pythonhosted.org/packages/46/92/1b8b8dee833f53cef3e0a3f69b2374467789e0bb7399689582314df02651/numpy-2.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8df823f570d9adf0978347d1f926b2a867d5608f434a7cff7f7908c6570dcf5e", size = 13471835 }, + { url = "https://files.pythonhosted.org/packages/7f/19/e2793bde475f1edaea6945be141aef6c8b4c669b90c90a300a8954d08f0a/numpy-2.0.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:9a92ae5c14811e390f3767053ff54eaee3bf84576d99a2456391401323f4ec2c", size = 5038499 }, + { url = "https://files.pythonhosted.org/packages/e3/ff/ddf6dac2ff0dd50a7327bcdba45cb0264d0e96bb44d33324853f781a8f3c/numpy-2.0.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:a842d573724391493a97a62ebbb8e731f8a5dcc5d285dfc99141ca15a3302d0c", size = 6633497 }, + { url = "https://files.pythonhosted.org/packages/72/21/67f36eac8e2d2cd652a2e69595a54128297cdcb1ff3931cfc87838874bd4/numpy-2.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05e238064fc0610c840d1cf6a13bf63d7e391717d247f1bf0318172e759e692", size = 13621158 }, + { url = "https://files.pythonhosted.org/packages/39/68/e9f1126d757653496dbc096cb429014347a36b228f5a991dae2c6b6cfd40/numpy-2.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0123ffdaa88fa4ab64835dcbde75dcdf89c453c922f18dced6e27c90d1d0ec5a", size = 19236173 }, + { url = "https://files.pythonhosted.org/packages/d1/e9/1f5333281e4ebf483ba1c888b1d61ba7e78d7e910fdd8e6499667041cc35/numpy-2.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:96a55f64139912d61de9137f11bf39a55ec8faec288c75a54f93dfd39f7eb40c", size = 19634174 }, + { url = "https://files.pythonhosted.org/packages/71/af/a469674070c8d8408384e3012e064299f7a2de540738a8e414dcfd639996/numpy-2.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ec9852fb39354b5a45a80bdab5ac02dd02b15f44b3804e9f00c556bf24b4bded", size = 14099701 }, + { url = "https://files.pythonhosted.org/packages/d0/3d/08ea9f239d0e0e939b6ca52ad403c84a2bce1bde301a8eb4888c1c1543f1/numpy-2.0.2-cp312-cp312-win32.whl", hash = "sha256:671bec6496f83202ed2d3c8fdc486a8fc86942f2e69ff0e986140339a63bcbe5", size = 6174313 }, + { url = "https://files.pythonhosted.org/packages/b2/b5/4ac39baebf1fdb2e72585c8352c56d063b6126be9fc95bd2bb5ef5770c20/numpy-2.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:cfd41e13fdc257aa5778496b8caa5e856dc4896d4ccf01841daee1d96465467a", size = 15606179 }, + { url = "https://files.pythonhosted.org/packages/43/c1/41c8f6df3162b0c6ffd4437d729115704bd43363de0090c7f913cfbc2d89/numpy-2.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9059e10581ce4093f735ed23f3b9d283b9d517ff46009ddd485f1747eb22653c", size = 21169942 }, + { url = "https://files.pythonhosted.org/packages/39/bc/fd298f308dcd232b56a4031fd6ddf11c43f9917fbc937e53762f7b5a3bb1/numpy-2.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:423e89b23490805d2a5a96fe40ec507407b8ee786d66f7328be214f9679df6dd", size = 13711512 }, + { url = "https://files.pythonhosted.org/packages/96/ff/06d1aa3eeb1c614eda245c1ba4fb88c483bee6520d361641331872ac4b82/numpy-2.0.2-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:2b2955fa6f11907cf7a70dab0d0755159bca87755e831e47932367fc8f2f2d0b", size = 5306976 }, + { url = "https://files.pythonhosted.org/packages/2d/98/121996dcfb10a6087a05e54453e28e58694a7db62c5a5a29cee14c6e047b/numpy-2.0.2-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:97032a27bd9d8988b9a97a8c4d2c9f2c15a81f61e2f21404d7e8ef00cb5be729", size = 6906494 }, + { url = "https://files.pythonhosted.org/packages/15/31/9dffc70da6b9bbf7968f6551967fc21156207366272c2a40b4ed6008dc9b/numpy-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e795a8be3ddbac43274f18588329c72939870a16cae810c2b73461c40718ab1", size = 13912596 }, + { url = "https://files.pythonhosted.org/packages/b9/14/78635daab4b07c0930c919d451b8bf8c164774e6a3413aed04a6d95758ce/numpy-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b258c385842546006213344c50655ff1555a9338e2e5e02a0756dc3e803dd", size = 19526099 }, + { url = "https://files.pythonhosted.org/packages/26/4c/0eeca4614003077f68bfe7aac8b7496f04221865b3a5e7cb230c9d055afd/numpy-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5fec9451a7789926bcf7c2b8d187292c9f93ea30284802a0ab3f5be8ab36865d", size = 19932823 }, + { url = "https://files.pythonhosted.org/packages/f1/46/ea25b98b13dccaebddf1a803f8c748680d972e00507cd9bc6dcdb5aa2ac1/numpy-2.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9189427407d88ff25ecf8f12469d4d39d35bee1db5d39fc5c168c6f088a6956d", size = 14404424 }, + { url = "https://files.pythonhosted.org/packages/c8/a6/177dd88d95ecf07e722d21008b1b40e681a929eb9e329684d449c36586b2/numpy-2.0.2-cp39-cp39-win32.whl", hash = "sha256:905d16e0c60200656500c95b6b8dca5d109e23cb24abc701d41c02d74c6b3afa", size = 6476809 }, + { url = "https://files.pythonhosted.org/packages/ea/2b/7fc9f4e7ae5b507c1a3a21f0f15ed03e794c1242ea8a242ac158beb56034/numpy-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:a3f4ab0caa7f053f6797fcd4e1e25caee367db3112ef2b6ef82d749530768c73", size = 15911314 }, + { url = "https://files.pythonhosted.org/packages/8f/3b/df5a870ac6a3be3a86856ce195ef42eec7ae50d2a202be1f5a4b3b340e14/numpy-2.0.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7f0a0c6f12e07fa94133c8a67404322845220c06a9e80e85999afe727f7438b8", size = 21025288 }, + { url = "https://files.pythonhosted.org/packages/2c/97/51af92f18d6f6f2d9ad8b482a99fb74e142d71372da5d834b3a2747a446e/numpy-2.0.2-pp39-pypy39_pp73-macosx_14_0_x86_64.whl", hash = "sha256:312950fdd060354350ed123c0e25a71327d3711584beaef30cdaa93320c392d4", size = 6762793 }, + { url = "https://files.pythonhosted.org/packages/12/46/de1fbd0c1b5ccaa7f9a005b66761533e2f6a3e560096682683a223631fe9/numpy-2.0.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26df23238872200f63518dd2aa984cfca675d82469535dc7162dc2ee52d9dd5c", size = 19334885 }, + { url = "https://files.pythonhosted.org/packages/cc/dc/d330a6faefd92b446ec0f0dfea4c3207bb1fef3c4771d19cf4543efd2c78/numpy-2.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a46288ec55ebbd58947d31d72be2c63cbf839f0a63b49cb755022310792a3385", size = 15828784 }, ] [[package]] name = "nvidia-cublas-cu12" -version = "12.1.3.1" +version = "12.4.5.8" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/37/6d/121efd7382d5b0284239f4ab1fc1590d86d34ed4a4a2fdb13b30ca8e5740/nvidia_cublas_cu12-12.1.3.1-py3-none-manylinux1_x86_64.whl", hash = "sha256:ee53ccca76a6fc08fb9701aa95b6ceb242cdaab118c3bb152af4e579af792728", size = 410594774 }, + { url = "https://files.pythonhosted.org/packages/7f/7f/7fbae15a3982dc9595e49ce0f19332423b260045d0a6afe93cdbe2f1f624/nvidia_cublas_cu12-12.4.5.8-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0f8aa1706812e00b9f19dfe0cdb3999b092ccb8ca168c0db5b8ea712456fd9b3", size = 363333771 }, + { url = "https://files.pythonhosted.org/packages/ae/71/1c91302526c45ab494c23f61c7a84aa568b8c1f9d196efa5993957faf906/nvidia_cublas_cu12-12.4.5.8-py3-none-manylinux2014_x86_64.whl", hash = "sha256:2fc8da60df463fdefa81e323eef2e36489e1c94335b5358bcb38360adf75ac9b", size = 363438805 }, ] [[package]] name = "nvidia-cuda-cupti-cu12" -version = "12.1.105" +version = "12.4.127" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/00/6b218edd739ecfc60524e585ba8e6b00554dd908de2c9c66c1af3e44e18d/nvidia_cuda_cupti_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:e54fde3983165c624cb79254ae9818a456eb6e87a7fd4d56a2352c24ee542d7e", size = 14109015 }, + { url = "https://files.pythonhosted.org/packages/93/b5/9fb3d00386d3361b03874246190dfec7b206fd74e6e287b26a8fcb359d95/nvidia_cuda_cupti_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:79279b35cf6f91da114182a5ce1864997fd52294a87a16179ce275773799458a", size = 12354556 }, + { url = "https://files.pythonhosted.org/packages/67/42/f4f60238e8194a3106d06a058d494b18e006c10bb2b915655bd9f6ea4cb1/nvidia_cuda_cupti_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:9dec60f5ac126f7bb551c055072b69d85392b13311fcc1bcda2202d172df30fb", size = 13813957 }, ] [[package]] name = "nvidia-cuda-nvrtc-cu12" -version = "12.1.105" +version = "12.4.127" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b6/9f/c64c03f49d6fbc56196664d05dba14e3a561038a81a638eeb47f4d4cfd48/nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:339b385f50c309763ca65456ec75e17bbefcbbf2893f462cb8b90584cd27a1c2", size = 23671734 }, + { url = "https://files.pythonhosted.org/packages/77/aa/083b01c427e963ad0b314040565ea396f914349914c298556484f799e61b/nvidia_cuda_nvrtc_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0eedf14185e04b76aa05b1fea04133e59f465b6f960c0cbf4e37c3cb6b0ea198", size = 24133372 }, + { url = "https://files.pythonhosted.org/packages/2c/14/91ae57cd4db3f9ef7aa99f4019cfa8d54cb4caa7e00975df6467e9725a9f/nvidia_cuda_nvrtc_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:a178759ebb095827bd30ef56598ec182b85547f1508941a3d560eb7ea1fbf338", size = 24640306 }, ] [[package]] name = "nvidia-cuda-runtime-cu12" -version = "12.1.105" +version = "12.4.127" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/eb/d5/c68b1d2cdfcc59e72e8a5949a37ddb22ae6cade80cd4a57a84d4c8b55472/nvidia_cuda_runtime_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:6e258468ddf5796e25f1dc591a31029fa317d97a0a94ed93468fc86301d61e40", size = 823596 }, + { url = "https://files.pythonhosted.org/packages/a1/aa/b656d755f474e2084971e9a297def515938d56b466ab39624012070cb773/nvidia_cuda_runtime_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:961fe0e2e716a2a1d967aab7caee97512f71767f852f67432d572e36cb3a11f3", size = 894177 }, + { url = "https://files.pythonhosted.org/packages/ea/27/1795d86fe88ef397885f2e580ac37628ed058a92ed2c39dc8eac3adf0619/nvidia_cuda_runtime_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:64403288fa2136ee8e467cdc9c9427e0434110899d07c779f25b5c068934faa5", size = 883737 }, ] [[package]] @@ -667,7 +718,7 @@ name = "nvidia-cudnn-cu12" version = "9.1.0.70" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-cublas-cu12", marker = "python_full_version >= '3.10'" }, + { name = "nvidia-cublas-cu12" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/9f/fd/713452cd72343f682b1c7b9321e23829f00b842ceaedcda96e742ea0b0b3/nvidia_cudnn_cu12-9.1.0.70-py3-none-manylinux2014_x86_64.whl", hash = "sha256:165764f44ef8c61fcdfdfdbe769d687e06374059fbb388b6c89ecb0e28793a6f", size = 664752741 }, @@ -675,68 +726,75 @@ wheels = [ [[package]] name = "nvidia-cufft-cu12" -version = "11.0.2.54" +version = "11.2.1.3" source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nvidia-nvjitlink-cu12" }, +] wheels = [ - { url = "https://files.pythonhosted.org/packages/86/94/eb540db023ce1d162e7bea9f8f5aa781d57c65aed513c33ee9a5123ead4d/nvidia_cufft_cu12-11.0.2.54-py3-none-manylinux1_x86_64.whl", hash = "sha256:794e3948a1aa71fd817c3775866943936774d1c14e7628c74f6f7417224cdf56", size = 121635161 }, + { url = "https://files.pythonhosted.org/packages/7a/8a/0e728f749baca3fbeffad762738276e5df60851958be7783af121a7221e7/nvidia_cufft_cu12-11.2.1.3-py3-none-manylinux2014_aarch64.whl", hash = "sha256:5dad8008fc7f92f5ddfa2101430917ce2ffacd86824914c82e28990ad7f00399", size = 211422548 }, + { url = "https://files.pythonhosted.org/packages/27/94/3266821f65b92b3138631e9c8e7fe1fb513804ac934485a8d05776e1dd43/nvidia_cufft_cu12-11.2.1.3-py3-none-manylinux2014_x86_64.whl", hash = "sha256:f083fc24912aa410be21fa16d157fed2055dab1cc4b6934a0e03cba69eb242b9", size = 211459117 }, ] [[package]] name = "nvidia-curand-cu12" -version = "10.3.2.106" +version = "10.3.5.147" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/44/31/4890b1c9abc496303412947fc7dcea3d14861720642b49e8ceed89636705/nvidia_curand_cu12-10.3.2.106-py3-none-manylinux1_x86_64.whl", hash = "sha256:9d264c5036dde4e64f1de8c50ae753237c12e0b1348738169cd0f8a536c0e1e0", size = 56467784 }, + { url = "https://files.pythonhosted.org/packages/80/9c/a79180e4d70995fdf030c6946991d0171555c6edf95c265c6b2bf7011112/nvidia_curand_cu12-10.3.5.147-py3-none-manylinux2014_aarch64.whl", hash = "sha256:1f173f09e3e3c76ab084aba0de819c49e56614feae5c12f69883f4ae9bb5fad9", size = 56314811 }, + { url = "https://files.pythonhosted.org/packages/8a/6d/44ad094874c6f1b9c654f8ed939590bdc408349f137f9b98a3a23ccec411/nvidia_curand_cu12-10.3.5.147-py3-none-manylinux2014_x86_64.whl", hash = "sha256:a88f583d4e0bb643c49743469964103aa59f7f708d862c3ddb0fc07f851e3b8b", size = 56305206 }, ] [[package]] name = "nvidia-cusolver-cu12" -version = "11.4.5.107" +version = "11.6.1.9" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-cublas-cu12", marker = "python_full_version >= '3.10'" }, - { name = "nvidia-cusparse-cu12", marker = "python_full_version >= '3.10'" }, - { name = "nvidia-nvjitlink-cu12", marker = "python_full_version >= '3.10'" }, + { name = "nvidia-cublas-cu12" }, + { name = "nvidia-cusparse-cu12" }, + { name = "nvidia-nvjitlink-cu12" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/bc/1d/8de1e5c67099015c834315e333911273a8c6aaba78923dd1d1e25fc5f217/nvidia_cusolver_cu12-11.4.5.107-py3-none-manylinux1_x86_64.whl", hash = "sha256:8a7ec542f0412294b15072fa7dab71d31334014a69f953004ea7a118206fe0dd", size = 124161928 }, + { url = "https://files.pythonhosted.org/packages/46/6b/a5c33cf16af09166845345275c34ad2190944bcc6026797a39f8e0a282e0/nvidia_cusolver_cu12-11.6.1.9-py3-none-manylinux2014_aarch64.whl", hash = "sha256:d338f155f174f90724bbde3758b7ac375a70ce8e706d70b018dd3375545fc84e", size = 127634111 }, + { url = "https://files.pythonhosted.org/packages/3a/e1/5b9089a4b2a4790dfdea8b3a006052cfecff58139d5a4e34cb1a51df8d6f/nvidia_cusolver_cu12-11.6.1.9-py3-none-manylinux2014_x86_64.whl", hash = "sha256:19e33fa442bcfd085b3086c4ebf7e8debc07cfe01e11513cc6d332fd918ac260", size = 127936057 }, ] [[package]] name = "nvidia-cusparse-cu12" -version = "12.1.0.106" +version = "12.3.1.170" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-nvjitlink-cu12", marker = "python_full_version >= '3.10'" }, + { name = "nvidia-nvjitlink-cu12" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/65/5b/cfaeebf25cd9fdec14338ccb16f6b2c4c7fa9163aefcf057d86b9cc248bb/nvidia_cusparse_cu12-12.1.0.106-py3-none-manylinux1_x86_64.whl", hash = "sha256:f3b50f42cf363f86ab21f720998517a659a48131e8d538dc02f8768237bd884c", size = 195958278 }, + { url = "https://files.pythonhosted.org/packages/96/a9/c0d2f83a53d40a4a41be14cea6a0bf9e668ffcf8b004bd65633f433050c0/nvidia_cusparse_cu12-12.3.1.170-py3-none-manylinux2014_aarch64.whl", hash = "sha256:9d32f62896231ebe0480efd8a7f702e143c98cfaa0e8a76df3386c1ba2b54df3", size = 207381987 }, + { url = "https://files.pythonhosted.org/packages/db/f7/97a9ea26ed4bbbfc2d470994b8b4f338ef663be97b8f677519ac195e113d/nvidia_cusparse_cu12-12.3.1.170-py3-none-manylinux2014_x86_64.whl", hash = "sha256:ea4f11a2904e2a8dc4b1833cc1b5181cde564edd0d5cd33e3c168eff2d1863f1", size = 207454763 }, ] [[package]] name = "nvidia-nccl-cu12" -version = "2.20.5" +version = "2.21.5" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/bb/d09dda47c881f9ff504afd6f9ca4f502ded6d8fc2f572cacc5e39da91c28/nvidia_nccl_cu12-2.20.5-py3-none-manylinux2014_aarch64.whl", hash = "sha256:1fc150d5c3250b170b29410ba682384b14581db722b2531b0d8d33c595f33d01", size = 176238458 }, - { url = "https://files.pythonhosted.org/packages/4b/2a/0a131f572aa09f741c30ccd45a8e56316e8be8dfc7bc19bf0ab7cfef7b19/nvidia_nccl_cu12-2.20.5-py3-none-manylinux2014_x86_64.whl", hash = "sha256:057f6bf9685f75215d0c53bf3ac4a10b3e6578351de307abad9e18a99182af56", size = 176249402 }, + { url = "https://files.pythonhosted.org/packages/df/99/12cd266d6233f47d00daf3a72739872bdc10267d0383508b0b9c84a18bb6/nvidia_nccl_cu12-2.21.5-py3-none-manylinux2014_x86_64.whl", hash = "sha256:8579076d30a8c24988834445f8d633c697d42397e92ffc3f63fa26766d25e0a0", size = 188654414 }, ] [[package]] name = "nvidia-nvjitlink-cu12" -version = "12.6.68" +version = "12.4.127" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/58/8c/69c9e39cd6bfa813852a94e9bd3c075045e2707d163e9dc2326c82d2c330/nvidia_nvjitlink_cu12-12.6.68-py3-none-manylinux2014_aarch64.whl", hash = "sha256:b3fd0779845f68b92063ab1393abab1ed0a23412fc520df79a8190d098b5cd6b", size = 19253287 }, - { url = "https://files.pythonhosted.org/packages/a8/48/a9775d377cb95585fb188b469387f58ba6738e268de22eae2ad4cedb2c41/nvidia_nvjitlink_cu12-12.6.68-py3-none-manylinux2014_x86_64.whl", hash = "sha256:125a6c2a44e96386dda634e13d944e60b07a0402d391a070e8fb4104b34ea1ab", size = 19725597 }, + { url = "https://files.pythonhosted.org/packages/02/45/239d52c05074898a80a900f49b1615d81c07fceadd5ad6c4f86a987c0bc4/nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:4abe7fef64914ccfa909bc2ba39739670ecc9e820c83ccc7a6ed414122599b83", size = 20552510 }, + { url = "https://files.pythonhosted.org/packages/ff/ff/847841bacfbefc97a00036e0fce5a0f086b640756dc38caea5e1bb002655/nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:06b3b9b25bf3f8af351d664978ca26a16d2c5127dbd53c0497e28d1fb9611d57", size = 21066810 }, ] [[package]] name = "nvidia-nvtx-cu12" -version = "12.1.105" +version = "12.4.127" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/da/d3/8057f0587683ed2fcd4dbfbdfdfa807b9160b809976099d36b8f60d08f03/nvidia_nvtx_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:dc21cf308ca5691e7c04d962e213f8a4aa9bbfa23d95412f452254c2caeb09e5", size = 99138 }, + { url = "https://files.pythonhosted.org/packages/06/39/471f581edbb7804b39e8063d92fc8305bdc7a80ae5c07dbe6ea5c50d14a5/nvidia_nvtx_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7959ad635db13edf4fc65c06a6e9f9e55fc2f92596db928d169c0bb031e88ef3", size = 100417 }, + { url = "https://files.pythonhosted.org/packages/87/20/199b8713428322a2f22b722c62b8cc278cc53dffa9705d744484b5035ee9/nvidia_nvtx_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:781e950d9b9f60d8241ccea575b32f5105a5baf4c2351cab5256a24869f12a1a", size = 99144 }, ] [[package]] @@ -771,7 +829,7 @@ name = "pexpect" version = "4.9.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "ptyprocess", marker = "python_full_version >= '3.10'" }, + { name = "ptyprocess" }, ] sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450 } wheels = [ @@ -780,11 +838,11 @@ wheels = [ [[package]] name = "platformdirs" -version = "4.2.2" +version = "4.3.6" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f5/52/0763d1d976d5c262df53ddda8d8d4719eedf9594d046f117c25a27261a19/platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3", size = 20916 } +sdist = { url = "https://files.pythonhosted.org/packages/13/fc/128cc9cb8f03208bdbf93d3aa862e16d376844a14f9a0ce5cf4507372de4/platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907", size = 21302 } wheels = [ - { url = "https://files.pythonhosted.org/packages/68/13/2aa1f0e1364feb2c9ef45302f387ac0bd81484e9c9a4c5688a322fbdfd08/platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee", size = 18146 }, + { url = "https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb", size = 18439 }, ] [[package]] @@ -798,30 +856,30 @@ wheels = [ [[package]] name = "pre-commit" -version = "3.8.0" +version = "4.0.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "cfgv", marker = "python_full_version >= '3.10'" }, - { name = "identify", marker = "python_full_version >= '3.10'" }, - { name = "nodeenv", marker = "python_full_version >= '3.10'" }, - { name = "pyyaml", marker = "python_full_version >= '3.10'" }, - { name = "virtualenv", marker = "python_full_version >= '3.10'" }, + { name = "cfgv" }, + { name = "identify" }, + { name = "nodeenv" }, + { name = "pyyaml" }, + { name = "virtualenv" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/64/10/97ee2fa54dff1e9da9badbc5e35d0bbaef0776271ea5907eccf64140f72f/pre_commit-3.8.0.tar.gz", hash = "sha256:8bb6494d4a20423842e198980c9ecf9f96607a07ea29549e180eef9ae80fe7af", size = 177815 } +sdist = { url = "https://files.pythonhosted.org/packages/2e/c8/e22c292035f1bac8b9f5237a2622305bc0304e776080b246f3df57c4ff9f/pre_commit-4.0.1.tar.gz", hash = "sha256:80905ac375958c0444c65e9cebebd948b3cdb518f335a091a670a89d652139d2", size = 191678 } wheels = [ - { url = "https://files.pythonhosted.org/packages/07/92/caae8c86e94681b42c246f0bca35c059a2f0529e5b92619f6aba4cf7e7b6/pre_commit-3.8.0-py2.py3-none-any.whl", hash = "sha256:9a90a53bf82fdd8778d58085faf8d83df56e40dfe18f45b19446e26bf1b3a63f", size = 204643 }, + { url = "https://files.pythonhosted.org/packages/16/8f/496e10d51edd6671ebe0432e33ff800aa86775d2d147ce7d43389324a525/pre_commit-4.0.1-py2.py3-none-any.whl", hash = "sha256:efde913840816312445dc98787724647c65473daefe420785f885e8ed9a06878", size = 218713 }, ] [[package]] name = "prompt-toolkit" -version = "3.0.47" +version = "3.0.48" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "wcwidth", marker = "python_full_version >= '3.10'" }, + { name = "wcwidth" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/47/6d/0279b119dafc74c1220420028d490c4399b790fc1256998666e3a341879f/prompt_toolkit-3.0.47.tar.gz", hash = "sha256:1e1b29cb58080b1e69f207c893a1a7bf16d127a5c30c9d17a25a5d77792e5360", size = 425859 } +sdist = { url = "https://files.pythonhosted.org/packages/2d/4f/feb5e137aff82f7c7f3248267b97451da3644f6cdc218edfe549fb354127/prompt_toolkit-3.0.48.tar.gz", hash = "sha256:d6623ab0477a80df74e646bdbc93621143f5caf104206aa29294d53de1a03d90", size = 424684 } wheels = [ - { url = "https://files.pythonhosted.org/packages/e8/23/22750c4b768f09386d1c3cc4337953e8936f48a888fa6dddfb669b2c9088/prompt_toolkit-3.0.47-py3-none-any.whl", hash = "sha256:0d7bfa67001d5e39d02c224b663abc33687405033a8c422d0d675a5a13361d10", size = 386411 }, + { url = "https://files.pythonhosted.org/packages/a9/6a/fd08d94654f7e67c52ca30523a178b3f8ccc4237fce4be90d39c938a831a/prompt_toolkit-3.0.48-py3-none-any.whl", hash = "sha256:f49a827f90062e411f1ce1f854f2aedb3c23353244f8108b89283587397ac10e", size = 386595 }, ] [[package]] @@ -853,19 +911,19 @@ wheels = [ [[package]] name = "pytest" -version = "8.3.2" +version = "8.3.3" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "colorama", marker = "python_full_version >= '3.10' and sys_platform == 'win32'" }, - { name = "exceptiongroup", marker = "python_full_version == '3.10.*'" }, - { name = "iniconfig", marker = "python_full_version >= '3.10'" }, - { name = "packaging", marker = "python_full_version >= '3.10'" }, - { name = "pluggy", marker = "python_full_version >= '3.10'" }, - { name = "tomli", marker = "python_full_version == '3.10.*'" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b4/8c/9862305bdcd6020bc7b45b1b5e7397a6caf1a33d3025b9a003b39075ffb2/pytest-8.3.2.tar.gz", hash = "sha256:c132345d12ce551242c87269de812483f5bcc87cdbb4722e48487ba194f9fdce", size = 1439314 } +sdist = { url = "https://files.pythonhosted.org/packages/8b/6c/62bbd536103af674e227c41a8f3dcd022d591f6eed5facb5a0f31ee33bbc/pytest-8.3.3.tar.gz", hash = "sha256:70b98107bd648308a7952b06e6ca9a50bc660be218d53c257cc1fc94fda10181", size = 1442487 } wheels = [ - { url = "https://files.pythonhosted.org/packages/0f/f9/cf155cf32ca7d6fa3601bc4c5dd19086af4b320b706919d48a4c79081cf9/pytest-8.3.2-py3-none-any.whl", hash = "sha256:4ba08f9ae7dcf84ded419494d229b48d0903ea6407b030eaec46df5e6a73bba5", size = 341802 }, + { url = "https://files.pythonhosted.org/packages/6b/77/7440a06a8ead44c7757a64362dd22df5760f9b12dc5f11b6188cd2fc27a0/pytest-8.3.3-py3-none-any.whl", hash = "sha256:a6853c7375b2663155079443d2e45de913a911a11d669df02a50814944db57b2", size = 342341 }, ] [[package]] @@ -873,8 +931,8 @@ name = "pytest-cov" version = "5.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "coverage", extra = ["toml"], marker = "python_full_version >= '3.10'" }, - { name = "pytest", marker = "python_full_version >= '3.10'" }, + { name = "coverage", extra = ["toml"] }, + { name = "pytest" }, ] sdist = { url = "https://files.pythonhosted.org/packages/74/67/00efc8d11b630c56f15f4ad9c7f9223f1e5ec275aaae3fa9118c6a223ad2/pytest-cov-5.0.0.tar.gz", hash = "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857", size = 63042 } wheels = [ @@ -886,7 +944,7 @@ name = "pytest-cover" version = "3.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pytest-cov", marker = "python_full_version >= '3.10'" }, + { name = "pytest-cov" }, ] sdist = { url = "https://files.pythonhosted.org/packages/30/27/20964101a7cdb260f8d6c4e854659026968321d10c90552b1fe7f6c5f913/pytest-cover-3.0.0.tar.gz", hash = "sha256:5bdb6c1cc3dd75583bb7bc2c57f5e1034a1bfcb79d27c71aceb0b16af981dbf4", size = 3211 } wheels = [ @@ -898,7 +956,7 @@ name = "pytest-coverage" version = "0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pytest-cover", marker = "python_full_version >= '3.10'" }, + { name = "pytest-cover" }, ] sdist = { url = "https://files.pythonhosted.org/packages/01/81/1d954849aed17b254d1c397eb4447a05eedce612a56b627c071df2ce00c1/pytest-coverage-0.0.tar.gz", hash = "sha256:db6af2cbd7e458c7c9fd2b4207cee75258243c8a81cad31a7ee8cfad5be93c05", size = 873 } wheels = [ @@ -960,72 +1018,87 @@ wheels = [ [[package]] name = "regex" -version = "2024.7.24" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3f/51/64256d0dc72816a4fe3779449627c69ec8fee5a5625fd60ba048f53b3478/regex-2024.7.24.tar.gz", hash = "sha256:9cfd009eed1a46b27c14039ad5bbc5e71b6367c5b2e6d5f5da0ea91600817506", size = 393485 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/16/97/283bd32777e6c30a9bede976cd72ba4b9aa144dc0f0f462bd37fa1a86e01/regex-2024.7.24-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b0d3f567fafa0633aee87f08b9276c7062da9616931382993c03808bb68ce", size = 470812 }, - { url = "https://files.pythonhosted.org/packages/e4/80/80bc4d7329d04ba519ebcaf26ae21d9e30d33934c458691177c623ceff70/regex-2024.7.24-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3426de3b91d1bc73249042742f45c2148803c111d1175b283270177fdf669024", size = 282129 }, - { url = "https://files.pythonhosted.org/packages/e5/8a/cddcb7942d05ad9a427ad97ab29f1a62c0607ab72bdb2f3a26fc5b07ac0f/regex-2024.7.24-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f273674b445bcb6e4409bf8d1be67bc4b58e8b46fd0d560055d515b8830063cd", size = 278909 }, - { url = "https://files.pythonhosted.org/packages/a6/d4/93b4011cb83f9a66e0fa398b4d3c6d564d94b686dace676c66502b13dae9/regex-2024.7.24-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23acc72f0f4e1a9e6e9843d6328177ae3074b4182167e34119ec7233dfeccf53", size = 777687 }, - { url = "https://files.pythonhosted.org/packages/d0/11/d0a12e1cecc1d35bbcbeb99e2ddcb8c1b152b1b58e2ff55f50c3d762b09e/regex-2024.7.24-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65fd3d2e228cae024c411c5ccdffae4c315271eee4a8b839291f84f796b34eca", size = 818982 }, - { url = "https://files.pythonhosted.org/packages/ae/41/01a073765d75427e24710af035d8f0a773b5cedf23f61b63e7ef2ce960d6/regex-2024.7.24-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c414cbda77dbf13c3bc88b073a1a9f375c7b0cb5e115e15d4b73ec3a2fbc6f59", size = 804015 }, - { url = "https://files.pythonhosted.org/packages/3e/66/04b63f31580026c8b819aed7f171149177d10cfab27477ea8800a2268d50/regex-2024.7.24-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf7a89eef64b5455835f5ed30254ec19bf41f7541cd94f266ab7cbd463f00c41", size = 776517 }, - { url = "https://files.pythonhosted.org/packages/be/49/0c08a7a232e4e26e17afeedf13f331224d9377dde4876ed6e21e4a584a5d/regex-2024.7.24-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19c65b00d42804e3fbea9708f0937d157e53429a39b7c61253ff15670ff62cb5", size = 766860 }, - { url = "https://files.pythonhosted.org/packages/24/44/35769388845cdd7be97e1232a59446b738054b61bc9c92a3b0bacfaf7bb1/regex-2024.7.24-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7a5486ca56c8869070a966321d5ab416ff0f83f30e0e2da1ab48815c8d165d46", size = 692181 }, - { url = "https://files.pythonhosted.org/packages/50/be/4e09d5bc8de176153f209c95ca4e64b9def1748d693694a95dd4401ee7be/regex-2024.7.24-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6f51f9556785e5a203713f5efd9c085b4a45aecd2a42573e2b5041881b588d1f", size = 762956 }, - { url = "https://files.pythonhosted.org/packages/90/63/b37152f25fe348aa31806bafa91df607d096e8f477fed9a5cf3de339dd5f/regex-2024.7.24-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:a4997716674d36a82eab3e86f8fa77080a5d8d96a389a61ea1d0e3a94a582cf7", size = 771978 }, - { url = "https://files.pythonhosted.org/packages/ab/ac/38186431f7c1874e3f790669be933accf1090ee53aba0ab1a811ef38f07e/regex-2024.7.24-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:c0abb5e4e8ce71a61d9446040c1e86d4e6d23f9097275c5bd49ed978755ff0fe", size = 840800 }, - { url = "https://files.pythonhosted.org/packages/e8/23/91b04dbf51a2c0ddf5b1e055e9e05ed091ebcf46f2b0e6e3d2fff121f903/regex-2024.7.24-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:18300a1d78cf1290fa583cd8b7cde26ecb73e9f5916690cf9d42de569c89b1ce", size = 838991 }, - { url = "https://files.pythonhosted.org/packages/36/fd/822110cc14b99bdd7d8c61487bc774f454120cd3d7492935bf13f3399716/regex-2024.7.24-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:416c0e4f56308f34cdb18c3f59849479dde5b19febdcd6e6fa4d04b6c31c9faa", size = 767539 }, - { url = "https://files.pythonhosted.org/packages/82/54/e24a8adfca74f9a421cd47657c51413919e7755e729608de6f4c5556e002/regex-2024.7.24-cp310-cp310-win32.whl", hash = "sha256:fb168b5924bef397b5ba13aabd8cf5df7d3d93f10218d7b925e360d436863f66", size = 257712 }, - { url = "https://files.pythonhosted.org/packages/fb/cc/6485c2fc72d0de9b55392246b80921639f1be62bed1e33e982940306b5ba/regex-2024.7.24-cp310-cp310-win_amd64.whl", hash = "sha256:6b9fc7e9cc983e75e2518496ba1afc524227c163e43d706688a6bb9eca41617e", size = 269661 }, - { url = "https://files.pythonhosted.org/packages/cb/ec/261f8434a47685d61e59a4ef3d9ce7902af521219f3ebd2194c7adb171a6/regex-2024.7.24-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:382281306e3adaaa7b8b9ebbb3ffb43358a7bbf585fa93821300a418bb975281", size = 470810 }, - { url = "https://files.pythonhosted.org/packages/f0/47/f33b1cac88841f95fff862476a9e875d9a10dae6912a675c6f13c128e5d9/regex-2024.7.24-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4fdd1384619f406ad9037fe6b6eaa3de2749e2e12084abc80169e8e075377d3b", size = 282126 }, - { url = "https://files.pythonhosted.org/packages/fc/1b/256ca4e2d5041c0aa2f1dc222f04412b796346ab9ce2aa5147405a9457b4/regex-2024.7.24-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3d974d24edb231446f708c455fd08f94c41c1ff4f04bcf06e5f36df5ef50b95a", size = 278920 }, - { url = "https://files.pythonhosted.org/packages/91/03/4603ec057c0bafd2f6f50b0bdda4b12a0ff81022decf1de007b485c356a6/regex-2024.7.24-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2ec4419a3fe6cf8a4795752596dfe0adb4aea40d3683a132bae9c30b81e8d73", size = 785420 }, - { url = "https://files.pythonhosted.org/packages/75/f8/13b111fab93e6273e26de2926345e5ecf6ddad1e44c4d419d7b0924f9c52/regex-2024.7.24-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb563dd3aea54c797adf513eeec819c4213d7dbfc311874eb4fd28d10f2ff0f2", size = 828164 }, - { url = "https://files.pythonhosted.org/packages/4a/80/bc3b9d31bd47ff578758af929af0ac1d6169b247e26fa6e87764007f3d93/regex-2024.7.24-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:45104baae8b9f67569f0f1dca5e1f1ed77a54ae1cd8b0b07aba89272710db61e", size = 812621 }, - { url = "https://files.pythonhosted.org/packages/8b/77/92d4a14530900d46dddc57b728eea65d723cc9fcfd07b96c2c141dabba84/regex-2024.7.24-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:994448ee01864501912abf2bad9203bffc34158e80fe8bfb5b031f4f8e16da51", size = 786609 }, - { url = "https://files.pythonhosted.org/packages/35/58/06695fd8afad4c8ed0a53ec5e222156398b9fe5afd58887ab94ea68e4d16/regex-2024.7.24-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3fac296f99283ac232d8125be932c5cd7644084a30748fda013028c815ba3364", size = 775290 }, - { url = "https://files.pythonhosted.org/packages/1b/0f/50b97ee1fc6965744b9e943b5c0f3740792ab54792df73d984510964ef29/regex-2024.7.24-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7e37e809b9303ec3a179085415cb5f418ecf65ec98cdfe34f6a078b46ef823ee", size = 772849 }, - { url = "https://files.pythonhosted.org/packages/8f/64/565ff6cf241586ab7ae76bb4138c4d29bc1d1780973b457c2db30b21809a/regex-2024.7.24-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:01b689e887f612610c869421241e075c02f2e3d1ae93a037cb14f88ab6a8934c", size = 778428 }, - { url = "https://files.pythonhosted.org/packages/e5/fe/4ceabf4382e44e1e096ac46fd5e3bca490738b24157116a48270fd542e88/regex-2024.7.24-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f6442f0f0ff81775eaa5b05af8a0ffa1dda36e9cf6ec1e0d3d245e8564b684ce", size = 849436 }, - { url = "https://files.pythonhosted.org/packages/68/23/1868e40d6b594843fd1a3498ffe75d58674edfc90d95e18dd87865b93bf2/regex-2024.7.24-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:871e3ab2838fbcb4e0865a6e01233975df3a15e6fce93b6f99d75cacbd9862d1", size = 849484 }, - { url = "https://files.pythonhosted.org/packages/f3/52/bff76de2f6e2bc05edce3abeb7e98e6309aa022fc06071100a0216fbeb50/regex-2024.7.24-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c918b7a1e26b4ab40409820ddccc5d49871a82329640f5005f73572d5eaa9b5e", size = 776712 }, - { url = "https://files.pythonhosted.org/packages/f2/72/70ade7b0b5fe5c6df38fdfa2a5a8273e3ea6a10b772aa671b7e889e78bae/regex-2024.7.24-cp311-cp311-win32.whl", hash = "sha256:2dfbb8baf8ba2c2b9aa2807f44ed272f0913eeeba002478c4577b8d29cde215c", size = 257716 }, - { url = "https://files.pythonhosted.org/packages/04/4d/80e04f4e27ab0cbc9096e2d10696da6d9c26a39b60db52670fd57614fea5/regex-2024.7.24-cp311-cp311-win_amd64.whl", hash = "sha256:538d30cd96ed7d1416d3956f94d54e426a8daf7c14527f6e0d6d425fcb4cca52", size = 269662 }, - { url = "https://files.pythonhosted.org/packages/0f/26/f505782f386ac0399a9237571833f187414882ab6902e2e71a1ecb506835/regex-2024.7.24-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:fe4ebef608553aff8deb845c7f4f1d0740ff76fa672c011cc0bacb2a00fbde86", size = 471748 }, - { url = "https://files.pythonhosted.org/packages/bb/1d/ea9a21beeb433dbfca31ab82867d69cb67ff8674af9fab6ebd55fa9d3387/regex-2024.7.24-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:74007a5b25b7a678459f06559504f1eec2f0f17bca218c9d56f6a0a12bfffdad", size = 282841 }, - { url = "https://files.pythonhosted.org/packages/9b/f2/c6182095baf0a10169c34e87133a8e73b2e816a80035669b1278e927685e/regex-2024.7.24-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7df9ea48641da022c2a3c9c641650cd09f0cd15e8908bf931ad538f5ca7919c9", size = 279114 }, - { url = "https://files.pythonhosted.org/packages/72/58/b5161bf890b6ca575a25685f19a4a3e3b6f4a072238814f8658123177d84/regex-2024.7.24-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a1141a1dcc32904c47f6846b040275c6e5de0bf73f17d7a409035d55b76f289", size = 789749 }, - { url = "https://files.pythonhosted.org/packages/09/fb/5381b19b62f3a3494266be462f6a015a869cf4bfd8e14d6e7db67e2c8069/regex-2024.7.24-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80c811cfcb5c331237d9bad3bea2c391114588cf4131707e84d9493064d267f9", size = 831666 }, - { url = "https://files.pythonhosted.org/packages/3d/6d/2a21c85f970f9be79357d12cf4b97f4fc6bf3bf6b843c39dabbc4e5f1181/regex-2024.7.24-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7214477bf9bd195894cf24005b1e7b496f46833337b5dedb7b2a6e33f66d962c", size = 817544 }, - { url = "https://files.pythonhosted.org/packages/f9/ae/5f23e64f6cf170614237c654f3501a912dfb8549143d4b91d1cd13dba319/regex-2024.7.24-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d55588cba7553f0b6ec33130bc3e114b355570b45785cebdc9daed8c637dd440", size = 790854 }, - { url = "https://files.pythonhosted.org/packages/29/0a/d04baad1bbc49cdfb4aef90c4fc875a60aaf96d35a1616f1dfe8149716bc/regex-2024.7.24-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:558a57cfc32adcf19d3f791f62b5ff564922942e389e3cfdb538a23d65a6b610", size = 779242 }, - { url = "https://files.pythonhosted.org/packages/3a/27/b242a962f650c3213da4596d70e24c7c1c46e3aa0f79f2a81164291085f8/regex-2024.7.24-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a512eed9dfd4117110b1881ba9a59b31433caed0c4101b361f768e7bcbaf93c5", size = 776932 }, - { url = "https://files.pythonhosted.org/packages/9c/ae/de659bdfff80ad2c0b577a43dd89dbc43870a4fc4bbf604e452196758e83/regex-2024.7.24-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:86b17ba823ea76256b1885652e3a141a99a5c4422f4a869189db328321b73799", size = 784521 }, - { url = "https://files.pythonhosted.org/packages/d4/ac/eb6a796da0bdefbf09644a7868309423b18d344cf49963a9d36c13502d46/regex-2024.7.24-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5eefee9bfe23f6df09ffb6dfb23809f4d74a78acef004aa904dc7c88b9944b05", size = 854548 }, - { url = "https://files.pythonhosted.org/packages/56/77/fde8d825dec69e70256e0925af6c81eea9acf0a634d3d80f619d8dcd6888/regex-2024.7.24-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:731fcd76bbdbf225e2eb85b7c38da9633ad3073822f5ab32379381e8c3c12e94", size = 853345 }, - { url = "https://files.pythonhosted.org/packages/ff/04/2b79ad0bb9bc05ab4386caa2c19aa047a66afcbdfc2640618ffc729841e4/regex-2024.7.24-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:eaef80eac3b4cfbdd6de53c6e108b4c534c21ae055d1dbea2de6b3b8ff3def38", size = 781414 }, - { url = "https://files.pythonhosted.org/packages/bf/71/d0af58199283ada7d25b20e416f5b155f50aad99b0e791c0966ff5a1cd00/regex-2024.7.24-cp312-cp312-win32.whl", hash = "sha256:185e029368d6f89f36e526764cf12bf8d6f0e3a2a7737da625a76f594bdfcbfc", size = 258125 }, - { url = "https://files.pythonhosted.org/packages/95/b3/10e875c45c60b010b66fc109b899c6fc4f05d485fe1d54abff98ce791124/regex-2024.7.24-cp312-cp312-win_amd64.whl", hash = "sha256:2f1baff13cc2521bea83ab2528e7a80cbe0ebb2c6f0bfad15be7da3aed443908", size = 269162 }, - { url = "https://files.pythonhosted.org/packages/dc/c6/78f26fe25efb7bec46028eff4db9fae07852defc7d2fe48fcbdba47ff3d1/regex-2024.7.24-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0ffe3f9d430cd37d8fa5632ff6fb36d5b24818c5c986893063b4e5bdb84cdf24", size = 470815 }, - { url = "https://files.pythonhosted.org/packages/3d/c9/580ff2b99482ca90785e28720269f352a015f30430bb583ff7bcc519bb9a/regex-2024.7.24-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:25419b70ba00a16abc90ee5fce061228206173231f004437730b67ac77323f0d", size = 282117 }, - { url = "https://files.pythonhosted.org/packages/14/58/283c749340e4d7aad87a1fb93c6bf11f377a0da8aaff6f7f863b28050752/regex-2024.7.24-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:33e2614a7ce627f0cdf2ad104797d1f68342d967de3695678c0cb84f530709f8", size = 278915 }, - { url = "https://files.pythonhosted.org/packages/3a/72/2667206ef348d8e4cdd349d6f0e064002e8d393b66093181d1a865b94a11/regex-2024.7.24-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d33a0021893ede5969876052796165bab6006559ab845fd7b515a30abdd990dc", size = 777146 }, - { url = "https://files.pythonhosted.org/packages/93/14/a9123402a27d1a11d034cb51236a9f6e5ba01a38e8599ede95d46e4362fa/regex-2024.7.24-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04ce29e2c5fedf296b1a1b0acc1724ba93a36fb14031f3abfb7abda2806c1535", size = 818435 }, - { url = "https://files.pythonhosted.org/packages/04/72/fbab33403723b661cbfed09c635bf6ecfc07268df1a56555d19f6f0da6af/regex-2024.7.24-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b16582783f44fbca6fcf46f61347340c787d7530d88b4d590a397a47583f31dd", size = 803404 }, - { url = "https://files.pythonhosted.org/packages/36/67/851cf82e2c47d46846cca15ba84f845e876257a54cb82f229d335cd5c67e/regex-2024.7.24-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:836d3cc225b3e8a943d0b02633fb2f28a66e281290302a79df0e1eaa984ff7c1", size = 775901 }, - { url = "https://files.pythonhosted.org/packages/7f/02/19abc35bbc20f05d4a4147319923dc880c4005a01917d41b3340bf0f84ae/regex-2024.7.24-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:438d9f0f4bc64e8dea78274caa5af971ceff0f8771e1a2333620969936ba10be", size = 766357 }, - { url = "https://files.pythonhosted.org/packages/18/fb/1e35f8cfe3cd1a086449db7bbf91b6e0051b91ebb71e67915b1b01d3a3cf/regex-2024.7.24-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:973335b1624859cb0e52f96062a28aa18f3a5fc77a96e4a3d6d76e29811a0e6e", size = 691636 }, - { url = "https://files.pythonhosted.org/packages/46/29/3561d53e0cb7a1d98385206a133988616637f98a4517ada9b714d6dff5c9/regex-2024.7.24-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c5e69fd3eb0b409432b537fe3c6f44ac089c458ab6b78dcec14478422879ec5f", size = 762342 }, - { url = "https://files.pythonhosted.org/packages/28/8b/f7fb2feb45e2c16e6e49c55979519c7ac76f3432267bf64d4aabd5d3b47b/regex-2024.7.24-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:fbf8c2f00904eaf63ff37718eb13acf8e178cb940520e47b2f05027f5bb34ce3", size = 771548 }, - { url = "https://files.pythonhosted.org/packages/03/d1/629e72e8f04639e6fadfe67b8823cc94fdcd19192b0175bd086950fefca8/regex-2024.7.24-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ae2757ace61bc4061b69af19e4689fa4416e1a04840f33b441034202b5cd02d4", size = 840214 }, - { url = "https://files.pythonhosted.org/packages/44/af/e523b6e074f90c0471d25898916d05a1b7a774b259be192f8bc6683c5966/regex-2024.7.24-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:44fc61b99035fd9b3b9453f1713234e5a7c92a04f3577252b45feefe1b327759", size = 838533 }, - { url = "https://files.pythonhosted.org/packages/3c/2a/af44a6747d1c331234f57d48cf2dcab221770cd755a7c16b5c358b485952/regex-2024.7.24-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:84c312cdf839e8b579f504afcd7b65f35d60b6285d892b19adea16355e8343c9", size = 767083 }, - { url = "https://files.pythonhosted.org/packages/90/86/865208eb0f0790d3e4c726d291acc5cbbfed4c5133a44dc99d7d746ff0bf/regex-2024.7.24-cp39-cp39-win32.whl", hash = "sha256:ca5b2028c2f7af4e13fb9fc29b28d0ce767c38c7facdf64f6c2cd040413055f1", size = 257737 }, - { url = "https://files.pythonhosted.org/packages/7f/61/b60849cd13f26a25b7aa61a0118c86c76b933a032d38b4657f4baeaeab5b/regex-2024.7.24-cp39-cp39-win_amd64.whl", hash = "sha256:7c479f5ae937ec9985ecaf42e2e10631551d909f203e31308c12d703922742f9", size = 269711 }, +version = "2024.9.11" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/38/148df33b4dbca3bd069b963acab5e0fa1a9dbd6820f8c322d0dd6faeff96/regex-2024.9.11.tar.gz", hash = "sha256:6c188c307e8433bcb63dc1915022deb553b4203a70722fc542c363bf120a01fd", size = 399403 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/12/497bd6599ce8a239ade68678132296aec5ee25ebea45fc8ba91aa60fceec/regex-2024.9.11-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1494fa8725c285a81d01dc8c06b55287a1ee5e0e382d8413adc0a9197aac6408", size = 482488 }, + { url = "https://files.pythonhosted.org/packages/c1/24/595ddb9bec2a9b151cdaf9565b0c9f3da9f0cb1dca6c158bc5175332ddf8/regex-2024.9.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0e12c481ad92d129c78f13a2a3662317e46ee7ef96c94fd332e1c29131875b7d", size = 287443 }, + { url = "https://files.pythonhosted.org/packages/69/a8/b2fb45d9715b1469383a0da7968f8cacc2f83e9fbbcd6b8713752dd980a6/regex-2024.9.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:16e13a7929791ac1216afde26f712802e3df7bf0360b32e4914dca3ab8baeea5", size = 284561 }, + { url = "https://files.pythonhosted.org/packages/88/87/1ce4a5357216b19b7055e7d3b0efc75a6e426133bf1e7d094321df514257/regex-2024.9.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46989629904bad940bbec2106528140a218b4a36bb3042d8406980be1941429c", size = 783177 }, + { url = "https://files.pythonhosted.org/packages/3c/65/b9f002ab32f7b68e7d1dcabb67926f3f47325b8dbc22cc50b6a043e1d07c/regex-2024.9.11-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a906ed5e47a0ce5f04b2c981af1c9acf9e8696066900bf03b9d7879a6f679fc8", size = 823193 }, + { url = "https://files.pythonhosted.org/packages/22/91/8339dd3abce101204d246e31bc26cdd7ec07c9f91598472459a3a902aa41/regex-2024.9.11-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9a091b0550b3b0207784a7d6d0f1a00d1d1c8a11699c1a4d93db3fbefc3ad35", size = 809950 }, + { url = "https://files.pythonhosted.org/packages/cb/19/556638aa11c2ec9968a1da998f07f27ec0abb9bf3c647d7c7985ca0b8eea/regex-2024.9.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ddcd9a179c0a6fa8add279a4444015acddcd7f232a49071ae57fa6e278f1f71", size = 782661 }, + { url = "https://files.pythonhosted.org/packages/d1/e9/7a5bc4c6ef8d9cd2bdd83a667888fc35320da96a4cc4da5fa084330f53db/regex-2024.9.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6b41e1adc61fa347662b09398e31ad446afadff932a24807d3ceb955ed865cc8", size = 772348 }, + { url = "https://files.pythonhosted.org/packages/f1/0b/29f2105bfac3ed08e704914c38e93b07c784a6655f8a015297ee7173e95b/regex-2024.9.11-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ced479f601cd2f8ca1fd7b23925a7e0ad512a56d6e9476f79b8f381d9d37090a", size = 697460 }, + { url = "https://files.pythonhosted.org/packages/71/3a/52ff61054d15a4722605f5872ad03962b319a04c1ebaebe570b8b9b7dde1/regex-2024.9.11-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:635a1d96665f84b292e401c3d62775851aedc31d4f8784117b3c68c4fcd4118d", size = 769151 }, + { url = "https://files.pythonhosted.org/packages/97/07/37e460ab5ca84be8e1e197c3b526c5c86993dcc9e13cbc805c35fc2463c1/regex-2024.9.11-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c0256beda696edcf7d97ef16b2a33a8e5a875affd6fa6567b54f7c577b30a137", size = 777478 }, + { url = "https://files.pythonhosted.org/packages/65/7b/953075723dd5ab00780043ac2f9de667306ff9e2a85332975e9f19279174/regex-2024.9.11-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:3ce4f1185db3fbde8ed8aa223fc9620f276c58de8b0d4f8cc86fd1360829edb6", size = 845373 }, + { url = "https://files.pythonhosted.org/packages/40/b8/3e9484c6230b8b6e8f816ab7c9a080e631124991a4ae2c27a81631777db0/regex-2024.9.11-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:09d77559e80dcc9d24570da3745ab859a9cf91953062e4ab126ba9d5993688ca", size = 845369 }, + { url = "https://files.pythonhosted.org/packages/b7/99/38434984d912edbd2e1969d116257e869578f67461bd7462b894c45ed874/regex-2024.9.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7a22ccefd4db3f12b526eccb129390942fe874a3a9fdbdd24cf55773a1faab1a", size = 773935 }, + { url = "https://files.pythonhosted.org/packages/ab/67/43174d2b46fa947b7b9dfe56b6c8a8a76d44223f35b1d64645a732fd1d6f/regex-2024.9.11-cp310-cp310-win32.whl", hash = "sha256:f745ec09bc1b0bd15cfc73df6fa4f726dcc26bb16c23a03f9e3367d357eeedd0", size = 261624 }, + { url = "https://files.pythonhosted.org/packages/c4/2a/4f9c47d9395b6aff24874c761d8d620c0232f97c43ef3cf668c8b355e7a7/regex-2024.9.11-cp310-cp310-win_amd64.whl", hash = "sha256:01c2acb51f8a7d6494c8c5eafe3d8e06d76563d8a8a4643b37e9b2dd8a2ff623", size = 274020 }, + { url = "https://files.pythonhosted.org/packages/86/a1/d526b7b6095a0019aa360948c143aacfeb029919c898701ce7763bbe4c15/regex-2024.9.11-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2cce2449e5927a0bf084d346da6cd5eb016b2beca10d0013ab50e3c226ffc0df", size = 482483 }, + { url = "https://files.pythonhosted.org/packages/32/d9/bfdd153179867c275719e381e1e8e84a97bd186740456a0dcb3e7125c205/regex-2024.9.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b37fa423beefa44919e009745ccbf353d8c981516e807995b2bd11c2c77d268", size = 287442 }, + { url = "https://files.pythonhosted.org/packages/33/c4/60f3370735135e3a8d673ddcdb2507a8560d0e759e1398d366e43d000253/regex-2024.9.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:64ce2799bd75039b480cc0360907c4fb2f50022f030bf9e7a8705b636e408fad", size = 284561 }, + { url = "https://files.pythonhosted.org/packages/b1/51/91a5ebdff17f9ec4973cb0aa9d37635efec1c6868654bbc25d1543aca4ec/regex-2024.9.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4cc92bb6db56ab0c1cbd17294e14f5e9224f0cc6521167ef388332604e92679", size = 791779 }, + { url = "https://files.pythonhosted.org/packages/07/4a/022c5e6f0891a90cd7eb3d664d6c58ce2aba48bff107b00013f3d6167069/regex-2024.9.11-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d05ac6fa06959c4172eccd99a222e1fbf17b5670c4d596cb1e5cde99600674c4", size = 832605 }, + { url = "https://files.pythonhosted.org/packages/ac/1c/3793990c8c83ca04e018151ddda83b83ecc41d89964f0f17749f027fc44d/regex-2024.9.11-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:040562757795eeea356394a7fb13076ad4f99d3c62ab0f8bdfb21f99a1f85664", size = 818556 }, + { url = "https://files.pythonhosted.org/packages/e9/5c/8b385afbfacb853730682c57be56225f9fe275c5bf02ac1fc88edbff316d/regex-2024.9.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6113c008a7780792efc80f9dfe10ba0cd043cbf8dc9a76ef757850f51b4edc50", size = 792808 }, + { url = "https://files.pythonhosted.org/packages/9b/8b/a4723a838b53c771e9240951adde6af58c829fb6a6a28f554e8131f53839/regex-2024.9.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e5fb5f77c8745a60105403a774fe2c1759b71d3e7b4ca237a5e67ad066c7199", size = 781115 }, + { url = "https://files.pythonhosted.org/packages/83/5f/031a04b6017033d65b261259c09043c06f4ef2d4eac841d0649d76d69541/regex-2024.9.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:54d9ff35d4515debf14bc27f1e3b38bfc453eff3220f5bce159642fa762fe5d4", size = 778155 }, + { url = "https://files.pythonhosted.org/packages/fd/cd/4660756070b03ce4a66663a43f6c6e7ebc2266cc6b4c586c167917185eb4/regex-2024.9.11-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:df5cbb1fbc74a8305b6065d4ade43b993be03dbe0f8b30032cced0d7740994bd", size = 784614 }, + { url = "https://files.pythonhosted.org/packages/93/8d/65b9bea7df120a7be8337c415b6d256ba786cbc9107cebba3bf8ff09da99/regex-2024.9.11-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7fb89ee5d106e4a7a51bce305ac4efb981536301895f7bdcf93ec92ae0d91c7f", size = 853744 }, + { url = "https://files.pythonhosted.org/packages/96/a7/fba1eae75eb53a704475baf11bd44b3e6ccb95b316955027eb7748f24ef8/regex-2024.9.11-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:a738b937d512b30bf75995c0159c0ddf9eec0775c9d72ac0202076c72f24aa96", size = 855890 }, + { url = "https://files.pythonhosted.org/packages/45/14/d864b2db80a1a3358534392373e8a281d95b28c29c87d8548aed58813910/regex-2024.9.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e28f9faeb14b6f23ac55bfbbfd3643f5c7c18ede093977f1df249f73fd22c7b1", size = 781887 }, + { url = "https://files.pythonhosted.org/packages/4d/a9/bfb29b3de3eb11dc9b412603437023b8e6c02fb4e11311863d9bf62c403a/regex-2024.9.11-cp311-cp311-win32.whl", hash = "sha256:18e707ce6c92d7282dfce370cd205098384b8ee21544e7cb29b8aab955b66fa9", size = 261644 }, + { url = "https://files.pythonhosted.org/packages/c7/ab/1ad2511cf6a208fde57fafe49829cab8ca018128ab0d0b48973d8218634a/regex-2024.9.11-cp311-cp311-win_amd64.whl", hash = "sha256:313ea15e5ff2a8cbbad96ccef6be638393041b0a7863183c2d31e0c6116688cf", size = 274033 }, + { url = "https://files.pythonhosted.org/packages/6e/92/407531450762bed778eedbde04407f68cbd75d13cee96c6f8d6903d9c6c1/regex-2024.9.11-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b0d0a6c64fcc4ef9c69bd5b3b3626cc3776520a1637d8abaa62b9edc147a58f7", size = 483590 }, + { url = "https://files.pythonhosted.org/packages/8e/a2/048acbc5ae1f615adc6cba36cc45734e679b5f1e4e58c3c77f0ed611d4e2/regex-2024.9.11-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:49b0e06786ea663f933f3710a51e9385ce0cba0ea56b67107fd841a55d56a231", size = 288175 }, + { url = "https://files.pythonhosted.org/packages/8a/ea/909d8620329ab710dfaf7b4adee41242ab7c9b95ea8d838e9bfe76244259/regex-2024.9.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5b513b6997a0b2f10e4fd3a1313568e373926e8c252bd76c960f96fd039cd28d", size = 284749 }, + { url = "https://files.pythonhosted.org/packages/ca/fa/521eb683b916389b4975337873e66954e0f6d8f91bd5774164a57b503185/regex-2024.9.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee439691d8c23e76f9802c42a95cfeebf9d47cf4ffd06f18489122dbb0a7ad64", size = 795181 }, + { url = "https://files.pythonhosted.org/packages/28/db/63047feddc3280cc242f9c74f7aeddc6ee662b1835f00046f57d5630c827/regex-2024.9.11-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a8f877c89719d759e52783f7fe6e1c67121076b87b40542966c02de5503ace42", size = 835842 }, + { url = "https://files.pythonhosted.org/packages/e3/94/86adc259ff8ec26edf35fcca7e334566c1805c7493b192cb09679f9c3dee/regex-2024.9.11-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:23b30c62d0f16827f2ae9f2bb87619bc4fba2044911e2e6c2eb1af0161cdb766", size = 823533 }, + { url = "https://files.pythonhosted.org/packages/29/52/84662b6636061277cb857f658518aa7db6672bc6d1a3f503ccd5aefc581e/regex-2024.9.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85ab7824093d8f10d44330fe1e6493f756f252d145323dd17ab6b48733ff6c0a", size = 797037 }, + { url = "https://files.pythonhosted.org/packages/c3/2a/cd4675dd987e4a7505f0364a958bc41f3b84942de9efaad0ef9a2646681c/regex-2024.9.11-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8dee5b4810a89447151999428fe096977346cf2f29f4d5e29609d2e19e0199c9", size = 784106 }, + { url = "https://files.pythonhosted.org/packages/6f/75/3ea7ec29de0bbf42f21f812f48781d41e627d57a634f3f23947c9a46e303/regex-2024.9.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:98eeee2f2e63edae2181c886d7911ce502e1292794f4c5ee71e60e23e8d26b5d", size = 782468 }, + { url = "https://files.pythonhosted.org/packages/d3/67/15519d69b52c252b270e679cb578e22e0c02b8dd4e361f2b04efcc7f2335/regex-2024.9.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:57fdd2e0b2694ce6fc2e5ccf189789c3e2962916fb38779d3e3521ff8fe7a822", size = 790324 }, + { url = "https://files.pythonhosted.org/packages/9c/71/eff77d3fe7ba08ab0672920059ec30d63fa7e41aa0fb61c562726e9bd721/regex-2024.9.11-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d552c78411f60b1fdaafd117a1fca2f02e562e309223b9d44b7de8be451ec5e0", size = 860214 }, + { url = "https://files.pythonhosted.org/packages/81/11/e1bdf84a72372e56f1ea4b833dd583b822a23138a616ace7ab57a0e11556/regex-2024.9.11-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a0b2b80321c2ed3fcf0385ec9e51a12253c50f146fddb2abbb10f033fe3d049a", size = 859420 }, + { url = "https://files.pythonhosted.org/packages/ea/75/9753e9dcebfa7c3645563ef5c8a58f3a47e799c872165f37c55737dadd3e/regex-2024.9.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:18406efb2f5a0e57e3a5881cd9354c1512d3bb4f5c45d96d110a66114d84d23a", size = 787333 }, + { url = "https://files.pythonhosted.org/packages/bc/4e/ba1cbca93141f7416624b3ae63573e785d4bc1834c8be44a8f0747919eca/regex-2024.9.11-cp312-cp312-win32.whl", hash = "sha256:e464b467f1588e2c42d26814231edecbcfe77f5ac414d92cbf4e7b55b2c2a776", size = 262058 }, + { url = "https://files.pythonhosted.org/packages/6e/16/efc5f194778bf43e5888209e5cec4b258005d37c613b67ae137df3b89c53/regex-2024.9.11-cp312-cp312-win_amd64.whl", hash = "sha256:9e8719792ca63c6b8340380352c24dcb8cd7ec49dae36e963742a275dfae6009", size = 273526 }, + { url = "https://files.pythonhosted.org/packages/93/0a/d1c6b9af1ff1e36832fe38d74d5c5bab913f2bdcbbd6bc0e7f3ce8b2f577/regex-2024.9.11-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c157bb447303070f256e084668b702073db99bbb61d44f85d811025fcf38f784", size = 483376 }, + { url = "https://files.pythonhosted.org/packages/a4/42/5910a050c105d7f750a72dcb49c30220c3ae4e2654e54aaaa0e9bc0584cb/regex-2024.9.11-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4db21ece84dfeefc5d8a3863f101995de646c6cb0536952c321a2650aa202c36", size = 288112 }, + { url = "https://files.pythonhosted.org/packages/8d/56/0c262aff0e9224fa7ffce47b5458d373f4d3e3ff84e99b5ff0cb15e0b5b2/regex-2024.9.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:220e92a30b426daf23bb67a7962900ed4613589bab80382be09b48896d211e92", size = 284608 }, + { url = "https://files.pythonhosted.org/packages/b9/54/9fe8f9aec5007bbbbce28ba3d2e3eaca425f95387b7d1e84f0d137d25237/regex-2024.9.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb1ae19e64c14c7ec1995f40bd932448713d3c73509e82d8cd7744dc00e29e86", size = 795337 }, + { url = "https://files.pythonhosted.org/packages/b2/e7/6b2f642c3cded271c4f16cc4daa7231be544d30fe2b168e0223724b49a61/regex-2024.9.11-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f47cd43a5bfa48f86925fe26fbdd0a488ff15b62468abb5d2a1e092a4fb10e85", size = 835848 }, + { url = "https://files.pythonhosted.org/packages/cd/9e/187363bdf5d8c0e4662117b92aa32bf52f8f09620ae93abc7537d96d3311/regex-2024.9.11-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9d4a76b96f398697fe01117093613166e6aa8195d63f1b4ec3f21ab637632963", size = 823503 }, + { url = "https://files.pythonhosted.org/packages/f8/10/601303b8ee93589f879664b0cfd3127949ff32b17f9b6c490fb201106c4d/regex-2024.9.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ea51dcc0835eea2ea31d66456210a4e01a076d820e9039b04ae8d17ac11dee6", size = 797049 }, + { url = "https://files.pythonhosted.org/packages/ef/1c/ea200f61ce9f341763f2717ab4daebe4422d83e9fd4ac5e33435fd3a148d/regex-2024.9.11-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7aaa315101c6567a9a45d2839322c51c8d6e81f67683d529512f5bcfb99c802", size = 784144 }, + { url = "https://files.pythonhosted.org/packages/d8/5c/d2429be49ef3292def7688401d3deb11702c13dcaecdc71d2b407421275b/regex-2024.9.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c57d08ad67aba97af57a7263c2d9006d5c404d721c5f7542f077f109ec2a4a29", size = 782483 }, + { url = "https://files.pythonhosted.org/packages/12/d9/cbc30f2ff7164f3b26a7760f87c54bf8b2faed286f60efd80350a51c5b99/regex-2024.9.11-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f8404bf61298bb6f8224bb9176c1424548ee1181130818fcd2cbffddc768bed8", size = 790320 }, + { url = "https://files.pythonhosted.org/packages/19/1d/43ed03a236313639da5a45e61bc553c8d41e925bcf29b0f8ecff0c2c3f25/regex-2024.9.11-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dd4490a33eb909ef5078ab20f5f000087afa2a4daa27b4c072ccb3cb3050ad84", size = 860435 }, + { url = "https://files.pythonhosted.org/packages/34/4f/5d04da61c7c56e785058a46349f7285ae3ebc0726c6ea7c5c70600a52233/regex-2024.9.11-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:eee9130eaad130649fd73e5cd92f60e55708952260ede70da64de420cdcad554", size = 859571 }, + { url = "https://files.pythonhosted.org/packages/12/7f/8398c8155a3c70703a8e91c29532558186558e1aea44144b382faa2a6f7a/regex-2024.9.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6a2644a93da36c784e546de579ec1806bfd2763ef47babc1b03d765fe560c9f8", size = 787398 }, + { url = "https://files.pythonhosted.org/packages/58/3a/f5903977647a9a7e46d5535e9e96c194304aeeca7501240509bde2f9e17f/regex-2024.9.11-cp313-cp313-win32.whl", hash = "sha256:e997fd30430c57138adc06bba4c7c2968fb13d101e57dd5bb9355bf8ce3fa7e8", size = 262035 }, + { url = "https://files.pythonhosted.org/packages/ff/80/51ba3a4b7482f6011095b3a036e07374f64de180b7d870b704ed22509002/regex-2024.9.11-cp313-cp313-win_amd64.whl", hash = "sha256:042c55879cfeb21a8adacc84ea347721d3d83a159da6acdf1116859e2427c43f", size = 273510 }, + { url = "https://files.pythonhosted.org/packages/a1/aa/e31baf8482ad690ccb3cdf20d1963a01e98d137e4d9ee493dbb0fa8ba2c6/regex-2024.9.11-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:07f45f287469039ffc2c53caf6803cd506eb5f5f637f1d4acb37a738f71dd066", size = 482489 }, + { url = "https://files.pythonhosted.org/packages/a1/b5/449c2f14fc20dc42ef9729469fcff42809393470f021ed6c6fcf5f3d3297/regex-2024.9.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4838e24ee015101d9f901988001038f7f0d90dc0c3b115541a1365fb439add62", size = 287440 }, + { url = "https://files.pythonhosted.org/packages/3f/36/4b60a0c2e4cc6ecb2651be828117a31f42fae55a51a484a8071729df56a6/regex-2024.9.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6edd623bae6a737f10ce853ea076f56f507fd7726bee96a41ee3d68d347e4d16", size = 284566 }, + { url = "https://files.pythonhosted.org/packages/b4/21/feaa5b0d3e5e3bad659cd7d640e6b76cc0719504dbd9bc8f67cfa21bde82/regex-2024.9.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c69ada171c2d0e97a4b5aa78fbb835e0ffbb6b13fc5da968c09811346564f0d3", size = 782747 }, + { url = "https://files.pythonhosted.org/packages/bb/89/93516f0aa3e8a9366df2cf79bb0290abdc7dbe5dd27373d9bea0978b7ba6/regex-2024.9.11-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02087ea0a03b4af1ed6ebab2c54d7118127fee8d71b26398e8e4b05b78963199", size = 822700 }, + { url = "https://files.pythonhosted.org/packages/d5/e7/79c04ccb81cee2831d9d4499274919b9153c1741ce8b3421d69cb0032f1b/regex-2024.9.11-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:69dee6a020693d12a3cf892aba4808fe168d2a4cef368eb9bf74f5398bfd4ee8", size = 809327 }, + { url = "https://files.pythonhosted.org/packages/01/e6/a7256c99c312b68f01cfd4f8eae6e770906fffb3832ecb66f35ca5b86b96/regex-2024.9.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:297f54910247508e6e5cae669f2bc308985c60540a4edd1c77203ef19bfa63ca", size = 781970 }, + { url = "https://files.pythonhosted.org/packages/18/c4/29e8b6ff2208775858b5d4a2caa6428d40b5fade95aee426de7e42ffff39/regex-2024.9.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ecea58b43a67b1b79805f1a0255730edaf5191ecef84dbc4cc85eb30bc8b63b9", size = 771885 }, + { url = "https://files.pythonhosted.org/packages/95/78/7acd8882ac335f1f5ae1756417739fda3053e0bcacea8716ae4a04e74553/regex-2024.9.11-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:eab4bb380f15e189d1313195b062a6aa908f5bd687a0ceccd47c8211e9cf0d4a", size = 696978 }, + { url = "https://files.pythonhosted.org/packages/cb/d2/1d44f9b4a3d33ff5773fd79bea53e992d00f81e0af6f1f4e2efac1e4d897/regex-2024.9.11-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0cbff728659ce4bbf4c30b2a1be040faafaa9eca6ecde40aaff86f7889f4ab39", size = 768655 }, + { url = "https://files.pythonhosted.org/packages/79/ba/92ef9d3b8f59cb3df9febef07098dfb4a43c3bdcf35b1084c2009b0a93bf/regex-2024.9.11-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:54c4a097b8bc5bb0dfc83ae498061d53ad7b5762e00f4adaa23bee22b012e6ba", size = 776922 }, + { url = "https://files.pythonhosted.org/packages/16/71/d964c0c9d447f04bbe6ab5eafd220208e7d52b9608e452e6fcad553b38e0/regex-2024.9.11-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:73d6d2f64f4d894c96626a75578b0bf7d9e56dcda8c3d037a2118fdfe9b1c664", size = 845014 }, + { url = "https://files.pythonhosted.org/packages/83/cb/a378cdc2468782eefefa50183bbeabc3357fb588d4109d845f0a56e68713/regex-2024.9.11-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:e53b5fbab5d675aec9f0c501274c467c0f9a5d23696cfc94247e1fb56501ed89", size = 844916 }, + { url = "https://files.pythonhosted.org/packages/b9/f0/82ea1565a6639270cfe96263002b3d91084a1db5048d9b6084f83bd5972d/regex-2024.9.11-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0ffbcf9221e04502fc35e54d1ce9567541979c3fdfb93d2c554f0ca583a19b35", size = 773409 }, + { url = "https://files.pythonhosted.org/packages/97/9e/0400d742b9647b4940609a96d550de89e4e89c85f6a370796dab25b5979c/regex-2024.9.11-cp39-cp39-win32.whl", hash = "sha256:e4c22e1ac1f1ec1e09f72e6c44d8f2244173db7eb9629cc3a346a8d7ccc31142", size = 261680 }, + { url = "https://files.pythonhosted.org/packages/b6/f1/aef1112652ac7b3922d2c129f8325a4fd286b66691127dd99f380f8ede19/regex-2024.9.11-cp39-cp39-win_amd64.whl", hash = "sha256:faa3c142464efec496967359ca99696c896c591c56c53506bac1ad465f66e919", size = 274066 }, ] [[package]] @@ -1033,10 +1106,10 @@ name = "requests" version = "2.32.3" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "certifi", marker = "python_full_version >= '3.10'" }, - { name = "charset-normalizer", marker = "python_full_version >= '3.10'" }, - { name = "idna", marker = "python_full_version >= '3.10'" }, - { name = "urllib3", marker = "python_full_version >= '3.10'" }, + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, ] sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218 } wheels = [ @@ -1045,40 +1118,41 @@ wheels = [ [[package]] name = "rich" -version = "13.8.0" +version = "13.9.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "markdown-it-py", marker = "python_full_version >= '3.10'" }, - { name = "pygments", marker = "python_full_version >= '3.10'" }, + { name = "markdown-it-py" }, + { name = "pygments" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/cf/60/5959113cae0ce512cf246a6871c623117330105a0d5f59b4e26138f2c9cc/rich-13.8.0.tar.gz", hash = "sha256:a5ac1f1cd448ade0d59cc3356f7db7a7ccda2c8cbae9c7a90c28ff463d3e91f4", size = 222072 } +sdist = { url = "https://files.pythonhosted.org/packages/aa/9e/1784d15b057b0075e5136445aaea92d23955aad2c93eaede673718a40d95/rich-13.9.2.tar.gz", hash = "sha256:51a2c62057461aaf7152b4d611168f93a9fc73068f8ded2790f29fe2b5366d0c", size = 222843 } wheels = [ - { url = "https://files.pythonhosted.org/packages/c7/d9/c2a126eeae791e90ea099d05cb0515feea3688474b978343f3cdcfe04523/rich-13.8.0-py3-none-any.whl", hash = "sha256:2e85306a063b9492dffc86278197a60cbece75bcb766022f3436f567cae11bdc", size = 241597 }, + { url = "https://files.pythonhosted.org/packages/67/91/5474b84e505a6ccc295b2d322d90ff6aa0746745717839ee0c5fb4fdcceb/rich-13.9.2-py3-none-any.whl", hash = "sha256:8c82a3d3f8dcfe9e734771313e606b39d8247bb6b826e196f4914b333b743cf1", size = 242117 }, ] [[package]] name = "ruff" -version = "0.6.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a4/55/9f485266e6326cab707369601b13e3e72eb90ba3eee2d6779549a00a0d58/ruff-0.6.4.tar.gz", hash = "sha256:ac3b5bfbee99973f80aa1b7cbd1c9cbce200883bdd067300c22a6cc1c7fba212", size = 2469375 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e3/78/307591f81d09c8721b5e64539f287c82c81a46f46d16278eb27941ac17f9/ruff-0.6.4-py3-none-linux_armv6l.whl", hash = "sha256:c4b153fc152af51855458e79e835fb6b933032921756cec9af7d0ba2aa01a258", size = 9692673 }, - { url = "https://files.pythonhosted.org/packages/69/63/ef398fcacdbd3995618ed30b5a6c809a1ebbf112ba604b3f5b8c3be464cf/ruff-0.6.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:bedff9e4f004dad5f7f76a9d39c4ca98af526c9b1695068198b3bda8c085ef60", size = 9481182 }, - { url = "https://files.pythonhosted.org/packages/a6/fd/8784e3bbd79bc17de0a62de05fe5165f494ff7d77cb06630d6428c2f10d2/ruff-0.6.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d02a4127a86de23002e694d7ff19f905c51e338c72d8e09b56bfb60e1681724f", size = 9174356 }, - { url = "https://files.pythonhosted.org/packages/6d/bc/c69db2d68ac7bfbb222c81dc43a86e0402d0063e20b13e609f7d17d81d3f/ruff-0.6.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7862f42fc1a4aca1ea3ffe8a11f67819d183a5693b228f0bb3a531f5e40336fc", size = 10129365 }, - { url = "https://files.pythonhosted.org/packages/3b/10/8ed14ff60a4e5eb08cac0a04a9b4e8590c72d1ce4d29ef22cef97d19536d/ruff-0.6.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eebe4ff1967c838a1a9618a5a59a3b0a00406f8d7eefee97c70411fefc353617", size = 9483351 }, - { url = "https://files.pythonhosted.org/packages/a9/69/13316b8d64ffd6a43627cf0753339a7f95df413450c301a60904581bee6e/ruff-0.6.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:932063a03bac394866683e15710c25b8690ccdca1cf192b9a98260332ca93408", size = 10301099 }, - { url = "https://files.pythonhosted.org/packages/42/00/9623494087272643e8f02187c266638306c6829189a5bf1446968bbe438b/ruff-0.6.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:50e30b437cebef547bd5c3edf9ce81343e5dd7c737cb36ccb4fe83573f3d392e", size = 11033216 }, - { url = "https://files.pythonhosted.org/packages/c5/31/e0c9d881db42ea1267e075c29aafe0db5a8a3024b131f952747f6234f858/ruff-0.6.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c44536df7b93a587de690e124b89bd47306fddd59398a0fb12afd6133c7b3818", size = 10618140 }, - { url = "https://files.pythonhosted.org/packages/5b/35/f1d8b746aedd4c8fde4f83397e940cc4c8fc619860ebbe3073340381a34d/ruff-0.6.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ea086601b22dc5e7693a78f3fcfc460cceabfdf3bdc36dc898792aba48fbad6", size = 11606672 }, - { url = "https://files.pythonhosted.org/packages/c5/70/899b03cbb3eb48ed0507d4b32b6f7aee562bc618ef9ffda855ec98c0461a/ruff-0.6.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b52387d3289ccd227b62102c24714ed75fbba0b16ecc69a923a37e3b5e0aaaa", size = 10288013 }, - { url = "https://files.pythonhosted.org/packages/17/c6/906bf895640521ca5115ccdd857b2bac42bd61facde6620fdc2efc0a4806/ruff-0.6.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:0308610470fcc82969082fc83c76c0d362f562e2f0cdab0586516f03a4e06ec6", size = 10109473 }, - { url = "https://files.pythonhosted.org/packages/28/da/1284eb04172f8a5d42eb52fce9d643dd747ac59a4ed6c5d42729f72e934d/ruff-0.6.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:803b96dea21795a6c9d5bfa9e96127cc9c31a1987802ca68f35e5c95aed3fc0d", size = 9568817 }, - { url = "https://files.pythonhosted.org/packages/6c/e2/f8250b54edbb2e9222e22806e1bcc35a192ac18d1793ea556fa4977a843a/ruff-0.6.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:66dbfea86b663baab8fcae56c59f190caba9398df1488164e2df53e216248baa", size = 9910840 }, - { url = "https://files.pythonhosted.org/packages/9c/7c/dcf2c10562346ecdf6f0e5f6669b2ddc9a74a72956c3f419abd6820c2aff/ruff-0.6.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:34d5efad480193c046c86608dbba2bccdc1c5fd11950fb271f8086e0c763a5d1", size = 10354263 }, - { url = "https://files.pythonhosted.org/packages/f1/94/c39d7ac5729e94788110503d928c98c203488664b0fb92c2b801cb832bec/ruff-0.6.4-py3-none-win32.whl", hash = "sha256:f0f8968feea5ce3777c0d8365653d5e91c40c31a81d95824ba61d871a11b8523", size = 7958602 }, - { url = "https://files.pythonhosted.org/packages/6b/d2/2dee8c547bee3d4cfdd897f7b8e38510383acaff2c8130ea783b67631d72/ruff-0.6.4-py3-none-win_amd64.whl", hash = "sha256:549daccee5227282289390b0222d0fbee0275d1db6d514550d65420053021a58", size = 8795059 }, - { url = "https://files.pythonhosted.org/packages/07/1a/23280818aa4fa89bd0552aab10857154e1d3b90f27b5b745f09ec1ac6ad8/ruff-0.6.4-py3-none-win_arm64.whl", hash = "sha256:ac4b75e898ed189b3708c9ab3fc70b79a433219e1e87193b4f2b77251d058d14", size = 8239636 }, +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2c/c7/f3367d1da5d568192968c5c9e7f3d51fb317b9ac04828493b23d8fce8ce6/ruff-0.7.0.tar.gz", hash = "sha256:47a86360cf62d9cd53ebfb0b5eb0e882193fc191c6d717e8bef4462bc3b9ea2b", size = 3146645 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/48/59/a0275a0913f3539498d116046dd679cd657fe3b7caf5afe1733319414932/ruff-0.7.0-py3-none-linux_armv6l.whl", hash = "sha256:0cdf20c2b6ff98e37df47b2b0bd3a34aaa155f59a11182c1303cce79be715628", size = 10434007 }, + { url = "https://files.pythonhosted.org/packages/cd/94/da0ba5f956d04c90dd899209904210600009dcda039ce840d83eb4298c7d/ruff-0.7.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:496494d350c7fdeb36ca4ef1c9f21d80d182423718782222c29b3e72b3512737", size = 10048066 }, + { url = "https://files.pythonhosted.org/packages/57/1d/e5cc149ecc46e4f203403a79ccd170fad52d316f98b87d0f63b1945567db/ruff-0.7.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:214b88498684e20b6b2b8852c01d50f0651f3cc6118dfa113b4def9f14faaf06", size = 9711389 }, + { url = "https://files.pythonhosted.org/packages/05/67/fb7ea2c869c539725a16c5bc294e9aa34f8b1b6fe702f1d173a5da517c2b/ruff-0.7.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:630fce3fefe9844e91ea5bbf7ceadab4f9981f42b704fae011bb8efcaf5d84be", size = 10755174 }, + { url = "https://files.pythonhosted.org/packages/5f/f0/13703bc50536a0613ea3dce991116e5f0917a1f05528c6ab738b33c08d3f/ruff-0.7.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:211d877674e9373d4bb0f1c80f97a0201c61bcd1e9d045b6e9726adc42c156aa", size = 10196040 }, + { url = "https://files.pythonhosted.org/packages/99/c1/77b04ab20324ab03d333522ee55fb0f1c38e3ca0d326b4905f82ce6b6c70/ruff-0.7.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:194d6c46c98c73949a106425ed40a576f52291c12bc21399eb8f13a0f7073495", size = 11033684 }, + { url = "https://files.pythonhosted.org/packages/f2/97/f463334dc4efeea3551cd109163df15561c18a1c3ec13d51643740fd36ba/ruff-0.7.0-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:82c2579b82b9973a110fab281860403b397c08c403de92de19568f32f7178598", size = 11803700 }, + { url = "https://files.pythonhosted.org/packages/b4/f8/a31d40c4bb92933d376a53e7c5d0245d9b27841357e4820e96d38f54b480/ruff-0.7.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9af971fe85dcd5eaed8f585ddbc6bdbe8c217fb8fcf510ea6bca5bdfff56040e", size = 11347848 }, + { url = "https://files.pythonhosted.org/packages/83/62/0c133b35ddaf91c65c30a56718b80bdef36bfffc35684d29e3a4878e0ea3/ruff-0.7.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b641c7f16939b7d24b7bfc0be4102c56562a18281f84f635604e8a6989948914", size = 12480632 }, + { url = "https://files.pythonhosted.org/packages/46/96/464058dd1d980014fb5aa0a1254e78799efb3096fc7a4823cd66a1621276/ruff-0.7.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d71672336e46b34e0c90a790afeac8a31954fd42872c1f6adaea1dff76fd44f9", size = 10941919 }, + { url = "https://files.pythonhosted.org/packages/a0/f7/bda37ec77986a435dde44e1f59374aebf4282a5fa9cf17735315b847141f/ruff-0.7.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:ab7d98c7eed355166f367597e513a6c82408df4181a937628dbec79abb2a1fe4", size = 10745519 }, + { url = "https://files.pythonhosted.org/packages/c2/33/5f77fc317027c057b61a848020a47442a1cbf12e592df0e41e21f4d0f3bd/ruff-0.7.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:1eb54986f770f49edb14f71d33312d79e00e629a57387382200b1ef12d6a4ef9", size = 10284872 }, + { url = "https://files.pythonhosted.org/packages/ff/50/98aec292bc9537f640b8d031c55f3414bf15b6ed13b3e943fed75ac927b9/ruff-0.7.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:dc452ba6f2bb9cf8726a84aa877061a2462afe9ae0ea1d411c53d226661c601d", size = 10600334 }, + { url = "https://files.pythonhosted.org/packages/f2/85/12607ae3201423a179b8cfadc7cb1e57d02cd0135e45bd0445acb4cef327/ruff-0.7.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:4b406c2dce5be9bad59f2de26139a86017a517e6bcd2688da515481c05a2cb11", size = 11017333 }, + { url = "https://files.pythonhosted.org/packages/d4/7f/3b85a56879e705d5f46ec14daf8a439fca05c3081720fe3dc3209100922d/ruff-0.7.0-py3-none-win32.whl", hash = "sha256:f6c968509f767776f524a8430426539587d5ec5c662f6addb6aa25bc2e8195ec", size = 8570962 }, + { url = "https://files.pythonhosted.org/packages/39/9f/c5ee2b40d377354dabcc23cff47eb299de4b4d06d345068f8f8cc1eadac8/ruff-0.7.0-py3-none-win_amd64.whl", hash = "sha256:ff4aabfbaaba880e85d394603b9e75d32b0693152e16fa659a3064a85df7fce2", size = 9365544 }, + { url = "https://files.pythonhosted.org/packages/89/8b/ee1509f60148cecba644aa718f6633216784302458340311898aaf0b1bed/ruff-0.7.0-py3-none-win_arm64.whl", hash = "sha256:10842f69c245e78d6adec7e1db0a7d9ddc2fff0621d730e61657b64fa36f207e", size = 8695763 }, ] [[package]] @@ -1163,88 +1237,85 @@ wheels = [ [[package]] name = "scikit-learn" -version = "1.5.1" +version = "1.5.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "joblib", marker = "python_full_version >= '3.10'" }, - { name = "numpy", marker = "python_full_version >= '3.10'" }, - { name = "scipy", marker = "python_full_version >= '3.10'" }, - { name = "threadpoolctl", marker = "python_full_version >= '3.10'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/92/72/2961b9874a9ddf2b0f95f329d4e67f67c3301c1d88ba5e239ff25661bb85/scikit_learn-1.5.1.tar.gz", hash = "sha256:0ea5d40c0e3951df445721927448755d3fe1d80833b0b7308ebff5d2a45e6414", size = 6958368 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f8/59/d8ea8c05e61d2afa988dfcfe47526595b531e94d23babf58d2e00a35f646/scikit_learn-1.5.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:781586c414f8cc58e71da4f3d7af311e0505a683e112f2f62919e3019abd3745", size = 12102257 }, - { url = "https://files.pythonhosted.org/packages/1f/c6/ba8e5691acca616adc8f0d6f8f5e79d55b927530aa404ee712b077acf0cf/scikit_learn-1.5.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:f5b213bc29cc30a89a3130393b0e39c847a15d769d6e59539cd86b75d276b1a7", size = 10975310 }, - { url = "https://files.pythonhosted.org/packages/5c/c6/e362563cc7dfe37e4699cbf2b2d22c2854be227c254976de1c4854fc6e84/scikit_learn-1.5.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1ff4ba34c2abff5ec59c803ed1d97d61b036f659a17f55be102679e88f926fac", size = 12496508 }, - { url = "https://files.pythonhosted.org/packages/f2/60/6c589c91e474721efdcec82ea9cc5c743359e52637e46c364ee5236666ef/scikit_learn-1.5.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:161808750c267b77b4a9603cf9c93579c7a74ba8486b1336034c2f1579546d21", size = 13352348 }, - { url = "https://files.pythonhosted.org/packages/f1/13/de29b945fb28fc0c24159d3a83f1250c5232c1c9abac12434c7c3447e9cc/scikit_learn-1.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:10e49170691514a94bb2e03787aa921b82dbc507a4ea1f20fd95557862c98dc1", size = 10966250 }, - { url = "https://files.pythonhosted.org/packages/03/86/ab9f95e338c5ef5b4e79463ee91e55aae553213835e59bf038bc0cc21bf8/scikit_learn-1.5.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:154297ee43c0b83af12464adeab378dee2d0a700ccd03979e2b821e7dd7cc1c2", size = 12087598 }, - { url = "https://files.pythonhosted.org/packages/7d/d7/fb80c63062b60b1fa5dcb2d4dd3a4e83bd8c68cdc83cf6ff8c016228f184/scikit_learn-1.5.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:b5e865e9bd59396220de49cb4a57b17016256637c61b4c5cc81aaf16bc123bbe", size = 10979067 }, - { url = "https://files.pythonhosted.org/packages/c1/f8/fd3fa610cac686952d8c78b8b44cf5263c6c03885bd8e5d5819c684b44e8/scikit_learn-1.5.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:909144d50f367a513cee6090873ae582dba019cb3fca063b38054fa42704c3a4", size = 12485469 }, - { url = "https://files.pythonhosted.org/packages/32/63/ed228892adad313aab0d0f9261241e7bf1efe36730a2788ad424bcad00ca/scikit_learn-1.5.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:689b6f74b2c880276e365fe84fe4f1befd6a774f016339c65655eaff12e10cbf", size = 13335048 }, - { url = "https://files.pythonhosted.org/packages/5d/55/0403bf2031250ac982c8053397889fbc5a3a2b3798b913dae4f51c3af6a4/scikit_learn-1.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:9a07f90846313a7639af6a019d849ff72baadfa4c74c778821ae0fad07b7275b", size = 10988436 }, - { url = "https://files.pythonhosted.org/packages/b1/8d/cf392a56e24627093a467642c8b9263052372131359b570df29aaf4811ab/scikit_learn-1.5.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5944ce1faada31c55fb2ba20a5346b88e36811aab504ccafb9f0339e9f780395", size = 12102404 }, - { url = "https://files.pythonhosted.org/packages/d5/2c/734fc9269bdb6768905ac41b82d75264b26925b1e462f4ebf45fe4f17646/scikit_learn-1.5.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:0828673c5b520e879f2af6a9e99eee0eefea69a2188be1ca68a6121b809055c1", size = 11037398 }, - { url = "https://files.pythonhosted.org/packages/d3/a9/15774b178bcd1cde1c470adbdb554e1504dce7c302e02ff736c90d65e014/scikit_learn-1.5.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:508907e5f81390e16d754e8815f7497e52139162fd69c4fdbd2dfa5d6cc88915", size = 12089887 }, - { url = "https://files.pythonhosted.org/packages/8a/5d/047cde25131eef3a38d03317fa7d25d6f60ce6e8ccfd24ac88b3e309fc00/scikit_learn-1.5.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97625f217c5c0c5d0505fa2af28ae424bd37949bb2f16ace3ff5f2f81fb4498b", size = 13079093 }, - { url = "https://files.pythonhosted.org/packages/cb/be/dec2a8d31d133034a8ec51ae68ac564ec9bde1c78a64551f1438c3690b9e/scikit_learn-1.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:da3f404e9e284d2b0a157e1b56b6566a34eb2798205cba35a211df3296ab7a74", size = 10945350 }, - { url = "https://files.pythonhosted.org/packages/cb/9f/d2837e96be692f99b92a3cb192e8f46501f7ddab6c93a07a9b206f7b3297/scikit_learn-1.5.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:88e0672c7ac21eb149d409c74cc29f1d611d5158175846e7a9c2427bd12b3956", size = 12138083 }, - { url = "https://files.pythonhosted.org/packages/18/3e/b46f298305c243395b88f0f201c32946bdd448e9583315255d87706c3170/scikit_learn-1.5.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:7b073a27797a283187a4ef4ee149959defc350b46cbf63a84d8514fe16b69855", size = 11005997 }, - { url = "https://files.pythonhosted.org/packages/00/84/8d2174ef802da1b9eedc8691883ed08a16318e2189fd5377e5bc2d404c0b/scikit_learn-1.5.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b59e3e62d2be870e5c74af4e793293753565c7383ae82943b83383fdcf5cc5c1", size = 12532003 }, - { url = "https://files.pythonhosted.org/packages/12/f8/d6bc56d20c60b2b66e005dfed16fdf8c46dbe559d40896d06c448a65f134/scikit_learn-1.5.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bd8d3a19d4bd6dc5a7d4f358c8c3a60934dc058f363c34c0ac1e9e12a31421d", size = 13393818 }, - { url = "https://files.pythonhosted.org/packages/a8/ed/941b210029c1051233b082a19c36b930f56dda34a8a5227dbbd1bc08f7eb/scikit_learn-1.5.1-cp39-cp39-win_amd64.whl", hash = "sha256:5f57428de0c900a98389c4a433d4a3cf89de979b3aa24d1c1d251802aa15e44d", size = 10993525 }, + { name = "joblib" }, + { name = "numpy" }, + { name = "scipy" }, + { name = "threadpoolctl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/37/59/44985a2bdc95c74e34fef3d10cb5d93ce13b0e2a7baefffe1b53853b502d/scikit_learn-1.5.2.tar.gz", hash = "sha256:b4237ed7b3fdd0a4882792e68ef2545d5baa50aca3bb45aa7df468138ad8f94d", size = 7001680 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/98/89/be41419b4bec629a4691183a5eb1796f91252a13a5ffa243fd958cad7e91/scikit_learn-1.5.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:299406827fb9a4f862626d0fe6c122f5f87f8910b86fe5daa4c32dcd742139b6", size = 12106070 }, + { url = "https://files.pythonhosted.org/packages/bf/e0/3b6d777d375f3b685f433c93384cdb724fb078e1dc8f8ff0950467e56c30/scikit_learn-1.5.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:2d4cad1119c77930b235579ad0dc25e65c917e756fe80cab96aa3b9428bd3fb0", size = 10971758 }, + { url = "https://files.pythonhosted.org/packages/7b/31/eb7dd56c371640753953277de11356c46a3149bfeebb3d7dcd90b993715a/scikit_learn-1.5.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c412ccc2ad9bf3755915e3908e677b367ebc8d010acbb3f182814524f2e5540", size = 12500080 }, + { url = "https://files.pythonhosted.org/packages/4c/1e/a7c7357e704459c7d56a18df4a0bf08669442d1f8878cc0864beccd6306a/scikit_learn-1.5.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a686885a4b3818d9e62904d91b57fa757fc2bed3e465c8b177be652f4dd37c8", size = 13347241 }, + { url = "https://files.pythonhosted.org/packages/48/76/154ebda6794faf0b0f3ccb1b5cd9a19f0a63cb9e1f3d2c61b6114002677b/scikit_learn-1.5.2-cp310-cp310-win_amd64.whl", hash = "sha256:c15b1ca23d7c5f33cc2cb0a0d6aaacf893792271cddff0edbd6a40e8319bc113", size = 11000477 }, + { url = "https://files.pythonhosted.org/packages/ff/91/609961972f694cb9520c4c3d201e377a26583e1eb83bc5a334c893729214/scikit_learn-1.5.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:03b6158efa3faaf1feea3faa884c840ebd61b6484167c711548fce208ea09445", size = 12088580 }, + { url = "https://files.pythonhosted.org/packages/cd/7a/19fe32c810c5ceddafcfda16276d98df299c8649e24e84d4f00df4a91e01/scikit_learn-1.5.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:1ff45e26928d3b4eb767a8f14a9a6efbf1cbff7c05d1fb0f95f211a89fd4f5de", size = 10975994 }, + { url = "https://files.pythonhosted.org/packages/4c/75/62e49f8a62bf3c60b0e64d0fce540578ee4f0e752765beb2e1dc7c6d6098/scikit_learn-1.5.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f763897fe92d0e903aa4847b0aec0e68cadfff77e8a0687cabd946c89d17e675", size = 12465782 }, + { url = "https://files.pythonhosted.org/packages/49/21/3723de321531c9745e40f1badafd821e029d346155b6c79704e0b7197552/scikit_learn-1.5.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8b0ccd4a902836493e026c03256e8b206656f91fbcc4fde28c57a5b752561f1", size = 13322034 }, + { url = "https://files.pythonhosted.org/packages/17/1c/ccdd103cfcc9435a18819856fbbe0c20b8fa60bfc3343580de4be13f0668/scikit_learn-1.5.2-cp311-cp311-win_amd64.whl", hash = "sha256:6c16d84a0d45e4894832b3c4d0bf73050939e21b99b01b6fd59cbb0cf39163b6", size = 11015224 }, + { url = "https://files.pythonhosted.org/packages/a4/db/b485c1ac54ff3bd9e7e6b39d3cc6609c4c76a65f52ab0a7b22b6c3ab0e9d/scikit_learn-1.5.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f932a02c3f4956dfb981391ab24bda1dbd90fe3d628e4b42caef3e041c67707a", size = 12110344 }, + { url = "https://files.pythonhosted.org/packages/54/1a/7deb52fa23aebb855431ad659b3c6a2e1709ece582cb3a63d66905e735fe/scikit_learn-1.5.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:3b923d119d65b7bd555c73be5423bf06c0105678ce7e1f558cb4b40b0a5502b1", size = 11033502 }, + { url = "https://files.pythonhosted.org/packages/a1/32/4a7a205b14c11225609b75b28402c196e4396ac754dab6a81971b811781c/scikit_learn-1.5.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f60021ec1574e56632be2a36b946f8143bf4e5e6af4a06d85281adc22938e0dd", size = 12085794 }, + { url = "https://files.pythonhosted.org/packages/c6/29/044048c5e911373827c0e1d3051321b9183b2a4f8d4e2f11c08fcff83f13/scikit_learn-1.5.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:394397841449853c2290a32050382edaec3da89e35b3e03d6cc966aebc6a8ae6", size = 12945797 }, + { url = "https://files.pythonhosted.org/packages/aa/ce/c0b912f2f31aeb1b756a6ba56bcd84dd1f8a148470526a48515a3f4d48cd/scikit_learn-1.5.2-cp312-cp312-win_amd64.whl", hash = "sha256:57cc1786cfd6bd118220a92ede80270132aa353647684efa385a74244a41e3b1", size = 10985467 }, + { url = "https://files.pythonhosted.org/packages/a4/50/8891028437858cc510e13578fe7046574a60c2aaaa92b02d64aac5b1b412/scikit_learn-1.5.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9a702e2de732bbb20d3bad29ebd77fc05a6b427dc49964300340e4c9328b3f5", size = 12025584 }, + { url = "https://files.pythonhosted.org/packages/d2/79/17feef8a1c14149436083bec0e61d7befb4812e272d5b20f9d79ea3e9ab1/scikit_learn-1.5.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:b0768ad641981f5d3a198430a1d31c3e044ed2e8a6f22166b4d546a5116d7908", size = 10959795 }, + { url = "https://files.pythonhosted.org/packages/b1/c8/f08313f9e2e656bd0905930ae8bf99a573ea21c34666a813b749c338202f/scikit_learn-1.5.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:178ddd0a5cb0044464fc1bfc4cca5b1833bfc7bb022d70b05db8530da4bb3dd3", size = 12077302 }, + { url = "https://files.pythonhosted.org/packages/a7/48/fbfb4dc72bed0fe31fe045fb30e924909ad03f717c36694351612973b1a9/scikit_learn-1.5.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7284ade780084d94505632241bf78c44ab3b6f1e8ccab3d2af58e0e950f9c12", size = 13002811 }, + { url = "https://files.pythonhosted.org/packages/a5/e7/0c869f9e60d225a77af90d2aefa7a4a4c0e745b149325d1450f0f0ce5399/scikit_learn-1.5.2-cp313-cp313-win_amd64.whl", hash = "sha256:b7b0f9a0b1040830d38c39b91b3a44e1b643f4b36e36567b80b7c6bd2202a27f", size = 10951354 }, + { url = "https://files.pythonhosted.org/packages/db/a0/e92af06a9fddd1fafbbf39cd32cbed5929b63cf99e03a438f838987e265d/scikit_learn-1.5.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:757c7d514ddb00ae249832fe87100d9c73c6ea91423802872d9e74970a0e40b9", size = 12142022 }, + { url = "https://files.pythonhosted.org/packages/1b/be/386ef63d9d5e2ddf8308f6a164e4b388d5c5aecc0504d25acc6b33d8b09e/scikit_learn-1.5.2-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:52788f48b5d8bca5c0736c175fa6bdaab2ef00a8f536cda698db61bd89c551c1", size = 11002839 }, + { url = "https://files.pythonhosted.org/packages/12/0d/94a03c006b01c1de27518d393f52ad3639705cd70184e106d24ffb3f28f6/scikit_learn-1.5.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:643964678f4b5fbdc95cbf8aec638acc7aa70f5f79ee2cdad1eec3df4ba6ead8", size = 12546017 }, + { url = "https://files.pythonhosted.org/packages/2a/9d/d332ec76e2cc442fce98bc43a44e69d3c281e6b4ede6b6db2616dc6fbec6/scikit_learn-1.5.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca64b3089a6d9b9363cd3546f8978229dcbb737aceb2c12144ee3f70f95684b7", size = 13369870 }, + { url = "https://files.pythonhosted.org/packages/45/05/74e453853c0b1b0773f46027848a17467f5dc9c5f15d096d911163d27550/scikit_learn-1.5.2-cp39-cp39-win_amd64.whl", hash = "sha256:3bed4909ba187aca80580fe2ef370d9180dcf18e621a27c4cf2ef10d279a7efe", size = 11031380 }, ] [[package]] name = "scipy" -version = "1.14.1" +version = "1.13.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy", marker = "python_full_version >= '3.10'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/62/11/4d44a1f274e002784e4dbdb81e0ea96d2de2d1045b2132d5af62cc31fd28/scipy-1.14.1.tar.gz", hash = "sha256:5a275584e726026a5699459aa72f828a610821006228e841b94275c4a7c08417", size = 58620554 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/64/68/3bc0cfaf64ff507d82b1e5d5b64521df4c8bf7e22bc0b897827cbee9872c/scipy-1.14.1-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:b28d2ca4add7ac16ae8bb6632a3c86e4b9e4d52d3e34267f6e1b0c1f8d87e389", size = 39069598 }, - { url = "https://files.pythonhosted.org/packages/43/a5/8d02f9c372790326ad405d94f04d4339482ec082455b9e6e288f7100513b/scipy-1.14.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:d0d2821003174de06b69e58cef2316a6622b60ee613121199cb2852a873f8cf3", size = 29879676 }, - { url = "https://files.pythonhosted.org/packages/07/42/0e0bea9666fcbf2cb6ea0205db42c81b1f34d7b729ba251010edf9c80ebd/scipy-1.14.1-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:8bddf15838ba768bb5f5083c1ea012d64c9a444e16192762bd858f1e126196d0", size = 23088696 }, - { url = "https://files.pythonhosted.org/packages/15/47/298ab6fef5ebf31b426560e978b8b8548421d4ed0bf99263e1eb44532306/scipy-1.14.1-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:97c5dddd5932bd2a1a31c927ba5e1463a53b87ca96b5c9bdf5dfd6096e27efc3", size = 25470699 }, - { url = "https://files.pythonhosted.org/packages/d8/df/cdb6be5274bc694c4c22862ac3438cb04f360ed9df0aecee02ce0b798380/scipy-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ff0a7e01e422c15739ecd64432743cf7aae2b03f3084288f399affcefe5222d", size = 35606631 }, - { url = "https://files.pythonhosted.org/packages/47/78/b0c2c23880dd1e99e938ad49ccfb011ae353758a2dc5ed7ee59baff684c3/scipy-1.14.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e32dced201274bf96899e6491d9ba3e9a5f6b336708656466ad0522d8528f69", size = 41178528 }, - { url = "https://files.pythonhosted.org/packages/5d/aa/994b45c34b897637b853ec04334afa55a85650a0d11dacfa67232260fb0a/scipy-1.14.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8426251ad1e4ad903a4514712d2fa8fdd5382c978010d1c6f5f37ef286a713ad", size = 42784535 }, - { url = "https://files.pythonhosted.org/packages/e7/1c/8daa6df17a945cb1a2a1e3bae3c49643f7b3b94017ff01a4787064f03f84/scipy-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:a49f6ed96f83966f576b33a44257d869756df6cf1ef4934f59dd58b25e0327e5", size = 44772117 }, - { url = "https://files.pythonhosted.org/packages/b2/ab/070ccfabe870d9f105b04aee1e2860520460ef7ca0213172abfe871463b9/scipy-1.14.1-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:2da0469a4ef0ecd3693761acbdc20f2fdeafb69e6819cc081308cc978153c675", size = 39076999 }, - { url = "https://files.pythonhosted.org/packages/a7/c5/02ac82f9bb8f70818099df7e86c3ad28dae64e1347b421d8e3adf26acab6/scipy-1.14.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:c0ee987efa6737242745f347835da2cc5bb9f1b42996a4d97d5c7ff7928cb6f2", size = 29894570 }, - { url = "https://files.pythonhosted.org/packages/ed/05/7f03e680cc5249c4f96c9e4e845acde08eb1aee5bc216eff8a089baa4ddb/scipy-1.14.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3a1b111fac6baec1c1d92f27e76511c9e7218f1695d61b59e05e0fe04dc59617", size = 23103567 }, - { url = "https://files.pythonhosted.org/packages/5e/fc/9f1413bef53171f379d786aabc104d4abeea48ee84c553a3e3d8c9f96a9c/scipy-1.14.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:8475230e55549ab3f207bff11ebfc91c805dc3463ef62eda3ccf593254524ce8", size = 25499102 }, - { url = "https://files.pythonhosted.org/packages/c2/4b/b44bee3c2ddc316b0159b3d87a3d467ef8d7edfd525e6f7364a62cd87d90/scipy-1.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:278266012eb69f4a720827bdd2dc54b2271c97d84255b2faaa8f161a158c3b37", size = 35586346 }, - { url = "https://files.pythonhosted.org/packages/93/6b/701776d4bd6bdd9b629c387b5140f006185bd8ddea16788a44434376b98f/scipy-1.14.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fef8c87f8abfb884dac04e97824b61299880c43f4ce675dd2cbeadd3c9b466d2", size = 41165244 }, - { url = "https://files.pythonhosted.org/packages/06/57/e6aa6f55729a8f245d8a6984f2855696c5992113a5dc789065020f8be753/scipy-1.14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b05d43735bb2f07d689f56f7b474788a13ed8adc484a85aa65c0fd931cf9ccd2", size = 42817917 }, - { url = "https://files.pythonhosted.org/packages/ea/c2/5ecadc5fcccefaece775feadcd795060adf5c3b29a883bff0e678cfe89af/scipy-1.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:716e389b694c4bb564b4fc0c51bc84d381735e0d39d3f26ec1af2556ec6aad94", size = 44781033 }, - { url = "https://files.pythonhosted.org/packages/c0/04/2bdacc8ac6387b15db6faa40295f8bd25eccf33f1f13e68a72dc3c60a99e/scipy-1.14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:631f07b3734d34aced009aaf6fedfd0eb3498a97e581c3b1e5f14a04164a456d", size = 39128781 }, - { url = "https://files.pythonhosted.org/packages/c8/53/35b4d41f5fd42f5781dbd0dd6c05d35ba8aa75c84ecddc7d44756cd8da2e/scipy-1.14.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:af29a935803cc707ab2ed7791c44288a682f9c8107bc00f0eccc4f92c08d6e07", size = 29939542 }, - { url = "https://files.pythonhosted.org/packages/66/67/6ef192e0e4d77b20cc33a01e743b00bc9e68fb83b88e06e636d2619a8767/scipy-1.14.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:2843f2d527d9eebec9a43e6b406fb7266f3af25a751aa91d62ff416f54170bc5", size = 23148375 }, - { url = "https://files.pythonhosted.org/packages/f6/32/3a6dedd51d68eb7b8e7dc7947d5d841bcb699f1bf4463639554986f4d782/scipy-1.14.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:eb58ca0abd96911932f688528977858681a59d61a7ce908ffd355957f7025cfc", size = 25578573 }, - { url = "https://files.pythonhosted.org/packages/f0/5a/efa92a58dc3a2898705f1dc9dbaf390ca7d4fba26d6ab8cfffb0c72f656f/scipy-1.14.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30ac8812c1d2aab7131a79ba62933a2a76f582d5dbbc695192453dae67ad6310", size = 35319299 }, - { url = "https://files.pythonhosted.org/packages/8e/ee/8a26858ca517e9c64f84b4c7734b89bda8e63bec85c3d2f432d225bb1886/scipy-1.14.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f9ea80f2e65bdaa0b7627fb00cbeb2daf163caa015e59b7516395fe3bd1e066", size = 40849331 }, - { url = "https://files.pythonhosted.org/packages/a5/cd/06f72bc9187840f1c99e1a8750aad4216fc7dfdd7df46e6280add14b4822/scipy-1.14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:edaf02b82cd7639db00dbff629995ef185c8df4c3ffa71a5562a595765a06ce1", size = 42544049 }, - { url = "https://files.pythonhosted.org/packages/aa/7d/43ab67228ef98c6b5dd42ab386eae2d7877036970a0d7e3dd3eb47a0d530/scipy-1.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:2ff38e22128e6c03ff73b6bb0f85f897d2362f8c052e3b8ad00532198fbdae3f", size = 44521212 }, - { url = "https://files.pythonhosted.org/packages/50/ef/ac98346db016ff18a6ad7626a35808f37074d25796fd0234c2bb0ed1e054/scipy-1.14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1729560c906963fc8389f6aac023739ff3983e727b1a4d87696b7bf108316a79", size = 39091068 }, - { url = "https://files.pythonhosted.org/packages/b9/cc/70948fe9f393b911b4251e96b55bbdeaa8cca41f37c26fd1df0232933b9e/scipy-1.14.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:4079b90df244709e675cdc8b93bfd8a395d59af40b72e339c2287c91860deb8e", size = 29875417 }, - { url = "https://files.pythonhosted.org/packages/3b/2e/35f549b7d231c1c9f9639f9ef49b815d816bf54dd050da5da1c11517a218/scipy-1.14.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:e0cf28db0f24a38b2a0ca33a85a54852586e43cf6fd876365c86e0657cfe7d73", size = 23084508 }, - { url = "https://files.pythonhosted.org/packages/3f/d6/b028e3f3e59fae61fb8c0f450db732c43dd1d836223a589a8be9f6377203/scipy-1.14.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:0c2f95de3b04e26f5f3ad5bb05e74ba7f68b837133a4492414b3afd79dfe540e", size = 25503364 }, - { url = "https://files.pythonhosted.org/packages/a7/2f/6c142b352ac15967744d62b165537a965e95d557085db4beab2a11f7943b/scipy-1.14.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b99722ea48b7ea25e8e015e8341ae74624f72e5f21fc2abd45f3a93266de4c5d", size = 35292639 }, - { url = "https://files.pythonhosted.org/packages/56/46/2449e6e51e0d7c3575f289f6acb7f828938eaab8874dbccfeb0cd2b71a27/scipy-1.14.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5149e3fd2d686e42144a093b206aef01932a0059c2a33ddfa67f5f035bdfe13e", size = 40798288 }, - { url = "https://files.pythonhosted.org/packages/32/cd/9d86f7ed7f4497c9fd3e39f8918dd93d9f647ba80d7e34e4946c0c2d1a7c/scipy-1.14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e4f5a7c49323533f9103d4dacf4e4f07078f360743dec7f7596949149efeec06", size = 42524647 }, - { url = "https://files.pythonhosted.org/packages/f5/1b/6ee032251bf4cdb0cc50059374e86a9f076308c1512b61c4e003e241efb7/scipy-1.14.1-cp313-cp313-win_amd64.whl", hash = "sha256:baff393942b550823bfce952bb62270ee17504d02a1801d7fd0719534dfb9c84", size = 44469524 }, + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ae/00/48c2f661e2816ccf2ecd77982f6605b2950afe60f60a52b4cbbc2504aa8f/scipy-1.13.1.tar.gz", hash = "sha256:095a87a0312b08dfd6a6155cbbd310a8c51800fc931b8c0b84003014b874ed3c", size = 57210720 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/33/59/41b2529908c002ade869623b87eecff3e11e3ce62e996d0bdcb536984187/scipy-1.13.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:20335853b85e9a49ff7572ab453794298bcf0354d8068c5f6775a0eabf350aca", size = 39328076 }, + { url = "https://files.pythonhosted.org/packages/d5/33/f1307601f492f764062ce7dd471a14750f3360e33cd0f8c614dae208492c/scipy-1.13.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:d605e9c23906d1994f55ace80e0125c587f96c020037ea6aa98d01b4bd2e222f", size = 30306232 }, + { url = "https://files.pythonhosted.org/packages/c0/66/9cd4f501dd5ea03e4a4572ecd874936d0da296bd04d1c45ae1a4a75d9c3a/scipy-1.13.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cfa31f1def5c819b19ecc3a8b52d28ffdcc7ed52bb20c9a7589669dd3c250989", size = 33743202 }, + { url = "https://files.pythonhosted.org/packages/a3/ba/7255e5dc82a65adbe83771c72f384d99c43063648456796436c9a5585ec3/scipy-1.13.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26264b282b9da0952a024ae34710c2aff7d27480ee91a2e82b7b7073c24722f", size = 38577335 }, + { url = "https://files.pythonhosted.org/packages/49/a5/bb9ded8326e9f0cdfdc412eeda1054b914dfea952bda2097d174f8832cc0/scipy-1.13.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:eccfa1906eacc02de42d70ef4aecea45415f5be17e72b61bafcfd329bdc52e94", size = 38820728 }, + { url = "https://files.pythonhosted.org/packages/12/30/df7a8fcc08f9b4a83f5f27cfaaa7d43f9a2d2ad0b6562cced433e5b04e31/scipy-1.13.1-cp310-cp310-win_amd64.whl", hash = "sha256:2831f0dc9c5ea9edd6e51e6e769b655f08ec6db6e2e10f86ef39bd32eb11da54", size = 46210588 }, + { url = "https://files.pythonhosted.org/packages/b4/15/4a4bb1b15bbd2cd2786c4f46e76b871b28799b67891f23f455323a0cdcfb/scipy-1.13.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:27e52b09c0d3a1d5b63e1105f24177e544a222b43611aaf5bc44d4a0979e32f9", size = 39333805 }, + { url = "https://files.pythonhosted.org/packages/ba/92/42476de1af309c27710004f5cdebc27bec62c204db42e05b23a302cb0c9a/scipy-1.13.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:54f430b00f0133e2224c3ba42b805bfd0086fe488835effa33fa291561932326", size = 30317687 }, + { url = "https://files.pythonhosted.org/packages/80/ba/8be64fe225360a4beb6840f3cbee494c107c0887f33350d0a47d55400b01/scipy-1.13.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e89369d27f9e7b0884ae559a3a956e77c02114cc60a6058b4e5011572eea9299", size = 33694638 }, + { url = "https://files.pythonhosted.org/packages/36/07/035d22ff9795129c5a847c64cb43c1fa9188826b59344fee28a3ab02e283/scipy-1.13.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a78b4b3345f1b6f68a763c6e25c0c9a23a9fd0f39f5f3d200efe8feda560a5fa", size = 38569931 }, + { url = "https://files.pythonhosted.org/packages/d9/10/f9b43de37e5ed91facc0cfff31d45ed0104f359e4f9a68416cbf4e790241/scipy-1.13.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:45484bee6d65633752c490404513b9ef02475b4284c4cfab0ef946def50b3f59", size = 38838145 }, + { url = "https://files.pythonhosted.org/packages/4a/48/4513a1a5623a23e95f94abd675ed91cfb19989c58e9f6f7d03990f6caf3d/scipy-1.13.1-cp311-cp311-win_amd64.whl", hash = "sha256:5713f62f781eebd8d597eb3f88b8bf9274e79eeabf63afb4a737abc6c84ad37b", size = 46196227 }, + { url = "https://files.pythonhosted.org/packages/f2/7b/fb6b46fbee30fc7051913068758414f2721003a89dd9a707ad49174e3843/scipy-1.13.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5d72782f39716b2b3509cd7c33cdc08c96f2f4d2b06d51e52fb45a19ca0c86a1", size = 39357301 }, + { url = "https://files.pythonhosted.org/packages/dc/5a/2043a3bde1443d94014aaa41e0b50c39d046dda8360abd3b2a1d3f79907d/scipy-1.13.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:017367484ce5498445aade74b1d5ab377acdc65e27095155e448c88497755a5d", size = 30363348 }, + { url = "https://files.pythonhosted.org/packages/e7/cb/26e4a47364bbfdb3b7fb3363be6d8a1c543bcd70a7753ab397350f5f189a/scipy-1.13.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:949ae67db5fa78a86e8fa644b9a6b07252f449dcf74247108c50e1d20d2b4627", size = 33406062 }, + { url = "https://files.pythonhosted.org/packages/88/ab/6ecdc526d509d33814835447bbbeedbebdec7cca46ef495a61b00a35b4bf/scipy-1.13.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de3ade0e53bc1f21358aa74ff4830235d716211d7d077e340c7349bc3542e884", size = 38218311 }, + { url = "https://files.pythonhosted.org/packages/0b/00/9f54554f0f8318100a71515122d8f4f503b1a2c4b4cfab3b4b68c0eb08fa/scipy-1.13.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2ac65fb503dad64218c228e2dc2d0a0193f7904747db43014645ae139c8fad16", size = 38442493 }, + { url = "https://files.pythonhosted.org/packages/3e/df/963384e90733e08eac978cd103c34df181d1fec424de383cdc443f418dd4/scipy-1.13.1-cp312-cp312-win_amd64.whl", hash = "sha256:cdd7dacfb95fea358916410ec61bbc20440f7860333aee6d882bb8046264e949", size = 45910955 }, + { url = "https://files.pythonhosted.org/packages/7f/29/c2ea58c9731b9ecb30b6738113a95d147e83922986b34c685b8f6eefde21/scipy-1.13.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:436bbb42a94a8aeef855d755ce5a465479c721e9d684de76bf61a62e7c2b81d5", size = 39352927 }, + { url = "https://files.pythonhosted.org/packages/5c/c0/e71b94b20ccf9effb38d7147c0064c08c622309fd487b1b677771a97d18c/scipy-1.13.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:8335549ebbca860c52bf3d02f80784e91a004b71b059e3eea9678ba994796a24", size = 30324538 }, + { url = "https://files.pythonhosted.org/packages/6d/0f/aaa55b06d474817cea311e7b10aab2ea1fd5d43bc6a2861ccc9caec9f418/scipy-1.13.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d533654b7d221a6a97304ab63c41c96473ff04459e404b83275b60aa8f4b7004", size = 33732190 }, + { url = "https://files.pythonhosted.org/packages/35/f5/d0ad1a96f80962ba65e2ce1de6a1e59edecd1f0a7b55990ed208848012e0/scipy-1.13.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:637e98dcf185ba7f8e663e122ebf908c4702420477ae52a04f9908707456ba4d", size = 38612244 }, + { url = "https://files.pythonhosted.org/packages/8d/02/1165905f14962174e6569076bcc3315809ae1291ed14de6448cc151eedfd/scipy-1.13.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a014c2b3697bde71724244f63de2476925596c24285c7a637364761f8710891c", size = 38845637 }, + { url = "https://files.pythonhosted.org/packages/3e/77/dab54fe647a08ee4253963bcd8f9cf17509c8ca64d6335141422fe2e2114/scipy-1.13.1-cp39-cp39-win_amd64.whl", hash = "sha256:392e4ec766654852c25ebad4f64e4e584cf19820b980bc04960bca0b0cd6eaa2", size = 46227440 }, ] [[package]] name = "setuptools" -version = "75.1.0" +version = "75.2.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/27/b8/f21073fde99492b33ca357876430822e4800cdf522011f18041351dfa74b/setuptools-75.1.0.tar.gz", hash = "sha256:d59a21b17a275fb872a9c3dae73963160ae079f1049ed956880cd7c09b120538", size = 1348057 } +sdist = { url = "https://files.pythonhosted.org/packages/07/37/b31be7e4b9f13b59cde9dcaeff112d401d49e0dc5b37ed4a9fc8fb12f409/setuptools-75.2.0.tar.gz", hash = "sha256:753bb6ebf1f465a1912e19ed1d41f403a79173a9acf66a42e7e6aec45c3c16ec", size = 1350308 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ff/ae/f19306b5a221f6a436d8f2238d5b80925004093fa3edea59835b514d9057/setuptools-75.1.0-py3-none-any.whl", hash = "sha256:35ab7fd3bcd95e6b7fd704e4a1539513edad446c097797f2985e0e4b960772f2", size = 1248506 }, + { url = "https://files.pythonhosted.org/packages/31/2d/90165d51ecd38f9a02c6832198c13a4e48652485e2ccf863ebb942c531b6/setuptools-75.2.0-py3-none-any.whl", hash = "sha256:a7fcb66f68b4d9e8e66b42f9876150a3371558f98fa32222ffaa5bced76406f8", size = 1249825 }, ] [[package]] @@ -1261,9 +1332,9 @@ name = "stack-data" version = "0.6.3" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "asttokens", marker = "python_full_version >= '3.10'" }, - { name = "executing", marker = "python_full_version >= '3.10'" }, - { name = "pure-eval", marker = "python_full_version >= '3.10'" }, + { name = "asttokens" }, + { name = "executing" }, + { name = "pure-eval" }, ] sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707 } wheels = [ @@ -1272,14 +1343,14 @@ wheels = [ [[package]] name = "sympy" -version = "1.13.2" +version = "1.13.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "mpmath", marker = "python_full_version >= '3.10'" }, + { name = "mpmath" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/94/15/4a041424c7187f41cce678f5a02189b244e9aac61a18b45cd415a3a470f3/sympy-1.13.2.tar.gz", hash = "sha256:401449d84d07be9d0c7a46a64bd54fe097667d5e7181bfe67ec777be9e01cb13", size = 7532926 } +sdist = { url = "https://files.pythonhosted.org/packages/ca/99/5a5b6f19ff9f083671ddf7b9632028436167cd3d33e11015754e41b249a4/sympy-1.13.1.tar.gz", hash = "sha256:9cebf7e04ff162015ce31c9c6c9144daa34a93bd082f54fd8f12deca4f47515f", size = 7533040 } wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/f9/6845bf8fca0eaf847da21c5d5bc6cd92797364662824a11d3f836423a1a5/sympy-1.13.2-py3-none-any.whl", hash = "sha256:c51d75517712f1aed280d4ce58506a4a88d635d6b5dd48b39102a7ae1f3fcfe9", size = 6189289 }, + { url = "https://files.pythonhosted.org/packages/b2/fe/81695a1aa331a842b582453b605175f419fe8540355886031328089d840a/sympy-1.13.1-py3-none-any.whl", hash = "sha256:db36cdc64bf61b9b24578b6f7bab1ecdd2452cf008f34faa33776680c26d66f8", size = 6189177 }, ] [[package]] @@ -1296,7 +1367,7 @@ name = "tokenizers" version = "0.20.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "huggingface-hub", marker = "python_full_version >= '3.10'" }, + { name = "huggingface-hub" }, ] sdist = { url = "https://files.pythonhosted.org/packages/d7/fb/373b66ba58cbf5eda371480e4e051d8892ea1433a73f1f92c48657a699a6/tokenizers-0.20.1.tar.gz", hash = "sha256:84edcc7cdeeee45ceedb65d518fffb77aec69311c9c8e30f77ad84da3025f002", size = 339552 } wheels = [ @@ -1366,54 +1437,57 @@ wheels = [ [[package]] name = "tomli" -version = "2.0.1" +version = "2.0.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c0/3f/d7af728f075fb08564c5949a9c95e44352e23dee646869fa104a3b2060a3/tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f", size = 15164 } +sdist = { url = "https://files.pythonhosted.org/packages/35/b9/de2a5c0144d7d75a57ff355c0c24054f965b2dc3036456ae03a51ea6264b/tomli-2.0.2.tar.gz", hash = "sha256:d46d457a85337051c36524bc5349dd91b1877838e2979ac5ced3e710ed8a60ed", size = 16096 } wheels = [ - { url = "https://files.pythonhosted.org/packages/97/75/10a9ebee3fd790d20926a90a2547f0bf78f371b2f13aa822c759680ca7b9/tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", size = 12757 }, + { url = "https://files.pythonhosted.org/packages/cf/db/ce8eda256fa131af12e0a76d481711abe4681b6923c27efb9a255c9e4594/tomli-2.0.2-py3-none-any.whl", hash = "sha256:2ebe24485c53d303f690b0ec092806a085f07af5a5aa1464f3931eec36caaa38", size = 13237 }, ] [[package]] name = "torch" -version = "2.4.1" +version = "2.5.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "filelock", marker = "python_full_version >= '3.10'" }, - { name = "fsspec", marker = "python_full_version >= '3.10'" }, - { name = "jinja2", marker = "python_full_version >= '3.10'" }, - { name = "networkx", marker = "python_full_version >= '3.10'" }, - { name = "nvidia-cublas-cu12", marker = "python_full_version >= '3.10' and platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-cuda-cupti-cu12", marker = "python_full_version >= '3.10' and platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-cuda-nvrtc-cu12", marker = "python_full_version >= '3.10' and platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-cuda-runtime-cu12", marker = "python_full_version >= '3.10' and platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-cudnn-cu12", marker = "python_full_version >= '3.10' and platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-cufft-cu12", marker = "python_full_version >= '3.10' and platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-curand-cu12", marker = "python_full_version >= '3.10' and platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-cusolver-cu12", marker = "python_full_version >= '3.10' and platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-cusparse-cu12", marker = "python_full_version >= '3.10' and platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-nccl-cu12", marker = "python_full_version >= '3.10' and platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-nvtx-cu12", marker = "python_full_version >= '3.10' and platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "sympy", marker = "python_full_version >= '3.10'" }, - { name = "triton", marker = "python_full_version >= '3.10' and python_full_version < '3.13' and platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "typing-extensions", marker = "python_full_version >= '3.10'" }, -] -wheels = [ - { url = "https://files.pythonhosted.org/packages/41/05/d540049b1832d1062510efc6829634b7fbef5394c757d8312414fb65a3cb/torch-2.4.1-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:362f82e23a4cd46341daabb76fba08f04cd646df9bfaf5da50af97cb60ca4971", size = 797072810 }, - { url = "https://files.pythonhosted.org/packages/a0/12/2162df9c47386ae7cedbc938f9703fee4792d93504fab8608d541e71ece3/torch-2.4.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:e8ac1985c3ff0f60d85b991954cfc2cc25f79c84545aead422763148ed2759e3", size = 89699259 }, - { url = "https://files.pythonhosted.org/packages/5d/4c/b2a59ff0e265f5ee154f0d81e948b1518b94f545357731e1a3245ee5d45b/torch-2.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:91e326e2ccfb1496e3bee58f70ef605aeb27bd26be07ba64f37dcaac3d070ada", size = 199433813 }, - { url = "https://files.pythonhosted.org/packages/dc/fb/1333ba666bbd53846638dd75a7a1d4eaf964aff1c482fc046e2311a1b499/torch-2.4.1-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:d36a8ef100f5bff3e9c3cea934b9e0d7ea277cb8210c7152d34a9a6c5830eadd", size = 62139309 }, - { url = "https://files.pythonhosted.org/packages/ea/ea/4ab009e953bca6ff35ad75b8ab58c0923308636c182c145dc63084f7d136/torch-2.4.1-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:0b5f88afdfa05a335d80351e3cea57d38e578c8689f751d35e0ff36bce872113", size = 797111232 }, - { url = "https://files.pythonhosted.org/packages/8f/a1/b31f94b4631c1731261db9fdc9a749ef58facc3b76094a6fe974f611f239/torch-2.4.1-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:ef503165f2341942bfdf2bd520152f19540d0c0e34961232f134dc59ad435be8", size = 89719574 }, - { url = "https://files.pythonhosted.org/packages/5a/6a/775b93d6888c31f1f1fc457e4f5cc89f0984412d5dcdef792b8f2aa6e812/torch-2.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:092e7c2280c860eff762ac08c4bdcd53d701677851670695e0c22d6d345b269c", size = 199436128 }, - { url = "https://files.pythonhosted.org/packages/1f/34/c93873c37f93154d982172755f7e504fdbae6c760499303a3111ce6ce327/torch-2.4.1-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:ddddbd8b066e743934a4200b3d54267a46db02106876d21cf31f7da7a96f98ea", size = 62145176 }, - { url = "https://files.pythonhosted.org/packages/cc/df/5204a13a7a973c23c7ade615bafb1a3112b5d0ec258d8390f078fa4ab0f7/torch-2.4.1-cp312-cp312-manylinux1_x86_64.whl", hash = "sha256:fdc4fe11db3eb93c1115d3e973a27ac7c1a8318af8934ffa36b0370efe28e042", size = 797019590 }, - { url = "https://files.pythonhosted.org/packages/4f/16/d23a689e5ef8001ed2ace1a3a59f2fda842889b0c3f3877799089925282a/torch-2.4.1-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:18835374f599207a9e82c262153c20ddf42ea49bc76b6eadad8e5f49729f6e4d", size = 89613802 }, - { url = "https://files.pythonhosted.org/packages/a8/e0/ca8354dfb8d834a76da51b06e8248b70fc182bc163540507919124974bdf/torch-2.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:ebea70ff30544fc021d441ce6b219a88b67524f01170b1c538d7d3ebb5e7f56c", size = 199387694 }, - { url = "https://files.pythonhosted.org/packages/ac/30/8b6f77ea4ce84f015ee024b8dfef0dac289396254e8bfd493906d4cbb848/torch-2.4.1-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:72b484d5b6cec1a735bf3fa5a1c4883d01748698c5e9cfdbeb4ffab7c7987e0d", size = 62123443 }, - { url = "https://files.pythonhosted.org/packages/14/d6/caa3ccde685a3bfedeed1454d82b2eb520e611d1b36bf748f54475de333f/torch-2.4.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:40f6d3fe3bae74efcf08cb7f8295eaddd8a838ce89e9d26929d4edd6d5e4329d", size = 797088350 }, - { url = "https://files.pythonhosted.org/packages/3d/5d/4e9a7e5b7f11710519c38fe6a9f588a91fd23e6e9722e79f90f03823222d/torch-2.4.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:c9299c16c9743001ecef515536ac45900247f4338ecdf70746f2461f9e4831db", size = 89706796 }, - { url = "https://files.pythonhosted.org/packages/ef/44/238ef95daf345bab21afa0ca37b2896dfc20cd93b6b75722717685fdeb10/torch-2.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:6bce130f2cd2d52ba4e2c6ada461808de7e5eccbac692525337cfb4c19421846", size = 199332260 }, - { url = "https://files.pythonhosted.org/packages/e7/81/c05013695bfb3762f3c657a557407f152a0a0452b3ccec437a4a59848fb5/torch-2.4.1-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:a38de2803ee6050309aac032676536c3d3b6a9804248537e38e098d0e14817ec", size = 62139344 }, + { name = "filelock" }, + { name = "fsspec" }, + { name = "jinja2" }, + { name = "networkx" }, + { name = "nvidia-cublas-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, + { name = "nvidia-cuda-cupti-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, + { name = "nvidia-cuda-nvrtc-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, + { name = "nvidia-cuda-runtime-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, + { name = "nvidia-cudnn-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, + { name = "nvidia-cufft-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, + { name = "nvidia-curand-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, + { name = "nvidia-cusolver-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, + { name = "nvidia-cusparse-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, + { name = "nvidia-nccl-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, + { name = "nvidia-nvjitlink-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, + { name = "nvidia-nvtx-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, + { name = "setuptools", marker = "python_full_version >= '3.12'" }, + { name = "sympy" }, + { name = "triton", marker = "python_full_version < '3.13' and platform_machine == 'x86_64' and platform_system == 'Linux'" }, + { name = "typing-extensions" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/82/adc3a77b9fbbcb79d398d565d39dc0e09f43fff088599d15da81e6cfaaec/torch-2.5.0-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:7f179373a047b947dec448243f4e6598a1c960fa3bb978a9a7eecd529fbc363f", size = 906443143 }, + { url = "https://files.pythonhosted.org/packages/64/b0/0d2056c8d379a3f7f0c9fa9adece180f64fd6c339e2007a4fffbea7ecaa0/torch-2.5.0-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:15fbc95e38d330e5b0ef1593b7bc0a19f30e5bdad76895a5cffa1a6a044235e9", size = 91839507 }, + { url = "https://files.pythonhosted.org/packages/60/41/073193dd2566012eaeae44d6c5e55ba6a9b1d5687a251f12e1804a9e2968/torch-2.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:f499212f1cffea5d587e5f06144630ed9aa9c399bba12ec8905798d833bd1404", size = 203108822 }, + { url = "https://files.pythonhosted.org/packages/93/d4/6e7bda4e52c37a78b5066e407baff2426fd4543356ead3419383a0bf4011/torch-2.5.0-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:c54db1fade17287aabbeed685d8e8ab3a56fea9dd8d46e71ced2da367f09a49f", size = 64283014 }, + { url = "https://files.pythonhosted.org/packages/75/9f/cde8b71ccca65d68a3733c5c9decef9adefcfaa692f8ab03afbb5de09daa/torch-2.5.0-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:499a68a756d3b30d10f7e0f6214dc3767b130b797265db3b1c02e9094e2a07be", size = 906478039 }, + { url = "https://files.pythonhosted.org/packages/58/27/5bacfb6600209bf7e77ba115656cf7aca5b6ab1e0dc95551eefac2d6e7ec/torch-2.5.0-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:9f3df8138a1126a851440b7d5a4869bfb7c9cc43563d64fd9d96d0465b581024", size = 91843630 }, + { url = "https://files.pythonhosted.org/packages/78/18/7a2e56e2dc45a433dea9e1bf46a65e234294c9c470ccb4d4b53025f57b23/torch-2.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:b81da3bdb58c9de29d0e1361e52f12fcf10a89673f17a11a5c6c7da1cb1a8376", size = 203117099 }, + { url = "https://files.pythonhosted.org/packages/47/1b/3dfcc84b383f7b27a41de3251753db077b1e23d3f89a3b294cdd2d86fb7b/torch-2.5.0-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:ba135923295d564355326dc409b6b7f5bd6edc80f764cdaef1fb0a1b23ff2f9c", size = 64288133 }, + { url = "https://files.pythonhosted.org/packages/ac/72/d610029ef5cdde3f3aa216e8e75c233b1a91b34af0fc47392b3aa928563a/torch-2.5.0-cp312-cp312-manylinux1_x86_64.whl", hash = "sha256:2dd40c885a05ef7fe29356cca81be1435a893096ceb984441d6e2c27aff8c6f4", size = 906389657 }, + { url = "https://files.pythonhosted.org/packages/22/c2/d1759641eafdf59cb3a339909e96c842fc0c3579681bb7422acaf4a2c179/torch-2.5.0-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:bc52d603d87fe1da24439c0d5fdbbb14e0ae4874451d53f0120ffb1f6c192727", size = 91823361 }, + { url = "https://files.pythonhosted.org/packages/2b/e3/0f2698930d944087c3ef585b71a1a72aa51929877c1ccf35d625bec9bd78/torch-2.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:ea718746469246cc63b3353afd75698a288344adb55e29b7f814a5d3c0a7c78d", size = 203064894 }, + { url = "https://files.pythonhosted.org/packages/56/88/f1ddffd642cf71777dca43621b170d50f13175cdd0b4179e04d6e025b5fb/torch-2.5.0-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:6de1fd253e27e7f01f05cd7c37929ae521ca23ca4620cfc7c485299941679112", size = 64261171 }, + { url = "https://files.pythonhosted.org/packages/b4/b1/f06261814df00eee07ac8cf697a6f5d79231d9894c996d5985243343518a/torch-2.5.0-cp313-cp313-manylinux1_x86_64.whl", hash = "sha256:83dcf518685db20912b71fc49cbddcc8849438cdb0e9dcc919b02a849e2cd9e8", size = 906416128 }, + { url = "https://files.pythonhosted.org/packages/b0/58/a948b83de013d896852aebb98da952917325d8f7d65442fe39a185e2e37b/torch-2.5.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:65e0a60894435608334d68c8811e55fd8f73e5bf8ee6f9ccedb0064486a7b418", size = 906461931 }, + { url = "https://files.pythonhosted.org/packages/5b/72/db1166e4567dfef26c13ccc2c55a5fa0da42d44da362bea5d2208f1cfb7e/torch-2.5.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:38c21ff1bd39f076d72ab06e3c88c2ea6874f2e6f235c9450816b6c8e7627094", size = 91846667 }, + { url = "https://files.pythonhosted.org/packages/51/e6/da1e4f31ef14b337ae2e96d85471ec94f1d3e4309f36e361740bb9dddcb8/torch-2.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:ce4baeba9804da5a346e210b3b70826f5811330c343e4fe1582200359ee77fe5", size = 203000980 }, + { url = "https://files.pythonhosted.org/packages/56/03/963696bcb9263fdc93faca428a5494c59a17b51644ab7d62320f002a5a2a/torch-2.5.0-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:03e53f577a96e4d41aca472da8faa40e55df89d2273664af390ce1f570e885bd", size = 64282068 }, ] [[package]] @@ -1421,7 +1495,7 @@ name = "tqdm" version = "4.66.5" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "colorama", marker = "python_full_version >= '3.10' and platform_system == 'Windows'" }, + { name = "colorama", marker = "platform_system == 'Windows'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/58/83/6ba9844a41128c62e810fddddd72473201f3eacde02046066142a2d96cc5/tqdm-4.66.5.tar.gz", hash = "sha256:e1020aef2e5096702d8a025ac7d16b1577279c9d63f8375b63083e9a5f0fcbad", size = 169504 } wheels = [ @@ -1442,16 +1516,16 @@ name = "transformers" version = "4.45.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "filelock", marker = "python_full_version >= '3.10'" }, - { name = "huggingface-hub", marker = "python_full_version >= '3.10'" }, - { name = "numpy", marker = "python_full_version >= '3.10'" }, - { name = "packaging", marker = "python_full_version >= '3.10'" }, - { name = "pyyaml", marker = "python_full_version >= '3.10'" }, - { name = "regex", marker = "python_full_version >= '3.10'" }, - { name = "requests", marker = "python_full_version >= '3.10'" }, - { name = "safetensors", marker = "python_full_version >= '3.10'" }, - { name = "tokenizers", marker = "python_full_version >= '3.10'" }, - { name = "tqdm", marker = "python_full_version >= '3.10'" }, + { name = "filelock" }, + { name = "huggingface-hub" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pyyaml" }, + { name = "regex" }, + { name = "requests" }, + { name = "safetensors" }, + { name = "tokenizers" }, + { name = "tqdm" }, ] sdist = { url = "https://files.pythonhosted.org/packages/4b/4c/3862b2dd6cdf83b187897bd351da0f7fb74d0df642b03c6f5d06353a3ca0/transformers-4.45.2.tar.gz", hash = "sha256:72bc390f6b203892561f05f86bbfaa0e234aab8e927a83e62b9d92ea7e3ae101", size = 8478357 } wheels = [ @@ -1460,16 +1534,16 @@ wheels = [ [[package]] name = "triton" -version = "3.0.0" +version = "3.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "filelock", marker = "python_full_version >= '3.10' and python_full_version < '3.13'" }, + { name = "filelock" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/45/27/14cc3101409b9b4b9241d2ba7deaa93535a217a211c86c4cc7151fb12181/triton-3.0.0-1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e1efef76935b2febc365bfadf74bcb65a6f959a9872e5bddf44cc9e0adce1e1a", size = 209376304 }, - { url = "https://files.pythonhosted.org/packages/33/3e/a2f59384587eff6aeb7d37b6780de7fedd2214935e27520430ca9f5b7975/triton-3.0.0-1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5ce8520437c602fb633f1324cc3871c47bee3b67acf9756c1a66309b60e3216c", size = 209438883 }, - { url = "https://files.pythonhosted.org/packages/fe/7b/7757205dee3628f75e7991021d15cd1bd0c9b044ca9affe99b50879fc0e1/triton-3.0.0-1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:34e509deb77f1c067d8640725ef00c5cbfcb2052a1a3cb6a6d343841f92624eb", size = 209464695 }, - { url = "https://files.pythonhosted.org/packages/6c/bf/55cccf57c14787ad81ee827526ddd48fd0aff0291fcc7b8c2e2bdf28da0a/triton-3.0.0-1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6e5727202f7078c56f91ff13ad0c1abab14a0e7f2c87e91b12b6f64f3e8ae609", size = 209377082 }, + { url = "https://files.pythonhosted.org/packages/98/29/69aa56dc0b2eb2602b553881e34243475ea2afd9699be042316842788ff5/triton-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b0dd10a925263abbe9fa37dcde67a5e9b2383fc269fdf59f5657cac38c5d1d8", size = 209460013 }, + { url = "https://files.pythonhosted.org/packages/86/17/d9a5cf4fcf46291856d1e90762e36cbabd2a56c7265da0d1d9508c8e3943/triton-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f34f6e7885d1bf0eaaf7ba875a5f0ce6f3c13ba98f9503651c1e6dc6757ed5c", size = 209506424 }, + { url = "https://files.pythonhosted.org/packages/78/eb/65f5ba83c2a123f6498a3097746607e5b2f16add29e36765305e4ac7fdd8/triton-3.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8182f42fd8080a7d39d666814fa36c5e30cc00ea7eeeb1a2983dbb4c99a0fdc", size = 209551444 }, + { url = "https://files.pythonhosted.org/packages/c4/69/57e0fed438d547524e08bfedc587078314176ad1c15c8be904d3f03149ec/triton-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aafa9a20cd0d9fee523cd4504aa7131807a864cd77dcf6efe7e981f18b8c6c11", size = 209460480 }, ] [[package]] @@ -1483,25 +1557,25 @@ wheels = [ [[package]] name = "urllib3" -version = "2.2.2" +version = "2.2.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/43/6d/fa469ae21497ddc8bc93e5877702dca7cb8f911e337aca7452b5724f1bb6/urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168", size = 292266 } +sdist = { url = "https://files.pythonhosted.org/packages/ed/63/22ba4ebfe7430b76388e7cd448d5478814d3032121827c12a2cc287e2260/urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9", size = 300677 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ca/1c/89ffc63a9605b583d5df2be791a27bc1a42b7c32bab68d3c8f2f73a98cd4/urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472", size = 121444 }, + { url = "https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", size = 126338 }, ] [[package]] name = "virtualenv" -version = "20.26.3" +version = "20.27.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "distlib", marker = "python_full_version >= '3.10'" }, - { name = "filelock", marker = "python_full_version >= '3.10'" }, - { name = "platformdirs", marker = "python_full_version >= '3.10'" }, + { name = "distlib" }, + { name = "filelock" }, + { name = "platformdirs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/68/60/db9f95e6ad456f1872486769c55628c7901fb4de5a72c2f7bdd912abf0c1/virtualenv-20.26.3.tar.gz", hash = "sha256:4c43a2a236279d9ea36a0d76f98d84bd6ca94ac4e0f4a3b9d46d05e10fea542a", size = 9057588 } +sdist = { url = "https://files.pythonhosted.org/packages/10/7f/192dd6ab6d91ebea7adf6c030eaf549b1ec0badda9f67a77b633602f66ac/virtualenv-20.27.0.tar.gz", hash = "sha256:2ca56a68ed615b8fe4326d11a0dca5dfbe8fd68510fb6c6349163bed3c15f2b2", size = 6483858 } wheels = [ - { url = "https://files.pythonhosted.org/packages/07/4d/410156100224c5e2f0011d435e477b57aed9576fc7fe137abcf14ec16e11/virtualenv-20.26.3-py3-none-any.whl", hash = "sha256:8cc4a31139e796e9a7de2cd5cf2489de1217193116a8fd42328f1bd65f434589", size = 5684792 }, + { url = "https://files.pythonhosted.org/packages/c8/15/828ec11907aee2349a9342fa71fba4ba7f3af938162a382dd7da339dea16/virtualenv-20.27.0-py3-none-any.whl", hash = "sha256:44a72c29cceb0ee08f300b314848c86e57bf8d1f13107a5e671fb9274138d655", size = 3110969 }, ] [[package]] From 6941c7d05d3cfac70ddd0db65ade1b2691994143 Mon Sep 17 00:00:00 2001 From: Thomas van Dongen Date: Sun, 20 Oct 2024 17:01:49 +0200 Subject: [PATCH 20/30] Reverted eos bos change (#101) --- model2vec/distill/inference.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/model2vec/distill/inference.py b/model2vec/distill/inference.py index 81ac348..fcc80d0 100644 --- a/model2vec/distill/inference.py +++ b/model2vec/distill/inference.py @@ -124,7 +124,8 @@ def create_output_embeddings_from_model_name( bos = torch.full([len(ids)], fill_value=bos_token_id) eos = torch.full([len(ids)], fill_value=eos_token_id) - stacked = torch.stack([bos, ids, eos], dim=1) + # NOTE: reversing the bos and eos tokens works better on our benchmarks. + stacked = torch.stack([eos, ids, bos], dim=1) intermediate_weights: list[np.ndarray] = [] for batch_idx in tqdm(range(0, len(stacked), _DEFAULT_BATCH_SIZE)): From caf2992cc641ff67fb4751ef24eade8cfe66440f Mon Sep 17 00:00:00 2001 From: Thomas van Dongen Date: Sun, 20 Oct 2024 17:17:08 +0200 Subject: [PATCH 21/30] docs: Added results link (#102) * Added results link * Added results link --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d8a11e7..1cf9c50 100644 --- a/README.md +++ b/README.md @@ -14,8 +14,8 @@

🤗 Models | 📚 Tutorials | - 💻 Website | - 📖 Blog + 📖 Blog | + 🏆 Results

From 90937fcb8b5c14200f83f718208c0eb00ea58a1b Mon Sep 17 00:00:00 2001 From: Thomas van Dongen Date: Sun, 20 Oct 2024 17:31:29 +0200 Subject: [PATCH 22/30] docs: Fixed broken link (#103) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1cf9c50..0c8f54b 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ 🤗 Models | 📚 Tutorials | 📖 Blog | - 🏆 Results + 🏆 Results From 9c73fdf195e0ba053e2953b36b4d89b02e76f2e5 Mon Sep 17 00:00:00 2001 From: Stephan Tulkens Date: Mon, 21 Oct 2024 08:58:08 +0200 Subject: [PATCH 23/30] increment version (#104) --- model2vec/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/model2vec/version.py b/model2vec/version.py index 5feea58..b7e3609 100644 --- a/model2vec/version.py +++ b/model2vec/version.py @@ -1,2 +1,2 @@ -__version_triple__ = (0, 2, 4) +__version_triple__ = (0, 3, 0) __version__ = ".".join(map(str, __version_triple__)) From 2f57b9cf02aa8e5450621f9854fc1a78ac5215d3 Mon Sep 17 00:00:00 2001 From: Stephan Tulkens Date: Wed, 23 Oct 2024 13:28:22 +0200 Subject: [PATCH 24/30] fix: update added tokens to be more agnostic (#107) --- model2vec/distill/tokenizer.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/model2vec/distill/tokenizer.py b/model2vec/distill/tokenizer.py index 173a2f2..e6c3087 100644 --- a/model2vec/distill/tokenizer.py +++ b/model2vec/distill/tokenizer.py @@ -2,6 +2,7 @@ import json import logging +from typing import Any from tokenizers import Tokenizer @@ -36,11 +37,11 @@ def remove_tokens(tokenizer: Tokenizer, tokens_to_remove: list[str]) -> Tokenize logger.info("No tokens to remove.") return Tokenizer.from_str(tokenizer.to_str()) - tokenizer_data = json.loads(tokenizer.to_str()) + tokenizer_data: dict[str, Any] = json.loads(tokenizer.to_str()) # Find all added tokens - added_tokens = tokenizer_data["added_tokens"] - added_tokens_str = {token["content"] for token in added_tokens} + added_tokens: list[dict[str, Any]] = tokenizer_data.get("added_tokens", []) + added_tokens_str: set[str] = {token["content"] for token in added_tokens} # Remove all added tokens from the list of tokens to remove. # Things will go bad if we keep them. @@ -76,9 +77,9 @@ def remove_tokens(tokenizer: Tokenizer, tokens_to_remove: list[str]) -> Tokenize raise ValueError(f"Unknown model type {model_type}") # Reindex the special tokens (i.e., CLS and SEP for BertTokenizers.) - special_tokens_post_processor: dict[str, dict] = tokenizer_data["post_processor"]["special_tokens"] - for token, token_data in special_tokens_post_processor.items(): - token_data["ids"] = [reindexed[token] for token in token_data["tokens"]] + added_tokens = tokenizer_data.get("added_tokens", []) + for token_data in added_tokens: + token_data["id"] = reindexed[token_data["content"]] # Reinitialize the tokenizer from the json. tokenizer = Tokenizer.from_str(json.dumps(tokenizer_data)) From 5ed70a67345f47b2068ce12c6d94dfc518035eec Mon Sep 17 00:00:00 2001 From: Stephan Tulkens Date: Wed, 23 Oct 2024 13:28:39 +0200 Subject: [PATCH 25/30] fix: don't rely on reported vocab size, log warning if inconsistent (#109) --- model2vec/distill/inference.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/model2vec/distill/inference.py b/model2vec/distill/inference.py index fcc80d0..a8dbfcc 100644 --- a/model2vec/distill/inference.py +++ b/model2vec/distill/inference.py @@ -115,7 +115,15 @@ def create_output_embeddings_from_model_name( :return: The tokens and output embeddings. """ model = model.to(device) - ids = torch.arange(tokenizer.vocab_size) + + # Quick check to see if the tokenizer is consistent. + vocab_length = len(tokenizer.get_vocab()) + if vocab_length != tokenizer.vocab_size: + logger.warning( + f"Reported vocab size {tokenizer.vocab_size} is inconsistent with the vocab size {vocab_length}." + ) + + ids = torch.arange(vocab_length) # Work-around to get the eos and bos token ids without having to go into tokenizer internals. dummy_encoding = tokenizer.encode("A") From 2fe48d506347b38edb510c5507012a74733d7e72 Mon Sep 17 00:00:00 2001 From: Thomas van Dongen Date: Fri, 25 Oct 2024 12:57:37 +0200 Subject: [PATCH 26/30] docs: Fixed broken links (#112) * Fixed links * Updated install command --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 0c8f54b..6375c65 100644 --- a/README.md +++ b/README.md @@ -46,9 +46,9 @@ Model2Vec is a technique to turn any sentence transformer into a really small st - [Main Features](#main-features) - [What is Model2Vec?](#what-is-model2vec) - [Usage](#usage) - - [Distilling a Model2Vec model](#distilling-a-model2vec-model) - - [Inferencing a Model2Vec model](#inference-with-a-model2vec-model) - - [Evaluating a Model2Vec model](#evaluating-a-model2vec-model) + - [Distillation](#distillation) + - [Inference](#inference) + - [Evaluation](#evaluation) - [Model List](#model-list) - [Results](#results) - [Related Work](#related-work) @@ -307,7 +307,7 @@ embeddings = model.encode(["It's dangerous to go alone!", "It's a secret to ever Our models can be evaluated using our [evaluation package](https://github.com/MinishLab/evaluation). Install the evaluation package with: ```bash -pip install evaluation@git+https://github.com MinishLab/evaluation@main +pip install git+https://github.com/MinishLab/evaluation.git@main ```
From 97c2f5e5760da6220695a993f38d5d4aeeb40058 Mon Sep 17 00:00:00 2001 From: Stephan Tulkens Date: Fri, 25 Oct 2024 13:12:44 +0200 Subject: [PATCH 27/30] feat: make encode_batch_fast optional (#113) * feat: make encode_batch_fast optional * add more tests --- model2vec/model.py | 10 +++++++++- tests/conftest.py | 2 +- tests/test_model.py | 21 +++++++++++++++++++++ 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/model2vec/model.py b/model2vec/model.py index 8160c69..8f689da 100644 --- a/model2vec/model.py +++ b/model2vec/model.py @@ -59,6 +59,10 @@ def __init__( self.config = config or {} self.base_model_name = base_model_name self.language = language + if hasattr(self.tokenizer, "encode_batch_fast"): + self._can_encode_fast = True + else: + self._can_encode_fast = False if normalize is not None: self.normalize = normalize @@ -121,7 +125,11 @@ def tokenize(self, sentences: list[str], max_length: int | None = None) -> list[ m = max_length * self.median_token_length sentences = [sentence[:m] for sentence in sentences] - encodings: list[Encoding] = self.tokenizer.encode_batch_fast(sentences, add_special_tokens=False) + if self._can_encode_fast: + encodings: list[Encoding] = self.tokenizer.encode_batch_fast(sentences, add_special_tokens=False) + else: + encodings = self.tokenizer.encode_batch(sentences, add_special_tokens=False) + encodings_ids = [encoding.ids for encoding in encodings] if self.unk_token_id is not None: diff --git a/tests/conftest.py b/tests/conftest.py index c407b8e..ced1abc 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -24,7 +24,7 @@ def mock_tokenizer() -> Tokenizer: return tokenizer -@pytest.fixture +@pytest.fixture(scope="function") def mock_berttokenizer() -> AutoTokenizer: """Load the real BertTokenizerFast from the provided tokenizer.json file.""" return AutoTokenizer.from_pretrained("tests/data/test_tokenizer") diff --git a/tests/test_model.py b/tests/test_model.py index 3064407..ac9bde1 100644 --- a/tests/test_model.py +++ b/tests/test_model.py @@ -25,6 +25,27 @@ def test_initialization_token_vector_mismatch(mock_tokenizer: Tokenizer, mock_co StaticModel(vectors=mock_vectors, tokenizer=mock_tokenizer, config=mock_config) +def test_tokenize(mock_vectors: np.ndarray, mock_tokenizer: Tokenizer, mock_config: dict[str, str]) -> None: + """Test tokenization of a sentence.""" + model = StaticModel(vectors=mock_vectors, tokenizer=mock_tokenizer, config=mock_config) + model._can_encode_fast = True + tokens_fast = model.tokenize(["word1 word2"]) + model._can_encode_fast = False + tokens_slow = model.tokenize(["word1 word2"]) + + assert tokens_fast == tokens_slow + + +def test_encode_batch_fast( + mock_vectors: np.ndarray, mock_berttokenizer: Tokenizer, mock_config: dict[str, str] +) -> None: + """Test tokenization of a sentence.""" + if hasattr(mock_berttokenizer, "encode_batch_fast"): + del mock_berttokenizer.encode_batch_fast + model = StaticModel(vectors=mock_vectors, tokenizer=mock_berttokenizer, config=mock_config) + assert not model._can_encode_fast + + def test_encode_single_sentence( mock_vectors: np.ndarray, mock_tokenizer: Tokenizer, mock_config: dict[str, str] ) -> None: From 261b02844d7a9965ba1de044b0b320b0e392c7ad Mon Sep 17 00:00:00 2001 From: Stephan Tulkens Date: Fri, 25 Oct 2024 13:54:00 +0200 Subject: [PATCH 28/30] fix: normalize would lead to NaN for empty docs (#114) --- model2vec/model.py | 3 ++- tests/test_model.py | 11 +++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/model2vec/model.py b/model2vec/model.py index 8f689da..cb2013e 100644 --- a/model2vec/model.py +++ b/model2vec/model.py @@ -272,7 +272,8 @@ def _encode_batch(self, sentences: list[str], max_length: int | None) -> np.ndar out_array = np.stack(out) if self.normalize: - out_array = out_array / np.linalg.norm(out_array, axis=1, keepdims=True) + norm = np.linalg.norm(out_array, axis=1, keepdims=True) + 1e-32 + out_array = out_array / norm return out_array diff --git a/tests/test_model.py b/tests/test_model.py index ac9bde1..aaed373 100644 --- a/tests/test_model.py +++ b/tests/test_model.py @@ -55,6 +55,17 @@ def test_encode_single_sentence( assert encoded.shape == (2,) +def test_encode_single_sentence_empty( + mock_vectors: np.ndarray, mock_tokenizer: Tokenizer, mock_config: dict[str, str] +) -> None: + """Test encoding of a single empty sentence.""" + model = StaticModel(vectors=mock_vectors, tokenizer=mock_tokenizer, config=mock_config) + model.normalize = True + encoded = model.encode("") + assert not np.isnan(encoded).any() + assert np.all(encoded == 0) + + def test_encode_multiple_sentences( mock_vectors: np.ndarray, mock_tokenizer: Tokenizer, mock_config: dict[str, str] ) -> None: From 16cc1110346509509c04fa85736ecfb27874f956 Mon Sep 17 00:00:00 2001 From: Thomas van Dongen Date: Tue, 29 Oct 2024 14:55:30 +0100 Subject: [PATCH 29/30] docs: Add tokenlearn results (#116) * Updated results * Updated model list * Updated model list * Removed benchmark * Updated readme * Updated readme * Added tokenlearn link * Added updates section * Update --- README.md | 34 ++++++++++------- assets/images/speed_vs_accuracy_v4.png | Bin 0 -> 121734 bytes assets/images/speed_vs_mteb_score.png | Bin 0 -> 122042 bytes results/README.md | 50 +++++++------------------ 4 files changed, 35 insertions(+), 49 deletions(-) create mode 100644 assets/images/speed_vs_accuracy_v4.png create mode 100644 assets/images/speed_vs_mteb_score.png diff --git a/README.md b/README.md index 6375c65..baad76a 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,11 @@ Model2Vec is a technique to turn any sentence transformer into a really small static model, reducing model size by 15x and making the models up to 500x faster, with a small drop in performance. See our results [here](results/README.md), or dive in to see how it works. + +## Updates & Announcements + +- **30/10/2024**: We released three new models: [potion-base-8M](https://huggingface.co/minishlab/potion-base-8M), [potion-base-4M](https://huggingface.co/minishlab/potion-base-4M), and [potion-base-2M](https://huggingface.co/minishlab/potion-base-2M). These models are trained using [Tokenlearn](https://github.com/MinishLab/tokenlearn). Find out more in our [blog post](https://minishlab.github.io/tokenlearn_blogpost/). NOTE: for users of any of our old English M2V models, we recommend switching to these new models as they [perform better on all tasks](https://github.com/MinishLab/model2vec/tree/main/results). + ## Table of Contents - [Quickstart](#quickstart) - [Main Features](#main-features) @@ -71,8 +76,8 @@ The easiest way to get started with Model2Vec is to download one of our [flagshi ```python from model2vec import StaticModel -# Load a model from the HuggingFace hub (in this case the M2V_base_output model) -model_name = "minishlab/M2V_base_output" +# Load a model from the HuggingFace hub (in this case the potion-base-8M model) +model_name = "minishlab/potion-base-8M" model = StaticModel.from_pretrained(model_name) # Make embeddings @@ -106,7 +111,7 @@ from sentence_transformers import SentenceTransformer from sentence_transformers.models import StaticEmbedding # Initialize a StaticEmbedding module -static_embedding = StaticEmbedding.from_model2vec("minishlab/M2V_base_output") +static_embedding = StaticEmbedding.from_model2vec("minishlab/potion-base-8M") model = SentenceTransformer(modules=[static_embedding]) embeddings = model.encode(["It's dangerous to go alone!", "It's a secret to everybody."]) ``` @@ -152,6 +157,9 @@ Model2vec has 3 modes: For a technical deepdive into Model2Vec, please refer to our [blog post](https://huggingface.co/blog/Pringled/model2vec). +### Tokenlearn + +Our flagship POTION models are pre-trained using [Tokenlearn](https://github.com/MinishLab/tokenlearn). This method is described in our [Tokenlearn blogpost](https://minishlab.github.io/tokenlearn_blogpost/). ## Usage @@ -265,7 +273,7 @@ Inference works as follows. The example shows one of our own models, but you can from model2vec import StaticModel # Load a model from the HuggingFace hub, or a local one. -model_name = "minishlab/M2V_base_output" +model_name = "minishlab/potion-base-8M" # You can optionally pass a token if you're loading a private model model = StaticModel.from_pretrained(model_name, token=None) @@ -289,7 +297,7 @@ from sentence_transformers import SentenceTransformer from sentence_transformers.models import StaticEmbedding # Initialize a StaticEmbedding module -static_embedding = StaticEmbedding.from_model2vec("minishlab/M2V_base_output") +static_embedding = StaticEmbedding.from_model2vec("minishlab/potion-base-8M") model = SentenceTransformer(modules=[static_embedding]) embeddings = model.encode(["It's dangerous to go alone!", "It's a secret to everybody."]) ``` @@ -352,19 +360,19 @@ print(make_leaderboard(task_scores)) We provide a number of models that can be used out of the box. These models are available on the [HuggingFace hub](https://huggingface.co/collections/minishlab/model2vec-base-models-66fd9dd9b7c3b3c0f25ca90e) and can be loaded using the `from_pretrained` method. The models are listed below. -| Model | Language | Vocab | Sentence Transformer | Tokenizer Type | Params | -|------------------------|-------------|------------------|----------------------|----------------|--------------| -| [M2V_base_glove](https://huggingface.co/minishlab/M2V_base_glove) | English | GloVe | [bge-base-en-v1.5](https://huggingface.co/BAAI/bge-base-en-v1.5) | Word-level | 102M | -| [M2V_base_output](https://huggingface.co/minishlab/M2V_base_output) | English | Output | [bge-base-en-v1.5](https://huggingface.co/BAAI/bge-base-en-v1.5) | Subword | 7.5M | -| [M2V_base_glove_subword](https://huggingface.co/minishlab/M2V_base_glove_subword) | English | Output + GloVe | [bge-base-en-v1.5](https://huggingface.co/BAAI/bge-base-en-v1.5) | Subword | 103M | -| [M2V_multilingual_output](https://huggingface.co/minishlab/M2V_multilingual_output) | Multilingual | Output | [LaBSE](https://huggingface.co/sentence-transformers/LaBSE) | Subword | 471M | + +| Model | Language | Vocab | Sentence Transformer | Tokenizer Type | Params | Tokenlearn | +|-----------------------------------------------------------------------|-------------|------------------|-----------------------------------------------------------------|----------------|---------|------------| +| [potion-base-8M](https://huggingface.co/minishlab/potion-base-8M) | English | Output | [bge-base-en-v1.5](https://huggingface.co/BAAI/bge-base-en-v1.5) | Subword | 7.5M | True | +| [potion-base-4M](https://huggingface.co/minishlab/potion-base-4M) | English | Output | [bge-base-en-v1.5](https://huggingface.co/BAAI/bge-base-en-v1.5) | Subword | 3.7M | True | +| [potion-base-2M](https://huggingface.co/minishlab/potion-base-2M) | English | Output | [bge-base-en-v1.5](https://huggingface.co/BAAI/bge-base-en-v1.5) | Subword | 1.8M | True | +| [M2V_multilingual_output](https://huggingface.co/minishlab/M2V_multilingual_output) | Multilingual | Output | [LaBSE](https://huggingface.co/sentence-transformers/LaBSE) | Subword | 471M | False | ## Results We have performed extensive experiments to evaluate the performance of Model2Vec models. The results are documented in the [results](results/README.md) folder. The results are presented in the following sections: - [MTEB Results](results/README.md#mteb-results) -- [Classification and Speed Benchmarks](results/README.md#classification-and-speed-benchmarks) - [Ablations](results/README.md#ablations) ## Related work @@ -372,7 +380,7 @@ We have performed extensive experiments to evaluate the performance of Model2Vec If you are interested in fast small models, also consider looking at these techniques: * [BPEmb](https://bpemb.h-its.org/): GLoVE embeddings trained on BPE-encoded Wikipedias. Huge inspiration to this project, multilingual, very fast. If you don't find a sentence transformer in the language you need, check this out. * [fast-sentence-transformers](https://github.com/davidberenstein1957/fast-sentence-transformers): distillation using Model2Vec comes at a cost. If that cost is too steep for you, and you have access to a GPU, this package is for you. It automates the quantization and optimization of sentence transformers without loss of performance. -* [wordllama](https://github.com/dleemiller/WordLlama): Uses the _input_ embeddings of a LLama2 model and then performs contrastive learning on these embeddings. As we show above, we think this is a bit overfit on MTEB, as the model is trained on MTEB datasets, and only evaluated on MTEB. It provides an interesting point of comparison to Model2Vec, and, fun fact, was invented at the same time. +* [wordllama](https://github.com/dleemiller/WordLlama): Uses the _input_ embeddings of a LLama2 model and then performs contrastive learning on these embeddings. We think this is a bit overfit on MTEB, as the model is trained on MTEB datasets, and only evaluated on MTEB. Fun fact: this was invented at the same time as Model2Vec. If you find other related work, please let us know. diff --git a/assets/images/speed_vs_accuracy_v4.png b/assets/images/speed_vs_accuracy_v4.png new file mode 100644 index 0000000000000000000000000000000000000000..e63461d3f463b3b1715f787a35cfd8b14710710a GIT binary patch literal 121734 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 literal 0 HcmV?d00001 diff --git a/assets/images/speed_vs_mteb_score.png b/assets/images/speed_vs_mteb_score.png new file mode 100644 index 0000000000000000000000000000000000000000..f9d9c0150c1064e6d6d4ea17bab5c5d30ccf58bd GIT binary patch literal 122042 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⁢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 literal 0 HcmV?d00001 diff --git a/results/README.md b/results/README.md index 7c4c7b3..0d2be5e 100644 --- a/results/README.md +++ b/results/README.md @@ -2,7 +2,6 @@ This page contains the experiments results of the Model2Vec project. The results are presented in the following sections: - [MTEB Results](#mteb-results) -- [Classification and Speed Benchmarks](#classification-and-speed-benchmarks) - [Ablations](#ablations) ## MTEB Results @@ -10,16 +9,17 @@ This page contains the experiments results of the Model2Vec project. The results Model2Vec is evaluated on MTEB, as well as two additional tasks: [PEARL](https://github.com/tigerchen52/PEARL) (a phrase representation task) and WordSim (a collection of _word_ similarity tasks). The results are shown in the table below. - -| Model | Avg (All) | Avg (MTEB) | Class | Clust | PairClass | Rank | Ret | STS | Sum | Pearl | WordSim | -|:-----------------------|:---------:|:----------:|:------:|:------:|:---------:|:------:|:------:|:------:|:------:|:------:|:-------:| +| Model | Avg (All) | Avg (MTEB) | Class | Clust | PairClass | Rank | Ret | STS | Sum | Pearl | WordSim | +|:-----------------------|------------:|-------------:|--------:|--------:|------------:|-------:|-------:|-------:|-------:|--------:|----------:| | all-MiniLM-L6-v2 | 56.08 | 56.09 | 62.62 | 41.94 | 82.37 | 58.04 | 41.95 | 78.90 | 30.81 | 60.83 | 49.91 | -| M2V_base_glove_subword | 49.06 | 46.69 | 61.27 | 30.03 | 74.71 | 49.15 | 27.16 | 69.09 | 30.08 | 56.82 | 57.99 | -| M2V_base_glove | 48.58 | 47.60 | 61.35 | 30.52 | 75.34 | 48.50 | 29.26 | 70.31 | 31.50 | 50.28 | 54.29 | -| M2V_base_output | 46.79 | 45.34 | 61.25 | 25.58 | 74.90 | 47.63 | 26.14 | 68.58 | 29.20 | 54.02 | 49.18 | -| GloVe_300d | 42.84 | 42.36 | 57.31 | 27.66 | 72.48 | 43.30 | 22.78 | 61.90 | 28.81 | 45.65 | 43.05 | -| BPEmb_50k_300d | 39.34 | 37.78 | 55.76 | 23.35 | 57.86 | 43.21 | 17.50 | 55.10 | 29.74 | 47.56 | 41.28 | -| WL256* | 48.88 | 49.36 | 58.98 | 33.34 | 74.00 | 52.03 | 33.12 | 73.34 | 29.05 | 48.81 | 45.16 | +| potion-base-8M | 50.54 | 50.03 | 64.44 | 32.93 | 76.62 | 49.73 | 31.71 | 73.24 | 29.28 | 53.54 | 50.75 | +| M2V_base_glove_subword | 49.06 | 46.69 | 61.27 | 30.03 | 74.71 | 49.15 | 27.16 | 69.09 | 30.08 | 56.82 | 57.99 | +| potion-base-4M | 48.87 | 48.23 | 62.19 | 31.47 | 75.37 | 48.75 | 29.11 | 72.19 | 28.89 | 52.55 | 49.21 | +| M2V_base_glove | 48.58 | 47.6 | 61.35 | 30.52 | 75.34 | 48.5 | 29.26 | 70.31 | 31.5 | 50.28 | 54.29 | +| M2V_base_output | 46.79 | 45.34 | 61.25 | 25.58 | 74.9 | 47.63 | 26.14 | 68.58 | 29.2 | 54.02 | 49.18 | +| potion-base-2M | 45.52 | 44.77 | 58.45 | 27.5 | 73.72 | 46.82 | 24.13 | 70.14 | 31.51 | 50.82 | 44.72 | +| GloVe_300d | 42.84 | 42.36 | 57.31 | 27.66 | 72.48 | 43.3 | 22.78 | 61.9 | 28.81 | 45.65 | 43.05 | +| BPEmb_50k_300d | 39.34 | 37.78 | 55.76 | 23.35 | 57.86 | 43.21 | 17.5 | 55.1 | 29.74 | 47.56 | 41.28 |
@@ -35,34 +35,12 @@ For readability, the MTEB task names are abbreviated as follows: - Sum: Summarization
-\ -\* WL256, introduced in the [WordLlama](https://github.com/dleemiller/WordLlama/tree/main) package is included for comparison due to its similarities to Model2Vec. However, we believe it is heavily overfit to the MTEB dataset since it is trained on datasets used in MTEB itself. This can be seen by the fact that the WL256 model performs much worse on the non-MTEB tasks (PEARL and WordSim) than our models and GLoVe. The results shown in the [Classification and Speed Benchmarks](#classification-and-speed-benchmarks) further support this. - -## Classification and Speed Benchmarks - -In addition to the MTEB evaluation, we evaluate Model2Vec on a number of classification datasets. These are used as additional evidence to avoid overfitting to the MTEB dataset and to benchmark the speed of the model. The results are shown in the table below. - - -| Model | Average | SST2 | IMDB | TREC | AG News | -|:-----------------------|:-------:|:------:|:-----:|:------:|:-------:| -| bge-base-en-v1.5 | 90.00 | 91.54 | 91.88 | 85.16 | 91.45 | -| all-MiniLM-L6-v2 | 84.10 | 83.95 | 81.36 | 81.31 | 89.77 | -| M2V_base_output | 82.23 | 80.92 | 84.56 | 75.27 | 88.17 | -| M2V_base_glove_subword | 81.95 | 82.84 | 85.96 | 70.51 | 88.49 | -| BPEmb_50k_300d | 81.15 | 80.42 | 84.04 | 71.25 | 88.92 | -| M2V_base_glove | 80.76 | 83.07 | 85.24 | 66.12 | 88.61 | -| WL256 | 78.48 | 76.88 | 80.12 | 69.23 | 87.68 | -| GloVe_300d | 77.77 | 81.68 | 84.00 | 55.67 | 89.71 | - - -As can be seen, Model2Vec models outperform the GloVe, BPEmb, and WL256 models on all classification tasks, and are competitive with the all-MiniLM-L6-v2 model, while being much faster. - -The figure below shows the relationship between the number of sentences per second and the average classification score. The circle sizes correspond to the number of parameters in the models (larger = more parameters). -This plot shows that the Model2Vec models are much faster than the other models, while still being competitive in terms of classification performance with the [all-MiniLM-L6-v2](https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2) model. +The figure below shows the relationship between the number of sentences per second and the average MTEB score. The circle sizes correspond to the number of parameters in the models (larger = more parameters). +This plot shows that the Model2Vec models are much faster than the other models, while still being competitive in terms of performance with the [all-MiniLM-L6-v2](https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2) model. -| ![Description](../assets/images/speed_vs_accuracy_v3.png) | +| ![Description](../assets/images/speed_vs_mteb_score.png) | |:--:| -|*Figure: The average accuracy over all classification datasets plotted against sentence per second. The circle size indicates model size.*| +|*Figure: The average MTEB score plotted against sentences per second. The circle size indicates model size.*| ## Ablations From 3de37ed06e873fd22a25396789cff6d97ef8a6e3 Mon Sep 17 00:00:00 2001 From: Thomas van Dongen Date: Tue, 29 Oct 2024 17:31:54 +0100 Subject: [PATCH 30/30] docs: Updated plot (#117) --- assets/images/speed_vs_mteb_score_v2.png | Bin 0 -> 143737 bytes results/README.md | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 assets/images/speed_vs_mteb_score_v2.png diff --git a/assets/images/speed_vs_mteb_score_v2.png b/assets/images/speed_vs_mteb_score_v2.png new file mode 100644 index 0000000000000000000000000000000000000000..4c4d11bc2137fbc163fc5be13da0c46d83befb00 GIT binary patch literal 143737 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