From 4d4644b55631373c7d80590b939a86f49bf2518d Mon Sep 17 00:00:00 2001 From: Enrico Deusebio Date: Tue, 2 Apr 2024 09:01:11 +0200 Subject: [PATCH 1/9] [MISC] New Chapter 3 Notebooks on Neural Networks --- ChapterNN/GAE.ipynb | 1069 ++++++++ ChapterNN/GraphAutoEncoder_PyG.ipynb | 224 ++ ChapterNN/GraphAutoEncoder_SG.ipynb | 440 ++++ ChapterNN/ImageClassification_Pytorch.ipynb | 326 +++ .../ImageClassification_TensorFlow.ipynb | 360 +++ ChapterNN/poetry.lock | 2342 +++++++++++++++++ ChapterNN/pyproject.toml | 22 + 7 files changed, 4783 insertions(+) create mode 100644 ChapterNN/GAE.ipynb create mode 100644 ChapterNN/GraphAutoEncoder_PyG.ipynb create mode 100644 ChapterNN/GraphAutoEncoder_SG.ipynb create mode 100644 ChapterNN/ImageClassification_Pytorch.ipynb create mode 100644 ChapterNN/ImageClassification_TensorFlow.ipynb create mode 100644 ChapterNN/poetry.lock create mode 100644 ChapterNN/pyproject.toml diff --git a/ChapterNN/GAE.ipynb b/ChapterNN/GAE.ipynb new file mode 100644 index 0000000..985c5b6 --- /dev/null +++ b/ChapterNN/GAE.ipynb @@ -0,0 +1,1069 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "64a3e76b-18a0-4b30-8840-3c491b5aae5f", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "94acb909-b6cc-4e4e-8f44-59552fc6a84b", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "raw", + "id": "448f877a-dcfa-4261-8d83-1175facdfc93", + "metadata": {}, + "source": [ + "networkx\n", + "tensorflow\n", + "scipy" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "6b698a93-e89b-4819-9ef9-586d544a243a", + "metadata": {}, + "outputs": [], + "source": [ + "import networkx as nx\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "4826e139-b742-454b-932f-72d61a7d49f3", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-03-10 00:57:23.168965: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`.\n", + "2024-03-10 00:57:23.170593: I tensorflow/tsl/cuda/cudart_stub.cc:28] Could not find cuda drivers on your machine, GPU will not be used.\n", + "2024-03-10 00:57:23.201193: I tensorflow/tsl/cuda/cudart_stub.cc:28] Could not find cuda drivers on your machine, GPU will not be used.\n", + "2024-03-10 00:57:23.201956: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.\n", + "To enable the following instructions: AVX2 AVX512F AVX512_VNNI FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.\n", + "2024-03-10 00:57:23.766842: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT\n" + ] + } + ], + "source": [ + "import keras \n", + "import os\n", + "\n", + "zip_file = keras.utils.get_file(\n", + " fname=\"cora.tgz\",\n", + " origin=\"https://linqs-data.soe.ucsc.edu/public/lbc/cora.tgz\",\n", + " extract=True,\n", + ")\n", + "data_dir = os.path.join(os.path.dirname(zip_file), \"cora\")" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "2391ee29-37d6-40e3-9ab6-99d8c3d04101", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Citations shape: (5429, 2)\n" + ] + } + ], + "source": [ + "import pandas as pd\n", + "\n", + "citations = pd.read_csv(\n", + " os.path.join(data_dir, \"cora.cites\"),\n", + " sep=\"\\t\",\n", + " header=None,\n", + " names=[\"target\", \"source\"],\n", + ")\n", + "print(\"Citations shape:\", citations.shape)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "4682e143-d23d-43d7-a912-51b6b8194a1a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
targetsource
0351033
135103482
235103515
3351050679
4351103960
.........
542485311619621
5425853116853155
54268531181140289
5427853155853118
54289543151155073
\n", + "

5429 rows × 2 columns

\n", + "
" + ], + "text/plain": [ + " target source\n", + "0 35 1033\n", + "1 35 103482\n", + "2 35 103515\n", + "3 35 1050679\n", + "4 35 1103960\n", + "... ... ...\n", + "5424 853116 19621\n", + "5425 853116 853155\n", + "5426 853118 1140289\n", + "5427 853155 853118\n", + "5428 954315 1155073\n", + "\n", + "[5429 rows x 2 columns]" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "citations" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "9136ca0e-d8a5-43ba-b72c-606ec85d44ab", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Papers shape: (2708, 1435)\n" + ] + } + ], + "source": [ + "column_names = [\"paper_id\"] + [f\"term_{idx}\" for idx in range(1433)] + [\"subject\"]\n", + "papers = pd.read_csv(\n", + " os.path.join(data_dir, \"cora.content\"), sep=\"\\t\", header=None, names=column_names,\n", + ")\n", + "print(\"Papers shape:\", papers.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "e9bdf58e-bb7f-43e3-a3cd-bd699d4f0c8a", + "metadata": {}, + "outputs": [], + "source": [ + "class_values = sorted(papers[\"subject\"].unique())\n", + "class_idx = {name: id for id, name in enumerate(class_values)}\n", + "paper_idx = {name: idx for idx, name in enumerate(sorted(papers[\"paper_id\"].unique()))}\n", + "\n", + "papers[\"paper_id\"] = papers[\"paper_id\"].apply(lambda name: paper_idx[name])\n", + "citations[\"source\"] = citations[\"source\"].apply(lambda name: paper_idx[name])\n", + "citations[\"target\"] = citations[\"target\"].apply(lambda name: paper_idx[name])\n", + "papers[\"subject\"] = papers[\"subject\"].apply(lambda value: class_idx[value])" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "99f113f6-b3e9-41c5-a6ee-873536c599bb", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
paper_idterm_0term_1term_2term_3term_4term_5term_6term_7term_8...term_1424term_1425term_1426term_1427term_1428term_1429term_1430term_1431term_1432subject
0462000000000...0010000002
11911000000000...0100000005
22002000000000...0000000004
3248000000000...0000000004
4519000000000...0000000003
..................................................................
27032370000000000...0000000001
27042371000000000...0000000001
27052372000000000...0000000001
2706955000010000...0000000000
2707376000000000...0000000002
\n", + "

2708 rows × 1435 columns

\n", + "
" + ], + "text/plain": [ + " paper_id term_0 term_1 term_2 term_3 term_4 term_5 term_6 \\\n", + "0 462 0 0 0 0 0 0 0 \n", + "1 1911 0 0 0 0 0 0 0 \n", + "2 2002 0 0 0 0 0 0 0 \n", + "3 248 0 0 0 0 0 0 0 \n", + "4 519 0 0 0 0 0 0 0 \n", + "... ... ... ... ... ... ... ... ... \n", + "2703 2370 0 0 0 0 0 0 0 \n", + "2704 2371 0 0 0 0 0 0 0 \n", + "2705 2372 0 0 0 0 0 0 0 \n", + "2706 955 0 0 0 0 1 0 0 \n", + "2707 376 0 0 0 0 0 0 0 \n", + "\n", + " term_7 term_8 ... term_1424 term_1425 term_1426 term_1427 \\\n", + "0 0 0 ... 0 0 1 0 \n", + "1 0 0 ... 0 1 0 0 \n", + "2 0 0 ... 0 0 0 0 \n", + "3 0 0 ... 0 0 0 0 \n", + "4 0 0 ... 0 0 0 0 \n", + "... ... ... ... ... ... ... ... \n", + "2703 0 0 ... 0 0 0 0 \n", + "2704 0 0 ... 0 0 0 0 \n", + "2705 0 0 ... 0 0 0 0 \n", + "2706 0 0 ... 0 0 0 0 \n", + "2707 0 0 ... 0 0 0 0 \n", + "\n", + " term_1428 term_1429 term_1430 term_1431 term_1432 subject \n", + "0 0 0 0 0 0 2 \n", + "1 0 0 0 0 0 5 \n", + "2 0 0 0 0 0 4 \n", + "3 0 0 0 0 0 4 \n", + "4 0 0 0 0 0 3 \n", + "... ... ... ... ... ... ... \n", + "2703 0 0 0 0 0 1 \n", + "2704 0 0 0 0 0 1 \n", + "2705 0 0 0 0 0 1 \n", + "2706 0 0 0 0 0 0 \n", + "2707 0 0 0 0 0 2 \n", + "\n", + "[2708 rows x 1435 columns]" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "papers" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "77fc40eb-a7a1-4293-90fb-4b4e70bc6d32", + "metadata": {}, + "outputs": [], + "source": [ + "cora_graph = nx.from_pandas_edgelist(citations.sample(n=1500))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "c720e6a1-5edb-4df9-ab3e-c2e4e219e550", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "NodeView((2047, 996, 341, 236, 140, 355, 1621, 747, 2290, 464, 2121, 121, 370, 371, 2299, 604, 2168, 781, 1901, 87, 2150, 108, 2575, 333, 1865, 1559, 2441, 1703, 2403, 20, 198, 1102, 1930, 270, 1916, 1081, 65, 286, 1476, 149, 368, 122, 2357, 71, 1247, 15, 2597, 749, 2294, 49, 1909, 504, 1983, 742, 2677, 1582, 861, 703, 2684, 1664, 2443, 1708, 220, 230, 2278, 385, 312, 27, 2631, 549, 2370, 1066, 1536, 1537, 936, 411, 227, 226, 301, 3, 2177, 416, 444, 197, 2226, 1162, 1672, 1210, 1173, 351, 613, 173, 2046, 415, 995, 1040, 1731, 1722, 244, 455, 1525, 1112, 627, 728, 1766, 686, 2069, 1009, 251, 2174, 394, 1265, 50, 1789, 1398, 1609, 576, 838, 1727, 348, 1357, 2198, 1392, 2061, 434, 2243, 823, 1122, 237, 177, 2702, 0, 2249, 878, 2375, 399, 710, 222, 1151, 1150, 90, 200, 841, 2615, 453, 388, 340, 1592, 585, 484, 792, 1012, 101, 1362, 13, 326, 1871, 1872, 791, 485, 1576, 1580, 1195, 2025, 165, 860, 2541, 33, 171, 397, 2277, 448, 1219, 495, 556, 367, 373, 47, 109, 2104, 894, 414, 2, 1601, 780, 582, 1275, 2105, 1088, 2395, 470, 2591, 252, 110, 1782, 601, 569, 1569, 1556, 992, 653, 2240, 174, 2073, 1057, 1640, 524, 1936, 377, 1854, 402, 2341, 669, 207, 208, 2200, 1810, 1554, 2281, 45, 2469, 1368, 1945, 502, 1197, 379, 885, 1390, 532, 353, 2353, 1349, 1404, 1035, 1915, 12, 2255, 921, 2613, 784, 736, 1323, 1750, 1746, 2523, 817, 1720, 1713, 2397, 814, 28, 1185, 111, 1363, 520, 64, 57, 1058, 837, 11, 713, 643, 2705, 1262, 1064, 2617, 1105, 231, 961, 959, 1063, 523, 179, 490, 763, 274, 1420, 527, 2500, 1779, 147, 1364, 2273, 1526, 1594, 1961, 395, 999, 60, 170, 93, 9, 501, 390, 2698, 507, 851, 2385, 2620, 1317, 2405, 1657, 1805, 472, 755, 1571, 1570, 2166, 68, 2564, 161, 247, 424, 1967, 509, 151, 1401, 1496, 62, 1755, 1756, 1396, 238, 54, 954, 1562, 881, 2587, 973, 2675, 384, 1963, 651, 538, 2364, 1600, 1977, 718, 72, 535, 357, 204, 2654, 796, 1812, 1011, 1850, 85, 2003, 1899, 681, 421, 655, 1244, 282, 1446, 1679, 295, 639, 153, 661, 2706, 176, 1075, 219, 1256, 1257, 1351, 1846, 1136, 498, 2011, 2401, 919, 593, 1567, 1497, 1019, 2219, 734, 225, 1460, 1344, 1564, 882, 1960, 635, 1472, 1069, 1498, 229, 2470, 1502, 2129, 1284, 2531, 1768, 2660, 760, 2636, 719, 403, 630, 1264, 1135, 48, 1289, 1192, 1003, 1090, 1578, 52, 2333, 1103, 2051, 1018, 1738, 1736, 809, 1188, 915, 1041, 927, 2369, 1794, 1793, 1397, 559, 1619, 1165, 1530, 1385, 158, 1596, 1841, 828, 202, 2019, 154, 897, 2289, 124, 638, 512, 409, 429, 893, 1940, 488, 2453, 574, 2481, 829, 310, 1356, 44, 1201, 2508, 1787, 1604, 1602, 2606, 266, 2568, 1845, 2006, 531, 16, 1761, 2457, 1042, 2041, 708, 169, 168, 2639, 810, 59, 1825, 543, 1689, 1608, 657, 2417, 205, 104, 1521, 1522, 1641, 1566, 1709, 913, 213, 216, 2321, 1523, 514, 7, 2555, 1844, 1769, 1873, 1052, 712, 1399, 102, 77, 1414, 1272, 1922, 107, 467, 1686, 1375, 926, 2049, 503, 766, 46, 864, 1155, 74, 1654, 1470, 84, 1120, 22, 23, 2612, 583, 2673, 1138, 1276, 1651, 259, 904, 773, 255, 254, 511, 2525, 834, 446, 1883, 1665, 126, 807, 1045, 383, 211, 1014, 602, 2217, 374, 224, 1610, 1986, 578, 1031, 89, 1980, 316, 757, 363, 496, 1827, 1053, 391, 223, 1627, 644, 335, 2076, 1747, 1211, 439, 1047, 1145, 1250, 187, 67, 117, 1529, 2338, 2235, 1115, 2114, 1059, 1437, 1096, 1931, 275, 647, 1017, 235, 294, 1291, 405, 492, 832, 2374, 1246, 2699, 2093, 142, 695, 883, 756, 269, 550, 2125, 1278, 1072, 2560, 1692, 1843, 1253, 31, 127, 328, 799, 1822, 136, 536, 1191, 2594, 1914, 924, 525, 1241, 1050, 975, 2462, 1726, 366, 833, 1962, 646, 900, 192, 1441, 1451, 677, 2656, 869, 95, 1295, 193, 1126, 2300, 941, 1252, 1572, 2124, 1189, 1994, 801, 1969, 240, 1754, 2039, 812, 1180, 577, 2649, 1319, 804, 805, 624, 626, 2489, 1771, 1060, 25, 438, 2167, 347, 217, 637, 324, 323, 2379, 1633, 1043, 1642, 1217, 1187, 2664, 184, 2428, 1688, 1346, 1808, 1740, 1706, 2081, 78, 2583, 1422, 1056, 1800, 408, 2118, 2242, 195, 824, 2376, 1240, 1098, 1374, 530, 667, 1492, 143, 1371, 1991, 30, 486, 2100, 1216, 597, 596, 854, 152, 313, 487, 2181, 700, 1760, 672, 1030, 1445, 234, 2126, 555, 696, 305, 2292, 982, 2422, 1678, 2486, 1656, 91, 2482, 2645, 42, 1503, 1022, 119, 2252, 1506, 1763, 1358, 733, 1330, 291, 1505, 720, 1320, 2423, 103, 1589, 2406, 917, 707, 568, 160, 2678, 1254, 2098, 337, 289, 566, 2473, 1829, 758, 2506, 929, 61, 63, 100, 2207, 546, 380, 1434, 997, 1473, 287, 911, 988, 1085, 526, 586, 972, 1712, 2424, 1051, 1867, 1866, 1198, 420, 1923, 137, 1220, 1413, 469, 1944, 279, 2692, 1207, 2301, 1270, 846, 432, 1077, 1546, 1296, 1083, 822, 1748, 649, 1215, 1402, 1336, 1717, 1204, 2102, 1222, 2697, 141, 1990, 1975, 2024, 744, 2156, 730, 331, 2644, 2637, 118, 923, 2186, 1767, 1528, 714, 228, 2490, 786, 1809, 1301, 55, 845, 1406, 79, 2561, 690, 115, 745, 2163, 243, 1158, 1995, 2074, 1993, 2432, 2202, 1023, 874, 1583, 949, 2532, 584, 131, 14, 253, 618, 2182, 1263, 5, 114, 481, 1299, 1673, 393, 600, 459, 1906, 872, 1271, 2086, 83, 1178, 6, 944, 2365, 1585, 1026, 1024, 2681, 2205, 839, 1161, 2203, 417, 2142, 664, 1561, 271, 980, 560, 26, 1818, 278, 471, 1260, 1261, 557, 795, 241, 930, 1581, 1587, 2134, 361, 2611, 579, 2504, 1780, 1860, 186, 2313, 2558, 1617, 1613, 2474, 1762, 1172, 816, 2151, 2002, 2171, 1558, 2022, 2576, 1863, 2091, 1181, 702, 1338, 292, 293, 1920, 1293, 517, 1982, 1474, 298, 971, 738, 737, 540, 724, 715, 2316, 297, 1196, 166, 1932, 2267, 552, 2410, 128, 1979, 1380, 614, 1412, 1224, 684, 2348, 352, 1367, 1423, 603, 1028, 652, 2399, 290, 2218, 1415, 2421, 1442, 2518, 1786, 1061, 852, 2608, 513, 317, 1106, 2600, 1949, 931, 1616, 940, 2402, 717, 1279, 2344, 413, 375, 2412, 196, 1440, 1785, 1174, 156, 2581, 539, 858, 1743, 1742, 2623, 1146, 2502, 1700, 2131, 521, 516, 2603, 2634, 1381, 537, 1461, 1970, 683, 890, 144, 2429, 123, 1039, 1702, 1280, 993, 2162, 1588, 2582, 2538, 711, 75, 303, 886, 381, 675, 1432, 132, 859, 80, 17, 2543, 751, 1626, 2068, 2435, 106, 1049, 2115, 460, 1143, 701, 1698, 1067, 945, 1142, 612, 2371, 1494, 2071, 1116, 499, 214, 1997, 765, 2537, 1171, 58, 1548, 551, 494, 1471, 433, 135, 1544, 1514, 1513, 764, 2119, 76, 1408, 428, 1184, 1182, 774, 1000, 189, 506, 280, 2368, 656, 922, 1175, 2463, 1744, 1733, 1734, 811, 1902, 966, 1676, 1370, 589, 2567, 1857, 2347, 2244, 779, 339, 1879, 1303, 2632, 296, 1236, 541, 642, 2033, 2657, 2578, 1563, 660, 662, 946, 518, 250, 249, 1875, 2454, 53, 1799, 407, 2420, 1200, 2691, 2351, 2026, 2138, 843, 1350, 1778, 868, 1848, 2511, 2685, 1828, 1685, 1684, 2185, 1389, 617, 304, 991, 790, 2246, 452, 2336, 906, 2065, 378, 2633, 1326, 2659, 40, 1690, 2627, 682, 1444, 233, 1882, 1486, 1531, 2283, 1524, 2679, 1065, 666, 427, 1859, 515, 1170, 450, 508, 1788, 1791, 2133, 376, 113, 2317, 354, 2468, 2176, 688, 2638, 1591, 732, 203, 120, 436, 1400, 1824, 1687, 194, 1015, 1016, 2066, 1110, 1683, 1770, 2571, 1858, 709, 182, 2590, 410, 2586, 563, 976, 842, 2173, 350, 2411, 1662, 1577, 497, 265, 1612, 857, 916, 191, 716, 1898, 69, 619, 2326, 1540, 989, 1337, 2057, 1, 2261, 698, 2400, 1900, 2032, 167, 956, 548, 2360, 1598, 968, 148, 2279, 1226, 1707, 865, 605, 1484, 1815, 1942, 1327, 1431, 676, 1084, 1934, 1757, 2650, 1624, 1623, 2635, 977, 2238, 1328, 562, 2268, 1407, 2467, 2372, 1605, 2602, 654, 392, 1314, 908, 1924, 180, 571, 262, 330, 1881, 245, 2067, 461, 668, 1286, 1517, 1209, 474, 1935, 2023, 1212, 740, 2529, 827, 2140, 188, 2658, 473, 2461, 844, 2236, 273, 2095, 2000, 772, 2206, 334, 1697, 2695, 212, 1038, 468, 725, 937, 902, 2643, 594, 2668, 365, 1027, 2087, 2269, 866, 435, 2079, 1227, 1159, 1205, 1516, 979, 483, 1870, 813, 1214, 2436, 1550, 302, 1817, 150, 1156, 431, 1821, 1231, 547, 2089, 2452, 1725, 1819, 1551, 1290, 1888, 1832, 2088, 1157, 1953, 570, 1560, 2380, 1379, 479, 1987, 1491, 2535, 1823, 1427, 1718, 1007, 2284, 2334, 342, 332, 789, 1628, 1611, 1304, 1999, 1903, 1082, 609, 1183, 1509, 398, 1132, 1861, 1784, 1485, 2599, 1225, 465, 1372, 284, 2625, 2123, 1086, 2544, 404, 1893, 1826, 1168, 1111, 2425, 1329, 1458, 1478, 288, 2478, 1765, 2476, 640, 336, 1968, 1169, 2209, 2318, 533, 146, 1749, 825, 2028, 1897, 2595, 1998, 73, 1553, 572, 794, 1966, 1599, 138, 1855, 164, 2661, 327, 1373, 2416, 1939, 820, 2149, 1277, 1868, 1555, 478, 2680, 1403, 2330, 1545, 939, 2232, 51, 2128, 1267, 2700, 863, 2539, 607, 798, 1579, 2387, 2450, 1449, 1190, 1634, 1287, 694, 1721, 1315, 2083, 648, 2689, 1777, 1318, 1847, 1910, 441, 1723, 920, 2179, 1034, 178, 1918, 260, 2144, 1306, 2359, 1108, 2704, 2245, 529, 43, 2106, 1745, 1533, 1691, 2072, 242, 692, 1199, 1332, 1391, 884, 482, 2346, 706, 2642, 581, 2609, 761, 358, 2345, 1584, 1639, 2175, 2250, 96, 2437, 1699, 2554, 2077, 948, 2275, 1904, 221, 209, 2433, 2204, 1097, 658, 2092, 689, 2580, 1869, 489, 423, 953, 257, 2276, 2329, 1543, 1405, 625, 1456, 1715, 1331, 1705, 2439, 360, 2158, 129, 2143, 1693, 1710, 37, 406, 41, 246, 2145, 130, 2195, 1534, 519, 2378, 445, 1783, 2282, 2607, 418, 2257, 400, 1334, 1921, 92, 1001, 2013, 1395, 1501, 325, 955, 430, 364, 1292, 94, 493, 2409, 1661, 2464, 2445, 663, 1452, 1454, 1643, 818, 1958, 1840, 1964, 1100, 285, 2480, 1193, 329, 775, 18, 218, 673, 2393, 447, 2058, 1508, 2038, 947, 1361, 1943, 1758, 2297, 2641, 258, 2152, 1615, 97, 831, 665, 1435, 1792, 2522, 925, 1552, 201, 1411, 943, 2034, 2381, 1635, 2042, 2055))" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cora_graph.nodes()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "cf3899f3-5b2e-46ed-851d-a85e0ad0326b", + "metadata": {}, + "outputs": [], + "source": [ + "G=cora_graph" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "6e203133-6fbd-4e90-852f-1aa53f5f4cfe", + "metadata": {}, + "outputs": [], + "source": [ + "adj = (1.0 * (nx.adjacency_matrix(G)>0)).toarray()" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "d81852f1-e294-4272-9546-b8b92028d1cc", + "metadata": {}, + "outputs": [], + "source": [ + "import tensorflow as tf" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "1f56b228-6596-4e0a-9e0e-da9ae9ea4d18", + "metadata": {}, + "outputs": [], + "source": [ + "from keras import backend as K \n", + "from keras.layers import Layer" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "ac74c638-a758-4920-a18b-75687264c144", + "metadata": {}, + "outputs": [], + "source": [ + "from functools import cached_property\n", + "\n", + "class GraphConvolution(Layer):\n", + " \"\"\"Basic graph convolution layer for undirected graph without edge labels.\"\"\"\n", + " \n", + " def __init__(self, output_dim, graph, activation, **kwargs): \n", + " self.output_dim = output_dim \n", + " self.graph = graph\n", + " self.activation = activation\n", + " super(GraphConvolution, self).__init__(**kwargs)\n", + "\n", + " @staticmethod\n", + " def preprocess_graph(adj):\n", + " adj_ = adj + np.eye(adj.shape[0])\n", + " \n", + " degree = np.array(adj_.sum(1))\n", + " \n", + " degree_mat_inv_sqrt = np.diag(np.power(degree, -0.5).flatten())\n", + " adj_normalized = adj_.dot(degree_mat_inv_sqrt).transpose().dot(degree_mat_inv_sqrt)\n", + " \n", + " return adj_normalized\n", + "\n", + " \n", + " @cached_property\n", + " def adj(self):\n", + " return (1.0 * (nx.adjacency_matrix(self.graph)>0)).toarray()\n", + " \n", + " def build(self, input_shape): \n", + " self.w = self.add_weight(\n", + " name = 'w', \n", + " shape = (input_shape[1], self.output_dim), \n", + " initializer = 'normal', trainable = True\n", + " ) \n", + " self._adj = tf.constant(self.preprocess_graph(self.adj), shape=self.adj.shape, dtype=np.float32)\n", + " super(GraphConvolution, self).build(input_shape)\n", + "\n", + " def call(self, input_data): \n", + " x = K.dot(input_data, self.w)\n", + " x = K.dot(self._adj, x) \n", + " return self.activation(x)\n", + " \n", + " def compute_output_shape(self, input_shape): \n", + " return (input_shape[0], self.output_dim)\n", + "\n", + "class InnerProductDecoder(Layer):\n", + " \"\"\"Decoder model layer for link prediction.\"\"\"\n", + "\n", + " def __init__(self, **kwargs): \n", + " self.activation = tf.nn.sigmoid\n", + " super(InnerProductDecoder, self).__init__(**kwargs)\n", + " \n", + " def call(self, inputs):\n", + " x = tf.transpose(inputs)\n", + " x = tf.matmul(inputs, x)\n", + " # x = tf.reshape(x, [-1])\n", + " return self.activation(x)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "60d07cde-ca32-447b-a7a2-d2555145995c", + "metadata": {}, + "outputs": [], + "source": [ + "from keras import layers" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "b35bf403-e13c-4737-82e9-e93d63807bd2", + "metadata": {}, + "outputs": [], + "source": [ + "from keras import Input, Model\n", + "\n", + "n = len(G.nodes())\n", + "\n", + "input_img = Input(shape=(n), batch_size=n) \n", + "\n", + "hidden = GraphConvolution(10, G, activation=tf.nn.relu)(input_img)\n", + "embedding = GraphConvolution(2, G, activation=tf.nn.relu)(hidden)\n", + "\n", + "reconstructed = InnerProductDecoder()(embedding)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "2526f174-272a-4539-bd92-28f2a223404c", + "metadata": {}, + "outputs": [], + "source": [ + "encoder = Model(input_img, embedding)\n", + "\n", + "model = Model(input_img, reconstructed)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "e2034e03-e0bf-4b51-ba8d-a6e71840afb5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"model_1\"\n", + "_________________________________________________________________\n", + " Layer (type) Output Shape Param # \n", + "=================================================================\n", + " input_1 (InputLayer) [(1660, 1660)] 0 \n", + " \n", + " graph_convolution (GraphCo (1660, 10) 16600 \n", + " nvolution) \n", + " \n", + " graph_convolution_1 (Graph (1660, 2) 20 \n", + " Convolution) \n", + " \n", + " inner_product_decoder (Inn (1660, 1660) 0 \n", + " erProductDecoder) \n", + " \n", + "=================================================================\n", + "Total params: 16620 (64.92 KB)\n", + "Trainable params: 16620 (64.92 KB)\n", + "Non-trainable params: 0 (0.00 Byte)\n", + "_________________________________________________________________\n" + ] + } + ], + "source": [ + "model.summary()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "22d4544e-d0cb-4f6b-9e62-91c842ad0316", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "32cbba17-79c8-4a99-80b5-6ab2ea174d02", + "metadata": {}, + "outputs": [], + "source": [ + "model.compile(optimizer='adam', loss='binary_crossentropy')" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "9defa7df-0e1f-4845-a4d3-aa16f4040258", + "metadata": {}, + "outputs": [], + "source": [ + "x_train = np.eye(n)" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "87da59a8-3ef5-4217-9d48-7c116df1ff3c", + "metadata": {}, + "outputs": [], + "source": [ + "y_train = adj" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "23d1151f-8a5c-498a-9ef7-6a63f9f62d1a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1/1 [==============================] - 0s 257ms/step - loss: 0.6931\n", + "1/1 [==============================] - 0s 21ms/step - loss: 0.6931\n", + "1/1 [==============================] - 0s 19ms/step - loss: 0.6931\n", + "1/1 [==============================] - 0s 20ms/step - loss: 0.6931\n", + "1/1 [==============================] - 0s 20ms/step - loss: 0.6931\n", + "1/1 [==============================] - 0s 21ms/step - loss: 0.6931\n", + "1/1 [==============================] - 0s 19ms/step - loss: 0.6931\n", + "1/1 [==============================] - 0s 21ms/step - loss: 0.6931\n", + "1/1 [==============================] - 0s 20ms/step - loss: 0.6931\n", + "1/1 [==============================] - 0s 19ms/step - loss: 0.6931\n", + "1/1 [==============================] - 0s 19ms/step - loss: 0.6931\n", + "1/1 [==============================] - 0s 19ms/step - loss: 0.6931\n", + "1/1 [==============================] - 0s 20ms/step - loss: 0.6931\n", + "1/1 [==============================] - 0s 19ms/step - loss: 0.6931\n", + "1/1 [==============================] - 0s 19ms/step - loss: 0.6931\n", + "1/1 [==============================] - 0s 19ms/step - loss: 0.6931\n", + "1/1 [==============================] - 0s 20ms/step - loss: 0.6931\n", + "1/1 [==============================] - 0s 20ms/step - loss: 0.6931\n", + "1/1 [==============================] - 0s 19ms/step - loss: 0.6931\n", + "1/1 [==============================] - 0s 22ms/step - loss: 0.6931\n" + ] + } + ], + "source": [ + "for _ in range(20):\n", + " model.fit(x_train, y_train, batch_size=n)" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "60eada40-4cd2-4f2b-acfa-7cbc2191cb7d", + "metadata": {}, + "outputs": [], + "source": [ + "output = encoder(x_train)" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "09bd37d3-db11-4c05-b5d8-caf2a46003bf", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "output" + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "id": "18517bc8-bf62-4580-a7e8-2df47a956d02", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"sequential_10\"\n", + "_________________________________________________________________\n", + " Layer (type) Output Shape Param # \n", + "=================================================================\n", + " graph_convolution_9 (Graph (34, 10) 340 \n", + " Convolution) \n", + " \n", + " graph_convolution_10 (Grap (34, 4) 40 \n", + " hConvolution) \n", + " \n", + "=================================================================\n", + "Total params: 380 (1.48 KB)\n", + "Trainable params: 380 (1.48 KB)\n", + "Non-trainable params: 0 (0.00 Byte)\n", + "_________________________________________________________________\n" + ] + } + ], + "source": [ + "model.summary()" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "60a7ebb9-97ca-4e26-b4d6-493b29bdd6bb", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "34" + ] + }, + "execution_count": 45, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(G.nodes)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "05dbbce6-3411-4d9f-9672-678a68df86d2", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e0864159-6280-4e8c-8efc-31c280eaad1a", + "metadata": {}, + "outputs": [], + "source": [ + " \n", + " def __init__(self, input_dim, output_dim, adj, dropout=0., act=tf.nn.relu):\n", + " self.dropout = dropout\n", + " self.adj = adj\n", + " self.act = act\n", + "\n", + " def _call(self, inputs):\n", + " x = inputs\n", + " x = tf.nn.dropout(x, 1-self.dropout)\n", + " x = tf.matmul(x, self.vars['weights'])\n", + " x = tf.sparse_tensor_dense_matmul(self.adj, x)\n", + " outputs = self.act(x)\n", + " return outputs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "45a82e05-1059-4f87-bbd2-b27e774e1966", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "graph-machine-learning", + "language": "python", + "name": "graph-machine-learning" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.14" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/ChapterNN/GraphAutoEncoder_PyG.ipynb b/ChapterNN/GraphAutoEncoder_PyG.ipynb new file mode 100644 index 0000000..45d684f --- /dev/null +++ b/ChapterNN/GraphAutoEncoder_PyG.ipynb @@ -0,0 +1,224 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f5d647f0-6d7b-4e4b-b5cd-c674dba76a22", + "metadata": {}, + "source": [ + "# Graph Auto Encoder with PyG" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "9403ccd6-3353-4edd-9ba2-beaab617afa3", + "metadata": {}, + "outputs": [], + "source": [ + "import argparse\n", + "import os\n", + "import time\n", + "\n", + "import torch\n", + "\n", + "import torch_geometric.transforms as T\n", + "from torch_geometric.datasets import Planetoid\n", + "\n", + "from torch_geometric.nn import GAE, GCNConv" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "c80d137d-313f-4b8b-8473-c787a59c97ba", + "metadata": {}, + "outputs": [], + "source": [ + "device = torch.device('cpu')" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "2694e0b8-7ad2-4ab0-bd66-ec9e9615c9cc", + "metadata": {}, + "outputs": [], + "source": [ + "DATASET_NAME=\"Cora\"" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "409d5939-8d16-4db9-a17f-c5cab6a2d4aa", + "metadata": {}, + "outputs": [], + "source": [ + "transform = T.Compose([\n", + " T.NormalizeFeatures(),\n", + " T.RandomLinkSplit(num_val=0., num_test=0.1, is_undirected=True,\n", + " split_labels=True, add_negative_train_samples=False),\n", + "])\n", + "path = os.path.join(\"/home/deusebio/Personal/graph_machine_learning/data\", 'data')\n", + "dataset = Planetoid(path, DATASET_NAME, transform=transform)\n", + "train_data, val_data, test_data = dataset[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "4fe46bed-054c-4f52-a4da-ed3728a3f41c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train edges (positive): 4751\n", + "Test edges (positive): 527\n", + "Test edges (negative): 527\n" + ] + } + ], + "source": [ + "print(f\"Train edges (positive): {train_data.pos_edge_label_index.shape[1]}\")\n", + "print(f\"Test edges (positive): {test_data.pos_edge_label_index.shape[1]}\")\n", + "print(f\"Test edges (negative): {test_data.neg_edge_label_index.shape[1]}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "dedf968d-6e87-451a-aaa2-972ce21f4aca", + "metadata": {}, + "outputs": [], + "source": [ + "class GCNEncoder(torch.nn.Module):\n", + " def __init__(self, num_node_features, num_embedding):\n", + " super().__init__()\n", + " self.conv1 = GCNConv(num_node_features, 2 * num_embedding)\n", + " self.conv2 = GCNConv(2 * num_embedding, num_embedding)\n", + "\n", + " def forward(self, x, edge_index):\n", + " x = self.conv1(x, edge_index).relu()\n", + " return self.conv2(x, edge_index)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "40de5839-fdf8-4935-b2d8-f46adb5ab4eb", + "metadata": {}, + "outputs": [], + "source": [ + "n_features = dataset.num_features\n", + "n_embeddings = 20" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "b9240419-00b2-4f01-885a-169814989d21", + "metadata": {}, + "outputs": [], + "source": [ + "model = GAE(GCNEncoder(n_features, n_embeddings))" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "baa87287-e068-463f-9cb5-be032a2273ac", + "metadata": {}, + "outputs": [], + "source": [ + "model = model.to(device)\n", + "optimizer = torch.optim.Adam(model.parameters(), lr=0.01)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "da9b26c1-c070-4e98-a0a1-26783b0ed7d7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Performance on validation set => AUC: 0.7277003841874633 AP: 0.751380623617229\n", + "Performance on validation set => AUC: 0.7216693251334934 AP: 0.7450836500826495\n", + "Performance on validation set => AUC: 0.7201516586312556 AP: 0.7438195305144295\n", + "Performance on validation set => AUC: 0.7177356343773966 AP: 0.7446658389934638\n", + "Performance on validation set => AUC: 0.7144770621721173 AP: 0.7463040868711021\n", + "Performance on validation set => AUC: 0.7097044240968714 AP: 0.7458711201460098\n", + "Performance on validation set => AUC: 0.7041108418638313 AP: 0.7440737868933852\n", + "Performance on validation set => AUC: 0.7006038260318512 AP: 0.7420508132883922\n", + "Performance on validation set => AUC: 0.699102362374833 AP: 0.7411833809196392\n", + "Performance on validation set => AUC: 0.6959626110344977 AP: 0.739441047817806\n", + "Performance on validation set => AUC: 0.6908227084676068 AP: 0.7366122214404001\n", + "Performance on validation set => AUC: 0.6845666098966978 AP: 0.7315068175571388\n", + "Performance on validation set => AUC: 0.6838590856554411 AP: 0.7286263298388811\n", + "Performance on validation set => AUC: 0.6893410482880794 AP: 0.7285815671202786\n", + "Performance on validation set => AUC: 0.6931433159662838 AP: 0.7282093017037912\n", + "Performance on validation set => AUC: 0.694403537261143 AP: 0.7276754550495566\n", + "Performance on validation set => AUC: 0.7028074129817196 AP: 0.7291966869008787\n", + "Performance on validation set => AUC: 0.720871785085461 AP: 0.7368339098384399\n", + "Performance on validation set => AUC: 0.7357676007906988 AP: 0.7463957844698095\n", + "Performance on validation set => AUC: 0.7428572457323506 AP: 0.7520377055912427\n" + ] + } + ], + "source": [ + "for epoch in range(20): # loop over the dataset multiple times\n", + "\n", + " model.train()\n", + "\n", + " # zero the parameter gradients\n", + " optimizer.zero_grad()\n", + "\n", + " z = model.encode(train_data.x, train_data.edge_index)\n", + " loss = model.recon_loss(z, train_data.pos_edge_label_index)\n", + "\n", + " loss.backward()\n", + " optimizer.step()\n", + " \n", + " # Test/Evaluate\n", + " model.eval()\n", + " z = model.encode(test_data.x, test_data.edge_index)\n", + " auc, ap = model.test(z, test_data.pos_edge_label_index, test_data.neg_edge_label_index)\n", + " \n", + " print(f\"Performance on validation set => AUC: {auc} AP: {ap}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "43533588-03f7-45c9-8d97-1e618148a9c5", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "graph-machine-learning-pyg", + "language": "python", + "name": "graph-machine-learning-pyg" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/ChapterNN/GraphAutoEncoder_SG.ipynb b/ChapterNN/GraphAutoEncoder_SG.ipynb new file mode 100644 index 0000000..226e960 --- /dev/null +++ b/ChapterNN/GraphAutoEncoder_SG.ipynb @@ -0,0 +1,440 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "393d1f8c-162d-43c6-9d3a-3e795bf6467a", + "metadata": {}, + "source": [ + "# Graph AutoEncoder with StellarGraph" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "65a6d0fb-bb0f-4af0-8ba9-6a0c902cec49", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-03-26 22:24:10.883232: W tensorflow/stream_executor/platform/default/dso_loader.cc:60] Could not load dynamic library 'libcudart.so.11.0'; dlerror: libcudart.so.11.0: cannot open shared object file: No such file or directory\n", + "2024-03-26 22:24:10.883257: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine.\n", + "2024-03-26 22:24:12.512415: I tensorflow/compiler/jit/xla_cpu_device.cc:41] Not creating XLA devices, tf_xla_enable_xla_devices not set\n", + "2024-03-26 22:24:12.512592: W tensorflow/stream_executor/platform/default/dso_loader.cc:60] Could not load dynamic library 'libcuda.so.1'; dlerror: libcuda.so.1: cannot open shared object file: No such file or directory\n", + "2024-03-26 22:24:12.512603: W tensorflow/stream_executor/cuda/cuda_driver.cc:326] failed call to cuInit: UNKNOWN ERROR (303)\n", + "2024-03-26 22:24:12.512618: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:156] kernel driver does not appear to be running on this host (pelican): /proc/driver/nvidia/version does not exist\n", + "2024-03-26 22:24:12.512878: I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: AVX512F\n", + "To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.\n", + "2024-03-26 22:24:12.513454: I tensorflow/compiler/jit/xla_gpu_device.cc:99] Not creating XLA devices, tf_xla_enable_xla_devices not set\n" + ] + } + ], + "source": [ + "from stellargraph.data import EdgeSplitter\n", + "from stellargraph.mapper import FullBatchLinkGenerator\n", + "from stellargraph.layer import GCN, LinkEmbedding\n", + "\n", + "\n", + "from tensorflow import keras\n", + "from stellargraph import datasets" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "1d27bd90-c522-48e2-9929-7417b3ce904b", + "metadata": {}, + "outputs": [], + "source": [ + "dataset = datasets.Cora()\n", + "G, _ = dataset.load()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "4e59277b-12b7-4e8f-9cdc-eaf4c96d1771", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "StellarGraph: Undirected multigraph\n", + " Nodes: 2708, Edges: 5429\n", + "\n", + " Node types:\n", + " paper: [2708]\n", + " Features: float32 vector, length 1433\n", + " Edge types: paper-cites->paper\n", + "\n", + " Edge types:\n", + " paper-cites->paper: [5429]\n", + " Weights: all 1 (default)\n", + " Features: none\n" + ] + } + ], + "source": [ + "print(G.info())" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "4ab4de94-e416-49b2-8e02-5217d5f410e5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "** Sampled 542 positive and 542 negative edges. **\n", + "** Sampled 542 positive and 542 negative edges. **\n" + ] + } + ], + "source": [ + "edge_splitter_test = EdgeSplitter(G)\n", + "\n", + "G_test, edge_ids_test, edge_labels_test = edge_splitter_test.train_test_split(\n", + " p=0.1, method=\"global\", keep_connected=True\n", + ")\n", + "\n", + "edge_splitter_train = EdgeSplitter(G_test)\n", + "\n", + "G_train, edge_ids_train, edge_labels_train = edge_splitter_test.train_test_split(\n", + " p=0.1, method=\"global\", keep_connected=True\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "261e8cdd-455d-4607-a95c-c26ec6aaf109", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using GCN (local pooling) filters...\n" + ] + } + ], + "source": [ + "train_gen = FullBatchLinkGenerator(G, method=\"gcn\")\n", + "train_flow = train_gen.flow(edge_ids_train, edge_labels_train)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "5820186d-1728-494b-9e2c-6a906d7ff3f5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using GCN (local pooling) filters...\n" + ] + } + ], + "source": [ + "test_gen = FullBatchLinkGenerator(G, method=\"gcn\")\n", + "test_flow = train_gen.flow(edge_ids_test, edge_labels_test)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "7897bc20-a2eb-4887-8bde-3ca5756cd62d", + "metadata": {}, + "outputs": [], + "source": [ + "gcn = GCN(\n", + " layer_sizes=[16, 16], activations=[\"relu\", \"relu\"], generator=train_gen, dropout=0.3\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "c27562a4-9f93-4c23-87b1-ad3a0f46c19a", + "metadata": {}, + "outputs": [], + "source": [ + "x_inp, x_out = gcn.in_out_tensors()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "b2d351e5-f815-4513-a05b-34ac571acc96", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[,\n", + " ,\n", + " ,\n", + " ]" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "x_inp" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "be2d54a1-9561-410a-9c8f-54b805450dc3", + "metadata": {}, + "outputs": [], + "source": [ + "prediction = LinkEmbedding(activation=\"relu\", method=\"ip\")(x_out)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "38cd0093-ef71-4110-8f59-43e510b86edc", + "metadata": {}, + "outputs": [], + "source": [ + "prediction = keras.layers.Reshape((-1,))(prediction)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "33ccc882-df0c-40ad-a401-725b3a64aac3", + "metadata": {}, + "outputs": [], + "source": [ + "model = keras.Model(inputs=x_inp, outputs=prediction)\n", + "\n", + "model.compile(\n", + " optimizer=keras.optimizers.Adam(lr=0.01),\n", + " loss=keras.losses.binary_crossentropy,\n", + " metrics=[keras.metrics.Accuracy()],\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "1dbc5d61-4e11-4ec8-bb06-8b206beb698d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"model\"\n", + "__________________________________________________________________________________________________\n", + "Layer (type) Output Shape Param # Connected to \n", + "==================================================================================================\n", + "input_1 (InputLayer) [(1, 2708, 1433)] 0 \n", + "__________________________________________________________________________________________________\n", + "input_3 (InputLayer) [(1, None, 2)] 0 \n", + "__________________________________________________________________________________________________\n", + "input_4 (InputLayer) [(1, None)] 0 \n", + "__________________________________________________________________________________________________\n", + "dropout (Dropout) (1, 2708, 1433) 0 input_1[0][0] \n", + "__________________________________________________________________________________________________\n", + "squeezed_sparse_conversion (Squ (2708, 2708) 0 input_3[0][0] \n", + " input_4[0][0] \n", + "__________________________________________________________________________________________________\n", + "graph_convolution (GraphConvolu (1, None, 16) 22944 dropout[0][0] \n", + " squeezed_sparse_conversion[0][0] \n", + "__________________________________________________________________________________________________\n", + "dropout_1 (Dropout) (1, None, 16) 0 graph_convolution[0][0] \n", + "__________________________________________________________________________________________________\n", + "graph_convolution_1 (GraphConvo (1, None, 16) 272 dropout_1[0][0] \n", + " squeezed_sparse_conversion[0][0] \n", + "__________________________________________________________________________________________________\n", + "input_2 (InputLayer) [(1, None, 2)] 0 \n", + "__________________________________________________________________________________________________\n", + "gather_indices (GatherIndices) (1, None, 2, 16) 0 graph_convolution_1[0][0] \n", + " input_2[0][0] \n", + "__________________________________________________________________________________________________\n", + "link_embedding (LinkEmbedding) (1, None, 1) 0 gather_indices[0][0] \n", + "__________________________________________________________________________________________________\n", + "reshape (Reshape) (1, None) 0 link_embedding[0][0] \n", + "==================================================================================================\n", + "Total params: 23,216\n", + "Trainable params: 23,216\n", + "Non-trainable params: 0\n", + "__________________________________________________________________________________________________\n" + ] + } + ], + "source": [ + "model.summary()" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "d5760e12-f39a-4ce8-8c9d-9ba8ae61d4ab", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-03-26 22:24:31.547943: I tensorflow/compiler/mlir/mlir_graph_optimization_pass.cc:116] None of the MLIR optimization passes are enabled (registered 2)\n", + "2024-03-26 22:24:31.548360: I tensorflow/core/platform/profile_utils/cpu_utils.cc:112] CPU Frequency: 2803200000 Hz\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/50\n", + "1/1 [==============================] - 2s 2s/step - loss: 1.6882 - accuracy: 0.0000e+00 - val_loss: 1.7383 - val_accuracy: 0.0000e+00\n", + "Epoch 2/50\n", + "1/1 [==============================] - 0s 141ms/step - loss: 1.8908 - accuracy: 0.0000e+00 - val_loss: 0.5827 - val_accuracy: 0.0000e+00\n", + "Epoch 3/50\n", + "1/1 [==============================] - 0s 119ms/step - loss: 0.6209 - accuracy: 0.0000e+00 - val_loss: 0.6141 - val_accuracy: 0.0000e+00\n", + "Epoch 4/50\n", + "1/1 [==============================] - 0s 133ms/step - loss: 0.6203 - accuracy: 0.0000e+00 - val_loss: 0.5935 - val_accuracy: 0.0000e+00\n", + "Epoch 5/50\n", + "1/1 [==============================] - 0s 118ms/step - loss: 0.5852 - accuracy: 0.0000e+00 - val_loss: 0.5622 - val_accuracy: 0.0000e+00\n", + "Epoch 6/50\n", + "1/1 [==============================] - 0s 143ms/step - loss: 0.5834 - accuracy: 0.0000e+00 - val_loss: 0.6076 - val_accuracy: 0.0000e+00\n", + "Epoch 7/50\n", + "1/1 [==============================] - 0s 151ms/step - loss: 0.6186 - accuracy: 0.0000e+00 - val_loss: 0.5933 - val_accuracy: 0.0000e+00\n", + "Epoch 8/50\n", + "1/1 [==============================] - 0s 151ms/step - loss: 0.6016 - accuracy: 0.0000e+00 - val_loss: 0.5303 - val_accuracy: 0.0000e+00\n", + "Epoch 9/50\n", + "1/1 [==============================] - 0s 142ms/step - loss: 0.5133 - accuracy: 0.0000e+00 - val_loss: 0.5154 - val_accuracy: 0.0000e+00\n", + "Epoch 10/50\n", + "1/1 [==============================] - 0s 156ms/step - loss: 0.4653 - accuracy: 0.0000e+00 - val_loss: 0.5081 - val_accuracy: 0.0000e+00\n", + "Epoch 11/50\n", + "1/1 [==============================] - 0s 143ms/step - loss: 0.4649 - accuracy: 0.0000e+00 - val_loss: 0.4928 - val_accuracy: 0.0000e+00\n", + "Epoch 12/50\n", + "1/1 [==============================] - 0s 180ms/step - loss: 0.4290 - accuracy: 0.0000e+00 - val_loss: 0.5021 - val_accuracy: 0.0000e+00\n", + "Epoch 13/50\n", + "1/1 [==============================] - 0s 154ms/step - loss: 0.4325 - accuracy: 0.0000e+00 - val_loss: 0.5347 - val_accuracy: 0.0000e+00\n", + "Epoch 14/50\n", + "1/1 [==============================] - 0s 148ms/step - loss: 0.4542 - accuracy: 0.0000e+00 - val_loss: 0.5257 - val_accuracy: 0.0000e+00\n", + "Epoch 15/50\n", + "1/1 [==============================] - 0s 181ms/step - loss: 0.4333 - accuracy: 0.0000e+00 - val_loss: 0.5296 - val_accuracy: 0.0000e+00\n", + "Epoch 16/50\n", + "1/1 [==============================] - 0s 127ms/step - loss: 0.3915 - accuracy: 0.0000e+00 - val_loss: 0.5193 - val_accuracy: 0.0000e+00\n", + "Epoch 17/50\n", + "1/1 [==============================] - 0s 153ms/step - loss: 0.4048 - accuracy: 0.0000e+00 - val_loss: 0.5003 - val_accuracy: 0.0000e+00\n", + "Epoch 18/50\n", + "1/1 [==============================] - 0s 144ms/step - loss: 0.3717 - accuracy: 0.0000e+00 - val_loss: 0.4880 - val_accuracy: 0.0000e+00\n", + "Epoch 19/50\n", + "1/1 [==============================] - 0s 149ms/step - loss: 0.3609 - accuracy: 0.0000e+00 - val_loss: 0.4703 - val_accuracy: 0.0000e+00\n", + "Epoch 20/50\n", + "1/1 [==============================] - 0s 163ms/step - loss: 0.3517 - accuracy: 0.0000e+00 - val_loss: 0.4699 - val_accuracy: 0.0000e+00\n", + "Epoch 21/50\n", + "1/1 [==============================] - 0s 159ms/step - loss: 0.3217 - accuracy: 9.2251e-04 - val_loss: 0.4844 - val_accuracy: 0.0000e+00\n", + "Epoch 22/50\n", + "1/1 [==============================] - 0s 156ms/step - loss: 0.3142 - accuracy: 0.0000e+00 - val_loss: 0.4799 - val_accuracy: 0.0000e+00\n", + "Epoch 23/50\n", + "1/1 [==============================] - 0s 140ms/step - loss: 0.3262 - accuracy: 0.0000e+00 - val_loss: 0.4828 - val_accuracy: 0.0000e+00\n", + "Epoch 24/50\n", + "1/1 [==============================] - 0s 152ms/step - loss: 0.3127 - accuracy: 0.0000e+00 - val_loss: 0.5366 - val_accuracy: 0.0000e+00\n", + "Epoch 25/50\n", + "1/1 [==============================] - 0s 172ms/step - loss: 0.3006 - accuracy: 0.0000e+00 - val_loss: 0.5472 - val_accuracy: 0.0000e+00\n", + "Epoch 26/50\n", + "1/1 [==============================] - 0s 154ms/step - loss: 0.2899 - accuracy: 0.0028 - val_loss: 0.5419 - val_accuracy: 0.0018\n", + "Epoch 27/50\n", + "1/1 [==============================] - 0s 157ms/step - loss: 0.2655 - accuracy: 9.2251e-04 - val_loss: 0.5343 - val_accuracy: 0.0028\n", + "Epoch 28/50\n", + "1/1 [==============================] - 0s 156ms/step - loss: 0.2753 - accuracy: 9.2251e-04 - val_loss: 0.5077 - val_accuracy: 0.0028\n", + "Epoch 29/50\n", + "1/1 [==============================] - 0s 145ms/step - loss: 0.2845 - accuracy: 0.0037 - val_loss: 0.5149 - val_accuracy: 0.0037\n", + "Epoch 30/50\n", + "1/1 [==============================] - 0s 176ms/step - loss: 0.2783 - accuracy: 0.0018 - val_loss: 0.5109 - val_accuracy: 0.0037\n", + "Epoch 31/50\n", + "1/1 [==============================] - 0s 160ms/step - loss: 0.2469 - accuracy: 0.0018 - val_loss: 0.5074 - val_accuracy: 0.0037\n", + "Epoch 32/50\n", + "1/1 [==============================] - 0s 156ms/step - loss: 0.2400 - accuracy: 0.0074 - val_loss: 0.4971 - val_accuracy: 0.0046\n", + "Epoch 33/50\n", + "1/1 [==============================] - 0s 150ms/step - loss: 0.2700 - accuracy: 0.0074 - val_loss: 0.5178 - val_accuracy: 0.0046\n", + "Epoch 34/50\n", + "1/1 [==============================] - 0s 155ms/step - loss: 0.2267 - accuracy: 0.0046 - val_loss: 0.5466 - val_accuracy: 0.0046\n", + "Epoch 35/50\n", + "1/1 [==============================] - 0s 158ms/step - loss: 0.2224 - accuracy: 0.0083 - val_loss: 0.5895 - val_accuracy: 0.0055\n", + "Epoch 36/50\n", + "1/1 [==============================] - 0s 133ms/step - loss: 0.2350 - accuracy: 0.0046 - val_loss: 0.5903 - val_accuracy: 0.0055\n", + "Epoch 37/50\n", + "1/1 [==============================] - 0s 142ms/step - loss: 0.2131 - accuracy: 9.2251e-04 - val_loss: 0.5747 - val_accuracy: 0.0055\n", + "Epoch 38/50\n", + "1/1 [==============================] - 0s 141ms/step - loss: 0.2016 - accuracy: 0.0065 - val_loss: 0.5795 - val_accuracy: 0.0055\n", + "Epoch 39/50\n", + "1/1 [==============================] - 0s 129ms/step - loss: 0.2163 - accuracy: 0.0092 - val_loss: 0.5663 - val_accuracy: 0.0065\n", + "Epoch 40/50\n", + "1/1 [==============================] - 0s 155ms/step - loss: 0.2023 - accuracy: 0.0092 - val_loss: 0.5394 - val_accuracy: 0.0074\n", + "Epoch 41/50\n", + "1/1 [==============================] - 0s 149ms/step - loss: 0.1796 - accuracy: 0.0065 - val_loss: 0.5251 - val_accuracy: 0.0083\n", + "Epoch 42/50\n", + "1/1 [==============================] - 0s 168ms/step - loss: 0.1821 - accuracy: 0.0055 - val_loss: 0.5035 - val_accuracy: 0.0111\n", + "Epoch 43/50\n", + "1/1 [==============================] - 0s 167ms/step - loss: 0.1816 - accuracy: 0.0129 - val_loss: 0.5020 - val_accuracy: 0.0101\n", + "Epoch 44/50\n", + "1/1 [==============================] - 0s 169ms/step - loss: 0.1848 - accuracy: 0.0268 - val_loss: 0.5433 - val_accuracy: 0.0101\n", + "Epoch 45/50\n", + "1/1 [==============================] - 0s 156ms/step - loss: 0.1770 - accuracy: 0.0120 - val_loss: 0.5609 - val_accuracy: 0.0111\n", + "Epoch 46/50\n", + "1/1 [==============================] - 0s 155ms/step - loss: 0.1797 - accuracy: 0.0240 - val_loss: 0.6091 - val_accuracy: 0.0120\n", + "Epoch 47/50\n", + "1/1 [==============================] - 0s 222ms/step - loss: 0.1700 - accuracy: 0.0185 - val_loss: 0.6592 - val_accuracy: 0.0111\n", + "Epoch 48/50\n", + "1/1 [==============================] - 0s 146ms/step - loss: 0.1614 - accuracy: 0.0175 - val_loss: 0.6343 - val_accuracy: 0.0129\n", + "Epoch 49/50\n", + "1/1 [==============================] - 0s 171ms/step - loss: 0.1621 - accuracy: 0.0175 - val_loss: 0.6362 - val_accuracy: 0.0148\n", + "Epoch 50/50\n", + "1/1 [==============================] - 0s 140ms/step - loss: 0.1530 - accuracy: 0.0212 - val_loss: 0.6338 - val_accuracy: 0.0138\n" + ] + } + ], + "source": [ + "history = model.fit(train_flow, validation_data=test_flow, epochs=50)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4d6f0caf-529a-4609-ade3-61715426e4b3", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "graph-machine-learning-sg", + "language": "python", + "name": "graph-machine-learning-sg" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.14" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/ChapterNN/ImageClassification_Pytorch.ipynb b/ChapterNN/ImageClassification_Pytorch.ipynb new file mode 100644 index 0000000..fe264cb --- /dev/null +++ b/ChapterNN/ImageClassification_Pytorch.ipynb @@ -0,0 +1,326 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "cfe91160-02ad-48cc-810b-1031f21397ff", + "metadata": {}, + "source": [ + "# Image Classification with PyTorch" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "60ea01e6-2184-4d88-a9e3-c05f70953f0a", + "metadata": {}, + "outputs": [], + "source": [ + "import torch \n", + "from torchvision import datasets, transforms" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "83163df1-5732-459b-948a-b88d07d692cf", + "metadata": {}, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "from matplotlib import pyplot as plt" + ] + }, + { + "cell_type": "markdown", + "id": "4067288c-39ac-4f51-a5b3-f3a043f0c3a9", + "metadata": {}, + "source": [ + "### Load and re-scale input data" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "55daa661-47bb-4499-b8a4-dce7f5cadc22", + "metadata": {}, + "outputs": [], + "source": [ + "transformer=transforms.Compose([\n", + " transforms.ToTensor(),\n", + "])" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "3cf93aa8-eaa0-4143-84fc-2c617d402bd2", + "metadata": {}, + "outputs": [], + "source": [ + "train_dataset = datasets.FashionMNIST('./data', train=True, download=True, transform=transformer)\n", + "test_dataset = datasets.FashionMNIST('./data', train=False, transform=transformer)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "fa2574d6-659d-4ef5-92a5-ffbe7036dc5b", + "metadata": {}, + "outputs": [], + "source": [ + "trainloader = torch.utils.data.DataLoader(train_dataset, batch_size=128, shuffle=True)\n", + "testloader = torch.utils.data.DataLoader(test_dataset, batch_size=test_dataset.data.shape[0])" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "be30236f-5707-4517-9b6e-3eeb0601500f", + "metadata": {}, + "outputs": [], + "source": [ + "classes = {v: k for k, v in train_dataset.class_to_idx.items()}" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "b7b7f58e-291e-4084-933e-4e3357fe42fb", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "n = 6\n", + "plt.figure(figsize=(20, 4))\n", + "for i in range(n):\n", + " # display original\n", + " ax = plt.subplot(1, n, i + 1)\n", + " plt.imshow(test_dataset[i][0][0])\n", + " plt.title(classes[test_dataset[i][1]])\n", + " plt.gray()\n", + " ax.get_xaxis().set_visible(False)\n", + " ax.get_yaxis().set_visible(False)\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "ef148e96-02d9-45d2-825d-01951a45f047", + "metadata": {}, + "source": [ + "### Build model" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "60570c8d-b61d-4558-8d3d-e831279e898f", + "metadata": {}, + "outputs": [], + "source": [ + "import torch.nn as nn\n", + "import torch.nn.functional as F" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "3cbed0a8-9d1c-49b1-9e41-59d15b2e134d", + "metadata": {}, + "outputs": [], + "source": [ + "class Model(nn.Module):\n", + " def __init__(self):\n", + " super().__init__()\n", + " self.flatten = nn.Flatten()\n", + " self.fc1 = nn.Linear(28*28, 128)\n", + " self.dropout = nn.Dropout(0.2)\n", + " self.fc2 = nn.Linear(128,10)\n", + "\n", + " def forward(self, x):\n", + " x = self.flatten(x)\n", + " x = F.relu(self.fc1(x))\n", + " x = self.dropout(x)\n", + " x = self.fc2(x)\n", + " return F.log_softmax(x, dim=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "0fa2d6f1-9db7-43d7-b00c-b44e5eba8a55", + "metadata": {}, + "outputs": [], + "source": [ + "model = Model()" + ] + }, + { + "cell_type": "markdown", + "id": "6bc8880f-47a3-4b0f-8fee-be0f4b8a0b85", + "metadata": {}, + "source": [ + "### Train the network " + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "d0c04fcb-4769-4022-ab84-89ee2412febc", + "metadata": {}, + "outputs": [], + "source": [ + "import torch.optim as optim\n", + "\n", + "criterion = nn.CrossEntropyLoss()\n", + "optimizer = optim.Adam(model.parameters())" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "679b9446-9820-416a-8bd2-96b8712c33b6", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 200] loss: 0.079\n", + "[1, 400] loss: 0.053\n", + "Accuracy on validation set: 0.821399986743927\n", + "[2, 200] loss: 0.046\n", + "[2, 400] loss: 0.043\n", + "Accuracy on validation set: 0.8398000001907349\n", + "[3, 200] loss: 0.040\n", + "[3, 400] loss: 0.039\n", + "Accuracy on validation set: 0.8516000509262085\n", + "[4, 200] loss: 0.037\n", + "[4, 400] loss: 0.037\n", + "Accuracy on validation set: 0.8580999970436096\n", + "[5, 200] loss: 0.035\n", + "[5, 400] loss: 0.035\n", + "Accuracy on validation set: 0.8579000234603882\n", + "[6, 200] loss: 0.034\n", + "[6, 400] loss: 0.033\n", + "Accuracy on validation set: 0.8626999855041504\n", + "[7, 200] loss: 0.033\n", + "[7, 400] loss: 0.032\n", + "Accuracy on validation set: 0.868399977684021\n", + "[8, 200] loss: 0.031\n", + "[8, 400] loss: 0.032\n", + "Accuracy on validation set: 0.8671999573707581\n", + "[9, 200] loss: 0.030\n", + "[9, 400] loss: 0.031\n", + "Accuracy on validation set: 0.8715000748634338\n", + "[10, 200] loss: 0.029\n", + "[10, 400] loss: 0.030\n", + "Accuracy on validation set: 0.8714000582695007\n", + "[11, 200] loss: 0.029\n", + "[11, 400] loss: 0.029\n", + "Accuracy on validation set: 0.8713000416755676\n", + "[12, 200] loss: 0.029\n", + "[12, 400] loss: 0.029\n", + "Accuracy on validation set: 0.8747999668121338\n", + "[13, 200] loss: 0.028\n", + "[13, 400] loss: 0.027\n", + "Accuracy on validation set: 0.8760000467300415\n", + "[14, 200] loss: 0.026\n", + "[14, 400] loss: 0.028\n", + "Accuracy on validation set: 0.8710000514984131\n", + "[15, 200] loss: 0.027\n", + "[15, 400] loss: 0.027\n", + "Accuracy on validation set: 0.8751999735832214\n", + "[16, 200] loss: 0.026\n", + "[16, 400] loss: 0.026\n", + "Accuracy on validation set: 0.8816999793052673\n", + "[17, 200] loss: 0.026\n", + "[17, 400] loss: 0.026\n", + "Accuracy on validation set: 0.8746999502182007\n", + "[18, 200] loss: 0.025\n", + "[18, 400] loss: 0.025\n", + "Accuracy on validation set: 0.8778001070022583\n", + "[19, 200] loss: 0.025\n", + "[19, 400] loss: 0.025\n", + "Accuracy on validation set: 0.8755999803543091\n", + "[20, 200] loss: 0.024\n", + "[20, 400] loss: 0.025\n", + "Accuracy on validation set: 0.8791000247001648\n" + ] + } + ], + "source": [ + "from torchmetrics.classification import MulticlassAccuracy\n", + "\n", + "accuracy = MulticlassAccuracy(num_classes=len(train_dataset.classes))\n", + "\n", + "for epoch in range(20): # loop over the dataset multiple times\n", + "\n", + " running_loss = 0.0\n", + " for i, data in enumerate(trainloader, 0):\n", + " # get the inputs; data is a list of [inputs, labels]\n", + " inputs, labels = data\n", + "\n", + " # zero the parameter gradients\n", + " optimizer.zero_grad()\n", + "\n", + " # forward + backward + optimize\n", + " outputs = model(inputs)\n", + " loss = criterion(outputs, labels)\n", + " loss.backward()\n", + " optimizer.step()\n", + "\n", + " # print statistics\n", + " running_loss += loss.item()\n", + " if i % 200 == 199: # print every 2000 mini-batches\n", + " print(f'[{epoch + 1}, {i + 1:5d}] loss: {running_loss / 2000:.3f}') \n", + " running_loss = 0.0\n", + "\n", + " # Evaluate accuracy\n", + " for inputs, labels in testloader:\n", + " preds = model(inputs)\n", + " print(f\"Accuracy on validation set: {float(accuracy(preds, labels))}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4e53fcbf-19c3-46f2-b4bb-90dc307c24e4", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "graph-machine-learning", + "language": "python", + "name": "graph-machine-learning" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.14" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/ChapterNN/ImageClassification_TensorFlow.ipynb b/ChapterNN/ImageClassification_TensorFlow.ipynb new file mode 100644 index 0000000..d6b2390 --- /dev/null +++ b/ChapterNN/ImageClassification_TensorFlow.ipynb @@ -0,0 +1,360 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "8c4e9e09-b0c6-4671-86a0-ca6bc73056b6", + "metadata": {}, + "source": [ + "# Image Classification with TensorFlow" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "012237ce-0396-4c88-8b13-994c7a830421", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-02-04 08:30:12.916869: W tensorflow/stream_executor/platform/default/dso_loader.cc:60] Could not load dynamic library 'libcudart.so.11.0'; dlerror: libcudart.so.11.0: cannot open shared object file: No such file or directory\n", + "2024-02-04 08:30:12.916889: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine.\n" + ] + } + ], + "source": [ + "import tensorflow as tf\n", + "from tensorflow.keras.datasets import fashion_mnist\n", + "from matplotlib import pyplot as plt" + ] + }, + { + "cell_type": "markdown", + "id": "6080305f-eaac-49d2-a4cb-658a907186ac", + "metadata": {}, + "source": [ + "### Load and re-scale input data" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "1135c9e8-1765-48cc-beb8-25fd6ff363d4", + "metadata": {}, + "outputs": [], + "source": [ + "(x_train, y_train), (x_test, y_test) = fashion_mnist.load_data()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "ee2989f4-9b32-48f6-b669-8255aa9e9c79", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(60000, 28, 28)\n", + "(10000, 28, 28)\n" + ] + } + ], + "source": [ + "x_train = x_train.astype('float32') / 255.\n", + "x_test = x_test.astype('float32') / 255.\n", + "\n", + "print (x_train.shape)\n", + "print (x_test.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "0525097f-4b57-4e9c-b850-966540589a30", + "metadata": {}, + "outputs": [], + "source": [ + "classes = {\n", + " 0: \"T-shirt\",\n", + " 1: \"Trouser\",\n", + " 2: \"Pullover\",\n", + " 3: \"Dress\",\n", + " 4: \"Coat\",\n", + " 5: \"Sandal\",\n", + " 6: \"Shirt\",\n", + " 7: \"Sneaker\",\n", + " 8: \"Bag\",\n", + " 9: \"Ankle boot\", \n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "a0e2bc95-ee33-4024-99d2-4ba7cb4fd0c6", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "n = 6\n", + "plt.figure(figsize=(20, 4))\n", + "for i in range(n):\n", + " # display original\n", + " ax = plt.subplot(1, n, i + 1)\n", + " plt.imshow(x_test[i])\n", + " plt.title(classes[y_test[i]])\n", + " plt.gray()\n", + " ax.get_xaxis().set_visible(False)\n", + " ax.get_yaxis().set_visible(False)\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "c7ace701-0cd8-4173-982c-8682a860dd26", + "metadata": {}, + "source": [ + "### Build model" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "a2d549c8-a410-4caa-95a4-b0bb20a05236", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-02-04 08:30:33.209455: I tensorflow/compiler/jit/xla_cpu_device.cc:41] Not creating XLA devices, tf_xla_enable_xla_devices not set\n", + "2024-02-04 08:30:33.209670: W tensorflow/stream_executor/platform/default/dso_loader.cc:60] Could not load dynamic library 'libcuda.so.1'; dlerror: libcuda.so.1: cannot open shared object file: No such file or directory\n", + "2024-02-04 08:30:33.209689: W tensorflow/stream_executor/cuda/cuda_driver.cc:326] failed call to cuInit: UNKNOWN ERROR (303)\n", + "2024-02-04 08:30:33.209715: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:156] kernel driver does not appear to be running on this host (accde92cbd56): /proc/driver/nvidia/version does not exist\n", + "2024-02-04 08:30:33.210008: I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: AVX512F\n", + "To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.\n", + "2024-02-04 08:30:33.210619: I tensorflow/compiler/jit/xla_gpu_device.cc:99] Not creating XLA devices, tf_xla_enable_xla_devices not set\n" + ] + } + ], + "source": [ + "model = tf.keras.models.Sequential([\n", + " tf.keras.layers.Flatten(input_shape=(28, 28)),\n", + " tf.keras.layers.Dense(128, activation='relu'),\n", + " tf.keras.layers.Dropout(0.2),\n", + " tf.keras.layers.Dense(10)\n", + "])\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "f20ef704-3435-4f12-b41b-db42fcfb3b43", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"sequential\"\n", + "_________________________________________________________________\n", + "Layer (type) Output Shape Param # \n", + "=================================================================\n", + "flatten (Flatten) (None, 784) 0 \n", + "_________________________________________________________________\n", + "dense (Dense) (None, 128) 100480 \n", + "_________________________________________________________________\n", + "dropout (Dropout) (None, 128) 0 \n", + "_________________________________________________________________\n", + "dense_1 (Dense) (None, 10) 1290 \n", + "=================================================================\n", + "Total params: 101,770\n", + "Trainable params: 101,770\n", + "Non-trainable params: 0\n", + "_________________________________________________________________\n" + ] + } + ], + "source": [ + "model.summary()" + ] + }, + { + "cell_type": "markdown", + "id": "9af979aa-9ccb-4b92-b0fd-ef39fcf6f317", + "metadata": {}, + "source": [ + "### Train the network" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "53f02c48-3d8f-4e41-a9d4-703016a0dc19", + "metadata": {}, + "outputs": [], + "source": [ + "loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)\n", + "optimizer = tf.keras.optimizers.Adam()" + ] + }, + { + "cell_type": "code", + "execution_count": 108, + "id": "6427e500-41d2-43f1-b235-622d1d59572e", + "metadata": {}, + "outputs": [], + "source": [ + "model.compile(optimizer=optimizer,\n", + " loss=loss_fn,\n", + " metrics=['accuracy'])" + ] + }, + { + "cell_type": "code", + "execution_count": 111, + "id": "ef1fea96-97cc-4c84-bb0c-78417a571575", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/20\n", + "469/469 [==============================] - 6s 13ms/step - loss: 0.1338 - accuracy: 0.9483 - val_loss: 0.3290 - val_accuracy: 0.9069\n", + "Epoch 2/20\n", + "469/469 [==============================] - 9s 19ms/step - loss: 0.1279 - accuracy: 0.9503 - val_loss: 0.3381 - val_accuracy: 0.9059\n", + "Epoch 3/20\n", + "469/469 [==============================] - 8s 18ms/step - loss: 0.1281 - accuracy: 0.9510 - val_loss: 0.3348 - val_accuracy: 0.9070\n", + "Epoch 4/20\n", + "469/469 [==============================] - 9s 18ms/step - loss: 0.1264 - accuracy: 0.9505 - val_loss: 0.3360 - val_accuracy: 0.9065\n", + "Epoch 5/20\n", + "469/469 [==============================] - 8s 18ms/step - loss: 0.1295 - accuracy: 0.9497 - val_loss: 0.3293 - val_accuracy: 0.9070\n", + "Epoch 6/20\n", + "469/469 [==============================] - 8s 18ms/step - loss: 0.1278 - accuracy: 0.9509 - val_loss: 0.3315 - val_accuracy: 0.9067\n", + "Epoch 7/20\n", + "469/469 [==============================] - 15s 33ms/step - loss: 0.1267 - accuracy: 0.9514 - val_loss: 0.3434 - val_accuracy: 0.9075\n", + "Epoch 8/20\n", + "469/469 [==============================] - 25s 53ms/step - loss: 0.1308 - accuracy: 0.9493 - val_loss: 0.3410 - val_accuracy: 0.9046\n", + "Epoch 9/20\n", + "469/469 [==============================] - 15s 32ms/step - loss: 0.1283 - accuracy: 0.9504 - val_loss: 0.3438 - val_accuracy: 0.9049\n", + "Epoch 10/20\n", + "469/469 [==============================] - 8s 18ms/step - loss: 0.1267 - accuracy: 0.9507 - val_loss: 0.3365 - val_accuracy: 0.9059\n", + "Epoch 11/20\n", + "469/469 [==============================] - 9s 20ms/step - loss: 0.1249 - accuracy: 0.9509 - val_loss: 0.3544 - val_accuracy: 0.9031\n", + "Epoch 12/20\n", + "469/469 [==============================] - 9s 19ms/step - loss: 0.1267 - accuracy: 0.9502 - val_loss: 0.3500 - val_accuracy: 0.9053\n", + "Epoch 13/20\n", + "469/469 [==============================] - 8s 18ms/step - loss: 0.1239 - accuracy: 0.9518 - val_loss: 0.3480 - val_accuracy: 0.9033\n", + "Epoch 14/20\n", + "469/469 [==============================] - 13s 27ms/step - loss: 0.1251 - accuracy: 0.9505 - val_loss: 0.3488 - val_accuracy: 0.9047\n", + "Epoch 15/20\n", + "469/469 [==============================] - 19s 41ms/step - loss: 0.1256 - accuracy: 0.9505 - val_loss: 0.3564 - val_accuracy: 0.9066\n", + "Epoch 16/20\n", + "469/469 [==============================] - 14s 30ms/step - loss: 0.1248 - accuracy: 0.9512 - val_loss: 0.3634 - val_accuracy: 0.9043\n", + "Epoch 17/20\n", + "469/469 [==============================] - 9s 20ms/step - loss: 0.1233 - accuracy: 0.9520 - val_loss: 0.3853 - val_accuracy: 0.9046\n", + "Epoch 18/20\n", + "469/469 [==============================] - 9s 19ms/step - loss: 0.1253 - accuracy: 0.9510 - val_loss: 0.3647 - val_accuracy: 0.9027\n", + "Epoch 19/20\n", + "469/469 [==============================] - 9s 19ms/step - loss: 0.1225 - accuracy: 0.9531 - val_loss: 0.3655 - val_accuracy: 0.9060\n", + "Epoch 20/20\n", + "469/469 [==============================] - 9s 18ms/step - loss: 0.1212 - accuracy: 0.9532 - val_loss: 0.3587 - val_accuracy: 0.9046\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 111, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.fit(\n", + " x_train, \n", + " y_train, \n", + " validation_data=(x_test, y_test), \n", + " epochs=20, \n", + " batch_size=128,\n", + " shuffle=True\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a8c64c99-cbab-4503-8a1d-84f80c6f2af7", + "metadata": {}, + "source": [ + "### More advanced model" + ] + }, + { + "cell_type": "markdown", + "id": "c4649c36-1157-438b-bff0-01e980aa7da3", + "metadata": {}, + "source": [ + "For a slightly more complex and deeper network, try to train the model below" + ] + }, + { + "cell_type": "raw", + "id": "e9af3bfc-7b19-4441-9dc4-46df1b3739cc", + "metadata": {}, + "source": [ + "input_img = tf.keras.layers.Input(shape=(28, 28, 1))\n", + "\n", + "x = tf.keras.layers.Conv2D(16, (3, 3), activation='relu', padding='same')(input_img)\n", + "x = tf.keras.layers.MaxPooling2D((2, 2), padding='same')(x)\n", + "x = tf.keras.layers.Conv2D(8, (3, 3), activation='relu', padding='same')(x)\n", + "x = tf.keras.layers.MaxPooling2D((2, 2), padding='same')(x)\n", + "x = tf.keras.layers.Conv2D(8, (3, 3), activation='relu', padding='same')(x)\n", + "x = tf.keras.layers.MaxPooling2D((2, 2), padding='same')(x)\n", + "x = tf.keras.layers.Flatten(input_shape=(26, 26))(x)\n", + "x = tf.keras.layers.Dense(128, activation='relu')(x)\n", + "x = tf.keras.layers.Dropout(0.2)(x)\n", + "x = tf.keras.layers.Dense(10)(x)\n", + "\n", + "model = tf.keras.Model(input_img, x)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "chap3", + "language": "python", + "name": "chap3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.18" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/ChapterNN/poetry.lock b/ChapterNN/poetry.lock new file mode 100644 index 0000000..975e5ff --- /dev/null +++ b/ChapterNN/poetry.lock @@ -0,0 +1,2342 @@ +# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. + +[[package]] +name = "absl-py" +version = "2.1.0" +description = "Abseil Python Common Libraries, see https://github.com/abseil/abseil-py." +optional = false +python-versions = ">=3.7" +files = [ + {file = "absl-py-2.1.0.tar.gz", hash = "sha256:7820790efbb316739cde8b4e19357243fc3608a152024288513dd968d7d959ff"}, + {file = "absl_py-2.1.0-py3-none-any.whl", hash = "sha256:526a04eadab8b4ee719ce68f204172ead1027549089702d99b9059f129ff1308"}, +] + +[[package]] +name = "appnope" +version = "0.1.4" +description = "Disable App Nap on macOS >= 10.9" +optional = false +python-versions = ">=3.6" +files = [ + {file = "appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c"}, + {file = "appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee"}, +] + +[[package]] +name = "asttokens" +version = "2.4.1" +description = "Annotate AST trees with source code positions" +optional = false +python-versions = "*" +files = [ + {file = "asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24"}, + {file = "asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"}, +] + +[package.dependencies] +six = ">=1.12.0" + +[package.extras] +astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"] +test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] + +[[package]] +name = "astunparse" +version = "1.6.3" +description = "An AST unparser for Python" +optional = false +python-versions = "*" +files = [ + {file = "astunparse-1.6.3-py2.py3-none-any.whl", hash = "sha256:c2652417f2c8b5bb325c885ae329bdf3f86424075c4fd1a128674bc6fba4b8e8"}, + {file = "astunparse-1.6.3.tar.gz", hash = "sha256:5ad93a8456f0d084c3456d059fd9a92cce667963232cbf763eac3bc5b7940872"}, +] + +[package.dependencies] +six = ">=1.6.1,<2.0" +wheel = ">=0.23.0,<1.0" + +[[package]] +name = "backcall" +version = "0.2.0" +description = "Specifications for callback functions passed in to an API" +optional = false +python-versions = "*" +files = [ + {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, + {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, +] + +[[package]] +name = "cachetools" +version = "4.2.4" +description = "Extensible memoizing collections and decorators" +optional = false +python-versions = "~=3.5" +files = [ + {file = "cachetools-4.2.4-py3-none-any.whl", hash = "sha256:92971d3cb7d2a97efff7c7bb1657f21a8f5fb309a37530537c71b1774189f2d1"}, + {file = "cachetools-4.2.4.tar.gz", hash = "sha256:89ea6f1b638d5a73a4f9226be57ac5e4f399d22770b92355f92dcb0f7f001693"}, +] + +[[package]] +name = "certifi" +version = "2024.2.2" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, + {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, +] + +[[package]] +name = "cffi" +version = "1.16.0" +description = "Foreign Function Interface for Python calling C code." +optional = false +python-versions = ">=3.8" +files = [ + {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, + {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, + {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, + {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, + {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, + {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, + {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, + {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, + {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, + {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, + {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, + {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, + {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, + {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, +] + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "charset-normalizer" +version = "3.3.2" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, +] + +[[package]] +name = "colorama" +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" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "comm" +version = "0.2.1" +description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." +optional = false +python-versions = ">=3.8" +files = [ + {file = "comm-0.2.1-py3-none-any.whl", hash = "sha256:87928485c0dfc0e7976fd89fc1e187023cf587e7c353e4a9b417555b44adf021"}, + {file = "comm-0.2.1.tar.gz", hash = "sha256:0bc91edae1344d39d3661dcbc36937181fdaddb304790458f8b044dbc064b89a"}, +] + +[package.dependencies] +traitlets = ">=4" + +[package.extras] +test = ["pytest"] + +[[package]] +name = "cycler" +version = "0.12.1" +description = "Composable style cycles" +optional = false +python-versions = ">=3.8" +files = [ + {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, + {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, +] + +[package.extras] +docs = ["ipython", "matplotlib", "numpydoc", "sphinx"] +tests = ["pytest", "pytest-cov", "pytest-xdist"] + +[[package]] +name = "debugpy" +version = "1.8.1" +description = "An implementation of the Debug Adapter Protocol for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "debugpy-1.8.1-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:3bda0f1e943d386cc7a0e71bfa59f4137909e2ed947fb3946c506e113000f741"}, + {file = "debugpy-1.8.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dda73bf69ea479c8577a0448f8c707691152e6c4de7f0c4dec5a4bc11dee516e"}, + {file = "debugpy-1.8.1-cp310-cp310-win32.whl", hash = "sha256:3a79c6f62adef994b2dbe9fc2cc9cc3864a23575b6e387339ab739873bea53d0"}, + {file = "debugpy-1.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:7eb7bd2b56ea3bedb009616d9e2f64aab8fc7000d481faec3cd26c98a964bcdd"}, + {file = "debugpy-1.8.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:016a9fcfc2c6b57f939673c874310d8581d51a0fe0858e7fac4e240c5eb743cb"}, + {file = "debugpy-1.8.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd97ed11a4c7f6d042d320ce03d83b20c3fb40da892f994bc041bbc415d7a099"}, + {file = "debugpy-1.8.1-cp311-cp311-win32.whl", hash = "sha256:0de56aba8249c28a300bdb0672a9b94785074eb82eb672db66c8144fff673146"}, + {file = "debugpy-1.8.1-cp311-cp311-win_amd64.whl", hash = "sha256:1a9fe0829c2b854757b4fd0a338d93bc17249a3bf69ecf765c61d4c522bb92a8"}, + {file = "debugpy-1.8.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:3ebb70ba1a6524d19fa7bb122f44b74170c447d5746a503e36adc244a20ac539"}, + {file = "debugpy-1.8.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2e658a9630f27534e63922ebf655a6ab60c370f4d2fc5c02a5b19baf4410ace"}, + {file = "debugpy-1.8.1-cp312-cp312-win32.whl", hash = "sha256:caad2846e21188797a1f17fc09c31b84c7c3c23baf2516fed5b40b378515bbf0"}, + {file = "debugpy-1.8.1-cp312-cp312-win_amd64.whl", hash = "sha256:edcc9f58ec0fd121a25bc950d4578df47428d72e1a0d66c07403b04eb93bcf98"}, + {file = "debugpy-1.8.1-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:7a3afa222f6fd3d9dfecd52729bc2e12c93e22a7491405a0ecbf9e1d32d45b39"}, + {file = "debugpy-1.8.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d915a18f0597ef685e88bb35e5d7ab968964b7befefe1aaea1eb5b2640b586c7"}, + {file = "debugpy-1.8.1-cp38-cp38-win32.whl", hash = "sha256:92116039b5500633cc8d44ecc187abe2dfa9b90f7a82bbf81d079fcdd506bae9"}, + {file = "debugpy-1.8.1-cp38-cp38-win_amd64.whl", hash = "sha256:e38beb7992b5afd9d5244e96ad5fa9135e94993b0c551ceebf3fe1a5d9beb234"}, + {file = "debugpy-1.8.1-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:bfb20cb57486c8e4793d41996652e5a6a885b4d9175dd369045dad59eaacea42"}, + {file = "debugpy-1.8.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efd3fdd3f67a7e576dd869c184c5dd71d9aaa36ded271939da352880c012e703"}, + {file = "debugpy-1.8.1-cp39-cp39-win32.whl", hash = "sha256:58911e8521ca0c785ac7a0539f1e77e0ce2df753f786188f382229278b4cdf23"}, + {file = "debugpy-1.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:6df9aa9599eb05ca179fb0b810282255202a66835c6efb1d112d21ecb830ddd3"}, + {file = "debugpy-1.8.1-py2.py3-none-any.whl", hash = "sha256:28acbe2241222b87e255260c76741e1fbf04fdc3b6d094fcf57b6c6f75ce1242"}, + {file = "debugpy-1.8.1.zip", hash = "sha256:f696d6be15be87aef621917585f9bb94b1dc9e8aced570db1b8a6fc14e8f9b42"}, +] + +[[package]] +name = "decorator" +version = "5.1.1" +description = "Decorators for Humans" +optional = false +python-versions = ">=3.5" +files = [ + {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, + {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, +] + +[[package]] +name = "executing" +version = "2.0.1" +description = "Get the currently executing AST node of a frame, and other information" +optional = false +python-versions = ">=3.5" +files = [ + {file = "executing-2.0.1-py2.py3-none-any.whl", hash = "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc"}, + {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"}, +] + +[package.extras] +tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] + +[[package]] +name = "filelock" +version = "3.13.1" +description = "A platform independent file lock." +optional = false +python-versions = ">=3.8" +files = [ + {file = "filelock-3.13.1-py3-none-any.whl", hash = "sha256:57dbda9b35157b05fb3e58ee91448612eb674172fab98ee235ccb0b5bee19a1c"}, + {file = "filelock-3.13.1.tar.gz", hash = "sha256:521f5f56c50f8426f5e03ad3b281b490a87ef15bc6c526f168290f0c7148d44e"}, +] + +[package.extras] +docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.24)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] +typing = ["typing-extensions (>=4.8)"] + +[[package]] +name = "fsspec" +version = "2024.2.0" +description = "File-system specification" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fsspec-2024.2.0-py3-none-any.whl", hash = "sha256:817f969556fa5916bc682e02ca2045f96ff7f586d45110fcb76022063ad2c7d8"}, + {file = "fsspec-2024.2.0.tar.gz", hash = "sha256:b6ad1a679f760dda52b1168c859d01b7b80648ea6f7f7c7f5a8a91dc3f3ecb84"}, +] + +[package.extras] +abfs = ["adlfs"] +adl = ["adlfs"] +arrow = ["pyarrow (>=1)"] +dask = ["dask", "distributed"] +devel = ["pytest", "pytest-cov"] +dropbox = ["dropbox", "dropboxdrivefs", "requests"] +full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "dask", "distributed", "dropbox", "dropboxdrivefs", "fusepy", "gcsfs", "libarchive-c", "ocifs", "panel", "paramiko", "pyarrow (>=1)", "pygit2", "requests", "s3fs", "smbprotocol", "tqdm"] +fuse = ["fusepy"] +gcs = ["gcsfs"] +git = ["pygit2"] +github = ["requests"] +gs = ["gcsfs"] +gui = ["panel"] +hdfs = ["pyarrow (>=1)"] +http = ["aiohttp (!=4.0.0a0,!=4.0.0a1)"] +libarchive = ["libarchive-c"] +oci = ["ocifs"] +s3 = ["s3fs"] +sftp = ["paramiko"] +smb = ["smbprotocol"] +ssh = ["paramiko"] +tqdm = ["tqdm"] + +[[package]] +name = "gast" +version = "0.3.3" +description = "Python AST that abstracts the underlying Python version" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "gast-0.3.3-py2.py3-none-any.whl", hash = "sha256:8f46f5be57ae6889a4e16e2ca113b1703ef17f2b0abceb83793eaba9e1351a45"}, + {file = "gast-0.3.3.tar.gz", hash = "sha256:b881ef288a49aa81440d2c5eb8aeefd4c2bb8993d5f50edae7413a85bfdb3b57"}, +] + +[[package]] +name = "google-auth" +version = "1.35.0" +description = "Google Authentication Library" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*" +files = [ + {file = "google-auth-1.35.0.tar.gz", hash = "sha256:b7033be9028c188ee30200b204ea00ed82ea1162e8ac1df4aa6ded19a191d88e"}, + {file = "google_auth-1.35.0-py2.py3-none-any.whl", hash = "sha256:997516b42ecb5b63e8d80f5632c1a61dddf41d2a4c2748057837e06e00014258"}, +] + +[package.dependencies] +cachetools = ">=2.0.0,<5.0" +pyasn1-modules = ">=0.2.1" +rsa = {version = ">=3.1.4,<5", markers = "python_version >= \"3.6\""} +setuptools = ">=40.3.0" +six = ">=1.9.0" + +[package.extras] +aiohttp = ["aiohttp (>=3.6.2,<4.0.0dev)", "requests (>=2.20.0,<3.0.0dev)"] +pyopenssl = ["pyopenssl (>=20.0.0)"] +reauth = ["pyu2f (>=0.1.5)"] + +[[package]] +name = "google-auth-oauthlib" +version = "0.4.6" +description = "Google Authentication Library" +optional = false +python-versions = ">=3.6" +files = [ + {file = "google-auth-oauthlib-0.4.6.tar.gz", hash = "sha256:a90a072f6993f2c327067bf65270046384cda5a8ecb20b94ea9a687f1f233a7a"}, + {file = "google_auth_oauthlib-0.4.6-py2.py3-none-any.whl", hash = "sha256:3f2a6e802eebbb6fb736a370fbf3b055edcb6b52878bf2f26330b5e041316c73"}, +] + +[package.dependencies] +google-auth = ">=1.0.0" +requests-oauthlib = ">=0.7.0" + +[package.extras] +tool = ["click (>=6.0.0)"] + +[[package]] +name = "google-pasta" +version = "0.2.0" +description = "pasta is an AST-based Python refactoring library" +optional = false +python-versions = "*" +files = [ + {file = "google-pasta-0.2.0.tar.gz", hash = "sha256:c9f2c8dfc8f96d0d5808299920721be30c9eec37f2389f28904f454565c8a16e"}, + {file = "google_pasta-0.2.0-py2-none-any.whl", hash = "sha256:4612951da876b1a10fe3960d7226f0c7682cf901e16ac06e473b267a5afa8954"}, + {file = "google_pasta-0.2.0-py3-none-any.whl", hash = "sha256:b32482794a366b5366a32c92a9a9201b107821889935a02b3e51f6b432ea84ed"}, +] + +[package.dependencies] +six = "*" + +[[package]] +name = "grpcio" +version = "1.60.1" +description = "HTTP/2-based RPC framework" +optional = false +python-versions = ">=3.7" +files = [ + {file = "grpcio-1.60.1-cp310-cp310-linux_armv7l.whl", hash = "sha256:14e8f2c84c0832773fb3958240c69def72357bc11392571f87b2d7b91e0bb092"}, + {file = "grpcio-1.60.1-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:33aed0a431f5befeffd9d346b0fa44b2c01aa4aeae5ea5b2c03d3e25e0071216"}, + {file = "grpcio-1.60.1-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:fead980fbc68512dfd4e0c7b1f5754c2a8e5015a04dea454b9cada54a8423525"}, + {file = "grpcio-1.60.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:082081e6a36b6eb5cf0fd9a897fe777dbb3802176ffd08e3ec6567edd85bc104"}, + {file = "grpcio-1.60.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55ccb7db5a665079d68b5c7c86359ebd5ebf31a19bc1a91c982fd622f1e31ff2"}, + {file = "grpcio-1.60.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:9b54577032d4f235452f77a83169b6527bf4b77d73aeada97d45b2aaf1bf5ce0"}, + {file = "grpcio-1.60.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7d142bcd604166417929b071cd396aa13c565749a4c840d6c702727a59d835eb"}, + {file = "grpcio-1.60.1-cp310-cp310-win32.whl", hash = "sha256:2a6087f234cb570008a6041c8ffd1b7d657b397fdd6d26e83d72283dae3527b1"}, + {file = "grpcio-1.60.1-cp310-cp310-win_amd64.whl", hash = "sha256:f2212796593ad1d0235068c79836861f2201fc7137a99aa2fea7beeb3b101177"}, + {file = "grpcio-1.60.1-cp311-cp311-linux_armv7l.whl", hash = "sha256:79ae0dc785504cb1e1788758c588c711f4e4a0195d70dff53db203c95a0bd303"}, + {file = "grpcio-1.60.1-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:4eec8b8c1c2c9b7125508ff7c89d5701bf933c99d3910e446ed531cd16ad5d87"}, + {file = "grpcio-1.60.1-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:8c9554ca8e26241dabe7951aa1fa03a1ba0856688ecd7e7bdbdd286ebc272e4c"}, + {file = "grpcio-1.60.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91422ba785a8e7a18725b1dc40fbd88f08a5bb4c7f1b3e8739cab24b04fa8a03"}, + {file = "grpcio-1.60.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cba6209c96828711cb7c8fcb45ecef8c8859238baf15119daa1bef0f6c84bfe7"}, + {file = "grpcio-1.60.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c71be3f86d67d8d1311c6076a4ba3b75ba5703c0b856b4e691c9097f9b1e8bd2"}, + {file = "grpcio-1.60.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:af5ef6cfaf0d023c00002ba25d0751e5995fa0e4c9eec6cd263c30352662cbce"}, + {file = "grpcio-1.60.1-cp311-cp311-win32.whl", hash = "sha256:a09506eb48fa5493c58f946c46754ef22f3ec0df64f2b5149373ff31fb67f3dd"}, + {file = "grpcio-1.60.1-cp311-cp311-win_amd64.whl", hash = "sha256:49c9b6a510e3ed8df5f6f4f3c34d7fbf2d2cae048ee90a45cd7415abab72912c"}, + {file = "grpcio-1.60.1-cp312-cp312-linux_armv7l.whl", hash = "sha256:b58b855d0071575ea9c7bc0d84a06d2edfbfccec52e9657864386381a7ce1ae9"}, + {file = "grpcio-1.60.1-cp312-cp312-macosx_10_10_universal2.whl", hash = "sha256:a731ac5cffc34dac62053e0da90f0c0b8560396a19f69d9703e88240c8f05858"}, + {file = "grpcio-1.60.1-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:cf77f8cf2a651fbd869fbdcb4a1931464189cd210abc4cfad357f1cacc8642a6"}, + {file = "grpcio-1.60.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c557e94e91a983e5b1e9c60076a8fd79fea1e7e06848eb2e48d0ccfb30f6e073"}, + {file = "grpcio-1.60.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:069fe2aeee02dfd2135d562d0663fe70fbb69d5eed6eb3389042a7e963b54de8"}, + {file = "grpcio-1.60.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:cb0af13433dbbd1c806e671d81ec75bd324af6ef75171fd7815ca3074fe32bfe"}, + {file = "grpcio-1.60.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2f44c32aef186bbba254129cea1df08a20be414144ac3bdf0e84b24e3f3b2e05"}, + {file = "grpcio-1.60.1-cp312-cp312-win32.whl", hash = "sha256:a212e5dea1a4182e40cd3e4067ee46be9d10418092ce3627475e995cca95de21"}, + {file = "grpcio-1.60.1-cp312-cp312-win_amd64.whl", hash = "sha256:6e490fa5f7f5326222cb9f0b78f207a2b218a14edf39602e083d5f617354306f"}, + {file = "grpcio-1.60.1-cp37-cp37m-linux_armv7l.whl", hash = "sha256:4216e67ad9a4769117433814956031cb300f85edc855252a645a9a724b3b6594"}, + {file = "grpcio-1.60.1-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:73e14acd3d4247169955fae8fb103a2b900cfad21d0c35f0dcd0fdd54cd60367"}, + {file = "grpcio-1.60.1-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:6ecf21d20d02d1733e9c820fb5c114c749d888704a7ec824b545c12e78734d1c"}, + {file = "grpcio-1.60.1-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:33bdea30dcfd4f87b045d404388469eb48a48c33a6195a043d116ed1b9a0196c"}, + {file = "grpcio-1.60.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53b69e79d00f78c81eecfb38f4516080dc7f36a198b6b37b928f1c13b3c063e9"}, + {file = "grpcio-1.60.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:39aa848794b887120b1d35b1b994e445cc028ff602ef267f87c38122c1add50d"}, + {file = "grpcio-1.60.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:72153a0d2e425f45b884540a61c6639436ddafa1829a42056aa5764b84108b8e"}, + {file = "grpcio-1.60.1-cp37-cp37m-win_amd64.whl", hash = "sha256:50d56280b482875d1f9128ce596e59031a226a8b84bec88cb2bf76c289f5d0de"}, + {file = "grpcio-1.60.1-cp38-cp38-linux_armv7l.whl", hash = "sha256:6d140bdeb26cad8b93c1455fa00573c05592793c32053d6e0016ce05ba267549"}, + {file = "grpcio-1.60.1-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:bc808924470643b82b14fe121923c30ec211d8c693e747eba8a7414bc4351a23"}, + {file = "grpcio-1.60.1-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:70c83bb530572917be20c21f3b6be92cd86b9aecb44b0c18b1d3b2cc3ae47df0"}, + {file = "grpcio-1.60.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9b106bc52e7f28170e624ba61cc7dc6829566e535a6ec68528f8e1afbed1c41f"}, + {file = "grpcio-1.60.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:30e980cd6db1088c144b92fe376747328d5554bc7960ce583ec7b7d81cd47287"}, + {file = "grpcio-1.60.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0c5807e9152eff15f1d48f6b9ad3749196f79a4a050469d99eecb679be592acc"}, + {file = "grpcio-1.60.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f1c3dc536b3ee124e8b24feb7533e5c70b9f2ef833e3b2e5513b2897fd46763a"}, + {file = "grpcio-1.60.1-cp38-cp38-win32.whl", hash = "sha256:d7404cebcdb11bb5bd40bf94131faf7e9a7c10a6c60358580fe83913f360f929"}, + {file = "grpcio-1.60.1-cp38-cp38-win_amd64.whl", hash = "sha256:c8754c75f55781515a3005063d9a05878b2cfb3cb7e41d5401ad0cf19de14872"}, + {file = "grpcio-1.60.1-cp39-cp39-linux_armv7l.whl", hash = "sha256:0250a7a70b14000fa311de04b169cc7480be6c1a769b190769d347939d3232a8"}, + {file = "grpcio-1.60.1-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:660fc6b9c2a9ea3bb2a7e64ba878c98339abaf1811edca904ac85e9e662f1d73"}, + {file = "grpcio-1.60.1-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:76eaaba891083fcbe167aa0f03363311a9f12da975b025d30e94b93ac7a765fc"}, + {file = "grpcio-1.60.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5d97c65ea7e097056f3d1ead77040ebc236feaf7f71489383d20f3b4c28412a"}, + {file = "grpcio-1.60.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb2a2911b028f01c8c64d126f6b632fcd8a9ac975aa1b3855766c94e4107180"}, + {file = "grpcio-1.60.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:5a1ebbae7e2214f51b1f23b57bf98eeed2cf1ba84e4d523c48c36d5b2f8829ff"}, + {file = "grpcio-1.60.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9a66f4d2a005bc78e61d805ed95dedfcb35efa84b7bba0403c6d60d13a3de2d6"}, + {file = "grpcio-1.60.1-cp39-cp39-win32.whl", hash = "sha256:8d488fbdbf04283f0d20742b64968d44825617aa6717b07c006168ed16488804"}, + {file = "grpcio-1.60.1-cp39-cp39-win_amd64.whl", hash = "sha256:61b7199cd2a55e62e45bfb629a35b71fc2c0cb88f686a047f25b1112d3810904"}, + {file = "grpcio-1.60.1.tar.gz", hash = "sha256:dd1d3a8d1d2e50ad9b59e10aa7f07c7d1be2b367f3f2d33c5fade96ed5460962"}, +] + +[package.extras] +protobuf = ["grpcio-tools (>=1.60.1)"] + +[[package]] +name = "h5py" +version = "2.10.0" +description = "Read and write HDF5 files from Python" +optional = false +python-versions = "*" +files = [ + {file = "h5py-2.10.0-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:ecf4d0b56ee394a0984de15bceeb97cbe1fe485f1ac205121293fc44dcf3f31f"}, + {file = "h5py-2.10.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:86868dc07b9cc8cb7627372a2e6636cdc7a53b7e2854ad020c9e9d8a4d3fd0f5"}, + {file = "h5py-2.10.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:aac4b57097ac29089f179bbc2a6e14102dd210618e94d77ee4831c65f82f17c0"}, + {file = "h5py-2.10.0-cp27-cp27m-win32.whl", hash = "sha256:7be5754a159236e95bd196419485343e2b5875e806fe68919e087b6351f40a70"}, + {file = "h5py-2.10.0-cp27-cp27m-win_amd64.whl", hash = "sha256:13c87efa24768a5e24e360a40e0bc4c49bcb7ce1bb13a3a7f9902cec302ccd36"}, + {file = "h5py-2.10.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:79b23f47c6524d61f899254f5cd5e486e19868f1823298bc0c29d345c2447172"}, + {file = "h5py-2.10.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:cbf28ae4b5af0f05aa6e7551cee304f1d317dbed1eb7ac1d827cee2f1ef97a99"}, + {file = "h5py-2.10.0-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:c0d4b04bbf96c47b6d360cd06939e72def512b20a18a8547fa4af810258355d5"}, + {file = "h5py-2.10.0-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:549ad124df27c056b2e255ea1c44d30fb7a17d17676d03096ad5cd85edb32dc1"}, + {file = "h5py-2.10.0-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:a5f82cd4938ff8761d9760af3274acf55afc3c91c649c50ab18fcff5510a14a5"}, + {file = "h5py-2.10.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:3dad1730b6470fad853ef56d755d06bb916ee68a3d8272b3bab0c1ddf83bb99e"}, + {file = "h5py-2.10.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:063947eaed5f271679ed4ffa36bb96f57bc14f44dd4336a827d9a02702e6ce6b"}, + {file = "h5py-2.10.0-cp35-cp35m-win32.whl", hash = "sha256:c54a2c0dd4957776ace7f95879d81582298c5daf89e77fb8bee7378f132951de"}, + {file = "h5py-2.10.0-cp35-cp35m-win_amd64.whl", hash = "sha256:6998be619c695910cb0effe5eb15d3a511d3d1a5d217d4bd0bebad1151ec2262"}, + {file = "h5py-2.10.0-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:ff7d241f866b718e4584fa95f520cb19405220c501bd3a53ee11871ba5166ea2"}, + {file = "h5py-2.10.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:54817b696e87eb9e403e42643305f142cd8b940fe9b3b490bbf98c3b8a894cf4"}, + {file = "h5py-2.10.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:d3c59549f90a891691991c17f8e58c8544060fdf3ccdea267100fa5f561ff62f"}, + {file = "h5py-2.10.0-cp36-cp36m-win32.whl", hash = "sha256:d7ae7a0576b06cb8e8a1c265a8bc4b73d05fdee6429bffc9a26a6eb531e79d72"}, + {file = "h5py-2.10.0-cp36-cp36m-win_amd64.whl", hash = "sha256:bffbc48331b4a801d2f4b7dac8a72609f0b10e6e516e5c480a3e3241e091c878"}, + {file = "h5py-2.10.0-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:51ae56894c6c93159086ffa2c94b5b3388c0400548ab26555c143e7cfa05b8e5"}, + {file = "h5py-2.10.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:16ead3c57141101e3296ebeed79c9c143c32bdd0e82a61a2fc67e8e6d493e9d1"}, + {file = "h5py-2.10.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:f0e25bb91e7a02efccb50aba6591d3fe2c725479e34769802fcdd4076abfa917"}, + {file = "h5py-2.10.0-cp37-cp37m-win32.whl", hash = "sha256:f23951a53d18398ef1344c186fb04b26163ca6ce449ebd23404b153fd111ded9"}, + {file = "h5py-2.10.0-cp37-cp37m-win_amd64.whl", hash = "sha256:8bb1d2de101f39743f91512a9750fb6c351c032e5cd3204b4487383e34da7f75"}, + {file = "h5py-2.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:64f74da4a1dd0d2042e7d04cf8294e04ddad686f8eba9bb79e517ae582f6668d"}, + {file = "h5py-2.10.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:d35f7a3a6cefec82bfdad2785e78359a0e6a5fbb3f605dd5623ce88082ccd681"}, + {file = "h5py-2.10.0-cp38-cp38-win32.whl", hash = "sha256:6ef7ab1089e3ef53ca099038f3c0a94d03e3560e6aff0e9d6c64c55fb13fc681"}, + {file = "h5py-2.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:769e141512b54dee14ec76ed354fcacfc7d97fea5a7646b709f7400cf1838630"}, + {file = "h5py-2.10.0.tar.gz", hash = "sha256:84412798925dc870ffd7107f045d7659e60f5d46d1c70c700375248bf6bf512d"}, +] + +[package.dependencies] +numpy = ">=1.7" +six = "*" + +[[package]] +name = "idna" +version = "3.6" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, + {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, +] + +[[package]] +name = "importlib-metadata" +version = "7.0.1" +description = "Read metadata from Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "importlib_metadata-7.0.1-py3-none-any.whl", hash = "sha256:4805911c3a4ec7c3966410053e9ec6a1fecd629117df5adee56dfc9432a1081e"}, + {file = "importlib_metadata-7.0.1.tar.gz", hash = "sha256:f238736bb06590ae52ac1fab06a3a9ef1d8dce2b7a35b5ab329371d6c8f5d2cc"}, +] + +[package.dependencies] +zipp = ">=0.5" + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +perf = ["ipython"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] + +[[package]] +name = "ipykernel" +version = "6.29.2" +description = "IPython Kernel for Jupyter" +optional = false +python-versions = ">=3.8" +files = [ + {file = "ipykernel-6.29.2-py3-none-any.whl", hash = "sha256:50384f5c577a260a1d53f1f59a828c7266d321c9b7d00d345693783f66616055"}, + {file = "ipykernel-6.29.2.tar.gz", hash = "sha256:3bade28004e3ff624ed57974948116670604ac5f676d12339693f3142176d3f0"}, +] + +[package.dependencies] +appnope = {version = "*", markers = "platform_system == \"Darwin\""} +comm = ">=0.1.1" +debugpy = ">=1.6.5" +ipython = ">=7.23.1" +jupyter-client = ">=6.1.12" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +matplotlib-inline = ">=0.1" +nest-asyncio = "*" +packaging = "*" +psutil = "*" +pyzmq = ">=24" +tornado = ">=6.1" +traitlets = ">=5.4.0" + +[package.extras] +cov = ["coverage[toml]", "curio", "matplotlib", "pytest-cov", "trio"] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "trio"] +pyqt5 = ["pyqt5"] +pyside6 = ["pyside6"] +test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (==0.23.4)", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "ipython" +version = "8.12.3" +description = "IPython: Productive Interactive Computing" +optional = false +python-versions = ">=3.8" +files = [ + {file = "ipython-8.12.3-py3-none-any.whl", hash = "sha256:b0340d46a933d27c657b211a329d0be23793c36595acf9e6ef4164bc01a1804c"}, + {file = "ipython-8.12.3.tar.gz", hash = "sha256:3910c4b54543c2ad73d06579aa771041b7d5707b033bd488669b4cf544e3b363"}, +] + +[package.dependencies] +appnope = {version = "*", markers = "sys_platform == \"darwin\""} +backcall = "*" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +decorator = "*" +jedi = ">=0.16" +matplotlib-inline = "*" +pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} +pickleshare = "*" +prompt-toolkit = ">=3.0.30,<3.0.37 || >3.0.37,<3.1.0" +pygments = ">=2.4.0" +stack-data = "*" +traitlets = ">=5" +typing-extensions = {version = "*", markers = "python_version < \"3.10\""} + +[package.extras] +all = ["black", "curio", "docrepr", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.21)", "pandas", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] +black = ["black"] +doc = ["docrepr", "ipykernel", "matplotlib", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] +kernel = ["ipykernel"] +nbconvert = ["nbconvert"] +nbformat = ["nbformat"] +notebook = ["ipywidgets", "notebook"] +parallel = ["ipyparallel"] +qtconsole = ["qtconsole"] +test = ["pytest (<7.1)", "pytest-asyncio", "testpath"] +test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pandas", "pytest (<7.1)", "pytest-asyncio", "testpath", "trio"] + +[[package]] +name = "jedi" +version = "0.19.1" +description = "An autocompletion tool for Python that can be used for text editors." +optional = false +python-versions = ">=3.6" +files = [ + {file = "jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"}, + {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"}, +] + +[package.dependencies] +parso = ">=0.8.3,<0.9.0" + +[package.extras] +docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] + +[[package]] +name = "jinja2" +version = "3.1.3" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +files = [ + {file = "Jinja2-3.1.3-py3-none-any.whl", hash = "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa"}, + {file = "Jinja2-3.1.3.tar.gz", hash = "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "jupyter-client" +version = "8.6.0" +description = "Jupyter protocol implementation and client libraries" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_client-8.6.0-py3-none-any.whl", hash = "sha256:909c474dbe62582ae62b758bca86d6518c85234bdee2d908c778db6d72f39d99"}, + {file = "jupyter_client-8.6.0.tar.gz", hash = "sha256:0642244bb83b4764ae60d07e010e15f0e2d275ec4e918a8f7b80fbbef3ca60c7"}, +] + +[package.dependencies] +importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +python-dateutil = ">=2.8.2" +pyzmq = ">=23.0" +tornado = ">=6.2" +traitlets = ">=5.3" + +[package.extras] +docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx (>=4)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] + +[[package]] +name = "jupyter-core" +version = "5.7.1" +description = "Jupyter core package. A base package on which Jupyter projects rely." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_core-5.7.1-py3-none-any.whl", hash = "sha256:c65c82126453a723a2804aa52409930434598fd9d35091d63dfb919d2b765bb7"}, + {file = "jupyter_core-5.7.1.tar.gz", hash = "sha256:de61a9d7fc71240f688b2fb5ab659fbb56979458dc66a71decd098e03c79e218"}, +] + +[package.dependencies] +platformdirs = ">=2.5" +pywin32 = {version = ">=300", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} +traitlets = ">=5.3" + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] +test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "keras-preprocessing" +version = "1.1.2" +description = "Easy data preprocessing and data augmentation for deep learning models" +optional = false +python-versions = "*" +files = [ + {file = "Keras_Preprocessing-1.1.2-py2.py3-none-any.whl", hash = "sha256:7b82029b130ff61cc99b55f3bd27427df4838576838c5b2f65940e4fcec99a7b"}, + {file = "Keras_Preprocessing-1.1.2.tar.gz", hash = "sha256:add82567c50c8bc648c14195bf544a5ce7c1f76761536956c3d2978970179ef3"}, +] + +[package.dependencies] +numpy = ">=1.9.1" +six = ">=1.9.0" + +[package.extras] +image = ["Pillow (>=5.2.0)", "scipy (>=0.14)"] +pep8 = ["flake8"] +tests = ["Pillow", "keras", "pandas", "pytest", "pytest-cov", "pytest-xdist", "tensorflow"] + +[[package]] +name = "kiwisolver" +version = "1.4.5" +description = "A fast implementation of the Cassowary constraint solver" +optional = false +python-versions = ">=3.7" +files = [ + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af"}, + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:146d14bebb7f1dc4d5fbf74f8a6cb15ac42baadee8912eb84ac0b3b2a3dc6ac3"}, + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ef7afcd2d281494c0a9101d5c571970708ad911d028137cd558f02b851c08b4"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9eaa8b117dc8337728e834b9c6e2611f10c79e38f65157c4c38e9400286f5cb1"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ec20916e7b4cbfb1f12380e46486ec4bcbaa91a9c448b97023fde0d5bbf9e4ff"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39b42c68602539407884cf70d6a480a469b93b81b7701378ba5e2328660c847a"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa12042de0171fad672b6c59df69106d20d5596e4f87b5e8f76df757a7c399aa"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a40773c71d7ccdd3798f6489aaac9eee213d566850a9533f8d26332d626b82c"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:19df6e621f6d8b4b9c4d45f40a66839294ff2bb235e64d2178f7522d9170ac5b"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:83d78376d0d4fd884e2c114d0621624b73d2aba4e2788182d286309ebdeed770"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e391b1f0a8a5a10ab3b9bb6afcfd74f2175f24f8975fb87ecae700d1503cdee0"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:852542f9481f4a62dbb5dd99e8ab7aedfeb8fb6342349a181d4036877410f525"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59edc41b24031bc25108e210c0def6f6c2191210492a972d585a06ff246bb79b"}, + {file = "kiwisolver-1.4.5-cp310-cp310-win32.whl", hash = "sha256:a6aa6315319a052b4ee378aa171959c898a6183f15c1e541821c5c59beaa0238"}, + {file = "kiwisolver-1.4.5-cp310-cp310-win_amd64.whl", hash = "sha256:d0ef46024e6a3d79c01ff13801cb19d0cad7fd859b15037aec74315540acc276"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:11863aa14a51fd6ec28688d76f1735f8f69ab1fabf388851a595d0721af042f5"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dfdd7c0b105af050eb3d64997809dc21da247cf44e63dc73ff0fd20b96be55a9"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbea0db94288e29afcc4c28afbf3a7ccaf2d7e027489c449cf7e8f83c6346eb9"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ceec1a6bc6cab1d6ff5d06592a91a692f90ec7505d6463a88a52cc0eb58545da"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f91de7223d4c7b793867797bacd1ee53bfe7359bd70d27b7b58a04efbb9436c8"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:faae4860798c31530dd184046a900e652c95513796ef51a12bc086710c2eec4d"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0157420efcb803e71d1b28e2c287518b8808b7cf1ab8af36718fd0a2c453eb0"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:06f54715b7737c2fecdbf140d1afb11a33d59508a47bf11bb38ecf21dc9ab79f"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f"}, + {file = "kiwisolver-1.4.5-cp311-cp311-win32.whl", hash = "sha256:bb86433b1cfe686da83ce32a9d3a8dd308e85c76b60896d58f082136f10bffac"}, + {file = "kiwisolver-1.4.5-cp311-cp311-win_amd64.whl", hash = "sha256:6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5ff5cf3571589b6d13bfbfd6bcd7a3f659e42f96b5fd1c4830c4cf21d4f5ef45"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7269d9e5f1084a653d575c7ec012ff57f0c042258bf5db0954bf551c158466e7"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da802a19d6e15dffe4b0c24b38b3af68e6c1a68e6e1d8f30148c83864f3881db"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3aba7311af82e335dd1e36ffff68aaca609ca6290c2cb6d821a39aa075d8e3ff"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:763773d53f07244148ccac5b084da5adb90bfaee39c197554f01b286cf869228"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2270953c0d8cdab5d422bee7d2007f043473f9d2999631c86a223c9db56cbd16"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d099e745a512f7e3bbe7249ca835f4d357c586d78d79ae8f1dcd4d8adeb9bda9"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:74db36e14a7d1ce0986fa104f7d5637aea5c82ca6326ed0ec5694280942d1162"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e5bab140c309cb3a6ce373a9e71eb7e4873c70c2dda01df6820474f9889d6d4"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0f114aa76dc1b8f636d077979c0ac22e7cd8f3493abbab152f20eb8d3cda71f3"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:88a2df29d4724b9237fc0c6eaf2a1adae0cdc0b3e9f4d8e7dc54b16812d2d81a"}, + {file = "kiwisolver-1.4.5-cp312-cp312-win32.whl", hash = "sha256:72d40b33e834371fd330fb1472ca19d9b8327acb79a5821d4008391db8e29f20"}, + {file = "kiwisolver-1.4.5-cp312-cp312-win_amd64.whl", hash = "sha256:2c5674c4e74d939b9d91dda0fae10597ac7521768fec9e399c70a1f27e2ea2d9"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3a2b053a0ab7a3960c98725cfb0bf5b48ba82f64ec95fe06f1d06c99b552e130"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cd32d6c13807e5c66a7cbb79f90b553642f296ae4518a60d8d76243b0ad2898"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59ec7b7c7e1a61061850d53aaf8e93db63dce0c936db1fda2658b70e4a1be709"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da4cfb373035def307905d05041c1d06d8936452fe89d464743ae7fb8371078b"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2400873bccc260b6ae184b2b8a4fec0e4082d30648eadb7c3d9a13405d861e89"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1b04139c4236a0f3aff534479b58f6f849a8b351e1314826c2d230849ed48985"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:4e66e81a5779b65ac21764c295087de82235597a2293d18d943f8e9e32746265"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7931d8f1f67c4be9ba1dd9c451fb0eeca1a25b89e4d3f89e828fe12a519b782a"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b3f7e75f3015df442238cca659f8baa5f42ce2a8582727981cbfa15fee0ee205"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:bbf1d63eef84b2e8c89011b7f2235b1e0bf7dacc11cac9431fc6468e99ac77fb"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4c380469bd3f970ef677bf2bcba2b6b0b4d5c75e7a020fb863ef75084efad66f"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-win32.whl", hash = "sha256:9408acf3270c4b6baad483865191e3e582b638b1654a007c62e3efe96f09a9a3"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-win_amd64.whl", hash = "sha256:5b94529f9b2591b7af5f3e0e730a4e0a41ea174af35a4fd067775f9bdfeee01a"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:11c7de8f692fc99816e8ac50d1d1aef4f75126eefc33ac79aac02c099fd3db71"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:53abb58632235cd154176ced1ae8f0d29a6657aa1aa9decf50b899b755bc2b93"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:88b9f257ca61b838b6f8094a62418421f87ac2a1069f7e896c36a7d86b5d4c29"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3195782b26fc03aa9c6913d5bad5aeb864bdc372924c093b0f1cebad603dd712"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc579bf0f502e54926519451b920e875f433aceb4624a3646b3252b5caa9e0b6"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a580c91d686376f0f7c295357595c5a026e6cbc3d77b7c36e290201e7c11ecb"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cfe6ab8da05c01ba6fbea630377b5da2cd9bcbc6338510116b01c1bc939a2c18"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d2e5a98f0ec99beb3c10e13b387f8db39106d53993f498b295f0c914328b1333"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a51a263952b1429e429ff236d2f5a21c5125437861baeed77f5e1cc2d2c7c6da"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3edd2fa14e68c9be82c5b16689e8d63d89fe927e56debd6e1dbce7a26a17f81b"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:74d1b44c6cfc897df648cc9fdaa09bc3e7679926e6f96df05775d4fb3946571c"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:76d9289ed3f7501012e05abb8358bbb129149dbd173f1f57a1bf1c22d19ab7cc"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:92dea1ffe3714fa8eb6a314d2b3c773208d865a0e0d35e713ec54eea08a66250"}, + {file = "kiwisolver-1.4.5-cp38-cp38-win32.whl", hash = "sha256:5c90ae8c8d32e472be041e76f9d2f2dbff4d0b0be8bd4041770eddb18cf49a4e"}, + {file = "kiwisolver-1.4.5-cp38-cp38-win_amd64.whl", hash = "sha256:c7940c1dc63eb37a67721b10d703247552416f719c4188c54e04334321351ced"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9407b6a5f0d675e8a827ad8742e1d6b49d9c1a1da5d952a67d50ef5f4170b18d"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15568384086b6df3c65353820a4473575dbad192e35010f622c6ce3eebd57af9"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0dc9db8e79f0036e8173c466d21ef18e1befc02de8bf8aa8dc0813a6dc8a7046"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cdc8a402aaee9a798b50d8b827d7ecf75edc5fb35ea0f91f213ff927c15f4ff0"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6c3bd3cde54cafb87d74d8db50b909705c62b17c2099b8f2e25b461882e544ff"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:955e8513d07a283056b1396e9a57ceddbd272d9252c14f154d450d227606eb54"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:346f5343b9e3f00b8db8ba359350eb124b98c99efd0b408728ac6ebf38173958"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9098e0049e88c6a24ff64545cdfc50807818ba6c1b739cae221bbbcbc58aad3"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:00bd361b903dc4bbf4eb165f24d1acbee754fce22ded24c3d56eec268658a5cf"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7b8b454bac16428b22560d0a1cf0a09875339cab69df61d7805bf48919415901"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f1d072c2eb0ad60d4c183f3fb44ac6f73fb7a8f16a2694a91f988275cbf352f9"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:31a82d498054cac9f6d0b53d02bb85811185bcb477d4b60144f915f3b3126342"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6512cb89e334e4700febbffaaa52761b65b4f5a3cf33f960213d5656cea36a77"}, + {file = "kiwisolver-1.4.5-cp39-cp39-win32.whl", hash = "sha256:9db8ea4c388fdb0f780fe91346fd438657ea602d58348753d9fb265ce1bca67f"}, + {file = "kiwisolver-1.4.5-cp39-cp39-win_amd64.whl", hash = "sha256:59415f46a37f7f2efeec758353dd2eae1b07640d8ca0f0c42548ec4125492635"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5c7b3b3a728dc6faf3fc372ef24f21d1e3cee2ac3e9596691d746e5a536de920"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:620ced262a86244e2be10a676b646f29c34537d0d9cc8eb26c08f53d98013390"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:378a214a1e3bbf5ac4a8708304318b4f890da88c9e6a07699c4ae7174c09a68d"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf7be1207676ac608a50cd08f102f6742dbfc70e8d60c4db1c6897f62f71523"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ba55dce0a9b8ff59495ddd050a0225d58bd0983d09f87cfe2b6aec4f2c1234e4"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fd32ea360bcbb92d28933fc05ed09bffcb1704ba3fc7942e81db0fd4f81a7892"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5e7139af55d1688f8b960ee9ad5adafc4ac17c1c473fe07133ac092310d76544"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dced8146011d2bc2e883f9bd68618b8247387f4bbec46d7392b3c3b032640126"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9bf3325c47b11b2e51bca0824ea217c7cd84491d8ac4eefd1e409705ef092bd"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5794cf59533bc3f1b1c821f7206a3617999db9fbefc345360aafe2e067514929"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e368f200bbc2e4f905b8e71eb38b3c04333bddaa6a2464a6355487b02bb7fb09"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5d706eba36b4c4d5bc6c6377bb6568098765e990cfc21ee16d13963fab7b3e7"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85267bd1aa8880a9c88a8cb71e18d3d64d2751a790e6ca6c27b8ccc724bcd5ad"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210ef2c3a1f03272649aff1ef992df2e724748918c4bc2d5a90352849eb40bea"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11d011a7574eb3b82bcc9c1a1d35c1d7075677fdd15de527d91b46bd35e935ee"}, + {file = "kiwisolver-1.4.5.tar.gz", hash = "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec"}, +] + +[[package]] +name = "lightning-utilities" +version = "0.10.1" +description = "Lightning toolbox for across the our ecosystem." +optional = false +python-versions = ">=3.7" +files = [ + {file = "lightning-utilities-0.10.1.tar.gz", hash = "sha256:362755023dcf93b8fa519bc002ae41794943a3ffbc5318e40804d36aa14bf1fd"}, + {file = "lightning_utilities-0.10.1-py3-none-any.whl", hash = "sha256:e67be3f328b1c14f2b36cc09e84642db5b50afeab94e7704969b2130fe6a3bda"}, +] + +[package.dependencies] +packaging = ">=17.1" +setuptools = "*" +typing-extensions = "*" + +[package.extras] +cli = ["fire"] +docs = ["requests (>=2.0.0)"] +typing = ["mypy (>=1.0.0)", "types-setuptools"] + +[[package]] +name = "markdown" +version = "3.5.2" +description = "Python implementation of John Gruber's Markdown." +optional = false +python-versions = ">=3.8" +files = [ + {file = "Markdown-3.5.2-py3-none-any.whl", hash = "sha256:d43323865d89fc0cb9b20c75fc8ad313af307cc087e84b657d9eec768eddeadd"}, + {file = "Markdown-3.5.2.tar.gz", hash = "sha256:e1ac7b3dc550ee80e602e71c1d168002f062e49f1b11e26a36264dafd4df2ef8"}, +] + +[package.dependencies] +importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} + +[package.extras] +docs = ["mdx-gh-links (>=0.2)", "mkdocs (>=1.5)", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-nature (>=0.6)", "mkdocs-section-index", "mkdocstrings[python]"] +testing = ["coverage", "pyyaml"] + +[[package]] +name = "markupsafe" +version = "2.1.5" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, + {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, +] + +[[package]] +name = "matplotlib" +version = "3.2.2" +description = "Python plotting package" +optional = false +python-versions = ">=3.6" +files = [ + {file = "matplotlib-3.2.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a47abc48c7b81fe6e636dde8a58e49b13d87d140e0f448213a4879f4a3f73345"}, + {file = "matplotlib-3.2.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:20bcd11efe194cd302bd0653cb025b8d16bcd80442359bfca8d49dc805f35ec8"}, + {file = "matplotlib-3.2.2-cp36-cp36m-win32.whl", hash = "sha256:2a6d64336b547e25730b6221e7aadfb01a391a065d43b5f51f0b9d7f673d2dd2"}, + {file = "matplotlib-3.2.2-cp36-cp36m-win_amd64.whl", hash = "sha256:4416825ebc9c1f135027a30e8d8aea0edcf45078ce767c7f7386737413cfb98f"}, + {file = "matplotlib-3.2.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:465c752278d27895e23f1379d6fcfa3a2990643b803c25e3bc16a10641d2346a"}, + {file = "matplotlib-3.2.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:81de040403a33bf3c68e9d4a40e26c8d24da00f7e3fadd845003b7e106785da7"}, + {file = "matplotlib-3.2.2-cp37-cp37m-win32.whl", hash = "sha256:006413f08ba5db1f5b1e0d6fbdc2ac9058b062ccf552f57182563a78579c34b4"}, + {file = "matplotlib-3.2.2-cp37-cp37m-win_amd64.whl", hash = "sha256:da06fa530591a141ffbe1712bbeec784734c3436b40c942d21652f305199b5d9"}, + {file = "matplotlib-3.2.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:894dd47c0a6ce38dc19bc87d1f7e2b0608310b2a18d1572291157450b05ce874"}, + {file = "matplotlib-3.2.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:1ab264770e7cf2cf4feb99f22c737066aef21ddf1ec402dc255450ac15eacb7b"}, + {file = "matplotlib-3.2.2-cp38-cp38-win32.whl", hash = "sha256:91c153f4318e3c67c035fd1185f5ea2613f15008b73b66985033033f6fe54bbd"}, + {file = "matplotlib-3.2.2-cp38-cp38-win_amd64.whl", hash = "sha256:a68e42e22f7fd190a532e4215e142276970c2d54040a0c46842fcb3db8b6ec5b"}, + {file = "matplotlib-3.2.2-cp39-cp39-win32.whl", hash = "sha256:647cf232ccf6265d2ba1ac4103e8c8b6ac7b03a40da3421234ffb03dda217f59"}, + {file = "matplotlib-3.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:31d32c83bb2b617377c6156f75e88b9ec2ded289e47ad4ff0f263dc1019d88b1"}, + {file = "matplotlib-3.2.2-pp36-pypy36_pp73-win32.whl", hash = "sha256:67065d938df34478451af62fbd0670d2b51c4d859fb66673064eb5de8660dd7c"}, + {file = "matplotlib-3.2.2.tar.gz", hash = "sha256:3d77a6630d093d74cbbfebaa0571d00790966be1ed204e4a8239f5cbd6835c5d"}, +] + +[package.dependencies] +cycler = ">=0.10" +kiwisolver = ">=1.0.1" +numpy = ">=1.11" +pyparsing = ">=2.0.1,<2.0.4 || >2.0.4,<2.1.2 || >2.1.2,<2.1.6 || >2.1.6" +python-dateutil = ">=2.1" + +[[package]] +name = "matplotlib-inline" +version = "0.1.6" +description = "Inline Matplotlib backend for Jupyter" +optional = false +python-versions = ">=3.5" +files = [ + {file = "matplotlib-inline-0.1.6.tar.gz", hash = "sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304"}, + {file = "matplotlib_inline-0.1.6-py3-none-any.whl", hash = "sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311"}, +] + +[package.dependencies] +traitlets = "*" + +[[package]] +name = "mpmath" +version = "1.3.0" +description = "Python library for arbitrary-precision floating-point arithmetic" +optional = false +python-versions = "*" +files = [ + {file = "mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c"}, + {file = "mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f"}, +] + +[package.extras] +develop = ["codecov", "pycodestyle", "pytest (>=4.6)", "pytest-cov", "wheel"] +docs = ["sphinx"] +gmpy = ["gmpy2 (>=2.1.0a4)"] +tests = ["pytest (>=4.6)"] + +[[package]] +name = "nest-asyncio" +version = "1.6.0" +description = "Patch asyncio to allow nested event loops" +optional = false +python-versions = ">=3.5" +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"}, +] + +[[package]] +name = "networkx" +version = "3.1" +description = "Python package for creating and manipulating graphs and networks" +optional = false +python-versions = ">=3.8" +files = [ + {file = "networkx-3.1-py3-none-any.whl", hash = "sha256:4f33f68cb2afcf86f28a45f43efc27a9386b535d567d2127f8f61d51dec58d36"}, + {file = "networkx-3.1.tar.gz", hash = "sha256:de346335408f84de0eada6ff9fafafff9bcda11f0a0dfaa931133debb146ab61"}, +] + +[package.extras] +default = ["matplotlib (>=3.4)", "numpy (>=1.20)", "pandas (>=1.3)", "scipy (>=1.8)"] +developer = ["mypy (>=1.1)", "pre-commit (>=3.2)"] +doc = ["nb2plots (>=0.6)", "numpydoc (>=1.5)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.13)", "sphinx (>=6.1)", "sphinx-gallery (>=0.12)", "texext (>=0.6.7)"] +extra = ["lxml (>=4.6)", "pydot (>=1.4.2)", "pygraphviz (>=1.10)", "sympy (>=1.10)"] +test = ["codecov (>=2.1)", "pytest (>=7.2)", "pytest-cov (>=4.0)"] + +[[package]] +name = "numpy" +version = "1.24.4" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "numpy-1.24.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c0bfb52d2169d58c1cdb8cc1f16989101639b34c7d3ce60ed70b19c63eba0b64"}, + {file = "numpy-1.24.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ed094d4f0c177b1b8e7aa9cba7d6ceed51c0e569a5318ac0ca9a090680a6a1b1"}, + {file = "numpy-1.24.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79fc682a374c4a8ed08b331bef9c5f582585d1048fa6d80bc6c35bc384eee9b4"}, + {file = "numpy-1.24.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ffe43c74893dbf38c2b0a1f5428760a1a9c98285553c89e12d70a96a7f3a4d6"}, + {file = "numpy-1.24.4-cp310-cp310-win32.whl", hash = "sha256:4c21decb6ea94057331e111a5bed9a79d335658c27ce2adb580fb4d54f2ad9bc"}, + {file = "numpy-1.24.4-cp310-cp310-win_amd64.whl", hash = "sha256:b4bea75e47d9586d31e892a7401f76e909712a0fd510f58f5337bea9572c571e"}, + {file = "numpy-1.24.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f136bab9c2cfd8da131132c2cf6cc27331dd6fae65f95f69dcd4ae3c3639c810"}, + {file = "numpy-1.24.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e2926dac25b313635e4d6cf4dc4e51c8c0ebfed60b801c799ffc4c32bf3d1254"}, + {file = "numpy-1.24.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:222e40d0e2548690405b0b3c7b21d1169117391c2e82c378467ef9ab4c8f0da7"}, + {file = "numpy-1.24.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7215847ce88a85ce39baf9e89070cb860c98fdddacbaa6c0da3ffb31b3350bd5"}, + {file = "numpy-1.24.4-cp311-cp311-win32.whl", hash = "sha256:4979217d7de511a8d57f4b4b5b2b965f707768440c17cb70fbf254c4b225238d"}, + {file = "numpy-1.24.4-cp311-cp311-win_amd64.whl", hash = "sha256:b7b1fc9864d7d39e28f41d089bfd6353cb5f27ecd9905348c24187a768c79694"}, + {file = "numpy-1.24.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1452241c290f3e2a312c137a9999cdbf63f78864d63c79039bda65ee86943f61"}, + {file = "numpy-1.24.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:04640dab83f7c6c85abf9cd729c5b65f1ebd0ccf9de90b270cd61935eef0197f"}, + {file = "numpy-1.24.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5425b114831d1e77e4b5d812b69d11d962e104095a5b9c3b641a218abcc050e"}, + {file = "numpy-1.24.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd80e219fd4c71fc3699fc1dadac5dcf4fd882bfc6f7ec53d30fa197b8ee22dc"}, + {file = "numpy-1.24.4-cp38-cp38-win32.whl", hash = "sha256:4602244f345453db537be5314d3983dbf5834a9701b7723ec28923e2889e0bb2"}, + {file = "numpy-1.24.4-cp38-cp38-win_amd64.whl", hash = "sha256:692f2e0f55794943c5bfff12b3f56f99af76f902fc47487bdfe97856de51a706"}, + {file = "numpy-1.24.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2541312fbf09977f3b3ad449c4e5f4bb55d0dbf79226d7724211acc905049400"}, + {file = "numpy-1.24.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9667575fb6d13c95f1b36aca12c5ee3356bf001b714fc354eb5465ce1609e62f"}, + {file = "numpy-1.24.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3a86ed21e4f87050382c7bc96571755193c4c1392490744ac73d660e8f564a9"}, + {file = "numpy-1.24.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d11efb4dbecbdf22508d55e48d9c8384db795e1b7b51ea735289ff96613ff74d"}, + {file = "numpy-1.24.4-cp39-cp39-win32.whl", hash = "sha256:6620c0acd41dbcb368610bb2f4d83145674040025e5536954782467100aa8835"}, + {file = "numpy-1.24.4-cp39-cp39-win_amd64.whl", hash = "sha256:befe2bf740fd8373cf56149a5c23a0f601e82869598d41f8e188a0e9869926f8"}, + {file = "numpy-1.24.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:31f13e25b4e304632a4619d0e0777662c2ffea99fcae2029556b17d8ff958aef"}, + {file = "numpy-1.24.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95f7ac6540e95bc440ad77f56e520da5bf877f87dca58bd095288dce8940532a"}, + {file = "numpy-1.24.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e98f220aa76ca2a977fe435f5b04d7b3470c0a2e6312907b37ba6068f26787f2"}, + {file = "numpy-1.24.4.tar.gz", hash = "sha256:80f5e3a4e498641401868df4208b74581206afbee7cf7b8329daae82676d9463"}, +] + +[[package]] +name = "nvidia-cublas-cu12" +version = "12.1.3.1" +description = "CUBLAS native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cublas_cu12-12.1.3.1-py3-none-manylinux1_x86_64.whl", hash = "sha256:ee53ccca76a6fc08fb9701aa95b6ceb242cdaab118c3bb152af4e579af792728"}, + {file = "nvidia_cublas_cu12-12.1.3.1-py3-none-win_amd64.whl", hash = "sha256:2b964d60e8cf11b5e1073d179d85fa340c120e99b3067558f3cf98dd69d02906"}, +] + +[[package]] +name = "nvidia-cuda-cupti-cu12" +version = "12.1.105" +description = "CUDA profiling tools runtime libs." +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cuda_cupti_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:e54fde3983165c624cb79254ae9818a456eb6e87a7fd4d56a2352c24ee542d7e"}, + {file = "nvidia_cuda_cupti_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:bea8236d13a0ac7190bd2919c3e8e6ce1e402104276e6f9694479e48bb0eb2a4"}, +] + +[[package]] +name = "nvidia-cuda-nvrtc-cu12" +version = "12.1.105" +description = "NVRTC native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:339b385f50c309763ca65456ec75e17bbefcbbf2893f462cb8b90584cd27a1c2"}, + {file = "nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:0a98a522d9ff138b96c010a65e145dc1b4850e9ecb75a0172371793752fd46ed"}, +] + +[[package]] +name = "nvidia-cuda-runtime-cu12" +version = "12.1.105" +description = "CUDA Runtime native Libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cuda_runtime_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:6e258468ddf5796e25f1dc591a31029fa317d97a0a94ed93468fc86301d61e40"}, + {file = "nvidia_cuda_runtime_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:dfb46ef84d73fababab44cf03e3b83f80700d27ca300e537f85f636fac474344"}, +] + +[[package]] +name = "nvidia-cudnn-cu12" +version = "8.9.2.26" +description = "cuDNN runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cudnn_cu12-8.9.2.26-py3-none-manylinux1_x86_64.whl", hash = "sha256:5ccb288774fdfb07a7e7025ffec286971c06d8d7b4fb162525334616d7629ff9"}, +] + +[package.dependencies] +nvidia-cublas-cu12 = "*" + +[[package]] +name = "nvidia-cufft-cu12" +version = "11.0.2.54" +description = "CUFFT native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cufft_cu12-11.0.2.54-py3-none-manylinux1_x86_64.whl", hash = "sha256:794e3948a1aa71fd817c3775866943936774d1c14e7628c74f6f7417224cdf56"}, + {file = "nvidia_cufft_cu12-11.0.2.54-py3-none-win_amd64.whl", hash = "sha256:d9ac353f78ff89951da4af698f80870b1534ed69993f10a4cf1d96f21357e253"}, +] + +[[package]] +name = "nvidia-curand-cu12" +version = "10.3.2.106" +description = "CURAND native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_curand_cu12-10.3.2.106-py3-none-manylinux1_x86_64.whl", hash = "sha256:9d264c5036dde4e64f1de8c50ae753237c12e0b1348738169cd0f8a536c0e1e0"}, + {file = "nvidia_curand_cu12-10.3.2.106-py3-none-win_amd64.whl", hash = "sha256:75b6b0c574c0037839121317e17fd01f8a69fd2ef8e25853d826fec30bdba74a"}, +] + +[[package]] +name = "nvidia-cusolver-cu12" +version = "11.4.5.107" +description = "CUDA solver native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cusolver_cu12-11.4.5.107-py3-none-manylinux1_x86_64.whl", hash = "sha256:8a7ec542f0412294b15072fa7dab71d31334014a69f953004ea7a118206fe0dd"}, + {file = "nvidia_cusolver_cu12-11.4.5.107-py3-none-win_amd64.whl", hash = "sha256:74e0c3a24c78612192a74fcd90dd117f1cf21dea4822e66d89e8ea80e3cd2da5"}, +] + +[package.dependencies] +nvidia-cublas-cu12 = "*" +nvidia-cusparse-cu12 = "*" +nvidia-nvjitlink-cu12 = "*" + +[[package]] +name = "nvidia-cusparse-cu12" +version = "12.1.0.106" +description = "CUSPARSE native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cusparse_cu12-12.1.0.106-py3-none-manylinux1_x86_64.whl", hash = "sha256:f3b50f42cf363f86ab21f720998517a659a48131e8d538dc02f8768237bd884c"}, + {file = "nvidia_cusparse_cu12-12.1.0.106-py3-none-win_amd64.whl", hash = "sha256:b798237e81b9719373e8fae8d4f091b70a0cf09d9d85c95a557e11df2d8e9a5a"}, +] + +[package.dependencies] +nvidia-nvjitlink-cu12 = "*" + +[[package]] +name = "nvidia-nccl-cu12" +version = "2.18.1" +description = "NVIDIA Collective Communication Library (NCCL) Runtime" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_nccl_cu12-2.18.1-py3-none-manylinux1_x86_64.whl", hash = "sha256:1a6c4acefcbebfa6de320f412bf7866de856e786e0462326ba1bac40de0b5e71"}, +] + +[[package]] +name = "nvidia-nvjitlink-cu12" +version = "12.3.101" +description = "Nvidia JIT LTO Library" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_nvjitlink_cu12-12.3.101-py3-none-manylinux1_x86_64.whl", hash = "sha256:64335a8088e2b9d196ae8665430bc6a2b7e6ef2eb877a9c735c804bd4ff6467c"}, + {file = "nvidia_nvjitlink_cu12-12.3.101-py3-none-win_amd64.whl", hash = "sha256:1b2e317e437433753530792f13eece58f0aec21a2b05903be7bffe58a606cbd1"}, +] + +[[package]] +name = "nvidia-nvtx-cu12" +version = "12.1.105" +description = "NVIDIA Tools Extension" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_nvtx_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:dc21cf308ca5691e7c04d962e213f8a4aa9bbfa23d95412f452254c2caeb09e5"}, + {file = "nvidia_nvtx_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:65f4d98982b31b60026e0e6de73fbdfc09d08a96f4656dd3665ca616a11e1e82"}, +] + +[[package]] +name = "oauthlib" +version = "3.2.2" +description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" +optional = false +python-versions = ">=3.6" +files = [ + {file = "oauthlib-3.2.2-py3-none-any.whl", hash = "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca"}, + {file = "oauthlib-3.2.2.tar.gz", hash = "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918"}, +] + +[package.extras] +rsa = ["cryptography (>=3.0.0)"] +signals = ["blinker (>=1.4.0)"] +signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] + +[[package]] +name = "opt-einsum" +version = "3.3.0" +description = "Optimizing numpys einsum function" +optional = false +python-versions = ">=3.5" +files = [ + {file = "opt_einsum-3.3.0-py3-none-any.whl", hash = "sha256:2455e59e3947d3c275477df7f5205b30635e266fe6dc300e3d9f9646bfcea147"}, + {file = "opt_einsum-3.3.0.tar.gz", hash = "sha256:59f6475f77bbc37dcf7cd748519c0ec60722e91e63ca114e68821c0c54a46549"}, +] + +[package.dependencies] +numpy = ">=1.7" + +[package.extras] +docs = ["numpydoc", "sphinx (==1.2.3)", "sphinx-rtd-theme", "sphinxcontrib-napoleon"] +tests = ["pytest", "pytest-cov", "pytest-pep8"] + +[[package]] +name = "packaging" +version = "23.2" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, + {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, +] + +[[package]] +name = "parso" +version = "0.8.3" +description = "A Python Parser" +optional = false +python-versions = ">=3.6" +files = [ + {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"}, + {file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"}, +] + +[package.extras] +qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] +testing = ["docopt", "pytest (<6.0.0)"] + +[[package]] +name = "pexpect" +version = "4.9.0" +description = "Pexpect allows easy control of interactive console applications." +optional = false +python-versions = "*" +files = [ + {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, + {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, +] + +[package.dependencies] +ptyprocess = ">=0.5" + +[[package]] +name = "pickleshare" +version = "0.7.5" +description = "Tiny 'shelve'-like database with concurrency support" +optional = false +python-versions = "*" +files = [ + {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, + {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, +] + +[[package]] +name = "pillow" +version = "10.2.0" +description = "Python Imaging Library (Fork)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pillow-10.2.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:7823bdd049099efa16e4246bdf15e5a13dbb18a51b68fa06d6c1d4d8b99a796e"}, + {file = "pillow-10.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:83b2021f2ade7d1ed556bc50a399127d7fb245e725aa0113ebd05cfe88aaf588"}, + {file = "pillow-10.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fad5ff2f13d69b7e74ce5b4ecd12cc0ec530fcee76356cac6742785ff71c452"}, + {file = "pillow-10.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da2b52b37dad6d9ec64e653637a096905b258d2fc2b984c41ae7d08b938a67e4"}, + {file = "pillow-10.2.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:47c0995fc4e7f79b5cfcab1fc437ff2890b770440f7696a3ba065ee0fd496563"}, + {file = "pillow-10.2.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:322bdf3c9b556e9ffb18f93462e5f749d3444ce081290352c6070d014c93feb2"}, + {file = "pillow-10.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:51f1a1bffc50e2e9492e87d8e09a17c5eea8409cda8d3f277eb6edc82813c17c"}, + {file = "pillow-10.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:69ffdd6120a4737710a9eee73e1d2e37db89b620f702754b8f6e62594471dee0"}, + {file = "pillow-10.2.0-cp310-cp310-win32.whl", hash = "sha256:c6dafac9e0f2b3c78df97e79af707cdc5ef8e88208d686a4847bab8266870023"}, + {file = "pillow-10.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:aebb6044806f2e16ecc07b2a2637ee1ef67a11840a66752751714a0d924adf72"}, + {file = "pillow-10.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:7049e301399273a0136ff39b84c3678e314f2158f50f517bc50285fb5ec847ad"}, + {file = "pillow-10.2.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:35bb52c37f256f662abdfa49d2dfa6ce5d93281d323a9af377a120e89a9eafb5"}, + {file = "pillow-10.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9c23f307202661071d94b5e384e1e1dc7dfb972a28a2310e4ee16103e66ddb67"}, + {file = "pillow-10.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:773efe0603db30c281521a7c0214cad7836c03b8ccff897beae9b47c0b657d61"}, + {file = "pillow-10.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11fa2e5984b949b0dd6d7a94d967743d87c577ff0b83392f17cb3990d0d2fd6e"}, + {file = "pillow-10.2.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:716d30ed977be8b37d3ef185fecb9e5a1d62d110dfbdcd1e2a122ab46fddb03f"}, + {file = "pillow-10.2.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a086c2af425c5f62a65e12fbf385f7c9fcb8f107d0849dba5839461a129cf311"}, + {file = "pillow-10.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c8de2789052ed501dd829e9cae8d3dcce7acb4777ea4a479c14521c942d395b1"}, + {file = "pillow-10.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:609448742444d9290fd687940ac0b57fb35e6fd92bdb65386e08e99af60bf757"}, + {file = "pillow-10.2.0-cp311-cp311-win32.whl", hash = "sha256:823ef7a27cf86df6597fa0671066c1b596f69eba53efa3d1e1cb8b30f3533068"}, + {file = "pillow-10.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:1da3b2703afd040cf65ec97efea81cfba59cdbed9c11d8efc5ab09df9509fc56"}, + {file = "pillow-10.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:edca80cbfb2b68d7b56930b84a0e45ae1694aeba0541f798e908a49d66b837f1"}, + {file = "pillow-10.2.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:1b5e1b74d1bd1b78bc3477528919414874748dd363e6272efd5abf7654e68bef"}, + {file = "pillow-10.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0eae2073305f451d8ecacb5474997c08569fb4eb4ac231ffa4ad7d342fdc25ac"}, + {file = "pillow-10.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7c2286c23cd350b80d2fc9d424fc797575fb16f854b831d16fd47ceec078f2c"}, + {file = "pillow-10.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e23412b5c41e58cec602f1135c57dfcf15482013ce6e5f093a86db69646a5aa"}, + {file = "pillow-10.2.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:52a50aa3fb3acb9cf7213573ef55d31d6eca37f5709c69e6858fe3bc04a5c2a2"}, + {file = "pillow-10.2.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:127cee571038f252a552760076407f9cff79761c3d436a12af6000cd182a9d04"}, + {file = "pillow-10.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:8d12251f02d69d8310b046e82572ed486685c38f02176bd08baf216746eb947f"}, + {file = "pillow-10.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:54f1852cd531aa981bc0965b7d609f5f6cc8ce8c41b1139f6ed6b3c54ab82bfb"}, + {file = "pillow-10.2.0-cp312-cp312-win32.whl", hash = "sha256:257d8788df5ca62c980314053197f4d46eefedf4e6175bc9412f14412ec4ea2f"}, + {file = "pillow-10.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:154e939c5f0053a383de4fd3d3da48d9427a7e985f58af8e94d0b3c9fcfcf4f9"}, + {file = "pillow-10.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:f379abd2f1e3dddb2b61bc67977a6b5a0a3f7485538bcc6f39ec76163891ee48"}, + {file = "pillow-10.2.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8373c6c251f7ef8bda6675dd6d2b3a0fcc31edf1201266b5cf608b62a37407f9"}, + {file = "pillow-10.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:870ea1ada0899fd0b79643990809323b389d4d1d46c192f97342eeb6ee0b8483"}, + {file = "pillow-10.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4b6b1e20608493548b1f32bce8cca185bf0480983890403d3b8753e44077129"}, + {file = "pillow-10.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3031709084b6e7852d00479fd1d310b07d0ba82765f973b543c8af5061cf990e"}, + {file = "pillow-10.2.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:3ff074fc97dd4e80543a3e91f69d58889baf2002b6be64347ea8cf5533188213"}, + {file = "pillow-10.2.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:cb4c38abeef13c61d6916f264d4845fab99d7b711be96c326b84df9e3e0ff62d"}, + {file = "pillow-10.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b1b3020d90c2d8e1dae29cf3ce54f8094f7938460fb5ce8bc5c01450b01fbaf6"}, + {file = "pillow-10.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:170aeb00224ab3dc54230c797f8404507240dd868cf52066f66a41b33169bdbe"}, + {file = "pillow-10.2.0-cp38-cp38-win32.whl", hash = "sha256:c4225f5220f46b2fde568c74fca27ae9771536c2e29d7c04f4fb62c83275ac4e"}, + {file = "pillow-10.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:0689b5a8c5288bc0504d9fcee48f61a6a586b9b98514d7d29b840143d6734f39"}, + {file = "pillow-10.2.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:b792a349405fbc0163190fde0dc7b3fef3c9268292586cf5645598b48e63dc67"}, + {file = "pillow-10.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c570f24be1e468e3f0ce7ef56a89a60f0e05b30a3669a459e419c6eac2c35364"}, + {file = "pillow-10.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8ecd059fdaf60c1963c58ceb8997b32e9dc1b911f5da5307aab614f1ce5c2fb"}, + {file = "pillow-10.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c365fd1703040de1ec284b176d6af5abe21b427cb3a5ff68e0759e1e313a5e7e"}, + {file = "pillow-10.2.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:70c61d4c475835a19b3a5aa42492409878bbca7438554a1f89d20d58a7c75c01"}, + {file = "pillow-10.2.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b6f491cdf80ae540738859d9766783e3b3c8e5bd37f5dfa0b76abdecc5081f13"}, + {file = "pillow-10.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d189550615b4948f45252d7f005e53c2040cea1af5b60d6f79491a6e147eef7"}, + {file = "pillow-10.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:49d9ba1ed0ef3e061088cd1e7538a0759aab559e2e0a80a36f9fd9d8c0c21591"}, + {file = "pillow-10.2.0-cp39-cp39-win32.whl", hash = "sha256:babf5acfede515f176833ed6028754cbcd0d206f7f614ea3447d67c33be12516"}, + {file = "pillow-10.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:0304004f8067386b477d20a518b50f3fa658a28d44e4116970abfcd94fac34a8"}, + {file = "pillow-10.2.0-cp39-cp39-win_arm64.whl", hash = "sha256:0fb3e7fc88a14eacd303e90481ad983fd5b69c761e9e6ef94c983f91025da869"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:322209c642aabdd6207517e9739c704dc9f9db943015535783239022002f054a"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3eedd52442c0a5ff4f887fab0c1c0bb164d8635b32c894bc1faf4c618dd89df2"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb28c753fd5eb3dd859b4ee95de66cc62af91bcff5db5f2571d32a520baf1f04"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:33870dc4653c5017bf4c8873e5488d8f8d5f8935e2f1fb9a2208c47cdd66efd2"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3c31822339516fb3c82d03f30e22b1d038da87ef27b6a78c9549888f8ceda39a"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a2b56ba36e05f973d450582fb015594aaa78834fefe8dfb8fcd79b93e64ba4c6"}, + {file = "pillow-10.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:d8e6aeb9201e655354b3ad049cb77d19813ad4ece0df1249d3c793de3774f8c7"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:2247178effb34a77c11c0e8ac355c7a741ceca0a732b27bf11e747bbc950722f"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15587643b9e5eb26c48e49a7b33659790d28f190fc514a322d55da2fb5c2950e"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753cd8f2086b2b80180d9b3010dd4ed147efc167c90d3bf593fe2af21265e5a5"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:7c8f97e8e7a9009bcacbe3766a36175056c12f9a44e6e6f2d5caad06dcfbf03b"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d1b35bcd6c5543b9cb547dee3150c93008f8dd0f1fef78fc0cd2b141c5baf58a"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fe4c15f6c9285dc54ce6553a3ce908ed37c8f3825b5a51a15c91442bb955b868"}, + {file = "pillow-10.2.0.tar.gz", hash = "sha256:e87f0b2c78157e12d7686b27d63c070fd65d994e8ddae6f328e0dcf4a0cd007e"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] +fpx = ["olefile"] +mic = ["olefile"] +tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] +typing = ["typing-extensions"] +xmp = ["defusedxml"] + +[[package]] +name = "platformdirs" +version = "4.2.0" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +optional = false +python-versions = ">=3.8" +files = [ + {file = "platformdirs-4.2.0-py3-none-any.whl", hash = "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068"}, + {file = "platformdirs-4.2.0.tar.gz", hash = "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768"}, +] + +[package.extras] +docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] + +[[package]] +name = "prompt-toolkit" +version = "3.0.43" +description = "Library for building powerful interactive command lines in Python" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "prompt_toolkit-3.0.43-py3-none-any.whl", hash = "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6"}, + {file = "prompt_toolkit-3.0.43.tar.gz", hash = "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d"}, +] + +[package.dependencies] +wcwidth = "*" + +[[package]] +name = "protobuf" +version = "4.25.2" +description = "" +optional = false +python-versions = ">=3.8" +files = [ + {file = "protobuf-4.25.2-cp310-abi3-win32.whl", hash = "sha256:b50c949608682b12efb0b2717f53256f03636af5f60ac0c1d900df6213910fd6"}, + {file = "protobuf-4.25.2-cp310-abi3-win_amd64.whl", hash = "sha256:8f62574857ee1de9f770baf04dde4165e30b15ad97ba03ceac65f760ff018ac9"}, + {file = "protobuf-4.25.2-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:2db9f8fa64fbdcdc93767d3cf81e0f2aef176284071507e3ede160811502fd3d"}, + {file = "protobuf-4.25.2-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:10894a2885b7175d3984f2be8d9850712c57d5e7587a2410720af8be56cdaf62"}, + {file = "protobuf-4.25.2-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:fc381d1dd0516343f1440019cedf08a7405f791cd49eef4ae1ea06520bc1c020"}, + {file = "protobuf-4.25.2-cp38-cp38-win32.whl", hash = "sha256:33a1aeef4b1927431d1be780e87b641e322b88d654203a9e9d93f218ee359e61"}, + {file = "protobuf-4.25.2-cp38-cp38-win_amd64.whl", hash = "sha256:47f3de503fe7c1245f6f03bea7e8d3ec11c6c4a2ea9ef910e3221c8a15516d62"}, + {file = "protobuf-4.25.2-cp39-cp39-win32.whl", hash = "sha256:5e5c933b4c30a988b52e0b7c02641760a5ba046edc5e43d3b94a74c9fc57c1b3"}, + {file = "protobuf-4.25.2-cp39-cp39-win_amd64.whl", hash = "sha256:d66a769b8d687df9024f2985d5137a337f957a0916cf5464d1513eee96a63ff0"}, + {file = "protobuf-4.25.2-py3-none-any.whl", hash = "sha256:a8b7a98d4ce823303145bf3c1a8bdb0f2f4642a414b196f04ad9853ed0c8f830"}, + {file = "protobuf-4.25.2.tar.gz", hash = "sha256:fe599e175cb347efc8ee524bcd4b902d11f7262c0e569ececcb89995c15f0a5e"}, +] + +[[package]] +name = "psutil" +version = "5.9.8" +description = "Cross-platform lib for process and system monitoring in Python." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ + {file = "psutil-5.9.8-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:26bd09967ae00920df88e0352a91cff1a78f8d69b3ecabbfe733610c0af486c8"}, + {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:05806de88103b25903dff19bb6692bd2e714ccf9e668d050d144012055cbca73"}, + {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:611052c4bc70432ec770d5d54f64206aa7203a101ec273a0cd82418c86503bb7"}, + {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:50187900d73c1381ba1454cf40308c2bf6f34268518b3f36a9b663ca87e65e36"}, + {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:02615ed8c5ea222323408ceba16c60e99c3f91639b07da6373fb7e6539abc56d"}, + {file = "psutil-5.9.8-cp27-none-win32.whl", hash = "sha256:36f435891adb138ed3c9e58c6af3e2e6ca9ac2f365efe1f9cfef2794e6c93b4e"}, + {file = "psutil-5.9.8-cp27-none-win_amd64.whl", hash = "sha256:bd1184ceb3f87651a67b2708d4c3338e9b10c5df903f2e3776b62303b26cb631"}, + {file = "psutil-5.9.8-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:aee678c8720623dc456fa20659af736241f575d79429a0e5e9cf88ae0605cc81"}, + {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cb6403ce6d8e047495a701dc7c5bd788add903f8986d523e3e20b98b733e421"}, + {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d06016f7f8625a1825ba3732081d77c94589dca78b7a3fc072194851e88461a4"}, + {file = "psutil-5.9.8-cp36-cp36m-win32.whl", hash = "sha256:7d79560ad97af658a0f6adfef8b834b53f64746d45b403f225b85c5c2c140eee"}, + {file = "psutil-5.9.8-cp36-cp36m-win_amd64.whl", hash = "sha256:27cc40c3493bb10de1be4b3f07cae4c010ce715290a5be22b98493509c6299e2"}, + {file = "psutil-5.9.8-cp37-abi3-win32.whl", hash = "sha256:bc56c2a1b0d15aa3eaa5a60c9f3f8e3e565303b465dbf57a1b730e7a2b9844e0"}, + {file = "psutil-5.9.8-cp37-abi3-win_amd64.whl", hash = "sha256:8db4c1b57507eef143a15a6884ca10f7c73876cdf5d51e713151c1236a0e68cf"}, + {file = "psutil-5.9.8-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:d16bbddf0693323b8c6123dd804100241da461e41d6e332fb0ba6058f630f8c8"}, + {file = "psutil-5.9.8.tar.gz", hash = "sha256:6be126e3225486dff286a8fb9a06246a5253f4c7c53b475ea5f5ac934e64194c"}, +] + +[package.extras] +test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +description = "Run a subprocess in a pseudo terminal" +optional = false +python-versions = "*" +files = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] + +[[package]] +name = "pure-eval" +version = "0.2.2" +description = "Safely evaluate AST nodes without side effects" +optional = false +python-versions = "*" +files = [ + {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, + {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, +] + +[package.extras] +tests = ["pytest"] + +[[package]] +name = "pyasn1" +version = "0.5.1" +description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "pyasn1-0.5.1-py2.py3-none-any.whl", hash = "sha256:4439847c58d40b1d0a573d07e3856e95333f1976294494c325775aeca506eb58"}, + {file = "pyasn1-0.5.1.tar.gz", hash = "sha256:6d391a96e59b23130a5cfa74d6fd7f388dbbe26cc8f1edf39fdddf08d9d6676c"}, +] + +[[package]] +name = "pyasn1-modules" +version = "0.3.0" +description = "A collection of ASN.1-based protocols modules" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "pyasn1_modules-0.3.0-py2.py3-none-any.whl", hash = "sha256:d3ccd6ed470d9ffbc716be08bd90efbd44d0734bc9303818f7336070984a162d"}, + {file = "pyasn1_modules-0.3.0.tar.gz", hash = "sha256:5bd01446b736eb9d31512a30d46c1ac3395d676c6f3cafa4c03eb54b9925631c"}, +] + +[package.dependencies] +pyasn1 = ">=0.4.6,<0.6.0" + +[[package]] +name = "pycparser" +version = "2.21" +description = "C parser in Python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] + +[[package]] +name = "pygments" +version = "2.17.2" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.7" +files = [ + {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, + {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, +] + +[package.extras] +plugins = ["importlib-metadata"] +windows-terminal = ["colorama (>=0.4.6)"] + +[[package]] +name = "pyparsing" +version = "3.1.1" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +optional = false +python-versions = ">=3.6.8" +files = [ + {file = "pyparsing-3.1.1-py3-none-any.whl", hash = "sha256:32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb"}, + {file = "pyparsing-3.1.1.tar.gz", hash = "sha256:ede28a1a32462f5a9705e07aea48001a08f7cf81a021585011deba701581a0db"}, +] + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "pywin32" +version = "306" +description = "Python for Window Extensions" +optional = false +python-versions = "*" +files = [ + {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"}, + {file = "pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8"}, + {file = "pywin32-306-cp311-cp311-win32.whl", hash = "sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407"}, + {file = "pywin32-306-cp311-cp311-win_amd64.whl", hash = "sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e"}, + {file = "pywin32-306-cp311-cp311-win_arm64.whl", hash = "sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a"}, + {file = "pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b"}, + {file = "pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e"}, + {file = "pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040"}, + {file = "pywin32-306-cp37-cp37m-win32.whl", hash = "sha256:1c73ea9a0d2283d889001998059f5eaaba3b6238f767c9cf2833b13e6a685f65"}, + {file = "pywin32-306-cp37-cp37m-win_amd64.whl", hash = "sha256:72c5f621542d7bdd4fdb716227be0dd3f8565c11b280be6315b06ace35487d36"}, + {file = "pywin32-306-cp38-cp38-win32.whl", hash = "sha256:e4c092e2589b5cf0d365849e73e02c391c1349958c5ac3e9d5ccb9a28e017b3a"}, + {file = "pywin32-306-cp38-cp38-win_amd64.whl", hash = "sha256:e8ac1ae3601bee6ca9f7cb4b5363bf1c0badb935ef243c4733ff9a393b1690c0"}, + {file = "pywin32-306-cp39-cp39-win32.whl", hash = "sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802"}, + {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"}, +] + +[[package]] +name = "pyzmq" +version = "25.1.2" +description = "Python bindings for 0MQ" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pyzmq-25.1.2-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:e624c789359f1a16f83f35e2c705d07663ff2b4d4479bad35621178d8f0f6ea4"}, + {file = "pyzmq-25.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:49151b0efece79f6a79d41a461d78535356136ee70084a1c22532fc6383f4ad0"}, + {file = "pyzmq-25.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9a5f194cf730f2b24d6af1f833c14c10f41023da46a7f736f48b6d35061e76e"}, + {file = "pyzmq-25.1.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:faf79a302f834d9e8304fafdc11d0d042266667ac45209afa57e5efc998e3872"}, + {file = "pyzmq-25.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f51a7b4ead28d3fca8dda53216314a553b0f7a91ee8fc46a72b402a78c3e43d"}, + {file = "pyzmq-25.1.2-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:0ddd6d71d4ef17ba5a87becf7ddf01b371eaba553c603477679ae817a8d84d75"}, + {file = "pyzmq-25.1.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:246747b88917e4867e2367b005fc8eefbb4a54b7db363d6c92f89d69abfff4b6"}, + {file = "pyzmq-25.1.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:00c48ae2fd81e2a50c3485de1b9d5c7c57cd85dc8ec55683eac16846e57ac979"}, + {file = "pyzmq-25.1.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5a68d491fc20762b630e5db2191dd07ff89834086740f70e978bb2ef2668be08"}, + {file = "pyzmq-25.1.2-cp310-cp310-win32.whl", hash = "sha256:09dfe949e83087da88c4a76767df04b22304a682d6154de2c572625c62ad6886"}, + {file = "pyzmq-25.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:fa99973d2ed20417744fca0073390ad65ce225b546febb0580358e36aa90dba6"}, + {file = "pyzmq-25.1.2-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:82544e0e2d0c1811482d37eef297020a040c32e0687c1f6fc23a75b75db8062c"}, + {file = "pyzmq-25.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:01171fc48542348cd1a360a4b6c3e7d8f46cdcf53a8d40f84db6707a6768acc1"}, + {file = "pyzmq-25.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc69c96735ab501419c432110016329bf0dea8898ce16fab97c6d9106dc0b348"}, + {file = "pyzmq-25.1.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3e124e6b1dd3dfbeb695435dff0e383256655bb18082e094a8dd1f6293114642"}, + {file = "pyzmq-25.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7598d2ba821caa37a0f9d54c25164a4fa351ce019d64d0b44b45540950458840"}, + {file = "pyzmq-25.1.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:d1299d7e964c13607efd148ca1f07dcbf27c3ab9e125d1d0ae1d580a1682399d"}, + {file = "pyzmq-25.1.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4e6f689880d5ad87918430957297c975203a082d9a036cc426648fcbedae769b"}, + {file = "pyzmq-25.1.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cc69949484171cc961e6ecd4a8911b9ce7a0d1f738fcae717177c231bf77437b"}, + {file = "pyzmq-25.1.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9880078f683466b7f567b8624bfc16cad65077be046b6e8abb53bed4eeb82dd3"}, + {file = "pyzmq-25.1.2-cp311-cp311-win32.whl", hash = "sha256:4e5837af3e5aaa99a091302df5ee001149baff06ad22b722d34e30df5f0d9097"}, + {file = "pyzmq-25.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:25c2dbb97d38b5ac9fd15586e048ec5eb1e38f3d47fe7d92167b0c77bb3584e9"}, + {file = "pyzmq-25.1.2-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:11e70516688190e9c2db14fcf93c04192b02d457b582a1f6190b154691b4c93a"}, + {file = "pyzmq-25.1.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:313c3794d650d1fccaaab2df942af9f2c01d6217c846177cfcbc693c7410839e"}, + {file = "pyzmq-25.1.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b3cbba2f47062b85fe0ef9de5b987612140a9ba3a9c6d2543c6dec9f7c2ab27"}, + {file = "pyzmq-25.1.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fc31baa0c32a2ca660784d5af3b9487e13b61b3032cb01a115fce6588e1bed30"}, + {file = "pyzmq-25.1.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02c9087b109070c5ab0b383079fa1b5f797f8d43e9a66c07a4b8b8bdecfd88ee"}, + {file = "pyzmq-25.1.2-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:f8429b17cbb746c3e043cb986328da023657e79d5ed258b711c06a70c2ea7537"}, + {file = "pyzmq-25.1.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5074adeacede5f810b7ef39607ee59d94e948b4fd954495bdb072f8c54558181"}, + {file = "pyzmq-25.1.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:7ae8f354b895cbd85212da245f1a5ad8159e7840e37d78b476bb4f4c3f32a9fe"}, + {file = "pyzmq-25.1.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b264bf2cc96b5bc43ce0e852be995e400376bd87ceb363822e2cb1964fcdc737"}, + {file = "pyzmq-25.1.2-cp312-cp312-win32.whl", hash = "sha256:02bbc1a87b76e04fd780b45e7f695471ae6de747769e540da909173d50ff8e2d"}, + {file = "pyzmq-25.1.2-cp312-cp312-win_amd64.whl", hash = "sha256:ced111c2e81506abd1dc142e6cd7b68dd53747b3b7ae5edbea4578c5eeff96b7"}, + {file = "pyzmq-25.1.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:7b6d09a8962a91151f0976008eb7b29b433a560fde056ec7a3db9ec8f1075438"}, + {file = "pyzmq-25.1.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:967668420f36878a3c9ecb5ab33c9d0ff8d054f9c0233d995a6d25b0e95e1b6b"}, + {file = "pyzmq-25.1.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5edac3f57c7ddaacdb4d40f6ef2f9e299471fc38d112f4bc6d60ab9365445fb0"}, + {file = "pyzmq-25.1.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:0dabfb10ef897f3b7e101cacba1437bd3a5032ee667b7ead32bbcdd1a8422fe7"}, + {file = "pyzmq-25.1.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:2c6441e0398c2baacfe5ba30c937d274cfc2dc5b55e82e3749e333aabffde561"}, + {file = "pyzmq-25.1.2-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:16b726c1f6c2e7625706549f9dbe9b06004dfbec30dbed4bf50cbdfc73e5b32a"}, + {file = "pyzmq-25.1.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:a86c2dd76ef71a773e70551a07318b8e52379f58dafa7ae1e0a4be78efd1ff16"}, + {file = "pyzmq-25.1.2-cp36-cp36m-win32.whl", hash = "sha256:359f7f74b5d3c65dae137f33eb2bcfa7ad9ebefd1cab85c935f063f1dbb245cc"}, + {file = "pyzmq-25.1.2-cp36-cp36m-win_amd64.whl", hash = "sha256:55875492f820d0eb3417b51d96fea549cde77893ae3790fd25491c5754ea2f68"}, + {file = "pyzmq-25.1.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b8c8a419dfb02e91b453615c69568442e897aaf77561ee0064d789705ff37a92"}, + {file = "pyzmq-25.1.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8807c87fa893527ae8a524c15fc505d9950d5e856f03dae5921b5e9aa3b8783b"}, + {file = "pyzmq-25.1.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5e319ed7d6b8f5fad9b76daa0a68497bc6f129858ad956331a5835785761e003"}, + {file = "pyzmq-25.1.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:3c53687dde4d9d473c587ae80cc328e5b102b517447456184b485587ebd18b62"}, + {file = "pyzmq-25.1.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:9add2e5b33d2cd765ad96d5eb734a5e795a0755f7fc49aa04f76d7ddda73fd70"}, + {file = "pyzmq-25.1.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:e690145a8c0c273c28d3b89d6fb32c45e0d9605b2293c10e650265bf5c11cfec"}, + {file = "pyzmq-25.1.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:00a06faa7165634f0cac1abb27e54d7a0b3b44eb9994530b8ec73cf52e15353b"}, + {file = "pyzmq-25.1.2-cp37-cp37m-win32.whl", hash = "sha256:0f97bc2f1f13cb16905a5f3e1fbdf100e712d841482b2237484360f8bc4cb3d7"}, + {file = "pyzmq-25.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6cc0020b74b2e410287e5942e1e10886ff81ac77789eb20bec13f7ae681f0fdd"}, + {file = "pyzmq-25.1.2-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:bef02cfcbded83473bdd86dd8d3729cd82b2e569b75844fb4ea08fee3c26ae41"}, + {file = "pyzmq-25.1.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e10a4b5a4b1192d74853cc71a5e9fd022594573926c2a3a4802020360aa719d8"}, + {file = "pyzmq-25.1.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8c5f80e578427d4695adac6fdf4370c14a2feafdc8cb35549c219b90652536ae"}, + {file = "pyzmq-25.1.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5dde6751e857910c1339890f3524de74007958557593b9e7e8c5f01cd919f8a7"}, + {file = "pyzmq-25.1.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea1608dd169da230a0ad602d5b1ebd39807ac96cae1845c3ceed39af08a5c6df"}, + {file = "pyzmq-25.1.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0f513130c4c361201da9bc69df25a086487250e16b5571ead521b31ff6b02220"}, + {file = "pyzmq-25.1.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:019744b99da30330798bb37df33549d59d380c78e516e3bab9c9b84f87a9592f"}, + {file = "pyzmq-25.1.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2e2713ef44be5d52dd8b8e2023d706bf66cb22072e97fc71b168e01d25192755"}, + {file = "pyzmq-25.1.2-cp38-cp38-win32.whl", hash = "sha256:07cd61a20a535524906595e09344505a9bd46f1da7a07e504b315d41cd42eb07"}, + {file = "pyzmq-25.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb7e49a17fb8c77d3119d41a4523e432eb0c6932187c37deb6fbb00cc3028088"}, + {file = "pyzmq-25.1.2-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:94504ff66f278ab4b7e03e4cba7e7e400cb73bfa9d3d71f58d8972a8dc67e7a6"}, + {file = "pyzmq-25.1.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6dd0d50bbf9dca1d0bdea219ae6b40f713a3fb477c06ca3714f208fd69e16fd8"}, + {file = "pyzmq-25.1.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:004ff469d21e86f0ef0369717351073e0e577428e514c47c8480770d5e24a565"}, + {file = "pyzmq-25.1.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c0b5ca88a8928147b7b1e2dfa09f3b6c256bc1135a1338536cbc9ea13d3b7add"}, + {file = "pyzmq-25.1.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c9a79f1d2495b167119d02be7448bfba57fad2a4207c4f68abc0bab4b92925b"}, + {file = "pyzmq-25.1.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:518efd91c3d8ac9f9b4f7dd0e2b7b8bf1a4fe82a308009016b07eaa48681af82"}, + {file = "pyzmq-25.1.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:1ec23bd7b3a893ae676d0e54ad47d18064e6c5ae1fadc2f195143fb27373f7f6"}, + {file = "pyzmq-25.1.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db36c27baed588a5a8346b971477b718fdc66cf5b80cbfbd914b4d6d355e44e2"}, + {file = "pyzmq-25.1.2-cp39-cp39-win32.whl", hash = "sha256:39b1067f13aba39d794a24761e385e2eddc26295826530a8c7b6c6c341584289"}, + {file = "pyzmq-25.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:8e9f3fabc445d0ce320ea2c59a75fe3ea591fdbdeebec5db6de530dd4b09412e"}, + {file = "pyzmq-25.1.2-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a8c1d566344aee826b74e472e16edae0a02e2a044f14f7c24e123002dcff1c05"}, + {file = "pyzmq-25.1.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:759cfd391a0996345ba94b6a5110fca9c557ad4166d86a6e81ea526c376a01e8"}, + {file = "pyzmq-25.1.2-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c61e346ac34b74028ede1c6b4bcecf649d69b707b3ff9dc0fab453821b04d1e"}, + {file = "pyzmq-25.1.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cb8fc1f8d69b411b8ec0b5f1ffbcaf14c1db95b6bccea21d83610987435f1a4"}, + {file = "pyzmq-25.1.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:3c00c9b7d1ca8165c610437ca0c92e7b5607b2f9076f4eb4b095c85d6e680a1d"}, + {file = "pyzmq-25.1.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:df0c7a16ebb94452d2909b9a7b3337940e9a87a824c4fc1c7c36bb4404cb0cde"}, + {file = "pyzmq-25.1.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:45999e7f7ed5c390f2e87ece7f6c56bf979fb213550229e711e45ecc7d42ccb8"}, + {file = "pyzmq-25.1.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ac170e9e048b40c605358667aca3d94e98f604a18c44bdb4c102e67070f3ac9b"}, + {file = "pyzmq-25.1.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1b604734bec94f05f81b360a272fc824334267426ae9905ff32dc2be433ab96"}, + {file = "pyzmq-25.1.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:a793ac733e3d895d96f865f1806f160696422554e46d30105807fdc9841b9f7d"}, + {file = "pyzmq-25.1.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0806175f2ae5ad4b835ecd87f5f85583316b69f17e97786f7443baaf54b9bb98"}, + {file = "pyzmq-25.1.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ef12e259e7bc317c7597d4f6ef59b97b913e162d83b421dd0db3d6410f17a244"}, + {file = "pyzmq-25.1.2-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea253b368eb41116011add00f8d5726762320b1bda892f744c91997b65754d73"}, + {file = "pyzmq-25.1.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b9b1f2ad6498445a941d9a4fee096d387fee436e45cc660e72e768d3d8ee611"}, + {file = "pyzmq-25.1.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:8b14c75979ce932c53b79976a395cb2a8cd3aaf14aef75e8c2cb55a330b9b49d"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:889370d5174a741a62566c003ee8ddba4b04c3f09a97b8000092b7ca83ec9c49"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a18fff090441a40ffda8a7f4f18f03dc56ae73f148f1832e109f9bffa85df15"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99a6b36f95c98839ad98f8c553d8507644c880cf1e0a57fe5e3a3f3969040882"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4345c9a27f4310afbb9c01750e9461ff33d6fb74cd2456b107525bbeebcb5be3"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3516e0b6224cf6e43e341d56da15fd33bdc37fa0c06af4f029f7d7dfceceabbc"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:146b9b1f29ead41255387fb07be56dc29639262c0f7344f570eecdcd8d683314"}, + {file = "pyzmq-25.1.2.tar.gz", hash = "sha256:93f1aa311e8bb912e34f004cf186407a4e90eec4f0ecc0efd26056bf7eda0226"}, +] + +[package.dependencies] +cffi = {version = "*", markers = "implementation_name == \"pypy\""} + +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "requests-oauthlib" +version = "1.3.1" +description = "OAuthlib authentication support for Requests." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "requests-oauthlib-1.3.1.tar.gz", hash = "sha256:75beac4a47881eeb94d5ea5d6ad31ef88856affe2332b9aafb52c6452ccf0d7a"}, + {file = "requests_oauthlib-1.3.1-py2.py3-none-any.whl", hash = "sha256:2577c501a2fb8d05a304c09d090d6e47c306fef15809d102b327cf8364bddab5"}, +] + +[package.dependencies] +oauthlib = ">=3.0.0" +requests = ">=2.0.0" + +[package.extras] +rsa = ["oauthlib[signedtoken] (>=3.0.0)"] + +[[package]] +name = "rsa" +version = "4.9" +description = "Pure-Python RSA implementation" +optional = false +python-versions = ">=3.6,<4" +files = [ + {file = "rsa-4.9-py3-none-any.whl", hash = "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7"}, + {file = "rsa-4.9.tar.gz", hash = "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21"}, +] + +[package.dependencies] +pyasn1 = ">=0.1.3" + +[[package]] +name = "scipy" +version = "1.4.1" +description = "SciPy: Scientific Library for Python" +optional = false +python-versions = ">=3.5" +files = [ + {file = "scipy-1.4.1-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:c5cac0c0387272ee0e789e94a570ac51deb01c796b37fb2aad1fb13f85e2f97d"}, + {file = "scipy-1.4.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:a144811318853a23d32a07bc7fd5561ff0cac5da643d96ed94a4ffe967d89672"}, + {file = "scipy-1.4.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:71eb180f22c49066f25d6df16f8709f215723317cc951d99e54dc88020ea57be"}, + {file = "scipy-1.4.1-cp35-cp35m-win32.whl", hash = "sha256:770254a280d741dd3436919d47e35712fb081a6ff8bafc0f319382b954b77802"}, + {file = "scipy-1.4.1-cp35-cp35m-win_amd64.whl", hash = "sha256:a1aae70d52d0b074d8121333bc807a485f9f1e6a69742010b33780df2e60cfe0"}, + {file = "scipy-1.4.1-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:bb517872058a1f087c4528e7429b4a44533a902644987e7b2fe35ecc223bc408"}, + {file = "scipy-1.4.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:dba8306f6da99e37ea08c08fef6e274b5bf8567bb094d1dbe86a20e532aca088"}, + {file = "scipy-1.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:386086e2972ed2db17cebf88610aab7d7f6e2c0ca30042dc9a89cf18dcc363fa"}, + {file = "scipy-1.4.1-cp36-cp36m-win32.whl", hash = "sha256:8d3bc3993b8e4be7eade6dcc6fd59a412d96d3a33fa42b0fa45dc9e24495ede9"}, + {file = "scipy-1.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:dc60bb302f48acf6da8ca4444cfa17d52c63c5415302a9ee77b3b21618090521"}, + {file = "scipy-1.4.1-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:787cc50cab3020a865640aba3485e9fbd161d4d3b0d03a967df1a2881320512d"}, + {file = "scipy-1.4.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:0902a620a381f101e184a958459b36d3ee50f5effd186db76e131cbefcbb96f7"}, + {file = "scipy-1.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:00af72998a46c25bdb5824d2b729e7dabec0c765f9deb0b504f928591f5ff9d4"}, + {file = "scipy-1.4.1-cp37-cp37m-win32.whl", hash = "sha256:9508a7c628a165c2c835f2497837bf6ac80eb25291055f56c129df3c943cbaf8"}, + {file = "scipy-1.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a2d6df9eb074af7f08866598e4ef068a2b310d98f87dc23bd1b90ec7bdcec802"}, + {file = "scipy-1.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3092857f36b690a321a662fe5496cb816a7f4eecd875e1d36793d92d3f884073"}, + {file = "scipy-1.4.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:8a07760d5c7f3a92e440ad3aedcc98891e915ce857664282ae3c0220f3301eb6"}, + {file = "scipy-1.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:1e3190466d669d658233e8a583b854f6386dd62d655539b77b3fa25bfb2abb70"}, + {file = "scipy-1.4.1-cp38-cp38-win32.whl", hash = "sha256:cc971a82ea1170e677443108703a2ec9ff0f70752258d0e9f5433d00dda01f59"}, + {file = "scipy-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:2cce3f9847a1a51019e8c5b47620da93950e58ebc611f13e0d11f4980ca5fecb"}, + {file = "scipy-1.4.1.tar.gz", hash = "sha256:dee1bbf3a6c8f73b6b218cb28eed8dd13347ea2f87d572ce19b289d6fd3fbc59"}, +] + +[package.dependencies] +numpy = ">=1.13.3" + +[[package]] +name = "setuptools" +version = "69.0.3" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "setuptools-69.0.3-py3-none-any.whl", hash = "sha256:385eb4edd9c9d5c17540511303e39a147ce2fc04bc55289c322b9e5904fe2c05"}, + {file = "setuptools-69.0.3.tar.gz", hash = "sha256:be1af57fc409f93647f2e8e4573a142ed38724b8cdd389706a867bb4efcf1e78"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "stack-data" +version = "0.6.3" +description = "Extract data from python stack frames and tracebacks for informative displays" +optional = false +python-versions = "*" +files = [ + {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, + {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, +] + +[package.dependencies] +asttokens = ">=2.1.0" +executing = ">=1.2.0" +pure-eval = "*" + +[package.extras] +tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] + +[[package]] +name = "sympy" +version = "1.12" +description = "Computer algebra system (CAS) in Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "sympy-1.12-py3-none-any.whl", hash = "sha256:c3588cd4295d0c0f603d0f2ae780587e64e2efeedb3521e46b9bb1d08d184fa5"}, + {file = "sympy-1.12.tar.gz", hash = "sha256:ebf595c8dac3e0fdc4152c51878b498396ec7f30e7a914d6071e674d49420fb8"}, +] + +[package.dependencies] +mpmath = ">=0.19" + +[[package]] +name = "tensorboard" +version = "2.2.2" +description = "TensorBoard lets you watch Tensors Flow" +optional = false +python-versions = ">= 2.7, != 3.0.*, != 3.1.*" +files = [ + {file = "tensorboard-2.2.2-py3-none-any.whl", hash = "sha256:a3feb73e1221c0a512398ad2cd08570fb082d8a2ba364aa0562543ecbd3659ef"}, +] + +[package.dependencies] +absl-py = ">=0.4" +google-auth = ">=1.6.3,<2" +google-auth-oauthlib = ">=0.4.1,<0.5" +grpcio = ">=1.24.3" +markdown = ">=2.6.8" +numpy = ">=1.12.0" +protobuf = ">=3.6.0" +requests = ">=2.21.0,<3" +setuptools = ">=41.0.0" +six = ">=1.10.0" +tensorboard-plugin-wit = ">=1.6.0" +werkzeug = ">=0.11.15" +wheel = {version = ">=0.26", markers = "python_version >= \"3\""} + +[[package]] +name = "tensorboard-plugin-wit" +version = "1.8.1" +description = "What-If Tool TensorBoard plugin." +optional = false +python-versions = "*" +files = [ + {file = "tensorboard_plugin_wit-1.8.1-py3-none-any.whl", hash = "sha256:ff26bdd583d155aa951ee3b152b3d0cffae8005dc697f72b44a8e8c2a77a8cbe"}, +] + +[[package]] +name = "tensorflow" +version = "2.2.0" +description = "TensorFlow is an open source machine learning framework for everyone." +optional = false +python-versions = "*" +files = [ + {file = "tensorflow-2.2.0-cp35-cp35m-macosx_10_11_x86_64.whl", hash = "sha256:7ed67b47cdf6598a79583de5b57c595493eac2b8b6b3a828f912354716cb8149"}, + {file = "tensorflow-2.2.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:267017724a49c367ca5df536e5f6d3d59643eaed946c82233d6b371e62b5ddc8"}, + {file = "tensorflow-2.2.0-cp35-cp35m-win_amd64.whl", hash = "sha256:572f69d2d0a3d3d83ebfb2c24e6d73d88b85a09f5da796974ef4a0ad83ff7cde"}, + {file = "tensorflow-2.2.0-cp36-cp36m-macosx_10_11_x86_64.whl", hash = "sha256:6735486ee9c3cb0807476e2b36ef7a4cd6c597cb24abf496e66b703360e1e54e"}, + {file = "tensorflow-2.2.0-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:dc5548562308acde7931f040e73d46ae31b398924cf675c3486fd3504e00a4af"}, + {file = "tensorflow-2.2.0-cp36-cp36m-win_amd64.whl", hash = "sha256:3ee8819732d8594913b7d22ded7b22e48a49aa015050d8dd8464eaa010ba2e41"}, + {file = "tensorflow-2.2.0-cp37-cp37m-macosx_10_11_x86_64.whl", hash = "sha256:c332c7fc5cfd54cb86d5da99787c9693e3a924848097c54df1b71ee595a39c93"}, + {file = "tensorflow-2.2.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:f5f27528570fc0d7b90668be10c5dfd90d6ceb8fd2ed62d7d679554acb616bfe"}, + {file = "tensorflow-2.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:68ea22aee9c269a6a0c1061c141f1ec1cd1b1be7569390519c1bf4773f434a40"}, + {file = "tensorflow-2.2.0-cp38-cp38-macosx_10_11_x86_64.whl", hash = "sha256:bbcfb04738099bd46822db91584db74703fdddacf4cd0a76acfc5e086956b5ba"}, + {file = "tensorflow-2.2.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:8f364528f70d895b96a0de36c7c6002644bf4c5df1ee3fbfa775f5cee6571ad7"}, + {file = "tensorflow-2.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:784ab8217e4b0eb4d121c28430c6cdc2ce56c02634a9720d84fb30598b338b8c"}, +] + +[package.dependencies] +absl-py = ">=0.7.0" +astunparse = "1.6.3" +gast = "0.3.3" +google-pasta = ">=0.1.8" +grpcio = ">=1.8.6" +h5py = ">=2.10.0,<2.11.0" +keras-preprocessing = ">=1.1.0" +numpy = ">=1.16.0,<2.0" +opt-einsum = ">=2.3.2" +protobuf = ">=3.8.0" +scipy = {version = "1.4.1", markers = "python_version >= \"3\""} +six = ">=1.12.0" +tensorboard = ">=2.2.0,<2.3.0" +tensorflow-estimator = ">=2.2.0,<2.3.0" +termcolor = ">=1.1.0" +wheel = {version = ">=0.26", markers = "python_version >= \"3\""} +wrapt = ">=1.11.1" + +[[package]] +name = "tensorflow-estimator" +version = "2.2.0" +description = "TensorFlow Estimator." +optional = false +python-versions = "*" +files = [ + {file = "tensorflow_estimator-2.2.0-py2.py3-none-any.whl", hash = "sha256:d09dacdd127f2579cea8d5af21f4a918036b8ae246adc82f26b61f91cc247dc2"}, +] + +[[package]] +name = "termcolor" +version = "2.4.0" +description = "ANSI color formatting for output in terminal" +optional = false +python-versions = ">=3.8" +files = [ + {file = "termcolor-2.4.0-py3-none-any.whl", hash = "sha256:9297c0df9c99445c2412e832e882a7884038a25617c60cea2ad69488d4040d63"}, + {file = "termcolor-2.4.0.tar.gz", hash = "sha256:aab9e56047c8ac41ed798fa36d892a37aca6b3e9159f3e0c24bc64a9b3ac7b7a"}, +] + +[package.extras] +tests = ["pytest", "pytest-cov"] + +[[package]] +name = "torch" +version = "2.1.2" +description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "torch-2.1.2-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:3a871edd6c02dae77ad810335c0833391c1a4ce49af21ea8cf0f6a5d2096eea8"}, + {file = "torch-2.1.2-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:bef6996c27d8f6e92ea4e13a772d89611da0e103b48790de78131e308cf73076"}, + {file = "torch-2.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:0e13034fd5fb323cbbc29e56d0637a3791e50dd589616f40c79adfa36a5a35a1"}, + {file = "torch-2.1.2-cp310-none-macosx_10_9_x86_64.whl", hash = "sha256:d9b535cad0df3d13997dbe8bd68ac33e0e3ae5377639c9881948e40794a61403"}, + {file = "torch-2.1.2-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:f9a55d55af02826ebfbadf4e9b682f0f27766bc33df8236b48d28d705587868f"}, + {file = "torch-2.1.2-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:a6ebbe517097ef289cc7952783588c72de071d4b15ce0f8b285093f0916b1162"}, + {file = "torch-2.1.2-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:8f32ce591616a30304f37a7d5ea80b69ca9e1b94bba7f308184bf616fdaea155"}, + {file = "torch-2.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:e0ee6cf90c8970e05760f898d58f9ac65821c37ffe8b04269ec787aa70962b69"}, + {file = "torch-2.1.2-cp311-none-macosx_10_9_x86_64.whl", hash = "sha256:76d37967c31c99548ad2c4d3f2cf191db48476f2e69b35a0937137116da356a1"}, + {file = "torch-2.1.2-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:e2d83f07b4aac983453ea5bf8f9aa9dacf2278a8d31247f5d9037f37befc60e4"}, + {file = "torch-2.1.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:f41fe0c7ecbf903a568c73486139a75cfab287a0f6c17ed0698fdea7a1e8641d"}, + {file = "torch-2.1.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:e3225f47d50bb66f756fe9196a768055d1c26b02154eb1f770ce47a2578d3aa7"}, + {file = "torch-2.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:33d59cd03cb60106857f6c26b36457793637512998666ee3ce17311f217afe2b"}, + {file = "torch-2.1.2-cp38-none-macosx_10_9_x86_64.whl", hash = "sha256:8e221deccd0def6c2badff6be403e0c53491805ed9915e2c029adbcdb87ab6b5"}, + {file = "torch-2.1.2-cp38-none-macosx_11_0_arm64.whl", hash = "sha256:05b18594f60a911a0c4f023f38a8bda77131fba5fd741bda626e97dcf5a3dd0a"}, + {file = "torch-2.1.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:9ca96253b761e9aaf8e06fb30a66ee301aecbf15bb5a303097de1969077620b6"}, + {file = "torch-2.1.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:d93ba70f67b08c2ae5598ee711cbc546a1bc8102cef938904b8c85c2089a51a0"}, + {file = "torch-2.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:255b50bc0608db177e6a3cc118961d77de7e5105f07816585fa6f191f33a9ff3"}, + {file = "torch-2.1.2-cp39-none-macosx_10_9_x86_64.whl", hash = "sha256:6984cd5057c0c977b3c9757254e989d3f1124f4ce9d07caa6cb637783c71d42a"}, + {file = "torch-2.1.2-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:bc195d7927feabc0eb7c110e457c955ed2ab616f3c7c28439dd4188cf589699f"}, +] + +[package.dependencies] +filelock = "*" +fsspec = "*" +jinja2 = "*" +networkx = "*" +nvidia-cublas-cu12 = {version = "12.1.3.1", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-cupti-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-nvrtc-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-runtime-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cudnn-cu12 = {version = "8.9.2.26", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cufft-cu12 = {version = "11.0.2.54", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-curand-cu12 = {version = "10.3.2.106", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cusolver-cu12 = {version = "11.4.5.107", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cusparse-cu12 = {version = "12.1.0.106", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-nccl-cu12 = {version = "2.18.1", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-nvtx-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +sympy = "*" +triton = {version = "2.1.0", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +typing-extensions = "*" + +[package.extras] +dynamo = ["jinja2"] +opt-einsum = ["opt-einsum (>=3.3)"] + +[[package]] +name = "torchmetrics" +version = "1.3.0.post0" +description = "PyTorch native Metrics" +optional = false +python-versions = ">=3.8" +files = [ + {file = "torchmetrics-1.3.0.post0-py3-none-any.whl", hash = "sha256:9e691ff8e8b752ad191c896f98e4a6dea81fe91dda5b6916e5b7aeaed4c7e1ad"}, + {file = "torchmetrics-1.3.0.post0.tar.gz", hash = "sha256:6d31aeabee964ff539425800164790b8670293f2fade9fcfee6fabbe3f45dd7e"}, +] + +[package.dependencies] +lightning-utilities = ">=0.8.0" +numpy = ">1.20.0" +packaging = ">17.1" +torch = ">=1.10.0" +typing-extensions = {version = "*", markers = "python_version < \"3.9\""} + +[package.extras] +all = ["SciencePlots (>=2.0.0)", "ipadic (>=1.0.0)", "matplotlib (>=3.3.0)", "mecab-ko (>=1.0.0)", "mecab-ko-dic (>=1.0.0)", "mecab-python3 (>=1.0.6)", "mypy (==1.8.0)", "nltk (>=3.6)", "piq (<=0.8.0)", "pycocotools (>2.0.0)", "pystoi (>=0.3.0)", "regex (>=2021.9.24)", "scipy (>1.0.0)", "sentencepiece (>=0.1.98)", "torch (==2.1.2)", "torch-fidelity (<=0.4.0)", "torchaudio (>=0.10.0)", "torchvision (>=0.8)", "tqdm (>=4.41.0)", "transformers (>4.4.0)", "transformers (>=4.10.0)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"] +audio = ["pystoi (>=0.3.0)", "torchaudio (>=0.10.0)"] +detection = ["pycocotools (>2.0.0)", "torchvision (>=0.8)"] +dev = ["SciencePlots (>=2.0.0)", "bert-score (==0.3.13)", "dython (<=0.7.4)", "fairlearn", "fast-bss-eval (>=0.1.0)", "faster-coco-eval (>=1.3.3)", "huggingface-hub (<0.21)", "ipadic (>=1.0.0)", "jiwer (>=2.3.0)", "kornia (>=0.6.7)", "lpips (<=0.1.4)", "matplotlib (>=3.3.0)", "mecab-ko (>=1.0.0)", "mecab-ko-dic (>=1.0.0)", "mecab-python3 (>=1.0.6)", "mir-eval (>=0.6)", "monai (==1.3.0)", "mypy (==1.8.0)", "netcal (>1.0.0)", "nltk (>=3.6)", "numpy (<1.25.0)", "pandas (>1.0.0)", "pandas (>=1.4.0)", "piq (<=0.8.0)", "pycocotools (>2.0.0)", "pystoi (>=0.3.0)", "pytorch-msssim (==1.0.0)", "regex (>=2021.9.24)", "rouge-score (>0.1.0)", "sacrebleu (>=2.3.0)", "scikit-image (>=0.19.0)", "scipy (>1.0.0)", "sentencepiece (>=0.1.98)", "sewar (>=0.4.4)", "statsmodels (>0.13.5)", "torch (==2.1.2)", "torch-complex (<=0.4.3)", "torch-fidelity (<=0.4.0)", "torchaudio (>=0.10.0)", "torchvision (>=0.8)", "tqdm (>=4.41.0)", "transformers (>4.4.0)", "transformers (>=4.10.0)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"] +image = ["scipy (>1.0.0)", "torch-fidelity (<=0.4.0)", "torchvision (>=0.8)"] +multimodal = ["piq (<=0.8.0)", "transformers (>=4.10.0)"] +text = ["ipadic (>=1.0.0)", "mecab-ko (>=1.0.0)", "mecab-ko-dic (>=1.0.0)", "mecab-python3 (>=1.0.6)", "nltk (>=3.6)", "regex (>=2021.9.24)", "sentencepiece (>=0.1.98)", "tqdm (>=4.41.0)", "transformers (>4.4.0)"] +typing = ["mypy (==1.8.0)", "torch (==2.1.2)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"] +visual = ["SciencePlots (>=2.0.0)", "matplotlib (>=3.3.0)"] + +[[package]] +name = "torchvision" +version = "0.16.2" +description = "image and video datasets and models for torch deep learning" +optional = false +python-versions = ">=3.8" +files = [ + {file = "torchvision-0.16.2-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:bc86f2800cb2c0c1a09c581409cdd6bff66e62f103dc83fc63f73346264c3756"}, + {file = "torchvision-0.16.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b024bd412df6d3a007dcebf311a894eb3c5c21e1af80d12be382bbcb097a7c3a"}, + {file = "torchvision-0.16.2-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:e89f10f3c8351972b6e3fda95bc3e479ea8dbfc9dfcfd2c32902dbad4ba5cfc5"}, + {file = "torchvision-0.16.2-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:96c7583700112a410bdc4e1e4f118c429dab49c29c9a31a2cc3579bc9b08b19d"}, + {file = "torchvision-0.16.2-cp310-cp310-win_amd64.whl", hash = "sha256:9f4032ebb3277fb07ff6a9b818d50a547fb8fcd89d958cfd9e773322454bb688"}, + {file = "torchvision-0.16.2-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:67b1aaf8b8cb02ce75dd445f291a27c8036a502f8c0aa76e28c37a0faac2e153"}, + {file = "torchvision-0.16.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bef30d03e1d1c629761f4dca51d3b7d8a0dc0acce6f4068ab2a1634e8e7b64e0"}, + {file = "torchvision-0.16.2-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:e59cc7b2bd1ab5c0ce4ae382e4e37be8f1c174e8b5de2f6a23c170de9ae28495"}, + {file = "torchvision-0.16.2-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:e130b08cc9b3cc73a6c59d6edf032394a322f9579bfd21d14bc2e1d0999aa758"}, + {file = "torchvision-0.16.2-cp311-cp311-win_amd64.whl", hash = "sha256:8692ab1e48807e9604046a6f4beeb67b523294cee1b00828654bb0df2cfce2b2"}, + {file = "torchvision-0.16.2-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:b82732dcf876a37c852772342aa6ee3480c03bb3e2a802ae109fc5f7e28d26e9"}, + {file = "torchvision-0.16.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4b065143d1a720fe8a9077fd4be35d491f98819ec80b3dbbc3ec64d0b707a906"}, + {file = "torchvision-0.16.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:bc5f274e4ecd1b86062063cdf4fd385a1d39d147a3a2685fbbde9ff08bb720b8"}, + {file = "torchvision-0.16.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:335959c43b371c0474af34c1ef2a52efdc7603c45700d29e4475eeb02984170c"}, + {file = "torchvision-0.16.2-cp38-cp38-win_amd64.whl", hash = "sha256:7fd22d86e08eba321af70cad291020c2cdeac069b00ce88b923ca52e06174769"}, + {file = "torchvision-0.16.2-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:56115268b37f0b75364e3654e47ad9abc66ac34c1f9e5e3dfa89a22d6a40017a"}, + {file = "torchvision-0.16.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:82805f8445b094f9d1e770390ee6cc86855e89955e08ce34af2e2274fc0e5c45"}, + {file = "torchvision-0.16.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:3f4bd5fcbc361476e2e78016636ac7d5509e59d9962521f06eb98e6803898182"}, + {file = "torchvision-0.16.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:8199acdf8ab066a28b84a5b6f4d97b58976d9e164b1acc3a9d14fccfaf74bb3a"}, + {file = "torchvision-0.16.2-cp39-cp39-win_amd64.whl", hash = "sha256:41dd4fa9f176d563fe9f1b9adef3b7e582cdfb60ce8c9bc51b094a025be687c9"}, +] + +[package.dependencies] +numpy = "*" +pillow = ">=5.3.0,<8.3.dev0 || >=8.4.dev0" +requests = "*" +torch = "2.1.2" + +[package.extras] +scipy = ["scipy"] + +[[package]] +name = "tornado" +version = "6.4" +description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." +optional = false +python-versions = ">= 3.8" +files = [ + {file = "tornado-6.4-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:02ccefc7d8211e5a7f9e8bc3f9e5b0ad6262ba2fbb683a6443ecc804e5224ce0"}, + {file = "tornado-6.4-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:27787de946a9cffd63ce5814c33f734c627a87072ec7eed71f7fc4417bb16263"}, + {file = "tornado-6.4-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7894c581ecdcf91666a0912f18ce5e757213999e183ebfc2c3fdbf4d5bd764e"}, + {file = "tornado-6.4-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e43bc2e5370a6a8e413e1e1cd0c91bedc5bd62a74a532371042a18ef19e10579"}, + {file = "tornado-6.4-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0251554cdd50b4b44362f73ad5ba7126fc5b2c2895cc62b14a1c2d7ea32f212"}, + {file = "tornado-6.4-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fd03192e287fbd0899dd8f81c6fb9cbbc69194d2074b38f384cb6fa72b80e9c2"}, + {file = "tornado-6.4-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:88b84956273fbd73420e6d4b8d5ccbe913c65d31351b4c004ae362eba06e1f78"}, + {file = "tornado-6.4-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:71ddfc23a0e03ef2df1c1397d859868d158c8276a0603b96cf86892bff58149f"}, + {file = "tornado-6.4-cp38-abi3-win32.whl", hash = "sha256:6f8a6c77900f5ae93d8b4ae1196472d0ccc2775cc1dfdc9e7727889145c45052"}, + {file = "tornado-6.4-cp38-abi3-win_amd64.whl", hash = "sha256:10aeaa8006333433da48dec9fe417877f8bcc21f48dda8d661ae79da357b2a63"}, + {file = "tornado-6.4.tar.gz", hash = "sha256:72291fa6e6bc84e626589f1c29d90a5a6d593ef5ae68052ee2ef000dfd273dee"}, +] + +[[package]] +name = "traitlets" +version = "5.14.1" +description = "Traitlets Python configuration system" +optional = false +python-versions = ">=3.8" +files = [ + {file = "traitlets-5.14.1-py3-none-any.whl", hash = "sha256:2e5a030e6eff91737c643231bfcf04a65b0132078dad75e4936700b213652e74"}, + {file = "traitlets-5.14.1.tar.gz", hash = "sha256:8585105b371a04b8316a43d5ce29c098575c2e477850b62b848b964f1444527e"}, +] + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<7.5)", "pytest-mock", "pytest-mypy-testing"] + +[[package]] +name = "triton" +version = "2.1.0" +description = "A language and compiler for custom Deep Learning operations" +optional = false +python-versions = "*" +files = [ + {file = "triton-2.1.0-0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:66439923a30d5d48399b08a9eae10370f6c261a5ec864a64983bae63152d39d7"}, + {file = "triton-2.1.0-0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:919b06453f0033ea52c13eaf7833de0e57db3178d23d4e04f9fc71c4f2c32bf8"}, + {file = "triton-2.1.0-0-cp37-cp37m-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ae4bb8a91de790e1866405211c4d618379781188f40d5c4c399766914e84cd94"}, + {file = "triton-2.1.0-0-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:39f6fb6bdccb3e98f3152e3fbea724f1aeae7d749412bbb1fa9c441d474eba26"}, + {file = "triton-2.1.0-0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:21544e522c02005a626c8ad63d39bdff2f31d41069592919ef281e964ed26446"}, + {file = "triton-2.1.0-0-pp37-pypy37_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:143582ca31dd89cd982bd3bf53666bab1c7527d41e185f9e3d8a3051ce1b663b"}, + {file = "triton-2.1.0-0-pp38-pypy38_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:82fc5aeeedf6e36be4e4530cbdcba81a09d65c18e02f52dc298696d45721f3bd"}, + {file = "triton-2.1.0-0-pp39-pypy39_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:81a96d110a738ff63339fc892ded095b31bd0d205e3aace262af8400d40b6fa8"}, +] + +[package.dependencies] +filelock = "*" + +[package.extras] +build = ["cmake (>=3.18)", "lit"] +tests = ["autopep8", "flake8", "isort", "numpy", "pytest", "scipy (>=1.7.1)"] +tutorials = ["matplotlib", "pandas", "tabulate"] + +[[package]] +name = "typing-extensions" +version = "4.9.0" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.9.0-py3-none-any.whl", hash = "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd"}, + {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"}, +] + +[[package]] +name = "urllib3" +version = "2.2.0" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.8" +files = [ + {file = "urllib3-2.2.0-py3-none-any.whl", hash = "sha256:ce3711610ddce217e6d113a2732fafad960a03fd0318c91faa79481e35c11224"}, + {file = "urllib3-2.2.0.tar.gz", hash = "sha256:051d961ad0c62a94e50ecf1af379c3aba230c66c710493493560c0c223c49f20"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "wcwidth" +version = "0.2.13" +description = "Measures the displayed width of unicode strings in a terminal" +optional = false +python-versions = "*" +files = [ + {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, + {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, +] + +[[package]] +name = "werkzeug" +version = "3.0.1" +description = "The comprehensive WSGI web application library." +optional = false +python-versions = ">=3.8" +files = [ + {file = "werkzeug-3.0.1-py3-none-any.whl", hash = "sha256:90a285dc0e42ad56b34e696398b8122ee4c681833fb35b8334a095d82c56da10"}, + {file = "werkzeug-3.0.1.tar.gz", hash = "sha256:507e811ecea72b18a404947aded4b3390e1db8f826b494d76550ef45bb3b1dcc"}, +] + +[package.dependencies] +MarkupSafe = ">=2.1.1" + +[package.extras] +watchdog = ["watchdog (>=2.3)"] + +[[package]] +name = "wheel" +version = "0.42.0" +description = "A built-package format for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "wheel-0.42.0-py3-none-any.whl", hash = "sha256:177f9c9b0d45c47873b619f5b650346d632cdc35fb5e4d25058e09c9e581433d"}, + {file = "wheel-0.42.0.tar.gz", hash = "sha256:c45be39f7882c9d34243236f2d63cbd58039e360f85d0913425fbd7ceea617a8"}, +] + +[package.extras] +test = ["pytest (>=6.0.0)", "setuptools (>=65)"] + +[[package]] +name = "wrapt" +version = "1.16.0" +description = "Module for decorators, wrappers and monkey patching." +optional = false +python-versions = ">=3.6" +files = [ + {file = "wrapt-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ffa565331890b90056c01db69c0fe634a776f8019c143a5ae265f9c6bc4bd6d4"}, + {file = "wrapt-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e4fdb9275308292e880dcbeb12546df7f3e0f96c6b41197e0cf37d2826359020"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb2dee3874a500de01c93d5c71415fcaef1d858370d405824783e7a8ef5db440"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a88e6010048489cda82b1326889ec075a8c856c2e6a256072b28eaee3ccf487"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac83a914ebaf589b69f7d0a1277602ff494e21f4c2f743313414378f8f50a4cf"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:73aa7d98215d39b8455f103de64391cb79dfcad601701a3aa0dddacf74911d72"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:807cc8543a477ab7422f1120a217054f958a66ef7314f76dd9e77d3f02cdccd0"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bf5703fdeb350e36885f2875d853ce13172ae281c56e509f4e6eca049bdfb136"}, + {file = "wrapt-1.16.0-cp310-cp310-win32.whl", hash = "sha256:f6b2d0c6703c988d334f297aa5df18c45e97b0af3679bb75059e0e0bd8b1069d"}, + {file = "wrapt-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:decbfa2f618fa8ed81c95ee18a387ff973143c656ef800c9f24fb7e9c16054e2"}, + {file = "wrapt-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09"}, + {file = "wrapt-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43aa59eadec7890d9958748db829df269f0368521ba6dc68cc172d5d03ed8060"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d2efee35b4b0a347e0d99d28e884dfd82797852d62fcd7ebdeee26f3ceb72cf3"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6dcfcffe73710be01d90cae08c3e548d90932d37b39ef83969ae135d36ef3956"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:eb6e651000a19c96f452c85132811d25e9264d836951022d6e81df2fff38337d"}, + {file = "wrapt-1.16.0-cp311-cp311-win32.whl", hash = "sha256:66027d667efe95cc4fa945af59f92c5a02c6f5bb6012bff9e60542c74c75c362"}, + {file = "wrapt-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89"}, + {file = "wrapt-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5eb404d89131ec9b4f748fa5cfb5346802e5ee8836f57d516576e61f304f3b7b"}, + {file = "wrapt-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9090c9e676d5236a6948330e83cb89969f433b1943a558968f659ead07cb3b36"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94265b00870aa407bd0cbcfd536f17ecde43b94fb8d228560a1e9d3041462d73"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2058f813d4f2b5e3a9eb2eb3faf8f1d99b81c3e51aeda4b168406443e8ba809"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98b5e1f498a8ca1858a1cdbffb023bfd954da4e3fa2c0cb5853d40014557248b"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:14d7dc606219cdd7405133c713f2c218d4252f2a469003f8c46bb92d5d095d81"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:49aac49dc4782cb04f58986e81ea0b4768e4ff197b57324dcbd7699c5dfb40b9"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:418abb18146475c310d7a6dc71143d6f7adec5b004ac9ce08dc7a34e2babdc5c"}, + {file = "wrapt-1.16.0-cp312-cp312-win32.whl", hash = "sha256:685f568fa5e627e93f3b52fda002c7ed2fa1800b50ce51f6ed1d572d8ab3e7fc"}, + {file = "wrapt-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8"}, + {file = "wrapt-1.16.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d462f28826f4657968ae51d2181a074dfe03c200d6131690b7d65d55b0f360f8"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a33a747400b94b6d6b8a165e4480264a64a78c8a4c734b62136062e9a248dd39"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3646eefa23daeba62643a58aac816945cadc0afaf21800a1421eeba5f6cfb9c"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ebf019be5c09d400cf7b024aa52b1f3aeebeff51550d007e92c3c1c4afc2a40"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:0d2691979e93d06a95a26257adb7bfd0c93818e89b1406f5a28f36e0d8c1e1fc"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:1acd723ee2a8826f3d53910255643e33673e1d11db84ce5880675954183ec47e"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc57efac2da352a51cc4658878a68d2b1b67dbe9d33c36cb826ca449d80a8465"}, + {file = "wrapt-1.16.0-cp36-cp36m-win32.whl", hash = "sha256:da4813f751142436b075ed7aa012a8778aa43a99f7b36afe9b742d3ed8bdc95e"}, + {file = "wrapt-1.16.0-cp36-cp36m-win_amd64.whl", hash = "sha256:6f6eac2360f2d543cc875a0e5efd413b6cbd483cb3ad7ebf888884a6e0d2e966"}, + {file = "wrapt-1.16.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a0ea261ce52b5952bf669684a251a66df239ec6d441ccb59ec7afa882265d593"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bd2d7ff69a2cac767fbf7a2b206add2e9a210e57947dd7ce03e25d03d2de292"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9159485323798c8dc530a224bd3ffcf76659319ccc7bbd52e01e73bd0241a0c5"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a86373cf37cd7764f2201b76496aba58a52e76dedfaa698ef9e9688bfd9e41cf"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:73870c364c11f03ed072dda68ff7aea6d2a3a5c3fe250d917a429c7432e15228"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b935ae30c6e7400022b50f8d359c03ed233d45b725cfdd299462f41ee5ffba6f"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:db98ad84a55eb09b3c32a96c576476777e87c520a34e2519d3e59c44710c002c"}, + {file = "wrapt-1.16.0-cp37-cp37m-win32.whl", hash = "sha256:9153ed35fc5e4fa3b2fe97bddaa7cbec0ed22412b85bcdaf54aeba92ea37428c"}, + {file = "wrapt-1.16.0-cp37-cp37m-win_amd64.whl", hash = "sha256:66dfbaa7cfa3eb707bbfcd46dab2bc6207b005cbc9caa2199bcbc81d95071a00"}, + {file = "wrapt-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1dd50a2696ff89f57bd8847647a1c363b687d3d796dc30d4dd4a9d1689a706f0"}, + {file = "wrapt-1.16.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:44a2754372e32ab315734c6c73b24351d06e77ffff6ae27d2ecf14cf3d229202"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e9723528b9f787dc59168369e42ae1c3b0d3fadb2f1a71de14531d321ee05b0"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbed418ba5c3dce92619656802cc5355cb679e58d0d89b50f116e4a9d5a9603e"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:941988b89b4fd6b41c3f0bfb20e92bd23746579736b7343283297c4c8cbae68f"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6a42cd0cfa8ffc1915aef79cb4284f6383d8a3e9dcca70c445dcfdd639d51267"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ca9b6085e4f866bd584fb135a041bfc32cab916e69f714a7d1d397f8c4891ca"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5e49454f19ef621089e204f862388d29e6e8d8b162efce05208913dde5b9ad6"}, + {file = "wrapt-1.16.0-cp38-cp38-win32.whl", hash = "sha256:c31f72b1b6624c9d863fc095da460802f43a7c6868c5dda140f51da24fd47d7b"}, + {file = "wrapt-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:490b0ee15c1a55be9c1bd8609b8cecd60e325f0575fc98f50058eae366e01f41"}, + {file = "wrapt-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9b201ae332c3637a42f02d1045e1d0cccfdc41f1f2f801dafbaa7e9b4797bfc2"}, + {file = "wrapt-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2076fad65c6736184e77d7d4729b63a6d1ae0b70da4868adeec40989858eb3fb"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5cd603b575ebceca7da5a3a251e69561bec509e0b46e4993e1cac402b7247b8"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b47cfad9e9bbbed2339081f4e346c93ecd7ab504299403320bf85f7f85c7d46c"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8212564d49c50eb4565e502814f694e240c55551a5f1bc841d4fcaabb0a9b8a"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5f15814a33e42b04e3de432e573aa557f9f0f56458745c2074952f564c50e664"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db2e408d983b0e61e238cf579c09ef7020560441906ca990fe8412153e3b291f"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:edfad1d29c73f9b863ebe7082ae9321374ccb10879eeabc84ba3b69f2579d537"}, + {file = "wrapt-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed867c42c268f876097248e05b6117a65bcd1e63b779e916fe2e33cd6fd0d3c3"}, + {file = "wrapt-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:eb1b046be06b0fce7249f1d025cd359b4b80fc1c3e24ad9eca33e0dcdb2e4a35"}, + {file = "wrapt-1.16.0-py3-none-any.whl", hash = "sha256:6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1"}, + {file = "wrapt-1.16.0.tar.gz", hash = "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d"}, +] + +[[package]] +name = "zipp" +version = "3.17.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +optional = false +python-versions = ">=3.8" +files = [ + {file = "zipp-3.17.0-py3-none-any.whl", hash = "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31"}, + {file = "zipp-3.17.0.tar.gz", hash = "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] + +[metadata] +lock-version = "2.0" +python-versions = "~3.8" +content-hash = "f0c151b5a1b7828884f245737468ebf522dc513340e585a605b7810091fae1ff" diff --git a/ChapterNN/pyproject.toml b/ChapterNN/pyproject.toml new file mode 100644 index 0000000..8302662 --- /dev/null +++ b/ChapterNN/pyproject.toml @@ -0,0 +1,22 @@ +[tool.poetry] +name = "Graph Machine Learning - Chapter NN" +version = "1.0.0" +description = "" +authors = ["Enrico Deusebio "] +packages = [] + +[tool.setuptools] +py-modules = [] + +[tool.poetry.dependencies] +python = "~3.8" +ipykernel = ">=6.0.0" +matplotlib = "==3.2.2" +tensorflow = "<2.5.0" +torch = "^2.1.0" +torchvision = "^0.16.0" +torchmetrics="^1.3.0" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" From 02be5ec19d71d9336f76344c13c2d3edbba7f211 Mon Sep 17 00:00:00 2001 From: Enrico Deusebio Date: Sun, 14 Apr 2024 22:56:52 +0200 Subject: [PATCH 2/9] update with binary accuracy --- ChapterNN/GraphAutoEncoder_SG.ipynb | 193 ++++++++++++++-------------- 1 file changed, 99 insertions(+), 94 deletions(-) diff --git a/ChapterNN/GraphAutoEncoder_SG.ipynb b/ChapterNN/GraphAutoEncoder_SG.ipynb index 226e960..71eee03 100644 --- a/ChapterNN/GraphAutoEncoder_SG.ipynb +++ b/ChapterNN/GraphAutoEncoder_SG.ipynb @@ -18,15 +18,15 @@ "name": "stderr", "output_type": "stream", "text": [ - "2024-03-26 22:24:10.883232: W tensorflow/stream_executor/platform/default/dso_loader.cc:60] Could not load dynamic library 'libcudart.so.11.0'; dlerror: libcudart.so.11.0: cannot open shared object file: No such file or directory\n", - "2024-03-26 22:24:10.883257: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine.\n", - "2024-03-26 22:24:12.512415: I tensorflow/compiler/jit/xla_cpu_device.cc:41] Not creating XLA devices, tf_xla_enable_xla_devices not set\n", - "2024-03-26 22:24:12.512592: W tensorflow/stream_executor/platform/default/dso_loader.cc:60] Could not load dynamic library 'libcuda.so.1'; dlerror: libcuda.so.1: cannot open shared object file: No such file or directory\n", - "2024-03-26 22:24:12.512603: W tensorflow/stream_executor/cuda/cuda_driver.cc:326] failed call to cuInit: UNKNOWN ERROR (303)\n", - "2024-03-26 22:24:12.512618: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:156] kernel driver does not appear to be running on this host (pelican): /proc/driver/nvidia/version does not exist\n", - "2024-03-26 22:24:12.512878: I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: AVX512F\n", + "2024-04-14 20:51:03.017370: W tensorflow/stream_executor/platform/default/dso_loader.cc:60] Could not load dynamic library 'libcudart.so.11.0'; dlerror: libcudart.so.11.0: cannot open shared object file: No such file or directory\n", + "2024-04-14 20:51:03.017425: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine.\n", + "2024-04-14 20:51:05.405762: I tensorflow/compiler/jit/xla_cpu_device.cc:41] Not creating XLA devices, tf_xla_enable_xla_devices not set\n", + "2024-04-14 20:51:05.406097: W tensorflow/stream_executor/platform/default/dso_loader.cc:60] Could not load dynamic library 'libcuda.so.1'; dlerror: libcuda.so.1: cannot open shared object file: No such file or directory\n", + "2024-04-14 20:51:05.406114: W tensorflow/stream_executor/cuda/cuda_driver.cc:326] failed call to cuInit: UNKNOWN ERROR (303)\n", + "2024-04-14 20:51:05.406137: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:156] kernel driver does not appear to be running on this host (ip-172-31-23-216): /proc/driver/nvidia/version does not exist\n", + "2024-04-14 20:51:05.406743: I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: AVX2 FMA\n", "To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.\n", - "2024-03-26 22:24:12.513454: I tensorflow/compiler/jit/xla_gpu_device.cc:99] Not creating XLA devices, tf_xla_enable_xla_devices not set\n" + "2024-04-14 20:51:05.407335: I tensorflow/compiler/jit/xla_gpu_device.cc:99] Not creating XLA devices, tf_xla_enable_xla_devices not set\n" ] } ], @@ -172,30 +172,6 @@ { "cell_type": "code", "execution_count": 9, - "id": "b2d351e5-f815-4513-a05b-34ac571acc96", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[,\n", - " ,\n", - " ,\n", - " ]" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "x_inp" - ] - }, - { - "cell_type": "code", - "execution_count": 10, "id": "be2d54a1-9561-410a-9c8f-54b805450dc3", "metadata": {}, "outputs": [], @@ -205,7 +181,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 10, "id": "38cd0093-ef71-4110-8f59-43e510b86edc", "metadata": {}, "outputs": [], @@ -215,7 +191,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 11, "id": "33ccc882-df0c-40ad-a401-725b3a64aac3", "metadata": {}, "outputs": [], @@ -225,13 +201,13 @@ "model.compile(\n", " optimizer=keras.optimizers.Adam(lr=0.01),\n", " loss=keras.losses.binary_crossentropy,\n", - " metrics=[keras.metrics.Accuracy()],\n", + " metrics=[\"binary_accuracy\"],\n", ")" ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 12, "id": "1dbc5d61-4e11-4ec8-bb06-8b206beb698d", "metadata": {}, "outputs": [ @@ -284,122 +260,128 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 13, "id": "d5760e12-f39a-4ce8-8c9d-9ba8ae61d4ab", "metadata": {}, "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/50\n" + ] + }, { "name": "stderr", "output_type": "stream", "text": [ - "2024-03-26 22:24:31.547943: I tensorflow/compiler/mlir/mlir_graph_optimization_pass.cc:116] None of the MLIR optimization passes are enabled (registered 2)\n", - "2024-03-26 22:24:31.548360: I tensorflow/core/platform/profile_utils/cpu_utils.cc:112] CPU Frequency: 2803200000 Hz\n" + "2024-04-14 20:51:09.165646: I tensorflow/compiler/mlir/mlir_graph_optimization_pass.cc:116] None of the MLIR optimization passes are enabled (registered 2)\n", + "2024-04-14 20:51:09.167036: I tensorflow/core/platform/profile_utils/cpu_utils.cc:112] CPU Frequency: 2199990000 Hz\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "Epoch 1/50\n", - "1/1 [==============================] - 2s 2s/step - loss: 1.6882 - accuracy: 0.0000e+00 - val_loss: 1.7383 - val_accuracy: 0.0000e+00\n", + "1/1 [==============================] - 3s 3s/step - loss: 1.7554 - binary_accuracy: 0.5000 - val_loss: 0.8120 - val_binary_accuracy: 0.6827\n", "Epoch 2/50\n", - "1/1 [==============================] - 0s 141ms/step - loss: 1.8908 - accuracy: 0.0000e+00 - val_loss: 0.5827 - val_accuracy: 0.0000e+00\n", + "1/1 [==============================] - 0s 164ms/step - loss: 1.0576 - binary_accuracy: 0.6531 - val_loss: 0.6350 - val_binary_accuracy: 0.7149\n", "Epoch 3/50\n", - "1/1 [==============================] - 0s 119ms/step - loss: 0.6209 - accuracy: 0.0000e+00 - val_loss: 0.6141 - val_accuracy: 0.0000e+00\n", + "1/1 [==============================] - 0s 153ms/step - loss: 0.7307 - binary_accuracy: 0.7002 - val_loss: 0.5587 - val_binary_accuracy: 0.7269\n", "Epoch 4/50\n", - "1/1 [==============================] - 0s 133ms/step - loss: 0.6203 - accuracy: 0.0000e+00 - val_loss: 0.5935 - val_accuracy: 0.0000e+00\n", + "1/1 [==============================] - 0s 158ms/step - loss: 0.6061 - binary_accuracy: 0.7399 - val_loss: 0.5700 - val_binary_accuracy: 0.6827\n", "Epoch 5/50\n", - "1/1 [==============================] - 0s 118ms/step - loss: 0.5852 - accuracy: 0.0000e+00 - val_loss: 0.5622 - val_accuracy: 0.0000e+00\n", + "1/1 [==============================] - 0s 176ms/step - loss: 0.5755 - binary_accuracy: 0.7251 - val_loss: 0.5588 - val_binary_accuracy: 0.6919\n", "Epoch 6/50\n", - "1/1 [==============================] - 0s 143ms/step - loss: 0.5834 - accuracy: 0.0000e+00 - val_loss: 0.6076 - val_accuracy: 0.0000e+00\n", + "1/1 [==============================] - 0s 163ms/step - loss: 0.5843 - binary_accuracy: 0.7315 - val_loss: 0.5381 - val_binary_accuracy: 0.7149\n", "Epoch 7/50\n", - "1/1 [==============================] - 0s 151ms/step - loss: 0.6186 - accuracy: 0.0000e+00 - val_loss: 0.5933 - val_accuracy: 0.0000e+00\n", + "1/1 [==============================] - 0s 195ms/step - loss: 0.5433 - binary_accuracy: 0.7648 - val_loss: 0.5256 - val_binary_accuracy: 0.7435\n", "Epoch 8/50\n", - "1/1 [==============================] - 0s 151ms/step - loss: 0.6016 - accuracy: 0.0000e+00 - val_loss: 0.5303 - val_accuracy: 0.0000e+00\n", + "1/1 [==============================] - 0s 181ms/step - loss: 0.5151 - binary_accuracy: 0.7906 - val_loss: 0.5259 - val_binary_accuracy: 0.7731\n", "Epoch 9/50\n", - "1/1 [==============================] - 0s 142ms/step - loss: 0.5133 - accuracy: 0.0000e+00 - val_loss: 0.5154 - val_accuracy: 0.0000e+00\n", + "1/1 [==============================] - 0s 149ms/step - loss: 0.5070 - binary_accuracy: 0.8035 - val_loss: 0.5138 - val_binary_accuracy: 0.7851\n", "Epoch 10/50\n", - "1/1 [==============================] - 0s 156ms/step - loss: 0.4653 - accuracy: 0.0000e+00 - val_loss: 0.5081 - val_accuracy: 0.0000e+00\n", + "1/1 [==============================] - 0s 187ms/step - loss: 0.5033 - binary_accuracy: 0.8026 - val_loss: 0.5045 - val_binary_accuracy: 0.7897\n", "Epoch 11/50\n", - "1/1 [==============================] - 0s 143ms/step - loss: 0.4649 - accuracy: 0.0000e+00 - val_loss: 0.4928 - val_accuracy: 0.0000e+00\n", + "1/1 [==============================] - 0s 154ms/step - loss: 0.4682 - binary_accuracy: 0.8293 - val_loss: 0.4867 - val_binary_accuracy: 0.7961\n", "Epoch 12/50\n", - "1/1 [==============================] - 0s 180ms/step - loss: 0.4290 - accuracy: 0.0000e+00 - val_loss: 0.5021 - val_accuracy: 0.0000e+00\n", + "1/1 [==============================] - 0s 162ms/step - loss: 0.4501 - binary_accuracy: 0.8312 - val_loss: 0.4656 - val_binary_accuracy: 0.8026\n", "Epoch 13/50\n", - "1/1 [==============================] - 0s 154ms/step - loss: 0.4325 - accuracy: 0.0000e+00 - val_loss: 0.5347 - val_accuracy: 0.0000e+00\n", + "1/1 [==============================] - 0s 165ms/step - loss: 0.4569 - binary_accuracy: 0.8423 - val_loss: 0.4555 - val_binary_accuracy: 0.7980\n", "Epoch 14/50\n", - "1/1 [==============================] - 0s 148ms/step - loss: 0.4542 - accuracy: 0.0000e+00 - val_loss: 0.5257 - val_accuracy: 0.0000e+00\n", + "1/1 [==============================] - 0s 146ms/step - loss: 0.4403 - binary_accuracy: 0.8441 - val_loss: 0.4614 - val_binary_accuracy: 0.7934\n", "Epoch 15/50\n", - "1/1 [==============================] - 0s 181ms/step - loss: 0.4333 - accuracy: 0.0000e+00 - val_loss: 0.5296 - val_accuracy: 0.0000e+00\n", + "1/1 [==============================] - 0s 159ms/step - loss: 0.4149 - binary_accuracy: 0.8487 - val_loss: 0.4693 - val_binary_accuracy: 0.7878\n", "Epoch 16/50\n", - "1/1 [==============================] - 0s 127ms/step - loss: 0.3915 - accuracy: 0.0000e+00 - val_loss: 0.5193 - val_accuracy: 0.0000e+00\n", + "1/1 [==============================] - 0s 153ms/step - loss: 0.3807 - binary_accuracy: 0.8589 - val_loss: 0.4902 - val_binary_accuracy: 0.7878\n", "Epoch 17/50\n", - "1/1 [==============================] - 0s 153ms/step - loss: 0.4048 - accuracy: 0.0000e+00 - val_loss: 0.5003 - val_accuracy: 0.0000e+00\n", + "1/1 [==============================] - 0s 153ms/step - loss: 0.3621 - binary_accuracy: 0.8681 - val_loss: 0.4975 - val_binary_accuracy: 0.7989\n", "Epoch 18/50\n", - "1/1 [==============================] - 0s 144ms/step - loss: 0.3717 - accuracy: 0.0000e+00 - val_loss: 0.4880 - val_accuracy: 0.0000e+00\n", + "1/1 [==============================] - 0s 169ms/step - loss: 0.3691 - binary_accuracy: 0.8745 - val_loss: 0.5008 - val_binary_accuracy: 0.8090\n", "Epoch 19/50\n", - "1/1 [==============================] - 0s 149ms/step - loss: 0.3609 - accuracy: 0.0000e+00 - val_loss: 0.4703 - val_accuracy: 0.0000e+00\n", + "1/1 [==============================] - 0s 185ms/step - loss: 0.3495 - binary_accuracy: 0.8718 - val_loss: 0.4921 - val_binary_accuracy: 0.8146\n", "Epoch 20/50\n", - "1/1 [==============================] - 0s 163ms/step - loss: 0.3517 - accuracy: 0.0000e+00 - val_loss: 0.4699 - val_accuracy: 0.0000e+00\n", + "1/1 [==============================] - 0s 167ms/step - loss: 0.3623 - binary_accuracy: 0.8875 - val_loss: 0.4966 - val_binary_accuracy: 0.8183\n", "Epoch 21/50\n", - "1/1 [==============================] - 0s 159ms/step - loss: 0.3217 - accuracy: 9.2251e-04 - val_loss: 0.4844 - val_accuracy: 0.0000e+00\n", + "1/1 [==============================] - 0s 179ms/step - loss: 0.3405 - binary_accuracy: 0.8911 - val_loss: 0.4849 - val_binary_accuracy: 0.8210\n", "Epoch 22/50\n", - "1/1 [==============================] - 0s 156ms/step - loss: 0.3142 - accuracy: 0.0000e+00 - val_loss: 0.4799 - val_accuracy: 0.0000e+00\n", + "1/1 [==============================] - 0s 187ms/step - loss: 0.3204 - binary_accuracy: 0.9041 - val_loss: 0.4923 - val_binary_accuracy: 0.8247\n", "Epoch 23/50\n", - "1/1 [==============================] - 0s 140ms/step - loss: 0.3262 - accuracy: 0.0000e+00 - val_loss: 0.4828 - val_accuracy: 0.0000e+00\n", + "1/1 [==============================] - 0s 186ms/step - loss: 0.3239 - binary_accuracy: 0.8884 - val_loss: 0.4892 - val_binary_accuracy: 0.8201\n", "Epoch 24/50\n", - "1/1 [==============================] - 0s 152ms/step - loss: 0.3127 - accuracy: 0.0000e+00 - val_loss: 0.5366 - val_accuracy: 0.0000e+00\n", + "1/1 [==============================] - 0s 179ms/step - loss: 0.2930 - binary_accuracy: 0.9068 - val_loss: 0.4824 - val_binary_accuracy: 0.8127\n", "Epoch 25/50\n", - "1/1 [==============================] - 0s 172ms/step - loss: 0.3006 - accuracy: 0.0000e+00 - val_loss: 0.5472 - val_accuracy: 0.0000e+00\n", + "1/1 [==============================] - 0s 210ms/step - loss: 0.3045 - binary_accuracy: 0.9161 - val_loss: 0.5034 - val_binary_accuracy: 0.8127\n", "Epoch 26/50\n", - "1/1 [==============================] - 0s 154ms/step - loss: 0.2899 - accuracy: 0.0028 - val_loss: 0.5419 - val_accuracy: 0.0018\n", + "1/1 [==============================] - 0s 184ms/step - loss: 0.2860 - binary_accuracy: 0.9013 - val_loss: 0.5075 - val_binary_accuracy: 0.8109\n", "Epoch 27/50\n", - "1/1 [==============================] - 0s 157ms/step - loss: 0.2655 - accuracy: 9.2251e-04 - val_loss: 0.5343 - val_accuracy: 0.0028\n", + "1/1 [==============================] - 0s 169ms/step - loss: 0.2731 - binary_accuracy: 0.9022 - val_loss: 0.5101 - val_binary_accuracy: 0.8072\n", "Epoch 28/50\n", - "1/1 [==============================] - 0s 156ms/step - loss: 0.2753 - accuracy: 9.2251e-04 - val_loss: 0.5077 - val_accuracy: 0.0028\n", + "1/1 [==============================] - 0s 167ms/step - loss: 0.3041 - binary_accuracy: 0.9004 - val_loss: 0.5089 - val_binary_accuracy: 0.8063\n", "Epoch 29/50\n", - "1/1 [==============================] - 0s 145ms/step - loss: 0.2845 - accuracy: 0.0037 - val_loss: 0.5149 - val_accuracy: 0.0037\n", + "1/1 [==============================] - 0s 179ms/step - loss: 0.2890 - binary_accuracy: 0.9041 - val_loss: 0.4757 - val_binary_accuracy: 0.8054\n", "Epoch 30/50\n", - "1/1 [==============================] - 0s 176ms/step - loss: 0.2783 - accuracy: 0.0018 - val_loss: 0.5109 - val_accuracy: 0.0037\n", + "1/1 [==============================] - 0s 166ms/step - loss: 0.2740 - binary_accuracy: 0.8930 - val_loss: 0.4472 - val_binary_accuracy: 0.8164\n", "Epoch 31/50\n", - "1/1 [==============================] - 0s 160ms/step - loss: 0.2469 - accuracy: 0.0018 - val_loss: 0.5074 - val_accuracy: 0.0037\n", + "1/1 [==============================] - 0s 183ms/step - loss: 0.2598 - binary_accuracy: 0.9004 - val_loss: 0.4496 - val_binary_accuracy: 0.8146\n", "Epoch 32/50\n", - "1/1 [==============================] - 0s 156ms/step - loss: 0.2400 - accuracy: 0.0074 - val_loss: 0.4971 - val_accuracy: 0.0046\n", + "1/1 [==============================] - 0s 188ms/step - loss: 0.2497 - binary_accuracy: 0.9170 - val_loss: 0.4689 - val_binary_accuracy: 0.8210\n", "Epoch 33/50\n", - "1/1 [==============================] - 0s 150ms/step - loss: 0.2700 - accuracy: 0.0074 - val_loss: 0.5178 - val_accuracy: 0.0046\n", + "1/1 [==============================] - 0s 195ms/step - loss: 0.2481 - binary_accuracy: 0.9188 - val_loss: 0.5073 - val_binary_accuracy: 0.8247\n", "Epoch 34/50\n", - "1/1 [==============================] - 0s 155ms/step - loss: 0.2267 - accuracy: 0.0046 - val_loss: 0.5466 - val_accuracy: 0.0046\n", + "1/1 [==============================] - 0s 186ms/step - loss: 0.2445 - binary_accuracy: 0.9225 - val_loss: 0.5763 - val_binary_accuracy: 0.8321\n", "Epoch 35/50\n", - "1/1 [==============================] - 0s 158ms/step - loss: 0.2224 - accuracy: 0.0083 - val_loss: 0.5895 - val_accuracy: 0.0055\n", + "1/1 [==============================] - 0s 199ms/step - loss: 0.2731 - binary_accuracy: 0.9142 - val_loss: 0.6100 - val_binary_accuracy: 0.8321\n", "Epoch 36/50\n", - "1/1 [==============================] - 0s 133ms/step - loss: 0.2350 - accuracy: 0.0046 - val_loss: 0.5903 - val_accuracy: 0.0055\n", + "1/1 [==============================] - 0s 184ms/step - loss: 0.2528 - binary_accuracy: 0.9253 - val_loss: 0.6204 - val_binary_accuracy: 0.8358\n", "Epoch 37/50\n", - "1/1 [==============================] - 0s 142ms/step - loss: 0.2131 - accuracy: 9.2251e-04 - val_loss: 0.5747 - val_accuracy: 0.0055\n", + "1/1 [==============================] - 0s 175ms/step - loss: 0.2569 - binary_accuracy: 0.9271 - val_loss: 0.5981 - val_binary_accuracy: 0.8367\n", "Epoch 38/50\n", - "1/1 [==============================] - 0s 141ms/step - loss: 0.2016 - accuracy: 0.0065 - val_loss: 0.5795 - val_accuracy: 0.0055\n", + "1/1 [==============================] - 0s 161ms/step - loss: 0.2356 - binary_accuracy: 0.9290 - val_loss: 0.5581 - val_binary_accuracy: 0.8386\n", "Epoch 39/50\n", - "1/1 [==============================] - 0s 129ms/step - loss: 0.2163 - accuracy: 0.0092 - val_loss: 0.5663 - val_accuracy: 0.0065\n", + "1/1 [==============================] - 0s 166ms/step - loss: 0.2166 - binary_accuracy: 0.9271 - val_loss: 0.5628 - val_binary_accuracy: 0.8330\n", "Epoch 40/50\n", - "1/1 [==============================] - 0s 155ms/step - loss: 0.2023 - accuracy: 0.0092 - val_loss: 0.5394 - val_accuracy: 0.0074\n", + "1/1 [==============================] - 0s 166ms/step - loss: 0.2046 - binary_accuracy: 0.9299 - val_loss: 0.5512 - val_binary_accuracy: 0.8339\n", "Epoch 41/50\n", - "1/1 [==============================] - 0s 149ms/step - loss: 0.1796 - accuracy: 0.0065 - val_loss: 0.5251 - val_accuracy: 0.0083\n", + "1/1 [==============================] - 0s 186ms/step - loss: 0.1790 - binary_accuracy: 0.9419 - val_loss: 0.5503 - val_binary_accuracy: 0.8321\n", "Epoch 42/50\n", - "1/1 [==============================] - 0s 168ms/step - loss: 0.1821 - accuracy: 0.0055 - val_loss: 0.5035 - val_accuracy: 0.0111\n", + "1/1 [==============================] - 0s 154ms/step - loss: 0.1999 - binary_accuracy: 0.9317 - val_loss: 0.5265 - val_binary_accuracy: 0.8293\n", "Epoch 43/50\n", - "1/1 [==============================] - 0s 167ms/step - loss: 0.1816 - accuracy: 0.0129 - val_loss: 0.5020 - val_accuracy: 0.0101\n", + "1/1 [==============================] - 0s 159ms/step - loss: 0.1884 - binary_accuracy: 0.9382 - val_loss: 0.5208 - val_binary_accuracy: 0.8284\n", "Epoch 44/50\n", - "1/1 [==============================] - 0s 169ms/step - loss: 0.1848 - accuracy: 0.0268 - val_loss: 0.5433 - val_accuracy: 0.0101\n", + "1/1 [==============================] - 0s 166ms/step - loss: 0.1580 - binary_accuracy: 0.9539 - val_loss: 0.5126 - val_binary_accuracy: 0.8229\n", "Epoch 45/50\n", - "1/1 [==============================] - 0s 156ms/step - loss: 0.1770 - accuracy: 0.0120 - val_loss: 0.5609 - val_accuracy: 0.0111\n", + "1/1 [==============================] - 0s 158ms/step - loss: 0.1776 - binary_accuracy: 0.9354 - val_loss: 0.5270 - val_binary_accuracy: 0.8220\n", "Epoch 46/50\n", - "1/1 [==============================] - 0s 155ms/step - loss: 0.1797 - accuracy: 0.0240 - val_loss: 0.6091 - val_accuracy: 0.0120\n", + "1/1 [==============================] - 0s 160ms/step - loss: 0.1691 - binary_accuracy: 0.9456 - val_loss: 0.5486 - val_binary_accuracy: 0.8247\n", "Epoch 47/50\n", - "1/1 [==============================] - 0s 222ms/step - loss: 0.1700 - accuracy: 0.0185 - val_loss: 0.6592 - val_accuracy: 0.0111\n", + "1/1 [==============================] - 0s 173ms/step - loss: 0.1720 - binary_accuracy: 0.9446 - val_loss: 0.6430 - val_binary_accuracy: 0.8284\n", "Epoch 48/50\n", - "1/1 [==============================] - 0s 146ms/step - loss: 0.1614 - accuracy: 0.0175 - val_loss: 0.6343 - val_accuracy: 0.0129\n", + "1/1 [==============================] - 0s 173ms/step - loss: 0.1775 - binary_accuracy: 0.9428 - val_loss: 0.6838 - val_binary_accuracy: 0.8312\n", "Epoch 49/50\n", - "1/1 [==============================] - 0s 171ms/step - loss: 0.1621 - accuracy: 0.0175 - val_loss: 0.6362 - val_accuracy: 0.0148\n", + "1/1 [==============================] - 0s 168ms/step - loss: 0.1780 - binary_accuracy: 0.9539 - val_loss: 0.6725 - val_binary_accuracy: 0.8339\n", "Epoch 50/50\n", - "1/1 [==============================] - 0s 140ms/step - loss: 0.1530 - accuracy: 0.0212 - val_loss: 0.6338 - val_accuracy: 0.0138\n" + "1/1 [==============================] - 0s 167ms/step - loss: 0.1728 - binary_accuracy: 0.9428 - val_loss: 0.6536 - val_binary_accuracy: 0.8312\n" ] } ], @@ -409,18 +391,41 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "id": "4d6f0caf-529a-4609-ade3-61715426e4b3", "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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vuMKLVq48847tcTERM3T01MLDw/XJk+erH311Ve21+X+ua7zh9/SNLmXrmD27NladHS05unpqcXGxmqzZ8/WTp48aXu9q+6hTtM0rXOjsRBCCCGEEJeetJEVQgghhBAuSYKsEEIIIYRwSRJkhRBCCCGES5IgK4QQQgghXJIEWSGEEEII4ZIkyAohhBBCCJckQVYIIYQQQrgkCbJCCCGEEMIlSZAVQgjRpkmTJqHT6RxdDCGEuCAJskIIIYQQwiVJkBVCCCGEEC5JgqwQQgghhHBJEmSFEOIS27lzJzfffDNRUVF4enoSHx/Pr3/9a/Ly8lqc19Qm1WQy8eijj9KrVy8MBgN9+vThySefxGw2t3n9DRs2MH36dEJCQjAYDPTv35+HH36YioqKNs8/d+4cjzzyCEOGDMHHx4fAwEBSUlJ4+OGHqa6ubnV+Q0MDzzzzDP369cNgMBAfH89DDz10wfIIIURX0Wmapjm6EEII0V29+eab3HvvvRgMBq677jri4+M5ceIEa9asITIykh07dpCQkACoILtp0yauu+46du/ezc0334yHhwerV6/m1KlTXHvttaxZs6ZFB6wVK1Zw33334evryy233EJERAQbN25k586dDBo0iK1btxIUFGQ7PysriyuvvJLs7GxSU1OZOHEiVquV48eP8/XXX5ORkUFSUlKL8txyyy1s3ryZGTNmEBAQwOeff86JEyf41a9+xT//+c8u/fcUQogWNCGEEJdERkaG5uHhofXp00fLzc1t8drXX3+t6fV6bdasWbZjEydO1ACtX79+2rlz52zHa2trtcsuu0wDtH//+9+246dPn9Y8PT01f39/7ejRoy2uf99992mAds8997Q4PnbsWA3QnnnmmVblLS4u1mpra1uVZ+TIkVppaanteFVVldanTx9Nr9dr+fn5F/mvIoQQnUeaFgghxCXyyiuvUF9fz4svvkhsbGyL1yZPnsx1113H2rVrqaysbPHaY489RnBwsG3fy8uLxYsXA6qGt8nbb7+N2Wxm/vz5DBgwoMU1nn76afz9/fnPf/6DyWQCID09ne3btzN8+HAeeuihVuUNCwvDy8ur1fHnnnuOkJAQ276vry+33XYbVquVPXv2tPefQwghOp27owsghBDd1fbt2wHYtGkTu3fvbvV6UVERFouF48ePk5qaajs+ceLEVudefvnl/7+9+wlJZY3DOP5wShKCIsiiQjCIUFyI1SJaSZuCtlGbaVHLahMRlBAErvoHQa1b1SYQ2uamzKBW5lKqVdBfkiQipDLv4qIcz3TPqXuT28D3A+L4833fmXEhDy/vzKisrEzHx8eFWjwelyR1d3eb2tfU1Mjv92t/f1/JZFI+n09HR0eSpJ6eHv348fF5jI6ODlPN6XRKku7v7z88DgB8NYIsAJRIKpWSJC0uLv623ePjY9Hn+vp6U5vy8nLV1tbq9va2UMtfzNXQ0PDuuPl6Op0uev91dvhPfl5j+/PxSFI2m/3UWADwlVhaAAAlUl1dLenvwJnL5f7x9esM7M3NjWms19dX3d3dqaqqyjT+9fX1u/u/uroqapcPpBcXF//xzADgeyDIAkCJdHZ2SpJisdin+kWjUVPt4OBA2WxWfr+/UMtv7+3tmdqn02klEgnZ7XZ5PJ6i49nZ2dHb29unjgkAviOCLACUyPj4uGw2myYmJnRycmL6/vn5+d2QGwqFitaeZjIZzczMSJKGh4cLdcMwZLPZtLq6qrOzs6IxZmdn9fDwIMMwVFFRIUlqb29XV1eXEomE5ufnTftNpVLKZDL/7mQB4H/AGlkAKBG326319XWNjIzI6/Wqt7dXra2tenl50fn5uWKxmBwOh5LJZFE/j8cjr9druo9sX1+fhoaGCu1cLpdWVlY0NjamtrY2DQwMyOFwKBqN6vDwUG632xRYNzY2FAgEFAwGFQ6HFQgElMvldHp6qkgkomQyWbiPLAB8dwRZACghwzDk8/m0vLys3d1dRSIRVVZWqrGxUf39/RocHDT12draUigU0ubmpi4vL9XU1KS5uTlNT08XPQxBkkZHR9XS0qKlpSWFw2E9PT3J6XRqampKwWDQdKFWc3Oz4vG4FhYWtL29rbW1NdntdrlcLk1OTqqurq6kvwcAfCWe7AUA30T+SVr8LQPAx7BGFgAAAJZEkAUAAIAlEWQBAABgSayRBQAAgCUxIwsAAABLIsgCAADAkgiyAAAAsCSCLAAAACyJIAsAAABLIsgCAADAkgiyAAAAsCSCLAAAACzpL9aQN7ZM8LmoAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from stellargraph.utils import plot_history\n", + "\n", + "plot_history(history)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9e2130e3-6710-4d60-afa2-c0c7254921a5", + "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { - "display_name": "graph-machine-learning-sg", + "display_name": "py3.8", "language": "python", - "name": "graph-machine-learning-sg" + "name": "py3.8" }, "language_info": { "codemirror_mode": { @@ -432,7 +437,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.14" + "version": "3.8.10" } }, "nbformat": 4, From f10316806f0ebfdb443cfabe029f40311414f404 Mon Sep 17 00:00:00 2001 From: Enrico Deusebio Date: Sun, 14 Apr 2024 21:49:01 +0000 Subject: [PATCH 3/9] notebooks renaming --- ...> 01_ImageClassification_TensorFlow.ipynb} | 114 +- ChapterNN/02_Autoencoders.ipynb | 756 ++++++++ ...b => 02_ImageClassification_Pytorch.ipynb} | 188 +- ... => 04_GraphAutoEncoder_PyGeometric.ipynb} | 82 +- .../05_GraphAutoEncoder_StellarGraph.ipynb | 441 +++++ ChapterNN/GAE.ipynb | 1069 ------------ ChapterNN/GraphAutoEncoder_SG.ipynb | 445 ----- ChapterNN/poetry.lock | 1540 +++++++++++++---- ChapterNN/pyproject.toml | 6 +- ChapterNN/requirements.txt | 123 ++ 10 files changed, 2742 insertions(+), 2022 deletions(-) rename ChapterNN/{ImageClassification_TensorFlow.ipynb => 01_ImageClassification_TensorFlow.ipynb} (83%) create mode 100644 ChapterNN/02_Autoencoders.ipynb rename ChapterNN/{ImageClassification_Pytorch.ipynb => 02_ImageClassification_Pytorch.ipynb} (62%) rename ChapterNN/{GraphAutoEncoder_PyG.ipynb => 04_GraphAutoEncoder_PyGeometric.ipynb} (62%) create mode 100644 ChapterNN/05_GraphAutoEncoder_StellarGraph.ipynb delete mode 100644 ChapterNN/GAE.ipynb delete mode 100644 ChapterNN/GraphAutoEncoder_SG.ipynb create mode 100644 ChapterNN/requirements.txt diff --git a/ChapterNN/ImageClassification_TensorFlow.ipynb b/ChapterNN/01_ImageClassification_TensorFlow.ipynb similarity index 83% rename from ChapterNN/ImageClassification_TensorFlow.ipynb rename to ChapterNN/01_ImageClassification_TensorFlow.ipynb index d6b2390..7428163 100644 --- a/ChapterNN/ImageClassification_TensorFlow.ipynb +++ b/ChapterNN/01_ImageClassification_TensorFlow.ipynb @@ -18,8 +18,8 @@ "name": "stderr", "output_type": "stream", "text": [ - "2024-02-04 08:30:12.916869: W tensorflow/stream_executor/platform/default/dso_loader.cc:60] Could not load dynamic library 'libcudart.so.11.0'; dlerror: libcudart.so.11.0: cannot open shared object file: No such file or directory\n", - "2024-02-04 08:30:12.916889: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine.\n" + "2024-04-14 21:18:51.688181: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcudart.so.11.0'; dlerror: libcudart.so.11.0: cannot open shared object file: No such file or directory\n", + "2024-04-14 21:18:51.688228: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine.\n" ] } ], @@ -42,7 +42,25 @@ "execution_count": 2, "id": "1135c9e8-1765-48cc-beb8-25fd6ff363d4", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-labels-idx1-ubyte.gz\n", + "32768/29515 [=================================] - 0s 0us/step\n", + "40960/29515 [=========================================] - 0s 0us/step\n", + "Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-images-idx3-ubyte.gz\n", + "26427392/26421880 [==============================] - 2s 0us/step\n", + "26435584/26421880 [==============================] - 2s 0us/step\n", + "Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-labels-idx1-ubyte.gz\n", + "16384/5148 [===============================================================================================] - 0s 0us/step\n", + "Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-images-idx3-ubyte.gz\n", + "4423680/4422102 [==============================] - 0s 0us/step\n", + "4431872/4422102 [==============================] - 0s 0us/step\n" + ] + } + ], "source": [ "(x_train, y_train), (x_test, y_test) = fashion_mnist.load_data()" ] @@ -141,13 +159,11 @@ "name": "stderr", "output_type": "stream", "text": [ - "2024-02-04 08:30:33.209455: I tensorflow/compiler/jit/xla_cpu_device.cc:41] Not creating XLA devices, tf_xla_enable_xla_devices not set\n", - "2024-02-04 08:30:33.209670: W tensorflow/stream_executor/platform/default/dso_loader.cc:60] Could not load dynamic library 'libcuda.so.1'; dlerror: libcuda.so.1: cannot open shared object file: No such file or directory\n", - "2024-02-04 08:30:33.209689: W tensorflow/stream_executor/cuda/cuda_driver.cc:326] failed call to cuInit: UNKNOWN ERROR (303)\n", - "2024-02-04 08:30:33.209715: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:156] kernel driver does not appear to be running on this host (accde92cbd56): /proc/driver/nvidia/version does not exist\n", - "2024-02-04 08:30:33.210008: I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: AVX512F\n", - "To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.\n", - "2024-02-04 08:30:33.210619: I tensorflow/compiler/jit/xla_gpu_device.cc:99] Not creating XLA devices, tf_xla_enable_xla_devices not set\n" + "2024-04-14 21:19:12.541272: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcuda.so.1'; dlerror: libcuda.so.1: cannot open shared object file: No such file or directory\n", + "2024-04-14 21:19:12.541322: W tensorflow/stream_executor/cuda/cuda_driver.cc:269] failed call to cuInit: UNKNOWN ERROR (303)\n", + "2024-04-14 21:19:12.541343: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:156] kernel driver does not appear to be running on this host (ip-172-31-23-216): /proc/driver/nvidia/version does not exist\n", + "2024-04-14 21:19:12.541627: I tensorflow/core/platform/cpu_feature_guard.cc:151] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: AVX2 FMA\n", + "To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.\n" ] } ], @@ -172,15 +188,16 @@ "text": [ "Model: \"sequential\"\n", "_________________________________________________________________\n", - "Layer (type) Output Shape Param # \n", + " Layer (type) Output Shape Param # \n", "=================================================================\n", - "flatten (Flatten) (None, 784) 0 \n", - "_________________________________________________________________\n", - "dense (Dense) (None, 128) 100480 \n", - "_________________________________________________________________\n", - "dropout (Dropout) (None, 128) 0 \n", - "_________________________________________________________________\n", - "dense_1 (Dense) (None, 10) 1290 \n", + " flatten (Flatten) (None, 784) 0 \n", + " \n", + " dense (Dense) (None, 128) 100480 \n", + " \n", + " dropout (Dropout) (None, 128) 0 \n", + " \n", + " dense_1 (Dense) (None, 10) 1290 \n", + " \n", "=================================================================\n", "Total params: 101,770\n", "Trainable params: 101,770\n", @@ -214,7 +231,7 @@ }, { "cell_type": "code", - "execution_count": 108, + "execution_count": 9, "id": "6427e500-41d2-43f1-b235-622d1d59572e", "metadata": {}, "outputs": [], @@ -226,63 +243,70 @@ }, { "cell_type": "code", - "execution_count": 111, + "execution_count": 10, "id": "ef1fea96-97cc-4c84-bb0c-78417a571575", "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-04-14 21:19:18.418708: W tensorflow/core/framework/cpu_allocator_impl.cc:82] Allocation of 188160000 exceeds 10% of free system memory.\n" + ] + }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/20\n", - "469/469 [==============================] - 6s 13ms/step - loss: 0.1338 - accuracy: 0.9483 - val_loss: 0.3290 - val_accuracy: 0.9069\n", + "469/469 [==============================] - 3s 6ms/step - loss: 0.5974 - accuracy: 0.7922 - val_loss: 0.4619 - val_accuracy: 0.8354\n", "Epoch 2/20\n", - "469/469 [==============================] - 9s 19ms/step - loss: 0.1279 - accuracy: 0.9503 - val_loss: 0.3381 - val_accuracy: 0.9059\n", + "469/469 [==============================] - 2s 5ms/step - loss: 0.4256 - accuracy: 0.8503 - val_loss: 0.4079 - val_accuracy: 0.8564\n", "Epoch 3/20\n", - "469/469 [==============================] - 8s 18ms/step - loss: 0.1281 - accuracy: 0.9510 - val_loss: 0.3348 - val_accuracy: 0.9070\n", + "469/469 [==============================] - 2s 5ms/step - loss: 0.3831 - accuracy: 0.8622 - val_loss: 0.3949 - val_accuracy: 0.8589\n", "Epoch 4/20\n", - "469/469 [==============================] - 9s 18ms/step - loss: 0.1264 - accuracy: 0.9505 - val_loss: 0.3360 - val_accuracy: 0.9065\n", + "469/469 [==============================] - 2s 5ms/step - loss: 0.3565 - accuracy: 0.8713 - val_loss: 0.3679 - val_accuracy: 0.8675\n", "Epoch 5/20\n", - "469/469 [==============================] - 8s 18ms/step - loss: 0.1295 - accuracy: 0.9497 - val_loss: 0.3293 - val_accuracy: 0.9070\n", + "469/469 [==============================] - 2s 5ms/step - loss: 0.3373 - accuracy: 0.8787 - val_loss: 0.3533 - val_accuracy: 0.8756\n", "Epoch 6/20\n", - "469/469 [==============================] - 8s 18ms/step - loss: 0.1278 - accuracy: 0.9509 - val_loss: 0.3315 - val_accuracy: 0.9067\n", + "469/469 [==============================] - 2s 4ms/step - loss: 0.3264 - accuracy: 0.8824 - val_loss: 0.3471 - val_accuracy: 0.8755\n", "Epoch 7/20\n", - "469/469 [==============================] - 15s 33ms/step - loss: 0.1267 - accuracy: 0.9514 - val_loss: 0.3434 - val_accuracy: 0.9075\n", + "469/469 [==============================] - 2s 5ms/step - loss: 0.3156 - accuracy: 0.8847 - val_loss: 0.3462 - val_accuracy: 0.8742\n", "Epoch 8/20\n", - "469/469 [==============================] - 25s 53ms/step - loss: 0.1308 - accuracy: 0.9493 - val_loss: 0.3410 - val_accuracy: 0.9046\n", + "469/469 [==============================] - 2s 5ms/step - loss: 0.3039 - accuracy: 0.8881 - val_loss: 0.3418 - val_accuracy: 0.8776\n", "Epoch 9/20\n", - "469/469 [==============================] - 15s 32ms/step - loss: 0.1283 - accuracy: 0.9504 - val_loss: 0.3438 - val_accuracy: 0.9049\n", + "469/469 [==============================] - 2s 5ms/step - loss: 0.2975 - accuracy: 0.8904 - val_loss: 0.3437 - val_accuracy: 0.8766\n", "Epoch 10/20\n", - "469/469 [==============================] - 8s 18ms/step - loss: 0.1267 - accuracy: 0.9507 - val_loss: 0.3365 - val_accuracy: 0.9059\n", + "469/469 [==============================] - 2s 5ms/step - loss: 0.2886 - accuracy: 0.8944 - val_loss: 0.3321 - val_accuracy: 0.8852\n", "Epoch 11/20\n", - "469/469 [==============================] - 9s 20ms/step - loss: 0.1249 - accuracy: 0.9509 - val_loss: 0.3544 - val_accuracy: 0.9031\n", + "469/469 [==============================] - 2s 5ms/step - loss: 0.2840 - accuracy: 0.8958 - val_loss: 0.3373 - val_accuracy: 0.8789\n", "Epoch 12/20\n", - "469/469 [==============================] - 9s 19ms/step - loss: 0.1267 - accuracy: 0.9502 - val_loss: 0.3500 - val_accuracy: 0.9053\n", + "469/469 [==============================] - 2s 5ms/step - loss: 0.2762 - accuracy: 0.8975 - val_loss: 0.3413 - val_accuracy: 0.8749\n", "Epoch 13/20\n", - "469/469 [==============================] - 8s 18ms/step - loss: 0.1239 - accuracy: 0.9518 - val_loss: 0.3480 - val_accuracy: 0.9033\n", + "469/469 [==============================] - 2s 5ms/step - loss: 0.2675 - accuracy: 0.9010 - val_loss: 0.3305 - val_accuracy: 0.8822\n", "Epoch 14/20\n", - "469/469 [==============================] - 13s 27ms/step - loss: 0.1251 - accuracy: 0.9505 - val_loss: 0.3488 - val_accuracy: 0.9047\n", + "469/469 [==============================] - 2s 5ms/step - loss: 0.2658 - accuracy: 0.9014 - val_loss: 0.3257 - val_accuracy: 0.8829\n", "Epoch 15/20\n", - "469/469 [==============================] - 19s 41ms/step - loss: 0.1256 - accuracy: 0.9505 - val_loss: 0.3564 - val_accuracy: 0.9066\n", + "469/469 [==============================] - 2s 5ms/step - loss: 0.2603 - accuracy: 0.9029 - val_loss: 0.3337 - val_accuracy: 0.8818\n", "Epoch 16/20\n", - "469/469 [==============================] - 14s 30ms/step - loss: 0.1248 - accuracy: 0.9512 - val_loss: 0.3634 - val_accuracy: 0.9043\n", + "469/469 [==============================] - 2s 5ms/step - loss: 0.2556 - accuracy: 0.9053 - val_loss: 0.3338 - val_accuracy: 0.8798\n", "Epoch 17/20\n", - "469/469 [==============================] - 9s 20ms/step - loss: 0.1233 - accuracy: 0.9520 - val_loss: 0.3853 - val_accuracy: 0.9046\n", + "469/469 [==============================] - 2s 5ms/step - loss: 0.2493 - accuracy: 0.9075 - val_loss: 0.3251 - val_accuracy: 0.8866\n", "Epoch 18/20\n", - "469/469 [==============================] - 9s 19ms/step - loss: 0.1253 - accuracy: 0.9510 - val_loss: 0.3647 - val_accuracy: 0.9027\n", + "469/469 [==============================] - 2s 5ms/step - loss: 0.2471 - accuracy: 0.9086 - val_loss: 0.3231 - val_accuracy: 0.8870\n", "Epoch 19/20\n", - "469/469 [==============================] - 9s 19ms/step - loss: 0.1225 - accuracy: 0.9531 - val_loss: 0.3655 - val_accuracy: 0.9060\n", + "469/469 [==============================] - 2s 5ms/step - loss: 0.2415 - accuracy: 0.9089 - val_loss: 0.3322 - val_accuracy: 0.8834\n", "Epoch 20/20\n", - "469/469 [==============================] - 9s 18ms/step - loss: 0.1212 - accuracy: 0.9532 - val_loss: 0.3587 - val_accuracy: 0.9046\n" + "469/469 [==============================] - 3s 5ms/step - loss: 0.2397 - accuracy: 0.9107 - val_loss: 0.3198 - val_accuracy: 0.8876\n" ] }, { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 111, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -338,9 +362,9 @@ ], "metadata": { "kernelspec": { - "display_name": "chap3", + "display_name": "py3.8", "language": "python", - "name": "chap3" + "name": "py3.8" }, "language_info": { "codemirror_mode": { @@ -352,7 +376,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.18" + "version": "3.8.10" } }, "nbformat": 4, diff --git a/ChapterNN/02_Autoencoders.ipynb b/ChapterNN/02_Autoencoders.ipynb new file mode 100644 index 0000000..2fa4827 --- /dev/null +++ b/ChapterNN/02_Autoencoders.ipynb @@ -0,0 +1,756 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# AutoEncoder " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the following we will show you how to create, train and use a simple autoencoder. We will then show you how to make an auto-encoder more robust against noise. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Load Dataset" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-04-14 21:34:38.095565: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcudart.so.11.0'; dlerror: libcudart.so.11.0: cannot open shared object file: No such file or directory\n", + "2024-04-14 21:34:38.095614: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine.\n" + ] + } + ], + "source": [ + "import tensorflow as tf" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "from tensorflow.keras.datasets import fashion_mnist" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "(x_train, y_train), (x_test, y_test) = fashion_mnist.load_data()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(60000, 28, 28)\n", + "(10000, 28, 28)\n" + ] + } + ], + "source": [ + "x_train = x_train.astype('float32') / 255.\n", + "x_test = x_test.astype('float32') / 255.\n", + "\n", + "print (x_train.shape)\n", + "print (x_test.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "from matplotlib import pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "classes = {\n", + " 0:\"T-shirt/top\",\n", + " 1: \"Trouser\",\n", + " 2: \"Pullover\",\n", + " 3: \"Dress\",\n", + " 4: \"Coat\",\n", + " 5: \"Sandal\",\n", + " 6: \"Shirt\",\n", + " 7: \"Sneaker\",\n", + " 8: \"Bag\",\n", + " 9: \"Ankle boot\", \n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "n = 6\n", + "plt.figure(figsize=(20, 4))\n", + "for i in range(n):\n", + " # display original\n", + " ax = plt.subplot(1, n, i + 1)\n", + " plt.imshow(x_test[i])\n", + " plt.title(classes[y_test[i]])\n", + " plt.gray()\n", + " ax.get_xaxis().set_visible(False)\n", + " ax.get_yaxis().set_visible(False)\n", + "\n", + "plt.show()\n", + "# plt.savefig(\"TrainingSet.png\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Create Autoencoder" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "from tensorflow.keras.layers import Flatten, Conv2D, Dropout, MaxPooling2D, UpSampling2D, Input" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "from tensorflow.keras import Model" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-04-14 21:34:46.395498: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcuda.so.1'; dlerror: libcuda.so.1: cannot open shared object file: No such file or directory\n", + "2024-04-14 21:34:46.395547: W tensorflow/stream_executor/cuda/cuda_driver.cc:269] failed call to cuInit: UNKNOWN ERROR (303)\n", + "2024-04-14 21:34:46.395571: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:156] kernel driver does not appear to be running on this host (ip-172-31-23-216): /proc/driver/nvidia/version does not exist\n", + "2024-04-14 21:34:46.395866: I tensorflow/core/platform/cpu_feature_guard.cc:151] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: AVX2 FMA\n", + "To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.\n" + ] + } + ], + "source": [ + "input_img = Input(shape=(28, 28, 1))\n", + "\n", + "x = Conv2D(16, (3, 3), activation='relu', padding='same')(input_img)\n", + "x = MaxPooling2D((2, 2), padding='same')(x)\n", + "x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)\n", + "x = MaxPooling2D((2, 2), padding='same')(x)\n", + "x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)\n", + "encoded = MaxPooling2D((2, 2), padding='same')(x)\n", + "\n", + "# at this point the representation is (4, 4, 8) i.e. 128-dimensional\n", + "\n", + "x = Conv2D(8, (3, 3), activation='relu', padding='same')(encoded)\n", + "x = UpSampling2D((2, 2))(x)\n", + "x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)\n", + "x = UpSampling2D((2, 2))(x)\n", + "x = Conv2D(16, (3, 3), activation='relu')(x)\n", + "x = UpSampling2D((2, 2))(x)\n", + "decoded = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(x)\n", + "\n", + "autoencoder = Model(input_img, decoded)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"model_1\"\n", + "_________________________________________________________________\n", + " Layer (type) Output Shape Param # \n", + "=================================================================\n", + " input_1 (InputLayer) [(None, 28, 28, 1)] 0 \n", + " \n", + " conv2d (Conv2D) (None, 28, 28, 16) 160 \n", + " \n", + " max_pooling2d (MaxPooling2D (None, 14, 14, 16) 0 \n", + " ) \n", + " \n", + " conv2d_1 (Conv2D) (None, 14, 14, 8) 1160 \n", + " \n", + " max_pooling2d_1 (MaxPooling (None, 7, 7, 8) 0 \n", + " 2D) \n", + " \n", + " conv2d_2 (Conv2D) (None, 7, 7, 8) 584 \n", + " \n", + " max_pooling2d_2 (MaxPooling (None, 4, 4, 8) 0 \n", + " 2D) \n", + " \n", + "=================================================================\n", + "Total params: 1,904\n", + "Trainable params: 1,904\n", + "Non-trainable params: 0\n", + "_________________________________________________________________\n" + ] + } + ], + "source": [ + "Model(input_img, encoded).summary()" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "autoencoder.compile(optimizer='adam', loss='binary_crossentropy')" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "from tensorflow.keras.callbacks import TensorBoard" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-04-14 21:34:48.444769: W tensorflow/core/framework/cpu_allocator_impl.cc:82] Allocation of 188160000 exceeds 10% of free system memory.\n", + "2024-04-14 21:34:48.607123: W tensorflow/core/framework/cpu_allocator_impl.cc:82] Allocation of 188160000 exceeds 10% of free system memory.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/50\n", + " 1/469 [..............................] - ETA: 9:54 - loss: 0.6938" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-04-14 21:34:50.031090: W tensorflow/core/framework/cpu_allocator_impl.cc:82] Allocation of 31610880 exceeds 10% of free system memory.\n", + "2024-04-14 21:34:50.031527: W tensorflow/core/framework/cpu_allocator_impl.cc:82] Allocation of 31610880 exceeds 10% of free system memory.\n", + "2024-04-14 21:34:50.088190: W tensorflow/core/framework/cpu_allocator_impl.cc:82] Allocation of 25454592 exceeds 10% of free system memory.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "469/469 [==============================] - 51s 105ms/step - loss: 0.3600 - val_loss: 0.3130\n", + "Epoch 2/50\n", + "469/469 [==============================] - 48s 103ms/step - loss: 0.3062 - val_loss: 0.3044\n", + "Epoch 3/50\n", + "469/469 [==============================] - 50s 106ms/step - loss: 0.3002 - val_loss: 0.3000\n", + "Epoch 4/50\n", + "469/469 [==============================] - 50s 106ms/step - loss: 0.2967 - val_loss: 0.2972\n", + "Epoch 5/50\n", + "469/469 [==============================] - 50s 106ms/step - loss: 0.2943 - val_loss: 0.2951\n", + "Epoch 6/50\n", + "469/469 [==============================] - 50s 106ms/step - loss: 0.2926 - val_loss: 0.2937\n", + "Epoch 7/50\n", + "469/469 [==============================] - 47s 101ms/step - loss: 0.2913 - val_loss: 0.2926\n", + "Epoch 8/50\n", + "469/469 [==============================] - 50s 107ms/step - loss: 0.2902 - val_loss: 0.2917\n", + "Epoch 9/50\n", + "469/469 [==============================] - 49s 104ms/step - loss: 0.2893 - val_loss: 0.2912\n", + "Epoch 10/50\n", + "469/469 [==============================] - 52s 111ms/step - loss: 0.2884 - val_loss: 0.2899\n", + "Epoch 11/50\n", + "469/469 [==============================] - 49s 105ms/step - loss: 0.2876 - val_loss: 0.2892\n", + "Epoch 12/50\n", + "370/469 [======================>.......] - ETA: 9s - loss: 0.2867" + ] + } + ], + "source": [ + "autoencoder.fit(x_train, x_train,\n", + " epochs=50,\n", + " batch_size=128,\n", + " shuffle=True,\n", + " validation_data=(x_test, x_test),\n", + " callbacks=[TensorBoard(log_dir='/tmp/autoencoder')])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "autoencoder.save(\"./data/Batch50.p\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from tensorflow.keras.models import load_model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "autoencoder_first = load_model(\"./data/Batch50.p\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "decoded_imgs = autoencoder_first.predict(x_test)\n", + "\n", + "n = 6\n", + "plt.figure(figsize=(20, 7))\n", + "for i in range(1, n + 1):\n", + " # Display original\n", + " ax = plt.subplot(2, n, i)\n", + " plt.imshow(x_test[i].reshape(28, 28))\n", + " plt.gray()\n", + " ax.get_xaxis().set_visible(False)\n", + " ax.get_yaxis().set_visible(False)\n", + "\n", + " # Display reconstruction\n", + " ax = plt.subplot(2, n, i + n)\n", + " plt.imshow(decoded_imgs[i].reshape(28, 28))\n", + " plt.gray()\n", + " ax.get_xaxis().set_visible(False)\n", + " ax.get_yaxis().set_visible(False)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from tensorflow.keras.optimizers import Adam" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "autoencoder.compile(optimizer=Adam(learning_rate=0.0005), loss='binary_crossentropy')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "autoencoder.fit(x_train, x_train,\n", + " epochs=50,\n", + " batch_size=128,\n", + " shuffle=True,\n", + " validation_data=(x_test, x_test),\n", + " callbacks=[TensorBoard(log_dir='/tmp/autoencoder')])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "autoencoder.save(\"./data/Batch100.p\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "decoded_imgs = autoencoder.predict(x_test)\n", + "\n", + "n = 10\n", + "plt.figure(figsize=(20, 4))\n", + "for i in range(1, n + 1):\n", + " # Display original\n", + " ax = plt.subplot(2, n, i)\n", + " plt.imshow(x_test[i].reshape(28, 28))\n", + " plt.gray()\n", + " ax.get_xaxis().set_visible(False)\n", + " ax.get_yaxis().set_visible(False)\n", + "\n", + " # Display reconstruction\n", + " ax = plt.subplot(2, n, i + n)\n", + " plt.imshow(decoded_imgs[i].reshape(28, 28))\n", + " plt.gray()\n", + " ax.get_xaxis().set_visible(False)\n", + " ax.get_yaxis().set_visible(False)\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Embeddings" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We use the trained layers in order to get the core representation in the middle layer of the autoencoder, and we represent them with the TSNE" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "embeddings = Model(input_img, Flatten()(encoded)).predict(x_test)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.manifold import TSNE\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "tsne = TSNE(n_components=2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "emb2d = tsne.fit_transform(embeddings)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "x,y = np.squeeze(emb2d[:, 0]), np.squeeze(emb2d[:, 1])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from matplotlib.cm import tab10" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "summary = pd.DataFrame({\"x\": x, \"y\": y, \"target\": y_test, \"size\": 10})\n", + "\n", + "plt.figure(figsize=(10,8))\n", + "\n", + "for key, sel in summary.groupby(\"target\"):\n", + " plt.scatter(sel[\"x\"], sel[\"y\"], s=10, color=tab10.colors[key], label=classes[key])\n", + " \n", + "plt.legend()\n", + "plt.axis(\"off\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Denoising" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Introducing noise in order to train more robust auto-encoders" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from tensorflow.keras.layers import GaussianNoise" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "input_img = Input(shape=(28, 28, 1))\n", + "\n", + "noisy_input = GaussianNoise(0.1)(input_img)\n", + "\n", + "x = Conv2D(16, (3, 3), activation='relu', padding='same')(noisy_input)\n", + "x = MaxPooling2D((2, 2), padding='same')(x)\n", + "x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)\n", + "x = MaxPooling2D((2, 2), padding='same')(x)\n", + "x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)\n", + "encoded = MaxPooling2D((2, 2), padding='same')(x)\n", + "\n", + "# at this point the representation is (4, 4, 8) i.e. 128-dimensional\n", + "\n", + "x = Conv2D(8, (3, 3), activation='relu', padding='same')(encoded)\n", + "x = UpSampling2D((2, 2))(x)\n", + "x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)\n", + "x = UpSampling2D((2, 2))(x)\n", + "x = Conv2D(16, (3, 3), activation='relu')(x)\n", + "x = UpSampling2D((2, 2))(x)\n", + "decoded = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(x)\n", + "\n", + "noisy_autoencoder = Model(input_img, decoded)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "noisy_autoencoder.compile(optimizer='adam', loss='binary_crossentropy')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "noisy_autoencoder.fit(x_train, x_train,\n", + " epochs=50,\n", + " batch_size=128,\n", + " shuffle=True,\n", + " validation_data=(x_test, x_test),\n", + " callbacks=[TensorBoard(log_dir='/tmp/noisy_autoencoder')])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "autoencoder.save(\"./data/DenoisingAutoencoder.p\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "noise_factor = 0.1\n", + "x_train_noisy = x_train + noise_factor * np.random.normal(loc=0.0, scale=1.0, size=x_train.shape) \n", + "x_test_noisy = x_test + noise_factor * np.random.normal(loc=0.0, scale=1.0, size=x_test.shape) \n", + "\n", + "x_train_noisy = np.clip(x_train_noisy, 0., 1.)\n", + "x_test_noisy = np.clip(x_test_noisy, 0., 1.)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "decoded_imgs = autoencoder.predict(x_test_noisy)\n", + "\n", + "decoded_imgs_denoised = noisy_autoencoder.predict(x_test_noisy)\n", + "\n", + "n = 6\n", + "plt.figure(figsize=(20, 10))\n", + "for i in range(1, n + 1):\n", + " # Display original\n", + " ax = plt.subplot(3, n, i)\n", + " plt.imshow(x_test_noisy[i].reshape(28, 28))\n", + " plt.gray()\n", + " ax.get_xaxis().set_visible(False)\n", + " if i==0:\n", + " plt.ylabel(\"Original\")\n", + " else:\n", + " ax.get_yaxis().set_visible(False)\n", + " \n", + " # Display reconstruction\n", + " ax = plt.subplot(3, n, i + n)\n", + " plt.imshow(decoded_imgs[i].reshape(28, 28))\n", + " plt.gray()\n", + " ax.get_xaxis().set_visible(False)\n", + " if i==0:\n", + " plt.ylabel(\"Vanilla Autoencoder\")\n", + " else:\n", + " ax.get_yaxis().set_visible(False)\n", + " \n", + " ax = plt.subplot(3, n, i + 2*n)\n", + " plt.imshow(decoded_imgs_denoised[i].reshape(28, 28))\n", + " plt.gray()\n", + " ax.get_xaxis().set_visible(False)\n", + " if i==0:\n", + " plt.ylabel(\"Denoising Autoencoder\")\n", + " else:\n", + " ax.get_yaxis().set_visible(False)\n", + " \n", + " \n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "decoded_imgs = noisy_autoencoder.predict(x_test_noisy)\n", + "\n", + "n = 10\n", + "plt.figure(figsize=(20, 4))\n", + "for i in range(1, n + 1):\n", + " # Display original\n", + " ax = plt.subplot(2, n, i)\n", + " plt.imshow(x_test_noisy[i].reshape(28, 28))\n", + " plt.gray()\n", + " ax.get_xaxis().set_visible(False)\n", + " ax.get_yaxis().set_visible(False)\n", + "\n", + " # Display reconstruction\n", + " ax = plt.subplot(2, n, i + n)\n", + " plt.imshow(decoded_imgs[i].reshape(28, 28))\n", + " plt.gray()\n", + " ax.get_xaxis().set_visible(False)\n", + " ax.get_yaxis().set_visible(False)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "py3.8", + "language": "python", + "name": "py3.8" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/ChapterNN/ImageClassification_Pytorch.ipynb b/ChapterNN/02_ImageClassification_Pytorch.ipynb similarity index 62% rename from ChapterNN/ImageClassification_Pytorch.ipynb rename to ChapterNN/02_ImageClassification_Pytorch.ipynb index fe264cb..b36eb00 100644 --- a/ChapterNN/ImageClassification_Pytorch.ipynb +++ b/ChapterNN/02_ImageClassification_Pytorch.ipynb @@ -15,7 +15,7 @@ "metadata": {}, "outputs": [], "source": [ - "import torch \n", + "import torch\n", "from torchvision import datasets, transforms" ] }, @@ -55,7 +55,95 @@ "execution_count": 4, "id": "3cf93aa8-eaa0-4143-84fc-2c617d402bd2", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/train-images-idx3-ubyte.gz\n", + "Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/train-images-idx3-ubyte.gz to ./data/FashionMNIST/raw/train-images-idx3-ubyte.gz\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|█████████████████████████████████████████████████| 26421880/26421880 [00:00<00:00, 113992555.88it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Extracting ./data/FashionMNIST/raw/train-images-idx3-ubyte.gz to ./data/FashionMNIST/raw\n", + "\n", + "Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/train-labels-idx1-ubyte.gz\n", + "Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/train-labels-idx1-ubyte.gz to ./data/FashionMNIST/raw/train-labels-idx1-ubyte.gz\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|████████████████████████████████████████████████████████| 29515/29515 [00:00<00:00, 65189511.62it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Extracting ./data/FashionMNIST/raw/train-labels-idx1-ubyte.gz to ./data/FashionMNIST/raw\n", + "\n", + "Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/t10k-images-idx3-ubyte.gz\n", + "Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/t10k-images-idx3-ubyte.gz to ./data/FashionMNIST/raw/t10k-images-idx3-ubyte.gz\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|███████████████████████████████████████████████████| 4422102/4422102 [00:00<00:00, 218915787.63it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Extracting ./data/FashionMNIST/raw/t10k-images-idx3-ubyte.gz to ./data/FashionMNIST/raw\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/t10k-labels-idx1-ubyte.gz\n", + "Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/t10k-labels-idx1-ubyte.gz to ./data/FashionMNIST/raw/t10k-labels-idx1-ubyte.gz\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████| 5148/5148 [00:00<00:00, 14589376.35it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Extracting ./data/FashionMNIST/raw/t10k-labels-idx1-ubyte.gz to ./data/FashionMNIST/raw\n", + "\n" + ] + } + ], "source": [ "train_dataset = datasets.FashionMNIST('./data', train=True, download=True, transform=transformer)\n", "test_dataset = datasets.FashionMNIST('./data', train=False, transform=transformer)" @@ -197,66 +285,50 @@ "name": "stdout", "output_type": "stream", "text": [ - "[1, 200] loss: 0.079\n", - "[1, 400] loss: 0.053\n", - "Accuracy on validation set: 0.821399986743927\n", + "[1, 200] loss: 0.080\n", + "[1, 400] loss: 0.052\n", + "Accuracy on validation set: 0.8172999620437622\n", "[2, 200] loss: 0.046\n", "[2, 400] loss: 0.043\n", - "Accuracy on validation set: 0.8398000001907349\n", + "Accuracy on validation set: 0.8406000137329102\n", "[3, 200] loss: 0.040\n", "[3, 400] loss: 0.039\n", - "Accuracy on validation set: 0.8516000509262085\n", + "Accuracy on validation set: 0.8487999439239502\n", "[4, 200] loss: 0.037\n", "[4, 400] loss: 0.037\n", - "Accuracy on validation set: 0.8580999970436096\n", + "Accuracy on validation set: 0.8598999977111816\n", "[5, 200] loss: 0.035\n", - "[5, 400] loss: 0.035\n", - "Accuracy on validation set: 0.8579000234603882\n", - "[6, 200] loss: 0.034\n", - "[6, 400] loss: 0.033\n", - "Accuracy on validation set: 0.8626999855041504\n", - "[7, 200] loss: 0.033\n", - "[7, 400] loss: 0.032\n", - "Accuracy on validation set: 0.868399977684021\n", - "[8, 200] loss: 0.031\n", - "[8, 400] loss: 0.032\n", - "Accuracy on validation set: 0.8671999573707581\n", - "[9, 200] loss: 0.030\n", - "[9, 400] loss: 0.031\n", - "Accuracy on validation set: 0.8715000748634338\n", - "[10, 200] loss: 0.029\n", - "[10, 400] loss: 0.030\n", - "Accuracy on validation set: 0.8714000582695007\n", - "[11, 200] loss: 0.029\n", - "[11, 400] loss: 0.029\n", - "Accuracy on validation set: 0.8713000416755676\n", - "[12, 200] loss: 0.029\n", - "[12, 400] loss: 0.029\n", - "Accuracy on validation set: 0.8747999668121338\n", - "[13, 200] loss: 0.028\n", - "[13, 400] loss: 0.027\n", - "Accuracy on validation set: 0.8760000467300415\n", - "[14, 200] loss: 0.026\n", - "[14, 400] loss: 0.028\n", - "Accuracy on validation set: 0.8710000514984131\n", - "[15, 200] loss: 0.027\n", - "[15, 400] loss: 0.027\n", - "Accuracy on validation set: 0.8751999735832214\n", - "[16, 200] loss: 0.026\n", - "[16, 400] loss: 0.026\n", - "Accuracy on validation set: 0.8816999793052673\n", - "[17, 200] loss: 0.026\n", - "[17, 400] loss: 0.026\n", - "Accuracy on validation set: 0.8746999502182007\n", - "[18, 200] loss: 0.025\n", - "[18, 400] loss: 0.025\n", - "Accuracy on validation set: 0.8778001070022583\n", - "[19, 200] loss: 0.025\n", - "[19, 400] loss: 0.025\n", - "Accuracy on validation set: 0.8755999803543091\n", - "[20, 200] loss: 0.024\n", - "[20, 400] loss: 0.025\n", - "Accuracy on validation set: 0.8791000247001648\n" + "[5, 400] loss: 0.034\n", + "Accuracy on validation set: 0.8646999597549438\n", + "[6, 200] loss: 0.033\n", + "[6, 400] loss: 0.034\n", + "Accuracy on validation set: 0.8651000261306763\n", + "[7, 200] loss: 0.032\n", + "[7, 400] loss: 0.033\n", + "Accuracy on validation set: 0.8674999475479126\n", + "[8, 200] loss: 0.031\n" + ] + }, + { + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[12], line 8\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m epoch \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mrange\u001b[39m(\u001b[38;5;241m20\u001b[39m): \u001b[38;5;66;03m# loop over the dataset multiple times\u001b[39;00m\n\u001b[1;32m 7\u001b[0m running_loss \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m0.0\u001b[39m\n\u001b[0;32m----> 8\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m i, data \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28menumerate\u001b[39m(trainloader, \u001b[38;5;241m0\u001b[39m):\n\u001b[1;32m 9\u001b[0m \u001b[38;5;66;03m# get the inputs; data is a list of [inputs, labels]\u001b[39;00m\n\u001b[1;32m 10\u001b[0m inputs, labels \u001b[38;5;241m=\u001b[39m data\n\u001b[1;32m 12\u001b[0m \u001b[38;5;66;03m# zero the parameter gradients\u001b[39;00m\n", + "File \u001b[0;32m~/.pyenv/versions/py3.8/lib/python3.8/site-packages/torch/utils/data/dataloader.py:630\u001b[0m, in \u001b[0;36m_BaseDataLoaderIter.__next__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 627\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_sampler_iter \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 628\u001b[0m \u001b[38;5;66;03m# TODO(https://github.com/pytorch/pytorch/issues/76750)\u001b[39;00m\n\u001b[1;32m 629\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_reset() \u001b[38;5;66;03m# type: ignore[call-arg]\u001b[39;00m\n\u001b[0;32m--> 630\u001b[0m data \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_next_data\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 631\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_num_yielded \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;241m1\u001b[39m\n\u001b[1;32m 632\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_dataset_kind \u001b[38;5;241m==\u001b[39m _DatasetKind\u001b[38;5;241m.\u001b[39mIterable \u001b[38;5;129;01mand\u001b[39;00m \\\n\u001b[1;32m 633\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_IterableDataset_len_called \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m \\\n\u001b[1;32m 634\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_num_yielded \u001b[38;5;241m>\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_IterableDataset_len_called:\n", + "File \u001b[0;32m~/.pyenv/versions/py3.8/lib/python3.8/site-packages/torch/utils/data/dataloader.py:674\u001b[0m, in \u001b[0;36m_SingleProcessDataLoaderIter._next_data\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 672\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_next_data\u001b[39m(\u001b[38;5;28mself\u001b[39m):\n\u001b[1;32m 673\u001b[0m index \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_next_index() \u001b[38;5;66;03m# may raise StopIteration\u001b[39;00m\n\u001b[0;32m--> 674\u001b[0m data \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_dataset_fetcher\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfetch\u001b[49m\u001b[43m(\u001b[49m\u001b[43mindex\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;66;03m# may raise StopIteration\u001b[39;00m\n\u001b[1;32m 675\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_pin_memory:\n\u001b[1;32m 676\u001b[0m data \u001b[38;5;241m=\u001b[39m _utils\u001b[38;5;241m.\u001b[39mpin_memory\u001b[38;5;241m.\u001b[39mpin_memory(data, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_pin_memory_device)\n", + "File \u001b[0;32m~/.pyenv/versions/py3.8/lib/python3.8/site-packages/torch/utils/data/_utils/fetch.py:51\u001b[0m, in \u001b[0;36m_MapDatasetFetcher.fetch\u001b[0;34m(self, possibly_batched_index)\u001b[0m\n\u001b[1;32m 49\u001b[0m data \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdataset\u001b[38;5;241m.\u001b[39m__getitems__(possibly_batched_index)\n\u001b[1;32m 50\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m---> 51\u001b[0m data \u001b[38;5;241m=\u001b[39m [\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdataset[idx] \u001b[38;5;28;01mfor\u001b[39;00m idx \u001b[38;5;129;01min\u001b[39;00m possibly_batched_index]\n\u001b[1;32m 52\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 53\u001b[0m data \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdataset[possibly_batched_index]\n", + "File \u001b[0;32m~/.pyenv/versions/py3.8/lib/python3.8/site-packages/torch/utils/data/_utils/fetch.py:51\u001b[0m, in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 49\u001b[0m data \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdataset\u001b[38;5;241m.\u001b[39m__getitems__(possibly_batched_index)\n\u001b[1;32m 50\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m---> 51\u001b[0m data \u001b[38;5;241m=\u001b[39m [\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdataset\u001b[49m\u001b[43m[\u001b[49m\u001b[43midx\u001b[49m\u001b[43m]\u001b[49m \u001b[38;5;28;01mfor\u001b[39;00m idx \u001b[38;5;129;01min\u001b[39;00m possibly_batched_index]\n\u001b[1;32m 52\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 53\u001b[0m data \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdataset[possibly_batched_index]\n", + "File \u001b[0;32m~/.pyenv/versions/py3.8/lib/python3.8/site-packages/torchvision/datasets/mnist.py:145\u001b[0m, in \u001b[0;36mMNIST.__getitem__\u001b[0;34m(self, index)\u001b[0m\n\u001b[1;32m 142\u001b[0m img \u001b[38;5;241m=\u001b[39m Image\u001b[38;5;241m.\u001b[39mfromarray(img\u001b[38;5;241m.\u001b[39mnumpy(), mode\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mL\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 144\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtransform \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m--> 145\u001b[0m img \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtransform\u001b[49m\u001b[43m(\u001b[49m\u001b[43mimg\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 147\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtarget_transform \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 148\u001b[0m target \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtarget_transform(target)\n", + "File \u001b[0;32m~/.pyenv/versions/py3.8/lib/python3.8/site-packages/torchvision/transforms/transforms.py:95\u001b[0m, in \u001b[0;36mCompose.__call__\u001b[0;34m(self, img)\u001b[0m\n\u001b[1;32m 93\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__call__\u001b[39m(\u001b[38;5;28mself\u001b[39m, img):\n\u001b[1;32m 94\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m t \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtransforms:\n\u001b[0;32m---> 95\u001b[0m img \u001b[38;5;241m=\u001b[39m \u001b[43mt\u001b[49m\u001b[43m(\u001b[49m\u001b[43mimg\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 96\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m img\n", + "File \u001b[0;32m~/.pyenv/versions/py3.8/lib/python3.8/site-packages/torchvision/transforms/transforms.py:137\u001b[0m, in \u001b[0;36mToTensor.__call__\u001b[0;34m(self, pic)\u001b[0m\n\u001b[1;32m 129\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__call__\u001b[39m(\u001b[38;5;28mself\u001b[39m, pic):\n\u001b[1;32m 130\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 131\u001b[0m \u001b[38;5;124;03m Args:\u001b[39;00m\n\u001b[1;32m 132\u001b[0m \u001b[38;5;124;03m pic (PIL Image or numpy.ndarray): Image to be converted to tensor.\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 135\u001b[0m \u001b[38;5;124;03m Tensor: Converted image.\u001b[39;00m\n\u001b[1;32m 136\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m--> 137\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mF\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mto_tensor\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpic\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/.pyenv/versions/py3.8/lib/python3.8/site-packages/torchvision/transforms/functional.py:166\u001b[0m, in \u001b[0;36mto_tensor\u001b[0;34m(pic)\u001b[0m\n\u001b[1;32m 164\u001b[0m \u001b[38;5;66;03m# handle PIL Image\u001b[39;00m\n\u001b[1;32m 165\u001b[0m mode_to_nptype \u001b[38;5;241m=\u001b[39m {\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mI\u001b[39m\u001b[38;5;124m\"\u001b[39m: np\u001b[38;5;241m.\u001b[39mint32, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mI;16\u001b[39m\u001b[38;5;124m\"\u001b[39m: np\u001b[38;5;241m.\u001b[39mint16, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mF\u001b[39m\u001b[38;5;124m\"\u001b[39m: np\u001b[38;5;241m.\u001b[39mfloat32}\n\u001b[0;32m--> 166\u001b[0m img \u001b[38;5;241m=\u001b[39m torch\u001b[38;5;241m.\u001b[39mfrom_numpy(\u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43marray\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpic\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmode_to_nptype\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpic\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmode\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43muint8\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcopy\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m)\n\u001b[1;32m 168\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m pic\u001b[38;5;241m.\u001b[39mmode \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m1\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[1;32m 169\u001b[0m img \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m255\u001b[39m \u001b[38;5;241m*\u001b[39m img\n", + "File \u001b[0;32m~/.pyenv/versions/py3.8/lib/python3.8/site-packages/PIL/Image.py:708\u001b[0m, in \u001b[0;36mImage.__array_interface__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 706\u001b[0m warnings\u001b[38;5;241m.\u001b[39mwarn(\u001b[38;5;28mstr\u001b[39m(e))\n\u001b[1;32m 707\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m\n\u001b[0;32m--> 708\u001b[0m new[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshape\u001b[39m\u001b[38;5;124m\"\u001b[39m], new[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtypestr\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[43m_conv_type_shape\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 709\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m new\n", + "File \u001b[0;32m~/.pyenv/versions/py3.8/lib/python3.8/site-packages/PIL/Image.py:244\u001b[0m, in \u001b[0;36m_conv_type_shape\u001b[0;34m(im)\u001b[0m\n\u001b[1;32m 242\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_conv_type_shape\u001b[39m(im):\n\u001b[1;32m 243\u001b[0m m \u001b[38;5;241m=\u001b[39m ImageMode\u001b[38;5;241m.\u001b[39mgetmode(im\u001b[38;5;241m.\u001b[39mmode)\n\u001b[0;32m--> 244\u001b[0m shape \u001b[38;5;241m=\u001b[39m (\u001b[43mim\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mheight\u001b[49m, im\u001b[38;5;241m.\u001b[39mwidth)\n\u001b[1;32m 245\u001b[0m extra \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mlen\u001b[39m(m\u001b[38;5;241m.\u001b[39mbands)\n\u001b[1;32m 246\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m extra \u001b[38;5;241m!=\u001b[39m \u001b[38;5;241m1\u001b[39m:\n", + "File \u001b[0;32m~/.pyenv/versions/py3.8/lib/python3.8/site-packages/PIL/Image.py:517\u001b[0m, in \u001b[0;36mImage.height\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 515\u001b[0m \u001b[38;5;129m@property\u001b[39m\n\u001b[1;32m 516\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mheight\u001b[39m(\u001b[38;5;28mself\u001b[39m) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m \u001b[38;5;28mint\u001b[39m:\n\u001b[0;32m--> 517\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msize\u001b[49m[\u001b[38;5;241m1\u001b[39m]\n", + "\u001b[0;31mKeyboardInterrupt\u001b[0m: " ] } ], @@ -304,9 +376,9 @@ ], "metadata": { "kernelspec": { - "display_name": "graph-machine-learning", + "display_name": "py3.8", "language": "python", - "name": "graph-machine-learning" + "name": "py3.8" }, "language_info": { "codemirror_mode": { @@ -318,7 +390,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.14" + "version": "3.8.10" } }, "nbformat": 4, diff --git a/ChapterNN/GraphAutoEncoder_PyG.ipynb b/ChapterNN/04_GraphAutoEncoder_PyGeometric.ipynb similarity index 62% rename from ChapterNN/GraphAutoEncoder_PyG.ipynb rename to ChapterNN/04_GraphAutoEncoder_PyGeometric.ipynb index 45d684f..f341601 100644 --- a/ChapterNN/GraphAutoEncoder_PyG.ipynb +++ b/ChapterNN/04_GraphAutoEncoder_PyGeometric.ipynb @@ -49,24 +49,42 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 4, "id": "409d5939-8d16-4db9-a17f-c5cab6a2d4aa", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Downloading https://github.com/kimiyoung/planetoid/raw/master/data/ind.cora.x\n", + "Downloading https://github.com/kimiyoung/planetoid/raw/master/data/ind.cora.tx\n", + "Downloading https://github.com/kimiyoung/planetoid/raw/master/data/ind.cora.allx\n", + "Downloading https://github.com/kimiyoung/planetoid/raw/master/data/ind.cora.y\n", + "Downloading https://github.com/kimiyoung/planetoid/raw/master/data/ind.cora.ty\n", + "Downloading https://github.com/kimiyoung/planetoid/raw/master/data/ind.cora.ally\n", + "Downloading https://github.com/kimiyoung/planetoid/raw/master/data/ind.cora.graph\n", + "Downloading https://github.com/kimiyoung/planetoid/raw/master/data/ind.cora.test.index\n", + "Processing...\n", + "Done!\n" + ] + } + ], "source": [ "transform = T.Compose([\n", " T.NormalizeFeatures(),\n", " T.RandomLinkSplit(num_val=0., num_test=0.1, is_undirected=True,\n", " split_labels=True, add_negative_train_samples=False),\n", "])\n", - "path = os.path.join(\"/home/deusebio/Personal/graph_machine_learning/data\", 'data')\n", + "# path = os.path.join(\"/home/deusebio/Personal/graph_machine_learning/data\", 'data')\n", + "path = os.path.join(os.getcwd(), 'data')\n", "dataset = Planetoid(path, DATASET_NAME, transform=transform)\n", "train_data, val_data, test_data = dataset[0]" ] }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 5, "id": "4fe46bed-054c-4f52-a4da-ed3728a3f41c", "metadata": {}, "outputs": [ @@ -88,7 +106,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "id": "dedf968d-6e87-451a-aaa2-972ce21f4aca", "metadata": {}, "outputs": [], @@ -106,7 +124,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "id": "40de5839-fdf8-4935-b2d8-f46adb5ab4eb", "metadata": {}, "outputs": [], @@ -117,7 +135,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "id": "b9240419-00b2-4f01-885a-169814989d21", "metadata": {}, "outputs": [], @@ -127,7 +145,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 9, "id": "baa87287-e068-463f-9cb5-be032a2273ac", "metadata": {}, "outputs": [], @@ -138,7 +156,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 10, "id": "da9b26c1-c070-4e98-a0a1-26783b0ed7d7", "metadata": {}, "outputs": [ @@ -146,26 +164,26 @@ "name": "stdout", "output_type": "stream", "text": [ - "Performance on validation set => AUC: 0.7277003841874633 AP: 0.751380623617229\n", - "Performance on validation set => AUC: 0.7216693251334934 AP: 0.7450836500826495\n", - "Performance on validation set => AUC: 0.7201516586312556 AP: 0.7438195305144295\n", - "Performance on validation set => AUC: 0.7177356343773966 AP: 0.7446658389934638\n", - "Performance on validation set => AUC: 0.7144770621721173 AP: 0.7463040868711021\n", - "Performance on validation set => AUC: 0.7097044240968714 AP: 0.7458711201460098\n", - "Performance on validation set => AUC: 0.7041108418638313 AP: 0.7440737868933852\n", - "Performance on validation set => AUC: 0.7006038260318512 AP: 0.7420508132883922\n", - "Performance on validation set => AUC: 0.699102362374833 AP: 0.7411833809196392\n", - "Performance on validation set => AUC: 0.6959626110344977 AP: 0.739441047817806\n", - "Performance on validation set => AUC: 0.6908227084676068 AP: 0.7366122214404001\n", - "Performance on validation set => AUC: 0.6845666098966978 AP: 0.7315068175571388\n", - "Performance on validation set => AUC: 0.6838590856554411 AP: 0.7286263298388811\n", - "Performance on validation set => AUC: 0.6893410482880794 AP: 0.7285815671202786\n", - "Performance on validation set => AUC: 0.6931433159662838 AP: 0.7282093017037912\n", - "Performance on validation set => AUC: 0.694403537261143 AP: 0.7276754550495566\n", - "Performance on validation set => AUC: 0.7028074129817196 AP: 0.7291966869008787\n", - "Performance on validation set => AUC: 0.720871785085461 AP: 0.7368339098384399\n", - "Performance on validation set => AUC: 0.7357676007906988 AP: 0.7463957844698095\n", - "Performance on validation set => AUC: 0.7428572457323506 AP: 0.7520377055912427\n" + "Performance on validation set => AUC: 0.7031746774733644 AP: 0.7408616667192883\n", + "Performance on validation set => AUC: 0.7003589830374215 AP: 0.7384835516148203\n", + "Performance on validation set => AUC: 0.7003733855665054 AP: 0.7387001033670365\n", + "Performance on validation set => AUC: 0.6996730625897907 AP: 0.738915861615899\n", + "Performance on validation set => AUC: 0.6991419693298143 AP: 0.7400909179536861\n", + "Performance on validation set => AUC: 0.6968951747926936 AP: 0.7390546559098561\n", + "Performance on validation set => AUC: 0.6940110683436012 AP: 0.7372227705695125\n", + "Performance on validation set => AUC: 0.6927454461003353 AP: 0.7363419854717088\n", + "Performance on validation set => AUC: 0.6914996273345599 AP: 0.7352590765202852\n", + "Performance on validation set => AUC: 0.6898955456578175 AP: 0.7340942320131665\n", + "Performance on validation set => AUC: 0.6872166752481736 AP: 0.732318689778636\n", + "Performance on validation set => AUC: 0.6841309333919037 AP: 0.7299620245428802\n", + "Performance on validation set => AUC: 0.6819381483388482 AP: 0.7270163059853674\n", + "Performance on validation set => AUC: 0.6836376467707729 AP: 0.7255128311516903\n", + "Performance on validation set => AUC: 0.6872274771449867 AP: 0.7248374222962018\n", + "Performance on validation set => AUC: 0.68846609464622 AP: 0.7243764493545095\n", + "Performance on validation set => AUC: 0.6905256563052472 AP: 0.7244887283857175\n", + "Performance on validation set => AUC: 0.7001321432043466 AP: 0.7275928498612678\n", + "Performance on validation set => AUC: 0.7236262687727965 AP: 0.7386152752055015\n", + "Performance on validation set => AUC: 0.7473868411293023 AP: 0.7544830827529333\n" ] } ], @@ -202,9 +220,9 @@ ], "metadata": { "kernelspec": { - "display_name": "graph-machine-learning-pyg", + "display_name": "py3.8", "language": "python", - "name": "graph-machine-learning-pyg" + "name": "py3.8" }, "language_info": { "codemirror_mode": { @@ -216,7 +234,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.6" + "version": "3.8.10" } }, "nbformat": 4, diff --git a/ChapterNN/05_GraphAutoEncoder_StellarGraph.ipynb b/ChapterNN/05_GraphAutoEncoder_StellarGraph.ipynb new file mode 100644 index 0000000..35003c3 --- /dev/null +++ b/ChapterNN/05_GraphAutoEncoder_StellarGraph.ipynb @@ -0,0 +1,441 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "393d1f8c-162d-43c6-9d3a-3e795bf6467a", + "metadata": {}, + "source": [ + "# Graph AutoEncoder with StellarGraph" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "65a6d0fb-bb0f-4af0-8ba9-6a0c902cec49", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-04-14 21:23:05.152203: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcudart.so.11.0'; dlerror: libcudart.so.11.0: cannot open shared object file: No such file or directory\n", + "2024-04-14 21:23:05.152254: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine.\n", + "2024-04-14 21:23:08.064209: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcuda.so.1'; dlerror: libcuda.so.1: cannot open shared object file: No such file or directory\n", + "2024-04-14 21:23:08.064257: W tensorflow/stream_executor/cuda/cuda_driver.cc:269] failed call to cuInit: UNKNOWN ERROR (303)\n", + "2024-04-14 21:23:08.064280: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:156] kernel driver does not appear to be running on this host (ip-172-31-23-216): /proc/driver/nvidia/version does not exist\n", + "2024-04-14 21:23:08.064620: I tensorflow/core/platform/cpu_feature_guard.cc:151] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: AVX2 FMA\n", + "To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.\n" + ] + } + ], + "source": [ + "from stellargraph.data import EdgeSplitter\n", + "from stellargraph.mapper import FullBatchLinkGenerator\n", + "from stellargraph.layer import GCN, LinkEmbedding\n", + "\n", + "\n", + "from tensorflow import keras\n", + "from stellargraph import datasets" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "1d27bd90-c522-48e2-9929-7417b3ce904b", + "metadata": {}, + "outputs": [], + "source": [ + "dataset = datasets.Cora()\n", + "G, _ = dataset.load()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "4e59277b-12b7-4e8f-9cdc-eaf4c96d1771", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "StellarGraph: Undirected multigraph\n", + " Nodes: 2708, Edges: 5429\n", + "\n", + " Node types:\n", + " paper: [2708]\n", + " Features: float32 vector, length 1433\n", + " Edge types: paper-cites->paper\n", + "\n", + " Edge types:\n", + " paper-cites->paper: [5429]\n", + " Weights: all 1 (default)\n", + " Features: none\n" + ] + } + ], + "source": [ + "print(G.info())" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "4ab4de94-e416-49b2-8e02-5217d5f410e5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "** Sampled 542 positive and 542 negative edges. **\n", + "** Sampled 542 positive and 542 negative edges. **\n" + ] + } + ], + "source": [ + "edge_splitter_test = EdgeSplitter(G)\n", + "\n", + "G_test, edge_ids_test, edge_labels_test = edge_splitter_test.train_test_split(\n", + " p=0.1, method=\"global\", keep_connected=True\n", + ")\n", + "\n", + "edge_splitter_train = EdgeSplitter(G_test)\n", + "\n", + "G_train, edge_ids_train, edge_labels_train = edge_splitter_test.train_test_split(\n", + " p=0.1, method=\"global\", keep_connected=True\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "261e8cdd-455d-4607-a95c-c26ec6aaf109", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using GCN (local pooling) filters...\n" + ] + } + ], + "source": [ + "train_gen = FullBatchLinkGenerator(G, method=\"gcn\")\n", + "train_flow = train_gen.flow(edge_ids_train, edge_labels_train)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "5820186d-1728-494b-9e2c-6a906d7ff3f5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using GCN (local pooling) filters...\n" + ] + } + ], + "source": [ + "test_gen = FullBatchLinkGenerator(G, method=\"gcn\")\n", + "test_flow = train_gen.flow(edge_ids_test, edge_labels_test)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "7897bc20-a2eb-4887-8bde-3ca5756cd62d", + "metadata": {}, + "outputs": [], + "source": [ + "gcn = GCN(\n", + " layer_sizes=[16, 16], activations=[\"relu\", \"relu\"], generator=train_gen, dropout=0.3\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "c27562a4-9f93-4c23-87b1-ad3a0f46c19a", + "metadata": {}, + "outputs": [], + "source": [ + "x_inp, x_out = gcn.in_out_tensors()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "be2d54a1-9561-410a-9c8f-54b805450dc3", + "metadata": {}, + "outputs": [], + "source": [ + "prediction = LinkEmbedding(activation=\"relu\", method=\"ip\")(x_out)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "38cd0093-ef71-4110-8f59-43e510b86edc", + "metadata": {}, + "outputs": [], + "source": [ + "prediction = keras.layers.Reshape((-1,))(prediction)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "33ccc882-df0c-40ad-a401-725b3a64aac3", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/ubuntu/.pyenv/versions/py3.8/lib/python3.8/site-packages/keras/optimizer_v2/adam.py:105: UserWarning: The `lr` argument is deprecated, use `learning_rate` instead.\n", + " super(Adam, self).__init__(name, **kwargs)\n" + ] + } + ], + "source": [ + "model = keras.Model(inputs=x_inp, outputs=prediction)\n", + "\n", + "model.compile(\n", + " optimizer=keras.optimizers.Adam(lr=0.01),\n", + " loss=keras.losses.binary_crossentropy,\n", + " metrics=[\"binary_accuracy\"],\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "1dbc5d61-4e11-4ec8-bb06-8b206beb698d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"model\"\n", + "__________________________________________________________________________________________________\n", + " Layer (type) Output Shape Param # Connected to \n", + "==================================================================================================\n", + " input_1 (InputLayer) [(1, 2708, 1433)] 0 [] \n", + " \n", + " input_3 (InputLayer) [(1, None, 2)] 0 [] \n", + " \n", + " input_4 (InputLayer) [(1, None)] 0 [] \n", + " \n", + " dropout (Dropout) (1, 2708, 1433) 0 ['input_1[0][0]'] \n", + " \n", + " squeezed_sparse_conversion (Sq (2708, 2708) 0 ['input_3[0][0]', \n", + " ueezedSparseConversion) 'input_4[0][0]'] \n", + " \n", + " graph_convolution (GraphConvol (1, None, 16) 22944 ['dropout[0][0]', \n", + " ution) 'squeezed_sparse_conversion[0][0\n", + " ]'] \n", + " \n", + " dropout_1 (Dropout) (1, None, 16) 0 ['graph_convolution[0][0]'] \n", + " \n", + " graph_convolution_1 (GraphConv (1, None, 16) 272 ['dropout_1[0][0]', \n", + " olution) 'squeezed_sparse_conversion[0][0\n", + " ]'] \n", + " \n", + " input_2 (InputLayer) [(1, None, 2)] 0 [] \n", + " \n", + " gather_indices (GatherIndices) (1, None, 2, 16) 0 ['graph_convolution_1[0][0]', \n", + " 'input_2[0][0]'] \n", + " \n", + " link_embedding (LinkEmbedding) (1, None, 1) 0 ['gather_indices[0][0]'] \n", + " \n", + " reshape (Reshape) (1, None) 0 ['link_embedding[0][0]'] \n", + " \n", + "==================================================================================================\n", + "Total params: 23,216\n", + "Trainable params: 23,216\n", + "Non-trainable params: 0\n", + "__________________________________________________________________________________________________\n" + ] + } + ], + "source": [ + "model.summary()" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "d5760e12-f39a-4ce8-8c9d-9ba8ae61d4ab", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/50\n", + "1/1 [==============================] - 2s 2s/step - loss: 1.5763 - binary_accuracy: 0.5000 - val_loss: 1.9396 - val_binary_accuracy: 0.5609\n", + "Epoch 2/50\n", + "1/1 [==============================] - 0s 186ms/step - loss: 2.1878 - binary_accuracy: 0.5812 - val_loss: 0.6680 - val_binary_accuracy: 0.7149\n", + "Epoch 3/50\n", + "1/1 [==============================] - 0s 194ms/step - loss: 0.6135 - binary_accuracy: 0.7066 - val_loss: 0.6407 - val_binary_accuracy: 0.6624\n", + "Epoch 4/50\n", + "1/1 [==============================] - 0s 188ms/step - loss: 0.6331 - binary_accuracy: 0.6577 - val_loss: 0.6610 - val_binary_accuracy: 0.7011\n", + "Epoch 5/50\n", + "1/1 [==============================] - 0s 180ms/step - loss: 0.6754 - binary_accuracy: 0.6827 - val_loss: 0.6487 - val_binary_accuracy: 0.7094\n", + "Epoch 6/50\n", + "1/1 [==============================] - 0s 184ms/step - loss: 0.6670 - binary_accuracy: 0.7085 - val_loss: 0.6178 - val_binary_accuracy: 0.6780\n", + "Epoch 7/50\n", + "1/1 [==============================] - 0s 184ms/step - loss: 0.5983 - binary_accuracy: 0.6946 - val_loss: 0.6237 - val_binary_accuracy: 0.6697\n", + "Epoch 8/50\n", + "1/1 [==============================] - 0s 167ms/step - loss: 0.6000 - binary_accuracy: 0.6780 - val_loss: 0.6073 - val_binary_accuracy: 0.6882\n", + "Epoch 9/50\n", + "1/1 [==============================] - 0s 169ms/step - loss: 0.5503 - binary_accuracy: 0.7149 - val_loss: 0.6196 - val_binary_accuracy: 0.7066\n", + "Epoch 10/50\n", + "1/1 [==============================] - 0s 151ms/step - loss: 0.5553 - binary_accuracy: 0.7509 - val_loss: 0.6015 - val_binary_accuracy: 0.6873\n", + "Epoch 11/50\n", + "1/1 [==============================] - 0s 175ms/step - loss: 0.5591 - binary_accuracy: 0.7232 - val_loss: 0.6369 - val_binary_accuracy: 0.6328\n", + "Epoch 12/50\n", + "1/1 [==============================] - 0s 159ms/step - loss: 0.5639 - binary_accuracy: 0.6771 - val_loss: 0.6474 - val_binary_accuracy: 0.6135\n", + "Epoch 13/50\n", + "1/1 [==============================] - 0s 154ms/step - loss: 0.5749 - binary_accuracy: 0.6808 - val_loss: 0.6313 - val_binary_accuracy: 0.6273\n", + "Epoch 14/50\n", + "1/1 [==============================] - 0s 177ms/step - loss: 0.5922 - binary_accuracy: 0.6734 - val_loss: 0.6019 - val_binary_accuracy: 0.6559\n", + "Epoch 15/50\n", + "1/1 [==============================] - 0s 207ms/step - loss: 0.5563 - binary_accuracy: 0.7103 - val_loss: 0.6077 - val_binary_accuracy: 0.7085\n", + "Epoch 16/50\n", + "1/1 [==============================] - 0s 174ms/step - loss: 0.5161 - binary_accuracy: 0.7528 - val_loss: 0.6012 - val_binary_accuracy: 0.7334\n", + "Epoch 17/50\n", + "1/1 [==============================] - 0s 177ms/step - loss: 0.5562 - binary_accuracy: 0.7657 - val_loss: 0.5957 - val_binary_accuracy: 0.7306\n", + "Epoch 18/50\n", + "1/1 [==============================] - 0s 192ms/step - loss: 0.5324 - binary_accuracy: 0.7620 - val_loss: 0.5702 - val_binary_accuracy: 0.7306\n", + "Epoch 19/50\n", + "1/1 [==============================] - 0s 200ms/step - loss: 0.5027 - binary_accuracy: 0.7620 - val_loss: 0.5522 - val_binary_accuracy: 0.7214\n", + "Epoch 20/50\n", + "1/1 [==============================] - 0s 188ms/step - loss: 0.4692 - binary_accuracy: 0.7878 - val_loss: 0.5503 - val_binary_accuracy: 0.7196\n", + "Epoch 21/50\n", + "1/1 [==============================] - 0s 191ms/step - loss: 0.4528 - binary_accuracy: 0.7869 - val_loss: 0.5596 - val_binary_accuracy: 0.7205\n", + "Epoch 22/50\n", + "1/1 [==============================] - 0s 166ms/step - loss: 0.4710 - binary_accuracy: 0.7777 - val_loss: 0.5785 - val_binary_accuracy: 0.7214\n", + "Epoch 23/50\n", + "1/1 [==============================] - 0s 159ms/step - loss: 0.4347 - binary_accuracy: 0.7887 - val_loss: 0.5842 - val_binary_accuracy: 0.7315\n", + "Epoch 24/50\n", + "1/1 [==============================] - 0s 161ms/step - loss: 0.4550 - binary_accuracy: 0.7943 - val_loss: 0.5926 - val_binary_accuracy: 0.7463\n", + "Epoch 25/50\n", + "1/1 [==============================] - 0s 186ms/step - loss: 0.4489 - binary_accuracy: 0.7934 - val_loss: 0.6106 - val_binary_accuracy: 0.7546\n", + "Epoch 26/50\n", + "1/1 [==============================] - 0s 167ms/step - loss: 0.4785 - binary_accuracy: 0.8072 - val_loss: 0.5740 - val_binary_accuracy: 0.7426\n", + "Epoch 27/50\n", + "1/1 [==============================] - 0s 160ms/step - loss: 0.4423 - binary_accuracy: 0.8109 - val_loss: 0.5461 - val_binary_accuracy: 0.7325\n", + "Epoch 28/50\n", + "1/1 [==============================] - 0s 171ms/step - loss: 0.4339 - binary_accuracy: 0.7998 - val_loss: 0.5458 - val_binary_accuracy: 0.7352\n", + "Epoch 29/50\n", + "1/1 [==============================] - 0s 178ms/step - loss: 0.4246 - binary_accuracy: 0.7823 - val_loss: 0.5476 - val_binary_accuracy: 0.7389\n", + "Epoch 30/50\n", + "1/1 [==============================] - 0s 174ms/step - loss: 0.4116 - binary_accuracy: 0.8118 - val_loss: 0.5417 - val_binary_accuracy: 0.7445\n", + "Epoch 31/50\n", + "1/1 [==============================] - 0s 171ms/step - loss: 0.4014 - binary_accuracy: 0.8127 - val_loss: 0.5501 - val_binary_accuracy: 0.7509\n", + "Epoch 32/50\n", + "1/1 [==============================] - 0s 169ms/step - loss: 0.4131 - binary_accuracy: 0.8247 - val_loss: 0.6220 - val_binary_accuracy: 0.7638\n", + "Epoch 33/50\n", + "1/1 [==============================] - 0s 168ms/step - loss: 0.3686 - binary_accuracy: 0.8432 - val_loss: 0.6440 - val_binary_accuracy: 0.7675\n", + "Epoch 34/50\n", + "1/1 [==============================] - 0s 170ms/step - loss: 0.4433 - binary_accuracy: 0.8229 - val_loss: 0.6828 - val_binary_accuracy: 0.7749\n", + "Epoch 35/50\n", + "1/1 [==============================] - 0s 181ms/step - loss: 0.3986 - binary_accuracy: 0.8284 - val_loss: 0.6851 - val_binary_accuracy: 0.7804\n", + "Epoch 36/50\n", + "1/1 [==============================] - 0s 153ms/step - loss: 0.4363 - binary_accuracy: 0.8238 - val_loss: 0.6928 - val_binary_accuracy: 0.7786\n", + "Epoch 37/50\n", + "1/1 [==============================] - 0s 149ms/step - loss: 0.3599 - binary_accuracy: 0.8358 - val_loss: 0.6746 - val_binary_accuracy: 0.7823\n", + "Epoch 38/50\n", + "1/1 [==============================] - 0s 145ms/step - loss: 0.3536 - binary_accuracy: 0.8607 - val_loss: 0.6875 - val_binary_accuracy: 0.7860\n", + "Epoch 39/50\n", + "1/1 [==============================] - 0s 132ms/step - loss: 0.3590 - binary_accuracy: 0.8625 - val_loss: 0.6508 - val_binary_accuracy: 0.7887\n", + "Epoch 40/50\n", + "1/1 [==============================] - 0s 184ms/step - loss: 0.3271 - binary_accuracy: 0.8625 - val_loss: 0.6383 - val_binary_accuracy: 0.7860\n", + "Epoch 41/50\n", + "1/1 [==============================] - 0s 153ms/step - loss: 0.3478 - binary_accuracy: 0.8607 - val_loss: 0.5854 - val_binary_accuracy: 0.7887\n", + "Epoch 42/50\n", + "1/1 [==============================] - 0s 130ms/step - loss: 0.3369 - binary_accuracy: 0.8469 - val_loss: 0.6000 - val_binary_accuracy: 0.7934\n", + "Epoch 43/50\n", + "1/1 [==============================] - 0s 132ms/step - loss: 0.3354 - binary_accuracy: 0.8570 - val_loss: 0.5966 - val_binary_accuracy: 0.7961\n", + "Epoch 44/50\n", + "1/1 [==============================] - 0s 150ms/step - loss: 0.3160 - binary_accuracy: 0.8681 - val_loss: 0.5929 - val_binary_accuracy: 0.7961\n", + "Epoch 45/50\n", + "1/1 [==============================] - 0s 161ms/step - loss: 0.3216 - binary_accuracy: 0.8598 - val_loss: 0.6113 - val_binary_accuracy: 0.8026\n", + "Epoch 46/50\n", + "1/1 [==============================] - 0s 142ms/step - loss: 0.2983 - binary_accuracy: 0.8736 - val_loss: 0.6273 - val_binary_accuracy: 0.8109\n", + "Epoch 47/50\n", + "1/1 [==============================] - 0s 154ms/step - loss: 0.2900 - binary_accuracy: 0.8847 - val_loss: 0.6263 - val_binary_accuracy: 0.8155\n", + "Epoch 48/50\n", + "1/1 [==============================] - 0s 170ms/step - loss: 0.2880 - binary_accuracy: 0.8801 - val_loss: 0.6530 - val_binary_accuracy: 0.8146\n", + "Epoch 49/50\n", + "1/1 [==============================] - 0s 139ms/step - loss: 0.3026 - binary_accuracy: 0.8773 - val_loss: 0.7086 - val_binary_accuracy: 0.8173\n", + "Epoch 50/50\n", + "1/1 [==============================] - 0s 146ms/step - loss: 0.3128 - binary_accuracy: 0.8792 - val_loss: 0.7000 - val_binary_accuracy: 0.8146\n" + ] + } + ], + "source": [ + "history = model.fit(train_flow, validation_data=test_flow, epochs=50)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "4d6f0caf-529a-4609-ade3-61715426e4b3", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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9+OPf/wjhg4dipSUFDz22GNISkrCzJkzu+11EhEREdHFUWyQnT17NkpLS7FkyRJYLBakpaVhw4YN8mStgoIC6PUNA8plZWW45557YLFY0KtXL4wdOxbbt2/HpZdeKh/z0EMPoaqqCj//+c9RXl6OSZMmYcOGDc0WTiAiIiIi5dNJEmcT+cpms8FsNsNqtcJkMnX36RARERFpjj95S5E1skRERERE7WGQJSIiIiJVYpAlIiIiIlVikCUiIiIiVWKQJSIiIiJVYpAlIiIiIlVikCUiIiIiVWKQJSIiIiJVUuzKXkrkWTvCZrN185kQERERaZMnZ/myZheDrB8qKioAAMnJyd18JkRERETaVlFRAbPZ3OYxXKLWDy6XC2fPnkVUVBR0Ol1An8tmsyE5ORmFhYVcDlel+B6qG98/deP7p258/9Sto++fJEmoqKhAUlIS9Pq2q2A5IusHvV6Pfv36delzmkwm/idWOb6H6sb3T934/qkb3z9168j7195IrAcnexERERGRKjHIEhEREZEqGZ544oknuvskqGUGgwFTpkxBUBArQNSK76G68f1TN75/6sb3T9266v3jZC8iIiIiUiWWFhARERGRKjHIEhEREZEqMcgSERERkSoxyBIRERGRKjHIEhEREZEqMcgSERERkSoxyBIRERGRKjHIEhEREZEqMcgSERERkSoxyBIRERGRKjHIEhEREZEqMcgSERERkSoxyBIRERGRKgV19wmoicvlwtmzZxEVFQWdTtfdp0NERESkOZIkoaKiAklJSdDr2x5zZZD1w9mzZ5GcnNzdp0FERESkeYWFhejXr1+bxygyyC5duhQffPABDh8+jLCwMEycOBHPPfccUlNTW73P66+/jrfffhuHDh0CAIwdOxbPPPMMxo8fLx+zYMECvPXWW173y8zMxIYNG3w6r6ioKADiH9ZkMvn7soiIiIioHTabDcnJyXLuaosig+zmzZuxePFiXHHFFaivr8cjjzyCG264Ad999x0iIiJavE9ubi7mzJmDiRMnIjQ0FM899xxuuOEGfPvtt+jbt6983LRp0/Dmm2/K141Go8/n5SknMJlMDLJEREREAeRLGadOkiSpC86lQ0pLSxEXF4fNmzfj6quv9uk+TqcTvXr1wiuvvIJ58+YBECOy5eXlWLdu3UWdh81mg9lshtVqZZAlIiIiCgB/8pYq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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from stellargraph.utils import plot_history\n", + "\n", + "plot_history(history)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9e2130e3-6710-4d60-afa2-c0c7254921a5", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "py3.8", + "language": "python", + "name": "py3.8" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/ChapterNN/GAE.ipynb b/ChapterNN/GAE.ipynb deleted file mode 100644 index 985c5b6..0000000 --- a/ChapterNN/GAE.ipynb +++ /dev/null @@ -1,1069 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "id": "64a3e76b-18a0-4b30-8840-3c491b5aae5f", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "94acb909-b6cc-4e4e-8f44-59552fc6a84b", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "raw", - "id": "448f877a-dcfa-4261-8d83-1175facdfc93", - "metadata": {}, - "source": [ - "networkx\n", - "tensorflow\n", - "scipy" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "6b698a93-e89b-4819-9ef9-586d544a243a", - "metadata": {}, - "outputs": [], - "source": [ - "import networkx as nx\n", - "import numpy as np" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "4826e139-b742-454b-932f-72d61a7d49f3", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2024-03-10 00:57:23.168965: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`.\n", - "2024-03-10 00:57:23.170593: I tensorflow/tsl/cuda/cudart_stub.cc:28] Could not find cuda drivers on your machine, GPU will not be used.\n", - "2024-03-10 00:57:23.201193: I tensorflow/tsl/cuda/cudart_stub.cc:28] Could not find cuda drivers on your machine, GPU will not be used.\n", - "2024-03-10 00:57:23.201956: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.\n", - "To enable the following instructions: AVX2 AVX512F AVX512_VNNI FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.\n", - "2024-03-10 00:57:23.766842: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT\n" - ] - } - ], - "source": [ - "import keras \n", - "import os\n", - "\n", - "zip_file = keras.utils.get_file(\n", - " fname=\"cora.tgz\",\n", - " origin=\"https://linqs-data.soe.ucsc.edu/public/lbc/cora.tgz\",\n", - " extract=True,\n", - ")\n", - "data_dir = os.path.join(os.path.dirname(zip_file), \"cora\")" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "2391ee29-37d6-40e3-9ab6-99d8c3d04101", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Citations shape: (5429, 2)\n" - ] - } - ], - "source": [ - "import pandas as pd\n", - "\n", - "citations = pd.read_csv(\n", - " os.path.join(data_dir, \"cora.cites\"),\n", - " sep=\"\\t\",\n", - " header=None,\n", - " names=[\"target\", \"source\"],\n", - ")\n", - "print(\"Citations shape:\", citations.shape)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "4682e143-d23d-43d7-a912-51b6b8194a1a", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
targetsource
0351033
135103482
235103515
3351050679
4351103960
.........
542485311619621
5425853116853155
54268531181140289
5427853155853118
54289543151155073
\n", - "

5429 rows × 2 columns

\n", - "
" - ], - "text/plain": [ - " target source\n", - "0 35 1033\n", - "1 35 103482\n", - "2 35 103515\n", - "3 35 1050679\n", - "4 35 1103960\n", - "... ... ...\n", - "5424 853116 19621\n", - "5425 853116 853155\n", - "5426 853118 1140289\n", - "5427 853155 853118\n", - "5428 954315 1155073\n", - "\n", - "[5429 rows x 2 columns]" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "citations" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "9136ca0e-d8a5-43ba-b72c-606ec85d44ab", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Papers shape: (2708, 1435)\n" - ] - } - ], - "source": [ - "column_names = [\"paper_id\"] + [f\"term_{idx}\" for idx in range(1433)] + [\"subject\"]\n", - "papers = pd.read_csv(\n", - " os.path.join(data_dir, \"cora.content\"), sep=\"\\t\", header=None, names=column_names,\n", - ")\n", - "print(\"Papers shape:\", papers.shape)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "e9bdf58e-bb7f-43e3-a3cd-bd699d4f0c8a", - "metadata": {}, - "outputs": [], - "source": [ - "class_values = sorted(papers[\"subject\"].unique())\n", - "class_idx = {name: id for id, name in enumerate(class_values)}\n", - "paper_idx = {name: idx for idx, name in enumerate(sorted(papers[\"paper_id\"].unique()))}\n", - "\n", - "papers[\"paper_id\"] = papers[\"paper_id\"].apply(lambda name: paper_idx[name])\n", - "citations[\"source\"] = citations[\"source\"].apply(lambda name: paper_idx[name])\n", - "citations[\"target\"] = citations[\"target\"].apply(lambda name: paper_idx[name])\n", - "papers[\"subject\"] = papers[\"subject\"].apply(lambda value: class_idx[value])" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "99f113f6-b3e9-41c5-a6ee-873536c599bb", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
paper_idterm_0term_1term_2term_3term_4term_5term_6term_7term_8...term_1424term_1425term_1426term_1427term_1428term_1429term_1430term_1431term_1432subject
0462000000000...0010000002
11911000000000...0100000005
22002000000000...0000000004
3248000000000...0000000004
4519000000000...0000000003
..................................................................
27032370000000000...0000000001
27042371000000000...0000000001
27052372000000000...0000000001
2706955000010000...0000000000
2707376000000000...0000000002
\n", - "

2708 rows × 1435 columns

\n", - "
" - ], - "text/plain": [ - " paper_id term_0 term_1 term_2 term_3 term_4 term_5 term_6 \\\n", - "0 462 0 0 0 0 0 0 0 \n", - "1 1911 0 0 0 0 0 0 0 \n", - "2 2002 0 0 0 0 0 0 0 \n", - "3 248 0 0 0 0 0 0 0 \n", - "4 519 0 0 0 0 0 0 0 \n", - "... ... ... ... ... ... ... ... ... \n", - "2703 2370 0 0 0 0 0 0 0 \n", - "2704 2371 0 0 0 0 0 0 0 \n", - "2705 2372 0 0 0 0 0 0 0 \n", - "2706 955 0 0 0 0 1 0 0 \n", - "2707 376 0 0 0 0 0 0 0 \n", - "\n", - " term_7 term_8 ... term_1424 term_1425 term_1426 term_1427 \\\n", - "0 0 0 ... 0 0 1 0 \n", - "1 0 0 ... 0 1 0 0 \n", - "2 0 0 ... 0 0 0 0 \n", - "3 0 0 ... 0 0 0 0 \n", - "4 0 0 ... 0 0 0 0 \n", - "... ... ... ... ... ... ... ... \n", - "2703 0 0 ... 0 0 0 0 \n", - "2704 0 0 ... 0 0 0 0 \n", - "2705 0 0 ... 0 0 0 0 \n", - "2706 0 0 ... 0 0 0 0 \n", - "2707 0 0 ... 0 0 0 0 \n", - "\n", - " term_1428 term_1429 term_1430 term_1431 term_1432 subject \n", - "0 0 0 0 0 0 2 \n", - "1 0 0 0 0 0 5 \n", - "2 0 0 0 0 0 4 \n", - "3 0 0 0 0 0 4 \n", - "4 0 0 0 0 0 3 \n", - "... ... ... ... ... ... ... \n", - "2703 0 0 0 0 0 1 \n", - "2704 0 0 0 0 0 1 \n", - "2705 0 0 0 0 0 1 \n", - "2706 0 0 0 0 0 0 \n", - "2707 0 0 0 0 0 2 \n", - "\n", - "[2708 rows x 1435 columns]" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "papers" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "77fc40eb-a7a1-4293-90fb-4b4e70bc6d32", - "metadata": {}, - "outputs": [], - "source": [ - "cora_graph = nx.from_pandas_edgelist(citations.sample(n=1500))\n" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "c720e6a1-5edb-4df9-ab3e-c2e4e219e550", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "NodeView((2047, 996, 341, 236, 140, 355, 1621, 747, 2290, 464, 2121, 121, 370, 371, 2299, 604, 2168, 781, 1901, 87, 2150, 108, 2575, 333, 1865, 1559, 2441, 1703, 2403, 20, 198, 1102, 1930, 270, 1916, 1081, 65, 286, 1476, 149, 368, 122, 2357, 71, 1247, 15, 2597, 749, 2294, 49, 1909, 504, 1983, 742, 2677, 1582, 861, 703, 2684, 1664, 2443, 1708, 220, 230, 2278, 385, 312, 27, 2631, 549, 2370, 1066, 1536, 1537, 936, 411, 227, 226, 301, 3, 2177, 416, 444, 197, 2226, 1162, 1672, 1210, 1173, 351, 613, 173, 2046, 415, 995, 1040, 1731, 1722, 244, 455, 1525, 1112, 627, 728, 1766, 686, 2069, 1009, 251, 2174, 394, 1265, 50, 1789, 1398, 1609, 576, 838, 1727, 348, 1357, 2198, 1392, 2061, 434, 2243, 823, 1122, 237, 177, 2702, 0, 2249, 878, 2375, 399, 710, 222, 1151, 1150, 90, 200, 841, 2615, 453, 388, 340, 1592, 585, 484, 792, 1012, 101, 1362, 13, 326, 1871, 1872, 791, 485, 1576, 1580, 1195, 2025, 165, 860, 2541, 33, 171, 397, 2277, 448, 1219, 495, 556, 367, 373, 47, 109, 2104, 894, 414, 2, 1601, 780, 582, 1275, 2105, 1088, 2395, 470, 2591, 252, 110, 1782, 601, 569, 1569, 1556, 992, 653, 2240, 174, 2073, 1057, 1640, 524, 1936, 377, 1854, 402, 2341, 669, 207, 208, 2200, 1810, 1554, 2281, 45, 2469, 1368, 1945, 502, 1197, 379, 885, 1390, 532, 353, 2353, 1349, 1404, 1035, 1915, 12, 2255, 921, 2613, 784, 736, 1323, 1750, 1746, 2523, 817, 1720, 1713, 2397, 814, 28, 1185, 111, 1363, 520, 64, 57, 1058, 837, 11, 713, 643, 2705, 1262, 1064, 2617, 1105, 231, 961, 959, 1063, 523, 179, 490, 763, 274, 1420, 527, 2500, 1779, 147, 1364, 2273, 1526, 1594, 1961, 395, 999, 60, 170, 93, 9, 501, 390, 2698, 507, 851, 2385, 2620, 1317, 2405, 1657, 1805, 472, 755, 1571, 1570, 2166, 68, 2564, 161, 247, 424, 1967, 509, 151, 1401, 1496, 62, 1755, 1756, 1396, 238, 54, 954, 1562, 881, 2587, 973, 2675, 384, 1963, 651, 538, 2364, 1600, 1977, 718, 72, 535, 357, 204, 2654, 796, 1812, 1011, 1850, 85, 2003, 1899, 681, 421, 655, 1244, 282, 1446, 1679, 295, 639, 153, 661, 2706, 176, 1075, 219, 1256, 1257, 1351, 1846, 1136, 498, 2011, 2401, 919, 593, 1567, 1497, 1019, 2219, 734, 225, 1460, 1344, 1564, 882, 1960, 635, 1472, 1069, 1498, 229, 2470, 1502, 2129, 1284, 2531, 1768, 2660, 760, 2636, 719, 403, 630, 1264, 1135, 48, 1289, 1192, 1003, 1090, 1578, 52, 2333, 1103, 2051, 1018, 1738, 1736, 809, 1188, 915, 1041, 927, 2369, 1794, 1793, 1397, 559, 1619, 1165, 1530, 1385, 158, 1596, 1841, 828, 202, 2019, 154, 897, 2289, 124, 638, 512, 409, 429, 893, 1940, 488, 2453, 574, 2481, 829, 310, 1356, 44, 1201, 2508, 1787, 1604, 1602, 2606, 266, 2568, 1845, 2006, 531, 16, 1761, 2457, 1042, 2041, 708, 169, 168, 2639, 810, 59, 1825, 543, 1689, 1608, 657, 2417, 205, 104, 1521, 1522, 1641, 1566, 1709, 913, 213, 216, 2321, 1523, 514, 7, 2555, 1844, 1769, 1873, 1052, 712, 1399, 102, 77, 1414, 1272, 1922, 107, 467, 1686, 1375, 926, 2049, 503, 766, 46, 864, 1155, 74, 1654, 1470, 84, 1120, 22, 23, 2612, 583, 2673, 1138, 1276, 1651, 259, 904, 773, 255, 254, 511, 2525, 834, 446, 1883, 1665, 126, 807, 1045, 383, 211, 1014, 602, 2217, 374, 224, 1610, 1986, 578, 1031, 89, 1980, 316, 757, 363, 496, 1827, 1053, 391, 223, 1627, 644, 335, 2076, 1747, 1211, 439, 1047, 1145, 1250, 187, 67, 117, 1529, 2338, 2235, 1115, 2114, 1059, 1437, 1096, 1931, 275, 647, 1017, 235, 294, 1291, 405, 492, 832, 2374, 1246, 2699, 2093, 142, 695, 883, 756, 269, 550, 2125, 1278, 1072, 2560, 1692, 1843, 1253, 31, 127, 328, 799, 1822, 136, 536, 1191, 2594, 1914, 924, 525, 1241, 1050, 975, 2462, 1726, 366, 833, 1962, 646, 900, 192, 1441, 1451, 677, 2656, 869, 95, 1295, 193, 1126, 2300, 941, 1252, 1572, 2124, 1189, 1994, 801, 1969, 240, 1754, 2039, 812, 1180, 577, 2649, 1319, 804, 805, 624, 626, 2489, 1771, 1060, 25, 438, 2167, 347, 217, 637, 324, 323, 2379, 1633, 1043, 1642, 1217, 1187, 2664, 184, 2428, 1688, 1346, 1808, 1740, 1706, 2081, 78, 2583, 1422, 1056, 1800, 408, 2118, 2242, 195, 824, 2376, 1240, 1098, 1374, 530, 667, 1492, 143, 1371, 1991, 30, 486, 2100, 1216, 597, 596, 854, 152, 313, 487, 2181, 700, 1760, 672, 1030, 1445, 234, 2126, 555, 696, 305, 2292, 982, 2422, 1678, 2486, 1656, 91, 2482, 2645, 42, 1503, 1022, 119, 2252, 1506, 1763, 1358, 733, 1330, 291, 1505, 720, 1320, 2423, 103, 1589, 2406, 917, 707, 568, 160, 2678, 1254, 2098, 337, 289, 566, 2473, 1829, 758, 2506, 929, 61, 63, 100, 2207, 546, 380, 1434, 997, 1473, 287, 911, 988, 1085, 526, 586, 972, 1712, 2424, 1051, 1867, 1866, 1198, 420, 1923, 137, 1220, 1413, 469, 1944, 279, 2692, 1207, 2301, 1270, 846, 432, 1077, 1546, 1296, 1083, 822, 1748, 649, 1215, 1402, 1336, 1717, 1204, 2102, 1222, 2697, 141, 1990, 1975, 2024, 744, 2156, 730, 331, 2644, 2637, 118, 923, 2186, 1767, 1528, 714, 228, 2490, 786, 1809, 1301, 55, 845, 1406, 79, 2561, 690, 115, 745, 2163, 243, 1158, 1995, 2074, 1993, 2432, 2202, 1023, 874, 1583, 949, 2532, 584, 131, 14, 253, 618, 2182, 1263, 5, 114, 481, 1299, 1673, 393, 600, 459, 1906, 872, 1271, 2086, 83, 1178, 6, 944, 2365, 1585, 1026, 1024, 2681, 2205, 839, 1161, 2203, 417, 2142, 664, 1561, 271, 980, 560, 26, 1818, 278, 471, 1260, 1261, 557, 795, 241, 930, 1581, 1587, 2134, 361, 2611, 579, 2504, 1780, 1860, 186, 2313, 2558, 1617, 1613, 2474, 1762, 1172, 816, 2151, 2002, 2171, 1558, 2022, 2576, 1863, 2091, 1181, 702, 1338, 292, 293, 1920, 1293, 517, 1982, 1474, 298, 971, 738, 737, 540, 724, 715, 2316, 297, 1196, 166, 1932, 2267, 552, 2410, 128, 1979, 1380, 614, 1412, 1224, 684, 2348, 352, 1367, 1423, 603, 1028, 652, 2399, 290, 2218, 1415, 2421, 1442, 2518, 1786, 1061, 852, 2608, 513, 317, 1106, 2600, 1949, 931, 1616, 940, 2402, 717, 1279, 2344, 413, 375, 2412, 196, 1440, 1785, 1174, 156, 2581, 539, 858, 1743, 1742, 2623, 1146, 2502, 1700, 2131, 521, 516, 2603, 2634, 1381, 537, 1461, 1970, 683, 890, 144, 2429, 123, 1039, 1702, 1280, 993, 2162, 1588, 2582, 2538, 711, 75, 303, 886, 381, 675, 1432, 132, 859, 80, 17, 2543, 751, 1626, 2068, 2435, 106, 1049, 2115, 460, 1143, 701, 1698, 1067, 945, 1142, 612, 2371, 1494, 2071, 1116, 499, 214, 1997, 765, 2537, 1171, 58, 1548, 551, 494, 1471, 433, 135, 1544, 1514, 1513, 764, 2119, 76, 1408, 428, 1184, 1182, 774, 1000, 189, 506, 280, 2368, 656, 922, 1175, 2463, 1744, 1733, 1734, 811, 1902, 966, 1676, 1370, 589, 2567, 1857, 2347, 2244, 779, 339, 1879, 1303, 2632, 296, 1236, 541, 642, 2033, 2657, 2578, 1563, 660, 662, 946, 518, 250, 249, 1875, 2454, 53, 1799, 407, 2420, 1200, 2691, 2351, 2026, 2138, 843, 1350, 1778, 868, 1848, 2511, 2685, 1828, 1685, 1684, 2185, 1389, 617, 304, 991, 790, 2246, 452, 2336, 906, 2065, 378, 2633, 1326, 2659, 40, 1690, 2627, 682, 1444, 233, 1882, 1486, 1531, 2283, 1524, 2679, 1065, 666, 427, 1859, 515, 1170, 450, 508, 1788, 1791, 2133, 376, 113, 2317, 354, 2468, 2176, 688, 2638, 1591, 732, 203, 120, 436, 1400, 1824, 1687, 194, 1015, 1016, 2066, 1110, 1683, 1770, 2571, 1858, 709, 182, 2590, 410, 2586, 563, 976, 842, 2173, 350, 2411, 1662, 1577, 497, 265, 1612, 857, 916, 191, 716, 1898, 69, 619, 2326, 1540, 989, 1337, 2057, 1, 2261, 698, 2400, 1900, 2032, 167, 956, 548, 2360, 1598, 968, 148, 2279, 1226, 1707, 865, 605, 1484, 1815, 1942, 1327, 1431, 676, 1084, 1934, 1757, 2650, 1624, 1623, 2635, 977, 2238, 1328, 562, 2268, 1407, 2467, 2372, 1605, 2602, 654, 392, 1314, 908, 1924, 180, 571, 262, 330, 1881, 245, 2067, 461, 668, 1286, 1517, 1209, 474, 1935, 2023, 1212, 740, 2529, 827, 2140, 188, 2658, 473, 2461, 844, 2236, 273, 2095, 2000, 772, 2206, 334, 1697, 2695, 212, 1038, 468, 725, 937, 902, 2643, 594, 2668, 365, 1027, 2087, 2269, 866, 435, 2079, 1227, 1159, 1205, 1516, 979, 483, 1870, 813, 1214, 2436, 1550, 302, 1817, 150, 1156, 431, 1821, 1231, 547, 2089, 2452, 1725, 1819, 1551, 1290, 1888, 1832, 2088, 1157, 1953, 570, 1560, 2380, 1379, 479, 1987, 1491, 2535, 1823, 1427, 1718, 1007, 2284, 2334, 342, 332, 789, 1628, 1611, 1304, 1999, 1903, 1082, 609, 1183, 1509, 398, 1132, 1861, 1784, 1485, 2599, 1225, 465, 1372, 284, 2625, 2123, 1086, 2544, 404, 1893, 1826, 1168, 1111, 2425, 1329, 1458, 1478, 288, 2478, 1765, 2476, 640, 336, 1968, 1169, 2209, 2318, 533, 146, 1749, 825, 2028, 1897, 2595, 1998, 73, 1553, 572, 794, 1966, 1599, 138, 1855, 164, 2661, 327, 1373, 2416, 1939, 820, 2149, 1277, 1868, 1555, 478, 2680, 1403, 2330, 1545, 939, 2232, 51, 2128, 1267, 2700, 863, 2539, 607, 798, 1579, 2387, 2450, 1449, 1190, 1634, 1287, 694, 1721, 1315, 2083, 648, 2689, 1777, 1318, 1847, 1910, 441, 1723, 920, 2179, 1034, 178, 1918, 260, 2144, 1306, 2359, 1108, 2704, 2245, 529, 43, 2106, 1745, 1533, 1691, 2072, 242, 692, 1199, 1332, 1391, 884, 482, 2346, 706, 2642, 581, 2609, 761, 358, 2345, 1584, 1639, 2175, 2250, 96, 2437, 1699, 2554, 2077, 948, 2275, 1904, 221, 209, 2433, 2204, 1097, 658, 2092, 689, 2580, 1869, 489, 423, 953, 257, 2276, 2329, 1543, 1405, 625, 1456, 1715, 1331, 1705, 2439, 360, 2158, 129, 2143, 1693, 1710, 37, 406, 41, 246, 2145, 130, 2195, 1534, 519, 2378, 445, 1783, 2282, 2607, 418, 2257, 400, 1334, 1921, 92, 1001, 2013, 1395, 1501, 325, 955, 430, 364, 1292, 94, 493, 2409, 1661, 2464, 2445, 663, 1452, 1454, 1643, 818, 1958, 1840, 1964, 1100, 285, 2480, 1193, 329, 775, 18, 218, 673, 2393, 447, 2058, 1508, 2038, 947, 1361, 1943, 1758, 2297, 2641, 258, 2152, 1615, 97, 831, 665, 1435, 1792, 2522, 925, 1552, 201, 1411, 943, 2034, 2381, 1635, 2042, 2055))" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "cora_graph.nodes()" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "cf3899f3-5b2e-46ed-851d-a85e0ad0326b", - "metadata": {}, - "outputs": [], - "source": [ - "G=cora_graph" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "6e203133-6fbd-4e90-852f-1aa53f5f4cfe", - "metadata": {}, - "outputs": [], - "source": [ - "adj = (1.0 * (nx.adjacency_matrix(G)>0)).toarray()" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "d81852f1-e294-4272-9546-b8b92028d1cc", - "metadata": {}, - "outputs": [], - "source": [ - "import tensorflow as tf" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "1f56b228-6596-4e0a-9e0e-da9ae9ea4d18", - "metadata": {}, - "outputs": [], - "source": [ - "from keras import backend as K \n", - "from keras.layers import Layer" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "ac74c638-a758-4920-a18b-75687264c144", - "metadata": {}, - "outputs": [], - "source": [ - "from functools import cached_property\n", - "\n", - "class GraphConvolution(Layer):\n", - " \"\"\"Basic graph convolution layer for undirected graph without edge labels.\"\"\"\n", - " \n", - " def __init__(self, output_dim, graph, activation, **kwargs): \n", - " self.output_dim = output_dim \n", - " self.graph = graph\n", - " self.activation = activation\n", - " super(GraphConvolution, self).__init__(**kwargs)\n", - "\n", - " @staticmethod\n", - " def preprocess_graph(adj):\n", - " adj_ = adj + np.eye(adj.shape[0])\n", - " \n", - " degree = np.array(adj_.sum(1))\n", - " \n", - " degree_mat_inv_sqrt = np.diag(np.power(degree, -0.5).flatten())\n", - " adj_normalized = adj_.dot(degree_mat_inv_sqrt).transpose().dot(degree_mat_inv_sqrt)\n", - " \n", - " return adj_normalized\n", - "\n", - " \n", - " @cached_property\n", - " def adj(self):\n", - " return (1.0 * (nx.adjacency_matrix(self.graph)>0)).toarray()\n", - " \n", - " def build(self, input_shape): \n", - " self.w = self.add_weight(\n", - " name = 'w', \n", - " shape = (input_shape[1], self.output_dim), \n", - " initializer = 'normal', trainable = True\n", - " ) \n", - " self._adj = tf.constant(self.preprocess_graph(self.adj), shape=self.adj.shape, dtype=np.float32)\n", - " super(GraphConvolution, self).build(input_shape)\n", - "\n", - " def call(self, input_data): \n", - " x = K.dot(input_data, self.w)\n", - " x = K.dot(self._adj, x) \n", - " return self.activation(x)\n", - " \n", - " def compute_output_shape(self, input_shape): \n", - " return (input_shape[0], self.output_dim)\n", - "\n", - "class InnerProductDecoder(Layer):\n", - " \"\"\"Decoder model layer for link prediction.\"\"\"\n", - "\n", - " def __init__(self, **kwargs): \n", - " self.activation = tf.nn.sigmoid\n", - " super(InnerProductDecoder, self).__init__(**kwargs)\n", - " \n", - " def call(self, inputs):\n", - " x = tf.transpose(inputs)\n", - " x = tf.matmul(inputs, x)\n", - " # x = tf.reshape(x, [-1])\n", - " return self.activation(x)\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "60d07cde-ca32-447b-a7a2-d2555145995c", - "metadata": {}, - "outputs": [], - "source": [ - "from keras import layers" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "b35bf403-e13c-4737-82e9-e93d63807bd2", - "metadata": {}, - "outputs": [], - "source": [ - "from keras import Input, Model\n", - "\n", - "n = len(G.nodes())\n", - "\n", - "input_img = Input(shape=(n), batch_size=n) \n", - "\n", - "hidden = GraphConvolution(10, G, activation=tf.nn.relu)(input_img)\n", - "embedding = GraphConvolution(2, G, activation=tf.nn.relu)(hidden)\n", - "\n", - "reconstructed = InnerProductDecoder()(embedding)" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "2526f174-272a-4539-bd92-28f2a223404c", - "metadata": {}, - "outputs": [], - "source": [ - "encoder = Model(input_img, embedding)\n", - "\n", - "model = Model(input_img, reconstructed)" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "e2034e03-e0bf-4b51-ba8d-a6e71840afb5", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Model: \"model_1\"\n", - "_________________________________________________________________\n", - " Layer (type) Output Shape Param # \n", - "=================================================================\n", - " input_1 (InputLayer) [(1660, 1660)] 0 \n", - " \n", - " graph_convolution (GraphCo (1660, 10) 16600 \n", - " nvolution) \n", - " \n", - " graph_convolution_1 (Graph (1660, 2) 20 \n", - " Convolution) \n", - " \n", - " inner_product_decoder (Inn (1660, 1660) 0 \n", - " erProductDecoder) \n", - " \n", - "=================================================================\n", - "Total params: 16620 (64.92 KB)\n", - "Trainable params: 16620 (64.92 KB)\n", - "Non-trainable params: 0 (0.00 Byte)\n", - "_________________________________________________________________\n" - ] - } - ], - "source": [ - "model.summary()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "22d4544e-d0cb-4f6b-9e62-91c842ad0316", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "32cbba17-79c8-4a99-80b5-6ab2ea174d02", - "metadata": {}, - "outputs": [], - "source": [ - "model.compile(optimizer='adam', loss='binary_crossentropy')" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "9defa7df-0e1f-4845-a4d3-aa16f4040258", - "metadata": {}, - "outputs": [], - "source": [ - "x_train = np.eye(n)" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "87da59a8-3ef5-4217-9d48-7c116df1ff3c", - "metadata": {}, - "outputs": [], - "source": [ - "y_train = adj" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "id": "23d1151f-8a5c-498a-9ef7-6a63f9f62d1a", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1/1 [==============================] - 0s 257ms/step - loss: 0.6931\n", - "1/1 [==============================] - 0s 21ms/step - loss: 0.6931\n", - "1/1 [==============================] - 0s 19ms/step - loss: 0.6931\n", - "1/1 [==============================] - 0s 20ms/step - loss: 0.6931\n", - "1/1 [==============================] - 0s 20ms/step - loss: 0.6931\n", - "1/1 [==============================] - 0s 21ms/step - loss: 0.6931\n", - "1/1 [==============================] - 0s 19ms/step - loss: 0.6931\n", - "1/1 [==============================] - 0s 21ms/step - loss: 0.6931\n", - "1/1 [==============================] - 0s 20ms/step - loss: 0.6931\n", - "1/1 [==============================] - 0s 19ms/step - loss: 0.6931\n", - "1/1 [==============================] - 0s 19ms/step - loss: 0.6931\n", - "1/1 [==============================] - 0s 19ms/step - loss: 0.6931\n", - "1/1 [==============================] - 0s 20ms/step - loss: 0.6931\n", - "1/1 [==============================] - 0s 19ms/step - loss: 0.6931\n", - "1/1 [==============================] - 0s 19ms/step - loss: 0.6931\n", - "1/1 [==============================] - 0s 19ms/step - loss: 0.6931\n", - "1/1 [==============================] - 0s 20ms/step - loss: 0.6931\n", - "1/1 [==============================] - 0s 20ms/step - loss: 0.6931\n", - "1/1 [==============================] - 0s 19ms/step - loss: 0.6931\n", - "1/1 [==============================] - 0s 22ms/step - loss: 0.6931\n" - ] - } - ], - "source": [ - "for _ in range(20):\n", - " model.fit(x_train, y_train, batch_size=n)" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "id": "60eada40-4cd2-4f2b-acfa-7cbc2191cb7d", - "metadata": {}, - "outputs": [], - "source": [ - "output = encoder(x_train)" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "id": "09bd37d3-db11-4c05-b5d8-caf2a46003bf", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "output" - ] - }, - { - "cell_type": "code", - "execution_count": 82, - "id": "18517bc8-bf62-4580-a7e8-2df47a956d02", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Model: \"sequential_10\"\n", - "_________________________________________________________________\n", - " Layer (type) Output Shape Param # \n", - "=================================================================\n", - " graph_convolution_9 (Graph (34, 10) 340 \n", - " Convolution) \n", - " \n", - " graph_convolution_10 (Grap (34, 4) 40 \n", - " hConvolution) \n", - " \n", - "=================================================================\n", - "Total params: 380 (1.48 KB)\n", - "Trainable params: 380 (1.48 KB)\n", - "Non-trainable params: 0 (0.00 Byte)\n", - "_________________________________________________________________\n" - ] - } - ], - "source": [ - "model.summary()" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "id": "60a7ebb9-97ca-4e26-b4d6-493b29bdd6bb", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "34" - ] - }, - "execution_count": 45, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "len(G.nodes)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "05dbbce6-3411-4d9f-9672-678a68df86d2", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "e0864159-6280-4e8c-8efc-31c280eaad1a", - "metadata": {}, - "outputs": [], - "source": [ - " \n", - " def __init__(self, input_dim, output_dim, adj, dropout=0., act=tf.nn.relu):\n", - " self.dropout = dropout\n", - " self.adj = adj\n", - " self.act = act\n", - "\n", - " def _call(self, inputs):\n", - " x = inputs\n", - " x = tf.nn.dropout(x, 1-self.dropout)\n", - " x = tf.matmul(x, self.vars['weights'])\n", - " x = tf.sparse_tensor_dense_matmul(self.adj, x)\n", - " outputs = self.act(x)\n", - " return outputs" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "45a82e05-1059-4f87-bbd2-b27e774e1966", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "graph-machine-learning", - "language": "python", - "name": "graph-machine-learning" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.14" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/ChapterNN/GraphAutoEncoder_SG.ipynb b/ChapterNN/GraphAutoEncoder_SG.ipynb deleted file mode 100644 index 71eee03..0000000 --- a/ChapterNN/GraphAutoEncoder_SG.ipynb +++ /dev/null @@ -1,445 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "393d1f8c-162d-43c6-9d3a-3e795bf6467a", - "metadata": {}, - "source": [ - "# Graph AutoEncoder with StellarGraph" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "65a6d0fb-bb0f-4af0-8ba9-6a0c902cec49", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2024-04-14 20:51:03.017370: W tensorflow/stream_executor/platform/default/dso_loader.cc:60] Could not load dynamic library 'libcudart.so.11.0'; dlerror: libcudart.so.11.0: cannot open shared object file: No such file or directory\n", - "2024-04-14 20:51:03.017425: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine.\n", - "2024-04-14 20:51:05.405762: I tensorflow/compiler/jit/xla_cpu_device.cc:41] Not creating XLA devices, tf_xla_enable_xla_devices not set\n", - "2024-04-14 20:51:05.406097: W tensorflow/stream_executor/platform/default/dso_loader.cc:60] Could not load dynamic library 'libcuda.so.1'; dlerror: libcuda.so.1: cannot open shared object file: No such file or directory\n", - "2024-04-14 20:51:05.406114: W tensorflow/stream_executor/cuda/cuda_driver.cc:326] failed call to cuInit: UNKNOWN ERROR (303)\n", - "2024-04-14 20:51:05.406137: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:156] kernel driver does not appear to be running on this host (ip-172-31-23-216): /proc/driver/nvidia/version does not exist\n", - "2024-04-14 20:51:05.406743: I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: AVX2 FMA\n", - "To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.\n", - "2024-04-14 20:51:05.407335: I tensorflow/compiler/jit/xla_gpu_device.cc:99] Not creating XLA devices, tf_xla_enable_xla_devices not set\n" - ] - } - ], - "source": [ - "from stellargraph.data import EdgeSplitter\n", - "from stellargraph.mapper import FullBatchLinkGenerator\n", - "from stellargraph.layer import GCN, LinkEmbedding\n", - "\n", - "\n", - "from tensorflow import keras\n", - "from stellargraph import datasets" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "1d27bd90-c522-48e2-9929-7417b3ce904b", - "metadata": {}, - "outputs": [], - "source": [ - "dataset = datasets.Cora()\n", - "G, _ = dataset.load()" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "4e59277b-12b7-4e8f-9cdc-eaf4c96d1771", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "StellarGraph: Undirected multigraph\n", - " Nodes: 2708, Edges: 5429\n", - "\n", - " Node types:\n", - " paper: [2708]\n", - " Features: float32 vector, length 1433\n", - " Edge types: paper-cites->paper\n", - "\n", - " Edge types:\n", - " paper-cites->paper: [5429]\n", - " Weights: all 1 (default)\n", - " Features: none\n" - ] - } - ], - "source": [ - "print(G.info())" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "4ab4de94-e416-49b2-8e02-5217d5f410e5", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "** Sampled 542 positive and 542 negative edges. **\n", - "** Sampled 542 positive and 542 negative edges. **\n" - ] - } - ], - "source": [ - "edge_splitter_test = EdgeSplitter(G)\n", - "\n", - "G_test, edge_ids_test, edge_labels_test = edge_splitter_test.train_test_split(\n", - " p=0.1, method=\"global\", keep_connected=True\n", - ")\n", - "\n", - "edge_splitter_train = EdgeSplitter(G_test)\n", - "\n", - "G_train, edge_ids_train, edge_labels_train = edge_splitter_test.train_test_split(\n", - " p=0.1, method=\"global\", keep_connected=True\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "261e8cdd-455d-4607-a95c-c26ec6aaf109", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Using GCN (local pooling) filters...\n" - ] - } - ], - "source": [ - "train_gen = FullBatchLinkGenerator(G, method=\"gcn\")\n", - "train_flow = train_gen.flow(edge_ids_train, edge_labels_train)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "5820186d-1728-494b-9e2c-6a906d7ff3f5", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Using GCN (local pooling) filters...\n" - ] - } - ], - "source": [ - "test_gen = FullBatchLinkGenerator(G, method=\"gcn\")\n", - "test_flow = train_gen.flow(edge_ids_test, edge_labels_test)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "7897bc20-a2eb-4887-8bde-3ca5756cd62d", - "metadata": {}, - "outputs": [], - "source": [ - "gcn = GCN(\n", - " layer_sizes=[16, 16], activations=[\"relu\", \"relu\"], generator=train_gen, dropout=0.3\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "c27562a4-9f93-4c23-87b1-ad3a0f46c19a", - "metadata": {}, - "outputs": [], - "source": [ - "x_inp, x_out = gcn.in_out_tensors()" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "be2d54a1-9561-410a-9c8f-54b805450dc3", - "metadata": {}, - "outputs": [], - "source": [ - "prediction = LinkEmbedding(activation=\"relu\", method=\"ip\")(x_out)" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "38cd0093-ef71-4110-8f59-43e510b86edc", - "metadata": {}, - "outputs": [], - "source": [ - "prediction = keras.layers.Reshape((-1,))(prediction)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "33ccc882-df0c-40ad-a401-725b3a64aac3", - "metadata": {}, - "outputs": [], - "source": [ - "model = keras.Model(inputs=x_inp, outputs=prediction)\n", - "\n", - "model.compile(\n", - " optimizer=keras.optimizers.Adam(lr=0.01),\n", - " loss=keras.losses.binary_crossentropy,\n", - " metrics=[\"binary_accuracy\"],\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "1dbc5d61-4e11-4ec8-bb06-8b206beb698d", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Model: \"model\"\n", - "__________________________________________________________________________________________________\n", - "Layer (type) Output Shape Param # Connected to \n", - "==================================================================================================\n", - "input_1 (InputLayer) [(1, 2708, 1433)] 0 \n", - "__________________________________________________________________________________________________\n", - "input_3 (InputLayer) [(1, None, 2)] 0 \n", - "__________________________________________________________________________________________________\n", - "input_4 (InputLayer) [(1, None)] 0 \n", - "__________________________________________________________________________________________________\n", - "dropout (Dropout) (1, 2708, 1433) 0 input_1[0][0] \n", - "__________________________________________________________________________________________________\n", - "squeezed_sparse_conversion (Squ (2708, 2708) 0 input_3[0][0] \n", - " input_4[0][0] \n", - "__________________________________________________________________________________________________\n", - "graph_convolution (GraphConvolu (1, None, 16) 22944 dropout[0][0] \n", - " squeezed_sparse_conversion[0][0] \n", - "__________________________________________________________________________________________________\n", - "dropout_1 (Dropout) (1, None, 16) 0 graph_convolution[0][0] \n", - "__________________________________________________________________________________________________\n", - "graph_convolution_1 (GraphConvo (1, None, 16) 272 dropout_1[0][0] \n", - " squeezed_sparse_conversion[0][0] \n", - "__________________________________________________________________________________________________\n", - "input_2 (InputLayer) [(1, None, 2)] 0 \n", - "__________________________________________________________________________________________________\n", - "gather_indices (GatherIndices) (1, None, 2, 16) 0 graph_convolution_1[0][0] \n", - " input_2[0][0] \n", - "__________________________________________________________________________________________________\n", - "link_embedding (LinkEmbedding) (1, None, 1) 0 gather_indices[0][0] \n", - "__________________________________________________________________________________________________\n", - "reshape (Reshape) (1, None) 0 link_embedding[0][0] \n", - "==================================================================================================\n", - "Total params: 23,216\n", - "Trainable params: 23,216\n", - "Non-trainable params: 0\n", - "__________________________________________________________________________________________________\n" - ] - } - ], - "source": [ - "model.summary()" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "d5760e12-f39a-4ce8-8c9d-9ba8ae61d4ab", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Epoch 1/50\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2024-04-14 20:51:09.165646: I tensorflow/compiler/mlir/mlir_graph_optimization_pass.cc:116] None of the MLIR optimization passes are enabled (registered 2)\n", - "2024-04-14 20:51:09.167036: I tensorflow/core/platform/profile_utils/cpu_utils.cc:112] CPU Frequency: 2199990000 Hz\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1/1 [==============================] - 3s 3s/step - loss: 1.7554 - binary_accuracy: 0.5000 - val_loss: 0.8120 - val_binary_accuracy: 0.6827\n", - "Epoch 2/50\n", - "1/1 [==============================] - 0s 164ms/step - loss: 1.0576 - binary_accuracy: 0.6531 - val_loss: 0.6350 - val_binary_accuracy: 0.7149\n", - "Epoch 3/50\n", - "1/1 [==============================] - 0s 153ms/step - loss: 0.7307 - binary_accuracy: 0.7002 - val_loss: 0.5587 - val_binary_accuracy: 0.7269\n", - "Epoch 4/50\n", - "1/1 [==============================] - 0s 158ms/step - loss: 0.6061 - binary_accuracy: 0.7399 - val_loss: 0.5700 - val_binary_accuracy: 0.6827\n", - "Epoch 5/50\n", - "1/1 [==============================] - 0s 176ms/step - loss: 0.5755 - binary_accuracy: 0.7251 - val_loss: 0.5588 - val_binary_accuracy: 0.6919\n", - "Epoch 6/50\n", - "1/1 [==============================] - 0s 163ms/step - loss: 0.5843 - binary_accuracy: 0.7315 - val_loss: 0.5381 - val_binary_accuracy: 0.7149\n", - "Epoch 7/50\n", - "1/1 [==============================] - 0s 195ms/step - loss: 0.5433 - binary_accuracy: 0.7648 - val_loss: 0.5256 - val_binary_accuracy: 0.7435\n", - "Epoch 8/50\n", - "1/1 [==============================] - 0s 181ms/step - loss: 0.5151 - binary_accuracy: 0.7906 - val_loss: 0.5259 - val_binary_accuracy: 0.7731\n", - "Epoch 9/50\n", - "1/1 [==============================] - 0s 149ms/step - loss: 0.5070 - binary_accuracy: 0.8035 - val_loss: 0.5138 - val_binary_accuracy: 0.7851\n", - "Epoch 10/50\n", - "1/1 [==============================] - 0s 187ms/step - loss: 0.5033 - binary_accuracy: 0.8026 - val_loss: 0.5045 - val_binary_accuracy: 0.7897\n", - "Epoch 11/50\n", - "1/1 [==============================] - 0s 154ms/step - loss: 0.4682 - binary_accuracy: 0.8293 - val_loss: 0.4867 - val_binary_accuracy: 0.7961\n", - "Epoch 12/50\n", - "1/1 [==============================] - 0s 162ms/step - loss: 0.4501 - binary_accuracy: 0.8312 - val_loss: 0.4656 - val_binary_accuracy: 0.8026\n", - "Epoch 13/50\n", - "1/1 [==============================] - 0s 165ms/step - loss: 0.4569 - binary_accuracy: 0.8423 - val_loss: 0.4555 - val_binary_accuracy: 0.7980\n", - "Epoch 14/50\n", - "1/1 [==============================] - 0s 146ms/step - loss: 0.4403 - binary_accuracy: 0.8441 - val_loss: 0.4614 - val_binary_accuracy: 0.7934\n", - "Epoch 15/50\n", - "1/1 [==============================] - 0s 159ms/step - loss: 0.4149 - binary_accuracy: 0.8487 - val_loss: 0.4693 - val_binary_accuracy: 0.7878\n", - "Epoch 16/50\n", - "1/1 [==============================] - 0s 153ms/step - loss: 0.3807 - binary_accuracy: 0.8589 - val_loss: 0.4902 - val_binary_accuracy: 0.7878\n", - "Epoch 17/50\n", - "1/1 [==============================] - 0s 153ms/step - loss: 0.3621 - binary_accuracy: 0.8681 - val_loss: 0.4975 - val_binary_accuracy: 0.7989\n", - "Epoch 18/50\n", - "1/1 [==============================] - 0s 169ms/step - loss: 0.3691 - binary_accuracy: 0.8745 - val_loss: 0.5008 - val_binary_accuracy: 0.8090\n", - "Epoch 19/50\n", - "1/1 [==============================] - 0s 185ms/step - loss: 0.3495 - binary_accuracy: 0.8718 - val_loss: 0.4921 - val_binary_accuracy: 0.8146\n", - "Epoch 20/50\n", - "1/1 [==============================] - 0s 167ms/step - loss: 0.3623 - binary_accuracy: 0.8875 - val_loss: 0.4966 - val_binary_accuracy: 0.8183\n", - "Epoch 21/50\n", - "1/1 [==============================] - 0s 179ms/step - loss: 0.3405 - binary_accuracy: 0.8911 - val_loss: 0.4849 - val_binary_accuracy: 0.8210\n", - "Epoch 22/50\n", - "1/1 [==============================] - 0s 187ms/step - loss: 0.3204 - binary_accuracy: 0.9041 - val_loss: 0.4923 - val_binary_accuracy: 0.8247\n", - "Epoch 23/50\n", - "1/1 [==============================] - 0s 186ms/step - loss: 0.3239 - binary_accuracy: 0.8884 - val_loss: 0.4892 - val_binary_accuracy: 0.8201\n", - "Epoch 24/50\n", - "1/1 [==============================] - 0s 179ms/step - loss: 0.2930 - binary_accuracy: 0.9068 - val_loss: 0.4824 - val_binary_accuracy: 0.8127\n", - "Epoch 25/50\n", - "1/1 [==============================] - 0s 210ms/step - loss: 0.3045 - binary_accuracy: 0.9161 - val_loss: 0.5034 - val_binary_accuracy: 0.8127\n", - "Epoch 26/50\n", - "1/1 [==============================] - 0s 184ms/step - loss: 0.2860 - binary_accuracy: 0.9013 - val_loss: 0.5075 - val_binary_accuracy: 0.8109\n", - "Epoch 27/50\n", - "1/1 [==============================] - 0s 169ms/step - loss: 0.2731 - binary_accuracy: 0.9022 - val_loss: 0.5101 - val_binary_accuracy: 0.8072\n", - "Epoch 28/50\n", - "1/1 [==============================] - 0s 167ms/step - loss: 0.3041 - binary_accuracy: 0.9004 - val_loss: 0.5089 - val_binary_accuracy: 0.8063\n", - "Epoch 29/50\n", - "1/1 [==============================] - 0s 179ms/step - loss: 0.2890 - binary_accuracy: 0.9041 - val_loss: 0.4757 - val_binary_accuracy: 0.8054\n", - "Epoch 30/50\n", - "1/1 [==============================] - 0s 166ms/step - loss: 0.2740 - binary_accuracy: 0.8930 - val_loss: 0.4472 - val_binary_accuracy: 0.8164\n", - "Epoch 31/50\n", - "1/1 [==============================] - 0s 183ms/step - loss: 0.2598 - binary_accuracy: 0.9004 - val_loss: 0.4496 - val_binary_accuracy: 0.8146\n", - "Epoch 32/50\n", - "1/1 [==============================] - 0s 188ms/step - loss: 0.2497 - binary_accuracy: 0.9170 - val_loss: 0.4689 - val_binary_accuracy: 0.8210\n", - "Epoch 33/50\n", - "1/1 [==============================] - 0s 195ms/step - loss: 0.2481 - binary_accuracy: 0.9188 - val_loss: 0.5073 - val_binary_accuracy: 0.8247\n", - "Epoch 34/50\n", - "1/1 [==============================] - 0s 186ms/step - loss: 0.2445 - binary_accuracy: 0.9225 - val_loss: 0.5763 - val_binary_accuracy: 0.8321\n", - "Epoch 35/50\n", - "1/1 [==============================] - 0s 199ms/step - loss: 0.2731 - binary_accuracy: 0.9142 - val_loss: 0.6100 - val_binary_accuracy: 0.8321\n", - "Epoch 36/50\n", - "1/1 [==============================] - 0s 184ms/step - loss: 0.2528 - binary_accuracy: 0.9253 - val_loss: 0.6204 - val_binary_accuracy: 0.8358\n", - "Epoch 37/50\n", - "1/1 [==============================] - 0s 175ms/step - loss: 0.2569 - binary_accuracy: 0.9271 - val_loss: 0.5981 - val_binary_accuracy: 0.8367\n", - "Epoch 38/50\n", - "1/1 [==============================] - 0s 161ms/step - loss: 0.2356 - binary_accuracy: 0.9290 - val_loss: 0.5581 - val_binary_accuracy: 0.8386\n", - "Epoch 39/50\n", - "1/1 [==============================] - 0s 166ms/step - loss: 0.2166 - binary_accuracy: 0.9271 - val_loss: 0.5628 - val_binary_accuracy: 0.8330\n", - "Epoch 40/50\n", - "1/1 [==============================] - 0s 166ms/step - loss: 0.2046 - binary_accuracy: 0.9299 - val_loss: 0.5512 - val_binary_accuracy: 0.8339\n", - "Epoch 41/50\n", - "1/1 [==============================] - 0s 186ms/step - loss: 0.1790 - binary_accuracy: 0.9419 - val_loss: 0.5503 - val_binary_accuracy: 0.8321\n", - "Epoch 42/50\n", - "1/1 [==============================] - 0s 154ms/step - loss: 0.1999 - binary_accuracy: 0.9317 - val_loss: 0.5265 - val_binary_accuracy: 0.8293\n", - "Epoch 43/50\n", - "1/1 [==============================] - 0s 159ms/step - loss: 0.1884 - binary_accuracy: 0.9382 - val_loss: 0.5208 - val_binary_accuracy: 0.8284\n", - "Epoch 44/50\n", - "1/1 [==============================] - 0s 166ms/step - loss: 0.1580 - binary_accuracy: 0.9539 - val_loss: 0.5126 - val_binary_accuracy: 0.8229\n", - "Epoch 45/50\n", - "1/1 [==============================] - 0s 158ms/step - loss: 0.1776 - binary_accuracy: 0.9354 - val_loss: 0.5270 - val_binary_accuracy: 0.8220\n", - "Epoch 46/50\n", - "1/1 [==============================] - 0s 160ms/step - loss: 0.1691 - binary_accuracy: 0.9456 - val_loss: 0.5486 - val_binary_accuracy: 0.8247\n", - "Epoch 47/50\n", - "1/1 [==============================] - 0s 173ms/step - loss: 0.1720 - binary_accuracy: 0.9446 - val_loss: 0.6430 - val_binary_accuracy: 0.8284\n", - "Epoch 48/50\n", - "1/1 [==============================] - 0s 173ms/step - loss: 0.1775 - binary_accuracy: 0.9428 - val_loss: 0.6838 - val_binary_accuracy: 0.8312\n", - "Epoch 49/50\n", - "1/1 [==============================] - 0s 168ms/step - loss: 0.1780 - binary_accuracy: 0.9539 - val_loss: 0.6725 - val_binary_accuracy: 0.8339\n", - "Epoch 50/50\n", - "1/1 [==============================] - 0s 167ms/step - loss: 0.1728 - binary_accuracy: 0.9428 - val_loss: 0.6536 - val_binary_accuracy: 0.8312\n" - ] - } - ], - "source": [ - "history = model.fit(train_flow, validation_data=test_flow, epochs=50)" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "4d6f0caf-529a-4609-ade3-61715426e4b3", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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vuMKLVq48847tcTERM3T01MLDw/XJk+erH311Ve21+X+ua7zh9/SNLmXrmD27NladHS05unpqcXGxmqzZ8/WTp48aXu9q+6hTtM0rXOjsRBCCCGEEJeetJEVQgghhBAuSYKsEEIIIYRwSRJkhRBCCCGES5IgK4QQQgghXJIEWSGEEEII4ZIkyAohhBBCCJckQVYIIYQQQrgkCbJCCCGEEMIlSZAVQgjRpkmTJqHT6RxdDCGEuCAJskIIIYQQwiVJkBVCCCGEEC5JgqwQQgghhHBJEmSFEOIS27lzJzfffDNRUVF4enoSHx/Pr3/9a/Ly8lqc19Qm1WQy8eijj9KrVy8MBgN9+vThySefxGw2t3n9DRs2MH36dEJCQjAYDPTv35+HH36YioqKNs8/d+4cjzzyCEOGDMHHx4fAwEBSUlJ4+OGHqa6ubnV+Q0MDzzzzDP369cNgMBAfH89DDz10wfIIIURX0Wmapjm6EEII0V29+eab3HvvvRgMBq677jri4+M5ceIEa9asITIykh07dpCQkACoILtp0yauu+46du/ezc0334yHhwerV6/m1KlTXHvttaxZs6ZFB6wVK1Zw33334evryy233EJERAQbN25k586dDBo0iK1btxIUFGQ7PysriyuvvJLs7GxSU1OZOHEiVquV48eP8/XXX5ORkUFSUlKL8txyyy1s3ryZGTNmEBAQwOeff86JEyf41a9+xT//+c8u/fcUQogWNCGEEJdERkaG5uHhofXp00fLzc1t8drXX3+t6fV6bdasWbZjEydO1ACtX79+2rlz52zHa2trtcsuu0wDtH//+9+246dPn9Y8PT01f39/7ejRoy2uf99992mAds8997Q4PnbsWA3QnnnmmVblLS4u1mpra1uVZ+TIkVppaanteFVVldanTx9Nr9dr+fn5F/mvIoQQnUeaFgghxCXyyiuvUF9fz4svvkhsbGyL1yZPnsx1113H2rVrqaysbPHaY489RnBwsG3fy8uLxYsXA6qGt8nbb7+N2Wxm/vz5DBgwoMU1nn76afz9/fnPf/6DyWQCID09ne3btzN8+HAeeuihVuUNCwvDy8ur1fHnnnuOkJAQ276vry+33XYbVquVPXv2tPefQwghOp27owsghBDd1fbt2wHYtGkTu3fvbvV6UVERFouF48ePk5qaajs+ceLEVudefvnl/7+9+wlJZY3DOP5wShKCIsiiQjCIUFyI1SJaSZuCtlGbaVHLahMRlBAErvoHQa1b1SYQ2uamzKBW5lKqVdBfkiQipDLv4qIcz3TPqXuT28D3A+L4833fmXEhDy/vzKisrEzHx8eFWjwelyR1d3eb2tfU1Mjv92t/f1/JZFI+n09HR0eSpJ6eHv348fF5jI6ODlPN6XRKku7v7z88DgB8NYIsAJRIKpWSJC0uLv623ePjY9Hn+vp6U5vy8nLV1tbq9va2UMtfzNXQ0PDuuPl6Op0uev91dvhPfl5j+/PxSFI2m/3UWADwlVhaAAAlUl1dLenvwJnL5f7x9esM7M3NjWms19dX3d3dqaqqyjT+9fX1u/u/uroqapcPpBcXF//xzADgeyDIAkCJdHZ2SpJisdin+kWjUVPt4OBA2WxWfr+/UMtv7+3tmdqn02klEgnZ7XZ5PJ6i49nZ2dHb29unjgkAviOCLACUyPj4uGw2myYmJnRycmL6/vn5+d2QGwqFitaeZjIZzczMSJKGh4cLdcMwZLPZtLq6qrOzs6IxZmdn9fDwIMMwVFFRIUlqb29XV1eXEomE5ufnTftNpVLKZDL/7mQB4H/AGlkAKBG326319XWNjIzI6/Wqt7dXra2tenl50fn5uWKxmBwOh5LJZFE/j8cjr9druo9sX1+fhoaGCu1cLpdWVlY0NjamtrY2DQwMyOFwKBqN6vDwUG632xRYNzY2FAgEFAwGFQ6HFQgElMvldHp6qkgkomQyWbiPLAB8dwRZACghwzDk8/m0vLys3d1dRSIRVVZWqrGxUf39/RocHDT12draUigU0ubmpi4vL9XU1KS5uTlNT08XPQxBkkZHR9XS0qKlpSWFw2E9PT3J6XRqampKwWDQdKFWc3Oz4vG4FhYWtL29rbW1NdntdrlcLk1OTqqurq6kvwcAfCWe7AUA30T+SVr8LQPAx7BGFgAAAJZEkAUAAIAlEWQBAABgSayRBQAAgCUxIwsAAABLIsgCAADAkgiyAAAAsCSCLAAAACyJIAsAAABLIsgCAADAkgiyAAAAsCSCLAAAACzpL9aQN7ZM8LmoAAAAAElFTkSuQmCC", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "from stellargraph.utils import plot_history\n", - "\n", - "plot_history(history)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9e2130e3-6710-4d60-afa2-c0c7254921a5", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "py3.8", - "language": "python", - "name": "py3.8" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.10" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/ChapterNN/poetry.lock b/ChapterNN/poetry.lock index 975e5ff..9203f0f 100644 --- a/ChapterNN/poetry.lock +++ b/ChapterNN/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. [[package]] name = "absl-py" @@ -11,6 +11,116 @@ files = [ {file = "absl_py-2.1.0-py3-none-any.whl", hash = "sha256:526a04eadab8b4ee719ce68f204172ead1027549089702d99b9059f129ff1308"}, ] +[[package]] +name = "aiohttp" +version = "3.9.4" +description = "Async http client/server framework (asyncio)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "aiohttp-3.9.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:76d32588ef7e4a3f3adff1956a0ba96faabbdee58f2407c122dd45aa6e34f372"}, + {file = "aiohttp-3.9.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:56181093c10dbc6ceb8a29dfeea1e815e1dfdc020169203d87fd8d37616f73f9"}, + {file = "aiohttp-3.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c7a5b676d3c65e88b3aca41816bf72831898fcd73f0cbb2680e9d88e819d1e4d"}, + {file = "aiohttp-3.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1df528a85fb404899d4207a8d9934cfd6be626e30e5d3a5544a83dbae6d8a7e"}, + {file = "aiohttp-3.9.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f595db1bceabd71c82e92df212dd9525a8a2c6947d39e3c994c4f27d2fe15b11"}, + {file = "aiohttp-3.9.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c0b09d76e5a4caac3d27752027fbd43dc987b95f3748fad2b924a03fe8632ad"}, + {file = "aiohttp-3.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:689eb4356649ec9535b3686200b231876fb4cab4aca54e3bece71d37f50c1d13"}, + {file = "aiohttp-3.9.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3666cf4182efdb44d73602379a66f5fdfd5da0db5e4520f0ac0dcca644a3497"}, + {file = "aiohttp-3.9.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b65b0f8747b013570eea2f75726046fa54fa8e0c5db60f3b98dd5d161052004a"}, + {file = "aiohttp-3.9.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a1885d2470955f70dfdd33a02e1749613c5a9c5ab855f6db38e0b9389453dce7"}, + {file = "aiohttp-3.9.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:0593822dcdb9483d41f12041ff7c90d4d1033ec0e880bcfaf102919b715f47f1"}, + {file = "aiohttp-3.9.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:47f6eb74e1ecb5e19a78f4a4228aa24df7fbab3b62d4a625d3f41194a08bd54f"}, + {file = "aiohttp-3.9.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c8b04a3dbd54de6ccb7604242fe3ad67f2f3ca558f2d33fe19d4b08d90701a89"}, + {file = "aiohttp-3.9.4-cp310-cp310-win32.whl", hash = "sha256:8a78dfb198a328bfb38e4308ca8167028920fb747ddcf086ce706fbdd23b2926"}, + {file = "aiohttp-3.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:e78da6b55275987cbc89141a1d8e75f5070e577c482dd48bd9123a76a96f0bbb"}, + {file = "aiohttp-3.9.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c111b3c69060d2bafc446917534150fd049e7aedd6cbf21ba526a5a97b4402a5"}, + {file = "aiohttp-3.9.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:efbdd51872cf170093998c87ccdf3cb5993add3559341a8e5708bcb311934c94"}, + {file = "aiohttp-3.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7bfdb41dc6e85d8535b00d73947548a748e9534e8e4fddd2638109ff3fb081df"}, + {file = "aiohttp-3.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2bd9d334412961125e9f68d5b73c1d0ab9ea3f74a58a475e6b119f5293eee7ba"}, + {file = "aiohttp-3.9.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:35d78076736f4a668d57ade00c65d30a8ce28719d8a42471b2a06ccd1a2e3063"}, + {file = "aiohttp-3.9.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:824dff4f9f4d0f59d0fa3577932ee9a20e09edec8a2f813e1d6b9f89ced8293f"}, + {file = "aiohttp-3.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:52b8b4e06fc15519019e128abedaeb56412b106ab88b3c452188ca47a25c4093"}, + {file = "aiohttp-3.9.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eae569fb1e7559d4f3919965617bb39f9e753967fae55ce13454bec2d1c54f09"}, + {file = "aiohttp-3.9.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:69b97aa5792428f321f72aeb2f118e56893371f27e0b7d05750bcad06fc42ca1"}, + {file = "aiohttp-3.9.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4d79aad0ad4b980663316f26d9a492e8fab2af77c69c0f33780a56843ad2f89e"}, + {file = "aiohttp-3.9.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:d6577140cd7db19e430661e4b2653680194ea8c22c994bc65b7a19d8ec834403"}, + {file = "aiohttp-3.9.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:9860d455847cd98eb67897f5957b7cd69fbcb436dd3f06099230f16a66e66f79"}, + {file = "aiohttp-3.9.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:69ff36d3f8f5652994e08bd22f093e11cfd0444cea310f92e01b45a4e46b624e"}, + {file = "aiohttp-3.9.4-cp311-cp311-win32.whl", hash = "sha256:e27d3b5ed2c2013bce66ad67ee57cbf614288bda8cdf426c8d8fe548316f1b5f"}, + {file = "aiohttp-3.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:d6a67e26daa686a6fbdb600a9af8619c80a332556245fa8e86c747d226ab1a1e"}, + {file = "aiohttp-3.9.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:c5ff8ff44825736a4065d8544b43b43ee4c6dd1530f3a08e6c0578a813b0aa35"}, + {file = "aiohttp-3.9.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d12a244627eba4e9dc52cbf924edef905ddd6cafc6513849b4876076a6f38b0e"}, + {file = "aiohttp-3.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:dcad56c8d8348e7e468899d2fb3b309b9bc59d94e6db08710555f7436156097f"}, + {file = "aiohttp-3.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f7e69a7fd4b5ce419238388e55abd220336bd32212c673ceabc57ccf3d05b55"}, + {file = "aiohttp-3.9.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4870cb049f10d7680c239b55428916d84158798eb8f353e74fa2c98980dcc0b"}, + {file = "aiohttp-3.9.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b2feaf1b7031ede1bc0880cec4b0776fd347259a723d625357bb4b82f62687b"}, + {file = "aiohttp-3.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:939393e8c3f0a5bcd33ef7ace67680c318dc2ae406f15e381c0054dd658397de"}, + {file = "aiohttp-3.9.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d2334e387b2adcc944680bebcf412743f2caf4eeebd550f67249c1c3696be04"}, + {file = "aiohttp-3.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e0198ea897680e480845ec0ffc5a14e8b694e25b3f104f63676d55bf76a82f1a"}, + {file = "aiohttp-3.9.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:e40d2cd22914d67c84824045861a5bb0fb46586b15dfe4f046c7495bf08306b2"}, + {file = "aiohttp-3.9.4-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:aba80e77c227f4234aa34a5ff2b6ff30c5d6a827a91d22ff6b999de9175d71bd"}, + {file = "aiohttp-3.9.4-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:fb68dc73bc8ac322d2e392a59a9e396c4f35cb6fdbdd749e139d1d6c985f2527"}, + {file = "aiohttp-3.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f3460a92638dce7e47062cf088d6e7663adb135e936cb117be88d5e6c48c9d53"}, + {file = "aiohttp-3.9.4-cp312-cp312-win32.whl", hash = "sha256:32dc814ddbb254f6170bca198fe307920f6c1308a5492f049f7f63554b88ef36"}, + {file = "aiohttp-3.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:63f41a909d182d2b78fe3abef557fcc14da50c7852f70ae3be60e83ff64edba5"}, + {file = "aiohttp-3.9.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c3770365675f6be220032f6609a8fbad994d6dcf3ef7dbcf295c7ee70884c9af"}, + {file = "aiohttp-3.9.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:305edae1dea368ce09bcb858cf5a63a064f3bff4767dec6fa60a0cc0e805a1d3"}, + {file = "aiohttp-3.9.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6f121900131d116e4a93b55ab0d12ad72573f967b100e49086e496a9b24523ea"}, + {file = "aiohttp-3.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b71e614c1ae35c3d62a293b19eface83d5e4d194e3eb2fabb10059d33e6e8cbf"}, + {file = "aiohttp-3.9.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:419f009fa4cfde4d16a7fc070d64f36d70a8d35a90d71aa27670bba2be4fd039"}, + {file = "aiohttp-3.9.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7b39476ee69cfe64061fd77a73bf692c40021f8547cda617a3466530ef63f947"}, + {file = "aiohttp-3.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b33f34c9c7decdb2ab99c74be6443942b730b56d9c5ee48fb7df2c86492f293c"}, + {file = "aiohttp-3.9.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c78700130ce2dcebb1a8103202ae795be2fa8c9351d0dd22338fe3dac74847d9"}, + {file = "aiohttp-3.9.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:268ba22d917655d1259af2d5659072b7dc11b4e1dc2cb9662fdd867d75afc6a4"}, + {file = "aiohttp-3.9.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:17e7c051f53a0d2ebf33013a9cbf020bb4e098c4bc5bce6f7b0c962108d97eab"}, + {file = "aiohttp-3.9.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:7be99f4abb008cb38e144f85f515598f4c2c8932bf11b65add0ff59c9c876d99"}, + {file = "aiohttp-3.9.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:d58a54d6ff08d2547656356eea8572b224e6f9bbc0cf55fa9966bcaac4ddfb10"}, + {file = "aiohttp-3.9.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7673a76772bda15d0d10d1aa881b7911d0580c980dbd16e59d7ba1422b2d83cd"}, + {file = "aiohttp-3.9.4-cp38-cp38-win32.whl", hash = "sha256:e4370dda04dc8951012f30e1ce7956a0a226ac0714a7b6c389fb2f43f22a250e"}, + {file = "aiohttp-3.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:eb30c4510a691bb87081192a394fb661860e75ca3896c01c6d186febe7c88530"}, + {file = "aiohttp-3.9.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:84e90494db7df3be5e056f91412f9fa9e611fbe8ce4aaef70647297f5943b276"}, + {file = "aiohttp-3.9.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7d4845f8501ab28ebfdbeab980a50a273b415cf69e96e4e674d43d86a464df9d"}, + {file = "aiohttp-3.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:69046cd9a2a17245c4ce3c1f1a4ff8c70c7701ef222fce3d1d8435f09042bba1"}, + {file = "aiohttp-3.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b73a06bafc8dcc508420db43b4dd5850e41e69de99009d0351c4f3007960019"}, + {file = "aiohttp-3.9.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:418bb0038dfafeac923823c2e63226179976c76f981a2aaad0ad5d51f2229bca"}, + {file = "aiohttp-3.9.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:71a8f241456b6c2668374d5d28398f8e8cdae4cce568aaea54e0f39359cd928d"}, + {file = "aiohttp-3.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:935c369bf8acc2dc26f6eeb5222768aa7c62917c3554f7215f2ead7386b33748"}, + {file = "aiohttp-3.9.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74e4e48c8752d14ecfb36d2ebb3d76d614320570e14de0a3aa7a726ff150a03c"}, + {file = "aiohttp-3.9.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:916b0417aeddf2c8c61291238ce25286f391a6acb6f28005dd9ce282bd6311b6"}, + {file = "aiohttp-3.9.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9b6787b6d0b3518b2ee4cbeadd24a507756ee703adbac1ab6dc7c4434b8c572a"}, + {file = "aiohttp-3.9.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:221204dbda5ef350e8db6287937621cf75e85778b296c9c52260b522231940ed"}, + {file = "aiohttp-3.9.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:10afd99b8251022ddf81eaed1d90f5a988e349ee7d779eb429fb07b670751e8c"}, + {file = "aiohttp-3.9.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2506d9f7a9b91033201be9ffe7d89c6a54150b0578803cce5cb84a943d075bc3"}, + {file = "aiohttp-3.9.4-cp39-cp39-win32.whl", hash = "sha256:e571fdd9efd65e86c6af2f332e0e95dad259bfe6beb5d15b3c3eca3a6eb5d87b"}, + {file = "aiohttp-3.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:7d29dd5319d20aa3b7749719ac9685fbd926f71ac8c77b2477272725f882072d"}, + {file = "aiohttp-3.9.4.tar.gz", hash = "sha256:6ff71ede6d9a5a58cfb7b6fffc83ab5d4a63138276c771ac91ceaaddf5459644"}, +] + +[package.dependencies] +aiosignal = ">=1.1.2" +async-timeout = {version = ">=4.0,<5.0", markers = "python_version < \"3.11\""} +attrs = ">=17.3.0" +frozenlist = ">=1.1.1" +multidict = ">=4.5,<7.0" +yarl = ">=1.0,<2.0" + +[package.extras] +speedups = ["Brotli", "aiodns", "brotlicffi"] + +[[package]] +name = "aiosignal" +version = "1.3.1" +description = "aiosignal: a list of registered asynchronous callbacks" +optional = false +python-versions = ">=3.7" +files = [ + {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, + {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, +] + +[package.dependencies] +frozenlist = ">=1.1.0" + [[package]] name = "appnope" version = "0.1.4" @@ -55,6 +165,36 @@ files = [ six = ">=1.6.1,<2.0" wheel = ">=0.23.0,<1.0" +[[package]] +name = "async-timeout" +version = "4.0.3" +description = "Timeout context manager for asyncio programs" +optional = false +python-versions = ">=3.7" +files = [ + {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, + {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, +] + +[[package]] +name = "attrs" +version = "23.2.0" +description = "Classes Without Boilerplate" +optional = false +python-versions = ">=3.7" +files = [ + {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, + {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, +] + +[package.extras] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] +tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] + [[package]] name = "backcall" version = "0.2.0" @@ -68,13 +208,13 @@ files = [ [[package]] name = "cachetools" -version = "4.2.4" +version = "5.3.3" description = "Extensible memoizing collections and decorators" optional = false -python-versions = "~=3.5" +python-versions = ">=3.7" files = [ - {file = "cachetools-4.2.4-py3-none-any.whl", hash = "sha256:92971d3cb7d2a97efff7c7bb1657f21a8f5fb309a37530537c71b1774189f2d1"}, - {file = "cachetools-4.2.4.tar.gz", hash = "sha256:89ea6f1b638d5a73a4f9226be57ac5e4f399d22770b92355f92dcb0f7f001693"}, + {file = "cachetools-5.3.3-py3-none-any.whl", hash = "sha256:0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945"}, + {file = "cachetools-5.3.3.tar.gz", hash = "sha256:ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105"}, ] [[package]] @@ -264,13 +404,13 @@ files = [ [[package]] name = "comm" -version = "0.2.1" +version = "0.2.2" description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." optional = false python-versions = ">=3.8" files = [ - {file = "comm-0.2.1-py3-none-any.whl", hash = "sha256:87928485c0dfc0e7976fd89fc1e187023cf587e7c353e4a9b417555b44adf021"}, - {file = "comm-0.2.1.tar.gz", hash = "sha256:0bc91edae1344d39d3661dcbc36937181fdaddb304790458f8b044dbc064b89a"}, + {file = "comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3"}, + {file = "comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e"}, ] [package.dependencies] @@ -352,29 +492,126 @@ tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipyth [[package]] name = "filelock" -version = "3.13.1" +version = "3.13.4" description = "A platform independent file lock." optional = false python-versions = ">=3.8" files = [ - {file = "filelock-3.13.1-py3-none-any.whl", hash = "sha256:57dbda9b35157b05fb3e58ee91448612eb674172fab98ee235ccb0b5bee19a1c"}, - {file = "filelock-3.13.1.tar.gz", hash = "sha256:521f5f56c50f8426f5e03ad3b281b490a87ef15bc6c526f168290f0c7148d44e"}, + {file = "filelock-3.13.4-py3-none-any.whl", hash = "sha256:404e5e9253aa60ad457cae1be07c0f0ca90a63931200a47d9b6a6af84fd7b45f"}, + {file = "filelock-3.13.4.tar.gz", hash = "sha256:d13f466618bfde72bd2c18255e269f72542c6e70e7bac83a0232d6b1cc5c8cf4"}, ] [package.extras] -docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.24)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] +docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] typing = ["typing-extensions (>=4.8)"] +[[package]] +name = "flatbuffers" +version = "2.0.7" +description = "The FlatBuffers serialization format for Python" +optional = false +python-versions = "*" +files = [ + {file = "flatbuffers-2.0.7-py2.py3-none-any.whl", hash = "sha256:71e135d533be527192819aaab757c5e3d109cb10fbb01e687f6bdb7a61ad39d1"}, + {file = "flatbuffers-2.0.7.tar.gz", hash = "sha256:0ae7d69c5b82bf41962ca5fde9cc43033bc9501311d975fd5a25e8a7d29c1245"}, +] + +[[package]] +name = "frozenlist" +version = "1.4.1" +description = "A list-like structure which implements collections.abc.MutableSequence" +optional = false +python-versions = ">=3.8" +files = [ + {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f9aa1878d1083b276b0196f2dfbe00c9b7e752475ed3b682025ff20c1c1f51ac"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:29acab3f66f0f24674b7dc4736477bcd4bc3ad4b896f5f45379a67bce8b96868"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:74fb4bee6880b529a0c6560885fce4dc95936920f9f20f53d99a213f7bf66776"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:590344787a90ae57d62511dd7c736ed56b428f04cd8c161fcc5e7232c130c69a"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:068b63f23b17df8569b7fdca5517edef76171cf3897eb68beb01341131fbd2ad"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c849d495bf5154cd8da18a9eb15db127d4dba2968d88831aff6f0331ea9bd4c"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9750cc7fe1ae3b1611bb8cfc3f9ec11d532244235d75901fb6b8e42ce9229dfe"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9b2de4cf0cdd5bd2dee4c4f63a653c61d2408055ab77b151c1957f221cabf2a"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0633c8d5337cb5c77acbccc6357ac49a1770b8c487e5b3505c57b949b4b82e98"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:27657df69e8801be6c3638054e202a135c7f299267f1a55ed3a598934f6c0d75"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:f9a3ea26252bd92f570600098783d1371354d89d5f6b7dfd87359d669f2109b5"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:4f57dab5fe3407b6c0c1cc907ac98e8a189f9e418f3b6e54d65a718aaafe3950"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e02a0e11cf6597299b9f3bbd3f93d79217cb90cfd1411aec33848b13f5c656cc"}, + {file = "frozenlist-1.4.1-cp310-cp310-win32.whl", hash = "sha256:a828c57f00f729620a442881cc60e57cfcec6842ba38e1b19fd3e47ac0ff8dc1"}, + {file = "frozenlist-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:f56e2333dda1fe0f909e7cc59f021eba0d2307bc6f012a1ccf2beca6ba362439"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a0cb6f11204443f27a1628b0e460f37fb30f624be6051d490fa7d7e26d4af3d0"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b46c8ae3a8f1f41a0d2ef350c0b6e65822d80772fe46b653ab6b6274f61d4a49"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fde5bd59ab5357e3853313127f4d3565fc7dad314a74d7b5d43c22c6a5ed2ced"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:722e1124aec435320ae01ee3ac7bec11a5d47f25d0ed6328f2273d287bc3abb0"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2471c201b70d58a0f0c1f91261542a03d9a5e088ed3dc6c160d614c01649c106"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c757a9dd70d72b076d6f68efdbb9bc943665ae954dad2801b874c8c69e185068"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f146e0911cb2f1da549fc58fc7bcd2b836a44b79ef871980d605ec392ff6b0d2"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9c515e7914626b2a2e1e311794b4c35720a0be87af52b79ff8e1429fc25f19"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c302220494f5c1ebeb0912ea782bcd5e2f8308037b3c7553fad0e48ebad6ad82"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:442acde1e068288a4ba7acfe05f5f343e19fac87bfc96d89eb886b0363e977ec"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:1b280e6507ea8a4fa0c0a7150b4e526a8d113989e28eaaef946cc77ffd7efc0a"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:fe1a06da377e3a1062ae5fe0926e12b84eceb8a50b350ddca72dc85015873f74"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:db9e724bebd621d9beca794f2a4ff1d26eed5965b004a97f1f1685a173b869c2"}, + {file = "frozenlist-1.4.1-cp311-cp311-win32.whl", hash = "sha256:e774d53b1a477a67838a904131c4b0eef6b3d8a651f8b138b04f748fccfefe17"}, + {file = "frozenlist-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:fb3c2db03683b5767dedb5769b8a40ebb47d6f7f45b1b3e3b4b51ec8ad9d9825"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1979bc0aeb89b33b588c51c54ab0161791149f2461ea7c7c946d95d5f93b56ae"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cc7b01b3754ea68a62bd77ce6020afaffb44a590c2289089289363472d13aedb"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c9c92be9fd329ac801cc420e08452b70e7aeab94ea4233a4804f0915c14eba9b"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c3894db91f5a489fc8fa6a9991820f368f0b3cbdb9cd8849547ccfab3392d86"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba60bb19387e13597fb059f32cd4d59445d7b18b69a745b8f8e5db0346f33480"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8aefbba5f69d42246543407ed2461db31006b0f76c4e32dfd6f42215a2c41d09"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780d3a35680ced9ce682fbcf4cb9c2bad3136eeff760ab33707b71db84664e3a"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9acbb16f06fe7f52f441bb6f413ebae6c37baa6ef9edd49cdd567216da8600cd"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:23b701e65c7b36e4bf15546a89279bd4d8675faabc287d06bbcfac7d3c33e1e6"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3e0153a805a98f5ada7e09826255ba99fb4f7524bb81bf6b47fb702666484ae1"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:dd9b1baec094d91bf36ec729445f7769d0d0cf6b64d04d86e45baf89e2b9059b"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:1a4471094e146b6790f61b98616ab8e44f72661879cc63fa1049d13ef711e71e"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5667ed53d68d91920defdf4035d1cdaa3c3121dc0b113255124bcfada1cfa1b8"}, + {file = "frozenlist-1.4.1-cp312-cp312-win32.whl", hash = "sha256:beee944ae828747fd7cb216a70f120767fc9f4f00bacae8543c14a6831673f89"}, + {file = "frozenlist-1.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:64536573d0a2cb6e625cf309984e2d873979709f2cf22839bf2d61790b448ad5"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:20b51fa3f588ff2fe658663db52a41a4f7aa6c04f6201449c6c7c476bd255c0d"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:410478a0c562d1a5bcc2f7ea448359fcb050ed48b3c6f6f4f18c313a9bdb1826"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c6321c9efe29975232da3bd0af0ad216800a47e93d763ce64f291917a381b8eb"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48f6a4533887e189dae092f1cf981f2e3885175f7a0f33c91fb5b7b682b6bab6"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6eb73fa5426ea69ee0e012fb59cdc76a15b1283d6e32e4f8dc4482ec67d1194d"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbeb989b5cc29e8daf7f976b421c220f1b8c731cbf22b9130d8815418ea45887"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32453c1de775c889eb4e22f1197fe3bdfe457d16476ea407472b9442e6295f7a"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693945278a31f2086d9bf3df0fe8254bbeaef1fe71e1351c3bd730aa7d31c41b"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1d0ce09d36d53bbbe566fe296965b23b961764c0bcf3ce2fa45f463745c04701"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3a670dc61eb0d0eb7080890c13de3066790f9049b47b0de04007090807c776b0"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:dca69045298ce5c11fd539682cff879cc1e664c245d1c64da929813e54241d11"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a06339f38e9ed3a64e4c4e43aec7f59084033647f908e4259d279a52d3757d09"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b7f2f9f912dca3934c1baec2e4585a674ef16fe00218d833856408c48d5beee7"}, + {file = "frozenlist-1.4.1-cp38-cp38-win32.whl", hash = "sha256:e7004be74cbb7d9f34553a5ce5fb08be14fb33bc86f332fb71cbe5216362a497"}, + {file = "frozenlist-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:5a7d70357e7cee13f470c7883a063aae5fe209a493c57d86eb7f5a6f910fae09"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bfa4a17e17ce9abf47a74ae02f32d014c5e9404b6d9ac7f729e01562bbee601e"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b7e3ed87d4138356775346e6845cccbe66cd9e207f3cd11d2f0b9fd13681359d"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c99169d4ff810155ca50b4da3b075cbde79752443117d89429595c2e8e37fed8"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edb678da49d9f72c9f6c609fbe41a5dfb9a9282f9e6a2253d5a91e0fc382d7c0"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6db4667b187a6742b33afbbaf05a7bc551ffcf1ced0000a571aedbb4aa42fc7b"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55fdc093b5a3cb41d420884cdaf37a1e74c3c37a31f46e66286d9145d2063bd0"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82e8211d69a4f4bc360ea22cd6555f8e61a1bd211d1d5d39d3d228b48c83a897"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89aa2c2eeb20957be2d950b85974b30a01a762f3308cd02bb15e1ad632e22dc7"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d3e0c25a2350080e9319724dede4f31f43a6c9779be48021a7f4ebde8b2d742"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7268252af60904bf52c26173cbadc3a071cece75f873705419c8681f24d3edea"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:0c250a29735d4f15321007fb02865f0e6b6a41a6b88f1f523ca1596ab5f50bd5"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:96ec70beabbd3b10e8bfe52616a13561e58fe84c0101dd031dc78f250d5128b9"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:23b2d7679b73fe0e5a4560b672a39f98dfc6f60df63823b0a9970525325b95f6"}, + {file = "frozenlist-1.4.1-cp39-cp39-win32.whl", hash = "sha256:a7496bfe1da7fb1a4e1cc23bb67c58fab69311cc7d32b5a99c2007b4b2a0e932"}, + {file = "frozenlist-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:e6a20a581f9ce92d389a8c7d7c3dd47c81fd5d6e655c8dddf341e14aa48659d0"}, + {file = "frozenlist-1.4.1-py3-none-any.whl", hash = "sha256:04ced3e6a46b4cfffe20f9ae482818e34eba9b5fb0ce4056e4cc9b6e212d09b7"}, + {file = "frozenlist-1.4.1.tar.gz", hash = "sha256:c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b"}, +] + [[package]] name = "fsspec" -version = "2024.2.0" +version = "2024.3.1" description = "File-system specification" optional = false python-versions = ">=3.8" files = [ - {file = "fsspec-2024.2.0-py3-none-any.whl", hash = "sha256:817f969556fa5916bc682e02ca2045f96ff7f586d45110fcb76022063ad2c7d8"}, - {file = "fsspec-2024.2.0.tar.gz", hash = "sha256:b6ad1a679f760dda52b1168c859d01b7b80648ea6f7f7c7f5a8a91dc3f3ecb84"}, + {file = "fsspec-2024.3.1-py3-none-any.whl", hash = "sha256:918d18d41bf73f0e2b261824baeb1b124bcf771767e3a26425cd7dec3332f512"}, + {file = "fsspec-2024.3.1.tar.gz", hash = "sha256:f39780e282d7d117ffb42bb96992f8a90795e4d0fb0f661a70ca39fe9c43ded9"}, ] [package.extras] @@ -403,51 +640,92 @@ tqdm = ["tqdm"] [[package]] name = "gast" -version = "0.3.3" +version = "0.4.0" description = "Python AST that abstracts the underlying Python version" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ - {file = "gast-0.3.3-py2.py3-none-any.whl", hash = "sha256:8f46f5be57ae6889a4e16e2ca113b1703ef17f2b0abceb83793eaba9e1351a45"}, - {file = "gast-0.3.3.tar.gz", hash = "sha256:b881ef288a49aa81440d2c5eb8aeefd4c2bb8993d5f50edae7413a85bfdb3b57"}, + {file = "gast-0.4.0-py3-none-any.whl", hash = "sha256:b7adcdd5adbebf1adf17378da5ba3f543684dbec47b1cda1f3997e573cd542c4"}, + {file = "gast-0.4.0.tar.gz", hash = "sha256:40feb7b8b8434785585ab224d1568b857edb18297e5a3047f1ba012bc83b42c1"}, +] + +[[package]] +name = "gensim" +version = "4.3.2" +description = "Python framework for fast Vector Space Modelling" +optional = false +python-versions = ">=3.8" +files = [ + {file = "gensim-4.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:31b3cb313939b6940ee21660177f6405e71b920da462dbf065b2458a24ab33e1"}, + {file = "gensim-4.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:67c41b15e19e4950f57124f633c45839b5c84268ffa58079c5b0c0f04d2a9cb9"}, + {file = "gensim-4.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9bf1a8ee2e8214499c517008a0fd175ce5c649954a88569358cfae6bfca42dc"}, + {file = "gensim-4.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e34ee6f8a318fbf0b65e6d39a985ecf9e9051febfd1221ae6255fff1972c547"}, + {file = "gensim-4.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:c46b7395dc57c83329932f3febed9660891fdcc75327d56f55000e3e08898983"}, + {file = "gensim-4.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a919493339cfad39d5e76768c1bc546cd507f715c5fca93165cc174a97657457"}, + {file = "gensim-4.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8dcd1419266bd563c371d25530f4dce3505fe78059b2c0c08724e4f9e5479b38"}, + {file = "gensim-4.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3e8035ac3f54dca3a8ca56bec526ddfe5b23006e0134b7375ca5f5dbfaef70a"}, + {file = "gensim-4.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c3b537c1fd4699c8e6d59c3ffa2fdd9918cd4e5555bf5ee7c1fbedd89b2d643"}, + {file = "gensim-4.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:5a52001226f9e89f7833503f99c9b4fd028fdf837002f24cdc1bc3cf901a4003"}, + {file = "gensim-4.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e8d62604efb8281a25254e5a6c14227034c267ed56635e590c9cae2635196dca"}, + {file = "gensim-4.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bf7a9dc37c2ca465c7834863a7b264369c1373bb474135df225cee654b8adfab"}, + {file = "gensim-4.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a33ff0d4cf3e50e7ddd7353fb38ed2d4af2e48a6ef58d622809862c30c8b8a2"}, + {file = "gensim-4.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99876be00b73c7cef01f427d241b07eb1c1b298fb411580cc1067d22c43a13be"}, + {file = "gensim-4.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:f785b3caf376a1f2989e0f3c890642e5b1566393fd3831dab03fc6670d672814"}, + {file = "gensim-4.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c86915cf0e0b86658a40a070bd7e04db0814065963657e92910303070275865d"}, + {file = "gensim-4.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:548c7bf983e619d6b8d78b6a5321dcbcba5b39f68779a0d36e38a5a971416276"}, + {file = "gensim-4.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:226690ea081b92a2289661a25e8a89069ae09b1ed4137b67a0d6ec211e0371d3"}, + {file = "gensim-4.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4715eafcd309c2f7e030829eddba72fe47bbe9bb466811fce3158127d29c8979"}, + {file = "gensim-4.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b3f26299ac241ff54329a54c37c22eac1bf4c4a337068adf2637259ee0d8484a"}, + {file = "gensim-4.3.2.tar.gz", hash = "sha256:99ac6af6ffd40682e70155ed9f92ecbf4384d59fb50af120d343ea5ee1b308ab"}, ] +[package.dependencies] +numpy = ">=1.18.5" +scipy = ">=1.7.0" +smart-open = ">=1.8.1" + +[package.extras] +distributed = ["Pyro4 (>=4.27)"] +docs = ["POT", "Pyro4", "Pyro4 (>=4.27)", "annoy", "matplotlib", "memory-profiler", "mock", "nltk", "pandas", "pytest", "pytest-cov", "scikit-learn", "sphinx (==5.1.1)", "sphinx-gallery (==0.11.1)", "sphinxcontrib-napoleon (==0.7)", "sphinxcontrib.programoutput (==0.17)", "statsmodels", "testfixtures", "visdom (>=0.1.8,!=0.1.8.7)"] +test = ["POT", "mock", "pytest", "pytest-cov", "testfixtures", "visdom (>=0.1.8,!=0.1.8.7)"] +test-win = ["POT", "mock", "pytest", "pytest-cov", "testfixtures"] + [[package]] name = "google-auth" -version = "1.35.0" +version = "2.29.0" description = "Google Authentication Library" optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*" +python-versions = ">=3.7" files = [ - {file = "google-auth-1.35.0.tar.gz", hash = "sha256:b7033be9028c188ee30200b204ea00ed82ea1162e8ac1df4aa6ded19a191d88e"}, - {file = "google_auth-1.35.0-py2.py3-none-any.whl", hash = "sha256:997516b42ecb5b63e8d80f5632c1a61dddf41d2a4c2748057837e06e00014258"}, + {file = "google-auth-2.29.0.tar.gz", hash = "sha256:672dff332d073227550ffc7457868ac4218d6c500b155fe6cc17d2b13602c360"}, + {file = "google_auth-2.29.0-py2.py3-none-any.whl", hash = "sha256:d452ad095688cd52bae0ad6fafe027f6a6d6f560e810fec20914e17a09526415"}, ] [package.dependencies] -cachetools = ">=2.0.0,<5.0" +cachetools = ">=2.0.0,<6.0" pyasn1-modules = ">=0.2.1" -rsa = {version = ">=3.1.4,<5", markers = "python_version >= \"3.6\""} -setuptools = ">=40.3.0" -six = ">=1.9.0" +rsa = ">=3.1.4,<5" [package.extras] -aiohttp = ["aiohttp (>=3.6.2,<4.0.0dev)", "requests (>=2.20.0,<3.0.0dev)"] -pyopenssl = ["pyopenssl (>=20.0.0)"] +aiohttp = ["aiohttp (>=3.6.2,<4.0.0.dev0)", "requests (>=2.20.0,<3.0.0.dev0)"] +enterprise-cert = ["cryptography (==36.0.2)", "pyopenssl (==22.0.0)"] +pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] reauth = ["pyu2f (>=0.1.5)"] +requests = ["requests (>=2.20.0,<3.0.0.dev0)"] [[package]] name = "google-auth-oauthlib" -version = "0.4.6" +version = "1.0.0" description = "Google Authentication Library" optional = false python-versions = ">=3.6" files = [ - {file = "google-auth-oauthlib-0.4.6.tar.gz", hash = "sha256:a90a072f6993f2c327067bf65270046384cda5a8ecb20b94ea9a687f1f233a7a"}, - {file = "google_auth_oauthlib-0.4.6-py2.py3-none-any.whl", hash = "sha256:3f2a6e802eebbb6fb736a370fbf3b055edcb6b52878bf2f26330b5e041316c73"}, + {file = "google-auth-oauthlib-1.0.0.tar.gz", hash = "sha256:e375064964820b47221a7e1b7ee1fd77051b6323c3f9e3e19785f78ab67ecfc5"}, + {file = "google_auth_oauthlib-1.0.0-py2.py3-none-any.whl", hash = "sha256:95880ca704928c300f48194d1770cf5b1462835b6e49db61445a520f793fd5fb"}, ] [package.dependencies] -google-auth = ">=1.0.0" +google-auth = ">=2.15.0" requests-oauthlib = ">=0.7.0" [package.extras] @@ -470,151 +748,142 @@ six = "*" [[package]] name = "grpcio" -version = "1.60.1" +version = "1.62.1" description = "HTTP/2-based RPC framework" optional = false python-versions = ">=3.7" files = [ - {file = "grpcio-1.60.1-cp310-cp310-linux_armv7l.whl", hash = "sha256:14e8f2c84c0832773fb3958240c69def72357bc11392571f87b2d7b91e0bb092"}, - {file = "grpcio-1.60.1-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:33aed0a431f5befeffd9d346b0fa44b2c01aa4aeae5ea5b2c03d3e25e0071216"}, - {file = "grpcio-1.60.1-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:fead980fbc68512dfd4e0c7b1f5754c2a8e5015a04dea454b9cada54a8423525"}, - {file = "grpcio-1.60.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:082081e6a36b6eb5cf0fd9a897fe777dbb3802176ffd08e3ec6567edd85bc104"}, - {file = "grpcio-1.60.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55ccb7db5a665079d68b5c7c86359ebd5ebf31a19bc1a91c982fd622f1e31ff2"}, - {file = "grpcio-1.60.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:9b54577032d4f235452f77a83169b6527bf4b77d73aeada97d45b2aaf1bf5ce0"}, - {file = "grpcio-1.60.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7d142bcd604166417929b071cd396aa13c565749a4c840d6c702727a59d835eb"}, - {file = "grpcio-1.60.1-cp310-cp310-win32.whl", hash = "sha256:2a6087f234cb570008a6041c8ffd1b7d657b397fdd6d26e83d72283dae3527b1"}, - {file = "grpcio-1.60.1-cp310-cp310-win_amd64.whl", hash = "sha256:f2212796593ad1d0235068c79836861f2201fc7137a99aa2fea7beeb3b101177"}, - {file = "grpcio-1.60.1-cp311-cp311-linux_armv7l.whl", hash = "sha256:79ae0dc785504cb1e1788758c588c711f4e4a0195d70dff53db203c95a0bd303"}, - {file = "grpcio-1.60.1-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:4eec8b8c1c2c9b7125508ff7c89d5701bf933c99d3910e446ed531cd16ad5d87"}, - {file = "grpcio-1.60.1-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:8c9554ca8e26241dabe7951aa1fa03a1ba0856688ecd7e7bdbdd286ebc272e4c"}, - {file = "grpcio-1.60.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91422ba785a8e7a18725b1dc40fbd88f08a5bb4c7f1b3e8739cab24b04fa8a03"}, - {file = "grpcio-1.60.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cba6209c96828711cb7c8fcb45ecef8c8859238baf15119daa1bef0f6c84bfe7"}, - {file = "grpcio-1.60.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c71be3f86d67d8d1311c6076a4ba3b75ba5703c0b856b4e691c9097f9b1e8bd2"}, - {file = "grpcio-1.60.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:af5ef6cfaf0d023c00002ba25d0751e5995fa0e4c9eec6cd263c30352662cbce"}, - {file = "grpcio-1.60.1-cp311-cp311-win32.whl", hash = "sha256:a09506eb48fa5493c58f946c46754ef22f3ec0df64f2b5149373ff31fb67f3dd"}, - {file = "grpcio-1.60.1-cp311-cp311-win_amd64.whl", hash = "sha256:49c9b6a510e3ed8df5f6f4f3c34d7fbf2d2cae048ee90a45cd7415abab72912c"}, - {file = "grpcio-1.60.1-cp312-cp312-linux_armv7l.whl", hash = "sha256:b58b855d0071575ea9c7bc0d84a06d2edfbfccec52e9657864386381a7ce1ae9"}, - {file = "grpcio-1.60.1-cp312-cp312-macosx_10_10_universal2.whl", hash = "sha256:a731ac5cffc34dac62053e0da90f0c0b8560396a19f69d9703e88240c8f05858"}, - {file = "grpcio-1.60.1-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:cf77f8cf2a651fbd869fbdcb4a1931464189cd210abc4cfad357f1cacc8642a6"}, - {file = "grpcio-1.60.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c557e94e91a983e5b1e9c60076a8fd79fea1e7e06848eb2e48d0ccfb30f6e073"}, - {file = "grpcio-1.60.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:069fe2aeee02dfd2135d562d0663fe70fbb69d5eed6eb3389042a7e963b54de8"}, - {file = "grpcio-1.60.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:cb0af13433dbbd1c806e671d81ec75bd324af6ef75171fd7815ca3074fe32bfe"}, - {file = "grpcio-1.60.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2f44c32aef186bbba254129cea1df08a20be414144ac3bdf0e84b24e3f3b2e05"}, - {file = "grpcio-1.60.1-cp312-cp312-win32.whl", hash = "sha256:a212e5dea1a4182e40cd3e4067ee46be9d10418092ce3627475e995cca95de21"}, - {file = "grpcio-1.60.1-cp312-cp312-win_amd64.whl", hash = "sha256:6e490fa5f7f5326222cb9f0b78f207a2b218a14edf39602e083d5f617354306f"}, - {file = "grpcio-1.60.1-cp37-cp37m-linux_armv7l.whl", hash = "sha256:4216e67ad9a4769117433814956031cb300f85edc855252a645a9a724b3b6594"}, - {file = "grpcio-1.60.1-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:73e14acd3d4247169955fae8fb103a2b900cfad21d0c35f0dcd0fdd54cd60367"}, - {file = "grpcio-1.60.1-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:6ecf21d20d02d1733e9c820fb5c114c749d888704a7ec824b545c12e78734d1c"}, - {file = "grpcio-1.60.1-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:33bdea30dcfd4f87b045d404388469eb48a48c33a6195a043d116ed1b9a0196c"}, - {file = "grpcio-1.60.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53b69e79d00f78c81eecfb38f4516080dc7f36a198b6b37b928f1c13b3c063e9"}, - {file = "grpcio-1.60.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:39aa848794b887120b1d35b1b994e445cc028ff602ef267f87c38122c1add50d"}, - {file = "grpcio-1.60.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:72153a0d2e425f45b884540a61c6639436ddafa1829a42056aa5764b84108b8e"}, - {file = "grpcio-1.60.1-cp37-cp37m-win_amd64.whl", hash = "sha256:50d56280b482875d1f9128ce596e59031a226a8b84bec88cb2bf76c289f5d0de"}, - {file = "grpcio-1.60.1-cp38-cp38-linux_armv7l.whl", hash = "sha256:6d140bdeb26cad8b93c1455fa00573c05592793c32053d6e0016ce05ba267549"}, - {file = "grpcio-1.60.1-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:bc808924470643b82b14fe121923c30ec211d8c693e747eba8a7414bc4351a23"}, - {file = "grpcio-1.60.1-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:70c83bb530572917be20c21f3b6be92cd86b9aecb44b0c18b1d3b2cc3ae47df0"}, - {file = "grpcio-1.60.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9b106bc52e7f28170e624ba61cc7dc6829566e535a6ec68528f8e1afbed1c41f"}, - {file = "grpcio-1.60.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:30e980cd6db1088c144b92fe376747328d5554bc7960ce583ec7b7d81cd47287"}, - {file = "grpcio-1.60.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0c5807e9152eff15f1d48f6b9ad3749196f79a4a050469d99eecb679be592acc"}, - {file = "grpcio-1.60.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f1c3dc536b3ee124e8b24feb7533e5c70b9f2ef833e3b2e5513b2897fd46763a"}, - {file = "grpcio-1.60.1-cp38-cp38-win32.whl", hash = "sha256:d7404cebcdb11bb5bd40bf94131faf7e9a7c10a6c60358580fe83913f360f929"}, - {file = "grpcio-1.60.1-cp38-cp38-win_amd64.whl", hash = "sha256:c8754c75f55781515a3005063d9a05878b2cfb3cb7e41d5401ad0cf19de14872"}, - {file = "grpcio-1.60.1-cp39-cp39-linux_armv7l.whl", hash = "sha256:0250a7a70b14000fa311de04b169cc7480be6c1a769b190769d347939d3232a8"}, - {file = "grpcio-1.60.1-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:660fc6b9c2a9ea3bb2a7e64ba878c98339abaf1811edca904ac85e9e662f1d73"}, - {file = "grpcio-1.60.1-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:76eaaba891083fcbe167aa0f03363311a9f12da975b025d30e94b93ac7a765fc"}, - {file = "grpcio-1.60.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5d97c65ea7e097056f3d1ead77040ebc236feaf7f71489383d20f3b4c28412a"}, - {file = "grpcio-1.60.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb2a2911b028f01c8c64d126f6b632fcd8a9ac975aa1b3855766c94e4107180"}, - {file = "grpcio-1.60.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:5a1ebbae7e2214f51b1f23b57bf98eeed2cf1ba84e4d523c48c36d5b2f8829ff"}, - {file = "grpcio-1.60.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9a66f4d2a005bc78e61d805ed95dedfcb35efa84b7bba0403c6d60d13a3de2d6"}, - {file = "grpcio-1.60.1-cp39-cp39-win32.whl", hash = "sha256:8d488fbdbf04283f0d20742b64968d44825617aa6717b07c006168ed16488804"}, - {file = "grpcio-1.60.1-cp39-cp39-win_amd64.whl", hash = "sha256:61b7199cd2a55e62e45bfb629a35b71fc2c0cb88f686a047f25b1112d3810904"}, - {file = "grpcio-1.60.1.tar.gz", hash = "sha256:dd1d3a8d1d2e50ad9b59e10aa7f07c7d1be2b367f3f2d33c5fade96ed5460962"}, + {file = "grpcio-1.62.1-cp310-cp310-linux_armv7l.whl", hash = "sha256:179bee6f5ed7b5f618844f760b6acf7e910988de77a4f75b95bbfaa8106f3c1e"}, + {file = "grpcio-1.62.1-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:48611e4fa010e823ba2de8fd3f77c1322dd60cb0d180dc6630a7e157b205f7ea"}, + {file = "grpcio-1.62.1-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:b2a0e71b0a2158aa4bce48be9f8f9eb45cbd17c78c7443616d00abbe2a509f6d"}, + {file = "grpcio-1.62.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fbe80577c7880911d3ad65e5ecc997416c98f354efeba2f8d0f9112a67ed65a5"}, + {file = "grpcio-1.62.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58f6c693d446964e3292425e1d16e21a97a48ba9172f2d0df9d7b640acb99243"}, + {file = "grpcio-1.62.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:77c339403db5a20ef4fed02e4d1a9a3d9866bf9c0afc77a42234677313ea22f3"}, + {file = "grpcio-1.62.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b5a4ea906db7dec694098435d84bf2854fe158eb3cd51e1107e571246d4d1d70"}, + {file = "grpcio-1.62.1-cp310-cp310-win32.whl", hash = "sha256:4187201a53f8561c015bc745b81a1b2d278967b8de35f3399b84b0695e281d5f"}, + {file = "grpcio-1.62.1-cp310-cp310-win_amd64.whl", hash = "sha256:844d1f3fb11bd1ed362d3fdc495d0770cfab75761836193af166fee113421d66"}, + {file = "grpcio-1.62.1-cp311-cp311-linux_armv7l.whl", hash = "sha256:833379943d1728a005e44103f17ecd73d058d37d95783eb8f0b28ddc1f54d7b2"}, + {file = "grpcio-1.62.1-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:c7fcc6a32e7b7b58f5a7d27530669337a5d587d4066060bcb9dee7a8c833dfb7"}, + {file = "grpcio-1.62.1-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:fa7d28eb4d50b7cbe75bb8b45ed0da9a1dc5b219a0af59449676a29c2eed9698"}, + {file = "grpcio-1.62.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48f7135c3de2f298b833be8b4ae20cafe37091634e91f61f5a7eb3d61ec6f660"}, + {file = "grpcio-1.62.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:71f11fd63365ade276c9d4a7b7df5c136f9030e3457107e1791b3737a9b9ed6a"}, + {file = "grpcio-1.62.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4b49fd8fe9f9ac23b78437da94c54aa7e9996fbb220bac024a67469ce5d0825f"}, + {file = "grpcio-1.62.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:482ae2ae78679ba9ed5752099b32e5fe580443b4f798e1b71df412abf43375db"}, + {file = "grpcio-1.62.1-cp311-cp311-win32.whl", hash = "sha256:1faa02530b6c7426404372515fe5ddf66e199c2ee613f88f025c6f3bd816450c"}, + {file = "grpcio-1.62.1-cp311-cp311-win_amd64.whl", hash = "sha256:5bd90b8c395f39bc82a5fb32a0173e220e3f401ff697840f4003e15b96d1befc"}, + {file = "grpcio-1.62.1-cp312-cp312-linux_armv7l.whl", hash = "sha256:b134d5d71b4e0837fff574c00e49176051a1c532d26c052a1e43231f252d813b"}, + {file = "grpcio-1.62.1-cp312-cp312-macosx_10_10_universal2.whl", hash = "sha256:d1f6c96573dc09d50dbcbd91dbf71d5cf97640c9427c32584010fbbd4c0e0037"}, + {file = "grpcio-1.62.1-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:359f821d4578f80f41909b9ee9b76fb249a21035a061a327f91c953493782c31"}, + {file = "grpcio-1.62.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a485f0c2010c696be269184bdb5ae72781344cb4e60db976c59d84dd6354fac9"}, + {file = "grpcio-1.62.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b50b09b4dc01767163d67e1532f948264167cd27f49e9377e3556c3cba1268e1"}, + {file = "grpcio-1.62.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3227c667dccbe38f2c4d943238b887bac588d97c104815aecc62d2fd976e014b"}, + {file = "grpcio-1.62.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3952b581eb121324853ce2b191dae08badb75cd493cb4e0243368aa9e61cfd41"}, + {file = "grpcio-1.62.1-cp312-cp312-win32.whl", hash = "sha256:83a17b303425104d6329c10eb34bba186ffa67161e63fa6cdae7776ff76df73f"}, + {file = "grpcio-1.62.1-cp312-cp312-win_amd64.whl", hash = "sha256:6696ffe440333a19d8d128e88d440f91fb92c75a80ce4b44d55800e656a3ef1d"}, + {file = "grpcio-1.62.1-cp37-cp37m-linux_armv7l.whl", hash = "sha256:e3393b0823f938253370ebef033c9fd23d27f3eae8eb9a8f6264900c7ea3fb5a"}, + {file = "grpcio-1.62.1-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:83e7ccb85a74beaeae2634f10eb858a0ed1a63081172649ff4261f929bacfd22"}, + {file = "grpcio-1.62.1-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:882020c87999d54667a284c7ddf065b359bd00251fcd70279ac486776dbf84ec"}, + {file = "grpcio-1.62.1-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a10383035e864f386fe096fed5c47d27a2bf7173c56a6e26cffaaa5a361addb1"}, + {file = "grpcio-1.62.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:960edebedc6b9ada1ef58e1c71156f28689978188cd8cff3b646b57288a927d9"}, + {file = "grpcio-1.62.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:23e2e04b83f347d0aadde0c9b616f4726c3d76db04b438fd3904b289a725267f"}, + {file = "grpcio-1.62.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:978121758711916d34fe57c1f75b79cdfc73952f1481bb9583399331682d36f7"}, + {file = "grpcio-1.62.1-cp37-cp37m-win_amd64.whl", hash = "sha256:9084086190cc6d628f282e5615f987288b95457292e969b9205e45b442276407"}, + {file = "grpcio-1.62.1-cp38-cp38-linux_armv7l.whl", hash = "sha256:22bccdd7b23c420a27fd28540fb5dcbc97dc6be105f7698cb0e7d7a420d0e362"}, + {file = "grpcio-1.62.1-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:8999bf1b57172dbc7c3e4bb3c732658e918f5c333b2942243f10d0d653953ba9"}, + {file = "grpcio-1.62.1-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:d9e52558b8b8c2f4ac05ac86344a7417ccdd2b460a59616de49eb6933b07a0bd"}, + {file = "grpcio-1.62.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1714e7bc935780bc3de1b3fcbc7674209adf5208ff825799d579ffd6cd0bd505"}, + {file = "grpcio-1.62.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8842ccbd8c0e253c1f189088228f9b433f7a93b7196b9e5b6f87dba393f5d5d"}, + {file = "grpcio-1.62.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1f1e7b36bdff50103af95a80923bf1853f6823dd62f2d2a2524b66ed74103e49"}, + {file = "grpcio-1.62.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bba97b8e8883a8038606480d6b6772289f4c907f6ba780fa1f7b7da7dfd76f06"}, + {file = "grpcio-1.62.1-cp38-cp38-win32.whl", hash = "sha256:a7f615270fe534548112a74e790cd9d4f5509d744dd718cd442bf016626c22e4"}, + {file = "grpcio-1.62.1-cp38-cp38-win_amd64.whl", hash = "sha256:e6c8c8693df718c5ecbc7babb12c69a4e3677fd11de8886f05ab22d4e6b1c43b"}, + {file = "grpcio-1.62.1-cp39-cp39-linux_armv7l.whl", hash = "sha256:73db2dc1b201d20ab7083e7041946910bb991e7e9761a0394bbc3c2632326483"}, + {file = "grpcio-1.62.1-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:407b26b7f7bbd4f4751dbc9767a1f0716f9fe72d3d7e96bb3ccfc4aace07c8de"}, + {file = "grpcio-1.62.1-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:f8de7c8cef9261a2d0a62edf2ccea3d741a523c6b8a6477a340a1f2e417658de"}, + {file = "grpcio-1.62.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd5c8a1af40ec305d001c60236308a67e25419003e9bb3ebfab5695a8d0b369"}, + {file = "grpcio-1.62.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be0477cb31da67846a33b1a75c611f88bfbcd427fe17701b6317aefceee1b96f"}, + {file = "grpcio-1.62.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:60dcd824df166ba266ee0cfaf35a31406cd16ef602b49f5d4dfb21f014b0dedd"}, + {file = "grpcio-1.62.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:973c49086cabab773525f6077f95e5a993bfc03ba8fc32e32f2c279497780585"}, + {file = "grpcio-1.62.1-cp39-cp39-win32.whl", hash = "sha256:12859468e8918d3bd243d213cd6fd6ab07208195dc140763c00dfe901ce1e1b4"}, + {file = "grpcio-1.62.1-cp39-cp39-win_amd64.whl", hash = "sha256:b7209117bbeebdfa5d898205cc55153a51285757902dd73c47de498ad4d11332"}, + {file = "grpcio-1.62.1.tar.gz", hash = "sha256:6c455e008fa86d9e9a9d85bb76da4277c0d7d9668a3bfa70dbe86e9f3c759947"}, ] [package.extras] -protobuf = ["grpcio-tools (>=1.60.1)"] +protobuf = ["grpcio-tools (>=1.62.1)"] [[package]] name = "h5py" -version = "2.10.0" +version = "3.11.0" description = "Read and write HDF5 files from Python" optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "h5py-2.10.0-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:ecf4d0b56ee394a0984de15bceeb97cbe1fe485f1ac205121293fc44dcf3f31f"}, - {file = "h5py-2.10.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:86868dc07b9cc8cb7627372a2e6636cdc7a53b7e2854ad020c9e9d8a4d3fd0f5"}, - {file = "h5py-2.10.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:aac4b57097ac29089f179bbc2a6e14102dd210618e94d77ee4831c65f82f17c0"}, - {file = "h5py-2.10.0-cp27-cp27m-win32.whl", hash = "sha256:7be5754a159236e95bd196419485343e2b5875e806fe68919e087b6351f40a70"}, - {file = "h5py-2.10.0-cp27-cp27m-win_amd64.whl", hash = "sha256:13c87efa24768a5e24e360a40e0bc4c49bcb7ce1bb13a3a7f9902cec302ccd36"}, - {file = "h5py-2.10.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:79b23f47c6524d61f899254f5cd5e486e19868f1823298bc0c29d345c2447172"}, - {file = "h5py-2.10.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:cbf28ae4b5af0f05aa6e7551cee304f1d317dbed1eb7ac1d827cee2f1ef97a99"}, - {file = "h5py-2.10.0-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:c0d4b04bbf96c47b6d360cd06939e72def512b20a18a8547fa4af810258355d5"}, - {file = "h5py-2.10.0-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:549ad124df27c056b2e255ea1c44d30fb7a17d17676d03096ad5cd85edb32dc1"}, - {file = "h5py-2.10.0-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:a5f82cd4938ff8761d9760af3274acf55afc3c91c649c50ab18fcff5510a14a5"}, - {file = "h5py-2.10.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:3dad1730b6470fad853ef56d755d06bb916ee68a3d8272b3bab0c1ddf83bb99e"}, - {file = "h5py-2.10.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:063947eaed5f271679ed4ffa36bb96f57bc14f44dd4336a827d9a02702e6ce6b"}, - {file = "h5py-2.10.0-cp35-cp35m-win32.whl", hash = "sha256:c54a2c0dd4957776ace7f95879d81582298c5daf89e77fb8bee7378f132951de"}, - {file = "h5py-2.10.0-cp35-cp35m-win_amd64.whl", hash = "sha256:6998be619c695910cb0effe5eb15d3a511d3d1a5d217d4bd0bebad1151ec2262"}, - {file = "h5py-2.10.0-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:ff7d241f866b718e4584fa95f520cb19405220c501bd3a53ee11871ba5166ea2"}, - {file = "h5py-2.10.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:54817b696e87eb9e403e42643305f142cd8b940fe9b3b490bbf98c3b8a894cf4"}, - {file = "h5py-2.10.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:d3c59549f90a891691991c17f8e58c8544060fdf3ccdea267100fa5f561ff62f"}, - {file = "h5py-2.10.0-cp36-cp36m-win32.whl", hash = "sha256:d7ae7a0576b06cb8e8a1c265a8bc4b73d05fdee6429bffc9a26a6eb531e79d72"}, - {file = "h5py-2.10.0-cp36-cp36m-win_amd64.whl", hash = "sha256:bffbc48331b4a801d2f4b7dac8a72609f0b10e6e516e5c480a3e3241e091c878"}, - {file = "h5py-2.10.0-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:51ae56894c6c93159086ffa2c94b5b3388c0400548ab26555c143e7cfa05b8e5"}, - {file = "h5py-2.10.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:16ead3c57141101e3296ebeed79c9c143c32bdd0e82a61a2fc67e8e6d493e9d1"}, - {file = "h5py-2.10.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:f0e25bb91e7a02efccb50aba6591d3fe2c725479e34769802fcdd4076abfa917"}, - {file = "h5py-2.10.0-cp37-cp37m-win32.whl", hash = "sha256:f23951a53d18398ef1344c186fb04b26163ca6ce449ebd23404b153fd111ded9"}, - {file = "h5py-2.10.0-cp37-cp37m-win_amd64.whl", hash = "sha256:8bb1d2de101f39743f91512a9750fb6c351c032e5cd3204b4487383e34da7f75"}, - {file = "h5py-2.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:64f74da4a1dd0d2042e7d04cf8294e04ddad686f8eba9bb79e517ae582f6668d"}, - {file = "h5py-2.10.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:d35f7a3a6cefec82bfdad2785e78359a0e6a5fbb3f605dd5623ce88082ccd681"}, - {file = "h5py-2.10.0-cp38-cp38-win32.whl", hash = "sha256:6ef7ab1089e3ef53ca099038f3c0a94d03e3560e6aff0e9d6c64c55fb13fc681"}, - {file = "h5py-2.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:769e141512b54dee14ec76ed354fcacfc7d97fea5a7646b709f7400cf1838630"}, - {file = "h5py-2.10.0.tar.gz", hash = "sha256:84412798925dc870ffd7107f045d7659e60f5d46d1c70c700375248bf6bf512d"}, + {file = "h5py-3.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1625fd24ad6cfc9c1ccd44a66dac2396e7ee74940776792772819fc69f3a3731"}, + {file = "h5py-3.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c072655ad1d5fe9ef462445d3e77a8166cbfa5e599045f8aa3c19b75315f10e5"}, + {file = "h5py-3.11.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77b19a40788e3e362b54af4dcf9e6fde59ca016db2c61360aa30b47c7b7cef00"}, + {file = "h5py-3.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:ef4e2f338fc763f50a8113890f455e1a70acd42a4d083370ceb80c463d803972"}, + {file = "h5py-3.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bbd732a08187a9e2a6ecf9e8af713f1d68256ee0f7c8b652a32795670fb481ba"}, + {file = "h5py-3.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:75bd7b3d93fbeee40860fd70cdc88df4464e06b70a5ad9ce1446f5f32eb84007"}, + {file = "h5py-3.11.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:52c416f8eb0daae39dabe71415cb531f95dce2d81e1f61a74537a50c63b28ab3"}, + {file = "h5py-3.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:083e0329ae534a264940d6513f47f5ada617da536d8dccbafc3026aefc33c90e"}, + {file = "h5py-3.11.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a76cae64080210389a571c7d13c94a1a6cf8cb75153044fd1f822a962c97aeab"}, + {file = "h5py-3.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f3736fe21da2b7d8a13fe8fe415f1272d2a1ccdeff4849c1421d2fb30fd533bc"}, + {file = "h5py-3.11.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa6ae84a14103e8dc19266ef4c3e5d7c00b68f21d07f2966f0ca7bdb6c2761fb"}, + {file = "h5py-3.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:21dbdc5343f53b2e25404673c4f00a3335aef25521bd5fa8c707ec3833934892"}, + {file = "h5py-3.11.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:754c0c2e373d13d6309f408325343b642eb0f40f1a6ad21779cfa9502209e150"}, + {file = "h5py-3.11.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:731839240c59ba219d4cb3bc5880d438248533366f102402cfa0621b71796b62"}, + {file = "h5py-3.11.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ec9df3dd2018904c4cc06331951e274f3f3fd091e6d6cc350aaa90fa9b42a76"}, + {file = "h5py-3.11.0-cp38-cp38-win_amd64.whl", hash = "sha256:55106b04e2c83dfb73dc8732e9abad69d83a436b5b82b773481d95d17b9685e1"}, + {file = "h5py-3.11.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f4e025e852754ca833401777c25888acb96889ee2c27e7e629a19aee288833f0"}, + {file = "h5py-3.11.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6c4b760082626120031d7902cd983d8c1f424cdba2809f1067511ef283629d4b"}, + {file = "h5py-3.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67462d0669f8f5459529de179f7771bd697389fcb3faab54d63bf788599a48ea"}, + {file = "h5py-3.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:d9c944d364688f827dc889cf83f1fca311caf4fa50b19f009d1f2b525edd33a3"}, + {file = "h5py-3.11.0.tar.gz", hash = "sha256:7b7e8f78072a2edec87c9836f25f34203fd492a4475709a18b417a33cfb21fa9"}, ] [package.dependencies] -numpy = ">=1.7" -six = "*" +numpy = ">=1.17.3" [[package]] name = "idna" -version = "3.6" +version = "3.7" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.5" files = [ - {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, - {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, + {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, + {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, ] [[package]] name = "importlib-metadata" -version = "7.0.1" +version = "7.1.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-7.0.1-py3-none-any.whl", hash = "sha256:4805911c3a4ec7c3966410053e9ec6a1fecd629117df5adee56dfc9432a1081e"}, - {file = "importlib_metadata-7.0.1.tar.gz", hash = "sha256:f238736bb06590ae52ac1fab06a3a9ef1d8dce2b7a35b5ab329371d6c8f5d2cc"}, + {file = "importlib_metadata-7.1.0-py3-none-any.whl", hash = "sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570"}, + {file = "importlib_metadata-7.1.0.tar.gz", hash = "sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2"}, ] [package.dependencies] zipp = ">=0.5" [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] -testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] [[package]] name = "ipykernel" -version = "6.29.2" +version = "6.29.4" description = "IPython Kernel for Jupyter" optional = false python-versions = ">=3.8" files = [ - {file = "ipykernel-6.29.2-py3-none-any.whl", hash = "sha256:50384f5c577a260a1d53f1f59a828c7266d321c9b7d00d345693783f66616055"}, - {file = "ipykernel-6.29.2.tar.gz", hash = "sha256:3bade28004e3ff624ed57974948116670604ac5f676d12339693f3142176d3f0"}, + {file = "ipykernel-6.29.4-py3-none-any.whl", hash = "sha256:1181e653d95c6808039c509ef8e67c4126b3b3af7781496c7cbfb5ed938a27da"}, + {file = "ipykernel-6.29.4.tar.gz", hash = "sha256:3d44070060f9475ac2092b760123fadf105d2e2493c24848b6691a7c4f42af5c"}, ] [package.dependencies] @@ -637,7 +906,7 @@ cov = ["coverage[toml]", "curio", "matplotlib", "pytest-cov", "trio"] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "trio"] pyqt5 = ["pyqt5"] pyside6 = ["pyside6"] -test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (==0.23.4)", "pytest-cov", "pytest-timeout"] +test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.23.5)", "pytest-cov", "pytest-timeout"] [[package]] name = "ipython" @@ -714,15 +983,26 @@ MarkupSafe = ">=2.0" [package.extras] i18n = ["Babel (>=2.7)"] +[[package]] +name = "joblib" +version = "1.4.0" +description = "Lightweight pipelining with Python functions" +optional = false +python-versions = ">=3.8" +files = [ + {file = "joblib-1.4.0-py3-none-any.whl", hash = "sha256:42942470d4062537be4d54c83511186da1fc14ba354961a2114da91efa9a4ed7"}, + {file = "joblib-1.4.0.tar.gz", hash = "sha256:1eb0dc091919cd384490de890cb5dfd538410a6d4b3b54eef09fb8c50b409b1c"}, +] + [[package]] name = "jupyter-client" -version = "8.6.0" +version = "8.6.1" description = "Jupyter protocol implementation and client libraries" optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_client-8.6.0-py3-none-any.whl", hash = "sha256:909c474dbe62582ae62b758bca86d6518c85234bdee2d908c778db6d72f39d99"}, - {file = "jupyter_client-8.6.0.tar.gz", hash = "sha256:0642244bb83b4764ae60d07e010e15f0e2d275ec4e918a8f7b80fbbef3ca60c7"}, + {file = "jupyter_client-8.6.1-py3-none-any.whl", hash = "sha256:3b7bd22f058434e3b9a7ea4b1500ed47de2713872288c0d511d19926f99b459f"}, + {file = "jupyter_client-8.6.1.tar.gz", hash = "sha256:e842515e2bab8e19186d89fdfea7abd15e39dd581f94e399f00e2af5a1652d3f"}, ] [package.dependencies] @@ -739,13 +1019,13 @@ test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pyt [[package]] name = "jupyter-core" -version = "5.7.1" +version = "5.7.2" description = "Jupyter core package. A base package on which Jupyter projects rely." optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_core-5.7.1-py3-none-any.whl", hash = "sha256:c65c82126453a723a2804aa52409930434598fd9d35091d63dfb919d2b765bb7"}, - {file = "jupyter_core-5.7.1.tar.gz", hash = "sha256:de61a9d7fc71240f688b2fb5ab659fbb56979458dc66a71decd098e03c79e218"}, + {file = "jupyter_core-5.7.2-py3-none-any.whl", hash = "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409"}, + {file = "jupyter_core-5.7.2.tar.gz", hash = "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9"}, ] [package.dependencies] @@ -755,7 +1035,17 @@ traitlets = ">=5.3" [package.extras] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] -test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] +test = ["ipykernel", "pre-commit", "pytest (<8)", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "keras" +version = "2.7.0" +description = "Deep learning for humans." +optional = false +python-versions = "*" +files = [ + {file = "keras-2.7.0-py2.py3-none-any.whl", hash = "sha256:0c33ae1f728064ca0d35dfba999e9c316f03623bf5688c82fb83cc74a80ea248"}, +] [[package]] name = "keras-preprocessing" @@ -890,15 +1180,33 @@ files = [ {file = "kiwisolver-1.4.5.tar.gz", hash = "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec"}, ] +[[package]] +name = "libclang" +version = "18.1.1" +description = "Clang Python Bindings, mirrored from the official LLVM repo: https://github.com/llvm/llvm-project/tree/main/clang/bindings/python, to make the installation process easier." +optional = false +python-versions = "*" +files = [ + {file = "libclang-18.1.1-py2.py3-none-macosx_10_9_x86_64.whl", hash = "sha256:6f14c3f194704e5d09769108f03185fce7acaf1d1ae4bbb2f30a72c2400cb7c5"}, + {file = "libclang-18.1.1-py2.py3-none-macosx_11_0_arm64.whl", hash = "sha256:83ce5045d101b669ac38e6da8e58765f12da2d3aafb3b9b98d88b286a60964d8"}, + {file = "libclang-18.1.1-py2.py3-none-manylinux2010_x86_64.whl", hash = "sha256:c533091d8a3bbf7460a00cb6c1a71da93bffe148f172c7d03b1c31fbf8aa2a0b"}, + {file = "libclang-18.1.1-py2.py3-none-manylinux2014_aarch64.whl", hash = "sha256:54dda940a4a0491a9d1532bf071ea3ef26e6dbaf03b5000ed94dd7174e8f9592"}, + {file = "libclang-18.1.1-py2.py3-none-manylinux2014_armv7l.whl", hash = "sha256:cf4a99b05376513717ab5d82a0db832c56ccea4fd61a69dbb7bccf2dfb207dbe"}, + {file = "libclang-18.1.1-py2.py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:69f8eb8f65c279e765ffd28aaa7e9e364c776c17618af8bff22a8df58677ff4f"}, + {file = "libclang-18.1.1-py2.py3-none-win_amd64.whl", hash = "sha256:4dd2d3b82fab35e2bf9ca717d7b63ac990a3519c7e312f19fa8e86dcc712f7fb"}, + {file = "libclang-18.1.1-py2.py3-none-win_arm64.whl", hash = "sha256:3f0e1f49f04d3cd198985fea0511576b0aee16f9ff0e0f0cad7f9c57ec3c20e8"}, + {file = "libclang-18.1.1.tar.gz", hash = "sha256:a1214966d08d73d971287fc3ead8dfaf82eb07fb197680d8b3859dbbbbf78250"}, +] + [[package]] name = "lightning-utilities" -version = "0.10.1" +version = "0.11.2" description = "Lightning toolbox for across the our ecosystem." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "lightning-utilities-0.10.1.tar.gz", hash = "sha256:362755023dcf93b8fa519bc002ae41794943a3ffbc5318e40804d36aa14bf1fd"}, - {file = "lightning_utilities-0.10.1-py3-none-any.whl", hash = "sha256:e67be3f328b1c14f2b36cc09e84642db5b50afeab94e7704969b2130fe6a3bda"}, + {file = "lightning-utilities-0.11.2.tar.gz", hash = "sha256:adf4cf9c5d912fe505db4729e51d1369c6927f3a8ac55a9dff895ce5c0da08d9"}, + {file = "lightning_utilities-0.11.2-py3-none-any.whl", hash = "sha256:541f471ed94e18a28d72879338c8c52e873bb46f4c47644d89228faeb6751159"}, ] [package.dependencies] @@ -913,13 +1221,13 @@ typing = ["mypy (>=1.0.0)", "types-setuptools"] [[package]] name = "markdown" -version = "3.5.2" +version = "3.6" description = "Python implementation of John Gruber's Markdown." optional = false python-versions = ">=3.8" files = [ - {file = "Markdown-3.5.2-py3-none-any.whl", hash = "sha256:d43323865d89fc0cb9b20c75fc8ad313af307cc087e84b657d9eec768eddeadd"}, - {file = "Markdown-3.5.2.tar.gz", hash = "sha256:e1ac7b3dc550ee80e602e71c1d168002f062e49f1b11e26a36264dafd4df2ef8"}, + {file = "Markdown-3.6-py3-none-any.whl", hash = "sha256:48f276f4d8cfb8ce6527c8f79e2ee29708508bf4d40aa410fbc3b4ee832c850f"}, + {file = "Markdown-3.6.tar.gz", hash = "sha256:ed4f41f6daecbeeb96e576ce414c41d2d876daa9a16cb35fa8ed8c2ddfad0224"}, ] [package.dependencies] @@ -1061,6 +1369,105 @@ docs = ["sphinx"] gmpy = ["gmpy2 (>=2.1.0a4)"] tests = ["pytest (>=4.6)"] +[[package]] +name = "multidict" +version = "6.0.5" +description = "multidict implementation" +optional = false +python-versions = ">=3.7" +files = [ + {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b644ae063c10e7f324ab1ab6b548bdf6f8b47f3ec234fef1093bc2735e5f9"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:896ebdcf62683551312c30e20614305f53125750803b614e9e6ce74a96232604"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:411bf8515f3be9813d06004cac41ccf7d1cd46dfe233705933dd163b60e37600"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d147090048129ce3c453f0292e7697d333db95e52616b3793922945804a433c"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:215ed703caf15f578dca76ee6f6b21b7603791ae090fbf1ef9d865571039ade5"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c6390cf87ff6234643428991b7359b5f59cc15155695deb4eda5c777d2b880f"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fd81c4ebdb4f214161be351eb5bcf385426bf023041da2fd9e60681f3cebae"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3cc2ad10255f903656017363cd59436f2111443a76f996584d1077e43ee51182"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6939c95381e003f54cd4c5516740faba40cf5ad3eeff460c3ad1d3e0ea2549bf"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:220dd781e3f7af2c2c1053da9fa96d9cf3072ca58f057f4c5adaaa1cab8fc442"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:766c8f7511df26d9f11cd3a8be623e59cca73d44643abab3f8c8c07620524e4a"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:fe5d7785250541f7f5019ab9cba2c71169dc7d74d0f45253f8313f436458a4ef"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c1c1496e73051918fcd4f58ff2e0f2f3066d1c76a0c6aeffd9b45d53243702cc"}, + {file = "multidict-6.0.5-cp310-cp310-win32.whl", hash = "sha256:7afcdd1fc07befad18ec4523a782cde4e93e0a2bf71239894b8d61ee578c1319"}, + {file = "multidict-6.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:99f60d34c048c5c2fabc766108c103612344c46e35d4ed9ae0673d33c8fb26e8"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f285e862d2f153a70586579c15c44656f888806ed0e5b56b64489afe4a2dbfba"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:53689bb4e102200a4fafa9de9c7c3c212ab40a7ab2c8e474491914d2305f187e"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:612d1156111ae11d14afaf3a0669ebf6c170dbb735e510a7438ffe2369a847fd"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7be7047bd08accdb7487737631d25735c9a04327911de89ff1b26b81745bd4e3"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de170c7b4fe6859beb8926e84f7d7d6c693dfe8e27372ce3b76f01c46e489fcf"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04bde7a7b3de05732a4eb39c94574db1ec99abb56162d6c520ad26f83267de29"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85f67aed7bb647f93e7520633d8f51d3cbc6ab96957c71272b286b2f30dc70ed"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425bf820055005bfc8aa9a0b99ccb52cc2f4070153e34b701acc98d201693733"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d3eb1ceec286eba8220c26f3b0096cf189aea7057b6e7b7a2e60ed36b373b77f"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7901c05ead4b3fb75113fb1dd33eb1253c6d3ee37ce93305acd9d38e0b5f21a4"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e0e79d91e71b9867c73323a3444724d496c037e578a0e1755ae159ba14f4f3d1"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:29bfeb0dff5cb5fdab2023a7a9947b3b4af63e9c47cae2a10ad58394b517fddc"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e030047e85cbcedbfc073f71836d62dd5dadfbe7531cae27789ff66bc551bd5e"}, + {file = "multidict-6.0.5-cp311-cp311-win32.whl", hash = "sha256:2f4848aa3baa109e6ab81fe2006c77ed4d3cd1e0ac2c1fbddb7b1277c168788c"}, + {file = "multidict-6.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:2faa5ae9376faba05f630d7e5e6be05be22913782b927b19d12b8145968a85ea"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:51d035609b86722963404f711db441cf7134f1889107fb171a970c9701f92e1e"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cbebcd5bcaf1eaf302617c114aa67569dd3f090dd0ce8ba9e35e9985b41ac35b"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ffc42c922dbfddb4a4c3b438eb056828719f07608af27d163191cb3e3aa6cc5"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ceb3b7e6a0135e092de86110c5a74e46bda4bd4fbfeeb3a3bcec79c0f861e450"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79660376075cfd4b2c80f295528aa6beb2058fd289f4c9252f986751a4cd0496"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4428b29611e989719874670fd152b6625500ad6c686d464e99f5aaeeaca175a"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84a5c3a5f7ce6db1f999fb9438f686bc2e09d38143f2d93d8406ed2dd6b9226"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76c0de87358b192de7ea9649beb392f107dcad9ad27276324c24c91774ca5271"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:79a6d2ba910adb2cbafc95dad936f8b9386e77c84c35bc0add315b856d7c3abb"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:92d16a3e275e38293623ebf639c471d3e03bb20b8ebb845237e0d3664914caef"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:fb616be3538599e797a2017cccca78e354c767165e8858ab5116813146041a24"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:14c2976aa9038c2629efa2c148022ed5eb4cb939e15ec7aace7ca932f48f9ba6"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:435a0984199d81ca178b9ae2c26ec3d49692d20ee29bc4c11a2a8d4514c67eda"}, + {file = "multidict-6.0.5-cp312-cp312-win32.whl", hash = "sha256:9fe7b0653ba3d9d65cbe7698cca585bf0f8c83dbbcc710db9c90f478e175f2d5"}, + {file = "multidict-6.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:01265f5e40f5a17f8241d52656ed27192be03bfa8764d88e8220141d1e4b3556"}, + {file = "multidict-6.0.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:19fe01cea168585ba0f678cad6f58133db2aa14eccaf22f88e4a6dccadfad8b3"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bf7a982604375a8d49b6cc1b781c1747f243d91b81035a9b43a2126c04766f5"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:107c0cdefe028703fb5dafe640a409cb146d44a6ae201e55b35a4af8e95457dd"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:403c0911cd5d5791605808b942c88a8155c2592e05332d2bf78f18697a5fa15e"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aeaf541ddbad8311a87dd695ed9642401131ea39ad7bc8cf3ef3967fd093b626"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4972624066095e52b569e02b5ca97dbd7a7ddd4294bf4e7247d52635630dd83"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d946b0a9eb8aaa590df1fe082cee553ceab173e6cb5b03239716338629c50c7a"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b55358304d7a73d7bdf5de62494aaf70bd33015831ffd98bc498b433dfe5b10c"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:a3145cb08d8625b2d3fee1b2d596a8766352979c9bffe5d7833e0503d0f0b5e5"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d65f25da8e248202bd47445cec78e0025c0fe7582b23ec69c3b27a640dd7a8e3"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c9bf56195c6bbd293340ea82eafd0071cb3d450c703d2c93afb89f93b8386ccc"}, + {file = "multidict-6.0.5-cp37-cp37m-win32.whl", hash = "sha256:69db76c09796b313331bb7048229e3bee7928eb62bab5e071e9f7fcc4879caee"}, + {file = "multidict-6.0.5-cp37-cp37m-win_amd64.whl", hash = "sha256:fce28b3c8a81b6b36dfac9feb1de115bab619b3c13905b419ec71d03a3fc1423"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:76f067f5121dcecf0d63a67f29080b26c43c71a98b10c701b0677e4a065fbd54"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b82cc8ace10ab5bd93235dfaab2021c70637005e1ac787031f4d1da63d493c1d"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5cb241881eefd96b46f89b1a056187ea8e9ba14ab88ba632e68d7a2ecb7aadf7"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8e94e6912639a02ce173341ff62cc1201232ab86b8a8fcc05572741a5dc7d93"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09a892e4a9fb47331da06948690ae38eaa2426de97b4ccbfafbdcbe5c8f37ff8"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55205d03e8a598cfc688c71ca8ea5f66447164efff8869517f175ea632c7cb7b"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37b15024f864916b4951adb95d3a80c9431299080341ab9544ed148091b53f50"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2a1dee728b52b33eebff5072817176c172050d44d67befd681609b4746e1c2e"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:edd08e6f2f1a390bf137080507e44ccc086353c8e98c657e666c017718561b89"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:60d698e8179a42ec85172d12f50b1668254628425a6bd611aba022257cac1386"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:3d25f19500588cbc47dc19081d78131c32637c25804df8414463ec908631e453"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4cc0ef8b962ac7a5e62b9e826bd0cd5040e7d401bc45a6835910ed699037a461"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:eca2e9d0cc5a889850e9bbd68e98314ada174ff6ccd1129500103df7a94a7a44"}, + {file = "multidict-6.0.5-cp38-cp38-win32.whl", hash = "sha256:4a6a4f196f08c58c59e0b8ef8ec441d12aee4125a7d4f4fef000ccb22f8d7241"}, + {file = "multidict-6.0.5-cp38-cp38-win_amd64.whl", hash = "sha256:0275e35209c27a3f7951e1ce7aaf93ce0d163b28948444bec61dd7badc6d3f8c"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e7be68734bd8c9a513f2b0cfd508802d6609da068f40dc57d4e3494cefc92929"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1d9ea7a7e779d7a3561aade7d596649fbecfa5c08a7674b11b423783217933f9"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ea1456df2a27c73ce51120fa2f519f1bea2f4a03a917f4a43c8707cf4cbbae1a"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf590b134eb70629e350691ecca88eac3e3b8b3c86992042fb82e3cb1830d5e1"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5c0631926c4f58e9a5ccce555ad7747d9a9f8b10619621f22f9635f069f6233e"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dce1c6912ab9ff5f179eaf6efe7365c1f425ed690b03341911bf4939ef2f3046"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0868d64af83169e4d4152ec612637a543f7a336e4a307b119e98042e852ad9c"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:141b43360bfd3bdd75f15ed811850763555a251e38b2405967f8e25fb43f7d40"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7df704ca8cf4a073334e0427ae2345323613e4df18cc224f647f251e5e75a527"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6214c5a5571802c33f80e6c84713b2c79e024995b9c5897f794b43e714daeec9"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:cd6c8fca38178e12c00418de737aef1261576bd1b6e8c6134d3e729a4e858b38"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e02021f87a5b6932fa6ce916ca004c4d441509d33bbdbeca70d05dff5e9d2479"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ebd8d160f91a764652d3e51ce0d2956b38efe37c9231cd82cfc0bed2e40b581c"}, + {file = "multidict-6.0.5-cp39-cp39-win32.whl", hash = "sha256:04da1bb8c8dbadf2a18a452639771951c662c5ad03aefe4884775454be322c9b"}, + {file = "multidict-6.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:d6f6d4f185481c9669b9447bf9d9cf3b95a0e9df9d169bbc17e363b7d5487755"}, + {file = "multidict-6.0.5-py3-none-any.whl", hash = "sha256:0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7"}, + {file = "multidict-6.0.5.tar.gz", hash = "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da"}, +] + [[package]] name = "nest-asyncio" version = "1.6.0" @@ -1248,13 +1655,13 @@ files = [ [[package]] name = "nvidia-nvjitlink-cu12" -version = "12.3.101" +version = "12.4.127" description = "Nvidia JIT LTO Library" optional = false python-versions = ">=3" files = [ - {file = "nvidia_nvjitlink_cu12-12.3.101-py3-none-manylinux1_x86_64.whl", hash = "sha256:64335a8088e2b9d196ae8665430bc6a2b7e6ef2eb877a9c735c804bd4ff6467c"}, - {file = "nvidia_nvjitlink_cu12-12.3.101-py3-none-win_amd64.whl", hash = "sha256:1b2e317e437433753530792f13eece58f0aec21a2b05903be7bffe58a606cbd1"}, + {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:06b3b9b25bf3f8af351d664978ca26a16d2c5127dbd53c0497e28d1fb9611d57"}, + {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-win_amd64.whl", hash = "sha256:fd9020c501d27d135f983c6d3e244b197a7ccad769e34df53a42e276b0e25fa1"}, ] [[package]] @@ -1304,29 +1711,92 @@ tests = ["pytest", "pytest-cov", "pytest-pep8"] [[package]] name = "packaging" -version = "23.2" +version = "24.0" description = "Core utilities for Python packages" optional = false python-versions = ">=3.7" files = [ - {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, - {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, + {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, + {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, ] +[[package]] +name = "pandas" +version = "2.0.3" +description = "Powerful data structures for data analysis, time series, and statistics" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pandas-2.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e4c7c9f27a4185304c7caf96dc7d91bc60bc162221152de697c98eb0b2648dd8"}, + {file = "pandas-2.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f167beed68918d62bffb6ec64f2e1d8a7d297a038f86d4aed056b9493fca407f"}, + {file = "pandas-2.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce0c6f76a0f1ba361551f3e6dceaff06bde7514a374aa43e33b588ec10420183"}, + {file = "pandas-2.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba619e410a21d8c387a1ea6e8a0e49bb42216474436245718d7f2e88a2f8d7c0"}, + {file = "pandas-2.0.3-cp310-cp310-win32.whl", hash = "sha256:3ef285093b4fe5058eefd756100a367f27029913760773c8bf1d2d8bebe5d210"}, + {file = "pandas-2.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:9ee1a69328d5c36c98d8e74db06f4ad518a1840e8ccb94a4ba86920986bb617e"}, + {file = "pandas-2.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b084b91d8d66ab19f5bb3256cbd5ea661848338301940e17f4492b2ce0801fe8"}, + {file = "pandas-2.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:37673e3bdf1551b95bf5d4ce372b37770f9529743d2498032439371fc7b7eb26"}, + {file = "pandas-2.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9cb1e14fdb546396b7e1b923ffaeeac24e4cedd14266c3497216dd4448e4f2d"}, + {file = "pandas-2.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9cd88488cceb7635aebb84809d087468eb33551097d600c6dad13602029c2df"}, + {file = "pandas-2.0.3-cp311-cp311-win32.whl", hash = "sha256:694888a81198786f0e164ee3a581df7d505024fbb1f15202fc7db88a71d84ebd"}, + {file = "pandas-2.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:6a21ab5c89dcbd57f78d0ae16630b090eec626360085a4148693def5452d8a6b"}, + {file = "pandas-2.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9e4da0d45e7f34c069fe4d522359df7d23badf83abc1d1cef398895822d11061"}, + {file = "pandas-2.0.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:32fca2ee1b0d93dd71d979726b12b61faa06aeb93cf77468776287f41ff8fdc5"}, + {file = "pandas-2.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:258d3624b3ae734490e4d63c430256e716f488c4fcb7c8e9bde2d3aa46c29089"}, + {file = "pandas-2.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eae3dc34fa1aa7772dd3fc60270d13ced7346fcbcfee017d3132ec625e23bb0"}, + {file = "pandas-2.0.3-cp38-cp38-win32.whl", hash = "sha256:f3421a7afb1a43f7e38e82e844e2bca9a6d793d66c1a7f9f0ff39a795bbc5e02"}, + {file = "pandas-2.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:69d7f3884c95da3a31ef82b7618af5710dba95bb885ffab339aad925c3e8ce78"}, + {file = "pandas-2.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5247fb1ba347c1261cbbf0fcfba4a3121fbb4029d95d9ef4dc45406620b25c8b"}, + {file = "pandas-2.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:81af086f4543c9d8bb128328b5d32e9986e0c84d3ee673a2ac6fb57fd14f755e"}, + {file = "pandas-2.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1994c789bf12a7c5098277fb43836ce090f1073858c10f9220998ac74f37c69b"}, + {file = "pandas-2.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ec591c48e29226bcbb316e0c1e9423622bc7a4eaf1ef7c3c9fa1a3981f89641"}, + {file = "pandas-2.0.3-cp39-cp39-win32.whl", hash = "sha256:04dbdbaf2e4d46ca8da896e1805bc04eb85caa9a82e259e8eed00254d5e0c682"}, + {file = "pandas-2.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:1168574b036cd8b93abc746171c9b4f1b83467438a5e45909fed645cf8692dbc"}, + {file = "pandas-2.0.3.tar.gz", hash = "sha256:c02f372a88e0d17f36d3093a644c73cfc1788e876a7c4bcb4020a77512e2043c"}, +] + +[package.dependencies] +numpy = {version = ">=1.20.3", markers = "python_version < \"3.10\""} +python-dateutil = ">=2.8.2" +pytz = ">=2020.1" +tzdata = ">=2022.1" + +[package.extras] +all = ["PyQt5 (>=5.15.1)", "SQLAlchemy (>=1.4.16)", "beautifulsoup4 (>=4.9.3)", "bottleneck (>=1.3.2)", "brotlipy (>=0.7.0)", "fastparquet (>=0.6.3)", "fsspec (>=2021.07.0)", "gcsfs (>=2021.07.0)", "html5lib (>=1.1)", "hypothesis (>=6.34.2)", "jinja2 (>=3.0.0)", "lxml (>=4.6.3)", "matplotlib (>=3.6.1)", "numba (>=0.53.1)", "numexpr (>=2.7.3)", "odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pandas-gbq (>=0.15.0)", "psycopg2 (>=2.8.6)", "pyarrow (>=7.0.0)", "pymysql (>=1.0.2)", "pyreadstat (>=1.1.2)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)", "python-snappy (>=0.6.0)", "pyxlsb (>=1.0.8)", "qtpy (>=2.2.0)", "s3fs (>=2021.08.0)", "scipy (>=1.7.1)", "tables (>=3.6.1)", "tabulate (>=0.8.9)", "xarray (>=0.21.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)", "zstandard (>=0.15.2)"] +aws = ["s3fs (>=2021.08.0)"] +clipboard = ["PyQt5 (>=5.15.1)", "qtpy (>=2.2.0)"] +compression = ["brotlipy (>=0.7.0)", "python-snappy (>=0.6.0)", "zstandard (>=0.15.2)"] +computation = ["scipy (>=1.7.1)", "xarray (>=0.21.0)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pyxlsb (>=1.0.8)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)"] +feather = ["pyarrow (>=7.0.0)"] +fss = ["fsspec (>=2021.07.0)"] +gcp = ["gcsfs (>=2021.07.0)", "pandas-gbq (>=0.15.0)"] +hdf5 = ["tables (>=3.6.1)"] +html = ["beautifulsoup4 (>=4.9.3)", "html5lib (>=1.1)", "lxml (>=4.6.3)"] +mysql = ["SQLAlchemy (>=1.4.16)", "pymysql (>=1.0.2)"] +output-formatting = ["jinja2 (>=3.0.0)", "tabulate (>=0.8.9)"] +parquet = ["pyarrow (>=7.0.0)"] +performance = ["bottleneck (>=1.3.2)", "numba (>=0.53.1)", "numexpr (>=2.7.1)"] +plot = ["matplotlib (>=3.6.1)"] +postgresql = ["SQLAlchemy (>=1.4.16)", "psycopg2 (>=2.8.6)"] +spss = ["pyreadstat (>=1.1.2)"] +sql-other = ["SQLAlchemy (>=1.4.16)"] +test = ["hypothesis (>=6.34.2)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)"] +xml = ["lxml (>=4.6.3)"] + [[package]] name = "parso" -version = "0.8.3" +version = "0.8.4" description = "A Python Parser" optional = false python-versions = ">=3.6" files = [ - {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"}, - {file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"}, + {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, + {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, ] [package.extras] -qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] -testing = ["docopt", "pytest (<6.0.0)"] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["docopt", "pytest"] [[package]] name = "pexpect" @@ -1355,79 +1825,80 @@ files = [ [[package]] name = "pillow" -version = "10.2.0" +version = "10.3.0" description = "Python Imaging Library (Fork)" optional = false python-versions = ">=3.8" files = [ - {file = "pillow-10.2.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:7823bdd049099efa16e4246bdf15e5a13dbb18a51b68fa06d6c1d4d8b99a796e"}, - {file = "pillow-10.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:83b2021f2ade7d1ed556bc50a399127d7fb245e725aa0113ebd05cfe88aaf588"}, - {file = "pillow-10.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fad5ff2f13d69b7e74ce5b4ecd12cc0ec530fcee76356cac6742785ff71c452"}, - {file = "pillow-10.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da2b52b37dad6d9ec64e653637a096905b258d2fc2b984c41ae7d08b938a67e4"}, - {file = "pillow-10.2.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:47c0995fc4e7f79b5cfcab1fc437ff2890b770440f7696a3ba065ee0fd496563"}, - {file = "pillow-10.2.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:322bdf3c9b556e9ffb18f93462e5f749d3444ce081290352c6070d014c93feb2"}, - {file = "pillow-10.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:51f1a1bffc50e2e9492e87d8e09a17c5eea8409cda8d3f277eb6edc82813c17c"}, - {file = "pillow-10.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:69ffdd6120a4737710a9eee73e1d2e37db89b620f702754b8f6e62594471dee0"}, - {file = "pillow-10.2.0-cp310-cp310-win32.whl", hash = "sha256:c6dafac9e0f2b3c78df97e79af707cdc5ef8e88208d686a4847bab8266870023"}, - {file = "pillow-10.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:aebb6044806f2e16ecc07b2a2637ee1ef67a11840a66752751714a0d924adf72"}, - {file = "pillow-10.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:7049e301399273a0136ff39b84c3678e314f2158f50f517bc50285fb5ec847ad"}, - {file = "pillow-10.2.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:35bb52c37f256f662abdfa49d2dfa6ce5d93281d323a9af377a120e89a9eafb5"}, - {file = "pillow-10.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9c23f307202661071d94b5e384e1e1dc7dfb972a28a2310e4ee16103e66ddb67"}, - {file = "pillow-10.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:773efe0603db30c281521a7c0214cad7836c03b8ccff897beae9b47c0b657d61"}, - {file = "pillow-10.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11fa2e5984b949b0dd6d7a94d967743d87c577ff0b83392f17cb3990d0d2fd6e"}, - {file = "pillow-10.2.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:716d30ed977be8b37d3ef185fecb9e5a1d62d110dfbdcd1e2a122ab46fddb03f"}, - {file = "pillow-10.2.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a086c2af425c5f62a65e12fbf385f7c9fcb8f107d0849dba5839461a129cf311"}, - {file = "pillow-10.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c8de2789052ed501dd829e9cae8d3dcce7acb4777ea4a479c14521c942d395b1"}, - {file = "pillow-10.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:609448742444d9290fd687940ac0b57fb35e6fd92bdb65386e08e99af60bf757"}, - {file = "pillow-10.2.0-cp311-cp311-win32.whl", hash = "sha256:823ef7a27cf86df6597fa0671066c1b596f69eba53efa3d1e1cb8b30f3533068"}, - {file = "pillow-10.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:1da3b2703afd040cf65ec97efea81cfba59cdbed9c11d8efc5ab09df9509fc56"}, - {file = "pillow-10.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:edca80cbfb2b68d7b56930b84a0e45ae1694aeba0541f798e908a49d66b837f1"}, - {file = "pillow-10.2.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:1b5e1b74d1bd1b78bc3477528919414874748dd363e6272efd5abf7654e68bef"}, - {file = "pillow-10.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0eae2073305f451d8ecacb5474997c08569fb4eb4ac231ffa4ad7d342fdc25ac"}, - {file = "pillow-10.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7c2286c23cd350b80d2fc9d424fc797575fb16f854b831d16fd47ceec078f2c"}, - {file = "pillow-10.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e23412b5c41e58cec602f1135c57dfcf15482013ce6e5f093a86db69646a5aa"}, - {file = "pillow-10.2.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:52a50aa3fb3acb9cf7213573ef55d31d6eca37f5709c69e6858fe3bc04a5c2a2"}, - {file = "pillow-10.2.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:127cee571038f252a552760076407f9cff79761c3d436a12af6000cd182a9d04"}, - {file = "pillow-10.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:8d12251f02d69d8310b046e82572ed486685c38f02176bd08baf216746eb947f"}, - {file = "pillow-10.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:54f1852cd531aa981bc0965b7d609f5f6cc8ce8c41b1139f6ed6b3c54ab82bfb"}, - {file = "pillow-10.2.0-cp312-cp312-win32.whl", hash = "sha256:257d8788df5ca62c980314053197f4d46eefedf4e6175bc9412f14412ec4ea2f"}, - {file = "pillow-10.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:154e939c5f0053a383de4fd3d3da48d9427a7e985f58af8e94d0b3c9fcfcf4f9"}, - {file = "pillow-10.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:f379abd2f1e3dddb2b61bc67977a6b5a0a3f7485538bcc6f39ec76163891ee48"}, - {file = "pillow-10.2.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8373c6c251f7ef8bda6675dd6d2b3a0fcc31edf1201266b5cf608b62a37407f9"}, - {file = "pillow-10.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:870ea1ada0899fd0b79643990809323b389d4d1d46c192f97342eeb6ee0b8483"}, - {file = "pillow-10.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4b6b1e20608493548b1f32bce8cca185bf0480983890403d3b8753e44077129"}, - {file = "pillow-10.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3031709084b6e7852d00479fd1d310b07d0ba82765f973b543c8af5061cf990e"}, - {file = "pillow-10.2.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:3ff074fc97dd4e80543a3e91f69d58889baf2002b6be64347ea8cf5533188213"}, - {file = "pillow-10.2.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:cb4c38abeef13c61d6916f264d4845fab99d7b711be96c326b84df9e3e0ff62d"}, - {file = "pillow-10.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b1b3020d90c2d8e1dae29cf3ce54f8094f7938460fb5ce8bc5c01450b01fbaf6"}, - {file = "pillow-10.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:170aeb00224ab3dc54230c797f8404507240dd868cf52066f66a41b33169bdbe"}, - {file = "pillow-10.2.0-cp38-cp38-win32.whl", hash = "sha256:c4225f5220f46b2fde568c74fca27ae9771536c2e29d7c04f4fb62c83275ac4e"}, - {file = "pillow-10.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:0689b5a8c5288bc0504d9fcee48f61a6a586b9b98514d7d29b840143d6734f39"}, - {file = "pillow-10.2.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:b792a349405fbc0163190fde0dc7b3fef3c9268292586cf5645598b48e63dc67"}, - {file = "pillow-10.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c570f24be1e468e3f0ce7ef56a89a60f0e05b30a3669a459e419c6eac2c35364"}, - {file = "pillow-10.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8ecd059fdaf60c1963c58ceb8997b32e9dc1b911f5da5307aab614f1ce5c2fb"}, - {file = "pillow-10.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c365fd1703040de1ec284b176d6af5abe21b427cb3a5ff68e0759e1e313a5e7e"}, - {file = "pillow-10.2.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:70c61d4c475835a19b3a5aa42492409878bbca7438554a1f89d20d58a7c75c01"}, - {file = "pillow-10.2.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b6f491cdf80ae540738859d9766783e3b3c8e5bd37f5dfa0b76abdecc5081f13"}, - {file = "pillow-10.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d189550615b4948f45252d7f005e53c2040cea1af5b60d6f79491a6e147eef7"}, - {file = "pillow-10.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:49d9ba1ed0ef3e061088cd1e7538a0759aab559e2e0a80a36f9fd9d8c0c21591"}, - {file = "pillow-10.2.0-cp39-cp39-win32.whl", hash = "sha256:babf5acfede515f176833ed6028754cbcd0d206f7f614ea3447d67c33be12516"}, - {file = "pillow-10.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:0304004f8067386b477d20a518b50f3fa658a28d44e4116970abfcd94fac34a8"}, - {file = "pillow-10.2.0-cp39-cp39-win_arm64.whl", hash = "sha256:0fb3e7fc88a14eacd303e90481ad983fd5b69c761e9e6ef94c983f91025da869"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:322209c642aabdd6207517e9739c704dc9f9db943015535783239022002f054a"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3eedd52442c0a5ff4f887fab0c1c0bb164d8635b32c894bc1faf4c618dd89df2"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb28c753fd5eb3dd859b4ee95de66cc62af91bcff5db5f2571d32a520baf1f04"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:33870dc4653c5017bf4c8873e5488d8f8d5f8935e2f1fb9a2208c47cdd66efd2"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3c31822339516fb3c82d03f30e22b1d038da87ef27b6a78c9549888f8ceda39a"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a2b56ba36e05f973d450582fb015594aaa78834fefe8dfb8fcd79b93e64ba4c6"}, - {file = "pillow-10.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:d8e6aeb9201e655354b3ad049cb77d19813ad4ece0df1249d3c793de3774f8c7"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:2247178effb34a77c11c0e8ac355c7a741ceca0a732b27bf11e747bbc950722f"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15587643b9e5eb26c48e49a7b33659790d28f190fc514a322d55da2fb5c2950e"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753cd8f2086b2b80180d9b3010dd4ed147efc167c90d3bf593fe2af21265e5a5"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:7c8f97e8e7a9009bcacbe3766a36175056c12f9a44e6e6f2d5caad06dcfbf03b"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d1b35bcd6c5543b9cb547dee3150c93008f8dd0f1fef78fc0cd2b141c5baf58a"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fe4c15f6c9285dc54ce6553a3ce908ed37c8f3825b5a51a15c91442bb955b868"}, - {file = "pillow-10.2.0.tar.gz", hash = "sha256:e87f0b2c78157e12d7686b27d63c070fd65d994e8ddae6f328e0dcf4a0cd007e"}, + {file = "pillow-10.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:90b9e29824800e90c84e4022dd5cc16eb2d9605ee13f05d47641eb183cd73d45"}, + {file = "pillow-10.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a2c405445c79c3f5a124573a051062300936b0281fee57637e706453e452746c"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78618cdbccaa74d3f88d0ad6cb8ac3007f1a6fa5c6f19af64b55ca170bfa1edf"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261ddb7ca91fcf71757979534fb4c128448b5b4c55cb6152d280312062f69599"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ce49c67f4ea0609933d01c0731b34b8695a7a748d6c8d186f95e7d085d2fe475"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b14f16f94cbc61215115b9b1236f9c18403c15dd3c52cf629072afa9d54c1cbf"}, + {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d33891be6df59d93df4d846640f0e46f1a807339f09e79a8040bc887bdcd7ed3"}, + {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b50811d664d392f02f7761621303eba9d1b056fb1868c8cdf4231279645c25f5"}, + {file = "pillow-10.3.0-cp310-cp310-win32.whl", hash = "sha256:ca2870d5d10d8726a27396d3ca4cf7976cec0f3cb706debe88e3a5bd4610f7d2"}, + {file = "pillow-10.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:f0d0591a0aeaefdaf9a5e545e7485f89910c977087e7de2b6c388aec32011e9f"}, + {file = "pillow-10.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:ccce24b7ad89adb5a1e34a6ba96ac2530046763912806ad4c247356a8f33a67b"}, + {file = "pillow-10.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:5f77cf66e96ae734717d341c145c5949c63180842a545c47a0ce7ae52ca83795"}, + {file = "pillow-10.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e4b878386c4bf293578b48fc570b84ecfe477d3b77ba39a6e87150af77f40c57"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdcbb4068117dfd9ce0138d068ac512843c52295ed996ae6dd1faf537b6dbc27"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9797a6c8fe16f25749b371c02e2ade0efb51155e767a971c61734b1bf6293994"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:9e91179a242bbc99be65e139e30690e081fe6cb91a8e77faf4c409653de39451"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:1b87bd9d81d179bd8ab871603bd80d8645729939f90b71e62914e816a76fc6bd"}, + {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:81d09caa7b27ef4e61cb7d8fbf1714f5aec1c6b6c5270ee53504981e6e9121ad"}, + {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:048ad577748b9fa4a99a0548c64f2cb8d672d5bf2e643a739ac8faff1164238c"}, + {file = "pillow-10.3.0-cp311-cp311-win32.whl", hash = "sha256:7161ec49ef0800947dc5570f86568a7bb36fa97dd09e9827dc02b718c5643f09"}, + {file = "pillow-10.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:8eb0908e954d093b02a543dc963984d6e99ad2b5e36503d8a0aaf040505f747d"}, + {file = "pillow-10.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:4e6f7d1c414191c1199f8996d3f2282b9ebea0945693fb67392c75a3a320941f"}, + {file = "pillow-10.3.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:e46f38133e5a060d46bd630faa4d9fa0202377495df1f068a8299fd78c84de84"}, + {file = "pillow-10.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:50b8eae8f7334ec826d6eeffaeeb00e36b5e24aa0b9df322c247539714c6df19"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d3bea1c75f8c53ee4d505c3e67d8c158ad4df0d83170605b50b64025917f338"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19aeb96d43902f0a783946a0a87dbdad5c84c936025b8419da0a0cd7724356b1"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:74d28c17412d9caa1066f7a31df8403ec23d5268ba46cd0ad2c50fb82ae40462"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:ff61bfd9253c3915e6d41c651d5f962da23eda633cf02262990094a18a55371a"}, + {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d886f5d353333b4771d21267c7ecc75b710f1a73d72d03ca06df49b09015a9ef"}, + {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b5ec25d8b17217d635f8935dbc1b9aa5907962fae29dff220f2659487891cd3"}, + {file = "pillow-10.3.0-cp312-cp312-win32.whl", hash = "sha256:51243f1ed5161b9945011a7360e997729776f6e5d7005ba0c6879267d4c5139d"}, + {file = "pillow-10.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:412444afb8c4c7a6cc11a47dade32982439925537e483be7c0ae0cf96c4f6a0b"}, + {file = "pillow-10.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:798232c92e7665fe82ac085f9d8e8ca98826f8e27859d9a96b41d519ecd2e49a"}, + {file = "pillow-10.3.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:4eaa22f0d22b1a7e93ff0a596d57fdede2e550aecffb5a1ef1106aaece48e96b"}, + {file = "pillow-10.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cd5e14fbf22a87321b24c88669aad3a51ec052eb145315b3da3b7e3cc105b9a2"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1530e8f3a4b965eb6a7785cf17a426c779333eb62c9a7d1bbcf3ffd5bf77a4aa"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d512aafa1d32efa014fa041d38868fda85028e3f930a96f85d49c7d8ddc0383"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:339894035d0ede518b16073bdc2feef4c991ee991a29774b33e515f1d308e08d"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:aa7e402ce11f0885305bfb6afb3434b3cd8f53b563ac065452d9d5654c7b86fd"}, + {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0ea2a783a2bdf2a561808fe4a7a12e9aa3799b701ba305de596bc48b8bdfce9d"}, + {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c78e1b00a87ce43bb37642c0812315b411e856a905d58d597750eb79802aaaa3"}, + {file = "pillow-10.3.0-cp38-cp38-win32.whl", hash = "sha256:72d622d262e463dfb7595202d229f5f3ab4b852289a1cd09650362db23b9eb0b"}, + {file = "pillow-10.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:2034f6759a722da3a3dbd91a81148cf884e91d1b747992ca288ab88c1de15999"}, + {file = "pillow-10.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:2ed854e716a89b1afcedea551cd85f2eb2a807613752ab997b9974aaa0d56936"}, + {file = "pillow-10.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dc1a390a82755a8c26c9964d457d4c9cbec5405896cba94cf51f36ea0d855002"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4203efca580f0dd6f882ca211f923168548f7ba334c189e9eab1178ab840bf60"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3102045a10945173d38336f6e71a8dc71bcaeed55c3123ad4af82c52807b9375"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:6fb1b30043271ec92dc65f6d9f0b7a830c210b8a96423074b15c7bc999975f57"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:1dfc94946bc60ea375cc39cff0b8da6c7e5f8fcdc1d946beb8da5c216156ddd8"}, + {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b09b86b27a064c9624d0a6c54da01c1beaf5b6cadfa609cf63789b1d08a797b9"}, + {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d3b2348a78bc939b4fed6552abfd2e7988e0f81443ef3911a4b8498ca084f6eb"}, + {file = "pillow-10.3.0-cp39-cp39-win32.whl", hash = "sha256:45ebc7b45406febf07fef35d856f0293a92e7417ae7933207e90bf9090b70572"}, + {file = "pillow-10.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:0ba26351b137ca4e0db0342d5d00d2e355eb29372c05afd544ebf47c0956ffeb"}, + {file = "pillow-10.3.0-cp39-cp39-win_arm64.whl", hash = "sha256:50fd3f6b26e3441ae07b7c979309638b72abc1a25da31a81a7fbd9495713ef4f"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:6b02471b72526ab8a18c39cb7967b72d194ec53c1fd0a70b050565a0f366d355"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8ab74c06ffdab957d7670c2a5a6e1a70181cd10b727cd788c4dd9005b6a8acd9"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:048eeade4c33fdf7e08da40ef402e748df113fd0b4584e32c4af74fe78baaeb2"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2ec1e921fd07c7cda7962bad283acc2f2a9ccc1b971ee4b216b75fad6f0463"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c8e73e99da7db1b4cad7f8d682cf6abad7844da39834c288fbfa394a47bbced"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:16563993329b79513f59142a6b02055e10514c1a8e86dca8b48a893e33cf91e3"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:dd78700f5788ae180b5ee8902c6aea5a5726bac7c364b202b4b3e3ba2d293170"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:aff76a55a8aa8364d25400a210a65ff59d0168e0b4285ba6bf2bd83cf675ba32"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b7bc2176354defba3edc2b9a777744462da2f8e921fbaf61e52acb95bafa9828"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:793b4e24db2e8742ca6423d3fde8396db336698c55cd34b660663ee9e45ed37f"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d93480005693d247f8346bc8ee28c72a2191bdf1f6b5db469c096c0c867ac015"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c83341b89884e2b2e55886e8fbbf37c3fa5efd6c8907124aeb72f285ae5696e5"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1a1d1915db1a4fdb2754b9de292642a39a7fb28f1736699527bb649484fb966a"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a0eaa93d054751ee9964afa21c06247779b90440ca41d184aeb5d410f20ff591"}, + {file = "pillow-10.3.0.tar.gz", hash = "sha256:9d2455fbf44c914840c793e89aa82d0e1763a14253a000743719ae5946814b2d"}, ] [package.extras] @@ -1469,22 +1940,33 @@ wcwidth = "*" [[package]] name = "protobuf" -version = "4.25.2" -description = "" +version = "3.20.3" +description = "Protocol Buffers" optional = false -python-versions = ">=3.8" +python-versions = ">=3.7" files = [ - {file = "protobuf-4.25.2-cp310-abi3-win32.whl", hash = "sha256:b50c949608682b12efb0b2717f53256f03636af5f60ac0c1d900df6213910fd6"}, - {file = "protobuf-4.25.2-cp310-abi3-win_amd64.whl", hash = "sha256:8f62574857ee1de9f770baf04dde4165e30b15ad97ba03ceac65f760ff018ac9"}, - {file = "protobuf-4.25.2-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:2db9f8fa64fbdcdc93767d3cf81e0f2aef176284071507e3ede160811502fd3d"}, - {file = "protobuf-4.25.2-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:10894a2885b7175d3984f2be8d9850712c57d5e7587a2410720af8be56cdaf62"}, - {file = "protobuf-4.25.2-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:fc381d1dd0516343f1440019cedf08a7405f791cd49eef4ae1ea06520bc1c020"}, - {file = "protobuf-4.25.2-cp38-cp38-win32.whl", hash = "sha256:33a1aeef4b1927431d1be780e87b641e322b88d654203a9e9d93f218ee359e61"}, - {file = "protobuf-4.25.2-cp38-cp38-win_amd64.whl", hash = "sha256:47f3de503fe7c1245f6f03bea7e8d3ec11c6c4a2ea9ef910e3221c8a15516d62"}, - {file = "protobuf-4.25.2-cp39-cp39-win32.whl", hash = "sha256:5e5c933b4c30a988b52e0b7c02641760a5ba046edc5e43d3b94a74c9fc57c1b3"}, - {file = "protobuf-4.25.2-cp39-cp39-win_amd64.whl", hash = "sha256:d66a769b8d687df9024f2985d5137a337f957a0916cf5464d1513eee96a63ff0"}, - {file = "protobuf-4.25.2-py3-none-any.whl", hash = "sha256:a8b7a98d4ce823303145bf3c1a8bdb0f2f4642a414b196f04ad9853ed0c8f830"}, - {file = "protobuf-4.25.2.tar.gz", hash = "sha256:fe599e175cb347efc8ee524bcd4b902d11f7262c0e569ececcb89995c15f0a5e"}, + {file = "protobuf-3.20.3-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:f4bd856d702e5b0d96a00ec6b307b0f51c1982c2bf9c0052cf9019e9a544ba99"}, + {file = "protobuf-3.20.3-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9aae4406ea63d825636cc11ffb34ad3379335803216ee3a856787bcf5ccc751e"}, + {file = "protobuf-3.20.3-cp310-cp310-win32.whl", hash = "sha256:28545383d61f55b57cf4df63eebd9827754fd2dc25f80c5253f9184235db242c"}, + {file = "protobuf-3.20.3-cp310-cp310-win_amd64.whl", hash = "sha256:67a3598f0a2dcbc58d02dd1928544e7d88f764b47d4a286202913f0b2801c2e7"}, + {file = "protobuf-3.20.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:899dc660cd599d7352d6f10d83c95df430a38b410c1b66b407a6b29265d66469"}, + {file = "protobuf-3.20.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e64857f395505ebf3d2569935506ae0dfc4a15cb80dc25261176c784662cdcc4"}, + {file = "protobuf-3.20.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:d9e4432ff660d67d775c66ac42a67cf2453c27cb4d738fc22cb53b5d84c135d4"}, + {file = "protobuf-3.20.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:74480f79a023f90dc6e18febbf7b8bac7508420f2006fabd512013c0c238f454"}, + {file = "protobuf-3.20.3-cp37-cp37m-win32.whl", hash = "sha256:b6cc7ba72a8850621bfec987cb72623e703b7fe2b9127a161ce61e61558ad905"}, + {file = "protobuf-3.20.3-cp37-cp37m-win_amd64.whl", hash = "sha256:8c0c984a1b8fef4086329ff8dd19ac77576b384079247c770f29cc8ce3afa06c"}, + {file = "protobuf-3.20.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:de78575669dddf6099a8a0f46a27e82a1783c557ccc38ee620ed8cc96d3be7d7"}, + {file = "protobuf-3.20.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:f4c42102bc82a51108e449cbb32b19b180022941c727bac0cfd50170341f16ee"}, + {file = "protobuf-3.20.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:44246bab5dd4b7fbd3c0c80b6f16686808fab0e4aca819ade6e8d294a29c7050"}, + {file = "protobuf-3.20.3-cp38-cp38-win32.whl", hash = "sha256:c02ce36ec760252242a33967d51c289fd0e1c0e6e5cc9397e2279177716add86"}, + {file = "protobuf-3.20.3-cp38-cp38-win_amd64.whl", hash = "sha256:447d43819997825d4e71bf5769d869b968ce96848b6479397e29fc24c4a5dfe9"}, + {file = "protobuf-3.20.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:398a9e0c3eaceb34ec1aee71894ca3299605fa8e761544934378bbc6c97de23b"}, + {file = "protobuf-3.20.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:bf01b5720be110540be4286e791db73f84a2b721072a3711efff6c324cdf074b"}, + {file = "protobuf-3.20.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:daa564862dd0d39c00f8086f88700fdbe8bc717e993a21e90711acfed02f2402"}, + {file = "protobuf-3.20.3-cp39-cp39-win32.whl", hash = "sha256:819559cafa1a373b7096a482b504ae8a857c89593cf3a25af743ac9ecbd23480"}, + {file = "protobuf-3.20.3-cp39-cp39-win_amd64.whl", hash = "sha256:03038ac1cfbc41aa21f6afcbcd357281d7521b4157926f30ebecc8d4ea59dcb7"}, + {file = "protobuf-3.20.3-py2.py3-none-any.whl", hash = "sha256:a7ca6d488aa8ff7f329d4c545b2dbad8ac31464f1d8b1c87ad1346717731e4db"}, + {file = "protobuf-3.20.3.tar.gz", hash = "sha256:2e3427429c9cffebf259491be0af70189607f365c2f41c7c3764af6f337105f2"}, ] [[package]] @@ -1542,38 +2024,38 @@ tests = ["pytest"] [[package]] name = "pyasn1" -version = "0.5.1" +version = "0.6.0" description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +python-versions = ">=3.8" files = [ - {file = "pyasn1-0.5.1-py2.py3-none-any.whl", hash = "sha256:4439847c58d40b1d0a573d07e3856e95333f1976294494c325775aeca506eb58"}, - {file = "pyasn1-0.5.1.tar.gz", hash = "sha256:6d391a96e59b23130a5cfa74d6fd7f388dbbe26cc8f1edf39fdddf08d9d6676c"}, + {file = "pyasn1-0.6.0-py2.py3-none-any.whl", hash = "sha256:cca4bb0f2df5504f02f6f8a775b6e416ff9b0b3b16f7ee80b5a3153d9b804473"}, + {file = "pyasn1-0.6.0.tar.gz", hash = "sha256:3a35ab2c4b5ef98e17dfdec8ab074046fbda76e281c5a706ccd82328cfc8f64c"}, ] [[package]] name = "pyasn1-modules" -version = "0.3.0" +version = "0.4.0" description = "A collection of ASN.1-based protocols modules" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +python-versions = ">=3.8" files = [ - {file = "pyasn1_modules-0.3.0-py2.py3-none-any.whl", hash = "sha256:d3ccd6ed470d9ffbc716be08bd90efbd44d0734bc9303818f7336070984a162d"}, - {file = "pyasn1_modules-0.3.0.tar.gz", hash = "sha256:5bd01446b736eb9d31512a30d46c1ac3395d676c6f3cafa4c03eb54b9925631c"}, + {file = "pyasn1_modules-0.4.0-py3-none-any.whl", hash = "sha256:be04f15b66c206eed667e0bb5ab27e2b1855ea54a842e5037738099e8ca4ae0b"}, + {file = "pyasn1_modules-0.4.0.tar.gz", hash = "sha256:831dbcea1b177b28c9baddf4c6d1013c24c3accd14a1873fffaa6a2e905f17b6"}, ] [package.dependencies] -pyasn1 = ">=0.4.6,<0.6.0" +pyasn1 = ">=0.4.6,<0.7.0" [[package]] name = "pycparser" -version = "2.21" +version = "2.22" description = "C parser in Python" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.8" files = [ - {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, - {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, + {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, + {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, ] [[package]] @@ -1593,13 +2075,13 @@ windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pyparsing" -version = "3.1.1" +version = "3.1.2" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = false python-versions = ">=3.6.8" files = [ - {file = "pyparsing-3.1.1-py3-none-any.whl", hash = "sha256:32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb"}, - {file = "pyparsing-3.1.1.tar.gz", hash = "sha256:ede28a1a32462f5a9705e07aea48001a08f7cf81a021585011deba701581a0db"}, + {file = "pyparsing-3.1.2-py3-none-any.whl", hash = "sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742"}, + {file = "pyparsing-3.1.2.tar.gz", hash = "sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad"}, ] [package.extras] @@ -1607,18 +2089,29 @@ diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "python-dateutil" -version = "2.8.2" +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" files = [ - {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, - {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, + {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"}, ] [package.dependencies] six = ">=1.5" +[[package]] +name = "pytz" +version = "2024.1" +description = "World timezone definitions, modern and historical" +optional = false +python-versions = "*" +files = [ + {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, + {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, +] + [[package]] name = "pywin32" version = "306" @@ -1770,13 +2263,13 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "requests-oauthlib" -version = "1.3.1" +version = "2.0.0" description = "OAuthlib authentication support for Requests." optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.4" files = [ - {file = "requests-oauthlib-1.3.1.tar.gz", hash = "sha256:75beac4a47881eeb94d5ea5d6ad31ef88856affe2332b9aafb52c6452ccf0d7a"}, - {file = "requests_oauthlib-1.3.1-py2.py3-none-any.whl", hash = "sha256:2577c501a2fb8d05a304c09d090d6e47c306fef15809d102b327cf8364bddab5"}, + {file = "requests-oauthlib-2.0.0.tar.gz", hash = "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9"}, + {file = "requests_oauthlib-2.0.0-py2.py3-none-any.whl", hash = "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36"}, ] [package.dependencies] @@ -1801,53 +2294,105 @@ files = [ pyasn1 = ">=0.1.3" [[package]] -name = "scipy" -version = "1.4.1" -description = "SciPy: Scientific Library for Python" +name = "scikit-learn" +version = "1.3.2" +description = "A set of python modules for machine learning and data mining" optional = false -python-versions = ">=3.5" +python-versions = ">=3.8" files = [ - {file = "scipy-1.4.1-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:c5cac0c0387272ee0e789e94a570ac51deb01c796b37fb2aad1fb13f85e2f97d"}, - {file = "scipy-1.4.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:a144811318853a23d32a07bc7fd5561ff0cac5da643d96ed94a4ffe967d89672"}, - {file = "scipy-1.4.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:71eb180f22c49066f25d6df16f8709f215723317cc951d99e54dc88020ea57be"}, - {file = "scipy-1.4.1-cp35-cp35m-win32.whl", hash = "sha256:770254a280d741dd3436919d47e35712fb081a6ff8bafc0f319382b954b77802"}, - {file = "scipy-1.4.1-cp35-cp35m-win_amd64.whl", hash = "sha256:a1aae70d52d0b074d8121333bc807a485f9f1e6a69742010b33780df2e60cfe0"}, - {file = "scipy-1.4.1-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:bb517872058a1f087c4528e7429b4a44533a902644987e7b2fe35ecc223bc408"}, - {file = "scipy-1.4.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:dba8306f6da99e37ea08c08fef6e274b5bf8567bb094d1dbe86a20e532aca088"}, - {file = "scipy-1.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:386086e2972ed2db17cebf88610aab7d7f6e2c0ca30042dc9a89cf18dcc363fa"}, - {file = "scipy-1.4.1-cp36-cp36m-win32.whl", hash = "sha256:8d3bc3993b8e4be7eade6dcc6fd59a412d96d3a33fa42b0fa45dc9e24495ede9"}, - {file = "scipy-1.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:dc60bb302f48acf6da8ca4444cfa17d52c63c5415302a9ee77b3b21618090521"}, - {file = "scipy-1.4.1-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:787cc50cab3020a865640aba3485e9fbd161d4d3b0d03a967df1a2881320512d"}, - {file = "scipy-1.4.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:0902a620a381f101e184a958459b36d3ee50f5effd186db76e131cbefcbb96f7"}, - {file = "scipy-1.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:00af72998a46c25bdb5824d2b729e7dabec0c765f9deb0b504f928591f5ff9d4"}, - {file = "scipy-1.4.1-cp37-cp37m-win32.whl", hash = "sha256:9508a7c628a165c2c835f2497837bf6ac80eb25291055f56c129df3c943cbaf8"}, - {file = "scipy-1.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a2d6df9eb074af7f08866598e4ef068a2b310d98f87dc23bd1b90ec7bdcec802"}, - {file = "scipy-1.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3092857f36b690a321a662fe5496cb816a7f4eecd875e1d36793d92d3f884073"}, - {file = "scipy-1.4.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:8a07760d5c7f3a92e440ad3aedcc98891e915ce857664282ae3c0220f3301eb6"}, - {file = "scipy-1.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:1e3190466d669d658233e8a583b854f6386dd62d655539b77b3fa25bfb2abb70"}, - {file = "scipy-1.4.1-cp38-cp38-win32.whl", hash = "sha256:cc971a82ea1170e677443108703a2ec9ff0f70752258d0e9f5433d00dda01f59"}, - {file = "scipy-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:2cce3f9847a1a51019e8c5b47620da93950e58ebc611f13e0d11f4980ca5fecb"}, - {file = "scipy-1.4.1.tar.gz", hash = "sha256:dee1bbf3a6c8f73b6b218cb28eed8dd13347ea2f87d572ce19b289d6fd3fbc59"}, + {file = "scikit-learn-1.3.2.tar.gz", hash = "sha256:a2f54c76accc15a34bfb9066e6c7a56c1e7235dda5762b990792330b52ccfb05"}, + {file = "scikit_learn-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e326c0eb5cf4d6ba40f93776a20e9a7a69524c4db0757e7ce24ba222471ee8a1"}, + {file = "scikit_learn-1.3.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:535805c2a01ccb40ca4ab7d081d771aea67e535153e35a1fd99418fcedd1648a"}, + {file = "scikit_learn-1.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1215e5e58e9880b554b01187b8c9390bf4dc4692eedeaf542d3273f4785e342c"}, + {file = "scikit_learn-1.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ee107923a623b9f517754ea2f69ea3b62fc898a3641766cb7deb2f2ce450161"}, + {file = "scikit_learn-1.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:35a22e8015048c628ad099da9df5ab3004cdbf81edc75b396fd0cff8699ac58c"}, + {file = "scikit_learn-1.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6fb6bc98f234fda43163ddbe36df8bcde1d13ee176c6dc9b92bb7d3fc842eb66"}, + {file = "scikit_learn-1.3.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:18424efee518a1cde7b0b53a422cde2f6625197de6af36da0b57ec502f126157"}, + {file = "scikit_learn-1.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3271552a5eb16f208a6f7f617b8cc6d1f137b52c8a1ef8edf547db0259b2c9fb"}, + {file = "scikit_learn-1.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc4144a5004a676d5022b798d9e573b05139e77f271253a4703eed295bde0433"}, + {file = "scikit_learn-1.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:67f37d708f042a9b8d59551cf94d30431e01374e00dc2645fa186059c6c5d78b"}, + {file = "scikit_learn-1.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8db94cd8a2e038b37a80a04df8783e09caac77cbe052146432e67800e430c028"}, + {file = "scikit_learn-1.3.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:61a6efd384258789aa89415a410dcdb39a50e19d3d8410bd29be365bcdd512d5"}, + {file = "scikit_learn-1.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb06f8dce3f5ddc5dee1715a9b9f19f20d295bed8e3cd4fa51e1d050347de525"}, + {file = "scikit_learn-1.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b2de18d86f630d68fe1f87af690d451388bb186480afc719e5f770590c2ef6c"}, + {file = "scikit_learn-1.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:0402638c9a7c219ee52c94cbebc8fcb5eb9fe9c773717965c1f4185588ad3107"}, + {file = "scikit_learn-1.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a19f90f95ba93c1a7f7924906d0576a84da7f3b2282ac3bfb7a08a32801add93"}, + {file = "scikit_learn-1.3.2-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:b8692e395a03a60cd927125eef3a8e3424d86dde9b2370d544f0ea35f78a8073"}, + {file = "scikit_learn-1.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15e1e94cc23d04d39da797ee34236ce2375ddea158b10bee3c343647d615581d"}, + {file = "scikit_learn-1.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:785a2213086b7b1abf037aeadbbd6d67159feb3e30263434139c98425e3dcfcf"}, + {file = "scikit_learn-1.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:64381066f8aa63c2710e6b56edc9f0894cc7bf59bd71b8ce5613a4559b6145e0"}, + {file = "scikit_learn-1.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6c43290337f7a4b969d207e620658372ba3c1ffb611f8bc2b6f031dc5c6d1d03"}, + {file = "scikit_learn-1.3.2-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:dc9002fc200bed597d5d34e90c752b74df516d592db162f756cc52836b38fe0e"}, + {file = "scikit_learn-1.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d08ada33e955c54355d909b9c06a4789a729977f165b8bae6f225ff0a60ec4a"}, + {file = "scikit_learn-1.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:763f0ae4b79b0ff9cca0bf3716bcc9915bdacff3cebea15ec79652d1cc4fa5c9"}, + {file = "scikit_learn-1.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:ed932ea780517b00dae7431e031faae6b49b20eb6950918eb83bd043237950e0"}, +] + +[package.dependencies] +joblib = ">=1.1.1" +numpy = ">=1.17.3,<2.0" +scipy = ">=1.5.0" +threadpoolctl = ">=2.0.0" + +[package.extras] +benchmark = ["matplotlib (>=3.1.3)", "memory-profiler (>=0.57.0)", "pandas (>=1.0.5)"] +docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.1.3)", "memory-profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.0.5)", "plotly (>=5.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.16.2)", "seaborn (>=0.9.0)", "sphinx (>=6.0.0)", "sphinx-copybutton (>=0.5.2)", "sphinx-gallery (>=0.10.1)", "sphinx-prompt (>=1.3.0)", "sphinxext-opengraph (>=0.4.2)"] +examples = ["matplotlib (>=3.1.3)", "pandas (>=1.0.5)", "plotly (>=5.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.16.2)", "seaborn (>=0.9.0)"] +tests = ["black (>=23.3.0)", "matplotlib (>=3.1.3)", "mypy (>=1.3)", "numpydoc (>=1.2.0)", "pandas (>=1.0.5)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pytest (>=7.1.2)", "pytest-cov (>=2.9.0)", "ruff (>=0.0.272)", "scikit-image (>=0.16.2)"] + +[[package]] +name = "scipy" +version = "1.10.1" +description = "Fundamental algorithms for scientific computing in Python" +optional = false +python-versions = "<3.12,>=3.8" +files = [ + {file = "scipy-1.10.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e7354fd7527a4b0377ce55f286805b34e8c54b91be865bac273f527e1b839019"}, + {file = "scipy-1.10.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:4b3f429188c66603a1a5c549fb414e4d3bdc2a24792e061ffbd607d3d75fd84e"}, + {file = "scipy-1.10.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1553b5dcddd64ba9a0d95355e63fe6c3fc303a8fd77c7bc91e77d61363f7433f"}, + {file = "scipy-1.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c0ff64b06b10e35215abce517252b375e580a6125fd5fdf6421b98efbefb2d2"}, + {file = "scipy-1.10.1-cp310-cp310-win_amd64.whl", hash = "sha256:fae8a7b898c42dffe3f7361c40d5952b6bf32d10c4569098d276b4c547905ee1"}, + {file = "scipy-1.10.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0f1564ea217e82c1bbe75ddf7285ba0709ecd503f048cb1236ae9995f64217bd"}, + {file = "scipy-1.10.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:d925fa1c81b772882aa55bcc10bf88324dadb66ff85d548c71515f6689c6dac5"}, + {file = "scipy-1.10.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaea0a6be54462ec027de54fca511540980d1e9eea68b2d5c1dbfe084797be35"}, + {file = "scipy-1.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15a35c4242ec5f292c3dd364a7c71a61be87a3d4ddcc693372813c0b73c9af1d"}, + {file = "scipy-1.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:43b8e0bcb877faf0abfb613d51026cd5cc78918e9530e375727bf0625c82788f"}, + {file = "scipy-1.10.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5678f88c68ea866ed9ebe3a989091088553ba12c6090244fdae3e467b1139c35"}, + {file = "scipy-1.10.1-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:39becb03541f9e58243f4197584286e339029e8908c46f7221abeea4b749fa88"}, + {file = "scipy-1.10.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bce5869c8d68cf383ce240e44c1d9ae7c06078a9396df68ce88a1230f93a30c1"}, + {file = "scipy-1.10.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07c3457ce0b3ad5124f98a86533106b643dd811dd61b548e78cf4c8786652f6f"}, + {file = "scipy-1.10.1-cp38-cp38-win_amd64.whl", hash = "sha256:049a8bbf0ad95277ffba9b3b7d23e5369cc39e66406d60422c8cfef40ccc8415"}, + {file = "scipy-1.10.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cd9f1027ff30d90618914a64ca9b1a77a431159df0e2a195d8a9e8a04c78abf9"}, + {file = "scipy-1.10.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:79c8e5a6c6ffaf3a2262ef1be1e108a035cf4f05c14df56057b64acc5bebffb6"}, + {file = "scipy-1.10.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51af417a000d2dbe1ec6c372dfe688e041a7084da4fdd350aeb139bd3fb55353"}, + {file = "scipy-1.10.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b4735d6c28aad3cdcf52117e0e91d6b39acd4272f3f5cd9907c24ee931ad601"}, + {file = "scipy-1.10.1-cp39-cp39-win_amd64.whl", hash = "sha256:7ff7f37b1bf4417baca958d254e8e2875d0cc23aaadbe65b3d5b3077b0eb23ea"}, + {file = "scipy-1.10.1.tar.gz", hash = "sha256:2cf9dfb80a7b4589ba4c40ce7588986d6d5cebc5457cad2c2880f6bc2d42f3a5"}, ] [package.dependencies] -numpy = ">=1.13.3" +numpy = ">=1.19.5,<1.27.0" + +[package.extras] +dev = ["click", "doit (>=0.36.0)", "flake8", "mypy", "pycodestyle", "pydevtool", "rich-click", "typing_extensions"] +doc = ["matplotlib (>2)", "numpydoc", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] +test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] [[package]] name = "setuptools" -version = "69.0.3" +version = "69.5.1" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-69.0.3-py3-none-any.whl", hash = "sha256:385eb4edd9c9d5c17540511303e39a147ce2fc04bc55289c322b9e5904fe2c05"}, - {file = "setuptools-69.0.3.tar.gz", hash = "sha256:be1af57fc409f93647f2e8e4573a142ed38724b8cdd389706a867bb4efcf1e78"}, + {file = "setuptools-69.5.1-py3-none-any.whl", hash = "sha256:c636ac361bc47580504644275c9ad802c50415c7522212252c033bd15f301f32"}, + {file = "setuptools-69.5.1.tar.gz", hash = "sha256:6c1fccdac05a97e598fb0ae3bbed5904ccb317337a51139dcd51453611bbb987"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mypy (==1.9)", "packaging (>=23.2)", "pip (>=19.1)", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] [[package]] name = "six" @@ -1860,6 +2405,31 @@ files = [ {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] +[[package]] +name = "smart-open" +version = "7.0.4" +description = "Utils for streaming large files (S3, HDFS, GCS, Azure Blob Storage, gzip, bz2...)" +optional = false +python-versions = "<4.0,>=3.7" +files = [ + {file = "smart_open-7.0.4-py3-none-any.whl", hash = "sha256:4e98489932b3372595cddc075e6033194775165702887216b65eba760dfd8d47"}, + {file = "smart_open-7.0.4.tar.gz", hash = "sha256:62b65852bdd1d1d516839fcb1f6bc50cd0f16e05b4ec44b52f43d38bcb838524"}, +] + +[package.dependencies] +wrapt = "*" + +[package.extras] +all = ["azure-common", "azure-core", "azure-storage-blob", "boto3", "google-cloud-storage (>=2.6.0)", "paramiko", "requests", "zstandard"] +azure = ["azure-common", "azure-core", "azure-storage-blob"] +gcs = ["google-cloud-storage (>=2.6.0)"] +http = ["requests"] +s3 = ["boto3"] +ssh = ["paramiko"] +test = ["azure-common", "azure-core", "azure-storage-blob", "boto3", "google-cloud-storage (>=2.6.0)", "moto[server]", "paramiko", "pytest", "pytest-rerunfailures", "requests", "responses", "zstandard"] +webhdfs = ["requests"] +zst = ["zstandard"] + [[package]] name = "stack-data" version = "0.6.3" @@ -1879,6 +2449,33 @@ pure-eval = "*" [package.extras] tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] +[[package]] +name = "stellargraph" +version = "1.2.1" +description = "Python library for machine learning on graphs" +optional = false +python-versions = ">=3.6.0, <3.9.0" +files = [ + {file = "stellargraph-1.2.1-py3-none-any.whl", hash = "sha256:984a839de4645c9703b8f34a065307498feef38e5160a8f9d7764318a3d4621d"}, + {file = "stellargraph-1.2.1.tar.gz", hash = "sha256:804200a7992465bb5f10da95a3b7748014b0a159f1e79a95517c12a9ff2faed2"}, +] + +[package.dependencies] +gensim = ">=3.4.0" +matplotlib = ">=2.2" +networkx = ">=2.2" +numpy = ">=1.14" +pandas = ">=0.24" +scikit-learn = ">=0.20" +scipy = ">=1.1.0" +tensorflow = ">=2.1.0" + +[package.extras] +demos = ["jupyter", "mplleaflet (==0.0.5)", "numba", "rdflib", "seaborn"] +igraph = ["python-igraph"] +neo4j = ["py2neo"] +test = ["black (>=19.3b0)", "commonmark (==0.9.1)", "coverage (>=4.4,<5.0)", "nbconvert (>=5.5.0)", "papermill (>=2.0.0)", "pytest (==5.3.1)", "pytest-benchmark (>=3.1)", "pytest-cov (>=2.6.0)", "rdflib", "treon (>=0.1.2)"] + [[package]] name = "sympy" version = "1.12" @@ -1895,87 +2492,110 @@ mpmath = ">=0.19" [[package]] name = "tensorboard" -version = "2.2.2" +version = "2.14.0" description = "TensorBoard lets you watch Tensors Flow" optional = false -python-versions = ">= 2.7, != 3.0.*, != 3.1.*" +python-versions = ">=3.8" files = [ - {file = "tensorboard-2.2.2-py3-none-any.whl", hash = "sha256:a3feb73e1221c0a512398ad2cd08570fb082d8a2ba364aa0562543ecbd3659ef"}, + {file = "tensorboard-2.14.0-py3-none-any.whl", hash = "sha256:3667f9745d99280836ad673022362c840f60ed8fefd5a3e30bf071f5a8fd0017"}, ] [package.dependencies] absl-py = ">=0.4" -google-auth = ">=1.6.3,<2" -google-auth-oauthlib = ">=0.4.1,<0.5" -grpcio = ">=1.24.3" +google-auth = ">=1.6.3,<3" +google-auth-oauthlib = ">=0.5,<1.1" +grpcio = ">=1.48.2" markdown = ">=2.6.8" numpy = ">=1.12.0" -protobuf = ">=3.6.0" +protobuf = ">=3.19.6" requests = ">=2.21.0,<3" setuptools = ">=41.0.0" -six = ">=1.10.0" -tensorboard-plugin-wit = ">=1.6.0" -werkzeug = ">=0.11.15" -wheel = {version = ">=0.26", markers = "python_version >= \"3\""} +tensorboard-data-server = ">=0.7.0,<0.8.0" +werkzeug = ">=1.0.1" +wheel = ">=0.26" [[package]] -name = "tensorboard-plugin-wit" -version = "1.8.1" -description = "What-If Tool TensorBoard plugin." +name = "tensorboard-data-server" +version = "0.7.2" +description = "Fast data loading for TensorBoard" optional = false -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "tensorboard_plugin_wit-1.8.1-py3-none-any.whl", hash = "sha256:ff26bdd583d155aa951ee3b152b3d0cffae8005dc697f72b44a8e8c2a77a8cbe"}, + {file = "tensorboard_data_server-0.7.2-py3-none-any.whl", hash = "sha256:7e0610d205889588983836ec05dc098e80f97b7e7bbff7e994ebb78f578d0ddb"}, + {file = "tensorboard_data_server-0.7.2-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:9fe5d24221b29625dbc7328b0436ca7fc1c23de4acf4d272f1180856e32f9f60"}, + {file = "tensorboard_data_server-0.7.2-py3-none-manylinux_2_31_x86_64.whl", hash = "sha256:ef687163c24185ae9754ed5650eb5bc4d84ff257aabdc33f0cc6f74d8ba54530"}, ] [[package]] name = "tensorflow" -version = "2.2.0" +version = "2.7.2" description = "TensorFlow is an open source machine learning framework for everyone." optional = false python-versions = "*" files = [ - {file = "tensorflow-2.2.0-cp35-cp35m-macosx_10_11_x86_64.whl", hash = "sha256:7ed67b47cdf6598a79583de5b57c595493eac2b8b6b3a828f912354716cb8149"}, - {file = "tensorflow-2.2.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:267017724a49c367ca5df536e5f6d3d59643eaed946c82233d6b371e62b5ddc8"}, - {file = "tensorflow-2.2.0-cp35-cp35m-win_amd64.whl", hash = "sha256:572f69d2d0a3d3d83ebfb2c24e6d73d88b85a09f5da796974ef4a0ad83ff7cde"}, - {file = "tensorflow-2.2.0-cp36-cp36m-macosx_10_11_x86_64.whl", hash = "sha256:6735486ee9c3cb0807476e2b36ef7a4cd6c597cb24abf496e66b703360e1e54e"}, - {file = "tensorflow-2.2.0-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:dc5548562308acde7931f040e73d46ae31b398924cf675c3486fd3504e00a4af"}, - {file = "tensorflow-2.2.0-cp36-cp36m-win_amd64.whl", hash = "sha256:3ee8819732d8594913b7d22ded7b22e48a49aa015050d8dd8464eaa010ba2e41"}, - {file = "tensorflow-2.2.0-cp37-cp37m-macosx_10_11_x86_64.whl", hash = "sha256:c332c7fc5cfd54cb86d5da99787c9693e3a924848097c54df1b71ee595a39c93"}, - {file = "tensorflow-2.2.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:f5f27528570fc0d7b90668be10c5dfd90d6ceb8fd2ed62d7d679554acb616bfe"}, - {file = "tensorflow-2.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:68ea22aee9c269a6a0c1061c141f1ec1cd1b1be7569390519c1bf4773f434a40"}, - {file = "tensorflow-2.2.0-cp38-cp38-macosx_10_11_x86_64.whl", hash = "sha256:bbcfb04738099bd46822db91584db74703fdddacf4cd0a76acfc5e086956b5ba"}, - {file = "tensorflow-2.2.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:8f364528f70d895b96a0de36c7c6002644bf4c5df1ee3fbfa775f5cee6571ad7"}, - {file = "tensorflow-2.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:784ab8217e4b0eb4d121c28430c6cdc2ce56c02634a9720d84fb30598b338b8c"}, + {file = "tensorflow-2.7.2-cp37-cp37m-macosx_10_11_x86_64.whl", hash = "sha256:050c2ef8d432eb60f2cb6fc75d751fcb3008af6a86ad1147faea30cb59c275b1"}, + {file = "tensorflow-2.7.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:3c72b8653a539789ef36f8c1ad8266b9e676dff2293f0f7a68d9b26fc77a37f3"}, + {file = "tensorflow-2.7.2-cp37-cp37m-win_amd64.whl", hash = "sha256:1db663f9f59ba54a294b1f6530f131e90c7a0e6ea49fda5b2c6900e57b0c306a"}, + {file = "tensorflow-2.7.2-cp38-cp38-macosx_10_11_x86_64.whl", hash = "sha256:cb66d4a998af1ca979d6da33e925281596f52e5a9ba67b2295c53677f8379eee"}, + {file = "tensorflow-2.7.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d4dbfab1568564b30bab876424fafd74c8a8715238b76284b5dd1cfe86c7881b"}, + {file = "tensorflow-2.7.2-cp38-cp38-win_amd64.whl", hash = "sha256:b9a7f344b93b953cab4c3f6ec3b6c1799eb538b6a1978d3a4b579d7a81ee7439"}, + {file = "tensorflow-2.7.2-cp39-cp39-macosx_10_11_x86_64.whl", hash = "sha256:99a85258505130b1f3ce203f11b3bb3c95442edefec96c0b221ce0d6541a92c8"}, + {file = "tensorflow-2.7.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:bb2115796e2e7738de1844aead493bc1f1122ff1fae65fc691bb1ce5a0fdd2aa"}, + {file = "tensorflow-2.7.2-cp39-cp39-win_amd64.whl", hash = "sha256:3e35d046d0be677239b5e832854bcb291ca79388fa406d9d7547bc3377a7efbb"}, ] [package.dependencies] -absl-py = ">=0.7.0" -astunparse = "1.6.3" -gast = "0.3.3" -google-pasta = ">=0.1.8" -grpcio = ">=1.8.6" -h5py = ">=2.10.0,<2.11.0" -keras-preprocessing = ">=1.1.0" -numpy = ">=1.16.0,<2.0" +absl-py = ">=0.4.0" +astunparse = ">=1.6.0" +flatbuffers = ">=1.12,<3.0" +gast = ">=0.2.1,<0.5.0" +google-pasta = ">=0.1.1" +grpcio = ">=1.24.3,<2.0" +h5py = ">=2.9.0" +keras = ">=2.7.0rc0,<2.8" +keras-preprocessing = ">=1.1.1" +libclang = ">=9.0.1" +numpy = ">=1.14.5" opt-einsum = ">=2.3.2" -protobuf = ">=3.8.0" -scipy = {version = "1.4.1", markers = "python_version >= \"3\""} +protobuf = ">=3.9.2" six = ">=1.12.0" -tensorboard = ">=2.2.0,<2.3.0" -tensorflow-estimator = ">=2.2.0,<2.3.0" +tensorboard = ">=2.6,<3.0" +tensorflow-estimator = ">=2.7.0rc0,<2.8" +tensorflow-io-gcs-filesystem = ">=0.21.0" termcolor = ">=1.1.0" -wheel = {version = ">=0.26", markers = "python_version >= \"3\""} -wrapt = ">=1.11.1" +typing-extensions = ">=3.6.6" +wheel = ">=0.32.0,<1.0" +wrapt = ">=1.11.0" [[package]] name = "tensorflow-estimator" -version = "2.2.0" +version = "2.7.0" description = "TensorFlow Estimator." optional = false python-versions = "*" files = [ - {file = "tensorflow_estimator-2.2.0-py2.py3-none-any.whl", hash = "sha256:d09dacdd127f2579cea8d5af21f4a918036b8ae246adc82f26b61f91cc247dc2"}, + {file = "tensorflow_estimator-2.7.0-py2.py3-none-any.whl", hash = "sha256:325b5a224864379242b7b76c6987ca544239be82579d33e68ec7c2bda57abc9d"}, +] + +[[package]] +name = "tensorflow-io-gcs-filesystem" +version = "0.21.0" +description = "TensorFlow IO" +optional = false +python-versions = ">=3.6, <3.10" +files = [ + {file = "tensorflow_io_gcs_filesystem-0.21.0-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:db8659cce2b45a6689cf041c7745b60338d8158fc394627f916029980aa04e0d"}, + {file = "tensorflow_io_gcs_filesystem-0.21.0-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d5ce0de3c91fb3a47bd91e25081bcd3b3491d515ee45e6d2c63e899ab5e7739e"}, + {file = "tensorflow_io_gcs_filesystem-0.21.0-cp36-cp36m-win_amd64.whl", hash = "sha256:8fc48d4a6f06a97b8a866d849844189ecd1d830de9b152276ea579d9772c0533"}, + {file = "tensorflow_io_gcs_filesystem-0.21.0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:c28ca0dd37d1bb2110a62e9e7f7b0bbdf295add83b38fbe507082fd89f0ebc61"}, + {file = "tensorflow_io_gcs_filesystem-0.21.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7c54f1f334076a5514b9f7f537afe4c36fce4233f792ce6ada76651bfad9f2eb"}, + {file = "tensorflow_io_gcs_filesystem-0.21.0-cp37-cp37m-win_amd64.whl", hash = "sha256:e22fcc4e6e924842fefc570f7fd0f6fd33e458154be8891b5a7bfd8380c6aa8c"}, + {file = "tensorflow_io_gcs_filesystem-0.21.0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:95555c647c8330daf712a38d2b158f7a21d5ad77e8fd438360060b37cb8ca1fb"}, + {file = "tensorflow_io_gcs_filesystem-0.21.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b12f9d66c8433bb4a67d9cc6cdb14cf11c42d9fe65bdbe09128b6579a80f80e8"}, + {file = "tensorflow_io_gcs_filesystem-0.21.0-cp38-cp38-win_amd64.whl", hash = "sha256:e447d9c03dd7396292ba10dd39a3c6a2cfcb9332b67457592119c5e5d3e38cfe"}, + {file = "tensorflow_io_gcs_filesystem-0.21.0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:020581f962e7156054c790d649ecc80518d7874e0def5b2f58f965a1998d45e3"}, + {file = "tensorflow_io_gcs_filesystem-0.21.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:603f73d61670954833b6ed87199a4a919e2a5dc015f34b20fdd235a611f37e81"}, + {file = "tensorflow_io_gcs_filesystem-0.21.0-cp39-cp39-win_amd64.whl", hash = "sha256:8c95c0ef2de4611a528ef210c233481dd7628c57ff3ef7f08c0f9708125d3ff8"}, ] [[package]] @@ -1992,6 +2612,17 @@ files = [ [package.extras] tests = ["pytest", "pytest-cov"] +[[package]] +name = "threadpoolctl" +version = "3.4.0" +description = "threadpoolctl" +optional = false +python-versions = ">=3.8" +files = [ + {file = "threadpoolctl-3.4.0-py3-none-any.whl", hash = "sha256:8f4c689a65b23e5ed825c8436a92b818aac005e0f3715f6a1664d7c7ee29d262"}, + {file = "threadpoolctl-3.4.0.tar.gz", hash = "sha256:f11b491a03661d6dd7ef692dd422ab34185d982466c49c8f98c8f716b5c93196"}, +] + [[package]] name = "torch" version = "2.1.2" @@ -2045,15 +2676,46 @@ typing-extensions = "*" dynamo = ["jinja2"] opt-einsum = ["opt-einsum (>=3.3)"] +[[package]] +name = "torch-geometric" +version = "2.5.2" +description = "Graph Neural Network Library for PyTorch" +optional = false +python-versions = ">=3.8" +files = [ + {file = "torch_geometric-2.5.2-py3-none-any.whl", hash = "sha256:4d0ee1d4f22ef6008dac4eaae38a7a7c3cd5956837280312c1e99f39340d21ba"}, + {file = "torch_geometric-2.5.2.tar.gz", hash = "sha256:92059e98cf0334f264606c013df838d4411f461c3871e6b64723b5c40f6dec59"}, +] + +[package.dependencies] +aiohttp = "*" +fsspec = "*" +jinja2 = "*" +numpy = "*" +psutil = ">=5.8.0" +pyparsing = "*" +requests = "*" +scikit-learn = "*" +scipy = "*" +tqdm = "*" + +[package.extras] +benchmark = ["matplotlib", "networkx", "pandas", "protobuf (<4.21)", "wandb"] +dev = ["pre-commit", "torch_geometric[test]"] +full = ["ase", "captum (<0.7.0)", "graphviz", "h5py", "matplotlib", "networkx", "numba", "opt_einsum", "pandas", "pgmpy", "pynndescent", "pytorch-memlab", "rdflib", "rdkit", "scikit-image", "statsmodels", "sympy", "tabulate", "torch_geometric[graphgym,modelhub]", "torchmetrics", "trimesh"] +graphgym = ["hydra-core", "protobuf (<4.21)", "pytorch-lightning", "yacs"] +modelhub = ["huggingface_hub"] +test = ["onnx", "onnxruntime", "pytest", "pytest-cov"] + [[package]] name = "torchmetrics" -version = "1.3.0.post0" +version = "1.3.2" description = "PyTorch native Metrics" optional = false python-versions = ">=3.8" files = [ - {file = "torchmetrics-1.3.0.post0-py3-none-any.whl", hash = "sha256:9e691ff8e8b752ad191c896f98e4a6dea81fe91dda5b6916e5b7aeaed4c7e1ad"}, - {file = "torchmetrics-1.3.0.post0.tar.gz", hash = "sha256:6d31aeabee964ff539425800164790b8670293f2fade9fcfee6fabbe3f45dd7e"}, + {file = "torchmetrics-1.3.2-py3-none-any.whl", hash = "sha256:44ca3a9f86dc050cb3f554836ef291698ea797778457195b4f685fce8e2e64a3"}, + {file = "torchmetrics-1.3.2.tar.gz", hash = "sha256:0a67694a4c4265eeb54cda741eaf5cb1f3a71da74b7e7e6215ad156c9f2379f6"}, ] [package.dependencies] @@ -2064,14 +2726,14 @@ torch = ">=1.10.0" typing-extensions = {version = "*", markers = "python_version < \"3.9\""} [package.extras] -all = ["SciencePlots (>=2.0.0)", "ipadic (>=1.0.0)", "matplotlib (>=3.3.0)", "mecab-ko (>=1.0.0)", "mecab-ko-dic (>=1.0.0)", "mecab-python3 (>=1.0.6)", "mypy (==1.8.0)", "nltk (>=3.6)", "piq (<=0.8.0)", "pycocotools (>2.0.0)", "pystoi (>=0.3.0)", "regex (>=2021.9.24)", "scipy (>1.0.0)", "sentencepiece (>=0.1.98)", "torch (==2.1.2)", "torch-fidelity (<=0.4.0)", "torchaudio (>=0.10.0)", "torchvision (>=0.8)", "tqdm (>=4.41.0)", "transformers (>4.4.0)", "transformers (>=4.10.0)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"] +all = ["SciencePlots (>=2.0.0)", "ipadic (>=1.0.0)", "matplotlib (>=3.3.0)", "mecab-ko (>=1.0.0)", "mecab-ko-dic (>=1.0.0)", "mecab-python3 (>=1.0.6)", "mypy (==1.8.0)", "nltk (>=3.6)", "piq (<=0.8.0)", "pycocotools (>2.0.0)", "pystoi (>=0.3.0)", "regex (>=2021.9.24)", "scipy (>1.0.0)", "sentencepiece (>=0.2.0)", "torch (==2.2.1)", "torch-fidelity (<=0.4.0)", "torchaudio (>=0.10.0)", "torchvision (>=0.8)", "tqdm (>=4.41.0)", "transformers (>4.4.0)", "transformers (>=4.10.0)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"] audio = ["pystoi (>=0.3.0)", "torchaudio (>=0.10.0)"] detection = ["pycocotools (>2.0.0)", "torchvision (>=0.8)"] -dev = ["SciencePlots (>=2.0.0)", "bert-score (==0.3.13)", "dython (<=0.7.4)", "fairlearn", "fast-bss-eval (>=0.1.0)", "faster-coco-eval (>=1.3.3)", "huggingface-hub (<0.21)", "ipadic (>=1.0.0)", "jiwer (>=2.3.0)", "kornia (>=0.6.7)", "lpips (<=0.1.4)", "matplotlib (>=3.3.0)", "mecab-ko (>=1.0.0)", "mecab-ko-dic (>=1.0.0)", "mecab-python3 (>=1.0.6)", "mir-eval (>=0.6)", "monai (==1.3.0)", "mypy (==1.8.0)", "netcal (>1.0.0)", "nltk (>=3.6)", "numpy (<1.25.0)", "pandas (>1.0.0)", "pandas (>=1.4.0)", "piq (<=0.8.0)", "pycocotools (>2.0.0)", "pystoi (>=0.3.0)", "pytorch-msssim (==1.0.0)", "regex (>=2021.9.24)", "rouge-score (>0.1.0)", "sacrebleu (>=2.3.0)", "scikit-image (>=0.19.0)", "scipy (>1.0.0)", "sentencepiece (>=0.1.98)", "sewar (>=0.4.4)", "statsmodels (>0.13.5)", "torch (==2.1.2)", "torch-complex (<=0.4.3)", "torch-fidelity (<=0.4.0)", "torchaudio (>=0.10.0)", "torchvision (>=0.8)", "tqdm (>=4.41.0)", "transformers (>4.4.0)", "transformers (>=4.10.0)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"] +dev = ["SciencePlots (>=2.0.0)", "bert-score (==0.3.13)", "dython (<=0.7.5)", "fairlearn", "fast-bss-eval (>=0.1.0)", "faster-coco-eval (>=1.3.3)", "huggingface-hub (<0.22)", "ipadic (>=1.0.0)", "jiwer (>=2.3.0)", "kornia (>=0.6.7)", "lpips (<=0.1.4)", "matplotlib (>=3.3.0)", "mecab-ko (>=1.0.0)", "mecab-ko-dic (>=1.0.0)", "mecab-python3 (>=1.0.6)", "mir-eval (>=0.6)", "monai (==1.3.0)", "mypy (==1.8.0)", "netcal (>1.0.0)", "nltk (>=3.6)", "numpy (<1.25.0)", "pandas (>1.0.0)", "pandas (>=1.4.0)", "piq (<=0.8.0)", "pycocotools (>2.0.0)", "pystoi (>=0.3.0)", "pytorch-msssim (==1.0.0)", "regex (>=2021.9.24)", "rouge-score (>0.1.0)", "sacrebleu (>=2.3.0)", "scikit-image (>=0.19.0)", "scipy (>1.0.0)", "sentencepiece (>=0.2.0)", "sewar (>=0.4.4)", "statsmodels (>0.13.5)", "torch (==2.2.1)", "torch-complex (<=0.4.3)", "torch-fidelity (<=0.4.0)", "torchaudio (>=0.10.0)", "torchvision (>=0.8)", "tqdm (>=4.41.0)", "transformers (>4.4.0)", "transformers (>=4.10.0)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"] image = ["scipy (>1.0.0)", "torch-fidelity (<=0.4.0)", "torchvision (>=0.8)"] multimodal = ["piq (<=0.8.0)", "transformers (>=4.10.0)"] -text = ["ipadic (>=1.0.0)", "mecab-ko (>=1.0.0)", "mecab-ko-dic (>=1.0.0)", "mecab-python3 (>=1.0.6)", "nltk (>=3.6)", "regex (>=2021.9.24)", "sentencepiece (>=0.1.98)", "tqdm (>=4.41.0)", "transformers (>4.4.0)"] -typing = ["mypy (==1.8.0)", "torch (==2.1.2)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"] +text = ["ipadic (>=1.0.0)", "mecab-ko (>=1.0.0)", "mecab-ko-dic (>=1.0.0)", "mecab-python3 (>=1.0.6)", "nltk (>=3.6)", "regex (>=2021.9.24)", "sentencepiece (>=0.2.0)", "tqdm (>=4.41.0)", "transformers (>4.4.0)"] +typing = ["mypy (==1.8.0)", "torch (==2.2.1)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"] visual = ["SciencePlots (>=2.0.0)", "matplotlib (>=3.3.0)"] [[package]] @@ -2132,20 +2794,40 @@ files = [ {file = "tornado-6.4.tar.gz", hash = "sha256:72291fa6e6bc84e626589f1c29d90a5a6d593ef5ae68052ee2ef000dfd273dee"}, ] +[[package]] +name = "tqdm" +version = "4.66.2" +description = "Fast, Extensible Progress Meter" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tqdm-4.66.2-py3-none-any.whl", hash = "sha256:1ee4f8a893eb9bef51c6e35730cebf234d5d0b6bd112b0271e10ed7c24a02bd9"}, + {file = "tqdm-4.66.2.tar.gz", hash = "sha256:6cd52cdf0fef0e0f543299cfc96fec90d7b8a7e88745f411ec33eb44d5ed3531"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] +notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] +telegram = ["requests"] + [[package]] name = "traitlets" -version = "5.14.1" +version = "5.14.2" description = "Traitlets Python configuration system" optional = false python-versions = ">=3.8" files = [ - {file = "traitlets-5.14.1-py3-none-any.whl", hash = "sha256:2e5a030e6eff91737c643231bfcf04a65b0132078dad75e4936700b213652e74"}, - {file = "traitlets-5.14.1.tar.gz", hash = "sha256:8585105b371a04b8316a43d5ce29c098575c2e477850b62b848b964f1444527e"}, + {file = "traitlets-5.14.2-py3-none-any.whl", hash = "sha256:fcdf85684a772ddeba87db2f398ce00b40ff550d1528c03c14dbf6a02003cd80"}, + {file = "traitlets-5.14.2.tar.gz", hash = "sha256:8cdd83c040dab7d1dee822678e5f5d100b514f7b72b01615b26fc5718916fdf9"}, ] [package.extras] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] -test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<7.5)", "pytest-mock", "pytest-mypy-testing"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.1)", "pytest-mock", "pytest-mypy-testing"] [[package]] name = "triton" @@ -2174,24 +2856,35 @@ tutorials = ["matplotlib", "pandas", "tabulate"] [[package]] name = "typing-extensions" -version = "4.9.0" +version = "4.11.0" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.9.0-py3-none-any.whl", hash = "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd"}, - {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"}, + {file = "typing_extensions-4.11.0-py3-none-any.whl", hash = "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a"}, + {file = "typing_extensions-4.11.0.tar.gz", hash = "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0"}, +] + +[[package]] +name = "tzdata" +version = "2024.1" +description = "Provider of IANA time zone data" +optional = false +python-versions = ">=2" +files = [ + {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, + {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, ] [[package]] name = "urllib3" -version = "2.2.0" +version = "2.2.1" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ - {file = "urllib3-2.2.0-py3-none-any.whl", hash = "sha256:ce3711610ddce217e6d113a2732fafad960a03fd0318c91faa79481e35c11224"}, - {file = "urllib3-2.2.0.tar.gz", hash = "sha256:051d961ad0c62a94e50ecf1af379c3aba230c66c710493493560c0c223c49f20"}, + {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, + {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, ] [package.extras] @@ -2213,13 +2906,13 @@ files = [ [[package]] name = "werkzeug" -version = "3.0.1" +version = "3.0.2" description = "The comprehensive WSGI web application library." optional = false python-versions = ">=3.8" files = [ - {file = "werkzeug-3.0.1-py3-none-any.whl", hash = "sha256:90a285dc0e42ad56b34e696398b8122ee4c681833fb35b8334a095d82c56da10"}, - {file = "werkzeug-3.0.1.tar.gz", hash = "sha256:507e811ecea72b18a404947aded4b3390e1db8f826b494d76550ef45bb3b1dcc"}, + {file = "werkzeug-3.0.2-py3-none-any.whl", hash = "sha256:3aac3f5da756f93030740bc235d3e09449efcf65f2f55e3602e1d851b8f48795"}, + {file = "werkzeug-3.0.2.tar.gz", hash = "sha256:e39b645a6ac92822588e7b39a692e7828724ceae0b0d702ef96701f90e70128d"}, ] [package.dependencies] @@ -2230,13 +2923,13 @@ watchdog = ["watchdog (>=2.3)"] [[package]] name = "wheel" -version = "0.42.0" +version = "0.43.0" description = "A built-package format for Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "wheel-0.42.0-py3-none-any.whl", hash = "sha256:177f9c9b0d45c47873b619f5b650346d632cdc35fb5e4d25058e09c9e581433d"}, - {file = "wheel-0.42.0.tar.gz", hash = "sha256:c45be39f7882c9d34243236f2d63cbd58039e360f85d0913425fbd7ceea617a8"}, + {file = "wheel-0.43.0-py3-none-any.whl", hash = "sha256:55c570405f142630c6b9f72fe09d9b67cf1477fcf543ae5b8dcb1f5b7377da81"}, + {file = "wheel-0.43.0.tar.gz", hash = "sha256:465ef92c69fa5c5da2d1cf8ac40559a8c940886afcef87dcf14b9470862f1d85"}, ] [package.extras] @@ -2321,22 +3014,125 @@ files = [ {file = "wrapt-1.16.0.tar.gz", hash = "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d"}, ] +[[package]] +name = "yarl" +version = "1.9.4" +description = "Yet another URL library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a8c1df72eb746f4136fe9a2e72b0c9dc1da1cbd23b5372f94b5820ff8ae30e0e"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a3a6ed1d525bfb91b3fc9b690c5a21bb52de28c018530ad85093cc488bee2dd2"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c38c9ddb6103ceae4e4498f9c08fac9b590c5c71b0370f98714768e22ac6fa66"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9e09c9d74f4566e905a0b8fa668c58109f7624db96a2171f21747abc7524234"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8477c1ee4bd47c57d49621a062121c3023609f7a13b8a46953eb6c9716ca392"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5ff2c858f5f6a42c2a8e751100f237c5e869cbde669a724f2062d4c4ef93551"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:357495293086c5b6d34ca9616a43d329317feab7917518bc97a08f9e55648455"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54525ae423d7b7a8ee81ba189f131054defdb122cde31ff17477951464c1691c"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:801e9264d19643548651b9db361ce3287176671fb0117f96b5ac0ee1c3530d53"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e516dc8baf7b380e6c1c26792610230f37147bb754d6426462ab115a02944385"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:7d5aaac37d19b2904bb9dfe12cdb08c8443e7ba7d2852894ad448d4b8f442863"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:54beabb809ffcacbd9d28ac57b0db46e42a6e341a030293fb3185c409e626b8b"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bac8d525a8dbc2a1507ec731d2867025d11ceadcb4dd421423a5d42c56818541"}, + {file = "yarl-1.9.4-cp310-cp310-win32.whl", hash = "sha256:7855426dfbddac81896b6e533ebefc0af2f132d4a47340cee6d22cac7190022d"}, + {file = "yarl-1.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:848cd2a1df56ddbffeb375535fb62c9d1645dde33ca4d51341378b3f5954429b"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:35a2b9396879ce32754bd457d31a51ff0a9d426fd9e0e3c33394bf4b9036b099"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c7d56b293cc071e82532f70adcbd8b61909eec973ae9d2d1f9b233f3d943f2c"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8a1c6c0be645c745a081c192e747c5de06e944a0d21245f4cf7c05e457c36e0"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b3c1ffe10069f655ea2d731808e76e0f452fc6c749bea04781daf18e6039525"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:549d19c84c55d11687ddbd47eeb348a89df9cb30e1993f1b128f4685cd0ebbf8"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7409f968456111140c1c95301cadf071bd30a81cbd7ab829169fb9e3d72eae9"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e23a6d84d9d1738dbc6e38167776107e63307dfc8ad108e580548d1f2c587f42"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8b889777de69897406c9fb0b76cdf2fd0f31267861ae7501d93003d55f54fbe"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:03caa9507d3d3c83bca08650678e25364e1843b484f19986a527630ca376ecce"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e9035df8d0880b2f1c7f5031f33f69e071dfe72ee9310cfc76f7b605958ceb9"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:c0ec0ed476f77db9fb29bca17f0a8fcc7bc97ad4c6c1d8959c507decb22e8572"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:ee04010f26d5102399bd17f8df8bc38dc7ccd7701dc77f4a68c5b8d733406958"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49a180c2e0743d5d6e0b4d1a9e5f633c62eca3f8a86ba5dd3c471060e352ca98"}, + {file = "yarl-1.9.4-cp311-cp311-win32.whl", hash = "sha256:81eb57278deb6098a5b62e88ad8281b2ba09f2f1147c4767522353eaa6260b31"}, + {file = "yarl-1.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:d1d2532b340b692880261c15aee4dc94dd22ca5d61b9db9a8a361953d36410b1"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0d2454f0aef65ea81037759be5ca9947539667eecebca092733b2eb43c965a81"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:44d8ffbb9c06e5a7f529f38f53eda23e50d1ed33c6c869e01481d3fafa6b8142"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:aaaea1e536f98754a6e5c56091baa1b6ce2f2700cc4a00b0d49eca8dea471074"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3777ce5536d17989c91696db1d459574e9a9bd37660ea7ee4d3344579bb6f129"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fc5fc1eeb029757349ad26bbc5880557389a03fa6ada41703db5e068881e5f2"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea65804b5dc88dacd4a40279af0cdadcfe74b3e5b4c897aa0d81cf86927fee78"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa102d6d280a5455ad6a0f9e6d769989638718e938a6a0a2ff3f4a7ff8c62cc4"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09efe4615ada057ba2d30df871d2f668af661e971dfeedf0c159927d48bbeff0"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:008d3e808d03ef28542372d01057fd09168419cdc8f848efe2804f894ae03e51"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6f5cb257bc2ec58f437da2b37a8cd48f666db96d47b8a3115c29f316313654ff"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:992f18e0ea248ee03b5a6e8b3b4738850ae7dbb172cc41c966462801cbf62cf7"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0e9d124c191d5b881060a9e5060627694c3bdd1fe24c5eecc8d5d7d0eb6faabc"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3986b6f41ad22988e53d5778f91855dc0399b043fc8946d4f2e68af22ee9ff10"}, + {file = "yarl-1.9.4-cp312-cp312-win32.whl", hash = "sha256:4b21516d181cd77ebd06ce160ef8cc2a5e9ad35fb1c5930882baff5ac865eee7"}, + {file = "yarl-1.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:a9bd00dc3bc395a662900f33f74feb3e757429e545d831eef5bb280252631984"}, + {file = "yarl-1.9.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:63b20738b5aac74e239622d2fe30df4fca4942a86e31bf47a81a0e94c14df94f"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d7f7de27b8944f1fee2c26a88b4dabc2409d2fea7a9ed3df79b67277644e17"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c74018551e31269d56fab81a728f683667e7c28c04e807ba08f8c9e3bba32f14"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ca06675212f94e7a610e85ca36948bb8fc023e458dd6c63ef71abfd482481aa5"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5aef935237d60a51a62b86249839b51345f47564208c6ee615ed2a40878dccdd"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b134fd795e2322b7684155b7855cc99409d10b2e408056db2b93b51a52accc7"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d25039a474c4c72a5ad4b52495056f843a7ff07b632c1b92ea9043a3d9950f6e"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f7d6b36dd2e029b6bcb8a13cf19664c7b8e19ab3a58e0fefbb5b8461447ed5ec"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:957b4774373cf6f709359e5c8c4a0af9f6d7875db657adb0feaf8d6cb3c3964c"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d7eeb6d22331e2fd42fce928a81c697c9ee2d51400bd1a28803965883e13cead"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6a962e04b8f91f8c4e5917e518d17958e3bdee71fd1d8b88cdce74dd0ebbf434"}, + {file = "yarl-1.9.4-cp37-cp37m-win32.whl", hash = "sha256:f3bc6af6e2b8f92eced34ef6a96ffb248e863af20ef4fde9448cc8c9b858b749"}, + {file = "yarl-1.9.4-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4d7a90a92e528aadf4965d685c17dacff3df282db1121136c382dc0b6014d2"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ec61d826d80fc293ed46c9dd26995921e3a82146feacd952ef0757236fc137be"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8be9e837ea9113676e5754b43b940b50cce76d9ed7d2461df1af39a8ee674d9f"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bef596fdaa8f26e3d66af846bbe77057237cb6e8efff8cd7cc8dff9a62278bbf"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d47552b6e52c3319fede1b60b3de120fe83bde9b7bddad11a69fb0af7db32f1"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84fc30f71689d7fc9168b92788abc977dc8cefa806909565fc2951d02f6b7d57"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4aa9741085f635934f3a2583e16fcf62ba835719a8b2b28fb2917bb0537c1dfa"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:206a55215e6d05dbc6c98ce598a59e6fbd0c493e2de4ea6cc2f4934d5a18d130"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07574b007ee20e5c375a8fe4a0789fad26db905f9813be0f9fef5a68080de559"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5a2e2433eb9344a163aced6a5f6c9222c0786e5a9e9cac2c89f0b28433f56e23"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6ad6d10ed9b67a382b45f29ea028f92d25bc0bc1daf6c5b801b90b5aa70fb9ec"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:6fe79f998a4052d79e1c30eeb7d6c1c1056ad33300f682465e1b4e9b5a188b78"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a825ec844298c791fd28ed14ed1bffc56a98d15b8c58a20e0e08c1f5f2bea1be"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8619d6915b3b0b34420cf9b2bb6d81ef59d984cb0fde7544e9ece32b4b3043c3"}, + {file = "yarl-1.9.4-cp38-cp38-win32.whl", hash = "sha256:686a0c2f85f83463272ddffd4deb5e591c98aac1897d65e92319f729c320eece"}, + {file = "yarl-1.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:a00862fb23195b6b8322f7d781b0dc1d82cb3bcac346d1e38689370cc1cc398b"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:604f31d97fa493083ea21bd9b92c419012531c4e17ea6da0f65cacdcf5d0bd27"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8a854227cf581330ffa2c4824d96e52ee621dd571078a252c25e3a3b3d94a1b1"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ba6f52cbc7809cd8d74604cce9c14868306ae4aa0282016b641c661f981a6e91"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6327976c7c2f4ee6816eff196e25385ccc02cb81427952414a64811037bbc8b"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8397a3817d7dcdd14bb266283cd1d6fc7264a48c186b986f32e86d86d35fbac5"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0381b4ce23ff92f8170080c97678040fc5b08da85e9e292292aba67fdac6c34"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23d32a2594cb5d565d358a92e151315d1b2268bc10f4610d098f96b147370136"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ddb2a5c08a4eaaba605340fdee8fc08e406c56617566d9643ad8bf6852778fc7"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:26a1dc6285e03f3cc9e839a2da83bcbf31dcb0d004c72d0730e755b33466c30e"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:18580f672e44ce1238b82f7fb87d727c4a131f3a9d33a5e0e82b793362bf18b4"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:29e0f83f37610f173eb7e7b5562dd71467993495e568e708d99e9d1944f561ec"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:1f23e4fe1e8794f74b6027d7cf19dc25f8b63af1483d91d595d4a07eca1fb26c"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db8e58b9d79200c76956cefd14d5c90af54416ff5353c5bfd7cbe58818e26ef0"}, + {file = "yarl-1.9.4-cp39-cp39-win32.whl", hash = "sha256:c7224cab95645c7ab53791022ae77a4509472613e839dab722a72abe5a684575"}, + {file = "yarl-1.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:824d6c50492add5da9374875ce72db7a0733b29c2394890aef23d533106e2b15"}, + {file = "yarl-1.9.4-py3-none-any.whl", hash = "sha256:928cecb0ef9d5a7946eb6ff58417ad2fe9375762382f1bf5c55e61645f2c43ad"}, + {file = "yarl-1.9.4.tar.gz", hash = "sha256:566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf"}, +] + +[package.dependencies] +idna = ">=2.0" +multidict = ">=4.0" + [[package]] name = "zipp" -version = "3.17.0" +version = "3.18.1" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.17.0-py3-none-any.whl", hash = "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31"}, - {file = "zipp-3.17.0.tar.gz", hash = "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0"}, + {file = "zipp-3.18.1-py3-none-any.whl", hash = "sha256:206f5a15f2af3dbaee80769fb7dc6f249695e940acca08dfb2a4769fe61e538b"}, + {file = "zipp-3.18.1.tar.gz", hash = "sha256:2884ed22e7d8961de1c9a05142eb69a247f120291bc0206a00a7642f09b5b715"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [metadata] lock-version = "2.0" python-versions = "~3.8" -content-hash = "f0c151b5a1b7828884f245737468ebf522dc513340e585a605b7810091fae1ff" +content-hash = "ed548fc5ae476b61f868ad0c5efda7ae3b90750adca800b546645d3b6a6e5d78" diff --git a/ChapterNN/pyproject.toml b/ChapterNN/pyproject.toml index 8302662..a501f62 100644 --- a/ChapterNN/pyproject.toml +++ b/ChapterNN/pyproject.toml @@ -12,8 +12,12 @@ py-modules = [] python = "~3.8" ipykernel = ">=6.0.0" matplotlib = "==3.2.2" -tensorflow = "<2.5.0" +tensorflow = "^2.6.0" +tensorflow-io-gcs-filesystem = "==0.21.0" # This needs pinning - see https://stackoverflow.com/a/76477590 +stellargraph= "^1.2.1" +protobuf= "^3.20" torch = "^2.1.0" +torch_geometric = "^2.5.2" torchvision = "^0.16.0" torchmetrics="^1.3.0" diff --git a/ChapterNN/requirements.txt b/ChapterNN/requirements.txt new file mode 100644 index 0000000..71bfd48 --- /dev/null +++ b/ChapterNN/requirements.txt @@ -0,0 +1,123 @@ +absl-py==2.1.0 ; python_version >= "3.8" and python_version < "3.9" +aiohttp==3.9.4 ; python_version >= "3.8" and python_version < "3.9" +aiosignal==1.3.1 ; python_version >= "3.8" and python_version < "3.9" +appnope==0.1.4 ; python_version >= "3.8" and python_version < "3.9" and (platform_system == "Darwin" or sys_platform == "darwin") +asttokens==2.4.1 ; python_version >= "3.8" and python_version < "3.9" +astunparse==1.6.3 ; python_version >= "3.8" and python_version < "3.9" +async-timeout==4.0.3 ; python_version >= "3.8" and python_version < "3.9" +attrs==23.2.0 ; python_version >= "3.8" and python_version < "3.9" +backcall==0.2.0 ; python_version >= "3.8" and python_version < "3.9" +cachetools==5.3.3 ; python_version >= "3.8" and python_version < "3.9" +certifi==2024.2.2 ; python_version >= "3.8" and python_version < "3.9" +cffi==1.16.0 ; python_version >= "3.8" and python_version < "3.9" and implementation_name == "pypy" +charset-normalizer==3.3.2 ; python_version >= "3.8" and python_version < "3.9" +colorama==0.4.6 ; python_version >= "3.8" and python_version < "3.9" and (sys_platform == "win32" or platform_system == "Windows") +comm==0.2.2 ; python_version >= "3.8" and python_version < "3.9" +cycler==0.12.1 ; python_version >= "3.8" and python_version < "3.9" +debugpy==1.8.1 ; python_version >= "3.8" and python_version < "3.9" +decorator==5.1.1 ; python_version >= "3.8" and python_version < "3.9" +executing==2.0.1 ; python_version >= "3.8" and python_version < "3.9" +filelock==3.13.4 ; python_version >= "3.8" and python_version < "3.9" +flatbuffers==2.0.7 ; python_version >= "3.8" and python_version < "3.9" +frozenlist==1.4.1 ; python_version >= "3.8" and python_version < "3.9" +fsspec==2024.3.1 ; python_version >= "3.8" and python_version < "3.9" +gast==0.4.0 ; python_version >= "3.8" and python_version < "3.9" +gensim==4.3.2 ; python_version >= "3.8" and python_version < "3.9" +google-auth-oauthlib==1.0.0 ; python_version >= "3.8" and python_version < "3.9" +google-auth==2.29.0 ; python_version >= "3.8" and python_version < "3.9" +google-pasta==0.2.0 ; python_version >= "3.8" and python_version < "3.9" +grpcio==1.62.1 ; python_version >= "3.8" and python_version < "3.9" +h5py==3.11.0 ; python_version >= "3.8" and python_version < "3.9" +idna==3.7 ; python_version >= "3.8" and python_version < "3.9" +importlib-metadata==7.1.0 ; python_version >= "3.8" and python_version < "3.9" +ipykernel==6.29.4 ; python_version >= "3.8" and python_version < "3.9" +ipython==8.12.3 ; python_version >= "3.8" and python_version < "3.9" +jedi==0.19.1 ; python_version >= "3.8" and python_version < "3.9" +jinja2==3.1.3 ; python_version >= "3.8" and python_version < "3.9" +joblib==1.4.0 ; python_version >= "3.8" and python_version < "3.9" +jupyter-client==8.6.1 ; python_version >= "3.8" and python_version < "3.9" +jupyter-core==5.7.2 ; python_version >= "3.8" and python_version < "3.9" +keras-preprocessing==1.1.2 ; python_version >= "3.8" and python_version < "3.9" +keras==2.7.0 ; python_version >= "3.8" and python_version < "3.9" +kiwisolver==1.4.5 ; python_version >= "3.8" and python_version < "3.9" +libclang==18.1.1 ; python_version >= "3.8" and python_version < "3.9" +lightning-utilities==0.11.2 ; python_version >= "3.8" and python_version < "3.9" +markdown==3.6 ; python_version >= "3.8" and python_version < "3.9" +markupsafe==2.1.5 ; python_version >= "3.8" and python_version < "3.9" +matplotlib-inline==0.1.6 ; python_version >= "3.8" and python_version < "3.9" +matplotlib==3.2.2 ; python_version >= "3.8" and python_version < "3.9" +mpmath==1.3.0 ; python_version >= "3.8" and python_version < "3.9" +multidict==6.0.5 ; python_version >= "3.8" and python_version < "3.9" +nest-asyncio==1.6.0 ; python_version >= "3.8" and python_version < "3.9" +networkx==3.1 ; python_version >= "3.8" and python_version < "3.9" +numpy==1.24.4 ; python_version >= "3.8" and python_version < "3.9" +nvidia-cublas-cu12==12.1.3.1 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.8" and python_version < "3.9" +nvidia-cuda-cupti-cu12==12.1.105 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.8" and python_version < "3.9" +nvidia-cuda-nvrtc-cu12==12.1.105 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.8" and python_version < "3.9" +nvidia-cuda-runtime-cu12==12.1.105 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.8" and python_version < "3.9" +nvidia-cudnn-cu12==8.9.2.26 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.8" and python_version < "3.9" +nvidia-cufft-cu12==11.0.2.54 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.8" and python_version < "3.9" +nvidia-curand-cu12==10.3.2.106 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.8" and python_version < "3.9" +nvidia-cusolver-cu12==11.4.5.107 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.8" and python_version < "3.9" +nvidia-cusparse-cu12==12.1.0.106 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.8" and python_version < "3.9" +nvidia-nccl-cu12==2.18.1 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.8" and python_version < "3.9" +nvidia-nvjitlink-cu12==12.4.127 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.8" and python_version < "3.9" +nvidia-nvtx-cu12==12.1.105 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.8" and python_version < "3.9" +oauthlib==3.2.2 ; python_version >= "3.8" and python_version < "3.9" +opt-einsum==3.3.0 ; python_version >= "3.8" and python_version < "3.9" +packaging==24.0 ; python_version >= "3.8" and python_version < "3.9" +pandas==2.0.3 ; python_version >= "3.8" and python_version < "3.9" +parso==0.8.4 ; python_version >= "3.8" and python_version < "3.9" +pexpect==4.9.0 ; python_version >= "3.8" and python_version < "3.9" and sys_platform != "win32" +pickleshare==0.7.5 ; python_version >= "3.8" and python_version < "3.9" +pillow==10.3.0 ; python_version >= "3.8" and python_version < "3.9" +platformdirs==4.2.0 ; python_version >= "3.8" and python_version < "3.9" +prompt-toolkit==3.0.43 ; python_version >= "3.8" and python_version < "3.9" +protobuf==3.20.3 ; python_version >= "3.8" and python_version < "3.9" +psutil==5.9.8 ; python_version >= "3.8" and python_version < "3.9" +ptyprocess==0.7.0 ; python_version >= "3.8" and python_version < "3.9" and sys_platform != "win32" +pure-eval==0.2.2 ; python_version >= "3.8" and python_version < "3.9" +pyasn1-modules==0.4.0 ; python_version >= "3.8" and python_version < "3.9" +pyasn1==0.6.0 ; python_version >= "3.8" and python_version < "3.9" +pycparser==2.22 ; python_version >= "3.8" and python_version < "3.9" and implementation_name == "pypy" +pygments==2.17.2 ; python_version >= "3.8" and python_version < "3.9" +pyparsing==3.1.2 ; python_version >= "3.8" and python_version < "3.9" +python-dateutil==2.9.0.post0 ; python_version >= "3.8" and python_version < "3.9" +pytz==2024.1 ; python_version >= "3.8" and python_version < "3.9" +pywin32==306 ; sys_platform == "win32" and platform_python_implementation != "PyPy" and python_version >= "3.8" and python_version < "3.9" +pyzmq==25.1.2 ; python_version >= "3.8" and python_version < "3.9" +requests-oauthlib==2.0.0 ; python_version >= "3.8" and python_version < "3.9" +requests==2.31.0 ; python_version >= "3.8" and python_version < "3.9" +rsa==4.9 ; python_version >= "3.8" and python_version < "3.9" +scikit-learn==1.3.2 ; python_version >= "3.8" and python_version < "3.9" +scipy==1.10.1 ; python_version >= "3.8" and python_version < "3.9" +setuptools==69.5.1 ; python_version >= "3.8" and python_version < "3.9" +six==1.16.0 ; python_version >= "3.8" and python_version < "3.9" +smart-open==7.0.4 ; python_version >= "3.8" and python_version < "3.9" +stack-data==0.6.3 ; python_version >= "3.8" and python_version < "3.9" +stellargraph==1.2.1 ; python_version >= "3.8" and python_version < "3.9" +sympy==1.12 ; python_version >= "3.8" and python_version < "3.9" +tensorboard-data-server==0.7.2 ; python_version >= "3.8" and python_version < "3.9" +tensorboard==2.14.0 ; python_version >= "3.8" and python_version < "3.9" +tensorflow-estimator==2.7.0 ; python_version >= "3.8" and python_version < "3.9" +tensorflow-io-gcs-filesystem==0.21.0 ; python_version >= "3.8" and python_version < "3.9" +tensorflow==2.7.2 ; python_version >= "3.8" and python_version < "3.9" +termcolor==2.4.0 ; python_version >= "3.8" and python_version < "3.9" +threadpoolctl==3.4.0 ; python_version >= "3.8" and python_version < "3.9" +torch-geometric==2.5.2 ; python_version >= "3.8" and python_version < "3.9" +torch==2.1.2 ; python_version >= "3.8" and python_version < "3.9" +torchmetrics==1.3.2 ; python_version >= "3.8" and python_version < "3.9" +torchvision==0.16.2 ; python_version >= "3.8" and python_version < "3.9" +tornado==6.4 ; python_version >= "3.8" and python_version < "3.9" +tqdm==4.66.2 ; python_version >= "3.8" and python_version < "3.9" +traitlets==5.14.2 ; python_version >= "3.8" and python_version < "3.9" +triton==2.1.0 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.8" and python_version < "3.9" +typing-extensions==4.11.0 ; python_version >= "3.8" and python_version < "3.9" +tzdata==2024.1 ; python_version >= "3.8" and python_version < "3.9" +urllib3==2.2.1 ; python_version >= "3.8" and python_version < "3.9" +wcwidth==0.2.13 ; python_version >= "3.8" and python_version < "3.9" +werkzeug==3.0.2 ; python_version >= "3.8" and python_version < "3.9" +wheel==0.43.0 ; python_version >= "3.8" and python_version < "3.9" +wrapt==1.16.0 ; python_version >= "3.8" and python_version < "3.9" +yarl==1.9.4 ; python_version >= "3.8" and python_version < "3.9" +zipp==3.18.1 ; python_version >= "3.8" and python_version < "3.9" From e221e130969ffdde9d0f9d96a43124a6612d7be0 Mon Sep 17 00:00:00 2001 From: Enrico Deusebio Date: Sun, 14 Apr 2024 22:09:34 +0000 Subject: [PATCH 4/9] cleaning outputs --- .../01_ImageClassification_TensorFlow.ipynb | 187 +---- ChapterNN/02_Autoencoders.ipynb | 756 ------------------ .../02_ImageClassification_Pytorch.ipynb | 186 +---- ChapterNN/03_Autoencoders.ipynb | 627 +++++++++++++++ .../04_GraphAutoEncoder_PyGeometric.ipynb | 80 +- .../05_GraphAutoEncoder_StellarGraph.ipynb | 278 +------ docker/Dockerfile | 6 + 7 files changed, 708 insertions(+), 1412 deletions(-) delete mode 100644 ChapterNN/02_Autoencoders.ipynb create mode 100644 ChapterNN/03_Autoencoders.ipynb diff --git a/ChapterNN/01_ImageClassification_TensorFlow.ipynb b/ChapterNN/01_ImageClassification_TensorFlow.ipynb index 7428163..eb02733 100644 --- a/ChapterNN/01_ImageClassification_TensorFlow.ipynb +++ b/ChapterNN/01_ImageClassification_TensorFlow.ipynb @@ -10,19 +10,10 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "012237ce-0396-4c88-8b13-994c7a830421", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2024-04-14 21:18:51.688181: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcudart.so.11.0'; dlerror: libcudart.so.11.0: cannot open shared object file: No such file or directory\n", - "2024-04-14 21:18:51.688228: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine.\n" - ] - } - ], + "outputs": [], "source": [ "import tensorflow as tf\n", "from tensorflow.keras.datasets import fashion_mnist\n", @@ -39,47 +30,20 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "1135c9e8-1765-48cc-beb8-25fd6ff363d4", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-labels-idx1-ubyte.gz\n", - "32768/29515 [=================================] - 0s 0us/step\n", - "40960/29515 [=========================================] - 0s 0us/step\n", - "Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-images-idx3-ubyte.gz\n", - "26427392/26421880 [==============================] - 2s 0us/step\n", - "26435584/26421880 [==============================] - 2s 0us/step\n", - "Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-labels-idx1-ubyte.gz\n", - "16384/5148 [===============================================================================================] - 0s 0us/step\n", - "Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-images-idx3-ubyte.gz\n", - "4423680/4422102 [==============================] - 0s 0us/step\n", - "4431872/4422102 [==============================] - 0s 0us/step\n" - ] - } - ], + "outputs": [], "source": [ "(x_train, y_train), (x_test, y_test) = fashion_mnist.load_data()" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "ee2989f4-9b32-48f6-b669-8255aa9e9c79", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(60000, 28, 28)\n", - "(10000, 28, 28)\n" - ] - } - ], + "outputs": [], "source": [ "x_train = x_train.astype('float32') / 255.\n", "x_test = x_test.astype('float32') / 255.\n", @@ -90,7 +54,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "0525097f-4b57-4e9c-b850-966540589a30", "metadata": {}, "outputs": [], @@ -111,21 +75,10 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "id": "a0e2bc95-ee33-4024-99d2-4ba7cb4fd0c6", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "n = 6\n", "plt.figure(figsize=(20, 4))\n", @@ -151,22 +104,10 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "id": "a2d549c8-a410-4caa-95a4-b0bb20a05236", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2024-04-14 21:19:12.541272: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcuda.so.1'; dlerror: libcuda.so.1: cannot open shared object file: No such file or directory\n", - "2024-04-14 21:19:12.541322: W tensorflow/stream_executor/cuda/cuda_driver.cc:269] failed call to cuInit: UNKNOWN ERROR (303)\n", - "2024-04-14 21:19:12.541343: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:156] kernel driver does not appear to be running on this host (ip-172-31-23-216): /proc/driver/nvidia/version does not exist\n", - "2024-04-14 21:19:12.541627: I tensorflow/core/platform/cpu_feature_guard.cc:151] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: AVX2 FMA\n", - "To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.\n" - ] - } - ], + "outputs": [], "source": [ "model = tf.keras.models.Sequential([\n", " tf.keras.layers.Flatten(input_shape=(28, 28)),\n", @@ -178,34 +119,10 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "id": "f20ef704-3435-4f12-b41b-db42fcfb3b43", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Model: \"sequential\"\n", - "_________________________________________________________________\n", - " Layer (type) Output Shape Param # \n", - "=================================================================\n", - " flatten (Flatten) (None, 784) 0 \n", - " \n", - " dense (Dense) (None, 128) 100480 \n", - " \n", - " dropout (Dropout) (None, 128) 0 \n", - " \n", - " dense_1 (Dense) (None, 10) 1290 \n", - " \n", - "=================================================================\n", - "Total params: 101,770\n", - "Trainable params: 101,770\n", - "Non-trainable params: 0\n", - "_________________________________________________________________\n" - ] - } - ], + "outputs": [], "source": [ "model.summary()" ] @@ -220,7 +137,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "id": "53f02c48-3d8f-4e41-a9d4-703016a0dc19", "metadata": {}, "outputs": [], @@ -231,7 +148,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "id": "6427e500-41d2-43f1-b235-622d1d59572e", "metadata": {}, "outputs": [], @@ -243,74 +160,10 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "id": "ef1fea96-97cc-4c84-bb0c-78417a571575", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2024-04-14 21:19:18.418708: W tensorflow/core/framework/cpu_allocator_impl.cc:82] Allocation of 188160000 exceeds 10% of free system memory.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Epoch 1/20\n", - "469/469 [==============================] - 3s 6ms/step - loss: 0.5974 - accuracy: 0.7922 - val_loss: 0.4619 - val_accuracy: 0.8354\n", - "Epoch 2/20\n", - "469/469 [==============================] - 2s 5ms/step - loss: 0.4256 - accuracy: 0.8503 - val_loss: 0.4079 - val_accuracy: 0.8564\n", - "Epoch 3/20\n", - "469/469 [==============================] - 2s 5ms/step - loss: 0.3831 - accuracy: 0.8622 - val_loss: 0.3949 - val_accuracy: 0.8589\n", - "Epoch 4/20\n", - "469/469 [==============================] - 2s 5ms/step - loss: 0.3565 - accuracy: 0.8713 - val_loss: 0.3679 - val_accuracy: 0.8675\n", - "Epoch 5/20\n", - "469/469 [==============================] - 2s 5ms/step - loss: 0.3373 - accuracy: 0.8787 - val_loss: 0.3533 - val_accuracy: 0.8756\n", - "Epoch 6/20\n", - "469/469 [==============================] - 2s 4ms/step - loss: 0.3264 - accuracy: 0.8824 - val_loss: 0.3471 - val_accuracy: 0.8755\n", - "Epoch 7/20\n", - "469/469 [==============================] - 2s 5ms/step - loss: 0.3156 - accuracy: 0.8847 - val_loss: 0.3462 - val_accuracy: 0.8742\n", - "Epoch 8/20\n", - "469/469 [==============================] - 2s 5ms/step - loss: 0.3039 - accuracy: 0.8881 - val_loss: 0.3418 - val_accuracy: 0.8776\n", - "Epoch 9/20\n", - "469/469 [==============================] - 2s 5ms/step - loss: 0.2975 - accuracy: 0.8904 - val_loss: 0.3437 - val_accuracy: 0.8766\n", - "Epoch 10/20\n", - "469/469 [==============================] - 2s 5ms/step - loss: 0.2886 - accuracy: 0.8944 - val_loss: 0.3321 - val_accuracy: 0.8852\n", - "Epoch 11/20\n", - "469/469 [==============================] - 2s 5ms/step - loss: 0.2840 - accuracy: 0.8958 - val_loss: 0.3373 - val_accuracy: 0.8789\n", - "Epoch 12/20\n", - "469/469 [==============================] - 2s 5ms/step - loss: 0.2762 - accuracy: 0.8975 - val_loss: 0.3413 - val_accuracy: 0.8749\n", - "Epoch 13/20\n", - "469/469 [==============================] - 2s 5ms/step - loss: 0.2675 - accuracy: 0.9010 - val_loss: 0.3305 - val_accuracy: 0.8822\n", - "Epoch 14/20\n", - "469/469 [==============================] - 2s 5ms/step - loss: 0.2658 - accuracy: 0.9014 - val_loss: 0.3257 - val_accuracy: 0.8829\n", - "Epoch 15/20\n", - "469/469 [==============================] - 2s 5ms/step - loss: 0.2603 - accuracy: 0.9029 - val_loss: 0.3337 - val_accuracy: 0.8818\n", - "Epoch 16/20\n", - "469/469 [==============================] - 2s 5ms/step - loss: 0.2556 - accuracy: 0.9053 - val_loss: 0.3338 - val_accuracy: 0.8798\n", - "Epoch 17/20\n", - "469/469 [==============================] - 2s 5ms/step - loss: 0.2493 - accuracy: 0.9075 - val_loss: 0.3251 - val_accuracy: 0.8866\n", - "Epoch 18/20\n", - "469/469 [==============================] - 2s 5ms/step - loss: 0.2471 - accuracy: 0.9086 - val_loss: 0.3231 - val_accuracy: 0.8870\n", - "Epoch 19/20\n", - "469/469 [==============================] - 2s 5ms/step - loss: 0.2415 - accuracy: 0.9089 - val_loss: 0.3322 - val_accuracy: 0.8834\n", - "Epoch 20/20\n", - "469/469 [==============================] - 3s 5ms/step - loss: 0.2397 - accuracy: 0.9107 - val_loss: 0.3198 - val_accuracy: 0.8876\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "model.fit(\n", " x_train, \n", @@ -362,9 +215,9 @@ ], "metadata": { "kernelspec": { - "display_name": "py3.8", + "display_name": "chap-nn", "language": "python", - "name": "py3.8" + "name": "chap-nn" }, "language_info": { "codemirror_mode": { @@ -376,7 +229,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.10" + "version": "3.8" } }, "nbformat": 4, diff --git a/ChapterNN/02_Autoencoders.ipynb b/ChapterNN/02_Autoencoders.ipynb deleted file mode 100644 index 2fa4827..0000000 --- a/ChapterNN/02_Autoencoders.ipynb +++ /dev/null @@ -1,756 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# AutoEncoder " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In the following we will show you how to create, train and use a simple autoencoder. We will then show you how to make an auto-encoder more robust against noise. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Load Dataset" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2024-04-14 21:34:38.095565: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcudart.so.11.0'; dlerror: libcudart.so.11.0: cannot open shared object file: No such file or directory\n", - "2024-04-14 21:34:38.095614: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine.\n" - ] - } - ], - "source": [ - "import tensorflow as tf" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "from tensorflow.keras.datasets import fashion_mnist" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "(x_train, y_train), (x_test, y_test) = fashion_mnist.load_data()" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(60000, 28, 28)\n", - "(10000, 28, 28)\n" - ] - } - ], - "source": [ - "x_train = x_train.astype('float32') / 255.\n", - "x_test = x_test.astype('float32') / 255.\n", - "\n", - "print (x_train.shape)\n", - "print (x_test.shape)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "from matplotlib import pyplot as plt" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "classes = {\n", - " 0:\"T-shirt/top\",\n", - " 1: \"Trouser\",\n", - " 2: \"Pullover\",\n", - " 3: \"Dress\",\n", - " 4: \"Coat\",\n", - " 5: \"Sandal\",\n", - " 6: \"Shirt\",\n", - " 7: \"Sneaker\",\n", - " 8: \"Bag\",\n", - " 9: \"Ankle boot\", \n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "n = 6\n", - "plt.figure(figsize=(20, 4))\n", - "for i in range(n):\n", - " # display original\n", - " ax = plt.subplot(1, n, i + 1)\n", - " plt.imshow(x_test[i])\n", - " plt.title(classes[y_test[i]])\n", - " plt.gray()\n", - " ax.get_xaxis().set_visible(False)\n", - " ax.get_yaxis().set_visible(False)\n", - "\n", - "plt.show()\n", - "# plt.savefig(\"TrainingSet.png\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Create Autoencoder" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "from tensorflow.keras.layers import Flatten, Conv2D, Dropout, MaxPooling2D, UpSampling2D, Input" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "from tensorflow.keras import Model" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2024-04-14 21:34:46.395498: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcuda.so.1'; dlerror: libcuda.so.1: cannot open shared object file: No such file or directory\n", - "2024-04-14 21:34:46.395547: W tensorflow/stream_executor/cuda/cuda_driver.cc:269] failed call to cuInit: UNKNOWN ERROR (303)\n", - "2024-04-14 21:34:46.395571: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:156] kernel driver does not appear to be running on this host (ip-172-31-23-216): /proc/driver/nvidia/version does not exist\n", - "2024-04-14 21:34:46.395866: I tensorflow/core/platform/cpu_feature_guard.cc:151] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: AVX2 FMA\n", - "To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.\n" - ] - } - ], - "source": [ - "input_img = Input(shape=(28, 28, 1))\n", - "\n", - "x = Conv2D(16, (3, 3), activation='relu', padding='same')(input_img)\n", - "x = MaxPooling2D((2, 2), padding='same')(x)\n", - "x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)\n", - "x = MaxPooling2D((2, 2), padding='same')(x)\n", - "x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)\n", - "encoded = MaxPooling2D((2, 2), padding='same')(x)\n", - "\n", - "# at this point the representation is (4, 4, 8) i.e. 128-dimensional\n", - "\n", - "x = Conv2D(8, (3, 3), activation='relu', padding='same')(encoded)\n", - "x = UpSampling2D((2, 2))(x)\n", - "x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)\n", - "x = UpSampling2D((2, 2))(x)\n", - "x = Conv2D(16, (3, 3), activation='relu')(x)\n", - "x = UpSampling2D((2, 2))(x)\n", - "decoded = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(x)\n", - "\n", - "autoencoder = Model(input_img, decoded)" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Model: \"model_1\"\n", - "_________________________________________________________________\n", - " Layer (type) Output Shape Param # \n", - "=================================================================\n", - " input_1 (InputLayer) [(None, 28, 28, 1)] 0 \n", - " \n", - " conv2d (Conv2D) (None, 28, 28, 16) 160 \n", - " \n", - " max_pooling2d (MaxPooling2D (None, 14, 14, 16) 0 \n", - " ) \n", - " \n", - " conv2d_1 (Conv2D) (None, 14, 14, 8) 1160 \n", - " \n", - " max_pooling2d_1 (MaxPooling (None, 7, 7, 8) 0 \n", - " 2D) \n", - " \n", - " conv2d_2 (Conv2D) (None, 7, 7, 8) 584 \n", - " \n", - " max_pooling2d_2 (MaxPooling (None, 4, 4, 8) 0 \n", - " 2D) \n", - " \n", - "=================================================================\n", - "Total params: 1,904\n", - "Trainable params: 1,904\n", - "Non-trainable params: 0\n", - "_________________________________________________________________\n" - ] - } - ], - "source": [ - "Model(input_img, encoded).summary()" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "autoencoder.compile(optimizer='adam', loss='binary_crossentropy')" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "from tensorflow.keras.callbacks import TensorBoard" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2024-04-14 21:34:48.444769: W tensorflow/core/framework/cpu_allocator_impl.cc:82] Allocation of 188160000 exceeds 10% of free system memory.\n", - "2024-04-14 21:34:48.607123: W tensorflow/core/framework/cpu_allocator_impl.cc:82] Allocation of 188160000 exceeds 10% of free system memory.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Epoch 1/50\n", - " 1/469 [..............................] - ETA: 9:54 - loss: 0.6938" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2024-04-14 21:34:50.031090: W tensorflow/core/framework/cpu_allocator_impl.cc:82] Allocation of 31610880 exceeds 10% of free system memory.\n", - "2024-04-14 21:34:50.031527: W tensorflow/core/framework/cpu_allocator_impl.cc:82] Allocation of 31610880 exceeds 10% of free system memory.\n", - "2024-04-14 21:34:50.088190: W tensorflow/core/framework/cpu_allocator_impl.cc:82] Allocation of 25454592 exceeds 10% of free system memory.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "469/469 [==============================] - 51s 105ms/step - loss: 0.3600 - val_loss: 0.3130\n", - "Epoch 2/50\n", - "469/469 [==============================] - 48s 103ms/step - loss: 0.3062 - val_loss: 0.3044\n", - "Epoch 3/50\n", - "469/469 [==============================] - 50s 106ms/step - loss: 0.3002 - val_loss: 0.3000\n", - "Epoch 4/50\n", - "469/469 [==============================] - 50s 106ms/step - loss: 0.2967 - val_loss: 0.2972\n", - "Epoch 5/50\n", - "469/469 [==============================] - 50s 106ms/step - loss: 0.2943 - val_loss: 0.2951\n", - "Epoch 6/50\n", - "469/469 [==============================] - 50s 106ms/step - loss: 0.2926 - val_loss: 0.2937\n", - "Epoch 7/50\n", - "469/469 [==============================] - 47s 101ms/step - loss: 0.2913 - val_loss: 0.2926\n", - "Epoch 8/50\n", - "469/469 [==============================] - 50s 107ms/step - loss: 0.2902 - val_loss: 0.2917\n", - "Epoch 9/50\n", - "469/469 [==============================] - 49s 104ms/step - loss: 0.2893 - val_loss: 0.2912\n", - "Epoch 10/50\n", - "469/469 [==============================] - 52s 111ms/step - loss: 0.2884 - val_loss: 0.2899\n", - "Epoch 11/50\n", - "469/469 [==============================] - 49s 105ms/step - loss: 0.2876 - val_loss: 0.2892\n", - "Epoch 12/50\n", - "370/469 [======================>.......] - ETA: 9s - loss: 0.2867" - ] - } - ], - "source": [ - "autoencoder.fit(x_train, x_train,\n", - " epochs=50,\n", - " batch_size=128,\n", - " shuffle=True,\n", - " validation_data=(x_test, x_test),\n", - " callbacks=[TensorBoard(log_dir='/tmp/autoencoder')])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "autoencoder.save(\"./data/Batch50.p\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from tensorflow.keras.models import load_model" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "autoencoder_first = load_model(\"./data/Batch50.p\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "decoded_imgs = autoencoder_first.predict(x_test)\n", - "\n", - "n = 6\n", - "plt.figure(figsize=(20, 7))\n", - "for i in range(1, n + 1):\n", - " # Display original\n", - " ax = plt.subplot(2, n, i)\n", - " plt.imshow(x_test[i].reshape(28, 28))\n", - " plt.gray()\n", - " ax.get_xaxis().set_visible(False)\n", - " ax.get_yaxis().set_visible(False)\n", - "\n", - " # Display reconstruction\n", - " ax = plt.subplot(2, n, i + n)\n", - " plt.imshow(decoded_imgs[i].reshape(28, 28))\n", - " plt.gray()\n", - " ax.get_xaxis().set_visible(False)\n", - " ax.get_yaxis().set_visible(False)\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from tensorflow.keras.optimizers import Adam" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "autoencoder.compile(optimizer=Adam(learning_rate=0.0005), loss='binary_crossentropy')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "autoencoder.fit(x_train, x_train,\n", - " epochs=50,\n", - " batch_size=128,\n", - " shuffle=True,\n", - " validation_data=(x_test, x_test),\n", - " callbacks=[TensorBoard(log_dir='/tmp/autoencoder')])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "autoencoder.save(\"./data/Batch100.p\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "decoded_imgs = autoencoder.predict(x_test)\n", - "\n", - "n = 10\n", - "plt.figure(figsize=(20, 4))\n", - "for i in range(1, n + 1):\n", - " # Display original\n", - " ax = plt.subplot(2, n, i)\n", - " plt.imshow(x_test[i].reshape(28, 28))\n", - " plt.gray()\n", - " ax.get_xaxis().set_visible(False)\n", - " ax.get_yaxis().set_visible(False)\n", - "\n", - " # Display reconstruction\n", - " ax = plt.subplot(2, n, i + n)\n", - " plt.imshow(decoded_imgs[i].reshape(28, 28))\n", - " plt.gray()\n", - " ax.get_xaxis().set_visible(False)\n", - " ax.get_yaxis().set_visible(False)\n", - "\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Embeddings" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We use the trained layers in order to get the core representation in the middle layer of the autoencoder, and we represent them with the TSNE" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "embeddings = Model(input_img, Flatten()(encoded)).predict(x_test)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from sklearn.manifold import TSNE\n", - "import numpy as np" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tsne = TSNE(n_components=2)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "emb2d = tsne.fit_transform(embeddings)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "x,y = np.squeeze(emb2d[:, 0]), np.squeeze(emb2d[:, 1])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from matplotlib.cm import tab10" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "summary = pd.DataFrame({\"x\": x, \"y\": y, \"target\": y_test, \"size\": 10})\n", - "\n", - "plt.figure(figsize=(10,8))\n", - "\n", - "for key, sel in summary.groupby(\"target\"):\n", - " plt.scatter(sel[\"x\"], sel[\"y\"], s=10, color=tab10.colors[key], label=classes[key])\n", - " \n", - "plt.legend()\n", - "plt.axis(\"off\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Denoising" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Introducing noise in order to train more robust auto-encoders" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from tensorflow.keras.layers import GaussianNoise" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "input_img = Input(shape=(28, 28, 1))\n", - "\n", - "noisy_input = GaussianNoise(0.1)(input_img)\n", - "\n", - "x = Conv2D(16, (3, 3), activation='relu', padding='same')(noisy_input)\n", - "x = MaxPooling2D((2, 2), padding='same')(x)\n", - "x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)\n", - "x = MaxPooling2D((2, 2), padding='same')(x)\n", - "x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)\n", - "encoded = MaxPooling2D((2, 2), padding='same')(x)\n", - "\n", - "# at this point the representation is (4, 4, 8) i.e. 128-dimensional\n", - "\n", - "x = Conv2D(8, (3, 3), activation='relu', padding='same')(encoded)\n", - "x = UpSampling2D((2, 2))(x)\n", - "x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)\n", - "x = UpSampling2D((2, 2))(x)\n", - "x = Conv2D(16, (3, 3), activation='relu')(x)\n", - "x = UpSampling2D((2, 2))(x)\n", - "decoded = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(x)\n", - "\n", - "noisy_autoencoder = Model(input_img, decoded)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "noisy_autoencoder.compile(optimizer='adam', loss='binary_crossentropy')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "noisy_autoencoder.fit(x_train, x_train,\n", - " epochs=50,\n", - " batch_size=128,\n", - " shuffle=True,\n", - " validation_data=(x_test, x_test),\n", - " callbacks=[TensorBoard(log_dir='/tmp/noisy_autoencoder')])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "autoencoder.save(\"./data/DenoisingAutoencoder.p\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "noise_factor = 0.1\n", - "x_train_noisy = x_train + noise_factor * np.random.normal(loc=0.0, scale=1.0, size=x_train.shape) \n", - "x_test_noisy = x_test + noise_factor * np.random.normal(loc=0.0, scale=1.0, size=x_test.shape) \n", - "\n", - "x_train_noisy = np.clip(x_train_noisy, 0., 1.)\n", - "x_test_noisy = np.clip(x_test_noisy, 0., 1.)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "decoded_imgs = autoencoder.predict(x_test_noisy)\n", - "\n", - "decoded_imgs_denoised = noisy_autoencoder.predict(x_test_noisy)\n", - "\n", - "n = 6\n", - "plt.figure(figsize=(20, 10))\n", - "for i in range(1, n + 1):\n", - " # Display original\n", - " ax = plt.subplot(3, n, i)\n", - " plt.imshow(x_test_noisy[i].reshape(28, 28))\n", - " plt.gray()\n", - " ax.get_xaxis().set_visible(False)\n", - " if i==0:\n", - " plt.ylabel(\"Original\")\n", - " else:\n", - " ax.get_yaxis().set_visible(False)\n", - " \n", - " # Display reconstruction\n", - " ax = plt.subplot(3, n, i + n)\n", - " plt.imshow(decoded_imgs[i].reshape(28, 28))\n", - " plt.gray()\n", - " ax.get_xaxis().set_visible(False)\n", - " if i==0:\n", - " plt.ylabel(\"Vanilla Autoencoder\")\n", - " else:\n", - " ax.get_yaxis().set_visible(False)\n", - " \n", - " ax = plt.subplot(3, n, i + 2*n)\n", - " plt.imshow(decoded_imgs_denoised[i].reshape(28, 28))\n", - " plt.gray()\n", - " ax.get_xaxis().set_visible(False)\n", - " if i==0:\n", - " plt.ylabel(\"Denoising Autoencoder\")\n", - " else:\n", - " ax.get_yaxis().set_visible(False)\n", - " \n", - " \n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "decoded_imgs = noisy_autoencoder.predict(x_test_noisy)\n", - "\n", - "n = 10\n", - "plt.figure(figsize=(20, 4))\n", - "for i in range(1, n + 1):\n", - " # Display original\n", - " ax = plt.subplot(2, n, i)\n", - " plt.imshow(x_test_noisy[i].reshape(28, 28))\n", - " plt.gray()\n", - " ax.get_xaxis().set_visible(False)\n", - " ax.get_yaxis().set_visible(False)\n", - "\n", - " # Display reconstruction\n", - " ax = plt.subplot(2, n, i + n)\n", - " plt.imshow(decoded_imgs[i].reshape(28, 28))\n", - " plt.gray()\n", - " ax.get_xaxis().set_visible(False)\n", - " ax.get_yaxis().set_visible(False)\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "py3.8", - "language": "python", - "name": "py3.8" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.10" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/ChapterNN/02_ImageClassification_Pytorch.ipynb b/ChapterNN/02_ImageClassification_Pytorch.ipynb index b36eb00..2e3029c 100644 --- a/ChapterNN/02_ImageClassification_Pytorch.ipynb +++ b/ChapterNN/02_ImageClassification_Pytorch.ipynb @@ -10,7 +10,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "60ea01e6-2184-4d88-a9e3-c05f70953f0a", "metadata": {}, "outputs": [], @@ -21,7 +21,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "83163df1-5732-459b-948a-b88d07d692cf", "metadata": {}, "outputs": [], @@ -40,7 +40,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "55daa661-47bb-4499-b8a4-dce7f5cadc22", "metadata": {}, "outputs": [], @@ -52,98 +52,10 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "3cf93aa8-eaa0-4143-84fc-2c617d402bd2", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/train-images-idx3-ubyte.gz\n", - "Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/train-images-idx3-ubyte.gz to ./data/FashionMNIST/raw/train-images-idx3-ubyte.gz\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|█████████████████████████████████████████████████| 26421880/26421880 [00:00<00:00, 113992555.88it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Extracting ./data/FashionMNIST/raw/train-images-idx3-ubyte.gz to ./data/FashionMNIST/raw\n", - "\n", - "Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/train-labels-idx1-ubyte.gz\n", - "Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/train-labels-idx1-ubyte.gz to ./data/FashionMNIST/raw/train-labels-idx1-ubyte.gz\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|████████████████████████████████████████████████████████| 29515/29515 [00:00<00:00, 65189511.62it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Extracting ./data/FashionMNIST/raw/train-labels-idx1-ubyte.gz to ./data/FashionMNIST/raw\n", - "\n", - "Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/t10k-images-idx3-ubyte.gz\n", - "Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/t10k-images-idx3-ubyte.gz to ./data/FashionMNIST/raw/t10k-images-idx3-ubyte.gz\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|███████████████████████████████████████████████████| 4422102/4422102 [00:00<00:00, 218915787.63it/s]" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Extracting ./data/FashionMNIST/raw/t10k-images-idx3-ubyte.gz to ./data/FashionMNIST/raw\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/t10k-labels-idx1-ubyte.gz\n", - "Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/t10k-labels-idx1-ubyte.gz to ./data/FashionMNIST/raw/t10k-labels-idx1-ubyte.gz\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████████████████████████████████████████████████████| 5148/5148 [00:00<00:00, 14589376.35it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Extracting ./data/FashionMNIST/raw/t10k-labels-idx1-ubyte.gz to ./data/FashionMNIST/raw\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "train_dataset = datasets.FashionMNIST('./data', train=True, download=True, transform=transformer)\n", "test_dataset = datasets.FashionMNIST('./data', train=False, transform=transformer)" @@ -151,7 +63,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "id": "fa2574d6-659d-4ef5-92a5-ffbe7036dc5b", "metadata": {}, "outputs": [], @@ -162,7 +74,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "id": "be30236f-5707-4517-9b6e-3eeb0601500f", "metadata": {}, "outputs": [], @@ -172,21 +84,10 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "id": "b7b7f58e-291e-4084-933e-4e3357fe42fb", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "n = 6\n", "plt.figure(figsize=(20, 4))\n", @@ -212,7 +113,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "id": "60570c8d-b61d-4558-8d3d-e831279e898f", "metadata": {}, "outputs": [], @@ -223,7 +124,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "id": "3cbed0a8-9d1c-49b1-9e41-59d15b2e134d", "metadata": {}, "outputs": [], @@ -246,7 +147,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "id": "0fa2d6f1-9db7-43d7-b00c-b44e5eba8a55", "metadata": {}, "outputs": [], @@ -264,7 +165,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "id": "d0c04fcb-4769-4022-ab84-89ee2412febc", "metadata": {}, "outputs": [], @@ -277,61 +178,10 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "id": "679b9446-9820-416a-8bd2-96b8712c33b6", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[1, 200] loss: 0.080\n", - "[1, 400] loss: 0.052\n", - "Accuracy on validation set: 0.8172999620437622\n", - "[2, 200] loss: 0.046\n", - "[2, 400] loss: 0.043\n", - "Accuracy on validation set: 0.8406000137329102\n", - "[3, 200] loss: 0.040\n", - "[3, 400] loss: 0.039\n", - "Accuracy on validation set: 0.8487999439239502\n", - "[4, 200] loss: 0.037\n", - "[4, 400] loss: 0.037\n", - "Accuracy on validation set: 0.8598999977111816\n", - "[5, 200] loss: 0.035\n", - "[5, 400] loss: 0.034\n", - "Accuracy on validation set: 0.8646999597549438\n", - "[6, 200] loss: 0.033\n", - "[6, 400] loss: 0.034\n", - "Accuracy on validation set: 0.8651000261306763\n", - "[7, 200] loss: 0.032\n", - "[7, 400] loss: 0.033\n", - "Accuracy on validation set: 0.8674999475479126\n", - "[8, 200] loss: 0.031\n" - ] - }, - { - "ename": "KeyboardInterrupt", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[12], line 8\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m epoch \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mrange\u001b[39m(\u001b[38;5;241m20\u001b[39m): \u001b[38;5;66;03m# loop over the dataset multiple times\u001b[39;00m\n\u001b[1;32m 7\u001b[0m running_loss \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m0.0\u001b[39m\n\u001b[0;32m----> 8\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m i, data \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28menumerate\u001b[39m(trainloader, \u001b[38;5;241m0\u001b[39m):\n\u001b[1;32m 9\u001b[0m \u001b[38;5;66;03m# get the inputs; data is a list of [inputs, labels]\u001b[39;00m\n\u001b[1;32m 10\u001b[0m inputs, labels \u001b[38;5;241m=\u001b[39m data\n\u001b[1;32m 12\u001b[0m \u001b[38;5;66;03m# zero the parameter gradients\u001b[39;00m\n", - "File \u001b[0;32m~/.pyenv/versions/py3.8/lib/python3.8/site-packages/torch/utils/data/dataloader.py:630\u001b[0m, in \u001b[0;36m_BaseDataLoaderIter.__next__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 627\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_sampler_iter \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 628\u001b[0m \u001b[38;5;66;03m# TODO(https://github.com/pytorch/pytorch/issues/76750)\u001b[39;00m\n\u001b[1;32m 629\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_reset() \u001b[38;5;66;03m# type: ignore[call-arg]\u001b[39;00m\n\u001b[0;32m--> 630\u001b[0m data \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_next_data\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 631\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_num_yielded \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;241m1\u001b[39m\n\u001b[1;32m 632\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_dataset_kind \u001b[38;5;241m==\u001b[39m _DatasetKind\u001b[38;5;241m.\u001b[39mIterable \u001b[38;5;129;01mand\u001b[39;00m \\\n\u001b[1;32m 633\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_IterableDataset_len_called \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m \\\n\u001b[1;32m 634\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_num_yielded \u001b[38;5;241m>\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_IterableDataset_len_called:\n", - "File \u001b[0;32m~/.pyenv/versions/py3.8/lib/python3.8/site-packages/torch/utils/data/dataloader.py:674\u001b[0m, in \u001b[0;36m_SingleProcessDataLoaderIter._next_data\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 672\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_next_data\u001b[39m(\u001b[38;5;28mself\u001b[39m):\n\u001b[1;32m 673\u001b[0m index \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_next_index() \u001b[38;5;66;03m# may raise StopIteration\u001b[39;00m\n\u001b[0;32m--> 674\u001b[0m data \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_dataset_fetcher\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfetch\u001b[49m\u001b[43m(\u001b[49m\u001b[43mindex\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;66;03m# may raise StopIteration\u001b[39;00m\n\u001b[1;32m 675\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_pin_memory:\n\u001b[1;32m 676\u001b[0m data \u001b[38;5;241m=\u001b[39m _utils\u001b[38;5;241m.\u001b[39mpin_memory\u001b[38;5;241m.\u001b[39mpin_memory(data, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_pin_memory_device)\n", - "File \u001b[0;32m~/.pyenv/versions/py3.8/lib/python3.8/site-packages/torch/utils/data/_utils/fetch.py:51\u001b[0m, in \u001b[0;36m_MapDatasetFetcher.fetch\u001b[0;34m(self, possibly_batched_index)\u001b[0m\n\u001b[1;32m 49\u001b[0m data \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdataset\u001b[38;5;241m.\u001b[39m__getitems__(possibly_batched_index)\n\u001b[1;32m 50\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m---> 51\u001b[0m data \u001b[38;5;241m=\u001b[39m [\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdataset[idx] \u001b[38;5;28;01mfor\u001b[39;00m idx \u001b[38;5;129;01min\u001b[39;00m possibly_batched_index]\n\u001b[1;32m 52\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 53\u001b[0m data \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdataset[possibly_batched_index]\n", - "File \u001b[0;32m~/.pyenv/versions/py3.8/lib/python3.8/site-packages/torch/utils/data/_utils/fetch.py:51\u001b[0m, in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 49\u001b[0m data \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdataset\u001b[38;5;241m.\u001b[39m__getitems__(possibly_batched_index)\n\u001b[1;32m 50\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m---> 51\u001b[0m data \u001b[38;5;241m=\u001b[39m [\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdataset\u001b[49m\u001b[43m[\u001b[49m\u001b[43midx\u001b[49m\u001b[43m]\u001b[49m \u001b[38;5;28;01mfor\u001b[39;00m idx \u001b[38;5;129;01min\u001b[39;00m possibly_batched_index]\n\u001b[1;32m 52\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 53\u001b[0m data \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdataset[possibly_batched_index]\n", - "File \u001b[0;32m~/.pyenv/versions/py3.8/lib/python3.8/site-packages/torchvision/datasets/mnist.py:145\u001b[0m, in \u001b[0;36mMNIST.__getitem__\u001b[0;34m(self, index)\u001b[0m\n\u001b[1;32m 142\u001b[0m img \u001b[38;5;241m=\u001b[39m Image\u001b[38;5;241m.\u001b[39mfromarray(img\u001b[38;5;241m.\u001b[39mnumpy(), mode\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mL\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 144\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtransform \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m--> 145\u001b[0m img \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtransform\u001b[49m\u001b[43m(\u001b[49m\u001b[43mimg\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 147\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtarget_transform \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 148\u001b[0m target \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtarget_transform(target)\n", - "File \u001b[0;32m~/.pyenv/versions/py3.8/lib/python3.8/site-packages/torchvision/transforms/transforms.py:95\u001b[0m, in \u001b[0;36mCompose.__call__\u001b[0;34m(self, img)\u001b[0m\n\u001b[1;32m 93\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__call__\u001b[39m(\u001b[38;5;28mself\u001b[39m, img):\n\u001b[1;32m 94\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m t \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtransforms:\n\u001b[0;32m---> 95\u001b[0m img \u001b[38;5;241m=\u001b[39m \u001b[43mt\u001b[49m\u001b[43m(\u001b[49m\u001b[43mimg\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 96\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m img\n", - "File \u001b[0;32m~/.pyenv/versions/py3.8/lib/python3.8/site-packages/torchvision/transforms/transforms.py:137\u001b[0m, in \u001b[0;36mToTensor.__call__\u001b[0;34m(self, pic)\u001b[0m\n\u001b[1;32m 129\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__call__\u001b[39m(\u001b[38;5;28mself\u001b[39m, pic):\n\u001b[1;32m 130\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 131\u001b[0m \u001b[38;5;124;03m Args:\u001b[39;00m\n\u001b[1;32m 132\u001b[0m \u001b[38;5;124;03m pic (PIL Image or numpy.ndarray): Image to be converted to tensor.\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 135\u001b[0m \u001b[38;5;124;03m Tensor: Converted image.\u001b[39;00m\n\u001b[1;32m 136\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m--> 137\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mF\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mto_tensor\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpic\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/.pyenv/versions/py3.8/lib/python3.8/site-packages/torchvision/transforms/functional.py:166\u001b[0m, in \u001b[0;36mto_tensor\u001b[0;34m(pic)\u001b[0m\n\u001b[1;32m 164\u001b[0m \u001b[38;5;66;03m# handle PIL Image\u001b[39;00m\n\u001b[1;32m 165\u001b[0m mode_to_nptype \u001b[38;5;241m=\u001b[39m {\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mI\u001b[39m\u001b[38;5;124m\"\u001b[39m: np\u001b[38;5;241m.\u001b[39mint32, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mI;16\u001b[39m\u001b[38;5;124m\"\u001b[39m: np\u001b[38;5;241m.\u001b[39mint16, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mF\u001b[39m\u001b[38;5;124m\"\u001b[39m: np\u001b[38;5;241m.\u001b[39mfloat32}\n\u001b[0;32m--> 166\u001b[0m img \u001b[38;5;241m=\u001b[39m torch\u001b[38;5;241m.\u001b[39mfrom_numpy(\u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43marray\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpic\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmode_to_nptype\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpic\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmode\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43muint8\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcopy\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m)\n\u001b[1;32m 168\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m pic\u001b[38;5;241m.\u001b[39mmode \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m1\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[1;32m 169\u001b[0m img \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m255\u001b[39m \u001b[38;5;241m*\u001b[39m img\n", - "File \u001b[0;32m~/.pyenv/versions/py3.8/lib/python3.8/site-packages/PIL/Image.py:708\u001b[0m, in \u001b[0;36mImage.__array_interface__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 706\u001b[0m warnings\u001b[38;5;241m.\u001b[39mwarn(\u001b[38;5;28mstr\u001b[39m(e))\n\u001b[1;32m 707\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m\n\u001b[0;32m--> 708\u001b[0m new[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshape\u001b[39m\u001b[38;5;124m\"\u001b[39m], new[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtypestr\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[43m_conv_type_shape\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 709\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m new\n", - "File \u001b[0;32m~/.pyenv/versions/py3.8/lib/python3.8/site-packages/PIL/Image.py:244\u001b[0m, in \u001b[0;36m_conv_type_shape\u001b[0;34m(im)\u001b[0m\n\u001b[1;32m 242\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_conv_type_shape\u001b[39m(im):\n\u001b[1;32m 243\u001b[0m m \u001b[38;5;241m=\u001b[39m ImageMode\u001b[38;5;241m.\u001b[39mgetmode(im\u001b[38;5;241m.\u001b[39mmode)\n\u001b[0;32m--> 244\u001b[0m shape \u001b[38;5;241m=\u001b[39m (\u001b[43mim\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mheight\u001b[49m, im\u001b[38;5;241m.\u001b[39mwidth)\n\u001b[1;32m 245\u001b[0m extra \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mlen\u001b[39m(m\u001b[38;5;241m.\u001b[39mbands)\n\u001b[1;32m 246\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m extra \u001b[38;5;241m!=\u001b[39m \u001b[38;5;241m1\u001b[39m:\n", - "File \u001b[0;32m~/.pyenv/versions/py3.8/lib/python3.8/site-packages/PIL/Image.py:517\u001b[0m, in \u001b[0;36mImage.height\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 515\u001b[0m \u001b[38;5;129m@property\u001b[39m\n\u001b[1;32m 516\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mheight\u001b[39m(\u001b[38;5;28mself\u001b[39m) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m \u001b[38;5;28mint\u001b[39m:\n\u001b[0;32m--> 517\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msize\u001b[49m[\u001b[38;5;241m1\u001b[39m]\n", - "\u001b[0;31mKeyboardInterrupt\u001b[0m: " - ] - } - ], + "outputs": [], "source": [ "from torchmetrics.classification import MulticlassAccuracy\n", "\n", @@ -376,9 +226,9 @@ ], "metadata": { "kernelspec": { - "display_name": "py3.8", + "display_name": "chap-nn", "language": "python", - "name": "py3.8" + "name": "chap-nn" }, "language_info": { "codemirror_mode": { @@ -390,7 +240,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.10" + "version": "3.8" } }, "nbformat": 4, diff --git a/ChapterNN/03_Autoencoders.ipynb b/ChapterNN/03_Autoencoders.ipynb new file mode 100644 index 0000000..f03033b --- /dev/null +++ b/ChapterNN/03_Autoencoders.ipynb @@ -0,0 +1,627 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# AutoEncoder " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the following we will show you how to create, train and use a simple autoencoder. We will then show you how to make an auto-encoder more robust against noise. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Load Dataset" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import tensorflow as tf" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from tensorflow.keras.datasets import fashion_mnist" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "(x_train, y_train), (x_test, y_test) = fashion_mnist.load_data()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "x_train = x_train.astype('float32') / 255.\n", + "x_test = x_test.astype('float32') / 255.\n", + "\n", + "print (x_train.shape)\n", + "print (x_test.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from matplotlib import pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "classes = {\n", + " 0:\"T-shirt/top\",\n", + " 1: \"Trouser\",\n", + " 2: \"Pullover\",\n", + " 3: \"Dress\",\n", + " 4: \"Coat\",\n", + " 5: \"Sandal\",\n", + " 6: \"Shirt\",\n", + " 7: \"Sneaker\",\n", + " 8: \"Bag\",\n", + " 9: \"Ankle boot\", \n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "n = 6\n", + "plt.figure(figsize=(20, 4))\n", + "for i in range(n):\n", + " # display original\n", + " ax = plt.subplot(1, n, i + 1)\n", + " plt.imshow(x_test[i])\n", + " plt.title(classes[y_test[i]])\n", + " plt.gray()\n", + " ax.get_xaxis().set_visible(False)\n", + " ax.get_yaxis().set_visible(False)\n", + "\n", + "plt.show()\n", + "# plt.savefig(\"TrainingSet.png\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Create Autoencoder" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from tensorflow.keras.layers import Flatten, Conv2D, Dropout, MaxPooling2D, UpSampling2D, Input" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from tensorflow.keras import Model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "input_img = Input(shape=(28, 28, 1))\n", + "\n", + "x = Conv2D(16, (3, 3), activation='relu', padding='same')(input_img)\n", + "x = MaxPooling2D((2, 2), padding='same')(x)\n", + "x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)\n", + "x = MaxPooling2D((2, 2), padding='same')(x)\n", + "x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)\n", + "encoded = MaxPooling2D((2, 2), padding='same')(x)\n", + "\n", + "# at this point the representation is (4, 4, 8) i.e. 128-dimensional\n", + "\n", + "x = Conv2D(8, (3, 3), activation='relu', padding='same')(encoded)\n", + "x = UpSampling2D((2, 2))(x)\n", + "x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)\n", + "x = UpSampling2D((2, 2))(x)\n", + "x = Conv2D(16, (3, 3), activation='relu')(x)\n", + "x = UpSampling2D((2, 2))(x)\n", + "decoded = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(x)\n", + "\n", + "autoencoder = Model(input_img, decoded)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "Model(input_img, encoded).summary()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "autoencoder.compile(optimizer='adam', loss='binary_crossentropy')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from tensorflow.keras.callbacks import TensorBoard" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "autoencoder.fit(x_train, x_train,\n", + " epochs=50,\n", + " batch_size=128,\n", + " shuffle=True,\n", + " validation_data=(x_test, x_test),\n", + " callbacks=[TensorBoard(log_dir='/tmp/autoencoder')])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "autoencoder.save(\"./data/Batch50.p\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from tensorflow.keras.models import load_model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "autoencoder_first = load_model(\"./data/Batch50.p\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "decoded_imgs = autoencoder_first.predict(x_test)\n", + "\n", + "n = 6\n", + "plt.figure(figsize=(20, 7))\n", + "for i in range(1, n + 1):\n", + " # Display original\n", + " ax = plt.subplot(2, n, i)\n", + " plt.imshow(x_test[i].reshape(28, 28))\n", + " plt.gray()\n", + " ax.get_xaxis().set_visible(False)\n", + " ax.get_yaxis().set_visible(False)\n", + "\n", + " # Display reconstruction\n", + " ax = plt.subplot(2, n, i + n)\n", + " plt.imshow(decoded_imgs[i].reshape(28, 28))\n", + " plt.gray()\n", + " ax.get_xaxis().set_visible(False)\n", + " ax.get_yaxis().set_visible(False)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from tensorflow.keras.optimizers import Adam" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "autoencoder.compile(optimizer=Adam(learning_rate=0.0005), loss='binary_crossentropy')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "autoencoder.fit(x_train, x_train,\n", + " epochs=50,\n", + " batch_size=128,\n", + " shuffle=True,\n", + " validation_data=(x_test, x_test),\n", + " callbacks=[TensorBoard(log_dir='/tmp/autoencoder')])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "autoencoder.save(\"./data/Batch100.p\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "decoded_imgs = autoencoder.predict(x_test)\n", + "\n", + "n = 10\n", + "plt.figure(figsize=(20, 4))\n", + "for i in range(1, n + 1):\n", + " # Display original\n", + " ax = plt.subplot(2, n, i)\n", + " plt.imshow(x_test[i].reshape(28, 28))\n", + " plt.gray()\n", + " ax.get_xaxis().set_visible(False)\n", + " ax.get_yaxis().set_visible(False)\n", + "\n", + " # Display reconstruction\n", + " ax = plt.subplot(2, n, i + n)\n", + " plt.imshow(decoded_imgs[i].reshape(28, 28))\n", + " plt.gray()\n", + " ax.get_xaxis().set_visible(False)\n", + " ax.get_yaxis().set_visible(False)\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Embeddings" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We use the trained layers in order to get the core representation in the middle layer of the autoencoder, and we represent them with the TSNE" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "embeddings = Model(input_img, Flatten()(encoded)).predict(x_test)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.manifold import TSNE\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "tsne = TSNE(n_components=2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "emb2d = tsne.fit_transform(embeddings)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "x,y = np.squeeze(emb2d[:, 0]), np.squeeze(emb2d[:, 1])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from matplotlib.cm import tab10" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "summary = pd.DataFrame({\"x\": x, \"y\": y, \"target\": y_test, \"size\": 10})\n", + "\n", + "plt.figure(figsize=(10,8))\n", + "\n", + "for key, sel in summary.groupby(\"target\"):\n", + " plt.scatter(sel[\"x\"], sel[\"y\"], s=10, color=tab10.colors[key], label=classes[key])\n", + " \n", + "plt.legend()\n", + "plt.axis(\"off\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Denoising" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Introducing noise in order to train more robust auto-encoders" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from tensorflow.keras.layers import GaussianNoise" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "input_img = Input(shape=(28, 28, 1))\n", + "\n", + "noisy_input = GaussianNoise(0.1)(input_img)\n", + "\n", + "x = Conv2D(16, (3, 3), activation='relu', padding='same')(noisy_input)\n", + "x = MaxPooling2D((2, 2), padding='same')(x)\n", + "x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)\n", + "x = MaxPooling2D((2, 2), padding='same')(x)\n", + "x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)\n", + "encoded = MaxPooling2D((2, 2), padding='same')(x)\n", + "\n", + "# at this point the representation is (4, 4, 8) i.e. 128-dimensional\n", + "\n", + "x = Conv2D(8, (3, 3), activation='relu', padding='same')(encoded)\n", + "x = UpSampling2D((2, 2))(x)\n", + "x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)\n", + "x = UpSampling2D((2, 2))(x)\n", + "x = Conv2D(16, (3, 3), activation='relu')(x)\n", + "x = UpSampling2D((2, 2))(x)\n", + "decoded = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(x)\n", + "\n", + "noisy_autoencoder = Model(input_img, decoded)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "noisy_autoencoder.compile(optimizer='adam', loss='binary_crossentropy')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "noisy_autoencoder.fit(x_train, x_train,\n", + " epochs=50,\n", + " batch_size=128,\n", + " shuffle=True,\n", + " validation_data=(x_test, x_test),\n", + " callbacks=[TensorBoard(log_dir='/tmp/noisy_autoencoder')])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "autoencoder.save(\"./data/DenoisingAutoencoder.p\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "noise_factor = 0.1\n", + "x_train_noisy = x_train + noise_factor * np.random.normal(loc=0.0, scale=1.0, size=x_train.shape) \n", + "x_test_noisy = x_test + noise_factor * np.random.normal(loc=0.0, scale=1.0, size=x_test.shape) \n", + "\n", + "x_train_noisy = np.clip(x_train_noisy, 0., 1.)\n", + "x_test_noisy = np.clip(x_test_noisy, 0., 1.)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "decoded_imgs = autoencoder.predict(x_test_noisy)\n", + "\n", + "decoded_imgs_denoised = noisy_autoencoder.predict(x_test_noisy)\n", + "\n", + "n = 6\n", + "plt.figure(figsize=(20, 10))\n", + "for i in range(1, n + 1):\n", + " # Display original\n", + " ax = plt.subplot(3, n, i)\n", + " plt.imshow(x_test_noisy[i].reshape(28, 28))\n", + " plt.gray()\n", + " ax.get_xaxis().set_visible(False)\n", + " if i==0:\n", + " plt.ylabel(\"Original\")\n", + " else:\n", + " ax.get_yaxis().set_visible(False)\n", + " \n", + " # Display reconstruction\n", + " ax = plt.subplot(3, n, i + n)\n", + " plt.imshow(decoded_imgs[i].reshape(28, 28))\n", + " plt.gray()\n", + " ax.get_xaxis().set_visible(False)\n", + " if i==0:\n", + " plt.ylabel(\"Vanilla Autoencoder\")\n", + " else:\n", + " ax.get_yaxis().set_visible(False)\n", + " \n", + " ax = plt.subplot(3, n, i + 2*n)\n", + " plt.imshow(decoded_imgs_denoised[i].reshape(28, 28))\n", + " plt.gray()\n", + " ax.get_xaxis().set_visible(False)\n", + " if i==0:\n", + " plt.ylabel(\"Denoising Autoencoder\")\n", + " else:\n", + " ax.get_yaxis().set_visible(False)\n", + " \n", + " \n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "decoded_imgs = noisy_autoencoder.predict(x_test_noisy)\n", + "\n", + "n = 10\n", + "plt.figure(figsize=(20, 4))\n", + "for i in range(1, n + 1):\n", + " # Display original\n", + " ax = plt.subplot(2, n, i)\n", + " plt.imshow(x_test_noisy[i].reshape(28, 28))\n", + " plt.gray()\n", + " ax.get_xaxis().set_visible(False)\n", + " ax.get_yaxis().set_visible(False)\n", + "\n", + " # Display reconstruction\n", + " ax = plt.subplot(2, n, i + n)\n", + " plt.imshow(decoded_imgs[i].reshape(28, 28))\n", + " plt.gray()\n", + " ax.get_xaxis().set_visible(False)\n", + " ax.get_yaxis().set_visible(False)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.3" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/ChapterNN/04_GraphAutoEncoder_PyGeometric.ipynb b/ChapterNN/04_GraphAutoEncoder_PyGeometric.ipynb index f341601..76aa5d0 100644 --- a/ChapterNN/04_GraphAutoEncoder_PyGeometric.ipynb +++ b/ChapterNN/04_GraphAutoEncoder_PyGeometric.ipynb @@ -10,7 +10,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "9403ccd6-3353-4edd-9ba2-beaab617afa3", "metadata": {}, "outputs": [], @@ -29,7 +29,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "c80d137d-313f-4b8b-8473-c787a59c97ba", "metadata": {}, "outputs": [], @@ -39,7 +39,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "2694e0b8-7ad2-4ab0-bd66-ec9e9615c9cc", "metadata": {}, "outputs": [], @@ -49,27 +49,10 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "409d5939-8d16-4db9-a17f-c5cab6a2d4aa", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Downloading https://github.com/kimiyoung/planetoid/raw/master/data/ind.cora.x\n", - "Downloading https://github.com/kimiyoung/planetoid/raw/master/data/ind.cora.tx\n", - "Downloading https://github.com/kimiyoung/planetoid/raw/master/data/ind.cora.allx\n", - "Downloading https://github.com/kimiyoung/planetoid/raw/master/data/ind.cora.y\n", - "Downloading https://github.com/kimiyoung/planetoid/raw/master/data/ind.cora.ty\n", - "Downloading https://github.com/kimiyoung/planetoid/raw/master/data/ind.cora.ally\n", - "Downloading https://github.com/kimiyoung/planetoid/raw/master/data/ind.cora.graph\n", - "Downloading https://github.com/kimiyoung/planetoid/raw/master/data/ind.cora.test.index\n", - "Processing...\n", - "Done!\n" - ] - } - ], + "outputs": [], "source": [ "transform = T.Compose([\n", " T.NormalizeFeatures(),\n", @@ -84,20 +67,10 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "id": "4fe46bed-054c-4f52-a4da-ed3728a3f41c", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Train edges (positive): 4751\n", - "Test edges (positive): 527\n", - "Test edges (negative): 527\n" - ] - } - ], + "outputs": [], "source": [ "print(f\"Train edges (positive): {train_data.pos_edge_label_index.shape[1]}\")\n", "print(f\"Test edges (positive): {test_data.pos_edge_label_index.shape[1]}\")\n", @@ -106,7 +79,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "id": "dedf968d-6e87-451a-aaa2-972ce21f4aca", "metadata": {}, "outputs": [], @@ -124,7 +97,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "id": "40de5839-fdf8-4935-b2d8-f46adb5ab4eb", "metadata": {}, "outputs": [], @@ -135,7 +108,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "id": "b9240419-00b2-4f01-885a-169814989d21", "metadata": {}, "outputs": [], @@ -145,7 +118,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "id": "baa87287-e068-463f-9cb5-be032a2273ac", "metadata": {}, "outputs": [], @@ -156,37 +129,10 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "id": "da9b26c1-c070-4e98-a0a1-26783b0ed7d7", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Performance on validation set => AUC: 0.7031746774733644 AP: 0.7408616667192883\n", - "Performance on validation set => AUC: 0.7003589830374215 AP: 0.7384835516148203\n", - "Performance on validation set => AUC: 0.7003733855665054 AP: 0.7387001033670365\n", - "Performance on validation set => AUC: 0.6996730625897907 AP: 0.738915861615899\n", - "Performance on validation set => AUC: 0.6991419693298143 AP: 0.7400909179536861\n", - "Performance on validation set => AUC: 0.6968951747926936 AP: 0.7390546559098561\n", - "Performance on validation set => AUC: 0.6940110683436012 AP: 0.7372227705695125\n", - "Performance on validation set => AUC: 0.6927454461003353 AP: 0.7363419854717088\n", - "Performance on validation set => AUC: 0.6914996273345599 AP: 0.7352590765202852\n", - "Performance on validation set => AUC: 0.6898955456578175 AP: 0.7340942320131665\n", - "Performance on validation set => AUC: 0.6872166752481736 AP: 0.732318689778636\n", - "Performance on validation set => AUC: 0.6841309333919037 AP: 0.7299620245428802\n", - "Performance on validation set => AUC: 0.6819381483388482 AP: 0.7270163059853674\n", - "Performance on validation set => AUC: 0.6836376467707729 AP: 0.7255128311516903\n", - "Performance on validation set => AUC: 0.6872274771449867 AP: 0.7248374222962018\n", - "Performance on validation set => AUC: 0.68846609464622 AP: 0.7243764493545095\n", - "Performance on validation set => AUC: 0.6905256563052472 AP: 0.7244887283857175\n", - "Performance on validation set => AUC: 0.7001321432043466 AP: 0.7275928498612678\n", - "Performance on validation set => AUC: 0.7236262687727965 AP: 0.7386152752055015\n", - "Performance on validation set => AUC: 0.7473868411293023 AP: 0.7544830827529333\n" - ] - } - ], + "outputs": [], "source": [ "for epoch in range(20): # loop over the dataset multiple times\n", "\n", diff --git a/ChapterNN/05_GraphAutoEncoder_StellarGraph.ipynb b/ChapterNN/05_GraphAutoEncoder_StellarGraph.ipynb index 35003c3..f61faae 100644 --- a/ChapterNN/05_GraphAutoEncoder_StellarGraph.ipynb +++ b/ChapterNN/05_GraphAutoEncoder_StellarGraph.ipynb @@ -10,24 +10,10 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "65a6d0fb-bb0f-4af0-8ba9-6a0c902cec49", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2024-04-14 21:23:05.152203: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcudart.so.11.0'; dlerror: libcudart.so.11.0: cannot open shared object file: No such file or directory\n", - "2024-04-14 21:23:05.152254: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine.\n", - "2024-04-14 21:23:08.064209: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcuda.so.1'; dlerror: libcuda.so.1: cannot open shared object file: No such file or directory\n", - "2024-04-14 21:23:08.064257: W tensorflow/stream_executor/cuda/cuda_driver.cc:269] failed call to cuInit: UNKNOWN ERROR (303)\n", - "2024-04-14 21:23:08.064280: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:156] kernel driver does not appear to be running on this host (ip-172-31-23-216): /proc/driver/nvidia/version does not exist\n", - "2024-04-14 21:23:08.064620: I tensorflow/core/platform/cpu_feature_guard.cc:151] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: AVX2 FMA\n", - "To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.\n" - ] - } - ], + "outputs": [], "source": [ "from stellargraph.data import EdgeSplitter\n", "from stellargraph.mapper import FullBatchLinkGenerator\n", @@ -40,7 +26,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "1d27bd90-c522-48e2-9929-7417b3ce904b", "metadata": {}, "outputs": [], @@ -51,48 +37,20 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "4e59277b-12b7-4e8f-9cdc-eaf4c96d1771", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "StellarGraph: Undirected multigraph\n", - " Nodes: 2708, Edges: 5429\n", - "\n", - " Node types:\n", - " paper: [2708]\n", - " Features: float32 vector, length 1433\n", - " Edge types: paper-cites->paper\n", - "\n", - " Edge types:\n", - " paper-cites->paper: [5429]\n", - " Weights: all 1 (default)\n", - " Features: none\n" - ] - } - ], + "outputs": [], "source": [ "print(G.info())" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "4ab4de94-e416-49b2-8e02-5217d5f410e5", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "** Sampled 542 positive and 542 negative edges. **\n", - "** Sampled 542 positive and 542 negative edges. **\n" - ] - } - ], + "outputs": [], "source": [ "edge_splitter_test = EdgeSplitter(G)\n", "\n", @@ -109,18 +67,10 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "id": "261e8cdd-455d-4607-a95c-c26ec6aaf109", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Using GCN (local pooling) filters...\n" - ] - } - ], + "outputs": [], "source": [ "train_gen = FullBatchLinkGenerator(G, method=\"gcn\")\n", "train_flow = train_gen.flow(edge_ids_train, edge_labels_train)" @@ -128,18 +78,10 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "id": "5820186d-1728-494b-9e2c-6a906d7ff3f5", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Using GCN (local pooling) filters...\n" - ] - } - ], + "outputs": [], "source": [ "test_gen = FullBatchLinkGenerator(G, method=\"gcn\")\n", "test_flow = train_gen.flow(edge_ids_test, edge_labels_test)" @@ -147,7 +89,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "id": "7897bc20-a2eb-4887-8bde-3ca5756cd62d", "metadata": {}, "outputs": [], @@ -159,7 +101,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "id": "c27562a4-9f93-4c23-87b1-ad3a0f46c19a", "metadata": {}, "outputs": [], @@ -169,7 +111,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "id": "be2d54a1-9561-410a-9c8f-54b805450dc3", "metadata": {}, "outputs": [], @@ -179,7 +121,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "id": "38cd0093-ef71-4110-8f59-43e510b86edc", "metadata": {}, "outputs": [], @@ -189,19 +131,10 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "id": "33ccc882-df0c-40ad-a401-725b3a64aac3", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/ubuntu/.pyenv/versions/py3.8/lib/python3.8/site-packages/keras/optimizer_v2/adam.py:105: UserWarning: The `lr` argument is deprecated, use `learning_rate` instead.\n", - " super(Adam, self).__init__(name, **kwargs)\n" - ] - } - ], + "outputs": [], "source": [ "model = keras.Model(inputs=x_inp, outputs=prediction)\n", "\n", @@ -214,194 +147,30 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "id": "1dbc5d61-4e11-4ec8-bb06-8b206beb698d", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Model: \"model\"\n", - "__________________________________________________________________________________________________\n", - " Layer (type) Output Shape Param # Connected to \n", - "==================================================================================================\n", - " input_1 (InputLayer) [(1, 2708, 1433)] 0 [] \n", - " \n", - " input_3 (InputLayer) [(1, None, 2)] 0 [] \n", - " \n", - " input_4 (InputLayer) [(1, None)] 0 [] \n", - " \n", - " dropout (Dropout) (1, 2708, 1433) 0 ['input_1[0][0]'] \n", - " \n", - " squeezed_sparse_conversion (Sq (2708, 2708) 0 ['input_3[0][0]', \n", - " ueezedSparseConversion) 'input_4[0][0]'] \n", - " \n", - " graph_convolution (GraphConvol (1, None, 16) 22944 ['dropout[0][0]', \n", - " ution) 'squeezed_sparse_conversion[0][0\n", - " ]'] \n", - " \n", - " dropout_1 (Dropout) (1, None, 16) 0 ['graph_convolution[0][0]'] \n", - " \n", - " graph_convolution_1 (GraphConv (1, None, 16) 272 ['dropout_1[0][0]', \n", - " olution) 'squeezed_sparse_conversion[0][0\n", - " ]'] \n", - " \n", - " input_2 (InputLayer) [(1, None, 2)] 0 [] \n", - " \n", - " gather_indices (GatherIndices) (1, None, 2, 16) 0 ['graph_convolution_1[0][0]', \n", - " 'input_2[0][0]'] \n", - " \n", - " link_embedding (LinkEmbedding) (1, None, 1) 0 ['gather_indices[0][0]'] \n", - " \n", - " reshape (Reshape) (1, None) 0 ['link_embedding[0][0]'] \n", - " \n", - "==================================================================================================\n", - "Total params: 23,216\n", - "Trainable params: 23,216\n", - "Non-trainable params: 0\n", - "__________________________________________________________________________________________________\n" - ] - } - ], + "outputs": [], "source": [ "model.summary()" ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "id": "d5760e12-f39a-4ce8-8c9d-9ba8ae61d4ab", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Epoch 1/50\n", - "1/1 [==============================] - 2s 2s/step - loss: 1.5763 - binary_accuracy: 0.5000 - val_loss: 1.9396 - val_binary_accuracy: 0.5609\n", - "Epoch 2/50\n", - "1/1 [==============================] - 0s 186ms/step - loss: 2.1878 - binary_accuracy: 0.5812 - val_loss: 0.6680 - val_binary_accuracy: 0.7149\n", - "Epoch 3/50\n", - "1/1 [==============================] - 0s 194ms/step - loss: 0.6135 - binary_accuracy: 0.7066 - val_loss: 0.6407 - val_binary_accuracy: 0.6624\n", - "Epoch 4/50\n", - "1/1 [==============================] - 0s 188ms/step - loss: 0.6331 - binary_accuracy: 0.6577 - val_loss: 0.6610 - val_binary_accuracy: 0.7011\n", - "Epoch 5/50\n", - "1/1 [==============================] - 0s 180ms/step - loss: 0.6754 - binary_accuracy: 0.6827 - val_loss: 0.6487 - val_binary_accuracy: 0.7094\n", - "Epoch 6/50\n", - "1/1 [==============================] - 0s 184ms/step - loss: 0.6670 - binary_accuracy: 0.7085 - val_loss: 0.6178 - val_binary_accuracy: 0.6780\n", - "Epoch 7/50\n", - "1/1 [==============================] - 0s 184ms/step - loss: 0.5983 - binary_accuracy: 0.6946 - val_loss: 0.6237 - val_binary_accuracy: 0.6697\n", - "Epoch 8/50\n", - "1/1 [==============================] - 0s 167ms/step - loss: 0.6000 - binary_accuracy: 0.6780 - val_loss: 0.6073 - val_binary_accuracy: 0.6882\n", - "Epoch 9/50\n", - "1/1 [==============================] - 0s 169ms/step - loss: 0.5503 - binary_accuracy: 0.7149 - val_loss: 0.6196 - val_binary_accuracy: 0.7066\n", - "Epoch 10/50\n", - "1/1 [==============================] - 0s 151ms/step - loss: 0.5553 - binary_accuracy: 0.7509 - val_loss: 0.6015 - val_binary_accuracy: 0.6873\n", - "Epoch 11/50\n", - "1/1 [==============================] - 0s 175ms/step - loss: 0.5591 - binary_accuracy: 0.7232 - val_loss: 0.6369 - val_binary_accuracy: 0.6328\n", - "Epoch 12/50\n", - "1/1 [==============================] - 0s 159ms/step - loss: 0.5639 - binary_accuracy: 0.6771 - val_loss: 0.6474 - val_binary_accuracy: 0.6135\n", - "Epoch 13/50\n", - "1/1 [==============================] - 0s 154ms/step - loss: 0.5749 - binary_accuracy: 0.6808 - val_loss: 0.6313 - val_binary_accuracy: 0.6273\n", - "Epoch 14/50\n", - "1/1 [==============================] - 0s 177ms/step - loss: 0.5922 - binary_accuracy: 0.6734 - val_loss: 0.6019 - val_binary_accuracy: 0.6559\n", - "Epoch 15/50\n", - "1/1 [==============================] - 0s 207ms/step - loss: 0.5563 - binary_accuracy: 0.7103 - val_loss: 0.6077 - val_binary_accuracy: 0.7085\n", - "Epoch 16/50\n", - "1/1 [==============================] - 0s 174ms/step - loss: 0.5161 - binary_accuracy: 0.7528 - val_loss: 0.6012 - val_binary_accuracy: 0.7334\n", - "Epoch 17/50\n", - "1/1 [==============================] - 0s 177ms/step - loss: 0.5562 - binary_accuracy: 0.7657 - val_loss: 0.5957 - val_binary_accuracy: 0.7306\n", - "Epoch 18/50\n", - "1/1 [==============================] - 0s 192ms/step - loss: 0.5324 - binary_accuracy: 0.7620 - val_loss: 0.5702 - val_binary_accuracy: 0.7306\n", - "Epoch 19/50\n", - "1/1 [==============================] - 0s 200ms/step - loss: 0.5027 - binary_accuracy: 0.7620 - val_loss: 0.5522 - val_binary_accuracy: 0.7214\n", - "Epoch 20/50\n", - "1/1 [==============================] - 0s 188ms/step - loss: 0.4692 - binary_accuracy: 0.7878 - val_loss: 0.5503 - val_binary_accuracy: 0.7196\n", - "Epoch 21/50\n", - "1/1 [==============================] - 0s 191ms/step - loss: 0.4528 - binary_accuracy: 0.7869 - val_loss: 0.5596 - val_binary_accuracy: 0.7205\n", - "Epoch 22/50\n", - "1/1 [==============================] - 0s 166ms/step - loss: 0.4710 - binary_accuracy: 0.7777 - val_loss: 0.5785 - val_binary_accuracy: 0.7214\n", - "Epoch 23/50\n", - "1/1 [==============================] - 0s 159ms/step - loss: 0.4347 - binary_accuracy: 0.7887 - val_loss: 0.5842 - val_binary_accuracy: 0.7315\n", - "Epoch 24/50\n", - "1/1 [==============================] - 0s 161ms/step - loss: 0.4550 - binary_accuracy: 0.7943 - val_loss: 0.5926 - val_binary_accuracy: 0.7463\n", - "Epoch 25/50\n", - "1/1 [==============================] - 0s 186ms/step - loss: 0.4489 - binary_accuracy: 0.7934 - val_loss: 0.6106 - val_binary_accuracy: 0.7546\n", - "Epoch 26/50\n", - "1/1 [==============================] - 0s 167ms/step - loss: 0.4785 - binary_accuracy: 0.8072 - val_loss: 0.5740 - val_binary_accuracy: 0.7426\n", - "Epoch 27/50\n", - "1/1 [==============================] - 0s 160ms/step - loss: 0.4423 - binary_accuracy: 0.8109 - val_loss: 0.5461 - val_binary_accuracy: 0.7325\n", - "Epoch 28/50\n", - "1/1 [==============================] - 0s 171ms/step - loss: 0.4339 - binary_accuracy: 0.7998 - val_loss: 0.5458 - val_binary_accuracy: 0.7352\n", - "Epoch 29/50\n", - "1/1 [==============================] - 0s 178ms/step - loss: 0.4246 - binary_accuracy: 0.7823 - val_loss: 0.5476 - val_binary_accuracy: 0.7389\n", - "Epoch 30/50\n", - "1/1 [==============================] - 0s 174ms/step - loss: 0.4116 - binary_accuracy: 0.8118 - val_loss: 0.5417 - val_binary_accuracy: 0.7445\n", - "Epoch 31/50\n", - "1/1 [==============================] - 0s 171ms/step - loss: 0.4014 - binary_accuracy: 0.8127 - val_loss: 0.5501 - val_binary_accuracy: 0.7509\n", - "Epoch 32/50\n", - "1/1 [==============================] - 0s 169ms/step - loss: 0.4131 - binary_accuracy: 0.8247 - val_loss: 0.6220 - val_binary_accuracy: 0.7638\n", - "Epoch 33/50\n", - "1/1 [==============================] - 0s 168ms/step - loss: 0.3686 - binary_accuracy: 0.8432 - val_loss: 0.6440 - val_binary_accuracy: 0.7675\n", - "Epoch 34/50\n", - "1/1 [==============================] - 0s 170ms/step - loss: 0.4433 - binary_accuracy: 0.8229 - val_loss: 0.6828 - val_binary_accuracy: 0.7749\n", - "Epoch 35/50\n", - "1/1 [==============================] - 0s 181ms/step - loss: 0.3986 - binary_accuracy: 0.8284 - val_loss: 0.6851 - val_binary_accuracy: 0.7804\n", - "Epoch 36/50\n", - "1/1 [==============================] - 0s 153ms/step - loss: 0.4363 - binary_accuracy: 0.8238 - val_loss: 0.6928 - val_binary_accuracy: 0.7786\n", - "Epoch 37/50\n", - "1/1 [==============================] - 0s 149ms/step - loss: 0.3599 - binary_accuracy: 0.8358 - val_loss: 0.6746 - val_binary_accuracy: 0.7823\n", - "Epoch 38/50\n", - "1/1 [==============================] - 0s 145ms/step - loss: 0.3536 - binary_accuracy: 0.8607 - val_loss: 0.6875 - val_binary_accuracy: 0.7860\n", - "Epoch 39/50\n", - "1/1 [==============================] - 0s 132ms/step - loss: 0.3590 - binary_accuracy: 0.8625 - val_loss: 0.6508 - val_binary_accuracy: 0.7887\n", - "Epoch 40/50\n", - "1/1 [==============================] - 0s 184ms/step - loss: 0.3271 - binary_accuracy: 0.8625 - val_loss: 0.6383 - val_binary_accuracy: 0.7860\n", - "Epoch 41/50\n", - "1/1 [==============================] - 0s 153ms/step - loss: 0.3478 - binary_accuracy: 0.8607 - val_loss: 0.5854 - val_binary_accuracy: 0.7887\n", - "Epoch 42/50\n", - "1/1 [==============================] - 0s 130ms/step - loss: 0.3369 - binary_accuracy: 0.8469 - val_loss: 0.6000 - val_binary_accuracy: 0.7934\n", - "Epoch 43/50\n", - "1/1 [==============================] - 0s 132ms/step - loss: 0.3354 - binary_accuracy: 0.8570 - val_loss: 0.5966 - val_binary_accuracy: 0.7961\n", - "Epoch 44/50\n", - "1/1 [==============================] - 0s 150ms/step - loss: 0.3160 - binary_accuracy: 0.8681 - val_loss: 0.5929 - val_binary_accuracy: 0.7961\n", - "Epoch 45/50\n", - "1/1 [==============================] - 0s 161ms/step - loss: 0.3216 - binary_accuracy: 0.8598 - val_loss: 0.6113 - val_binary_accuracy: 0.8026\n", - "Epoch 46/50\n", - "1/1 [==============================] - 0s 142ms/step - loss: 0.2983 - binary_accuracy: 0.8736 - val_loss: 0.6273 - val_binary_accuracy: 0.8109\n", - "Epoch 47/50\n", - "1/1 [==============================] - 0s 154ms/step - loss: 0.2900 - binary_accuracy: 0.8847 - val_loss: 0.6263 - val_binary_accuracy: 0.8155\n", - "Epoch 48/50\n", - "1/1 [==============================] - 0s 170ms/step - loss: 0.2880 - binary_accuracy: 0.8801 - val_loss: 0.6530 - val_binary_accuracy: 0.8146\n", - "Epoch 49/50\n", - "1/1 [==============================] - 0s 139ms/step - loss: 0.3026 - binary_accuracy: 0.8773 - val_loss: 0.7086 - val_binary_accuracy: 0.8173\n", - "Epoch 50/50\n", - "1/1 [==============================] - 0s 146ms/step - loss: 0.3128 - binary_accuracy: 0.8792 - val_loss: 0.7000 - val_binary_accuracy: 0.8146\n" - ] - } - ], + "outputs": [], "source": [ "history = model.fit(train_flow, validation_data=test_flow, epochs=50)" ] }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "id": "4d6f0caf-529a-4609-ade3-61715426e4b3", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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9+OPf/wjhg4dipSUFDz22GNISkrCzJkzu+11EhEREdHFUWyQnT17NkpLS7FkyRJYLBakpaVhw4YN8mStgoIC6PUNA8plZWW45557YLFY0KtXL4wdOxbbt2/HpZdeKh/z0EMPoaqqCj//+c9RXl6OSZMmYcOGDc0WTiAiIiIi5dNJEmcT+cpms8FsNsNqtcJkMnX36RARERFpjj95S5E1skRERERE7WGQJSIiIiJVYpAlIiIiIlVikCUiIiIiVWKQJSIiIiJVYpAlIiIiIlVikCUiIiIiVWKQJSIiIiJVUuzKXkrkWTvCZrN185kQERERaZMnZ/myZheDrB8qKioAAMnJyd18JkRERETaVlFRAbPZ3OYxXKLWDy6XC2fPnkVUVBR0Ol1An8tmsyE5ORmFhYVcDlel+B6qG98/deP7p258/9Sto++fJEmoqKhAUlIS9Pq2q2A5IusHvV6Pfv36delzmkwm/idWOb6H6sb3T934/qkb3z9168j7195IrAcnexERERGRKjHIEhEREZEqGZ544oknuvskqGUGgwFTpkxBUBArQNSK76G68f1TN75/6sb3T9266v3jZC8iIiIiUiWWFhARERGRKjHIEhEREZEqMcgSERERkSoxyBIRERGRKjHIEhEREZEqMcgSERERkSoxyBIRERGRKjHIEhEREZEqMcgSERERkSoxyBIRERGRKjHIEhEREZEqMcgSERERkSoxyBIRERGRKgV19wmoicvlwtmzZxEVFQWdTtfdp0NERESkOZIkoaKiAklJSdDr2x5zZZD1w9mzZ5GcnNzdp0FERESkeYWFhejXr1+bxygyyC5duhQffPABDh8+jLCwMEycOBHPPfccUlNTW73P66+/jrfffhuHDh0CAIwdOxbPPPMMxo8fLx+zYMECvPXWW173y8zMxIYNG3w6r6ioKADiH9ZkMvn7soiIiIioHTabDcnJyXLuaosig+zmzZuxePFiXHHFFaivr8cjjzyCG264Ad999x0iIiJavE9ubi7mzJmDiRMnIjQ0FM899xxuuOEGfPvtt+jbt6983LRp0/Dmm2/K141Go8/n5SknMJlMDLJEREREAeRLGadOkiSpC86lQ0pLSxEXF4fNmzfj6quv9uk+TqcTvXr1wiuvvIJ58+YBECOy5eXlWLdu3UWdh81mg9lshtVqZZAlIiIiCgB/8pYq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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "from stellargraph.utils import plot_history\n", "\n", @@ -417,6 +186,7 @@ "source": [] } ], + "metadata": { "kernelspec": { "display_name": "py3.8", diff --git a/docker/Dockerfile b/docker/Dockerfile index c39533c..f535327 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -49,6 +49,12 @@ RUN conda create -n chap5 python=3.8 RUN conda run -n chap5 pip install -r Chapter05/requirements.txt RUN conda run -n chap5 python -m ipykernel install --name chap5 --user +FROM base as chap-nn +RUN ls -d -1 */ | grep -v -e ChapterNN | xargs rm -rf +RUN conda create -n chap-nn python=3.8 +RUN conda run -n chap-nn pip install -r ChapterNN/requirements.txt +RUN conda run -n chap-nn python -m ipykernel install --name chap-nn --user + FROM base as chap6 RUN ls -d -1 */ | grep -v -e Chapter06 | xargs rm -rf RUN conda create -n chap6 python=3.8 From c7a655fd01390f74c62005bdf6664e4dc84569d2 Mon Sep 17 00:00:00 2001 From: Enrico Deusebio Date: Sun, 14 Apr 2024 22:14:44 +0000 Subject: [PATCH 5/9] small fixes --- ChapterNN/01_ImageClassification_TensorFlow.ipynb | 2 +- ChapterNN/02_ImageClassification_Pytorch.ipynb | 2 +- ChapterNN/03_Autoencoders.ipynb | 6 +++--- ChapterNN/04_GraphAutoEncoder_PyGeometric.ipynb | 6 +++--- ChapterNN/05_GraphAutoEncoder_StellarGraph.ipynb | 6 +++--- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/ChapterNN/01_ImageClassification_TensorFlow.ipynb b/ChapterNN/01_ImageClassification_TensorFlow.ipynb index eb02733..a81dd61 100644 --- a/ChapterNN/01_ImageClassification_TensorFlow.ipynb +++ b/ChapterNN/01_ImageClassification_TensorFlow.ipynb @@ -229,7 +229,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8" + "version": "3.8.18" } }, "nbformat": 4, diff --git a/ChapterNN/02_ImageClassification_Pytorch.ipynb b/ChapterNN/02_ImageClassification_Pytorch.ipynb index 2e3029c..0c3b17a 100644 --- a/ChapterNN/02_ImageClassification_Pytorch.ipynb +++ b/ChapterNN/02_ImageClassification_Pytorch.ipynb @@ -240,7 +240,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8" + "version": "3.8.18" } }, "nbformat": 4, diff --git a/ChapterNN/03_Autoencoders.ipynb b/ChapterNN/03_Autoencoders.ipynb index f03033b..af8b3e0 100644 --- a/ChapterNN/03_Autoencoders.ipynb +++ b/ChapterNN/03_Autoencoders.ipynb @@ -605,9 +605,9 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "chap-nn", "language": "python", - "name": "python3" + "name": "chap-nn" }, "language_info": { "codemirror_mode": { @@ -619,7 +619,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.3" + "version": "3.8.18" } }, "nbformat": 4, diff --git a/ChapterNN/04_GraphAutoEncoder_PyGeometric.ipynb b/ChapterNN/04_GraphAutoEncoder_PyGeometric.ipynb index 76aa5d0..5de12fb 100644 --- a/ChapterNN/04_GraphAutoEncoder_PyGeometric.ipynb +++ b/ChapterNN/04_GraphAutoEncoder_PyGeometric.ipynb @@ -166,9 +166,9 @@ ], "metadata": { "kernelspec": { - "display_name": "py3.8", + "display_name": "chap-nn", "language": "python", - "name": "py3.8" + "name": "chap-nn" }, "language_info": { "codemirror_mode": { @@ -180,7 +180,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.10" + "version": "3.8.18" } }, "nbformat": 4, diff --git a/ChapterNN/05_GraphAutoEncoder_StellarGraph.ipynb b/ChapterNN/05_GraphAutoEncoder_StellarGraph.ipynb index f61faae..887b9a8 100644 --- a/ChapterNN/05_GraphAutoEncoder_StellarGraph.ipynb +++ b/ChapterNN/05_GraphAutoEncoder_StellarGraph.ipynb @@ -189,9 +189,9 @@ "metadata": { "kernelspec": { - "display_name": "py3.8", + "display_name": "chap-nn", "language": "python", - "name": "py3.8" + "name": "chap-nn" }, "language_info": { "codemirror_mode": { @@ -203,7 +203,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.10" + "version": "3.8.18" } }, "nbformat": 4, From ca158e3d96b529f9268b4d01d8b4e026536f05b9 Mon Sep 17 00:00:00 2001 From: Enrico Deusebio Date: Mon, 15 Apr 2024 07:34:58 +0000 Subject: [PATCH 6/9] fix branch --- docker/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index f535327..d4e495a 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,7 +1,7 @@ FROM jupyter/scipy-notebook as base ARG user=euler -ARG branch=chap6 +ARG branch=main USER root From 8da6059fddb46049e55b46882bce82c7b4d2d04a Mon Sep 17 00:00:00 2001 From: Enrico Deusebio Date: Tue, 1 Oct 2024 23:08:27 +0200 Subject: [PATCH 7/9] adding NN chapter --- .github/workflows/ci.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index f3c7458..9446af9 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -21,6 +21,8 @@ jobs: folder: Chapter02 - name: chap3 folder: Chapter03 + - name: chap-nn + folder: ChapterNN - name: chap5 folder: Chapter05 - name: chap6 From 230b14f814eb90f991c39df68b6cb89453c40a76 Mon Sep 17 00:00:00 2001 From: Enrico Deusebio Date: Wed, 2 Oct 2024 08:34:50 +0200 Subject: [PATCH 8/9] general update + chardet --- ChapterNN/poetry.lock | 1926 ++++++++++++++++++++------------------ ChapterNN/pyproject.toml | 1 + 2 files changed, 1023 insertions(+), 904 deletions(-) diff --git a/ChapterNN/poetry.lock b/ChapterNN/poetry.lock index 9203f0f..d4e663c 100644 --- a/ChapterNN/poetry.lock +++ b/ChapterNN/poetry.lock @@ -11,101 +11,128 @@ files = [ {file = "absl_py-2.1.0-py3-none-any.whl", hash = "sha256:526a04eadab8b4ee719ce68f204172ead1027549089702d99b9059f129ff1308"}, ] +[[package]] +name = "aiohappyeyeballs" +version = "2.4.3" +description = "Happy Eyeballs for asyncio" +optional = false +python-versions = ">=3.8" +files = [ + {file = "aiohappyeyeballs-2.4.3-py3-none-any.whl", hash = "sha256:8a7a83727b2756f394ab2895ea0765a0a8c475e3c71e98d43d76f22b4b435572"}, + {file = "aiohappyeyeballs-2.4.3.tar.gz", hash = "sha256:75cf88a15106a5002a8eb1dab212525c00d1f4c0fa96e551c9fbe6f09a621586"}, +] + [[package]] name = "aiohttp" -version = "3.9.4" +version = "3.10.8" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.8" files = [ - {file = "aiohttp-3.9.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:76d32588ef7e4a3f3adff1956a0ba96faabbdee58f2407c122dd45aa6e34f372"}, - {file = "aiohttp-3.9.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:56181093c10dbc6ceb8a29dfeea1e815e1dfdc020169203d87fd8d37616f73f9"}, - {file = "aiohttp-3.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c7a5b676d3c65e88b3aca41816bf72831898fcd73f0cbb2680e9d88e819d1e4d"}, - {file = "aiohttp-3.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1df528a85fb404899d4207a8d9934cfd6be626e30e5d3a5544a83dbae6d8a7e"}, - {file = "aiohttp-3.9.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f595db1bceabd71c82e92df212dd9525a8a2c6947d39e3c994c4f27d2fe15b11"}, - {file = "aiohttp-3.9.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c0b09d76e5a4caac3d27752027fbd43dc987b95f3748fad2b924a03fe8632ad"}, - {file = "aiohttp-3.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:689eb4356649ec9535b3686200b231876fb4cab4aca54e3bece71d37f50c1d13"}, - {file = "aiohttp-3.9.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3666cf4182efdb44d73602379a66f5fdfd5da0db5e4520f0ac0dcca644a3497"}, - {file = "aiohttp-3.9.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b65b0f8747b013570eea2f75726046fa54fa8e0c5db60f3b98dd5d161052004a"}, - {file = "aiohttp-3.9.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a1885d2470955f70dfdd33a02e1749613c5a9c5ab855f6db38e0b9389453dce7"}, - {file = "aiohttp-3.9.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:0593822dcdb9483d41f12041ff7c90d4d1033ec0e880bcfaf102919b715f47f1"}, - {file = "aiohttp-3.9.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:47f6eb74e1ecb5e19a78f4a4228aa24df7fbab3b62d4a625d3f41194a08bd54f"}, - {file = "aiohttp-3.9.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c8b04a3dbd54de6ccb7604242fe3ad67f2f3ca558f2d33fe19d4b08d90701a89"}, - {file = "aiohttp-3.9.4-cp310-cp310-win32.whl", hash = "sha256:8a78dfb198a328bfb38e4308ca8167028920fb747ddcf086ce706fbdd23b2926"}, - {file = "aiohttp-3.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:e78da6b55275987cbc89141a1d8e75f5070e577c482dd48bd9123a76a96f0bbb"}, - {file = "aiohttp-3.9.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c111b3c69060d2bafc446917534150fd049e7aedd6cbf21ba526a5a97b4402a5"}, - {file = "aiohttp-3.9.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:efbdd51872cf170093998c87ccdf3cb5993add3559341a8e5708bcb311934c94"}, - {file = "aiohttp-3.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7bfdb41dc6e85d8535b00d73947548a748e9534e8e4fddd2638109ff3fb081df"}, - {file = "aiohttp-3.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2bd9d334412961125e9f68d5b73c1d0ab9ea3f74a58a475e6b119f5293eee7ba"}, - {file = "aiohttp-3.9.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:35d78076736f4a668d57ade00c65d30a8ce28719d8a42471b2a06ccd1a2e3063"}, - {file = "aiohttp-3.9.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:824dff4f9f4d0f59d0fa3577932ee9a20e09edec8a2f813e1d6b9f89ced8293f"}, - {file = "aiohttp-3.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:52b8b4e06fc15519019e128abedaeb56412b106ab88b3c452188ca47a25c4093"}, - {file = "aiohttp-3.9.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eae569fb1e7559d4f3919965617bb39f9e753967fae55ce13454bec2d1c54f09"}, - {file = "aiohttp-3.9.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:69b97aa5792428f321f72aeb2f118e56893371f27e0b7d05750bcad06fc42ca1"}, - {file = "aiohttp-3.9.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4d79aad0ad4b980663316f26d9a492e8fab2af77c69c0f33780a56843ad2f89e"}, - {file = "aiohttp-3.9.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:d6577140cd7db19e430661e4b2653680194ea8c22c994bc65b7a19d8ec834403"}, - {file = "aiohttp-3.9.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:9860d455847cd98eb67897f5957b7cd69fbcb436dd3f06099230f16a66e66f79"}, - {file = "aiohttp-3.9.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:69ff36d3f8f5652994e08bd22f093e11cfd0444cea310f92e01b45a4e46b624e"}, - {file = "aiohttp-3.9.4-cp311-cp311-win32.whl", hash = "sha256:e27d3b5ed2c2013bce66ad67ee57cbf614288bda8cdf426c8d8fe548316f1b5f"}, - {file = "aiohttp-3.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:d6a67e26daa686a6fbdb600a9af8619c80a332556245fa8e86c747d226ab1a1e"}, - {file = "aiohttp-3.9.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:c5ff8ff44825736a4065d8544b43b43ee4c6dd1530f3a08e6c0578a813b0aa35"}, - {file = "aiohttp-3.9.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d12a244627eba4e9dc52cbf924edef905ddd6cafc6513849b4876076a6f38b0e"}, - {file = "aiohttp-3.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:dcad56c8d8348e7e468899d2fb3b309b9bc59d94e6db08710555f7436156097f"}, - {file = "aiohttp-3.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f7e69a7fd4b5ce419238388e55abd220336bd32212c673ceabc57ccf3d05b55"}, - {file = "aiohttp-3.9.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4870cb049f10d7680c239b55428916d84158798eb8f353e74fa2c98980dcc0b"}, - {file = "aiohttp-3.9.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b2feaf1b7031ede1bc0880cec4b0776fd347259a723d625357bb4b82f62687b"}, - {file = "aiohttp-3.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:939393e8c3f0a5bcd33ef7ace67680c318dc2ae406f15e381c0054dd658397de"}, - {file = "aiohttp-3.9.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d2334e387b2adcc944680bebcf412743f2caf4eeebd550f67249c1c3696be04"}, - {file = "aiohttp-3.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e0198ea897680e480845ec0ffc5a14e8b694e25b3f104f63676d55bf76a82f1a"}, - {file = "aiohttp-3.9.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:e40d2cd22914d67c84824045861a5bb0fb46586b15dfe4f046c7495bf08306b2"}, - {file = "aiohttp-3.9.4-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:aba80e77c227f4234aa34a5ff2b6ff30c5d6a827a91d22ff6b999de9175d71bd"}, - {file = "aiohttp-3.9.4-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:fb68dc73bc8ac322d2e392a59a9e396c4f35cb6fdbdd749e139d1d6c985f2527"}, - {file = "aiohttp-3.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f3460a92638dce7e47062cf088d6e7663adb135e936cb117be88d5e6c48c9d53"}, - {file = "aiohttp-3.9.4-cp312-cp312-win32.whl", hash = "sha256:32dc814ddbb254f6170bca198fe307920f6c1308a5492f049f7f63554b88ef36"}, - {file = "aiohttp-3.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:63f41a909d182d2b78fe3abef557fcc14da50c7852f70ae3be60e83ff64edba5"}, - {file = "aiohttp-3.9.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c3770365675f6be220032f6609a8fbad994d6dcf3ef7dbcf295c7ee70884c9af"}, - {file = "aiohttp-3.9.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:305edae1dea368ce09bcb858cf5a63a064f3bff4767dec6fa60a0cc0e805a1d3"}, - {file = "aiohttp-3.9.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6f121900131d116e4a93b55ab0d12ad72573f967b100e49086e496a9b24523ea"}, - {file = "aiohttp-3.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b71e614c1ae35c3d62a293b19eface83d5e4d194e3eb2fabb10059d33e6e8cbf"}, - {file = "aiohttp-3.9.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:419f009fa4cfde4d16a7fc070d64f36d70a8d35a90d71aa27670bba2be4fd039"}, - {file = "aiohttp-3.9.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7b39476ee69cfe64061fd77a73bf692c40021f8547cda617a3466530ef63f947"}, - {file = "aiohttp-3.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b33f34c9c7decdb2ab99c74be6443942b730b56d9c5ee48fb7df2c86492f293c"}, - {file = "aiohttp-3.9.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c78700130ce2dcebb1a8103202ae795be2fa8c9351d0dd22338fe3dac74847d9"}, - {file = "aiohttp-3.9.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:268ba22d917655d1259af2d5659072b7dc11b4e1dc2cb9662fdd867d75afc6a4"}, - {file = "aiohttp-3.9.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:17e7c051f53a0d2ebf33013a9cbf020bb4e098c4bc5bce6f7b0c962108d97eab"}, - {file = "aiohttp-3.9.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:7be99f4abb008cb38e144f85f515598f4c2c8932bf11b65add0ff59c9c876d99"}, - {file = "aiohttp-3.9.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:d58a54d6ff08d2547656356eea8572b224e6f9bbc0cf55fa9966bcaac4ddfb10"}, - {file = "aiohttp-3.9.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7673a76772bda15d0d10d1aa881b7911d0580c980dbd16e59d7ba1422b2d83cd"}, - {file = "aiohttp-3.9.4-cp38-cp38-win32.whl", hash = "sha256:e4370dda04dc8951012f30e1ce7956a0a226ac0714a7b6c389fb2f43f22a250e"}, - {file = "aiohttp-3.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:eb30c4510a691bb87081192a394fb661860e75ca3896c01c6d186febe7c88530"}, - {file = "aiohttp-3.9.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:84e90494db7df3be5e056f91412f9fa9e611fbe8ce4aaef70647297f5943b276"}, - {file = "aiohttp-3.9.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7d4845f8501ab28ebfdbeab980a50a273b415cf69e96e4e674d43d86a464df9d"}, - {file = "aiohttp-3.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:69046cd9a2a17245c4ce3c1f1a4ff8c70c7701ef222fce3d1d8435f09042bba1"}, - {file = "aiohttp-3.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b73a06bafc8dcc508420db43b4dd5850e41e69de99009d0351c4f3007960019"}, - {file = "aiohttp-3.9.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:418bb0038dfafeac923823c2e63226179976c76f981a2aaad0ad5d51f2229bca"}, - {file = "aiohttp-3.9.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:71a8f241456b6c2668374d5d28398f8e8cdae4cce568aaea54e0f39359cd928d"}, - {file = "aiohttp-3.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:935c369bf8acc2dc26f6eeb5222768aa7c62917c3554f7215f2ead7386b33748"}, - {file = "aiohttp-3.9.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74e4e48c8752d14ecfb36d2ebb3d76d614320570e14de0a3aa7a726ff150a03c"}, - {file = "aiohttp-3.9.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:916b0417aeddf2c8c61291238ce25286f391a6acb6f28005dd9ce282bd6311b6"}, - {file = "aiohttp-3.9.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9b6787b6d0b3518b2ee4cbeadd24a507756ee703adbac1ab6dc7c4434b8c572a"}, - {file = "aiohttp-3.9.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:221204dbda5ef350e8db6287937621cf75e85778b296c9c52260b522231940ed"}, - {file = "aiohttp-3.9.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:10afd99b8251022ddf81eaed1d90f5a988e349ee7d779eb429fb07b670751e8c"}, - {file = "aiohttp-3.9.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2506d9f7a9b91033201be9ffe7d89c6a54150b0578803cce5cb84a943d075bc3"}, - {file = "aiohttp-3.9.4-cp39-cp39-win32.whl", hash = "sha256:e571fdd9efd65e86c6af2f332e0e95dad259bfe6beb5d15b3c3eca3a6eb5d87b"}, - {file = "aiohttp-3.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:7d29dd5319d20aa3b7749719ac9685fbd926f71ac8c77b2477272725f882072d"}, - {file = "aiohttp-3.9.4.tar.gz", hash = "sha256:6ff71ede6d9a5a58cfb7b6fffc83ab5d4a63138276c771ac91ceaaddf5459644"}, + {file = "aiohttp-3.10.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a1ba7bc139592339ddeb62c06486d0fa0f4ca61216e14137a40d626c81faf10c"}, + {file = "aiohttp-3.10.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:85e4d7bd05d18e4b348441e7584c681eff646e3bf38f68b2626807f3add21aa2"}, + {file = "aiohttp-3.10.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:69de056022e7abf69cb9fec795515973cc3eeaff51e3ea8d72a77aa933a91c52"}, + {file = "aiohttp-3.10.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee3587506898d4a404b33bd19689286ccf226c3d44d7a73670c8498cd688e42c"}, + {file = "aiohttp-3.10.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fe285a697c851734285369614443451462ce78aac2b77db23567507484b1dc6f"}, + {file = "aiohttp-3.10.8-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10c7932337285a6bfa3a5fe1fd4da90b66ebfd9d0cbd1544402e1202eb9a8c3e"}, + {file = "aiohttp-3.10.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd9716ef0224fe0d0336997eb242f40619f9f8c5c57e66b525a1ebf9f1d8cebe"}, + {file = "aiohttp-3.10.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ceacea31f8a55cdba02bc72c93eb2e1b77160e91f8abd605969c168502fd71eb"}, + {file = "aiohttp-3.10.8-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9721554bfa9e15f6e462da304374c2f1baede3cb06008c36c47fa37ea32f1dc4"}, + {file = "aiohttp-3.10.8-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:22cdeb684d8552490dd2697a5138c4ecb46f844892df437aaf94f7eea99af879"}, + {file = "aiohttp-3.10.8-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e56bb7e31c4bc79956b866163170bc89fd619e0581ce813330d4ea46921a4881"}, + {file = "aiohttp-3.10.8-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:3a95d2686bc4794d66bd8de654e41b5339fab542b2bca9238aa63ed5f4f2ce82"}, + {file = "aiohttp-3.10.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d82404a0e7b10e0d7f022cf44031b78af8a4f99bd01561ac68f7c24772fed021"}, + {file = "aiohttp-3.10.8-cp310-cp310-win32.whl", hash = "sha256:4e10b04542d27e21538e670156e88766543692a0a883f243ba8fad9ddea82e53"}, + {file = "aiohttp-3.10.8-cp310-cp310-win_amd64.whl", hash = "sha256:680dbcff5adc7f696ccf8bf671d38366a1f620b5616a1d333d0cb33956065395"}, + {file = "aiohttp-3.10.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:33a68011a38020ed4ff41ae0dbf4a96a202562ecf2024bdd8f65385f1d07f6ef"}, + {file = "aiohttp-3.10.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6c7efa6616a95e3bd73b8a69691012d2ef1f95f9ea0189e42f338fae080c2fc6"}, + {file = "aiohttp-3.10.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ddb9b9764cfb4459acf01c02d2a59d3e5066b06a846a364fd1749aa168efa2be"}, + {file = "aiohttp-3.10.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c7f270f4ca92760f98a42c45a58674fff488e23b144ec80b1cc6fa2effed377"}, + {file = "aiohttp-3.10.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6984dda9d79064361ab58d03f6c1e793ea845c6cfa89ffe1a7b9bb400dfd56bd"}, + {file = "aiohttp-3.10.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3f6d47e392c27206701565c8df4cac6ebed28fdf6dcaea5b1eea7a4631d8e6db"}, + {file = "aiohttp-3.10.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a72f89aea712c619b2ca32c6f4335c77125ede27530ad9705f4f349357833695"}, + {file = "aiohttp-3.10.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c36074b26f3263879ba8e4dbd33db2b79874a3392f403a70b772701363148b9f"}, + {file = "aiohttp-3.10.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e32148b4a745e70a255a1d44b5664de1f2e24fcefb98a75b60c83b9e260ddb5b"}, + {file = "aiohttp-3.10.8-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5aa1a073514cf59c81ad49a4ed9b5d72b2433638cd53160fd2f3a9cfa94718db"}, + {file = "aiohttp-3.10.8-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d3a79200a9d5e621c4623081ddb25380b713c8cf5233cd11c1aabad990bb9381"}, + {file = "aiohttp-3.10.8-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e45fdfcb2d5bcad83373e4808825b7512953146d147488114575780640665027"}, + {file = "aiohttp-3.10.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f78e2a78432c537ae876a93013b7bc0027ba5b93ad7b3463624c4b6906489332"}, + {file = "aiohttp-3.10.8-cp311-cp311-win32.whl", hash = "sha256:f8179855a4e4f3b931cb1764ec87673d3fbdcca2af496c8d30567d7b034a13db"}, + {file = "aiohttp-3.10.8-cp311-cp311-win_amd64.whl", hash = "sha256:ef9b484604af05ca745b6108ca1aaa22ae1919037ae4f93aaf9a37ba42e0b835"}, + {file = "aiohttp-3.10.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ab2d6523575fc98896c80f49ac99e849c0b0e69cc80bf864eed6af2ae728a52b"}, + {file = "aiohttp-3.10.8-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f5d5d5401744dda50b943d8764508d0e60cc2d3305ac1e6420935861a9d544bc"}, + {file = "aiohttp-3.10.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de23085cf90911600ace512e909114385026b16324fa203cc74c81f21fd3276a"}, + {file = "aiohttp-3.10.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4618f0d2bf523043866a9ff8458900d8eb0a6d4018f251dae98e5f1fb699f3a8"}, + {file = "aiohttp-3.10.8-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:21c1925541ca84f7b5e0df361c0a813a7d6a56d3b0030ebd4b220b8d232015f9"}, + {file = "aiohttp-3.10.8-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:497a7d20caea8855c5429db3cdb829385467217d7feb86952a6107e033e031b9"}, + {file = "aiohttp-3.10.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c887019dbcb4af58a091a45ccf376fffe800b5531b45c1efccda4bedf87747ea"}, + {file = "aiohttp-3.10.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40d2d719c3c36a7a65ed26400e2b45b2d9ed7edf498f4df38b2ae130f25a0d01"}, + {file = "aiohttp-3.10.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:57359785f27394a8bcab0da6dcd46706d087dfebf59a8d0ad2e64a4bc2f6f94f"}, + {file = "aiohttp-3.10.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a961ee6f2cdd1a2be4735333ab284691180d40bad48f97bb598841bfcbfb94ec"}, + {file = "aiohttp-3.10.8-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:fe3d79d6af839ffa46fdc5d2cf34295390894471e9875050eafa584cb781508d"}, + {file = "aiohttp-3.10.8-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9a281cba03bdaa341c70b7551b2256a88d45eead149f48b75a96d41128c240b3"}, + {file = "aiohttp-3.10.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c6769d71bfb1ed60321363a9bc05e94dcf05e38295ef41d46ac08919e5b00d19"}, + {file = "aiohttp-3.10.8-cp312-cp312-win32.whl", hash = "sha256:a3081246bab4d419697ee45e555cef5cd1def7ac193dff6f50be761d2e44f194"}, + {file = "aiohttp-3.10.8-cp312-cp312-win_amd64.whl", hash = "sha256:ab1546fc8e00676febc81c548a876c7bde32f881b8334b77f84719ab2c7d28dc"}, + {file = "aiohttp-3.10.8-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:b1a012677b8e0a39e181e218de47d6741c5922202e3b0b65e412e2ce47c39337"}, + {file = "aiohttp-3.10.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2df786c96c57cd6b87156ba4c5f166af7b88f3fc05f9d592252fdc83d8615a3c"}, + {file = "aiohttp-3.10.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8885ca09d3a9317219c0831276bfe26984b17b2c37b7bf70dd478d17092a4772"}, + {file = "aiohttp-3.10.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4dbf252ac19860e0ab56cd480d2805498f47c5a2d04f5995d8d8a6effd04b48c"}, + {file = "aiohttp-3.10.8-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b2036479b6b94afaaca7d07b8a68dc0e67b0caf5f6293bb6a5a1825f5923000"}, + {file = "aiohttp-3.10.8-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:365783e1b7c40b59ed4ce2b5a7491bae48f41cd2c30d52647a5b1ee8604c68ad"}, + {file = "aiohttp-3.10.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:270e653b5a4b557476a1ed40e6b6ce82f331aab669620d7c95c658ef976c9c5e"}, + {file = "aiohttp-3.10.8-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8960fabc20bfe4fafb941067cda8e23c8c17c98c121aa31c7bf0cdab11b07842"}, + {file = "aiohttp-3.10.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f21e8f2abed9a44afc3d15bba22e0dfc71e5fa859bea916e42354c16102b036f"}, + {file = "aiohttp-3.10.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:fecd55e7418fabd297fd836e65cbd6371aa4035a264998a091bbf13f94d9c44d"}, + {file = "aiohttp-3.10.8-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:badb51d851358cd7535b647bb67af4854b64f3c85f0d089c737f75504d5910ec"}, + {file = "aiohttp-3.10.8-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e860985f30f3a015979e63e7ba1a391526cdac1b22b7b332579df7867848e255"}, + {file = "aiohttp-3.10.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:71462f8eeca477cbc0c9700a9464e3f75f59068aed5e9d4a521a103692da72dc"}, + {file = "aiohttp-3.10.8-cp313-cp313-win32.whl", hash = "sha256:177126e971782769b34933e94fddd1089cef0fe6b82fee8a885e539f5b0f0c6a"}, + {file = "aiohttp-3.10.8-cp313-cp313-win_amd64.whl", hash = "sha256:98a4eb60e27033dee9593814ca320ee8c199489fbc6b2699d0f710584db7feb7"}, + {file = "aiohttp-3.10.8-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ffef3d763e4c8fc97e740da5b4d0f080b78630a3914f4e772a122bbfa608c1db"}, + {file = "aiohttp-3.10.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:597128cb7bc5f068181b49a732961f46cb89f85686206289d6ccb5e27cb5fbe2"}, + {file = "aiohttp-3.10.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f23a6c1d09de5de89a33c9e9b229106cb70dcfdd55e81a3a3580eaadaa32bc92"}, + {file = "aiohttp-3.10.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da57af0c54a302b7c655fa1ccd5b1817a53739afa39924ef1816e7b7c8a07ccb"}, + {file = "aiohttp-3.10.8-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e7a6af57091056a79a35104d6ec29d98ec7f1fb7270ad9c6fff871b678d1ff8"}, + {file = "aiohttp-3.10.8-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:32710d6b3b6c09c60c794d84ca887a3a2890131c0b02b3cefdcc6709a2260a7c"}, + {file = "aiohttp-3.10.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b91f4f62ad39a8a42d511d66269b46cb2fb7dea9564c21ab6c56a642d28bff5"}, + {file = "aiohttp-3.10.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:471a8c47344b9cc309558b3fcc469bd2c12b49322b4b31eb386c4a2b2d44e44a"}, + {file = "aiohttp-3.10.8-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:fc0e7f91705445d79beafba9bb3057dd50830e40fe5417017a76a214af54e122"}, + {file = "aiohttp-3.10.8-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:85431c9131a9a0f65260dc7a65c800ca5eae78c4c9931618f18c8e0933a0e0c1"}, + {file = "aiohttp-3.10.8-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:b91557ee0893da52794b25660d4f57bb519bcad8b7df301acd3898f7197c5d81"}, + {file = "aiohttp-3.10.8-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:4954e6b06dd0be97e1a5751fc606be1f9edbdc553c5d9b57d72406a8fbd17f9d"}, + {file = "aiohttp-3.10.8-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:a087c84b4992160ffef7afd98ef24177c8bd4ad61c53607145a8377457385100"}, + {file = "aiohttp-3.10.8-cp38-cp38-win32.whl", hash = "sha256:e1f0f7b27171b2956a27bd8f899751d0866ddabdd05cbddf3520f945130a908c"}, + {file = "aiohttp-3.10.8-cp38-cp38-win_amd64.whl", hash = "sha256:c4916070e12ae140110aa598031876c1bf8676a36a750716ea0aa5bd694aa2e7"}, + {file = "aiohttp-3.10.8-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5284997e3d88d0dfb874c43e51ae8f4a6f4ca5b90dcf22995035187253d430db"}, + {file = "aiohttp-3.10.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9443d9ebc5167ce1fbb552faf2d666fb22ef5716a8750be67efd140a7733738c"}, + {file = "aiohttp-3.10.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b667e2a03407d79a76c618dc30cedebd48f082d85880d0c9c4ec2faa3e10f43e"}, + {file = "aiohttp-3.10.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98fae99d5c2146f254b7806001498e6f9ffb0e330de55a35e72feb7cb2fa399b"}, + {file = "aiohttp-3.10.8-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8296edd99d0dd9d0eb8b9e25b3b3506eef55c1854e9cc230f0b3f885f680410b"}, + {file = "aiohttp-3.10.8-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1ce46dfb49cfbf9e92818be4b761d4042230b1f0e05ffec0aad15b3eb162b905"}, + {file = "aiohttp-3.10.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c38cfd355fd86c39b2d54651bd6ed7d63d4fe3b5553f364bae3306e2445f847"}, + {file = "aiohttp-3.10.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:713dff3f87ceec3bde4f3f484861464e722cf7533f9fa6b824ec82bb5a9010a7"}, + {file = "aiohttp-3.10.8-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:21a72f4a9c69a8567a0aca12042f12bba25d3139fd5dd8eeb9931f4d9e8599cd"}, + {file = "aiohttp-3.10.8-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:6d1ad868624f6cea77341ef2877ad4e71f7116834a6cd7ec36ec5c32f94ee6ae"}, + {file = "aiohttp-3.10.8-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:a78ba86d5a08207d1d1ad10b97aed6ea48b374b3f6831d02d0b06545ac0f181e"}, + {file = "aiohttp-3.10.8-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:aff048793d05e1ce05b62e49dccf81fe52719a13f4861530706619506224992b"}, + {file = "aiohttp-3.10.8-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d088ca05381fd409793571d8e34eca06daf41c8c50a05aeed358d2d340c7af81"}, + {file = "aiohttp-3.10.8-cp39-cp39-win32.whl", hash = "sha256:ee97c4e54f457c366e1f76fbbf3e8effee9de57dae671084a161c00f481106ce"}, + {file = "aiohttp-3.10.8-cp39-cp39-win_amd64.whl", hash = "sha256:d95ae4420669c871667aad92ba8cce6251d61d79c1a38504621094143f94a8b4"}, + {file = "aiohttp-3.10.8.tar.gz", hash = "sha256:21f8225f7dc187018e8433c9326be01477fb2810721e048b33ac49091b19fb4a"}, ] [package.dependencies] +aiohappyeyeballs = ">=2.3.0" aiosignal = ">=1.1.2" async-timeout = {version = ">=4.0,<5.0", markers = "python_version < \"3.11\""} attrs = ">=17.3.0" frozenlist = ">=1.1.1" multidict = ">=4.5,<7.0" -yarl = ">=1.0,<2.0" +yarl = ">=1.12.0,<2.0" [package.extras] -speedups = ["Brotli", "aiodns", "brotlicffi"] +speedups = ["Brotli", "aiodns (>=3.2.0)", "brotlicffi"] [[package]] name = "aiosignal" @@ -178,22 +205,22 @@ files = [ [[package]] name = "attrs" -version = "23.2.0" +version = "24.2.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.7" files = [ - {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, - {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, + {file = "attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2"}, + {file = "attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346"}, ] [package.extras] -cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] -dev = ["attrs[tests]", "pre-commit"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] -tests = ["attrs[tests-no-zope]", "zope-interface"] -tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] -tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] +benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] [[package]] name = "backcall" @@ -208,90 +235,116 @@ files = [ [[package]] name = "cachetools" -version = "5.3.3" +version = "5.5.0" description = "Extensible memoizing collections and decorators" optional = false python-versions = ">=3.7" files = [ - {file = "cachetools-5.3.3-py3-none-any.whl", hash = "sha256:0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945"}, - {file = "cachetools-5.3.3.tar.gz", hash = "sha256:ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105"}, + {file = "cachetools-5.5.0-py3-none-any.whl", hash = "sha256:02134e8439cdc2ffb62023ce1debca2944c3f289d66bb17ead3ab3dede74b292"}, + {file = "cachetools-5.5.0.tar.gz", hash = "sha256:2cc24fb4cbe39633fb7badd9db9ca6295d766d9c2995f245725a46715d050f2a"}, ] [[package]] name = "certifi" -version = "2024.2.2" +version = "2024.8.30" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, - {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, + {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, + {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, ] [[package]] name = "cffi" -version = "1.16.0" +version = "1.17.1" description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.8" files = [ - {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, - {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, - {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, - {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, - {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, - {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, - {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, - {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, - {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, - {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, - {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, - {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, - {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, - {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, - {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, - {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, - {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, - {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, - {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, - {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, - {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, - {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, - {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, - {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, - {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, - {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, - {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, + {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"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be"}, + {file = "cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c"}, + {file = "cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"}, + {file = "cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655"}, + {file = "cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8"}, + {file = "cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65"}, + {file = "cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9"}, + {file = "cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d"}, + {file = "cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a"}, + {file = "cffi-1.17.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1"}, + {file = "cffi-1.17.1-cp38-cp38-win32.whl", hash = "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8"}, + {file = "cffi-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e"}, + {file = "cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7"}, + {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, + {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, ] [package.dependencies] pycparser = "*" +[[package]] +name = "chardet" +version = "5.2.0" +description = "Universal encoding detector for Python 3" +optional = false +python-versions = ">=3.7" +files = [ + {file = "chardet-5.2.0-py3-none-any.whl", hash = "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970"}, + {file = "chardet-5.2.0.tar.gz", hash = "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7"}, +] + [[package]] name = "charset-normalizer" version = "3.3.2" @@ -436,33 +489,33 @@ tests = ["pytest", "pytest-cov", "pytest-xdist"] [[package]] name = "debugpy" -version = "1.8.1" +version = "1.8.6" description = "An implementation of the Debug Adapter Protocol for Python" optional = false python-versions = ">=3.8" files = [ - {file = "debugpy-1.8.1-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:3bda0f1e943d386cc7a0e71bfa59f4137909e2ed947fb3946c506e113000f741"}, - {file = "debugpy-1.8.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dda73bf69ea479c8577a0448f8c707691152e6c4de7f0c4dec5a4bc11dee516e"}, - {file = "debugpy-1.8.1-cp310-cp310-win32.whl", hash = "sha256:3a79c6f62adef994b2dbe9fc2cc9cc3864a23575b6e387339ab739873bea53d0"}, - {file = "debugpy-1.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:7eb7bd2b56ea3bedb009616d9e2f64aab8fc7000d481faec3cd26c98a964bcdd"}, - {file = "debugpy-1.8.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:016a9fcfc2c6b57f939673c874310d8581d51a0fe0858e7fac4e240c5eb743cb"}, - {file = "debugpy-1.8.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd97ed11a4c7f6d042d320ce03d83b20c3fb40da892f994bc041bbc415d7a099"}, - {file = "debugpy-1.8.1-cp311-cp311-win32.whl", hash = "sha256:0de56aba8249c28a300bdb0672a9b94785074eb82eb672db66c8144fff673146"}, - {file = "debugpy-1.8.1-cp311-cp311-win_amd64.whl", hash = "sha256:1a9fe0829c2b854757b4fd0a338d93bc17249a3bf69ecf765c61d4c522bb92a8"}, - {file = "debugpy-1.8.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:3ebb70ba1a6524d19fa7bb122f44b74170c447d5746a503e36adc244a20ac539"}, - {file = "debugpy-1.8.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2e658a9630f27534e63922ebf655a6ab60c370f4d2fc5c02a5b19baf4410ace"}, - {file = "debugpy-1.8.1-cp312-cp312-win32.whl", hash = "sha256:caad2846e21188797a1f17fc09c31b84c7c3c23baf2516fed5b40b378515bbf0"}, - {file = "debugpy-1.8.1-cp312-cp312-win_amd64.whl", hash = "sha256:edcc9f58ec0fd121a25bc950d4578df47428d72e1a0d66c07403b04eb93bcf98"}, - {file = "debugpy-1.8.1-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:7a3afa222f6fd3d9dfecd52729bc2e12c93e22a7491405a0ecbf9e1d32d45b39"}, - {file = "debugpy-1.8.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d915a18f0597ef685e88bb35e5d7ab968964b7befefe1aaea1eb5b2640b586c7"}, - {file = "debugpy-1.8.1-cp38-cp38-win32.whl", hash = "sha256:92116039b5500633cc8d44ecc187abe2dfa9b90f7a82bbf81d079fcdd506bae9"}, - {file = "debugpy-1.8.1-cp38-cp38-win_amd64.whl", hash = "sha256:e38beb7992b5afd9d5244e96ad5fa9135e94993b0c551ceebf3fe1a5d9beb234"}, - {file = "debugpy-1.8.1-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:bfb20cb57486c8e4793d41996652e5a6a885b4d9175dd369045dad59eaacea42"}, - {file = "debugpy-1.8.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efd3fdd3f67a7e576dd869c184c5dd71d9aaa36ded271939da352880c012e703"}, - {file = "debugpy-1.8.1-cp39-cp39-win32.whl", hash = "sha256:58911e8521ca0c785ac7a0539f1e77e0ce2df753f786188f382229278b4cdf23"}, - {file = "debugpy-1.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:6df9aa9599eb05ca179fb0b810282255202a66835c6efb1d112d21ecb830ddd3"}, - {file = "debugpy-1.8.1-py2.py3-none-any.whl", hash = "sha256:28acbe2241222b87e255260c76741e1fbf04fdc3b6d094fcf57b6c6f75ce1242"}, - {file = "debugpy-1.8.1.zip", hash = "sha256:f696d6be15be87aef621917585f9bb94b1dc9e8aced570db1b8a6fc14e8f9b42"}, + {file = "debugpy-1.8.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:30f467c5345d9dfdcc0afdb10e018e47f092e383447500f125b4e013236bf14b"}, + {file = "debugpy-1.8.6-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d73d8c52614432f4215d0fe79a7e595d0dd162b5c15233762565be2f014803b"}, + {file = "debugpy-1.8.6-cp310-cp310-win32.whl", hash = "sha256:e3e182cd98eac20ee23a00653503315085b29ab44ed66269482349d307b08df9"}, + {file = "debugpy-1.8.6-cp310-cp310-win_amd64.whl", hash = "sha256:e3a82da039cfe717b6fb1886cbbe5c4a3f15d7df4765af857f4307585121c2dd"}, + {file = "debugpy-1.8.6-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:67479a94cf5fd2c2d88f9615e087fcb4fec169ec780464a3f2ba4a9a2bb79955"}, + {file = "debugpy-1.8.6-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fb8653f6cbf1dd0a305ac1aa66ec246002145074ea57933978346ea5afdf70b"}, + {file = "debugpy-1.8.6-cp311-cp311-win32.whl", hash = "sha256:cdaf0b9691879da2d13fa39b61c01887c34558d1ff6e5c30e2eb698f5384cd43"}, + {file = "debugpy-1.8.6-cp311-cp311-win_amd64.whl", hash = "sha256:43996632bee7435583952155c06881074b9a742a86cee74e701d87ca532fe833"}, + {file = "debugpy-1.8.6-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:db891b141fc6ee4b5fc6d1cc8035ec329cabc64bdd2ae672b4550c87d4ecb128"}, + {file = "debugpy-1.8.6-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:567419081ff67da766c898ccf21e79f1adad0e321381b0dfc7a9c8f7a9347972"}, + {file = "debugpy-1.8.6-cp312-cp312-win32.whl", hash = "sha256:c9834dfd701a1f6bf0f7f0b8b1573970ae99ebbeee68314116e0ccc5c78eea3c"}, + {file = "debugpy-1.8.6-cp312-cp312-win_amd64.whl", hash = "sha256:e4ce0570aa4aca87137890d23b86faeadf184924ad892d20c54237bcaab75d8f"}, + {file = "debugpy-1.8.6-cp38-cp38-macosx_14_0_x86_64.whl", hash = "sha256:df5dc9eb4ca050273b8e374a4cd967c43be1327eeb42bfe2f58b3cdfe7c68dcb"}, + {file = "debugpy-1.8.6-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a85707c6a84b0c5b3db92a2df685b5230dd8fb8c108298ba4f11dba157a615a"}, + {file = "debugpy-1.8.6-cp38-cp38-win32.whl", hash = "sha256:538c6cdcdcdad310bbefd96d7850be1cd46e703079cc9e67d42a9ca776cdc8a8"}, + {file = "debugpy-1.8.6-cp38-cp38-win_amd64.whl", hash = "sha256:22140bc02c66cda6053b6eb56dfe01bbe22a4447846581ba1dd6df2c9f97982d"}, + {file = "debugpy-1.8.6-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:c1cef65cffbc96e7b392d9178dbfd524ab0750da6c0023c027ddcac968fd1caa"}, + {file = "debugpy-1.8.6-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1e60bd06bb3cc5c0e957df748d1fab501e01416c43a7bdc756d2a992ea1b881"}, + {file = "debugpy-1.8.6-cp39-cp39-win32.whl", hash = "sha256:f7158252803d0752ed5398d291dee4c553bb12d14547c0e1843ab74ee9c31123"}, + {file = "debugpy-1.8.6-cp39-cp39-win_amd64.whl", hash = "sha256:3358aa619a073b620cd0d51d8a6176590af24abcc3fe2e479929a154bf591b51"}, + {file = "debugpy-1.8.6-py2.py3-none-any.whl", hash = "sha256:b48892df4d810eff21d3ef37274f4c60d32cdcafc462ad5647239036b0f0649f"}, + {file = "debugpy-1.8.6.zip", hash = "sha256:c931a9371a86784cee25dec8d65bc2dc7a21f3f1552e3833d9ef8f919d22280a"}, ] [[package]] @@ -478,13 +531,13 @@ files = [ [[package]] name = "executing" -version = "2.0.1" +version = "2.1.0" description = "Get the currently executing AST node of a frame, and other information" optional = false -python-versions = ">=3.5" +python-versions = ">=3.8" files = [ - {file = "executing-2.0.1-py2.py3-none-any.whl", hash = "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc"}, - {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"}, + {file = "executing-2.1.0-py2.py3-none-any.whl", hash = "sha256:8d63781349375b5ebccc3142f4b30350c0cd9c79f921cde38be2be4637e98eaf"}, + {file = "executing-2.1.0.tar.gz", hash = "sha256:8ea27ddd260da8150fa5a708269c4a10e76161e2496ec3e587da9e3c0fe4b9ab"}, ] [package.extras] @@ -492,19 +545,19 @@ tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipyth [[package]] name = "filelock" -version = "3.13.4" +version = "3.16.1" description = "A platform independent file lock." optional = false python-versions = ">=3.8" files = [ - {file = "filelock-3.13.4-py3-none-any.whl", hash = "sha256:404e5e9253aa60ad457cae1be07c0f0ca90a63931200a47d9b6a6af84fd7b45f"}, - {file = "filelock-3.13.4.tar.gz", hash = "sha256:d13f466618bfde72bd2c18255e269f72542c6e70e7bac83a0232d6b1cc5c8cf4"}, + {file = "filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0"}, + {file = "filelock-3.16.1.tar.gz", hash = "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435"}, ] [package.extras] -docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] -typing = ["typing-extensions (>=4.8)"] +docs = ["furo (>=2024.8.6)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4.1)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.6.1)", "diff-cover (>=9.2)", "pytest (>=8.3.3)", "pytest-asyncio (>=0.24)", "pytest-cov (>=5)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.26.4)"] +typing = ["typing-extensions (>=4.12.2)"] [[package]] name = "flatbuffers" @@ -605,13 +658,13 @@ files = [ [[package]] name = "fsspec" -version = "2024.3.1" +version = "2024.9.0" description = "File-system specification" optional = false python-versions = ">=3.8" files = [ - {file = "fsspec-2024.3.1-py3-none-any.whl", hash = "sha256:918d18d41bf73f0e2b261824baeb1b124bcf771767e3a26425cd7dec3332f512"}, - {file = "fsspec-2024.3.1.tar.gz", hash = "sha256:f39780e282d7d117ffb42bb96992f8a90795e4d0fb0f661a70ca39fe9c43ded9"}, + {file = "fsspec-2024.9.0-py3-none-any.whl", hash = "sha256:a0947d552d8a6efa72cc2c730b12c41d043509156966cca4fb157b0f2a0c574b"}, + {file = "fsspec-2024.9.0.tar.gz", hash = "sha256:4b0afb90c2f21832df142f292649035d80b421f60a9e1c027802e5a0da2b04e8"}, ] [package.extras] @@ -619,7 +672,8 @@ abfs = ["adlfs"] adl = ["adlfs"] arrow = ["pyarrow (>=1)"] dask = ["dask", "distributed"] -devel = ["pytest", "pytest-cov"] +dev = ["pre-commit", "ruff"] +doc = ["numpydoc", "sphinx", "sphinx-design", "sphinx-rtd-theme", "yarl"] dropbox = ["dropbox", "dropboxdrivefs", "requests"] full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "dask", "distributed", "dropbox", "dropboxdrivefs", "fusepy", "gcsfs", "libarchive-c", "ocifs", "panel", "paramiko", "pyarrow (>=1)", "pygit2", "requests", "s3fs", "smbprotocol", "tqdm"] fuse = ["fusepy"] @@ -636,6 +690,9 @@ s3 = ["s3fs"] sftp = ["paramiko"] smb = ["smbprotocol"] ssh = ["paramiko"] +test = ["aiohttp (!=4.0.0a0,!=4.0.0a1)", "numpy", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "requests"] +test-downstream = ["aiobotocore (>=2.5.4,<3.0.0)", "dask-expr", "dask[dataframe,test]", "moto[server] (>4,<5)", "pytest-timeout", "xarray"] +test-full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "cloudpickle", "dask", "distributed", "dropbox", "dropboxdrivefs", "fastparquet", "fusepy", "gcsfs", "jinja2", "kerchunk", "libarchive-c", "lz4", "notebook", "numpy", "ocifs", "pandas", "panel", "paramiko", "pyarrow", "pyarrow (>=1)", "pyftpdlib", "pygit2", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "python-snappy", "requests", "smbprotocol", "tqdm", "urllib3", "zarr", "zstandard"] tqdm = ["tqdm"] [[package]] @@ -651,54 +708,59 @@ files = [ [[package]] name = "gensim" -version = "4.3.2" +version = "4.3.3" description = "Python framework for fast Vector Space Modelling" optional = false python-versions = ">=3.8" files = [ - {file = "gensim-4.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:31b3cb313939b6940ee21660177f6405e71b920da462dbf065b2458a24ab33e1"}, - {file = "gensim-4.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:67c41b15e19e4950f57124f633c45839b5c84268ffa58079c5b0c0f04d2a9cb9"}, - {file = "gensim-4.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9bf1a8ee2e8214499c517008a0fd175ce5c649954a88569358cfae6bfca42dc"}, - {file = "gensim-4.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e34ee6f8a318fbf0b65e6d39a985ecf9e9051febfd1221ae6255fff1972c547"}, - {file = "gensim-4.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:c46b7395dc57c83329932f3febed9660891fdcc75327d56f55000e3e08898983"}, - {file = "gensim-4.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a919493339cfad39d5e76768c1bc546cd507f715c5fca93165cc174a97657457"}, - {file = "gensim-4.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8dcd1419266bd563c371d25530f4dce3505fe78059b2c0c08724e4f9e5479b38"}, - {file = "gensim-4.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3e8035ac3f54dca3a8ca56bec526ddfe5b23006e0134b7375ca5f5dbfaef70a"}, - {file = "gensim-4.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c3b537c1fd4699c8e6d59c3ffa2fdd9918cd4e5555bf5ee7c1fbedd89b2d643"}, - {file = "gensim-4.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:5a52001226f9e89f7833503f99c9b4fd028fdf837002f24cdc1bc3cf901a4003"}, - {file = "gensim-4.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e8d62604efb8281a25254e5a6c14227034c267ed56635e590c9cae2635196dca"}, - {file = "gensim-4.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bf7a9dc37c2ca465c7834863a7b264369c1373bb474135df225cee654b8adfab"}, - {file = "gensim-4.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a33ff0d4cf3e50e7ddd7353fb38ed2d4af2e48a6ef58d622809862c30c8b8a2"}, - {file = "gensim-4.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99876be00b73c7cef01f427d241b07eb1c1b298fb411580cc1067d22c43a13be"}, - {file = "gensim-4.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:f785b3caf376a1f2989e0f3c890642e5b1566393fd3831dab03fc6670d672814"}, - {file = "gensim-4.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c86915cf0e0b86658a40a070bd7e04db0814065963657e92910303070275865d"}, - {file = "gensim-4.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:548c7bf983e619d6b8d78b6a5321dcbcba5b39f68779a0d36e38a5a971416276"}, - {file = "gensim-4.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:226690ea081b92a2289661a25e8a89069ae09b1ed4137b67a0d6ec211e0371d3"}, - {file = "gensim-4.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4715eafcd309c2f7e030829eddba72fe47bbe9bb466811fce3158127d29c8979"}, - {file = "gensim-4.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b3f26299ac241ff54329a54c37c22eac1bf4c4a337068adf2637259ee0d8484a"}, - {file = "gensim-4.3.2.tar.gz", hash = "sha256:99ac6af6ffd40682e70155ed9f92ecbf4384d59fb50af120d343ea5ee1b308ab"}, + {file = "gensim-4.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4e72840adfbea35c5804fd559bc0cb6bc9f439926220a37d852b7ce76eb325c1"}, + {file = "gensim-4.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4019263c9d9afae7c669f880c17e09461e77a71afce04ed4d79cf71a4cad2848"}, + {file = "gensim-4.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dea62d3e2ada547687bde6cbba37efa50b534db77e9d44fd5802676bb072c9d9"}, + {file = "gensim-4.3.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fac93ef5e44982defef9d3c1e4cd00245506b8a29cec19ec5e00f0221b8144c"}, + {file = "gensim-4.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:7c3409f755fb8d62da99cea65e7a40a99d21f8fd86443a3aaf2d90eb68995021"}, + {file = "gensim-4.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:99e7b70352aecc6c1674dde82b75f453e7a5d1cc71ac1cfbc460bf1fe20501b7"}, + {file = "gensim-4.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:32a4cac3f3c38af2069eab9524609fc92ebaeb2692b7280cfda365a3517a280a"}, + {file = "gensim-4.3.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c071b4329ed1be02446eb7ef637b94c68cf0080c15c57fbcde667fce2e49c3fe"}, + {file = "gensim-4.3.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d662bf96e3d741b6ab61a54be842a7cbf5e45193008b2f4225c758cafd7f9cdc"}, + {file = "gensim-4.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:a54bd53a0e6f991abb837f126663353657270e75be53287e8a568ada0b35b1b0"}, + {file = "gensim-4.3.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:9a65ed1a8c1fc83890b4eb2a45ae2b32e82a0209c970c8c74694d0374c2415cb"}, + {file = "gensim-4.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4db485e08a0287e0fd6a029d89b90913d1df38f1dcd34cd2ab758873ba9255f3"}, + {file = "gensim-4.3.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7198987116373ab99f034b292a04ac841531d12b56345851c98b40a3fcd93a85"}, + {file = "gensim-4.3.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6237a50de4da7a037b19b2b6c430b6537243dcdedebf94afeb089e951953e601"}, + {file = "gensim-4.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:c910c2d5a71f532273166a3a82762959973f0513b221a495fa5a2a07652ee66d"}, + {file = "gensim-4.3.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d7efa5e35d3f0ec02e6e8343b623c2c863be99e8c26866cf0bebd24fb10198c"}, + {file = "gensim-4.3.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2e8eaf5ef576f4d45e98cf87e7edda9afb469dff954a923402dc1ffc35195901"}, + {file = "gensim-4.3.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9161e52a6ec2a0580df66e9fac4ff7fc43efdc40674fbd4dd9e914796cc68bc3"}, + {file = "gensim-4.3.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a200d6ac522cdf91e6048e1a368318c6b1b6e0c79009dfd408345ea2b9d3c096"}, + {file = "gensim-4.3.3-cp38-cp38-win_amd64.whl", hash = "sha256:065547124a93948926b88cb854e1c09750e9a4c7be92f55858159aa8a23359c3"}, + {file = "gensim-4.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688a13b9bba839fedc7f3da6806d5701a756ed940839702ba6d7f494e917baef"}, + {file = "gensim-4.3.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c560d28133cca58078221d60fce346f98f2c5e93d2ad42942f32c0d60903f65b"}, + {file = "gensim-4.3.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:832311f0c420c0841c98b9e6cc4d83ea362add6db917bf2d646de4bed48a29f7"}, + {file = "gensim-4.3.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1049f5bc2a84b21a1cb9976741826c0ebf25cfdff4a888361db4b4a697d99f0d"}, + {file = "gensim-4.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:e99b236b6638a30d7f878e2e21a94dab2f6d4b4fd3c242f44dca1341940cb0cb"}, + {file = "gensim-4.3.3.tar.gz", hash = "sha256:84852076a6a3d88d7dac5be245e24c21c3b819b565e14c1b61fa3e5ee76dcf57"}, ] [package.dependencies] -numpy = ">=1.18.5" -scipy = ">=1.7.0" +numpy = ">=1.18.5,<2.0" +scipy = ">=1.7.0,<1.14.0" smart-open = ">=1.8.1" [package.extras] distributed = ["Pyro4 (>=4.27)"] -docs = ["POT", "Pyro4", "Pyro4 (>=4.27)", "annoy", "matplotlib", "memory-profiler", "mock", "nltk", "pandas", "pytest", "pytest-cov", "scikit-learn", "sphinx (==5.1.1)", "sphinx-gallery (==0.11.1)", "sphinxcontrib-napoleon (==0.7)", "sphinxcontrib.programoutput (==0.17)", "statsmodels", "testfixtures", "visdom (>=0.1.8,!=0.1.8.7)"] -test = ["POT", "mock", "pytest", "pytest-cov", "testfixtures", "visdom (>=0.1.8,!=0.1.8.7)"] -test-win = ["POT", "mock", "pytest", "pytest-cov", "testfixtures"] +docs = ["POT", "Pyro4", "Pyro4 (>=4.27)", "annoy", "matplotlib", "memory-profiler", "nltk", "pandas", "pytest", "pytest-cov", "scikit-learn", "sphinx (==5.1.1)", "sphinx-gallery (==0.11.1)", "sphinxcontrib-napoleon (==0.7)", "sphinxcontrib.programoutput (==0.17)", "statsmodels", "testfixtures", "visdom (>=0.1.8,!=0.1.8.7)"] +test = ["POT", "pytest", "pytest-cov", "testfixtures", "visdom (>=0.1.8,!=0.1.8.7)"] +test-win = ["POT", "pytest", "pytest-cov", "testfixtures"] [[package]] name = "google-auth" -version = "2.29.0" +version = "2.35.0" description = "Google Authentication Library" optional = false python-versions = ">=3.7" files = [ - {file = "google-auth-2.29.0.tar.gz", hash = "sha256:672dff332d073227550ffc7457868ac4218d6c500b155fe6cc17d2b13602c360"}, - {file = "google_auth-2.29.0-py2.py3-none-any.whl", hash = "sha256:d452ad095688cd52bae0ad6fafe027f6a6d6f560e810fec20914e17a09526415"}, + {file = "google_auth-2.35.0-py2.py3-none-any.whl", hash = "sha256:25df55f327ef021de8be50bad0dfd4a916ad0de96da86cd05661c9297723ad3f"}, + {file = "google_auth-2.35.0.tar.gz", hash = "sha256:f4c64ed4e01e8e8b646ef34c018f8bf3338df0c8e37d8b3bba40e7f574a3278a"}, ] [package.dependencies] @@ -708,7 +770,7 @@ rsa = ">=3.1.4,<5" [package.extras] aiohttp = ["aiohttp (>=3.6.2,<4.0.0.dev0)", "requests (>=2.20.0,<3.0.0.dev0)"] -enterprise-cert = ["cryptography (==36.0.2)", "pyopenssl (==22.0.0)"] +enterprise-cert = ["cryptography", "pyopenssl"] pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] reauth = ["pyu2f (>=0.1.5)"] requests = ["requests (>=2.20.0,<3.0.0.dev0)"] @@ -748,69 +810,70 @@ six = "*" [[package]] name = "grpcio" -version = "1.62.1" +version = "1.66.2" description = "HTTP/2-based RPC framework" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "grpcio-1.62.1-cp310-cp310-linux_armv7l.whl", hash = "sha256:179bee6f5ed7b5f618844f760b6acf7e910988de77a4f75b95bbfaa8106f3c1e"}, - {file = "grpcio-1.62.1-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:48611e4fa010e823ba2de8fd3f77c1322dd60cb0d180dc6630a7e157b205f7ea"}, - {file = "grpcio-1.62.1-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:b2a0e71b0a2158aa4bce48be9f8f9eb45cbd17c78c7443616d00abbe2a509f6d"}, - {file = "grpcio-1.62.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fbe80577c7880911d3ad65e5ecc997416c98f354efeba2f8d0f9112a67ed65a5"}, - {file = "grpcio-1.62.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58f6c693d446964e3292425e1d16e21a97a48ba9172f2d0df9d7b640acb99243"}, - {file = "grpcio-1.62.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:77c339403db5a20ef4fed02e4d1a9a3d9866bf9c0afc77a42234677313ea22f3"}, - {file = "grpcio-1.62.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b5a4ea906db7dec694098435d84bf2854fe158eb3cd51e1107e571246d4d1d70"}, - {file = "grpcio-1.62.1-cp310-cp310-win32.whl", hash = "sha256:4187201a53f8561c015bc745b81a1b2d278967b8de35f3399b84b0695e281d5f"}, - {file = "grpcio-1.62.1-cp310-cp310-win_amd64.whl", hash = "sha256:844d1f3fb11bd1ed362d3fdc495d0770cfab75761836193af166fee113421d66"}, - {file = "grpcio-1.62.1-cp311-cp311-linux_armv7l.whl", hash = "sha256:833379943d1728a005e44103f17ecd73d058d37d95783eb8f0b28ddc1f54d7b2"}, - {file = "grpcio-1.62.1-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:c7fcc6a32e7b7b58f5a7d27530669337a5d587d4066060bcb9dee7a8c833dfb7"}, - {file = "grpcio-1.62.1-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:fa7d28eb4d50b7cbe75bb8b45ed0da9a1dc5b219a0af59449676a29c2eed9698"}, - {file = "grpcio-1.62.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48f7135c3de2f298b833be8b4ae20cafe37091634e91f61f5a7eb3d61ec6f660"}, - {file = "grpcio-1.62.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:71f11fd63365ade276c9d4a7b7df5c136f9030e3457107e1791b3737a9b9ed6a"}, - {file = "grpcio-1.62.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4b49fd8fe9f9ac23b78437da94c54aa7e9996fbb220bac024a67469ce5d0825f"}, - {file = "grpcio-1.62.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:482ae2ae78679ba9ed5752099b32e5fe580443b4f798e1b71df412abf43375db"}, - {file = "grpcio-1.62.1-cp311-cp311-win32.whl", hash = "sha256:1faa02530b6c7426404372515fe5ddf66e199c2ee613f88f025c6f3bd816450c"}, - {file = "grpcio-1.62.1-cp311-cp311-win_amd64.whl", hash = "sha256:5bd90b8c395f39bc82a5fb32a0173e220e3f401ff697840f4003e15b96d1befc"}, - {file = "grpcio-1.62.1-cp312-cp312-linux_armv7l.whl", hash = "sha256:b134d5d71b4e0837fff574c00e49176051a1c532d26c052a1e43231f252d813b"}, - {file = "grpcio-1.62.1-cp312-cp312-macosx_10_10_universal2.whl", hash = "sha256:d1f6c96573dc09d50dbcbd91dbf71d5cf97640c9427c32584010fbbd4c0e0037"}, - {file = "grpcio-1.62.1-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:359f821d4578f80f41909b9ee9b76fb249a21035a061a327f91c953493782c31"}, - {file = "grpcio-1.62.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a485f0c2010c696be269184bdb5ae72781344cb4e60db976c59d84dd6354fac9"}, - {file = "grpcio-1.62.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b50b09b4dc01767163d67e1532f948264167cd27f49e9377e3556c3cba1268e1"}, - {file = "grpcio-1.62.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3227c667dccbe38f2c4d943238b887bac588d97c104815aecc62d2fd976e014b"}, - {file = "grpcio-1.62.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3952b581eb121324853ce2b191dae08badb75cd493cb4e0243368aa9e61cfd41"}, - {file = "grpcio-1.62.1-cp312-cp312-win32.whl", hash = "sha256:83a17b303425104d6329c10eb34bba186ffa67161e63fa6cdae7776ff76df73f"}, - {file = "grpcio-1.62.1-cp312-cp312-win_amd64.whl", hash = "sha256:6696ffe440333a19d8d128e88d440f91fb92c75a80ce4b44d55800e656a3ef1d"}, - {file = "grpcio-1.62.1-cp37-cp37m-linux_armv7l.whl", hash = "sha256:e3393b0823f938253370ebef033c9fd23d27f3eae8eb9a8f6264900c7ea3fb5a"}, - {file = "grpcio-1.62.1-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:83e7ccb85a74beaeae2634f10eb858a0ed1a63081172649ff4261f929bacfd22"}, - {file = "grpcio-1.62.1-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:882020c87999d54667a284c7ddf065b359bd00251fcd70279ac486776dbf84ec"}, - {file = "grpcio-1.62.1-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a10383035e864f386fe096fed5c47d27a2bf7173c56a6e26cffaaa5a361addb1"}, - {file = "grpcio-1.62.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:960edebedc6b9ada1ef58e1c71156f28689978188cd8cff3b646b57288a927d9"}, - {file = "grpcio-1.62.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:23e2e04b83f347d0aadde0c9b616f4726c3d76db04b438fd3904b289a725267f"}, - {file = "grpcio-1.62.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:978121758711916d34fe57c1f75b79cdfc73952f1481bb9583399331682d36f7"}, - {file = "grpcio-1.62.1-cp37-cp37m-win_amd64.whl", hash = "sha256:9084086190cc6d628f282e5615f987288b95457292e969b9205e45b442276407"}, - {file = "grpcio-1.62.1-cp38-cp38-linux_armv7l.whl", hash = "sha256:22bccdd7b23c420a27fd28540fb5dcbc97dc6be105f7698cb0e7d7a420d0e362"}, - {file = "grpcio-1.62.1-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:8999bf1b57172dbc7c3e4bb3c732658e918f5c333b2942243f10d0d653953ba9"}, - {file = "grpcio-1.62.1-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:d9e52558b8b8c2f4ac05ac86344a7417ccdd2b460a59616de49eb6933b07a0bd"}, - {file = "grpcio-1.62.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1714e7bc935780bc3de1b3fcbc7674209adf5208ff825799d579ffd6cd0bd505"}, - {file = "grpcio-1.62.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8842ccbd8c0e253c1f189088228f9b433f7a93b7196b9e5b6f87dba393f5d5d"}, - {file = "grpcio-1.62.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1f1e7b36bdff50103af95a80923bf1853f6823dd62f2d2a2524b66ed74103e49"}, - {file = "grpcio-1.62.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bba97b8e8883a8038606480d6b6772289f4c907f6ba780fa1f7b7da7dfd76f06"}, - {file = "grpcio-1.62.1-cp38-cp38-win32.whl", hash = "sha256:a7f615270fe534548112a74e790cd9d4f5509d744dd718cd442bf016626c22e4"}, - {file = "grpcio-1.62.1-cp38-cp38-win_amd64.whl", hash = "sha256:e6c8c8693df718c5ecbc7babb12c69a4e3677fd11de8886f05ab22d4e6b1c43b"}, - {file = "grpcio-1.62.1-cp39-cp39-linux_armv7l.whl", hash = "sha256:73db2dc1b201d20ab7083e7041946910bb991e7e9761a0394bbc3c2632326483"}, - {file = "grpcio-1.62.1-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:407b26b7f7bbd4f4751dbc9767a1f0716f9fe72d3d7e96bb3ccfc4aace07c8de"}, - {file = "grpcio-1.62.1-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:f8de7c8cef9261a2d0a62edf2ccea3d741a523c6b8a6477a340a1f2e417658de"}, - {file = "grpcio-1.62.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd5c8a1af40ec305d001c60236308a67e25419003e9bb3ebfab5695a8d0b369"}, - {file = "grpcio-1.62.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be0477cb31da67846a33b1a75c611f88bfbcd427fe17701b6317aefceee1b96f"}, - {file = "grpcio-1.62.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:60dcd824df166ba266ee0cfaf35a31406cd16ef602b49f5d4dfb21f014b0dedd"}, - {file = "grpcio-1.62.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:973c49086cabab773525f6077f95e5a993bfc03ba8fc32e32f2c279497780585"}, - {file = "grpcio-1.62.1-cp39-cp39-win32.whl", hash = "sha256:12859468e8918d3bd243d213cd6fd6ab07208195dc140763c00dfe901ce1e1b4"}, - {file = "grpcio-1.62.1-cp39-cp39-win_amd64.whl", hash = "sha256:b7209117bbeebdfa5d898205cc55153a51285757902dd73c47de498ad4d11332"}, - {file = "grpcio-1.62.1.tar.gz", hash = "sha256:6c455e008fa86d9e9a9d85bb76da4277c0d7d9668a3bfa70dbe86e9f3c759947"}, + {file = "grpcio-1.66.2-cp310-cp310-linux_armv7l.whl", hash = "sha256:fe96281713168a3270878255983d2cb1a97e034325c8c2c25169a69289d3ecfa"}, + {file = "grpcio-1.66.2-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:73fc8f8b9b5c4a03e802b3cd0c18b2b06b410d3c1dcbef989fdeb943bd44aff7"}, + {file = "grpcio-1.66.2-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:03b0b307ba26fae695e067b94cbb014e27390f8bc5ac7a3a39b7723fed085604"}, + {file = "grpcio-1.66.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d69ce1f324dc2d71e40c9261d3fdbe7d4c9d60f332069ff9b2a4d8a257c7b2b"}, + {file = "grpcio-1.66.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05bc2ceadc2529ab0b227b1310d249d95d9001cd106aa4d31e8871ad3c428d73"}, + {file = "grpcio-1.66.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8ac475e8da31484efa25abb774674d837b343afb78bb3bcdef10f81a93e3d6bf"}, + {file = "grpcio-1.66.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0be4e0490c28da5377283861bed2941d1d20ec017ca397a5df4394d1c31a9b50"}, + {file = "grpcio-1.66.2-cp310-cp310-win32.whl", hash = "sha256:4e504572433f4e72b12394977679161d495c4c9581ba34a88d843eaf0f2fbd39"}, + {file = "grpcio-1.66.2-cp310-cp310-win_amd64.whl", hash = "sha256:2018b053aa15782db2541ca01a7edb56a0bf18c77efed975392583725974b249"}, + {file = "grpcio-1.66.2-cp311-cp311-linux_armv7l.whl", hash = "sha256:2335c58560a9e92ac58ff2bc5649952f9b37d0735608242973c7a8b94a6437d8"}, + {file = "grpcio-1.66.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:45a3d462826f4868b442a6b8fdbe8b87b45eb4f5b5308168c156b21eca43f61c"}, + {file = "grpcio-1.66.2-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:a9539f01cb04950fd4b5ab458e64a15f84c2acc273670072abe49a3f29bbad54"}, + {file = "grpcio-1.66.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce89f5876662f146d4c1f695dda29d4433a5d01c8681fbd2539afff535da14d4"}, + {file = "grpcio-1.66.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d25a14af966438cddf498b2e338f88d1c9706f3493b1d73b93f695c99c5f0e2a"}, + {file = "grpcio-1.66.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6001e575b8bbd89eee11960bb640b6da6ae110cf08113a075f1e2051cc596cae"}, + {file = "grpcio-1.66.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4ea1d062c9230278793820146c95d038dc0f468cbdd172eec3363e42ff1c7d01"}, + {file = "grpcio-1.66.2-cp311-cp311-win32.whl", hash = "sha256:38b68498ff579a3b1ee8f93a05eb48dc2595795f2f62716e797dc24774c1aaa8"}, + {file = "grpcio-1.66.2-cp311-cp311-win_amd64.whl", hash = "sha256:6851de821249340bdb100df5eacfecfc4e6075fa85c6df7ee0eb213170ec8e5d"}, + {file = "grpcio-1.66.2-cp312-cp312-linux_armv7l.whl", hash = "sha256:802d84fd3d50614170649853d121baaaa305de7b65b3e01759247e768d691ddf"}, + {file = "grpcio-1.66.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:80fd702ba7e432994df208f27514280b4b5c6843e12a48759c9255679ad38db8"}, + {file = "grpcio-1.66.2-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:12fda97ffae55e6526825daf25ad0fa37483685952b5d0f910d6405c87e3adb6"}, + {file = "grpcio-1.66.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:950da58d7d80abd0ea68757769c9db0a95b31163e53e5bb60438d263f4bed7b7"}, + {file = "grpcio-1.66.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e636ce23273683b00410f1971d209bf3689238cf5538d960adc3cdfe80dd0dbd"}, + {file = "grpcio-1.66.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:a917d26e0fe980b0ac7bfcc1a3c4ad6a9a4612c911d33efb55ed7833c749b0ee"}, + {file = "grpcio-1.66.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:49f0ca7ae850f59f828a723a9064cadbed90f1ece179d375966546499b8a2c9c"}, + {file = "grpcio-1.66.2-cp312-cp312-win32.whl", hash = "sha256:31fd163105464797a72d901a06472860845ac157389e10f12631025b3e4d0453"}, + {file = "grpcio-1.66.2-cp312-cp312-win_amd64.whl", hash = "sha256:ff1f7882e56c40b0d33c4922c15dfa30612f05fb785074a012f7cda74d1c3679"}, + {file = "grpcio-1.66.2-cp313-cp313-linux_armv7l.whl", hash = "sha256:3b00efc473b20d8bf83e0e1ae661b98951ca56111feb9b9611df8efc4fe5d55d"}, + {file = "grpcio-1.66.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1caa38fb22a8578ab8393da99d4b8641e3a80abc8fd52646f1ecc92bcb8dee34"}, + {file = "grpcio-1.66.2-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:c408f5ef75cfffa113cacd8b0c0e3611cbfd47701ca3cdc090594109b9fcbaed"}, + {file = "grpcio-1.66.2-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c806852deaedee9ce8280fe98955c9103f62912a5b2d5ee7e3eaa284a6d8d8e7"}, + {file = "grpcio-1.66.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f145cc21836c332c67baa6fc81099d1d27e266401565bf481948010d6ea32d46"}, + {file = "grpcio-1.66.2-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:73e3b425c1e155730273f73e419de3074aa5c5e936771ee0e4af0814631fb30a"}, + {file = "grpcio-1.66.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:9c509a4f78114cbc5f0740eb3d7a74985fd2eff022971bc9bc31f8bc93e66a3b"}, + {file = "grpcio-1.66.2-cp313-cp313-win32.whl", hash = "sha256:20657d6b8cfed7db5e11b62ff7dfe2e12064ea78e93f1434d61888834bc86d75"}, + {file = "grpcio-1.66.2-cp313-cp313-win_amd64.whl", hash = "sha256:fb70487c95786e345af5e854ffec8cb8cc781bcc5df7930c4fbb7feaa72e1cdf"}, + {file = "grpcio-1.66.2-cp38-cp38-linux_armv7l.whl", hash = "sha256:a18e20d8321c6400185b4263e27982488cb5cdd62da69147087a76a24ef4e7e3"}, + {file = "grpcio-1.66.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:02697eb4a5cbe5a9639f57323b4c37bcb3ab2d48cec5da3dc2f13334d72790dd"}, + {file = "grpcio-1.66.2-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:99a641995a6bc4287a6315989ee591ff58507aa1cbe4c2e70d88411c4dcc0839"}, + {file = "grpcio-1.66.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ed71e81782966ffead60268bbda31ea3f725ebf8aa73634d5dda44f2cf3fb9c"}, + {file = "grpcio-1.66.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbd27c24a4cc5e195a7f56cfd9312e366d5d61b86e36d46bbe538457ea6eb8dd"}, + {file = "grpcio-1.66.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d9a9724a156c8ec6a379869b23ba3323b7ea3600851c91489b871e375f710bc8"}, + {file = "grpcio-1.66.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d8d4732cc5052e92cea2f78b233c2e2a52998ac40cd651f40e398893ad0d06ec"}, + {file = "grpcio-1.66.2-cp38-cp38-win32.whl", hash = "sha256:7b2c86457145ce14c38e5bf6bdc19ef88e66c5fee2c3d83285c5aef026ba93b3"}, + {file = "grpcio-1.66.2-cp38-cp38-win_amd64.whl", hash = "sha256:e88264caad6d8d00e7913996030bac8ad5f26b7411495848cc218bd3a9040b6c"}, + {file = "grpcio-1.66.2-cp39-cp39-linux_armv7l.whl", hash = "sha256:c400ba5675b67025c8a9f48aa846f12a39cf0c44df5cd060e23fda5b30e9359d"}, + {file = "grpcio-1.66.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:66a0cd8ba6512b401d7ed46bb03f4ee455839957f28b8d61e7708056a806ba6a"}, + {file = "grpcio-1.66.2-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:06de8ec0bd71be123eec15b0e0d457474931c2c407869b6c349bd9bed4adbac3"}, + {file = "grpcio-1.66.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fb57870449dfcfac428afbb5a877829fcb0d6db9d9baa1148705739e9083880e"}, + {file = "grpcio-1.66.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b672abf90a964bfde2d0ecbce30f2329a47498ba75ce6f4da35a2f4532b7acbc"}, + {file = "grpcio-1.66.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ad2efdbe90c73b0434cbe64ed372e12414ad03c06262279b104a029d1889d13e"}, + {file = "grpcio-1.66.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9c3a99c519f4638e700e9e3f83952e27e2ea10873eecd7935823dab0c1c9250e"}, + {file = "grpcio-1.66.2-cp39-cp39-win32.whl", hash = "sha256:78fa51ebc2d9242c0fc5db0feecc57a9943303b46664ad89921f5079e2e4ada7"}, + {file = "grpcio-1.66.2-cp39-cp39-win_amd64.whl", hash = "sha256:728bdf36a186e7f51da73be7f8d09457a03061be848718d0edf000e709418987"}, + {file = "grpcio-1.66.2.tar.gz", hash = "sha256:563588c587b75c34b928bc428548e5b00ea38c46972181a4d8b75ba7e3f24231"}, ] [package.extras] -protobuf = ["grpcio-tools (>=1.62.1)"] +protobuf = ["grpcio-tools (>=1.66.2)"] [[package]] name = "h5py" @@ -847,43 +910,50 @@ numpy = ">=1.17.3" [[package]] name = "idna" -version = "3.7" +version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" files = [ - {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, - {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, ] +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + [[package]] name = "importlib-metadata" -version = "7.1.0" +version = "8.5.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-7.1.0-py3-none-any.whl", hash = "sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570"}, - {file = "importlib_metadata-7.1.0.tar.gz", hash = "sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2"}, + {file = "importlib_metadata-8.5.0-py3-none-any.whl", hash = "sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b"}, + {file = "importlib_metadata-8.5.0.tar.gz", hash = "sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7"}, ] [package.dependencies] -zipp = ">=0.5" +zipp = ">=3.20" [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +enabler = ["pytest-enabler (>=2.2)"] perf = ["ipython"] -testing = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] +test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] +type = ["pytest-mypy"] [[package]] name = "ipykernel" -version = "6.29.4" +version = "6.29.5" description = "IPython Kernel for Jupyter" optional = false python-versions = ">=3.8" files = [ - {file = "ipykernel-6.29.4-py3-none-any.whl", hash = "sha256:1181e653d95c6808039c509ef8e67c4126b3b3af7781496c7cbfb5ed938a27da"}, - {file = "ipykernel-6.29.4.tar.gz", hash = "sha256:3d44070060f9475ac2092b760123fadf105d2e2493c24848b6691a7c4f42af5c"}, + {file = "ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5"}, + {file = "ipykernel-6.29.5.tar.gz", hash = "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215"}, ] [package.dependencies] @@ -968,13 +1038,13 @@ testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] [[package]] name = "jinja2" -version = "3.1.3" +version = "3.1.4" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" files = [ - {file = "Jinja2-3.1.3-py3-none-any.whl", hash = "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa"}, - {file = "Jinja2-3.1.3.tar.gz", hash = "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90"}, + {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, + {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, ] [package.dependencies] @@ -985,24 +1055,24 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "joblib" -version = "1.4.0" +version = "1.4.2" description = "Lightweight pipelining with Python functions" optional = false python-versions = ">=3.8" files = [ - {file = "joblib-1.4.0-py3-none-any.whl", hash = "sha256:42942470d4062537be4d54c83511186da1fc14ba354961a2114da91efa9a4ed7"}, - {file = "joblib-1.4.0.tar.gz", hash = "sha256:1eb0dc091919cd384490de890cb5dfd538410a6d4b3b54eef09fb8c50b409b1c"}, + {file = "joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6"}, + {file = "joblib-1.4.2.tar.gz", hash = "sha256:2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e"}, ] [[package]] name = "jupyter-client" -version = "8.6.1" +version = "8.6.3" description = "Jupyter protocol implementation and client libraries" optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_client-8.6.1-py3-none-any.whl", hash = "sha256:3b7bd22f058434e3b9a7ea4b1500ed47de2713872288c0d511d19926f99b459f"}, - {file = "jupyter_client-8.6.1.tar.gz", hash = "sha256:e842515e2bab8e19186d89fdfea7abd15e39dd581f94e399f00e2af5a1652d3f"}, + {file = "jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f"}, + {file = "jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419"}, ] [package.dependencies] @@ -1015,7 +1085,7 @@ traitlets = ">=5.3" [package.extras] docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx (>=4)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] -test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] +test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest (<8.2.0)", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] [[package]] name = "jupyter-core" @@ -1069,115 +1139,125 @@ tests = ["Pillow", "keras", "pandas", "pytest", "pytest-cov", "pytest-xdist", "t [[package]] name = "kiwisolver" -version = "1.4.5" +version = "1.4.7" description = "A fast implementation of the Cassowary constraint solver" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af"}, - {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:146d14bebb7f1dc4d5fbf74f8a6cb15ac42baadee8912eb84ac0b3b2a3dc6ac3"}, - {file = "kiwisolver-1.4.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ef7afcd2d281494c0a9101d5c571970708ad911d028137cd558f02b851c08b4"}, - {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9eaa8b117dc8337728e834b9c6e2611f10c79e38f65157c4c38e9400286f5cb1"}, - {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ec20916e7b4cbfb1f12380e46486ec4bcbaa91a9c448b97023fde0d5bbf9e4ff"}, - {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39b42c68602539407884cf70d6a480a469b93b81b7701378ba5e2328660c847a"}, - {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa12042de0171fad672b6c59df69106d20d5596e4f87b5e8f76df757a7c399aa"}, - {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a40773c71d7ccdd3798f6489aaac9eee213d566850a9533f8d26332d626b82c"}, - {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:19df6e621f6d8b4b9c4d45f40a66839294ff2bb235e64d2178f7522d9170ac5b"}, - {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:83d78376d0d4fd884e2c114d0621624b73d2aba4e2788182d286309ebdeed770"}, - {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e391b1f0a8a5a10ab3b9bb6afcfd74f2175f24f8975fb87ecae700d1503cdee0"}, - {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:852542f9481f4a62dbb5dd99e8ab7aedfeb8fb6342349a181d4036877410f525"}, - {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59edc41b24031bc25108e210c0def6f6c2191210492a972d585a06ff246bb79b"}, - {file = "kiwisolver-1.4.5-cp310-cp310-win32.whl", hash = "sha256:a6aa6315319a052b4ee378aa171959c898a6183f15c1e541821c5c59beaa0238"}, - {file = "kiwisolver-1.4.5-cp310-cp310-win_amd64.whl", hash = "sha256:d0ef46024e6a3d79c01ff13801cb19d0cad7fd859b15037aec74315540acc276"}, - {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:11863aa14a51fd6ec28688d76f1735f8f69ab1fabf388851a595d0721af042f5"}, - {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90"}, - {file = "kiwisolver-1.4.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797"}, - {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dfdd7c0b105af050eb3d64997809dc21da247cf44e63dc73ff0fd20b96be55a9"}, - {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437"}, - {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbea0db94288e29afcc4c28afbf3a7ccaf2d7e027489c449cf7e8f83c6346eb9"}, - {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ceec1a6bc6cab1d6ff5d06592a91a692f90ec7505d6463a88a52cc0eb58545da"}, - {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e"}, - {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f91de7223d4c7b793867797bacd1ee53bfe7359bd70d27b7b58a04efbb9436c8"}, - {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:faae4860798c31530dd184046a900e652c95513796ef51a12bc086710c2eec4d"}, - {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0157420efcb803e71d1b28e2c287518b8808b7cf1ab8af36718fd0a2c453eb0"}, - {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:06f54715b7737c2fecdbf140d1afb11a33d59508a47bf11bb38ecf21dc9ab79f"}, - {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f"}, - {file = "kiwisolver-1.4.5-cp311-cp311-win32.whl", hash = "sha256:bb86433b1cfe686da83ce32a9d3a8dd308e85c76b60896d58f082136f10bffac"}, - {file = "kiwisolver-1.4.5-cp311-cp311-win_amd64.whl", hash = "sha256:6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355"}, - {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a"}, - {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192"}, - {file = "kiwisolver-1.4.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5ff5cf3571589b6d13bfbfd6bcd7a3f659e42f96b5fd1c4830c4cf21d4f5ef45"}, - {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7269d9e5f1084a653d575c7ec012ff57f0c042258bf5db0954bf551c158466e7"}, - {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da802a19d6e15dffe4b0c24b38b3af68e6c1a68e6e1d8f30148c83864f3881db"}, - {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3aba7311af82e335dd1e36ffff68aaca609ca6290c2cb6d821a39aa075d8e3ff"}, - {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:763773d53f07244148ccac5b084da5adb90bfaee39c197554f01b286cf869228"}, - {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2270953c0d8cdab5d422bee7d2007f043473f9d2999631c86a223c9db56cbd16"}, - {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d099e745a512f7e3bbe7249ca835f4d357c586d78d79ae8f1dcd4d8adeb9bda9"}, - {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:74db36e14a7d1ce0986fa104f7d5637aea5c82ca6326ed0ec5694280942d1162"}, - {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e5bab140c309cb3a6ce373a9e71eb7e4873c70c2dda01df6820474f9889d6d4"}, - {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0f114aa76dc1b8f636d077979c0ac22e7cd8f3493abbab152f20eb8d3cda71f3"}, - {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:88a2df29d4724b9237fc0c6eaf2a1adae0cdc0b3e9f4d8e7dc54b16812d2d81a"}, - {file = "kiwisolver-1.4.5-cp312-cp312-win32.whl", hash = "sha256:72d40b33e834371fd330fb1472ca19d9b8327acb79a5821d4008391db8e29f20"}, - {file = "kiwisolver-1.4.5-cp312-cp312-win_amd64.whl", hash = "sha256:2c5674c4e74d939b9d91dda0fae10597ac7521768fec9e399c70a1f27e2ea2d9"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3a2b053a0ab7a3960c98725cfb0bf5b48ba82f64ec95fe06f1d06c99b552e130"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cd32d6c13807e5c66a7cbb79f90b553642f296ae4518a60d8d76243b0ad2898"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59ec7b7c7e1a61061850d53aaf8e93db63dce0c936db1fda2658b70e4a1be709"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da4cfb373035def307905d05041c1d06d8936452fe89d464743ae7fb8371078b"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2400873bccc260b6ae184b2b8a4fec0e4082d30648eadb7c3d9a13405d861e89"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1b04139c4236a0f3aff534479b58f6f849a8b351e1314826c2d230849ed48985"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:4e66e81a5779b65ac21764c295087de82235597a2293d18d943f8e9e32746265"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7931d8f1f67c4be9ba1dd9c451fb0eeca1a25b89e4d3f89e828fe12a519b782a"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b3f7e75f3015df442238cca659f8baa5f42ce2a8582727981cbfa15fee0ee205"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:bbf1d63eef84b2e8c89011b7f2235b1e0bf7dacc11cac9431fc6468e99ac77fb"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4c380469bd3f970ef677bf2bcba2b6b0b4d5c75e7a020fb863ef75084efad66f"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-win32.whl", hash = "sha256:9408acf3270c4b6baad483865191e3e582b638b1654a007c62e3efe96f09a9a3"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-win_amd64.whl", hash = "sha256:5b94529f9b2591b7af5f3e0e730a4e0a41ea174af35a4fd067775f9bdfeee01a"}, - {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:11c7de8f692fc99816e8ac50d1d1aef4f75126eefc33ac79aac02c099fd3db71"}, - {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:53abb58632235cd154176ced1ae8f0d29a6657aa1aa9decf50b899b755bc2b93"}, - {file = "kiwisolver-1.4.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:88b9f257ca61b838b6f8094a62418421f87ac2a1069f7e896c36a7d86b5d4c29"}, - {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3195782b26fc03aa9c6913d5bad5aeb864bdc372924c093b0f1cebad603dd712"}, - {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc579bf0f502e54926519451b920e875f433aceb4624a3646b3252b5caa9e0b6"}, - {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a580c91d686376f0f7c295357595c5a026e6cbc3d77b7c36e290201e7c11ecb"}, - {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cfe6ab8da05c01ba6fbea630377b5da2cd9bcbc6338510116b01c1bc939a2c18"}, - {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d2e5a98f0ec99beb3c10e13b387f8db39106d53993f498b295f0c914328b1333"}, - {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a51a263952b1429e429ff236d2f5a21c5125437861baeed77f5e1cc2d2c7c6da"}, - {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3edd2fa14e68c9be82c5b16689e8d63d89fe927e56debd6e1dbce7a26a17f81b"}, - {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:74d1b44c6cfc897df648cc9fdaa09bc3e7679926e6f96df05775d4fb3946571c"}, - {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:76d9289ed3f7501012e05abb8358bbb129149dbd173f1f57a1bf1c22d19ab7cc"}, - {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:92dea1ffe3714fa8eb6a314d2b3c773208d865a0e0d35e713ec54eea08a66250"}, - {file = "kiwisolver-1.4.5-cp38-cp38-win32.whl", hash = "sha256:5c90ae8c8d32e472be041e76f9d2f2dbff4d0b0be8bd4041770eddb18cf49a4e"}, - {file = "kiwisolver-1.4.5-cp38-cp38-win_amd64.whl", hash = "sha256:c7940c1dc63eb37a67721b10d703247552416f719c4188c54e04334321351ced"}, - {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9407b6a5f0d675e8a827ad8742e1d6b49d9c1a1da5d952a67d50ef5f4170b18d"}, - {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15568384086b6df3c65353820a4473575dbad192e35010f622c6ce3eebd57af9"}, - {file = "kiwisolver-1.4.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0dc9db8e79f0036e8173c466d21ef18e1befc02de8bf8aa8dc0813a6dc8a7046"}, - {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cdc8a402aaee9a798b50d8b827d7ecf75edc5fb35ea0f91f213ff927c15f4ff0"}, - {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6c3bd3cde54cafb87d74d8db50b909705c62b17c2099b8f2e25b461882e544ff"}, - {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:955e8513d07a283056b1396e9a57ceddbd272d9252c14f154d450d227606eb54"}, - {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:346f5343b9e3f00b8db8ba359350eb124b98c99efd0b408728ac6ebf38173958"}, - {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9098e0049e88c6a24ff64545cdfc50807818ba6c1b739cae221bbbcbc58aad3"}, - {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:00bd361b903dc4bbf4eb165f24d1acbee754fce22ded24c3d56eec268658a5cf"}, - {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7b8b454bac16428b22560d0a1cf0a09875339cab69df61d7805bf48919415901"}, - {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f1d072c2eb0ad60d4c183f3fb44ac6f73fb7a8f16a2694a91f988275cbf352f9"}, - {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:31a82d498054cac9f6d0b53d02bb85811185bcb477d4b60144f915f3b3126342"}, - {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6512cb89e334e4700febbffaaa52761b65b4f5a3cf33f960213d5656cea36a77"}, - {file = "kiwisolver-1.4.5-cp39-cp39-win32.whl", hash = "sha256:9db8ea4c388fdb0f780fe91346fd438657ea602d58348753d9fb265ce1bca67f"}, - {file = "kiwisolver-1.4.5-cp39-cp39-win_amd64.whl", hash = "sha256:59415f46a37f7f2efeec758353dd2eae1b07640d8ca0f0c42548ec4125492635"}, - {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5c7b3b3a728dc6faf3fc372ef24f21d1e3cee2ac3e9596691d746e5a536de920"}, - {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:620ced262a86244e2be10a676b646f29c34537d0d9cc8eb26c08f53d98013390"}, - {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:378a214a1e3bbf5ac4a8708304318b4f890da88c9e6a07699c4ae7174c09a68d"}, - {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf7be1207676ac608a50cd08f102f6742dbfc70e8d60c4db1c6897f62f71523"}, - {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ba55dce0a9b8ff59495ddd050a0225d58bd0983d09f87cfe2b6aec4f2c1234e4"}, - {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fd32ea360bcbb92d28933fc05ed09bffcb1704ba3fc7942e81db0fd4f81a7892"}, - {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5e7139af55d1688f8b960ee9ad5adafc4ac17c1c473fe07133ac092310d76544"}, - {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dced8146011d2bc2e883f9bd68618b8247387f4bbec46d7392b3c3b032640126"}, - {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9bf3325c47b11b2e51bca0824ea217c7cd84491d8ac4eefd1e409705ef092bd"}, - {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5794cf59533bc3f1b1c821f7206a3617999db9fbefc345360aafe2e067514929"}, - {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e368f200bbc2e4f905b8e71eb38b3c04333bddaa6a2464a6355487b02bb7fb09"}, - {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5d706eba36b4c4d5bc6c6377bb6568098765e990cfc21ee16d13963fab7b3e7"}, - {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85267bd1aa8880a9c88a8cb71e18d3d64d2751a790e6ca6c27b8ccc724bcd5ad"}, - {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210ef2c3a1f03272649aff1ef992df2e724748918c4bc2d5a90352849eb40bea"}, - {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11d011a7574eb3b82bcc9c1a1d35c1d7075677fdd15de527d91b46bd35e935ee"}, - {file = "kiwisolver-1.4.5.tar.gz", hash = "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec"}, + {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"}, + {file = "kiwisolver-1.4.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aa0abdf853e09aff551db11fce173e2177d00786c688203f52c87ad7fcd91ef9"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8d53103597a252fb3ab8b5845af04c7a26d5e7ea8122303dd7a021176a87e8b9"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:88f17c5ffa8e9462fb79f62746428dd57b46eb931698e42e990ad63103f35e6c"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88a9ca9c710d598fd75ee5de59d5bda2684d9db36a9f50b6125eaea3969c2599"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f4d742cb7af1c28303a51b7a27aaee540e71bb8e24f68c736f6f2ffc82f2bf05"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e28c7fea2196bf4c2f8d46a0415c77a1c480cc0724722f23d7410ffe9842c407"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e968b84db54f9d42046cf154e02911e39c0435c9801681e3fc9ce8a3c4130278"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0c18ec74c0472de033e1bebb2911c3c310eef5649133dd0bedf2a169a1b269e5"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8f0ea6da6d393d8b2e187e6a5e3fb81f5862010a40c3945e2c6d12ae45cfb2ad"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:f106407dda69ae456dd1227966bf445b157ccc80ba0dff3802bb63f30b74e895"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:84ec80df401cfee1457063732d90022f93951944b5b58975d34ab56bb150dfb3"}, + {file = "kiwisolver-1.4.7-cp310-cp310-win32.whl", hash = "sha256:71bb308552200fb2c195e35ef05de12f0c878c07fc91c270eb3d6e41698c3bcc"}, + {file = "kiwisolver-1.4.7-cp310-cp310-win_amd64.whl", hash = "sha256:44756f9fd339de0fb6ee4f8c1696cfd19b2422e0d70b4cefc1cc7f1f64045a8c"}, + {file = "kiwisolver-1.4.7-cp310-cp310-win_arm64.whl", hash = "sha256:78a42513018c41c2ffd262eb676442315cbfe3c44eed82385c2ed043bc63210a"}, + {file = "kiwisolver-1.4.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d2b0e12a42fb4e72d509fc994713d099cbb15ebf1103545e8a45f14da2dfca54"}, + {file = "kiwisolver-1.4.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2a8781ac3edc42ea4b90bc23e7d37b665d89423818e26eb6df90698aa2287c95"}, + {file = "kiwisolver-1.4.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:46707a10836894b559e04b0fd143e343945c97fd170d69a2d26d640b4e297935"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef97b8df011141c9b0f6caf23b29379f87dd13183c978a30a3c546d2c47314cb"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ab58c12a2cd0fc769089e6d38466c46d7f76aced0a1f54c77652446733d2d02"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:803b8e1459341c1bb56d1c5c010406d5edec8a0713a0945851290a7930679b51"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9a9e8a507420fe35992ee9ecb302dab68550dedc0da9e2880dd88071c5fb052"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18077b53dc3bb490e330669a99920c5e6a496889ae8c63b58fbc57c3d7f33a18"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6af936f79086a89b3680a280c47ea90b4df7047b5bdf3aa5c524bbedddb9e545"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3abc5b19d24af4b77d1598a585b8a719beb8569a71568b66f4ebe1fb0449460b"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:933d4de052939d90afbe6e9d5273ae05fb836cc86c15b686edd4b3560cc0ee36"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:65e720d2ab2b53f1f72fb5da5fb477455905ce2c88aaa671ff0a447c2c80e8e3"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3bf1ed55088f214ba6427484c59553123fdd9b218a42bbc8c6496d6754b1e523"}, + {file = "kiwisolver-1.4.7-cp311-cp311-win32.whl", hash = "sha256:4c00336b9dd5ad96d0a558fd18a8b6f711b7449acce4c157e7343ba92dd0cf3d"}, + {file = "kiwisolver-1.4.7-cp311-cp311-win_amd64.whl", hash = "sha256:929e294c1ac1e9f615c62a4e4313ca1823ba37326c164ec720a803287c4c499b"}, + {file = "kiwisolver-1.4.7-cp311-cp311-win_arm64.whl", hash = "sha256:e33e8fbd440c917106b237ef1a2f1449dfbb9b6f6e1ce17c94cd6a1e0d438376"}, + {file = "kiwisolver-1.4.7-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:5360cc32706dab3931f738d3079652d20982511f7c0ac5711483e6eab08efff2"}, + {file = "kiwisolver-1.4.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:942216596dc64ddb25adb215c3c783215b23626f8d84e8eff8d6d45c3f29f75a"}, + {file = "kiwisolver-1.4.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:48b571ecd8bae15702e4f22d3ff6a0f13e54d3d00cd25216d5e7f658242065ee"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ad42ba922c67c5f219097b28fae965e10045ddf145d2928bfac2eb2e17673640"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:612a10bdae23404a72941a0fc8fa2660c6ea1217c4ce0dbcab8a8f6543ea9e7f"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9e838bba3a3bac0fe06d849d29772eb1afb9745a59710762e4ba3f4cb8424483"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:22f499f6157236c19f4bbbd472fa55b063db77a16cd74d49afe28992dff8c258"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693902d433cf585133699972b6d7c42a8b9f8f826ebcaf0132ff55200afc599e"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4e77f2126c3e0b0d055f44513ed349038ac180371ed9b52fe96a32aa071a5107"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:657a05857bda581c3656bfc3b20e353c232e9193eb167766ad2dc58b56504948"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4bfa75a048c056a411f9705856abfc872558e33c055d80af6a380e3658766038"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:34ea1de54beef1c104422d210c47c7d2a4999bdecf42c7b5718fbe59a4cac383"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:90da3b5f694b85231cf93586dad5e90e2d71b9428f9aad96952c99055582f520"}, + {file = "kiwisolver-1.4.7-cp312-cp312-win32.whl", hash = "sha256:18e0cca3e008e17fe9b164b55735a325140a5a35faad8de92dd80265cd5eb80b"}, + {file = "kiwisolver-1.4.7-cp312-cp312-win_amd64.whl", hash = "sha256:58cb20602b18f86f83a5c87d3ee1c766a79c0d452f8def86d925e6c60fbf7bfb"}, + {file = "kiwisolver-1.4.7-cp312-cp312-win_arm64.whl", hash = "sha256:f5a8b53bdc0b3961f8b6125e198617c40aeed638b387913bf1ce78afb1b0be2a"}, + {file = "kiwisolver-1.4.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2e6039dcbe79a8e0f044f1c39db1986a1b8071051efba3ee4d74f5b365f5226e"}, + {file = "kiwisolver-1.4.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a1ecf0ac1c518487d9d23b1cd7139a6a65bc460cd101ab01f1be82ecf09794b6"}, + {file = "kiwisolver-1.4.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7ab9ccab2b5bd5702ab0803676a580fffa2aa178c2badc5557a84cc943fcf750"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f816dd2277f8d63d79f9c8473a79fe54047bc0467754962840782c575522224d"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf8bcc23ceb5a1b624572a1623b9f79d2c3b337c8c455405ef231933a10da379"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dea0bf229319828467d7fca8c7c189780aa9ff679c94539eed7532ebe33ed37c"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c06a4c7cf15ec739ce0e5971b26c93638730090add60e183530d70848ebdd34"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:913983ad2deb14e66d83c28b632fd35ba2b825031f2fa4ca29675e665dfecbe1"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5337ec7809bcd0f424c6b705ecf97941c46279cf5ed92311782c7c9c2026f07f"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4c26ed10c4f6fa6ddb329a5120ba3b6db349ca192ae211e882970bfc9d91420b"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c619b101e6de2222c1fcb0531e1b17bbffbe54294bfba43ea0d411d428618c27"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:073a36c8273647592ea332e816e75ef8da5c303236ec0167196793eb1e34657a"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3ce6b2b0231bda412463e152fc18335ba32faf4e8c23a754ad50ffa70e4091ee"}, + {file = "kiwisolver-1.4.7-cp313-cp313-win32.whl", hash = "sha256:f4c9aee212bc89d4e13f58be11a56cc8036cabad119259d12ace14b34476fd07"}, + {file = "kiwisolver-1.4.7-cp313-cp313-win_amd64.whl", hash = "sha256:8a3ec5aa8e38fc4c8af308917ce12c536f1c88452ce554027e55b22cbbfbff76"}, + {file = "kiwisolver-1.4.7-cp313-cp313-win_arm64.whl", hash = "sha256:76c8094ac20ec259471ac53e774623eb62e6e1f56cd8690c67ce6ce4fcb05650"}, + {file = "kiwisolver-1.4.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5d5abf8f8ec1f4e22882273c423e16cae834c36856cac348cfbfa68e01c40f3a"}, + {file = "kiwisolver-1.4.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:aeb3531b196ef6f11776c21674dba836aeea9d5bd1cf630f869e3d90b16cfade"}, + {file = "kiwisolver-1.4.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b7d755065e4e866a8086c9bdada157133ff466476a2ad7861828e17b6026e22c"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08471d4d86cbaec61f86b217dd938a83d85e03785f51121e791a6e6689a3be95"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7bbfcb7165ce3d54a3dfbe731e470f65739c4c1f85bb1018ee912bae139e263b"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d34eb8494bea691a1a450141ebb5385e4b69d38bb8403b5146ad279f4b30fa3"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9242795d174daa40105c1d86aba618e8eab7bf96ba8c3ee614da8302a9f95503"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a0f64a48bb81af7450e641e3fe0b0394d7381e342805479178b3d335d60ca7cf"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8e045731a5416357638d1700927529e2b8ab304811671f665b225f8bf8d8f933"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:4322872d5772cae7369f8351da1edf255a604ea7087fe295411397d0cfd9655e"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:e1631290ee9271dffe3062d2634c3ecac02c83890ada077d225e081aca8aab89"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:edcfc407e4eb17e037bca59be0e85a2031a2ac87e4fed26d3e9df88b4165f92d"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:4d05d81ecb47d11e7f8932bd8b61b720bf0b41199358f3f5e36d38e28f0532c5"}, + {file = "kiwisolver-1.4.7-cp38-cp38-win32.whl", hash = "sha256:b38ac83d5f04b15e515fd86f312479d950d05ce2368d5413d46c088dda7de90a"}, + {file = "kiwisolver-1.4.7-cp38-cp38-win_amd64.whl", hash = "sha256:d83db7cde68459fc803052a55ace60bea2bae361fc3b7a6d5da07e11954e4b09"}, + {file = "kiwisolver-1.4.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3f9362ecfca44c863569d3d3c033dbe8ba452ff8eed6f6b5806382741a1334bd"}, + {file = "kiwisolver-1.4.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e8df2eb9b2bac43ef8b082e06f750350fbbaf2887534a5be97f6cf07b19d9583"}, + {file = "kiwisolver-1.4.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f32d6edbc638cde7652bd690c3e728b25332acbadd7cad670cc4a02558d9c417"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e2e6c39bd7b9372b0be21456caab138e8e69cc0fc1190a9dfa92bd45a1e6e904"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dda56c24d869b1193fcc763f1284b9126550eaf84b88bbc7256e15028f19188a"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79849239c39b5e1fd906556c474d9b0439ea6792b637511f3fe3a41158d89ca8"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5e3bc157fed2a4c02ec468de4ecd12a6e22818d4f09cde2c31ee3226ffbefab2"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3da53da805b71e41053dc670f9a820d1157aae77b6b944e08024d17bcd51ef88"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8705f17dfeb43139a692298cb6637ee2e59c0194538153e83e9ee0c75c2eddde"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:82a5c2f4b87c26bb1a0ef3d16b5c4753434633b83d365cc0ddf2770c93829e3c"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce8be0466f4c0d585cdb6c1e2ed07232221df101a4c6f28821d2aa754ca2d9e2"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:409afdfe1e2e90e6ee7fc896f3df9a7fec8e793e58bfa0d052c8a82f99c37abb"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5b9c3f4ee0b9a439d2415012bd1b1cc2df59e4d6a9939f4d669241d30b414327"}, + {file = "kiwisolver-1.4.7-cp39-cp39-win32.whl", hash = "sha256:a79ae34384df2b615eefca647a2873842ac3b596418032bef9a7283675962644"}, + {file = "kiwisolver-1.4.7-cp39-cp39-win_amd64.whl", hash = "sha256:cf0438b42121a66a3a667de17e779330fc0f20b0d97d59d2f2121e182b0505e4"}, + {file = "kiwisolver-1.4.7-cp39-cp39-win_arm64.whl", hash = "sha256:764202cc7e70f767dab49e8df52c7455e8de0df5d858fa801a11aa0d882ccf3f"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:94252291e3fe68001b1dd747b4c0b3be12582839b95ad4d1b641924d68fd4643"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5b7dfa3b546da08a9f622bb6becdb14b3e24aaa30adba66749d38f3cc7ea9706"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd3de6481f4ed8b734da5df134cd5a6a64fe32124fe83dde1e5b5f29fe30b1e6"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a91b5f9f1205845d488c928e8570dcb62b893372f63b8b6e98b863ebd2368ff2"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40fa14dbd66b8b8f470d5fc79c089a66185619d31645f9b0773b88b19f7223c4"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:eb542fe7933aa09d8d8f9d9097ef37532a7df6497819d16efe4359890a2f417a"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bfa1acfa0c54932d5607e19a2c24646fb4c1ae2694437789129cf099789a3b00"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:eee3ea935c3d227d49b4eb85660ff631556841f6e567f0f7bda972df6c2c9935"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f3160309af4396e0ed04db259c3ccbfdc3621b5559b5453075e5de555e1f3a1b"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a17f6a29cf8935e587cc8a4dbfc8368c55edc645283db0ce9801016f83526c2d"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10849fb2c1ecbfae45a693c070e0320a91b35dd4bcf58172c023b994283a124d"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:ac542bf38a8a4be2dc6b15248d36315ccc65f0743f7b1a76688ffb6b5129a5c2"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8b01aac285f91ca889c800042c35ad3b239e704b150cfd3382adfc9dcc780e39"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:48be928f59a1f5c8207154f935334d374e79f2b5d212826307d072595ad76a2e"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f37cfe618a117e50d8c240555331160d73d0411422b59b5ee217843d7b693608"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:599b5c873c63a1f6ed7eead644a8a380cfbdf5db91dcb6f85707aaab213b1674"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:801fa7802e5cfabe3ab0c81a34c323a319b097dfb5004be950482d882f3d7225"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0c6c43471bc764fad4bc99c5c2d6d16a676b1abf844ca7c8702bdae92df01ee0"}, + {file = "kiwisolver-1.4.7.tar.gz", hash = "sha256:9893ff81bd7107f7b685d3017cc6583daadb4fc26e4a888350df530e41980a60"}, ] [[package]] @@ -1200,13 +1280,13 @@ files = [ [[package]] name = "lightning-utilities" -version = "0.11.2" +version = "0.11.7" description = "Lightning toolbox for across the our ecosystem." optional = false python-versions = ">=3.8" files = [ - {file = "lightning-utilities-0.11.2.tar.gz", hash = "sha256:adf4cf9c5d912fe505db4729e51d1369c6927f3a8ac55a9dff895ce5c0da08d9"}, - {file = "lightning_utilities-0.11.2-py3-none-any.whl", hash = "sha256:541f471ed94e18a28d72879338c8c52e873bb46f4c47644d89228faeb6751159"}, + {file = "lightning_utilities-0.11.7-py3-none-any.whl", hash = "sha256:84eebbc700edbfaa6c005458fc911a7fe7f99f02970b00cb322b4d2767deba98"}, + {file = "lightning_utilities-0.11.7.tar.gz", hash = "sha256:7e8458a9f0bfb51ffe6c5ab3957aa37b2792fe8281dd9f1b66aa513a558ec4ce"}, ] [package.dependencies] @@ -1221,13 +1301,13 @@ typing = ["mypy (>=1.0.0)", "types-setuptools"] [[package]] name = "markdown" -version = "3.6" +version = "3.7" description = "Python implementation of John Gruber's Markdown." optional = false python-versions = ">=3.8" files = [ - {file = "Markdown-3.6-py3-none-any.whl", hash = "sha256:48f276f4d8cfb8ce6527c8f79e2ee29708508bf4d40aa410fbc3b4ee832c850f"}, - {file = "Markdown-3.6.tar.gz", hash = "sha256:ed4f41f6daecbeeb96e576ce414c41d2d876daa9a16cb35fa8ed8c2ddfad0224"}, + {file = "Markdown-3.7-py3-none-any.whl", hash = "sha256:7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803"}, + {file = "markdown-3.7.tar.gz", hash = "sha256:2ae2471477cfd02dbbf038d5d9bc226d40def84b4fe2986e49b59b6b472bbed2"}, ] [package.dependencies] @@ -1340,13 +1420,13 @@ python-dateutil = ">=2.1" [[package]] name = "matplotlib-inline" -version = "0.1.6" +version = "0.1.7" description = "Inline Matplotlib backend for Jupyter" optional = false -python-versions = ">=3.5" +python-versions = ">=3.8" files = [ - {file = "matplotlib-inline-0.1.6.tar.gz", hash = "sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304"}, - {file = "matplotlib_inline-0.1.6-py3-none-any.whl", hash = "sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311"}, + {file = "matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca"}, + {file = "matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90"}, ] [package.dependencies] @@ -1371,103 +1451,108 @@ tests = ["pytest (>=4.6)"] [[package]] name = "multidict" -version = "6.0.5" +version = "6.1.0" description = "multidict implementation" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b644ae063c10e7f324ab1ab6b548bdf6f8b47f3ec234fef1093bc2735e5f9"}, - {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:896ebdcf62683551312c30e20614305f53125750803b614e9e6ce74a96232604"}, - {file = "multidict-6.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:411bf8515f3be9813d06004cac41ccf7d1cd46dfe233705933dd163b60e37600"}, - {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d147090048129ce3c453f0292e7697d333db95e52616b3793922945804a433c"}, - {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:215ed703caf15f578dca76ee6f6b21b7603791ae090fbf1ef9d865571039ade5"}, - {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c6390cf87ff6234643428991b7359b5f59cc15155695deb4eda5c777d2b880f"}, - {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fd81c4ebdb4f214161be351eb5bcf385426bf023041da2fd9e60681f3cebae"}, - {file = "multidict-6.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3cc2ad10255f903656017363cd59436f2111443a76f996584d1077e43ee51182"}, - {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6939c95381e003f54cd4c5516740faba40cf5ad3eeff460c3ad1d3e0ea2549bf"}, - {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:220dd781e3f7af2c2c1053da9fa96d9cf3072ca58f057f4c5adaaa1cab8fc442"}, - {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:766c8f7511df26d9f11cd3a8be623e59cca73d44643abab3f8c8c07620524e4a"}, - {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:fe5d7785250541f7f5019ab9cba2c71169dc7d74d0f45253f8313f436458a4ef"}, - {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c1c1496e73051918fcd4f58ff2e0f2f3066d1c76a0c6aeffd9b45d53243702cc"}, - {file = "multidict-6.0.5-cp310-cp310-win32.whl", hash = "sha256:7afcdd1fc07befad18ec4523a782cde4e93e0a2bf71239894b8d61ee578c1319"}, - {file = "multidict-6.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:99f60d34c048c5c2fabc766108c103612344c46e35d4ed9ae0673d33c8fb26e8"}, - {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f285e862d2f153a70586579c15c44656f888806ed0e5b56b64489afe4a2dbfba"}, - {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:53689bb4e102200a4fafa9de9c7c3c212ab40a7ab2c8e474491914d2305f187e"}, - {file = "multidict-6.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:612d1156111ae11d14afaf3a0669ebf6c170dbb735e510a7438ffe2369a847fd"}, - {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7be7047bd08accdb7487737631d25735c9a04327911de89ff1b26b81745bd4e3"}, - {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de170c7b4fe6859beb8926e84f7d7d6c693dfe8e27372ce3b76f01c46e489fcf"}, - {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04bde7a7b3de05732a4eb39c94574db1ec99abb56162d6c520ad26f83267de29"}, - {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85f67aed7bb647f93e7520633d8f51d3cbc6ab96957c71272b286b2f30dc70ed"}, - {file = "multidict-6.0.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425bf820055005bfc8aa9a0b99ccb52cc2f4070153e34b701acc98d201693733"}, - {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d3eb1ceec286eba8220c26f3b0096cf189aea7057b6e7b7a2e60ed36b373b77f"}, - {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7901c05ead4b3fb75113fb1dd33eb1253c6d3ee37ce93305acd9d38e0b5f21a4"}, - {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e0e79d91e71b9867c73323a3444724d496c037e578a0e1755ae159ba14f4f3d1"}, - {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:29bfeb0dff5cb5fdab2023a7a9947b3b4af63e9c47cae2a10ad58394b517fddc"}, - {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e030047e85cbcedbfc073f71836d62dd5dadfbe7531cae27789ff66bc551bd5e"}, - {file = "multidict-6.0.5-cp311-cp311-win32.whl", hash = "sha256:2f4848aa3baa109e6ab81fe2006c77ed4d3cd1e0ac2c1fbddb7b1277c168788c"}, - {file = "multidict-6.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:2faa5ae9376faba05f630d7e5e6be05be22913782b927b19d12b8145968a85ea"}, - {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:51d035609b86722963404f711db441cf7134f1889107fb171a970c9701f92e1e"}, - {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cbebcd5bcaf1eaf302617c114aa67569dd3f090dd0ce8ba9e35e9985b41ac35b"}, - {file = "multidict-6.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ffc42c922dbfddb4a4c3b438eb056828719f07608af27d163191cb3e3aa6cc5"}, - {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ceb3b7e6a0135e092de86110c5a74e46bda4bd4fbfeeb3a3bcec79c0f861e450"}, - {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79660376075cfd4b2c80f295528aa6beb2058fd289f4c9252f986751a4cd0496"}, - {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4428b29611e989719874670fd152b6625500ad6c686d464e99f5aaeeaca175a"}, - {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84a5c3a5f7ce6db1f999fb9438f686bc2e09d38143f2d93d8406ed2dd6b9226"}, - {file = "multidict-6.0.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76c0de87358b192de7ea9649beb392f107dcad9ad27276324c24c91774ca5271"}, - {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:79a6d2ba910adb2cbafc95dad936f8b9386e77c84c35bc0add315b856d7c3abb"}, - {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:92d16a3e275e38293623ebf639c471d3e03bb20b8ebb845237e0d3664914caef"}, - {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:fb616be3538599e797a2017cccca78e354c767165e8858ab5116813146041a24"}, - {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:14c2976aa9038c2629efa2c148022ed5eb4cb939e15ec7aace7ca932f48f9ba6"}, - {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:435a0984199d81ca178b9ae2c26ec3d49692d20ee29bc4c11a2a8d4514c67eda"}, - {file = "multidict-6.0.5-cp312-cp312-win32.whl", hash = "sha256:9fe7b0653ba3d9d65cbe7698cca585bf0f8c83dbbcc710db9c90f478e175f2d5"}, - {file = "multidict-6.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:01265f5e40f5a17f8241d52656ed27192be03bfa8764d88e8220141d1e4b3556"}, - {file = "multidict-6.0.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:19fe01cea168585ba0f678cad6f58133db2aa14eccaf22f88e4a6dccadfad8b3"}, - {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bf7a982604375a8d49b6cc1b781c1747f243d91b81035a9b43a2126c04766f5"}, - {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:107c0cdefe028703fb5dafe640a409cb146d44a6ae201e55b35a4af8e95457dd"}, - {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:403c0911cd5d5791605808b942c88a8155c2592e05332d2bf78f18697a5fa15e"}, - {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aeaf541ddbad8311a87dd695ed9642401131ea39ad7bc8cf3ef3967fd093b626"}, - {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4972624066095e52b569e02b5ca97dbd7a7ddd4294bf4e7247d52635630dd83"}, - {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d946b0a9eb8aaa590df1fe082cee553ceab173e6cb5b03239716338629c50c7a"}, - {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b55358304d7a73d7bdf5de62494aaf70bd33015831ffd98bc498b433dfe5b10c"}, - {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:a3145cb08d8625b2d3fee1b2d596a8766352979c9bffe5d7833e0503d0f0b5e5"}, - {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d65f25da8e248202bd47445cec78e0025c0fe7582b23ec69c3b27a640dd7a8e3"}, - {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c9bf56195c6bbd293340ea82eafd0071cb3d450c703d2c93afb89f93b8386ccc"}, - {file = "multidict-6.0.5-cp37-cp37m-win32.whl", hash = "sha256:69db76c09796b313331bb7048229e3bee7928eb62bab5e071e9f7fcc4879caee"}, - {file = "multidict-6.0.5-cp37-cp37m-win_amd64.whl", hash = "sha256:fce28b3c8a81b6b36dfac9feb1de115bab619b3c13905b419ec71d03a3fc1423"}, - {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:76f067f5121dcecf0d63a67f29080b26c43c71a98b10c701b0677e4a065fbd54"}, - {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b82cc8ace10ab5bd93235dfaab2021c70637005e1ac787031f4d1da63d493c1d"}, - {file = "multidict-6.0.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5cb241881eefd96b46f89b1a056187ea8e9ba14ab88ba632e68d7a2ecb7aadf7"}, - {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8e94e6912639a02ce173341ff62cc1201232ab86b8a8fcc05572741a5dc7d93"}, - {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09a892e4a9fb47331da06948690ae38eaa2426de97b4ccbfafbdcbe5c8f37ff8"}, - {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55205d03e8a598cfc688c71ca8ea5f66447164efff8869517f175ea632c7cb7b"}, - {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37b15024f864916b4951adb95d3a80c9431299080341ab9544ed148091b53f50"}, - {file = "multidict-6.0.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2a1dee728b52b33eebff5072817176c172050d44d67befd681609b4746e1c2e"}, - {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:edd08e6f2f1a390bf137080507e44ccc086353c8e98c657e666c017718561b89"}, - {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:60d698e8179a42ec85172d12f50b1668254628425a6bd611aba022257cac1386"}, - {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:3d25f19500588cbc47dc19081d78131c32637c25804df8414463ec908631e453"}, - {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4cc0ef8b962ac7a5e62b9e826bd0cd5040e7d401bc45a6835910ed699037a461"}, - {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:eca2e9d0cc5a889850e9bbd68e98314ada174ff6ccd1129500103df7a94a7a44"}, - {file = "multidict-6.0.5-cp38-cp38-win32.whl", hash = "sha256:4a6a4f196f08c58c59e0b8ef8ec441d12aee4125a7d4f4fef000ccb22f8d7241"}, - {file = "multidict-6.0.5-cp38-cp38-win_amd64.whl", hash = "sha256:0275e35209c27a3f7951e1ce7aaf93ce0d163b28948444bec61dd7badc6d3f8c"}, - {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e7be68734bd8c9a513f2b0cfd508802d6609da068f40dc57d4e3494cefc92929"}, - {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1d9ea7a7e779d7a3561aade7d596649fbecfa5c08a7674b11b423783217933f9"}, - {file = "multidict-6.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ea1456df2a27c73ce51120fa2f519f1bea2f4a03a917f4a43c8707cf4cbbae1a"}, - {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf590b134eb70629e350691ecca88eac3e3b8b3c86992042fb82e3cb1830d5e1"}, - {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5c0631926c4f58e9a5ccce555ad7747d9a9f8b10619621f22f9635f069f6233e"}, - {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dce1c6912ab9ff5f179eaf6efe7365c1f425ed690b03341911bf4939ef2f3046"}, - {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0868d64af83169e4d4152ec612637a543f7a336e4a307b119e98042e852ad9c"}, - {file = "multidict-6.0.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:141b43360bfd3bdd75f15ed811850763555a251e38b2405967f8e25fb43f7d40"}, - {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7df704ca8cf4a073334e0427ae2345323613e4df18cc224f647f251e5e75a527"}, - {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6214c5a5571802c33f80e6c84713b2c79e024995b9c5897f794b43e714daeec9"}, - {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:cd6c8fca38178e12c00418de737aef1261576bd1b6e8c6134d3e729a4e858b38"}, - {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e02021f87a5b6932fa6ce916ca004c4d441509d33bbdbeca70d05dff5e9d2479"}, - {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ebd8d160f91a764652d3e51ce0d2956b38efe37c9231cd82cfc0bed2e40b581c"}, - {file = "multidict-6.0.5-cp39-cp39-win32.whl", hash = "sha256:04da1bb8c8dbadf2a18a452639771951c662c5ad03aefe4884775454be322c9b"}, - {file = "multidict-6.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:d6f6d4f185481c9669b9447bf9d9cf3b95a0e9df9d169bbc17e363b7d5487755"}, - {file = "multidict-6.0.5-py3-none-any.whl", hash = "sha256:0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7"}, - {file = "multidict-6.0.5.tar.gz", hash = "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da"}, + {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"}, + {file = "multidict-6.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a114d03b938376557927ab23f1e950827c3b893ccb94b62fd95d430fd0e5cf53"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1c416351ee6271b2f49b56ad7f308072f6f44b37118d69c2cad94f3fa8a40d5"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b5d83030255983181005e6cfbac1617ce9746b219bc2aad52201ad121226581"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3e97b5e938051226dc025ec80980c285b053ffb1e25a3db2a3aa3bc046bf7f56"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d618649d4e70ac6efcbba75be98b26ef5078faad23592f9b51ca492953012429"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10524ebd769727ac77ef2278390fb0068d83f3acb7773792a5080f2b0abf7748"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ff3827aef427c89a25cc96ded1759271a93603aba9fb977a6d264648ebf989db"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:06809f4f0f7ab7ea2cabf9caca7d79c22c0758b58a71f9d32943ae13c7ace056"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f179dee3b863ab1c59580ff60f9d99f632f34ccb38bf67a33ec6b3ecadd0fd76"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:aaed8b0562be4a0876ee3b6946f6869b7bcdb571a5d1496683505944e268b160"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3c8b88a2ccf5493b6c8da9076fb151ba106960a2df90c2633f342f120751a9e7"}, + {file = "multidict-6.1.0-cp310-cp310-win32.whl", hash = "sha256:4a9cb68166a34117d6646c0023c7b759bf197bee5ad4272f420a0141d7eb03a0"}, + {file = "multidict-6.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:20b9b5fbe0b88d0bdef2012ef7dee867f874b72528cf1d08f1d59b0e3850129d"}, + {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3efe2c2cb5763f2f1b275ad2bf7a287d3f7ebbef35648a9726e3b69284a4f3d6"}, + {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7053d3b0353a8b9de430a4f4b4268ac9a4fb3481af37dfe49825bf45ca24156"}, + {file = "multidict-6.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27e5fc84ccef8dfaabb09d82b7d179c7cf1a3fbc8a966f8274fcb4ab2eb4cadb"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e2b90b43e696f25c62656389d32236e049568b39320e2735d51f08fd362761b"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d83a047959d38a7ff552ff94be767b7fd79b831ad1cd9920662db05fec24fe72"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1a9dd711d0877a1ece3d2e4fea11a8e75741ca21954c919406b44e7cf971304"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec2abea24d98246b94913b76a125e855eb5c434f7c46546046372fe60f666351"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4867cafcbc6585e4b678876c489b9273b13e9fff9f6d6d66add5e15d11d926cb"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5b48204e8d955c47c55b72779802b219a39acc3ee3d0116d5080c388970b76e3"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d8fff389528cad1618fb4b26b95550327495462cd745d879a8c7c2115248e399"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a7a9541cd308eed5e30318430a9c74d2132e9a8cb46b901326272d780bf2d423"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:da1758c76f50c39a2efd5e9859ce7d776317eb1dd34317c8152ac9251fc574a3"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c943a53e9186688b45b323602298ab727d8865d8c9ee0b17f8d62d14b56f0753"}, + {file = "multidict-6.1.0-cp311-cp311-win32.whl", hash = "sha256:90f8717cb649eea3504091e640a1b8568faad18bd4b9fcd692853a04475a4b80"}, + {file = "multidict-6.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:82176036e65644a6cc5bd619f65f6f19781e8ec2e5330f51aa9ada7504cc1926"}, + {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b04772ed465fa3cc947db808fa306d79b43e896beb677a56fb2347ca1a49c1fa"}, + {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6180c0ae073bddeb5a97a38c03f30c233e0a4d39cd86166251617d1bbd0af436"}, + {file = "multidict-6.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:071120490b47aa997cca00666923a83f02c7fbb44f71cf7f136df753f7fa8761"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50b3a2710631848991d0bf7de077502e8994c804bb805aeb2925a981de58ec2e"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b58c621844d55e71c1b7f7c498ce5aa6985d743a1a59034c57a905b3f153c1ef"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55b6d90641869892caa9ca42ff913f7ff1c5ece06474fbd32fb2cf6834726c95"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b820514bfc0b98a30e3d85462084779900347e4d49267f747ff54060cc33925"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10a9b09aba0c5b48c53761b7c720aaaf7cf236d5fe394cd399c7ba662d5f9966"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e16bf3e5fc9f44632affb159d30a437bfe286ce9e02754759be5536b169b305"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76f364861c3bfc98cbbcbd402d83454ed9e01a5224bb3a28bf70002a230f73e2"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:820c661588bd01a0aa62a1283f20d2be4281b086f80dad9e955e690c75fb54a2"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0e5f362e895bc5b9e67fe6e4ded2492d8124bdf817827f33c5b46c2fe3ffaca6"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ec660d19bbc671e3a6443325f07263be452c453ac9e512f5eb935e7d4ac28b3"}, + {file = "multidict-6.1.0-cp312-cp312-win32.whl", hash = "sha256:58130ecf8f7b8112cdb841486404f1282b9c86ccb30d3519faf301b2e5659133"}, + {file = "multidict-6.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:188215fc0aafb8e03341995e7c4797860181562380f81ed0a87ff455b70bf1f1"}, + {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d569388c381b24671589335a3be6e1d45546c2988c2ebe30fdcada8457a31008"}, + {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:052e10d2d37810b99cc170b785945421141bf7bb7d2f8799d431e7db229c385f"}, + {file = "multidict-6.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f90c822a402cb865e396a504f9fc8173ef34212a342d92e362ca498cad308e28"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b225d95519a5bf73860323e633a664b0d85ad3d5bede6d30d95b35d4dfe8805b"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:23bfd518810af7de1116313ebd9092cb9aa629beb12f6ed631ad53356ed6b86c"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c09fcfdccdd0b57867577b719c69e347a436b86cd83747f179dbf0cc0d4c1f3"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf6bea52ec97e95560af5ae576bdac3aa3aae0b6758c6efa115236d9e07dae44"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57feec87371dbb3520da6192213c7d6fc892d5589a93db548331954de8248fd2"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0c3f390dc53279cbc8ba976e5f8035eab997829066756d811616b652b00a23a3"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:59bfeae4b25ec05b34f1956eaa1cb38032282cd4dfabc5056d0a1ec4d696d3aa"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b2f59caeaf7632cc633b5cf6fc449372b83bbdf0da4ae04d5be36118e46cc0aa"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:37bb93b2178e02b7b618893990941900fd25b6b9ac0fa49931a40aecdf083fe4"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4e9f48f58c2c523d5a06faea47866cd35b32655c46b443f163d08c6d0ddb17d6"}, + {file = "multidict-6.1.0-cp313-cp313-win32.whl", hash = "sha256:3a37ffb35399029b45c6cc33640a92bef403c9fd388acce75cdc88f58bd19a81"}, + {file = "multidict-6.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:e9aa71e15d9d9beaad2c6b9319edcdc0a49a43ef5c0a4c8265ca9ee7d6c67774"}, + {file = "multidict-6.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:db7457bac39421addd0c8449933ac32d8042aae84a14911a757ae6ca3eef1392"}, + {file = "multidict-6.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d094ddec350a2fb899fec68d8353c78233debde9b7d8b4beeafa70825f1c281a"}, + {file = "multidict-6.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5845c1fd4866bb5dd3125d89b90e57ed3138241540897de748cdf19de8a2fca2"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9079dfc6a70abe341f521f78405b8949f96db48da98aeb43f9907f342f627cdc"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3914f5aaa0f36d5d60e8ece6a308ee1c9784cd75ec8151062614657a114c4478"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c08be4f460903e5a9d0f76818db3250f12e9c344e79314d1d570fc69d7f4eae4"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d093be959277cb7dee84b801eb1af388b6ad3ca6a6b6bf1ed7585895789d027d"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3702ea6872c5a2a4eeefa6ffd36b042e9773f05b1f37ae3ef7264b1163c2dcf6"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:2090f6a85cafc5b2db085124d752757c9d251548cedabe9bd31afe6363e0aff2"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:f67f217af4b1ff66c68a87318012de788dd95fcfeb24cc889011f4e1c7454dfd"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:189f652a87e876098bbc67b4da1049afb5f5dfbaa310dd67c594b01c10388db6"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:6bb5992037f7a9eff7991ebe4273ea7f51f1c1c511e6a2ce511d0e7bdb754492"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f4c2b9e770c4e393876e35a7046879d195cd123b4f116d299d442b335bcd"}, + {file = "multidict-6.1.0-cp38-cp38-win32.whl", hash = "sha256:e27bbb6d14416713a8bd7aaa1313c0fc8d44ee48d74497a0ff4c3a1b6ccb5167"}, + {file = "multidict-6.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:22f3105d4fb15c8f57ff3959a58fcab6ce36814486500cd7485651230ad4d4ef"}, + {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4e18b656c5e844539d506a0a06432274d7bd52a7487e6828c63a63d69185626c"}, + {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a185f876e69897a6f3325c3f19f26a297fa058c5e456bfcff8015e9a27e83ae1"}, + {file = "multidict-6.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ab7c4ceb38d91570a650dba194e1ca87c2b543488fe9309b4212694174fd539c"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e617fb6b0b6953fffd762669610c1c4ffd05632c138d61ac7e14ad187870669c"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16e5f4bf4e603eb1fdd5d8180f1a25f30056f22e55ce51fb3d6ad4ab29f7d96f"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4c035da3f544b1882bac24115f3e2e8760f10a0107614fc9839fd232200b875"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:957cf8e4b6e123a9eea554fa7ebc85674674b713551de587eb318a2df3e00255"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:483a6aea59cb89904e1ceabd2b47368b5600fb7de78a6e4a2c2987b2d256cf30"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:87701f25a2352e5bf7454caa64757642734da9f6b11384c1f9d1a8e699758057"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:682b987361e5fd7a139ed565e30d81fd81e9629acc7d925a205366877d8c8657"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce2186a7df133a9c895dea3331ddc5ddad42cdd0d1ea2f0a51e5d161e4762f28"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9f636b730f7e8cb19feb87094949ba54ee5357440b9658b2a32a5ce4bce53972"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:73eae06aa53af2ea5270cc066dcaf02cc60d2994bbb2c4ef5764949257d10f43"}, + {file = "multidict-6.1.0-cp39-cp39-win32.whl", hash = "sha256:1ca0083e80e791cffc6efce7660ad24af66c8d4079d2a750b29001b53ff59ada"}, + {file = "multidict-6.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:aa466da5b15ccea564bdab9c89175c762bc12825f4659c11227f515cee76fa4a"}, + {file = "multidict-6.1.0-py3-none-any.whl", hash = "sha256:48e171e52d1c4d33888e529b999e5900356b9ae588c2f09a52dcefb158b27506"}, + {file = "multidict-6.1.0.tar.gz", hash = "sha256:22ae2ebf9b0c69d206c003e2f6a914ea33f0a932d4aa16f236afc049d9958f4a"}, ] +[package.dependencies] +typing-extensions = {version = ">=4.1.0", markers = "python_version < \"3.11\""} + [[package]] name = "nest-asyncio" version = "1.6.0" @@ -1655,13 +1740,14 @@ files = [ [[package]] name = "nvidia-nvjitlink-cu12" -version = "12.4.127" +version = "12.6.77" description = "Nvidia JIT LTO Library" optional = false python-versions = ">=3" files = [ - {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:06b3b9b25bf3f8af351d664978ca26a16d2c5127dbd53c0497e28d1fb9611d57"}, - {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-win_amd64.whl", hash = "sha256:fd9020c501d27d135f983c6d3e244b197a7ccad769e34df53a42e276b0e25fa1"}, + {file = "nvidia_nvjitlink_cu12-12.6.77-py3-none-manylinux2014_aarch64.whl", hash = "sha256:3bf10d85bb1801e9c894c6e197e44dd137d2a0a9e43f8450e9ad13f2df0dd52d"}, + {file = "nvidia_nvjitlink_cu12-12.6.77-py3-none-manylinux2014_x86_64.whl", hash = "sha256:9ae346d16203ae4ea513be416495167a0101d33d2d14935aa9c1829a3fb45142"}, + {file = "nvidia_nvjitlink_cu12-12.6.77-py3-none-win_amd64.whl", hash = "sha256:410718cd44962bed862a31dd0318620f6f9a8b28a6291967bcfcb446a6516771"}, ] [[package]] @@ -1693,31 +1779,24 @@ signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] [[package]] name = "opt-einsum" -version = "3.3.0" -description = "Optimizing numpys einsum function" +version = "3.4.0" +description = "Path optimization of einsum functions." optional = false -python-versions = ">=3.5" +python-versions = ">=3.8" files = [ - {file = "opt_einsum-3.3.0-py3-none-any.whl", hash = "sha256:2455e59e3947d3c275477df7f5205b30635e266fe6dc300e3d9f9646bfcea147"}, - {file = "opt_einsum-3.3.0.tar.gz", hash = "sha256:59f6475f77bbc37dcf7cd748519c0ec60722e91e63ca114e68821c0c54a46549"}, + {file = "opt_einsum-3.4.0-py3-none-any.whl", hash = "sha256:69bb92469f86a1565195ece4ac0323943e83477171b91d24c35afe028a90d7cd"}, + {file = "opt_einsum-3.4.0.tar.gz", hash = "sha256:96ca72f1b886d148241348783498194c577fa30a8faac108586b14f1ba4473ac"}, ] -[package.dependencies] -numpy = ">=1.7" - -[package.extras] -docs = ["numpydoc", "sphinx (==1.2.3)", "sphinx-rtd-theme", "sphinxcontrib-napoleon"] -tests = ["pytest", "pytest-cov", "pytest-pep8"] - [[package]] name = "packaging" -version = "24.0" +version = "24.1" description = "Core utilities for Python packages" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, - {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, + {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, + {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, ] [[package]] @@ -1825,84 +1904,95 @@ files = [ [[package]] name = "pillow" -version = "10.3.0" +version = "10.4.0" description = "Python Imaging Library (Fork)" optional = false python-versions = ">=3.8" files = [ - {file = "pillow-10.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:90b9e29824800e90c84e4022dd5cc16eb2d9605ee13f05d47641eb183cd73d45"}, - {file = "pillow-10.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a2c405445c79c3f5a124573a051062300936b0281fee57637e706453e452746c"}, - {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78618cdbccaa74d3f88d0ad6cb8ac3007f1a6fa5c6f19af64b55ca170bfa1edf"}, - {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261ddb7ca91fcf71757979534fb4c128448b5b4c55cb6152d280312062f69599"}, - {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ce49c67f4ea0609933d01c0731b34b8695a7a748d6c8d186f95e7d085d2fe475"}, - {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b14f16f94cbc61215115b9b1236f9c18403c15dd3c52cf629072afa9d54c1cbf"}, - {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d33891be6df59d93df4d846640f0e46f1a807339f09e79a8040bc887bdcd7ed3"}, - {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b50811d664d392f02f7761621303eba9d1b056fb1868c8cdf4231279645c25f5"}, - {file = "pillow-10.3.0-cp310-cp310-win32.whl", hash = "sha256:ca2870d5d10d8726a27396d3ca4cf7976cec0f3cb706debe88e3a5bd4610f7d2"}, - {file = "pillow-10.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:f0d0591a0aeaefdaf9a5e545e7485f89910c977087e7de2b6c388aec32011e9f"}, - {file = "pillow-10.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:ccce24b7ad89adb5a1e34a6ba96ac2530046763912806ad4c247356a8f33a67b"}, - {file = "pillow-10.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:5f77cf66e96ae734717d341c145c5949c63180842a545c47a0ce7ae52ca83795"}, - {file = "pillow-10.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e4b878386c4bf293578b48fc570b84ecfe477d3b77ba39a6e87150af77f40c57"}, - {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdcbb4068117dfd9ce0138d068ac512843c52295ed996ae6dd1faf537b6dbc27"}, - {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9797a6c8fe16f25749b371c02e2ade0efb51155e767a971c61734b1bf6293994"}, - {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:9e91179a242bbc99be65e139e30690e081fe6cb91a8e77faf4c409653de39451"}, - {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:1b87bd9d81d179bd8ab871603bd80d8645729939f90b71e62914e816a76fc6bd"}, - {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:81d09caa7b27ef4e61cb7d8fbf1714f5aec1c6b6c5270ee53504981e6e9121ad"}, - {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:048ad577748b9fa4a99a0548c64f2cb8d672d5bf2e643a739ac8faff1164238c"}, - {file = "pillow-10.3.0-cp311-cp311-win32.whl", hash = "sha256:7161ec49ef0800947dc5570f86568a7bb36fa97dd09e9827dc02b718c5643f09"}, - {file = "pillow-10.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:8eb0908e954d093b02a543dc963984d6e99ad2b5e36503d8a0aaf040505f747d"}, - {file = "pillow-10.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:4e6f7d1c414191c1199f8996d3f2282b9ebea0945693fb67392c75a3a320941f"}, - {file = "pillow-10.3.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:e46f38133e5a060d46bd630faa4d9fa0202377495df1f068a8299fd78c84de84"}, - {file = "pillow-10.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:50b8eae8f7334ec826d6eeffaeeb00e36b5e24aa0b9df322c247539714c6df19"}, - {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d3bea1c75f8c53ee4d505c3e67d8c158ad4df0d83170605b50b64025917f338"}, - {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19aeb96d43902f0a783946a0a87dbdad5c84c936025b8419da0a0cd7724356b1"}, - {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:74d28c17412d9caa1066f7a31df8403ec23d5268ba46cd0ad2c50fb82ae40462"}, - {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:ff61bfd9253c3915e6d41c651d5f962da23eda633cf02262990094a18a55371a"}, - {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d886f5d353333b4771d21267c7ecc75b710f1a73d72d03ca06df49b09015a9ef"}, - {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b5ec25d8b17217d635f8935dbc1b9aa5907962fae29dff220f2659487891cd3"}, - {file = "pillow-10.3.0-cp312-cp312-win32.whl", hash = "sha256:51243f1ed5161b9945011a7360e997729776f6e5d7005ba0c6879267d4c5139d"}, - {file = "pillow-10.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:412444afb8c4c7a6cc11a47dade32982439925537e483be7c0ae0cf96c4f6a0b"}, - {file = "pillow-10.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:798232c92e7665fe82ac085f9d8e8ca98826f8e27859d9a96b41d519ecd2e49a"}, - {file = "pillow-10.3.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:4eaa22f0d22b1a7e93ff0a596d57fdede2e550aecffb5a1ef1106aaece48e96b"}, - {file = "pillow-10.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cd5e14fbf22a87321b24c88669aad3a51ec052eb145315b3da3b7e3cc105b9a2"}, - {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1530e8f3a4b965eb6a7785cf17a426c779333eb62c9a7d1bbcf3ffd5bf77a4aa"}, - {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d512aafa1d32efa014fa041d38868fda85028e3f930a96f85d49c7d8ddc0383"}, - {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:339894035d0ede518b16073bdc2feef4c991ee991a29774b33e515f1d308e08d"}, - {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:aa7e402ce11f0885305bfb6afb3434b3cd8f53b563ac065452d9d5654c7b86fd"}, - {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0ea2a783a2bdf2a561808fe4a7a12e9aa3799b701ba305de596bc48b8bdfce9d"}, - {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c78e1b00a87ce43bb37642c0812315b411e856a905d58d597750eb79802aaaa3"}, - {file = "pillow-10.3.0-cp38-cp38-win32.whl", hash = "sha256:72d622d262e463dfb7595202d229f5f3ab4b852289a1cd09650362db23b9eb0b"}, - {file = "pillow-10.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:2034f6759a722da3a3dbd91a81148cf884e91d1b747992ca288ab88c1de15999"}, - {file = "pillow-10.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:2ed854e716a89b1afcedea551cd85f2eb2a807613752ab997b9974aaa0d56936"}, - {file = "pillow-10.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dc1a390a82755a8c26c9964d457d4c9cbec5405896cba94cf51f36ea0d855002"}, - {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4203efca580f0dd6f882ca211f923168548f7ba334c189e9eab1178ab840bf60"}, - {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3102045a10945173d38336f6e71a8dc71bcaeed55c3123ad4af82c52807b9375"}, - {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:6fb1b30043271ec92dc65f6d9f0b7a830c210b8a96423074b15c7bc999975f57"}, - {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:1dfc94946bc60ea375cc39cff0b8da6c7e5f8fcdc1d946beb8da5c216156ddd8"}, - {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b09b86b27a064c9624d0a6c54da01c1beaf5b6cadfa609cf63789b1d08a797b9"}, - {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d3b2348a78bc939b4fed6552abfd2e7988e0f81443ef3911a4b8498ca084f6eb"}, - {file = "pillow-10.3.0-cp39-cp39-win32.whl", hash = "sha256:45ebc7b45406febf07fef35d856f0293a92e7417ae7933207e90bf9090b70572"}, - {file = "pillow-10.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:0ba26351b137ca4e0db0342d5d00d2e355eb29372c05afd544ebf47c0956ffeb"}, - {file = "pillow-10.3.0-cp39-cp39-win_arm64.whl", hash = "sha256:50fd3f6b26e3441ae07b7c979309638b72abc1a25da31a81a7fbd9495713ef4f"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:6b02471b72526ab8a18c39cb7967b72d194ec53c1fd0a70b050565a0f366d355"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8ab74c06ffdab957d7670c2a5a6e1a70181cd10b727cd788c4dd9005b6a8acd9"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:048eeade4c33fdf7e08da40ef402e748df113fd0b4584e32c4af74fe78baaeb2"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2ec1e921fd07c7cda7962bad283acc2f2a9ccc1b971ee4b216b75fad6f0463"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c8e73e99da7db1b4cad7f8d682cf6abad7844da39834c288fbfa394a47bbced"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:16563993329b79513f59142a6b02055e10514c1a8e86dca8b48a893e33cf91e3"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:dd78700f5788ae180b5ee8902c6aea5a5726bac7c364b202b4b3e3ba2d293170"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:aff76a55a8aa8364d25400a210a65ff59d0168e0b4285ba6bf2bd83cf675ba32"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b7bc2176354defba3edc2b9a777744462da2f8e921fbaf61e52acb95bafa9828"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:793b4e24db2e8742ca6423d3fde8396db336698c55cd34b660663ee9e45ed37f"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d93480005693d247f8346bc8ee28c72a2191bdf1f6b5db469c096c0c867ac015"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c83341b89884e2b2e55886e8fbbf37c3fa5efd6c8907124aeb72f285ae5696e5"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1a1d1915db1a4fdb2754b9de292642a39a7fb28f1736699527bb649484fb966a"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a0eaa93d054751ee9964afa21c06247779b90440ca41d184aeb5d410f20ff591"}, - {file = "pillow-10.3.0.tar.gz", hash = "sha256:9d2455fbf44c914840c793e89aa82d0e1763a14253a000743719ae5946814b2d"}, + {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"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc"}, + {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e"}, + {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46"}, + {file = "pillow-10.4.0-cp310-cp310-win32.whl", hash = "sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984"}, + {file = "pillow-10.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141"}, + {file = "pillow-10.4.0-cp310-cp310-win_arm64.whl", hash = "sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1"}, + {file = "pillow-10.4.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c"}, + {file = "pillow-10.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319"}, + {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d"}, + {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696"}, + {file = "pillow-10.4.0-cp311-cp311-win32.whl", hash = "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496"}, + {file = "pillow-10.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91"}, + {file = "pillow-10.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22"}, + {file = "pillow-10.4.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94"}, + {file = "pillow-10.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a"}, + {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b"}, + {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9"}, + {file = "pillow-10.4.0-cp312-cp312-win32.whl", hash = "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42"}, + {file = "pillow-10.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a"}, + {file = "pillow-10.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9"}, + {file = "pillow-10.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3"}, + {file = "pillow-10.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc"}, + {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a"}, + {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309"}, + {file = "pillow-10.4.0-cp313-cp313-win32.whl", hash = "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060"}, + {file = "pillow-10.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea"}, + {file = "pillow-10.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d"}, + {file = "pillow-10.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8d4d5063501b6dd4024b8ac2f04962d661222d120381272deea52e3fc52d3736"}, + {file = "pillow-10.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7c1ee6f42250df403c5f103cbd2768a28fe1a0ea1f0f03fe151c8741e1469c8b"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15e02e9bb4c21e39876698abf233c8c579127986f8207200bc8a8f6bb27acf2"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a8d4bade9952ea9a77d0c3e49cbd8b2890a399422258a77f357b9cc9be8d680"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:43efea75eb06b95d1631cb784aa40156177bf9dd5b4b03ff38979e048258bc6b"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:950be4d8ba92aca4b2bb0741285a46bfae3ca699ef913ec8416c1b78eadd64cd"}, + {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d7480af14364494365e89d6fddc510a13e5a2c3584cb19ef65415ca57252fb84"}, + {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:73664fe514b34c8f02452ffb73b7a92c6774e39a647087f83d67f010eb9a0cf0"}, + {file = "pillow-10.4.0-cp38-cp38-win32.whl", hash = "sha256:e88d5e6ad0d026fba7bdab8c3f225a69f063f116462c49892b0149e21b6c0a0e"}, + {file = "pillow-10.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:5161eef006d335e46895297f642341111945e2c1c899eb406882a6c61a4357ab"}, + {file = "pillow-10.4.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0ae24a547e8b711ccaaf99c9ae3cd975470e1a30caa80a6aaee9a2f19c05701d"}, + {file = "pillow-10.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:298478fe4f77a4408895605f3482b6cc6222c018b2ce565c2b6b9c354ac3229b"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:134ace6dc392116566980ee7436477d844520a26a4b1bd4053f6f47d096997fd"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:930044bb7679ab003b14023138b50181899da3f25de50e9dbee23b61b4de2126"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c76e5786951e72ed3686e122d14c5d7012f16c8303a674d18cdcd6d89557fc5b"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b2724fdb354a868ddf9a880cb84d102da914e99119211ef7ecbdc613b8c96b3c"}, + {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dbc6ae66518ab3c5847659e9988c3b60dc94ffb48ef9168656e0019a93dbf8a1"}, + {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:06b2f7898047ae93fad74467ec3d28fe84f7831370e3c258afa533f81ef7f3df"}, + {file = "pillow-10.4.0-cp39-cp39-win32.whl", hash = "sha256:7970285ab628a3779aecc35823296a7869f889b8329c16ad5a71e4901a3dc4ef"}, + {file = "pillow-10.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:961a7293b2457b405967af9c77dcaa43cc1a8cd50d23c532e62d48ab6cdd56f5"}, + {file = "pillow-10.4.0-cp39-cp39-win_arm64.whl", hash = "sha256:32cda9e3d601a52baccb2856b8ea1fc213c90b340c542dcef77140dfa3278a9e"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:a02364621fe369e06200d4a16558e056fe2805d3468350df3aef21e00d26214b"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1b5dea9831a90e9d0721ec417a80d4cbd7022093ac38a568db2dd78363b00908"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b885f89040bb8c4a1573566bbb2f44f5c505ef6e74cec7ab9068c900047f04b"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87dd88ded2e6d74d31e1e0a99a726a6765cda32d00ba72dc37f0651f306daaa8"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:2db98790afc70118bd0255c2eeb465e9767ecf1f3c25f9a1abb8ffc8cfd1fe0a"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f7baece4ce06bade126fb84b8af1c33439a76d8a6fd818970215e0560ca28c27"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:cfdd747216947628af7b259d274771d84db2268ca062dd5faf373639d00113a3"}, + {file = "pillow-10.4.0.tar.gz", hash = "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06"}, ] [package.extras] -docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] +docs = ["furo", "olefile", "sphinx (>=7.3)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] fpx = ["olefile"] mic = ["olefile"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] @@ -1911,28 +2001,29 @@ xmp = ["defusedxml"] [[package]] name = "platformdirs" -version = "4.2.0" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +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" files = [ - {file = "platformdirs-4.2.0-py3-none-any.whl", hash = "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068"}, - {file = "platformdirs-4.2.0.tar.gz", hash = "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768"}, + {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, + {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, ] [package.extras] -docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] +docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)"] +type = ["mypy (>=1.11.2)"] [[package]] name = "prompt-toolkit" -version = "3.0.43" +version = "3.0.48" description = "Library for building powerful interactive command lines in Python" optional = false python-versions = ">=3.7.0" files = [ - {file = "prompt_toolkit-3.0.43-py3-none-any.whl", hash = "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6"}, - {file = "prompt_toolkit-3.0.43.tar.gz", hash = "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d"}, + {file = "prompt_toolkit-3.0.48-py3-none-any.whl", hash = "sha256:f49a827f90062e411f1ce1f854f2aedb3c23353244f8108b89283587397ac10e"}, + {file = "prompt_toolkit-3.0.48.tar.gz", hash = "sha256:d6623ab0477a80df74e646bdbc93621143f5caf104206aa29294d53de1a03d90"}, ] [package.dependencies] @@ -1971,27 +2062,28 @@ files = [ [[package]] name = "psutil" -version = "5.9.8" +version = "6.0.0" description = "Cross-platform lib for process and system monitoring in Python." optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" -files = [ - {file = "psutil-5.9.8-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:26bd09967ae00920df88e0352a91cff1a78f8d69b3ecabbfe733610c0af486c8"}, - {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:05806de88103b25903dff19bb6692bd2e714ccf9e668d050d144012055cbca73"}, - {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:611052c4bc70432ec770d5d54f64206aa7203a101ec273a0cd82418c86503bb7"}, - {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:50187900d73c1381ba1454cf40308c2bf6f34268518b3f36a9b663ca87e65e36"}, - {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:02615ed8c5ea222323408ceba16c60e99c3f91639b07da6373fb7e6539abc56d"}, - {file = "psutil-5.9.8-cp27-none-win32.whl", hash = "sha256:36f435891adb138ed3c9e58c6af3e2e6ca9ac2f365efe1f9cfef2794e6c93b4e"}, - {file = "psutil-5.9.8-cp27-none-win_amd64.whl", hash = "sha256:bd1184ceb3f87651a67b2708d4c3338e9b10c5df903f2e3776b62303b26cb631"}, - {file = "psutil-5.9.8-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:aee678c8720623dc456fa20659af736241f575d79429a0e5e9cf88ae0605cc81"}, - {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cb6403ce6d8e047495a701dc7c5bd788add903f8986d523e3e20b98b733e421"}, - {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d06016f7f8625a1825ba3732081d77c94589dca78b7a3fc072194851e88461a4"}, - {file = "psutil-5.9.8-cp36-cp36m-win32.whl", hash = "sha256:7d79560ad97af658a0f6adfef8b834b53f64746d45b403f225b85c5c2c140eee"}, - {file = "psutil-5.9.8-cp36-cp36m-win_amd64.whl", hash = "sha256:27cc40c3493bb10de1be4b3f07cae4c010ce715290a5be22b98493509c6299e2"}, - {file = "psutil-5.9.8-cp37-abi3-win32.whl", hash = "sha256:bc56c2a1b0d15aa3eaa5a60c9f3f8e3e565303b465dbf57a1b730e7a2b9844e0"}, - {file = "psutil-5.9.8-cp37-abi3-win_amd64.whl", hash = "sha256:8db4c1b57507eef143a15a6884ca10f7c73876cdf5d51e713151c1236a0e68cf"}, - {file = "psutil-5.9.8-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:d16bbddf0693323b8c6123dd804100241da461e41d6e332fb0ba6058f630f8c8"}, - {file = "psutil-5.9.8.tar.gz", hash = "sha256:6be126e3225486dff286a8fb9a06246a5253f4c7c53b475ea5f5ac934e64194c"}, +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "psutil-6.0.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a021da3e881cd935e64a3d0a20983bda0bb4cf80e4f74fa9bfcb1bc5785360c6"}, + {file = "psutil-6.0.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:1287c2b95f1c0a364d23bc6f2ea2365a8d4d9b726a3be7294296ff7ba97c17f0"}, + {file = "psutil-6.0.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:a9a3dbfb4de4f18174528d87cc352d1f788b7496991cca33c6996f40c9e3c92c"}, + {file = "psutil-6.0.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:6ec7588fb3ddaec7344a825afe298db83fe01bfaaab39155fa84cf1c0d6b13c3"}, + {file = "psutil-6.0.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:1e7c870afcb7d91fdea2b37c24aeb08f98b6d67257a5cb0a8bc3ac68d0f1a68c"}, + {file = "psutil-6.0.0-cp27-none-win32.whl", hash = "sha256:02b69001f44cc73c1c5279d02b30a817e339ceb258ad75997325e0e6169d8b35"}, + {file = "psutil-6.0.0-cp27-none-win_amd64.whl", hash = "sha256:21f1fb635deccd510f69f485b87433460a603919b45e2a324ad65b0cc74f8fb1"}, + {file = "psutil-6.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c588a7e9b1173b6e866756dde596fd4cad94f9399daf99ad8c3258b3cb2b47a0"}, + {file = "psutil-6.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ed2440ada7ef7d0d608f20ad89a04ec47d2d3ab7190896cd62ca5fc4fe08bf0"}, + {file = "psutil-6.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fd9a97c8e94059b0ef54a7d4baf13b405011176c3b6ff257c247cae0d560ecd"}, + {file = "psutil-6.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2e8d0054fc88153ca0544f5c4d554d42e33df2e009c4ff42284ac9ebdef4132"}, + {file = "psutil-6.0.0-cp36-cp36m-win32.whl", hash = "sha256:fc8c9510cde0146432bbdb433322861ee8c3efbf8589865c8bf8d21cb30c4d14"}, + {file = "psutil-6.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:34859b8d8f423b86e4385ff3665d3f4d94be3cdf48221fbe476e883514fdb71c"}, + {file = "psutil-6.0.0-cp37-abi3-win32.whl", hash = "sha256:a495580d6bae27291324fe60cea0b5a7c23fa36a7cd35035a16d93bdcf076b9d"}, + {file = "psutil-6.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:33ea5e1c975250a720b3a6609c490db40dae5d83a4eb315170c4fe0d8b1f34b3"}, + {file = "psutil-6.0.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:ffe7fc9b6b36beadc8c322f84e1caff51e8703b88eee1da46d1e3a6ae11b4fd0"}, + {file = "psutil-6.0.0.tar.gz", hash = "sha256:8faae4f310b6d969fa26ca0545338b21f73c6b15db7c4a8d934a5482faa818f2"}, ] [package.extras] @@ -2010,13 +2102,13 @@ files = [ [[package]] name = "pure-eval" -version = "0.2.2" +version = "0.2.3" description = "Safely evaluate AST nodes without side effects" optional = false python-versions = "*" files = [ - {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, - {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, + {file = "pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0"}, + {file = "pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42"}, ] [package.extras] @@ -2024,24 +2116,24 @@ tests = ["pytest"] [[package]] name = "pyasn1" -version = "0.6.0" +version = "0.6.1" description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" optional = false python-versions = ">=3.8" files = [ - {file = "pyasn1-0.6.0-py2.py3-none-any.whl", hash = "sha256:cca4bb0f2df5504f02f6f8a775b6e416ff9b0b3b16f7ee80b5a3153d9b804473"}, - {file = "pyasn1-0.6.0.tar.gz", hash = "sha256:3a35ab2c4b5ef98e17dfdec8ab074046fbda76e281c5a706ccd82328cfc8f64c"}, + {file = "pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629"}, + {file = "pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034"}, ] [[package]] name = "pyasn1-modules" -version = "0.4.0" +version = "0.4.1" description = "A collection of ASN.1-based protocols modules" optional = false python-versions = ">=3.8" files = [ - {file = "pyasn1_modules-0.4.0-py3-none-any.whl", hash = "sha256:be04f15b66c206eed667e0bb5ab27e2b1855ea54a842e5037738099e8ca4ae0b"}, - {file = "pyasn1_modules-0.4.0.tar.gz", hash = "sha256:831dbcea1b177b28c9baddf4c6d1013c24c3accd14a1873fffaa6a2e905f17b6"}, + {file = "pyasn1_modules-0.4.1-py3-none-any.whl", hash = "sha256:49bfa96b45a292b711e986f222502c1c9a5e1f4e568fc30e2574a6c7d07838fd"}, + {file = "pyasn1_modules-0.4.1.tar.gz", hash = "sha256:c28e2dbf9c06ad61c71a075c7e0f9fd0f1b0bb2d2ad4377f240d33ac2ab60a7c"}, ] [package.dependencies] @@ -2060,28 +2152,27 @@ files = [ [[package]] name = "pygments" -version = "2.17.2" +version = "2.18.0" description = "Pygments is a syntax highlighting package written in Python." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, - {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, + {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, + {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, ] [package.extras] -plugins = ["importlib-metadata"] windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pyparsing" -version = "3.1.2" +version = "3.1.4" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = false python-versions = ">=3.6.8" files = [ - {file = "pyparsing-3.1.2-py3-none-any.whl", hash = "sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742"}, - {file = "pyparsing-3.1.2.tar.gz", hash = "sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad"}, + {file = "pyparsing-3.1.4-py3-none-any.whl", hash = "sha256:a6a7ee4235a3f944aa1fa2249307708f893fe5717dc603503c6c7969c070fb7c"}, + {file = "pyparsing-3.1.4.tar.gz", hash = "sha256:f86ec8d1a83f11977c9a6ea7598e8c27fc5cddfa5b07ea2241edbbde1d7bc032"}, ] [package.extras] @@ -2103,13 +2194,13 @@ six = ">=1.5" [[package]] name = "pytz" -version = "2024.1" +version = "2024.2" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" files = [ - {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, - {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, + {file = "pytz-2024.2-py2.py3-none-any.whl", hash = "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725"}, + {file = "pytz-2024.2.tar.gz", hash = "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a"}, ] [[package]] @@ -2137,104 +2228,120 @@ files = [ [[package]] name = "pyzmq" -version = "25.1.2" +version = "26.2.0" description = "Python bindings for 0MQ" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "pyzmq-25.1.2-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:e624c789359f1a16f83f35e2c705d07663ff2b4d4479bad35621178d8f0f6ea4"}, - {file = "pyzmq-25.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:49151b0efece79f6a79d41a461d78535356136ee70084a1c22532fc6383f4ad0"}, - {file = "pyzmq-25.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9a5f194cf730f2b24d6af1f833c14c10f41023da46a7f736f48b6d35061e76e"}, - {file = "pyzmq-25.1.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:faf79a302f834d9e8304fafdc11d0d042266667ac45209afa57e5efc998e3872"}, - {file = "pyzmq-25.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f51a7b4ead28d3fca8dda53216314a553b0f7a91ee8fc46a72b402a78c3e43d"}, - {file = "pyzmq-25.1.2-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:0ddd6d71d4ef17ba5a87becf7ddf01b371eaba553c603477679ae817a8d84d75"}, - {file = "pyzmq-25.1.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:246747b88917e4867e2367b005fc8eefbb4a54b7db363d6c92f89d69abfff4b6"}, - {file = "pyzmq-25.1.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:00c48ae2fd81e2a50c3485de1b9d5c7c57cd85dc8ec55683eac16846e57ac979"}, - {file = "pyzmq-25.1.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5a68d491fc20762b630e5db2191dd07ff89834086740f70e978bb2ef2668be08"}, - {file = "pyzmq-25.1.2-cp310-cp310-win32.whl", hash = "sha256:09dfe949e83087da88c4a76767df04b22304a682d6154de2c572625c62ad6886"}, - {file = "pyzmq-25.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:fa99973d2ed20417744fca0073390ad65ce225b546febb0580358e36aa90dba6"}, - {file = "pyzmq-25.1.2-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:82544e0e2d0c1811482d37eef297020a040c32e0687c1f6fc23a75b75db8062c"}, - {file = "pyzmq-25.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:01171fc48542348cd1a360a4b6c3e7d8f46cdcf53a8d40f84db6707a6768acc1"}, - {file = "pyzmq-25.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc69c96735ab501419c432110016329bf0dea8898ce16fab97c6d9106dc0b348"}, - {file = "pyzmq-25.1.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3e124e6b1dd3dfbeb695435dff0e383256655bb18082e094a8dd1f6293114642"}, - {file = "pyzmq-25.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7598d2ba821caa37a0f9d54c25164a4fa351ce019d64d0b44b45540950458840"}, - {file = "pyzmq-25.1.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:d1299d7e964c13607efd148ca1f07dcbf27c3ab9e125d1d0ae1d580a1682399d"}, - {file = "pyzmq-25.1.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4e6f689880d5ad87918430957297c975203a082d9a036cc426648fcbedae769b"}, - {file = "pyzmq-25.1.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cc69949484171cc961e6ecd4a8911b9ce7a0d1f738fcae717177c231bf77437b"}, - {file = "pyzmq-25.1.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9880078f683466b7f567b8624bfc16cad65077be046b6e8abb53bed4eeb82dd3"}, - {file = "pyzmq-25.1.2-cp311-cp311-win32.whl", hash = "sha256:4e5837af3e5aaa99a091302df5ee001149baff06ad22b722d34e30df5f0d9097"}, - {file = "pyzmq-25.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:25c2dbb97d38b5ac9fd15586e048ec5eb1e38f3d47fe7d92167b0c77bb3584e9"}, - {file = "pyzmq-25.1.2-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:11e70516688190e9c2db14fcf93c04192b02d457b582a1f6190b154691b4c93a"}, - {file = "pyzmq-25.1.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:313c3794d650d1fccaaab2df942af9f2c01d6217c846177cfcbc693c7410839e"}, - {file = "pyzmq-25.1.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b3cbba2f47062b85fe0ef9de5b987612140a9ba3a9c6d2543c6dec9f7c2ab27"}, - {file = "pyzmq-25.1.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fc31baa0c32a2ca660784d5af3b9487e13b61b3032cb01a115fce6588e1bed30"}, - {file = "pyzmq-25.1.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02c9087b109070c5ab0b383079fa1b5f797f8d43e9a66c07a4b8b8bdecfd88ee"}, - {file = "pyzmq-25.1.2-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:f8429b17cbb746c3e043cb986328da023657e79d5ed258b711c06a70c2ea7537"}, - {file = "pyzmq-25.1.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5074adeacede5f810b7ef39607ee59d94e948b4fd954495bdb072f8c54558181"}, - {file = "pyzmq-25.1.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:7ae8f354b895cbd85212da245f1a5ad8159e7840e37d78b476bb4f4c3f32a9fe"}, - {file = "pyzmq-25.1.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b264bf2cc96b5bc43ce0e852be995e400376bd87ceb363822e2cb1964fcdc737"}, - {file = "pyzmq-25.1.2-cp312-cp312-win32.whl", hash = "sha256:02bbc1a87b76e04fd780b45e7f695471ae6de747769e540da909173d50ff8e2d"}, - {file = "pyzmq-25.1.2-cp312-cp312-win_amd64.whl", hash = "sha256:ced111c2e81506abd1dc142e6cd7b68dd53747b3b7ae5edbea4578c5eeff96b7"}, - {file = "pyzmq-25.1.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:7b6d09a8962a91151f0976008eb7b29b433a560fde056ec7a3db9ec8f1075438"}, - {file = "pyzmq-25.1.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:967668420f36878a3c9ecb5ab33c9d0ff8d054f9c0233d995a6d25b0e95e1b6b"}, - {file = "pyzmq-25.1.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5edac3f57c7ddaacdb4d40f6ef2f9e299471fc38d112f4bc6d60ab9365445fb0"}, - {file = "pyzmq-25.1.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:0dabfb10ef897f3b7e101cacba1437bd3a5032ee667b7ead32bbcdd1a8422fe7"}, - {file = "pyzmq-25.1.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:2c6441e0398c2baacfe5ba30c937d274cfc2dc5b55e82e3749e333aabffde561"}, - {file = "pyzmq-25.1.2-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:16b726c1f6c2e7625706549f9dbe9b06004dfbec30dbed4bf50cbdfc73e5b32a"}, - {file = "pyzmq-25.1.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:a86c2dd76ef71a773e70551a07318b8e52379f58dafa7ae1e0a4be78efd1ff16"}, - {file = "pyzmq-25.1.2-cp36-cp36m-win32.whl", hash = "sha256:359f7f74b5d3c65dae137f33eb2bcfa7ad9ebefd1cab85c935f063f1dbb245cc"}, - {file = "pyzmq-25.1.2-cp36-cp36m-win_amd64.whl", hash = "sha256:55875492f820d0eb3417b51d96fea549cde77893ae3790fd25491c5754ea2f68"}, - {file = "pyzmq-25.1.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b8c8a419dfb02e91b453615c69568442e897aaf77561ee0064d789705ff37a92"}, - {file = "pyzmq-25.1.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8807c87fa893527ae8a524c15fc505d9950d5e856f03dae5921b5e9aa3b8783b"}, - {file = "pyzmq-25.1.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5e319ed7d6b8f5fad9b76daa0a68497bc6f129858ad956331a5835785761e003"}, - {file = "pyzmq-25.1.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:3c53687dde4d9d473c587ae80cc328e5b102b517447456184b485587ebd18b62"}, - {file = "pyzmq-25.1.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:9add2e5b33d2cd765ad96d5eb734a5e795a0755f7fc49aa04f76d7ddda73fd70"}, - {file = "pyzmq-25.1.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:e690145a8c0c273c28d3b89d6fb32c45e0d9605b2293c10e650265bf5c11cfec"}, - {file = "pyzmq-25.1.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:00a06faa7165634f0cac1abb27e54d7a0b3b44eb9994530b8ec73cf52e15353b"}, - {file = "pyzmq-25.1.2-cp37-cp37m-win32.whl", hash = "sha256:0f97bc2f1f13cb16905a5f3e1fbdf100e712d841482b2237484360f8bc4cb3d7"}, - {file = "pyzmq-25.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6cc0020b74b2e410287e5942e1e10886ff81ac77789eb20bec13f7ae681f0fdd"}, - {file = "pyzmq-25.1.2-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:bef02cfcbded83473bdd86dd8d3729cd82b2e569b75844fb4ea08fee3c26ae41"}, - {file = "pyzmq-25.1.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e10a4b5a4b1192d74853cc71a5e9fd022594573926c2a3a4802020360aa719d8"}, - {file = "pyzmq-25.1.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8c5f80e578427d4695adac6fdf4370c14a2feafdc8cb35549c219b90652536ae"}, - {file = "pyzmq-25.1.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5dde6751e857910c1339890f3524de74007958557593b9e7e8c5f01cd919f8a7"}, - {file = "pyzmq-25.1.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea1608dd169da230a0ad602d5b1ebd39807ac96cae1845c3ceed39af08a5c6df"}, - {file = "pyzmq-25.1.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0f513130c4c361201da9bc69df25a086487250e16b5571ead521b31ff6b02220"}, - {file = "pyzmq-25.1.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:019744b99da30330798bb37df33549d59d380c78e516e3bab9c9b84f87a9592f"}, - {file = "pyzmq-25.1.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2e2713ef44be5d52dd8b8e2023d706bf66cb22072e97fc71b168e01d25192755"}, - {file = "pyzmq-25.1.2-cp38-cp38-win32.whl", hash = "sha256:07cd61a20a535524906595e09344505a9bd46f1da7a07e504b315d41cd42eb07"}, - {file = "pyzmq-25.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb7e49a17fb8c77d3119d41a4523e432eb0c6932187c37deb6fbb00cc3028088"}, - {file = "pyzmq-25.1.2-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:94504ff66f278ab4b7e03e4cba7e7e400cb73bfa9d3d71f58d8972a8dc67e7a6"}, - {file = "pyzmq-25.1.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6dd0d50bbf9dca1d0bdea219ae6b40f713a3fb477c06ca3714f208fd69e16fd8"}, - {file = "pyzmq-25.1.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:004ff469d21e86f0ef0369717351073e0e577428e514c47c8480770d5e24a565"}, - {file = "pyzmq-25.1.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c0b5ca88a8928147b7b1e2dfa09f3b6c256bc1135a1338536cbc9ea13d3b7add"}, - {file = "pyzmq-25.1.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c9a79f1d2495b167119d02be7448bfba57fad2a4207c4f68abc0bab4b92925b"}, - {file = "pyzmq-25.1.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:518efd91c3d8ac9f9b4f7dd0e2b7b8bf1a4fe82a308009016b07eaa48681af82"}, - {file = "pyzmq-25.1.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:1ec23bd7b3a893ae676d0e54ad47d18064e6c5ae1fadc2f195143fb27373f7f6"}, - {file = "pyzmq-25.1.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db36c27baed588a5a8346b971477b718fdc66cf5b80cbfbd914b4d6d355e44e2"}, - {file = "pyzmq-25.1.2-cp39-cp39-win32.whl", hash = "sha256:39b1067f13aba39d794a24761e385e2eddc26295826530a8c7b6c6c341584289"}, - {file = "pyzmq-25.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:8e9f3fabc445d0ce320ea2c59a75fe3ea591fdbdeebec5db6de530dd4b09412e"}, - {file = "pyzmq-25.1.2-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a8c1d566344aee826b74e472e16edae0a02e2a044f14f7c24e123002dcff1c05"}, - {file = "pyzmq-25.1.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:759cfd391a0996345ba94b6a5110fca9c557ad4166d86a6e81ea526c376a01e8"}, - {file = "pyzmq-25.1.2-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c61e346ac34b74028ede1c6b4bcecf649d69b707b3ff9dc0fab453821b04d1e"}, - {file = "pyzmq-25.1.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cb8fc1f8d69b411b8ec0b5f1ffbcaf14c1db95b6bccea21d83610987435f1a4"}, - {file = "pyzmq-25.1.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:3c00c9b7d1ca8165c610437ca0c92e7b5607b2f9076f4eb4b095c85d6e680a1d"}, - {file = "pyzmq-25.1.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:df0c7a16ebb94452d2909b9a7b3337940e9a87a824c4fc1c7c36bb4404cb0cde"}, - {file = "pyzmq-25.1.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:45999e7f7ed5c390f2e87ece7f6c56bf979fb213550229e711e45ecc7d42ccb8"}, - {file = "pyzmq-25.1.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ac170e9e048b40c605358667aca3d94e98f604a18c44bdb4c102e67070f3ac9b"}, - {file = "pyzmq-25.1.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1b604734bec94f05f81b360a272fc824334267426ae9905ff32dc2be433ab96"}, - {file = "pyzmq-25.1.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:a793ac733e3d895d96f865f1806f160696422554e46d30105807fdc9841b9f7d"}, - {file = "pyzmq-25.1.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0806175f2ae5ad4b835ecd87f5f85583316b69f17e97786f7443baaf54b9bb98"}, - {file = "pyzmq-25.1.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ef12e259e7bc317c7597d4f6ef59b97b913e162d83b421dd0db3d6410f17a244"}, - {file = "pyzmq-25.1.2-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea253b368eb41116011add00f8d5726762320b1bda892f744c91997b65754d73"}, - {file = "pyzmq-25.1.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b9b1f2ad6498445a941d9a4fee096d387fee436e45cc660e72e768d3d8ee611"}, - {file = "pyzmq-25.1.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:8b14c75979ce932c53b79976a395cb2a8cd3aaf14aef75e8c2cb55a330b9b49d"}, - {file = "pyzmq-25.1.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:889370d5174a741a62566c003ee8ddba4b04c3f09a97b8000092b7ca83ec9c49"}, - {file = "pyzmq-25.1.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a18fff090441a40ffda8a7f4f18f03dc56ae73f148f1832e109f9bffa85df15"}, - {file = "pyzmq-25.1.2-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99a6b36f95c98839ad98f8c553d8507644c880cf1e0a57fe5e3a3f3969040882"}, - {file = "pyzmq-25.1.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4345c9a27f4310afbb9c01750e9461ff33d6fb74cd2456b107525bbeebcb5be3"}, - {file = "pyzmq-25.1.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3516e0b6224cf6e43e341d56da15fd33bdc37fa0c06af4f029f7d7dfceceabbc"}, - {file = "pyzmq-25.1.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:146b9b1f29ead41255387fb07be56dc29639262c0f7344f570eecdcd8d683314"}, - {file = "pyzmq-25.1.2.tar.gz", hash = "sha256:93f1aa311e8bb912e34f004cf186407a4e90eec4f0ecc0efd26056bf7eda0226"}, + {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"}, + {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89289a5ee32ef6c439086184529ae060c741334b8970a6855ec0b6ad3ff28764"}, + {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5506f06d7dc6ecf1efacb4a013b1f05071bb24b76350832c96449f4a2d95091c"}, + {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ea039387c10202ce304af74def5021e9adc6297067f3441d348d2b633e8166a"}, + {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a2224fa4a4c2ee872886ed00a571f5e967c85e078e8e8c2530a2fb01b3309b88"}, + {file = "pyzmq-26.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:28ad5233e9c3b52d76196c696e362508959741e1a005fb8fa03b51aea156088f"}, + {file = "pyzmq-26.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:1c17211bc037c7d88e85ed8b7d8f7e52db6dc8eca5590d162717c654550f7282"}, + {file = "pyzmq-26.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b8f86dd868d41bea9a5f873ee13bf5551c94cf6bc51baebc6f85075971fe6eea"}, + {file = "pyzmq-26.2.0-cp310-cp310-win32.whl", hash = "sha256:46a446c212e58456b23af260f3d9fb785054f3e3653dbf7279d8f2b5546b21c2"}, + {file = "pyzmq-26.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:49d34ab71db5a9c292a7644ce74190b1dd5a3475612eefb1f8be1d6961441971"}, + {file = "pyzmq-26.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:bfa832bfa540e5b5c27dcf5de5d82ebc431b82c453a43d141afb1e5d2de025fa"}, + {file = "pyzmq-26.2.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:8f7e66c7113c684c2b3f1c83cdd3376103ee0ce4c49ff80a648643e57fb22218"}, + {file = "pyzmq-26.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3a495b30fc91db2db25120df5847d9833af237546fd59170701acd816ccc01c4"}, + {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77eb0968da535cba0470a5165468b2cac7772cfb569977cff92e240f57e31bef"}, + {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ace4f71f1900a548f48407fc9be59c6ba9d9aaf658c2eea6cf2779e72f9f317"}, + {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:92a78853d7280bffb93df0a4a6a2498cba10ee793cc8076ef797ef2f74d107cf"}, + {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:689c5d781014956a4a6de61d74ba97b23547e431e9e7d64f27d4922ba96e9d6e"}, + {file = "pyzmq-26.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0aca98bc423eb7d153214b2df397c6421ba6373d3397b26c057af3c904452e37"}, + {file = "pyzmq-26.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1f3496d76b89d9429a656293744ceca4d2ac2a10ae59b84c1da9b5165f429ad3"}, + {file = "pyzmq-26.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5c2b3bfd4b9689919db068ac6c9911f3fcb231c39f7dd30e3138be94896d18e6"}, + {file = "pyzmq-26.2.0-cp311-cp311-win32.whl", hash = "sha256:eac5174677da084abf378739dbf4ad245661635f1600edd1221f150b165343f4"}, + {file = "pyzmq-26.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:5a509df7d0a83a4b178d0f937ef14286659225ef4e8812e05580776c70e155d5"}, + {file = "pyzmq-26.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:c0e6091b157d48cbe37bd67233318dbb53e1e6327d6fc3bb284afd585d141003"}, + {file = "pyzmq-26.2.0-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:ded0fc7d90fe93ae0b18059930086c51e640cdd3baebdc783a695c77f123dcd9"}, + {file = "pyzmq-26.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:17bf5a931c7f6618023cdacc7081f3f266aecb68ca692adac015c383a134ca52"}, + {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55cf66647e49d4621a7e20c8d13511ef1fe1efbbccf670811864452487007e08"}, + {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4661c88db4a9e0f958c8abc2b97472e23061f0bc737f6f6179d7a27024e1faa5"}, + {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea7f69de383cb47522c9c208aec6dd17697db7875a4674c4af3f8cfdac0bdeae"}, + {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:7f98f6dfa8b8ccaf39163ce872bddacca38f6a67289116c8937a02e30bbe9711"}, + {file = "pyzmq-26.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e3e0210287329272539eea617830a6a28161fbbd8a3271bf4150ae3e58c5d0e6"}, + {file = "pyzmq-26.2.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6b274e0762c33c7471f1a7471d1a2085b1a35eba5cdc48d2ae319f28b6fc4de3"}, + {file = "pyzmq-26.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:29c6a4635eef69d68a00321e12a7d2559fe2dfccfa8efae3ffb8e91cd0b36a8b"}, + {file = "pyzmq-26.2.0-cp312-cp312-win32.whl", hash = "sha256:989d842dc06dc59feea09e58c74ca3e1678c812a4a8a2a419046d711031f69c7"}, + {file = "pyzmq-26.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:2a50625acdc7801bc6f74698c5c583a491c61d73c6b7ea4dee3901bb99adb27a"}, + {file = "pyzmq-26.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:4d29ab8592b6ad12ebbf92ac2ed2bedcfd1cec192d8e559e2e099f648570e19b"}, + {file = "pyzmq-26.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9dd8cd1aeb00775f527ec60022004d030ddc51d783d056e3e23e74e623e33726"}, + {file = "pyzmq-26.2.0-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:28c812d9757fe8acecc910c9ac9dafd2ce968c00f9e619db09e9f8f54c3a68a3"}, + {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d80b1dd99c1942f74ed608ddb38b181b87476c6a966a88a950c7dee118fdf50"}, + {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c997098cc65e3208eca09303630e84d42718620e83b733d0fd69543a9cab9cb"}, + {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ad1bc8d1b7a18497dda9600b12dc193c577beb391beae5cd2349184db40f187"}, + {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:bea2acdd8ea4275e1278350ced63da0b166421928276c7c8e3f9729d7402a57b"}, + {file = "pyzmq-26.2.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:23f4aad749d13698f3f7b64aad34f5fc02d6f20f05999eebc96b89b01262fb18"}, + {file = "pyzmq-26.2.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:a4f96f0d88accc3dbe4a9025f785ba830f968e21e3e2c6321ccdfc9aef755115"}, + {file = "pyzmq-26.2.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ced65e5a985398827cc9276b93ef6dfabe0273c23de8c7931339d7e141c2818e"}, + {file = "pyzmq-26.2.0-cp313-cp313-win32.whl", hash = "sha256:31507f7b47cc1ead1f6e86927f8ebb196a0bab043f6345ce070f412a59bf87b5"}, + {file = "pyzmq-26.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:70fc7fcf0410d16ebdda9b26cbd8bf8d803d220a7f3522e060a69a9c87bf7bad"}, + {file = "pyzmq-26.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:c3789bd5768ab5618ebf09cef6ec2b35fed88709b104351748a63045f0ff9797"}, + {file = "pyzmq-26.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:034da5fc55d9f8da09015d368f519478a52675e558c989bfcb5cf6d4e16a7d2a"}, + {file = "pyzmq-26.2.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:c92d73464b886931308ccc45b2744e5968cbaade0b1d6aeb40d8ab537765f5bc"}, + {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:794a4562dcb374f7dbbfb3f51d28fb40123b5a2abadee7b4091f93054909add5"}, + {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aee22939bb6075e7afededabad1a56a905da0b3c4e3e0c45e75810ebe3a52672"}, + {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ae90ff9dad33a1cfe947d2c40cb9cb5e600d759ac4f0fd22616ce6540f72797"}, + {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:43a47408ac52647dfabbc66a25b05b6a61700b5165807e3fbd40063fcaf46386"}, + {file = "pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:25bf2374a2a8433633c65ccb9553350d5e17e60c8eb4de4d92cc6bd60f01d306"}, + {file = "pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_i686.whl", hash = "sha256:007137c9ac9ad5ea21e6ad97d3489af654381324d5d3ba614c323f60dab8fae6"}, + {file = "pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:470d4a4f6d48fb34e92d768b4e8a5cc3780db0d69107abf1cd7ff734b9766eb0"}, + {file = "pyzmq-26.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3b55a4229ce5da9497dd0452b914556ae58e96a4381bb6f59f1305dfd7e53fc8"}, + {file = "pyzmq-26.2.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9cb3a6460cdea8fe8194a76de8895707e61ded10ad0be97188cc8463ffa7e3a8"}, + {file = "pyzmq-26.2.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8ab5cad923cc95c87bffee098a27856c859bd5d0af31bd346035aa816b081fe1"}, + {file = "pyzmq-26.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ed69074a610fad1c2fda66180e7b2edd4d31c53f2d1872bc2d1211563904cd9"}, + {file = "pyzmq-26.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:cccba051221b916a4f5e538997c45d7d136a5646442b1231b916d0164067ea27"}, + {file = "pyzmq-26.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:0eaa83fc4c1e271c24eaf8fb083cbccef8fde77ec8cd45f3c35a9a123e6da097"}, + {file = "pyzmq-26.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9edda2df81daa129b25a39b86cb57dfdfe16f7ec15b42b19bfac503360d27a93"}, + {file = "pyzmq-26.2.0-cp37-cp37m-win32.whl", hash = "sha256:ea0eb6af8a17fa272f7b98d7bebfab7836a0d62738e16ba380f440fceca2d951"}, + {file = "pyzmq-26.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:4ff9dc6bc1664bb9eec25cd17506ef6672d506115095411e237d571e92a58231"}, + {file = "pyzmq-26.2.0-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:2eb7735ee73ca1b0d71e0e67c3739c689067f055c764f73aac4cc8ecf958ee3f"}, + {file = "pyzmq-26.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a534f43bc738181aa7cbbaf48e3eca62c76453a40a746ab95d4b27b1111a7d2"}, + {file = "pyzmq-26.2.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:aedd5dd8692635813368e558a05266b995d3d020b23e49581ddd5bbe197a8ab6"}, + {file = "pyzmq-26.2.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8be4700cd8bb02cc454f630dcdf7cfa99de96788b80c51b60fe2fe1dac480289"}, + {file = "pyzmq-26.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fcc03fa4997c447dce58264e93b5aa2d57714fbe0f06c07b7785ae131512732"}, + {file = "pyzmq-26.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:402b190912935d3db15b03e8f7485812db350d271b284ded2b80d2e5704be780"}, + {file = "pyzmq-26.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8685fa9c25ff00f550c1fec650430c4b71e4e48e8d852f7ddcf2e48308038640"}, + {file = "pyzmq-26.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:76589c020680778f06b7e0b193f4b6dd66d470234a16e1df90329f5e14a171cd"}, + {file = "pyzmq-26.2.0-cp38-cp38-win32.whl", hash = "sha256:8423c1877d72c041f2c263b1ec6e34360448decfb323fa8b94e85883043ef988"}, + {file = "pyzmq-26.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:76589f2cd6b77b5bdea4fca5992dc1c23389d68b18ccc26a53680ba2dc80ff2f"}, + {file = "pyzmq-26.2.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:b1d464cb8d72bfc1a3adc53305a63a8e0cac6bc8c5a07e8ca190ab8d3faa43c2"}, + {file = "pyzmq-26.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4da04c48873a6abdd71811c5e163bd656ee1b957971db7f35140a2d573f6949c"}, + {file = "pyzmq-26.2.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d049df610ac811dcffdc147153b414147428567fbbc8be43bb8885f04db39d98"}, + {file = "pyzmq-26.2.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:05590cdbc6b902101d0e65d6a4780af14dc22914cc6ab995d99b85af45362cc9"}, + {file = "pyzmq-26.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c811cfcd6a9bf680236c40c6f617187515269ab2912f3d7e8c0174898e2519db"}, + {file = "pyzmq-26.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6835dd60355593de10350394242b5757fbbd88b25287314316f266e24c61d073"}, + {file = "pyzmq-26.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc6bee759a6bddea5db78d7dcd609397449cb2d2d6587f48f3ca613b19410cfc"}, + {file = "pyzmq-26.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c530e1eecd036ecc83c3407f77bb86feb79916d4a33d11394b8234f3bd35b940"}, + {file = "pyzmq-26.2.0-cp39-cp39-win32.whl", hash = "sha256:367b4f689786fca726ef7a6c5ba606958b145b9340a5e4808132cc65759abd44"}, + {file = "pyzmq-26.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:e6fa2e3e683f34aea77de8112f6483803c96a44fd726d7358b9888ae5bb394ec"}, + {file = "pyzmq-26.2.0-cp39-cp39-win_arm64.whl", hash = "sha256:7445be39143a8aa4faec43b076e06944b8f9d0701b669df4af200531b21e40bb"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:706e794564bec25819d21a41c31d4df2d48e1cc4b061e8d345d7fb4dd3e94072"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b435f2753621cd36e7c1762156815e21c985c72b19135dac43a7f4f31d28dd1"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:160c7e0a5eb178011e72892f99f918c04a131f36056d10d9c1afb223fc952c2d"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c4a71d5d6e7b28a47a394c0471b7e77a0661e2d651e7ae91e0cab0a587859ca"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:90412f2db8c02a3864cbfc67db0e3dcdbda336acf1c469526d3e869394fe001c"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2ea4ad4e6a12e454de05f2949d4beddb52460f3de7c8b9d5c46fbb7d7222e02c"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fc4f7a173a5609631bb0c42c23d12c49df3966f89f496a51d3eb0ec81f4519d6"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:878206a45202247781472a2d99df12a176fef806ca175799e1c6ad263510d57c"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17c412bad2eb9468e876f556eb4ee910e62d721d2c7a53c7fa31e643d35352e6"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:0d987a3ae5a71c6226b203cfd298720e0086c7fe7c74f35fa8edddfbd6597eed"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:39887ac397ff35b7b775db7201095fc6310a35fdbae85bac4523f7eb3b840e20"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fdb5b3e311d4d4b0eb8b3e8b4d1b0a512713ad7e6a68791d0923d1aec433d919"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:226af7dcb51fdb0109f0016449b357e182ea0ceb6b47dfb5999d569e5db161d5"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bed0e799e6120b9c32756203fb9dfe8ca2fb8467fed830c34c877e25638c3fc"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:29c7947c594e105cb9e6c466bace8532dc1ca02d498684128b339799f5248277"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cdeabcff45d1c219636ee2e54d852262e5c2e085d6cb476d938aee8d921356b3"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35cffef589bcdc587d06f9149f8d5e9e8859920a071df5a2671de2213bef592a"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18c8dc3b7468d8b4bdf60ce9d7141897da103c7a4690157b32b60acb45e333e6"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7133d0a1677aec369d67dd78520d3fa96dd7f3dcec99d66c1762870e5ea1a50a"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6a96179a24b14fa6428cbfc08641c779a53f8fcec43644030328f44034c7f1f4"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4f78c88905461a9203eac9faac157a2a0dbba84a0fd09fd29315db27be40af9f"}, + {file = "pyzmq-26.2.0.tar.gz", hash = "sha256:070672c258581c8e4f640b5159297580a9974b026043bd4ab0470be9ed324f1f"}, ] [package.dependencies] @@ -2242,13 +2349,13 @@ cffi = {version = "*", markers = "implementation_name == \"pypy\""} [[package]] name = "requests" -version = "2.31.0" +version = "2.32.3" description = "Python HTTP for Humans." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, - {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, ] [package.dependencies] @@ -2380,19 +2487,23 @@ test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeo [[package]] name = "setuptools" -version = "69.5.1" +version = "75.1.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-69.5.1-py3-none-any.whl", hash = "sha256:c636ac361bc47580504644275c9ad802c50415c7522212252c033bd15f301f32"}, - {file = "setuptools-69.5.1.tar.gz", hash = "sha256:6c1fccdac05a97e598fb0ae3bbed5904ccb317337a51139dcd51453611bbb987"}, + {file = "setuptools-75.1.0-py3-none-any.whl", hash = "sha256:35ab7fd3bcd95e6b7fd704e4a1539513edad446c097797f2985e0e4b960772f2"}, + {file = "setuptools-75.1.0.tar.gz", hash = "sha256:d59a21b17a275fb872a9c3dae73963160ae079f1049ed956880cd7c09b120538"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mypy (==1.9)", "packaging (>=23.2)", "pip (>=19.1)", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.5.2)"] +core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.collections", "jaraco.functools", "jaraco.text (>=3.7)", "more-itertools", "more-itertools (>=8.8)", "packaging", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] +type = ["importlib-metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (==1.11.*)", "pytest-mypy"] [[package]] name = "six" @@ -2478,17 +2589,20 @@ test = ["black (>=19.3b0)", "commonmark (==0.9.1)", "coverage (>=4.4,<5.0)", "nb [[package]] name = "sympy" -version = "1.12" +version = "1.13.3" description = "Computer algebra system (CAS) in Python" optional = false python-versions = ">=3.8" files = [ - {file = "sympy-1.12-py3-none-any.whl", hash = "sha256:c3588cd4295d0c0f603d0f2ae780587e64e2efeedb3521e46b9bb1d08d184fa5"}, - {file = "sympy-1.12.tar.gz", hash = "sha256:ebf595c8dac3e0fdc4152c51878b498396ec7f30e7a914d6071e674d49420fb8"}, + {file = "sympy-1.13.3-py3-none-any.whl", hash = "sha256:54612cf55a62755ee71824ce692986f23c88ffa77207b30c1368eda4a7060f73"}, + {file = "sympy-1.13.3.tar.gz", hash = "sha256:b27fd2c6530e0ab39e275fc9b683895367e51d5da91baa8d3d64db2565fec4d9"}, ] [package.dependencies] -mpmath = ">=0.19" +mpmath = ">=1.1.0,<1.4" + +[package.extras] +dev = ["hypothesis (>=6.70.0)", "pytest (>=7.1.0)"] [[package]] name = "tensorboard" @@ -2614,13 +2728,13 @@ tests = ["pytest", "pytest-cov"] [[package]] name = "threadpoolctl" -version = "3.4.0" +version = "3.5.0" description = "threadpoolctl" optional = false python-versions = ">=3.8" files = [ - {file = "threadpoolctl-3.4.0-py3-none-any.whl", hash = "sha256:8f4c689a65b23e5ed825c8436a92b818aac005e0f3715f6a1664d7c7ee29d262"}, - {file = "threadpoolctl-3.4.0.tar.gz", hash = "sha256:f11b491a03661d6dd7ef692dd422ab34185d982466c49c8f98c8f716b5c93196"}, + {file = "threadpoolctl-3.5.0-py3-none-any.whl", hash = "sha256:56c1e26c150397e58c4926da8eeee87533b1e32bef131bd4bf6a2f45f3185467"}, + {file = "threadpoolctl-3.5.0.tar.gz", hash = "sha256:082433502dd922bf738de0d8bcc4fdcbf0979ff44c42bd40f5af8a282f6fa107"}, ] [[package]] @@ -2678,13 +2792,13 @@ opt-einsum = ["opt-einsum (>=3.3)"] [[package]] name = "torch-geometric" -version = "2.5.2" +version = "2.6.1" description = "Graph Neural Network Library for PyTorch" optional = false python-versions = ">=3.8" files = [ - {file = "torch_geometric-2.5.2-py3-none-any.whl", hash = "sha256:4d0ee1d4f22ef6008dac4eaae38a7a7c3cd5956837280312c1e99f39340d21ba"}, - {file = "torch_geometric-2.5.2.tar.gz", hash = "sha256:92059e98cf0334f264606c013df838d4411f461c3871e6b64723b5c40f6dec59"}, + {file = "torch_geometric-2.6.1-py3-none-any.whl", hash = "sha256:8faeb353f9655f7dbec44c5e0b44c721773bdfb279994da96b9b8b12fd30f427"}, + {file = "torch_geometric-2.6.1.tar.gz", hash = "sha256:1f18f9d0fc4d2239d526221e4f22606a4a3895b5d965a9856d27610a3df662c6"}, ] [package.dependencies] @@ -2695,27 +2809,25 @@ numpy = "*" psutil = ">=5.8.0" pyparsing = "*" requests = "*" -scikit-learn = "*" -scipy = "*" tqdm = "*" [package.extras] benchmark = ["matplotlib", "networkx", "pandas", "protobuf (<4.21)", "wandb"] -dev = ["pre-commit", "torch_geometric[test]"] -full = ["ase", "captum (<0.7.0)", "graphviz", "h5py", "matplotlib", "networkx", "numba", "opt_einsum", "pandas", "pgmpy", "pynndescent", "pytorch-memlab", "rdflib", "rdkit", "scikit-image", "statsmodels", "sympy", "tabulate", "torch_geometric[graphgym,modelhub]", "torchmetrics", "trimesh"] -graphgym = ["hydra-core", "protobuf (<4.21)", "pytorch-lightning", "yacs"] +dev = ["ipython", "matplotlib-inline", "pre-commit", "torch_geometric[test]"] +full = ["ase", "captum (<0.7.0)", "graphviz", "h5py", "matplotlib", "networkx", "numba (<0.60.0)", "opt_einsum", "pandas", "pgmpy", "pynndescent", "pytorch-memlab", "rdflib", "rdkit", "scikit-image", "scikit-learn", "scipy", "statsmodels", "sympy", "tabulate", "torch_geometric[graphgym,modelhub]", "torchmetrics", "trimesh"] +graphgym = ["protobuf (<4.21)", "pytorch-lightning (<2.3.0)", "yacs"] modelhub = ["huggingface_hub"] test = ["onnx", "onnxruntime", "pytest", "pytest-cov"] [[package]] name = "torchmetrics" -version = "1.3.2" +version = "1.4.2" description = "PyTorch native Metrics" optional = false python-versions = ">=3.8" files = [ - {file = "torchmetrics-1.3.2-py3-none-any.whl", hash = "sha256:44ca3a9f86dc050cb3f554836ef291698ea797778457195b4f685fce8e2e64a3"}, - {file = "torchmetrics-1.3.2.tar.gz", hash = "sha256:0a67694a4c4265eeb54cda741eaf5cb1f3a71da74b7e7e6215ad156c9f2379f6"}, + {file = "torchmetrics-1.4.2-py3-none-any.whl", hash = "sha256:87b9eca51ff6f93985a0f9db509f646cb45425b016f4d2f383d8c28d40dde5b6"}, + {file = "torchmetrics-1.4.2.tar.gz", hash = "sha256:7a40cbec85e5645090812b87601696b4adf158294ec8c407ae58a71710938b87"}, ] [package.dependencies] @@ -2726,15 +2838,15 @@ torch = ">=1.10.0" typing-extensions = {version = "*", markers = "python_version < \"3.9\""} [package.extras] -all = ["SciencePlots (>=2.0.0)", "ipadic (>=1.0.0)", "matplotlib (>=3.3.0)", "mecab-ko (>=1.0.0)", "mecab-ko-dic (>=1.0.0)", "mecab-python3 (>=1.0.6)", "mypy (==1.8.0)", "nltk (>=3.6)", "piq (<=0.8.0)", "pycocotools (>2.0.0)", "pystoi (>=0.3.0)", "regex (>=2021.9.24)", "scipy (>1.0.0)", "sentencepiece (>=0.2.0)", "torch (==2.2.1)", "torch-fidelity (<=0.4.0)", "torchaudio (>=0.10.0)", "torchvision (>=0.8)", "tqdm (>=4.41.0)", "transformers (>4.4.0)", "transformers (>=4.10.0)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"] -audio = ["pystoi (>=0.3.0)", "torchaudio (>=0.10.0)"] +all = ["SciencePlots (>=2.0.0)", "gammatone (>1.0.0)", "ipadic (>=1.0.0)", "matplotlib (>=3.6.0)", "mecab-python3 (>=1.0.6)", "mypy (==1.11.2)", "nltk (>=3.8.2)", "pesq (>=0.0.4)", "piq (<=0.8.0)", "pycocotools (>2.0.0)", "pystoi (>=0.3.0)", "regex (>=2021.9.24)", "scipy (>1.0.0)", "sentencepiece (>=0.2.0)", "torch (==2.4.1)", "torch-fidelity (<=0.4.0)", "torchaudio (>=0.10.0)", "torchvision (>=0.8)", "tqdm (>=4.41.0)", "transformers (>4.4.0)", "transformers (>=4.42.3)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"] +audio = ["gammatone (>1.0.0)", "pesq (>=0.0.4)", "pystoi (>=0.3.0)", "torchaudio (>=0.10.0)"] detection = ["pycocotools (>2.0.0)", "torchvision (>=0.8)"] -dev = ["SciencePlots (>=2.0.0)", "bert-score (==0.3.13)", "dython (<=0.7.5)", "fairlearn", "fast-bss-eval (>=0.1.0)", "faster-coco-eval (>=1.3.3)", "huggingface-hub (<0.22)", "ipadic (>=1.0.0)", "jiwer (>=2.3.0)", "kornia (>=0.6.7)", "lpips (<=0.1.4)", "matplotlib (>=3.3.0)", "mecab-ko (>=1.0.0)", "mecab-ko-dic (>=1.0.0)", "mecab-python3 (>=1.0.6)", "mir-eval (>=0.6)", "monai (==1.3.0)", "mypy (==1.8.0)", "netcal (>1.0.0)", "nltk (>=3.6)", "numpy (<1.25.0)", "pandas (>1.0.0)", "pandas (>=1.4.0)", "piq (<=0.8.0)", "pycocotools (>2.0.0)", "pystoi (>=0.3.0)", "pytorch-msssim (==1.0.0)", "regex (>=2021.9.24)", "rouge-score (>0.1.0)", "sacrebleu (>=2.3.0)", "scikit-image (>=0.19.0)", "scipy (>1.0.0)", "sentencepiece (>=0.2.0)", "sewar (>=0.4.4)", "statsmodels (>0.13.5)", "torch (==2.2.1)", "torch-complex (<=0.4.3)", "torch-fidelity (<=0.4.0)", "torchaudio (>=0.10.0)", "torchvision (>=0.8)", "tqdm (>=4.41.0)", "transformers (>4.4.0)", "transformers (>=4.10.0)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"] +dev = ["SciencePlots (>=2.0.0)", "bert-score (==0.3.13)", "dython (>=0.7.6,<0.8.0)", "fairlearn", "fast-bss-eval (>=0.1.0)", "faster-coco-eval (==1.5.*)", "gammatone (>1.0.0)", "huggingface-hub (<0.25)", "ipadic (>=1.0.0)", "jiwer (>=2.3.0)", "kornia (>=0.6.7)", "lpips (<=0.1.4)", "matplotlib (>=3.6.0)", "mecab-ko (>=1.0.0)", "mecab-ko-dic (>=1.0.0)", "mecab-python3 (>=1.0.6)", "mir-eval (>=0.6)", "monai (==1.3.2)", "mypy (==1.11.2)", "netcal (>1.0.0)", "nltk (>=3.8.2)", "numpy (<2.2.0)", "pandas (>1.4.0)", "pesq (>=0.0.4)", "piq (<=0.8.0)", "pycocotools (>2.0.0)", "pystoi (>=0.3.0)", "pytorch-msssim (==1.0.0)", "regex (>=2021.9.24)", "rouge-score (>0.1.0)", "sacrebleu (>=2.3.0)", "scikit-image (>=0.19.0)", "scipy (>1.0.0)", "sentencepiece (>=0.2.0)", "sewar (>=0.4.4)", "statsmodels (>0.13.5)", "torch (==2.4.1)", "torch-complex (<0.5.0)", "torch-fidelity (<=0.4.0)", "torchaudio (>=0.10.0)", "torchvision (>=0.8)", "tqdm (>=4.41.0)", "transformers (>4.4.0)", "transformers (>=4.42.3)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"] image = ["scipy (>1.0.0)", "torch-fidelity (<=0.4.0)", "torchvision (>=0.8)"] -multimodal = ["piq (<=0.8.0)", "transformers (>=4.10.0)"] -text = ["ipadic (>=1.0.0)", "mecab-ko (>=1.0.0)", "mecab-ko-dic (>=1.0.0)", "mecab-python3 (>=1.0.6)", "nltk (>=3.6)", "regex (>=2021.9.24)", "sentencepiece (>=0.2.0)", "tqdm (>=4.41.0)", "transformers (>4.4.0)"] -typing = ["mypy (==1.8.0)", "torch (==2.2.1)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"] -visual = ["SciencePlots (>=2.0.0)", "matplotlib (>=3.3.0)"] +multimodal = ["piq (<=0.8.0)", "transformers (>=4.42.3)"] +text = ["ipadic (>=1.0.0)", "mecab-python3 (>=1.0.6)", "nltk (>=3.8.2)", "regex (>=2021.9.24)", "sentencepiece (>=0.2.0)", "tqdm (>=4.41.0)", "transformers (>4.4.0)"] +typing = ["mypy (==1.11.2)", "torch (==2.4.1)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"] +visual = ["SciencePlots (>=2.0.0)", "matplotlib (>=3.6.0)"] [[package]] name = "torchvision" @@ -2776,33 +2888,33 @@ scipy = ["scipy"] [[package]] name = "tornado" -version = "6.4" +version = "6.4.1" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." optional = false -python-versions = ">= 3.8" +python-versions = ">=3.8" files = [ - {file = "tornado-6.4-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:02ccefc7d8211e5a7f9e8bc3f9e5b0ad6262ba2fbb683a6443ecc804e5224ce0"}, - {file = "tornado-6.4-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:27787de946a9cffd63ce5814c33f734c627a87072ec7eed71f7fc4417bb16263"}, - {file = "tornado-6.4-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7894c581ecdcf91666a0912f18ce5e757213999e183ebfc2c3fdbf4d5bd764e"}, - {file = "tornado-6.4-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e43bc2e5370a6a8e413e1e1cd0c91bedc5bd62a74a532371042a18ef19e10579"}, - {file = "tornado-6.4-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0251554cdd50b4b44362f73ad5ba7126fc5b2c2895cc62b14a1c2d7ea32f212"}, - {file = "tornado-6.4-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fd03192e287fbd0899dd8f81c6fb9cbbc69194d2074b38f384cb6fa72b80e9c2"}, - {file = "tornado-6.4-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:88b84956273fbd73420e6d4b8d5ccbe913c65d31351b4c004ae362eba06e1f78"}, - {file = "tornado-6.4-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:71ddfc23a0e03ef2df1c1397d859868d158c8276a0603b96cf86892bff58149f"}, - {file = "tornado-6.4-cp38-abi3-win32.whl", hash = "sha256:6f8a6c77900f5ae93d8b4ae1196472d0ccc2775cc1dfdc9e7727889145c45052"}, - {file = "tornado-6.4-cp38-abi3-win_amd64.whl", hash = "sha256:10aeaa8006333433da48dec9fe417877f8bcc21f48dda8d661ae79da357b2a63"}, - {file = "tornado-6.4.tar.gz", hash = "sha256:72291fa6e6bc84e626589f1c29d90a5a6d593ef5ae68052ee2ef000dfd273dee"}, + {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:163b0aafc8e23d8cdc3c9dfb24c5368af84a81e3364745ccb4427669bf84aec8"}, + {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6d5ce3437e18a2b66fbadb183c1d3364fb03f2be71299e7d10dbeeb69f4b2a14"}, + {file = "tornado-6.4.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2e20b9113cd7293f164dc46fffb13535266e713cdb87bd2d15ddb336e96cfc4"}, + {file = "tornado-6.4.1-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ae50a504a740365267b2a8d1a90c9fbc86b780a39170feca9bcc1787ff80842"}, + {file = "tornado-6.4.1-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:613bf4ddf5c7a95509218b149b555621497a6cc0d46ac341b30bd9ec19eac7f3"}, + {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:25486eb223babe3eed4b8aecbac33b37e3dd6d776bc730ca14e1bf93888b979f"}, + {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:454db8a7ecfcf2ff6042dde58404164d969b6f5d58b926da15e6b23817950fc4"}, + {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a02a08cc7a9314b006f653ce40483b9b3c12cda222d6a46d4ac63bb6c9057698"}, + {file = "tornado-6.4.1-cp38-abi3-win32.whl", hash = "sha256:d9a566c40b89757c9aa8e6f032bcdb8ca8795d7c1a9762910c722b1635c9de4d"}, + {file = "tornado-6.4.1-cp38-abi3-win_amd64.whl", hash = "sha256:b24b8982ed444378d7f21d563f4180a2de31ced9d8d84443907a0a64da2072e7"}, + {file = "tornado-6.4.1.tar.gz", hash = "sha256:92d3ab53183d8c50f8204a51e6f91d18a15d5ef261e84d452800d4ff6fc504e9"}, ] [[package]] name = "tqdm" -version = "4.66.2" +version = "4.66.5" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" files = [ - {file = "tqdm-4.66.2-py3-none-any.whl", hash = "sha256:1ee4f8a893eb9bef51c6e35730cebf234d5d0b6bd112b0271e10ed7c24a02bd9"}, - {file = "tqdm-4.66.2.tar.gz", hash = "sha256:6cd52cdf0fef0e0f543299cfc96fec90d7b8a7e88745f411ec33eb44d5ed3531"}, + {file = "tqdm-4.66.5-py3-none-any.whl", hash = "sha256:90279a3770753eafc9194a0364852159802111925aa30eb3f9d85b0e805ac7cd"}, + {file = "tqdm-4.66.5.tar.gz", hash = "sha256:e1020aef2e5096702d8a025ac7d16b1577279c9d63f8375b63083e9a5f0fcbad"}, ] [package.dependencies] @@ -2816,18 +2928,18 @@ telegram = ["requests"] [[package]] name = "traitlets" -version = "5.14.2" +version = "5.14.3" description = "Traitlets Python configuration system" optional = false python-versions = ">=3.8" files = [ - {file = "traitlets-5.14.2-py3-none-any.whl", hash = "sha256:fcdf85684a772ddeba87db2f398ce00b40ff550d1528c03c14dbf6a02003cd80"}, - {file = "traitlets-5.14.2.tar.gz", hash = "sha256:8cdd83c040dab7d1dee822678e5f5d100b514f7b72b01615b26fc5718916fdf9"}, + {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, + {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, ] [package.extras] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] -test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.1)", "pytest-mock", "pytest-mypy-testing"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.2)", "pytest-mock", "pytest-mypy-testing"] [[package]] name = "triton" @@ -2856,35 +2968,35 @@ tutorials = ["matplotlib", "pandas", "tabulate"] [[package]] name = "typing-extensions" -version = "4.11.0" +version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.11.0-py3-none-any.whl", hash = "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a"}, - {file = "typing_extensions-4.11.0.tar.gz", hash = "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0"}, + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] [[package]] name = "tzdata" -version = "2024.1" +version = "2024.2" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" files = [ - {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, - {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, + {file = "tzdata-2024.2-py2.py3-none-any.whl", hash = "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd"}, + {file = "tzdata-2024.2.tar.gz", hash = "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc"}, ] [[package]] name = "urllib3" -version = "2.2.1" +version = "2.2.3" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ - {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, - {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, + {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, + {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, ] [package.extras] @@ -2906,13 +3018,13 @@ files = [ [[package]] name = "werkzeug" -version = "3.0.2" +version = "3.0.4" description = "The comprehensive WSGI web application library." optional = false python-versions = ">=3.8" files = [ - {file = "werkzeug-3.0.2-py3-none-any.whl", hash = "sha256:3aac3f5da756f93030740bc235d3e09449efcf65f2f55e3602e1d851b8f48795"}, - {file = "werkzeug-3.0.2.tar.gz", hash = "sha256:e39b645a6ac92822588e7b39a692e7828724ceae0b0d702ef96701f90e70128d"}, + {file = "werkzeug-3.0.4-py3-none-any.whl", hash = "sha256:02c9eb92b7d6c06f31a782811505d2157837cea66aaede3e217c7c27c039476c"}, + {file = "werkzeug-3.0.4.tar.gz", hash = "sha256:34f2371506b250df4d4f84bfe7b0921e4762525762bbd936614909fe25cd7306"}, ] [package.dependencies] @@ -2923,13 +3035,13 @@ watchdog = ["watchdog (>=2.3)"] [[package]] name = "wheel" -version = "0.43.0" +version = "0.44.0" description = "A built-package format for Python" optional = false python-versions = ">=3.8" files = [ - {file = "wheel-0.43.0-py3-none-any.whl", hash = "sha256:55c570405f142630c6b9f72fe09d9b67cf1477fcf543ae5b8dcb1f5b7377da81"}, - {file = "wheel-0.43.0.tar.gz", hash = "sha256:465ef92c69fa5c5da2d1cf8ac40559a8c940886afcef87dcf14b9470862f1d85"}, + {file = "wheel-0.44.0-py3-none-any.whl", hash = "sha256:2376a90c98cc337d18623527a97c31797bd02bad0033d41547043a1cbfbe448f"}, + {file = "wheel-0.44.0.tar.gz", hash = "sha256:a29c3f2817e95ab89aa4660681ad547c0e9547f20e75b0562fe7723c9a2a9d49"}, ] [package.extras] @@ -3016,101 +3128,103 @@ files = [ [[package]] name = "yarl" -version = "1.9.4" +version = "1.13.1" description = "Yet another URL library" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a8c1df72eb746f4136fe9a2e72b0c9dc1da1cbd23b5372f94b5820ff8ae30e0e"}, - {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a3a6ed1d525bfb91b3fc9b690c5a21bb52de28c018530ad85093cc488bee2dd2"}, - {file = "yarl-1.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c38c9ddb6103ceae4e4498f9c08fac9b590c5c71b0370f98714768e22ac6fa66"}, - {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9e09c9d74f4566e905a0b8fa668c58109f7624db96a2171f21747abc7524234"}, - {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8477c1ee4bd47c57d49621a062121c3023609f7a13b8a46953eb6c9716ca392"}, - {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5ff2c858f5f6a42c2a8e751100f237c5e869cbde669a724f2062d4c4ef93551"}, - {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:357495293086c5b6d34ca9616a43d329317feab7917518bc97a08f9e55648455"}, - {file = "yarl-1.9.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54525ae423d7b7a8ee81ba189f131054defdb122cde31ff17477951464c1691c"}, - {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:801e9264d19643548651b9db361ce3287176671fb0117f96b5ac0ee1c3530d53"}, - {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e516dc8baf7b380e6c1c26792610230f37147bb754d6426462ab115a02944385"}, - {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:7d5aaac37d19b2904bb9dfe12cdb08c8443e7ba7d2852894ad448d4b8f442863"}, - {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:54beabb809ffcacbd9d28ac57b0db46e42a6e341a030293fb3185c409e626b8b"}, - {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bac8d525a8dbc2a1507ec731d2867025d11ceadcb4dd421423a5d42c56818541"}, - {file = "yarl-1.9.4-cp310-cp310-win32.whl", hash = "sha256:7855426dfbddac81896b6e533ebefc0af2f132d4a47340cee6d22cac7190022d"}, - {file = "yarl-1.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:848cd2a1df56ddbffeb375535fb62c9d1645dde33ca4d51341378b3f5954429b"}, - {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:35a2b9396879ce32754bd457d31a51ff0a9d426fd9e0e3c33394bf4b9036b099"}, - {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c7d56b293cc071e82532f70adcbd8b61909eec973ae9d2d1f9b233f3d943f2c"}, - {file = "yarl-1.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8a1c6c0be645c745a081c192e747c5de06e944a0d21245f4cf7c05e457c36e0"}, - {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b3c1ffe10069f655ea2d731808e76e0f452fc6c749bea04781daf18e6039525"}, - {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:549d19c84c55d11687ddbd47eeb348a89df9cb30e1993f1b128f4685cd0ebbf8"}, - {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7409f968456111140c1c95301cadf071bd30a81cbd7ab829169fb9e3d72eae9"}, - {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e23a6d84d9d1738dbc6e38167776107e63307dfc8ad108e580548d1f2c587f42"}, - {file = "yarl-1.9.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8b889777de69897406c9fb0b76cdf2fd0f31267861ae7501d93003d55f54fbe"}, - {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:03caa9507d3d3c83bca08650678e25364e1843b484f19986a527630ca376ecce"}, - {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e9035df8d0880b2f1c7f5031f33f69e071dfe72ee9310cfc76f7b605958ceb9"}, - {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:c0ec0ed476f77db9fb29bca17f0a8fcc7bc97ad4c6c1d8959c507decb22e8572"}, - {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:ee04010f26d5102399bd17f8df8bc38dc7ccd7701dc77f4a68c5b8d733406958"}, - {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49a180c2e0743d5d6e0b4d1a9e5f633c62eca3f8a86ba5dd3c471060e352ca98"}, - {file = "yarl-1.9.4-cp311-cp311-win32.whl", hash = "sha256:81eb57278deb6098a5b62e88ad8281b2ba09f2f1147c4767522353eaa6260b31"}, - {file = "yarl-1.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:d1d2532b340b692880261c15aee4dc94dd22ca5d61b9db9a8a361953d36410b1"}, - {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0d2454f0aef65ea81037759be5ca9947539667eecebca092733b2eb43c965a81"}, - {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:44d8ffbb9c06e5a7f529f38f53eda23e50d1ed33c6c869e01481d3fafa6b8142"}, - {file = "yarl-1.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:aaaea1e536f98754a6e5c56091baa1b6ce2f2700cc4a00b0d49eca8dea471074"}, - {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3777ce5536d17989c91696db1d459574e9a9bd37660ea7ee4d3344579bb6f129"}, - {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fc5fc1eeb029757349ad26bbc5880557389a03fa6ada41703db5e068881e5f2"}, - {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea65804b5dc88dacd4a40279af0cdadcfe74b3e5b4c897aa0d81cf86927fee78"}, - {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa102d6d280a5455ad6a0f9e6d769989638718e938a6a0a2ff3f4a7ff8c62cc4"}, - {file = "yarl-1.9.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09efe4615ada057ba2d30df871d2f668af661e971dfeedf0c159927d48bbeff0"}, - {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:008d3e808d03ef28542372d01057fd09168419cdc8f848efe2804f894ae03e51"}, - {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6f5cb257bc2ec58f437da2b37a8cd48f666db96d47b8a3115c29f316313654ff"}, - {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:992f18e0ea248ee03b5a6e8b3b4738850ae7dbb172cc41c966462801cbf62cf7"}, - {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0e9d124c191d5b881060a9e5060627694c3bdd1fe24c5eecc8d5d7d0eb6faabc"}, - {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3986b6f41ad22988e53d5778f91855dc0399b043fc8946d4f2e68af22ee9ff10"}, - {file = "yarl-1.9.4-cp312-cp312-win32.whl", hash = "sha256:4b21516d181cd77ebd06ce160ef8cc2a5e9ad35fb1c5930882baff5ac865eee7"}, - {file = "yarl-1.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:a9bd00dc3bc395a662900f33f74feb3e757429e545d831eef5bb280252631984"}, - {file = "yarl-1.9.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:63b20738b5aac74e239622d2fe30df4fca4942a86e31bf47a81a0e94c14df94f"}, - {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d7f7de27b8944f1fee2c26a88b4dabc2409d2fea7a9ed3df79b67277644e17"}, - {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c74018551e31269d56fab81a728f683667e7c28c04e807ba08f8c9e3bba32f14"}, - {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ca06675212f94e7a610e85ca36948bb8fc023e458dd6c63ef71abfd482481aa5"}, - {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5aef935237d60a51a62b86249839b51345f47564208c6ee615ed2a40878dccdd"}, - {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b134fd795e2322b7684155b7855cc99409d10b2e408056db2b93b51a52accc7"}, - {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d25039a474c4c72a5ad4b52495056f843a7ff07b632c1b92ea9043a3d9950f6e"}, - {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f7d6b36dd2e029b6bcb8a13cf19664c7b8e19ab3a58e0fefbb5b8461447ed5ec"}, - {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:957b4774373cf6f709359e5c8c4a0af9f6d7875db657adb0feaf8d6cb3c3964c"}, - {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d7eeb6d22331e2fd42fce928a81c697c9ee2d51400bd1a28803965883e13cead"}, - {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6a962e04b8f91f8c4e5917e518d17958e3bdee71fd1d8b88cdce74dd0ebbf434"}, - {file = "yarl-1.9.4-cp37-cp37m-win32.whl", hash = "sha256:f3bc6af6e2b8f92eced34ef6a96ffb248e863af20ef4fde9448cc8c9b858b749"}, - {file = "yarl-1.9.4-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4d7a90a92e528aadf4965d685c17dacff3df282db1121136c382dc0b6014d2"}, - {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ec61d826d80fc293ed46c9dd26995921e3a82146feacd952ef0757236fc137be"}, - {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8be9e837ea9113676e5754b43b940b50cce76d9ed7d2461df1af39a8ee674d9f"}, - {file = "yarl-1.9.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bef596fdaa8f26e3d66af846bbe77057237cb6e8efff8cd7cc8dff9a62278bbf"}, - {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d47552b6e52c3319fede1b60b3de120fe83bde9b7bddad11a69fb0af7db32f1"}, - {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84fc30f71689d7fc9168b92788abc977dc8cefa806909565fc2951d02f6b7d57"}, - {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4aa9741085f635934f3a2583e16fcf62ba835719a8b2b28fb2917bb0537c1dfa"}, - {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:206a55215e6d05dbc6c98ce598a59e6fbd0c493e2de4ea6cc2f4934d5a18d130"}, - {file = "yarl-1.9.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07574b007ee20e5c375a8fe4a0789fad26db905f9813be0f9fef5a68080de559"}, - {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5a2e2433eb9344a163aced6a5f6c9222c0786e5a9e9cac2c89f0b28433f56e23"}, - {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6ad6d10ed9b67a382b45f29ea028f92d25bc0bc1daf6c5b801b90b5aa70fb9ec"}, - {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:6fe79f998a4052d79e1c30eeb7d6c1c1056ad33300f682465e1b4e9b5a188b78"}, - {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a825ec844298c791fd28ed14ed1bffc56a98d15b8c58a20e0e08c1f5f2bea1be"}, - {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8619d6915b3b0b34420cf9b2bb6d81ef59d984cb0fde7544e9ece32b4b3043c3"}, - {file = "yarl-1.9.4-cp38-cp38-win32.whl", hash = "sha256:686a0c2f85f83463272ddffd4deb5e591c98aac1897d65e92319f729c320eece"}, - {file = "yarl-1.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:a00862fb23195b6b8322f7d781b0dc1d82cb3bcac346d1e38689370cc1cc398b"}, - {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:604f31d97fa493083ea21bd9b92c419012531c4e17ea6da0f65cacdcf5d0bd27"}, - {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8a854227cf581330ffa2c4824d96e52ee621dd571078a252c25e3a3b3d94a1b1"}, - {file = "yarl-1.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ba6f52cbc7809cd8d74604cce9c14868306ae4aa0282016b641c661f981a6e91"}, - {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6327976c7c2f4ee6816eff196e25385ccc02cb81427952414a64811037bbc8b"}, - {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8397a3817d7dcdd14bb266283cd1d6fc7264a48c186b986f32e86d86d35fbac5"}, - {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0381b4ce23ff92f8170080c97678040fc5b08da85e9e292292aba67fdac6c34"}, - {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23d32a2594cb5d565d358a92e151315d1b2268bc10f4610d098f96b147370136"}, - {file = "yarl-1.9.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ddb2a5c08a4eaaba605340fdee8fc08e406c56617566d9643ad8bf6852778fc7"}, - {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:26a1dc6285e03f3cc9e839a2da83bcbf31dcb0d004c72d0730e755b33466c30e"}, - {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:18580f672e44ce1238b82f7fb87d727c4a131f3a9d33a5e0e82b793362bf18b4"}, - {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:29e0f83f37610f173eb7e7b5562dd71467993495e568e708d99e9d1944f561ec"}, - {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:1f23e4fe1e8794f74b6027d7cf19dc25f8b63af1483d91d595d4a07eca1fb26c"}, - {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db8e58b9d79200c76956cefd14d5c90af54416ff5353c5bfd7cbe58818e26ef0"}, - {file = "yarl-1.9.4-cp39-cp39-win32.whl", hash = "sha256:c7224cab95645c7ab53791022ae77a4509472613e839dab722a72abe5a684575"}, - {file = "yarl-1.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:824d6c50492add5da9374875ce72db7a0733b29c2394890aef23d533106e2b15"}, - {file = "yarl-1.9.4-py3-none-any.whl", hash = "sha256:928cecb0ef9d5a7946eb6ff58417ad2fe9375762382f1bf5c55e61645f2c43ad"}, - {file = "yarl-1.9.4.tar.gz", hash = "sha256:566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf"}, + {file = "yarl-1.13.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:82e692fb325013a18a5b73a4fed5a1edaa7c58144dc67ad9ef3d604eccd451ad"}, + {file = "yarl-1.13.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df4e82e68f43a07735ae70a2d84c0353e58e20add20ec0af611f32cd5ba43fb4"}, + {file = "yarl-1.13.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ec9dd328016d8d25702a24ee274932aebf6be9787ed1c28d021945d264235b3c"}, + {file = "yarl-1.13.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5820bd4178e6a639b3ef1db8b18500a82ceab6d8b89309e121a6859f56585b05"}, + {file = "yarl-1.13.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86c438ce920e089c8c2388c7dcc8ab30dfe13c09b8af3d306bcabb46a053d6f7"}, + {file = "yarl-1.13.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3de86547c820e4f4da4606d1c8ab5765dd633189791f15247706a2eeabc783ae"}, + {file = "yarl-1.13.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ca53632007c69ddcdefe1e8cbc3920dd88825e618153795b57e6ebcc92e752a"}, + {file = "yarl-1.13.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d4ee1d240b84e2f213565f0ec08caef27a0e657d4c42859809155cf3a29d1735"}, + {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c49f3e379177f4477f929097f7ed4b0622a586b0aa40c07ac8c0f8e40659a1ac"}, + {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5c5e32fef09ce101fe14acd0f498232b5710effe13abac14cd95de9c274e689e"}, + {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ab9524e45ee809a083338a749af3b53cc7efec458c3ad084361c1dbf7aaf82a2"}, + {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:b1481c048fe787f65e34cb06f7d6824376d5d99f1231eae4778bbe5c3831076d"}, + {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:31497aefd68036d8e31bfbacef915826ca2e741dbb97a8d6c7eac66deda3b606"}, + {file = "yarl-1.13.1-cp310-cp310-win32.whl", hash = "sha256:1fa56f34b2236f5192cb5fceba7bbb09620e5337e0b6dfe2ea0ddbd19dd5b154"}, + {file = "yarl-1.13.1-cp310-cp310-win_amd64.whl", hash = "sha256:1bbb418f46c7f7355084833051701b2301092e4611d9e392360c3ba2e3e69f88"}, + {file = "yarl-1.13.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:216a6785f296169ed52cd7dcdc2612f82c20f8c9634bf7446327f50398732a51"}, + {file = "yarl-1.13.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:40c6e73c03a6befb85b72da213638b8aaa80fe4136ec8691560cf98b11b8ae6e"}, + {file = "yarl-1.13.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2430cf996113abe5aee387d39ee19529327205cda975d2b82c0e7e96e5fdabdc"}, + {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fb4134cc6e005b99fa29dbc86f1ea0a298440ab6b07c6b3ee09232a3b48f495"}, + {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:309c104ecf67626c033845b860d31594a41343766a46fa58c3309c538a1e22b2"}, + {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f90575e9fe3aae2c1e686393a9689c724cd00045275407f71771ae5d690ccf38"}, + {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d2e1626be8712333a9f71270366f4a132f476ffbe83b689dd6dc0d114796c74"}, + {file = "yarl-1.13.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b66c87da3c6da8f8e8b648878903ca54589038a0b1e08dde2c86d9cd92d4ac9"}, + {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cf1ad338620249f8dd6d4b6a91a69d1f265387df3697ad5dc996305cf6c26fb2"}, + {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9915300fe5a0aa663c01363db37e4ae8e7c15996ebe2c6cce995e7033ff6457f"}, + {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:703b0f584fcf157ef87816a3c0ff868e8c9f3c370009a8b23b56255885528f10"}, + {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:1d8e3ca29f643dd121f264a7c89f329f0fcb2e4461833f02de6e39fef80f89da"}, + {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7055bbade838d68af73aea13f8c86588e4bcc00c2235b4b6d6edb0dbd174e246"}, + {file = "yarl-1.13.1-cp311-cp311-win32.whl", hash = "sha256:a3442c31c11088e462d44a644a454d48110f0588de830921fd201060ff19612a"}, + {file = "yarl-1.13.1-cp311-cp311-win_amd64.whl", hash = "sha256:81bad32c8f8b5897c909bf3468bf601f1b855d12f53b6af0271963ee67fff0d2"}, + {file = "yarl-1.13.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f452cc1436151387d3d50533523291d5f77c6bc7913c116eb985304abdbd9ec9"}, + {file = "yarl-1.13.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9cec42a20eae8bebf81e9ce23fb0d0c729fc54cf00643eb251ce7c0215ad49fe"}, + {file = "yarl-1.13.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d959fe96e5c2712c1876d69af0507d98f0b0e8d81bee14cfb3f6737470205419"}, + {file = "yarl-1.13.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8c837ab90c455f3ea8e68bee143472ee87828bff19ba19776e16ff961425b57"}, + {file = "yarl-1.13.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:94a993f976cdcb2dc1b855d8b89b792893220db8862d1a619efa7451817c836b"}, + {file = "yarl-1.13.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b2442a415a5f4c55ced0fade7b72123210d579f7d950e0b5527fc598866e62c"}, + {file = "yarl-1.13.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3fdbf0418489525231723cdb6c79e7738b3cbacbaed2b750cb033e4ea208f220"}, + {file = "yarl-1.13.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6b7f6e699304717fdc265a7e1922561b02a93ceffdaefdc877acaf9b9f3080b8"}, + {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bcd5bf4132e6a8d3eb54b8d56885f3d3a38ecd7ecae8426ecf7d9673b270de43"}, + {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:2a93a4557f7fc74a38ca5a404abb443a242217b91cd0c4840b1ebedaad8919d4"}, + {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:22b739f99c7e4787922903f27a892744189482125cc7b95b747f04dd5c83aa9f"}, + {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:2db874dd1d22d4c2c657807562411ffdfabec38ce4c5ce48b4c654be552759dc"}, + {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4feaaa4742517eaceafcbe74595ed335a494c84634d33961214b278126ec1485"}, + {file = "yarl-1.13.1-cp312-cp312-win32.whl", hash = "sha256:bbf9c2a589be7414ac4a534d54e4517d03f1cbb142c0041191b729c2fa23f320"}, + {file = "yarl-1.13.1-cp312-cp312-win_amd64.whl", hash = "sha256:d07b52c8c450f9366c34aa205754355e933922c79135125541daae6cbf31c799"}, + {file = "yarl-1.13.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:95c6737f28069153c399d875317f226bbdea939fd48a6349a3b03da6829fb550"}, + {file = "yarl-1.13.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:cd66152561632ed4b2a9192e7f8e5a1d41e28f58120b4761622e0355f0fe034c"}, + {file = "yarl-1.13.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6a2acde25be0cf9be23a8f6cbd31734536a264723fca860af3ae5e89d771cd71"}, + {file = "yarl-1.13.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a18595e6a2ee0826bf7dfdee823b6ab55c9b70e8f80f8b77c37e694288f5de1"}, + {file = "yarl-1.13.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a31d21089894942f7d9a8df166b495101b7258ff11ae0abec58e32daf8088813"}, + {file = "yarl-1.13.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:45f209fb4bbfe8630e3d2e2052535ca5b53d4ce2d2026bed4d0637b0416830da"}, + {file = "yarl-1.13.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f722f30366474a99745533cc4015b1781ee54b08de73260b2bbe13316079851"}, + {file = "yarl-1.13.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3bf60444269345d712838bb11cc4eadaf51ff1a364ae39ce87a5ca8ad3bb2c8"}, + {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:942c80a832a79c3707cca46bd12ab8aa58fddb34b1626d42b05aa8f0bcefc206"}, + {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:44b07e1690f010c3c01d353b5790ec73b2f59b4eae5b0000593199766b3f7a5c"}, + {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:396e59b8de7e4d59ff5507fb4322d2329865b909f29a7ed7ca37e63ade7f835c"}, + {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:3bb83a0f12701c0b91112a11148b5217617982e1e466069d0555be9b372f2734"}, + {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c92b89bffc660f1274779cb6fbb290ec1f90d6dfe14492523a0667f10170de26"}, + {file = "yarl-1.13.1-cp313-cp313-win32.whl", hash = "sha256:269c201bbc01d2cbba5b86997a1e0f73ba5e2f471cfa6e226bcaa7fd664b598d"}, + {file = "yarl-1.13.1-cp313-cp313-win_amd64.whl", hash = "sha256:1d0828e17fa701b557c6eaed5edbd9098eb62d8838344486248489ff233998b8"}, + {file = "yarl-1.13.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8be8cdfe20787e6a5fcbd010f8066227e2bb9058331a4eccddec6c0db2bb85b2"}, + {file = "yarl-1.13.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:08d7148ff11cb8e886d86dadbfd2e466a76d5dd38c7ea8ebd9b0e07946e76e4b"}, + {file = "yarl-1.13.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4afdf84610ca44dcffe8b6c22c68f309aff96be55f5ea2fa31c0c225d6b83e23"}, + {file = "yarl-1.13.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0d12fe78dcf60efa205e9a63f395b5d343e801cf31e5e1dda0d2c1fb618073d"}, + {file = "yarl-1.13.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:298c1eecfd3257aa16c0cb0bdffb54411e3e831351cd69e6b0739be16b1bdaa8"}, + {file = "yarl-1.13.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c14c16831b565707149c742d87a6203eb5597f4329278446d5c0ae7a1a43928e"}, + {file = "yarl-1.13.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a9bacedbb99685a75ad033fd4de37129449e69808e50e08034034c0bf063f99"}, + {file = "yarl-1.13.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:658e8449b84b92a4373f99305de042b6bd0d19bf2080c093881e0516557474a5"}, + {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:373f16f38721c680316a6a00ae21cc178e3a8ef43c0227f88356a24c5193abd6"}, + {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:45d23c4668d4925688e2ea251b53f36a498e9ea860913ce43b52d9605d3d8177"}, + {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f7917697bcaa3bc3e83db91aa3a0e448bf5cde43c84b7fc1ae2427d2417c0224"}, + {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:5989a38ba1281e43e4663931a53fbf356f78a0325251fd6af09dd03b1d676a09"}, + {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:11b3ca8b42a024513adce810385fcabdd682772411d95bbbda3b9ed1a4257644"}, + {file = "yarl-1.13.1-cp38-cp38-win32.whl", hash = "sha256:dcaef817e13eafa547cdfdc5284fe77970b891f731266545aae08d6cce52161e"}, + {file = "yarl-1.13.1-cp38-cp38-win_amd64.whl", hash = "sha256:7addd26594e588503bdef03908fc207206adac5bd90b6d4bc3e3cf33a829f57d"}, + {file = "yarl-1.13.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a0ae6637b173d0c40b9c1462e12a7a2000a71a3258fa88756a34c7d38926911c"}, + {file = "yarl-1.13.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:576365c9f7469e1f6124d67b001639b77113cfd05e85ce0310f5f318fd02fe85"}, + {file = "yarl-1.13.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:78f271722423b2d4851cf1f4fa1a1c4833a128d020062721ba35e1a87154a049"}, + {file = "yarl-1.13.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d74f3c335cfe9c21ea78988e67f18eb9822f5d31f88b41aec3a1ec5ecd32da5"}, + {file = "yarl-1.13.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1891d69a6ba16e89473909665cd355d783a8a31bc84720902c5911dbb6373465"}, + {file = "yarl-1.13.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fb382fd7b4377363cc9f13ba7c819c3c78ed97c36a82f16f3f92f108c787cbbf"}, + {file = "yarl-1.13.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c8854b9f80693d20cec797d8e48a848c2fb273eb6f2587b57763ccba3f3bd4b"}, + {file = "yarl-1.13.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bbf2c3f04ff50f16404ce70f822cdc59760e5e2d7965905f0e700270feb2bbfc"}, + {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fb9f59f3848edf186a76446eb8bcf4c900fe147cb756fbbd730ef43b2e67c6a7"}, + {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ef9b85fa1bc91c4db24407e7c4da93a5822a73dd4513d67b454ca7064e8dc6a3"}, + {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:098b870c18f1341786f290b4d699504e18f1cd050ed179af8123fd8232513424"}, + {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:8c723c91c94a3bc8033dd2696a0f53e5d5f8496186013167bddc3fb5d9df46a3"}, + {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:44a4c40a6f84e4d5955b63462a0e2a988f8982fba245cf885ce3be7618f6aa7d"}, + {file = "yarl-1.13.1-cp39-cp39-win32.whl", hash = "sha256:84bbcdcf393139f0abc9f642bf03f00cac31010f3034faa03224a9ef0bb74323"}, + {file = "yarl-1.13.1-cp39-cp39-win_amd64.whl", hash = "sha256:fc2931ac9ce9c61c9968989ec831d3a5e6fcaaff9474e7cfa8de80b7aff5a093"}, + {file = "yarl-1.13.1-py3-none-any.whl", hash = "sha256:6a5185ad722ab4dd52d5fb1f30dcc73282eb1ed494906a92d1a228d3f89607b0"}, + {file = "yarl-1.13.1.tar.gz", hash = "sha256:ec8cfe2295f3e5e44c51f57272afbd69414ae629ec7c6b27f5a410efc78b70a0"}, ] [package.dependencies] @@ -3119,20 +3233,24 @@ multidict = ">=4.0" [[package]] name = "zipp" -version = "3.18.1" +version = "3.20.2" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.18.1-py3-none-any.whl", hash = "sha256:206f5a15f2af3dbaee80769fb7dc6f249695e940acca08dfb2a4769fe61e538b"}, - {file = "zipp-3.18.1.tar.gz", hash = "sha256:2884ed22e7d8961de1c9a05142eb69a247f120291bc0206a00a7642f09b5b715"}, + {file = "zipp-3.20.2-py3-none-any.whl", hash = "sha256:a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350"}, + {file = "zipp-3.20.2.tar.gz", hash = "sha256:bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] +type = ["pytest-mypy"] [metadata] lock-version = "2.0" python-versions = "~3.8" -content-hash = "ed548fc5ae476b61f868ad0c5efda7ae3b90750adca800b546645d3b6a6e5d78" +content-hash = "96067e895d3606373b258e77ec97a4a18d7269ec92ebd9bc00c244ff19239192" diff --git a/ChapterNN/pyproject.toml b/ChapterNN/pyproject.toml index a501f62..ff6ee97 100644 --- a/ChapterNN/pyproject.toml +++ b/ChapterNN/pyproject.toml @@ -17,6 +17,7 @@ tensorflow-io-gcs-filesystem = "==0.21.0" # This needs pinning - see https://sta stellargraph= "^1.2.1" protobuf= "^3.20" torch = "^2.1.0" +chardet = "==5.2.0" torch_geometric = "^2.5.2" torchvision = "^0.16.0" torchmetrics="^1.3.0" From d362ab5ab36a06035fe8e9840a0ba4df307b88c4 Mon Sep 17 00:00:00 2001 From: Enrico Deusebio Date: Wed, 2 Oct 2024 17:28:08 +0200 Subject: [PATCH 9/9] updating requirements.txt --- ChapterNN/requirements.txt | 108 +++++++++++++++++++------------------ 1 file changed, 55 insertions(+), 53 deletions(-) diff --git a/ChapterNN/requirements.txt b/ChapterNN/requirements.txt index 71bfd48..15027ec 100644 --- a/ChapterNN/requirements.txt +++ b/ChapterNN/requirements.txt @@ -1,53 +1,55 @@ absl-py==2.1.0 ; python_version >= "3.8" and python_version < "3.9" -aiohttp==3.9.4 ; python_version >= "3.8" and python_version < "3.9" +aiohappyeyeballs==2.4.3 ; python_version >= "3.8" and python_version < "3.9" +aiohttp==3.10.8 ; python_version >= "3.8" and python_version < "3.9" aiosignal==1.3.1 ; python_version >= "3.8" and python_version < "3.9" appnope==0.1.4 ; python_version >= "3.8" and python_version < "3.9" and (platform_system == "Darwin" or sys_platform == "darwin") asttokens==2.4.1 ; python_version >= "3.8" and python_version < "3.9" astunparse==1.6.3 ; python_version >= "3.8" and python_version < "3.9" async-timeout==4.0.3 ; python_version >= "3.8" and python_version < "3.9" -attrs==23.2.0 ; python_version >= "3.8" and python_version < "3.9" +attrs==24.2.0 ; python_version >= "3.8" and python_version < "3.9" backcall==0.2.0 ; python_version >= "3.8" and python_version < "3.9" -cachetools==5.3.3 ; python_version >= "3.8" and python_version < "3.9" -certifi==2024.2.2 ; python_version >= "3.8" and python_version < "3.9" -cffi==1.16.0 ; python_version >= "3.8" and python_version < "3.9" and implementation_name == "pypy" +cachetools==5.5.0 ; python_version >= "3.8" and python_version < "3.9" +certifi==2024.8.30 ; python_version >= "3.8" and python_version < "3.9" +cffi==1.17.1 ; python_version >= "3.8" and python_version < "3.9" and implementation_name == "pypy" +chardet==5.2.0 ; python_version >= "3.8" and python_version < "3.9" charset-normalizer==3.3.2 ; python_version >= "3.8" and python_version < "3.9" colorama==0.4.6 ; python_version >= "3.8" and python_version < "3.9" and (sys_platform == "win32" or platform_system == "Windows") comm==0.2.2 ; python_version >= "3.8" and python_version < "3.9" cycler==0.12.1 ; python_version >= "3.8" and python_version < "3.9" -debugpy==1.8.1 ; python_version >= "3.8" and python_version < "3.9" +debugpy==1.8.6 ; python_version >= "3.8" and python_version < "3.9" decorator==5.1.1 ; python_version >= "3.8" and python_version < "3.9" -executing==2.0.1 ; python_version >= "3.8" and python_version < "3.9" -filelock==3.13.4 ; python_version >= "3.8" and python_version < "3.9" +executing==2.1.0 ; python_version >= "3.8" and python_version < "3.9" +filelock==3.16.1 ; python_version >= "3.8" and python_version < "3.9" flatbuffers==2.0.7 ; python_version >= "3.8" and python_version < "3.9" frozenlist==1.4.1 ; python_version >= "3.8" and python_version < "3.9" -fsspec==2024.3.1 ; python_version >= "3.8" and python_version < "3.9" +fsspec==2024.9.0 ; python_version >= "3.8" and python_version < "3.9" gast==0.4.0 ; python_version >= "3.8" and python_version < "3.9" -gensim==4.3.2 ; python_version >= "3.8" and python_version < "3.9" +gensim==4.3.3 ; python_version >= "3.8" and python_version < "3.9" google-auth-oauthlib==1.0.0 ; python_version >= "3.8" and python_version < "3.9" -google-auth==2.29.0 ; python_version >= "3.8" and python_version < "3.9" +google-auth==2.35.0 ; python_version >= "3.8" and python_version < "3.9" google-pasta==0.2.0 ; python_version >= "3.8" and python_version < "3.9" -grpcio==1.62.1 ; python_version >= "3.8" and python_version < "3.9" +grpcio==1.66.2 ; python_version >= "3.8" and python_version < "3.9" h5py==3.11.0 ; python_version >= "3.8" and python_version < "3.9" -idna==3.7 ; python_version >= "3.8" and python_version < "3.9" -importlib-metadata==7.1.0 ; python_version >= "3.8" and python_version < "3.9" -ipykernel==6.29.4 ; python_version >= "3.8" and python_version < "3.9" +idna==3.10 ; python_version >= "3.8" and python_version < "3.9" +importlib-metadata==8.5.0 ; python_version >= "3.8" and python_version < "3.9" +ipykernel==6.29.5 ; python_version >= "3.8" and python_version < "3.9" ipython==8.12.3 ; python_version >= "3.8" and python_version < "3.9" jedi==0.19.1 ; python_version >= "3.8" and python_version < "3.9" -jinja2==3.1.3 ; python_version >= "3.8" and python_version < "3.9" -joblib==1.4.0 ; python_version >= "3.8" and python_version < "3.9" -jupyter-client==8.6.1 ; python_version >= "3.8" and python_version < "3.9" +jinja2==3.1.4 ; python_version >= "3.8" and python_version < "3.9" +joblib==1.4.2 ; python_version >= "3.8" and python_version < "3.9" +jupyter-client==8.6.3 ; python_version >= "3.8" and python_version < "3.9" jupyter-core==5.7.2 ; python_version >= "3.8" and python_version < "3.9" keras-preprocessing==1.1.2 ; python_version >= "3.8" and python_version < "3.9" keras==2.7.0 ; python_version >= "3.8" and python_version < "3.9" -kiwisolver==1.4.5 ; python_version >= "3.8" and python_version < "3.9" +kiwisolver==1.4.7 ; python_version >= "3.8" and python_version < "3.9" libclang==18.1.1 ; python_version >= "3.8" and python_version < "3.9" -lightning-utilities==0.11.2 ; python_version >= "3.8" and python_version < "3.9" -markdown==3.6 ; python_version >= "3.8" and python_version < "3.9" +lightning-utilities==0.11.7 ; python_version >= "3.8" and python_version < "3.9" +markdown==3.7 ; python_version >= "3.8" and python_version < "3.9" markupsafe==2.1.5 ; python_version >= "3.8" and python_version < "3.9" -matplotlib-inline==0.1.6 ; python_version >= "3.8" and python_version < "3.9" +matplotlib-inline==0.1.7 ; python_version >= "3.8" and python_version < "3.9" matplotlib==3.2.2 ; python_version >= "3.8" and python_version < "3.9" mpmath==1.3.0 ; python_version >= "3.8" and python_version < "3.9" -multidict==6.0.5 ; python_version >= "3.8" and python_version < "3.9" +multidict==6.1.0 ; python_version >= "3.8" and python_version < "3.9" nest-asyncio==1.6.0 ; python_version >= "3.8" and python_version < "3.9" networkx==3.1 ; python_version >= "3.8" and python_version < "3.9" numpy==1.24.4 ; python_version >= "3.8" and python_version < "3.9" @@ -61,63 +63,63 @@ nvidia-curand-cu12==10.3.2.106 ; platform_system == "Linux" and platform_machine nvidia-cusolver-cu12==11.4.5.107 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.8" and python_version < "3.9" nvidia-cusparse-cu12==12.1.0.106 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.8" and python_version < "3.9" nvidia-nccl-cu12==2.18.1 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.8" and python_version < "3.9" -nvidia-nvjitlink-cu12==12.4.127 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.8" and python_version < "3.9" +nvidia-nvjitlink-cu12==12.6.77 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.8" and python_version < "3.9" nvidia-nvtx-cu12==12.1.105 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.8" and python_version < "3.9" oauthlib==3.2.2 ; python_version >= "3.8" and python_version < "3.9" -opt-einsum==3.3.0 ; python_version >= "3.8" and python_version < "3.9" -packaging==24.0 ; python_version >= "3.8" and python_version < "3.9" +opt-einsum==3.4.0 ; python_version >= "3.8" and python_version < "3.9" +packaging==24.1 ; python_version >= "3.8" and python_version < "3.9" pandas==2.0.3 ; python_version >= "3.8" and python_version < "3.9" parso==0.8.4 ; python_version >= "3.8" and python_version < "3.9" pexpect==4.9.0 ; python_version >= "3.8" and python_version < "3.9" and sys_platform != "win32" pickleshare==0.7.5 ; python_version >= "3.8" and python_version < "3.9" -pillow==10.3.0 ; python_version >= "3.8" and python_version < "3.9" -platformdirs==4.2.0 ; python_version >= "3.8" and python_version < "3.9" -prompt-toolkit==3.0.43 ; python_version >= "3.8" and python_version < "3.9" +pillow==10.4.0 ; python_version >= "3.8" and python_version < "3.9" +platformdirs==4.3.6 ; python_version >= "3.8" and python_version < "3.9" +prompt-toolkit==3.0.48 ; python_version >= "3.8" and python_version < "3.9" protobuf==3.20.3 ; python_version >= "3.8" and python_version < "3.9" -psutil==5.9.8 ; python_version >= "3.8" and python_version < "3.9" +psutil==6.0.0 ; python_version >= "3.8" and python_version < "3.9" ptyprocess==0.7.0 ; python_version >= "3.8" and python_version < "3.9" and sys_platform != "win32" -pure-eval==0.2.2 ; python_version >= "3.8" and python_version < "3.9" -pyasn1-modules==0.4.0 ; python_version >= "3.8" and python_version < "3.9" -pyasn1==0.6.0 ; python_version >= "3.8" and python_version < "3.9" +pure-eval==0.2.3 ; python_version >= "3.8" and python_version < "3.9" +pyasn1-modules==0.4.1 ; python_version >= "3.8" and python_version < "3.9" +pyasn1==0.6.1 ; python_version >= "3.8" and python_version < "3.9" pycparser==2.22 ; python_version >= "3.8" and python_version < "3.9" and implementation_name == "pypy" -pygments==2.17.2 ; python_version >= "3.8" and python_version < "3.9" -pyparsing==3.1.2 ; python_version >= "3.8" and python_version < "3.9" +pygments==2.18.0 ; python_version >= "3.8" and python_version < "3.9" +pyparsing==3.1.4 ; python_version >= "3.8" and python_version < "3.9" python-dateutil==2.9.0.post0 ; python_version >= "3.8" and python_version < "3.9" -pytz==2024.1 ; python_version >= "3.8" and python_version < "3.9" +pytz==2024.2 ; python_version >= "3.8" and python_version < "3.9" pywin32==306 ; sys_platform == "win32" and platform_python_implementation != "PyPy" and python_version >= "3.8" and python_version < "3.9" -pyzmq==25.1.2 ; python_version >= "3.8" and python_version < "3.9" +pyzmq==26.2.0 ; python_version >= "3.8" and python_version < "3.9" requests-oauthlib==2.0.0 ; python_version >= "3.8" and python_version < "3.9" -requests==2.31.0 ; python_version >= "3.8" and python_version < "3.9" +requests==2.32.3 ; python_version >= "3.8" and python_version < "3.9" rsa==4.9 ; python_version >= "3.8" and python_version < "3.9" scikit-learn==1.3.2 ; python_version >= "3.8" and python_version < "3.9" scipy==1.10.1 ; python_version >= "3.8" and python_version < "3.9" -setuptools==69.5.1 ; python_version >= "3.8" and python_version < "3.9" +setuptools==75.1.0 ; python_version >= "3.8" and python_version < "3.9" six==1.16.0 ; python_version >= "3.8" and python_version < "3.9" smart-open==7.0.4 ; python_version >= "3.8" and python_version < "3.9" stack-data==0.6.3 ; python_version >= "3.8" and python_version < "3.9" stellargraph==1.2.1 ; python_version >= "3.8" and python_version < "3.9" -sympy==1.12 ; python_version >= "3.8" and python_version < "3.9" +sympy==1.13.3 ; python_version >= "3.8" and python_version < "3.9" tensorboard-data-server==0.7.2 ; python_version >= "3.8" and python_version < "3.9" tensorboard==2.14.0 ; python_version >= "3.8" and python_version < "3.9" tensorflow-estimator==2.7.0 ; python_version >= "3.8" and python_version < "3.9" tensorflow-io-gcs-filesystem==0.21.0 ; python_version >= "3.8" and python_version < "3.9" tensorflow==2.7.2 ; python_version >= "3.8" and python_version < "3.9" termcolor==2.4.0 ; python_version >= "3.8" and python_version < "3.9" -threadpoolctl==3.4.0 ; python_version >= "3.8" and python_version < "3.9" -torch-geometric==2.5.2 ; python_version >= "3.8" and python_version < "3.9" +threadpoolctl==3.5.0 ; python_version >= "3.8" and python_version < "3.9" +torch-geometric==2.6.1 ; python_version >= "3.8" and python_version < "3.9" torch==2.1.2 ; python_version >= "3.8" and python_version < "3.9" -torchmetrics==1.3.2 ; python_version >= "3.8" and python_version < "3.9" +torchmetrics==1.4.2 ; python_version >= "3.8" and python_version < "3.9" torchvision==0.16.2 ; python_version >= "3.8" and python_version < "3.9" -tornado==6.4 ; python_version >= "3.8" and python_version < "3.9" -tqdm==4.66.2 ; python_version >= "3.8" and python_version < "3.9" -traitlets==5.14.2 ; python_version >= "3.8" and python_version < "3.9" +tornado==6.4.1 ; python_version >= "3.8" and python_version < "3.9" +tqdm==4.66.5 ; python_version >= "3.8" and python_version < "3.9" +traitlets==5.14.3 ; python_version >= "3.8" and python_version < "3.9" triton==2.1.0 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.8" and python_version < "3.9" -typing-extensions==4.11.0 ; python_version >= "3.8" and python_version < "3.9" -tzdata==2024.1 ; python_version >= "3.8" and python_version < "3.9" -urllib3==2.2.1 ; python_version >= "3.8" and python_version < "3.9" +typing-extensions==4.12.2 ; python_version >= "3.8" and python_version < "3.9" +tzdata==2024.2 ; python_version >= "3.8" and python_version < "3.9" +urllib3==2.2.3 ; python_version >= "3.8" and python_version < "3.9" wcwidth==0.2.13 ; python_version >= "3.8" and python_version < "3.9" -werkzeug==3.0.2 ; python_version >= "3.8" and python_version < "3.9" -wheel==0.43.0 ; python_version >= "3.8" and python_version < "3.9" +werkzeug==3.0.4 ; python_version >= "3.8" and python_version < "3.9" +wheel==0.44.0 ; python_version >= "3.8" and python_version < "3.9" wrapt==1.16.0 ; python_version >= "3.8" and python_version < "3.9" -yarl==1.9.4 ; python_version >= "3.8" and python_version < "3.9" -zipp==3.18.1 ; python_version >= "3.8" and python_version < "3.9" +yarl==1.13.1 ; python_version >= "3.8" and python_version < "3.9" +zipp==3.20.2 ; python_version >= "3.8" and python_version < "3.9"