diff --git a/README.md b/README.md index 3dd52fd8..d6fcc98b 100644 --- a/README.md +++ b/README.md @@ -77,3 +77,40 @@ prefix = your_s3_prefix ``` [AWS configuration and credential files](https://docs.aws.amazon.com/cli/v1/userguide/cli-configure-files.html) can be used for authentication and settings. Authentication credentials should be specified in `~/.aws/credentials`. Settings like `region`, `output`, `endpoint_url` should be specified in `~/.aws/config`. Multiple different profiles can be defined and the specific profile to use can be specified in the `aws` section of the `.ini` file. + +### Loading From MLflow + +Simplexity provides a high‑level loader to reconstruct models and read run data from MLflow. + +Quick start: + +```python +from simplexity.loaders import ExperimentLoader + +# Use your MLflow run ID and tracking URI (e.g., Databricks) +loader = ExperimentLoader.from_mlflow( + run_id="", + tracking_uri="databricks", # or None to rely on env MLFLOW_TRACKING_URI +) + +# Load saved Hydra config and inspect +cfg = loader.load_config() +print("Model target:", cfg.predictive_model.instance._target_) + +# Discover checkpoints and load the latest model +print("Available checkpoints:", loader.list_checkpoints()) +model = loader.load_model(step="latest") + +# Fetch metrics as a tidy pandas DataFrame +df = loader.load_metrics(pattern="validation/*") # glob filter optional +print(df.head()) +``` + +Notes: + +- PyTorch models: if your run used a PyTorch model (e.g., `transformer_lens.HookedTransformer`), ensure the package is installed in your environment. The loader first tries JAX’s `PredictiveModel` path, then falls back to `torch.nn.Module` and sets `model.eval()` by default. +- Persistence: the loader reconstructs the persister from the saved config. If the run has no persistence or no checkpoints, `load_model()` raises an informative error. +- S3 credentials: if your persister uses `S3Persister.from_config`, you can override the location of the `.ini` via `ExperimentLoader.from_mlflow(..., config_path="/path/to/config.ini")`. +- Metrics filtering uses glob syntax (e.g., `"validation/*"`). + +See `notebooks/experiment_loader_demo.ipynb` for a runnable example. diff --git a/notebooks/experiment_loader_demo.ipynb b/notebooks/experiment_loader_demo.ipynb new file mode 100644 index 00000000..91ffc6b1 --- /dev/null +++ b/notebooks/experiment_loader_demo.ipynb @@ -0,0 +1,396 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# ExperimentLoader Demo\n", + "\n", + "This notebook demonstrates how to use `ExperimentLoader` to load and analyze MLflow experiments, including configuration, metrics, checkpoints, and trained models.\n", + "\n", + "## Prerequisites\n", + "\n", + "- **MLflow Access**: Databricks credentials (host/token)\n", + "- **S3 Access**: AWS credentials and config.ini for checkpoint loading\n", + "- **Dependencies**: Model packages (e.g., transformer-lens)\n", + "\n", + "## Usage Patterns\n", + "\n", + "### Basic Usage\n", + "```python\n", + "from simplexity.loaders import ExperimentLoader\n", + "\n", + "# Initialize loader\n", + "loader = ExperimentLoader.from_mlflow(\n", + " run_id=\"your-run-id\",\n", + " tracking_uri=\"databricks\",\n", + " config_path=\"path/to/config.ini\" # Optional: for S3 checkpoints\n", + ")\n", + "```\n", + "\n", + "### Load Different Data Types\n", + "```python\n", + "# Configuration\n", + "config = loader.load_config()\n", + "\n", + "# Metrics (all or filtered)\n", + "all_metrics = loader.load_metrics()\n", + "val_metrics = loader.load_metrics(pattern=\"validation/*\")\n", + "\n", + "# Checkpoints\n", + "checkpoints = loader.list_checkpoints()\n", + "latest_step = loader.latest_checkpoint()\n", + "\n", + "# Model (requires checkpoints + dependencies)\n", + "model = loader.load_model(step=\"latest\")\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Example: Loading a Transformer Experiment\n", + "\n", + "Let's walk through loading a complete experiment." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "πŸ” Run ID: 138baafac5a34726ab070bb1be72a83d\n", + "πŸ“ Tracking URI: databricks\n", + "πŸ”§ Config: /Users/adamimos/Documents/GitHub/simplexity/config.ini\n" + ] + } + ], + "source": [ + "# --- Setup ---\n", + "import os\n", + "from simplexity.loaders import ExperimentLoader\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# Configuration\n", + "run_id = \"138baafac5a34726ab070bb1be72a83d\"\n", + "tracking_uri = \"databricks\"\n", + "config_path = os.path.join('..', 'config.ini') if os.path.basename(os.getcwd()) == 'notebooks' else 'config.ini'\n", + "\n", + "print(f\"πŸ” Run ID: {run_id}\")\n", + "print(f\"πŸ“ Tracking URI: {tracking_uri}\")\n", + "print(f\"πŸ”§ Config: {os.path.abspath(config_path)}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "βœ… ExperimentLoader initialized\n" + ] + } + ], + "source": [ + "# --- Initialize ExperimentLoader ---\n", + "loader = ExperimentLoader.from_mlflow(\n", + " run_id=run_id,\n", + " tracking_uri=tracking_uri,\n", + " config_path=config_path\n", + ")\n", + "print(\"βœ… ExperimentLoader initialized\")" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "πŸ“‹ Loading experiment configuration...\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "27d3e7414bc24505a5861aa1a49d65b5", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Downloading artifacts: 0%| | 0/1 [00:00 8:\n", + " print(f\" ... and {len(metric_types) - 8} more\")" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "πŸ” Discovering checkpoints...\n", + "πŸ“‚ Found 21 checkpoints\n", + " Range: 0 β†’ 10000\n", + " Latest: 10000\n", + " All: [0, 500, 1000, 1500, 2000, 2500, 3000, 3500, 4000, 4500, 5000, 5500, 6000, 6500, 7000, 7500, 8000, 8500, 9000, 9500, 10000]\n" + ] + } + ], + "source": [ + "# --- 3. Discover Checkpoints ---\n", + "print(\"πŸ” Discovering checkpoints...\")\n", + "\n", + "checkpoints = loader.list_checkpoints()\n", + "latest = loader.latest_checkpoint()\n", + "\n", + "print(f\"πŸ“‚ Found {len(checkpoints)} checkpoints\")\n", + "if checkpoints:\n", + " print(f\" Range: {min(checkpoints)} β†’ {max(checkpoints)}\")\n", + " print(f\" Latest: {latest}\")\n", + " print(f\" All: {checkpoints}\")\n", + "else:\n", + " print(\" ❌ No checkpoints found (S3 access may be required)\")" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "πŸ€– Loading trained model...\n", + "βœ… Model loaded successfully!\n", + " Type: HookedTransformer\n", + " Parameters: 100,996\n", + " Device: mps:0\n" + ] + } + ], + "source": [ + "# --- 4. Load Model ---\n", + "print(\"πŸ€– Loading trained model...\")\n", + "\n", + "try:\n", + " model = loader.load_model(step=\"latest\")\n", + " print(f\"βœ… Model loaded successfully!\")\n", + " print(f\" Type: {type(model).__name__}\")\n", + " \n", + " # Get model info\n", + " try:\n", + " param_count = sum(p.numel() for p in model.parameters())\n", + " device = next(model.parameters()).device\n", + " print(f\" Parameters: {param_count:,}\")\n", + " print(f\" Device: {device}\")\n", + " except Exception:\n", + " print(f\" Model details: [unable to inspect]\")\n", + " \n", + "except Exception as e:\n", + " print(f\"❌ Could not load model: {e}\")\n", + " if \"transformer_lens\" in str(e):\n", + " print(\"πŸ’‘ Install missing dependencies: uv add transformer-lens\")\n", + " elif \"checkpoints\" in str(e).lower():\n", + " print(\"πŸ’‘ Ensure S3 access is configured in config.ini\")" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "πŸ“ˆ Plotting validation metrics...\n" + ] + }, + { + "data": { + "image/png": "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GqamQ4vDaHGWK6+80iXh0c8FAECmUy+yRoH5li5d6hJdrSyuJFs93Pq93xtdVXpePVd4Qv/555+7S/2tWNRj7Q8/r0wMVjzXImxa6E0N6uecc45rZK/IjnqqNaz86KOPdr3mSrz79evnes8BxMeQciCLKABr+JpWVVUg9z300ENu6NeIESPcda1uqtVGwynxVoKt1mr56aeftnt+v0Xdvw8AANlE06vC3XXXXe5S86CPO+44l3RPmDAhIsaKrqsHubLU4/zcc8+FrisuP/rooy7OxuuF1lZkSrpvvfVWNzc7WviWXWpkv+yyy9zq4dqOTI/RiuX6GxWpV6+eu4xecd2nctBUtJtuuslef/11ereBSqCHG8gimselRVFUGdAendrGS73dWixFe2v6gVHbilx44YVuCxK10iv51tYfqkgoOIu2BtGQciXp6jnX3DQ9j4aba29uAACyjRJVxU7F0Lffftvtua1Fyvr27et+rxFgirOaZ33MMcdYgwYN3GOUPGsrrUsvvbRSf0ex94wzznA9xVon5eGHH7ZVq1bZI488EvcxahTXXG0lvepV1oJsmif+3XffuZFn6vl+8cUXXfJ/+umnuyHt9957r3userf/8Y9/uH3F1TivRdtiUUKvRVPVO67XpgR8//33D/X6ay9urely9913uzrDqFGjqlDKQI6JsXI5gAzdFix8G7Bu3bp5tWrVcluCnHfeed6aNWtCv//qq6+8008/3dt99929goICr2nTpt6hhx7qzZ49O3SfOXPmeEcffbTXpk0bt9WYLkeNGuV9/vnnKX+NAACkYluwzz77zPvVr37lNWjQwGvSpIl34YUXeps2bYq4r7bz0pZb9erVc4firbbdWrJkSeg+2mqrZ8+eMf+WtgUbMWKEN3PmTK9Pnz5enTp13HNEb9UZvS2YT1t7HnfccV6zZs3cY/V8J554oovbcscdd2y37ZgsX77ca9iwoTd8+PC424LJ888/7/Xo0cNtIxZri7D33nvP3a4tSAHsWJ7+SXfSDwAAAKSLVvPW6DANy9aQ6WTSHO1evXq5Fb4z0UcffeSGvmt4+qmnnpru0wECjzncAAAAACrlwQcfdKuha047gB1jDjcAAACACml++GeffWYPPPCAWwfGX2ANQMVIuAEAAABU6KKLLnILuw0fPtwNvwdQOczhBgAAAAAgCZjDDQAAAABAEpBwAwCAHa7gnJeXF3F069atwsdMmzbN3aegoMB69+5tM2bMSNn5AgAQFDk3h7usrMy+//57a9CggaswAAByl2ZVrVu3ztq0aWP5+bRBV6Rnz542e/bs0PWaNeNXIebPn2+jRo2yiRMn2i9/+Ut74okn7JhjjrEPP/zQbYdUWcRsAECmx+ycm8P93//+19q1a5fu0wAABMi3335rbdu2TfdpBLqHe/r06bZo0aJK3f+kk06yDRs2ROwzfMABB7i9e++7775K/11iNgAg02N2zvVwq5Xc/49q2LBhlZ9Hre6rV6+2Fi1aZFQLSypQNrFRLvFRNvFRNsktm+LiYpfQ+bEB8X3xxReuV0FDxPv37+96r9u3bx/zvm+//baNGzcu4rahQ4e6pL0iJSUl7vD5fQLffPNNtWP2Dz/8YM2bN+dzFIZyiY+yiY+yiY1ySX7ZFBcXW4cOHTIuZudcwu0PSVPgrm7w3rx5s3sOPlSRKJvYKJf4KJv4KJvUlA3DlSu2//7729SpU61r1662YsUKtyXQwQcfbJ988knMis/KlSutVatWEbfpum6viJL4WNsNKQnX/3V13itbt251z8HnaBvKJT7KJj7KJjbKJfllU/K/BtlMi9k5l3ADAICdM2zYsNDPffr0cQm4ehmefvppO+OMMxL2d8aPHx/RM+6PQNAohuo2kquCxkiRSJRLfJRNfJRNbJRL8sumoKDAMhEJNwAA2CmNGze2PfbYw5YuXRrz961bt7ZVq1ZF3Kbrur0iderUcUc0VdASMYohEc+TbSiX+Cib+Cib2CiX5JZNfoaWa1rPet68eTZy5Eg3J0z/CTua2+UPJbjyyitdy7qCcseOHe3hhx9OyfkCAACz9evX25dffmm77rprzN9rjvecOXMibps1a5a7HQCAXJLWHm6tYNq3b187/fTT7bjjjqvUY0488UTXSv7QQw9Z586d3VwyDVMAAADJcemll7oGcjV2a5uua665xmrUqOG2/pLRo0fbbrvt5uZgy9ixY23gwIE2adIkGzFihD311FO2YMECe+CBB9L8SgAAyKGEW3PCwueF7ci//vUve/311+2rr76ypk2butvUww0AAJJH23Mpuf7xxx/dHLyDDjrI3nnnHfezLF++PGKo34ABA9ze21dddZVdccUV1qVLFzeKbWf24AYAIBtk1BzuF154wfbZ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Wupi6IYNG+I+pmnTpm61c8Xcjz/+2E477TR3RK+LongcHrOffPLJmM/3+9//3tq0aVOl82eV8iS3mAdgizgAQAy33XabS7bVw63FWe677z576aWX7OGHH3aJdbT58+fbgQceGFqBtGPHjm5hM805C6dtTFq3bh3376pX/OKLL474G+o1R2rRQA4AmeFf//pXaJVybZ2pOL3rrrvaBx984EaIxTJo0KCI61o89a9//atrBFfjuk/bjlUUs0Vbdb7yyiv2j3/8w/28swLRnD5lyhRXcSkoKNjhkD61aPzpT3+y3Xff3d1fPRL+f0IQ0GIOAMGngK1APXjw4NBt6mHWoidqDY9lwIAB7jF+jPrqq69sxowZNnz48Ij7ffHFF64V/Be/+IXbR3v58uWh36n3XAl6y5Yt3fNpddOBAwdu1wuO5CNeA0BmKioqCvViV4aGec+ZM8cNQ49O0OfOnetishq+zzvvPPvxxx+32/brrLPOcsPRq7oeTNoTbg3HGzdunBui9+GHH+5wSN9VV11l999/v911111u9dlzzz3Xjj32WLcnWxCwCAsABN8PP/zgWsoVZMMpAV65cmXMx6hnWw2+Bx10kNvXWw2/akEPH1KuRuOpU6e6huB7773Xli1bZgcffLBbCMZP0v253grgut9ee+3lEn8l6kHlz5/THqMqs2OOOWaH8+dUDtFz49RQHhTEawDIPGVlZS531IizXr167TAxr1+/vlv1XNt2KX88/PDDI4aTP/rooy4Zv+mmm9zQ9WHDhrn6gZ+oa5638k3NB6+q/CAM6VOlQ2Pq/SF9aj3QUIFY1Lqgyo16FNR7oJYI/Txp0iQLAhZhAYDspFbwG264wS20pgZiLciiIejXXXdd6D4K1CeccIL16dPHNR6rB3zt2rX29NNPhyoKcs4557i4169fP7ffqFrW48W9IM2fe+edd2zWrFmVmj8nWhAufG7cN998Y0FBvAaAzHPzzTe77TKfeuqpHd5XjcRa4ExrpVx//fUuUVcs9/36179208p69+7tGpL/+c9/uvv691GCrgbz8ePHV+ucawZhSF/4i9jRkD6tEBfdQq7VYuMNx9P9dfj8pdpV6fErPlWhx6rVI/o5atfWynrlq+tt2qS/YTknXtnkOsolPsomPsqmemXj/y561dBmzZpZjRo13FCxDh06hG7X9Xhzuf74xz/a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5dkll1wSui2Xy+a7776z3/zmN+61161b13r37m0LFiwI/V5LRlx99dW26667ut8PGTLEvvjii4jn+Omnn+yUU05x+zQ2btzYzjjjDFu/fn3EfT7++GM7+OCD3eevXbt2dvPNN1tQbd261f74xz9ap06d3Gvefffd7brrrnNlkWvlMm/ePBs5cqS1adPGfW6mT58e8ftUlsO0adOsW7du7j56n86YMSNJrxrpls3xWojZlUO8jkS8jo2YvQ0xO4G0aBp2zlNPPeXVrl3be/jhh71PP/3UO+uss7zGjRt7q1atSvepJcTQoUO9Rx55xPvkk0+8RYsWecOHD/fat2/vrV+/PnSfc88912vXrp03Z84cb8GCBd4BBxzgDRgwIPT7LVu2eL169fKGDBniLVy40JsxY4bXvHlzb/z48aH7fPXVV94uu+zijRs3zvvss8+8u+66y6tRo4b3r3/9y8sE7733ntexY0evT58+3tixY71cL5uffvrJ69Chg/fb3/7We/fdd91rmDlzprd06dLQfW688UavUaNG3vTp072PPvrIO+qoo7xOnTp5mzZtCt3nyCOP9Pr27eu988473htvvOF17tzZGzVqVOj3RUVFXqtWrbxTTjnFvUeffPJJr27dut7999/vBdH111/vNWvWzPvnP//pLVu2zJs2bZpXv35974477si5ctF7/corr/SeffZZ1Vy85557LuL3qSqHt956y32ebr75Zvf5uuqqq7xatWp5ixcvTlFJIFWyPV4LMXvHiNeRiNfxEbO3IWYnDgl3Fey3337eBRdcELq+detWr02bNt7EiRO9bFRYWOg+aK+//rq7vnbtWvdG15eQ79///re7z9tvvx36kObn53srV64M3efee+/1GjZs6JWUlLjrv//9772ePXtG/K2TTjrJVR6Cbt26dV6XLl28WbNmeQMHDgwF8Fwumz/84Q/eQQcdFPf3ZWVlXuvWrb1bbrkldJvKq06dOu4LVvRFqrJ6//33Q/d5+eWXvby8PO+7775z1++55x6vSZMmobLy/3bXrl29IBoxYoR3+umnR9x23HHHueCSy+USHbxTWQ4nnnii+38Jt//++3vnnHNOkl4t0iXX4rUQsyMRr7dHvI6PmB0bMbt6GFK+k37++Wf74IMP3LAJX35+vrv+9ttvWzYqKipyl02bNnWXev2lpaURZaBhHu3btw+VgS415KNVq1ah+wwdOtSKi4vt008/Dd0n/Dn8+2RCOWoImoaYRZ9/LpfNCy+8YPvss4+dcMIJbthdv3797MEHHwz9ftmyZbZy5cqI19WoUSM3xDO8bDTkSM/j0/31GXv33XdD9znkkEOsdu3aEWWjIZRr1qyxoBkwYIDNmTPHPv/8c3f9o48+sjfffNOGDRuW0+USLZXlkImfL+y8XIzXQsyORLzeHvE6PmJ25RCzdw4J90764Ycf3PyO8C9f0XW98bJNWVmZm+904IEHWq9evdxtep36YOhDFK8MdBmrjPzfVXQfBbJNmzZZUD311FP24Ycfunlz0XK5bL766iu79957rUuXLjZz5kw777zz7OKLL7a//vWvEa+tos+OLhX8w9WsWdNVHHem/ILk8ssvt1//+teuIlerVi1XsdFnSnOacrlcoqWyHOLdJxPKCZWXa/FaiNmRiNexEa/jI2ZXDjF759Tcyfsjx6hl+JNPPnGtezD79ttvbezYsTZr1iy3cAMiK3pqxbzhhhvcdQUpvXfuu+8+GzNmjOWqp59+2h5//HF74oknrGfPnrZo0SIXvLUISS6XC4DEI2ZvQ7yOj3gdHzEbyUAP905q3ry51ahRY7tVLHW9devWlk0uvPBC++c//2mvvfaatW3bNnS7XqeG6q1duzZuGegyVhn5v6voPlrJUKsdBpGGoBUWFrrVSNVKp+P111+3O++80/2sFrdcLRutUtmjR4+I27p37+5WeA1/bRV9dnSp8g2n1WC1yuXOlF+QaEVbv8VcQxNPPfVU+93vfhfqccnVcomWynKId59MKCdUXi7FayFmRyJex0e8jo+YXTnE7J1Dwr2TNPxo7733dvM7wlsKdb1///6WDbQ2ggL3c889Z6+++qrbGiGcXr+G2YSXgeZa6IvaLwNdLl68OOKDplZmBSD/S173CX8O/z5BLsfBgwe716UWT/9QK7GGGvk/52rZaAhj9FY0mgPVoUMH97PeR/pyDH9dGnKneTzhZaPKjypKPr0H9RnTvCD/PtqqQnPvwsuma9eu1qRJEwuajRs3uvlK4ZQE6DXlcrlES2U5ZOLnCzsvF+K1ELNjI17HR7yOj5hdOcTsnVTNRddydpsRrcI3depUtwLf2Wef7bYZCV/FMpOdd955bpn/uXPneitWrAgdGzdujNhKQ9uOvPrqq24rjf79+7sjeiuNI444wm1Tou0xWrRoEXMrjcsuu8ytDDplypTAb6URS/iqp7lcNtp2pWbNmm5LjS+++MJ7/PHH3Wv429/+FrGFhD4rzz//vPfxxx97Rx99dMwtJPr16+e2KnnzzTfd6rLhW0hoFUxtIXHqqae6LST0edTfCdJWGuHGjBnj7bbbbqEtRrS9hraV0cq2uVYuWi1YW+voUPi57bbb3M/ffPNNSstBW4zovXrrrbe6z9c111yTcVuMoHKyPV4LMbvyiNfliNfxEbO3IWYnDgl3FWmfRX1Ja39PbTui/eWyhT5UsQ7t8+nTh+n88893S/nrg3Hssce6AB/u66+/9oYNG+b209OX1f/93/95paWlEfd57bXXvD333NOV4y9+8YuIv5GpATyXy+bFF190lRNVcLt16+Y98MADEb/XNhJ//OMf3Zer7jN48GBvyZIlEff58ccf3Zex9r3U1iunnXaa+9IPp/0etaWJnkOBUV/6QVVcXOzeH/q+KCgocP+X2tcyfAuMXCkXvadjfbeogpPqcnj66ae9PfbYw32+tKXPSy+9lORXj3TJ5ngtxOzKI15vQ7yOjZi9DTE7cfL0z872igMAAAAAgIoxhxsAAAAAgCQg4QYAAAAAIAlIuAEAAAAASAISbgAAAAAAkoCEGwAAAACAJCDhBgAAAAAgCUi4AQAAAABIAhJuAAAAAACSgIQbCLCOHTva7bffXun7z5071/Ly8mzt2rVJPS8AABCJmA0gFhJuIAEUMCs6rr322io97/vvv29nn312pe8/YMAAW7FihTVq1MiS7cEHH7S+ffta/fr1rXHjxtavXz+bOHFi6Pe//e1v7Zhjjkn6eQAAsDOI2cRsIJVqpvSvAVlKAdP397//3a6++mpbsmRJ6DYFOJ/nebZ161arWXPHH78WLVrs1HnUrl3bWrdubcn28MMP2yWXXGJ33nmnDRw40EpKSuzjjz+2Tz75JOl/GwCA6iBmE7OBVKKHG0gABUz/UEu1Wsj96//5z3+sQYMG9vLLL9vee+9tderUsTfffNO+/PJLO/roo61Vq1YuuO+77742e/bsCoen6Xn/8pe/2LHHHmu77LKLdenSxV544YW4w9OmTp3qWrJnzpxp3bt3d3/nyCOPjKhsbNmyxS6++GJ3v2bNmtkf/vAHGzNmTIUt3fqbJ554op1xxhnWuXNn69mzp40aNcquv/5693v1Dvz1r3+1559/PtRjoHOTb7/91j1Wf69p06auDL7++uvtWtknTJjgKi8NGza0c889137++eeE/F8BAHIbMZuYDaQSCTeQIpdffrndeOON9u9//9v69Olj69evt+HDh9ucOXNs4cKFLqiOHDnSli9fXuHzKKgp+Kl1Wo8/5ZRT7Keffop7/40bN9qtt95qjz32mM2bN889/6WXXhr6/U033WSPP/64PfLII/bWW29ZcXGxTZ8+vcJzUKXknXfesW+++Sbm7/X8Oke/oqBDQ+dKS0tt6NChrjLzxhtvuL/nVyjCg7PKROWkgP/kk0/as88+6143AACpQMwmZgMJ4wFIqEceecRr1KhR6Pprr73m6aM2ffr0HT62Z8+e3l133RW63qFDB2/y5Mmh63qeq666KnR9/fr17raXX3454m+tWbMmdC66vnTp0tBjpkyZ4rVq1Sp0XT/fcsstoetbtmzx2rdv7x199NFxz/P777/3DjjgAPfce+yxhzdmzBjv73//u7d169bQfXRb9HM89thjXteuXb2ysrLQbSUlJV7dunW9mTNnhh7XtGlTb8OGDaH73HvvvV79+vUjnh8AgOoiZpcjZgPJQw83kCL77LNPxHW1lqtVWcPGNFRLrcZqId5Ra7la2n316tVzw7cKCwvj3l/D2HbffffQ9V133TV0/6KiIlu1apXtt99+od/XqFHDDaOriJ7j7bfftsWLF9vYsWPdEDcNaVOrd1lZWdzHffTRR7Z06VLXWq7Xq0ND1DZv3uyG6/m0sIvO29e/f39XXhraBgBAshGzidlAorBoGpAiCrThFLhnzZrlho5pTlXdunXtV7/61Q7nPdWqVSviuuZaVRQwY92/vOG9+nr16uWO888/383ZOvjgg+3111+3Qw89NOb9FYBVMdBwuOouNgMAQLIQs4nZQKKQcANporlQWmxEi6n4gS18IZJU0GIxWgBGW5kccsgh7jatxvrhhx/annvuuVPP1aNHD3e5YcOG0Oqreq5we+21l1sRtmXLlq6Vv6JW9U2bNrkKjWjumVrW27Vrt9OvEQCA6iJmE7OBqmJIOZAmWq1UC4ssWrTIBauTTz65wlbvZLnooovcXpxanVTbomi42Zo1a1yrejznnXeeXXfdda4CokVYFFxHjx7tWrw1lMxfrVWLxOg5f/jhB7f4ihaLad68uVvlVAuwLFu2zC2yohVX//vf/4aeXz0GWk31s88+sxkzZtg111xjF154oeXn85UFAEg9YjYxG6gqPglAmtx2223WpEkTtxKoVjrVSqBqTU41bSmi7UEUfBV41SqtcykoKIj7mCFDhriAfcIJJ9gee+xhxx9/vLu/VirVNiVy1llnWdeuXd08OAV1BXrN8dKqq+3bt7fjjjvOzYVTkNZ8sPDW88GDB7vKjVrwTzrpJDvqqKPctiUAAKQDMZuYDVRVnlZOq/KjAWQdtdgrqGqLELWIp5qG7GlP0h1tcwIAQK4jZgPBxxxuIMdpeNkrr7xiAwcOtJKSErv77rvdsDENlwMAAMFBzAYyD0PKgRynOVZTp061fffd1w488EC3bcjs2bNdizkAAAgOYjaQeRhSDgAAAABAEtDDDQAAAABAEpBwAwAAAACQBCTcAAAAAAAkAQk3AAAAAABJQMINAAAAAEASkHADAAAAAJAEJNwAAAAAACQBCTcAAAAAAElAwg0AAAAAgCXe/wNtnIJ7oFjhhQAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# --- 5. Visualize Training Progress ---\n", + "if not df_val.empty:\n", + " print(\"πŸ“ˆ Plotting validation metrics...\")\n", + " \n", + " val_metrics = sorted(df_val['metric'].unique())\n", + " n_metrics = min(len(val_metrics), 3) # Show up to 3 metrics\n", + " \n", + " fig, axes = plt.subplots(1, n_metrics, figsize=(5*n_metrics, 4))\n", + " if n_metrics == 1:\n", + " axes = [axes]\n", + " \n", + " for i, metric in enumerate(val_metrics[:n_metrics]):\n", + " data = df_val[df_val['metric'] == metric].sort_values('step')\n", + " axes[i].plot(data['step'], data['value'], 'b-', linewidth=2)\n", + " axes[i].set_title(metric.replace('validation/', ''), fontsize=12)\n", + " axes[i].set_xlabel('Training Step')\n", + " axes[i].set_ylabel('Value')\n", + " axes[i].grid(True, alpha=0.3)\n", + " \n", + " # Add final value annotation\n", + " if len(data) > 0:\n", + " final_val = data['value'].iloc[-1]\n", + " final_step = data['step'].iloc[-1]\n", + " axes[i].annotate(f'{final_val:.3f}', \n", + " xy=(final_step, final_val),\n", + " xytext=(10, 10), textcoords='offset points',\n", + " bbox=dict(boxstyle='round,pad=0.3', facecolor='white', alpha=0.8))\n", + " \n", + " plt.tight_layout()\n", + " plt.show()\n", + "else:\n", + " print(\"πŸ“ˆ No validation metrics available for plotting\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "The `ExperimentLoader` provides a unified interface for loading MLflow experiments:\n", + "\n", + "### βœ… Core Features\n", + "- **Configuration**: Reconstructs complete Hydra configs from MLflow artifacts\n", + "- **Metrics**: Loads training/validation metrics with pattern filtering\n", + "- **Checkpoints**: Discovers available model checkpoints from S3\n", + "- **Models**: Reloads trained models with proper device handling\n", + "\n", + "### πŸ”§ Key Methods\n", + "- `ExperimentLoader.from_mlflow(run_id, tracking_uri, config_path)`\n", + "- `loader.load_config()` - Get experiment configuration\n", + "- `loader.load_metrics(pattern=...)` - Load metrics with optional filtering\n", + "- `loader.list_checkpoints()` - Discover available checkpoints\n", + "- `loader.load_model(step=...)` - Load trained model\n", + "\n", + "### πŸ“‹ Requirements\n", + "- MLflow access (Databricks credentials)\n", + "- S3 access (AWS credentials + config.ini) for checkpoints\n", + "- Model dependencies (e.g., transformer-lens) for model loading" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/pyproject.toml b/pyproject.toml index aa48833b..78a5b8c1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,6 +27,7 @@ dependencies = [ "pandas", "penzai", "plotly", + "transformer-lens>=2.16.1", "treescope", ] diff --git a/simplexity/loaders/__init__.py b/simplexity/loaders/__init__.py new file mode 100644 index 00000000..9168f1fa --- /dev/null +++ b/simplexity/loaders/__init__.py @@ -0,0 +1,4 @@ +from .experiment_loader import ExperimentLoader + +__all__ = ["ExperimentLoader"] + diff --git a/simplexity/loaders/experiment_loader.py b/simplexity/loaders/experiment_loader.py new file mode 100644 index 00000000..ae6723a4 --- /dev/null +++ b/simplexity/loaders/experiment_loader.py @@ -0,0 +1,162 @@ +from __future__ import annotations + +from dataclasses import dataclass +from typing import Literal + +from omegaconf import DictConfig, OmegaConf + +from simplexity.logging.mlflow_reader import MLflowRunReader +from simplexity.logging.run_reader import RunReader +from simplexity.persistence.model_persister import ModelPersister +from simplexity.predictive_models.predictive_model import PredictiveModel +from simplexity.utils.hydra import typed_instantiate + + +@dataclass +class ExperimentLoader: + """High-level loader for reconstructing models and reading run data.""" + + reader: RunReader + config_path: str | None = None + _cached_config: DictConfig | None = None + + # --- Constructors --- + @classmethod + def from_mlflow(cls, run_id: str, tracking_uri: str | None = None, config_path: str | None = None) -> "ExperimentLoader": + reader = MLflowRunReader(run_id=run_id, tracking_uri=tracking_uri) + return cls(reader=reader, config_path=config_path) + + # --- Accessors --- + def load_config(self) -> DictConfig: + if self._cached_config is None: + self._cached_config = self.reader.get_config() + return self._cached_config + + def load_metrics(self, pattern: str | None = None): + return self.reader.get_metrics(pattern=pattern) + + # --- Helper methods --- + def _resolve_device(self, device: str) -> str: + """Resolve 'auto' device to actual PyTorch device.""" + if device != "auto": + return device + + try: + import torch + if torch.cuda.is_available(): + return "cuda" + elif hasattr(torch.backends, 'mps') and torch.backends.mps.is_available(): + return "mps" # Apple Silicon + else: + return "cpu" + except ImportError: + return "cpu" + + # --- Model reconstruction --- + def _instantiate_model_and_persister(self) -> tuple[object, ModelPersister | None, DictConfig]: + cfg = self.load_config() + try: + # Handle device resolution for 'auto' setting + model_config = OmegaConf.to_container(cfg.predictive_model.instance, resolve=False) # type: ignore[arg-type] + if isinstance(model_config, dict): + cfg_section = model_config.get('cfg') + if isinstance(cfg_section, dict) and cfg_section.get('device') == 'auto': + cfg_section = dict(cfg_section) + cfg_section['device'] = self._resolve_device('auto') + model_config = dict(model_config) + model_config['cfg'] = cfg_section + + # First, try JAX-style PredictiveModel + try: + model = typed_instantiate(model_config, PredictiveModel) + except Exception: + # Fallback: try PyTorch if available + try: + import torch # type: ignore + except Exception as torch_import_err: # pragma: no cover - import guard + raise RuntimeError( + "Failed to instantiate predictive model from run config.\n" + "Tried PredictiveModel (JAX) and PyTorch fallback, but PyTorch is not available.\n" + "Install torch support (uv sync --extra pytorch) or ensure the model package is installed.\n" + f"Underlying error: {torch_import_err}" + ) from torch_import_err + + # Instantiate expecting a torch.nn.Module + try: + model = typed_instantiate(model_config, torch.nn.Module) # type: ignore[attr-defined] + # Put model into eval mode by default for inference + if hasattr(model, "eval"): + model.eval() + except Exception as e2: + raise RuntimeError( + "Failed to instantiate predictive model from run config.\n" + "Ensure the model's Python package is installed (e.g., transformer_lens for HookedTransformer).\n" + f"Underlying error: {e2}" + ) from e2 + except Exception as e: + raise RuntimeError( + "Failed to instantiate predictive model from run config.\n" + "Ensure the model's Python package is installed (e.g., `transformer_lens`).\n" + f"Underlying error: {e}" + ) from e + persister: ModelPersister | None + if cfg.persistence: + try: + # Override config_filename if custom config_path is provided + persister_config = OmegaConf.to_container(cfg.persistence.instance, resolve=False) # type: ignore[arg-type] + if isinstance(persister_config, dict) and self.config_path: + if 'config_filename' in persister_config: + persister_config = dict(persister_config) + persister_config['config_filename'] = self.config_path + persister = typed_instantiate(persister_config, ModelPersister) + except Exception as e: + raise RuntimeError( + "Failed to instantiate persister from run config.\n" + "If using S3, ensure credentials/config are available (e.g., config.ini or env).\n" + f"Underlying error: {e}" + ) from e + else: + persister = None + return model, persister, cfg + + def _instantiate_persister_only(self) -> ModelPersister | None: + cfg = self.load_config() + if not cfg.persistence: + return None + try: + # Override config_filename if custom config_path is provided + persister_config = OmegaConf.to_container(cfg.persistence.instance, resolve=False) # type: ignore[arg-type] + if isinstance(persister_config, dict) and self.config_path: + if 'config_filename' in persister_config: + persister_config = dict(persister_config) + persister_config['config_filename'] = self.config_path + return typed_instantiate(persister_config, ModelPersister) + except Exception: + # Best-effort: return None if we cannot construct the persister (missing creds, etc.) + return None + + def list_checkpoints(self) -> list[int]: + persister = self._instantiate_persister_only() + return persister.list_checkpoints() if persister else [] + + def latest_checkpoint(self) -> int | None: + persister = self._instantiate_persister_only() + return persister.latest_checkpoint() if persister else None + + def load_model(self, step: int | Literal["latest"] = "latest") -> object: + model, persister, _ = self._instantiate_model_and_persister() + if not persister: + raise RuntimeError("No persistence configuration found in run config; cannot load checkpoints.") + + target_step: int + if step == "latest": + latest = persister.latest_checkpoint() + if latest is None: + raise RuntimeError("No checkpoints found for this run.") + target_step = latest + else: + if not persister.checkpoint_exists(step): + raise RuntimeError(f"Requested checkpoint step {step} does not exist.") + target_step = step + + return persister.load_weights(model, target_step) diff --git a/simplexity/logging/mlflow_reader.py b/simplexity/logging/mlflow_reader.py new file mode 100644 index 00000000..93d376b6 --- /dev/null +++ b/simplexity/logging/mlflow_reader.py @@ -0,0 +1,103 @@ +from __future__ import annotations + +import fnmatch +import tempfile +from pathlib import Path +from typing import Iterable + +import mlflow +import pandas as pd +from mlflow.entities import Metric +from omegaconf import DictConfig, OmegaConf + +from simplexity.logging.run_reader import RunReader + + +class MLflowRunReader(RunReader): + """Read experiment data for a single MLflow run.""" + + def __init__(self, run_id: str, tracking_uri: str | None = None) -> None: + self._run_id = run_id + # The global mlflow.set_tracking_uri also works, but we keep it local + self._client = mlflow.MlflowClient(tracking_uri=tracking_uri) + self._temp_dir = tempfile.TemporaryDirectory() + + # --- Basic run info helpers --- + def _get_run(self): + return self._client.get_run(self._run_id) + + # --- Config/params/tags --- + def get_config(self) -> DictConfig: + # We expect the config artifact to be saved as "config.yaml" at the root. + # If not found, search the artifact tree for a file named config.yaml. + dst_dir = Path(self._temp_dir.name) / "config" + dst_dir.mkdir(parents=True, exist_ok=True) + try: + local_path = self._client.download_artifacts(self._run_id, "config.yaml", str(dst_dir)) + return OmegaConf.load(local_path) + except Exception: + for path in self.list_artifacts(): + if Path(path).name == "config.yaml": + local_path = self._client.download_artifacts(self._run_id, path, str(dst_dir)) + return OmegaConf.load(local_path) + raise RuntimeError( + "Could not find config.yaml in MLflow artifacts for this run." + ) + + def get_params(self) -> dict[str, str]: + run = self._get_run() + # mlflow returns a dict-like mapping of strings + return dict(run.data.params) + + def get_tags(self) -> dict[str, str]: + run = self._get_run() + return dict(run.data.tags) + + # --- Metrics --- + def get_metrics(self, pattern: str | None = None) -> pd.DataFrame: + run = self._get_run() + metric_keys = list(run.data.metrics.keys()) + if pattern: + # Support glob-style filtering (e.g., "validation/*") + metric_keys = [k for k in metric_keys if fnmatch.fnmatch(k, pattern)] + + records: list[tuple[str, int, float, int]] = [] + for key in metric_keys: + history: list[Metric] = self._client.get_metric_history(self._run_id, key) + for m in history: + records.append((key, int(m.step), float(m.value), int(m.timestamp))) + if not records: + return pd.DataFrame(columns=["metric", "step", "value", "timestamp"]) + df = pd.DataFrame.from_records(records, columns=["metric", "step", "value", "timestamp"]) + df.sort_values(["metric", "step"], inplace=True) + return df + + # --- Artifacts --- + def list_artifacts(self, path: str | None = None) -> list[str]: + """List artifact relative paths (recursively).""" + base = path or "" + results: list[str] = [] + + def _recurse(rel: str) -> None: + for e in self._client.list_artifacts(self._run_id, rel): + child = f"{rel}/{e.path}" if rel else e.path + if e.is_dir: + _recurse(child) + else: + results.append(child) + + _recurse(base) + return results + + def download_artifact(self, path: str, dst: str | Path | None = None) -> Path: + dst_dir = Path(dst) if dst is not None else Path(self._temp_dir.name) / "artifacts" + dst_dir.mkdir(parents=True, exist_ok=True) + local_path = self._client.download_artifacts(self._run_id, path, str(dst_dir)) + return Path(local_path) + + # --- Cleanup --- + def __del__(self) -> None: # pragma: no cover - best-effort cleanup + try: + self._temp_dir.cleanup() + except Exception: + pass diff --git a/simplexity/logging/run_reader.py b/simplexity/logging/run_reader.py new file mode 100644 index 00000000..05a65d76 --- /dev/null +++ b/simplexity/logging/run_reader.py @@ -0,0 +1,37 @@ +from __future__ import annotations + +from abc import ABC, abstractmethod +from pathlib import Path +from typing import Protocol + +import pandas as pd +from omegaconf import DictConfig + + +class RunReader(Protocol): + """Protocol for reading experiment run data from a tracking backend.""" + + def get_config(self) -> DictConfig: + """Return the saved run config as a DictConfig.""" + ... + + def get_params(self) -> dict[str, str]: + """Return run parameters as a simple dict of strings.""" + ... + + def get_tags(self) -> dict[str, str]: + """Return run tags as a simple dict of strings.""" + ... + + def get_metrics(self, pattern: str | None = None) -> pd.DataFrame: + """Return metrics as a tidy DataFrame with columns: metric, step, value, timestamp.""" + ... + + def list_artifacts(self, path: str | None = None) -> list[str]: + """List artifact paths stored for this run (relative paths).""" + ... + + def download_artifact(self, path: str, dst: str | Path | None = None) -> Path: + """Download an artifact relative path to a destination directory and return the local file path.""" + ... + diff --git a/simplexity/persistence/local_equinox_persister.py b/simplexity/persistence/local_equinox_persister.py index fcde8d7f..acdb862f 100644 --- a/simplexity/persistence/local_equinox_persister.py +++ b/simplexity/persistence/local_equinox_persister.py @@ -28,3 +28,30 @@ def load_weights(self, model: PredictiveModel, step: int = 0) -> PredictiveModel def _get_path(self, step: int) -> Path: return self.directory / str(step) / self.filename + + # --- Checkpoint discovery --- + def list_checkpoints(self) -> list[int]: + steps: list[int] = [] + if not self.directory.exists(): + return steps + for child in self.directory.iterdir(): + if child.is_dir(): + try: + step = int(child.name) + except ValueError: + continue + if (child / self.filename).exists(): + steps.append(step) + steps.sort() + return steps + + def latest_checkpoint(self) -> int | None: + steps = self.list_checkpoints() + return steps[-1] if steps else None + + def checkpoint_exists(self, step: int) -> bool: + return (self.directory / str(step) / self.filename).exists() + + def uri_for_step(self, step: int) -> str: + path = self._get_path(step) + return f"file://{path}" diff --git a/simplexity/persistence/local_penzai_persister.py b/simplexity/persistence/local_penzai_persister.py index ac3a6449..97da6525 100644 --- a/simplexity/persistence/local_penzai_persister.py +++ b/simplexity/persistence/local_penzai_persister.py @@ -37,3 +37,22 @@ def load_weights(self, model: PredictiveModel, step: int = 0) -> PredictiveModel unbound_model, _ = pz.unbind_variables(model) variable_values = reconstruct_variables(items) return pz.bind_variables(unbound_model, variable_values) + + # --- Checkpoint discovery --- + def list_checkpoints(self) -> list[int]: + mngr = ocp.CheckpointManager(self.directory, handler_registry=self.registry) + steps = list(mngr.all_steps()) + steps.sort() + return steps + + def latest_checkpoint(self) -> int | None: + steps = self.list_checkpoints() + return steps[-1] if steps else None + + def checkpoint_exists(self, step: int) -> bool: + return step in set(self.list_checkpoints()) + + def uri_for_step(self, step: int) -> str: + # Orbax uses a directory per checkpoint step + path = self.directory / str(step) + return f"file://{path}" diff --git a/simplexity/persistence/local_pytorch_persister.py b/simplexity/persistence/local_pytorch_persister.py index 7696406d..20d08f40 100644 --- a/simplexity/persistence/local_pytorch_persister.py +++ b/simplexity/persistence/local_pytorch_persister.py @@ -39,3 +39,30 @@ def load_weights(self, model: torch.nn.Module, step: int = 0) -> torch.nn.Module def _get_path(self, step: int) -> Path: return self.directory / str(step) / self.filename + + # --- Checkpoint discovery --- + def list_checkpoints(self) -> list[int]: + steps: list[int] = [] + if not self.directory.exists(): + return steps + for child in self.directory.iterdir(): + if child.is_dir(): + try: + step = int(child.name) + except ValueError: + continue + if (child / self.filename).exists(): + steps.append(step) + steps.sort() + return steps + + def latest_checkpoint(self) -> int | None: + steps = self.list_checkpoints() + return steps[-1] if steps else None + + def checkpoint_exists(self, step: int) -> bool: + return (self.directory / str(step) / self.filename).exists() + + def uri_for_step(self, step: int) -> str: + path = self._get_path(step) + return f"file://{path}" diff --git a/simplexity/persistence/model_persister.py b/simplexity/persistence/model_persister.py index 493c9fd6..1e457630 100644 --- a/simplexity/persistence/model_persister.py +++ b/simplexity/persistence/model_persister.py @@ -28,3 +28,27 @@ def save_weights(self, model: PredictiveModel, step: int = 0) -> None: def load_weights(self, model: PredictiveModel, step: int = 0) -> PredictiveModel: """Load weights into an existing model instance.""" ... + + # --- Checkpoint discovery helpers --- + @abstractmethod + def list_checkpoints(self) -> list[int]: + """List all available checkpoint steps in this persister.""" + ... + + @abstractmethod + def latest_checkpoint(self) -> int | None: + """Return the latest checkpoint step, or None if none exist.""" + ... + + @abstractmethod + def checkpoint_exists(self, step: int) -> bool: + """Return True if a checkpoint exists for the given step.""" + ... + + def uri_for_step(self, step: int) -> str: + """Return a URI for the checkpoint at the given step. + + Subclasses should override this to provide a stable artifact URI + (e.g., file://, s3://). Default implementation returns an empty string. + """ + return "" diff --git a/simplexity/persistence/s3_persister.py b/simplexity/persistence/s3_persister.py index 2ff32458..1a6aa34f 100644 --- a/simplexity/persistence/s3_persister.py +++ b/simplexity/persistence/s3_persister.py @@ -161,3 +161,45 @@ def _download_s3_object(self, object_name: str, file_name: str) -> None: raise RuntimeError(f"Failed to load {file_name} from S3: {e}") from e except Exception as e: raise RuntimeError(f"Unexpected error loading {file_name} from S3: {e}") from e + + # --- Checkpoint discovery --- + def list_checkpoints(self) -> list[int]: + """List available checkpoint steps under the configured prefix. + + We infer steps as the first path component under `prefix`. + """ + paginator = self.s3_client.get_paginator("list_objects_v2") + steps_set: set[int] = set() + prefix = f"{self.prefix}/" + for page in paginator.paginate(Bucket=self.bucket, Prefix=prefix): + for obj in page.get("Contents", []): + key = obj.get("Key", "") + try: + rel = Path(key).relative_to(self.prefix) + except Exception: + # If key equals prefix with no trailing component, skip + continue + # rel like '123/model.eqx' or '123/...' -> first part is step + parts = rel.parts + if parts: + try: + step = int(parts[0]) + steps_set.add(step) + except ValueError: + continue + steps = sorted(steps_set) + return steps + + def latest_checkpoint(self) -> int | None: + steps = self.list_checkpoints() + return steps[-1] if steps else None + + def checkpoint_exists(self, step: int) -> bool: + return step in set(self.list_checkpoints()) + + def uri_for_step(self, step: int) -> str: + # Best-effort: point to directory or file depending on local persister + filename = getattr(self.local_persister, "filename", None) + if filename: + return f"s3://{self.bucket}/{self.prefix}/{step}/{filename}" + return f"s3://{self.bucket}/{self.prefix}/{step}" diff --git a/tests/loaders/test_experiment_loader.py b/tests/loaders/test_experiment_loader.py new file mode 100644 index 00000000..7d6a3b0d --- /dev/null +++ b/tests/loaders/test_experiment_loader.py @@ -0,0 +1,67 @@ +from __future__ import annotations + +from pathlib import Path +from types import SimpleNamespace + +import pandas as pd +import pytest +from omegaconf import OmegaConf + +from simplexity.loaders.experiment_loader import ExperimentLoader +from simplexity.logging.run_reader import RunReader + + +class _StubReader(RunReader): + def __init__(self, cfg): + self._cfg = cfg + + def get_config(self): + return self._cfg + + def get_params(self): # pragma: no cover - not used + return {} + + def get_tags(self): # pragma: no cover - not used + return {} + + def get_metrics(self, pattern: str | None = None): # pragma: no cover - not used + return pd.DataFrame(columns=["metric", "step", "value", "timestamp"]) + + def list_artifacts(self, path: str | None = None): # pragma: no cover - not used + return [] + + def download_artifact(self, path: str, dst: str | Path | None = None): # pragma: no cover - not used + raise NotImplementedError + + +def test_list_checkpoints_without_model_instantiation(tmp_path: Path): + # Prepare a config that would fail if model instantiation is attempted + cfg_dict = { + "predictive_model": { + "name": "broken", + "instance": { + "_target_": "nonexistent.module.Class", # Must not be imported in this test + }, + }, + "persistence": { + "name": "local_equinox_persister", + "instance": { + "_target_": "simplexity.persistence.local_equinox_persister.LocalEquinoxPersister", + "directory": str(tmp_path), + "filename": "model.eqx", + }, + }, + } + cfg = OmegaConf.create(cfg_dict) + + # Create fake checkpoints + (tmp_path / "0").mkdir(parents=True, exist_ok=True) + (tmp_path / "0" / "model.eqx").write_bytes(b"") + (tmp_path / "3").mkdir(parents=True, exist_ok=True) + (tmp_path / "3" / "model.eqx").write_bytes(b"") + + loader = ExperimentLoader(reader=_StubReader(cfg)) + steps = loader.list_checkpoints() + assert steps == [0, 3] + assert loader.latest_checkpoint() == 3 + diff --git a/tests/logging/test_mlflow_reader.py b/tests/logging/test_mlflow_reader.py new file mode 100644 index 00000000..d50fc4e2 --- /dev/null +++ b/tests/logging/test_mlflow_reader.py @@ -0,0 +1,73 @@ +from __future__ import annotations + +import os +from pathlib import Path +from types import SimpleNamespace +from unittest.mock import MagicMock, patch + +import pandas as pd +import pytest + +from simplexity.logging.mlflow_reader import MLflowRunReader + + +class _Entry: + def __init__(self, path: str, is_dir: bool) -> None: + self.path = path + self.is_dir = is_dir + + +def test_mlflow_reader_metrics_and_config(tmp_path: Path): + """Basic test of metrics DataFrame and config fallback search.""" + with patch("mlflow.MlflowClient") as mock_client_cls: + mock_client = MagicMock() + mock_client_cls.return_value = mock_client + + # Mock run with metric keys + run = SimpleNamespace( + data=SimpleNamespace(metrics={"loss": 0.1, "validation/loss": 0.2}, params={}, tags={}) + ) + mock_client.get_run.return_value = run + + # Metric history (list of objects with .step/.value/.timestamp) + class M: + def __init__(self, step, value, ts): + self.step = step + self.value = value + self.timestamp = ts + + mock_client.get_metric_history.side_effect = lambda run_id, key: [M(0, 1.0, 1), M(1, 0.9, 2)] + + # list_artifacts recursive: "" -> [nested/], "nested" -> [config.yaml] + def list_artifacts(run_id, rel): + return [_Entry("nested", True)] if rel == "" else [_Entry("config.yaml", False)] + + mock_client.list_artifacts.side_effect = list_artifacts + + # download_artifacts: fail for root config, succeed for nested/config.yaml + def download_artifacts(run_id, path, dst): + out_dir = Path(dst) + out_dir.mkdir(parents=True, exist_ok=True) + if path == "config.yaml": + raise RuntimeError("not at root") + # nested/config.yaml + local = out_dir / "config.yaml" + local.write_text( + "predictive_model:\n name: test\n instance:\n _target_: simplexity.predictive_models.gru_rnn.build_gru_rnn\n vocab_size: 2\n\n# minimal persistence section to avoid None-handling paths\npersistence: null\n" + ) + return str(local) + + mock_client.download_artifacts.side_effect = download_artifacts + + reader = MLflowRunReader(run_id="abc", tracking_uri=os.environ.get("MLFLOW_TRACKING_URI")) + + # Metrics + df = reader.get_metrics() + assert isinstance(df, pd.DataFrame) + assert set(df.columns) == {"metric", "step", "value", "timestamp"} + assert set(df["metric"].unique()) == {"loss", "validation/loss"} + + # Config + cfg = reader.get_config() + assert cfg.predictive_model.name == "test" + diff --git a/tests/persistence/test_checkpoint_discovery_local.py b/tests/persistence/test_checkpoint_discovery_local.py new file mode 100644 index 00000000..6a4f98e5 --- /dev/null +++ b/tests/persistence/test_checkpoint_discovery_local.py @@ -0,0 +1,91 @@ +from pathlib import Path + +import jax +import pytest + +from simplexity.persistence.local_equinox_persister import LocalEquinoxPersister +from simplexity.persistence.local_penzai_persister import LocalPenzaiPersister +from simplexity.persistence.local_pytorch_persister import LocalPytorchPersister +from simplexity.predictive_models.gru_rnn import GRURNN + + +def get_eqx_model(seed: int = 0) -> GRURNN: + return GRURNN(vocab_size=2, embedding_size=4, hidden_sizes=[3, 3], key=jax.random.PRNGKey(seed)) + + +def test_local_equinox_checkpoint_discovery(tmp_path: Path): + persister = LocalEquinoxPersister(tmp_path, filename="model.eqx") + model = get_eqx_model(0) + + # No checkpoints initially + assert persister.list_checkpoints() == [] + assert persister.latest_checkpoint() is None + assert not persister.checkpoint_exists(0) + + # Save a couple checkpoints + persister.save_weights(model, 0) + persister.save_weights(model, 5) + + assert persister.list_checkpoints() == [0, 5] + assert persister.latest_checkpoint() == 5 + assert persister.checkpoint_exists(0) + assert not persister.checkpoint_exists(1) + assert persister.uri_for_step(5).startswith("file://") + + +def test_local_pytorch_checkpoint_discovery(tmp_path: Path): + try: + import torch # type: ignore + except Exception: + pytest.skip("PyTorch not available") + + class Simple(torch.nn.Module): # type: ignore + def __init__(self): # pragma: no cover - simple model definition + super().__init__() + self.l = torch.nn.Linear(2, 2) + + def forward(self, x): # pragma: no cover - not used + return self.l(x) + + persister = LocalPytorchPersister(tmp_path, filename="model.pt") + model = Simple() + + assert persister.list_checkpoints() == [] + persister.save_weights(model, 0) + persister.save_weights(model, 2) + assert persister.list_checkpoints() == [0, 2] + assert persister.latest_checkpoint() == 2 + assert persister.checkpoint_exists(2) + assert persister.uri_for_step(2).startswith("file://") + + +def test_local_penzai_checkpoint_discovery(tmp_path: Path): + try: + from penzai.models.transformer.variants.llamalike_common import ( + LlamalikeTransformerConfig, + build_llamalike_transformer, + ) + except Exception: + pytest.skip("Penzai not available") + + config = LlamalikeTransformerConfig( + num_kv_heads=1, + query_head_multiplier=1, + embedding_dim=16, + projection_dim=16, + mlp_hidden_dim=16, + num_decoder_blocks=1, + vocab_size=8, + mlp_variant="geglu_approx", + tie_embedder_and_logits=False, + ) + model = build_llamalike_transformer(config, init_base_rng=jax.random.PRNGKey(0)) + + persister = LocalPenzaiPersister(tmp_path) + assert persister.list_checkpoints() == [] + persister.save_weights(model, 3) + persister.save_weights(model, 7) + assert persister.list_checkpoints() == [3, 7] + assert persister.latest_checkpoint() == 7 + assert persister.checkpoint_exists(3) + assert persister.uri_for_step(7).startswith("file://") diff --git a/tests/persistence/test_checkpoint_discovery_s3.py b/tests/persistence/test_checkpoint_discovery_s3.py new file mode 100644 index 00000000..b6b8bf88 --- /dev/null +++ b/tests/persistence/test_checkpoint_discovery_s3.py @@ -0,0 +1,41 @@ +import tempfile +from pathlib import Path + +import jax + +from simplexity.persistence.local_equinox_persister import LocalEquinoxPersister +from simplexity.persistence.s3_persister import S3Persister +from simplexity.predictive_models.gru_rnn import GRURNN +from tests.persistence.s3_mocks import MockS3Client + + +def get_model(seed: int = 0) -> GRURNN: + return GRURNN(vocab_size=2, embedding_size=4, hidden_sizes=[3, 3], key=jax.random.PRNGKey(seed)) + + +def test_s3_checkpoint_discovery(tmp_path: Path): + s3_client = MockS3Client(tmp_path) + temp_dir = tempfile.TemporaryDirectory() + local = LocalEquinoxPersister(temp_dir.name) + persister = S3Persister( + bucket="b", + prefix="p", + s3_client=s3_client, + temp_dir=temp_dir, + local_persister=local, + ) + + # No checkpoints initially + assert persister.list_checkpoints() == [] + assert persister.latest_checkpoint() is None + + model = get_model(0) + persister.save_weights(model, 0) + persister.save_weights(model, 7) + + assert persister.list_checkpoints() == [0, 7] + assert persister.latest_checkpoint() == 7 + assert persister.checkpoint_exists(0) + # URI should include filename when available + assert persister.uri_for_step(7) == "s3://b/p/7/model.eqx" + diff --git a/uv.lock b/uv.lock index ef2042c4..e00744c4 100644 --- a/uv.lock +++ b/uv.lock @@ -1,10 +1,12 @@ version = 1 -revision = 2 +revision = 3 requires-python = ">=3.12" resolution-markers = [ - "python_full_version >= '3.13' and sys_platform != 'win32'", + "python_full_version >= '3.13' and sys_platform == 'linux'", + "python_full_version >= '3.13' and sys_platform != 'linux' and sys_platform != 'win32'", "python_version < '0'", - "python_full_version < '3.13' and sys_platform != 'win32'", + "python_full_version < '3.13' and sys_platform == 'linux'", + "python_full_version < '3.13' and sys_platform != 'linux' and sys_platform != 'win32'", "python_full_version >= '3.13' and sys_platform == 'win32'", "python_full_version < '3.13' and sys_platform == 'win32'", ] @@ -18,6 +20,98 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/98/5e/34ccb5bfb8dae555045c2dd13375e01ac8e2c1f200a4e4051e95fb9addf0/absl_py-2.2.1-py3-none-any.whl", hash = "sha256:ca8209abd5005ae6e700ef36e2edc84ad5338678f95625a3f15275410a89ffbc", size = 277287, upload-time = "2025-03-26T15:22:43.575Z" }, ] +[[package]] +name = "accelerate" +version = "1.10.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "huggingface-hub" }, + { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.13'" }, + { name = "numpy", version = "2.2.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13'" }, + { name = "packaging" }, + { name = "psutil" }, + { name = "pyyaml" }, + { name = "safetensors" }, + { name = "torch" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/72/ff3961c19ee395c3d30ac630ee77bfb0e1b46b87edc504d4f83bb4a89705/accelerate-1.10.1.tar.gz", hash = "sha256:3dea89e433420e4bfac0369cae7e36dcd6a56adfcfd38cdda145c6225eab5df8", size = 392446, upload-time = "2025-08-25T13:57:06.21Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5f/a0/d9ef19f780f319c21ee90ecfef4431cbeeca95bec7f14071785c17b6029b/accelerate-1.10.1-py3-none-any.whl", hash = "sha256:3621cff60b9a27ce798857ece05e2b9f56fcc71631cfb31ccf71f0359c311f11", size = 374909, upload-time = "2025-08-25T13:57:04.55Z" }, +] + +[[package]] +name = "aiohappyeyeballs" +version = "2.6.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/26/30/f84a107a9c4331c14b2b586036f40965c128aa4fee4dda5d3d51cb14ad54/aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558", size = 22760, upload-time = "2025-03-12T01:42:48.764Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8", size = 15265, upload-time = "2025-03-12T01:42:47.083Z" }, +] + +[[package]] +name = "aiohttp" +version = "3.12.15" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohappyeyeballs" }, + { name = "aiosignal" }, + { name = "attrs" }, + { name = "frozenlist" }, + { name = "multidict" }, + { name = "propcache" }, + { name = "yarl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9b/e7/d92a237d8802ca88483906c388f7c201bbe96cd80a165ffd0ac2f6a8d59f/aiohttp-3.12.15.tar.gz", hash = "sha256:4fc61385e9c98d72fcdf47e6dd81833f47b2f77c114c29cd64a361be57a763a2", size = 7823716, upload-time = "2025-07-29T05:52:32.215Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/97/77cb2450d9b35f517d6cf506256bf4f5bda3f93a66b4ad64ba7fc917899c/aiohttp-3.12.15-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:802d3868f5776e28f7bf69d349c26fc0efadb81676d0afa88ed00d98a26340b7", size = 702333, upload-time = "2025-07-29T05:50:46.507Z" }, + { url = "https://files.pythonhosted.org/packages/83/6d/0544e6b08b748682c30b9f65640d006e51f90763b41d7c546693bc22900d/aiohttp-3.12.15-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f2800614cd560287be05e33a679638e586a2d7401f4ddf99e304d98878c29444", size = 476948, upload-time = "2025-07-29T05:50:48.067Z" }, + { url = "https://files.pythonhosted.org/packages/3a/1d/c8c40e611e5094330284b1aea8a4b02ca0858f8458614fa35754cab42b9c/aiohttp-3.12.15-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8466151554b593909d30a0a125d638b4e5f3836e5aecde85b66b80ded1cb5b0d", size = 469787, upload-time = "2025-07-29T05:50:49.669Z" }, + { url = "https://files.pythonhosted.org/packages/38/7d/b76438e70319796bfff717f325d97ce2e9310f752a267bfdf5192ac6082b/aiohttp-3.12.15-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e5a495cb1be69dae4b08f35a6c4579c539e9b5706f606632102c0f855bcba7c", size = 1716590, upload-time = "2025-07-29T05:50:51.368Z" }, + { url = "https://files.pythonhosted.org/packages/79/b1/60370d70cdf8b269ee1444b390cbd72ce514f0d1cd1a715821c784d272c9/aiohttp-3.12.15-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6404dfc8cdde35c69aaa489bb3542fb86ef215fc70277c892be8af540e5e21c0", size = 1699241, upload-time = "2025-07-29T05:50:53.628Z" }, + { url = "https://files.pythonhosted.org/packages/a3/2b/4968a7b8792437ebc12186db31523f541943e99bda8f30335c482bea6879/aiohttp-3.12.15-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3ead1c00f8521a5c9070fcb88f02967b1d8a0544e6d85c253f6968b785e1a2ab", size = 1754335, upload-time = "2025-07-29T05:50:55.394Z" }, + { url = "https://files.pythonhosted.org/packages/fb/c1/49524ed553f9a0bec1a11fac09e790f49ff669bcd14164f9fab608831c4d/aiohttp-3.12.15-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6990ef617f14450bc6b34941dba4f12d5613cbf4e33805932f853fbd1cf18bfb", size = 1800491, upload-time = "2025-07-29T05:50:57.202Z" }, + { url = "https://files.pythonhosted.org/packages/de/5e/3bf5acea47a96a28c121b167f5ef659cf71208b19e52a88cdfa5c37f1fcc/aiohttp-3.12.15-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd736ed420f4db2b8148b52b46b88ed038d0354255f9a73196b7bbce3ea97545", size = 1719929, upload-time = "2025-07-29T05:50:59.192Z" }, + { url = "https://files.pythonhosted.org/packages/39/94/8ae30b806835bcd1cba799ba35347dee6961a11bd507db634516210e91d8/aiohttp-3.12.15-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c5092ce14361a73086b90c6efb3948ffa5be2f5b6fbcf52e8d8c8b8848bb97c", size = 1635733, upload-time = "2025-07-29T05:51:01.394Z" }, + { url = "https://files.pythonhosted.org/packages/7a/46/06cdef71dd03acd9da7f51ab3a9107318aee12ad38d273f654e4f981583a/aiohttp-3.12.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:aaa2234bb60c4dbf82893e934d8ee8dea30446f0647e024074237a56a08c01bd", size = 1696790, upload-time = "2025-07-29T05:51:03.657Z" }, + { url = "https://files.pythonhosted.org/packages/02/90/6b4cfaaf92ed98d0ec4d173e78b99b4b1a7551250be8937d9d67ecb356b4/aiohttp-3.12.15-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:6d86a2fbdd14192e2f234a92d3b494dd4457e683ba07e5905a0b3ee25389ac9f", size = 1718245, upload-time = "2025-07-29T05:51:05.911Z" }, + { url = "https://files.pythonhosted.org/packages/2e/e6/2593751670fa06f080a846f37f112cbe6f873ba510d070136a6ed46117c6/aiohttp-3.12.15-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a041e7e2612041a6ddf1c6a33b883be6a421247c7afd47e885969ee4cc58bd8d", size = 1658899, upload-time = "2025-07-29T05:51:07.753Z" }, + { url = "https://files.pythonhosted.org/packages/8f/28/c15bacbdb8b8eb5bf39b10680d129ea7410b859e379b03190f02fa104ffd/aiohttp-3.12.15-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5015082477abeafad7203757ae44299a610e89ee82a1503e3d4184e6bafdd519", size = 1738459, upload-time = "2025-07-29T05:51:09.56Z" }, + { url = "https://files.pythonhosted.org/packages/00/de/c269cbc4faa01fb10f143b1670633a8ddd5b2e1ffd0548f7aa49cb5c70e2/aiohttp-3.12.15-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:56822ff5ddfd1b745534e658faba944012346184fbfe732e0d6134b744516eea", size = 1766434, upload-time = "2025-07-29T05:51:11.423Z" }, + { url = "https://files.pythonhosted.org/packages/52/b0/4ff3abd81aa7d929b27d2e1403722a65fc87b763e3a97b3a2a494bfc63bc/aiohttp-3.12.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b2acbbfff69019d9014508c4ba0401822e8bae5a5fdc3b6814285b71231b60f3", size = 1726045, upload-time = "2025-07-29T05:51:13.689Z" }, + { url = "https://files.pythonhosted.org/packages/71/16/949225a6a2dd6efcbd855fbd90cf476052e648fb011aa538e3b15b89a57a/aiohttp-3.12.15-cp312-cp312-win32.whl", hash = "sha256:d849b0901b50f2185874b9a232f38e26b9b3d4810095a7572eacea939132d4e1", size = 423591, upload-time = "2025-07-29T05:51:15.452Z" }, + { url = "https://files.pythonhosted.org/packages/2b/d8/fa65d2a349fe938b76d309db1a56a75c4fb8cc7b17a398b698488a939903/aiohttp-3.12.15-cp312-cp312-win_amd64.whl", hash = "sha256:b390ef5f62bb508a9d67cb3bba9b8356e23b3996da7062f1a57ce1a79d2b3d34", size = 450266, upload-time = "2025-07-29T05:51:17.239Z" }, + { url = "https://files.pythonhosted.org/packages/f2/33/918091abcf102e39d15aba2476ad9e7bd35ddb190dcdd43a854000d3da0d/aiohttp-3.12.15-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:9f922ffd05034d439dde1c77a20461cf4a1b0831e6caa26151fe7aa8aaebc315", size = 696741, upload-time = "2025-07-29T05:51:19.021Z" }, + { url = "https://files.pythonhosted.org/packages/b5/2a/7495a81e39a998e400f3ecdd44a62107254803d1681d9189be5c2e4530cd/aiohttp-3.12.15-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2ee8a8ac39ce45f3e55663891d4b1d15598c157b4d494a4613e704c8b43112cd", size = 474407, upload-time = "2025-07-29T05:51:21.165Z" }, + { url = "https://files.pythonhosted.org/packages/49/fc/a9576ab4be2dcbd0f73ee8675d16c707cfc12d5ee80ccf4015ba543480c9/aiohttp-3.12.15-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3eae49032c29d356b94eee45a3f39fdf4b0814b397638c2f718e96cfadf4c4e4", size = 466703, upload-time = "2025-07-29T05:51:22.948Z" }, + { url = "https://files.pythonhosted.org/packages/09/2f/d4bcc8448cf536b2b54eed48f19682031ad182faa3a3fee54ebe5b156387/aiohttp-3.12.15-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b97752ff12cc12f46a9b20327104448042fce5c33a624f88c18f66f9368091c7", size = 1705532, upload-time = "2025-07-29T05:51:25.211Z" }, + { url = "https://files.pythonhosted.org/packages/f1/f3/59406396083f8b489261e3c011aa8aee9df360a96ac8fa5c2e7e1b8f0466/aiohttp-3.12.15-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:894261472691d6fe76ebb7fcf2e5870a2ac284c7406ddc95823c8598a1390f0d", size = 1686794, upload-time = "2025-07-29T05:51:27.145Z" }, + { url = "https://files.pythonhosted.org/packages/dc/71/164d194993a8d114ee5656c3b7ae9c12ceee7040d076bf7b32fb98a8c5c6/aiohttp-3.12.15-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5fa5d9eb82ce98959fc1031c28198b431b4d9396894f385cb63f1e2f3f20ca6b", size = 1738865, upload-time = "2025-07-29T05:51:29.366Z" }, + { url = "https://files.pythonhosted.org/packages/1c/00/d198461b699188a93ead39cb458554d9f0f69879b95078dce416d3209b54/aiohttp-3.12.15-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f0fa751efb11a541f57db59c1dd821bec09031e01452b2b6217319b3a1f34f3d", size = 1788238, upload-time = "2025-07-29T05:51:31.285Z" }, + { url = "https://files.pythonhosted.org/packages/85/b8/9e7175e1fa0ac8e56baa83bf3c214823ce250d0028955dfb23f43d5e61fd/aiohttp-3.12.15-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5346b93e62ab51ee2a9d68e8f73c7cf96ffb73568a23e683f931e52450e4148d", size = 1710566, upload-time = "2025-07-29T05:51:33.219Z" }, + { url = "https://files.pythonhosted.org/packages/59/e4/16a8eac9df39b48ae102ec030fa9f726d3570732e46ba0c592aeeb507b93/aiohttp-3.12.15-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:049ec0360f939cd164ecbfd2873eaa432613d5e77d6b04535e3d1fbae5a9e645", size = 1624270, upload-time = "2025-07-29T05:51:35.195Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f8/cd84dee7b6ace0740908fd0af170f9fab50c2a41ccbc3806aabcb1050141/aiohttp-3.12.15-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b52dcf013b57464b6d1e51b627adfd69a8053e84b7103a7cd49c030f9ca44461", size = 1677294, upload-time = "2025-07-29T05:51:37.215Z" }, + { url = "https://files.pythonhosted.org/packages/ce/42/d0f1f85e50d401eccd12bf85c46ba84f947a84839c8a1c2c5f6e8ab1eb50/aiohttp-3.12.15-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:9b2af240143dd2765e0fb661fd0361a1b469cab235039ea57663cda087250ea9", size = 1708958, upload-time = "2025-07-29T05:51:39.328Z" }, + { url = "https://files.pythonhosted.org/packages/d5/6b/f6fa6c5790fb602538483aa5a1b86fcbad66244997e5230d88f9412ef24c/aiohttp-3.12.15-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ac77f709a2cde2cc71257ab2d8c74dd157c67a0558a0d2799d5d571b4c63d44d", size = 1651553, upload-time = "2025-07-29T05:51:41.356Z" }, + { url = "https://files.pythonhosted.org/packages/04/36/a6d36ad545fa12e61d11d1932eef273928b0495e6a576eb2af04297fdd3c/aiohttp-3.12.15-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:47f6b962246f0a774fbd3b6b7be25d59b06fdb2f164cf2513097998fc6a29693", size = 1727688, upload-time = "2025-07-29T05:51:43.452Z" }, + { url = "https://files.pythonhosted.org/packages/aa/c8/f195e5e06608a97a4e52c5d41c7927301bf757a8e8bb5bbf8cef6c314961/aiohttp-3.12.15-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:760fb7db442f284996e39cf9915a94492e1896baac44f06ae551974907922b64", size = 1761157, upload-time = "2025-07-29T05:51:45.643Z" }, + { url = "https://files.pythonhosted.org/packages/05/6a/ea199e61b67f25ba688d3ce93f63b49b0a4e3b3d380f03971b4646412fc6/aiohttp-3.12.15-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ad702e57dc385cae679c39d318def49aef754455f237499d5b99bea4ef582e51", size = 1710050, upload-time = "2025-07-29T05:51:48.203Z" }, + { url = "https://files.pythonhosted.org/packages/b4/2e/ffeb7f6256b33635c29dbed29a22a723ff2dd7401fff42ea60cf2060abfb/aiohttp-3.12.15-cp313-cp313-win32.whl", hash = "sha256:f813c3e9032331024de2eb2e32a88d86afb69291fbc37a3a3ae81cc9917fb3d0", size = 422647, upload-time = "2025-07-29T05:51:50.718Z" }, + { url = "https://files.pythonhosted.org/packages/1b/8e/78ee35774201f38d5e1ba079c9958f7629b1fd079459aea9467441dbfbf5/aiohttp-3.12.15-cp313-cp313-win_amd64.whl", hash = "sha256:1a649001580bdb37c6fdb1bebbd7e3bc688e8ec2b5c6f52edbb664662b17dc84", size = 449067, upload-time = "2025-07-29T05:51:52.549Z" }, +] + +[[package]] +name = "aiosignal" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "frozenlist" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/61/62/06741b579156360248d1ec624842ad0edf697050bbaf7c3e46394e106ad1/aiosignal-1.4.0.tar.gz", hash = "sha256:f47eecd9468083c2029cc99945502cb7708b082c232f9aca65da147157b251c7", size = 25007, upload-time = "2025-07-03T22:54:43.528Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl", hash = "sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e", size = 7490, upload-time = "2025-07-03T22:54:42.156Z" }, +] + [[package]] name = "alembic" version = "1.15.2" @@ -173,6 +267,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537, upload-time = "2025-02-01T15:17:37.39Z" }, ] +[[package]] +name = "beartype" +version = "0.14.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/89/3b/9ecfc75d1f8bb75cbdc87fcb3df7c6ec4bc8f7481cb7102859ade1736c9d/beartype-0.14.1.tar.gz", hash = "sha256:23df4715d19cebb2ce60e53c3cf44cd925843f00c71938222d777ea6332de3cb", size = 964899, upload-time = "2023-06-07T05:38:56.905Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f6/db/8d01583b4175e0e45a6e6cd0c28db2dae38ffe5477141a7ac3a5a09c8bb9/beartype-0.14.1-py3-none-any.whl", hash = "sha256:0f70fccdb8eb6d7ddfaa3ffe3a0b66cf2edeb13452bd71ad46615775c2fa34f6", size = 739737, upload-time = "2023-06-07T05:38:54.076Z" }, +] + [[package]] name = "beautifulsoup4" version = "4.13.3" @@ -186,6 +289,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f9/49/6abb616eb3cbab6a7cca303dc02fdf3836de2e0b834bf966a7f5271a34d8/beautifulsoup4-4.13.3-py3-none-any.whl", hash = "sha256:99045d7d3f08f91f0d656bc9b7efbae189426cd913d830294a15eefa0ea4df16", size = 186015, upload-time = "2025-02-04T20:05:03.729Z" }, ] +[[package]] +name = "better-abc" +version = "0.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8b/72/3d630f781659015357cc08cad32aa636b252e007df0bae31184a3d872427/better-abc-0.0.3.tar.gz", hash = "sha256:a880fd6bc9675da2ec991e8712a555bffa0f12722efed78c739f78343cf989f6", size = 2852, upload-time = "2020-11-10T22:47:31.303Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d9/e8/7d00a23039ab74c5741736ce05d7700eb6237e83747aac4df07a5bf2d074/better_abc-0.0.3-py3-none-any.whl", hash = "sha256:3ae73b473fbeb536a548f542984976e80b821676ae6e18f14e24d8e180647187", size = 3475, upload-time = "2020-11-10T22:47:30.354Z" }, +] + [[package]] name = "bleach" version = "6.2.0" @@ -334,7 +446,8 @@ dependencies = [ { name = "absl-py" }, { name = "jax" }, { name = "jaxlib" }, - { name = "numpy" }, + { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.13'" }, + { name = "numpy", version = "2.2.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13'" }, { name = "setuptools" }, { name = "toolz" }, { name = "typing-extensions" }, @@ -386,7 +499,8 @@ name = "cmaes" version = "0.11.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy" }, + { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.13'" }, + { name = "numpy", version = "2.2.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/8f/29/86dc7d673dee33bb67b6d40d9809a6804658a2764ecd30bba201782c59d6/cmaes-0.11.1.tar.gz", hash = "sha256:cf71fa3679814723be771f2c9edd85f465b1bc1e409e1ad6d8a9e481efcd5160", size = 31439, upload-time = "2024-08-13T06:46:34.728Z" } wheels = [ @@ -446,7 +560,8 @@ name = "contourpy" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy" }, + { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.13'" }, + { name = "numpy", version = "2.2.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/25/c2/fc7193cc5383637ff390a712e88e4ded0452c9fbcf84abe3de5ea3df1866/contourpy-1.3.1.tar.gz", hash = "sha256:dfd97abd83335045a913e3bcc4a09c0ceadbe66580cf573fe961f4a825efa699", size = 13465753, upload-time = "2024-11-12T11:00:59.118Z" } wheels = [ @@ -543,6 +658,65 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/73/4a/d80ed430307d4e782bd15e36b26a953348adbfcf050f270a7cfbb8415ebb/databricks_sdk-0.49.0-py3-none-any.whl", hash = "sha256:c7171f3703196720d6cf85adea1bc9701ca64e7ef8a3d356ca53e6e3536c628e", size = 683968, upload-time = "2025-03-28T10:44:30.234Z" }, ] +[[package]] +name = "datasets" +version = "2.14.4" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.13' and sys_platform == 'linux'", +] +dependencies = [ + { name = "aiohttp", marker = "python_full_version >= '3.13' and sys_platform == 'linux'" }, + { name = "dill", marker = "python_full_version >= '3.13' and sys_platform == 'linux'" }, + { name = "fsspec", version = "2025.3.2", source = { registry = "https://pypi.org/simple" }, extra = ["http"], marker = "python_full_version >= '3.13' and sys_platform == 'linux'" }, + { name = "huggingface-hub", marker = "python_full_version >= '3.13' and sys_platform == 'linux'" }, + { name = "multiprocess", marker = "python_full_version >= '3.13' and sys_platform == 'linux'" }, + { name = "numpy", version = "2.2.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13' and sys_platform == 'linux'" }, + { name = "packaging", marker = "python_full_version >= '3.13' and sys_platform == 'linux'" }, + { name = "pandas", marker = "python_full_version >= '3.13' and sys_platform == 'linux'" }, + { name = "pyarrow", marker = "python_full_version >= '3.13' and sys_platform == 'linux'" }, + { name = "pyyaml", marker = "python_full_version >= '3.13' and sys_platform == 'linux'" }, + { name = "requests", marker = "python_full_version >= '3.13' and sys_platform == 'linux'" }, + { name = "tqdm", marker = "python_full_version >= '3.13' and sys_platform == 'linux'" }, + { name = "xxhash", marker = "python_full_version >= '3.13' and sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1d/69/8cc725b5d38968fd118e4ce56a483b16e75b7793854c1a392ec4a34eeb31/datasets-2.14.4.tar.gz", hash = "sha256:ef29c2b5841de488cd343cfc26ab979bff77efa4d2285af51f1ad7db5c46a83b", size = 2178719, upload-time = "2023-08-08T15:45:43.015Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/66/f8/38298237d18d4b6a8ee5dfe390e97bed5adb8e01ec6f9680c0ddf3066728/datasets-2.14.4-py3-none-any.whl", hash = "sha256:29336bd316a7d827ccd4da2236596279b20ca2ac78f64c04c9483da7cbc2459b", size = 519335, upload-time = "2023-08-08T15:45:38.837Z" }, +] + +[[package]] +name = "datasets" +version = "4.0.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.13' and sys_platform != 'linux' and sys_platform != 'win32'", + "python_full_version < '3.13' and sys_platform == 'linux'", + "python_full_version < '3.13' and sys_platform != 'linux' and sys_platform != 'win32'", + "python_full_version >= '3.13' and sys_platform == 'win32'", + "python_full_version < '3.13' and sys_platform == 'win32'", +] +dependencies = [ + { name = "dill", marker = "python_full_version < '3.13' or sys_platform != 'linux'" }, + { name = "filelock", marker = "python_full_version < '3.13' or sys_platform != 'linux'" }, + { name = "fsspec", version = "2025.3.0", source = { registry = "https://pypi.org/simple" }, extra = ["http"], marker = "python_full_version < '3.13' or sys_platform != 'linux'" }, + { name = "huggingface-hub", marker = "python_full_version < '3.13' or sys_platform != 'linux'" }, + { name = "multiprocess", marker = "python_full_version < '3.13' or sys_platform != 'linux'" }, + { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.13'" }, + { name = "numpy", version = "2.2.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13' and sys_platform != 'linux'" }, + { name = "packaging", marker = "python_full_version < '3.13' or sys_platform != 'linux'" }, + { name = "pandas", marker = "python_full_version < '3.13' or sys_platform != 'linux'" }, + { name = "pyarrow", marker = "python_full_version < '3.13' or sys_platform != 'linux'" }, + { name = "pyyaml", marker = "python_full_version < '3.13' or sys_platform != 'linux'" }, + { name = "requests", marker = "python_full_version < '3.13' or sys_platform != 'linux'" }, + { name = "tqdm", marker = "python_full_version < '3.13' or sys_platform != 'linux'" }, + { name = "xxhash", marker = "python_full_version < '3.13' or sys_platform != 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e3/9d/348ed92110ba5f9b70b51ca1078d4809767a835aa2b7ce7e74ad2b98323d/datasets-4.0.0.tar.gz", hash = "sha256:9657e7140a9050db13443ba21cb5de185af8af944479b00e7ff1e00a61c8dbf1", size = 569566, upload-time = "2025-07-09T14:35:52.431Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/eb/62/eb8157afb21bd229c864521c1ab4fa8e9b4f1b06bafdd8c4668a7a31b5dd/datasets-4.0.0-py3-none-any.whl", hash = "sha256:7ef95e62025fd122882dbce6cb904c8cd3fbc829de6669a5eb939c77d50e203d", size = 494825, upload-time = "2025-07-09T14:35:50.658Z" }, +] + [[package]] name = "debugpy" version = "1.8.13" @@ -590,6 +764,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6e/c6/ac0b6c1e2d138f1002bcf799d330bd6d85084fece321e662a14223794041/Deprecated-1.2.18-py2.py3-none-any.whl", hash = "sha256:bd5011788200372a32418f888e326a09ff80d0214bd961147cfed01b5c018eec", size = 9998, upload-time = "2025-01-27T10:46:09.186Z" }, ] +[[package]] +name = "dill" +version = "0.3.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c4/31/54dd222e02311c2dbc9e680d37cbd50f4494ce1ee9b04c69980e4ec26f38/dill-0.3.7.tar.gz", hash = "sha256:cc1c8b182eb3013e24bd475ff2e9295af86c1a38eb1aff128dac8962a9ce3c03", size = 183355, upload-time = "2023-07-22T22:18:46.449Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f5/3a/74a29b11cf2cdfcd6ba89c0cecd70b37cd1ba7b77978ce611eb7a146a832/dill-0.3.7-py3-none-any.whl", hash = "sha256:76b122c08ef4ce2eedcd4d1abd8e641114bfc6c2867f49f3c41facf65bf19f5e", size = 115254, upload-time = "2023-07-22T22:18:44.511Z" }, +] + [[package]] name = "docker" version = "7.1.0" @@ -615,6 +798,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b2/b7/545d2c10c1fc15e48653c91efde329a790f2eecfbbf2bd16003b5db2bab0/dotenv-0.9.9-py2.py3-none-any.whl", hash = "sha256:29cf74a087b31dafdb5a446b6d7e11cbce8ed2741540e2339c69fbef92c94ce9", size = 1892, upload-time = "2025-02-19T22:15:01.647Z" }, ] +[[package]] +name = "einops" +version = "0.8.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e5/81/df4fbe24dff8ba3934af99044188e20a98ed441ad17a274539b74e82e126/einops-0.8.1.tar.gz", hash = "sha256:de5d960a7a761225532e0f1959e5315ebeafc0cd43394732f103ca44b9837e84", size = 54805, upload-time = "2025-02-09T03:17:00.434Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/87/62/9773de14fe6c45c23649e98b83231fffd7b9892b6cf863251dc2afa73643/einops-0.8.1-py3-none-any.whl", hash = "sha256:919387eb55330f5757c6bea9165c5ff5cfe63a642682ea788a6d472576d81737", size = 64359, upload-time = "2025-02-09T03:17:01.998Z" }, +] + [[package]] name = "equinox" version = "0.12.1" @@ -641,7 +833,8 @@ wheels = [ [package.optional-dependencies] epath = [ - { name = "fsspec" }, + { name = "fsspec", version = "2025.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.13' or sys_platform != 'linux'" }, + { name = "fsspec", version = "2025.3.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13' and sys_platform == 'linux'" }, { name = "importlib-resources" }, { name = "typing-extensions" }, { name = "zipp" }, @@ -659,6 +852,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7b/8f/c4d9bafc34ad7ad5d8dc16dd1347ee0e507a52c3adb6bfa8887e1c6a26ba/executing-2.2.0-py2.py3-none-any.whl", hash = "sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa", size = 26702, upload-time = "2025-01-22T15:41:25.929Z" }, ] +[[package]] +name = "fancy-einsum" +version = "0.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b9/b1/f5a13cdc05b9a16502d760ead310a689a1538f3fee9618b92011200b9717/fancy_einsum-0.0.3.tar.gz", hash = "sha256:05ca6689999d0949bdaa5320c81117effa13644ec68a200121e93d7ebf3d3356", size = 4916, upload-time = "2022-02-04T01:53:46.028Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/14/26fc262ba70976eea9a42e67b05c67aa78a0ee38332d9d094cca5d2c5ec3/fancy_einsum-0.0.3-py3-none-any.whl", hash = "sha256:e0bf33587a61822b0668512ada237a0ffa5662adfb9acfcbb0356ee15a0396a1", size = 6239, upload-time = "2022-02-04T01:53:44.44Z" }, +] + [[package]] name = "fastapi" version = "0.115.12" @@ -741,15 +943,104 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl", hash = "sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014", size = 9121, upload-time = "2021-03-11T07:16:28.351Z" }, ] +[[package]] +name = "frozenlist" +version = "1.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/79/b1/b64018016eeb087db503b038296fd782586432b9c077fc5c7839e9cb6ef6/frozenlist-1.7.0.tar.gz", hash = "sha256:2e310d81923c2437ea8670467121cc3e9b0f76d3043cc1d2331d56c7fb7a3a8f", size = 45078, upload-time = "2025-06-09T23:02:35.538Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/a2/c8131383f1e66adad5f6ecfcce383d584ca94055a34d683bbb24ac5f2f1c/frozenlist-1.7.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:3dbf9952c4bb0e90e98aec1bd992b3318685005702656bc6f67c1a32b76787f2", size = 81424, upload-time = "2025-06-09T23:00:42.24Z" }, + { url = "https://files.pythonhosted.org/packages/4c/9d/02754159955088cb52567337d1113f945b9e444c4960771ea90eb73de8db/frozenlist-1.7.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:1f5906d3359300b8a9bb194239491122e6cf1444c2efb88865426f170c262cdb", size = 47952, upload-time = "2025-06-09T23:00:43.481Z" }, + { url = "https://files.pythonhosted.org/packages/01/7a/0046ef1bd6699b40acd2067ed6d6670b4db2f425c56980fa21c982c2a9db/frozenlist-1.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3dabd5a8f84573c8d10d8859a50ea2dec01eea372031929871368c09fa103478", size = 46688, upload-time = "2025-06-09T23:00:44.793Z" }, + { url = "https://files.pythonhosted.org/packages/d6/a2/a910bafe29c86997363fb4c02069df4ff0b5bc39d33c5198b4e9dd42d8f8/frozenlist-1.7.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa57daa5917f1738064f302bf2626281a1cb01920c32f711fbc7bc36111058a8", size = 243084, upload-time = "2025-06-09T23:00:46.125Z" }, + { url = "https://files.pythonhosted.org/packages/64/3e/5036af9d5031374c64c387469bfcc3af537fc0f5b1187d83a1cf6fab1639/frozenlist-1.7.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c193dda2b6d49f4c4398962810fa7d7c78f032bf45572b3e04dd5249dff27e08", size = 233524, upload-time = "2025-06-09T23:00:47.73Z" }, + { url = "https://files.pythonhosted.org/packages/06/39/6a17b7c107a2887e781a48ecf20ad20f1c39d94b2a548c83615b5b879f28/frozenlist-1.7.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bfe2b675cf0aaa6d61bf8fbffd3c274b3c9b7b1623beb3809df8a81399a4a9c4", size = 248493, upload-time = "2025-06-09T23:00:49.742Z" }, + { url = "https://files.pythonhosted.org/packages/be/00/711d1337c7327d88c44d91dd0f556a1c47fb99afc060ae0ef66b4d24793d/frozenlist-1.7.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8fc5d5cda37f62b262405cf9652cf0856839c4be8ee41be0afe8858f17f4c94b", size = 244116, upload-time = "2025-06-09T23:00:51.352Z" }, + { url = "https://files.pythonhosted.org/packages/24/fe/74e6ec0639c115df13d5850e75722750adabdc7de24e37e05a40527ca539/frozenlist-1.7.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0d5ce521d1dd7d620198829b87ea002956e4319002ef0bc8d3e6d045cb4646e", size = 224557, upload-time = "2025-06-09T23:00:52.855Z" }, + { url = "https://files.pythonhosted.org/packages/8d/db/48421f62a6f77c553575201e89048e97198046b793f4a089c79a6e3268bd/frozenlist-1.7.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:488d0a7d6a0008ca0db273c542098a0fa9e7dfaa7e57f70acef43f32b3f69dca", size = 241820, upload-time = "2025-06-09T23:00:54.43Z" }, + { url = "https://files.pythonhosted.org/packages/1d/fa/cb4a76bea23047c8462976ea7b7a2bf53997a0ca171302deae9d6dd12096/frozenlist-1.7.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:15a7eaba63983d22c54d255b854e8108e7e5f3e89f647fc854bd77a237e767df", size = 236542, upload-time = "2025-06-09T23:00:56.409Z" }, + { url = "https://files.pythonhosted.org/packages/5d/32/476a4b5cfaa0ec94d3f808f193301debff2ea42288a099afe60757ef6282/frozenlist-1.7.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:1eaa7e9c6d15df825bf255649e05bd8a74b04a4d2baa1ae46d9c2d00b2ca2cb5", size = 249350, upload-time = "2025-06-09T23:00:58.468Z" }, + { url = "https://files.pythonhosted.org/packages/8d/ba/9a28042f84a6bf8ea5dbc81cfff8eaef18d78b2a1ad9d51c7bc5b029ad16/frozenlist-1.7.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e4389e06714cfa9d47ab87f784a7c5be91d3934cd6e9a7b85beef808297cc025", size = 225093, upload-time = "2025-06-09T23:01:00.015Z" }, + { url = "https://files.pythonhosted.org/packages/bc/29/3a32959e68f9cf000b04e79ba574527c17e8842e38c91d68214a37455786/frozenlist-1.7.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:73bd45e1488c40b63fe5a7df892baf9e2a4d4bb6409a2b3b78ac1c6236178e01", size = 245482, upload-time = "2025-06-09T23:01:01.474Z" }, + { url = "https://files.pythonhosted.org/packages/80/e8/edf2f9e00da553f07f5fa165325cfc302dead715cab6ac8336a5f3d0adc2/frozenlist-1.7.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:99886d98e1643269760e5fe0df31e5ae7050788dd288947f7f007209b8c33f08", size = 249590, upload-time = "2025-06-09T23:01:02.961Z" }, + { url = "https://files.pythonhosted.org/packages/1c/80/9a0eb48b944050f94cc51ee1c413eb14a39543cc4f760ed12657a5a3c45a/frozenlist-1.7.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:290a172aae5a4c278c6da8a96222e6337744cd9c77313efe33d5670b9f65fc43", size = 237785, upload-time = "2025-06-09T23:01:05.095Z" }, + { url = "https://files.pythonhosted.org/packages/f3/74/87601e0fb0369b7a2baf404ea921769c53b7ae00dee7dcfe5162c8c6dbf0/frozenlist-1.7.0-cp312-cp312-win32.whl", hash = "sha256:426c7bc70e07cfebc178bc4c2bf2d861d720c4fff172181eeb4a4c41d4ca2ad3", size = 39487, upload-time = "2025-06-09T23:01:06.54Z" }, + { url = "https://files.pythonhosted.org/packages/0b/15/c026e9a9fc17585a9d461f65d8593d281fedf55fbf7eb53f16c6df2392f9/frozenlist-1.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:563b72efe5da92e02eb68c59cb37205457c977aa7a449ed1b37e6939e5c47c6a", size = 43874, upload-time = "2025-06-09T23:01:07.752Z" }, + { url = "https://files.pythonhosted.org/packages/24/90/6b2cebdabdbd50367273c20ff6b57a3dfa89bd0762de02c3a1eb42cb6462/frozenlist-1.7.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ee80eeda5e2a4e660651370ebffd1286542b67e268aa1ac8d6dbe973120ef7ee", size = 79791, upload-time = "2025-06-09T23:01:09.368Z" }, + { url = "https://files.pythonhosted.org/packages/83/2e/5b70b6a3325363293fe5fc3ae74cdcbc3e996c2a11dde2fd9f1fb0776d19/frozenlist-1.7.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d1a81c85417b914139e3a9b995d4a1c84559afc839a93cf2cb7f15e6e5f6ed2d", size = 47165, upload-time = "2025-06-09T23:01:10.653Z" }, + { url = "https://files.pythonhosted.org/packages/f4/25/a0895c99270ca6966110f4ad98e87e5662eab416a17e7fd53c364bf8b954/frozenlist-1.7.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cbb65198a9132ebc334f237d7b0df163e4de83fb4f2bdfe46c1e654bdb0c5d43", size = 45881, upload-time = "2025-06-09T23:01:12.296Z" }, + { url = "https://files.pythonhosted.org/packages/19/7c/71bb0bbe0832793c601fff68cd0cf6143753d0c667f9aec93d3c323f4b55/frozenlist-1.7.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dab46c723eeb2c255a64f9dc05b8dd601fde66d6b19cdb82b2e09cc6ff8d8b5d", size = 232409, upload-time = "2025-06-09T23:01:13.641Z" }, + { url = "https://files.pythonhosted.org/packages/c0/45/ed2798718910fe6eb3ba574082aaceff4528e6323f9a8570be0f7028d8e9/frozenlist-1.7.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6aeac207a759d0dedd2e40745575ae32ab30926ff4fa49b1635def65806fddee", size = 225132, upload-time = "2025-06-09T23:01:15.264Z" }, + { url = "https://files.pythonhosted.org/packages/ba/e2/8417ae0f8eacb1d071d4950f32f229aa6bf68ab69aab797b72a07ea68d4f/frozenlist-1.7.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bd8c4e58ad14b4fa7802b8be49d47993182fdd4023393899632c88fd8cd994eb", size = 237638, upload-time = "2025-06-09T23:01:16.752Z" }, + { url = "https://files.pythonhosted.org/packages/f8/b7/2ace5450ce85f2af05a871b8c8719b341294775a0a6c5585d5e6170f2ce7/frozenlist-1.7.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04fb24d104f425da3540ed83cbfc31388a586a7696142004c577fa61c6298c3f", size = 233539, upload-time = "2025-06-09T23:01:18.202Z" }, + { url = "https://files.pythonhosted.org/packages/46/b9/6989292c5539553dba63f3c83dc4598186ab2888f67c0dc1d917e6887db6/frozenlist-1.7.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6a5c505156368e4ea6b53b5ac23c92d7edc864537ff911d2fb24c140bb175e60", size = 215646, upload-time = "2025-06-09T23:01:19.649Z" }, + { url = "https://files.pythonhosted.org/packages/72/31/bc8c5c99c7818293458fe745dab4fd5730ff49697ccc82b554eb69f16a24/frozenlist-1.7.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8bd7eb96a675f18aa5c553eb7ddc24a43c8c18f22e1f9925528128c052cdbe00", size = 232233, upload-time = "2025-06-09T23:01:21.175Z" }, + { url = "https://files.pythonhosted.org/packages/59/52/460db4d7ba0811b9ccb85af996019f5d70831f2f5f255f7cc61f86199795/frozenlist-1.7.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:05579bf020096fe05a764f1f84cd104a12f78eaab68842d036772dc6d4870b4b", size = 227996, upload-time = "2025-06-09T23:01:23.098Z" }, + { url = "https://files.pythonhosted.org/packages/ba/c9/f4b39e904c03927b7ecf891804fd3b4df3db29b9e487c6418e37988d6e9d/frozenlist-1.7.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:376b6222d114e97eeec13d46c486facd41d4f43bab626b7c3f6a8b4e81a5192c", size = 242280, upload-time = "2025-06-09T23:01:24.808Z" }, + { url = "https://files.pythonhosted.org/packages/b8/33/3f8d6ced42f162d743e3517781566b8481322be321b486d9d262adf70bfb/frozenlist-1.7.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:0aa7e176ebe115379b5b1c95b4096fb1c17cce0847402e227e712c27bdb5a949", size = 217717, upload-time = "2025-06-09T23:01:26.28Z" }, + { url = "https://files.pythonhosted.org/packages/3e/e8/ad683e75da6ccef50d0ab0c2b2324b32f84fc88ceee778ed79b8e2d2fe2e/frozenlist-1.7.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3fbba20e662b9c2130dc771e332a99eff5da078b2b2648153a40669a6d0e36ca", size = 236644, upload-time = "2025-06-09T23:01:27.887Z" }, + { url = "https://files.pythonhosted.org/packages/b2/14/8d19ccdd3799310722195a72ac94ddc677541fb4bef4091d8e7775752360/frozenlist-1.7.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:f3f4410a0a601d349dd406b5713fec59b4cee7e71678d5b17edda7f4655a940b", size = 238879, upload-time = "2025-06-09T23:01:29.524Z" }, + { url = "https://files.pythonhosted.org/packages/ce/13/c12bf657494c2fd1079a48b2db49fa4196325909249a52d8f09bc9123fd7/frozenlist-1.7.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e2cdfaaec6a2f9327bf43c933c0319a7c429058e8537c508964a133dffee412e", size = 232502, upload-time = "2025-06-09T23:01:31.287Z" }, + { url = "https://files.pythonhosted.org/packages/d7/8b/e7f9dfde869825489382bc0d512c15e96d3964180c9499efcec72e85db7e/frozenlist-1.7.0-cp313-cp313-win32.whl", hash = "sha256:5fc4df05a6591c7768459caba1b342d9ec23fa16195e744939ba5914596ae3e1", size = 39169, upload-time = "2025-06-09T23:01:35.503Z" }, + { url = "https://files.pythonhosted.org/packages/35/89/a487a98d94205d85745080a37860ff5744b9820a2c9acbcdd9440bfddf98/frozenlist-1.7.0-cp313-cp313-win_amd64.whl", hash = "sha256:52109052b9791a3e6b5d1b65f4b909703984b770694d3eb64fad124c835d7cba", size = 43219, upload-time = "2025-06-09T23:01:36.784Z" }, + { url = "https://files.pythonhosted.org/packages/56/d5/5c4cf2319a49eddd9dd7145e66c4866bdc6f3dbc67ca3d59685149c11e0d/frozenlist-1.7.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a6f86e4193bb0e235ef6ce3dde5cbabed887e0b11f516ce8a0f4d3b33078ec2d", size = 84345, upload-time = "2025-06-09T23:01:38.295Z" }, + { url = "https://files.pythonhosted.org/packages/a4/7d/ec2c1e1dc16b85bc9d526009961953df9cec8481b6886debb36ec9107799/frozenlist-1.7.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:82d664628865abeb32d90ae497fb93df398a69bb3434463d172b80fc25b0dd7d", size = 48880, upload-time = "2025-06-09T23:01:39.887Z" }, + { url = "https://files.pythonhosted.org/packages/69/86/f9596807b03de126e11e7d42ac91e3d0b19a6599c714a1989a4e85eeefc4/frozenlist-1.7.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:912a7e8375a1c9a68325a902f3953191b7b292aa3c3fb0d71a216221deca460b", size = 48498, upload-time = "2025-06-09T23:01:41.318Z" }, + { url = "https://files.pythonhosted.org/packages/5e/cb/df6de220f5036001005f2d726b789b2c0b65f2363b104bbc16f5be8084f8/frozenlist-1.7.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9537c2777167488d539bc5de2ad262efc44388230e5118868e172dd4a552b146", size = 292296, upload-time = "2025-06-09T23:01:42.685Z" }, + { url = "https://files.pythonhosted.org/packages/83/1f/de84c642f17c8f851a2905cee2dae401e5e0daca9b5ef121e120e19aa825/frozenlist-1.7.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:f34560fb1b4c3e30ba35fa9a13894ba39e5acfc5f60f57d8accde65f46cc5e74", size = 273103, upload-time = "2025-06-09T23:01:44.166Z" }, + { url = "https://files.pythonhosted.org/packages/88/3c/c840bfa474ba3fa13c772b93070893c6e9d5c0350885760376cbe3b6c1b3/frozenlist-1.7.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:acd03d224b0175f5a850edc104ac19040d35419eddad04e7cf2d5986d98427f1", size = 292869, upload-time = "2025-06-09T23:01:45.681Z" }, + { url = "https://files.pythonhosted.org/packages/a6/1c/3efa6e7d5a39a1d5ef0abeb51c48fb657765794a46cf124e5aca2c7a592c/frozenlist-1.7.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2038310bc582f3d6a09b3816ab01737d60bf7b1ec70f5356b09e84fb7408ab1", size = 291467, upload-time = "2025-06-09T23:01:47.234Z" }, + { url = "https://files.pythonhosted.org/packages/4f/00/d5c5e09d4922c395e2f2f6b79b9a20dab4b67daaf78ab92e7729341f61f6/frozenlist-1.7.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b8c05e4c8e5f36e5e088caa1bf78a687528f83c043706640a92cb76cd6999384", size = 266028, upload-time = "2025-06-09T23:01:48.819Z" }, + { url = "https://files.pythonhosted.org/packages/4e/27/72765be905619dfde25a7f33813ac0341eb6b076abede17a2e3fbfade0cb/frozenlist-1.7.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:765bb588c86e47d0b68f23c1bee323d4b703218037765dcf3f25c838c6fecceb", size = 284294, upload-time = "2025-06-09T23:01:50.394Z" }, + { url = "https://files.pythonhosted.org/packages/88/67/c94103a23001b17808eb7dd1200c156bb69fb68e63fcf0693dde4cd6228c/frozenlist-1.7.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:32dc2e08c67d86d0969714dd484fd60ff08ff81d1a1e40a77dd34a387e6ebc0c", size = 281898, upload-time = "2025-06-09T23:01:52.234Z" }, + { url = "https://files.pythonhosted.org/packages/42/34/a3e2c00c00f9e2a9db5653bca3fec306349e71aff14ae45ecc6d0951dd24/frozenlist-1.7.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:c0303e597eb5a5321b4de9c68e9845ac8f290d2ab3f3e2c864437d3c5a30cd65", size = 290465, upload-time = "2025-06-09T23:01:53.788Z" }, + { url = "https://files.pythonhosted.org/packages/bb/73/f89b7fbce8b0b0c095d82b008afd0590f71ccb3dee6eee41791cf8cd25fd/frozenlist-1.7.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:a47f2abb4e29b3a8d0b530f7c3598badc6b134562b1a5caee867f7c62fee51e3", size = 266385, upload-time = "2025-06-09T23:01:55.769Z" }, + { url = "https://files.pythonhosted.org/packages/cd/45/e365fdb554159462ca12df54bc59bfa7a9a273ecc21e99e72e597564d1ae/frozenlist-1.7.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:3d688126c242a6fabbd92e02633414d40f50bb6002fa4cf995a1d18051525657", size = 288771, upload-time = "2025-06-09T23:01:57.4Z" }, + { url = "https://files.pythonhosted.org/packages/00/11/47b6117002a0e904f004d70ec5194fe9144f117c33c851e3d51c765962d0/frozenlist-1.7.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:4e7e9652b3d367c7bd449a727dc79d5043f48b88d0cbfd4f9f1060cf2b414104", size = 288206, upload-time = "2025-06-09T23:01:58.936Z" }, + { url = "https://files.pythonhosted.org/packages/40/37/5f9f3c3fd7f7746082ec67bcdc204db72dad081f4f83a503d33220a92973/frozenlist-1.7.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:1a85e345b4c43db8b842cab1feb41be5cc0b10a1830e6295b69d7310f99becaf", size = 282620, upload-time = "2025-06-09T23:02:00.493Z" }, + { url = "https://files.pythonhosted.org/packages/0b/31/8fbc5af2d183bff20f21aa743b4088eac4445d2bb1cdece449ae80e4e2d1/frozenlist-1.7.0-cp313-cp313t-win32.whl", hash = "sha256:3a14027124ddb70dfcee5148979998066897e79f89f64b13328595c4bdf77c81", size = 43059, upload-time = "2025-06-09T23:02:02.072Z" }, + { url = "https://files.pythonhosted.org/packages/bb/ed/41956f52105b8dbc26e457c5705340c67c8cc2b79f394b79bffc09d0e938/frozenlist-1.7.0-cp313-cp313t-win_amd64.whl", hash = "sha256:3bf8010d71d4507775f658e9823210b7427be36625b387221642725b515dcf3e", size = 47516, upload-time = "2025-06-09T23:02:03.779Z" }, + { url = "https://files.pythonhosted.org/packages/ee/45/b82e3c16be2182bff01179db177fe144d58b5dc787a7d4492c6ed8b9317f/frozenlist-1.7.0-py3-none-any.whl", hash = "sha256:9a5af342e34f7e97caf8c995864c7a396418ae2859cc6fdf1b1073020d516a7e", size = 13106, upload-time = "2025-06-09T23:02:34.204Z" }, +] + +[[package]] +name = "fsspec" +version = "2025.3.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.13' and sys_platform != 'linux' and sys_platform != 'win32'", + "python_full_version < '3.13' and sys_platform == 'linux'", + "python_full_version < '3.13' and sys_platform != 'linux' and sys_platform != 'win32'", + "python_full_version >= '3.13' and sys_platform == 'win32'", + "python_full_version < '3.13' and sys_platform == 'win32'", +] +sdist = { url = "https://files.pythonhosted.org/packages/34/f4/5721faf47b8c499e776bc34c6a8fc17efdf7fdef0b00f398128bc5dcb4ac/fsspec-2025.3.0.tar.gz", hash = "sha256:a935fd1ea872591f2b5148907d103488fc523295e6c64b835cfad8c3eca44972", size = 298491, upload-time = "2025-03-07T21:47:56.461Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/56/53/eb690efa8513166adef3e0669afd31e95ffde69fb3c52ec2ac7223ed6018/fsspec-2025.3.0-py3-none-any.whl", hash = "sha256:efb87af3efa9103f94ca91a7f8cb7a4df91af9f74fc106c9c7ea0efd7277c1b3", size = 193615, upload-time = "2025-03-07T21:47:54.809Z" }, +] + +[package.optional-dependencies] +http = [ + { name = "aiohttp", marker = "python_full_version < '3.13' or sys_platform != 'linux'" }, +] + [[package]] name = "fsspec" version = "2025.3.2" source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.13' and sys_platform == 'linux'", +] sdist = { url = "https://files.pythonhosted.org/packages/45/d8/8425e6ba5fcec61a1d16e41b1b71d2bf9344f1fe48012c2b48b9620feae5/fsspec-2025.3.2.tar.gz", hash = "sha256:e52c77ef398680bbd6a98c0e628fbc469491282981209907bbc8aea76a04fdc6", size = 299281, upload-time = "2025-03-31T15:27:08.524Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/44/4b/e0cfc1a6f17e990f3e64b7d941ddc4acdc7b19d6edd51abf495f32b1a9e4/fsspec-2025.3.2-py3-none-any.whl", hash = "sha256:2daf8dc3d1dfa65b6aa37748d112773a7a08416f6c70d96b264c96476ecaf711", size = 194435, upload-time = "2025-03-31T15:27:07.028Z" }, ] +[package.optional-dependencies] +http = [ + { name = "aiohttp", marker = "python_full_version >= '3.13' and sys_platform == 'linux'" }, +] + [[package]] name = "gitdb" version = "4.0.12" @@ -890,6 +1181,21 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", size = 58259, upload-time = "2022-09-25T15:39:59.68Z" }, ] +[[package]] +name = "hf-xet" +version = "1.1.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/23/0f/5b60fc28ee7f8cc17a5114a584fd6b86e11c3e0a6e142a7f97a161e9640a/hf_xet-1.1.9.tar.gz", hash = "sha256:c99073ce404462e909f1d5839b2d14a3827b8fe75ed8aed551ba6609c026c803", size = 484242, upload-time = "2025-08-27T23:05:19.441Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/de/12/56e1abb9a44cdef59a411fe8a8673313195711b5ecce27880eb9c8fa90bd/hf_xet-1.1.9-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:a3b6215f88638dd7a6ff82cb4e738dcbf3d863bf667997c093a3c990337d1160", size = 2762553, upload-time = "2025-08-27T23:05:15.153Z" }, + { url = "https://files.pythonhosted.org/packages/3a/e6/2d0d16890c5f21b862f5df3146519c182e7f0ae49b4b4bf2bd8a40d0b05e/hf_xet-1.1.9-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:9b486de7a64a66f9a172f4b3e0dfe79c9f0a93257c501296a2521a13495a698a", size = 2623216, upload-time = "2025-08-27T23:05:13.778Z" }, + { url = "https://files.pythonhosted.org/packages/81/42/7e6955cf0621e87491a1fb8cad755d5c2517803cea174229b0ec00ff0166/hf_xet-1.1.9-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4c5a840c2c4e6ec875ed13703a60e3523bc7f48031dfd750923b2a4d1a5fc3c", size = 3186789, upload-time = "2025-08-27T23:05:12.368Z" }, + { url = "https://files.pythonhosted.org/packages/df/8b/759233bce05457f5f7ec062d63bbfd2d0c740b816279eaaa54be92aa452a/hf_xet-1.1.9-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:96a6139c9e44dad1c52c52520db0fffe948f6bce487cfb9d69c125f254bb3790", size = 3088747, upload-time = "2025-08-27T23:05:10.439Z" }, + { url = "https://files.pythonhosted.org/packages/6c/3c/28cc4db153a7601a996985bcb564f7b8f5b9e1a706c7537aad4b4809f358/hf_xet-1.1.9-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ad1022e9a998e784c97b2173965d07fe33ee26e4594770b7785a8cc8f922cd95", size = 3251429, upload-time = "2025-08-27T23:05:16.471Z" }, + { url = "https://files.pythonhosted.org/packages/84/17/7caf27a1d101bfcb05be85850d4aa0a265b2e1acc2d4d52a48026ef1d299/hf_xet-1.1.9-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:86754c2d6d5afb11b0a435e6e18911a4199262fe77553f8c50d75e21242193ea", size = 3354643, upload-time = "2025-08-27T23:05:17.828Z" }, + { url = "https://files.pythonhosted.org/packages/cd/50/0c39c9eed3411deadcc98749a6699d871b822473f55fe472fad7c01ec588/hf_xet-1.1.9-cp37-abi3-win_amd64.whl", hash = "sha256:5aad3933de6b725d61d51034e04174ed1dce7a57c63d530df0014dea15a40127", size = 2804797, upload-time = "2025-08-27T23:05:20.77Z" }, +] + [[package]] name = "httpcore" version = "1.0.7" @@ -918,6 +1224,26 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, ] +[[package]] +name = "huggingface-hub" +version = "0.34.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "filelock" }, + { name = "fsspec", version = "2025.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.13' or sys_platform != 'linux'" }, + { name = "fsspec", version = "2025.3.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13' and sys_platform == 'linux'" }, + { name = "hf-xet", marker = "platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'arm64' or platform_machine == 'x86_64'" }, + { name = "packaging" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "tqdm" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/45/c9/bdbe19339f76d12985bc03572f330a01a93c04dffecaaea3061bdd7fb892/huggingface_hub-0.34.4.tar.gz", hash = "sha256:a4228daa6fb001be3f4f4bdaf9a0db00e1739235702848df00885c9b5742c85c", size = 459768, upload-time = "2025-08-08T09:14:52.365Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/39/7b/bb06b061991107cd8783f300adff3e7b7f284e330fd82f507f2a1417b11d/huggingface_hub-0.34.4-py3-none-any.whl", hash = "sha256:9b365d781739c93ff90c359844221beef048403f1bc1f1c123c191257c3c890a", size = 561452, upload-time = "2025-08-08T09:14:50.159Z" }, +] + [[package]] name = "humanize" version = "4.12.2" @@ -1094,7 +1420,8 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jaxlib" }, { name = "ml-dtypes" }, - { name = "numpy" }, + { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.13'" }, + { name = "numpy", version = "2.2.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13'" }, { name = "opt-einsum" }, { name = "scipy" }, ] @@ -1177,7 +1504,8 @@ version = "0.5.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "ml-dtypes" }, - { name = "numpy" }, + { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.13'" }, + { name = "numpy", version = "2.2.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13'" }, { name = "scipy" }, ] wheels = [ @@ -1417,7 +1745,7 @@ dependencies = [ { name = "overrides" }, { name = "packaging" }, { name = "prometheus-client" }, - { name = "pywinpty", marker = "os_name == 'nt'" }, + { name = "pywinpty", marker = "os_name == 'nt' and sys_platform != 'linux'" }, { name = "pyzmq" }, { name = "send2trash" }, { name = "terminado" }, @@ -1435,7 +1763,7 @@ name = "jupyter-server-terminals" version = "0.5.3" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pywinpty", marker = "os_name == 'nt'" }, + { name = "pywinpty", marker = "os_name == 'nt' and sys_platform != 'linux'" }, { name = "terminado" }, ] sdist = { url = "https://files.pythonhosted.org/packages/fc/d5/562469734f476159e99a55426d697cbf8e7eb5efe89fb0e0b4f83a3d3459/jupyter_server_terminals-0.5.3.tar.gz", hash = "sha256:5ae0295167220e9ace0edcfdb212afd2b01ee8d179fe6f23c899590e9b8a5269", size = 31430, upload-time = "2024-03-12T14:37:03.049Z" } @@ -1575,6 +1903,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/3f/08/83871f3c50fc983b88547c196d11cf8c3340e37c32d2e9d6152abe2c61f7/Markdown-3.7-py3-none-any.whl", hash = "sha256:7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803", size = 106349, upload-time = "2024-08-16T15:55:16.176Z" }, ] +[[package]] +name = "markdown-it-py" +version = "4.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5b/f5/4ec618ed16cc4f8fb3b701563655a69816155e79e24a17b651541804721d/markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3", size = 73070, upload-time = "2025-08-11T12:57:52.854Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", size = 87321, upload-time = "2025-08-11T12:57:51.923Z" }, +] + [[package]] name = "markupsafe" version = "3.0.2" @@ -1622,7 +1962,8 @@ dependencies = [ { name = "cycler" }, { name = "fonttools" }, { name = "kiwisolver" }, - { name = "numpy" }, + { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.13'" }, + { name = "numpy", version = "2.2.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13'" }, { name = "packaging" }, { name = "pillow" }, { name = "pyparsing" }, @@ -1662,6 +2003,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca", size = 9899, upload-time = "2024-04-15T13:44:43.265Z" }, ] +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, +] + [[package]] name = "mistune" version = "3.1.3" @@ -1676,7 +2026,8 @@ name = "ml-dtypes" version = "0.5.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy" }, + { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.13'" }, + { name = "numpy", version = "2.2.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/32/49/6e67c334872d2c114df3020e579f3718c333198f8312290e09ec0216703a/ml_dtypes-0.5.1.tar.gz", hash = "sha256:ac5b58559bb84a95848ed6984eb8013249f90b6bab62aa5acbad876e256002c9", size = 698772, upload-time = "2025-01-07T03:34:55.613Z" } wheels = [ @@ -1707,7 +2058,8 @@ dependencies = [ { name = "markdown" }, { name = "matplotlib" }, { name = "mlflow-skinny" }, - { name = "numpy" }, + { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.13'" }, + { name = "numpy", version = "2.2.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13'" }, { name = "pandas" }, { name = "pyarrow" }, { name = "scikit-learn" }, @@ -1787,6 +2139,85 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b6/bc/8bd826dd03e022153bfa1766dcdec4976d6c818865ed54223d71f07862b3/msgpack-1.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:bce7d9e614a04d0883af0b3d4d501171fbfca038f12c77fa838d9f198147a23f", size = 75140, upload-time = "2024-09-10T04:24:31.288Z" }, ] +[[package]] +name = "multidict" +version = "6.6.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/69/7f/0652e6ed47ab288e3756ea9c0df8b14950781184d4bd7883f4d87dd41245/multidict-6.6.4.tar.gz", hash = "sha256:d2d4e4787672911b48350df02ed3fa3fffdc2f2e8ca06dd6afdf34189b76a9dd", size = 101843, upload-time = "2025-08-11T12:08:48.217Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/f6/512ffd8fd8b37fb2680e5ac35d788f1d71bbaf37789d21a820bdc441e565/multidict-6.6.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0ffb87be160942d56d7b87b0fdf098e81ed565add09eaa1294268c7f3caac4c8", size = 76516, upload-time = "2025-08-11T12:06:53.393Z" }, + { url = "https://files.pythonhosted.org/packages/99/58/45c3e75deb8855c36bd66cc1658007589662ba584dbf423d01df478dd1c5/multidict-6.6.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d191de6cbab2aff5de6c5723101705fd044b3e4c7cfd587a1929b5028b9714b3", size = 45394, upload-time = "2025-08-11T12:06:54.555Z" }, + { url = "https://files.pythonhosted.org/packages/fd/ca/e8c4472a93a26e4507c0b8e1f0762c0d8a32de1328ef72fd704ef9cc5447/multidict-6.6.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:38a0956dd92d918ad5feff3db8fcb4a5eb7dba114da917e1a88475619781b57b", size = 43591, upload-time = "2025-08-11T12:06:55.672Z" }, + { url = "https://files.pythonhosted.org/packages/05/51/edf414f4df058574a7265034d04c935aa84a89e79ce90fcf4df211f47b16/multidict-6.6.4-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:6865f6d3b7900ae020b495d599fcf3765653bc927951c1abb959017f81ae8287", size = 237215, upload-time = "2025-08-11T12:06:57.213Z" }, + { url = "https://files.pythonhosted.org/packages/c8/45/8b3d6dbad8cf3252553cc41abea09ad527b33ce47a5e199072620b296902/multidict-6.6.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a2088c126b6f72db6c9212ad827d0ba088c01d951cee25e758c450da732c138", size = 258299, upload-time = "2025-08-11T12:06:58.946Z" }, + { url = "https://files.pythonhosted.org/packages/3c/e8/8ca2e9a9f5a435fc6db40438a55730a4bf4956b554e487fa1b9ae920f825/multidict-6.6.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0f37bed7319b848097085d7d48116f545985db988e2256b2e6f00563a3416ee6", size = 242357, upload-time = "2025-08-11T12:07:00.301Z" }, + { url = "https://files.pythonhosted.org/packages/0f/84/80c77c99df05a75c28490b2af8f7cba2a12621186e0a8b0865d8e745c104/multidict-6.6.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:01368e3c94032ba6ca0b78e7ccb099643466cf24f8dc8eefcfdc0571d56e58f9", size = 268369, upload-time = "2025-08-11T12:07:01.638Z" }, + { url = "https://files.pythonhosted.org/packages/0d/e9/920bfa46c27b05fb3e1ad85121fd49f441492dca2449c5bcfe42e4565d8a/multidict-6.6.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8fe323540c255db0bffee79ad7f048c909f2ab0edb87a597e1c17da6a54e493c", size = 269341, upload-time = "2025-08-11T12:07:02.943Z" }, + { url = "https://files.pythonhosted.org/packages/af/65/753a2d8b05daf496f4a9c367fe844e90a1b2cac78e2be2c844200d10cc4c/multidict-6.6.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8eb3025f17b0a4c3cd08cda49acf312a19ad6e8a4edd9dbd591e6506d999402", size = 256100, upload-time = "2025-08-11T12:07:04.564Z" }, + { url = "https://files.pythonhosted.org/packages/09/54/655be13ae324212bf0bc15d665a4e34844f34c206f78801be42f7a0a8aaa/multidict-6.6.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bbc14f0365534d35a06970d6a83478b249752e922d662dc24d489af1aa0d1be7", size = 253584, upload-time = "2025-08-11T12:07:05.914Z" }, + { url = "https://files.pythonhosted.org/packages/5c/74/ab2039ecc05264b5cec73eb018ce417af3ebb384ae9c0e9ed42cb33f8151/multidict-6.6.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:75aa52fba2d96bf972e85451b99d8e19cc37ce26fd016f6d4aa60da9ab2b005f", size = 251018, upload-time = "2025-08-11T12:07:08.301Z" }, + { url = "https://files.pythonhosted.org/packages/af/0a/ccbb244ac848e56c6427f2392741c06302bbfba49c0042f1eb3c5b606497/multidict-6.6.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4fefd4a815e362d4f011919d97d7b4a1e566f1dde83dc4ad8cfb5b41de1df68d", size = 251477, upload-time = "2025-08-11T12:07:10.248Z" }, + { url = "https://files.pythonhosted.org/packages/0e/b0/0ed49bba775b135937f52fe13922bc64a7eaf0a3ead84a36e8e4e446e096/multidict-6.6.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:db9801fe021f59a5b375ab778973127ca0ac52429a26e2fd86aa9508f4d26eb7", size = 263575, upload-time = "2025-08-11T12:07:11.928Z" }, + { url = "https://files.pythonhosted.org/packages/3e/d9/7fb85a85e14de2e44dfb6a24f03c41e2af8697a6df83daddb0e9b7569f73/multidict-6.6.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a650629970fa21ac1fb06ba25dabfc5b8a2054fcbf6ae97c758aa956b8dba802", size = 259649, upload-time = "2025-08-11T12:07:13.244Z" }, + { url = "https://files.pythonhosted.org/packages/03/9e/b3a459bcf9b6e74fa461a5222a10ff9b544cb1cd52fd482fb1b75ecda2a2/multidict-6.6.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:452ff5da78d4720d7516a3a2abd804957532dd69296cb77319c193e3ffb87e24", size = 251505, upload-time = "2025-08-11T12:07:14.57Z" }, + { url = "https://files.pythonhosted.org/packages/86/a2/8022f78f041dfe6d71e364001a5cf987c30edfc83c8a5fb7a3f0974cff39/multidict-6.6.4-cp312-cp312-win32.whl", hash = "sha256:8c2fcb12136530ed19572bbba61b407f655e3953ba669b96a35036a11a485793", size = 41888, upload-time = "2025-08-11T12:07:15.904Z" }, + { url = "https://files.pythonhosted.org/packages/c7/eb/d88b1780d43a56db2cba24289fa744a9d216c1a8546a0dc3956563fd53ea/multidict-6.6.4-cp312-cp312-win_amd64.whl", hash = "sha256:047d9425860a8c9544fed1b9584f0c8bcd31bcde9568b047c5e567a1025ecd6e", size = 46072, upload-time = "2025-08-11T12:07:17.045Z" }, + { url = "https://files.pythonhosted.org/packages/9f/16/b929320bf5750e2d9d4931835a4c638a19d2494a5b519caaaa7492ebe105/multidict-6.6.4-cp312-cp312-win_arm64.whl", hash = "sha256:14754eb72feaa1e8ae528468f24250dd997b8e2188c3d2f593f9eba259e4b364", size = 43222, upload-time = "2025-08-11T12:07:18.328Z" }, + { url = "https://files.pythonhosted.org/packages/3a/5d/e1db626f64f60008320aab00fbe4f23fc3300d75892a3381275b3d284580/multidict-6.6.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f46a6e8597f9bd71b31cc708195d42b634c8527fecbcf93febf1052cacc1f16e", size = 75848, upload-time = "2025-08-11T12:07:19.912Z" }, + { url = "https://files.pythonhosted.org/packages/4c/aa/8b6f548d839b6c13887253af4e29c939af22a18591bfb5d0ee6f1931dae8/multidict-6.6.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:22e38b2bc176c5eb9c0a0e379f9d188ae4cd8b28c0f53b52bce7ab0a9e534657", size = 45060, upload-time = "2025-08-11T12:07:21.163Z" }, + { url = "https://files.pythonhosted.org/packages/eb/c6/f5e97e5d99a729bc2aa58eb3ebfa9f1e56a9b517cc38c60537c81834a73f/multidict-6.6.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5df8afd26f162da59e218ac0eefaa01b01b2e6cd606cffa46608f699539246da", size = 43269, upload-time = "2025-08-11T12:07:22.392Z" }, + { url = "https://files.pythonhosted.org/packages/dc/31/d54eb0c62516776f36fe67f84a732f97e0b0e12f98d5685bebcc6d396910/multidict-6.6.4-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:49517449b58d043023720aa58e62b2f74ce9b28f740a0b5d33971149553d72aa", size = 237158, upload-time = "2025-08-11T12:07:23.636Z" }, + { url = "https://files.pythonhosted.org/packages/c4/1c/8a10c1c25b23156e63b12165a929d8eb49a6ed769fdbefb06e6f07c1e50d/multidict-6.6.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ae9408439537c5afdca05edd128a63f56a62680f4b3c234301055d7a2000220f", size = 257076, upload-time = "2025-08-11T12:07:25.049Z" }, + { url = "https://files.pythonhosted.org/packages/ad/86/90e20b5771d6805a119e483fd3d1e8393e745a11511aebca41f0da38c3e2/multidict-6.6.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:87a32d20759dc52a9e850fe1061b6e41ab28e2998d44168a8a341b99ded1dba0", size = 240694, upload-time = "2025-08-11T12:07:26.458Z" }, + { url = "https://files.pythonhosted.org/packages/e7/49/484d3e6b535bc0555b52a0a26ba86e4d8d03fd5587d4936dc59ba7583221/multidict-6.6.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:52e3c8d43cdfff587ceedce9deb25e6ae77daba560b626e97a56ddcad3756879", size = 266350, upload-time = "2025-08-11T12:07:27.94Z" }, + { url = "https://files.pythonhosted.org/packages/bf/b4/aa4c5c379b11895083d50021e229e90c408d7d875471cb3abf721e4670d6/multidict-6.6.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ad8850921d3a8d8ff6fbef790e773cecfc260bbfa0566998980d3fa8f520bc4a", size = 267250, upload-time = "2025-08-11T12:07:29.303Z" }, + { url = "https://files.pythonhosted.org/packages/80/e5/5e22c5bf96a64bdd43518b1834c6d95a4922cc2066b7d8e467dae9b6cee6/multidict-6.6.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:497a2954adc25c08daff36f795077f63ad33e13f19bfff7736e72c785391534f", size = 254900, upload-time = "2025-08-11T12:07:30.764Z" }, + { url = "https://files.pythonhosted.org/packages/17/38/58b27fed927c07035abc02befacab42491e7388ca105e087e6e0215ead64/multidict-6.6.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:024ce601f92d780ca1617ad4be5ac15b501cc2414970ffa2bb2bbc2bd5a68fa5", size = 252355, upload-time = "2025-08-11T12:07:32.205Z" }, + { url = "https://files.pythonhosted.org/packages/d0/a1/dad75d23a90c29c02b5d6f3d7c10ab36c3197613be5d07ec49c7791e186c/multidict-6.6.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:a693fc5ed9bdd1c9e898013e0da4dcc640de7963a371c0bd458e50e046bf6438", size = 250061, upload-time = "2025-08-11T12:07:33.623Z" }, + { url = "https://files.pythonhosted.org/packages/b8/1a/ac2216b61c7f116edab6dc3378cca6c70dc019c9a457ff0d754067c58b20/multidict-6.6.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:190766dac95aab54cae5b152a56520fd99298f32a1266d66d27fdd1b5ac00f4e", size = 249675, upload-time = "2025-08-11T12:07:34.958Z" }, + { url = "https://files.pythonhosted.org/packages/d4/79/1916af833b800d13883e452e8e0977c065c4ee3ab7a26941fbfdebc11895/multidict-6.6.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:34d8f2a5ffdceab9dcd97c7a016deb2308531d5f0fced2bb0c9e1df45b3363d7", size = 261247, upload-time = "2025-08-11T12:07:36.588Z" }, + { url = "https://files.pythonhosted.org/packages/c5/65/d1f84fe08ac44a5fc7391cbc20a7cedc433ea616b266284413fd86062f8c/multidict-6.6.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:59e8d40ab1f5a8597abcef00d04845155a5693b5da00d2c93dbe88f2050f2812", size = 257960, upload-time = "2025-08-11T12:07:39.735Z" }, + { url = "https://files.pythonhosted.org/packages/13/b5/29ec78057d377b195ac2c5248c773703a6b602e132a763e20ec0457e7440/multidict-6.6.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:467fe64138cfac771f0e949b938c2e1ada2b5af22f39692aa9258715e9ea613a", size = 250078, upload-time = "2025-08-11T12:07:41.525Z" }, + { url = "https://files.pythonhosted.org/packages/c4/0e/7e79d38f70a872cae32e29b0d77024bef7834b0afb406ddae6558d9e2414/multidict-6.6.4-cp313-cp313-win32.whl", hash = "sha256:14616a30fe6d0a48d0a48d1a633ab3b8bec4cf293aac65f32ed116f620adfd69", size = 41708, upload-time = "2025-08-11T12:07:43.405Z" }, + { url = "https://files.pythonhosted.org/packages/9d/34/746696dffff742e97cd6a23da953e55d0ea51fa601fa2ff387b3edcfaa2c/multidict-6.6.4-cp313-cp313-win_amd64.whl", hash = "sha256:40cd05eaeb39e2bc8939451f033e57feaa2ac99e07dbca8afe2be450a4a3b6cf", size = 45912, upload-time = "2025-08-11T12:07:45.082Z" }, + { url = "https://files.pythonhosted.org/packages/c7/87/3bac136181e271e29170d8d71929cdeddeb77f3e8b6a0c08da3a8e9da114/multidict-6.6.4-cp313-cp313-win_arm64.whl", hash = "sha256:f6eb37d511bfae9e13e82cb4d1af36b91150466f24d9b2b8a9785816deb16605", size = 43076, upload-time = "2025-08-11T12:07:46.746Z" }, + { url = "https://files.pythonhosted.org/packages/64/94/0a8e63e36c049b571c9ae41ee301ada29c3fee9643d9c2548d7d558a1d99/multidict-6.6.4-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:6c84378acd4f37d1b507dfa0d459b449e2321b3ba5f2338f9b085cf7a7ba95eb", size = 82812, upload-time = "2025-08-11T12:07:48.402Z" }, + { url = "https://files.pythonhosted.org/packages/25/1a/be8e369dfcd260d2070a67e65dd3990dd635cbd735b98da31e00ea84cd4e/multidict-6.6.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0e0558693063c75f3d952abf645c78f3c5dfdd825a41d8c4d8156fc0b0da6e7e", size = 48313, upload-time = "2025-08-11T12:07:49.679Z" }, + { url = "https://files.pythonhosted.org/packages/26/5a/dd4ade298674b2f9a7b06a32c94ffbc0497354df8285f27317c66433ce3b/multidict-6.6.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3f8e2384cb83ebd23fd07e9eada8ba64afc4c759cd94817433ab8c81ee4b403f", size = 46777, upload-time = "2025-08-11T12:07:51.318Z" }, + { url = "https://files.pythonhosted.org/packages/89/db/98aa28bc7e071bfba611ac2ae803c24e96dd3a452b4118c587d3d872c64c/multidict-6.6.4-cp313-cp313t-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:f996b87b420995a9174b2a7c1a8daf7db4750be6848b03eb5e639674f7963773", size = 229321, upload-time = "2025-08-11T12:07:52.965Z" }, + { url = "https://files.pythonhosted.org/packages/c7/bc/01ddda2a73dd9d167bd85d0e8ef4293836a8f82b786c63fb1a429bc3e678/multidict-6.6.4-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cc356250cffd6e78416cf5b40dc6a74f1edf3be8e834cf8862d9ed5265cf9b0e", size = 249954, upload-time = "2025-08-11T12:07:54.423Z" }, + { url = "https://files.pythonhosted.org/packages/06/78/6b7c0f020f9aa0acf66d0ab4eb9f08375bac9a50ff5e3edb1c4ccd59eafc/multidict-6.6.4-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:dadf95aa862714ea468a49ad1e09fe00fcc9ec67d122f6596a8d40caf6cec7d0", size = 228612, upload-time = "2025-08-11T12:07:55.914Z" }, + { url = "https://files.pythonhosted.org/packages/00/44/3faa416f89b2d5d76e9d447296a81521e1c832ad6e40b92f990697b43192/multidict-6.6.4-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7dd57515bebffd8ebd714d101d4c434063322e4fe24042e90ced41f18b6d3395", size = 257528, upload-time = "2025-08-11T12:07:57.371Z" }, + { url = "https://files.pythonhosted.org/packages/05/5f/77c03b89af0fcb16f018f668207768191fb9dcfb5e3361a5e706a11db2c9/multidict-6.6.4-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:967af5f238ebc2eb1da4e77af5492219fbd9b4b812347da39a7b5f5c72c0fa45", size = 256329, upload-time = "2025-08-11T12:07:58.844Z" }, + { url = "https://files.pythonhosted.org/packages/cf/e9/ed750a2a9afb4f8dc6f13dc5b67b514832101b95714f1211cd42e0aafc26/multidict-6.6.4-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2a4c6875c37aae9794308ec43e3530e4aa0d36579ce38d89979bbf89582002bb", size = 247928, upload-time = "2025-08-11T12:08:01.037Z" }, + { url = "https://files.pythonhosted.org/packages/1f/b5/e0571bc13cda277db7e6e8a532791d4403dacc9850006cb66d2556e649c0/multidict-6.6.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:7f683a551e92bdb7fac545b9c6f9fa2aebdeefa61d607510b3533286fcab67f5", size = 245228, upload-time = "2025-08-11T12:08:02.96Z" }, + { url = "https://files.pythonhosted.org/packages/f3/a3/69a84b0eccb9824491f06368f5b86e72e4af54c3067c37c39099b6687109/multidict-6.6.4-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:3ba5aaf600edaf2a868a391779f7a85d93bed147854925f34edd24cc70a3e141", size = 235869, upload-time = "2025-08-11T12:08:04.746Z" }, + { url = "https://files.pythonhosted.org/packages/a9/9d/28802e8f9121a6a0804fa009debf4e753d0a59969ea9f70be5f5fdfcb18f/multidict-6.6.4-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:580b643b7fd2c295d83cad90d78419081f53fd532d1f1eb67ceb7060f61cff0d", size = 243446, upload-time = "2025-08-11T12:08:06.332Z" }, + { url = "https://files.pythonhosted.org/packages/38/ea/6c98add069b4878c1d66428a5f5149ddb6d32b1f9836a826ac764b9940be/multidict-6.6.4-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:37b7187197da6af3ee0b044dbc9625afd0c885f2800815b228a0e70f9a7f473d", size = 252299, upload-time = "2025-08-11T12:08:07.931Z" }, + { url = "https://files.pythonhosted.org/packages/3a/09/8fe02d204473e14c0af3affd50af9078839dfca1742f025cca765435d6b4/multidict-6.6.4-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e1b93790ed0bc26feb72e2f08299691ceb6da5e9e14a0d13cc74f1869af327a0", size = 246926, upload-time = "2025-08-11T12:08:09.467Z" }, + { url = "https://files.pythonhosted.org/packages/37/3d/7b1e10d774a6df5175ecd3c92bff069e77bed9ec2a927fdd4ff5fe182f67/multidict-6.6.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a506a77ddee1efcca81ecbeae27ade3e09cdf21a8ae854d766c2bb4f14053f92", size = 243383, upload-time = "2025-08-11T12:08:10.981Z" }, + { url = "https://files.pythonhosted.org/packages/50/b0/a6fae46071b645ae98786ab738447de1ef53742eaad949f27e960864bb49/multidict-6.6.4-cp313-cp313t-win32.whl", hash = "sha256:f93b2b2279883d1d0a9e1bd01f312d6fc315c5e4c1f09e112e4736e2f650bc4e", size = 47775, upload-time = "2025-08-11T12:08:12.439Z" }, + { url = "https://files.pythonhosted.org/packages/b2/0a/2436550b1520091af0600dff547913cb2d66fbac27a8c33bc1b1bccd8d98/multidict-6.6.4-cp313-cp313t-win_amd64.whl", hash = "sha256:6d46a180acdf6e87cc41dc15d8f5c2986e1e8739dc25dbb7dac826731ef381a4", size = 53100, upload-time = "2025-08-11T12:08:13.823Z" }, + { url = "https://files.pythonhosted.org/packages/97/ea/43ac51faff934086db9c072a94d327d71b7d8b40cd5dcb47311330929ef0/multidict-6.6.4-cp313-cp313t-win_arm64.whl", hash = "sha256:756989334015e3335d087a27331659820d53ba432befdef6a718398b0a8493ad", size = 45501, upload-time = "2025-08-11T12:08:15.173Z" }, + { url = "https://files.pythonhosted.org/packages/fd/69/b547032297c7e63ba2af494edba695d781af8a0c6e89e4d06cf848b21d80/multidict-6.6.4-py3-none-any.whl", hash = "sha256:27d8f8e125c07cb954e54d75d04905a9bba8a439c1d84aca94949d4d03d8601c", size = 12313, upload-time = "2025-08-11T12:08:46.891Z" }, +] + +[[package]] +name = "multiprocess" +version = "0.70.15" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "dill" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/68/e0/a77ca96e772e13c828fa52f3ad370d413bef194aeaf78b7c6611870ad815/multiprocess-0.70.15.tar.gz", hash = "sha256:f20eed3036c0ef477b07a4177cf7c1ba520d9a2677870a4f47fe026f0cd6787e", size = 1894495, upload-time = "2023-07-23T05:03:29.314Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/35/a8/36d8d7b3e46b377800d8dec47891cdf05842d1a2366909ae4a0c89fbc5e6/multiprocess-0.70.15-py310-none-any.whl", hash = "sha256:7dd58e33235e83cf09d625e55cffd7b0f0eede7ee9223cdd666a87624f60c21a", size = 134824, upload-time = "2023-07-23T05:03:21.182Z" }, + { url = "https://files.pythonhosted.org/packages/e7/41/96ac938770ba6e7d5ae1d8c9cafebac54b413549042c6260f0d0a6ec6622/multiprocess-0.70.15-py311-none-any.whl", hash = "sha256:134f89053d82c9ed3b73edd3a2531eb791e602d4f4156fc92a79259590bd9670", size = 135392, upload-time = "2023-07-23T05:03:22.885Z" }, + { url = "https://files.pythonhosted.org/packages/ca/3f/8354ce12fd13bd5c5bb4722261a10ca1d6e2eb7c1c08fa3d8a4e9dc98f44/multiprocess-0.70.15-py37-none-any.whl", hash = "sha256:f7d4a1629bccb433114c3b4885f69eccc200994323c80f6feee73b0edc9199c5", size = 116276, upload-time = "2023-07-23T05:03:24.718Z" }, + { url = "https://files.pythonhosted.org/packages/c2/a6/c5cb599d917904878f220a4dbdfdcc4ef291dd3956c35b3b0dc6fc42fb6d/multiprocess-0.70.15-py38-none-any.whl", hash = "sha256:bee9afba476c91f9ebee7beeee0601face9eff67d822e893f9a893725fbd6316", size = 132626, upload-time = "2023-07-23T05:03:25.895Z" }, + { url = "https://files.pythonhosted.org/packages/c6/c9/820b5ab056f4ada76fbe05bd481a948f287957d6cbfd59e2dd2618b408c1/multiprocess-0.70.15-py39-none-any.whl", hash = "sha256:3e0953f5d52b4c76f1c973eaf8214554d146f2be5decb48e928e55c7a2d19338", size = 133349, upload-time = "2023-07-23T05:03:27.022Z" }, +] + [[package]] name = "narwhals" version = "2.4.0" @@ -1921,10 +2352,36 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl", hash = "sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef", size = 13307, upload-time = "2024-02-14T23:35:16.286Z" }, ] +[[package]] +name = "numpy" +version = "1.26.4" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.13' and sys_platform == 'linux'", + "python_full_version < '3.13' and sys_platform != 'linux' and sys_platform != 'win32'", + "python_full_version < '3.13' and sys_platform == 'win32'", +] +sdist = { url = "https://files.pythonhosted.org/packages/65/6e/09db70a523a96d25e115e71cc56a6f9031e7b8cd166c1ac8438307c14058/numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010", size = 15786129, upload-time = "2024-02-06T00:26:44.495Z" } +wheels = [ + { 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, upload-time = "2024-02-05T23:55:32.801Z" }, + { 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, upload-time = "2024-02-05T23:55:56.28Z" }, + { 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, upload-time = "2024-02-05T23:56:20.368Z" }, + { 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, upload-time = "2024-02-05T23:56:56.054Z" }, + { 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, upload-time = "2024-02-05T23:57:21.56Z" }, + { 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, upload-time = "2024-02-05T23:57:56.585Z" }, + { url = "https://files.pythonhosted.org/packages/28/4a/46d9e65106879492374999e76eb85f87b15328e06bd1550668f79f7b18c6/numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110", size = 5677803, upload-time = "2024-02-05T23:58:08.963Z" }, + { url = "https://files.pythonhosted.org/packages/16/2e/86f24451c2d530c88daf997cb8d6ac622c1d40d19f5a031ed68a4b73a374/numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818", size = 15517754, upload-time = "2024-02-05T23:58:36.364Z" }, +] + [[package]] name = "numpy" version = "2.2.4" source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.13' and sys_platform == 'linux'", + "python_full_version >= '3.13' and sys_platform != 'linux' and sys_platform != 'win32'", + "python_full_version >= '3.13' and sys_platform == 'win32'", +] sdist = { url = "https://files.pythonhosted.org/packages/e1/78/31103410a57bc2c2b93a3597340a8119588571f6a4539067546cb9a0bfac/numpy-2.2.4.tar.gz", hash = "sha256:9ba03692a45d3eef66559efe1d1096c4b9b75c0986b5dff5530c378fb8331d4f", size = 20270701, upload-time = "2025-03-16T18:27:00.648Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/a2/30/182db21d4f2a95904cec1a6f779479ea1ac07c0647f064dea454ec650c42/numpy-2.2.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a7b9084668aa0f64e64bd00d27ba5146ef1c3a8835f3bd912e7a9e01326804c4", size = 20947156, upload-time = "2025-03-16T18:09:51.975Z" }, @@ -1964,8 +2421,10 @@ name = "nvidia-cublas-cu12" version = "12.6.4.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.13' and sys_platform != 'win32'", - "python_full_version < '3.13' and sys_platform != 'win32'", + "python_full_version >= '3.13' and sys_platform == 'linux'", + "python_full_version >= '3.13' and sys_platform != 'linux' and sys_platform != 'win32'", + "python_full_version < '3.13' and sys_platform == 'linux'", + "python_full_version < '3.13' and sys_platform != 'linux' and sys_platform != 'win32'", ] wheels = [ { url = "https://files.pythonhosted.org/packages/af/eb/ff4b8c503fa1f1796679dce648854d58751982426e4e4b37d6fce49d259c/nvidia_cublas_cu12-12.6.4.1-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:08ed2686e9875d01b58e3cb379c6896df8e76c75e0d4a7f7dace3d7b6d9ef8eb", size = 393138322, upload-time = "2024-11-20T17:40:25.65Z" }, @@ -1989,8 +2448,10 @@ name = "nvidia-cuda-cupti-cu12" version = "12.6.80" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.13' and sys_platform != 'win32'", - "python_full_version < '3.13' and sys_platform != 'win32'", + "python_full_version >= '3.13' and sys_platform == 'linux'", + "python_full_version >= '3.13' and sys_platform != 'linux' and sys_platform != 'win32'", + "python_full_version < '3.13' and sys_platform == 'linux'", + "python_full_version < '3.13' and sys_platform != 'linux' and sys_platform != 'win32'", ] wheels = [ { url = "https://files.pythonhosted.org/packages/e6/8b/2f6230cb715646c3a9425636e513227ce5c93c4d65823a734f4bb86d43c3/nvidia_cuda_cupti_cu12-12.6.80-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:166ee35a3ff1587f2490364f90eeeb8da06cd867bd5b701bf7f9a02b78bc63fc", size = 8236764, upload-time = "2024-11-20T17:35:41.03Z" }, @@ -2034,8 +2495,10 @@ name = "nvidia-cuda-runtime-cu12" version = "12.6.77" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.13' and sys_platform != 'win32'", - "python_full_version < '3.13' and sys_platform != 'win32'", + "python_full_version >= '3.13' and sys_platform == 'linux'", + "python_full_version >= '3.13' and sys_platform != 'linux' and sys_platform != 'win32'", + "python_full_version < '3.13' and sys_platform == 'linux'", + "python_full_version < '3.13' and sys_platform != 'linux' and sys_platform != 'win32'", ] wheels = [ { url = "https://files.pythonhosted.org/packages/8f/ea/590b2ac00d772a8abd1c387a92b46486d2679ca6622fd25c18ff76265663/nvidia_cuda_runtime_cu12-12.6.77-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6116fad3e049e04791c0256a9778c16237837c08b27ed8c8401e2e45de8d60cd", size = 908052, upload-time = "2024-11-20T17:35:19.905Z" }, @@ -2061,8 +2524,10 @@ name = "nvidia-cudnn-cu12" version = "9.5.1.17" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.13' and sys_platform != 'win32'", - "python_full_version < '3.13' and sys_platform != 'win32'", + "python_full_version >= '3.13' and sys_platform == 'linux'", + "python_full_version >= '3.13' and sys_platform != 'linux' and sys_platform != 'win32'", + "python_full_version < '3.13' and sys_platform == 'linux'", + "python_full_version < '3.13' and sys_platform != 'linux' and sys_platform != 'win32'", ] dependencies = [ { name = "nvidia-cublas-cu12", version = "12.6.4.1", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform != 'win32'" }, @@ -2092,8 +2557,10 @@ name = "nvidia-cufft-cu12" version = "11.3.0.4" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.13' and sys_platform != 'win32'", - "python_full_version < '3.13' and sys_platform != 'win32'", + "python_full_version >= '3.13' and sys_platform == 'linux'", + "python_full_version >= '3.13' and sys_platform != 'linux' and sys_platform != 'win32'", + "python_full_version < '3.13' and sys_platform == 'linux'", + "python_full_version < '3.13' and sys_platform != 'linux' and sys_platform != 'win32'", ] dependencies = [ { name = "nvidia-nvjitlink-cu12", version = "12.6.85", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform != 'win32'" }, @@ -2142,8 +2609,10 @@ name = "nvidia-cusolver-cu12" version = "11.7.1.2" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.13' and sys_platform != 'win32'", - "python_full_version < '3.13' and sys_platform != 'win32'", + "python_full_version >= '3.13' and sys_platform == 'linux'", + "python_full_version >= '3.13' and sys_platform != 'linux' and sys_platform != 'win32'", + "python_full_version < '3.13' and sys_platform == 'linux'", + "python_full_version < '3.13' and sys_platform != 'linux' and sys_platform != 'win32'", ] dependencies = [ { name = "nvidia-cublas-cu12", version = "12.6.4.1", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform != 'win32'" }, @@ -2179,8 +2648,10 @@ name = "nvidia-cusparse-cu12" version = "12.5.4.2" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.13' and sys_platform != 'win32'", - "python_full_version < '3.13' and sys_platform != 'win32'", + "python_full_version >= '3.13' and sys_platform == 'linux'", + "python_full_version >= '3.13' and sys_platform != 'linux' and sys_platform != 'win32'", + "python_full_version < '3.13' and sys_platform == 'linux'", + "python_full_version < '3.13' and sys_platform != 'linux' and sys_platform != 'win32'", ] dependencies = [ { name = "nvidia-nvjitlink-cu12", version = "12.6.85", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform != 'win32'" }, @@ -2229,8 +2700,10 @@ name = "nvidia-nvjitlink-cu12" version = "12.6.85" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.13' and sys_platform != 'win32'", - "python_full_version < '3.13' and sys_platform != 'win32'", + "python_full_version >= '3.13' and sys_platform == 'linux'", + "python_full_version >= '3.13' and sys_platform != 'linux' and sys_platform != 'win32'", + "python_full_version < '3.13' and sys_platform == 'linux'", + "python_full_version < '3.13' and sys_platform != 'linux' and sys_platform != 'win32'", ] wheels = [ { url = "https://files.pythonhosted.org/packages/9d/d7/c5383e47c7e9bf1c99d5bd2a8c935af2b6d705ad831a7ec5c97db4d82f4f/nvidia_nvjitlink_cu12-12.6.85-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:eedc36df9e88b682efe4309aa16b5b4e78c2407eac59e8c10a6a47535164369a", size = 19744971, upload-time = "2024-11-20T17:46:53.366Z" }, @@ -2330,7 +2803,8 @@ dependencies = [ { name = "etils", extra = ["epy"] }, { name = "jax" }, { name = "jaxlib" }, - { name = "numpy" }, + { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.13'" }, + { name = "numpy", version = "2.2.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/af/b5/f88a0d851547b2e6b2c7e7e6509ad66236b3e7019f1f095bb03dbaa61fa1/optax-0.2.4.tar.gz", hash = "sha256:4e05d3d5307e6dde4c319187ae36e6cd3a0c035d4ed25e9e992449a304f47336", size = 229717, upload-time = "2024-11-12T21:52:17.439Z" } wheels = [ @@ -2346,7 +2820,8 @@ dependencies = [ { name = "cliff" }, { name = "cmaes" }, { name = "colorlog" }, - { name = "numpy" }, + { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.13'" }, + { name = "numpy", version = "2.2.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13'" }, { name = "packaging" }, { name = "pyyaml" }, { name = "scipy" }, @@ -2369,7 +2844,8 @@ dependencies = [ { name = "jax" }, { name = "msgpack" }, { name = "nest-asyncio" }, - { name = "numpy" }, + { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.13'" }, + { name = "numpy", version = "2.2.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13'" }, { name = "protobuf" }, { name = "pyyaml" }, { name = "simplejson" }, @@ -2413,7 +2889,8 @@ name = "pandas" version = "2.2.3" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy" }, + { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.13'" }, + { name = "numpy", version = "2.2.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13'" }, { name = "python-dateutil" }, { name = "pytz" }, { name = "tzdata" }, @@ -2479,7 +2956,8 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "absl-py" }, { name = "jax" }, - { name = "numpy" }, + { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.13'" }, + { name = "numpy", version = "2.2.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13'" }, { name = "ordered-set" }, { name = "treescope" }, { name = "typing-extensions" }, @@ -2606,6 +3084,63 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e4/ea/d836f008d33151c7a1f62caf3d8dd782e4d15f6a43897f64480c2b8de2ad/prompt_toolkit-3.0.50-py3-none-any.whl", hash = "sha256:9b6427eb19e479d98acff65196a307c555eb567989e6d88ebbb1b509d9779198", size = 387816, upload-time = "2025-01-20T15:55:29.98Z" }, ] +[[package]] +name = "propcache" +version = "0.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a6/16/43264e4a779dd8588c21a70f0709665ee8f611211bdd2c87d952cfa7c776/propcache-0.3.2.tar.gz", hash = "sha256:20d7d62e4e7ef05f221e0db2856b979540686342e7dd9973b815599c7057e168", size = 44139, upload-time = "2025-06-09T22:56:06.081Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a8/42/9ca01b0a6f48e81615dca4765a8f1dd2c057e0540f6116a27dc5ee01dfb6/propcache-0.3.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:8de106b6c84506b31c27168582cd3cb3000a6412c16df14a8628e5871ff83c10", size = 73674, upload-time = "2025-06-09T22:54:30.551Z" }, + { url = "https://files.pythonhosted.org/packages/af/6e/21293133beb550f9c901bbece755d582bfaf2176bee4774000bd4dd41884/propcache-0.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:28710b0d3975117239c76600ea351934ac7b5ff56e60953474342608dbbb6154", size = 43570, upload-time = "2025-06-09T22:54:32.296Z" }, + { url = "https://files.pythonhosted.org/packages/0c/c8/0393a0a3a2b8760eb3bde3c147f62b20044f0ddac81e9d6ed7318ec0d852/propcache-0.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce26862344bdf836650ed2487c3d724b00fbfec4233a1013f597b78c1cb73615", size = 43094, upload-time = "2025-06-09T22:54:33.929Z" }, + { url = "https://files.pythonhosted.org/packages/37/2c/489afe311a690399d04a3e03b069225670c1d489eb7b044a566511c1c498/propcache-0.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bca54bd347a253af2cf4544bbec232ab982f4868de0dd684246b67a51bc6b1db", size = 226958, upload-time = "2025-06-09T22:54:35.186Z" }, + { url = "https://files.pythonhosted.org/packages/9d/ca/63b520d2f3d418c968bf596839ae26cf7f87bead026b6192d4da6a08c467/propcache-0.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:55780d5e9a2ddc59711d727226bb1ba83a22dd32f64ee15594b9392b1f544eb1", size = 234894, upload-time = "2025-06-09T22:54:36.708Z" }, + { url = "https://files.pythonhosted.org/packages/11/60/1d0ed6fff455a028d678df30cc28dcee7af77fa2b0e6962ce1df95c9a2a9/propcache-0.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:035e631be25d6975ed87ab23153db6a73426a48db688070d925aa27e996fe93c", size = 233672, upload-time = "2025-06-09T22:54:38.062Z" }, + { url = "https://files.pythonhosted.org/packages/37/7c/54fd5301ef38505ab235d98827207176a5c9b2aa61939b10a460ca53e123/propcache-0.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee6f22b6eaa39297c751d0e80c0d3a454f112f5c6481214fcf4c092074cecd67", size = 224395, upload-time = "2025-06-09T22:54:39.634Z" }, + { url = "https://files.pythonhosted.org/packages/ee/1a/89a40e0846f5de05fdc6779883bf46ba980e6df4d2ff8fb02643de126592/propcache-0.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ca3aee1aa955438c4dba34fc20a9f390e4c79967257d830f137bd5a8a32ed3b", size = 212510, upload-time = "2025-06-09T22:54:41.565Z" }, + { url = "https://files.pythonhosted.org/packages/5e/33/ca98368586c9566a6b8d5ef66e30484f8da84c0aac3f2d9aec6d31a11bd5/propcache-0.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7a4f30862869fa2b68380d677cc1c5fcf1e0f2b9ea0cf665812895c75d0ca3b8", size = 222949, upload-time = "2025-06-09T22:54:43.038Z" }, + { url = "https://files.pythonhosted.org/packages/ba/11/ace870d0aafe443b33b2f0b7efdb872b7c3abd505bfb4890716ad7865e9d/propcache-0.3.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:b77ec3c257d7816d9f3700013639db7491a434644c906a2578a11daf13176251", size = 217258, upload-time = "2025-06-09T22:54:44.376Z" }, + { url = "https://files.pythonhosted.org/packages/5b/d2/86fd6f7adffcfc74b42c10a6b7db721d1d9ca1055c45d39a1a8f2a740a21/propcache-0.3.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:cab90ac9d3f14b2d5050928483d3d3b8fb6b4018893fc75710e6aa361ecb2474", size = 213036, upload-time = "2025-06-09T22:54:46.243Z" }, + { url = "https://files.pythonhosted.org/packages/07/94/2d7d1e328f45ff34a0a284cf5a2847013701e24c2a53117e7c280a4316b3/propcache-0.3.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:0b504d29f3c47cf6b9e936c1852246c83d450e8e063d50562115a6be6d3a2535", size = 227684, upload-time = "2025-06-09T22:54:47.63Z" }, + { url = "https://files.pythonhosted.org/packages/b7/05/37ae63a0087677e90b1d14710e532ff104d44bc1efa3b3970fff99b891dc/propcache-0.3.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:ce2ac2675a6aa41ddb2a0c9cbff53780a617ac3d43e620f8fd77ba1c84dcfc06", size = 234562, upload-time = "2025-06-09T22:54:48.982Z" }, + { url = "https://files.pythonhosted.org/packages/a4/7c/3f539fcae630408d0bd8bf3208b9a647ccad10976eda62402a80adf8fc34/propcache-0.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:62b4239611205294cc433845b914131b2a1f03500ff3c1ed093ed216b82621e1", size = 222142, upload-time = "2025-06-09T22:54:50.424Z" }, + { url = "https://files.pythonhosted.org/packages/7c/d2/34b9eac8c35f79f8a962546b3e97e9d4b990c420ee66ac8255d5d9611648/propcache-0.3.2-cp312-cp312-win32.whl", hash = "sha256:df4a81b9b53449ebc90cc4deefb052c1dd934ba85012aa912c7ea7b7e38b60c1", size = 37711, upload-time = "2025-06-09T22:54:52.072Z" }, + { url = "https://files.pythonhosted.org/packages/19/61/d582be5d226cf79071681d1b46b848d6cb03d7b70af7063e33a2787eaa03/propcache-0.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:7046e79b989d7fe457bb755844019e10f693752d169076138abf17f31380800c", size = 41479, upload-time = "2025-06-09T22:54:53.234Z" }, + { url = "https://files.pythonhosted.org/packages/dc/d1/8c747fafa558c603c4ca19d8e20b288aa0c7cda74e9402f50f31eb65267e/propcache-0.3.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ca592ed634a73ca002967458187109265e980422116c0a107cf93d81f95af945", size = 71286, upload-time = "2025-06-09T22:54:54.369Z" }, + { url = "https://files.pythonhosted.org/packages/61/99/d606cb7986b60d89c36de8a85d58764323b3a5ff07770a99d8e993b3fa73/propcache-0.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9ecb0aad4020e275652ba3975740f241bd12a61f1a784df044cf7477a02bc252", size = 42425, upload-time = "2025-06-09T22:54:55.642Z" }, + { url = "https://files.pythonhosted.org/packages/8c/96/ef98f91bbb42b79e9bb82bdd348b255eb9d65f14dbbe3b1594644c4073f7/propcache-0.3.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7f08f1cc28bd2eade7a8a3d2954ccc673bb02062e3e7da09bc75d843386b342f", size = 41846, upload-time = "2025-06-09T22:54:57.246Z" }, + { url = "https://files.pythonhosted.org/packages/5b/ad/3f0f9a705fb630d175146cd7b1d2bf5555c9beaed54e94132b21aac098a6/propcache-0.3.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1a342c834734edb4be5ecb1e9fb48cb64b1e2320fccbd8c54bf8da8f2a84c33", size = 208871, upload-time = "2025-06-09T22:54:58.975Z" }, + { url = "https://files.pythonhosted.org/packages/3a/38/2085cda93d2c8b6ec3e92af2c89489a36a5886b712a34ab25de9fbca7992/propcache-0.3.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a544caaae1ac73f1fecfae70ded3e93728831affebd017d53449e3ac052ac1e", size = 215720, upload-time = "2025-06-09T22:55:00.471Z" }, + { url = "https://files.pythonhosted.org/packages/61/c1/d72ea2dc83ac7f2c8e182786ab0fc2c7bd123a1ff9b7975bee671866fe5f/propcache-0.3.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:310d11aa44635298397db47a3ebce7db99a4cc4b9bbdfcf6c98a60c8d5261cf1", size = 215203, upload-time = "2025-06-09T22:55:01.834Z" }, + { url = "https://files.pythonhosted.org/packages/af/81/b324c44ae60c56ef12007105f1460d5c304b0626ab0cc6b07c8f2a9aa0b8/propcache-0.3.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c1396592321ac83157ac03a2023aa6cc4a3cc3cfdecb71090054c09e5a7cce3", size = 206365, upload-time = "2025-06-09T22:55:03.199Z" }, + { url = "https://files.pythonhosted.org/packages/09/73/88549128bb89e66d2aff242488f62869014ae092db63ccea53c1cc75a81d/propcache-0.3.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cabf5b5902272565e78197edb682017d21cf3b550ba0460ee473753f28d23c1", size = 196016, upload-time = "2025-06-09T22:55:04.518Z" }, + { url = "https://files.pythonhosted.org/packages/b9/3f/3bdd14e737d145114a5eb83cb172903afba7242f67c5877f9909a20d948d/propcache-0.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0a2f2235ac46a7aa25bdeb03a9e7060f6ecbd213b1f9101c43b3090ffb971ef6", size = 205596, upload-time = "2025-06-09T22:55:05.942Z" }, + { url = "https://files.pythonhosted.org/packages/0f/ca/2f4aa819c357d3107c3763d7ef42c03980f9ed5c48c82e01e25945d437c1/propcache-0.3.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:92b69e12e34869a6970fd2f3da91669899994b47c98f5d430b781c26f1d9f387", size = 200977, upload-time = "2025-06-09T22:55:07.792Z" }, + { url = "https://files.pythonhosted.org/packages/cd/4a/e65276c7477533c59085251ae88505caf6831c0e85ff8b2e31ebcbb949b1/propcache-0.3.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:54e02207c79968ebbdffc169591009f4474dde3b4679e16634d34c9363ff56b4", size = 197220, upload-time = "2025-06-09T22:55:09.173Z" }, + { url = "https://files.pythonhosted.org/packages/7c/54/fc7152e517cf5578278b242396ce4d4b36795423988ef39bb8cd5bf274c8/propcache-0.3.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4adfb44cb588001f68c5466579d3f1157ca07f7504fc91ec87862e2b8e556b88", size = 210642, upload-time = "2025-06-09T22:55:10.62Z" }, + { url = "https://files.pythonhosted.org/packages/b9/80/abeb4a896d2767bf5f1ea7b92eb7be6a5330645bd7fb844049c0e4045d9d/propcache-0.3.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fd3e6019dc1261cd0291ee8919dd91fbab7b169bb76aeef6c716833a3f65d206", size = 212789, upload-time = "2025-06-09T22:55:12.029Z" }, + { url = "https://files.pythonhosted.org/packages/b3/db/ea12a49aa7b2b6d68a5da8293dcf50068d48d088100ac016ad92a6a780e6/propcache-0.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4c181cad81158d71c41a2bce88edce078458e2dd5ffee7eddd6b05da85079f43", size = 205880, upload-time = "2025-06-09T22:55:13.45Z" }, + { url = "https://files.pythonhosted.org/packages/d1/e5/9076a0bbbfb65d1198007059c65639dfd56266cf8e477a9707e4b1999ff4/propcache-0.3.2-cp313-cp313-win32.whl", hash = "sha256:8a08154613f2249519e549de2330cf8e2071c2887309a7b07fb56098f5170a02", size = 37220, upload-time = "2025-06-09T22:55:15.284Z" }, + { url = "https://files.pythonhosted.org/packages/d3/f5/b369e026b09a26cd77aa88d8fffd69141d2ae00a2abaaf5380d2603f4b7f/propcache-0.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:e41671f1594fc4ab0a6dec1351864713cb3a279910ae8b58f884a88a0a632c05", size = 40678, upload-time = "2025-06-09T22:55:16.445Z" }, + { url = "https://files.pythonhosted.org/packages/a4/3a/6ece377b55544941a08d03581c7bc400a3c8cd3c2865900a68d5de79e21f/propcache-0.3.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:9a3cf035bbaf035f109987d9d55dc90e4b0e36e04bbbb95af3055ef17194057b", size = 76560, upload-time = "2025-06-09T22:55:17.598Z" }, + { url = "https://files.pythonhosted.org/packages/0c/da/64a2bb16418740fa634b0e9c3d29edff1db07f56d3546ca2d86ddf0305e1/propcache-0.3.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:156c03d07dc1323d8dacaa221fbe028c5c70d16709cdd63502778e6c3ccca1b0", size = 44676, upload-time = "2025-06-09T22:55:18.922Z" }, + { url = "https://files.pythonhosted.org/packages/36/7b/f025e06ea51cb72c52fb87e9b395cced02786610b60a3ed51da8af017170/propcache-0.3.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74413c0ba02ba86f55cf60d18daab219f7e531620c15f1e23d95563f505efe7e", size = 44701, upload-time = "2025-06-09T22:55:20.106Z" }, + { url = "https://files.pythonhosted.org/packages/a4/00/faa1b1b7c3b74fc277f8642f32a4c72ba1d7b2de36d7cdfb676db7f4303e/propcache-0.3.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f066b437bb3fa39c58ff97ab2ca351db465157d68ed0440abecb21715eb24b28", size = 276934, upload-time = "2025-06-09T22:55:21.5Z" }, + { url = "https://files.pythonhosted.org/packages/74/ab/935beb6f1756e0476a4d5938ff44bf0d13a055fed880caf93859b4f1baf4/propcache-0.3.2-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1304b085c83067914721e7e9d9917d41ad87696bf70f0bc7dee450e9c71ad0a", size = 278316, upload-time = "2025-06-09T22:55:22.918Z" }, + { url = "https://files.pythonhosted.org/packages/f8/9d/994a5c1ce4389610838d1caec74bdf0e98b306c70314d46dbe4fcf21a3e2/propcache-0.3.2-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ab50cef01b372763a13333b4e54021bdcb291fc9a8e2ccb9c2df98be51bcde6c", size = 282619, upload-time = "2025-06-09T22:55:24.651Z" }, + { url = "https://files.pythonhosted.org/packages/2b/00/a10afce3d1ed0287cef2e09506d3be9822513f2c1e96457ee369adb9a6cd/propcache-0.3.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fad3b2a085ec259ad2c2842666b2a0a49dea8463579c606426128925af1ed725", size = 265896, upload-time = "2025-06-09T22:55:26.049Z" }, + { url = "https://files.pythonhosted.org/packages/2e/a8/2aa6716ffa566ca57c749edb909ad27884680887d68517e4be41b02299f3/propcache-0.3.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:261fa020c1c14deafd54c76b014956e2f86991af198c51139faf41c4d5e83892", size = 252111, upload-time = "2025-06-09T22:55:27.381Z" }, + { url = "https://files.pythonhosted.org/packages/36/4f/345ca9183b85ac29c8694b0941f7484bf419c7f0fea2d1e386b4f7893eed/propcache-0.3.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:46d7f8aa79c927e5f987ee3a80205c987717d3659f035c85cf0c3680526bdb44", size = 268334, upload-time = "2025-06-09T22:55:28.747Z" }, + { url = "https://files.pythonhosted.org/packages/3e/ca/fcd54f78b59e3f97b3b9715501e3147f5340167733d27db423aa321e7148/propcache-0.3.2-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:6d8f3f0eebf73e3c0ff0e7853f68be638b4043c65a70517bb575eff54edd8dbe", size = 255026, upload-time = "2025-06-09T22:55:30.184Z" }, + { url = "https://files.pythonhosted.org/packages/8b/95/8e6a6bbbd78ac89c30c225210a5c687790e532ba4088afb8c0445b77ef37/propcache-0.3.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:03c89c1b14a5452cf15403e291c0ccd7751d5b9736ecb2c5bab977ad6c5bcd81", size = 250724, upload-time = "2025-06-09T22:55:31.646Z" }, + { url = "https://files.pythonhosted.org/packages/ee/b0/0dd03616142baba28e8b2d14ce5df6631b4673850a3d4f9c0f9dd714a404/propcache-0.3.2-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:0cc17efde71e12bbaad086d679ce575268d70bc123a5a71ea7ad76f70ba30bba", size = 268868, upload-time = "2025-06-09T22:55:33.209Z" }, + { url = "https://files.pythonhosted.org/packages/c5/98/2c12407a7e4fbacd94ddd32f3b1e3d5231e77c30ef7162b12a60e2dd5ce3/propcache-0.3.2-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:acdf05d00696bc0447e278bb53cb04ca72354e562cf88ea6f9107df8e7fd9770", size = 271322, upload-time = "2025-06-09T22:55:35.065Z" }, + { url = "https://files.pythonhosted.org/packages/35/91/9cb56efbb428b006bb85db28591e40b7736847b8331d43fe335acf95f6c8/propcache-0.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4445542398bd0b5d32df908031cb1b30d43ac848e20470a878b770ec2dcc6330", size = 265778, upload-time = "2025-06-09T22:55:36.45Z" }, + { url = "https://files.pythonhosted.org/packages/9a/4c/b0fe775a2bdd01e176b14b574be679d84fc83958335790f7c9a686c1f468/propcache-0.3.2-cp313-cp313t-win32.whl", hash = "sha256:f86e5d7cd03afb3a1db8e9f9f6eff15794e79e791350ac48a8c924e6f439f394", size = 41175, upload-time = "2025-06-09T22:55:38.436Z" }, + { url = "https://files.pythonhosted.org/packages/a4/ff/47f08595e3d9b5e149c150f88d9714574f1a7cbd89fe2817158a952674bf/propcache-0.3.2-cp313-cp313t-win_amd64.whl", hash = "sha256:9704bedf6e7cbe3c65eca4379a9b53ee6a83749f047808cbb5044d40d7d72198", size = 44857, upload-time = "2025-06-09T22:55:39.687Z" }, + { url = "https://files.pythonhosted.org/packages/cc/35/cc0aaecf278bb4575b8555f2b137de5ab821595ddae9da9d3cd1da4072c7/propcache-0.3.2-py3-none-any.whl", hash = "sha256:98f1ec44fb675f5052cccc8e609c46ed23a35a1cfd18545ad4e29002d858a43f", size = 12663, upload-time = "2025-06-09T22:56:04.484Z" }, +] + [[package]] name = "protobuf" version = "5.29.4" @@ -2995,6 +3530,56 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c1/b1/3baf80dc6d2b7bc27a95a67752d0208e410351e3feb4eb78de5f77454d8d/referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0", size = 26775, upload-time = "2025-01-25T08:48:14.241Z" }, ] +[[package]] +name = "regex" +version = "2025.9.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/5a/4c63457fbcaf19d138d72b2e9b39405954f98c0349b31c601bfcb151582c/regex-2025.9.1.tar.gz", hash = "sha256:88ac07b38d20b54d79e704e38aa3bd2c0f8027432164226bdee201a1c0c9c9ff", size = 400852, upload-time = "2025-09-01T22:10:10.479Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/39/ef/a0372febc5a1d44c1be75f35d7e5aff40c659ecde864d7fa10e138f75e74/regex-2025.9.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:84a25164bd8dcfa9f11c53f561ae9766e506e580b70279d05a7946510bdd6f6a", size = 486317, upload-time = "2025-09-01T22:08:34.529Z" }, + { url = "https://files.pythonhosted.org/packages/b5/25/d64543fb7eb41a1024786d518cc57faf1ce64aa6e9ddba097675a0c2f1d2/regex-2025.9.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:645e88a73861c64c1af558dd12294fb4e67b5c1eae0096a60d7d8a2143a611c7", size = 289698, upload-time = "2025-09-01T22:08:36.162Z" }, + { url = "https://files.pythonhosted.org/packages/d8/dc/fbf31fc60be317bd9f6f87daa40a8a9669b3b392aa8fe4313df0a39d0722/regex-2025.9.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:10a450cba5cd5409526ee1d4449f42aad38dd83ac6948cbd6d7f71ca7018f7db", size = 287242, upload-time = "2025-09-01T22:08:37.794Z" }, + { url = "https://files.pythonhosted.org/packages/0f/74/f933a607a538f785da5021acf5323961b4620972e2c2f1f39b6af4b71db7/regex-2025.9.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e9dc5991592933a4192c166eeb67b29d9234f9c86344481173d1bc52f73a7104", size = 797441, upload-time = "2025-09-01T22:08:39.108Z" }, + { url = "https://files.pythonhosted.org/packages/89/d0/71fc49b4f20e31e97f199348b8c4d6e613e7b6a54a90eb1b090c2b8496d7/regex-2025.9.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a32291add816961aab472f4fad344c92871a2ee33c6c219b6598e98c1f0108f2", size = 862654, upload-time = "2025-09-01T22:08:40.586Z" }, + { url = "https://files.pythonhosted.org/packages/59/05/984edce1411a5685ba9abbe10d42cdd9450aab4a022271f9585539788150/regex-2025.9.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:588c161a68a383478e27442a678e3b197b13c5ba51dbba40c1ccb8c4c7bee9e9", size = 910862, upload-time = "2025-09-01T22:08:42.416Z" }, + { url = "https://files.pythonhosted.org/packages/b2/02/5c891bb5fe0691cc1bad336e3a94b9097fbcf9707ec8ddc1dce9f0397289/regex-2025.9.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:47829ffaf652f30d579534da9085fe30c171fa2a6744a93d52ef7195dc38218b", size = 801991, upload-time = "2025-09-01T22:08:44.072Z" }, + { url = "https://files.pythonhosted.org/packages/f1/ae/fd10d6ad179910f7a1b3e0a7fde1ef8bb65e738e8ac4fd6ecff3f52252e4/regex-2025.9.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e978e5a35b293ea43f140c92a3269b6ab13fe0a2bf8a881f7ac740f5a6ade85", size = 786651, upload-time = "2025-09-01T22:08:46.079Z" }, + { url = "https://files.pythonhosted.org/packages/30/cf/9d686b07bbc5bf94c879cc168db92542d6bc9fb67088d03479fef09ba9d3/regex-2025.9.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4cf09903e72411f4bf3ac1eddd624ecfd423f14b2e4bf1c8b547b72f248b7bf7", size = 856556, upload-time = "2025-09-01T22:08:48.376Z" }, + { url = "https://files.pythonhosted.org/packages/91/9d/302f8a29bb8a49528abbab2d357a793e2a59b645c54deae0050f8474785b/regex-2025.9.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:d016b0f77be63e49613c9e26aaf4a242f196cd3d7a4f15898f5f0ab55c9b24d2", size = 849001, upload-time = "2025-09-01T22:08:50.067Z" }, + { url = "https://files.pythonhosted.org/packages/93/fa/b4c6dbdedc85ef4caec54c817cd5f4418dbfa2453214119f2538082bf666/regex-2025.9.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:656563e620de6908cd1c9d4f7b9e0777e3341ca7db9d4383bcaa44709c90281e", size = 788138, upload-time = "2025-09-01T22:08:51.933Z" }, + { url = "https://files.pythonhosted.org/packages/4a/1b/91ee17a3cbf87f81e8c110399279d0e57f33405468f6e70809100f2ff7d8/regex-2025.9.1-cp312-cp312-win32.whl", hash = "sha256:df33f4ef07b68f7ab637b1dbd70accbf42ef0021c201660656601e8a9835de45", size = 264524, upload-time = "2025-09-01T22:08:53.75Z" }, + { url = "https://files.pythonhosted.org/packages/92/28/6ba31cce05b0f1ec6b787921903f83bd0acf8efde55219435572af83c350/regex-2025.9.1-cp312-cp312-win_amd64.whl", hash = "sha256:5aba22dfbc60cda7c0853516104724dc904caa2db55f2c3e6e984eb858d3edf3", size = 275489, upload-time = "2025-09-01T22:08:55.037Z" }, + { url = "https://files.pythonhosted.org/packages/bd/ed/ea49f324db00196e9ef7fe00dd13c6164d5173dd0f1bbe495e61bb1fb09d/regex-2025.9.1-cp312-cp312-win_arm64.whl", hash = "sha256:ec1efb4c25e1849c2685fa95da44bfde1b28c62d356f9c8d861d4dad89ed56e9", size = 268589, upload-time = "2025-09-01T22:08:56.369Z" }, + { url = "https://files.pythonhosted.org/packages/98/25/b2959ce90c6138c5142fe5264ee1f9b71a0c502ca4c7959302a749407c79/regex-2025.9.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:bc6834727d1b98d710a63e6c823edf6ffbf5792eba35d3fa119531349d4142ef", size = 485932, upload-time = "2025-09-01T22:08:57.913Z" }, + { url = "https://files.pythonhosted.org/packages/49/2e/6507a2a85f3f2be6643438b7bd976e67ad73223692d6988eb1ff444106d3/regex-2025.9.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c3dc05b6d579875719bccc5f3037b4dc80433d64e94681a0061845bd8863c025", size = 289568, upload-time = "2025-09-01T22:08:59.258Z" }, + { url = "https://files.pythonhosted.org/packages/c7/d8/de4a4b57215d99868f1640e062a7907e185ec7476b4b689e2345487c1ff4/regex-2025.9.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:22213527df4c985ec4a729b055a8306272d41d2f45908d7bacb79be0fa7a75ad", size = 286984, upload-time = "2025-09-01T22:09:00.835Z" }, + { url = "https://files.pythonhosted.org/packages/03/15/e8cb403403a57ed316e80661db0e54d7aa2efcd85cb6156f33cc18746922/regex-2025.9.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8e3f6e3c5a5a1adc3f7ea1b5aec89abfc2f4fbfba55dafb4343cd1d084f715b2", size = 797514, upload-time = "2025-09-01T22:09:02.538Z" }, + { url = "https://files.pythonhosted.org/packages/e4/26/2446f2b9585fed61faaa7e2bbce3aca7dd8df6554c32addee4c4caecf24a/regex-2025.9.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bcb89c02a0d6c2bec9b0bb2d8c78782699afe8434493bfa6b4021cc51503f249", size = 862586, upload-time = "2025-09-01T22:09:04.322Z" }, + { url = "https://files.pythonhosted.org/packages/fd/b8/82ffbe9c0992c31bbe6ae1c4b4e21269a5df2559102b90543c9b56724c3c/regex-2025.9.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b0e2f95413eb0c651cd1516a670036315b91b71767af83bc8525350d4375ccba", size = 910815, upload-time = "2025-09-01T22:09:05.978Z" }, + { url = "https://files.pythonhosted.org/packages/2f/d8/7303ea38911759c1ee30cc5bc623ee85d3196b733c51fd6703c34290a8d9/regex-2025.9.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:09a41dc039e1c97d3c2ed3e26523f748e58c4de3ea7a31f95e1cf9ff973fff5a", size = 802042, upload-time = "2025-09-01T22:09:07.865Z" }, + { url = "https://files.pythonhosted.org/packages/fc/0e/6ad51a55ed4b5af512bb3299a05d33309bda1c1d1e1808fa869a0bed31bc/regex-2025.9.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4f0b4258b161094f66857a26ee938d3fe7b8a5063861e44571215c44fbf0e5df", size = 786764, upload-time = "2025-09-01T22:09:09.362Z" }, + { url = "https://files.pythonhosted.org/packages/8d/d5/394e3ffae6baa5a9217bbd14d96e0e5da47bb069d0dbb8278e2681a2b938/regex-2025.9.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:bf70e18ac390e6977ea7e56f921768002cb0fa359c4199606c7219854ae332e0", size = 856557, upload-time = "2025-09-01T22:09:11.129Z" }, + { url = "https://files.pythonhosted.org/packages/cd/80/b288d3910c41194ad081b9fb4b371b76b0bbfdce93e7709fc98df27b37dc/regex-2025.9.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b84036511e1d2bb0a4ff1aec26951caa2dea8772b223c9e8a19ed8885b32dbac", size = 849108, upload-time = "2025-09-01T22:09:12.877Z" }, + { url = "https://files.pythonhosted.org/packages/d1/cd/5ec76bf626d0d5abdc277b7a1734696f5f3d14fbb4a3e2540665bc305d85/regex-2025.9.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c2e05dcdfe224047f2a59e70408274c325d019aad96227ab959403ba7d58d2d7", size = 788201, upload-time = "2025-09-01T22:09:14.561Z" }, + { url = "https://files.pythonhosted.org/packages/b5/36/674672f3fdead107565a2499f3007788b878188acec6d42bc141c5366c2c/regex-2025.9.1-cp313-cp313-win32.whl", hash = "sha256:3b9a62107a7441b81ca98261808fed30ae36ba06c8b7ee435308806bd53c1ed8", size = 264508, upload-time = "2025-09-01T22:09:16.193Z" }, + { url = "https://files.pythonhosted.org/packages/83/ad/931134539515eb64ce36c24457a98b83c1b2e2d45adf3254b94df3735a76/regex-2025.9.1-cp313-cp313-win_amd64.whl", hash = "sha256:b38afecc10c177eb34cfae68d669d5161880849ba70c05cbfbe409f08cc939d7", size = 275469, upload-time = "2025-09-01T22:09:17.462Z" }, + { url = "https://files.pythonhosted.org/packages/24/8c/96d34e61c0e4e9248836bf86d69cb224fd222f270fa9045b24e218b65604/regex-2025.9.1-cp313-cp313-win_arm64.whl", hash = "sha256:ec329890ad5e7ed9fc292858554d28d58d56bf62cf964faf0aa57964b21155a0", size = 268586, upload-time = "2025-09-01T22:09:18.948Z" }, + { url = "https://files.pythonhosted.org/packages/21/b1/453cbea5323b049181ec6344a803777914074b9726c9c5dc76749966d12d/regex-2025.9.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:72fb7a016467d364546f22b5ae86c45680a4e0de6b2a6f67441d22172ff641f1", size = 486111, upload-time = "2025-09-01T22:09:20.734Z" }, + { url = "https://files.pythonhosted.org/packages/f6/0e/92577f197bd2f7652c5e2857f399936c1876978474ecc5b068c6d8a79c86/regex-2025.9.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:c9527fa74eba53f98ad86be2ba003b3ebe97e94b6eb2b916b31b5f055622ef03", size = 289520, upload-time = "2025-09-01T22:09:22.249Z" }, + { url = "https://files.pythonhosted.org/packages/af/c6/b472398116cca7ea5a6c4d5ccd0fc543f7fd2492cb0c48d2852a11972f73/regex-2025.9.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c905d925d194c83a63f92422af7544ec188301451b292c8b487f0543726107ca", size = 287215, upload-time = "2025-09-01T22:09:23.657Z" }, + { url = "https://files.pythonhosted.org/packages/cf/11/f12ecb0cf9ca792a32bb92f758589a84149017467a544f2f6bfb45c0356d/regex-2025.9.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:74df7c74a63adcad314426b1f4ea6054a5ab25d05b0244f0c07ff9ce640fa597", size = 797855, upload-time = "2025-09-01T22:09:25.197Z" }, + { url = "https://files.pythonhosted.org/packages/46/88/bbb848f719a540fb5997e71310f16f0b33a92c5d4b4d72d4311487fff2a3/regex-2025.9.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4f6e935e98ea48c7a2e8be44494de337b57a204470e7f9c9c42f912c414cd6f5", size = 863363, upload-time = "2025-09-01T22:09:26.705Z" }, + { url = "https://files.pythonhosted.org/packages/54/a9/2321eb3e2838f575a78d48e03c1e83ea61bd08b74b7ebbdeca8abc50fc25/regex-2025.9.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4a62d033cd9ebefc7c5e466731a508dfabee827d80b13f455de68a50d3c2543d", size = 910202, upload-time = "2025-09-01T22:09:28.906Z" }, + { url = "https://files.pythonhosted.org/packages/33/07/d1d70835d7d11b7e126181f316f7213c4572ecf5c5c97bdbb969fb1f38a2/regex-2025.9.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ef971ebf2b93bdc88d8337238be4dfb851cc97ed6808eb04870ef67589415171", size = 801808, upload-time = "2025-09-01T22:09:30.733Z" }, + { url = "https://files.pythonhosted.org/packages/13/d1/29e4d1bed514ef2bf3a4ead3cb8bb88ca8af94130239a4e68aa765c35b1c/regex-2025.9.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d936a1db208bdca0eca1f2bb2c1ba1d8370b226785c1e6db76e32a228ffd0ad5", size = 786824, upload-time = "2025-09-01T22:09:32.61Z" }, + { url = "https://files.pythonhosted.org/packages/33/27/20d8ccb1bee460faaa851e6e7cc4cfe852a42b70caa1dca22721ba19f02f/regex-2025.9.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:7e786d9e4469698fc63815b8de08a89165a0aa851720eb99f5e0ea9d51dd2b6a", size = 857406, upload-time = "2025-09-01T22:09:34.117Z" }, + { url = "https://files.pythonhosted.org/packages/74/fe/60c6132262dc36430d51e0c46c49927d113d3a38c1aba6a26c7744c84cf3/regex-2025.9.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:6b81d7dbc5466ad2c57ce3a0ddb717858fe1a29535c8866f8514d785fdb9fc5b", size = 848593, upload-time = "2025-09-01T22:09:35.598Z" }, + { url = "https://files.pythonhosted.org/packages/cc/ae/2d4ff915622fabbef1af28387bf71e7f2f4944a348b8460d061e85e29bf0/regex-2025.9.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:cd4890e184a6feb0ef195338a6ce68906a8903a0f2eb7e0ab727dbc0a3156273", size = 787951, upload-time = "2025-09-01T22:09:37.139Z" }, + { url = "https://files.pythonhosted.org/packages/85/37/dc127703a9e715a284cc2f7dbdd8a9776fd813c85c126eddbcbdd1ca5fec/regex-2025.9.1-cp314-cp314-win32.whl", hash = "sha256:34679a86230e46164c9e0396b56cab13c0505972343880b9e705083cc5b8ec86", size = 269833, upload-time = "2025-09-01T22:09:39.245Z" }, + { url = "https://files.pythonhosted.org/packages/83/bf/4bed4d3d0570e16771defd5f8f15f7ea2311edcbe91077436d6908956c4a/regex-2025.9.1-cp314-cp314-win_amd64.whl", hash = "sha256:a1196e530a6bfa5f4bde029ac5b0295a6ecfaaffbfffede4bbaf4061d9455b70", size = 278742, upload-time = "2025-09-01T22:09:40.651Z" }, + { url = "https://files.pythonhosted.org/packages/cf/3e/7d7ac6fd085023312421e0d69dfabdfb28e116e513fadbe9afe710c01893/regex-2025.9.1-cp314-cp314-win_arm64.whl", hash = "sha256:f46d525934871ea772930e997d577d48c6983e50f206ff7b66d4ac5f8941e993", size = 271860, upload-time = "2025-09-01T22:09:42.413Z" }, +] + [[package]] name = "requests" version = "2.32.3" @@ -3031,6 +3616,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl", hash = "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9", size = 4242, upload-time = "2019-10-28T16:00:13.976Z" }, ] +[[package]] +name = "rich" +version = "14.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fe/75/af448d8e52bf1d8fa6a9d089ca6c07ff4453d86c65c145d0a300bb073b9b/rich-14.1.0.tar.gz", hash = "sha256:e497a48b844b0320d45007cdebfeaeed8db2a4f4bcf49f15e455cfc4af11eaa8", size = 224441, upload-time = "2025-07-25T07:32:58.125Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e3/30/3c4d035596d3cf444529e0b2953ad0466f6049528a879d27534700580395/rich-14.1.0-py3-none-any.whl", hash = "sha256:536f5f1785986d6dbdea3c75205c473f970777b4a0d6c6dd1b696aa05a3fa04f", size = 243368, upload-time = "2025-07-25T07:32:56.73Z" }, +] + [[package]] name = "rpds-py" version = "0.24.0" @@ -3127,13 +3725,36 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/86/62/8d3fc3ec6640161a5649b2cddbbf2b9fa39c92541225b33f117c37c5a2eb/s3transfer-0.11.4-py3-none-any.whl", hash = "sha256:ac265fa68318763a03bf2dc4f39d5cbd6a9e178d81cc9483ad27da33637e320d", size = 84412, upload-time = "2025-03-04T20:29:13.433Z" }, ] +[[package]] +name = "safetensors" +version = "0.6.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ac/cc/738f3011628920e027a11754d9cae9abec1aed00f7ae860abbf843755233/safetensors-0.6.2.tar.gz", hash = "sha256:43ff2aa0e6fa2dc3ea5524ac7ad93a9839256b8703761e76e2d0b2a3fa4f15d9", size = 197968, upload-time = "2025-08-08T13:13:58.654Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4d/b1/3f5fd73c039fc87dba3ff8b5d528bfc5a32b597fea8e7a6a4800343a17c7/safetensors-0.6.2-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:9c85ede8ec58f120bad982ec47746981e210492a6db876882aa021446af8ffba", size = 454797, upload-time = "2025-08-08T13:13:52.066Z" }, + { url = "https://files.pythonhosted.org/packages/8c/c9/bb114c158540ee17907ec470d01980957fdaf87b4aa07914c24eba87b9c6/safetensors-0.6.2-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:d6675cf4b39c98dbd7d940598028f3742e0375a6b4d4277e76beb0c35f4b843b", size = 432206, upload-time = "2025-08-08T13:13:50.931Z" }, + { url = "https://files.pythonhosted.org/packages/d3/8e/f70c34e47df3110e8e0bb268d90db8d4be8958a54ab0336c9be4fe86dac8/safetensors-0.6.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d2d2b3ce1e2509c68932ca03ab8f20570920cd9754b05063d4368ee52833ecd", size = 473261, upload-time = "2025-08-08T13:13:41.259Z" }, + { url = "https://files.pythonhosted.org/packages/2a/f5/be9c6a7c7ef773e1996dc214e73485286df1836dbd063e8085ee1976f9cb/safetensors-0.6.2-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:93de35a18f46b0f5a6a1f9e26d91b442094f2df02e9fd7acf224cfec4238821a", size = 485117, upload-time = "2025-08-08T13:13:43.506Z" }, + { url = "https://files.pythonhosted.org/packages/c9/55/23f2d0a2c96ed8665bf17a30ab4ce5270413f4d74b6d87dd663258b9af31/safetensors-0.6.2-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:89a89b505f335640f9120fac65ddeb83e40f1fd081cb8ed88b505bdccec8d0a1", size = 616154, upload-time = "2025-08-08T13:13:45.096Z" }, + { url = "https://files.pythonhosted.org/packages/98/c6/affb0bd9ce02aa46e7acddbe087912a04d953d7a4d74b708c91b5806ef3f/safetensors-0.6.2-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fc4d0d0b937e04bdf2ae6f70cd3ad51328635fe0e6214aa1fc811f3b576b3bda", size = 520713, upload-time = "2025-08-08T13:13:46.25Z" }, + { url = "https://files.pythonhosted.org/packages/fe/5d/5a514d7b88e310c8b146e2404e0dc161282e78634d9358975fd56dfd14be/safetensors-0.6.2-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8045db2c872db8f4cbe3faa0495932d89c38c899c603f21e9b6486951a5ecb8f", size = 485835, upload-time = "2025-08-08T13:13:49.373Z" }, + { url = "https://files.pythonhosted.org/packages/7a/7b/4fc3b2ba62c352b2071bea9cfbad330fadda70579f617506ae1a2f129cab/safetensors-0.6.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:81e67e8bab9878bb568cffbc5f5e655adb38d2418351dc0859ccac158f753e19", size = 521503, upload-time = "2025-08-08T13:13:47.651Z" }, + { url = "https://files.pythonhosted.org/packages/5a/50/0057e11fe1f3cead9254315a6c106a16dd4b1a19cd247f7cc6414f6b7866/safetensors-0.6.2-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:b0e4d029ab0a0e0e4fdf142b194514695b1d7d3735503ba700cf36d0fc7136ce", size = 652256, upload-time = "2025-08-08T13:13:53.167Z" }, + { url = "https://files.pythonhosted.org/packages/e9/29/473f789e4ac242593ac1656fbece6e1ecd860bb289e635e963667807afe3/safetensors-0.6.2-cp38-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:fa48268185c52bfe8771e46325a1e21d317207bcabcb72e65c6e28e9ffeb29c7", size = 747281, upload-time = "2025-08-08T13:13:54.656Z" }, + { url = "https://files.pythonhosted.org/packages/68/52/f7324aad7f2df99e05525c84d352dc217e0fa637a4f603e9f2eedfbe2c67/safetensors-0.6.2-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:d83c20c12c2d2f465997c51b7ecb00e407e5f94d7dec3ea0cc11d86f60d3fde5", size = 692286, upload-time = "2025-08-08T13:13:55.884Z" }, + { url = "https://files.pythonhosted.org/packages/ad/fe/cad1d9762868c7c5dc70c8620074df28ebb1a8e4c17d4c0cb031889c457e/safetensors-0.6.2-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:d944cea65fad0ead848b6ec2c37cc0b197194bec228f8020054742190e9312ac", size = 655957, upload-time = "2025-08-08T13:13:57.029Z" }, + { url = "https://files.pythonhosted.org/packages/59/a7/e2158e17bbe57d104f0abbd95dff60dda916cf277c9f9663b4bf9bad8b6e/safetensors-0.6.2-cp38-abi3-win32.whl", hash = "sha256:cab75ca7c064d3911411461151cb69380c9225798a20e712b102edda2542ddb1", size = 308926, upload-time = "2025-08-08T13:14:01.095Z" }, + { url = "https://files.pythonhosted.org/packages/2c/c3/c0be1135726618dc1e28d181b8c442403d8dbb9e273fd791de2d4384bcdd/safetensors-0.6.2-cp38-abi3-win_amd64.whl", hash = "sha256:c7b214870df923cbc1593c3faee16bec59ea462758699bd3fee399d00aac072c", size = 320192, upload-time = "2025-08-08T13:13:59.467Z" }, +] + [[package]] name = "scikit-learn" version = "1.6.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "joblib" }, - { name = "numpy" }, + { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.13'" }, + { name = "numpy", version = "2.2.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13'" }, { name = "scipy" }, { name = "threadpoolctl" }, ] @@ -3160,7 +3781,8 @@ name = "scipy" version = "1.15.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy" }, + { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.13'" }, + { name = "numpy", version = "2.2.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/b7/b9/31ba9cd990e626574baf93fbc1ac61cf9ed54faafd04c479117517661637/scipy-1.15.2.tar.gz", hash = "sha256:cd58a314d92838f7e6f755c8a2167ead4f27e1fd5c1251fd54289569ef3495ec", size = 59417316, upload-time = "2025-02-17T00:42:24.791Z" } wheels = [ @@ -3202,6 +3824,67 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/40/b0/4562db6223154aa4e22f939003cb92514c79f3d4dccca3444253fd17f902/Send2Trash-1.8.3-py3-none-any.whl", hash = "sha256:0c31227e0bd08961c7665474a3d1ef7193929fedda4233843689baa056be46c9", size = 18072, upload-time = "2024-04-07T00:01:07.438Z" }, ] +[[package]] +name = "sentencepiece" +version = "0.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/15/15/2e7a025fc62d764b151ae6d0f2a92f8081755ebe8d4a64099accc6f77ba6/sentencepiece-0.2.1.tar.gz", hash = "sha256:8138cec27c2f2282f4a34d9a016e3374cd40e5c6e9cb335063db66a0a3b71fad", size = 3228515, upload-time = "2025-08-12T07:00:51.718Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4a/be/32ce495aa1d0e0c323dcb1ba87096037358edee539cac5baf8755a6bd396/sentencepiece-0.2.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:57cae326c8727de58c85977b175af132a7138d84c764635d7e71bbee7e774133", size = 1943152, upload-time = "2025-08-12T06:59:40.048Z" }, + { url = "https://files.pythonhosted.org/packages/88/7e/ff23008899a58678e98c6ff592bf4d368eee5a71af96d0df6b38a039dd4f/sentencepiece-0.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:56dd39a3c4d6493db3cdca7e8cc68c6b633f0d4195495cbadfcf5af8a22d05a6", size = 1325651, upload-time = "2025-08-12T06:59:41.536Z" }, + { url = "https://files.pythonhosted.org/packages/19/84/42eb3ce4796777a1b5d3699dfd4dca85113e68b637f194a6c8d786f16a04/sentencepiece-0.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d9381351182ff9888cc80e41c632e7e274b106f450de33d67a9e8f6043da6f76", size = 1253645, upload-time = "2025-08-12T06:59:42.903Z" }, + { url = "https://files.pythonhosted.org/packages/89/fa/d3d5ebcba3cb9e6d3775a096251860c41a6bc53a1b9461151df83fe93255/sentencepiece-0.2.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:99f955df238021bf11f0fc37cdb54fd5e5b5f7fd30ecc3d93fb48b6815437167", size = 1316273, upload-time = "2025-08-12T06:59:44.476Z" }, + { url = "https://files.pythonhosted.org/packages/04/88/14f2f4a2b922d8b39be45bf63d79e6cd3a9b2f248b2fcb98a69b12af12f5/sentencepiece-0.2.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0cdfecef430d985f1c2bcbfff3defd1d95dae876fbd0173376012d2d7d24044b", size = 1387881, upload-time = "2025-08-12T06:59:46.09Z" }, + { url = "https://files.pythonhosted.org/packages/fd/b8/903e5ccb77b4ef140605d5d71b4f9e0ad95d456d6184688073ed11712809/sentencepiece-0.2.1-cp312-cp312-win32.whl", hash = "sha256:a483fd29a34c3e34c39ac5556b0a90942bec253d260235729e50976f5dba1068", size = 999540, upload-time = "2025-08-12T06:59:48.023Z" }, + { url = "https://files.pythonhosted.org/packages/2d/81/92df5673c067148c2545b1bfe49adfd775bcc3a169a047f5a0e6575ddaca/sentencepiece-0.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:4cdc7c36234fda305e85c32949c5211faaf8dd886096c7cea289ddc12a2d02de", size = 1054671, upload-time = "2025-08-12T06:59:49.895Z" }, + { url = "https://files.pythonhosted.org/packages/fe/02/c5e3bc518655d714622bec87d83db9cdba1cd0619a4a04e2109751c4f47f/sentencepiece-0.2.1-cp312-cp312-win_arm64.whl", hash = "sha256:daeb5e9e9fcad012324807856113708614d534f596d5008638eb9b40112cd9e4", size = 1033923, upload-time = "2025-08-12T06:59:51.952Z" }, + { url = "https://files.pythonhosted.org/packages/ba/4a/85fbe1706d4d04a7e826b53f327c4b80f849cf1c7b7c5e31a20a97d8f28b/sentencepiece-0.2.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dcd8161eee7b41aae57ded06272905dbd680a0a04b91edd0f64790c796b2f706", size = 1943150, upload-time = "2025-08-12T06:59:53.588Z" }, + { url = "https://files.pythonhosted.org/packages/c2/83/4cfb393e287509fc2155480b9d184706ef8d9fa8cbf5505d02a5792bf220/sentencepiece-0.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c6c8f42949f419ff8c7e9960dbadcfbc982d7b5efc2f6748210d3dd53a7de062", size = 1325651, upload-time = "2025-08-12T06:59:55.073Z" }, + { url = "https://files.pythonhosted.org/packages/8d/de/5a007fb53b1ab0aafc69d11a5a3dd72a289d5a3e78dcf2c3a3d9b14ffe93/sentencepiece-0.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:097f3394e99456e9e4efba1737c3749d7e23563dd1588ce71a3d007f25475fff", size = 1253641, upload-time = "2025-08-12T06:59:56.562Z" }, + { url = "https://files.pythonhosted.org/packages/2c/d2/f552be5928105588f4f4d66ee37dd4c61460d8097e62d0e2e0eec41bc61d/sentencepiece-0.2.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d7b670879c370d350557edabadbad1f6561a9e6968126e6debca4029e5547820", size = 1316271, upload-time = "2025-08-12T06:59:58.109Z" }, + { url = "https://files.pythonhosted.org/packages/96/df/0cfe748ace5485be740fed9476dee7877f109da32ed0d280312c94ec259f/sentencepiece-0.2.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c7f0fd2f2693309e6628aeeb2e2faf6edd221134dfccac3308ca0de01f8dab47", size = 1387882, upload-time = "2025-08-12T07:00:00.701Z" }, + { url = "https://files.pythonhosted.org/packages/ac/dd/f7774d42a881ced8e1739f393ab1e82ece39fc9abd4779e28050c2e975b5/sentencepiece-0.2.1-cp313-cp313-win32.whl", hash = "sha256:92b3816aa2339355fda2c8c4e021a5de92180b00aaccaf5e2808972e77a4b22f", size = 999541, upload-time = "2025-08-12T07:00:02.709Z" }, + { url = "https://files.pythonhosted.org/packages/dd/e9/932b9eae6fd7019548321eee1ab8d5e3b3d1294df9d9a0c9ac517c7b636d/sentencepiece-0.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:10ed3dab2044c47f7a2e7b4969b0c430420cdd45735d78c8f853191fa0e3148b", size = 1054669, upload-time = "2025-08-12T07:00:04.915Z" }, + { url = "https://files.pythonhosted.org/packages/c9/3a/76488a00ea7d6931689cda28726a1447d66bf1a4837943489314593d5596/sentencepiece-0.2.1-cp313-cp313-win_arm64.whl", hash = "sha256:ac650534e2251083c5f75dde4ff28896ce7c8904133dc8fef42780f4d5588fcd", size = 1033922, upload-time = "2025-08-12T07:00:06.496Z" }, + { url = "https://files.pythonhosted.org/packages/4a/b6/08fe2ce819e02ccb0296f4843e3f195764ce9829cbda61b7513f29b95718/sentencepiece-0.2.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:8dd4b477a7b069648d19363aad0cab9bad2f4e83b2d179be668efa672500dc94", size = 1946052, upload-time = "2025-08-12T07:00:08.136Z" }, + { url = "https://files.pythonhosted.org/packages/ab/d9/1ea0e740591ff4c6fc2b6eb1d7510d02f3fb885093f19b2f3abd1363b402/sentencepiece-0.2.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0c0f672da370cc490e4c59d89e12289778310a0e71d176c541e4834759e1ae07", size = 1327408, upload-time = "2025-08-12T07:00:09.572Z" }, + { url = "https://files.pythonhosted.org/packages/99/7e/1fb26e8a21613f6200e1ab88824d5d203714162cf2883248b517deb500b7/sentencepiece-0.2.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:ad8493bea8432dae8d6830365352350f3b4144415a1d09c4c8cb8d30cf3b6c3c", size = 1254857, upload-time = "2025-08-12T07:00:11.021Z" }, + { url = "https://files.pythonhosted.org/packages/bc/85/c72fd1f3c7a6010544d6ae07f8ddb38b5e2a7e33bd4318f87266c0bbafbf/sentencepiece-0.2.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b81a24733726e3678d2db63619acc5a8dccd074f7aa7a54ecd5ca33ca6d2d596", size = 1315722, upload-time = "2025-08-12T07:00:12.989Z" }, + { url = "https://files.pythonhosted.org/packages/4a/e8/661e5bd82a8aa641fd6c1020bd0e890ef73230a2b7215ddf9c8cd8e941c2/sentencepiece-0.2.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0a81799d0a68d618e89063fb423c3001a034c893069135ffe51fee439ae474d6", size = 1387452, upload-time = "2025-08-12T07:00:15.088Z" }, + { url = "https://files.pythonhosted.org/packages/99/5e/ae66c361023a470afcbc1fbb8da722c72ea678a2fcd9a18f1a12598c7501/sentencepiece-0.2.1-cp313-cp313t-win32.whl", hash = "sha256:89a3ea015517c42c0341d0d962f3e6aaf2cf10d71b1932d475c44ba48d00aa2b", size = 1002501, upload-time = "2025-08-12T07:00:16.966Z" }, + { url = "https://files.pythonhosted.org/packages/c1/03/d332828c4ff764e16c1b56c2c8f9a33488bbe796b53fb6b9c4205ddbf167/sentencepiece-0.2.1-cp313-cp313t-win_amd64.whl", hash = "sha256:33f068c9382dc2e7c228eedfd8163b52baa86bb92f50d0488bf2b7da7032e484", size = 1057555, upload-time = "2025-08-12T07:00:18.573Z" }, + { url = "https://files.pythonhosted.org/packages/88/14/5aee0bf0864df9bd82bd59e7711362908e4935e3f9cdc1f57246b5d5c9b9/sentencepiece-0.2.1-cp313-cp313t-win_arm64.whl", hash = "sha256:b3616ad246f360e52c85781e47682d31abfb6554c779e42b65333d4b5f44ecc0", size = 1036042, upload-time = "2025-08-12T07:00:20.209Z" }, + { url = "https://files.pythonhosted.org/packages/24/9c/89eb8b2052f720a612478baf11c8227dcf1dc28cd4ea4c0c19506b5af2a2/sentencepiece-0.2.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:5d0350b686c320068702116276cfb26c066dc7e65cfef173980b11bb4d606719", size = 1943147, upload-time = "2025-08-12T07:00:21.809Z" }, + { url = "https://files.pythonhosted.org/packages/82/0b/a1432bc87f97c2ace36386ca23e8bd3b91fb40581b5e6148d24b24186419/sentencepiece-0.2.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:c7f54a31cde6fa5cb030370566f68152a742f433f8d2be458463d06c208aef33", size = 1325624, upload-time = "2025-08-12T07:00:23.289Z" }, + { url = "https://files.pythonhosted.org/packages/ea/99/bbe054ebb5a5039457c590e0a4156ed073fb0fe9ce4f7523404dd5b37463/sentencepiece-0.2.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c83b85ab2d6576607f31df77ff86f28182be4a8de6d175d2c33ca609925f5da1", size = 1253670, upload-time = "2025-08-12T07:00:24.69Z" }, + { url = "https://files.pythonhosted.org/packages/19/ad/d5c7075f701bd97971d7c2ac2904f227566f51ef0838dfbdfdccb58cd212/sentencepiece-0.2.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1855f57db07b51fb51ed6c9c452f570624d2b169b36f0f79ef71a6e6c618cd8b", size = 1316247, upload-time = "2025-08-12T07:00:26.435Z" }, + { url = "https://files.pythonhosted.org/packages/fb/03/35fbe5f3d9a7435eebd0b473e09584bd3cc354ce118b960445b060d33781/sentencepiece-0.2.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01e6912125cb45d3792f530a4d38f8e21bf884d6b4d4ade1b2de5cf7a8d2a52b", size = 1387894, upload-time = "2025-08-12T07:00:28.339Z" }, + { url = "https://files.pythonhosted.org/packages/dc/aa/956ef729aafb6c8f9c443104c9636489093bb5c61d6b90fc27aa1a865574/sentencepiece-0.2.1-cp314-cp314-win32.whl", hash = "sha256:c415c9de1447e0a74ae3fdb2e52f967cb544113a3a5ce3a194df185cbc1f962f", size = 1096698, upload-time = "2025-08-12T07:00:29.764Z" }, + { url = "https://files.pythonhosted.org/packages/b8/cb/fe400d8836952cc535c81a0ce47dc6875160e5fedb71d2d9ff0e9894c2a6/sentencepiece-0.2.1-cp314-cp314-win_amd64.whl", hash = "sha256:881b2e44b14fc19feade3cbed314be37de639fc415375cefaa5bc81a4be137fd", size = 1155115, upload-time = "2025-08-12T07:00:32.865Z" }, + { url = "https://files.pythonhosted.org/packages/32/89/047921cf70f36c7b6b6390876b2399b3633ab73b8d0cb857e5a964238941/sentencepiece-0.2.1-cp314-cp314-win_arm64.whl", hash = "sha256:2005242a16d2dc3ac5fe18aa7667549134d37854823df4c4db244752453b78a8", size = 1133890, upload-time = "2025-08-12T07:00:34.763Z" }, + { url = "https://files.pythonhosted.org/packages/a1/11/5b414b9fae6255b5fb1e22e2ed3dc3a72d3a694e5703910e640ac78346bb/sentencepiece-0.2.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:a19adcec27c524cb7069a1c741060add95f942d1cbf7ad0d104dffa0a7d28a2b", size = 1946081, upload-time = "2025-08-12T07:00:36.97Z" }, + { url = "https://files.pythonhosted.org/packages/77/eb/7a5682bb25824db8545f8e5662e7f3e32d72a508fdce086029d89695106b/sentencepiece-0.2.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:e37e4b4c4a11662b5db521def4e44d4d30ae69a1743241412a93ae40fdcab4bb", size = 1327406, upload-time = "2025-08-12T07:00:38.669Z" }, + { url = "https://files.pythonhosted.org/packages/03/b0/811dae8fb9f2784e138785d481469788f2e0d0c109c5737372454415f55f/sentencepiece-0.2.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:477c81505db072b3ab627e7eab972ea1025331bd3a92bacbf798df2b75ea86ec", size = 1254846, upload-time = "2025-08-12T07:00:40.611Z" }, + { url = "https://files.pythonhosted.org/packages/ef/23/195b2e7ec85ebb6a547969f60b723c7aca5a75800ece6cc3f41da872d14e/sentencepiece-0.2.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:010f025a544ef770bb395091d57cb94deb9652d8972e0d09f71d85d5a0816c8c", size = 1315721, upload-time = "2025-08-12T07:00:42.914Z" }, + { url = "https://files.pythonhosted.org/packages/7e/aa/553dbe4178b5f23eb28e59393dddd64186178b56b81d9b8d5c3ff1c28395/sentencepiece-0.2.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:733e59ff1794d26db706cd41fc2d7ca5f6c64a820709cb801dc0ea31780d64ab", size = 1387458, upload-time = "2025-08-12T07:00:44.56Z" }, + { url = "https://files.pythonhosted.org/packages/66/7c/08ff0012507297a4dd74a5420fdc0eb9e3e80f4e88cab1538d7f28db303d/sentencepiece-0.2.1-cp314-cp314t-win32.whl", hash = "sha256:d3233770f78e637dc8b1fda2cd7c3b99ec77e7505041934188a4e7fe751de3b0", size = 1099765, upload-time = "2025-08-12T07:00:46.058Z" }, + { url = "https://files.pythonhosted.org/packages/91/d5/2a69e1ce15881beb9ddfc7e3f998322f5cedcd5e4d244cb74dade9441663/sentencepiece-0.2.1-cp314-cp314t-win_amd64.whl", hash = "sha256:5e4366c97b68218fd30ea72d70c525e6e78a6c0a88650f57ac4c43c63b234a9d", size = 1157807, upload-time = "2025-08-12T07:00:47.673Z" }, + { url = "https://files.pythonhosted.org/packages/f3/16/54f611fcfc2d1c46cbe3ec4169780b2cfa7cf63708ef2b71611136db7513/sentencepiece-0.2.1-cp314-cp314t-win_arm64.whl", hash = "sha256:105e36e75cbac1292642045458e8da677b2342dcd33df503e640f0b457cb6751", size = 1136264, upload-time = "2025-08-12T07:00:49.485Z" }, +] + +[[package]] +name = "sentry-sdk" +version = "2.37.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/78/be/ffc232c32d0be18f8e4eff7a22dffc1f1fef2894703d64cc281a80e75da6/sentry_sdk-2.37.1.tar.gz", hash = "sha256:531751da91aa62a909b42a7be155b41f6bb0de9df6ae98441d23b95de2f98475", size = 346235, upload-time = "2025-09-09T13:48:27.137Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f3/c3/cba447ab531331d165d9003c04473be944a308ad916ca2345b5ef1969ed9/sentry_sdk-2.37.1-py2.py3-none-any.whl", hash = "sha256:baaaea6608ed3a639766a69ded06b254b106d32ad9d180bdbe58f3db9364592b", size = 368307, upload-time = "2025-09-09T13:48:25.271Z" }, +] + [[package]] name = "setuptools" version = "78.1.0" @@ -3266,6 +3949,7 @@ dependencies = [ { name = "pandas" }, { name = "penzai" }, { name = "plotly" }, + { name = "transformer-lens" }, { name = "treescope" }, ] @@ -3318,6 +4002,7 @@ requires-dist = [ { name = "pytest-cov", marker = "extra == 'dev'" }, { name = "ruff", marker = "extra == 'dev'" }, { name = "torch", marker = "extra == 'pytorch'" }, + { name = "transformer-lens", specifier = ">=2.16.1" }, { name = "treescope" }, ] provides-extras = ["aws", "cuda", "dev", "mac", "pytorch"] @@ -3452,7 +4137,8 @@ version = "0.1.73" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "ml-dtypes" }, - { name = "numpy" }, + { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.13'" }, + { name = "numpy", version = "2.2.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/89/e9/00841801b0ae383228b8deca788e5a4e950f863c1846c14a118d5d5bac62/tensorstore-0.1.73.tar.gz", hash = "sha256:f24b325385fd30be612ab8494a29d3bfef37b9444357912ba184f30f325f093b", size = 6765634, upload-time = "2025-03-29T05:47:04.913Z" } wheels = [ @@ -3474,7 +4160,7 @@ version = "0.18.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "ptyprocess", marker = "os_name != 'nt'" }, - { name = "pywinpty", marker = "os_name == 'nt'" }, + { name = "pywinpty", marker = "os_name == 'nt' and sys_platform != 'linux'" }, { name = "tornado" }, ] sdist = { url = "https://files.pythonhosted.org/packages/8a/11/965c6fd8e5cc254f1fe142d547387da17a8ebfd75a3455f637c663fb38a0/terminado-0.18.1.tar.gz", hash = "sha256:de09f2c4b85de4765f7714688fff57d3e75bad1f909b589fde880460c753fd2e", size = 32701, upload-time = "2024-03-12T14:34:39.026Z" } @@ -3512,6 +4198,31 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/87/ba/576aac29b10dfa49a6ce650001d1bb31f81e734660555eaf144bfe5b8995/tokenize_rt-6.1.0-py2.py3-none-any.whl", hash = "sha256:d706141cdec4aa5f358945abe36b911b8cbdc844545da99e811250c0cee9b6fc", size = 6015, upload-time = "2024-10-22T00:14:57.469Z" }, ] +[[package]] +name = "tokenizers" +version = "0.22.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "huggingface-hub" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5e/b4/c1ce3699e81977da2ace8b16d2badfd42b060e7d33d75c4ccdbf9dc920fa/tokenizers-0.22.0.tar.gz", hash = "sha256:2e33b98525be8453f355927f3cab312c36cd3e44f4d7e9e97da2fa94d0a49dcb", size = 362771, upload-time = "2025-08-29T10:25:33.914Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6d/b1/18c13648edabbe66baa85fe266a478a7931ddc0cd1ba618802eb7b8d9865/tokenizers-0.22.0-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:eaa9620122a3fb99b943f864af95ed14c8dfc0f47afa3b404ac8c16b3f2bb484", size = 3081954, upload-time = "2025-08-29T10:25:24.993Z" }, + { url = "https://files.pythonhosted.org/packages/c2/02/c3c454b641bd7c4f79e4464accfae9e7dfc913a777d2e561e168ae060362/tokenizers-0.22.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:71784b9ab5bf0ff3075bceeb198149d2c5e068549c0d18fe32d06ba0deb63f79", size = 2945644, upload-time = "2025-08-29T10:25:23.405Z" }, + { url = "https://files.pythonhosted.org/packages/55/02/d10185ba2fd8c2d111e124c9d92de398aee0264b35ce433f79fb8472f5d0/tokenizers-0.22.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec5b71f668a8076802b0241a42387d48289f25435b86b769ae1837cad4172a17", size = 3254764, upload-time = "2025-08-29T10:25:12.445Z" }, + { url = "https://files.pythonhosted.org/packages/13/89/17514bd7ef4bf5bfff58e2b131cec0f8d5cea2b1c8ffe1050a2c8de88dbb/tokenizers-0.22.0-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ea8562fa7498850d02a16178105b58803ea825b50dc9094d60549a7ed63654bb", size = 3161654, upload-time = "2025-08-29T10:25:15.493Z" }, + { url = "https://files.pythonhosted.org/packages/5a/d8/bac9f3a7ef6dcceec206e3857c3b61bb16c6b702ed7ae49585f5bd85c0ef/tokenizers-0.22.0-cp39-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4136e1558a9ef2e2f1de1555dcd573e1cbc4a320c1a06c4107a3d46dc8ac6e4b", size = 3511484, upload-time = "2025-08-29T10:25:20.477Z" }, + { url = "https://files.pythonhosted.org/packages/aa/27/9c9800eb6763683010a4851db4d1802d8cab9cec114c17056eccb4d4a6e0/tokenizers-0.22.0-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cdf5954de3962a5fd9781dc12048d24a1a6f1f5df038c6e95db328cd22964206", size = 3712829, upload-time = "2025-08-29T10:25:17.154Z" }, + { url = "https://files.pythonhosted.org/packages/10/e3/b1726dbc1f03f757260fa21752e1921445b5bc350389a8314dd3338836db/tokenizers-0.22.0-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8337ca75d0731fc4860e6204cc24bb36a67d9736142aa06ed320943b50b1e7ed", size = 3408934, upload-time = "2025-08-29T10:25:18.76Z" }, + { url = "https://files.pythonhosted.org/packages/d4/61/aeab3402c26874b74bb67a7f2c4b569dde29b51032c5384db592e7b216f4/tokenizers-0.22.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a89264e26f63c449d8cded9061adea7b5de53ba2346fc7e87311f7e4117c1cc8", size = 3345585, upload-time = "2025-08-29T10:25:22.08Z" }, + { url = "https://files.pythonhosted.org/packages/bc/d3/498b4a8a8764cce0900af1add0f176ff24f475d4413d55b760b8cdf00893/tokenizers-0.22.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:790bad50a1b59d4c21592f9c3cf5e5cf9c3c7ce7e1a23a739f13e01fb1be377a", size = 9322986, upload-time = "2025-08-29T10:25:26.607Z" }, + { url = "https://files.pythonhosted.org/packages/a2/62/92378eb1c2c565837ca3cb5f9569860d132ab9d195d7950c1ea2681dffd0/tokenizers-0.22.0-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:76cf6757c73a10ef10bf06fa937c0ec7393d90432f543f49adc8cab3fb6f26cb", size = 9276630, upload-time = "2025-08-29T10:25:28.349Z" }, + { url = "https://files.pythonhosted.org/packages/eb/f0/342d80457aa1cda7654327460f69db0d69405af1e4c453f4dc6ca7c4a76e/tokenizers-0.22.0-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:1626cb186e143720c62c6c6b5371e62bbc10af60481388c0da89bc903f37ea0c", size = 9547175, upload-time = "2025-08-29T10:25:29.989Z" }, + { url = "https://files.pythonhosted.org/packages/14/84/8aa9b4adfc4fbd09381e20a5bc6aa27040c9c09caa89988c01544e008d18/tokenizers-0.22.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:da589a61cbfea18ae267723d6b029b84598dc8ca78db9951d8f5beff72d8507c", size = 9692735, upload-time = "2025-08-29T10:25:32.089Z" }, + { url = "https://files.pythonhosted.org/packages/bf/24/83ee2b1dc76bfe05c3142e7d0ccdfe69f0ad2f1ebf6c726cea7f0874c0d0/tokenizers-0.22.0-cp39-abi3-win32.whl", hash = "sha256:dbf9d6851bddae3e046fedfb166f47743c1c7bd11c640f0691dd35ef0bcad3be", size = 2471915, upload-time = "2025-08-29T10:25:36.411Z" }, + { url = "https://files.pythonhosted.org/packages/d1/9b/0e0bf82214ee20231845b127aa4a8015936ad5a46779f30865d10e404167/tokenizers-0.22.0-cp39-abi3-win_amd64.whl", hash = "sha256:c78174859eeaee96021f248a56c801e36bfb6bd5b067f2e95aa82445ca324f00", size = 2680494, upload-time = "2025-08-29T10:25:35.14Z" }, +] + [[package]] name = "tomli" version = "2.2.1" @@ -3556,7 +4267,8 @@ version = "2.7.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "filelock" }, - { name = "fsspec" }, + { name = "fsspec", version = "2025.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.13' or sys_platform != 'linux'" }, + { name = "fsspec", version = "2025.3.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13' and sys_platform == 'linux'" }, { name = "jinja2" }, { name = "networkx" }, { name = "nvidia-cublas-cu12", version = "12.6.4.1", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, @@ -3632,12 +4344,74 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359, upload-time = "2024-04-19T11:11:46.763Z" }, ] +[[package]] +name = "transformer-lens" +version = "2.16.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "accelerate" }, + { name = "beartype" }, + { name = "better-abc" }, + { name = "datasets", version = "2.14.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13' and sys_platform == 'linux'" }, + { name = "datasets", version = "4.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.13' or sys_platform != 'linux'" }, + { name = "einops" }, + { name = "fancy-einsum" }, + { name = "jaxtyping" }, + { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.13'" }, + { name = "pandas" }, + { name = "rich" }, + { name = "sentencepiece" }, + { name = "torch" }, + { name = "tqdm" }, + { name = "transformers" }, + { name = "transformers-stream-generator" }, + { name = "typeguard" }, + { name = "typing-extensions" }, + { name = "wandb" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/dd/91/96026f9de52e39e4385c503e2c79e355529ddf48eecade8c433fb9efa930/transformer_lens-2.16.1.tar.gz", hash = "sha256:62c92bb6b986af67cb5a1605da0f9b1a76a91cdf0cc05492c9faab716675b08e", size = 153889, upload-time = "2025-06-19T13:32:18.926Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/30/bf/fcf5e93e56d614025a5f732059ce924adac606cadf42b87c50e002ab7e5a/transformer_lens-2.16.1-py3-none-any.whl", hash = "sha256:fd59ab8c08d864d93a48f4e40ad20f437fc903e037e320cfd28c8d3f7a1817ce", size = 192023, upload-time = "2025-06-19T13:32:17.821Z" }, +] + +[[package]] +name = "transformers" +version = "4.56.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "filelock" }, + { name = "huggingface-hub" }, + { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.13'" }, + { name = "numpy", version = "2.2.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13'" }, + { name = "packaging" }, + { name = "pyyaml" }, + { name = "regex" }, + { name = "requests" }, + { name = "safetensors" }, + { name = "tokenizers" }, + { name = "tqdm" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/89/21/dc88ef3da1e49af07ed69386a11047a31dcf1aaf4ded3bc4b173fbf94116/transformers-4.56.1.tar.gz", hash = "sha256:0d88b1089a563996fc5f2c34502f10516cad3ea1aa89f179f522b54c8311fe74", size = 9855473, upload-time = "2025-09-04T20:47:13.14Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/71/7c/283c3dd35e00e22a7803a0b2a65251347b745474a82399be058bde1c9f15/transformers-4.56.1-py3-none-any.whl", hash = "sha256:1697af6addfb6ddbce9618b763f4b52d5a756f6da4899ffd1b4febf58b779248", size = 11608197, upload-time = "2025-09-04T20:47:04.895Z" }, +] + +[[package]] +name = "transformers-stream-generator" +version = "0.0.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "transformers" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/c2/65f13aec253100e1916e9bd7965fe17bde796ebabeb1265f45191ab4ddc0/transformers-stream-generator-0.0.5.tar.gz", hash = "sha256:271deace0abf9c0f83b36db472c8ba61fdc7b04d1bf89d845644acac2795ed57", size = 13033, upload-time = "2024-03-11T14:18:02.079Z" } + [[package]] name = "treescope" version = "0.1.9" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy" }, + { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.13'" }, + { name = "numpy", version = "2.2.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/26/27/80ad254da167e0055d5679aefd224ab08844a4cd55aeee7ef72c999d5fc6/treescope-0.1.9.tar.gz", hash = "sha256:ba6cdbdc9c5b52691d5f3bb4c5d5c7daa5627119acac8640b46d37e6aabe63a6", size = 544385, upload-time = "2025-02-17T19:58:01.712Z" } wheels = [ @@ -3649,7 +4423,7 @@ name = "triton" version = "3.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "setuptools", marker = "sys_platform != 'win32'" }, + { name = "setuptools", marker = "sys_platform == 'linux'" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/24/5f/950fb373bf9c01ad4eb5a8cd5eaf32cdf9e238c02f9293557a2129b9c4ac/triton-3.3.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9999e83aba21e1a78c1f36f21bce621b77bcaa530277a50484a7cb4a822f6e43", size = 155669138, upload-time = "2025-05-29T23:39:51.771Z" }, @@ -3657,6 +4431,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/28/71/bd20ffcb7a64c753dc2463489a61bf69d531f308e390ad06390268c4ea04/triton-3.3.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a3198adb9d78b77818a5388bff89fa72ff36f9da0bc689db2f0a651a67ce6a42", size = 155735832, upload-time = "2025-05-29T23:40:10.522Z" }, ] +[[package]] +name = "typeguard" +version = "4.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/70/60/8cd6a3d78d00ceeb2193c02b7ed08f063d5341ccdfb24df88e61f383048e/typeguard-4.4.2.tar.gz", hash = "sha256:a6f1065813e32ef365bc3b3f503af8a96f9dd4e0033a02c28c4a4983de8c6c49", size = 75746, upload-time = "2025-02-16T16:28:26.205Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cf/4b/9a77dc721aa0b7f74440a42e4ef6f9a4fae7324e17f64f88b96f4c25cc05/typeguard-4.4.2-py3-none-any.whl", hash = "sha256:77a78f11f09777aeae7fa08585f33b5f4ef0e7335af40005b0c422ed398ff48c", size = 35801, upload-time = "2025-02-16T16:28:24.793Z" }, +] + [[package]] name = "types-python-dateutil" version = "2.9.0.20241206" @@ -3745,6 +4531,35 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8d/57/a27182528c90ef38d82b636a11f606b0cbb0e17588ed205435f8affe3368/waitress-3.0.2-py3-none-any.whl", hash = "sha256:c56d67fd6e87c2ee598b76abdd4e96cfad1f24cacdea5078d382b1f9d7b5ed2e", size = 56232, upload-time = "2024-11-16T20:02:33.858Z" }, ] +[[package]] +name = "wandb" +version = "0.21.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "gitpython" }, + { name = "packaging" }, + { name = "platformdirs" }, + { name = "protobuf" }, + { name = "pydantic" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "sentry-sdk" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2f/84/af6ccdf95e56f15aceb360e437fbfcca3dc91ad8ca335fe482083e29f7a5/wandb-0.21.3.tar.gz", hash = "sha256:031e24e2aad0ce735dfdcc74baf2f2c12c106f500ed24798de6ef9b9e63bb432", size = 40146972, upload-time = "2025-08-30T18:21:55.138Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/aa/e8/b5bfbbc7f76c11fd0665b92be8a38c6a83b27f353552233b9959b21be488/wandb-0.21.3-py3-none-macosx_10_14_x86_64.whl", hash = "sha256:f85bac45b4482742ec9ff190af38eb00a877ddeb4875475e7e487dc19300ff03", size = 18820209, upload-time = "2025-08-30T18:21:33.47Z" }, + { url = "https://files.pythonhosted.org/packages/59/a3/03f0fcde49609df1cb3a382fb5053f601b88da448bcd415ed7f75272eee7/wandb-0.21.3-py3-none-macosx_12_0_arm64.whl", hash = "sha256:8a2b3ba419b91d47edead2755f04cef54f9e3c4496ee0c9854c3cfeff4216dd3", size = 18310636, upload-time = "2025-08-30T18:21:37.405Z" }, + { url = "https://files.pythonhosted.org/packages/1d/c3/d6048db30ff2e3c67089ba0e94878572fd26137b146f8e3b27bbdf428b31/wandb-0.21.3-py3-none-macosx_12_0_x86_64.whl", hash = "sha256:35a1972881f3b85755befab004118234593792a9f05e07fd6345780172f4420e", size = 19053277, upload-time = "2025-08-30T18:21:39.389Z" }, + { url = "https://files.pythonhosted.org/packages/ea/7f/805c3d2fa9e3b8b6bf2bc534887c9ed97bdf22007ca8ba59424a1c8bb360/wandb-0.21.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d9cf8588cb090a2a41f589037fda72c57c9e23edfbd2ad829e575f1305d942c", size = 18130850, upload-time = "2025-08-30T18:21:41.573Z" }, + { url = "https://files.pythonhosted.org/packages/5b/af/a3252e5afac98a036f83c65ec92cadf6677ccdaacbbb2151da29f694d136/wandb-0.21.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ff24b6b8e0f9da840b6bd5c7f60b0a5507bd998db40c9c2d476f9a340bec8ed", size = 19570305, upload-time = "2025-08-30T18:21:43.811Z" }, + { url = "https://files.pythonhosted.org/packages/4d/f9/4404b5a24bfd4ba027c19d30152b0fc7ebca8c49b202dee6ecb7f316082c/wandb-0.21.3-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:4975dec19e2b343e23ed6e60f7e1290120553719f82e87a22205bede758416ad", size = 18135806, upload-time = "2025-08-30T18:21:46.211Z" }, + { url = "https://files.pythonhosted.org/packages/ff/32/9580f42899e54f3d0b4ea619b6f6a54980a4e36fd0675d58c09f0a08d3f6/wandb-0.21.3-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:514a0aad40ecc0bdb757b1dc86e4ac98f61d2d760445b6e1f555291562320f2d", size = 19646760, upload-time = "2025-08-30T18:21:48.768Z" }, + { url = "https://files.pythonhosted.org/packages/75/d3/faa6ddb792a158c154fb704b25c96d0478e71eabf96e3f17529fb23b6894/wandb-0.21.3-py3-none-win32.whl", hash = "sha256:45aa3d8ad53c6ee06f37490d7a329ed7d0f5ca4dbd5d05bb0c01d5da22f14691", size = 18709408, upload-time = "2025-08-30T18:21:50.859Z" }, + { url = "https://files.pythonhosted.org/packages/d8/2d/7ef56e25f78786e59fefd9b19867c325f9686317d9f7b93b5cb340360a3e/wandb-0.21.3-py3-none-win_amd64.whl", hash = "sha256:56d5a5697766f552a9933d8c6a564202194768eb0389bd5f9fe9a99cd4cee41e", size = 18709411, upload-time = "2025-08-30T18:21:52.874Z" }, +] + [[package]] name = "wcwidth" version = "0.2.13" @@ -3853,6 +4668,109 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2d/82/f56956041adef78f849db6b289b282e72b55ab8045a75abad81898c28d19/wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8", size = 23594, upload-time = "2025-01-14T10:35:44.018Z" }, ] +[[package]] +name = "xxhash" +version = "3.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/00/5e/d6e5258d69df8b4ed8c83b6664f2b47d30d2dec551a29ad72a6c69eafd31/xxhash-3.5.0.tar.gz", hash = "sha256:84f2caddf951c9cbf8dc2e22a89d4ccf5d86391ac6418fe81e3c67d0cf60b45f", size = 84241, upload-time = "2024-08-17T09:20:38.972Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/0e/1bfce2502c57d7e2e787600b31c83535af83746885aa1a5f153d8c8059d6/xxhash-3.5.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:14470ace8bd3b5d51318782cd94e6f94431974f16cb3b8dc15d52f3b69df8e00", size = 31969, upload-time = "2024-08-17T09:18:24.025Z" }, + { url = "https://files.pythonhosted.org/packages/3f/d6/8ca450d6fe5b71ce521b4e5db69622383d039e2b253e9b2f24f93265b52c/xxhash-3.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:59aa1203de1cb96dbeab595ded0ad0c0056bb2245ae11fac11c0ceea861382b9", size = 30787, upload-time = "2024-08-17T09:18:25.318Z" }, + { url = "https://files.pythonhosted.org/packages/5b/84/de7c89bc6ef63d750159086a6ada6416cc4349eab23f76ab870407178b93/xxhash-3.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08424f6648526076e28fae6ea2806c0a7d504b9ef05ae61d196d571e5c879c84", size = 220959, upload-time = "2024-08-17T09:18:26.518Z" }, + { url = "https://files.pythonhosted.org/packages/fe/86/51258d3e8a8545ff26468c977101964c14d56a8a37f5835bc0082426c672/xxhash-3.5.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:61a1ff00674879725b194695e17f23d3248998b843eb5e933007ca743310f793", size = 200006, upload-time = "2024-08-17T09:18:27.905Z" }, + { url = "https://files.pythonhosted.org/packages/02/0a/96973bd325412feccf23cf3680fd2246aebf4b789122f938d5557c54a6b2/xxhash-3.5.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2f2c61bee5844d41c3eb015ac652a0229e901074951ae48581d58bfb2ba01be", size = 428326, upload-time = "2024-08-17T09:18:29.335Z" }, + { url = "https://files.pythonhosted.org/packages/11/a7/81dba5010f7e733de88af9555725146fc133be97ce36533867f4c7e75066/xxhash-3.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d32a592cac88d18cc09a89172e1c32d7f2a6e516c3dfde1b9adb90ab5df54a6", size = 194380, upload-time = "2024-08-17T09:18:30.706Z" }, + { url = "https://files.pythonhosted.org/packages/fb/7d/f29006ab398a173f4501c0e4977ba288f1c621d878ec217b4ff516810c04/xxhash-3.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70dabf941dede727cca579e8c205e61121afc9b28516752fd65724be1355cc90", size = 207934, upload-time = "2024-08-17T09:18:32.133Z" }, + { url = "https://files.pythonhosted.org/packages/8a/6e/6e88b8f24612510e73d4d70d9b0c7dff62a2e78451b9f0d042a5462c8d03/xxhash-3.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e5d0ddaca65ecca9c10dcf01730165fd858533d0be84c75c327487c37a906a27", size = 216301, upload-time = "2024-08-17T09:18:33.474Z" }, + { url = "https://files.pythonhosted.org/packages/af/51/7862f4fa4b75a25c3b4163c8a873f070532fe5f2d3f9b3fc869c8337a398/xxhash-3.5.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e5b5e16c5a480fe5f59f56c30abdeba09ffd75da8d13f6b9b6fd224d0b4d0a2", size = 203351, upload-time = "2024-08-17T09:18:34.889Z" }, + { url = "https://files.pythonhosted.org/packages/22/61/8d6a40f288f791cf79ed5bb113159abf0c81d6efb86e734334f698eb4c59/xxhash-3.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149b7914451eb154b3dfaa721315117ea1dac2cc55a01bfbd4df7c68c5dd683d", size = 210294, upload-time = "2024-08-17T09:18:36.355Z" }, + { url = "https://files.pythonhosted.org/packages/17/02/215c4698955762d45a8158117190261b2dbefe9ae7e5b906768c09d8bc74/xxhash-3.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:eade977f5c96c677035ff39c56ac74d851b1cca7d607ab3d8f23c6b859379cab", size = 414674, upload-time = "2024-08-17T09:18:38.536Z" }, + { url = "https://files.pythonhosted.org/packages/31/5c/b7a8db8a3237cff3d535261325d95de509f6a8ae439a5a7a4ffcff478189/xxhash-3.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fa9f547bd98f5553d03160967866a71056a60960be00356a15ecc44efb40ba8e", size = 192022, upload-time = "2024-08-17T09:18:40.138Z" }, + { url = "https://files.pythonhosted.org/packages/78/e3/dd76659b2811b3fd06892a8beb850e1996b63e9235af5a86ea348f053e9e/xxhash-3.5.0-cp312-cp312-win32.whl", hash = "sha256:f7b58d1fd3551b8c80a971199543379be1cee3d0d409e1f6d8b01c1a2eebf1f8", size = 30170, upload-time = "2024-08-17T09:18:42.163Z" }, + { url = "https://files.pythonhosted.org/packages/d9/6b/1c443fe6cfeb4ad1dcf231cdec96eb94fb43d6498b4469ed8b51f8b59a37/xxhash-3.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:fa0cafd3a2af231b4e113fba24a65d7922af91aeb23774a8b78228e6cd785e3e", size = 30040, upload-time = "2024-08-17T09:18:43.699Z" }, + { url = "https://files.pythonhosted.org/packages/0f/eb/04405305f290173acc0350eba6d2f1a794b57925df0398861a20fbafa415/xxhash-3.5.0-cp312-cp312-win_arm64.whl", hash = "sha256:586886c7e89cb9828bcd8a5686b12e161368e0064d040e225e72607b43858ba2", size = 26796, upload-time = "2024-08-17T09:18:45.29Z" }, + { url = "https://files.pythonhosted.org/packages/c9/b8/e4b3ad92d249be5c83fa72916c9091b0965cb0faeff05d9a0a3870ae6bff/xxhash-3.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:37889a0d13b0b7d739cfc128b1c902f04e32de17b33d74b637ad42f1c55101f6", size = 31795, upload-time = "2024-08-17T09:18:46.813Z" }, + { url = "https://files.pythonhosted.org/packages/fc/d8/b3627a0aebfbfa4c12a41e22af3742cf08c8ea84f5cc3367b5de2d039cce/xxhash-3.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:97a662338797c660178e682f3bc180277b9569a59abfb5925e8620fba00b9fc5", size = 30792, upload-time = "2024-08-17T09:18:47.862Z" }, + { url = "https://files.pythonhosted.org/packages/c3/cc/762312960691da989c7cd0545cb120ba2a4148741c6ba458aa723c00a3f8/xxhash-3.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f85e0108d51092bdda90672476c7d909c04ada6923c14ff9d913c4f7dc8a3bc", size = 220950, upload-time = "2024-08-17T09:18:49.06Z" }, + { url = "https://files.pythonhosted.org/packages/fe/e9/cc266f1042c3c13750e86a535496b58beb12bf8c50a915c336136f6168dc/xxhash-3.5.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd2fd827b0ba763ac919440042302315c564fdb797294d86e8cdd4578e3bc7f3", size = 199980, upload-time = "2024-08-17T09:18:50.445Z" }, + { url = "https://files.pythonhosted.org/packages/bf/85/a836cd0dc5cc20376de26b346858d0ac9656f8f730998ca4324921a010b9/xxhash-3.5.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:82085c2abec437abebf457c1d12fccb30cc8b3774a0814872511f0f0562c768c", size = 428324, upload-time = "2024-08-17T09:18:51.988Z" }, + { url = "https://files.pythonhosted.org/packages/b4/0e/15c243775342ce840b9ba34aceace06a1148fa1630cd8ca269e3223987f5/xxhash-3.5.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07fda5de378626e502b42b311b049848c2ef38784d0d67b6f30bb5008642f8eb", size = 194370, upload-time = "2024-08-17T09:18:54.164Z" }, + { url = "https://files.pythonhosted.org/packages/87/a1/b028bb02636dfdc190da01951d0703b3d904301ed0ef6094d948983bef0e/xxhash-3.5.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c279f0d2b34ef15f922b77966640ade58b4ccdfef1c4d94b20f2a364617a493f", size = 207911, upload-time = "2024-08-17T09:18:55.509Z" }, + { url = "https://files.pythonhosted.org/packages/80/d5/73c73b03fc0ac73dacf069fdf6036c9abad82de0a47549e9912c955ab449/xxhash-3.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:89e66ceed67b213dec5a773e2f7a9e8c58f64daeb38c7859d8815d2c89f39ad7", size = 216352, upload-time = "2024-08-17T09:18:57.073Z" }, + { url = "https://files.pythonhosted.org/packages/b6/2a/5043dba5ddbe35b4fe6ea0a111280ad9c3d4ba477dd0f2d1fe1129bda9d0/xxhash-3.5.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bcd51708a633410737111e998ceb3b45d3dbc98c0931f743d9bb0a209033a326", size = 203410, upload-time = "2024-08-17T09:18:58.54Z" }, + { url = "https://files.pythonhosted.org/packages/a2/b2/9a8ded888b7b190aed75b484eb5c853ddd48aa2896e7b59bbfbce442f0a1/xxhash-3.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3ff2c0a34eae7df88c868be53a8dd56fbdf592109e21d4bfa092a27b0bf4a7bf", size = 210322, upload-time = "2024-08-17T09:18:59.943Z" }, + { url = "https://files.pythonhosted.org/packages/98/62/440083fafbc917bf3e4b67c2ade621920dd905517e85631c10aac955c1d2/xxhash-3.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:4e28503dccc7d32e0b9817aa0cbfc1f45f563b2c995b7a66c4c8a0d232e840c7", size = 414725, upload-time = "2024-08-17T09:19:01.332Z" }, + { url = "https://files.pythonhosted.org/packages/75/db/009206f7076ad60a517e016bb0058381d96a007ce3f79fa91d3010f49cc2/xxhash-3.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a6c50017518329ed65a9e4829154626f008916d36295b6a3ba336e2458824c8c", size = 192070, upload-time = "2024-08-17T09:19:03.007Z" }, + { url = "https://files.pythonhosted.org/packages/1f/6d/c61e0668943a034abc3a569cdc5aeae37d686d9da7e39cf2ed621d533e36/xxhash-3.5.0-cp313-cp313-win32.whl", hash = "sha256:53a068fe70301ec30d868ece566ac90d873e3bb059cf83c32e76012c889b8637", size = 30172, upload-time = "2024-08-17T09:19:04.355Z" }, + { url = "https://files.pythonhosted.org/packages/96/14/8416dce965f35e3d24722cdf79361ae154fa23e2ab730e5323aa98d7919e/xxhash-3.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:80babcc30e7a1a484eab952d76a4f4673ff601f54d5142c26826502740e70b43", size = 30041, upload-time = "2024-08-17T09:19:05.435Z" }, + { url = "https://files.pythonhosted.org/packages/27/ee/518b72faa2073f5aa8e3262408d284892cb79cf2754ba0c3a5870645ef73/xxhash-3.5.0-cp313-cp313-win_arm64.whl", hash = "sha256:4811336f1ce11cac89dcbd18f3a25c527c16311709a89313c3acaf771def2d4b", size = 26801, upload-time = "2024-08-17T09:19:06.547Z" }, +] + +[[package]] +name = "yarl" +version = "1.20.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "multidict" }, + { name = "propcache" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3c/fb/efaa23fa4e45537b827620f04cf8f3cd658b76642205162e072703a5b963/yarl-1.20.1.tar.gz", hash = "sha256:d017a4997ee50c91fd5466cef416231bb82177b93b029906cefc542ce14c35ac", size = 186428, upload-time = "2025-06-10T00:46:09.923Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5f/9a/cb7fad7d73c69f296eda6815e4a2c7ed53fc70c2f136479a91c8e5fbdb6d/yarl-1.20.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdcc4cd244e58593a4379fe60fdee5ac0331f8eb70320a24d591a3be197b94a9", size = 133667, upload-time = "2025-06-10T00:43:44.369Z" }, + { url = "https://files.pythonhosted.org/packages/67/38/688577a1cb1e656e3971fb66a3492501c5a5df56d99722e57c98249e5b8a/yarl-1.20.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b29a2c385a5f5b9c7d9347e5812b6f7ab267193c62d282a540b4fc528c8a9d2a", size = 91025, upload-time = "2025-06-10T00:43:46.295Z" }, + { url = "https://files.pythonhosted.org/packages/50/ec/72991ae51febeb11a42813fc259f0d4c8e0507f2b74b5514618d8b640365/yarl-1.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1112ae8154186dfe2de4732197f59c05a83dc814849a5ced892b708033f40dc2", size = 89709, upload-time = "2025-06-10T00:43:48.22Z" }, + { url = "https://files.pythonhosted.org/packages/99/da/4d798025490e89426e9f976702e5f9482005c548c579bdae792a4c37769e/yarl-1.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90bbd29c4fe234233f7fa2b9b121fb63c321830e5d05b45153a2ca68f7d310ee", size = 352287, upload-time = "2025-06-10T00:43:49.924Z" }, + { url = "https://files.pythonhosted.org/packages/1a/26/54a15c6a567aac1c61b18aa0f4b8aa2e285a52d547d1be8bf48abe2b3991/yarl-1.20.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:680e19c7ce3710ac4cd964e90dad99bf9b5029372ba0c7cbfcd55e54d90ea819", size = 345429, upload-time = "2025-06-10T00:43:51.7Z" }, + { url = "https://files.pythonhosted.org/packages/d6/95/9dcf2386cb875b234353b93ec43e40219e14900e046bf6ac118f94b1e353/yarl-1.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4a979218c1fdb4246a05efc2cc23859d47c89af463a90b99b7c56094daf25a16", size = 365429, upload-time = "2025-06-10T00:43:53.494Z" }, + { url = "https://files.pythonhosted.org/packages/91/b2/33a8750f6a4bc224242a635f5f2cff6d6ad5ba651f6edcccf721992c21a0/yarl-1.20.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:255b468adf57b4a7b65d8aad5b5138dce6a0752c139965711bdcb81bc370e1b6", size = 363862, upload-time = "2025-06-10T00:43:55.766Z" }, + { url = "https://files.pythonhosted.org/packages/98/28/3ab7acc5b51f4434b181b0cee8f1f4b77a65919700a355fb3617f9488874/yarl-1.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a97d67108e79cfe22e2b430d80d7571ae57d19f17cda8bb967057ca8a7bf5bfd", size = 355616, upload-time = "2025-06-10T00:43:58.056Z" }, + { url = "https://files.pythonhosted.org/packages/36/a3/f666894aa947a371724ec7cd2e5daa78ee8a777b21509b4252dd7bd15e29/yarl-1.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8570d998db4ddbfb9a590b185a0a33dbf8aafb831d07a5257b4ec9948df9cb0a", size = 339954, upload-time = "2025-06-10T00:43:59.773Z" }, + { url = "https://files.pythonhosted.org/packages/f1/81/5f466427e09773c04219d3450d7a1256138a010b6c9f0af2d48565e9ad13/yarl-1.20.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:97c75596019baae7c71ccf1d8cc4738bc08134060d0adfcbe5642f778d1dca38", size = 365575, upload-time = "2025-06-10T00:44:02.051Z" }, + { url = "https://files.pythonhosted.org/packages/2e/e3/e4b0ad8403e97e6c9972dd587388940a032f030ebec196ab81a3b8e94d31/yarl-1.20.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:1c48912653e63aef91ff988c5432832692ac5a1d8f0fb8a33091520b5bbe19ef", size = 365061, upload-time = "2025-06-10T00:44:04.196Z" }, + { url = "https://files.pythonhosted.org/packages/ac/99/b8a142e79eb86c926f9f06452eb13ecb1bb5713bd01dc0038faf5452e544/yarl-1.20.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4c3ae28f3ae1563c50f3d37f064ddb1511ecc1d5584e88c6b7c63cf7702a6d5f", size = 364142, upload-time = "2025-06-10T00:44:06.527Z" }, + { url = "https://files.pythonhosted.org/packages/34/f2/08ed34a4a506d82a1a3e5bab99ccd930a040f9b6449e9fd050320e45845c/yarl-1.20.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c5e9642f27036283550f5f57dc6156c51084b458570b9d0d96100c8bebb186a8", size = 381894, upload-time = "2025-06-10T00:44:08.379Z" }, + { url = "https://files.pythonhosted.org/packages/92/f8/9a3fbf0968eac704f681726eff595dce9b49c8a25cd92bf83df209668285/yarl-1.20.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:2c26b0c49220d5799f7b22c6838409ee9bc58ee5c95361a4d7831f03cc225b5a", size = 383378, upload-time = "2025-06-10T00:44:10.51Z" }, + { url = "https://files.pythonhosted.org/packages/af/85/9363f77bdfa1e4d690957cd39d192c4cacd1c58965df0470a4905253b54f/yarl-1.20.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:564ab3d517e3d01c408c67f2e5247aad4019dcf1969982aba3974b4093279004", size = 374069, upload-time = "2025-06-10T00:44:12.834Z" }, + { url = "https://files.pythonhosted.org/packages/35/99/9918c8739ba271dcd935400cff8b32e3cd319eaf02fcd023d5dcd487a7c8/yarl-1.20.1-cp312-cp312-win32.whl", hash = "sha256:daea0d313868da1cf2fac6b2d3a25c6e3a9e879483244be38c8e6a41f1d876a5", size = 81249, upload-time = "2025-06-10T00:44:14.731Z" }, + { url = "https://files.pythonhosted.org/packages/eb/83/5d9092950565481b413b31a23e75dd3418ff0a277d6e0abf3729d4d1ce25/yarl-1.20.1-cp312-cp312-win_amd64.whl", hash = "sha256:48ea7d7f9be0487339828a4de0360d7ce0efc06524a48e1810f945c45b813698", size = 86710, upload-time = "2025-06-10T00:44:16.716Z" }, + { url = "https://files.pythonhosted.org/packages/8a/e1/2411b6d7f769a07687acee88a062af5833cf1966b7266f3d8dfb3d3dc7d3/yarl-1.20.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:0b5ff0fbb7c9f1b1b5ab53330acbfc5247893069e7716840c8e7d5bb7355038a", size = 131811, upload-time = "2025-06-10T00:44:18.933Z" }, + { url = "https://files.pythonhosted.org/packages/b2/27/584394e1cb76fb771371770eccad35de400e7b434ce3142c2dd27392c968/yarl-1.20.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:14f326acd845c2b2e2eb38fb1346c94f7f3b01a4f5c788f8144f9b630bfff9a3", size = 90078, upload-time = "2025-06-10T00:44:20.635Z" }, + { url = "https://files.pythonhosted.org/packages/bf/9a/3246ae92d4049099f52d9b0fe3486e3b500e29b7ea872d0f152966fc209d/yarl-1.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f60e4ad5db23f0b96e49c018596707c3ae89f5d0bd97f0ad3684bcbad899f1e7", size = 88748, upload-time = "2025-06-10T00:44:22.34Z" }, + { url = "https://files.pythonhosted.org/packages/a3/25/35afe384e31115a1a801fbcf84012d7a066d89035befae7c5d4284df1e03/yarl-1.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:49bdd1b8e00ce57e68ba51916e4bb04461746e794e7c4d4bbc42ba2f18297691", size = 349595, upload-time = "2025-06-10T00:44:24.314Z" }, + { url = "https://files.pythonhosted.org/packages/28/2d/8aca6cb2cabc8f12efcb82749b9cefecbccfc7b0384e56cd71058ccee433/yarl-1.20.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:66252d780b45189975abfed839616e8fd2dbacbdc262105ad7742c6ae58f3e31", size = 342616, upload-time = "2025-06-10T00:44:26.167Z" }, + { url = "https://files.pythonhosted.org/packages/0b/e9/1312633d16b31acf0098d30440ca855e3492d66623dafb8e25b03d00c3da/yarl-1.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59174e7332f5d153d8f7452a102b103e2e74035ad085f404df2e40e663a22b28", size = 361324, upload-time = "2025-06-10T00:44:27.915Z" }, + { url = "https://files.pythonhosted.org/packages/bc/a0/688cc99463f12f7669eec7c8acc71ef56a1521b99eab7cd3abb75af887b0/yarl-1.20.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e3968ec7d92a0c0f9ac34d5ecfd03869ec0cab0697c91a45db3fbbd95fe1b653", size = 359676, upload-time = "2025-06-10T00:44:30.041Z" }, + { url = "https://files.pythonhosted.org/packages/af/44/46407d7f7a56e9a85a4c207724c9f2c545c060380718eea9088f222ba697/yarl-1.20.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1a4fbb50e14396ba3d375f68bfe02215d8e7bc3ec49da8341fe3157f59d2ff5", size = 352614, upload-time = "2025-06-10T00:44:32.171Z" }, + { url = "https://files.pythonhosted.org/packages/b1/91/31163295e82b8d5485d31d9cf7754d973d41915cadce070491778d9c9825/yarl-1.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11a62c839c3a8eac2410e951301309426f368388ff2f33799052787035793b02", size = 336766, upload-time = "2025-06-10T00:44:34.494Z" }, + { url = "https://files.pythonhosted.org/packages/b4/8e/c41a5bc482121f51c083c4c2bcd16b9e01e1cf8729e380273a952513a21f/yarl-1.20.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:041eaa14f73ff5a8986b4388ac6bb43a77f2ea09bf1913df7a35d4646db69e53", size = 364615, upload-time = "2025-06-10T00:44:36.856Z" }, + { url = "https://files.pythonhosted.org/packages/e3/5b/61a3b054238d33d70ea06ebba7e58597891b71c699e247df35cc984ab393/yarl-1.20.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:377fae2fef158e8fd9d60b4c8751387b8d1fb121d3d0b8e9b0be07d1b41e83dc", size = 360982, upload-time = "2025-06-10T00:44:39.141Z" }, + { url = "https://files.pythonhosted.org/packages/df/a3/6a72fb83f8d478cb201d14927bc8040af901811a88e0ff2da7842dd0ed19/yarl-1.20.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1c92f4390e407513f619d49319023664643d3339bd5e5a56a3bebe01bc67ec04", size = 369792, upload-time = "2025-06-10T00:44:40.934Z" }, + { url = "https://files.pythonhosted.org/packages/7c/af/4cc3c36dfc7c077f8dedb561eb21f69e1e9f2456b91b593882b0b18c19dc/yarl-1.20.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:d25ddcf954df1754ab0f86bb696af765c5bfaba39b74095f27eececa049ef9a4", size = 382049, upload-time = "2025-06-10T00:44:42.854Z" }, + { url = "https://files.pythonhosted.org/packages/19/3a/e54e2c4752160115183a66dc9ee75a153f81f3ab2ba4bf79c3c53b33de34/yarl-1.20.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:909313577e9619dcff8c31a0ea2aa0a2a828341d92673015456b3ae492e7317b", size = 384774, upload-time = "2025-06-10T00:44:45.275Z" }, + { url = "https://files.pythonhosted.org/packages/9c/20/200ae86dabfca89060ec6447649f219b4cbd94531e425e50d57e5f5ac330/yarl-1.20.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:793fd0580cb9664548c6b83c63b43c477212c0260891ddf86809e1c06c8b08f1", size = 374252, upload-time = "2025-06-10T00:44:47.31Z" }, + { url = "https://files.pythonhosted.org/packages/83/75/11ee332f2f516b3d094e89448da73d557687f7d137d5a0f48c40ff211487/yarl-1.20.1-cp313-cp313-win32.whl", hash = "sha256:468f6e40285de5a5b3c44981ca3a319a4b208ccc07d526b20b12aeedcfa654b7", size = 81198, upload-time = "2025-06-10T00:44:49.164Z" }, + { url = "https://files.pythonhosted.org/packages/ba/ba/39b1ecbf51620b40ab402b0fc817f0ff750f6d92712b44689c2c215be89d/yarl-1.20.1-cp313-cp313-win_amd64.whl", hash = "sha256:495b4ef2fea40596bfc0affe3837411d6aa3371abcf31aac0ccc4bdd64d4ef5c", size = 86346, upload-time = "2025-06-10T00:44:51.182Z" }, + { url = "https://files.pythonhosted.org/packages/43/c7/669c52519dca4c95153c8ad96dd123c79f354a376346b198f438e56ffeb4/yarl-1.20.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:f60233b98423aab21d249a30eb27c389c14929f47be8430efa7dbd91493a729d", size = 138826, upload-time = "2025-06-10T00:44:52.883Z" }, + { url = "https://files.pythonhosted.org/packages/6a/42/fc0053719b44f6ad04a75d7f05e0e9674d45ef62f2d9ad2c1163e5c05827/yarl-1.20.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:6f3eff4cc3f03d650d8755c6eefc844edde99d641d0dcf4da3ab27141a5f8ddf", size = 93217, upload-time = "2025-06-10T00:44:54.658Z" }, + { url = "https://files.pythonhosted.org/packages/4f/7f/fa59c4c27e2a076bba0d959386e26eba77eb52ea4a0aac48e3515c186b4c/yarl-1.20.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:69ff8439d8ba832d6bed88af2c2b3445977eba9a4588b787b32945871c2444e3", size = 92700, upload-time = "2025-06-10T00:44:56.784Z" }, + { url = "https://files.pythonhosted.org/packages/2f/d4/062b2f48e7c93481e88eff97a6312dca15ea200e959f23e96d8ab898c5b8/yarl-1.20.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cf34efa60eb81dd2645a2e13e00bb98b76c35ab5061a3989c7a70f78c85006d", size = 347644, upload-time = "2025-06-10T00:44:59.071Z" }, + { url = "https://files.pythonhosted.org/packages/89/47/78b7f40d13c8f62b499cc702fdf69e090455518ae544c00a3bf4afc9fc77/yarl-1.20.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:8e0fe9364ad0fddab2688ce72cb7a8e61ea42eff3c7caeeb83874a5d479c896c", size = 323452, upload-time = "2025-06-10T00:45:01.605Z" }, + { url = "https://files.pythonhosted.org/packages/eb/2b/490d3b2dc66f52987d4ee0d3090a147ea67732ce6b4d61e362c1846d0d32/yarl-1.20.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f64fbf81878ba914562c672024089e3401974a39767747691c65080a67b18c1", size = 346378, upload-time = "2025-06-10T00:45:03.946Z" }, + { url = "https://files.pythonhosted.org/packages/66/ad/775da9c8a94ce925d1537f939a4f17d782efef1f973039d821cbe4bcc211/yarl-1.20.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f6342d643bf9a1de97e512e45e4b9560a043347e779a173250824f8b254bd5ce", size = 353261, upload-time = "2025-06-10T00:45:05.992Z" }, + { url = "https://files.pythonhosted.org/packages/4b/23/0ed0922b47a4f5c6eb9065d5ff1e459747226ddce5c6a4c111e728c9f701/yarl-1.20.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56dac5f452ed25eef0f6e3c6a066c6ab68971d96a9fb441791cad0efba6140d3", size = 335987, upload-time = "2025-06-10T00:45:08.227Z" }, + { url = "https://files.pythonhosted.org/packages/3e/49/bc728a7fe7d0e9336e2b78f0958a2d6b288ba89f25a1762407a222bf53c3/yarl-1.20.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7d7f497126d65e2cad8dc5f97d34c27b19199b6414a40cb36b52f41b79014be", size = 329361, upload-time = "2025-06-10T00:45:10.11Z" }, + { url = "https://files.pythonhosted.org/packages/93/8f/b811b9d1f617c83c907e7082a76e2b92b655400e61730cd61a1f67178393/yarl-1.20.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:67e708dfb8e78d8a19169818eeb5c7a80717562de9051bf2413aca8e3696bf16", size = 346460, upload-time = "2025-06-10T00:45:12.055Z" }, + { url = "https://files.pythonhosted.org/packages/70/fd/af94f04f275f95da2c3b8b5e1d49e3e79f1ed8b6ceb0f1664cbd902773ff/yarl-1.20.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:595c07bc79af2494365cc96ddeb772f76272364ef7c80fb892ef9d0649586513", size = 334486, upload-time = "2025-06-10T00:45:13.995Z" }, + { url = "https://files.pythonhosted.org/packages/84/65/04c62e82704e7dd0a9b3f61dbaa8447f8507655fd16c51da0637b39b2910/yarl-1.20.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:7bdd2f80f4a7df852ab9ab49484a4dee8030023aa536df41f2d922fd57bf023f", size = 342219, upload-time = "2025-06-10T00:45:16.479Z" }, + { url = "https://files.pythonhosted.org/packages/91/95/459ca62eb958381b342d94ab9a4b6aec1ddec1f7057c487e926f03c06d30/yarl-1.20.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:c03bfebc4ae8d862f853a9757199677ab74ec25424d0ebd68a0027e9c639a390", size = 350693, upload-time = "2025-06-10T00:45:18.399Z" }, + { url = "https://files.pythonhosted.org/packages/a6/00/d393e82dd955ad20617abc546a8f1aee40534d599ff555ea053d0ec9bf03/yarl-1.20.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:344d1103e9c1523f32a5ed704d576172d2cabed3122ea90b1d4e11fe17c66458", size = 355803, upload-time = "2025-06-10T00:45:20.677Z" }, + { url = "https://files.pythonhosted.org/packages/9e/ed/c5fb04869b99b717985e244fd93029c7a8e8febdfcffa06093e32d7d44e7/yarl-1.20.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:88cab98aa4e13e1ade8c141daeedd300a4603b7132819c484841bb7af3edce9e", size = 341709, upload-time = "2025-06-10T00:45:23.221Z" }, + { url = "https://files.pythonhosted.org/packages/24/fd/725b8e73ac2a50e78a4534ac43c6addf5c1c2d65380dd48a9169cc6739a9/yarl-1.20.1-cp313-cp313t-win32.whl", hash = "sha256:b121ff6a7cbd4abc28985b6028235491941b9fe8fe226e6fdc539c977ea1739d", size = 86591, upload-time = "2025-06-10T00:45:25.793Z" }, + { url = "https://files.pythonhosted.org/packages/94/c3/b2e9f38bc3e11191981d57ea08cab2166e74ea770024a646617c9cddd9f6/yarl-1.20.1-cp313-cp313t-win_amd64.whl", hash = "sha256:541d050a355bbbc27e55d906bc91cb6fe42f96c01413dd0f4ed5a5240513874f", size = 93003, upload-time = "2025-06-10T00:45:27.752Z" }, + { url = "https://files.pythonhosted.org/packages/b4/2d/2345fce04cfd4bee161bf1e7d9cdc702e3e16109021035dbb24db654a622/yarl-1.20.1-py3-none-any.whl", hash = "sha256:83b8eb083fe4683c6115795d9fc1cfaf2cbbefb19b3a1cb68f6527460f483a77", size = 46542, upload-time = "2025-06-10T00:46:07.521Z" }, +] + [[package]] name = "zipp" version = "3.21.0"