adenshulga commited on
Commit
97f90b2
·
1 Parent(s): c8745de

working pipeline

Browse files
.gitignore CHANGED
@@ -6,5 +6,11 @@ dist/
6
  wheels/
7
  *.egg-info
8
 
 
 
 
 
 
 
9
  # Virtual environments
10
  .venv
 
6
  wheels/
7
  *.egg-info
8
 
9
+ outputs
10
+
11
+ data
12
+ NOTES.md
13
+ .env
14
+
15
  # Virtual environments
16
  .venv
README.md CHANGED
@@ -1,34 +1,21 @@
1
 
2
- Upload a file or csvs with messages/comments
3
 
4
- My service cleans repetative messages(for example bot are mixed in here)
5
 
6
- анализатор комментариев которые показывают ссылки на разные но описательные комментарии(сгружаете все комменты с продукта)
7
- что должен делать:
8
- - фильтровать ботов
9
- - фильтровать спам/nsfw/не информативные оскорбления (Кластеризация по LSH, отмести ботов)
10
- - фильтрация нерелевантных комментариев и сообщений
11
- - показывать топ РАЗНЫХ по содержанию и по сентименту комментариев
12
- - суммаризатор мнений
13
 
14
- идеи для сервиса по анализу комментариев:
15
- - скор полезности комментария/сообщения
16
- - скор полезности по лайкам на маркетплейсах (контрастивно учим пары продукт-комментарии)
17
 
18
- пример:
19
- - добавить парсер озона чтобы лучше понимать отзывы про продукт? (платно)
20
 
21
- На вход ест csv?
22
 
 
23
 
24
 
25
- идеи:
26
- - детектор галлюцинаций
27
- - извлечение мнений из комментариев
28
 
 
 
 
 
29
 
30
 
31
 
32
- uv venv
33
 
34
- chmod +x container_setup/build container_setup/launch_container
 
1
 
 
2
 
 
3
 
 
 
 
 
 
 
 
4
 
 
 
 
5
 
6
+ uv venv
 
7
 
8
+ chmod +x container_setup/build container_setup/launch_container
9
 
10
+ in folder data unzip dataset
11
 
12
 
 
 
 
13
 
14
+ add .env with COMET_API_KEY, COMET_MODE=GET
15
+
16
+
17
+ chmod +x on scripts
18
 
19
 
20
 
 
21
 
 
config/pipeline_config.py ADDED
@@ -0,0 +1,68 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from dataclasses import dataclass, field
2
+
3
+ from hydra.core.config_store import ConfigStore
4
+
5
+
6
+ @dataclass
7
+ class DatasetConfig:
8
+ """Configuration for dataset preparation and preprocessing"""
9
+
10
+ val_size: float = 0.1
11
+ test_size: float = 0.1
12
+ seed: int = 42
13
+
14
+
15
+ @dataclass
16
+ class CustomTrainingArguments:
17
+ output_dir: str = "data/checkpoints"
18
+ overwrite_output_dir: bool = True
19
+ num_train_epochs: float = 10
20
+ learning_rate: float = 5e-5
21
+ lr_scheduler_type: str = "cosine"
22
+ # lr_scheduler_kwargs={},
23
+ warmup_ratio: float = 0.03125
24
+ warmup_steps: int = 10
25
+ # per_device_train_batch_size: int = 32
26
+ gradient_accumulation_steps: int = 1
27
+ log_level: str = "error"
28
+ # logging_dir="output_dir/runs/CURRENT_DATETIME_HOSTNAME" # логи для tensorboard (default)
29
+ logging_strategy: str = "steps"
30
+ logging_steps: int = 1
31
+ save_strategy: str = "best"
32
+ # save_steps=1,
33
+ save_total_limit: int = 2
34
+ save_safetensors: bool = True # safetensors вместо torch.save / torch.load
35
+ save_only_model: bool = True # сохраняем optimizer, shceduler, rng, ...
36
+ use_cpu: bool = False
37
+ seed: int = 42
38
+ # bf16=True, # использовать bf16 вместо fp32
39
+ eval_strategy: str = "epoch"
40
+ # eval_steps=32,
41
+ disable_tqdm: bool = False
42
+ load_best_model_at_end: bool = True
43
+ label_smoothing_factor: float = 0.0
44
+ optim: str = "adamw_torch"
45
+ # optim_args=...,
46
+ # resume_from_checkpoint: str = "last-checkpoint"
47
+ auto_find_batch_size: bool = True
48
+ report_to: str = "comet_ml"
49
+
50
+
51
+ @dataclass
52
+ class ModelConfig:
53
+ """Configuration for model architecture and parameters"""
54
+
55
+ model_name: str = "bert-base-uncased"
56
+
57
+
58
+ @dataclass
59
+ class PipelineConfig:
60
+ """Master configuration for the entire pipeline"""
61
+
62
+ dataset: DatasetConfig = field(default_factory=DatasetConfig)
63
+ model: ModelConfig = field(default_factory=ModelConfig)
64
+ training: CustomTrainingArguments = field(default_factory=CustomTrainingArguments)
65
+
66
+
67
+ cs = ConfigStore.instance()
68
+ cs.store(name="pipeline_config", node=PipelineConfig)
container_setup/Dockerfile CHANGED
@@ -1,4 +1,4 @@
1
- FROM python:3.12-slim
2
 
3
  ENV PYTHONDONTWRITEBYTECODE=1
4
  ENV PYTHONUNBUFFERED=1
@@ -14,25 +14,9 @@ RUN apt-get update && \
14
  tmux \
15
  unzip \
16
  build-essential \
17
- python3-dev \
18
- && rm -rf /var/lib/apt/lists/*
19
 
20
- # pkg-config \
21
- # cmake \
22
-
23
- # cargo \
24
- # RUN curl https://sh.rustup.rs -sSf | sh -s -- -y && \
25
- # source $HOME/.cargo/env && \
26
- # rustup default stable
27
-
28
- # RUN rustup install stable && rustup default stable
29
-
30
- # RUN curl https://sh.rustup.rs -sSf | sh -s -- -y && \
31
- # source $HOME/.cargo/env && \
32
- # rustup default stable
33
-
34
-
35
- # Declare build arguments before using them
36
  ARG USER_ID=1000
37
  ARG GROUP_ID=1000
38
 
@@ -40,11 +24,12 @@ ARG GROUP_ID=1000
40
  RUN addgroup --gid $GROUP_ID appgroup && \
41
  adduser --uid $USER_ID --gid $GROUP_ID --shell /bin/bash --disabled-password --gecos "" appuser
42
 
43
- # Install sudo
44
- RUN apt-get update && apt-get install -y sudo
 
45
 
46
- # Grant sudo privileges to appuser without a password
47
- RUN echo "appuser ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
48
 
49
  COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
50
 
@@ -54,19 +39,15 @@ USER appuser
54
  SHELL ["/usr/bin/fish", "-c"]
55
 
56
  WORKDIR /app
57
- # Create the virtual environment in a directory not affected by the mount
58
- # Copy requirements.txt and install dependencies
59
- # COPY --chown=appuser:appgroup requirements.txt ./
60
- # RUN uv venv && uv pip install --upgrade pip && \
61
- # uv pip install -r requirements.txt
62
 
 
63
 
64
- # Copy the entire project into the container
65
- COPY --chown=appuser:appgroup pyproject.toml ./
66
- COPY --chown=appuser:appgroup uv.lock ./
67
 
 
68
  RUN uv sync
69
 
70
  EXPOSE 8000
71
 
72
- # CMD is now managed by docker-compose to run the Fish shell
 
1
+ FROM python:3.13-slim
2
 
3
  ENV PYTHONDONTWRITEBYTECODE=1
4
  ENV PYTHONUNBUFFERED=1
 
14
  tmux \
15
  unzip \
16
  build-essential \
17
+ python3-dev && \
18
+ rm -rf /var/lib/apt/lists/*
19
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20
  ARG USER_ID=1000
21
  ARG GROUP_ID=1000
22
 
 
24
  RUN addgroup --gid $GROUP_ID appgroup && \
25
  adduser --uid $USER_ID --gid $GROUP_ID --shell /bin/bash --disabled-password --gecos "" appuser
26
 
27
+ # Install sudo and grant privileges
28
+ RUN apt-get update && apt-get install -y sudo && \
29
+ echo "appuser ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
30
 
31
+ # Create /app directory with proper ownership
32
+ RUN mkdir -p /app && chown -R appuser:appgroup /app
33
 
34
  COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
35
 
 
39
  SHELL ["/usr/bin/fish", "-c"]
40
 
41
  WORKDIR /app
 
 
 
 
 
42
 
43
+ COPY --chown=appuser:appgroup . /app
44
 
45
+ # 1) Create a dedicated venv in .venv
46
+ RUN uv venv .venv
 
47
 
48
+ # 2) Install / sync packages into that .venv
49
  RUN uv sync
50
 
51
  EXPOSE 8000
52
 
53
+ CMD ["uv", "run", "python", "entrypoints/app.py"]
container_setup/attach.sh CHANGED
@@ -0,0 +1 @@
 
 
1
+
container_setup/build.sh CHANGED
@@ -2,7 +2,7 @@
2
 
3
  source container_setup/credentials
4
 
5
- docker build -f container_setup/Dockerfile -t ${DOCKER_NAME} . \
6
  --build-arg DOCKER_NAME=${DOCKER_NAME} \
7
  --build-arg USER_ID=${DOCKER_USER_ID} \
8
- --build-arg GROUP_ID=${DOCKER_GROUP_ID}
 
2
 
3
  source container_setup/credentials
4
 
5
+ docker build --no-cache -f container_setup/Dockerfile -t ${DOCKER_NAME} . \
6
  --build-arg DOCKER_NAME=${DOCKER_NAME} \
7
  --build-arg USER_ID=${DOCKER_USER_ID} \
8
+ --build-arg GROUP_ID=${DOCKER_GROUP_ID}
container_setup/credentials CHANGED
@@ -1,8 +1,8 @@
1
  #! /bin/bash
2
 
3
- DOCKER_NAME="opinionanalyzer"
4
- CONTAINER_NAME=$USER"-opinionanalyzer"
5
- SRC="OpinionAnalyzer" # folder to propulse in docker container
6
  DOCKER_USER_ID=$(id -u) # to get these values type "id" in shell termilal
7
  DOCKER_GROUP_ID=$(id -g)
8
  CONTAINER_PORT=8001 # used in launch_container file
 
1
  #! /bin/bash
2
 
3
+ DOCKER_NAME="arxiv-papers-classification"
4
+ CONTAINER_NAME=$USER"-arxiv-papers-classification"
5
+ SRC="." # folder to propulse in docker container
6
  DOCKER_USER_ID=$(id -u) # to get these values type "id" in shell termilal
7
  DOCKER_GROUP_ID=$(id -g)
8
  CONTAINER_PORT=8001 # used in launch_container file
container_setup/launch_container.sh CHANGED
@@ -4,15 +4,14 @@ source container_setup/credentials
4
  docker run \
5
  -d \
6
  --shm-size=8g \
7
- --memory=32g \
8
- --cpuset-cpus=96-107 \
9
  --user ${DOCKER_USER_ID}:${DOCKER_GROUP_ID} \
10
  --name ${CONTAINER_NAME} \
11
  --rm \
12
  -it \
13
  --init \
14
- --gpus '"device=4"' \
15
- -v /home/${USER}/${SRC}:/app \
16
  -p ${INNER_PORT}:${CONTAINER_PORT} \
17
  ${DOCKER_NAME} \
18
  bash
 
4
  docker run \
5
  -d \
6
  --shm-size=8g \
7
+ --memory=8g \
8
+ --cpuset-cpus=0-7 \
9
  --user ${DOCKER_USER_ID}:${DOCKER_GROUP_ID} \
10
  --name ${CONTAINER_NAME} \
11
  --rm \
12
  -it \
13
  --init \
14
+ -v ${SRC}:/app \
 
15
  -p ${INNER_PORT}:${CONTAINER_PORT} \
16
  ${DOCKER_NAME} \
17
  bash
entrypoints/app.py ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # import streamlit as st
2
+
3
+ # st.title("This is a title")
4
+ # st.header("This is a header")
5
+ # st.subheader("This is a subheader")
6
+ # st.text("This is a text")
7
+ # st.markdown("# This is a markdown header 1")
8
+ # st.markdown("## This is a markdown header 2")
9
+ # st.markdown("### This is a markdown header 3")
10
+ # st.markdown("This is a markdown: *bold* **italic** `inline code` ~strikethrough~")
11
+ # st.markdown("""This is a code block with syntax highlighting
12
+ # ```python
13
+ # print("Hello world!")
14
+ # ```
15
+ # """)
16
+ # st.html(
17
+ # "image from url example with html: "
18
+ # "<img src='https://www.wallpaperflare.com/static/450/825/286/kitten-cute-animals-grass-5k-wallpaper.jpg' width=400px>",
19
+ # )
20
+
21
+
22
+ # st.write("Text with write")
23
+ # st.write(range(10))
24
+
25
+ # st.success("Success")
26
+ # st.info("Information")
27
+ # st.warning("Warning")
28
+ # st.error("Error")
29
+ # exp = ZeroDivisionError("Trying to divide by Zero")
30
+ # st.exception(exp)
31
+
32
+ # # инициализируем переменные
33
+ # st.session_state.key1 = "value1" # Attribute API
34
+ # st.session_state["key2"] = "value2" # Dictionary like API
35
+
36
+ # # посмотреть что в st.session_state
37
+ # st.write(st.session_state)
38
+
39
+ # # magic
40
+ # st.session_state
41
+
42
+ # # ошибка если неправильный ключ
43
+ # # st.write(st.session_state["missing_key"])
44
+
45
+ # import streamlit as st
46
+ # from transformers import pipeline
47
+
48
+
49
+ # @st.cache_resource # кэширование
50
+ # def load_model():
51
+ # return pipeline("sentiment-analysis") # скачивание модели
52
+
53
+
54
+ # model = load_model()
55
+
56
+ # query = st.text_input("Your query", value="I love Streamlit! 🎈")
57
+ # if query:
58
+ # result = model(query)[0] # классифицируем
59
+ # st.write(query)
60
+ # st.write(result)
entrypoints/pipeline.py ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import comet_ml # noqa: F401
2
+ import hydra
3
+ from transformers import AutoTokenizer, Trainer, TrainingArguments
4
+ from loguru import logger
5
+ from src.pipeline.arxiv_dataset import (
6
+ get_label_mappings,
7
+ load_arxiv_dataset,
8
+ prepare_arxiv_dataset,
9
+ )
10
+ from config.pipeline_config import PipelineConfig
11
+ from src.pipeline.metrics import compute_metrics
12
+ from src.pipeline.model_setup import load_model
13
+ from src.pipeline.env_setup import setup_env
14
+ from src.pipeline.logging_setup import setup_logging
15
+ from transformers.integrations import CometCallback
16
+ from transformers import DataCollatorWithPadding
17
+
18
+
19
+ @hydra.main(config_name="pipeline_config", version_base="1.2")
20
+ def main(cfg: PipelineConfig):
21
+ logger.info("Setting up environment variables")
22
+ setup_env()
23
+ logger.info("Setting up logging")
24
+ experiment = setup_logging()
25
+
26
+ tokenizer = AutoTokenizer.from_pretrained(cfg.model.model_name)
27
+ logger.info("Loading dataset")
28
+ dataset = load_arxiv_dataset()
29
+ label2id, id2label = get_label_mappings(dataset)
30
+
31
+ train_dataset, val_dataset, test_dataset = prepare_arxiv_dataset(
32
+ tokenizer=tokenizer,
33
+ cfg=cfg.dataset,
34
+ dataset=dataset,
35
+ label2id=label2id,
36
+ )
37
+ logger.info("Loading model")
38
+ model = load_model(cfg.model, label2id, id2label)
39
+ logger.info("Training model")
40
+ data_collator = DataCollatorWithPadding(tokenizer=tokenizer)
41
+ trainer = Trainer(
42
+ model=model,
43
+ args=TrainingArguments(**cfg.training), # type: ignore
44
+ train_dataset=train_dataset,
45
+ eval_dataset=val_dataset,
46
+ compute_metrics=compute_metrics,
47
+ data_collator=data_collator,
48
+ callbacks=[CometCallback()],
49
+ )
50
+
51
+ trainer.train()
52
+ logger.info("Evaluating model")
53
+ results = trainer.evaluate(test_dataset) # type: ignore
54
+ logger.info(results)
55
+ experiment.log_metrics(results)
56
+ experiment.end()
57
+
58
+
59
+ if __name__ == "__main__":
60
+ main()
main.py DELETED
@@ -1,6 +0,0 @@
1
- def main():
2
- print("Hello from opinionanalyzer!")
3
-
4
-
5
- if __name__ == "__main__":
6
- main()
 
 
 
 
 
 
 
notebooks/ML2_2025_nlp_ops1.ipynb DELETED
@@ -1,167 +0,0 @@
1
- {
2
- "cells": [
3
- {
4
- "cell_type": "markdown",
5
- "metadata": {},
6
- "source": [
7
- "# __Девопсная домашка по трансформерам__\n",
8
- "\n",
9
- "## __Описание__\n",
10
- "\n",
11
- "![img](https://d35w6hwqhdq0in.cloudfront.net/521712556725591dcacec5bbdb32e047.png)\n",
12
- "\n",
13
- "Ваш главный квест на эту домашку - сделать свой простой сервис на трансформерах. Вот прям целый сервис: начиная с данных и заканчивая графическим интерфейсом где-то в интернете. Ваш сервис может решать либо одну из предложенных ниже задач, либо любую другую (что-то более дорогое лично вам).\n",
14
- "\n",
15
- "__Стандартная задача: классификатор статей.__ Нужно построить сервис который принимает название статьи и её abstract, и выдаёт наиболее вероятную тематику статьи: скажем, физика, биология или computer science. В интерфейсе должно быть можно ввести отдельно abstract, отдельно название -- и увидеть топ-95%* тематик, отсортированных по убыванию вероятности. Если abstract не ввели, нужно классифицировать статью только по названию. Ниже вас ждут инструкции и данные именно для этой задачи.\n",
16
- "\n",
17
- "<details><summary><u> Что значит Топ-95%?</u></summary>\n",
18
- " Нужно выдавать темы по убыванию вероятности, пока их суммарная вероятность не превысит 95%. В зависимости от предсказанной вероятности, это может быть одна или более тем. Например, если модель предсказала вероятности [4%, 20%, 60%, 2%, 14%], нужно вывести 3 топ-3 класса. Если один из классов имеет вероятность 96%, достаточно вывести один этот класс.\n",
19
- "</details>\n",
20
- "\n",
21
- "Альтернативно, вы можете отважиться сделать что-то своё, на данных из интернета или своих собственных. В вашей задаче обязательно должно быть _оправданное_ использование трансформеров. Использовать ML чтобы переводить часовые пояса - плохой план.\n",
22
- "\n",
23
- "Achtung: трансформеры круты, но не всемогущи. Далеко не любую задачу можно решить ощутимо лучше рандома. Для калибровки, вот несколько примеров решаемых задач (всё кликабельно):\n",
24
- "\n",
25
- "\n",
26
- "<details><summary> - <b>[medium]</b> <u>Сгенерировать youtube-комментарии по _ссылке_ на видео</u></summary>\n",
27
- " Всё просто, юзер постит ссылку на видео - вы его комментируете. Можно заранее обусловиться что видео только на английском или на русском. Нужно сочинить _несколько_ комментариев. Kudos если вместе с основным комментарием вы порождаете юзернеймы и-или ответы на него.\n",
28
- " \n",
29
- " Датасет для файнтюна можно [взять с kaggle](https://www.kaggle.com/tanmay111/youtube-comments-sentiment-analysis/data?select=UScomments.csv) или [собрать самостоятельно](https://towardsdatascience.com/how-to-build-your-own-dataset-of-youtube-comments-39a1e57aade).\n",
30
- " \n",
31
- " В качестве основной модели можно использовать [GPT-2 large](https://huggingface.co/gpt2-large). Вот как её файнтюнить: https://tinyurl.com/gpt2-finetune-colab . Если хотите больше - можно взять что-то из творчества https://huggingface.co/EleutherAI . Например, вот [тут](https://tinyurl.com/gpt-j-8bit) есть пример как файнтюнить GPT-J-6B (в 8 раз больше gpt2-large). Однако, этим стоит заниматься уже после того, как у вас заработал базовый сценарий с GPT2-large или даже base.\n",
32
- " \n",
33
- " В итоговом сервисе ��ожно дать пользователю вариировать параметры генерации: температура или top-p, если сэмплинг; beam size и length penalty, если beam search; сколько комментариев сгенерировать, etc. Отдельный респект если ваш код будет выводить комментарий по одному слову, прямо в процессе генерёжки - чтобы пользователь не ждал пока вы настругаете абзац целиком.\n",
34
- "</details>\n",
35
- "\n",
36
- "<details><summary> - <b>[medium]</b> <u>Предсказать зарплату по профилю (симулятор Дудя).</u></summary>\n",
37
- " Note: <details> <summary>Причём тут Дудь?</summary> <img src=https://www.meme-arsenal.com/memes/6dd85f126bbab4f9774ced71ffadbcb3.jpg> </details>\n",
38
- " \n",
39
- " Главная сложность задачи - достать хорошие данные. Если хороших данных не случилось - можно и трешовые :) Задание всё-таки про технологии а не про продукт. Для начала можно взять подмножество фичей [отсюда](https://www.kaggle.com/c/job-salary-prediction/data), которые вы можете восстановить из профиля linkedin - название профессии и компании. Название компании лучше заменить на фичи из открытых источников: сфера деятельности, размер, етц.\n",
40
- " \n",
41
- " А дальше файнтюним на этом BERT / T5 и радуемся. Ну или хотя бы смеёмся.\n",
42
- "</details>\n",
43
- "\n",
44
- "\n",
45
- "<details><summary> - <b>[hard]</b> <u>Мнения с географической окраской.</u></summary>\n",
46
- " \n",
47
- " Сервис который принимает на вход тему (хэштег или ключевую фразу) и рисует карту мира, где в каждом регионе показано, с какой эмоциональной окраской о ней высказываются в социальных сетях. В качестве социальной сети можно взять VK/twitter, в случая VK ожидается детализация не по странам, а по городам стран бывшего СССР.\n",
48
- " \n",
49
- " В минимальном варианте достаточно определять тональность твита в режиме \"позитивно-негативно\", зафайнтюнив условный BERT/T5 на одном из десятков {vk/twitter} sentiment classification датасетах. Географическую привязку можно получить из профиля пользователя. А дальше осталось собрать данные по странам и регионам.\n",
50
- "\n",
51
- "</details>\n",
52
- "\n",
53
- "\n",
54
- "<details><summary> - <b>[very hard]</b> <u>Найти статью википедии по фото предмета статьи</u></summary>\n",
55
- "\n",
56
- " Чтобы можно было сфотать какую-нибудь неведомую чешуйню на телефон и получить сумму человеческих знаний о ней в форме вики-статьи.\n",
57
- " \n",
58
- " В качестве функции потерь можно использовать contrastive loss. Этот лосс неплохо описан в статье [CLIP](https://arxiv.org/abs/2103.00020). Вместо обучения с нуля предлагается взять, собственно, CLIP (text transformer + image transformer) отсюда: https://huggingface.co/docs/transformers/model_doc/clip. Модель будет сопоставлять каждой статьи и \n",
59
- " \n",
60
- " Данные для этого квеста можно собрать через API википедии: вики-статьи о предметах обычно содержит фото этого объекта и, собственно, текст статьи. Советуем собрать как минимум 10^4 пар картинка-статья. Картинки советуем дополнительно аугментировать как минимум стандартными картиночными аугами, как максимум - поиском похожих картинок в интернете / imagenet-е по тому же CLIP image encoder-у, но с исходными весами.\n",
61
- " \n",
62
- " На время отладки интерфейса рекомендуем ограничить��я небольшим списком статьей: условно, кошечки, собачки, птички, гаечные ключи, машины. Как станет понятно что оно работает \"на кошках\", можно расширить этот список до \"всех статей таких-то категорий\". Эмбединги статей лучше предпосчитать в файл. Если долго их перебирать - можно (но необязательно) воспользоваться быстрым поиском соседей, e.g. [faiss](https://github.com/facebookresearch/faiss) HNSW.\n",
63
- "</details>\n",
64
- "\n",
65
- "\n",
66
- "## __Как научить классификатор статей?__\n",
67
- "\n",
68
- "Данные для классификации статей можно скачать, например, [отсюда](https://www.kaggle.com/neelshah18/arxivdataset/). В этих данных есть заголовок и abstract статьи, а ещё поле __\"tag\"__: тематика статьи [по таксономии arxiv.org](https://arxiv.org/category_taxonomy). Вы можете расширить выборку, добавив в неё статьи за 2019-н.в. годы. Для этого можно [использовать arxiv API](https://github.com/lukasschwab/arxiv.py), самостоятельно распарсить arxiv с помощью [beautifulsoup](https://pypi.org/project/beautifulsoup4/), или поискать другие датасеты на kaggle, huggingface, etc.\n",
69
- "\n",
70
- "Когда данные собраны (и аккуратно нарезаны на train/test), можно что-нибудь и обучить. Мы советуем использовать для этого библиотеку `transformers`. Советуем, но не заставляем: если хочется, можно взять [fairseq roberta](https://github.com/pytorch/fairseq/blob/main/examples/roberta), [google t5](https://github.com/google-research/text-to-text-transfer-transformer) или даже написать всё с нуля.\n",
71
- "\n",
72
- "Мы разбирали transformers на [семинаре](https://lk.yandexdataschool.ru/courses/2025-spring/7.1332-machine-learning-2/classes/13138/), за любой дополнительной информацией - смотрите [документации HF](https://huggingface.co/docs).\n",
73
- "\n",
74
- "Начать лучше с простой модели, такой как [`distilbert-base-cased`](https://huggingface.co/distilbert-base-cased). Когда вы будете понимать, какие значения accuracy ожидать от базовой модели, можно поискать что-то получше. Два очевидных направления улучшения: (1) сильнее модель T5 или deberta v3, или (2) близкие данные, например взять модель которую предобучили на том же arxiv. И то и другое удобно [искать здесь](https://huggingface.co/models).\n",
75
- "\n",
76
- "## __Научили, и что теперь?__\n",
77
- "\n",
78
- "А теперь нужно сделать так, чтобы ваша обученная модель отвечала на запросы в интернете. Как и на прошлом этапе, вы можете сделать это кучей разных способов: от простого [streamlit](https://streamlit.io/) / [gradio](https://gradio.app/), минуя [TorchServe](https://pytorch.org/serve/) с [Triton/TensorRT](https://developer.nvidia.com/nvidia-triton-inference-server), и заканчивая экспортом модели в javascript с помощью [TensorFlow.js](https://www.tensorflow.org/js/tutorials) / [ONNX.js](https://github.com/elliotwaite/pytorch-to-javascript-with-onnx-js).\n",
79
- "\n",
80
- "На [семинаре](https://lk.yandexdataschool.ru/courses/2025-spring/7.1332-machine-learning-2/classes/13138/) мы разбирали основные вещи про то как работает streamlit и как сделать простое приложение с его помощью.\n",
81
- "\n",
82
- "Общая идея streamlit: вы [описываете](https://docs.streamlit.io/library/get-started/create-an-app) внешний вид приложения на питоне с помощью примитивов (кнопки, поля, любой html) -- а потом этот код выполняется на сервере и обслуживает каждого пользователя в отдельном процессе.\n",
83
- "\n",
84
- "__Для отладки__ можно запустить приложение локально, открыв консоль рядом с app.py:\n",
85
- "* `pip install streamlit`\n",
86
- "* `streamlit run app.py --server.port 8080`\n",
87
- "* открыть в браузере localhost:8080, если он не открылся автоматически\n",
88
- "\n",
89
- "\n",
90
- "## __Deployment time!__\n",
91
- "\n",
92
- "В этот раз вам нужно не просто написать код, __но и поднять ваше приложение с доступом из интернета__. И да, вы угадали, это можно сделать несколькими способами: [HuggingFace spaces](https://huggingface.co/spaces) (данный способ разбирали на [семинаре](https://lk.yandexdataschool.ru/courses/2025-spring/7.1332-machine-learning-2/classes/13138/)), [Streamlit Cloud](https://streamlit.io/cloud), а ещё вы можете купить или арендовать свой собственный сервер и захоститься там.\n",
93
- "\n",
94
- "Проще всего захостить на HF spaces, для этого вам нужно [зарегистрироваться](https://huggingface.co/join) и найти [меню создания нового приложения](https://huggingface.co/new-space). Название и лицензию можно выбрать на своё усмотрение, главное чтобы Space SDK был Streamlit, а доступ - public.\n",
95
- "\n",
96
- "Как создали - можно редактировать ваше приложение прямо на сайте, для этого откройте приложение и перейдите в Files and versions, и там в правом углу добавьте нужные файлы.\n",
97
- "\n",
98
- "На минималках вам потребуется 2 файла:\n",
99
- "- `app.py`, о котором мы говорили выше\n",
100
- "- `requirements.txt`, где вы укажете нужные вам библиотеки\n",
101
- "\n",
102
- "Вы можете разместить там же веса вашей обученной модели, любые необходимые данные, дополнительные файлы, ...\n",
103
- "\n",
104
- "После каждого изменения файлов, ваше приложение соберётся (обычно 1-5 минут) и будет доступно уже во вкладке App. Ну или не соберётся и покажет вам, где оно сломалось. И вуаля, теперь у вас есть ссылка, которую можно показать ~друзьям~ ассистентам курса и кому угодно в интернете.\n",
105
- "\n",
106
- "__Удобная работа с кодом.__ Пока у вас 2 файла, их легко редактивровать прямо в интерфейсе HF spaces. Если же у вас дюжина файлов, вам может быть удобнее редактировать их в любимом vscode/pycharm/.../emacs. Чтобы это не вызывало мучений, можно пользоваться HF spaces как git репозиторием ([подробности тут](https://huggingface.co/docs/hub/spaces#manage-app-with-github-actions)).\n",
107
- "\n",
108
- "## __Что нужно сдать__\n",
109
- "\n",
110
- "Вы сдаёте проект, который будет проверяться вручную, то что ожидается от каждого проекта:\n",
111
- "- Текстовое сопровождение вашего конкретного проекта в любом удобно читаемом формате (pdf, html, текст в lk, ...) - что за задачу вы решали, где/как брали данные, какие использовали модели, какие проводили эксперименты, ...\n",
112
- "- Ссылка на веб интерфейс, где можно протестировать демо вашего проекта - обязательно проверяйте что работает не только у вас (с другого устройства и из под incognito режима)\n",
113
- "- Код обучения вашей модели (желательно ipynb с заполненными ячейками и не стёртыми выходами, переведённый в pdf / html), но если вы обучали не в ноутбуке, то сдавайте код в виде файла / архива файлов / git ссылки с readme.md описанием того как именно проходило обучение с помощью этого кода.\n",
114
- "\n",
115
- "## __Оценка__\n",
116
- "\n",
117
- "Мы будем оценивать проект целиком, включая идею и реализацию. Максимум за проект можно получить 10 баллов, но мы оставляем ещё до 5 баллов, котор��е можем выдать как бонусные за особенно интересные и качественно реализованные проекты.\n",
118
- "\n",
119
- "### __Тонкие места, за которые могут быть снижения баллов:__\n",
120
- "\n",
121
- "__1. Скорость работы.__\n",
122
- "\n",
123
- "По умолчанию, streamlit будет выполняет весь ваш код на каждое действие пользователя. То есть всякий раз, когда пользователь меняет что-то в тексте, оно будет заново загружать модель. Чтобы исправить это безобразие, вы можете закэшировать подготовленную модель в `@st.cache`. Подробности в [семинаре](https://lk.yandexdataschool.ru/courses/2025-spring/7.1332-machine-learning-2/classes/13138/), а также [читайте тут](https://docs.streamlit.io/library/advanced-features/caching).\n",
124
- "\n",
125
- "__Как будет оцениваться:__\n",
126
- "\n",
127
- "Вы не обязаны пользоваться кэшированием, но ваше приложение не должно неоправдано тормозить дольше, чем на 3 секунды. \"Оправданые\" тормоза это те, которые вы явно оправдали текстом в ЛМС :)\n",
128
- "\n",
129
- "-----\n",
130
- "\n",
131
- "__2. Понятный фронтенд.__\n",
132
- "\n",
133
- "Наколеночный графический интерфейс с семинара - пример того, как скорее не надо делать интерфейс приложения. Как надо - сложный вопрос, причём настолько сложный, что есть даже [Школа Разработки Интерфейсов](https://academy.yandex.ru/schools/frontend). Но для начала:\n",
134
- "\n",
135
- "- Выводить нужно человекочитаемый текст, а не просто JSON с индексами и метаданными.\n",
136
- "- Пользователю должно быть понятно, куда и какие данные вводить. Пустые текстовые поля в вакууме - плохой тон.\n",
137
- "- Сервис не должен падать с не_отловленными ошибками. Даже если пользователь введёт неправильные/пустые данные, нужно это обработать и написать, где произошла ошибка.\n",
138
- "\n",
139
- "__Как будет оцениваться:__\n",
140
- "\n",
141
- "Для полного балла достаточно соблюсти эти три правила и специально не стрелять себе в ногу.\n",
142
- "\n",
143
- "-----\n",
144
- "\n",
145
- "__3. Код обучения и инференса.__\n",
146
- "\n",
147
- "Сдавая проект мы будем также получать от вас код проекта (как обучения ваших моделей, так и код веб интерфейса).\n",
148
- "\n",
149
- "__Как будет оцениваться:__\n",
150
- "\n",
151
- "Код не будет отдельно проверяться как часть задания, поэтому пишите как хотите, однако - в спорных ситуациях мы оставляем за собой право проверить ваш код, за чем могут последовать потенциальные снижения баллов при любых нарушениях.\n"
152
- ]
153
- },
154
- {
155
- "cell_type": "markdown",
156
- "metadata": {},
157
- "source": []
158
- }
159
- ],
160
- "metadata": {
161
- "language_info": {
162
- "name": "python"
163
- }
164
- },
165
- "nbformat": 4,
166
- "nbformat_minor": 2
167
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
pyproject.toml CHANGED
@@ -1,15 +1,22 @@
1
  [project]
2
- name = "opinionanalyzer"
3
  version = "0.1.0"
4
  description = "Add your description here"
5
  readme = "README.md"
6
  requires-python = ">=3.13"
7
  dependencies = [
8
  "accelerate>=1.6.0",
 
9
  "datasets>=3.5.0",
10
  "evaluate>=0.4.3",
 
 
11
  "ipykernel>=6.29.5",
 
 
 
12
  "scikit-learn>=1.6.1",
 
13
  "torch>=2.6.0",
14
  "transformers>=4.50.3",
15
  ]
 
1
  [project]
2
+ name = "arxiv-papers-classification"
3
  version = "0.1.0"
4
  description = "Add your description here"
5
  readme = "README.md"
6
  requires-python = ">=3.13"
7
  dependencies = [
8
  "accelerate>=1.6.0",
9
+ "comet-ml>=3.49.7",
10
  "datasets>=3.5.0",
11
  "evaluate>=0.4.3",
12
+ "huggingface-hub[hf-xet]>=0.30.1",
13
+ "hydra-core>=1.3.2",
14
  "ipykernel>=6.29.5",
15
+ "ipywidgets>=8.1.5",
16
+ "loguru>=0.7.3",
17
+ "python-dotenv>=1.1.0",
18
  "scikit-learn>=1.6.1",
19
+ "streamlit>=1.44.1",
20
  "torch>=2.6.0",
21
  "transformers>=4.50.3",
22
  ]
scripts/launch_app.sh ADDED
File without changes
scripts/pipeline.sh ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+
3
+ export PYTHONPATH='.'
4
+
5
+ source .venv/bin/activate
6
+
7
+ python entrypoints/pipeline.py
src/pipeline/arxiv_dataset.py ADDED
@@ -0,0 +1,162 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import typing as tp
2
+ from collections.abc import Mapping
3
+
4
+ import pandas as pd
5
+ from datasets import Dataset
6
+ from transformers import PreTrainedTokenizerBase
7
+ from config.pipeline_config import DatasetConfig
8
+ from loguru import logger
9
+ import ast
10
+ import string
11
+
12
+
13
+ class ArxivTag(tp.TypedDict):
14
+ term: str
15
+ scheme: str
16
+
17
+
18
+ class ArxivPaper(tp.TypedDict):
19
+ summary: str
20
+ tag: str
21
+ title: str
22
+
23
+
24
+ def load_arxiv_dataset() -> Dataset:
25
+ df = pd.read_json("data/arxivData.json").head(100)
26
+ dataset = Dataset.from_pandas(df[["summary", "tag", "title"]])
27
+ return dataset
28
+
29
+
30
+ def multihot_encode_tags(
31
+ tags: list[str], label_mapping: Mapping[str, int]
32
+ ) -> list[float]:
33
+ num_labels = len(label_mapping)
34
+ labels = [0.0] * num_labels
35
+
36
+ for tag in tags:
37
+ if tag in label_mapping:
38
+ labels[label_mapping[tag]] = 1.0
39
+
40
+ return labels
41
+
42
+
43
+ def generate_preprocessing_function(
44
+ tokenizer: PreTrainedTokenizerBase,
45
+ label_mapping: Mapping[str, int],
46
+ ):
47
+ def preprocess_arxiv_dataset(row: ArxivPaper):
48
+ text = row["title"] + " " + row["summary"]
49
+
50
+ tokenized_text = tokenizer(
51
+ text,
52
+ truncation=True,
53
+ padding="max_length",
54
+ )
55
+
56
+ tags_list: list[ArxivTag] = ast.literal_eval(row["tag"])
57
+
58
+ tags = [tag["term"] for tag in tags_list]
59
+ tokenized_text["labels"] = multihot_encode_tags(tags, label_mapping)
60
+
61
+ return tokenized_text
62
+
63
+ return preprocess_arxiv_dataset
64
+
65
+
66
+ def get_label_mappings(dataset: Dataset) -> tuple[dict[str, int], dict[int, str]]:
67
+ """
68
+ Create label mappings from dataset
69
+
70
+ Args:
71
+ dataset: Dataset containing tag information
72
+
73
+ Returns:
74
+ tuple containing:
75
+ - label2id: Mapping from label names to indices
76
+ - id2label: Mapping from indices to label names
77
+ """
78
+ all_tags = set()
79
+ for idx in range(len(dataset)):
80
+ example = dataset[idx]
81
+ tags_list: list[ArxivTag] = ast.literal_eval(example["tag"])
82
+ for tag in tags_list:
83
+ if not any(digit in tag["term"] for digit in string.digits):
84
+ all_tags.add(tag["term"])
85
+
86
+ logger.info(f"Found {len(all_tags)} unique tags")
87
+
88
+ label2id = {tag: idx for idx, tag in enumerate(sorted(all_tags))}
89
+ id2label = {idx: tag for tag, idx in label2id.items()}
90
+
91
+ return label2id, id2label
92
+
93
+
94
+ def train_val_test_split(
95
+ dataset: Dataset, cfg: DatasetConfig
96
+ ) -> tuple[Dataset, Dataset, Dataset]:
97
+ """
98
+ Split dataset into train, validation and test sets
99
+
100
+ Args:
101
+ dataset: Dataset to split
102
+ cfg: Dataset configuration containing split parameters
103
+
104
+ Returns:
105
+ tuple containing train, validation and test datasets
106
+ """
107
+ shuffled_dataset = dataset.shuffle(seed=cfg.seed)
108
+
109
+ train_temp = shuffled_dataset.train_test_split(
110
+ test_size=cfg.val_size + cfg.test_size
111
+ )
112
+
113
+ remaining_test_ratio = cfg.test_size / (cfg.val_size + cfg.test_size)
114
+ val_test = train_temp["test"].train_test_split(test_size=remaining_test_ratio)
115
+
116
+ train_dataset = train_temp["train"]
117
+ val_dataset = val_test["train"]
118
+ test_dataset = val_test["test"]
119
+
120
+ logger.info(
121
+ f"Split dataset: train={len(train_dataset)}, val={len(val_dataset)}, test={len(test_dataset)}"
122
+ )
123
+
124
+ return train_dataset, val_dataset, test_dataset
125
+
126
+
127
+ def prepare_arxiv_dataset(
128
+ tokenizer: PreTrainedTokenizerBase,
129
+ cfg: DatasetConfig,
130
+ dataset: Dataset,
131
+ label2id: dict[str, int],
132
+ ) -> tuple[Dataset, Dataset, Dataset]:
133
+ """
134
+ Load arxiv dataset, preprocess it and return train/validation/test split
135
+
136
+ Args:
137
+ tokenizer: Tokenizer to use for text processing
138
+ cfg: Dataset configuration
139
+ dataset: Optional pre-loaded dataset, will load if None
140
+ label2id: Optional pre-computed label mapping, will create if None
141
+
142
+ Returns:
143
+ tuple containing:
144
+ - train dataset
145
+ - validation dataset
146
+ - test dataset
147
+ """
148
+
149
+ preprocess_fn = generate_preprocessing_function(
150
+ tokenizer=tokenizer,
151
+ label_mapping=label2id,
152
+ )
153
+
154
+ processed_dataset = dataset.map(
155
+ preprocess_fn, remove_columns=["summary", "tag", "title"]
156
+ )
157
+
158
+ return train_val_test_split(processed_dataset, cfg)
159
+
160
+
161
+ def invert_label_mapping(label_mapping: Mapping[str, int]) -> dict[int, str]:
162
+ return {idx: label for label, idx in label_mapping.items()}
src/pipeline/env_setup.py ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from dotenv import load_dotenv
2
+ import os
3
+
4
+ REQUIRED_ENV_VARS = ["COMET_API_KEY", "COMET_MODE"]
5
+
6
+
7
+ def setup_env():
8
+ load_dotenv()
9
+ for var in REQUIRED_ENV_VARS:
10
+ if os.getenv(var) is None:
11
+ raise ValueError(f"Environment variable {var} is not set")
src/pipeline/logging_setup.py ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from comet_ml import Experiment
2
+ import os
3
+
4
+
5
+ def setup_logging():
6
+ experiment = Experiment(
7
+ api_key=os.getenv("COMET_API_KEY"),
8
+ project_name="arxiv-papers-classification",
9
+ auto_output_logging="simple",
10
+ )
11
+
12
+ return experiment
src/pipeline/metrics.py ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import evaluate
2
+ import numpy as np
3
+
4
+ clf_metrics = evaluate.combine(["accuracy", "f1", "precision", "recall"])
5
+
6
+
7
+ def sigmoid(x):
8
+ return 1 / (1 + np.exp(-x))
9
+
10
+
11
+ def compute_metrics(eval_pred):
12
+ predictions, labels = eval_pred
13
+ predictions = sigmoid(predictions)
14
+ predictions = (predictions > 0.5).astype(int).reshape(-1)
15
+ return clf_metrics.compute(
16
+ predictions=predictions, references=labels.astype(int).reshape(-1)
17
+ )
src/pipeline/model_setup.py ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from transformers import AutoModelForSequenceClassification, PreTrainedModel
2
+ from config.pipeline_config import ModelConfig
3
+ import typing as tp
4
+
5
+
6
+ def load_model(
7
+ config: ModelConfig, label2id: tp.Mapping[str, int], id2label: tp.Mapping[int, str]
8
+ ) -> PreTrainedModel:
9
+ model = AutoModelForSequenceClassification.from_pretrained(
10
+ config.model_name,
11
+ num_labels=len(label2id),
12
+ label2id=label2id,
13
+ id2label=id2label,
14
+ problem_type="multi_label_classification",
15
+ )
16
+ return model
uv.lock CHANGED
@@ -74,6 +74,28 @@ wheels = [
74
  { url = "https://files.pythonhosted.org/packages/ec/6a/bc7e17a3e87a2985d3e8f4da4cd0f481060eb78fb08596c42be62c90a4d9/aiosignal-1.3.2-py2.py3-none-any.whl", hash = "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5", size = 7597 },
75
  ]
76
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
77
  [[package]]
78
  name = "appnope"
79
  version = "0.1.4"
@@ -83,6 +105,45 @@ wheels = [
83
  { url = "https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c", size = 4321 },
84
  ]
85
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
86
  [[package]]
87
  name = "asttokens"
88
  version = "3.0.0"
@@ -101,6 +162,24 @@ wheels = [
101
  { url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815 },
102
  ]
103
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
104
  [[package]]
105
  name = "certifi"
106
  version = "2025.1.31"
@@ -154,6 +233,18 @@ wheels = [
154
  { url = "https://files.pythonhosted.org/packages/0e/f6/65ecc6878a89bb1c23a086ea335ad4bf21a588990c3f535a227b9eea9108/charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", size = 49767 },
155
  ]
156
 
 
 
 
 
 
 
 
 
 
 
 
 
157
  [[package]]
158
  name = "colorama"
159
  version = "0.4.6"
@@ -163,6 +254,32 @@ wheels = [
163
  { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 },
164
  ]
165
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
166
  [[package]]
167
  name = "comm"
168
  version = "0.2.2"
@@ -175,6 +292,15 @@ wheels = [
175
  { url = "https://files.pythonhosted.org/packages/e6/75/49e5bfe642f71f272236b5b2d2691cf915a7283cc0ceda56357b61daa538/comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3", size = 7180 },
176
  ]
177
 
 
 
 
 
 
 
 
 
 
178
  [[package]]
179
  name = "datasets"
180
  version = "3.5.0"
@@ -231,6 +357,24 @@ wheels = [
231
  { url = "https://files.pythonhosted.org/packages/c9/7a/cef76fd8438a42f96db64ddaa85280485a9c395e7df3db8158cfec1eee34/dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7", size = 116252 },
232
  ]
233
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
234
  [[package]]
235
  name = "evaluate"
236
  version = "0.4.3"
@@ -253,6 +397,20 @@ wheels = [
253
  { url = "https://files.pythonhosted.org/packages/a2/e7/cbca9e2d2590eb9b5aa8f7ebabe1beb1498f9462d2ecede5c9fd9735faaf/evaluate-0.4.3-py3-none-any.whl", hash = "sha256:47d8770bdea76e2c2ed0d40189273027d1a41ccea861bcc7ba12d30ec5d1e517", size = 84010 },
254
  ]
255
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
256
  [[package]]
257
  name = "executing"
258
  version = "2.2.0"
@@ -309,6 +467,45 @@ http = [
309
  { name = "aiohttp" },
310
  ]
311
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
312
  [[package]]
313
  name = "huggingface-hub"
314
  version = "0.30.1"
@@ -327,6 +524,25 @@ wheels = [
327
  { url = "https://files.pythonhosted.org/packages/99/e3/2232d0e726d4d6ea69643b9593d97d0e7e6ea69c2fe9ed5de34d476c1c47/huggingface_hub-0.30.1-py3-none-any.whl", hash = "sha256:0f6aa5ec5a4e68e5b9e45d556b4e5ea180c58f5a5ffa734e7f38c9d573028959", size = 481170 },
328
  ]
329
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
330
  [[package]]
331
  name = "idna"
332
  version = "3.10"
@@ -393,6 +609,22 @@ wheels = [
393
  { url = "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074 },
394
  ]
395
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
396
  [[package]]
397
  name = "jedi"
398
  version = "0.19.2"
@@ -426,6 +658,33 @@ wheels = [
426
  { url = "https://files.pythonhosted.org/packages/91/29/df4b9b42f2be0b623cbd5e2140cafcaa2bef0759a00b7b70104dcfe2fb51/joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6", size = 301817 },
427
  ]
428
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
429
  [[package]]
430
  name = "jupyter-client"
431
  version = "8.6.3"
@@ -456,6 +715,40 @@ wheels = [
456
  { url = "https://files.pythonhosted.org/packages/c9/fb/108ecd1fe961941959ad0ee4e12ee7b8b1477247f30b1fdfd83ceaf017f0/jupyter_core-5.7.2-py3-none-any.whl", hash = "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409", size = 28965 },
457
  ]
458
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
459
  [[package]]
460
  name = "markupsafe"
461
  version = "3.0.2"
@@ -496,6 +789,15 @@ wheels = [
496
  { url = "https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca", size = 9899 },
497
  ]
498
 
 
 
 
 
 
 
 
 
 
499
  [[package]]
500
  name = "mpmath"
501
  version = "1.3.0"
@@ -560,6 +862,15 @@ wheels = [
560
  { url = "https://files.pythonhosted.org/packages/da/d9/f7f9379981e39b8c2511c9e0326d212accacb82f12fbfdc1aa2ce2a7b2b6/multiprocess-0.70.16-py39-none-any.whl", hash = "sha256:a0bafd3ae1b732eac64be2e72038231c1ba97724b60b09400d68f229fcc2fbf3", size = 133351 },
561
  ]
562
 
 
 
 
 
 
 
 
 
 
563
  [[package]]
564
  name = "nest-asyncio"
565
  version = "1.6.0"
@@ -725,28 +1036,16 @@ wheels = [
725
  ]
726
 
727
  [[package]]
728
- name = "opinionanalyzer"
729
- version = "0.1.0"
730
- source = { virtual = "." }
731
  dependencies = [
732
- { name = "accelerate" },
733
- { name = "datasets" },
734
- { name = "evaluate" },
735
- { name = "ipykernel" },
736
- { name = "scikit-learn" },
737
- { name = "torch" },
738
- { name = "transformers" },
739
  ]
740
-
741
- [package.metadata]
742
- requires-dist = [
743
- { name = "accelerate", specifier = ">=1.6.0" },
744
- { name = "datasets", specifier = ">=3.5.0" },
745
- { name = "evaluate", specifier = ">=0.4.3" },
746
- { name = "ipykernel", specifier = ">=6.29.5" },
747
- { name = "scikit-learn", specifier = ">=1.6.1" },
748
- { name = "torch", specifier = ">=2.6.0" },
749
- { name = "transformers", specifier = ">=4.50.3" },
750
  ]
751
 
752
  [[package]]
@@ -806,6 +1105,33 @@ wheels = [
806
  { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772 },
807
  ]
808
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
809
  [[package]]
810
  name = "platformdirs"
811
  version = "4.3.7"
@@ -868,6 +1194,20 @@ wheels = [
868
  { url = "https://files.pythonhosted.org/packages/b8/d3/c3cb8f1d6ae3b37f83e1de806713a9b3642c5895f0215a62e1a4bd6e5e34/propcache-0.3.1-py3-none-any.whl", hash = "sha256:9a8ecf38de50a7f518c21568c80f985e776397b902f1ce0b01f799aba1608b40", size = 12376 },
869
  ]
870
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
871
  [[package]]
872
  name = "psutil"
873
  version = "7.0.0"
@@ -931,6 +1271,19 @@ wheels = [
931
  { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552 },
932
  ]
933
 
 
 
 
 
 
 
 
 
 
 
 
 
 
934
  [[package]]
935
  name = "pygments"
936
  version = "2.19.1"
@@ -940,6 +1293,15 @@ wheels = [
940
  { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293 },
941
  ]
942
 
 
 
 
 
 
 
 
 
 
943
  [[package]]
944
  name = "python-dateutil"
945
  version = "2.9.0.post0"
@@ -952,6 +1314,15 @@ wheels = [
952
  { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892 },
953
  ]
954
 
 
 
 
 
 
 
 
 
 
955
  [[package]]
956
  name = "pytz"
957
  version = "2025.2"
@@ -1018,6 +1389,19 @@ wheels = [
1018
  { url = "https://files.pythonhosted.org/packages/87/88/0236056156da0278c9ca2e2562463643597808b5bbd6c34009ba217e7e92/pyzmq-26.3.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:d015efcd96aca8882057e7e6f06224f79eecd22cad193d3e6a0a91ec67590d1f", size = 1398401 },
1019
  ]
1020
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1021
  [[package]]
1022
  name = "regex"
1023
  version = "2024.11.6"
@@ -1056,6 +1440,65 @@ wheels = [
1056
  { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 },
1057
  ]
1058
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1059
  [[package]]
1060
  name = "safetensors"
1061
  version = "0.5.3"
@@ -1130,6 +1573,28 @@ wheels = [
1130
  { url = "https://files.pythonhosted.org/packages/0a/c8/b3f566db71461cabd4b2d5b39bcc24a7e1c119535c8361f81426be39bb47/scipy-1.15.2-cp313-cp313t-win_amd64.whl", hash = "sha256:fe8a9eb875d430d81755472c5ba75e84acc980e4a8f6204d402849234d3017db", size = 40477705 },
1131
  ]
1132
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1133
  [[package]]
1134
  name = "setuptools"
1135
  version = "78.1.0"
@@ -1139,6 +1604,28 @@ wheels = [
1139
  { url = "https://files.pythonhosted.org/packages/54/21/f43f0a1fa8b06b32812e0975981f4677d28e0f3271601dc88ac5a5b83220/setuptools-78.1.0-py3-none-any.whl", hash = "sha256:3e386e96793c8702ae83d17b853fb93d3e09ef82ec62722e61da5cd22376dcd8", size = 1256108 },
1140
  ]
1141
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1142
  [[package]]
1143
  name = "six"
1144
  version = "1.17.0"
@@ -1148,6 +1635,15 @@ wheels = [
1148
  { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050 },
1149
  ]
1150
 
 
 
 
 
 
 
 
 
 
1151
  [[package]]
1152
  name = "stack-data"
1153
  version = "0.6.3"
@@ -1162,6 +1658,35 @@ wheels = [
1162
  { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521 },
1163
  ]
1164
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1165
  [[package]]
1166
  name = "sympy"
1167
  version = "1.13.1"
@@ -1174,6 +1699,15 @@ wheels = [
1174
  { url = "https://files.pythonhosted.org/packages/b2/fe/81695a1aa331a842b582453b605175f419fe8540355886031328089d840a/sympy-1.13.1-py3-none-any.whl", hash = "sha256:db36cdc64bf61b9b24578b6f7bab1ecdd2452cf008f34faa33776680c26d66f8", size = 6189177 },
1175
  ]
1176
 
 
 
 
 
 
 
 
 
 
1177
  [[package]]
1178
  name = "threadpoolctl"
1179
  version = "3.6.0"
@@ -1208,6 +1742,15 @@ wheels = [
1208
  { url = "https://files.pythonhosted.org/packages/e6/b6/072a8e053ae600dcc2ac0da81a23548e3b523301a442a6ca900e92ac35be/tokenizers-0.21.1-cp39-abi3-win_amd64.whl", hash = "sha256:0f0dcbcc9f6e13e675a66d7a5f2f225a736745ce484c1a4e07476a89ccdad382", size = 2435481 },
1209
  ]
1210
 
 
 
 
 
 
 
 
 
 
1211
  [[package]]
1212
  name = "torch"
1213
  version = "2.6.0"
@@ -1337,6 +1880,24 @@ wheels = [
1337
  { url = "https://files.pythonhosted.org/packages/c8/19/4ec628951a74043532ca2cf5d97b7b14863931476d117c471e8e2b1eb39f/urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", size = 128369 },
1338
  ]
1339
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1340
  [[package]]
1341
  name = "wcwidth"
1342
  version = "0.2.13"
@@ -1346,6 +1907,64 @@ wheels = [
1346
  { url = "https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", size = 34166 },
1347
  ]
1348
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1349
  [[package]]
1350
  name = "xxhash"
1351
  version = "3.5.0"
 
74
  { url = "https://files.pythonhosted.org/packages/ec/6a/bc7e17a3e87a2985d3e8f4da4cd0f481060eb78fb08596c42be62c90a4d9/aiosignal-1.3.2-py2.py3-none-any.whl", hash = "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5", size = 7597 },
75
  ]
76
 
77
+ [[package]]
78
+ name = "altair"
79
+ version = "5.5.0"
80
+ source = { registry = "https://pypi.org/simple" }
81
+ dependencies = [
82
+ { name = "jinja2" },
83
+ { name = "jsonschema" },
84
+ { name = "narwhals" },
85
+ { name = "packaging" },
86
+ { name = "typing-extensions", marker = "python_full_version < '3.14'" },
87
+ ]
88
+ sdist = { url = "https://files.pythonhosted.org/packages/16/b1/f2969c7bdb8ad8bbdda031687defdce2c19afba2aa2c8e1d2a17f78376d8/altair-5.5.0.tar.gz", hash = "sha256:d960ebe6178c56de3855a68c47b516be38640b73fb3b5111c2a9ca90546dd73d", size = 705305 }
89
+ wheels = [
90
+ { url = "https://files.pythonhosted.org/packages/aa/f3/0b6ced594e51cc95d8c1fc1640d3623770d01e4969d29c0bd09945fafefa/altair-5.5.0-py3-none-any.whl", hash = "sha256:91a310b926508d560fe0148d02a194f38b824122641ef528113d029fcd129f8c", size = 731200 },
91
+ ]
92
+
93
+ [[package]]
94
+ name = "antlr4-python3-runtime"
95
+ version = "4.9.3"
96
+ source = { registry = "https://pypi.org/simple" }
97
+ sdist = { url = "https://files.pythonhosted.org/packages/3e/38/7859ff46355f76f8d19459005ca000b6e7012f2f1ca597746cbcd1fbfe5e/antlr4-python3-runtime-4.9.3.tar.gz", hash = "sha256:f224469b4168294902bb1efa80a8bf7855f24c99aef99cbefc1bcd3cce77881b", size = 117034 }
98
+
99
  [[package]]
100
  name = "appnope"
101
  version = "0.1.4"
 
105
  { url = "https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c", size = 4321 },
106
  ]
107
 
108
+ [[package]]
109
+ name = "arxiv-papers-classification"
110
+ version = "0.1.0"
111
+ source = { virtual = "." }
112
+ dependencies = [
113
+ { name = "accelerate" },
114
+ { name = "comet-ml" },
115
+ { name = "datasets" },
116
+ { name = "evaluate" },
117
+ { name = "huggingface-hub", extra = ["hf-xet"] },
118
+ { name = "hydra-core" },
119
+ { name = "ipykernel" },
120
+ { name = "ipywidgets" },
121
+ { name = "loguru" },
122
+ { name = "python-dotenv" },
123
+ { name = "scikit-learn" },
124
+ { name = "streamlit" },
125
+ { name = "torch" },
126
+ { name = "transformers" },
127
+ ]
128
+
129
+ [package.metadata]
130
+ requires-dist = [
131
+ { name = "accelerate", specifier = ">=1.6.0" },
132
+ { name = "comet-ml", specifier = ">=3.49.7" },
133
+ { name = "datasets", specifier = ">=3.5.0" },
134
+ { name = "evaluate", specifier = ">=0.4.3" },
135
+ { name = "huggingface-hub", extras = ["hf-xet"], specifier = ">=0.30.1" },
136
+ { name = "hydra-core", specifier = ">=1.3.2" },
137
+ { name = "ipykernel", specifier = ">=6.29.5" },
138
+ { name = "ipywidgets", specifier = ">=8.1.5" },
139
+ { name = "loguru", specifier = ">=0.7.3" },
140
+ { name = "python-dotenv", specifier = ">=1.1.0" },
141
+ { name = "scikit-learn", specifier = ">=1.6.1" },
142
+ { name = "streamlit", specifier = ">=1.44.1" },
143
+ { name = "torch", specifier = ">=2.6.0" },
144
+ { name = "transformers", specifier = ">=4.50.3" },
145
+ ]
146
+
147
  [[package]]
148
  name = "asttokens"
149
  version = "3.0.0"
 
162
  { url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815 },
163
  ]
164
 
165
+ [[package]]
166
+ name = "blinker"
167
+ version = "1.9.0"
168
+ source = { registry = "https://pypi.org/simple" }
169
+ sdist = { url = "https://files.pythonhosted.org/packages/21/28/9b3f50ce0e048515135495f198351908d99540d69bfdc8c1d15b73dc55ce/blinker-1.9.0.tar.gz", hash = "sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf", size = 22460 }
170
+ wheels = [
171
+ { url = "https://files.pythonhosted.org/packages/10/cb/f2ad4230dc2eb1a74edf38f1a38b9b52277f75bef262d8908e60d957e13c/blinker-1.9.0-py3-none-any.whl", hash = "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc", size = 8458 },
172
+ ]
173
+
174
+ [[package]]
175
+ name = "cachetools"
176
+ version = "5.5.2"
177
+ source = { registry = "https://pypi.org/simple" }
178
+ sdist = { url = "https://files.pythonhosted.org/packages/6c/81/3747dad6b14fa2cf53fcf10548cf5aea6913e96fab41a3c198676f8948a5/cachetools-5.5.2.tar.gz", hash = "sha256:1a661caa9175d26759571b2e19580f9d6393969e5dfca11fdb1f947a23e640d4", size = 28380 }
179
+ wheels = [
180
+ { url = "https://files.pythonhosted.org/packages/72/76/20fa66124dbe6be5cafeb312ece67de6b61dd91a0247d1ea13db4ebb33c2/cachetools-5.5.2-py3-none-any.whl", hash = "sha256:d26a22bcc62eb95c3beabd9f1ee5e820d3d2704fe2967cbe350e20c8ffcd3f0a", size = 10080 },
181
+ ]
182
+
183
  [[package]]
184
  name = "certifi"
185
  version = "2025.1.31"
 
233
  { url = "https://files.pythonhosted.org/packages/0e/f6/65ecc6878a89bb1c23a086ea335ad4bf21a588990c3f535a227b9eea9108/charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", size = 49767 },
234
  ]
235
 
236
+ [[package]]
237
+ name = "click"
238
+ version = "8.1.8"
239
+ source = { registry = "https://pypi.org/simple" }
240
+ dependencies = [
241
+ { name = "colorama", marker = "sys_platform == 'win32'" },
242
+ ]
243
+ sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 }
244
+ wheels = [
245
+ { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188 },
246
+ ]
247
+
248
  [[package]]
249
  name = "colorama"
250
  version = "0.4.6"
 
254
  { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 },
255
  ]
256
 
257
+ [[package]]
258
+ name = "comet-ml"
259
+ version = "3.49.7"
260
+ source = { registry = "https://pypi.org/simple" }
261
+ dependencies = [
262
+ { name = "dulwich" },
263
+ { name = "everett", extra = ["ini"] },
264
+ { name = "jsonschema" },
265
+ { name = "psutil" },
266
+ { name = "python-box" },
267
+ { name = "requests" },
268
+ { name = "requests-toolbelt" },
269
+ { name = "rich" },
270
+ { name = "semantic-version" },
271
+ { name = "sentry-sdk" },
272
+ { name = "setuptools" },
273
+ { name = "simplejson" },
274
+ { name = "urllib3" },
275
+ { name = "wrapt" },
276
+ { name = "wurlitzer" },
277
+ ]
278
+ sdist = { url = "https://files.pythonhosted.org/packages/78/b7/d7c5729b47559204f5f2e20a90ac5d50ea4569bcb473f7886f7ab8b8ad74/comet_ml-3.49.7.tar.gz", hash = "sha256:7c6529d6307d94c252f09575e137fb033873111ef56b2168efa2e9b8ef89f606", size = 540317 }
279
+ wheels = [
280
+ { url = "https://files.pythonhosted.org/packages/38/af/913dddaef0e23ebe0f3275b901965b54365487e779dbfdc4f5e55d4239c1/comet_ml-3.49.7-py3-none-any.whl", hash = "sha256:f8e231007dffd9ea504a3d5866c495776d2db6dccfb1f2c15f26313247aeab32", size = 726703 },
281
+ ]
282
+
283
  [[package]]
284
  name = "comm"
285
  version = "0.2.2"
 
292
  { url = "https://files.pythonhosted.org/packages/e6/75/49e5bfe642f71f272236b5b2d2691cf915a7283cc0ceda56357b61daa538/comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3", size = 7180 },
293
  ]
294
 
295
+ [[package]]
296
+ name = "configobj"
297
+ version = "5.0.9"
298
+ source = { registry = "https://pypi.org/simple" }
299
+ sdist = { url = "https://files.pythonhosted.org/packages/f5/c4/c7f9e41bc2e5f8eeae4a08a01c91b2aea3dfab40a3e14b25e87e7db8d501/configobj-5.0.9.tar.gz", hash = "sha256:03c881bbf23aa07bccf1b837005975993c4ab4427ba57f959afdd9d1a2386848", size = 101518 }
300
+ wheels = [
301
+ { url = "https://files.pythonhosted.org/packages/a6/c4/0679472c60052c27efa612b4cd3ddd2a23e885dcdc73461781d2c802d39e/configobj-5.0.9-py2.py3-none-any.whl", hash = "sha256:1ba10c5b6ee16229c79a05047aeda2b55eb4e80d7c7d8ecf17ec1ca600c79882", size = 35615 },
302
+ ]
303
+
304
  [[package]]
305
  name = "datasets"
306
  version = "3.5.0"
 
357
  { url = "https://files.pythonhosted.org/packages/c9/7a/cef76fd8438a42f96db64ddaa85280485a9c395e7df3db8158cfec1eee34/dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7", size = 116252 },
358
  ]
359
 
360
+ [[package]]
361
+ name = "dulwich"
362
+ version = "0.22.8"
363
+ source = { registry = "https://pypi.org/simple" }
364
+ dependencies = [
365
+ { name = "urllib3" },
366
+ ]
367
+ sdist = { url = "https://files.pythonhosted.org/packages/d4/8b/0f2de00c0c0d5881dc39be147ec2918725fb3628deeeb1f27d1c6cf6d9f4/dulwich-0.22.8.tar.gz", hash = "sha256:701547310415de300269331abe29cb5717aa1ea377af826bf513d0adfb1c209b", size = 466542 }
368
+ wheels = [
369
+ { url = "https://files.pythonhosted.org/packages/dc/b7/78116bfe8860edca277d00ac243749c8b94714dc3b4608f0c23fa7f4b78e/dulwich-0.22.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dbade3342376be1cd2409539fe1b901d2d57a531106bbae204da921ef4456a74", size = 915617 },
370
+ { url = "https://files.pythonhosted.org/packages/a1/af/28c317a83d6ae9ca93a8decfaa50f09b25a73134f5087a98f51fa5a2d784/dulwich-0.22.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71420ffb6deebc59b2ce875e63d814509f9c1dc89c76db962d547aebf15670c7", size = 991271 },
371
+ { url = "https://files.pythonhosted.org/packages/84/a0/64a0376f79c7fb87ec6e6d9a0e2157f3196d1f5f75618c402645ac5ccf19/dulwich-0.22.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a626adbfac44646a125618266a24133763bdc992bf8bd0702910d67e6b994443", size = 999791 },
372
+ { url = "https://files.pythonhosted.org/packages/63/c3/260f060ededcdf5f13a7e63a36329c95225bf8e8c3f50aeca6820850b56a/dulwich-0.22.8-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f1476c9c4e4ede95714d06c4831883a26680e37b040b8b6230f506e5ba39f51", size = 1043970 },
373
+ { url = "https://files.pythonhosted.org/packages/11/47/2bc02dd1c25eb13cb3cd20cd5a55dd9d7b9fa6af95ed574dd913dd67a0fb/dulwich-0.22.8-cp313-cp313-win32.whl", hash = "sha256:b2b31913932bb5bd41658dd398b33b1a2d4d34825123ad54e40912cfdfe60003", size = 590548 },
374
+ { url = "https://files.pythonhosted.org/packages/f3/17/66368fa9d4cffd52663d20354a74aa42d3a6d998f1a462e30aff38c99d25/dulwich-0.22.8-cp313-cp313-win_amd64.whl", hash = "sha256:7a44e5a61a7989aca1e301d39cfb62ad2f8853368682f524d6e878b4115d823d", size = 608200 },
375
+ { url = "https://files.pythonhosted.org/packages/37/56/395c6d82d4d9eb7a7ab62939c99db5b746995b0f3ad3b31f43c15e3e07a0/dulwich-0.22.8-py3-none-any.whl", hash = "sha256:ffc7a02e62b72884de58baaa3b898b7f6427893e79b1289ffa075092efe59181", size = 273071 },
376
+ ]
377
+
378
  [[package]]
379
  name = "evaluate"
380
  version = "0.4.3"
 
397
  { url = "https://files.pythonhosted.org/packages/a2/e7/cbca9e2d2590eb9b5aa8f7ebabe1beb1498f9462d2ecede5c9fd9735faaf/evaluate-0.4.3-py3-none-any.whl", hash = "sha256:47d8770bdea76e2c2ed0d40189273027d1a41ccea861bcc7ba12d30ec5d1e517", size = 84010 },
398
  ]
399
 
400
+ [[package]]
401
+ name = "everett"
402
+ version = "3.1.0"
403
+ source = { registry = "https://pypi.org/simple" }
404
+ sdist = { url = "https://files.pythonhosted.org/packages/c0/b4/c7c61c0b243c4277d19299cd1bccee8b2b57d04073c0d8625799fe47f5c9/everett-3.1.0.tar.gz", hash = "sha256:46175da5bcb06c193aa129e59714bca981344ff067c3a8bc2e625bc0b3dc01f6", size = 73796 }
405
+ wheels = [
406
+ { url = "https://files.pythonhosted.org/packages/91/9a/d882fd7562208456236fb2e62b762bf16fbc9ecde842bb871f676ca0f7e1/everett-3.1.0-py2.py3-none-any.whl", hash = "sha256:db13891b849e45e54faea93ee79881d12458c5378f5b9b7f806eeff03ce1de3c", size = 35702 },
407
+ ]
408
+
409
+ [package.optional-dependencies]
410
+ ini = [
411
+ { name = "configobj" },
412
+ ]
413
+
414
  [[package]]
415
  name = "executing"
416
  version = "2.2.0"
 
467
  { name = "aiohttp" },
468
  ]
469
 
470
+ [[package]]
471
+ name = "gitdb"
472
+ version = "4.0.12"
473
+ source = { registry = "https://pypi.org/simple" }
474
+ dependencies = [
475
+ { name = "smmap" },
476
+ ]
477
+ sdist = { url = "https://files.pythonhosted.org/packages/72/94/63b0fc47eb32792c7ba1fe1b694daec9a63620db1e313033d18140c2320a/gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571", size = 394684 }
478
+ wheels = [
479
+ { url = "https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf", size = 62794 },
480
+ ]
481
+
482
+ [[package]]
483
+ name = "gitpython"
484
+ version = "3.1.44"
485
+ source = { registry = "https://pypi.org/simple" }
486
+ dependencies = [
487
+ { name = "gitdb" },
488
+ ]
489
+ sdist = { url = "https://files.pythonhosted.org/packages/c0/89/37df0b71473153574a5cdef8f242de422a0f5d26d7a9e231e6f169b4ad14/gitpython-3.1.44.tar.gz", hash = "sha256:c87e30b26253bf5418b01b0660f818967f3c503193838337fe5e573331249269", size = 214196 }
490
+ wheels = [
491
+ { url = "https://files.pythonhosted.org/packages/1d/9a/4114a9057db2f1462d5c8f8390ab7383925fe1ac012eaa42402ad65c2963/GitPython-3.1.44-py3-none-any.whl", hash = "sha256:9e0e10cda9bed1ee64bc9a6de50e7e38a9c9943241cd7f585f6df3ed28011110", size = 207599 },
492
+ ]
493
+
494
+ [[package]]
495
+ name = "hf-xet"
496
+ version = "1.0.2"
497
+ source = { registry = "https://pypi.org/simple" }
498
+ sdist = { url = "https://files.pythonhosted.org/packages/ea/a0/d909bbbec11ec6b4759761cf82ee6fef54090e4419af0103d51ac7a8a193/hf_xet-1.0.2.tar.gz", hash = "sha256:08d3ffadafec693f468196a6b73a06228ee92228a185faf59f1331b7b688bd0b", size = 257438 }
499
+ wheels = [
500
+ { url = "https://files.pythonhosted.org/packages/bf/6f/fa406bcd791abb1fa2008699eadfd75942085da9c3fbe1bcf5350f67a169/hf_xet-1.0.2-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:ecedfa15291deb37dcb76d2c1161183e0ea7c9eb2ee2faee65ab51581aface72", size = 5003702 },
501
+ { url = "https://files.pythonhosted.org/packages/a8/09/d94d1b918b9ae4f27957498a93ab8490d73a9af3b1075937b1746269b65c/hf_xet-1.0.2-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:df74b85086d5a605b1bc891f40532d8c8ae4543529a30b8bcd249bd254d74b38", size = 4806239 },
502
+ { url = "https://files.pythonhosted.org/packages/ef/4a/5f8daad74457eeeed2e8dda30683626736c0fdcf78edc45e3915b155d480/hf_xet-1.0.2-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4278542881217e176fb14132ce519324a849162fa14814981d319d46819158f0", size = 53823444 },
503
+ { url = "https://files.pythonhosted.org/packages/1e/96/3e2aba0a84f033869eb72227ee5ee14f47c14e89408c6d990d3dfc5228b7/hf_xet-1.0.2-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:58cc3496fba08a7b87cf33cd25cf2118d1b72ba17533925ca9a70aa97871270b", size = 52278291 },
504
+ { url = "https://files.pythonhosted.org/packages/78/06/e28a9c284a13f615b37b5878c042a842ed6ccfd056c092f430a365bdc491/hf_xet-1.0.2-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:8afa21f725707078906d4c3dcb1555b2fd8ca35213891ba0d31ae6d77f4e242e", size = 53270013 },
505
+ { url = "https://files.pythonhosted.org/packages/98/cc/c91c0b98cb41b1f301b13c16569e8ba29cd9751192735a8ab46c5ea61ce2/hf_xet-1.0.2-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a9d4f005f862d6c58dd161d6bc20d690669a00d22719dd5c64a42112e406492f", size = 53744462 },
506
+ { url = "https://files.pythonhosted.org/packages/7f/1d/2fdb0f7af9be284cbd3dc2864f164dbc96e76d92f1598793d18bcbbca47e/hf_xet-1.0.2-cp37-abi3-win_amd64.whl", hash = "sha256:9d207244a7ac564954fb9087a20fc48401b2ef7224534748d9513b4e196b69f9", size = 4119119 },
507
+ ]
508
+
509
  [[package]]
510
  name = "huggingface-hub"
511
  version = "0.30.1"
 
524
  { url = "https://files.pythonhosted.org/packages/99/e3/2232d0e726d4d6ea69643b9593d97d0e7e6ea69c2fe9ed5de34d476c1c47/huggingface_hub-0.30.1-py3-none-any.whl", hash = "sha256:0f6aa5ec5a4e68e5b9e45d556b4e5ea180c58f5a5ffa734e7f38c9d573028959", size = 481170 },
525
  ]
526
 
527
+ [package.optional-dependencies]
528
+ hf-xet = [
529
+ { name = "hf-xet" },
530
+ ]
531
+
532
+ [[package]]
533
+ name = "hydra-core"
534
+ version = "1.3.2"
535
+ source = { registry = "https://pypi.org/simple" }
536
+ dependencies = [
537
+ { name = "antlr4-python3-runtime" },
538
+ { name = "omegaconf" },
539
+ { name = "packaging" },
540
+ ]
541
+ sdist = { url = "https://files.pythonhosted.org/packages/6d/8e/07e42bc434a847154083b315779b0a81d567154504624e181caf2c71cd98/hydra-core-1.3.2.tar.gz", hash = "sha256:8a878ed67216997c3e9d88a8e72e7b4767e81af37afb4ea3334b269a4390a824", size = 3263494 }
542
+ wheels = [
543
+ { url = "https://files.pythonhosted.org/packages/c6/50/e0edd38dcd63fb26a8547f13d28f7a008bc4a3fd4eb4ff030673f22ad41a/hydra_core-1.3.2-py3-none-any.whl", hash = "sha256:fa0238a9e31df3373b35b0bfb672c34cc92718d21f81311d8996a16de1141d8b", size = 154547 },
544
+ ]
545
+
546
  [[package]]
547
  name = "idna"
548
  version = "3.10"
 
609
  { url = "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074 },
610
  ]
611
 
612
+ [[package]]
613
+ name = "ipywidgets"
614
+ version = "8.1.5"
615
+ source = { registry = "https://pypi.org/simple" }
616
+ dependencies = [
617
+ { name = "comm" },
618
+ { name = "ipython" },
619
+ { name = "jupyterlab-widgets" },
620
+ { name = "traitlets" },
621
+ { name = "widgetsnbextension" },
622
+ ]
623
+ sdist = { url = "https://files.pythonhosted.org/packages/c7/4c/dab2a281b07596a5fc220d49827fe6c794c66f1493d7a74f1df0640f2cc5/ipywidgets-8.1.5.tar.gz", hash = "sha256:870e43b1a35656a80c18c9503bbf2d16802db1cb487eec6fab27d683381dde17", size = 116723 }
624
+ wheels = [
625
+ { url = "https://files.pythonhosted.org/packages/22/2d/9c0b76f2f9cc0ebede1b9371b6f317243028ed60b90705863d493bae622e/ipywidgets-8.1.5-py3-none-any.whl", hash = "sha256:3290f526f87ae6e77655555baba4f36681c555b8bdbbff430b70e52c34c86245", size = 139767 },
626
+ ]
627
+
628
  [[package]]
629
  name = "jedi"
630
  version = "0.19.2"
 
658
  { url = "https://files.pythonhosted.org/packages/91/29/df4b9b42f2be0b623cbd5e2140cafcaa2bef0759a00b7b70104dcfe2fb51/joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6", size = 301817 },
659
  ]
660
 
661
+ [[package]]
662
+ name = "jsonschema"
663
+ version = "4.23.0"
664
+ source = { registry = "https://pypi.org/simple" }
665
+ dependencies = [
666
+ { name = "attrs" },
667
+ { name = "jsonschema-specifications" },
668
+ { name = "referencing" },
669
+ { name = "rpds-py" },
670
+ ]
671
+ sdist = { url = "https://files.pythonhosted.org/packages/38/2e/03362ee4034a4c917f697890ccd4aec0800ccf9ded7f511971c75451deec/jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4", size = 325778 }
672
+ wheels = [
673
+ { url = "https://files.pythonhosted.org/packages/69/4a/4f9dbeb84e8850557c02365a0eee0649abe5eb1d84af92a25731c6c0f922/jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566", size = 88462 },
674
+ ]
675
+
676
+ [[package]]
677
+ name = "jsonschema-specifications"
678
+ version = "2024.10.1"
679
+ source = { registry = "https://pypi.org/simple" }
680
+ dependencies = [
681
+ { name = "referencing" },
682
+ ]
683
+ sdist = { url = "https://files.pythonhosted.org/packages/10/db/58f950c996c793472e336ff3655b13fbcf1e3b359dcf52dcf3ed3b52c352/jsonschema_specifications-2024.10.1.tar.gz", hash = "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272", size = 15561 }
684
+ wheels = [
685
+ { url = "https://files.pythonhosted.org/packages/d1/0f/8910b19ac0670a0f80ce1008e5e751c4a57e14d2c4c13a482aa6079fa9d6/jsonschema_specifications-2024.10.1-py3-none-any.whl", hash = "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf", size = 18459 },
686
+ ]
687
+
688
  [[package]]
689
  name = "jupyter-client"
690
  version = "8.6.3"
 
715
  { url = "https://files.pythonhosted.org/packages/c9/fb/108ecd1fe961941959ad0ee4e12ee7b8b1477247f30b1fdfd83ceaf017f0/jupyter_core-5.7.2-py3-none-any.whl", hash = "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409", size = 28965 },
716
  ]
717
 
718
+ [[package]]
719
+ name = "jupyterlab-widgets"
720
+ version = "3.0.13"
721
+ source = { registry = "https://pypi.org/simple" }
722
+ sdist = { url = "https://files.pythonhosted.org/packages/59/73/fa26bbb747a9ea4fca6b01453aa22990d52ab62dd61384f1ac0dc9d4e7ba/jupyterlab_widgets-3.0.13.tar.gz", hash = "sha256:a2966d385328c1942b683a8cd96b89b8dd82c8b8f81dda902bb2bc06d46f5bed", size = 203556 }
723
+ wheels = [
724
+ { url = "https://files.pythonhosted.org/packages/a9/93/858e87edc634d628e5d752ba944c2833133a28fa87bb093e6832ced36a3e/jupyterlab_widgets-3.0.13-py3-none-any.whl", hash = "sha256:e3cda2c233ce144192f1e29914ad522b2f4c40e77214b0cc97377ca3d323db54", size = 214392 },
725
+ ]
726
+
727
+ [[package]]
728
+ name = "loguru"
729
+ version = "0.7.3"
730
+ source = { registry = "https://pypi.org/simple" }
731
+ dependencies = [
732
+ { name = "colorama", marker = "sys_platform == 'win32'" },
733
+ { name = "win32-setctime", marker = "sys_platform == 'win32'" },
734
+ ]
735
+ sdist = { url = "https://files.pythonhosted.org/packages/3a/05/a1dae3dffd1116099471c643b8924f5aa6524411dc6c63fdae648c4f1aca/loguru-0.7.3.tar.gz", hash = "sha256:19480589e77d47b8d85b2c827ad95d49bf31b0dcde16593892eb51dd18706eb6", size = 63559 }
736
+ wheels = [
737
+ { url = "https://files.pythonhosted.org/packages/0c/29/0348de65b8cc732daa3e33e67806420b2ae89bdce2b04af740289c5c6c8c/loguru-0.7.3-py3-none-any.whl", hash = "sha256:31a33c10c8e1e10422bfd431aeb5d351c7cf7fa671e3c4df004162264b28220c", size = 61595 },
738
+ ]
739
+
740
+ [[package]]
741
+ name = "markdown-it-py"
742
+ version = "3.0.0"
743
+ source = { registry = "https://pypi.org/simple" }
744
+ dependencies = [
745
+ { name = "mdurl" },
746
+ ]
747
+ sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596 }
748
+ wheels = [
749
+ { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528 },
750
+ ]
751
+
752
  [[package]]
753
  name = "markupsafe"
754
  version = "3.0.2"
 
789
  { url = "https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca", size = 9899 },
790
  ]
791
 
792
+ [[package]]
793
+ name = "mdurl"
794
+ version = "0.1.2"
795
+ source = { registry = "https://pypi.org/simple" }
796
+ sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729 }
797
+ wheels = [
798
+ { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 },
799
+ ]
800
+
801
  [[package]]
802
  name = "mpmath"
803
  version = "1.3.0"
 
862
  { url = "https://files.pythonhosted.org/packages/da/d9/f7f9379981e39b8c2511c9e0326d212accacb82f12fbfdc1aa2ce2a7b2b6/multiprocess-0.70.16-py39-none-any.whl", hash = "sha256:a0bafd3ae1b732eac64be2e72038231c1ba97724b60b09400d68f229fcc2fbf3", size = 133351 },
863
  ]
864
 
865
+ [[package]]
866
+ name = "narwhals"
867
+ version = "1.33.0"
868
+ source = { registry = "https://pypi.org/simple" }
869
+ sdist = { url = "https://files.pythonhosted.org/packages/85/fd/484aa8bb557f97a1781f38c78b79f795a2fa320e4165c4230f679937d1e8/narwhals-1.33.0.tar.gz", hash = "sha256:6233d2457debf4b5fe4a1da54530c6fe2d84326f4a8e3bca35bbbff580a347cb", size = 262554 }
870
+ wheels = [
871
+ { url = "https://files.pythonhosted.org/packages/41/c1/e9bc6b67c774e7c1f939c91ea535f18f7644fedc61b20d6baa861ad52b34/narwhals-1.33.0-py3-none-any.whl", hash = "sha256:f653319112fd121a1f1c18a40cf70dada773cdacfd53e62c2aa0afae43c17129", size = 322750 },
872
+ ]
873
+
874
  [[package]]
875
  name = "nest-asyncio"
876
  version = "1.6.0"
 
1036
  ]
1037
 
1038
  [[package]]
1039
+ name = "omegaconf"
1040
+ version = "2.3.0"
1041
+ source = { registry = "https://pypi.org/simple" }
1042
  dependencies = [
1043
+ { name = "antlr4-python3-runtime" },
1044
+ { name = "pyyaml" },
 
 
 
 
 
1045
  ]
1046
+ sdist = { url = "https://files.pythonhosted.org/packages/09/48/6388f1bb9da707110532cb70ec4d2822858ddfb44f1cdf1233c20a80ea4b/omegaconf-2.3.0.tar.gz", hash = "sha256:d5d4b6d29955cc50ad50c46dc269bcd92c6e00f5f90d23ab5fee7bfca4ba4cc7", size = 3298120 }
1047
+ wheels = [
1048
+ { url = "https://files.pythonhosted.org/packages/e3/94/1843518e420fa3ed6919835845df698c7e27e183cb997394e4a670973a65/omegaconf-2.3.0-py3-none-any.whl", hash = "sha256:7b4df175cdb08ba400f45cae3bdcae7ba8365db4d165fc65fd04b050ab63b46b", size = 79500 },
 
 
 
 
 
 
 
1049
  ]
1050
 
1051
  [[package]]
 
1105
  { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772 },
1106
  ]
1107
 
1108
+ [[package]]
1109
+ name = "pillow"
1110
+ version = "11.1.0"
1111
+ source = { registry = "https://pypi.org/simple" }
1112
+ sdist = { url = "https://files.pythonhosted.org/packages/f3/af/c097e544e7bd278333db77933e535098c259609c4eb3b85381109602fb5b/pillow-11.1.0.tar.gz", hash = "sha256:368da70808b36d73b4b390a8ffac11069f8a5c85f29eff1f1b01bcf3ef5b2a20", size = 46742715 }
1113
+ wheels = [
1114
+ { url = "https://files.pythonhosted.org/packages/b3/31/9ca79cafdce364fd5c980cd3416c20ce1bebd235b470d262f9d24d810184/pillow-11.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ae98e14432d458fc3de11a77ccb3ae65ddce70f730e7c76140653048c71bfcbc", size = 3226640 },
1115
+ { url = "https://files.pythonhosted.org/packages/ac/0f/ff07ad45a1f172a497aa393b13a9d81a32e1477ef0e869d030e3c1532521/pillow-11.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cc1331b6d5a6e144aeb5e626f4375f5b7ae9934ba620c0ac6b3e43d5e683a0f0", size = 3101437 },
1116
+ { url = "https://files.pythonhosted.org/packages/08/2f/9906fca87a68d29ec4530be1f893149e0cb64a86d1f9f70a7cfcdfe8ae44/pillow-11.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:758e9d4ef15d3560214cddbc97b8ef3ef86ce04d62ddac17ad39ba87e89bd3b1", size = 4326605 },
1117
+ { url = "https://files.pythonhosted.org/packages/b0/0f/f3547ee15b145bc5c8b336401b2d4c9d9da67da9dcb572d7c0d4103d2c69/pillow-11.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b523466b1a31d0dcef7c5be1f20b942919b62fd6e9a9be199d035509cbefc0ec", size = 4411173 },
1118
+ { url = "https://files.pythonhosted.org/packages/b1/df/bf8176aa5db515c5de584c5e00df9bab0713548fd780c82a86cba2c2fedb/pillow-11.1.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:9044b5e4f7083f209c4e35aa5dd54b1dd5b112b108648f5c902ad586d4f945c5", size = 4369145 },
1119
+ { url = "https://files.pythonhosted.org/packages/de/7c/7433122d1cfadc740f577cb55526fdc39129a648ac65ce64db2eb7209277/pillow-11.1.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:3764d53e09cdedd91bee65c2527815d315c6b90d7b8b79759cc48d7bf5d4f114", size = 4496340 },
1120
+ { url = "https://files.pythonhosted.org/packages/25/46/dd94b93ca6bd555588835f2504bd90c00d5438fe131cf01cfa0c5131a19d/pillow-11.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:31eba6bbdd27dde97b0174ddf0297d7a9c3a507a8a1480e1e60ef914fe23d352", size = 4296906 },
1121
+ { url = "https://files.pythonhosted.org/packages/a8/28/2f9d32014dfc7753e586db9add35b8a41b7a3b46540e965cb6d6bc607bd2/pillow-11.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b5d658fbd9f0d6eea113aea286b21d3cd4d3fd978157cbf2447a6035916506d3", size = 4431759 },
1122
+ { url = "https://files.pythonhosted.org/packages/33/48/19c2cbe7403870fbe8b7737d19eb013f46299cdfe4501573367f6396c775/pillow-11.1.0-cp313-cp313-win32.whl", hash = "sha256:f86d3a7a9af5d826744fabf4afd15b9dfef44fe69a98541f666f66fbb8d3fef9", size = 2291657 },
1123
+ { url = "https://files.pythonhosted.org/packages/3b/ad/285c556747d34c399f332ba7c1a595ba245796ef3e22eae190f5364bb62b/pillow-11.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:593c5fd6be85da83656b93ffcccc2312d2d149d251e98588b14fbc288fd8909c", size = 2626304 },
1124
+ { url = "https://files.pythonhosted.org/packages/e5/7b/ef35a71163bf36db06e9c8729608f78dedf032fc8313d19bd4be5c2588f3/pillow-11.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:11633d58b6ee5733bde153a8dafd25e505ea3d32e261accd388827ee987baf65", size = 2375117 },
1125
+ { url = "https://files.pythonhosted.org/packages/79/30/77f54228401e84d6791354888549b45824ab0ffde659bafa67956303a09f/pillow-11.1.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:70ca5ef3b3b1c4a0812b5c63c57c23b63e53bc38e758b37a951e5bc466449861", size = 3230060 },
1126
+ { url = "https://files.pythonhosted.org/packages/ce/b1/56723b74b07dd64c1010fee011951ea9c35a43d8020acd03111f14298225/pillow-11.1.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:8000376f139d4d38d6851eb149b321a52bb8893a88dae8ee7d95840431977081", size = 3106192 },
1127
+ { url = "https://files.pythonhosted.org/packages/e1/cd/7bf7180e08f80a4dcc6b4c3a0aa9e0b0ae57168562726a05dc8aa8fa66b0/pillow-11.1.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ee85f0696a17dd28fbcfceb59f9510aa71934b483d1f5601d1030c3c8304f3c", size = 4446805 },
1128
+ { url = "https://files.pythonhosted.org/packages/97/42/87c856ea30c8ed97e8efbe672b58c8304dee0573f8c7cab62ae9e31db6ae/pillow-11.1.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:dd0e081319328928531df7a0e63621caf67652c8464303fd102141b785ef9547", size = 4530623 },
1129
+ { url = "https://files.pythonhosted.org/packages/ff/41/026879e90c84a88e33fb00cc6bd915ac2743c67e87a18f80270dfe3c2041/pillow-11.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e63e4e5081de46517099dc30abe418122f54531a6ae2ebc8680bcd7096860eab", size = 4465191 },
1130
+ { url = "https://files.pythonhosted.org/packages/e5/fb/a7960e838bc5df57a2ce23183bfd2290d97c33028b96bde332a9057834d3/pillow-11.1.0-cp313-cp313t-win32.whl", hash = "sha256:dda60aa465b861324e65a78c9f5cf0f4bc713e4309f83bc387be158b077963d9", size = 2295494 },
1131
+ { url = "https://files.pythonhosted.org/packages/d7/6c/6ec83ee2f6f0fda8d4cf89045c6be4b0373ebfc363ba8538f8c999f63fcd/pillow-11.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ad5db5781c774ab9a9b2c4302bbf0c1014960a0a7be63278d13ae6fdf88126fe", size = 2631595 },
1132
+ { url = "https://files.pythonhosted.org/packages/cf/6c/41c21c6c8af92b9fea313aa47c75de49e2f9a467964ee33eb0135d47eb64/pillow-11.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:67cd427c68926108778a9005f2a04adbd5e67c442ed21d95389fe1d595458756", size = 2377651 },
1133
+ ]
1134
+
1135
  [[package]]
1136
  name = "platformdirs"
1137
  version = "4.3.7"
 
1194
  { url = "https://files.pythonhosted.org/packages/b8/d3/c3cb8f1d6ae3b37f83e1de806713a9b3642c5895f0215a62e1a4bd6e5e34/propcache-0.3.1-py3-none-any.whl", hash = "sha256:9a8ecf38de50a7f518c21568c80f985e776397b902f1ce0b01f799aba1608b40", size = 12376 },
1195
  ]
1196
 
1197
+ [[package]]
1198
+ name = "protobuf"
1199
+ version = "5.29.4"
1200
+ source = { registry = "https://pypi.org/simple" }
1201
+ sdist = { url = "https://files.pythonhosted.org/packages/17/7d/b9dca7365f0e2c4fa7c193ff795427cfa6290147e5185ab11ece280a18e7/protobuf-5.29.4.tar.gz", hash = "sha256:4f1dfcd7997b31ef8f53ec82781ff434a28bf71d9102ddde14d076adcfc78c99", size = 424902 }
1202
+ wheels = [
1203
+ { url = "https://files.pythonhosted.org/packages/9a/b2/043a1a1a20edd134563699b0e91862726a0dc9146c090743b6c44d798e75/protobuf-5.29.4-cp310-abi3-win32.whl", hash = "sha256:13eb236f8eb9ec34e63fc8b1d6efd2777d062fa6aaa68268fb67cf77f6839ad7", size = 422709 },
1204
+ { url = "https://files.pythonhosted.org/packages/79/fc/2474b59570daa818de6124c0a15741ee3e5d6302e9d6ce0bdfd12e98119f/protobuf-5.29.4-cp310-abi3-win_amd64.whl", hash = "sha256:bcefcdf3976233f8a502d265eb65ea740c989bacc6c30a58290ed0e519eb4b8d", size = 434506 },
1205
+ { url = "https://files.pythonhosted.org/packages/46/de/7c126bbb06aa0f8a7b38aaf8bd746c514d70e6a2a3f6dd460b3b7aad7aae/protobuf-5.29.4-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:307ecba1d852ec237e9ba668e087326a67564ef83e45a0189a772ede9e854dd0", size = 417826 },
1206
+ { url = "https://files.pythonhosted.org/packages/a2/b5/bade14ae31ba871a139aa45e7a8183d869efe87c34a4850c87b936963261/protobuf-5.29.4-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:aec4962f9ea93c431d5714ed1be1c93f13e1a8618e70035ba2b0564d9e633f2e", size = 319574 },
1207
+ { url = "https://files.pythonhosted.org/packages/46/88/b01ed2291aae68b708f7d334288ad5fb3e7aa769a9c309c91a0d55cb91b0/protobuf-5.29.4-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:d7d3f7d1d5a66ed4942d4fefb12ac4b14a29028b209d4bfb25c68ae172059922", size = 319672 },
1208
+ { url = "https://files.pythonhosted.org/packages/12/fb/a586e0c973c95502e054ac5f81f88394f24ccc7982dac19c515acd9e2c93/protobuf-5.29.4-py3-none-any.whl", hash = "sha256:3fde11b505e1597f71b875ef2fc52062b6a9740e5f7c8997ce878b6009145862", size = 172551 },
1209
+ ]
1210
+
1211
  [[package]]
1212
  name = "psutil"
1213
  version = "7.0.0"
 
1271
  { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552 },
1272
  ]
1273
 
1274
+ [[package]]
1275
+ name = "pydeck"
1276
+ version = "0.9.1"
1277
+ source = { registry = "https://pypi.org/simple" }
1278
+ dependencies = [
1279
+ { name = "jinja2" },
1280
+ { name = "numpy" },
1281
+ ]
1282
+ sdist = { url = "https://files.pythonhosted.org/packages/a1/ca/40e14e196864a0f61a92abb14d09b3d3da98f94ccb03b49cf51688140dab/pydeck-0.9.1.tar.gz", hash = "sha256:f74475ae637951d63f2ee58326757f8d4f9cd9f2a457cf42950715003e2cb605", size = 3832240 }
1283
+ wheels = [
1284
+ { url = "https://files.pythonhosted.org/packages/ab/4c/b888e6cf58bd9db9c93f40d1c6be8283ff49d88919231afe93a6bcf61626/pydeck-0.9.1-py2.py3-none-any.whl", hash = "sha256:b3f75ba0d273fc917094fa61224f3f6076ca8752b93d46faf3bcfd9f9d59b038", size = 6900403 },
1285
+ ]
1286
+
1287
  [[package]]
1288
  name = "pygments"
1289
  version = "2.19.1"
 
1293
  { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293 },
1294
  ]
1295
 
1296
+ [[package]]
1297
+ name = "python-box"
1298
+ version = "6.1.0"
1299
+ source = { registry = "https://pypi.org/simple" }
1300
+ sdist = { url = "https://files.pythonhosted.org/packages/9a/85/b02b80d74bdb95bfe491d49ad1627e9833c73d331edbe6eed0bdfe170361/python-box-6.1.0.tar.gz", hash = "sha256:6e7c243b356cb36e2c0f0e5ed7850969fede6aa812a7f501de7768996c7744d7", size = 41443 }
1301
+ wheels = [
1302
+ { url = "https://files.pythonhosted.org/packages/88/c6/6d1e368710cb6c458ed692d179d7e101ebce80a3e640b2e74cc7ae886d6f/python_box-6.1.0-py3-none-any.whl", hash = "sha256:bdec0a5f5a17b01fc538d292602a077aa8c641fb121e1900dff0591791af80e8", size = 27277 },
1303
+ ]
1304
+
1305
  [[package]]
1306
  name = "python-dateutil"
1307
  version = "2.9.0.post0"
 
1314
  { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892 },
1315
  ]
1316
 
1317
+ [[package]]
1318
+ name = "python-dotenv"
1319
+ version = "1.1.0"
1320
+ source = { registry = "https://pypi.org/simple" }
1321
+ sdist = { url = "https://files.pythonhosted.org/packages/88/2c/7bb1416c5620485aa793f2de31d3df393d3686aa8a8506d11e10e13c5baf/python_dotenv-1.1.0.tar.gz", hash = "sha256:41f90bc6f5f177fb41f53e87666db362025010eb28f60a01c9143bfa33a2b2d5", size = 39920 }
1322
+ wheels = [
1323
+ { url = "https://files.pythonhosted.org/packages/1e/18/98a99ad95133c6a6e2005fe89faedf294a748bd5dc803008059409ac9b1e/python_dotenv-1.1.0-py3-none-any.whl", hash = "sha256:d7c01d9e2293916c18baf562d95698754b0dbbb5e74d457c45d4f6561fb9d55d", size = 20256 },
1324
+ ]
1325
+
1326
  [[package]]
1327
  name = "pytz"
1328
  version = "2025.2"
 
1389
  { url = "https://files.pythonhosted.org/packages/87/88/0236056156da0278c9ca2e2562463643597808b5bbd6c34009ba217e7e92/pyzmq-26.3.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:d015efcd96aca8882057e7e6f06224f79eecd22cad193d3e6a0a91ec67590d1f", size = 1398401 },
1390
  ]
1391
 
1392
+ [[package]]
1393
+ name = "referencing"
1394
+ version = "0.36.2"
1395
+ source = { registry = "https://pypi.org/simple" }
1396
+ dependencies = [
1397
+ { name = "attrs" },
1398
+ { name = "rpds-py" },
1399
+ ]
1400
+ sdist = { url = "https://files.pythonhosted.org/packages/2f/db/98b5c277be99dd18bfd91dd04e1b759cad18d1a338188c936e92f921c7e2/referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa", size = 74744 }
1401
+ wheels = [
1402
+ { url = "https://files.pythonhosted.org/packages/c1/b1/3baf80dc6d2b7bc27a95a67752d0208e410351e3feb4eb78de5f77454d8d/referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0", size = 26775 },
1403
+ ]
1404
+
1405
  [[package]]
1406
  name = "regex"
1407
  version = "2024.11.6"
 
1440
  { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 },
1441
  ]
1442
 
1443
+ [[package]]
1444
+ name = "requests-toolbelt"
1445
+ version = "1.0.0"
1446
+ source = { registry = "https://pypi.org/simple" }
1447
+ dependencies = [
1448
+ { name = "requests" },
1449
+ ]
1450
+ sdist = { url = "https://files.pythonhosted.org/packages/f3/61/d7545dafb7ac2230c70d38d31cbfe4cc64f7144dc41f6e4e4b78ecd9f5bb/requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6", size = 206888 }
1451
+ wheels = [
1452
+ { url = "https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06", size = 54481 },
1453
+ ]
1454
+
1455
+ [[package]]
1456
+ name = "rich"
1457
+ version = "14.0.0"
1458
+ source = { registry = "https://pypi.org/simple" }
1459
+ dependencies = [
1460
+ { name = "markdown-it-py" },
1461
+ { name = "pygments" },
1462
+ ]
1463
+ sdist = { url = "https://files.pythonhosted.org/packages/a1/53/830aa4c3066a8ab0ae9a9955976fb770fe9c6102117c8ec4ab3ea62d89e8/rich-14.0.0.tar.gz", hash = "sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725", size = 224078 }
1464
+ wheels = [
1465
+ { url = "https://files.pythonhosted.org/packages/0d/9b/63f4c7ebc259242c89b3acafdb37b41d1185c07ff0011164674e9076b491/rich-14.0.0-py3-none-any.whl", hash = "sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0", size = 243229 },
1466
+ ]
1467
+
1468
+ [[package]]
1469
+ name = "rpds-py"
1470
+ version = "0.24.0"
1471
+ source = { registry = "https://pypi.org/simple" }
1472
+ sdist = { url = "https://files.pythonhosted.org/packages/0b/b3/52b213298a0ba7097c7ea96bee95e1947aa84cc816d48cebb539770cdf41/rpds_py-0.24.0.tar.gz", hash = "sha256:772cc1b2cd963e7e17e6cc55fe0371fb9c704d63e44cacec7b9b7f523b78919e", size = 26863 }
1473
+ wheels = [
1474
+ { url = "https://files.pythonhosted.org/packages/9d/c3/3607abc770395bc6d5a00cb66385a5479fb8cd7416ddef90393b17ef4340/rpds_py-0.24.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:3d2d8e4508e15fc05b31285c4b00ddf2e0eb94259c2dc896771966a163122a0c", size = 367072 },
1475
+ { url = "https://files.pythonhosted.org/packages/d8/35/8c7ee0fe465793e3af3298dc5a9f3013bd63e7a69df04ccfded8293a4982/rpds_py-0.24.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0f00c16e089282ad68a3820fd0c831c35d3194b7cdc31d6e469511d9bffc535c", size = 351919 },
1476
+ { url = "https://files.pythonhosted.org/packages/91/d3/7e1b972501eb5466b9aca46a9c31bcbbdc3ea5a076e9ab33f4438c1d069d/rpds_py-0.24.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:951cc481c0c395c4a08639a469d53b7d4afa252529a085418b82a6b43c45c240", size = 390360 },
1477
+ { url = "https://files.pythonhosted.org/packages/a2/a8/ccabb50d3c91c26ad01f9b09a6a3b03e4502ce51a33867c38446df9f896b/rpds_py-0.24.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c9ca89938dff18828a328af41ffdf3902405a19f4131c88e22e776a8e228c5a8", size = 400704 },
1478
+ { url = "https://files.pythonhosted.org/packages/53/ae/5fa5bf0f3bc6ce21b5ea88fc0ecd3a439e7cb09dd5f9ffb3dbe1b6894fc5/rpds_py-0.24.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed0ef550042a8dbcd657dfb284a8ee00f0ba269d3f2286b0493b15a5694f9fe8", size = 450839 },
1479
+ { url = "https://files.pythonhosted.org/packages/e3/ac/c4e18b36d9938247e2b54f6a03746f3183ca20e1edd7d3654796867f5100/rpds_py-0.24.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b2356688e5d958c4d5cb964af865bea84db29971d3e563fb78e46e20fe1848b", size = 441494 },
1480
+ { url = "https://files.pythonhosted.org/packages/bf/08/b543969c12a8f44db6c0f08ced009abf8f519191ca6985509e7c44102e3c/rpds_py-0.24.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78884d155fd15d9f64f5d6124b486f3d3f7fd7cd71a78e9670a0f6f6ca06fb2d", size = 393185 },
1481
+ { url = "https://files.pythonhosted.org/packages/da/7e/f6eb6a7042ce708f9dfc781832a86063cea8a125bbe451d663697b51944f/rpds_py-0.24.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6a4a535013aeeef13c5532f802708cecae8d66c282babb5cd916379b72110cf7", size = 426168 },
1482
+ { url = "https://files.pythonhosted.org/packages/38/b0/6cd2bb0509ac0b51af4bb138e145b7c4c902bb4b724d6fd143689d6e0383/rpds_py-0.24.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:84e0566f15cf4d769dade9b366b7b87c959be472c92dffb70462dd0844d7cbad", size = 567622 },
1483
+ { url = "https://files.pythonhosted.org/packages/64/b0/c401f4f077547d98e8b4c2ec6526a80e7cb04f519d416430ec1421ee9e0b/rpds_py-0.24.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:823e74ab6fbaa028ec89615ff6acb409e90ff45580c45920d4dfdddb069f2120", size = 595435 },
1484
+ { url = "https://files.pythonhosted.org/packages/9f/ec/7993b6e803294c87b61c85bd63e11142ccfb2373cf88a61ec602abcbf9d6/rpds_py-0.24.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c61a2cb0085c8783906b2f8b1f16a7e65777823c7f4d0a6aaffe26dc0d358dd9", size = 563762 },
1485
+ { url = "https://files.pythonhosted.org/packages/1f/29/4508003204cb2f461dc2b83dd85f8aa2b915bc98fe6046b9d50d4aa05401/rpds_py-0.24.0-cp313-cp313-win32.whl", hash = "sha256:60d9b630c8025b9458a9d114e3af579a2c54bd32df601c4581bd054e85258143", size = 223510 },
1486
+ { url = "https://files.pythonhosted.org/packages/f9/12/09e048d1814195e01f354155fb772fb0854bd3450b5f5a82224b3a319f0e/rpds_py-0.24.0-cp313-cp313-win_amd64.whl", hash = "sha256:6eea559077d29486c68218178ea946263b87f1c41ae7f996b1f30a983c476a5a", size = 239075 },
1487
+ { url = "https://files.pythonhosted.org/packages/d2/03/5027cde39bb2408d61e4dd0cf81f815949bb629932a6c8df1701d0257fc4/rpds_py-0.24.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:d09dc82af2d3c17e7dd17120b202a79b578d79f2b5424bda209d9966efeed114", size = 362974 },
1488
+ { url = "https://files.pythonhosted.org/packages/bf/10/24d374a2131b1ffafb783e436e770e42dfdb74b69a2cd25eba8c8b29d861/rpds_py-0.24.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5fc13b44de6419d1e7a7e592a4885b323fbc2f46e1f22151e3a8ed3b8b920405", size = 348730 },
1489
+ { url = "https://files.pythonhosted.org/packages/7a/d1/1ef88d0516d46cd8df12e5916966dbf716d5ec79b265eda56ba1b173398c/rpds_py-0.24.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c347a20d79cedc0a7bd51c4d4b7dbc613ca4e65a756b5c3e57ec84bd43505b47", size = 387627 },
1490
+ { url = "https://files.pythonhosted.org/packages/4e/35/07339051b8b901ecefd449ebf8e5522e92bcb95e1078818cbfd9db8e573c/rpds_py-0.24.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:20f2712bd1cc26a3cc16c5a1bfee9ed1abc33d4cdf1aabd297fe0eb724df4272", size = 394094 },
1491
+ { url = "https://files.pythonhosted.org/packages/dc/62/ee89ece19e0ba322b08734e95441952062391065c157bbd4f8802316b4f1/rpds_py-0.24.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aad911555286884be1e427ef0dc0ba3929e6821cbeca2194b13dc415a462c7fd", size = 449639 },
1492
+ { url = "https://files.pythonhosted.org/packages/15/24/b30e9f9e71baa0b9dada3a4ab43d567c6b04a36d1cb531045f7a8a0a7439/rpds_py-0.24.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0aeb3329c1721c43c58cae274d7d2ca85c1690d89485d9c63a006cb79a85771a", size = 438584 },
1493
+ { url = "https://files.pythonhosted.org/packages/28/d9/49f7b8f3b4147db13961e19d5e30077cd0854ccc08487026d2cb2142aa4a/rpds_py-0.24.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a0f156e9509cee987283abd2296ec816225145a13ed0391df8f71bf1d789e2d", size = 391047 },
1494
+ { url = "https://files.pythonhosted.org/packages/49/b0/e66918d0972c33a259ba3cd7b7ff10ed8bd91dbcfcbec6367b21f026db75/rpds_py-0.24.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aa6800adc8204ce898c8a424303969b7aa6a5e4ad2789c13f8648739830323b7", size = 418085 },
1495
+ { url = "https://files.pythonhosted.org/packages/e1/6b/99ed7ea0a94c7ae5520a21be77a82306aac9e4e715d4435076ead07d05c6/rpds_py-0.24.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a18fc371e900a21d7392517c6f60fe859e802547309e94313cd8181ad9db004d", size = 564498 },
1496
+ { url = "https://files.pythonhosted.org/packages/28/26/1cacfee6b800e6fb5f91acecc2e52f17dbf8b0796a7c984b4568b6d70e38/rpds_py-0.24.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:9168764133fd919f8dcca2ead66de0105f4ef5659cbb4fa044f7014bed9a1797", size = 590202 },
1497
+ { url = "https://files.pythonhosted.org/packages/a9/9e/57bd2f9fba04a37cef673f9a66b11ca8c43ccdd50d386c455cd4380fe461/rpds_py-0.24.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5f6e3cec44ba05ee5cbdebe92d052f69b63ae792e7d05f1020ac5e964394080c", size = 561771 },
1498
+ { url = "https://files.pythonhosted.org/packages/9f/cf/b719120f375ab970d1c297dbf8de1e3c9edd26fe92c0ed7178dd94b45992/rpds_py-0.24.0-cp313-cp313t-win32.whl", hash = "sha256:8ebc7e65ca4b111d928b669713865f021b7773350eeac4a31d3e70144297baba", size = 221195 },
1499
+ { url = "https://files.pythonhosted.org/packages/2d/e5/22865285789f3412ad0c3d7ec4dc0a3e86483b794be8a5d9ed5a19390900/rpds_py-0.24.0-cp313-cp313t-win_amd64.whl", hash = "sha256:675269d407a257b8c00a6b58205b72eec8231656506c56fd429d924ca00bb350", size = 237354 },
1500
+ ]
1501
+
1502
  [[package]]
1503
  name = "safetensors"
1504
  version = "0.5.3"
 
1573
  { url = "https://files.pythonhosted.org/packages/0a/c8/b3f566db71461cabd4b2d5b39bcc24a7e1c119535c8361f81426be39bb47/scipy-1.15.2-cp313-cp313t-win_amd64.whl", hash = "sha256:fe8a9eb875d430d81755472c5ba75e84acc980e4a8f6204d402849234d3017db", size = 40477705 },
1574
  ]
1575
 
1576
+ [[package]]
1577
+ name = "semantic-version"
1578
+ version = "2.10.0"
1579
+ source = { registry = "https://pypi.org/simple" }
1580
+ sdist = { url = "https://files.pythonhosted.org/packages/7d/31/f2289ce78b9b473d582568c234e104d2a342fd658cc288a7553d83bb8595/semantic_version-2.10.0.tar.gz", hash = "sha256:bdabb6d336998cbb378d4b9db3a4b56a1e3235701dc05ea2690d9a997ed5041c", size = 52289 }
1581
+ wheels = [
1582
+ { url = "https://files.pythonhosted.org/packages/6a/23/8146aad7d88f4fcb3a6218f41a60f6c2d4e3a72de72da1825dc7c8f7877c/semantic_version-2.10.0-py2.py3-none-any.whl", hash = "sha256:de78a3b8e0feda74cabc54aab2da702113e33ac9d9eb9d2389bcf1f58b7d9177", size = 15552 },
1583
+ ]
1584
+
1585
+ [[package]]
1586
+ name = "sentry-sdk"
1587
+ version = "2.25.1"
1588
+ source = { registry = "https://pypi.org/simple" }
1589
+ dependencies = [
1590
+ { name = "certifi" },
1591
+ { name = "urllib3" },
1592
+ ]
1593
+ sdist = { url = "https://files.pythonhosted.org/packages/85/2f/a0f732270cc7c1834f5ec45539aec87c360d5483a8bd788217a9102ccfbd/sentry_sdk-2.25.1.tar.gz", hash = "sha256:f9041b7054a7cf12d41eadabe6458ce7c6d6eea7a97cfe1b760b6692e9562cf0", size = 322190 }
1594
+ wheels = [
1595
+ { url = "https://files.pythonhosted.org/packages/96/b6/84049ab0967affbc7cc7590d86ae0170c1b494edb69df8786707100420e5/sentry_sdk-2.25.1-py2.py3-none-any.whl", hash = "sha256:60b016d0772789454dc55a284a6a44212044d4a16d9f8448725effee97aaf7f6", size = 339851 },
1596
+ ]
1597
+
1598
  [[package]]
1599
  name = "setuptools"
1600
  version = "78.1.0"
 
1604
  { url = "https://files.pythonhosted.org/packages/54/21/f43f0a1fa8b06b32812e0975981f4677d28e0f3271601dc88ac5a5b83220/setuptools-78.1.0-py3-none-any.whl", hash = "sha256:3e386e96793c8702ae83d17b853fb93d3e09ef82ec62722e61da5cd22376dcd8", size = 1256108 },
1605
  ]
1606
 
1607
+ [[package]]
1608
+ name = "simplejson"
1609
+ version = "3.20.1"
1610
+ source = { registry = "https://pypi.org/simple" }
1611
+ sdist = { url = "https://files.pythonhosted.org/packages/af/92/51b417685abd96b31308b61b9acce7ec50d8e1de8fbc39a7fd4962c60689/simplejson-3.20.1.tar.gz", hash = "sha256:e64139b4ec4f1f24c142ff7dcafe55a22b811a74d86d66560c8815687143037d", size = 85591 }
1612
+ wheels = [
1613
+ { url = "https://files.pythonhosted.org/packages/c4/03/0f453a27877cb5a5fff16a975925f4119102cc8552f52536b9a98ef0431e/simplejson-3.20.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:71e849e7ceb2178344998cbe5ade101f1b329460243c79c27fbfc51c0447a7c3", size = 93109 },
1614
+ { url = "https://files.pythonhosted.org/packages/74/1f/a729f4026850cabeaff23e134646c3f455e86925d2533463420635ae54de/simplejson-3.20.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b63fdbab29dc3868d6f009a59797cefaba315fd43cd32ddd998ee1da28e50e29", size = 75475 },
1615
+ { url = "https://files.pythonhosted.org/packages/e2/14/50a2713fee8ff1f8d655b1a14f4a0f1c0c7246768a1b3b3d12964a4ed5aa/simplejson-3.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1190f9a3ce644fd50ec277ac4a98c0517f532cfebdcc4bd975c0979a9f05e1fb", size = 75112 },
1616
+ { url = "https://files.pythonhosted.org/packages/45/86/ea9835abb646755140e2d482edc9bc1e91997ed19a59fd77ae4c6a0facea/simplejson-3.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1336ba7bcb722ad487cd265701ff0583c0bb6de638364ca947bb84ecc0015d1", size = 150245 },
1617
+ { url = "https://files.pythonhosted.org/packages/12/b4/53084809faede45da829fe571c65fbda8479d2a5b9c633f46b74124d56f5/simplejson-3.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e975aac6a5acd8b510eba58d5591e10a03e3d16c1cf8a8624ca177491f7230f0", size = 158465 },
1618
+ { url = "https://files.pythonhosted.org/packages/a9/7d/d56579468d1660b3841e1f21c14490d103e33cf911886b22652d6e9683ec/simplejson-3.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6a6dd11ee282937ad749da6f3b8d87952ad585b26e5edfa10da3ae2536c73078", size = 148514 },
1619
+ { url = "https://files.pythonhosted.org/packages/19/e3/874b1cca3d3897b486d3afdccc475eb3a09815bf1015b01cf7fcb52a55f0/simplejson-3.20.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab980fcc446ab87ea0879edad41a5c28f2d86020014eb035cf5161e8de4474c6", size = 152262 },
1620
+ { url = "https://files.pythonhosted.org/packages/32/84/f0fdb3625292d945c2bd13a814584603aebdb38cfbe5fe9be6b46fe598c4/simplejson-3.20.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f5aee2a4cb6b146bd17333ac623610f069f34e8f31d2f4f0c1a2186e50c594f0", size = 150164 },
1621
+ { url = "https://files.pythonhosted.org/packages/95/51/6d625247224f01eaaeabace9aec75ac5603a42f8ebcce02c486fbda8b428/simplejson-3.20.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:652d8eecbb9a3b6461b21ec7cf11fd0acbab144e45e600c817ecf18e4580b99e", size = 151795 },
1622
+ { url = "https://files.pythonhosted.org/packages/7f/d9/bb921df6b35be8412f519e58e86d1060fddf3ad401b783e4862e0a74c4c1/simplejson-3.20.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:8c09948f1a486a89251ee3a67c9f8c969b379f6ffff1a6064b41fea3bce0a112", size = 159027 },
1623
+ { url = "https://files.pythonhosted.org/packages/03/c5/5950605e4ad023a6621cf4c931b29fd3d2a9c1f36be937230bfc83d7271d/simplejson-3.20.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:cbbd7b215ad4fc6f058b5dd4c26ee5c59f72e031dfda3ac183d7968a99e4ca3a", size = 154380 },
1624
+ { url = "https://files.pythonhosted.org/packages/66/ad/b74149557c5ec1e4e4d55758bda426f5d2ec0123cd01a53ae63b8de51fa3/simplejson-3.20.1-cp313-cp313-win32.whl", hash = "sha256:ae81e482476eaa088ef9d0120ae5345de924f23962c0c1e20abbdff597631f87", size = 74102 },
1625
+ { url = "https://files.pythonhosted.org/packages/db/a9/25282fdd24493e1022f30b7f5cdf804255c007218b2bfaa655bd7ad34b2d/simplejson-3.20.1-cp313-cp313-win_amd64.whl", hash = "sha256:1b9fd15853b90aec3b1739f4471efbf1ac05066a2c7041bf8db821bb73cd2ddc", size = 75736 },
1626
+ { url = "https://files.pythonhosted.org/packages/4b/30/00f02a0a921556dd5a6db1ef2926a1bc7a8bbbfb1c49cfed68a275b8ab2b/simplejson-3.20.1-py3-none-any.whl", hash = "sha256:8a6c1bbac39fa4a79f83cbf1df6ccd8ff7069582a9fd8db1e52cea073bc2c697", size = 57121 },
1627
+ ]
1628
+
1629
  [[package]]
1630
  name = "six"
1631
  version = "1.17.0"
 
1635
  { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050 },
1636
  ]
1637
 
1638
+ [[package]]
1639
+ name = "smmap"
1640
+ version = "5.0.2"
1641
+ source = { registry = "https://pypi.org/simple" }
1642
+ sdist = { url = "https://files.pythonhosted.org/packages/44/cd/a040c4b3119bbe532e5b0732286f805445375489fceaec1f48306068ee3b/smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5", size = 22329 }
1643
+ wheels = [
1644
+ { url = "https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e", size = 24303 },
1645
+ ]
1646
+
1647
  [[package]]
1648
  name = "stack-data"
1649
  version = "0.6.3"
 
1658
  { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521 },
1659
  ]
1660
 
1661
+ [[package]]
1662
+ name = "streamlit"
1663
+ version = "1.44.1"
1664
+ source = { registry = "https://pypi.org/simple" }
1665
+ dependencies = [
1666
+ { name = "altair" },
1667
+ { name = "blinker" },
1668
+ { name = "cachetools" },
1669
+ { name = "click" },
1670
+ { name = "gitpython" },
1671
+ { name = "numpy" },
1672
+ { name = "packaging" },
1673
+ { name = "pandas" },
1674
+ { name = "pillow" },
1675
+ { name = "protobuf" },
1676
+ { name = "pyarrow" },
1677
+ { name = "pydeck" },
1678
+ { name = "requests" },
1679
+ { name = "tenacity" },
1680
+ { name = "toml" },
1681
+ { name = "tornado" },
1682
+ { name = "typing-extensions" },
1683
+ { name = "watchdog", marker = "sys_platform != 'darwin'" },
1684
+ ]
1685
+ sdist = { url = "https://files.pythonhosted.org/packages/3e/c0/7286284567e5045f0c587c426d0c41aee5d10c0a2e360e627a83037e9f0c/streamlit-1.44.1.tar.gz", hash = "sha256:c6914ed6d5b76870b461510476806db370f36425ae0e6654d227c988288198d3", size = 9423685 }
1686
+ wheels = [
1687
+ { url = "https://files.pythonhosted.org/packages/eb/17/fc425e1d4d86e31b2aaf0812a2ef2163763a0670d671720c7c36e8679323/streamlit-1.44.1-py3-none-any.whl", hash = "sha256:9fe355f58b11f4eb71e74f115ce1f38c4c9eaff2733e6bcffb510ac1298a5990", size = 9812242 },
1688
+ ]
1689
+
1690
  [[package]]
1691
  name = "sympy"
1692
  version = "1.13.1"
 
1699
  { url = "https://files.pythonhosted.org/packages/b2/fe/81695a1aa331a842b582453b605175f419fe8540355886031328089d840a/sympy-1.13.1-py3-none-any.whl", hash = "sha256:db36cdc64bf61b9b24578b6f7bab1ecdd2452cf008f34faa33776680c26d66f8", size = 6189177 },
1700
  ]
1701
 
1702
+ [[package]]
1703
+ name = "tenacity"
1704
+ version = "9.1.2"
1705
+ source = { registry = "https://pypi.org/simple" }
1706
+ sdist = { url = "https://files.pythonhosted.org/packages/0a/d4/2b0cd0fe285e14b36db076e78c93766ff1d529d70408bd1d2a5a84f1d929/tenacity-9.1.2.tar.gz", hash = "sha256:1169d376c297e7de388d18b4481760d478b0e99a777cad3a9c86e556f4b697cb", size = 48036 }
1707
+ wheels = [
1708
+ { url = "https://files.pythonhosted.org/packages/e5/30/643397144bfbfec6f6ef821f36f33e57d35946c44a2352d3c9f0ae847619/tenacity-9.1.2-py3-none-any.whl", hash = "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138", size = 28248 },
1709
+ ]
1710
+
1711
  [[package]]
1712
  name = "threadpoolctl"
1713
  version = "3.6.0"
 
1742
  { url = "https://files.pythonhosted.org/packages/e6/b6/072a8e053ae600dcc2ac0da81a23548e3b523301a442a6ca900e92ac35be/tokenizers-0.21.1-cp39-abi3-win_amd64.whl", hash = "sha256:0f0dcbcc9f6e13e675a66d7a5f2f225a736745ce484c1a4e07476a89ccdad382", size = 2435481 },
1743
  ]
1744
 
1745
+ [[package]]
1746
+ name = "toml"
1747
+ version = "0.10.2"
1748
+ source = { registry = "https://pypi.org/simple" }
1749
+ sdist = { url = "https://files.pythonhosted.org/packages/be/ba/1f744cdc819428fc6b5084ec34d9b30660f6f9daaf70eead706e3203ec3c/toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f", size = 22253 }
1750
+ wheels = [
1751
+ { url = "https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", size = 16588 },
1752
+ ]
1753
+
1754
  [[package]]
1755
  name = "torch"
1756
  version = "2.6.0"
 
1880
  { url = "https://files.pythonhosted.org/packages/c8/19/4ec628951a74043532ca2cf5d97b7b14863931476d117c471e8e2b1eb39f/urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", size = 128369 },
1881
  ]
1882
 
1883
+ [[package]]
1884
+ name = "watchdog"
1885
+ version = "6.0.0"
1886
+ source = { registry = "https://pypi.org/simple" }
1887
+ sdist = { url = "https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282", size = 131220 }
1888
+ wheels = [
1889
+ { url = "https://files.pythonhosted.org/packages/a9/c7/ca4bf3e518cb57a686b2feb4f55a1892fd9a3dd13f470fca14e00f80ea36/watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13", size = 79079 },
1890
+ { url = "https://files.pythonhosted.org/packages/5c/51/d46dc9332f9a647593c947b4b88e2381c8dfc0942d15b8edc0310fa4abb1/watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379", size = 79078 },
1891
+ { url = "https://files.pythonhosted.org/packages/d4/57/04edbf5e169cd318d5f07b4766fee38e825d64b6913ca157ca32d1a42267/watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e", size = 79076 },
1892
+ { url = "https://files.pythonhosted.org/packages/ab/cc/da8422b300e13cb187d2203f20b9253e91058aaf7db65b74142013478e66/watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f", size = 79077 },
1893
+ { url = "https://files.pythonhosted.org/packages/2c/3b/b8964e04ae1a025c44ba8e4291f86e97fac443bca31de8bd98d3263d2fcf/watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26", size = 79078 },
1894
+ { url = "https://files.pythonhosted.org/packages/62/ae/a696eb424bedff7407801c257d4b1afda455fe40821a2be430e173660e81/watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c", size = 79077 },
1895
+ { url = "https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2", size = 79078 },
1896
+ { url = "https://files.pythonhosted.org/packages/07/f6/d0e5b343768e8bcb4cda79f0f2f55051bf26177ecd5651f84c07567461cf/watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a", size = 79065 },
1897
+ { url = "https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680", size = 79070 },
1898
+ { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067 },
1899
+ ]
1900
+
1901
  [[package]]
1902
  name = "wcwidth"
1903
  version = "0.2.13"
 
1907
  { url = "https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", size = 34166 },
1908
  ]
1909
 
1910
+ [[package]]
1911
+ name = "widgetsnbextension"
1912
+ version = "4.0.13"
1913
+ source = { registry = "https://pypi.org/simple" }
1914
+ sdist = { url = "https://files.pythonhosted.org/packages/56/fc/238c424fd7f4ebb25f8b1da9a934a3ad7c848286732ae04263661eb0fc03/widgetsnbextension-4.0.13.tar.gz", hash = "sha256:ffcb67bc9febd10234a362795f643927f4e0c05d9342c727b65d2384f8feacb6", size = 1164730 }
1915
+ wheels = [
1916
+ { url = "https://files.pythonhosted.org/packages/21/02/88b65cc394961a60c43c70517066b6b679738caf78506a5da7b88ffcb643/widgetsnbextension-4.0.13-py3-none-any.whl", hash = "sha256:74b2692e8500525cc38c2b877236ba51d34541e6385eeed5aec15a70f88a6c71", size = 2335872 },
1917
+ ]
1918
+
1919
+ [[package]]
1920
+ name = "win32-setctime"
1921
+ version = "1.2.0"
1922
+ source = { registry = "https://pypi.org/simple" }
1923
+ sdist = { url = "https://files.pythonhosted.org/packages/b3/8f/705086c9d734d3b663af0e9bb3d4de6578d08f46b1b101c2442fd9aecaa2/win32_setctime-1.2.0.tar.gz", hash = "sha256:ae1fdf948f5640aae05c511ade119313fb6a30d7eabe25fef9764dca5873c4c0", size = 4867 }
1924
+ wheels = [
1925
+ { url = "https://files.pythonhosted.org/packages/e1/07/c6fe3ad3e685340704d314d765b7912993bcb8dc198f0e7a89382d37974b/win32_setctime-1.2.0-py3-none-any.whl", hash = "sha256:95d644c4e708aba81dc3704a116d8cbc974d70b3bdb8be1d150e36be6e9d1390", size = 4083 },
1926
+ ]
1927
+
1928
+ [[package]]
1929
+ name = "wrapt"
1930
+ version = "1.17.2"
1931
+ source = { registry = "https://pypi.org/simple" }
1932
+ sdist = { url = "https://files.pythonhosted.org/packages/c3/fc/e91cc220803d7bc4db93fb02facd8461c37364151b8494762cc88b0fbcef/wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3", size = 55531 }
1933
+ wheels = [
1934
+ { url = "https://files.pythonhosted.org/packages/ce/b9/0ffd557a92f3b11d4c5d5e0c5e4ad057bd9eb8586615cdaf901409920b14/wrapt-1.17.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6ed6ffac43aecfe6d86ec5b74b06a5be33d5bb9243d055141e8cabb12aa08125", size = 53800 },
1935
+ { url = "https://files.pythonhosted.org/packages/c0/ef/8be90a0b7e73c32e550c73cfb2fa09db62234227ece47b0e80a05073b375/wrapt-1.17.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:35621ae4c00e056adb0009f8e86e28eb4a41a4bfa8f9bfa9fca7d343fe94f998", size = 38824 },
1936
+ { url = "https://files.pythonhosted.org/packages/36/89/0aae34c10fe524cce30fe5fc433210376bce94cf74d05b0d68344c8ba46e/wrapt-1.17.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a604bf7a053f8362d27eb9fefd2097f82600b856d5abe996d623babd067b1ab5", size = 38920 },
1937
+ { url = "https://files.pythonhosted.org/packages/3b/24/11c4510de906d77e0cfb5197f1b1445d4fec42c9a39ea853d482698ac681/wrapt-1.17.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cbabee4f083b6b4cd282f5b817a867cf0b1028c54d445b7ec7cfe6505057cf8", size = 88690 },
1938
+ { url = "https://files.pythonhosted.org/packages/71/d7/cfcf842291267bf455b3e266c0c29dcb675b5540ee8b50ba1699abf3af45/wrapt-1.17.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49703ce2ddc220df165bd2962f8e03b84c89fee2d65e1c24a7defff6f988f4d6", size = 80861 },
1939
+ { url = "https://files.pythonhosted.org/packages/d5/66/5d973e9f3e7370fd686fb47a9af3319418ed925c27d72ce16b791231576d/wrapt-1.17.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8112e52c5822fc4253f3901b676c55ddf288614dc7011634e2719718eaa187dc", size = 89174 },
1940
+ { url = "https://files.pythonhosted.org/packages/a7/d3/8e17bb70f6ae25dabc1aaf990f86824e4fd98ee9cadf197054e068500d27/wrapt-1.17.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9fee687dce376205d9a494e9c121e27183b2a3df18037f89d69bd7b35bcf59e2", size = 86721 },
1941
+ { url = "https://files.pythonhosted.org/packages/6f/54/f170dfb278fe1c30d0ff864513cff526d624ab8de3254b20abb9cffedc24/wrapt-1.17.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:18983c537e04d11cf027fbb60a1e8dfd5190e2b60cc27bc0808e653e7b218d1b", size = 79763 },
1942
+ { url = "https://files.pythonhosted.org/packages/4a/98/de07243751f1c4a9b15c76019250210dd3486ce098c3d80d5f729cba029c/wrapt-1.17.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:703919b1633412ab54bcf920ab388735832fdcb9f9a00ae49387f0fe67dad504", size = 87585 },
1943
+ { url = "https://files.pythonhosted.org/packages/f9/f0/13925f4bd6548013038cdeb11ee2cbd4e37c30f8bfd5db9e5a2a370d6e20/wrapt-1.17.2-cp313-cp313-win32.whl", hash = "sha256:abbb9e76177c35d4e8568e58650aa6926040d6a9f6f03435b7a522bf1c487f9a", size = 36676 },
1944
+ { url = "https://files.pythonhosted.org/packages/bf/ae/743f16ef8c2e3628df3ddfd652b7d4c555d12c84b53f3d8218498f4ade9b/wrapt-1.17.2-cp313-cp313-win_amd64.whl", hash = "sha256:69606d7bb691b50a4240ce6b22ebb319c1cfb164e5f6569835058196e0f3a845", size = 38871 },
1945
+ { url = "https://files.pythonhosted.org/packages/3d/bc/30f903f891a82d402ffb5fda27ec1d621cc97cb74c16fea0b6141f1d4e87/wrapt-1.17.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4a721d3c943dae44f8e243b380cb645a709ba5bd35d3ad27bc2ed947e9c68192", size = 56312 },
1946
+ { url = "https://files.pythonhosted.org/packages/8a/04/c97273eb491b5f1c918857cd26f314b74fc9b29224521f5b83f872253725/wrapt-1.17.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:766d8bbefcb9e00c3ac3b000d9acc51f1b399513f44d77dfe0eb026ad7c9a19b", size = 40062 },
1947
+ { url = "https://files.pythonhosted.org/packages/4e/ca/3b7afa1eae3a9e7fefe499db9b96813f41828b9fdb016ee836c4c379dadb/wrapt-1.17.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e496a8ce2c256da1eb98bd15803a79bee00fc351f5dfb9ea82594a3f058309e0", size = 40155 },
1948
+ { url = "https://files.pythonhosted.org/packages/89/be/7c1baed43290775cb9030c774bc53c860db140397047cc49aedaf0a15477/wrapt-1.17.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d615e4fe22f4ad3528448c193b218e077656ca9ccb22ce2cb20db730f8d306", size = 113471 },
1949
+ { url = "https://files.pythonhosted.org/packages/32/98/4ed894cf012b6d6aae5f5cc974006bdeb92f0241775addad3f8cd6ab71c8/wrapt-1.17.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5aaeff38654462bc4b09023918b7f21790efb807f54c000a39d41d69cf552cb", size = 101208 },
1950
+ { url = "https://files.pythonhosted.org/packages/ea/fd/0c30f2301ca94e655e5e057012e83284ce8c545df7661a78d8bfca2fac7a/wrapt-1.17.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7d15bbd2bc99e92e39f49a04653062ee6085c0e18b3b7512a4f2fe91f2d681", size = 109339 },
1951
+ { url = "https://files.pythonhosted.org/packages/75/56/05d000de894c4cfcb84bcd6b1df6214297b8089a7bd324c21a4765e49b14/wrapt-1.17.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e3890b508a23299083e065f435a492b5435eba6e304a7114d2f919d400888cc6", size = 110232 },
1952
+ { url = "https://files.pythonhosted.org/packages/53/f8/c3f6b2cf9b9277fb0813418e1503e68414cd036b3b099c823379c9575e6d/wrapt-1.17.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8c8b293cd65ad716d13d8dd3624e42e5a19cc2a2f1acc74b30c2c13f15cb61a6", size = 100476 },
1953
+ { url = "https://files.pythonhosted.org/packages/a7/b1/0bb11e29aa5139d90b770ebbfa167267b1fc548d2302c30c8f7572851738/wrapt-1.17.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c82b8785d98cdd9fed4cac84d765d234ed3251bd6afe34cb7ac523cb93e8b4f", size = 106377 },
1954
+ { url = "https://files.pythonhosted.org/packages/6a/e1/0122853035b40b3f333bbb25f1939fc1045e21dd518f7f0922b60c156f7c/wrapt-1.17.2-cp313-cp313t-win32.whl", hash = "sha256:13e6afb7fe71fe7485a4550a8844cc9ffbe263c0f1a1eea569bc7091d4898555", size = 37986 },
1955
+ { url = "https://files.pythonhosted.org/packages/09/5e/1655cf481e079c1f22d0cabdd4e51733679932718dc23bf2db175f329b76/wrapt-1.17.2-cp313-cp313t-win_amd64.whl", hash = "sha256:eaf675418ed6b3b31c7a989fd007fa7c3be66ce14e5c3b27336383604c9da85c", size = 40750 },
1956
+ { url = "https://files.pythonhosted.org/packages/2d/82/f56956041adef78f849db6b289b282e72b55ab8045a75abad81898c28d19/wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8", size = 23594 },
1957
+ ]
1958
+
1959
+ [[package]]
1960
+ name = "wurlitzer"
1961
+ version = "3.1.1"
1962
+ source = { registry = "https://pypi.org/simple" }
1963
+ sdist = { url = "https://files.pythonhosted.org/packages/33/90/623f99c55c7d0727a58eb2b7dfb65cb406c561a5c2e9a95b0d6a450c473d/wurlitzer-3.1.1.tar.gz", hash = "sha256:bfb9144ab9f02487d802b9ff89dbd3fa382d08f73e12db8adc4c2fb00cd39bd9", size = 11867 }
1964
+ wheels = [
1965
+ { url = "https://files.pythonhosted.org/packages/9a/24/93ce54550a9dd3fd996ed477f00221f215bf6da3580397fbc138d6036e2e/wurlitzer-3.1.1-py3-none-any.whl", hash = "sha256:0b2749c2cde3ef640bf314a9f94b24d929fe1ca476974719a6909dfc568c3aac", size = 8590 },
1966
+ ]
1967
+
1968
  [[package]]
1969
  name = "xxhash"
1970
  version = "3.5.0"