diff --git a/README.md b/README.md
index 4f045a1..ab43859 100644
--- a/README.md
+++ b/README.md
@@ -103,6 +103,129 @@ The final result can be visualised as,

+
+
+Reading order evaluations for DP-Bench
+
+
+👉 Evaluate the dataset,
+
+```sh
+poetry run evaluate -t evaluate -m reading_order -b DPBench -i ./benchmarks/dpbench-layout -o ./benchmarks/dpbench-layout
+```
+
+👉 Visualise the reading order evaluations,
+
+```sh
+poetry run evaluate -t visualize -m reading_order -b DPBench -i ./benchmarks/dpbench-layout -o ./benchmarks/dpbench-layout
+```
+
+Reading order (Norm Average Relative Distance) [mean|median|std]: [0.98|1.00|0.05]
+
+| x0<=ARD | ARD<=x1 | prob [%] | acc [%] | 1-acc [%] | total |
+|-----------|-----------|------------|-----------|-------------|---------|
+| 0 | 0.05 | 0 | 0 | 100 | 0 |
+| 0.05 | 0.1 | 0 | 0 | 100 | 0 |
+| 0.1 | 0.15 | 0 | 0 | 100 | 0 |
+| 0.15 | 0.2 | 0 | 0 | 100 | 0 |
+| 0.2 | 0.25 | 0 | 0 | 100 | 0 |
+| 0.25 | 0.3 | 0 | 0 | 100 | 0 |
+| 0.3 | 0.35 | 0 | 0 | 100 | 0 |
+| 0.35 | 0.4 | 0 | 0 | 100 | 0 |
+| 0.4 | 0.45 | 0 | 0 | 100 | 0 |
+| 0.45 | 0.5 | 0 | 0 | 100 | 0 |
+| 0.5 | 0.55 | 0 | 0 | 100 | 0 |
+| 0.55 | 0.6 | 0 | 0 | 100 | 0 |
+| 0.6 | 0.65 | 0 | 0 | 100 | 0 |
+| 0.65 | 0.7 | 1 | 0 | 100 | 2 |
+| 0.7 | 0.75 | 0.5 | 1 | 99 | 1 |
+| 0.75 | 0.8 | 1 | 1.5 | 98.5 | 2 |
+| 0.8 | 0.85 | 2.5 | 2.5 | 97.5 | 5 |
+| 0.85 | 0.9 | 0.5 | 5 | 95 | 1 |
+| 0.9 | 0.95 | 1.5 | 5.5 | 94.5 | 3 |
+| 0.95 | 1 | 93 | 7 | 93 | 186 |
+
+
+
+
+Reading order (Weighted Normalized Average Relative Distance) [mean|median|std]: [1.00|1.00|0.00]
+
+| x0<=Weighted ARD | Weighted ARD<=x1 | prob [%] | acc [%] | 1-acc [%] | total |
+|--------------------|--------------------|------------|-----------|-------------|---------|
+| 0 | 0.05 | 0 | 0 | 100 | 0 |
+| 0.05 | 0.1 | 0 | 0 | 100 | 0 |
+| 0.1 | 0.15 | 0 | 0 | 100 | 0 |
+| 0.15 | 0.2 | 0 | 0 | 100 | 0 |
+| 0.2 | 0.25 | 0 | 0 | 100 | 0 |
+| 0.25 | 0.3 | 0 | 0 | 100 | 0 |
+| 0.3 | 0.35 | 0 | 0 | 100 | 0 |
+| 0.35 | 0.4 | 0 | 0 | 100 | 0 |
+| 0.4 | 0.45 | 0 | 0 | 100 | 0 |
+| 0.45 | 0.5 | 0 | 0 | 100 | 0 |
+| 0.5 | 0.55 | 0 | 0 | 100 | 0 |
+| 0.55 | 0.6 | 0 | 0 | 100 | 0 |
+| 0.6 | 0.65 | 0 | 0 | 100 | 0 |
+| 0.65 | 0.7 | 0 | 0 | 100 | 0 |
+| 0.7 | 0.75 | 0 | 0 | 100 | 0 |
+| 0.75 | 0.8 | 0 | 0 | 100 | 0 |
+| 0.8 | 0.85 | 0 | 0 | 100 | 0 |
+| 0.85 | 0.9 | 0 | 0 | 100 | 0 |
+| 0.9 | 0.95 | 0 | 0 | 100 | 0 |
+| 0.95 | 1 | 100 | 0 | 100 | 200 |
+
+
+
+
+Additionally, images with the actual reading order visualizations are placed in: `benchmarks/dpbench-layout/reading_order_viz`
+
+
+
+
+Markdown text evaluations for DP-Bench
+
+
+👉 Evaluate the dataset,
+
+```sh
+poetry run evaluate -t evaluate -m markdown_text -b DPBench -i ./benchmarks/dpbench-layout -o ./benchmarks/dpbench-layout
+```
+
+👉 Visualise the markdown text evaluations,
+
+```sh
+poetry run evaluate -t visualize -m markdown_text -b DPBench -i ./benchmarks/dpbench-layout -o ./benchmarks/dpbench-layout
+```
+
+Markdown text (BLEU) [mean|median|std]: [0.81|0.87|0.20]
+
+| x0<=BlEU | BlEU<=x1 | prob [%] | acc [%] | 1-acc [%] | total |
+|------------|------------|------------|-----------|-------------|---------|
+| 0 | 0.05 | 1 | 0 | 100 | 2 |
+| 0.05 | 0.1 | 0.5 | 1 | 99 | 1 |
+| 0.1 | 0.15 | 0.5 | 1.5 | 98.5 | 1 |
+| 0.15 | 0.2 | 1.5 | 2 | 98 | 3 |
+| 0.2 | 0.25 | 1 | 3.5 | 96.5 | 2 |
+| 0.25 | 0.3 | 0 | 4.5 | 95.5 | 0 |
+| 0.3 | 0.35 | 0.5 | 4.5 | 95.5 | 1 |
+| 0.35 | 0.4 | 0 | 5 | 95 | 0 |
+| 0.4 | 0.45 | 0.5 | 5 | 95 | 1 |
+| 0.45 | 0.5 | 0.5 | 5.5 | 94.5 | 1 |
+| 0.5 | 0.55 | 3.5 | 6 | 94 | 7 |
+| 0.55 | 0.6 | 1 | 9.5 | 90.5 | 2 |
+| 0.6 | 0.65 | 4 | 10.5 | 89.5 | 8 |
+| 0.65 | 0.7 | 2 | 14.5 | 85.5 | 4 |
+| 0.7 | 0.75 | 3.5 | 16.5 | 83.5 | 7 |
+| 0.75 | 0.8 | 10 | 20 | 80 | 20 |
+| 0.8 | 0.85 | 9.5 | 30 | 70 | 19 |
+| 0.85 | 0.9 | 21 | 39.5 | 60.5 | 42 |
+| 0.9 | 0.95 | 22.5 | 60.5 | 39.5 | 45 |
+| 0.95 | 1 | 17 | 83 | 17 | 34 |
+
+The above quantiles have been also visualized as a histogram plot in: `benchmarks/dpbench-layout/evaluation_DPBench_markdown_text.png`
+
+
+
+
### OmniDocBench
Using a single command,
@@ -194,6 +317,125 @@ The final result can be visualised as,
| 0.95 | 1 | 16.97 | 83.03 | 16.97 | 56 |
+
+Reading order evaluations for OmniDocBench
+
+
+👉 Evaluate the dataset,
+
+```sh
+poetry run evaluate -t evaluate -m reading_order -b OmniDocBench -i ./benchmarks/omnidocbench-dataset/layout -o ./benchmarks/omnidocbench-dataset/layout
+```
+
+👉 Visualise the reading order evaluations,
+
+```sh
+poetry run evaluate -t visualize -m reading_order -b OmniDocBench -i ./benchmarks/omnidocbench-dataset/layout -o ./benchmarks/omnidocbench-dataset/layout
+```
+
+Reading order (Norm Average Relative Distance) [mean|median|std]: [0.84|0.84|0.12]
+
+| x0<=ARD | ARD<=x1 | prob [%] | acc [%] | 1-acc [%] | total |
+|-----------|-----------|------------|-----------|-------------|---------|
+| 0 | 0.05 | 0 | 0 | 100 | 0 |
+| 0.05 | 0.1 | 0 | 0 | 100 | 0 |
+| 0.1 | 0.15 | 0 | 0 | 100 | 0 |
+| 0.15 | 0.2 | 0 | 0 | 100 | 0 |
+| 0.2 | 0.25 | 0 | 0 | 100 | 0 |
+| 0.25 | 0.3 | 0 | 0 | 100 | 0 |
+| 0.3 | 0.35 | 0 | 0 | 100 | 0 |
+| 0.35 | 0.4 | 0 | 0 | 100 | 0 |
+| 0.4 | 0.45 | 0 | 0 | 100 | 0 |
+| 0.45 | 0.5 | 0 | 0 | 100 | 0 |
+| 0.5 | 0.55 | 1.53 | 0 | 100 | 15 |
+| 0.55 | 0.6 | 2.24 | 1.53 | 98.47 | 22 |
+| 0.6 | 0.65 | 2.55 | 3.77 | 96.23 | 25 |
+| 0.65 | 0.7 | 4.89 | 6.32 | 93.68 | 48 |
+| 0.7 | 0.75 | 8.15 | 11.21 | 88.79 | 80 |
+| 0.75 | 0.8 | 17.74 | 19.37 | 80.63 | 174 |
+| 0.8 | 0.85 | 17.43 | 37.1 | 62.9 | 171 |
+| 0.85 | 0.9 | 17.13 | 54.54 | 45.46 | 168 |
+| 0.9 | 0.95 | 7.44 | 71.66 | 28.34 | 73 |
+| 0.95 | 1 | 20.9 | 79.1 | 20.9 | 205 |
+
+
+
+
+Reading order (Weighted Normalized Average Relative Distance) [mean|median|std]: [0.99|0.99|0.03]
+
+| x0<=Weighted ARD | Weighted ARD<=x1 | prob [%] | acc [%] | 1-acc [%] | total |
+|--------------------|--------------------|------------|-----------|-------------|---------|
+| 0 | 0.05 | 0 | 0 | 100 | 0 |
+| 0.05 | 0.1 | 0 | 0 | 100 | 0 |
+| 0.1 | 0.15 | 0 | 0 | 100 | 0 |
+| 0.15 | 0.2 | 0 | 0 | 100 | 0 |
+| 0.2 | 0.25 | 0 | 0 | 100 | 0 |
+| 0.25 | 0.3 | 0 | 0 | 100 | 0 |
+| 0.3 | 0.35 | 0 | 0 | 100 | 0 |
+| 0.35 | 0.4 | 0 | 0 | 100 | 0 |
+| 0.4 | 0.45 | 0 | 0 | 100 | 0 |
+| 0.45 | 0.5 | 0 | 0 | 100 | 0 |
+| 0.5 | 0.55 | 0 | 0 | 100 | 0 |
+| 0.55 | 0.6 | 0 | 0 | 100 | 0 |
+| 0.6 | 0.65 | 0 | 0 | 100 | 0 |
+| 0.65 | 0.7 | 0 | 0 | 100 | 0 |
+| 0.7 | 0.75 | 0 | 0 | 100 | 0 |
+| 0.75 | 0.8 | 0.61 | 0 | 100 | 6 |
+| 0.8 | 0.85 | 0 | 0.61 | 99.39 | 0 |
+| 0.85 | 0.9 | 1.83 | 0.61 | 99.39 | 18 |
+| 0.9 | 0.95 | 4.28 | 2.45 | 97.55 | 42 |
+| 0.95 | 1 | 93.27 | 6.73 | 93.27 | 915 |
+
+
+
+
+
+
+
+Markdown text evaluations for OmniDocBench
+
+
+👉 Evaluate the dataset,
+
+```sh
+poetry run evaluate -t evaluate -m markdown_text -b OmniDocBench -i ./benchmarks/omnidocbench-dataset/layout -o ./benchmarks/omnidocbench-dataset/layout
+```
+
+👉 Visualise the markdown text evaluations,
+
+```sh
+poetry run evaluate -t visualize -m markdown_text -b OmniDocBench -i ./benchmarks/omnidocbench-dataset/layout -o ./benchmarks/omnidocbench-dataset/layout
+```
+
+Markdown text (BLEU) [mean|median|std]: [0.30|0.11|0.33]
+
+| x0<=BlEU | BlEU<=x1 | prob [%] | acc [%] | 1-acc [%] | total |
+|------------|------------|------------|-----------|-------------|---------|
+| 0 | 0.05 | 41.59 | 0 | 100 | 408 |
+| 0.05 | 0.1 | 6.83 | 41.59 | 58.41 | 67 |
+| 0.1 | 0.15 | 4.18 | 48.42 | 51.58 | 41 |
+| 0.15 | 0.2 | 3.26 | 52.6 | 47.4 | 32 |
+| 0.2 | 0.25 | 2.45 | 55.86 | 44.14 | 24 |
+| 0.25 | 0.3 | 1.83 | 58.31 | 41.69 | 18 |
+| 0.3 | 0.35 | 1.83 | 60.14 | 39.86 | 18 |
+| 0.35 | 0.4 | 2.04 | 61.98 | 38.02 | 20 |
+| 0.4 | 0.45 | 2.04 | 64.02 | 35.98 | 20 |
+| 0.45 | 0.5 | 2.55 | 66.06 | 33.94 | 25 |
+| 0.5 | 0.55 | 2.04 | 68.6 | 31.4 | 20 |
+| 0.55 | 0.6 | 2.04 | 70.64 | 29.36 | 20 |
+| 0.6 | 0.65 | 2.75 | 72.68 | 27.32 | 27 |
+| 0.65 | 0.7 | 2.96 | 75.43 | 24.57 | 29 |
+| 0.7 | 0.75 | 4.69 | 78.39 | 21.61 | 46 |
+| 0.75 | 0.8 | 4.28 | 83.08 | 16.92 | 42 |
+| 0.8 | 0.85 | 4.79 | 87.36 | 12.64 | 47 |
+| 0.85 | 0.9 | 4.59 | 92.15 | 7.85 | 45 |
+| 0.9 | 0.95 | 2.65 | 96.74 | 3.26 | 26 |
+| 0.95 | 1 | 0.61 | 99.39 | 0.61 | 6 |
+
+The above quantiles have been also visualized as a histogram plot in: `benchmarks/omnidocbench-dataset/layout/evaluation_OmniDocBench_markdown_text.png`
+
+
+
### FinTabNet
Using a single command (loading the dataset from Huggingface: [FinTabNet_OTSL](https://huggingface.co/datasets/ds4sd/FinTabNet_OTSL)),
diff --git a/docling_eval/benchmarks/constants.py b/docling_eval/benchmarks/constants.py
index 1f43ced..e78601d 100644
--- a/docling_eval/benchmarks/constants.py
+++ b/docling_eval/benchmarks/constants.py
@@ -29,6 +29,8 @@ class EvaluationModality(str, Enum):
LAYOUT = "layout"
TABLEFORMER = "tableformer"
CODEFORMER = "codeformer"
+ READING_ORDER = "reading_order"
+ MARKDOWN_TEXT = "markdown_text"
class BenchMarkNames(str, Enum):
diff --git a/docling_eval/benchmarks/dpbench/create.py b/docling_eval/benchmarks/dpbench/create.py
index e08b4f4..e08e9d9 100644
--- a/docling_eval/benchmarks/dpbench/create.py
+++ b/docling_eval/benchmarks/dpbench/create.py
@@ -446,108 +446,6 @@ def create_dpbench_tableformer_dataset(
)
-def create_dpbench_readingorder_dataset(
- dpbench_dir: Path, output_dir: Path, image_scale: float = 1.0
-):
- # Init the TableFormer model
- tf_updater = TableFormerUpdater()
-
- # load the groundtruth
- with open(dpbench_dir / f"dataset/reference.json", "r") as fr:
- gt = json.load(fr)
-
- viz_dir = output_dir / "vizualisations"
- os.makedirs(viz_dir, exist_ok=True)
-
- records = []
-
- for filename, annots in tqdm(
- gt.items(),
- desc="Processing files for DP-Bench with TableFormer",
- total=len(gt),
- ncols=128,
- ):
-
- pdf_path = dpbench_dir / f"dataset/pdfs/{filename}"
-
- # Create the groundtruth Document
- true_doc = DoclingDocument(name=f"ground-truth {os.path.basename(pdf_path)}")
- true_doc, true_page_images = add_pages_to_true_doc(
- pdf_path=pdf_path, true_doc=true_doc, image_scale=image_scale
- )
-
- assert len(true_page_images) == 1, "len(true_page_images)==1"
-
- page_width = true_doc.pages[1].size.width
- page_height = true_doc.pages[1].size.height
-
- for elem in annots["elements"]:
- update(
- true_doc,
- elem,
- page=true_doc.pages[1],
- page_image=true_page_images[0],
- page_width=page_width,
- page_height=page_height,
- )
-
- # Create the updated Document
- updated, pred_doc = tf_updater.replace_tabledata(
- pdf_path=pdf_path, true_doc=true_doc
- )
-
- if updated:
-
- if True:
- save_comparison_html(
- filename=viz_dir / f"{os.path.basename(pdf_path)}-comp.html",
- true_doc=true_doc,
- pred_doc=pred_doc,
- page_image=true_page_images[0],
- true_labels=TRUE_HTML_EXPORT_LABELS,
- pred_labels=PRED_HTML_EXPORT_LABELS,
- )
-
- true_doc, true_pictures, true_page_images = extract_images(
- document=true_doc,
- pictures_column=BenchMarkColumns.GROUNDTRUTH_PICTURES.value, # pictures_column,
- page_images_column=BenchMarkColumns.GROUNDTRUTH_PAGE_IMAGES.value, # page_images_column,
- )
-
- pred_doc, pred_pictures, pred_page_images = extract_images(
- document=pred_doc,
- pictures_column=BenchMarkColumns.PREDICTION_PICTURES.value, # pictures_column,
- page_images_column=BenchMarkColumns.PREDICTION_PAGE_IMAGES.value, # page_images_column,
- )
-
- record = {
- BenchMarkColumns.DOCLING_VERSION: docling_version(),
- BenchMarkColumns.STATUS: "SUCCESS",
- BenchMarkColumns.DOC_ID: str(os.path.basename(pdf_path)),
- BenchMarkColumns.GROUNDTRUTH: json.dumps(true_doc.export_to_dict()),
- BenchMarkColumns.PREDICTION: json.dumps(pred_doc.export_to_dict()),
- BenchMarkColumns.ORIGINAL: get_binary(pdf_path),
- BenchMarkColumns.MIMETYPE: "application/pdf",
- BenchMarkColumns.PREDICTION_PAGE_IMAGES: pred_page_images,
- BenchMarkColumns.PREDICTION_PICTURES: pred_pictures,
- BenchMarkColumns.GROUNDTRUTH_PAGE_IMAGES: true_page_images,
- BenchMarkColumns.GROUNDTRUTH_PICTURES: pred_pictures,
- }
- records.append(record)
-
- test_dir = output_dir / "test"
- os.makedirs(test_dir, exist_ok=True)
-
- save_shard_to_disk(items=records, dataset_path=test_dir)
-
- write_datasets_info(
- name="DPBench: readingorder",
- output_dir=output_dir,
- num_train_rows=0,
- num_test_rows=len(records),
- )
-
-
def parse_arguments():
"""Parse arguments for DP-Bench parsing."""
diff --git a/docling_eval/benchmarks/omnidocbench/create.py b/docling_eval/benchmarks/omnidocbench/create.py
index 29bb340..ddb192d 100644
--- a/docling_eval/benchmarks/omnidocbench/create.py
+++ b/docling_eval/benchmarks/omnidocbench/create.py
@@ -295,6 +295,7 @@ def create_omnidocbench_e2e_dataset(
assert len(true_page_images) == 1, "len(true_page_images)==1"
+ # The true_doc.pages is a dict with the page numbers as indices starting at 1
page_width = true_doc.pages[1].size.width
page_height = true_doc.pages[1].size.height
diff --git a/docling_eval/benchmarks/utils.py b/docling_eval/benchmarks/utils.py
index fb4217b..78dda6e 100644
--- a/docling_eval/benchmarks/utils.py
+++ b/docling_eval/benchmarks/utils.py
@@ -111,7 +111,7 @@ def write_datasets_info(
json.dump(dataset_infos, fw, indent=2)
-def get_input_document(file: Path):
+def get_input_document(file: Path) -> InputDocument:
return InputDocument(
path_or_stream=file,
format=InputFormat.PDF, # type: ignore[arg-type]
@@ -132,7 +132,7 @@ def add_pages_to_true_doc(
for page_no in range(0, in_doc.page_count):
page = Page(page_no=page_no)
- page._backend = in_doc._backend.load_page(page.page_no)
+ page._backend = in_doc._backend.load_page(page.page_no) # type: ignore[attr-defined]
if page._backend is not None and page._backend.is_valid():
page.size = page._backend.get_size()
@@ -300,6 +300,52 @@ def save_comparison_html(
fw.write(comparison_page)
+def draw_arrow(
+ draw: ImageDraw.ImageDraw,
+ arrow_coords: tuple[float, float, float, float],
+ line_width: int = 2,
+ color: str = "red",
+):
+ r"""
+ Draw an arrow inside the given draw object
+ """
+ x0, y0, x1, y1 = arrow_coords
+
+ # Arrow parameters
+ start_point = (x0, y0) # Starting point of the arrow
+ end_point = (x1, y1) # Ending point of the arrow
+ arrowhead_length = 20 # Length of the arrowhead
+ arrowhead_width = 10 # Width of the arrowhead
+
+ # Draw the arrow shaft (line)
+ draw.line([start_point, end_point], fill=color, width=line_width)
+
+ # Calculate the arrowhead points
+ dx = end_point[0] - start_point[0]
+ dy = end_point[1] - start_point[1]
+ angle = (dx**2 + dy**2) ** 0.5 + 0.01 # Length of the arrow shaft
+
+ # Normalized direction vector for the arrow shaft
+ ux, uy = dx / angle, dy / angle
+
+ # Base of the arrowhead
+ base_x = end_point[0] - ux * arrowhead_length
+ base_y = end_point[1] - uy * arrowhead_length
+
+ # Left and right points of the arrowhead
+ left_x = base_x - uy * arrowhead_width
+ left_y = base_y + ux * arrowhead_width
+ right_x = base_x + uy * arrowhead_width
+ right_y = base_y - ux * arrowhead_width
+
+ # Draw the arrowhead (triangle)
+ draw.polygon(
+ [end_point, (left_x, left_y), (right_x, right_y)],
+ fill=color,
+ )
+ return draw
+
+
def draw_clusters_with_reading_order(
doc: DoclingDocument,
page_image: Image.Image,
diff --git a/docling_eval/cli/main.py b/docling_eval/cli/main.py
index e6e2ecf..152eda8 100644
--- a/docling_eval/cli/main.py
+++ b/docling_eval/cli/main.py
@@ -24,6 +24,15 @@
DatasetLayoutEvaluation,
LayoutEvaluator,
)
+from docling_eval.evaluators.markdown_text_evaluator import (
+ DatasetMarkdownEvaluation,
+ MarkdownTextEvaluator,
+)
+from docling_eval.evaluators.readingorder_evaluator import (
+ DatasetReadingOrderEvaluation,
+ ReadingOrderEvaluator,
+ ReadingOrderVisualizer,
+)
from docling_eval.evaluators.table_evaluator import (
DatasetTableEvaluation,
TableEvaluator,
@@ -65,7 +74,6 @@ def create(
odir = Path("./benchmarks") / benchmark.value / modality.value
if benchmark == BenchMarkNames.DPBENCH:
-
if (
modality == EvaluationModality.END2END
or modality == EvaluationModality.LAYOUT
@@ -128,6 +136,32 @@ def evaluate(
with open(save_fn, "w") as fd:
json.dump(table_evaluation.model_dump(), fd, indent=2, sort_keys=True)
+ elif modality == EvaluationModality.READING_ORDER:
+ readingorder_evaluator = ReadingOrderEvaluator()
+ readingorder_evaluation = readingorder_evaluator(idir, split="test")
+
+ with open(save_fn, "w") as fd:
+ json.dump(
+ readingorder_evaluation.model_dump(),
+ fd,
+ indent=2,
+ sort_keys=True,
+ ensure_ascii=False,
+ )
+
+ elif modality == EvaluationModality.MARKDOWN_TEXT:
+ md_evaluator = MarkdownTextEvaluator()
+ md_evaluation = md_evaluator(idir, split="test")
+
+ with open(save_fn, "w") as fd:
+ json.dump(
+ md_evaluation.model_dump(),
+ fd,
+ indent=2,
+ sort_keys=True,
+ ensure_ascii=False,
+ )
+
elif modality == EvaluationModality.CODEFORMER:
pass
@@ -161,7 +195,7 @@ def visualise(
figname = odir / f"evaluation_{benchmark.value}_{modality.value}.png"
layout_evaluation.mAP_stats.save_histogram(
- figname=figname, name="struct-with-text"
+ figname=figname, name="TEDS struct-with-text"
)
elif modality == EvaluationModality.TABLEFORMER:
@@ -180,7 +214,9 @@ def visualise(
)
figname = odir / f"evaluation_{benchmark.value}_{modality.value}.png"
- table_evaluation.TEDS.save_histogram(figname=figname, name="struct-with-text")
+ table_evaluation.TEDS.save_histogram(
+ figname=figname, name="TEDS struct-with-text"
+ )
data, headers = table_evaluation.TEDS_struct.to_table()
logging.info(
@@ -190,7 +226,82 @@ def visualise(
figname = (
odir / f"evaluation_{benchmark.value}_{modality.value}-struct-only.png"
)
- table_evaluation.TEDS_struct.save_histogram(figname=figname, name="struct")
+ table_evaluation.TEDS_struct.save_histogram(figname=figname, name="TEDS struct")
+
+ elif modality == EvaluationModality.READING_ORDER:
+ with open(filename, "r") as fd:
+ ro_evaluation = DatasetReadingOrderEvaluation.parse_file(filename)
+ # ARD
+ logging.info(
+ "Reading order (Norm Average Relative Distance)"
+ " [mean|median|std]: [{:.2f}|{:.2f}|{:.2f}]".format(
+ ro_evaluation.ard_stats.mean,
+ ro_evaluation.ard_stats.median,
+ ro_evaluation.ard_stats.std,
+ )
+ )
+
+ data, headers = ro_evaluation.ard_stats.to_table("ARD")
+ logging.info(
+ "Reading order - Normalized Average Relative Distance: Quantiles\n\n"
+ + tabulate(data, headers=headers, tablefmt="github")
+ )
+
+ logging.info("Generate histogram plot for ARD")
+ figname = odir / f"evaluation_{benchmark.value}_{modality.value}_ARD.png"
+ ro_evaluation.ard_stats.save_histogram(figname=figname, name="ARD_norm")
+
+ # Weighted ARD
+ logging.info(
+ "Reading order (Weighted Normalized Average Relative Distance)"
+ " [mean|median|std]: [{:.2f}|{:.2f}|{:.2f}]".format(
+ ro_evaluation.w_ard_stats.mean,
+ ro_evaluation.w_ard_stats.median,
+ ro_evaluation.w_ard_stats.std,
+ )
+ )
+ data, headers = ro_evaluation.w_ard_stats.to_table("Weighted ARD")
+ logging.info(
+ "Reading order - Weighted Normalized Average Relative Distance: Quantiles\n\n"
+ + tabulate(data, headers=headers, tablefmt="github")
+ )
+
+ logging.info("Generate histogram plot for weighted ARD")
+ figname = (
+ odir / f"evaluation_{benchmark.value}_{modality.value}_weighted_ARD.png"
+ )
+ ro_evaluation.w_ard_stats.save_histogram(
+ figname=figname, name="Weighted ARD_norm"
+ )
+
+ # Generate visualizations of the reading order across the GT and the prediction
+ ro_visualizer = ReadingOrderVisualizer()
+ ro_visualizer(idir, filename, odir, split="test")
+
+ elif modality == EvaluationModality.MARKDOWN_TEXT:
+ with open(filename, "r") as fd:
+ md_evaluation = DatasetMarkdownEvaluation.parse_file(filename)
+
+ # Log BLEU mean/median/std
+ logging.info(
+ "Markdown text (BLEU) [mean|median|std]: [{:.2f}|{:.2f}|{:.2f}]".format(
+ md_evaluation.bleu_stats.mean,
+ md_evaluation.bleu_stats.median,
+ md_evaluation.bleu_stats.std,
+ )
+ )
+
+ # Log table with quantiles
+ data, headers = md_evaluation.bleu_stats.to_table("BlEU")
+ logging.info(
+ "Markdown text (BLEU): \n\n"
+ + tabulate(data, headers=headers, tablefmt="github")
+ )
+
+ # Generate histogram plot
+ logging.info("Generate histogram plot for BLEU")
+ figname = odir / f"evaluation_{benchmark.value}_{modality.value}.png"
+ md_evaluation.bleu_stats.save_histogram(figname=figname, name="BLEU")
elif modality == EvaluationModality.CODEFORMER:
pass
diff --git a/docling_eval/docling/models/reading_order/reading_order_updater.py b/docling_eval/docling/models/reading_order/reading_order_updater.py
new file mode 100644
index 0000000..92216c8
--- /dev/null
+++ b/docling_eval/docling/models/reading_order/reading_order_updater.py
@@ -0,0 +1,59 @@
+import copy
+import json
+import logging
+from pathlib import Path
+from typing import Optional
+
+from deepsearch_glm.andromeda_nlp import nlp_model # type: ignore
+from docling.utils.glm_utils import to_docling_document
+from docling_core.types.doc.document import DoclingDocument
+from docling_core.types.doc.labels import DocItemLabel
+from docling_core.utils.legacy import (
+ doc_item_label_to_legacy_name,
+ docling_document_to_legacy,
+)
+
+from docling_eval.benchmarks.utils import get_input_document
+
+_log = logging.getLogger(__name__)
+
+
+class ReadingOrderUpdater:
+ def __init__(self):
+ r""" """
+ self._nlp_model = nlp_model(loglevel="error", text_ordering=True)
+ self._labels_forward_mapping = {
+ doc_item_label_to_legacy_name(v): v.value for v in DocItemLabel
+ }
+
+ def __call__(
+ self, pdf_path: Path, true_doc: DoclingDocument
+ ) -> Optional[DoclingDocument]:
+ r""" """
+ print(true_doc.name)
+ # deep copy of the true-document
+ pred_doc = copy.deepcopy(true_doc)
+ pred_doc_legacy = docling_document_to_legacy(pred_doc)
+ ds_doc_dict = pred_doc_legacy.model_dump(by_alias=True, exclude_none=True)
+ try:
+ # TODO: Understand why some documents fail here
+ glm_doc = self._nlp_model.apply_on_doc(ds_doc_dict)
+ except RuntimeError as ex:
+ # print("nlp_model.apply_on_doc()")
+ return None
+
+ # Map from value to key.value before calling to_docling_document
+ for page_element in glm_doc["page-elements"]:
+ page_element["name"] = self._labels_forward_mapping[page_element["name"]]
+
+ # When true_doc.name == "ground-truth 01030000000016.pdf"
+ # pydantic_core._pydantic_core.ValidationError: 1 validation error for TextItem label
+ # Input should be , ,
+ # , ,
+ # , , ,
+ # , , ,
+ # or
+ # [type=literal_error, input_value=, input_type=DocItemLabel]
+ pred_doc = to_docling_document(glm_doc)
+
+ return pred_doc
diff --git a/docling_eval/evaluators/layout_evaluator.py b/docling_eval/evaluators/layout_evaluator.py
index af97c80..965f673 100644
--- a/docling_eval/evaluators/layout_evaluator.py
+++ b/docling_eval/evaluators/layout_evaluator.py
@@ -16,7 +16,7 @@
from tqdm import tqdm # type: ignore
from docling_eval.benchmarks.constants import BenchMarkColumns
-from docling_eval.evaluators.utils import DatasetStatistics, compute_stats
+from docling_eval.evaluators.stats import DatasetStatistics, compute_stats
class ClassLayoutEvaluation(BaseModel):
diff --git a/docling_eval/evaluators/markdown_text_evaluator.py b/docling_eval/evaluators/markdown_text_evaluator.py
new file mode 100644
index 0000000..cb37de8
--- /dev/null
+++ b/docling_eval/evaluators/markdown_text_evaluator.py
@@ -0,0 +1,79 @@
+import logging
+from pathlib import Path
+from typing import Dict, List, Tuple
+
+from datasets import load_dataset
+from docling_core.types.doc.base import ImageRefMode
+from docling_core.types.doc.document import DoclingDocument
+from nltk.tokenize import word_tokenize
+from pydantic import BaseModel
+from tqdm import tqdm # type: ignore
+
+from docling_eval.benchmarks.constants import BenchMarkColumns # type: ignore
+from docling_eval.evaluators.stats import DatasetStatistics, compute_stats
+from docling_eval.utils.bleu import compute_bleu_score
+
+_log = logging.getLogger(__name__)
+
+
+class PageMarkdownEvaluation(BaseModel):
+ doc_id: str
+
+ true_md: str
+ pred_md: str
+ bleu: float
+
+
+class DatasetMarkdownEvaluation(BaseModel):
+ evaluations: List[PageMarkdownEvaluation]
+ bleu_stats: DatasetStatistics
+
+
+class MarkdownTextEvaluator:
+ def __init__(self):
+ pass
+
+ def __call__(self, ds_path: Path, split: str = "test") -> DatasetMarkdownEvaluation:
+ parquet_files = str(ds_path / split / "*.parquet")
+ ds = load_dataset("parquet", data_files={split: parquet_files})
+ _log.info(f"oveview of dataset: {ds}")
+ if ds is not None:
+ ds_selection = ds[split]
+
+ evaluations: list[PageMarkdownEvaluation] = []
+ bleus = []
+
+ broken_inputs = 0
+ for i, data in tqdm(
+ enumerate(ds_selection),
+ desc="Markdown text evaluations",
+ ncols=120,
+ total=len(ds_selection),
+ ):
+ doc_id = data[BenchMarkColumns.DOC_ID]
+ true_doc_dict = data[BenchMarkColumns.GROUNDTRUTH]
+ true_doc: DoclingDocument = DoclingDocument.model_validate_json(
+ true_doc_dict
+ )
+ pred_doc_dict = data[BenchMarkColumns.PREDICTION]
+ pred_doc: DoclingDocument = DoclingDocument.model_validate_json(
+ pred_doc_dict
+ )
+
+ # Export to markdown and tokenize
+ true_md = true_doc.export_to_markdown(image_mode=ImageRefMode.PLACEHOLDER)
+ true_tokens = word_tokenize(true_md)
+ pred_md = pred_doc.export_to_markdown(image_mode=ImageRefMode.PLACEHOLDER)
+ pred_tokens = word_tokenize(pred_md)
+
+ bleu = compute_bleu_score(true_tokens, pred_tokens)
+ bleus.append(bleu)
+ md_evaluation = PageMarkdownEvaluation(
+ doc_id=doc_id, true_md=true_md, pred_md=pred_md, bleu=bleu
+ )
+ evaluations.append(md_evaluation)
+ bleu_stats = compute_stats(bleus)
+ ds_md_evalutions = DatasetMarkdownEvaluation(
+ evaluations=evaluations, bleu_stats=bleu_stats
+ )
+ return ds_md_evalutions
diff --git a/docling_eval/evaluators/readingorder_evaluator.py b/docling_eval/evaluators/readingorder_evaluator.py
new file mode 100644
index 0000000..5569d35
--- /dev/null
+++ b/docling_eval/evaluators/readingorder_evaluator.py
@@ -0,0 +1,410 @@
+import copy
+import json
+import logging
+import math
+from io import BytesIO
+from pathlib import Path
+from typing import Dict, List, Tuple
+
+from datasets import load_dataset
+from deepsearch_glm.andromeda_nlp import nlp_model # type: ignore
+from docling.datamodel.base_models import BoundingBox
+from docling_core.types.doc.document import DocItem, DoclingDocument, TextItem
+from docling_core.utils.legacy import docling_document_to_legacy
+from PIL import Image, ImageDraw, ImageFont
+from pydantic import BaseModel
+from tqdm import tqdm # type: ignore
+
+from docling_eval.benchmarks.constants import BenchMarkColumns
+from docling_eval.benchmarks.utils import draw_arrow
+from docling_eval.evaluators.stats import DatasetStatistics, compute_stats
+
+_log = logging.getLogger(__name__)
+
+
+class PageReadingOrderEvaluation(BaseModel):
+ doc_id: str
+
+ # BBoxes are in BOTTOMLEFT origin and in the true order
+ bboxes: List[Tuple[float, float, float, float]]
+ pred_order: List[int]
+ ard_norm: float # Normalized ARD: 0 is the worst and 1 is the best
+ w_ard_norm: (
+ float # Weighted normalized ARD. The weight is the (bbox_area / page_area)
+ )
+
+
+class DatasetReadingOrderEvaluation(BaseModel):
+ evaluations: List[PageReadingOrderEvaluation]
+ ard_stats: DatasetStatistics
+ w_ard_stats: DatasetStatistics
+
+
+class ReadingOrderEvaluator:
+ r"""
+ Evaluate the reading order using the Average Relative Distance metric
+ """
+
+ def __init__(self):
+ self._nlp_model = nlp_model(loglevel="error", text_ordering=True)
+
+ def __call__(
+ self, ds_path: Path, split: str = "test"
+ ) -> DatasetReadingOrderEvaluation:
+ parquet_files = str(ds_path / split / "*.parquet")
+ ds = load_dataset("parquet", data_files={split: parquet_files})
+ _log.info(f"oveview of dataset: {ds}")
+ if ds is not None:
+ ds_selection = ds[split]
+
+ evaluations: list[PageReadingOrderEvaluation] = []
+ ards = []
+ w_ards = []
+
+ broken_inputs = 0
+ for i, data in tqdm(
+ enumerate(ds_selection),
+ desc="Reading order evaluations",
+ ncols=120,
+ total=len(ds_selection),
+ ):
+ doc_id = data[BenchMarkColumns.DOC_ID]
+ true_doc_dict = data[BenchMarkColumns.GROUNDTRUTH]
+ true_doc: DoclingDocument = DoclingDocument.model_validate_json(
+ true_doc_dict
+ )
+ # print(f"\n{i} - doc_id: {doc_id}")
+ # self._show_items(true_doc)
+
+ reading_order = self._get_reading_order_preds(true_doc)
+ if reading_order is None:
+ print(f"Broken input: {doc_id}")
+ broken_inputs += 1
+ continue
+
+ # Compute metrics
+ # ard_norm = self._compute_ard_norm(reading_order)
+ ard_norm, w_ard_norm = self._compute_ard(reading_order)
+ ards.append(ard_norm)
+ w_ards.append(w_ard_norm)
+
+ page_evaluation = PageReadingOrderEvaluation(
+ doc_id=doc_id,
+ bboxes=[b.as_tuple() for b in reading_order["bboxes"]],
+ pred_order=reading_order["pred_order"],
+ ard_norm=ard_norm,
+ w_ard_norm=w_ard_norm,
+ )
+ # print("pred_reading_order")
+ # print(page_evaluation)
+ # print(f"ard={ard}")
+
+ evaluations.append(page_evaluation)
+
+ if broken_inputs > 0:
+ _log.error(f"broken_inputs={broken_inputs}")
+
+ # Compute statistics for metrics
+ ard_stats = compute_stats(ards)
+ w_ard_stats = compute_stats(w_ards)
+
+ ds_reading_order_evaluation = DatasetReadingOrderEvaluation(
+ evaluations=evaluations, ard_stats=ard_stats, w_ard_stats=w_ard_stats
+ )
+
+ return ds_reading_order_evaluation
+
+ def _get_reading_order_preds(self, true_doc: DoclingDocument):
+ r"""
+
+ Returns
+ -------
+ reading_order: Keys are "bboxes" and "pred_order"
+ """
+ try:
+ page_size = true_doc.pages[1].size
+
+ # Convert the bboxes to bottom-left coords before running the GLM
+ bboxes = []
+ for item, level in true_doc.iterate_items():
+ # Convert the bbox to BOTTOM-LEFT origin
+ bbox = item.prov[0].bbox.to_bottom_left_origin(page_size.height) # type: ignore
+ item.prov[0].bbox = bbox # type: ignore
+ bboxes.append(copy.deepcopy(bbox))
+
+ # Run the reading order model
+ legacy_doc = docling_document_to_legacy(true_doc)
+ legacy_doc_dict = legacy_doc.model_dump(by_alias=True, exclude_none=True)
+ legacy_doc_dict = self._ensure_bboxes_in_legacy_tables(legacy_doc_dict)
+ glm_doc = self._nlp_model.apply_on_doc(legacy_doc_dict)
+
+ # original reading order -> predicted reading order
+ orig_to_pred_order: Dict[int, int] = {}
+ for po, pe in enumerate(glm_doc["page-elements"]):
+ orig_to_pred_order[pe["orig-order"]] = po
+ pred_order = [orig_to_pred_order[x] for x in range(len(orig_to_pred_order))]
+
+ reading_order = {"bboxes": bboxes, "pred_order": pred_order}
+ return reading_order
+ except RuntimeError as ex:
+ _log.error(str(ex))
+ return None
+
+ def _compute_ard(self, reading_order: Dict) -> tuple[float, float]:
+ r"""
+ Compute the metrics:
+ 1. Normalized Average Relative Distance (ARD)
+ 2. Weighted normalized Average Relative Distance.
+
+ ARD = (1/n) * sum(e_k)
+ e_k = abs(pred_order_index - gt_order_index)
+ 0 is the best and n-1 is the worst where n is the number of bboxes
+
+ ARD_norm = 1 - (ARD / n)
+ 0 is the worst and 1 is the best
+
+ weighted_ARD = (1/n) * sum(e_k * weight_k)
+ weight_k = area(bbox_k) / area(page)
+ weighted ARD_norm = 1 - (weighted_ARD / n)
+
+ Returns
+ -------
+ ard_norm: Normalized average relative distance
+ ward_norm: Normalized weighted average to the area of the bbox
+ """
+ n = len(reading_order["bboxes"])
+ if n == 0:
+ return 0.0, 0.0
+
+ # Compute bbox weights
+ bbox_areas = [b.area() for b in reading_order["bboxes"]]
+ total_bboxes = sum(bbox_areas)
+ weights = [(a / total_bboxes) for a in bbox_areas]
+
+ # Compute ARD and weighted ARD
+ ard = 0.0
+ w_ard = 0.0
+ for true_ro, pred_ro in enumerate(reading_order["pred_order"]):
+ dist = math.fabs(true_ro - pred_ro)
+ ard += dist
+ w_ard += dist * weights[true_ro]
+
+ n_sq = n * n
+ ard_norm = 1 - (ard / n_sq)
+ w_ard_norm = 1 - (w_ard / n_sq)
+ return ard_norm, w_ard_norm
+
+ # def _compute_ard_norm(self, reading_order: Dict) -> float:
+ # r"""
+ # Compute the normalized Average Relative Distance (ARD)
+
+ # ARD(A, B) = (1/n) * sum(e_k)
+ # e_k = abs(pred_order_index - gt_order_index)
+ # 0 is the best and n-1 is the worst where n is the number of bboxes
+
+ # ARD_norm = 1 - (ARD / n)
+ # 0 is the worst and 1 is the best
+ # """
+ # n = len(reading_order["bboxes"])
+ # if n == 0:
+ # return 0.0
+ # ard = 0.0
+ # for true_ro, pred_ro in enumerate(reading_order["pred_order"]):
+ # ard += math.fabs(true_ro - pred_ro)
+
+ # ard /= n
+ # ard_norm = 1 - (ard / n)
+ # return ard_norm
+
+ def _ensure_bboxes_in_legacy_tables(self, legacy_doc_dict: Dict):
+ r"""
+ Ensure bboxes for all table cells
+ """
+ for table in legacy_doc_dict["tables"]:
+ for row in table["data"]:
+ for cell in row:
+ if "bbox" not in cell:
+ cell["bbox"] = [0, 0, 0, 0]
+ return legacy_doc_dict
+
+ def _show_items(self, true_doc: DoclingDocument):
+ r""" """
+ page_size = true_doc.pages[1].size
+ for i, (item, level) in enumerate(true_doc.iterate_items()):
+ bbox = (
+ item.prov[0].bbox.to_bottom_left_origin(page_size.height)
+ if isinstance(item, DocItem)
+ else None
+ )
+ text = item.text if isinstance(item, TextItem) else None
+ label = item.label # type: ignore
+ print(f"True {i}: {level} - {label}: {bbox} - {text}")
+
+
+class ReadingOrderVisualizer:
+ r""" """
+
+ def __init__(self):
+ self._line_width = 2
+ self._true_arrow_color = "green"
+ self._pred_arrow_color = "red"
+ self._item_color = "blue"
+ self._viz_sub_dir = "reading_order_viz"
+
+ # Load a font (adjust the font size and path as needed)
+ self._font = ImageFont.load_default()
+ try:
+ self._font = ImageFont.truetype("arial.ttf", size=15)
+ except IOError:
+ self._font = ImageFont.load_default()
+
+ def __call__(
+ self,
+ ds_path: Path,
+ reading_order_report_fn: Path,
+ save_dir: Path,
+ split: str = "test",
+ ):
+ r"""
+ Use a pre-generated reading order report and visualize the original and predicted reading
+ order. Generate one html visualization per document and save it in the output dir.
+ """
+ save_dir /= self._viz_sub_dir
+ save_dir.mkdir(parents=True, exist_ok=True)
+
+ # Read the evaluation report and make an index: doc_id -> predicted reading order
+ ro_preds_idx: dict[str, list[int]] = {}
+ with open(reading_order_report_fn, "r") as fd:
+ ro_evaluation_dict = json.load(fd)
+ for evaluation in ro_evaluation_dict["evaluations"]:
+ doc_id = evaluation["doc_id"]
+ ro_preds_idx[doc_id] = evaluation["pred_order"]
+
+ # Open the converted dataset
+ parquet_files = str(ds_path / split / "*.parquet")
+ ds = load_dataset("parquet", data_files={split: parquet_files})
+ if ds is not None:
+ ds_selection = ds[split]
+
+ # Visualize the reading order
+ viz_fns: list[Path] = []
+ for i, data in tqdm(
+ enumerate(ds_selection),
+ desc="Reading order visualizations",
+ ncols=120,
+ total=len(ds_selection),
+ ):
+ doc_id = data[BenchMarkColumns.DOC_ID]
+ page_images = data[BenchMarkColumns.GROUNDTRUTH_PAGE_IMAGES]
+ true_doc_dict = data[BenchMarkColumns.GROUNDTRUTH]
+ true_doc: DoclingDocument = DoclingDocument.model_validate_json(
+ true_doc_dict
+ )
+ pred_order = ro_preds_idx[doc_id]
+
+ # Draw and save the visualization
+ image_bytes = page_images[0]["bytes"]
+ image = Image.open(BytesIO(image_bytes))
+ viz_image = self._draw_permuted_reading_order(image, true_doc, pred_order)
+ viz_fn = save_dir / f"{doc_id}_reading_order_viz.png"
+ viz_fns.append(viz_fn)
+ viz_image.save(viz_fn)
+
+ return viz_fns
+
+ def _draw_permuted_reading_order(
+ self,
+ page_image: Image.Image,
+ doc: DoclingDocument,
+ pred_order: list[int],
+ ) -> Image.Image:
+ # TODO: Add the reading order also as labels
+ bboxes = []
+
+ true_img = copy.deepcopy(page_image)
+ true_draw = ImageDraw.Draw(true_img)
+ # Draw the bboxes and true order
+ x0, y0 = -1.0, -1.0
+ for item, level in doc.iterate_items():
+ if not isinstance(item, DocItem):
+ continue
+
+ assert len(item.prov) == 1
+ prov = item.prov[0]
+
+ # Get the item's bbox in top-left origin for the image dimensions
+ bbox = prov.bbox.to_top_left_origin(
+ page_height=doc.pages[prov.page_no].size.height
+ )
+ bbox = bbox.normalized(doc.pages[prov.page_no].size)
+ bbox.l = round(bbox.l * true_img.width)
+ bbox.r = round(bbox.r * true_img.width)
+ bbox.t = round(bbox.t * true_img.height)
+ bbox.b = round(bbox.b * true_img.height)
+ if bbox.b > bbox.t:
+ bbox.b, bbox.t = bbox.t, bbox.b
+
+ bboxes.append(bbox)
+
+ # Draw rectangle with only a border
+ true_draw.rectangle(
+ [bbox.l, bbox.b, bbox.r, bbox.t],
+ outline=self._item_color,
+ width=self._line_width,
+ )
+
+ # Get the arrow coordinates
+ if x0 == -1 and y0 == -1:
+ x0 = (bbox.l + bbox.r) / 2.0
+ y0 = (bbox.b + bbox.t) / 2.0
+ else:
+ x1 = (bbox.l + bbox.r) / 2.0
+ y1 = (bbox.b + bbox.t) / 2.0
+
+ true_draw = draw_arrow(
+ true_draw,
+ (x0, y0, x1, y1),
+ color=self._true_arrow_color,
+ line_width=self._line_width,
+ )
+ x0, y0 = x1, y1
+
+ # Draw the bboxes and the predicted order
+ pred_img = copy.deepcopy(page_image)
+ pred_draw = ImageDraw.Draw(pred_img)
+ x0, y0 = -1.0, -1.0
+ for true_id in range(len(bboxes)):
+ pred_id = pred_order[true_id]
+ bbox = bboxes[pred_id]
+
+ # Draw rectangle with only a border
+ pred_draw.rectangle(
+ [bbox.l, bbox.b, bbox.r, bbox.t],
+ outline=self._item_color,
+ width=self._line_width,
+ )
+
+ # Get the arrow coordinates
+ if x0 == -1 and y0 == -1:
+ x0 = (bbox.l + bbox.r) / 2.0
+ y0 = (bbox.b + bbox.t) / 2.0
+ else:
+ x1 = (bbox.l + bbox.r) / 2.0
+ y1 = (bbox.b + bbox.t) / 2.0
+
+ pred_draw = draw_arrow(
+ pred_draw,
+ (x0, y0, x1, y1),
+ color=self._pred_arrow_color,
+ line_width=self._line_width,
+ )
+ x0, y0 = x1, y1
+
+ # Make combined image
+ mode = page_image.mode
+ w, h = page_image.size
+ combined_img = Image.new(mode, (2 * w, h), "white")
+ combined_img.paste(true_img, (0, 0))
+ combined_img.paste(pred_img, (w, 0))
+
+ return combined_img
diff --git a/docling_eval/evaluators/utils.py b/docling_eval/evaluators/stats.py
similarity index 73%
rename from docling_eval/evaluators/utils.py
rename to docling_eval/evaluators/stats.py
index 67293f4..82c5c5e 100644
--- a/docling_eval/evaluators/utils.py
+++ b/docling_eval/evaluators/stats.py
@@ -2,7 +2,7 @@
import random
import statistics
from pathlib import Path
-from typing import Dict, List, Tuple
+from typing import List, Tuple
import matplotlib.pyplot as plt
import numpy as np
@@ -25,28 +25,27 @@ def check_bins_and_hist_lengths(cls, values):
raise ValueError("`bins` must have exactly one more element than `hist`.")
return values
- def to_table(self) -> Tuple[List[List[str]], List[str]]:
+ def to_table(self, metric_name: str = "TEDS") -> Tuple[List[List[str]], List[str]]:
- headers = ["[x0, x1]", "prob [%]", "acc [%]", "1-acc [%]", "total"]
-
- # Calculate bin widths
- bin_widths = [
- self.bins[i + 1] - self.bins[i] for i in range(len(self.bins) - 1)
+ headers = [
+ f"x0<={metric_name}",
+ f"{metric_name}<=x1",
+ "prob [%]",
+ "acc [%]",
+ "1-acc [%]",
+ "total",
]
- bin_middle = [
- (self.bins[i + 1] + self.bins[i]) / 2.0 for i in range(len(self.bins) - 1)
- ]
-
cumsum: float = 0.0
table = []
for i in range(len(self.bins) - 1):
table.append(
[
- f"[{self.bins[i+0]:.3f}, {self.bins[i+1]:.3f}]",
- f"{100.0*float(self.hist[i])/float(self.total):.2f}",
- f"{100.0*cumsum:.2f}",
- f"{100.0*(1.0-cumsum):.2f}",
+ f"{self.bins[i + 0]:.3f}",
+ f"{self.bins[i + 1]:.3f}",
+ f"{100.0 * float(self.hist[i]) / float(self.total):.2f}",
+ f"{100.0 * cumsum:.2f}",
+ f"{100.0 * (1.0-cumsum):.2f}",
f"{self.hist[i]}",
]
)
@@ -68,10 +67,10 @@ def save_histogram(self, figname: Path, name: str = ""):
plt.figure(fignum)
plt.bar(bin_middle, self.hist, width=bin_widths, edgecolor="black")
- plt.xlabel("TEDS")
+ plt.xlabel("Score")
plt.ylabel("Frequency")
plt.title(
- f"TEDS {name} (mean: {self.mean:.2f}, median: {self.median:.2f}, std: {self.std:.2f}, total: {self.total})"
+ f"{name} (mean: {self.mean:.2f}, median: {self.median:.2f}, std: {self.std:.2f}, total: {self.total})"
)
logging.info(f"saving figure to {figname}")
diff --git a/docling_eval/evaluators/table_evaluator.py b/docling_eval/evaluators/table_evaluator.py
index 9f630bc..4a34d3f 100644
--- a/docling_eval/evaluators/table_evaluator.py
+++ b/docling_eval/evaluators/table_evaluator.py
@@ -1,21 +1,18 @@
import glob
import logging
import random
-import statistics
from pathlib import Path
-from typing import List, Tuple
import matplotlib.pyplot as plt
-import numpy as np
from datasets import Dataset, load_dataset
from docling_core.types.doc.document import DoclingDocument, TableItem
from docling_core.types.doc.labels import DocItemLabel
from lxml import html
-from pydantic import BaseModel, model_validator
+from pydantic import BaseModel
from tqdm import tqdm # type: ignore
from docling_eval.benchmarks.constants import BenchMarkColumns
-from docling_eval.evaluators.utils import DatasetStatistics, compute_stats
+from docling_eval.evaluators.stats import DatasetStatistics, compute_stats
from docling_eval.utils.teds import TEDScorer
_log = logging.getLogger(__name__)
@@ -34,78 +31,6 @@ class TableEvaluation(BaseModel):
pred_nrows: int = -1
-"""
-class DatasetStatistics(BaseModel):
- total: int
-
- mean: float
- median: float
- std: float
-
- bins: List[float]
- hist: List[float]
-
- @model_validator(mode="after")
- def check_bins_and_hist_lengths(cls, values):
- if len(values.bins) != len(values.hist) + 1:
- raise ValueError("`bins` must have exactly one more element than `hist`.")
- return values
-
- def to_table(self) -> Tuple[List[List[str]], List[str]]:
-
- headers = ["x0<=TEDS", "TEDS<=x1", "prob [%]", "acc [%]", "1-acc [%]", "total"]
-
- # Calculate bin widths
- bin_widths = [
- self.bins[i + 1] - self.bins[i] for i in range(len(self.bins) - 1)
- ]
- bin_middle = [
- (self.bins[i + 1] + self.bins[i]) / 2.0 for i in range(len(self.bins) - 1)
- ]
-
- cumsum: float = 0.0
-
- table = []
- for i in range(len(self.bins) - 1):
- table.append(
- [
- f"{self.bins[i+0]:.3f}",
- f"{self.bins[i+1]:.3f}",
- f"{100.0*float(self.hist[i])/float(self.total):.2f}",
- f"{100.0*cumsum:.2f}",
- f"{100.0*(1.0-cumsum):.2f}",
- f"{self.hist[i]}",
- ]
- )
- cumsum += float(self.hist[i]) / float(self.total)
-
- return table, headers
-
- def save_histogram(self, figname: Path, name: str = ""):
- # Calculate bin widths
- bin_widths = [
- self.bins[i + 1] - self.bins[i] for i in range(len(self.bins) - 1)
- ]
- bin_middle = [
- (self.bins[i + 1] + self.bins[i]) / 2.0 for i in range(len(self.bins) - 1)
- ]
-
- # Plot histogram
- fignum = int(1000 * random.random())
- plt.figure(fignum)
- plt.bar(bin_middle, self.hist, width=bin_widths, edgecolor="black")
-
- plt.xlabel("TEDS")
- plt.ylabel("Frequency")
- plt.title(
- f"TEDS {name} (mean: {self.mean:.2f}, median: {self.median:.2f}, std: {self.std:.2f}, total: {self.total})"
- )
-
- logging.info(f"saving figure to {figname}")
- plt.savefig(figname)
-"""
-
-
class DatasetTableEvaluation(BaseModel):
evaluations: list[TableEvaluation]
@@ -156,25 +81,6 @@ def save_histogram_delta_row_col(self, figname: Path):
plt.savefig(figname)
-"""
-def compute_stats(values: List[float]) -> DatasetStatistics:
- total: int = len(values)
-
- mean: float = statistics.mean(values) if len(values) > 0 else -1
- median: float = statistics.median(values) if len(values) > 0 else -1
- std: float = statistics.stdev(values) if len(values) > 0 else -1
- logging.info(f"total: {total}, mean: {mean}, median: {median}, std: {std}")
-
- # Compute the histogram with 20 bins between 0 and 1
- hist, bins = np.histogram(values, bins=20, range=(0, 1))
- logging.info(f"#-hist: {len(hist)}, #-bins: {len(bins)}")
-
- return DatasetStatistics(
- total=total, mean=mean, median=median, std=std, hist=hist, bins=bins
- )
-"""
-
-
def is_complex_table(table: TableItem) -> bool:
r"""
Implement the logic to check if table is complex
diff --git a/docling_eval/utils/bleu.py b/docling_eval/utils/bleu.py
index 29791f3..a1f5b07 100644
--- a/docling_eval/utils/bleu.py
+++ b/docling_eval/utils/bleu.py
@@ -1,7 +1,7 @@
from nltk.translate.bleu_score import corpus_bleu
-def compute_bleu_score(
+def compute_bleu_scores(
targets: list[list[str]], predictions: list[list[str]]
) -> tuple[list[float], float]:
r"""
@@ -28,3 +28,26 @@ def compute_bleu_score(
for tg, pred in zip(targets, predictions)
]
return bleu_scores, sum(bleu_scores) / len(bleu_scores)
+
+
+def compute_bleu_score(target: list[str], prediction: list[str]) -> float:
+ r"""
+ Compute the BLEU score for the given targetand prediction text.
+
+ Parameters
+ ----------
+ targets : List[List[str]]
+ The ground truth target sequences.
+ predictions : List[List[str]]
+ The predicted sequences. Each prediction is a list of tokens.
+
+ Returns
+ -------
+ bleu_score
+ """
+ weights = (0.25, 0.25, 0.25, 0.25)
+
+ # reference: Ground truth (in BLEU there can be many references)
+ # hypothesis: prediction
+ bleu = corpus_bleu([[target]], [prediction], weights=weights)
+ return bleu
diff --git a/docs/evaluations/evaluation_DPBench_reading_order_ARD.png b/docs/evaluations/evaluation_DPBench_reading_order_ARD.png
new file mode 100644
index 0000000..53a6cfe
Binary files /dev/null and b/docs/evaluations/evaluation_DPBench_reading_order_ARD.png differ
diff --git a/docs/evaluations/evaluation_DPBench_reading_order_weighted_ARD.png b/docs/evaluations/evaluation_DPBench_reading_order_weighted_ARD.png
new file mode 100644
index 0000000..5d983e6
Binary files /dev/null and b/docs/evaluations/evaluation_DPBench_reading_order_weighted_ARD.png differ
diff --git a/docs/evaluations/evaluation_OmniDocBench_reading_order_ARD.png b/docs/evaluations/evaluation_OmniDocBench_reading_order_ARD.png
new file mode 100644
index 0000000..a17a421
Binary files /dev/null and b/docs/evaluations/evaluation_OmniDocBench_reading_order_ARD.png differ
diff --git a/docs/evaluations/evaluation_OmniDocBench_reading_order_weighted_ARD.png b/docs/evaluations/evaluation_OmniDocBench_reading_order_weighted_ARD.png
new file mode 100644
index 0000000..a29f040
Binary files /dev/null and b/docs/evaluations/evaluation_OmniDocBench_reading_order_weighted_ARD.png differ
diff --git a/docs/examples/benchmark_dpbench.py b/docs/examples/benchmark_dpbench.py
index 1814d1d..f6e0d49 100644
--- a/docs/examples/benchmark_dpbench.py
+++ b/docs/examples/benchmark_dpbench.py
@@ -58,6 +58,18 @@ def main():
idir=odir_lay,
odir=odir_lay,
)
+ evaluate(
+ modality=EvaluationModality.READING_ORDER,
+ benchmark=BenchMarkNames.DPBENCH,
+ idir=odir_lay,
+ odir=odir_lay,
+ )
+ visualise(
+ modality=EvaluationModality.READING_ORDER,
+ benchmark=BenchMarkNames.DPBENCH,
+ idir=odir_lay,
+ odir=odir_lay,
+ )
if True:
create_dpbench_tableformer_dataset(
diff --git a/docs/examples/benchmark_omnidocbench.py b/docs/examples/benchmark_omnidocbench.py
index 3d98fa4..2d922a7 100644
--- a/docs/examples/benchmark_omnidocbench.py
+++ b/docs/examples/benchmark_omnidocbench.py
@@ -59,6 +59,18 @@ def main():
idir=odir_lay,
odir=odir_lay,
)
+ evaluate(
+ modality=EvaluationModality.READING_ORDER,
+ benchmark=BenchMarkNames.OMNIDOCBENCH,
+ idir=odir_lay,
+ odir=odir_lay,
+ )
+ visualise(
+ modality=EvaluationModality.READING_ORDER,
+ benchmark=BenchMarkNames.OMNIDOCBENCH,
+ idir=odir_lay,
+ odir=odir_lay,
+ )
if True:
create_omnidocbench_tableformer_dataset(
diff --git a/poetry.lock b/poetry.lock
index ec7e525..e4ade33 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -1,4 +1,4 @@
-# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand.
+# This file is automatically @generated by Poetry 2.0.0 and should not be changed by hand.
[[package]]
name = "aiohappyeyeballs"
@@ -6,6 +6,8 @@ version = "2.4.4"
description = "Happy Eyeballs for asyncio"
optional = false
python-versions = ">=3.8"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "aiohappyeyeballs-2.4.4-py3-none-any.whl", hash = "sha256:a980909d50efcd44795c4afeca523296716d50cd756ddca6af8c65b996e27de8"},
{file = "aiohappyeyeballs-2.4.4.tar.gz", hash = "sha256:5fdd7d87889c63183afc18ce9271f9b0a7d32c2303e394468dd45d514a757745"},
@@ -17,6 +19,8 @@ version = "3.11.10"
description = "Async http client/server framework (asyncio)"
optional = false
python-versions = ">=3.9"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "aiohttp-3.11.10-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cbad88a61fa743c5d283ad501b01c153820734118b65aee2bd7dbb735475ce0d"},
{file = "aiohttp-3.11.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:80886dac673ceaef499de2f393fc80bb4481a129e6cb29e624a12e3296cc088f"},
@@ -115,6 +119,8 @@ version = "1.3.2"
description = "aiosignal: a list of registered asynchronous callbacks"
optional = false
python-versions = ">=3.9"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "aiosignal-1.3.2-py2.py3-none-any.whl", hash = "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5"},
{file = "aiosignal-1.3.2.tar.gz", hash = "sha256:a8c255c66fafb1e499c9351d0bf32ff2d8a0321595ebac3b93713656d2436f54"},
@@ -129,6 +135,8 @@ version = "0.7.0"
description = "Reusable constraint types to use with typing.Annotated"
optional = false
python-versions = ">=3.8"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"},
{file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"},
@@ -140,6 +148,8 @@ version = "0.1.4"
description = "Disable App Nap on macOS >= 10.9"
optional = false
python-versions = ">=3.6"
+groups = ["dev"]
+markers = "platform_system == \"Darwin\" and (python_version <= \"3.11\" or python_version >= \"3.12\")"
files = [
{file = "appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c"},
{file = "appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee"},
@@ -151,6 +161,8 @@ version = "1.0.3"
description = "APTED algorithm for the Tree Edit Distance"
optional = false
python-versions = "*"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "apted-1.0.3-py3-none-any.whl", hash = "sha256:74193369d023649d335269e67c4df07f922959e5ac2597de1b79af4e694150e8"},
{file = "apted-1.0.3.tar.gz", hash = "sha256:befa5181e2d4457fa88e54995a82604ee048bb2fbc781ea97d8e1856b4715ce9"},
@@ -162,6 +174,8 @@ version = "2.15.8"
description = "An abstract syntax tree for Python with inference support."
optional = false
python-versions = ">=3.7.2"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "astroid-2.15.8-py3-none-any.whl", hash = "sha256:1aa149fc5c6589e3d0ece885b4491acd80af4f087baafa3fb5203b113e68cd3c"},
{file = "astroid-2.15.8.tar.gz", hash = "sha256:6c107453dffee9055899705de3c9ead36e74119cee151e5a9aaf7f0b0e020a6a"},
@@ -181,6 +195,8 @@ version = "3.0.0"
description = "Annotate AST trees with source code positions"
optional = false
python-versions = ">=3.8"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2"},
{file = "asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7"},
@@ -196,6 +212,8 @@ version = "5.0.1"
description = "Timeout context manager for asyncio programs"
optional = false
python-versions = ">=3.8"
+groups = ["main"]
+markers = "python_version < \"3.11\""
files = [
{file = "async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c"},
{file = "async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3"},
@@ -207,6 +225,8 @@ version = "24.2.0"
description = "Classes Without Boilerplate"
optional = false
python-versions = ">=3.7"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2"},
{file = "attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346"},
@@ -226,6 +246,8 @@ version = "2.3.1"
description = "Removes unused imports and unused variables"
optional = false
python-versions = ">=3.8"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "autoflake-2.3.1-py3-none-any.whl", hash = "sha256:3ae7495db9084b7b32818b4140e6dc4fc280b712fb414f5b8fe57b0a8e85a840"},
{file = "autoflake-2.3.1.tar.gz", hash = "sha256:c98b75dc5b0a86459c4f01a1d32ac7eb4338ec4317a4469515ff1e687ecd909e"},
@@ -241,6 +263,8 @@ version = "2.2.0"
description = "A tool that automatically formats Python code to conform to the PEP 8 style guide"
optional = false
python-versions = ">=3.8"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "autopep8-2.2.0-py2.py3-none-any.whl", hash = "sha256:05418a981f038969d8bdcd5636bf15948db7555ae944b9f79b5a34b35f1370d4"},
{file = "autopep8-2.2.0.tar.gz", hash = "sha256:d306a0581163ac29908280ad557773a95a9bede072c0fafed6f141f5311f43c1"},
@@ -256,6 +280,8 @@ version = "1.2.0"
description = "Backport of CPython tarfile module"
optional = false
python-versions = ">=3.8"
+groups = ["dev"]
+markers = "python_version <= \"3.11\""
files = [
{file = "backports.tarfile-1.2.0-py3-none-any.whl", hash = "sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34"},
{file = "backports_tarfile-1.2.0.tar.gz", hash = "sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991"},
@@ -271,6 +297,8 @@ version = "4.12.3"
description = "Screen-scraping library"
optional = false
python-versions = ">=3.6.0"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"},
{file = "beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051"},
@@ -292,6 +320,8 @@ version = "24.10.0"
description = "The uncompromising code formatter."
optional = false
python-versions = ">=3.9"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "black-24.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6668650ea4b685440857138e5fe40cde4d652633b1bdffc62933d0db4ed9812"},
{file = "black-24.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1c536fcf674217e87b8cc3657b81809d3c085d7bf3ef262ead700da345bfa6ea"},
@@ -340,6 +370,8 @@ version = "2024.8.30"
description = "Python package for providing Mozilla's CA Bundle."
optional = false
python-versions = ">=3.6"
+groups = ["main", "dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"},
{file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"},
@@ -351,6 +383,8 @@ version = "1.17.1"
description = "Foreign Function Interface for Python calling C code."
optional = false
python-versions = ">=3.8"
+groups = ["dev"]
+markers = "(sys_platform == \"linux\" or implementation_name == \"pypy\") and (python_version <= \"3.11\" or python_version >= \"3.12\") and (implementation_name == \"pypy\" or platform_python_implementation != \"PyPy\")"
files = [
{file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"},
{file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"},
@@ -430,6 +464,8 @@ version = "3.4.0"
description = "Validate configuration and produce human readable error messages."
optional = false
python-versions = ">=3.8"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"},
{file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"},
@@ -441,6 +477,8 @@ version = "3.4.0"
description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
optional = false
python-versions = ">=3.7.0"
+groups = ["main", "dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6"},
{file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b"},
@@ -555,6 +593,8 @@ version = "8.1.7"
description = "Composable command line interface toolkit"
optional = false
python-versions = ">=3.7"
+groups = ["main", "dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"},
{file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"},
@@ -569,6 +609,8 @@ version = "0.4.0"
description = "Logging integration for Click"
optional = false
python-versions = "*"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "click-log-0.4.0.tar.gz", hash = "sha256:3970f8570ac54491237bcdb3d8ab5e3eef6c057df29f8c3d1151a51a9c23b975"},
{file = "click_log-0.4.0-py2.py3-none-any.whl", hash = "sha256:a43e394b528d52112af599f2fc9e4b7cf3c15f94e53581f74fa6867e68c91756"},
@@ -583,10 +625,12 @@ version = "0.4.6"
description = "Cross-platform colored terminal text."
optional = false
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7"
+groups = ["main", "dev"]
files = [
{file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"},
{file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"},
]
+markers = {main = "platform_system == \"Windows\" and (python_version <= \"3.11\" or python_version >= \"3.12\")", dev = "python_version <= \"3.11\" or python_version >= \"3.12\""}
[[package]]
name = "comm"
@@ -594,6 +638,8 @@ version = "0.2.2"
description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc."
optional = false
python-versions = ">=3.8"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3"},
{file = "comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e"},
@@ -611,6 +657,8 @@ version = "1.3.1"
description = "Python library for calculating contours of 2D quadrilateral grids"
optional = false
python-versions = ">=3.10"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "contourpy-1.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a045f341a77b77e1c5de31e74e966537bba9f3c4099b35bf4c2e3939dd54cdab"},
{file = "contourpy-1.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:500360b77259914f7805af7462e41f9cb7ca92ad38e9f94d6c8641b089338124"},
@@ -684,6 +732,8 @@ version = "43.0.3"
description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers."
optional = false
python-versions = ">=3.7"
+groups = ["dev"]
+markers = "(python_version <= \"3.11\" or python_version >= \"3.12\") and sys_platform == \"linux\""
files = [
{file = "cryptography-43.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf7a1932ac4176486eab36a19ed4c0492da5d97123f1406cf15e41b05e787d2e"},
{file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63efa177ff54aec6e1c0aefaa1a241232dcd37413835a9b674b6e3f0ae2bfd3e"},
@@ -733,6 +783,8 @@ version = "0.12.1"
description = "Composable style cycles"
optional = false
python-versions = ">=3.8"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"},
{file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"},
@@ -748,6 +800,8 @@ version = "3.2.0"
description = "HuggingFace community-driven open-source library of datasets"
optional = false
python-versions = ">=3.9.0"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "datasets-3.2.0-py3-none-any.whl", hash = "sha256:f3d2ba2698b7284a4518019658596a6a8bc79f31e51516524249d6c59cf0fe2a"},
{file = "datasets-3.2.0.tar.gz", hash = "sha256:9a6e1a356052866b5dbdd9c9eedb000bf3fc43d986e3584d9b028f4976937229"},
@@ -790,6 +844,8 @@ version = "1.8.9"
description = "An implementation of the Debug Adapter Protocol for Python"
optional = false
python-versions = ">=3.8"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "debugpy-1.8.9-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:cfe1e6c6ad7178265f74981edf1154ffce97b69005212fbc90ca22ddfe3d017e"},
{file = "debugpy-1.8.9-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ada7fb65102a4d2c9ab62e8908e9e9f12aed9d76ef44880367bc9308ebe49a0f"},
@@ -825,6 +881,8 @@ version = "5.1.1"
description = "Decorators for Humans"
optional = false
python-versions = ">=3.5"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"},
{file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"},
@@ -836,6 +894,8 @@ version = "1.0.0"
description = "Graph Language Models"
optional = false
python-versions = "<4.0,>=3.9"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "deepsearch_glm-1.0.0-cp310-cp310-macosx_13_0_x86_64.whl", hash = "sha256:94792b57df7a1c4ba8b47ebd8f36ea0a090d4f27a4fba39bd7b166b6b537260a"},
{file = "deepsearch_glm-1.0.0-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:ff46e352e96a2f56ce7ae4fdf04b271ee841c29ff159b1dec0e5ecaaadba8d4d"},
@@ -882,6 +942,8 @@ version = "0.3.8"
description = "serialize all of Python"
optional = false
python-versions = ">=3.8"
+groups = ["main", "dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7"},
{file = "dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca"},
@@ -897,6 +959,8 @@ version = "0.1.3"
description = "Utilities for comparing sequences"
optional = false
python-versions = "*"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "Distance-0.1.3.tar.gz", hash = "sha256:60807584f5b6003f5c521aa73f39f51f631de3be5cccc5a1d67166fcbf0d4551"},
]
@@ -907,6 +971,8 @@ version = "0.3.9"
description = "Distribution utilities"
optional = false
python-versions = "*"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87"},
{file = "distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403"},
@@ -918,6 +984,8 @@ version = "2.14.0"
description = "SDK and CLI for parsing PDF, DOCX, HTML, and more, to a unified document representation for powering downstream workflows such as gen AI applications."
optional = false
python-versions = "<4.0,>=3.9"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "docling-2.14.0-py3-none-any.whl", hash = "sha256:fe4642064303859ee59ece9bd4d0e1d65428d270a0c1895d6f59416984db91e6"},
{file = "docling-2.14.0.tar.gz", hash = "sha256:79152f9a409c4f6de26a5ae654ef840f60a08665151c954dfe9ba76e4b773d08"},
@@ -958,6 +1026,8 @@ version = "2.14.0"
description = "A python library to define and validate data types in Docling."
optional = false
python-versions = "<4.0,>=3.9"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "docling_core-2.14.0-py3-none-any.whl", hash = "sha256:05a7b89872260dcdba2b0fbcc3a4619aed4846f58f155d33a10b41b23eea5188"},
{file = "docling_core-2.14.0.tar.gz", hash = "sha256:0eb6a52e05f2a06e1777b0533d655a87b54a1a5d374b957beb244c8940aed7da"},
@@ -985,6 +1055,8 @@ version = "3.1.0"
description = "This package contains the AI models used by the Docling PDF conversion package"
optional = false
python-versions = "<4.0,>=3.9"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "docling_ibm_models-3.1.0-py3-none-any.whl", hash = "sha256:a381a45dff16fdb2246b99c15a2e3d6ba880c573d48a1d6477d3ffb36bab807f"},
{file = "docling_ibm_models-3.1.0.tar.gz", hash = "sha256:65d734ffa490edc4e2301d296b6e893afa536c63b7daae7bbda781bd15b3431e"},
@@ -1008,6 +1080,8 @@ version = "3.0.0"
description = "Simple package to extract text with coordinates from programmatic PDFs"
optional = false
python-versions = "<4.0,>=3.9"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "docling_parse-3.0.0-cp310-cp310-macosx_13_0_x86_64.whl", hash = "sha256:8de583f9562549379b8878f4054c17a715ac492999187855a6178c258388d1c6"},
{file = "docling_parse-3.0.0-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:0a504152836b52119c84ce6f2124006b2297eca9576c1e961745f774b8f55f59"},
@@ -1051,6 +1125,8 @@ version = "0.21.2"
description = "Docutils -- Python Documentation Utilities"
optional = false
python-versions = ">=3.9"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2"},
{file = "docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f"},
@@ -1062,6 +1138,8 @@ version = "1.3.1"
description = "Dictionary wrapper for quick access to deeply nested keys."
optional = false
python-versions = ">=3.5,<4.0"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "dotty_dict-1.3.1-py3-none-any.whl", hash = "sha256:5022d234d9922f13aa711b4950372a06a6d64cb6d6db9ba43d0ba133ebfce31f"},
{file = "dotty_dict-1.3.1.tar.gz", hash = "sha256:4b016e03b8ae265539757a53eba24b9bfda506fb94fbce0bee843c6f05541a15"},
@@ -1073,6 +1151,8 @@ version = "1.7.2"
description = "End-to-End Multi-Lingual Optical Character Recognition (OCR) Solution"
optional = false
python-versions = "*"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "easyocr-1.7.2-py3-none-any.whl", hash = "sha256:5be12f9b0e595d443c9c3d10b0542074b50f0ec2d98b141a109cd961fd1c177c"},
]
@@ -1097,6 +1177,8 @@ version = "2.0.0"
description = "An implementation of lxml.xmlfile for the standard library"
optional = false
python-versions = ">=3.8"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "et_xmlfile-2.0.0-py3-none-any.whl", hash = "sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa"},
{file = "et_xmlfile-2.0.0.tar.gz", hash = "sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54"},
@@ -1108,6 +1190,8 @@ version = "1.2.2"
description = "Backport of PEP 654 (exception groups)"
optional = false
python-versions = ">=3.7"
+groups = ["dev"]
+markers = "python_version < \"3.11\""
files = [
{file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"},
{file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"},
@@ -1122,6 +1206,8 @@ version = "2.1.1"
description = "execnet: rapid multi-Python deployment"
optional = false
python-versions = ">=3.8"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc"},
{file = "execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3"},
@@ -1136,6 +1222,8 @@ version = "2.1.0"
description = "Get the currently executing AST node of a frame, and other information"
optional = false
python-versions = ">=3.8"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "executing-2.1.0-py2.py3-none-any.whl", hash = "sha256:8d63781349375b5ebccc3142f4b30350c0cd9c79f921cde38be2be4637e98eaf"},
{file = "executing-2.1.0.tar.gz", hash = "sha256:8ea27ddd260da8150fa5a708269c4a10e76161e2496ec3e587da9e3c0fe4b9ab"},
@@ -1150,6 +1238,8 @@ version = "3.16.1"
description = "A platform independent file lock."
optional = false
python-versions = ">=3.8"
+groups = ["main", "dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0"},
{file = "filelock-3.16.1.tar.gz", hash = "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435"},
@@ -1166,6 +1256,8 @@ version = "1.2.0"
description = "Infer file type and MIME type of any file/buffer. No external dependencies."
optional = false
python-versions = "*"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "filetype-1.2.0-py2.py3-none-any.whl", hash = "sha256:7ce71b6880181241cf7ac8697a2f1eb6a8bd9b429f7ad6d27b8db9ba5f1c2d25"},
{file = "filetype-1.2.0.tar.gz", hash = "sha256:66b56cd6474bf41d8c54660347d37afcc3f7d1970648de365c102ef77548aadb"},
@@ -1177,6 +1269,8 @@ version = "6.1.0"
description = "the modular source code checker: pep8 pyflakes and co"
optional = false
python-versions = ">=3.8.1"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "flake8-6.1.0-py2.py3-none-any.whl", hash = "sha256:ffdfce58ea94c6580c77888a86506937f9a1a227dfcd15f245d694ae20a6b6e5"},
{file = "flake8-6.1.0.tar.gz", hash = "sha256:d5b3857f07c030bdb5bf41c7f53799571d75c4491748a3adcd47de929e34cd23"},
@@ -1193,6 +1287,8 @@ version = "1.2.3"
description = "Flake8 plug-in loading the configuration from pyproject.toml"
optional = false
python-versions = ">= 3.6"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "flake8_pyproject-1.2.3-py3-none-any.whl", hash = "sha256:6249fe53545205af5e76837644dc80b4c10037e73a0e5db87ff562d75fb5bd4a"},
]
@@ -1210,6 +1306,8 @@ version = "4.55.3"
description = "Tools to manipulate font files"
optional = false
python-versions = ">=3.8"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "fonttools-4.55.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1dcc07934a2165ccdc3a5a608db56fb3c24b609658a5b340aee4ecf3ba679dc0"},
{file = "fonttools-4.55.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f7d66c15ba875432a2d2fb419523f5d3d347f91f48f57b8b08a2dfc3c39b8a3f"},
@@ -1283,6 +1381,8 @@ version = "1.5.0"
description = "A list-like structure which implements collections.abc.MutableSequence"
optional = false
python-versions = ">=3.8"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "frozenlist-1.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5b6a66c18b5b9dd261ca98dffcb826a525334b2f29e7caa54e182255c5f6a65a"},
{file = "frozenlist-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d1b3eb7b05ea246510b43a7e53ed1653e55c2121019a97e60cad7efb881a97bb"},
@@ -1384,6 +1484,8 @@ version = "2024.9.0"
description = "File-system specification"
optional = false
python-versions = ">=3.8"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "fsspec-2024.9.0-py3-none-any.whl", hash = "sha256:a0947d552d8a6efa72cc2c730b12c41d043509156966cca4fb157b0f2a0c574b"},
{file = "fsspec-2024.9.0.tar.gz", hash = "sha256:4b0afb90c2f21832df142f292649035d80b421f60a9e1c027802e5a0da2b04e8"},
@@ -1426,6 +1528,8 @@ version = "4.0.11"
description = "Git Object Database"
optional = false
python-versions = ">=3.7"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "gitdb-4.0.11-py3-none-any.whl", hash = "sha256:81a3407ddd2ee8df444cbacea00e2d038e40150acfa3001696fe0dcf1d3adfa4"},
{file = "gitdb-4.0.11.tar.gz", hash = "sha256:bf5421126136d6d0af55bc1e7c1af1c397a34f5b7bd79e776cd3e89785c2b04b"},
@@ -1440,6 +1544,8 @@ version = "3.1.43"
description = "GitPython is a Python library used to interact with Git repositories"
optional = false
python-versions = ">=3.7"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "GitPython-3.1.43-py3-none-any.whl", hash = "sha256:eec7ec56b92aad751f9912a73404bc02ba212a23adb2c7098ee668417051a1ff"},
{file = "GitPython-3.1.43.tar.gz", hash = "sha256:35f314a9f878467f5453cc1fee295c3e18e52f1b99f10f6cf5b1682e968a9e7c"},
@@ -1458,6 +1564,8 @@ version = "0.27.0"
description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub"
optional = false
python-versions = ">=3.8.0"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "huggingface_hub-0.27.0-py3-none-any.whl", hash = "sha256:8f2e834517f1f1ddf1ecc716f91b120d7333011b7485f665a9a412eacb1a2a81"},
{file = "huggingface_hub-0.27.0.tar.gz", hash = "sha256:902cce1a1be5739f5589e560198a65a8edcfd3b830b1666f36e4b961f0454fac"},
@@ -1492,6 +1600,8 @@ version = "2.6.3"
description = "File identification library for Python"
optional = false
python-versions = ">=3.9"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "identify-2.6.3-py2.py3-none-any.whl", hash = "sha256:9edba65473324c2ea9684b1f944fe3191db3345e50b6d04571d10ed164f8d7bd"},
{file = "identify-2.6.3.tar.gz", hash = "sha256:62f5dae9b5fef52c84cc188514e9ea4f3f636b1d8799ab5ebc475471f9e47a02"},
@@ -1506,6 +1616,8 @@ version = "3.10"
description = "Internationalized Domain Names in Applications (IDNA)"
optional = false
python-versions = ">=3.6"
+groups = ["main", "dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"},
{file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"},
@@ -1520,6 +1632,8 @@ version = "2.36.1"
description = "Library for reading and writing a wide range of image, video, scientific, and volumetric data formats."
optional = false
python-versions = ">=3.9"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "imageio-2.36.1-py3-none-any.whl", hash = "sha256:20abd2cae58e55ca1af8a8dcf43293336a59adf0391f1917bf8518633cfc2cdf"},
{file = "imageio-2.36.1.tar.gz", hash = "sha256:e4e1d231f47f9a9e16100b0f7ce1a86e8856fb4d1c0fa2c4365a316f1746be62"},
@@ -1553,6 +1667,8 @@ version = "8.5.0"
description = "Read metadata from Python packages"
optional = false
python-versions = ">=3.8"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "importlib_metadata-8.5.0-py3-none-any.whl", hash = "sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b"},
{file = "importlib_metadata-8.5.0.tar.gz", hash = "sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7"},
@@ -1576,6 +1692,8 @@ version = "2.0.0"
description = "brain-dead simple config-ini parsing"
optional = false
python-versions = ">=3.7"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"},
{file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"},
@@ -1587,6 +1705,8 @@ version = "2.2.0"
description = "Pythonic task execution"
optional = false
python-versions = ">=3.6"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "invoke-2.2.0-py3-none-any.whl", hash = "sha256:6ea924cc53d4f78e3d98bc436b08069a03077e6f85ad1ddaa8a116d7dad15820"},
{file = "invoke-2.2.0.tar.gz", hash = "sha256:ee6cbb101af1a859c7fe84f2a264c059020b0cb7fe3535f9424300ab568f6bd5"},
@@ -1598,6 +1718,8 @@ version = "6.29.5"
description = "IPython Kernel for Jupyter"
optional = false
python-versions = ">=3.8"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5"},
{file = "ipykernel-6.29.5.tar.gz", hash = "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215"},
@@ -1631,6 +1753,8 @@ version = "8.18.1"
description = "IPython: Productive Interactive Computing"
optional = false
python-versions = ">=3.9"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "ipython-8.18.1-py3-none-any.whl", hash = "sha256:e8267419d72d81955ec1177f8a29aaa90ac80ad647499201119e2f05e99aa397"},
{file = "ipython-8.18.1.tar.gz", hash = "sha256:ca6f079bb33457c66e233e4580ebfc4128855b4cf6370dddd73842a9563e8a27"},
@@ -1667,6 +1791,8 @@ version = "8.1.5"
description = "Jupyter interactive widgets"
optional = false
python-versions = ">=3.7"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "ipywidgets-8.1.5-py3-none-any.whl", hash = "sha256:3290f526f87ae6e77655555baba4f36681c555b8bdbbff430b70e52c34c86245"},
{file = "ipywidgets-8.1.5.tar.gz", hash = "sha256:870e43b1a35656a80c18c9503bbf2d16802db1cb487eec6fab27d683381dde17"},
@@ -1688,6 +1814,8 @@ version = "5.13.2"
description = "A Python utility / library to sort Python imports."
optional = false
python-versions = ">=3.8.0"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"},
{file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"},
@@ -1702,6 +1830,8 @@ version = "3.4.0"
description = "Utility functions for Python class constructs"
optional = false
python-versions = ">=3.8"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "jaraco.classes-3.4.0-py3-none-any.whl", hash = "sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790"},
{file = "jaraco.classes-3.4.0.tar.gz", hash = "sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd"},
@@ -1720,6 +1850,8 @@ version = "6.0.1"
description = "Useful decorators and context managers"
optional = false
python-versions = ">=3.8"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "jaraco.context-6.0.1-py3-none-any.whl", hash = "sha256:f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4"},
{file = "jaraco_context-6.0.1.tar.gz", hash = "sha256:9bae4ea555cf0b14938dc0aee7c9f32ed303aa20a3b73e7dc80111628792d1b3"},
@@ -1738,6 +1870,8 @@ version = "4.1.0"
description = "Functools like those found in stdlib"
optional = false
python-versions = ">=3.8"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "jaraco.functools-4.1.0-py3-none-any.whl", hash = "sha256:ad159f13428bc4acbf5541ad6dec511f91573b90fba04df61dafa2a1231cf649"},
{file = "jaraco_functools-4.1.0.tar.gz", hash = "sha256:70f7e0e2ae076498e212562325e805204fc092d7b4c17e0e86c959e249701a9d"},
@@ -1760,6 +1894,8 @@ version = "0.19.2"
description = "An autocompletion tool for Python that can be used for text editors."
optional = false
python-versions = ">=3.6"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9"},
{file = "jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0"},
@@ -1779,6 +1915,8 @@ version = "0.8.0"
description = "Low-level, pure Python DBus protocol wrapper."
optional = false
python-versions = ">=3.7"
+groups = ["dev"]
+markers = "(python_version <= \"3.11\" or python_version >= \"3.12\") and sys_platform == \"linux\""
files = [
{file = "jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755"},
{file = "jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806"},
@@ -1794,6 +1932,8 @@ version = "3.1.4"
description = "A very fast and expressive template engine."
optional = false
python-versions = ">=3.7"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"},
{file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"},
@@ -1811,6 +1951,8 @@ version = "1.4.2"
description = "Lightweight pipelining with Python functions"
optional = false
python-versions = ">=3.8"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6"},
{file = "joblib-1.4.2.tar.gz", hash = "sha256:2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e"},
@@ -1822,6 +1964,8 @@ version = "3.1.0"
description = "Library with helpers for the jsonlines file format"
optional = false
python-versions = ">=3.6"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "jsonlines-3.1.0-py3-none-any.whl", hash = "sha256:632f5e38f93dfcb1ac8c4e09780b92af3a55f38f26e7c47ae85109d420b6ad39"},
{file = "jsonlines-3.1.0.tar.gz", hash = "sha256:2579cb488d96f815b0eb81629e3e6b0332da0962a18fa3532958f7ba14a5c37f"},
@@ -1836,6 +1980,8 @@ version = "1.1.0"
description = "jsonref is a library for automatic dereferencing of JSON Reference objects for Python."
optional = false
python-versions = ">=3.7"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "jsonref-1.1.0-py3-none-any.whl", hash = "sha256:590dc7773df6c21cbf948b5dac07a72a251db28b0238ceecce0a2abfa8ec30a9"},
{file = "jsonref-1.1.0.tar.gz", hash = "sha256:32fe8e1d85af0fdefbebce950af85590b22b60f9e95443176adbde4e1ecea552"},
@@ -1847,6 +1993,8 @@ version = "4.23.0"
description = "An implementation of JSON Schema validation for Python"
optional = false
python-versions = ">=3.8"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566"},
{file = "jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4"},
@@ -1868,6 +2016,8 @@ version = "2024.10.1"
description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry"
optional = false
python-versions = ">=3.9"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "jsonschema_specifications-2024.10.1-py3-none-any.whl", hash = "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf"},
{file = "jsonschema_specifications-2024.10.1.tar.gz", hash = "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272"},
@@ -1882,6 +2032,8 @@ version = "8.6.3"
description = "Jupyter protocol implementation and client libraries"
optional = false
python-versions = ">=3.8"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f"},
{file = "jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419"},
@@ -1904,6 +2056,8 @@ version = "5.7.2"
description = "Jupyter core package. A base package on which Jupyter projects rely."
optional = false
python-versions = ">=3.8"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "jupyter_core-5.7.2-py3-none-any.whl", hash = "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409"},
{file = "jupyter_core-5.7.2.tar.gz", hash = "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9"},
@@ -1924,6 +2078,8 @@ version = "3.0.13"
description = "Jupyter interactive widgets for JupyterLab"
optional = false
python-versions = ">=3.7"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "jupyterlab_widgets-3.0.13-py3-none-any.whl", hash = "sha256:e3cda2c233ce144192f1e29914ad522b2f4c40e77214b0cc97377ca3d323db54"},
{file = "jupyterlab_widgets-3.0.13.tar.gz", hash = "sha256:a2966d385328c1942b683a8cd96b89b8dd82c8b8f81dda902bb2bc06d46f5bed"},
@@ -1935,6 +2091,8 @@ version = "25.5.0"
description = "Store and access your passwords safely."
optional = false
python-versions = ">=3.8"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "keyring-25.5.0-py3-none-any.whl", hash = "sha256:e67f8ac32b04be4714b42fe84ce7dad9c40985b9ca827c592cc303e7c26d9741"},
{file = "keyring-25.5.0.tar.gz", hash = "sha256:4c753b3ec91717fe713c4edd522d625889d8973a349b0e582622f49766de58e6"},
@@ -1964,6 +2122,8 @@ version = "1.4.7"
description = "A fast implementation of the Cassowary constraint solver"
optional = false
python-versions = ">=3.8"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "kiwisolver-1.4.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8a9c83f75223d5e48b0bc9cb1bf2776cf01563e00ade8775ffe13b0b6e1af3a6"},
{file = "kiwisolver-1.4.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:58370b1ffbd35407444d57057b57da5d6549d2d854fa30249771775c63b5fe17"},
@@ -2087,6 +2247,8 @@ version = "0.4"
description = "Makes it easy to load subpackages and functions on demand."
optional = false
python-versions = ">=3.7"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "lazy_loader-0.4-py3-none-any.whl", hash = "sha256:342aa8e14d543a154047afb4ba8ef17f5563baad3fc610d7b15b213b0f119efc"},
{file = "lazy_loader-0.4.tar.gz", hash = "sha256:47c75182589b91a4e1a85a136c074285a5ad4d9f39c63e0d7fb76391c4574cd1"},
@@ -2106,6 +2268,8 @@ version = "1.10.0"
description = "A fast and thorough lazy object proxy."
optional = false
python-versions = ">=3.8"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "lazy-object-proxy-1.10.0.tar.gz", hash = "sha256:78247b6d45f43a52ef35c25b5581459e85117225408a4128a3daf8bf9648ac69"},
{file = "lazy_object_proxy-1.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:855e068b0358ab916454464a884779c7ffa312b8925c6f7401e952dcf3b89977"},
@@ -2152,6 +2316,8 @@ version = "0.11.9"
description = "Lightning toolbox for across the our ecosystem."
optional = false
python-versions = ">=3.8"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "lightning_utilities-0.11.9-py3-none-any.whl", hash = "sha256:ac6d4e9e28faf3ff4be997876750fee10dc604753dbc429bf3848a95c5d7e0d2"},
{file = "lightning_utilities-0.11.9.tar.gz", hash = "sha256:f5052b81344cc2684aa9afd74b7ce8819a8f49a858184ec04548a5a109dfd053"},
@@ -2173,6 +2339,8 @@ version = "5.3.0"
description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API."
optional = false
python-versions = ">=3.6"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "lxml-5.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:dd36439be765e2dde7660212b5275641edbc813e7b24668831a5c8ac91180656"},
{file = "lxml-5.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ae5fe5c4b525aa82b8076c1a59d642c17b6e8739ecf852522c6321852178119d"},
@@ -2327,6 +2495,8 @@ version = "3.0.0"
description = "Python port of markdown-it. Markdown parsing, done right!"
optional = false
python-versions = ">=3.8"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"},
{file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"},
@@ -2351,6 +2521,8 @@ version = "2.1.2"
description = "A markdown parser with high extensibility."
optional = false
python-versions = ">=3.8"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "marko-2.1.2-py3-none-any.whl", hash = "sha256:c14aa7a77468aaaf53cf056dcd3d32398b9df4c3fb81f5e120dd37cbb9f8c859"},
{file = "marko-2.1.2.tar.gz", hash = "sha256:a9170006b879376e6845c91b1ae3dce2992772954b99b70175ff888537186011"},
@@ -2367,6 +2539,8 @@ version = "3.0.2"
description = "Safely add untrusted strings to HTML/XML markup."
optional = false
python-versions = ">=3.9"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"},
{file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"},
@@ -2437,6 +2611,8 @@ version = "3.10.0"
description = "Python plotting package"
optional = false
python-versions = ">=3.10"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "matplotlib-3.10.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2c5829a5a1dd5a71f0e31e6e8bb449bc0ee9dbfb05ad28fc0c6b55101b3a4be6"},
{file = "matplotlib-3.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a2a43cbefe22d653ab34bb55d42384ed30f611bcbdea1f8d7f431011a2e1c62e"},
@@ -2494,6 +2670,8 @@ version = "0.1.7"
description = "Inline Matplotlib backend for Jupyter"
optional = false
python-versions = ">=3.8"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca"},
{file = "matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90"},
@@ -2508,6 +2686,8 @@ version = "0.7.0"
description = "McCabe checker, plugin for flake8"
optional = false
python-versions = ">=3.6"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"},
{file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"},
@@ -2519,6 +2699,8 @@ version = "0.1.2"
description = "Markdown URL utilities"
optional = false
python-versions = ">=3.7"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"},
{file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"},
@@ -2530,6 +2712,8 @@ version = "10.5.0"
description = "More routines for operating on iterables, beyond itertools"
optional = false
python-versions = ">=3.8"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "more-itertools-10.5.0.tar.gz", hash = "sha256:5482bfef7849c25dc3c6dd53a6173ae4795da2a41a80faea6700d9f5846c5da6"},
{file = "more_itertools-10.5.0-py3-none-any.whl", hash = "sha256:037b0d3203ce90cca8ab1defbbdac29d5f993fc20131f3664dc8d6acfa872aef"},
@@ -2541,6 +2725,8 @@ version = "2.10.2"
description = "A Python package for easy multiprocessing, but faster than multiprocessing"
optional = false
python-versions = "*"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "mpire-2.10.2-py3-none-any.whl", hash = "sha256:d627707f7a8d02aa4c7f7d59de399dec5290945ddf7fbd36cbb1d6ebb37a51fb"},
{file = "mpire-2.10.2.tar.gz", hash = "sha256:f66a321e93fadff34585a4bfa05e95bd946cf714b442f51c529038eb45773d97"},
@@ -2567,6 +2753,8 @@ version = "1.3.0"
description = "Python library for arbitrary-precision floating-point arithmetic"
optional = false
python-versions = "*"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c"},
{file = "mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f"},
@@ -2584,6 +2772,8 @@ version = "6.1.0"
description = "multidict implementation"
optional = false
python-versions = ">=3.8"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "multidict-6.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3380252550e372e8511d49481bd836264c009adb826b23fefcc5dd3c69692f60"},
{file = "multidict-6.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:99f826cbf970077383d7de805c0681799491cb939c25450b9b5b3ced03ca99f1"},
@@ -2688,6 +2878,8 @@ version = "0.70.16"
description = "better multiprocessing and multithreading in Python"
optional = false
python-versions = ">=3.8"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "multiprocess-0.70.16-pp310-pypy310_pp73-macosx_10_13_x86_64.whl", hash = "sha256:476887be10e2f59ff183c006af746cb6f1fd0eadcfd4ef49e605cbe2659920ee"},
{file = "multiprocess-0.70.16-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d951bed82c8f73929ac82c61f01a7b5ce8f3e5ef40f5b52553b4f547ce2b08ec"},
@@ -2712,6 +2904,8 @@ version = "1.13.0"
description = "Optional static typing for Python"
optional = false
python-versions = ">=3.8"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "mypy-1.13.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6607e0f1dd1fb7f0aca14d936d13fd19eba5e17e1cd2a14f808fa5f8f6d8f60a"},
{file = "mypy-1.13.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8a21be69bd26fa81b1f80a61ee7ab05b076c674d9b18fb56239d72e21d9f4c80"},
@@ -2765,6 +2959,8 @@ version = "1.0.0"
description = "Type system extensions for programs checked with the mypy type checker."
optional = false
python-versions = ">=3.5"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"},
{file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"},
@@ -2776,6 +2972,8 @@ version = "1.9.1"
description = "Run any standard Python code quality tool on a Jupyter Notebook"
optional = false
python-versions = ">=3.9"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "nbqa-1.9.1-py3-none-any.whl", hash = "sha256:95552d2f6c2c038136252a805aa78d85018aef922586270c3a074332737282e5"},
{file = "nbqa-1.9.1.tar.gz", hash = "sha256:a1f4bcf587c597302fed295951001fc4e1be4ce0e77e1ab1b25ac2fbe3db0cdd"},
@@ -2796,6 +2994,8 @@ version = "1.6.0"
description = "Patch asyncio to allow nested event loops"
optional = false
python-versions = ">=3.5"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c"},
{file = "nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe"},
@@ -2807,6 +3007,8 @@ version = "3.2.1"
description = "Python package for creating and manipulating graphs and networks"
optional = false
python-versions = ">=3.9"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "networkx-3.2.1-py3-none-any.whl", hash = "sha256:f18c69adc97877c42332c170849c96cefa91881c99a7cb3e95b7c659ebdc1ec2"},
{file = "networkx-3.2.1.tar.gz", hash = "sha256:9f1bb5cf3409bf324e0a722c20bdb4c20ee39bf1c30ce8ae499c8502b0b5e0c6"},
@@ -2825,6 +3027,8 @@ version = "0.2.19"
description = "Python bindings to the ammonia HTML sanitization library."
optional = false
python-versions = "*"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "nh3-0.2.19-cp313-cp313t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:ec9c8bf86e397cb88c560361f60fdce478b5edb8b93f04ead419b72fbe937ea6"},
{file = "nh3-0.2.19-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0adf00e2b2026fa10a42537b60d161e516f206781c7515e4e97e09f72a8c5d0"},
@@ -2858,6 +3062,8 @@ version = "1.11.1.3"
description = "Ninja is a small build system with a focus on speed"
optional = false
python-versions = ">=3.7"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "ninja-1.11.1.3-py3-none-macosx_10_9_universal2.whl", hash = "sha256:2b4879ea3f1169f3d855182c57dcc84d1b5048628c8b7be0d702b81882a37237"},
{file = "ninja-1.11.1.3-py3-none-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:bc3ebc8b2e47716149f3541742b5cd8e0b08f51013b825c05baca3e34854370d"},
@@ -2887,6 +3093,8 @@ version = "3.9.1"
description = "Natural Language Toolkit"
optional = false
python-versions = ">=3.8"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "nltk-3.9.1-py3-none-any.whl", hash = "sha256:4fa26829c5b00715afe3061398a8989dc643b92ce7dd93fb4585a70930d168a1"},
{file = "nltk-3.9.1.tar.gz", hash = "sha256:87d127bd3de4bd89a4f81265e5fa59cb1b199b27440175370f7417d2bc7ae868"},
@@ -2912,6 +3120,8 @@ version = "1.9.1"
description = "Node.js virtual environment builder"
optional = false
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"},
{file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"},
@@ -2923,6 +3133,8 @@ version = "2.0.2"
description = "Fundamental package for array computing in Python"
optional = false
python-versions = ">=3.9"
+groups = ["main", "dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "numpy-2.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:51129a29dbe56f9ca83438b706e2e69a39892b5eda6cedcb6b0c9fdc9b0d3ece"},
{file = "numpy-2.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f15975dfec0cf2239224d80e32c3170b1d168335eaedee69da84fbe9f1f9cd04"},
@@ -2977,6 +3189,8 @@ version = "12.4.5.8"
description = "CUBLAS native runtime libraries"
optional = false
python-versions = ">=3"
+groups = ["main"]
+markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and (python_version <= \"3.11\" or python_version >= \"3.12\")"
files = [
{file = "nvidia_cublas_cu12-12.4.5.8-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0f8aa1706812e00b9f19dfe0cdb3999b092ccb8ca168c0db5b8ea712456fd9b3"},
{file = "nvidia_cublas_cu12-12.4.5.8-py3-none-manylinux2014_x86_64.whl", hash = "sha256:2fc8da60df463fdefa81e323eef2e36489e1c94335b5358bcb38360adf75ac9b"},
@@ -2989,6 +3203,8 @@ version = "12.4.127"
description = "CUDA profiling tools runtime libs."
optional = false
python-versions = ">=3"
+groups = ["main"]
+markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and (python_version <= \"3.11\" or python_version >= \"3.12\")"
files = [
{file = "nvidia_cuda_cupti_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:79279b35cf6f91da114182a5ce1864997fd52294a87a16179ce275773799458a"},
{file = "nvidia_cuda_cupti_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:9dec60f5ac126f7bb551c055072b69d85392b13311fcc1bcda2202d172df30fb"},
@@ -3001,6 +3217,8 @@ version = "12.4.127"
description = "NVRTC native runtime libraries"
optional = false
python-versions = ">=3"
+groups = ["main"]
+markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and (python_version <= \"3.11\" or python_version >= \"3.12\")"
files = [
{file = "nvidia_cuda_nvrtc_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0eedf14185e04b76aa05b1fea04133e59f465b6f960c0cbf4e37c3cb6b0ea198"},
{file = "nvidia_cuda_nvrtc_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:a178759ebb095827bd30ef56598ec182b85547f1508941a3d560eb7ea1fbf338"},
@@ -3013,6 +3231,8 @@ version = "12.4.127"
description = "CUDA Runtime native Libraries"
optional = false
python-versions = ">=3"
+groups = ["main"]
+markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and (python_version <= \"3.11\" or python_version >= \"3.12\")"
files = [
{file = "nvidia_cuda_runtime_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:961fe0e2e716a2a1d967aab7caee97512f71767f852f67432d572e36cb3a11f3"},
{file = "nvidia_cuda_runtime_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:64403288fa2136ee8e467cdc9c9427e0434110899d07c779f25b5c068934faa5"},
@@ -3025,6 +3245,8 @@ version = "9.1.0.70"
description = "cuDNN runtime libraries"
optional = false
python-versions = ">=3"
+groups = ["main"]
+markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and (python_version <= \"3.11\" or python_version >= \"3.12\")"
files = [
{file = "nvidia_cudnn_cu12-9.1.0.70-py3-none-manylinux2014_x86_64.whl", hash = "sha256:165764f44ef8c61fcdfdfdbe769d687e06374059fbb388b6c89ecb0e28793a6f"},
{file = "nvidia_cudnn_cu12-9.1.0.70-py3-none-win_amd64.whl", hash = "sha256:6278562929433d68365a07a4a1546c237ba2849852c0d4b2262a486e805b977a"},
@@ -3039,6 +3261,8 @@ version = "11.2.1.3"
description = "CUFFT native runtime libraries"
optional = false
python-versions = ">=3"
+groups = ["main"]
+markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and (python_version <= \"3.11\" or python_version >= \"3.12\")"
files = [
{file = "nvidia_cufft_cu12-11.2.1.3-py3-none-manylinux2014_aarch64.whl", hash = "sha256:5dad8008fc7f92f5ddfa2101430917ce2ffacd86824914c82e28990ad7f00399"},
{file = "nvidia_cufft_cu12-11.2.1.3-py3-none-manylinux2014_x86_64.whl", hash = "sha256:f083fc24912aa410be21fa16d157fed2055dab1cc4b6934a0e03cba69eb242b9"},
@@ -3054,6 +3278,8 @@ version = "10.3.5.147"
description = "CURAND native runtime libraries"
optional = false
python-versions = ">=3"
+groups = ["main"]
+markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and (python_version <= \"3.11\" or python_version >= \"3.12\")"
files = [
{file = "nvidia_curand_cu12-10.3.5.147-py3-none-manylinux2014_aarch64.whl", hash = "sha256:1f173f09e3e3c76ab084aba0de819c49e56614feae5c12f69883f4ae9bb5fad9"},
{file = "nvidia_curand_cu12-10.3.5.147-py3-none-manylinux2014_x86_64.whl", hash = "sha256:a88f583d4e0bb643c49743469964103aa59f7f708d862c3ddb0fc07f851e3b8b"},
@@ -3066,6 +3292,8 @@ version = "11.6.1.9"
description = "CUDA solver native runtime libraries"
optional = false
python-versions = ">=3"
+groups = ["main"]
+markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and (python_version <= \"3.11\" or python_version >= \"3.12\")"
files = [
{file = "nvidia_cusolver_cu12-11.6.1.9-py3-none-manylinux2014_aarch64.whl", hash = "sha256:d338f155f174f90724bbde3758b7ac375a70ce8e706d70b018dd3375545fc84e"},
{file = "nvidia_cusolver_cu12-11.6.1.9-py3-none-manylinux2014_x86_64.whl", hash = "sha256:19e33fa442bcfd085b3086c4ebf7e8debc07cfe01e11513cc6d332fd918ac260"},
@@ -3083,6 +3311,8 @@ version = "12.3.1.170"
description = "CUSPARSE native runtime libraries"
optional = false
python-versions = ">=3"
+groups = ["main"]
+markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and (python_version <= \"3.11\" or python_version >= \"3.12\")"
files = [
{file = "nvidia_cusparse_cu12-12.3.1.170-py3-none-manylinux2014_aarch64.whl", hash = "sha256:9d32f62896231ebe0480efd8a7f702e143c98cfaa0e8a76df3386c1ba2b54df3"},
{file = "nvidia_cusparse_cu12-12.3.1.170-py3-none-manylinux2014_x86_64.whl", hash = "sha256:ea4f11a2904e2a8dc4b1833cc1b5181cde564edd0d5cd33e3c168eff2d1863f1"},
@@ -3098,6 +3328,8 @@ version = "2.21.5"
description = "NVIDIA Collective Communication Library (NCCL) Runtime"
optional = false
python-versions = ">=3"
+groups = ["main"]
+markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and (python_version <= \"3.11\" or python_version >= \"3.12\")"
files = [
{file = "nvidia_nccl_cu12-2.21.5-py3-none-manylinux2014_x86_64.whl", hash = "sha256:8579076d30a8c24988834445f8d633c697d42397e92ffc3f63fa26766d25e0a0"},
]
@@ -3108,6 +3340,8 @@ version = "12.4.127"
description = "Nvidia JIT LTO Library"
optional = false
python-versions = ">=3"
+groups = ["main"]
+markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and (python_version <= \"3.11\" or python_version >= \"3.12\")"
files = [
{file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:4abe7fef64914ccfa909bc2ba39739670ecc9e820c83ccc7a6ed414122599b83"},
{file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:06b3b9b25bf3f8af351d664978ca26a16d2c5127dbd53c0497e28d1fb9611d57"},
@@ -3120,6 +3354,8 @@ version = "12.4.127"
description = "NVIDIA Tools Extension"
optional = false
python-versions = ">=3"
+groups = ["main"]
+markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and (python_version <= \"3.11\" or python_version >= \"3.12\")"
files = [
{file = "nvidia_nvtx_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7959ad635db13edf4fc65c06a6e9f9e55fc2f92596db928d169c0bb031e88ef3"},
{file = "nvidia_nvtx_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:781e950d9b9f60d8241ccea575b32f5105a5baf4c2351cab5256a24869f12a1a"},
@@ -3132,6 +3368,8 @@ version = "4.10.0.84"
description = "Wrapper package for OpenCV python bindings."
optional = false
python-versions = ">=3.6"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "opencv-python-headless-4.10.0.84.tar.gz", hash = "sha256:f2017c6101d7c2ef8d7bc3b414c37ff7f54d64413a1847d89970b6b7069b4e1a"},
{file = "opencv_python_headless-4.10.0.84-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:a4f4bcb07d8f8a7704d9c8564c224c8b064c63f430e95b61ac0bffaa374d330e"},
@@ -3156,6 +3394,8 @@ version = "3.1.5"
description = "A Python library to read/write Excel 2010 xlsx/xlsm files"
optional = false
python-versions = ">=3.8"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "openpyxl-3.1.5-py2.py3-none-any.whl", hash = "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2"},
{file = "openpyxl-3.1.5.tar.gz", hash = "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050"},
@@ -3170,6 +3410,8 @@ version = "24.2"
description = "Core utilities for Python packages"
optional = false
python-versions = ">=3.8"
+groups = ["main", "dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"},
{file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"},
@@ -3181,34 +3423,48 @@ version = "2.2.3"
description = "Powerful data structures for data analysis, time series, and statistics"
optional = false
python-versions = ">=3.9"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "pandas-2.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1948ddde24197a0f7add2bdc4ca83bf2b1ef84a1bc8ccffd95eda17fd836ecb5"},
{file = "pandas-2.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:381175499d3802cde0eabbaf6324cce0c4f5d52ca6f8c377c29ad442f50f6348"},
+ {file = "pandas-2.2.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d9c45366def9a3dd85a6454c0e7908f2b3b8e9c138f5dc38fed7ce720d8453ed"},
{file = "pandas-2.2.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86976a1c5b25ae3f8ccae3a5306e443569ee3c3faf444dfd0f41cda24667ad57"},
+ {file = "pandas-2.2.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b8661b0238a69d7aafe156b7fa86c44b881387509653fdf857bebc5e4008ad42"},
{file = "pandas-2.2.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:37e0aced3e8f539eccf2e099f65cdb9c8aa85109b0be6e93e2baff94264bdc6f"},
{file = "pandas-2.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:56534ce0746a58afaf7942ba4863e0ef81c9c50d3f0ae93e9497d6a41a057645"},
{file = "pandas-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039"},
{file = "pandas-2.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c2875855b0ff77b2a64a0365e24455d9990730d6431b9e0ee18ad8acee13dbd"},
+ {file = "pandas-2.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698"},
{file = "pandas-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc"},
+ {file = "pandas-2.2.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:63cc132e40a2e084cf01adf0775b15ac515ba905d7dcca47e9a251819c575ef3"},
{file = "pandas-2.2.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:29401dbfa9ad77319367d36940cd8a0b3a11aba16063e39632d98b0e931ddf32"},
{file = "pandas-2.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:3fc6873a41186404dad67245896a6e440baacc92f5b716ccd1bc9ed2995ab2c5"},
{file = "pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9"},
{file = "pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4"},
+ {file = "pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3"},
{file = "pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319"},
+ {file = "pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8"},
{file = "pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a"},
{file = "pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13"},
{file = "pandas-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015"},
{file = "pandas-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28"},
+ {file = "pandas-2.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0"},
{file = "pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24"},
+ {file = "pandas-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659"},
{file = "pandas-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb"},
{file = "pandas-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d"},
{file = "pandas-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468"},
{file = "pandas-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18"},
+ {file = "pandas-2.2.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2"},
{file = "pandas-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4"},
+ {file = "pandas-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d"},
{file = "pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a"},
{file = "pandas-2.2.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc6b93f9b966093cb0fd62ff1a7e4c09e6d546ad7c1de191767baffc57628f39"},
{file = "pandas-2.2.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5dbca4c1acd72e8eeef4753eeca07de9b1db4f398669d5994086f788a5d7cc30"},
+ {file = "pandas-2.2.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8cd6d7cc958a3910f934ea8dbdf17b2364827bb4dafc38ce6eef6bb3d65ff09c"},
{file = "pandas-2.2.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99df71520d25fade9db7c1076ac94eb994f4d2673ef2aa2e86ee039b6746d20c"},
+ {file = "pandas-2.2.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:31d0ced62d4ea3e231a9f228366919a5ea0b07440d9d4dac345376fd8e1477ea"},
{file = "pandas-2.2.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7eee9e7cea6adf3e3d24e304ac6b8300646e2a5d1cd3a3c2abed9101b0846761"},
{file = "pandas-2.2.3-cp39-cp39-win_amd64.whl", hash = "sha256:4850ba03528b6dd51d6c5d273c46f183f39a9baf3f0143e566b89450965b105e"},
{file = "pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667"},
@@ -3255,6 +3511,8 @@ version = "2.2.2.240807"
description = "Type annotations for pandas"
optional = false
python-versions = ">=3.9"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "pandas_stubs-2.2.2.240807-py3-none-any.whl", hash = "sha256:893919ad82be4275f0d07bb47a95d08bae580d3fdea308a7acfcb3f02e76186e"},
{file = "pandas_stubs-2.2.2.240807.tar.gz", hash = "sha256:64a559725a57a449f46225fbafc422520b7410bff9252b661a225b5559192a93"},
@@ -3270,6 +3528,8 @@ version = "0.8.4"
description = "A Python Parser"
optional = false
python-versions = ">=3.6"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"},
{file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"},
@@ -3285,6 +3545,8 @@ version = "0.12.1"
description = "Utility library for gitignore style pattern matching of file paths."
optional = false
python-versions = ">=3.8"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"},
{file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"},
@@ -3296,6 +3558,8 @@ version = "4.9.0"
description = "Pexpect allows easy control of interactive console applications."
optional = false
python-versions = "*"
+groups = ["dev"]
+markers = "(python_version <= \"3.11\" or python_version >= \"3.12\") and sys_platform != \"win32\""
files = [
{file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"},
{file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"},
@@ -3310,6 +3574,8 @@ version = "10.4.0"
description = "Python Imaging Library (Fork)"
optional = false
python-versions = ">=3.8"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "pillow-10.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e"},
{file = "pillow-10.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d"},
@@ -3407,6 +3673,8 @@ version = "1.12.0"
description = "Query metadata from sdists / bdists / installed packages."
optional = false
python-versions = ">=3.8"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "pkginfo-1.12.0-py3-none-any.whl", hash = "sha256:dcd589c9be4da8973eceffa247733c144812759aa67eaf4bbf97016a02f39088"},
{file = "pkginfo-1.12.0.tar.gz", hash = "sha256:8ad91a0445a036782b9366ef8b8c2c50291f83a553478ba8580c73d3215700cf"},
@@ -3421,6 +3689,8 @@ version = "4.3.6"
description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`."
optional = false
python-versions = ">=3.8"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"},
{file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"},
@@ -3437,6 +3707,8 @@ version = "1.5.0"
description = "plugin and hook calling mechanisms for python"
optional = false
python-versions = ">=3.8"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"},
{file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"},
@@ -3452,6 +3724,8 @@ version = "3.8.0"
description = "A framework for managing and maintaining multi-language pre-commit hooks."
optional = false
python-versions = ">=3.9"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "pre_commit-3.8.0-py2.py3-none-any.whl", hash = "sha256:9a90a53bf82fdd8778d58085faf8d83df56e40dfe18f45b19446e26bf1b3a63f"},
{file = "pre_commit-3.8.0.tar.gz", hash = "sha256:8bb6494d4a20423842e198980c9ecf9f96607a07ea29549e180eef9ae80fe7af"},
@@ -3470,6 +3744,8 @@ version = "3.0.48"
description = "Library for building powerful interactive command lines in Python"
optional = false
python-versions = ">=3.7.0"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "prompt_toolkit-3.0.48-py3-none-any.whl", hash = "sha256:f49a827f90062e411f1ce1f854f2aedb3c23353244f8108b89283587397ac10e"},
{file = "prompt_toolkit-3.0.48.tar.gz", hash = "sha256:d6623ab0477a80df74e646bdbc93621143f5caf104206aa29294d53de1a03d90"},
@@ -3484,6 +3760,8 @@ version = "0.2.1"
description = "Accelerated property cache"
optional = false
python-versions = ">=3.9"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "propcache-0.2.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6b3f39a85d671436ee3d12c017f8fdea38509e4f25b28eb25877293c98c243f6"},
{file = "propcache-0.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d51fbe4285d5db5d92a929e3e21536ea3dd43732c5b177c7ef03f918dff9f2"},
@@ -3575,6 +3853,8 @@ version = "6.1.0"
description = "Cross-platform lib for process and system monitoring in Python."
optional = false
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "psutil-6.1.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ff34df86226c0227c52f38b919213157588a678d049688eded74c76c8ba4a5d0"},
{file = "psutil-6.1.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:c0e0c00aa18ca2d3b2b991643b799a15fc8f0563d2ebb6040f64ce8dc027b942"},
@@ -3605,6 +3885,8 @@ version = "0.7.0"
description = "Run a subprocess in a pseudo terminal"
optional = false
python-versions = "*"
+groups = ["dev"]
+markers = "(python_version <= \"3.11\" or python_version >= \"3.12\") and sys_platform != \"win32\""
files = [
{file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"},
{file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"},
@@ -3616,6 +3898,8 @@ version = "0.2.3"
description = "Safely evaluate AST nodes without side effects"
optional = false
python-versions = "*"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0"},
{file = "pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42"},
@@ -3630,6 +3914,8 @@ version = "18.1.0"
description = "Python library for Apache Arrow"
optional = false
python-versions = ">=3.9"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "pyarrow-18.1.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:e21488d5cfd3d8b500b3238a6c4b075efabc18f0f6d80b29239737ebd69caa6c"},
{file = "pyarrow-18.1.0-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:b516dad76f258a702f7ca0250885fc93d1fa5ac13ad51258e39d402bd9e2e1e4"},
@@ -3684,6 +3970,8 @@ version = "1.3.0.post6"
description = "Cython wrapper for the C++ translation of the Angus Johnson's Clipper library (ver. 6.4.2)"
optional = false
python-versions = "*"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "pyclipper-1.3.0.post6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fa0f5e78cfa8262277bb3d0225537b3c2a90ef68fd90a229d5d24cf49955dcf4"},
{file = "pyclipper-1.3.0.post6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a01f182d8938c1dc515e8508ed2442f7eebd2c25c7d5cb29281f583c1a8008a4"},
@@ -3743,6 +4031,8 @@ version = "2.0.8"
description = "Official APIs for the MS-COCO dataset"
optional = false
python-versions = ">=3.9"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "pycocotools-2.0.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9a66886f45b04cee1ff0492e9f5e25d430d8aa3eb63e63c4ebc620945caa11b9"},
{file = "pycocotools-2.0.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:257130b65b7b0f122ce1ed62942867ca9789e56a68109682796cc85c9770c74a"},
@@ -3785,6 +4075,8 @@ version = "2.11.1"
description = "Python style guide checker"
optional = false
python-versions = ">=3.8"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "pycodestyle-2.11.1-py2.py3-none-any.whl", hash = "sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67"},
{file = "pycodestyle-2.11.1.tar.gz", hash = "sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f"},
@@ -3796,6 +4088,8 @@ version = "2.22"
description = "C parser in Python"
optional = false
python-versions = ">=3.8"
+groups = ["dev"]
+markers = "(sys_platform == \"linux\" or implementation_name == \"pypy\") and (python_version <= \"3.11\" or python_version >= \"3.12\") and (implementation_name == \"pypy\" or platform_python_implementation != \"PyPy\")"
files = [
{file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"},
{file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"},
@@ -3807,6 +4101,8 @@ version = "2.10.3"
description = "Data validation using Python type hints"
optional = false
python-versions = ">=3.8"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "pydantic-2.10.3-py3-none-any.whl", hash = "sha256:be04d85bbc7b65651c5f8e6b9976ed9c6f41782a55524cef079a34a0bb82144d"},
{file = "pydantic-2.10.3.tar.gz", hash = "sha256:cb5ac360ce894ceacd69c403187900a02c4b20b693a9dd1d643e1effab9eadf9"},
@@ -3827,6 +4123,8 @@ version = "2.27.1"
description = "Core functionality for Pydantic validation and serialization"
optional = false
python-versions = ">=3.8"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "pydantic_core-2.27.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:71a5e35c75c021aaf400ac048dacc855f000bdfed91614b4a726f7432f1f3d6a"},
{file = "pydantic_core-2.27.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f82d068a2d6ecfc6e054726080af69a6764a10015467d7d7b9f66d6ed5afa23b"},
@@ -3939,6 +4237,8 @@ version = "2.7.0"
description = "Settings management using Pydantic"
optional = false
python-versions = ">=3.8"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "pydantic_settings-2.7.0-py3-none-any.whl", hash = "sha256:e00c05d5fa6cbbb227c84bd7487c5c1065084119b750df7c8c1a554aed236eb5"},
{file = "pydantic_settings-2.7.0.tar.gz", hash = "sha256:ac4bfd4a36831a48dbf8b2d9325425b549a0a6f18cea118436d728eb4f1c4d66"},
@@ -3959,6 +4259,8 @@ version = "3.1.0"
description = "passive checker of Python programs"
optional = false
python-versions = ">=3.8"
+groups = ["main", "dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "pyflakes-3.1.0-py2.py3-none-any.whl", hash = "sha256:4132f6d49cb4dae6819e5379898f2b8cce3c5f23994194c24b77d5da2e36f774"},
{file = "pyflakes-3.1.0.tar.gz", hash = "sha256:a0aae034c444db0071aa077972ba4768d40c830d9539fd45bf4cd3f8f6992efc"},
@@ -3970,6 +4272,8 @@ version = "2.18.0"
description = "Pygments is a syntax highlighting package written in Python."
optional = false
python-versions = ">=3.8"
+groups = ["main", "dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"},
{file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"},
@@ -3984,6 +4288,8 @@ version = "2.17.7"
description = "python code static checker"
optional = false
python-versions = ">=3.7.2"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "pylint-2.17.7-py3-none-any.whl", hash = "sha256:27a8d4c7ddc8c2f8c18aa0050148f89ffc09838142193fdbe98f172781a3ff87"},
{file = "pylint-2.17.7.tar.gz", hash = "sha256:f4fcac7ae74cfe36bc8451e931d8438e4a476c20314b1101c458ad0f05191fad"},
@@ -4012,6 +4318,8 @@ version = "3.2.0"
description = "pyparsing module - Classes and methods to define and execute parsing grammars"
optional = false
python-versions = ">=3.9"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "pyparsing-3.2.0-py3-none-any.whl", hash = "sha256:93d9577b88da0bbea8cc8334ee8b918ed014968fd2ec383e868fb8afb1ccef84"},
{file = "pyparsing-3.2.0.tar.gz", hash = "sha256:cbf74e27246d595d9a74b186b810f6fbb86726dbf3b9532efb343f6d7294fe9c"},
@@ -4026,6 +4334,8 @@ version = "4.30.0"
description = "Python bindings to PDFium"
optional = false
python-versions = ">=3.6"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "pypdfium2-4.30.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:b33ceded0b6ff5b2b93bc1fe0ad4b71aa6b7e7bd5875f1ca0cdfb6ba6ac01aab"},
{file = "pypdfium2-4.30.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:4e55689f4b06e2d2406203e771f78789bd4f190731b5d57383d05cf611d829de"},
@@ -4048,6 +4358,8 @@ version = "6.1.0"
description = "pyproject-flake8 (`pflake8`), a monkey patching wrapper to connect flake8 with pyproject.toml configuration"
optional = false
python-versions = ">=3.8.1"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "pyproject_flake8-6.1.0-py3-none-any.whl", hash = "sha256:86ea5559263c098e1aa4f866776aa2cf45362fd91a576b9fd8fbbbb55db12c4e"},
{file = "pyproject_flake8-6.1.0.tar.gz", hash = "sha256:6da8e5a264395e0148bc11844c6fb50546f1fac83ac9210f7328664135f9e70f"},
@@ -4063,6 +4375,8 @@ version = "7.4.4"
description = "pytest: simple powerful testing with Python"
optional = false
python-versions = ">=3.7"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"},
{file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"},
@@ -4085,6 +4399,8 @@ version = "3.6.1"
description = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs"
optional = false
python-versions = ">=3.8"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "pytest_xdist-3.6.1-py3-none-any.whl", hash = "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7"},
{file = "pytest_xdist-3.6.1.tar.gz", hash = "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d"},
@@ -4105,6 +4421,8 @@ version = "0.6.3"
description = "Python Bidi layout wrapping the Rust crate unicode-bidi"
optional = false
python-versions = "*"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "python_bidi-0.6.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:7e2a62d7ebb4af9831c85921063154ab4067c73768ad04f466dff1359e6f2650"},
{file = "python_bidi-0.6.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6b8035f02c3fcb52d372bfe51db00a0c95a3fdd6f0504a32e70d4f799809070d"},
@@ -4238,6 +4556,8 @@ version = "2.9.0.post0"
description = "Extensions to the standard Python datetime module"
optional = false
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
+groups = ["main", "dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"},
{file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"},
@@ -4252,6 +4572,8 @@ version = "1.1.2"
description = "Create, read, and update Microsoft Word .docx files."
optional = false
python-versions = ">=3.7"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "python_docx-1.1.2-py3-none-any.whl", hash = "sha256:08c20d6058916fb19853fcf080f7f42b6270d89eac9fa5f8c15f691c0017fabe"},
{file = "python_docx-1.1.2.tar.gz", hash = "sha256:0cf1f22e95b9002addca7948e16f2cd7acdfd498047f1941ca5d293db7762efd"},
@@ -4267,6 +4589,8 @@ version = "1.0.1"
description = "Read key-value pairs from a .env file and set them as environment variables"
optional = false
python-versions = ">=3.8"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"},
{file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"},
@@ -4281,6 +4605,8 @@ version = "3.15.0"
description = "Interact with GitLab API"
optional = false
python-versions = ">=3.7.0"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "python-gitlab-3.15.0.tar.gz", hash = "sha256:c9e65eb7612a9fbb8abf0339972eca7fd7a73d4da66c9b446ffe528930aff534"},
{file = "python_gitlab-3.15.0-py3-none-any.whl", hash = "sha256:8f8d1c0d387f642eb1ac7bf5e8e0cd8b3dd49c6f34170cee3c7deb7d384611f3"},
@@ -4300,6 +4626,8 @@ version = "1.0.2"
description = "Create, read, and update PowerPoint 2007+ (.pptx) files."
optional = false
python-versions = ">=3.8"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "python_pptx-1.0.2-py3-none-any.whl", hash = "sha256:160838e0b8565a8b1f67947675886e9fea18aa5e795db7ae531606d68e785cba"},
{file = "python_pptx-1.0.2.tar.gz", hash = "sha256:479a8af0eaf0f0d76b6f00b0887732874ad2e3188230315290cd1f9dd9cc7095"},
@@ -4317,6 +4645,8 @@ version = "7.34.6"
description = "Automatic Semantic Versioning for Python projects"
optional = false
python-versions = "*"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "python-semantic-release-7.34.6.tar.gz", hash = "sha256:e9b8fb788024ae9510a924136d573588415a16eeca31cc5240f2754a80a2e831"},
{file = "python_semantic_release-7.34.6-py3-none-any.whl", hash = "sha256:7e3969ba4663d9b2087b02bf3ac140e202551377bf045c34e09bfe19753e19ab"},
@@ -4348,6 +4678,8 @@ version = "2024.2"
description = "World timezone definitions, modern and historical"
optional = false
python-versions = "*"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "pytz-2024.2-py2.py3-none-any.whl", hash = "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725"},
{file = "pytz-2024.2.tar.gz", hash = "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a"},
@@ -4359,6 +4691,7 @@ version = "307"
description = "Python for Window Extensions"
optional = false
python-versions = "*"
+groups = ["main", "dev"]
files = [
{file = "pywin32-307-cp310-cp310-win32.whl", hash = "sha256:f8f25d893c1e1ce2d685ef6d0a481e87c6f510d0f3f117932781f412e0eba31b"},
{file = "pywin32-307-cp310-cp310-win_amd64.whl", hash = "sha256:36e650c5e5e6b29b5d317385b02d20803ddbac5d1031e1f88d20d76676dd103d"},
@@ -4379,6 +4712,7 @@ files = [
{file = "pywin32-307-cp39-cp39-win32.whl", hash = "sha256:55ee87f2f8c294e72ad9d4261ca423022310a6e79fb314a8ca76ab3f493854c6"},
{file = "pywin32-307-cp39-cp39-win_amd64.whl", hash = "sha256:e9d5202922e74985b037c9ef46778335c102b74b95cec70f629453dbe7235d87"},
]
+markers = {main = "(sys_platform == \"win32\" or platform_system == \"Windows\") and (python_version <= \"3.11\" or python_version >= \"3.12\")", dev = "platform_python_implementation != \"PyPy\" and sys_platform == \"win32\" and (python_version <= \"3.11\" or python_version >= \"3.12\")"}
[[package]]
name = "pywin32-ctypes"
@@ -4386,6 +4720,8 @@ version = "0.2.3"
description = "A (partial) reimplementation of pywin32 using ctypes/cffi"
optional = false
python-versions = ">=3.6"
+groups = ["dev"]
+markers = "(python_version <= \"3.11\" or python_version >= \"3.12\") and sys_platform == \"win32\""
files = [
{file = "pywin32-ctypes-0.2.3.tar.gz", hash = "sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755"},
{file = "pywin32_ctypes-0.2.3-py3-none-any.whl", hash = "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8"},
@@ -4397,6 +4733,8 @@ version = "6.0.2"
description = "YAML parser and emitter for Python"
optional = false
python-versions = ">=3.8"
+groups = ["main", "dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"},
{file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"},
@@ -4459,6 +4797,8 @@ version = "26.2.0"
description = "Python bindings for 0MQ"
optional = false
python-versions = ">=3.7"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "pyzmq-26.2.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:ddf33d97d2f52d89f6e6e7ae66ee35a4d9ca6f36eda89c24591b0c40205a3629"},
{file = "pyzmq-26.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dacd995031a01d16eec825bf30802fceb2c3791ef24bcce48fa98ce40918c27b"},
@@ -4580,6 +4920,8 @@ version = "44.0"
description = "readme_renderer is a library for rendering readme descriptions for Warehouse"
optional = false
python-versions = ">=3.9"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "readme_renderer-44.0-py3-none-any.whl", hash = "sha256:2fbca89b81a08526aadf1357a8c2ae889ec05fb03f5da67f9769c9a592166151"},
{file = "readme_renderer-44.0.tar.gz", hash = "sha256:8712034eabbfa6805cacf1402b4eeb2a73028f72d1166d6f5cb7f9c047c5d1e1"},
@@ -4599,6 +4941,8 @@ version = "0.35.1"
description = "JSON Referencing + Python"
optional = false
python-versions = ">=3.8"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "referencing-0.35.1-py3-none-any.whl", hash = "sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de"},
{file = "referencing-0.35.1.tar.gz", hash = "sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c"},
@@ -4614,6 +4958,8 @@ version = "2024.11.6"
description = "Alternative regular expression module, to replace re."
optional = false
python-versions = ">=3.8"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "regex-2024.11.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff590880083d60acc0433f9c3f713c51f7ac6ebb9adf889c79a261ecf541aa91"},
{file = "regex-2024.11.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:658f90550f38270639e83ce492f27d2c8d2cd63805c65a13a14d36ca126753f0"},
@@ -4717,6 +5063,8 @@ version = "2.32.3"
description = "Python HTTP for Humans."
optional = false
python-versions = ">=3.8"
+groups = ["main", "dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"},
{file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"},
@@ -4738,6 +5086,8 @@ version = "1.0.0"
description = "A utility belt for advanced users of python-requests"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"},
{file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"},
@@ -4752,6 +5102,8 @@ version = "2.0.0"
description = "Validating URI References per RFC 3986"
optional = false
python-versions = ">=3.7"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd"},
{file = "rfc3986-2.0.0.tar.gz", hash = "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c"},
@@ -4766,6 +5118,8 @@ version = "13.9.4"
description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal"
optional = false
python-versions = ">=3.8.0"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90"},
{file = "rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098"},
@@ -4785,6 +5139,8 @@ version = "0.22.3"
description = "Python bindings to Rust's persistent data structures (rpds)"
optional = false
python-versions = ">=3.9"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "rpds_py-0.22.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:6c7b99ca52c2c1752b544e310101b98a659b720b21db00e65edca34483259967"},
{file = "rpds_py-0.22.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:be2eb3f2495ba669d2a985f9b426c1797b7d48d6963899276d22f23e33d47e37"},
@@ -4897,6 +5253,8 @@ version = "1.3.0"
description = "R-Tree spatial index for Python GIS"
optional = false
python-versions = ">=3.8"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "Rtree-1.3.0-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:80879d9db282a2273ca3a0d896c84583940e9777477727a277624ebfd424c517"},
{file = "Rtree-1.3.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:4328e9e421797c347e6eb08efbbade962fe3664ebd60c1dffe82c40911b1e125"},
@@ -4916,6 +5274,8 @@ version = "0.4.5"
description = ""
optional = false
python-versions = ">=3.7"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "safetensors-0.4.5-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:a63eaccd22243c67e4f2b1c3e258b257effc4acd78f3b9d397edc8cf8f1298a7"},
{file = "safetensors-0.4.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:23fc9b4ec7b602915cbb4ec1a7c1ad96d2743c322f20ab709e2c35d1b66dad27"},
@@ -5052,6 +5412,8 @@ version = "0.24.0"
description = "Image processing in Python"
optional = false
python-versions = ">=3.9"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "scikit_image-0.24.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cb3bc0264b6ab30b43c4179ee6156bc18b4861e78bb329dd8d16537b7bbf827a"},
{file = "scikit_image-0.24.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:9c7a52e20cdd760738da38564ba1fed7942b623c0317489af1a598a8dedf088b"},
@@ -5100,6 +5462,8 @@ version = "1.13.1"
description = "Fundamental algorithms for scientific computing in Python"
optional = false
python-versions = ">=3.9"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "scipy-1.13.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:20335853b85e9a49ff7572ab453794298bcf0354d8068c5f6775a0eabf350aca"},
{file = "scipy-1.13.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:d605e9c23906d1994f55ace80e0125c587f96c020037ea6aa98d01b4bd2e222f"},
@@ -5142,6 +5506,8 @@ version = "3.3.3"
description = "Python bindings to FreeDesktop.org Secret Service API"
optional = false
python-versions = ">=3.6"
+groups = ["dev"]
+markers = "(python_version <= \"3.11\" or python_version >= \"3.12\") and sys_platform == \"linux\""
files = [
{file = "SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99"},
{file = "SecretStorage-3.3.3.tar.gz", hash = "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77"},
@@ -5157,6 +5523,8 @@ version = "2.2.2"
description = "A fast and lightweight Python library for splitting text into semantically meaningful chunks."
optional = false
python-versions = ">=3.9"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "semchunk-2.2.2-py3-none-any.whl", hash = "sha256:94ca19020c013c073abdfd06d79a7c13637b91738335f3b8cdb5655ee7cc94d2"},
{file = "semchunk-2.2.2.tar.gz", hash = "sha256:940e89896e64eeb01de97ba60f51c8c7b96c6a3951dfcf574f25ce2146752f52"},
@@ -5172,6 +5540,8 @@ version = "2.13.0"
description = "Python helper for Semantic Versioning (http://semver.org/)"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "semver-2.13.0-py2.py3-none-any.whl", hash = "sha256:ced8b23dceb22134307c1b8abfa523da14198793d9787ac838e70e29e77458d4"},
{file = "semver-2.13.0.tar.gz", hash = "sha256:fa0fe2722ee1c3f57eac478820c3a5ae2f624af8264cbdf9000c980ff7f75e3f"},
@@ -5183,6 +5553,8 @@ version = "75.6.0"
description = "Easily download, build, install, upgrade, and uninstall Python packages"
optional = false
python-versions = ">=3.9"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "setuptools-75.6.0-py3-none-any.whl", hash = "sha256:ce74b49e8f7110f9bf04883b730f4765b774ef3ef28f722cce7c273d253aaf7d"},
{file = "setuptools-75.6.0.tar.gz", hash = "sha256:8199222558df7c86216af4f84c30e9b34a61d8ba19366cc914424cdbd28252f6"},
@@ -5203,6 +5575,8 @@ version = "2.0.6"
description = "Manipulation and analysis of geometric objects"
optional = false
python-versions = ">=3.7"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "shapely-2.0.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:29a34e068da2d321e926b5073539fd2a1d4429a2c656bd63f0bd4c8f5b236d0b"},
{file = "shapely-2.0.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c84c3f53144febf6af909d6b581bc05e8785d57e27f35ebaa5c1ab9baba13b"},
@@ -5261,6 +5635,8 @@ version = "1.5.4"
description = "Tool to Detect Surrounding Shell"
optional = false
python-versions = ">=3.7"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686"},
{file = "shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de"},
@@ -5272,6 +5648,8 @@ version = "1.17.0"
description = "Python 2 and 3 compatibility utilities"
optional = false
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
+groups = ["main", "dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"},
{file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"},
@@ -5283,6 +5661,8 @@ version = "5.0.1"
description = "A pure Python implementation of a sliding window memory map manager"
optional = false
python-versions = ">=3.7"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "smmap-5.0.1-py3-none-any.whl", hash = "sha256:e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da"},
{file = "smmap-5.0.1.tar.gz", hash = "sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62"},
@@ -5294,6 +5674,8 @@ version = "2.6"
description = "A modern CSS selector implementation for Beautiful Soup."
optional = false
python-versions = ">=3.8"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9"},
{file = "soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb"},
@@ -5305,6 +5687,8 @@ version = "0.6.3"
description = "Extract data from python stack frames and tracebacks for informative displays"
optional = false
python-versions = "*"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"},
{file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"},
@@ -5324,6 +5708,8 @@ version = "1.13.1"
description = "Computer algebra system (CAS) in Python"
optional = false
python-versions = ">=3.8"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "sympy-1.13.1-py3-none-any.whl", hash = "sha256:db36cdc64bf61b9b24578b6f7bab1ecdd2452cf008f34faa33776680c26d66f8"},
{file = "sympy-1.13.1.tar.gz", hash = "sha256:9cebf7e04ff162015ce31c9c6c9144daa34a93bd082f54fd8f12deca4f47515f"},
@@ -5341,6 +5727,8 @@ version = "0.9.0"
description = "Pretty-print tabular data"
optional = false
python-versions = ">=3.7"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f"},
{file = "tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c"},
@@ -5355,6 +5743,8 @@ version = "2024.8.30"
description = "Read and write TIFF files"
optional = false
python-versions = ">=3.9"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "tifffile-2024.8.30-py3-none-any.whl", hash = "sha256:8bc59a8f02a2665cd50a910ec64961c5373bee0b8850ec89d3b7b485bf7be7ad"},
{file = "tifffile-2024.8.30.tar.gz", hash = "sha256:2c9508fe768962e30f87def61819183fb07692c258cb175b3c114828368485a4"},
@@ -5377,6 +5767,8 @@ version = "6.1.0"
description = "A wrapper around the stdlib `tokenize` which roundtrips."
optional = false
python-versions = ">=3.9"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "tokenize_rt-6.1.0-py2.py3-none-any.whl", hash = "sha256:d706141cdec4aa5f358945abe36b911b8cbdc844545da99e811250c0cee9b6fc"},
{file = "tokenize_rt-6.1.0.tar.gz", hash = "sha256:e8ee836616c0877ab7c7b54776d2fefcc3bde714449a206762425ae114b53c86"},
@@ -5388,6 +5780,8 @@ version = "0.21.0"
description = ""
optional = false
python-versions = ">=3.7"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "tokenizers-0.21.0-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:3c4c93eae637e7d2aaae3d376f06085164e1660f89304c0ab2b1d08a406636b2"},
{file = "tokenizers-0.21.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:f53ea537c925422a2e0e92a24cce96f6bc5046bbef24a1652a5edc8ba975f62e"},
@@ -5420,6 +5814,7 @@ version = "2.2.1"
description = "A lil' TOML parser"
optional = false
python-versions = ">=3.8"
+groups = ["main", "dev"]
files = [
{file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"},
{file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"},
@@ -5454,6 +5849,7 @@ files = [
{file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"},
{file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"},
]
+markers = {main = "python_version < \"3.11\"", dev = "python_version <= \"3.11\" or python_version >= \"3.12\""}
[[package]]
name = "tomlkit"
@@ -5461,6 +5857,8 @@ version = "0.13.2"
description = "Style preserving TOML library"
optional = false
python-versions = ">=3.8"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "tomlkit-0.13.2-py3-none-any.whl", hash = "sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde"},
{file = "tomlkit-0.13.2.tar.gz", hash = "sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79"},
@@ -5472,6 +5870,8 @@ version = "2.5.1"
description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration"
optional = false
python-versions = ">=3.8.0"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "torch-2.5.1-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:71328e1bbe39d213b8721678f9dcac30dfc452a46d586f1d514a6aa0a99d4744"},
{file = "torch-2.5.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:34bfa1a852e5714cbfa17f27c49d8ce35e1b7af5608c4bc6e81392c352dbc601"},
@@ -5524,6 +5924,8 @@ version = "1.6.0"
description = "PyTorch native Metrics"
optional = false
python-versions = ">=3.9"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "torchmetrics-1.6.0-py3-none-any.whl", hash = "sha256:a508cdd87766cedaaf55a419812bf9f493aff8fffc02cc19df5a8e2e7ccb942a"},
{file = "torchmetrics-1.6.0.tar.gz", hash = "sha256:aebba248708fb90def20cccba6f55bddd134a58de43fb22b0c5ca0f3a89fa984"},
@@ -5552,6 +5954,8 @@ version = "0.20.1"
description = "image and video datasets and models for torch deep learning"
optional = false
python-versions = ">=3.8"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "torchvision-0.20.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4878fefb96ef293d06c27210918adc83c399d9faaf34cda5a63e129f772328f1"},
{file = "torchvision-0.20.1-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:8ffbdf8bf5b30eade22d459f5a313329eeadb20dc75efa142987b53c007098c3"},
@@ -5586,6 +5990,8 @@ version = "6.4.2"
description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed."
optional = false
python-versions = ">=3.8"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "tornado-6.4.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e828cce1123e9e44ae2a50a9de3055497ab1d0aeb440c5ac23064d9e44880da1"},
{file = "tornado-6.4.2-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:072ce12ada169c5b00b7d92a99ba089447ccc993ea2143c9ede887e0937aa803"},
@@ -5606,6 +6012,8 @@ version = "4.67.1"
description = "Fast, Extensible Progress Meter"
optional = false
python-versions = ">=3.7"
+groups = ["main", "dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2"},
{file = "tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2"},
@@ -5627,6 +6035,8 @@ version = "5.14.3"
description = "Traitlets Python configuration system"
optional = false
python-versions = ">=3.8"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"},
{file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"},
@@ -5642,6 +6052,8 @@ version = "4.47.1"
description = "State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow"
optional = false
python-versions = ">=3.9.0"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "transformers-4.47.1-py3-none-any.whl", hash = "sha256:d2f5d19bb6283cd66c893ec7e6d931d6370bbf1cc93633326ff1f41a40046c9c"},
{file = "transformers-4.47.1.tar.gz", hash = "sha256:6c29c05a5f595e278481166539202bf8641281536df1c42357ee58a45d0a564a"},
@@ -5711,6 +6123,8 @@ version = "3.1.0"
description = "A language and compiler for custom Deep Learning operations"
optional = false
python-versions = "*"
+groups = ["main"]
+markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_version < \"3.13\" and (python_version <= \"3.11\" or python_version >= \"3.12\")"
files = [
{file = "triton-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b0dd10a925263abbe9fa37dcde67a5e9b2383fc269fdf59f5657cac38c5d1d8"},
{file = "triton-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f34f6e7885d1bf0eaaf7ba875a5f0ce6f3c13ba98f9503651c1e6dc6757ed5c"},
@@ -5733,6 +6147,8 @@ version = "3.8.0"
description = "Collection of utilities for publishing packages on PyPI"
optional = false
python-versions = ">=3.6"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "twine-3.8.0-py3-none-any.whl", hash = "sha256:d0550fca9dc19f3d5e8eadfce0c227294df0a2a951251a4385797c8a6198b7c8"},
{file = "twine-3.8.0.tar.gz", hash = "sha256:8efa52658e0ae770686a13b675569328f1fba9837e5de1867bfe5f46a9aefe19"},
@@ -5756,6 +6172,8 @@ version = "0.12.5"
description = "Typer, build great CLIs. Easy to code. Based on Python type hints."
optional = false
python-versions = ">=3.7"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "typer-0.12.5-py3-none-any.whl", hash = "sha256:62fe4e471711b147e3365034133904df3e235698399bc4de2b36c8579298d52b"},
{file = "typer-0.12.5.tar.gz", hash = "sha256:f592f089bedcc8ec1b974125d64851029c3b1af145f04aca64d69410f0c9b722"},
@@ -5773,6 +6191,8 @@ version = "3.1.5.20241126"
description = "Typing stubs for openpyxl"
optional = false
python-versions = ">=3.8"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "types_openpyxl-3.1.5.20241126-py3-none-any.whl", hash = "sha256:e50ad5c2dec2c92cca521abed5c039975226e8e76389f17ab0ef813595593fbe"},
{file = "types_openpyxl-3.1.5.20241126.tar.gz", hash = "sha256:f599afab19f87aa11672ee675346401d82a0dac71988df9a5411cdb1e7477377"},
@@ -5784,6 +6204,8 @@ version = "2024.2.0.20241003"
description = "Typing stubs for pytz"
optional = false
python-versions = ">=3.8"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "types-pytz-2024.2.0.20241003.tar.gz", hash = "sha256:575dc38f385a922a212bac00a7d6d2e16e141132a3c955078f4a4fd13ed6cb44"},
{file = "types_pytz-2024.2.0.20241003-py3-none-any.whl", hash = "sha256:3e22df1336c0c6ad1d29163c8fda82736909eb977281cb823c57f8bae07118b7"},
@@ -5795,6 +6217,8 @@ version = "2.32.0.20241016"
description = "Typing stubs for requests"
optional = false
python-versions = ">=3.8"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "types-requests-2.32.0.20241016.tar.gz", hash = "sha256:0d9cad2f27515d0e3e3da7134a1b6f28fb97129d86b867f24d9c726452634d95"},
{file = "types_requests-2.32.0.20241016-py3-none-any.whl", hash = "sha256:4195d62d6d3e043a4eaaf08ff8a62184584d2e8684e9d2aa178c7915a7da3747"},
@@ -5809,6 +6233,8 @@ version = "4.12.2"
description = "Backported and Experimental Type Hints for Python 3.8+"
optional = false
python-versions = ">=3.8"
+groups = ["main", "dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"},
{file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"},
@@ -5820,6 +6246,8 @@ version = "2024.2"
description = "Provider of IANA time zone data"
optional = false
python-versions = ">=2"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "tzdata-2024.2-py2.py3-none-any.whl", hash = "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd"},
{file = "tzdata-2024.2.tar.gz", hash = "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc"},
@@ -5831,6 +6259,8 @@ version = "2.2.3"
description = "HTTP library with thread-safe connection pooling, file post, and more."
optional = false
python-versions = ">=3.8"
+groups = ["main", "dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"},
{file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"},
@@ -5848,6 +6278,8 @@ version = "20.28.0"
description = "Virtual Python Environment builder"
optional = false
python-versions = ">=3.8"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "virtualenv-20.28.0-py3-none-any.whl", hash = "sha256:23eae1b4516ecd610481eda647f3a7c09aea295055337331bb4e6892ecce47b0"},
{file = "virtualenv-20.28.0.tar.gz", hash = "sha256:2c9c3262bb8e7b87ea801d715fae4495e6032450c71d2309be9550e7364049aa"},
@@ -5868,6 +6300,8 @@ version = "0.2.13"
description = "Measures the displayed width of unicode strings in a terminal"
optional = false
python-versions = "*"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"},
{file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"},
@@ -5879,6 +6313,8 @@ version = "0.45.1"
description = "A built-package format for Python"
optional = false
python-versions = ">=3.8"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "wheel-0.45.1-py3-none-any.whl", hash = "sha256:708e7481cc80179af0e556bbf0cc00b8444c7321e2700b8d8580231d13017248"},
{file = "wheel-0.45.1.tar.gz", hash = "sha256:661e1abd9198507b1409a20c02106d9670b2576e916d58f520316666abca6729"},
@@ -5893,6 +6329,8 @@ version = "4.0.13"
description = "Jupyter interactive widgets for Jupyter Notebook"
optional = false
python-versions = ">=3.7"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "widgetsnbextension-4.0.13-py3-none-any.whl", hash = "sha256:74b2692e8500525cc38c2b877236ba51d34541e6385eeed5aec15a70f88a6c71"},
{file = "widgetsnbextension-4.0.13.tar.gz", hash = "sha256:ffcb67bc9febd10234a362795f643927f4e0c05d9342c727b65d2384f8feacb6"},
@@ -5904,6 +6342,8 @@ version = "1.17.0"
description = "Module for decorators, wrappers and monkey patching."
optional = false
python-versions = ">=3.8"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "wrapt-1.17.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2a0c23b8319848426f305f9cb0c98a6e32ee68a36264f45948ccf8e7d2b941f8"},
{file = "wrapt-1.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1ca5f060e205f72bec57faae5bd817a1560fcfc4af03f414b08fa29106b7e2d"},
@@ -5978,6 +6418,8 @@ version = "3.2.0"
description = "A Python module for creating Excel XLSX files."
optional = false
python-versions = ">=3.6"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "XlsxWriter-3.2.0-py3-none-any.whl", hash = "sha256:ecfd5405b3e0e228219bcaf24c2ca0915e012ca9464a14048021d21a995d490e"},
{file = "XlsxWriter-3.2.0.tar.gz", hash = "sha256:9977d0c661a72866a61f9f7a809e25ebbb0fb7036baa3b9fe74afcfca6b3cb8c"},
@@ -5989,6 +6431,8 @@ version = "3.5.0"
description = "Python binding for xxHash"
optional = false
python-versions = ">=3.7"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "xxhash-3.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ece616532c499ee9afbb83078b1b952beffef121d989841f7f4b3dc5ac0fd212"},
{file = "xxhash-3.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3171f693dbc2cef6477054a665dc255d996646b4023fe56cb4db80e26f4cc520"},
@@ -6121,6 +6565,8 @@ version = "1.18.3"
description = "Yet another URL library"
optional = false
python-versions = ">=3.9"
+groups = ["main"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "yarl-1.18.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7df647e8edd71f000a5208fe6ff8c382a1de8edfbccdbbfe649d263de07d8c34"},
{file = "yarl-1.18.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c69697d3adff5aa4f874b19c0e4ed65180ceed6318ec856ebc423aa5850d84f7"},
@@ -6217,6 +6663,8 @@ version = "3.21.0"
description = "Backport of pathlib-compatible object wrapper for zip files"
optional = false
python-versions = ">=3.9"
+groups = ["dev"]
+markers = "python_version <= \"3.11\" or python_version >= \"3.12\""
files = [
{file = "zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931"},
{file = "zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4"},
@@ -6231,6 +6679,6 @@ test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools",
type = ["pytest-mypy"]
[metadata]
-lock-version = "2.0"
+lock-version = "2.1"
python-versions = "^3.10"
-content-hash = "a8d6f060e711e11239b0eec5d6a14a3b94e6bf24a744c0a1f15dd8f77a59b9fe"
+content-hash = "34f28a9171509cd3afdd69c46630c6ffcc38c2497281c906394ad4ca49cd66c9"
diff --git a/pyproject.toml b/pyproject.toml
index f9e66bd..e81263e 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -38,6 +38,8 @@ torchmetrics = "^1.6.0"
pycocotools = "^2.0.8"
tabulate = "^0.9.0"
nltk = "^3.9.1"
+tqdm = "^4.67.1"
+pillow = "^10.3.0"
[tool.poetry.group.dev.dependencies]
black = {extras = ["jupyter"], version = "^24.4.2"}
@@ -93,7 +95,8 @@ module = [
"datasets.*",
"apted.*",
"nltk.*",
- "huggingface_hub.*"
+ "huggingface_hub.*",
+ "PIL.*"
]
ignore_missing_imports = true