From 9fcb726e5a7974b4bcc921e758e2060913c204e1 Mon Sep 17 00:00:00 2001 From: confoundry <107474190+confoundry@users.noreply.github.com> Date: Tue, 27 Jun 2023 10:24:15 +0100 Subject: [PATCH] Release 0.3.3 (#49) --- examples/__init__.py | 0 examples/csuite_example.ipynb | 458 ++++---- .../multi_investment_sales_attribution.ipynb | 51 +- poetry.lock | 1040 +++++++++-------- pyproject.toml | 7 +- .../config/lightning/default_data.yaml | 2 +- .../config/lightning/default_gaussian.yaml | 6 +- .../config/lightning/default_spline.yaml | 6 +- .../datasets/causica_dataset_format.py | 48 +- src/causica/distributions/__init__.py | 1 - .../constrained_adjacency_distributions.py | 6 +- .../adjacency/directed_acyclic.py | 4 +- .../adjacency/gibbs_dag_prior.py | 6 +- src/causica/distributions/noise/bernoulli.py | 2 +- .../noise/spline/bayesiains_nsf_rqs.py | 30 +- src/causica/distributions/transforms.py | 77 +- .../functional_relationships/__init__.py | 2 +- .../do_functional_relationships.py | 11 +- .../functional_relationships.py | 46 +- src/causica/functional_relationships/icgnn.py | 21 +- .../linear_functional_relationships.py | 27 +- src/causica/lightning/callbacks.py | 35 +- src/causica/lightning/cli.py | 4 +- src/causica/lightning/loggers.py | 60 + src/causica/lightning/modules/deci_module.py | 18 +- .../lightning/modules/variable_spec_module.py | 17 +- .../sem_distribution.py | 0 src/causica/sem/structural_equation_model.py | 8 +- src/causica/training/auglag.py | 88 +- src/causica/training/training_callbacks.py | 38 - .../adjacency/test_adjacency_distributions.py | 5 +- test/distributions/noise/test_joint.py | 41 +- test/distributions/test_sem_distribution.py | 10 +- .../test_functional_relationships.py | 2 +- test/lightning/test_loggers.py | 22 + test/sem/test_treatment_effects.py | 1 - test/training/test_auglag.py | 23 +- test/training/test_training_callbacks.py | 18 - 38 files changed, 1191 insertions(+), 1050 deletions(-) delete mode 100644 examples/__init__.py create mode 100644 src/causica/lightning/loggers.py rename src/causica/{distributions => sem}/sem_distribution.py (100%) delete mode 100644 src/causica/training/training_callbacks.py create mode 100644 test/lightning/test_loggers.py delete mode 100644 test/training/test_training_callbacks.py diff --git a/examples/__init__.py b/examples/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/examples/csuite_example.ipynb b/examples/csuite_example.ipynb index df5bb74..62dd72b 100644 --- a/examples/csuite_example.ipynb +++ b/examples/csuite_example.ipynb @@ -1,6 +1,7 @@ { "cells": [ { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -33,17 +34,18 @@ " ENCOAdjacencyDistributionModule,\n", " GibbsDAGPrior,\n", " JointNoiseModule,\n", - " SEMDistributionModule,\n", " create_noise_modules,\n", ")\n", "from causica.functional_relationships import ICGNN\n", "from causica.graph.dag_constraint import calculate_dagness\n", + "from causica.sem.sem_distribution import SEMDistributionModule\n", "from causica.training.auglag import AugLagLossCalculator, AugLagLR, AugLagLRConfig\n", "\n", "DATASET_PATH = \"https://azuastoragepublic.blob.core.windows.net/datasets\"" ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -68,7 +70,7 @@ "class TrainingConfig:\n", " noise_dist: ContinuousNoiseDist = ContinuousNoiseDist.SPLINE\n", " batch_size: int = 128\n", - " max_epoch: int = int(os.environ.get(\"MAX_EPOCH\", 2000)) # used by testing to run the notebook as a script\n", + " max_epoch: int = int(os.environ.get(\"TEST_RUN\", 2000)) # used by testing to run the notebook as a script\n", " gumbel_temp: float = 0.25\n", " averaging_period: int = 10\n", " prior_sparsity_lambda: float = 5.0\n", @@ -86,6 +88,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -118,6 +121,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -136,6 +140,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -152,6 +157,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -165,7 +171,7 @@ "outputs": [], "source": [ "icgnn = ICGNN(\n", - " variables=tensordict_shapes(dataset_train),\n", + " shapes=tensordict_shapes(dataset_train),\n", " embedding_size=32,\n", " out_dim_g=32,\n", " norm_layer=torch.nn.LayerNorm,\n", @@ -174,6 +180,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -195,6 +202,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -213,6 +221,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -239,6 +248,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -258,6 +268,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -276,235 +287,215 @@ "execution_count": 11, "metadata": {}, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/joel/.cache/pypoetry/virtualenvs/causica-internal-E39znP0s-py3.8/lib/python3.8/site-packages/torch/distributions/distribution.py:45: UserWarning: does not define `arg_constraints`. Please set `arg_constraints = {}` or initialize the distribution with `validate_args=False` to turn off validation.\n", - " warnings.warn(f'{self.__class__} does not define `arg_constraints`. ' +\n" - ] - }, { "name": "stdout", "output_type": "stream", "text": [ "epoch:0 loss:7.0666 nll:7.0575 dagness:1.08616 num_edges:5 alpha:0 rho:1 step:0|1 num_lr_updates:0\n", - "epoch:10 loss:1.8787 nll:1.8676 dagness:0.00000 num_edges:5 alpha:0 rho:1 step:0|161 num_lr_updates:0\n", - "epoch:20 loss:1.1229 nll:1.1088 dagness:0.50418 num_edges:6 alpha:0 rho:1 step:0|321 num_lr_updates:0\n", - "epoch:30 loss:1.0539 nll:1.0448 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:0|481 num_lr_updates:0\n", - "epoch:40 loss:1.8009 nll:1.7915 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:0|641 num_lr_updates:0\n", - "epoch:50 loss:1.8899 nll:1.878 dagness:0.00000 num_edges:5 alpha:0 rho:1 step:0|801 num_lr_updates:1\n", + "epoch:10 loss:1.8691 nll:1.8574 dagness:0.00000 num_edges:5 alpha:0 rho:1 step:0|161 num_lr_updates:0\n", + "epoch:20 loss:1.1163 nll:1.102 dagness:1.63362 num_edges:6 alpha:0 rho:1 step:0|321 num_lr_updates:0\n", + "epoch:30 loss:1.1561 nll:1.149 dagness:0.00000 num_edges:3 alpha:0 rho:1 step:0|481 num_lr_updates:0\n", + "epoch:40 loss:1.2811 nll:1.2715 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:0|641 num_lr_updates:0\n", + "epoch:50 loss:1.4415 nll:1.4294 dagness:0.00000 num_edges:5 alpha:0 rho:1 step:0|801 num_lr_updates:0\n", + "epoch:60 loss:1.08 nll:1.0678 dagness:0.00000 num_edges:5 alpha:0 rho:1 step:0|961 num_lr_updates:0\n", + "epoch:70 loss:1.0654 nll:1.0557 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:0|1121 num_lr_updates:0\n", + "epoch:80 loss:1.1433 nll:1.1336 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:0|1281 num_lr_updates:0\n", + "epoch:90 loss:1.2957 nll:1.2859 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:0|1441 num_lr_updates:0\n", + "epoch:100 loss:1.4104 nll:1.4006 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:0|1601 num_lr_updates:0\n", + "epoch:110 loss:1.1757 nll:1.1658 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:0|1761 num_lr_updates:1\n", + "epoch:120 loss:1.1064 nll:1.0965 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:0|1921 num_lr_updates:1\n", + "epoch:130 loss:1.296 nll:1.2861 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:0|2081 num_lr_updates:1\n", + "epoch:140 loss:1.0077 nll:0.99777 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:0|2241 num_lr_updates:1\n", + "epoch:150 loss:1.3671 nll:1.3572 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:0|2401 num_lr_updates:1\n", + "epoch:160 loss:1.2566 nll:1.2467 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:0|2561 num_lr_updates:2\n", + "epoch:170 loss:1.1839 nll:1.174 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:0|2721 num_lr_updates:2\n", + "epoch:180 loss:1.3817 nll:1.3718 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:0|2881 num_lr_updates:2\n", "Updating alpha to: 0.0\n", - "epoch:60 loss:1.453 nll:1.4412 dagness:0.00000 num_edges:5 alpha:0 rho:1 step:1|23 num_lr_updates:0\n", - "epoch:70 loss:1.5669 nll:1.5572 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:1|183 num_lr_updates:0\n", - "epoch:80 loss:1.605 nll:1.5928 dagness:0.00000 num_edges:5 alpha:0 rho:1 step:1|343 num_lr_updates:0\n", - "epoch:90 loss:1.6326 nll:1.6228 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:1|503 num_lr_updates:0\n", - "epoch:100 loss:1.8064 nll:1.7968 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:1|663 num_lr_updates:0\n", - "epoch:110 loss:3.2911 nll:3.2814 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:1|823 num_lr_updates:0\n", - "epoch:120 loss:2.3284 nll:2.3186 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:1|983 num_lr_updates:1\n", - "epoch:130 loss:2.528 nll:2.5182 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:1|1143 num_lr_updates:1\n", + "epoch:190 loss:1.0483 nll:1.0384 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:1|120 num_lr_updates:0\n", + "epoch:200 loss:1.2778 nll:1.2679 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:1|280 num_lr_updates:0\n", + "epoch:210 loss:1.2488 nll:1.2391 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:1|440 num_lr_updates:0\n", + "epoch:220 loss:0.98975 nll:0.97988 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:1|600 num_lr_updates:1\n", + "epoch:230 loss:1.2537 nll:1.2413 dagness:0.00000 num_edges:5 alpha:0 rho:1 step:1|760 num_lr_updates:1\n", + "epoch:240 loss:1.1325 nll:1.1226 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:1|920 num_lr_updates:1\n", + "epoch:250 loss:1.2526 nll:1.2427 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:1|1080 num_lr_updates:2\n", + "epoch:260 loss:1.0034 nll:0.99099 dagness:0.00000 num_edges:5 alpha:0 rho:1 step:1|1240 num_lr_updates:2\n", + "epoch:270 loss:1.0245 nll:1.0147 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:1|1400 num_lr_updates:2\n", "Updating alpha to: 0.0\n", - "epoch:140 loss:2.2907 nll:2.2811 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:2|81 num_lr_updates:0\n", - "epoch:150 loss:3.2521 nll:3.24 dagness:0.00000 num_edges:5 alpha:0 rho:1 step:2|241 num_lr_updates:0\n", - "epoch:160 loss:2.7455 nll:2.7358 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:2|401 num_lr_updates:0\n", - "epoch:170 loss:2.6453 nll:2.6356 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:2|561 num_lr_updates:1\n", + "epoch:280 loss:1.2746 nll:1.2648 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:2|59 num_lr_updates:0\n", + "epoch:290 loss:1.3697 nll:1.3598 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:2|219 num_lr_updates:0\n", + "epoch:300 loss:1.3922 nll:1.3822 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:2|379 num_lr_updates:0\n", + "epoch:310 loss:1.3235 nll:1.3135 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:2|539 num_lr_updates:1\n", + "epoch:320 loss:1.0165 nll:1.0065 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:2|699 num_lr_updates:1\n", + "epoch:330 loss:1.297 nll:1.287 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:2|859 num_lr_updates:1\n", + "epoch:340 loss:1.1976 nll:1.1876 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:2|1019 num_lr_updates:1\n", + "epoch:350 loss:1.1771 nll:1.1671 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:2|1179 num_lr_updates:1\n", + "epoch:360 loss:1.2251 nll:1.2151 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:2|1339 num_lr_updates:1\n", + "epoch:370 loss:1.2856 nll:1.2756 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:2|1499 num_lr_updates:2\n", "Updating alpha to: 0.0\n", - "epoch:180 loss:2.6657 nll:2.656 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:3|150 num_lr_updates:0\n", - "epoch:190 loss:2.3219 nll:2.3121 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:3|310 num_lr_updates:0\n", - "epoch:200 loss:2.6876 nll:2.6777 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:3|470 num_lr_updates:0\n", - "epoch:210 loss:2.7428 nll:2.7329 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:3|630 num_lr_updates:1\n", + "epoch:380 loss:1.2299 nll:1.2199 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:3|37 num_lr_updates:0\n", + "epoch:390 loss:1.445 nll:1.4351 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:3|197 num_lr_updates:0\n", + "epoch:400 loss:1.4194 nll:1.4094 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:3|357 num_lr_updates:0\n", + "epoch:410 loss:1.3013 nll:1.2913 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:3|517 num_lr_updates:0\n", + "epoch:420 loss:1.2598 nll:1.2499 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:3|677 num_lr_updates:0\n", + "epoch:430 loss:1.1204 nll:1.1104 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:3|837 num_lr_updates:0\n", + "epoch:440 loss:1.0382 nll:1.0282 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:3|997 num_lr_updates:1\n", + "epoch:450 loss:1.2114 nll:1.2014 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:3|1157 num_lr_updates:1\n", + "epoch:460 loss:1.0294 nll:1.0194 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:3|1317 num_lr_updates:1\n", + "epoch:470 loss:1.4288 nll:1.4188 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:3|1477 num_lr_updates:2\n", + "epoch:480 loss:1.0675 nll:1.0575 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:3|1637 num_lr_updates:2\n", "Updating alpha to: 0.0\n", - "epoch:220 loss:2.4358 nll:2.4259 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:4|131 num_lr_updates:0\n", - "epoch:230 loss:2.7663 nll:2.754 dagness:0.00000 num_edges:5 alpha:0 rho:1 step:4|291 num_lr_updates:0\n", - "epoch:240 loss:2.7367 nll:2.7271 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:4|451 num_lr_updates:0\n", - "epoch:250 loss:2.6815 nll:2.6718 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:4|611 num_lr_updates:1\n", - "epoch:260 loss:2.4212 nll:2.409 dagness:0.00000 num_edges:5 alpha:0 rho:1 step:4|771 num_lr_updates:1\n", - "epoch:270 loss:2.4044 nll:2.3922 dagness:0.00000 num_edges:5 alpha:0 rho:1 step:4|931 num_lr_updates:1\n", - "epoch:280 loss:2.5659 nll:2.5562 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:4|1091 num_lr_updates:2\n", - "epoch:290 loss:2.6539 nll:2.6442 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:4|1251 num_lr_updates:2\n", - "epoch:300 loss:2.8798 nll:2.8701 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:4|1411 num_lr_updates:2\n", + "epoch:490 loss:1.0751 nll:1.0651 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:4|130 num_lr_updates:0\n", + "epoch:500 loss:1.0996 nll:1.0896 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:4|290 num_lr_updates:0\n", + "epoch:510 loss:1.1234 nll:1.1134 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:4|450 num_lr_updates:0\n", + "epoch:520 loss:1.0372 nll:1.0272 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:4|610 num_lr_updates:1\n", + "epoch:530 loss:1.321 nll:1.311 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:4|770 num_lr_updates:1\n", + "epoch:540 loss:1.1517 nll:1.1417 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:4|930 num_lr_updates:1\n", + "epoch:550 loss:1.1097 nll:1.0997 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:4|1090 num_lr_updates:1\n", + "epoch:560 loss:1.0469 nll:1.0369 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:4|1250 num_lr_updates:2\n", + "epoch:570 loss:1.2655 nll:1.2555 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:4|1410 num_lr_updates:2\n", + "epoch:580 loss:1.2546 nll:1.2446 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:4|1570 num_lr_updates:2\n", "Updating alpha to: 0.0\n", - "epoch:310 loss:3.663 nll:3.6508 dagness:0.00000 num_edges:5 alpha:0 rho:1 step:5|70 num_lr_updates:0\n", - "epoch:320 loss:2.9153 nll:2.9055 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|230 num_lr_updates:0\n", - "epoch:330 loss:3.2 nll:3.1878 dagness:0.00000 num_edges:5 alpha:0 rho:1 step:5|390 num_lr_updates:0\n", - "epoch:340 loss:2.8881 nll:2.8783 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|550 num_lr_updates:1\n", - "epoch:350 loss:2.9219 nll:2.9122 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|710 num_lr_updates:1\n", - "epoch:360 loss:3.0444 nll:3.0346 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|870 num_lr_updates:1\n", - "epoch:370 loss:3.0787 nll:3.0689 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|1030 num_lr_updates:1\n", - "epoch:380 loss:2.8592 nll:2.8494 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|1190 num_lr_updates:1\n", - "epoch:390 loss:3.0489 nll:3.0391 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|1350 num_lr_updates:1\n", - "epoch:400 loss:3.0474 nll:3.0376 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|1510 num_lr_updates:1\n", - "epoch:410 loss:2.8672 nll:2.8574 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|1670 num_lr_updates:1\n", - "epoch:420 loss:2.9645 nll:2.9547 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|1830 num_lr_updates:1\n", - "epoch:430 loss:2.9195 nll:2.9073 dagness:0.00000 num_edges:5 alpha:0 rho:1 step:5|1990 num_lr_updates:1\n", - "epoch:440 loss:2.8379 nll:2.8281 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|2150 num_lr_updates:1\n", - "epoch:450 loss:3.1395 nll:3.1297 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|2310 num_lr_updates:1\n", - "epoch:460 loss:2.8557 nll:2.8459 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|2470 num_lr_updates:1\n", - "epoch:470 loss:3.2048 nll:3.1925 dagness:0.00000 num_edges:5 alpha:0 rho:1 step:5|2630 num_lr_updates:1\n", - "epoch:480 loss:2.7886 nll:2.7788 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|2790 num_lr_updates:1\n", - "epoch:490 loss:2.7818 nll:2.772 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|2950 num_lr_updates:1\n", - "epoch:500 loss:2.9354 nll:2.9256 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|3110 num_lr_updates:1\n", - "epoch:510 loss:2.83 nll:2.8202 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|3270 num_lr_updates:1\n", - "epoch:520 loss:2.9351 nll:2.9253 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|3430 num_lr_updates:1\n", - "epoch:530 loss:3.0265 nll:3.0167 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|3590 num_lr_updates:1\n", - "epoch:540 loss:2.9777 nll:2.9679 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|3750 num_lr_updates:1\n", - "epoch:550 loss:2.8875 nll:2.8777 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|3910 num_lr_updates:1\n", - "epoch:560 loss:2.8449 nll:2.8351 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|4070 num_lr_updates:1\n", - "epoch:570 loss:2.9814 nll:2.9691 dagness:0.00000 num_edges:5 alpha:0 rho:1 step:5|4230 num_lr_updates:1\n", - "epoch:580 loss:3.1165 nll:3.1067 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|4390 num_lr_updates:1\n", - "epoch:590 loss:3.0021 nll:2.9923 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|4550 num_lr_updates:1\n", - "epoch:600 loss:2.9599 nll:2.9476 dagness:0.00000 num_edges:5 alpha:0 rho:1 step:5|4710 num_lr_updates:1\n", - "epoch:610 loss:2.8467 nll:2.837 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|4870 num_lr_updates:1\n", - "epoch:620 loss:3.031 nll:3.0213 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|5030 num_lr_updates:1\n", - "epoch:630 loss:2.9152 nll:2.903 dagness:0.00000 num_edges:5 alpha:0 rho:1 step:5|5190 num_lr_updates:1\n", - "epoch:640 loss:2.9338 nll:2.9241 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|5350 num_lr_updates:1\n", - "epoch:650 loss:2.928 nll:2.9183 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|5510 num_lr_updates:1\n", - "epoch:660 loss:2.9532 nll:2.9435 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|5670 num_lr_updates:1\n", - "epoch:670 loss:2.9749 nll:2.9652 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|5830 num_lr_updates:1\n", - "epoch:680 loss:3.0472 nll:3.035 dagness:0.00000 num_edges:5 alpha:0 rho:1 step:5|5990 num_lr_updates:1\n", - "epoch:690 loss:2.9768 nll:2.9671 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|6150 num_lr_updates:1\n", - "epoch:700 loss:2.9487 nll:2.939 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|6310 num_lr_updates:1\n", - "epoch:710 loss:2.9899 nll:2.9802 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|6470 num_lr_updates:1\n", - "epoch:720 loss:3.1513 nll:3.1416 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|6630 num_lr_updates:1\n", - "epoch:730 loss:3.0946 nll:3.0849 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|6790 num_lr_updates:1\n", - "epoch:740 loss:3.0609 nll:3.0512 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|6950 num_lr_updates:1\n", - "epoch:750 loss:2.9666 nll:2.9569 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|7110 num_lr_updates:1\n", - "epoch:760 loss:3.0605 nll:3.0482 dagness:0.00000 num_edges:5 alpha:0 rho:1 step:5|7270 num_lr_updates:1\n", - "epoch:770 loss:3.189 nll:3.1767 dagness:0.00000 num_edges:5 alpha:0 rho:1 step:5|7430 num_lr_updates:1\n", - "epoch:780 loss:2.911 nll:2.9012 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|7590 num_lr_updates:1\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:790 loss:2.7551 nll:2.7453 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|7750 num_lr_updates:1\n", - "epoch:800 loss:2.8587 nll:2.8489 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|7910 num_lr_updates:1\n", - "epoch:810 loss:2.9335 nll:2.9212 dagness:0.00000 num_edges:5 alpha:0 rho:1 step:5|8070 num_lr_updates:1\n", - "epoch:820 loss:2.958 nll:2.9482 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|8230 num_lr_updates:1\n", - "epoch:830 loss:2.8614 nll:2.8516 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|8390 num_lr_updates:1\n", - "epoch:840 loss:3.0381 nll:3.0282 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|8550 num_lr_updates:1\n", - "epoch:850 loss:2.9227 nll:2.9129 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|8710 num_lr_updates:1\n", - "epoch:860 loss:2.979 nll:2.9691 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|8870 num_lr_updates:1\n", - "epoch:870 loss:2.8232 nll:2.8134 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|9030 num_lr_updates:1\n", - "epoch:880 loss:2.9337 nll:2.9239 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|9190 num_lr_updates:1\n", - "epoch:890 loss:2.9369 nll:2.9271 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|9350 num_lr_updates:1\n", - "epoch:900 loss:3.0556 nll:3.0457 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|9510 num_lr_updates:1\n", - "epoch:910 loss:3.012 nll:3.0022 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|9670 num_lr_updates:1\n", - "epoch:920 loss:3.006 nll:2.9962 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|9830 num_lr_updates:1\n", - "epoch:930 loss:2.6548 nll:2.6449 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|9990 num_lr_updates:1\n", - "epoch:940 loss:3.1287 nll:3.1189 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|10150 num_lr_updates:1\n", - "epoch:950 loss:2.9498 nll:2.94 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|10310 num_lr_updates:1\n", - "epoch:960 loss:2.9849 nll:2.9726 dagness:0.00000 num_edges:5 alpha:0 rho:1 step:5|10470 num_lr_updates:1\n", - "epoch:970 loss:3.0725 nll:3.0627 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|10630 num_lr_updates:1\n", - "epoch:980 loss:3.1261 nll:3.1162 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|10790 num_lr_updates:1\n", - "epoch:990 loss:2.9804 nll:2.968 dagness:0.00000 num_edges:5 alpha:0 rho:1 step:5|10950 num_lr_updates:1\n", - "epoch:1000 loss:2.9436 nll:2.9338 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|11110 num_lr_updates:1\n", - "epoch:1010 loss:2.8956 nll:2.8858 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|11270 num_lr_updates:1\n", - "epoch:1020 loss:2.8626 nll:2.8528 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|11430 num_lr_updates:1\n", - "epoch:1030 loss:2.8209 nll:2.8111 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|11590 num_lr_updates:1\n", - "epoch:1040 loss:2.8658 nll:2.856 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|11750 num_lr_updates:1\n", - "epoch:1050 loss:2.9634 nll:2.9536 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|11910 num_lr_updates:1\n", - "epoch:1060 loss:2.9952 nll:2.9854 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|12070 num_lr_updates:1\n", - "epoch:1070 loss:3.063 nll:3.0532 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|12230 num_lr_updates:1\n", - "epoch:1080 loss:2.9488 nll:2.939 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|12390 num_lr_updates:1\n", - "epoch:1090 loss:2.7299 nll:2.7201 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|12550 num_lr_updates:1\n", - "epoch:1100 loss:3.2395 nll:3.2296 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|12710 num_lr_updates:1\n", - "epoch:1110 loss:3.2394 nll:3.2296 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|12870 num_lr_updates:1\n", - "epoch:1120 loss:2.9613 nll:2.9515 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|13030 num_lr_updates:1\n", - "epoch:1130 loss:3.0487 nll:3.0364 dagness:0.00000 num_edges:5 alpha:0 rho:1 step:5|13190 num_lr_updates:1\n", - "epoch:1140 loss:2.7114 nll:2.7016 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|13350 num_lr_updates:1\n", - "epoch:1150 loss:2.9863 nll:2.9765 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|13510 num_lr_updates:1\n", - "epoch:1160 loss:2.8742 nll:2.8644 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|13670 num_lr_updates:1\n", - "epoch:1170 loss:3.0337 nll:3.0239 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|13830 num_lr_updates:1\n", - "epoch:1180 loss:2.7423 nll:2.7326 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|13990 num_lr_updates:1\n", - "epoch:1190 loss:3.0625 nll:3.0527 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|14150 num_lr_updates:1\n", - "epoch:1200 loss:2.7554 nll:2.7457 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|14310 num_lr_updates:1\n", - "epoch:1210 loss:3.0022 nll:2.9924 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|14470 num_lr_updates:1\n", - "epoch:1220 loss:3.0218 nll:3.012 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|14630 num_lr_updates:1\n", - "epoch:1230 loss:2.9086 nll:2.8989 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|14790 num_lr_updates:1\n", - "epoch:1240 loss:2.9639 nll:2.9541 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|14950 num_lr_updates:1\n", - "epoch:1250 loss:2.8892 nll:2.877 dagness:0.00000 num_edges:5 alpha:0 rho:1 step:5|15110 num_lr_updates:1\n", - "epoch:1260 loss:2.9226 nll:2.9129 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|15270 num_lr_updates:1\n", - "epoch:1270 loss:3.0451 nll:3.0354 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|15430 num_lr_updates:1\n", - "epoch:1280 loss:3.189 nll:3.1793 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|15590 num_lr_updates:1\n", - "epoch:1290 loss:2.6109 nll:2.6012 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|15750 num_lr_updates:1\n", - "epoch:1300 loss:3.0214 nll:3.0116 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|15910 num_lr_updates:1\n", - "epoch:1310 loss:2.7044 nll:2.6947 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|16070 num_lr_updates:1\n", - "epoch:1320 loss:3.0161 nll:3.0063 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|16230 num_lr_updates:1\n", - "epoch:1330 loss:2.974 nll:2.9643 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|16390 num_lr_updates:1\n", - "epoch:1340 loss:3.096 nll:3.0863 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|16550 num_lr_updates:1\n", - "epoch:1350 loss:3.1791 nll:3.1694 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|16710 num_lr_updates:1\n", - "epoch:1360 loss:2.9166 nll:2.9069 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|16870 num_lr_updates:1\n", - "epoch:1370 loss:2.7716 nll:2.7619 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|17030 num_lr_updates:1\n", - "epoch:1380 loss:2.9378 nll:2.9281 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|17190 num_lr_updates:1\n", - "epoch:1390 loss:2.9049 nll:2.8927 dagness:0.00000 num_edges:5 alpha:0 rho:1 step:5|17350 num_lr_updates:1\n", - "epoch:1400 loss:3.0546 nll:3.0448 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|17510 num_lr_updates:1\n", - "epoch:1410 loss:2.8122 nll:2.8 dagness:0.00000 num_edges:5 alpha:0 rho:1 step:5|17670 num_lr_updates:1\n", - "epoch:1420 loss:2.6678 nll:2.6555 dagness:0.00000 num_edges:5 alpha:0 rho:1 step:5|17830 num_lr_updates:1\n", - "epoch:1430 loss:2.9797 nll:2.9699 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|17990 num_lr_updates:1\n", - "epoch:1440 loss:2.6992 nll:2.687 dagness:0.00000 num_edges:5 alpha:0 rho:1 step:5|18150 num_lr_updates:1\n", - "epoch:1450 loss:2.907 nll:2.8972 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|18310 num_lr_updates:1\n", - "epoch:1460 loss:2.9512 nll:2.939 dagness:0.00000 num_edges:5 alpha:0 rho:1 step:5|18470 num_lr_updates:1\n", - "epoch:1470 loss:2.7657 nll:2.756 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|18630 num_lr_updates:1\n", - "epoch:1480 loss:2.9439 nll:2.9342 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|18790 num_lr_updates:1\n", - "epoch:1490 loss:2.6856 nll:2.6759 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|18950 num_lr_updates:1\n", - "epoch:1500 loss:2.8348 nll:2.8251 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|19110 num_lr_updates:1\n", - "epoch:1510 loss:2.8923 nll:2.8826 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|19270 num_lr_updates:1\n", - "epoch:1520 loss:2.8678 nll:2.8557 dagness:0.00000 num_edges:5 alpha:0 rho:1 step:5|19430 num_lr_updates:1\n", - "epoch:1530 loss:3.1965 nll:3.1844 dagness:0.00000 num_edges:5 alpha:0 rho:1 step:5|19590 num_lr_updates:1\n", - "epoch:1540 loss:3.0293 nll:3.0198 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|19750 num_lr_updates:1\n", - "epoch:1550 loss:2.8893 nll:2.8797 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|19910 num_lr_updates:1\n", - "epoch:1560 loss:2.8964 nll:2.8868 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|20070 num_lr_updates:1\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:1570 loss:2.8619 nll:2.8523 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|20230 num_lr_updates:1\n", - "epoch:1580 loss:2.8557 nll:2.8437 dagness:0.00000 num_edges:5 alpha:0 rho:1 step:5|20390 num_lr_updates:1\n", - "epoch:1590 loss:2.7916 nll:2.7821 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|20550 num_lr_updates:1\n", - "epoch:1600 loss:2.8361 nll:2.8266 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|20710 num_lr_updates:1\n", - "epoch:1610 loss:2.6683 nll:2.6588 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|20870 num_lr_updates:1\n", - "epoch:1620 loss:2.8917 nll:2.8822 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|21030 num_lr_updates:1\n", - "epoch:1630 loss:2.7331 nll:2.7235 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|21190 num_lr_updates:1\n", - "epoch:1640 loss:3.2126 nll:3.2031 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|21350 num_lr_updates:1\n", - "epoch:1650 loss:3.1584 nll:3.1439 dagness:0.50418 num_edges:6 alpha:0 rho:1 step:5|21510 num_lr_updates:1\n", - "epoch:1660 loss:2.7933 nll:2.7839 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|21670 num_lr_updates:1\n", - "epoch:1670 loss:2.7608 nll:2.7513 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|21830 num_lr_updates:1\n", - "epoch:1680 loss:2.855 nll:2.8455 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|21990 num_lr_updates:1\n", - "epoch:1690 loss:3.0088 nll:2.9969 dagness:0.00000 num_edges:5 alpha:0 rho:1 step:5|22150 num_lr_updates:1\n", - "epoch:1700 loss:3.1901 nll:3.1782 dagness:0.00000 num_edges:5 alpha:0 rho:1 step:5|22310 num_lr_updates:1\n", - "epoch:1710 loss:2.8932 nll:2.8838 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|22470 num_lr_updates:1\n", - "epoch:1720 loss:3.0219 nll:3.0125 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|22630 num_lr_updates:1\n", - "epoch:1730 loss:2.9028 nll:2.8933 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|22790 num_lr_updates:1\n", - "epoch:1740 loss:3.0292 nll:3.0198 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|22950 num_lr_updates:1\n", - "epoch:1750 loss:2.7324 nll:2.7231 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|23110 num_lr_updates:1\n", - "epoch:1760 loss:3.0183 nll:3.004 dagness:1.08616 num_edges:6 alpha:0 rho:1 step:5|23270 num_lr_updates:1\n", - "epoch:1770 loss:2.9613 nll:2.9494 dagness:0.00000 num_edges:5 alpha:0 rho:1 step:5|23430 num_lr_updates:1\n", - "epoch:1780 loss:2.9175 nll:2.9082 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|23590 num_lr_updates:1\n", - "epoch:1790 loss:2.9395 nll:2.9302 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|23750 num_lr_updates:1\n", - "epoch:1800 loss:3.1597 nll:3.1479 dagness:0.00000 num_edges:5 alpha:0 rho:1 step:5|23910 num_lr_updates:1\n", - "epoch:1810 loss:2.7693 nll:2.7599 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|24070 num_lr_updates:1\n", - "epoch:1820 loss:3.0055 nll:2.9962 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|24230 num_lr_updates:1\n", - "epoch:1830 loss:3.1362 nll:3.1269 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|24390 num_lr_updates:1\n", - "epoch:1840 loss:3.2303 nll:3.221 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|24550 num_lr_updates:1\n", - "epoch:1850 loss:2.8863 nll:2.877 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|24710 num_lr_updates:1\n", - "epoch:1860 loss:3.0215 nll:3.0122 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|24870 num_lr_updates:1\n", - "epoch:1870 loss:2.7807 nll:2.7714 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|25030 num_lr_updates:1\n", - "epoch:1880 loss:2.8826 nll:2.8707 dagness:0.00000 num_edges:5 alpha:0 rho:1 step:5|25190 num_lr_updates:1\n", - "epoch:1890 loss:2.9366 nll:2.9247 dagness:0.00000 num_edges:5 alpha:0 rho:1 step:5|25350 num_lr_updates:1\n", - "epoch:1900 loss:3.0072 nll:2.9978 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|25510 num_lr_updates:1\n", - "epoch:1910 loss:2.9394 nll:2.9276 dagness:0.00000 num_edges:5 alpha:0 rho:1 step:5|25670 num_lr_updates:1\n", - "epoch:1920 loss:3.0141 nll:3.0049 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|25830 num_lr_updates:1\n", - "epoch:1930 loss:2.9477 nll:2.9384 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|25990 num_lr_updates:1\n", - "epoch:1940 loss:3.0061 nll:2.9968 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|26150 num_lr_updates:1\n", - "epoch:1950 loss:2.9182 nll:2.9089 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|26310 num_lr_updates:1\n", - "epoch:1960 loss:2.8371 nll:2.8279 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|26470 num_lr_updates:1\n", - "epoch:1970 loss:3.0612 nll:3.047 dagness:1.08616 num_edges:6 alpha:0 rho:1 step:5|26630 num_lr_updates:1\n", - "epoch:1980 loss:2.7917 nll:2.7824 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|26790 num_lr_updates:1\n", - "epoch:1990 loss:2.8372 nll:2.8254 dagness:0.00000 num_edges:5 alpha:0 rho:1 step:5|26950 num_lr_updates:1\n" + "epoch:590 loss:1.3033 nll:1.2933 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|53 num_lr_updates:0\n", + "epoch:600 loss:1.1866 nll:1.1766 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|213 num_lr_updates:0\n", + "epoch:610 loss:1.1212 nll:1.1112 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|373 num_lr_updates:0\n", + "epoch:620 loss:1.2925 nll:1.2825 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|533 num_lr_updates:1\n", + "epoch:630 loss:1.1824 nll:1.1724 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|693 num_lr_updates:1\n", + "epoch:640 loss:1.0456 nll:1.0357 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|853 num_lr_updates:1\n", + "epoch:650 loss:1.1363 nll:1.1263 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|1013 num_lr_updates:1\n", + "epoch:660 loss:1.1463 nll:1.1363 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|1173 num_lr_updates:1\n", + "epoch:670 loss:1.1566 nll:1.1466 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|1333 num_lr_updates:2\n", + "epoch:680 loss:1.37 nll:1.36 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|1493 num_lr_updates:2\n", + "epoch:690 loss:1.3795 nll:1.3695 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|1653 num_lr_updates:2\n", + "epoch:700 loss:1.2699 nll:1.2599 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|1813 num_lr_updates:2\n", + "epoch:710 loss:1.2227 nll:1.2127 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|1973 num_lr_updates:2\n", + "epoch:720 loss:1.2809 nll:1.2709 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|2133 num_lr_updates:2\n", + "epoch:730 loss:1.22 nll:1.21 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|2293 num_lr_updates:2\n", + "epoch:740 loss:1.2437 nll:1.2337 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|2453 num_lr_updates:2\n", + "epoch:750 loss:1.1227 nll:1.1127 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|2613 num_lr_updates:2\n", + "epoch:760 loss:1.0678 nll:1.0578 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|2773 num_lr_updates:2\n", + "epoch:770 loss:1.5672 nll:1.5572 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|2933 num_lr_updates:2\n", + "epoch:780 loss:1.2452 nll:1.2352 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|3093 num_lr_updates:2\n", + "epoch:790 loss:0.99183 nll:0.98184 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|3253 num_lr_updates:2\n", + "epoch:800 loss:0.92037 nll:0.91038 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|3413 num_lr_updates:2\n", + "epoch:810 loss:1.2609 nll:1.2509 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|3573 num_lr_updates:2\n", + "epoch:820 loss:1.0136 nll:1.0036 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|3733 num_lr_updates:2\n", + "epoch:830 loss:1.0351 nll:1.0251 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|3893 num_lr_updates:2\n", + "epoch:840 loss:1.1815 nll:1.1715 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|4053 num_lr_updates:2\n", + "epoch:850 loss:1.1101 nll:1.1001 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|4213 num_lr_updates:2\n", + "epoch:860 loss:1.1717 nll:1.1618 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|4373 num_lr_updates:2\n", + "epoch:870 loss:1.1329 nll:1.1229 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|4533 num_lr_updates:2\n", + "epoch:880 loss:1.2385 nll:1.2285 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|4693 num_lr_updates:2\n", + "epoch:890 loss:1.2119 nll:1.2019 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|4853 num_lr_updates:2\n", + "epoch:900 loss:1.2255 nll:1.2155 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|5013 num_lr_updates:2\n", + "epoch:910 loss:1.1216 nll:1.1116 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|5173 num_lr_updates:2\n", + "epoch:920 loss:1.188 nll:1.178 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|5333 num_lr_updates:2\n", + "epoch:930 loss:0.91625 nll:0.90626 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|5493 num_lr_updates:2\n", + "epoch:940 loss:1.3052 nll:1.2952 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|5653 num_lr_updates:2\n", + "epoch:950 loss:1.1509 nll:1.1409 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|5813 num_lr_updates:2\n", + "epoch:960 loss:1.1066 nll:1.0966 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|5973 num_lr_updates:2\n", + "epoch:970 loss:1.3941 nll:1.3841 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|6133 num_lr_updates:2\n", + "epoch:980 loss:1.2921 nll:1.2821 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|6293 num_lr_updates:2\n", + "epoch:990 loss:1.073 nll:1.063 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|6453 num_lr_updates:2\n", + "epoch:1000 loss:1.1562 nll:1.1462 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|6613 num_lr_updates:2\n", + "epoch:1010 loss:1.1604 nll:1.1504 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|6773 num_lr_updates:2\n", + "epoch:1020 loss:1.2267 nll:1.2168 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|6933 num_lr_updates:2\n", + "epoch:1030 loss:1.1793 nll:1.1693 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|7093 num_lr_updates:2\n", + "epoch:1040 loss:1.2636 nll:1.2536 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|7253 num_lr_updates:2\n", + "epoch:1050 loss:1.2478 nll:1.2378 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|7413 num_lr_updates:2\n", + "epoch:1060 loss:1.1403 nll:1.1303 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|7573 num_lr_updates:2\n", + "epoch:1070 loss:1.2894 nll:1.2794 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|7733 num_lr_updates:2\n", + "epoch:1080 loss:1.241 nll:1.231 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|7893 num_lr_updates:2\n", + "epoch:1090 loss:1.0962 nll:1.0862 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|8053 num_lr_updates:2\n", + "epoch:1100 loss:1.3871 nll:1.3771 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|8213 num_lr_updates:2\n", + "epoch:1110 loss:1.3808 nll:1.3708 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|8373 num_lr_updates:2\n", + "epoch:1120 loss:1.2535 nll:1.2435 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|8533 num_lr_updates:2\n", + "epoch:1130 loss:1.3118 nll:1.3018 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|8693 num_lr_updates:2\n", + "epoch:1140 loss:0.99922 nll:0.98923 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|8853 num_lr_updates:2\n", + "epoch:1150 loss:1.1346 nll:1.1246 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|9013 num_lr_updates:2\n", + "epoch:1160 loss:1.0778 nll:1.0678 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|9173 num_lr_updates:2\n", + "epoch:1170 loss:1.088 nll:1.078 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|9333 num_lr_updates:2\n", + "epoch:1180 loss:1.0553 nll:1.0453 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|9493 num_lr_updates:2\n", + "epoch:1190 loss:1.2327 nll:1.2227 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|9653 num_lr_updates:2\n", + "epoch:1200 loss:1.0727 nll:1.0628 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|9813 num_lr_updates:2\n", + "epoch:1210 loss:1.2991 nll:1.2891 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|9973 num_lr_updates:2\n", + "epoch:1220 loss:1.2807 nll:1.2707 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|10133 num_lr_updates:2\n", + "epoch:1230 loss:1.19 nll:1.18 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|10293 num_lr_updates:2\n", + "epoch:1240 loss:1.1744 nll:1.1644 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|10453 num_lr_updates:2\n", + "epoch:1250 loss:1.2347 nll:1.2247 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|10613 num_lr_updates:2\n", + "epoch:1260 loss:1.1626 nll:1.1526 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|10773 num_lr_updates:2\n", + "epoch:1270 loss:1.1782 nll:1.1682 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|10933 num_lr_updates:2\n", + "epoch:1280 loss:1.2599 nll:1.2499 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|11093 num_lr_updates:2\n", + "epoch:1290 loss:1.0889 nll:1.0789 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|11253 num_lr_updates:2\n", + "epoch:1300 loss:1.1862 nll:1.1763 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|11413 num_lr_updates:2\n", + "epoch:1310 loss:1.15 nll:1.1401 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|11573 num_lr_updates:2\n", + "epoch:1320 loss:1.2847 nll:1.2747 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|11733 num_lr_updates:2\n", + "epoch:1330 loss:1.1469 nll:1.1369 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|11893 num_lr_updates:2\n", + "epoch:1340 loss:1.2439 nll:1.2339 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|12053 num_lr_updates:2\n", + "epoch:1350 loss:1.2722 nll:1.2622 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|12213 num_lr_updates:2\n", + "epoch:1360 loss:1.0454 nll:1.0354 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|12373 num_lr_updates:2\n", + "epoch:1370 loss:1.247 nll:1.237 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|12533 num_lr_updates:2\n", + "epoch:1380 loss:1.2571 nll:1.2471 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|12693 num_lr_updates:2\n", + "epoch:1390 loss:1.0382 nll:1.0282 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|12853 num_lr_updates:2\n", + "epoch:1400 loss:1.313 nll:1.303 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|13013 num_lr_updates:2\n", + "epoch:1410 loss:1.0304 nll:1.0204 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|13173 num_lr_updates:2\n", + "epoch:1420 loss:1.0561 nll:1.0461 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|13333 num_lr_updates:2\n", + "epoch:1430 loss:1.1085 nll:1.0985 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|13493 num_lr_updates:2\n", + "epoch:1440 loss:0.92812 nll:0.91813 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|13653 num_lr_updates:2\n", + "epoch:1450 loss:1.0152 nll:1.0052 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|13813 num_lr_updates:2\n", + "epoch:1460 loss:1.1169 nll:1.1069 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|13973 num_lr_updates:2\n", + "epoch:1470 loss:0.98025 nll:0.97026 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|14133 num_lr_updates:2\n", + "epoch:1480 loss:1.1719 nll:1.162 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|14293 num_lr_updates:2\n", + "epoch:1490 loss:0.94552 nll:0.93553 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|14453 num_lr_updates:2\n", + "epoch:1500 loss:1.0944 nll:1.0844 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|14613 num_lr_updates:2\n", + "epoch:1510 loss:1.2333 nll:1.2233 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|14773 num_lr_updates:2\n", + "epoch:1520 loss:1.1408 nll:1.1308 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|14933 num_lr_updates:2\n", + "epoch:1530 loss:1.3222 nll:1.3122 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|15093 num_lr_updates:2\n", + "epoch:1540 loss:1.1569 nll:1.1469 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|15253 num_lr_updates:2\n", + "epoch:1550 loss:1.0047 nll:0.99469 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|15413 num_lr_updates:2\n", + "epoch:1560 loss:1.1496 nll:1.1396 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|15573 num_lr_updates:2\n", + "epoch:1570 loss:1.166 nll:1.156 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|15733 num_lr_updates:2\n", + "epoch:1580 loss:0.97888 nll:0.96889 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|15893 num_lr_updates:2\n", + "epoch:1590 loss:0.99192 nll:0.98192 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|16053 num_lr_updates:2\n", + "epoch:1600 loss:1.1655 nll:1.1555 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|16213 num_lr_updates:2\n", + "epoch:1610 loss:0.92115 nll:0.91115 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|16373 num_lr_updates:2\n", + "epoch:1620 loss:1.1602 nll:1.1502 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|16533 num_lr_updates:2\n", + "epoch:1630 loss:1.1397 nll:1.1297 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|16693 num_lr_updates:2\n", + "epoch:1640 loss:1.2626 nll:1.2526 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|16853 num_lr_updates:2\n", + "epoch:1650 loss:1.3528 nll:1.3429 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|17013 num_lr_updates:2\n", + "epoch:1660 loss:0.96382 nll:0.95382 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|17173 num_lr_updates:2\n", + "epoch:1670 loss:0.94727 nll:0.93728 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|17333 num_lr_updates:2\n", + "epoch:1680 loss:1.2419 nll:1.2319 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|17493 num_lr_updates:2\n", + "epoch:1690 loss:1.2049 nll:1.195 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|17653 num_lr_updates:2\n", + "epoch:1700 loss:1.2542 nll:1.2442 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|17813 num_lr_updates:2\n", + "epoch:1710 loss:1.1132 nll:1.1032 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|17973 num_lr_updates:2\n", + "epoch:1720 loss:1.1818 nll:1.1718 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|18133 num_lr_updates:2\n", + "epoch:1730 loss:1.1027 nll:1.0927 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|18293 num_lr_updates:2\n", + "epoch:1740 loss:1.1679 nll:1.1579 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|18453 num_lr_updates:2\n", + "epoch:1750 loss:1.0585 nll:1.0485 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|18613 num_lr_updates:2\n", + "epoch:1760 loss:1.1507 nll:1.1407 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|18773 num_lr_updates:2\n", + "epoch:1770 loss:1.0643 nll:1.0543 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|18933 num_lr_updates:2\n", + "epoch:1780 loss:1.0757 nll:1.0657 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|19093 num_lr_updates:2\n", + "epoch:1790 loss:1.0231 nll:1.0132 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|19253 num_lr_updates:2\n", + "epoch:1800 loss:1.4205 nll:1.4105 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|19413 num_lr_updates:2\n", + "epoch:1810 loss:0.97389 nll:0.9639 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|19573 num_lr_updates:2\n", + "epoch:1820 loss:1.2062 nll:1.1962 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|19733 num_lr_updates:2\n", + "epoch:1830 loss:1.2867 nll:1.2767 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|19893 num_lr_updates:2\n", + "epoch:1840 loss:1.3977 nll:1.3877 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|20053 num_lr_updates:2\n", + "epoch:1850 loss:1.1351 nll:1.1251 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|20213 num_lr_updates:2\n", + "epoch:1860 loss:1.0939 nll:1.0839 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|20373 num_lr_updates:2\n", + "epoch:1870 loss:1.0453 nll:1.0353 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|20533 num_lr_updates:2\n", + "epoch:1880 loss:0.93997 nll:0.92997 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|20693 num_lr_updates:2\n", + "epoch:1890 loss:1.0821 nll:1.0721 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|20853 num_lr_updates:2\n", + "epoch:1900 loss:1.2242 nll:1.2142 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|21013 num_lr_updates:2\n", + "epoch:1910 loss:1.1396 nll:1.1296 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|21173 num_lr_updates:2\n", + "epoch:1920 loss:1.176 nll:1.166 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|21333 num_lr_updates:2\n", + "epoch:1930 loss:1.0077 nll:0.99775 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|21493 num_lr_updates:2\n", + "epoch:1940 loss:1.0978 nll:1.0878 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|21653 num_lr_updates:2\n", + "epoch:1950 loss:1.1629 nll:1.1529 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|21813 num_lr_updates:2\n", + "epoch:1960 loss:1.1092 nll:1.0992 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|21973 num_lr_updates:2\n", + "epoch:1970 loss:1.0646 nll:1.0546 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|22133 num_lr_updates:2\n", + "epoch:1980 loss:1.0023 nll:0.99228 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|22293 num_lr_updates:2\n", + "epoch:1990 loss:1.0706 nll:1.0607 dagness:0.00000 num_edges:4 alpha:0 rho:1 step:5|22453 num_lr_updates:2\n" ] } ], @@ -533,8 +524,8 @@ " scheduler.step(\n", " optimizer=optimizer,\n", " loss=auglag_loss,\n", - " loss_value=loss.item(),\n", - " lagrangian_penalty=constraint.item(),\n", + " loss_value=loss,\n", + " lagrangian_penalty=constraint,\n", " )\n", " # log metrics\n", " if epoch % 10 == 0 and i == 0:\n", @@ -548,6 +539,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -561,7 +553,7 @@ "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ "
" ] @@ -573,11 +565,12 @@ "source": [ "true_adj_matrix = load_data(root_path, DataEnum.TRUE_ADJACENCY)\n", "\n", - "true_graph = nx.from_numpy_matrix(true_adj_matrix.cpu().numpy(), create_using=nx.DiGraph)\n", + "true_graph = nx.from_numpy_array(true_adj_matrix.cpu().numpy(), create_using=nx.DiGraph)\n", "nx.draw_networkx(true_graph, pos=nx.planar_layout(true_graph), with_labels=True, arrows=True)" ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -591,7 +584,7 @@ "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ "
" ] @@ -602,9 +595,16 @@ ], "source": [ "vardist = adjacency_dist()\n", - "graph = nx.from_numpy_matrix(vardist.mode.cpu().numpy(), create_using=nx.DiGraph)\n", + "graph = nx.from_numpy_array(vardist.mode.cpu().numpy(), create_using=nx.DiGraph)\n", "nx.draw_networkx(graph, pos=nx.planar_layout(true_graph), with_labels=True, arrows=True)" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { @@ -623,7 +623,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.8" + "version": "3.10.6" } }, "nbformat": 4, diff --git a/examples/multi_investment_sales_attribution.ipynb b/examples/multi_investment_sales_attribution.ipynb index e62b9c2..f525e36 100644 --- a/examples/multi_investment_sales_attribution.ipynb +++ b/examples/multi_investment_sales_attribution.ipynb @@ -1,6 +1,7 @@ { "cells": [ { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -20,6 +21,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -55,21 +57,19 @@ "from pytorch_lightning.callbacks import TQDMProgressBar\n", "from tensordict import TensorDict\n", "\n", - "from causica.distributions import (\n", - " ContinuousNoiseDist,\n", - " SEMDistributionModule,\n", - ")\n", + "from causica.distributions import ContinuousNoiseDist\n", "from causica.lightning.data_modules.basic_data_module import BasicDECIDataModule\n", "from causica.lightning.modules.deci_module import DECIModule\n", - "from causica.sem.distribution_parameters_sem import DistributionParametersSEM\n", + "from causica.sem.sem_distribution import SEMDistributionModule\n", "from causica.sem.structural_equation_model import ite\n", "from causica.training.auglag import AugLagLRConfig\n", "\n", "warnings.filterwarnings(\"ignore\")\n", - "%matplotlib inline" + "test_run = bool(os.environ.get(\"TEST_RUN\", False)) # used by testing to run the notebook as a script" ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -110,6 +110,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -384,6 +385,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -439,7 +441,11 @@ "fig, axis = plt.subplots(1, 1, figsize=(8, 8))\n", "labels = {node: i for i, node in enumerate(true_adj.nodes)}\n", "\n", - "layout = nx.nx_agraph.graphviz_layout(true_adj, prog=\"dot\")\n", + "try:\n", + " layout = nx.nx_agraph.graphviz_layout(true_adj, prog=\"dot\")\n", + "except (ModuleNotFoundError, ImportError):\n", + " layout = nx.layout.spring_layout(true_adj)\n", + "\n", "for node, i in labels.items():\n", " axis.scatter(layout[node][0], layout[node][1], label=f\"{i}: {node}\")\n", "axis.legend()\n", @@ -447,6 +453,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -454,6 +461,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -478,6 +486,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -497,6 +506,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -523,6 +533,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -542,6 +553,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -553,6 +565,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -596,7 +609,8 @@ "\n", "trainer = pl.Trainer(\n", " accelerator=\"auto\",\n", - " max_epochs=int(os.environ.get(\"MAX_EPOCH\", 2000)), # used by testing to run the notebook as a script\n", + " max_epochs=2000,\n", + " fast_dev_run=test_run,\n", " callbacks=[TQDMProgressBar(refresh_rate=19)],\n", " enable_checkpointing=False,\n", ")" @@ -668,6 +682,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -725,6 +740,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -733,6 +749,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -742,6 +759,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -769,7 +787,7 @@ ], "source": [ "revenue_estimated_ate = {}\n", - "num_samples = 20000\n", + "num_samples = 10 if test_run else 20000\n", "sample_shape = torch.Size([num_samples])\n", "transform = data_module.normalizer.transform_modules[outcome]().inv\n", "\n", @@ -791,6 +809,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -825,6 +844,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -857,13 +877,14 @@ "source": [ "revenue_estimated_ite = {}\n", "\n", + "base_noise = sem.sample_to_noise(data_module.dataset_train)\n", + "\n", "for treatment in treatment_columns:\n", - " base_noise = sem.sample_to_noise(data_module.dataset_train)\n", - " intervention_a = TensorDict({treatment: torch.tensor([1.0])}, batch_size=tuple())\n", - " do_a_cfs = transform(sem.do(interventions=intervention_a).noise_to_sample(base_noise)[outcome])\n", - " intervention_b = TensorDict({treatment: torch.tensor([0.0])}, batch_size=tuple())\n", - " do_b_cfs = transform(sem.do(interventions=intervention_b).noise_to_sample(base_noise)[outcome])\n", - " revenue_estimated_ite[treatment] = (do_a_cfs - do_b_cfs).cpu().detach().numpy()[:, 0]\n", + " do_sem = sem.do(interventions=TensorDict({treatment: torch.tensor([1.0])}, batch_size=tuple()))\n", + " do_a_cfs = transform(do_sem.noise_to_sample(base_noise)[outcome]).cpu().detach().numpy()[:, 0]\n", + " do_sem = sem.do(interventions=TensorDict({treatment: torch.tensor([0.0])}, batch_size=tuple()))\n", + " do_b_cfs = transform(do_sem.noise_to_sample(base_noise)[outcome]).cpu().detach().numpy()[:, 0]\n", + " revenue_estimated_ite[treatment] = do_a_cfs - do_b_cfs\n", "\n", "revenue_estimated_ite" ] diff --git a/poetry.lock b/poetry.lock index c69c337..85b34d3 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.4.0 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.4.1 and should not be changed by hand. [[package]] name = "absl-py" @@ -138,14 +138,14 @@ frozenlist = ">=1.1.0" [[package]] name = "alembic" -version = "1.10.4" +version = "1.11.1" description = "A database migration tool for SQLAlchemy." category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "alembic-1.10.4-py3-none-any.whl", hash = "sha256:43942c3d4bf2620c466b91c0f4fca136fe51ae972394a0cc8b90810d664e4f5c"}, - {file = "alembic-1.10.4.tar.gz", hash = "sha256:295b54bbb92c4008ab6a7dcd1e227e668416d6f84b98b3c4446a2bc6214a556b"}, + {file = "alembic-1.11.1-py3-none-any.whl", hash = "sha256:dc871798a601fab38332e38d6ddb38d5e734f60034baeb8e2db5b642fccd8ab8"}, + {file = "alembic-1.11.1.tar.gz", hash = "sha256:6a810a6b012c88b33458fceb869aef09ac75d6ace5291915ba7fae44de372c01"}, ] [package.dependencies] @@ -212,14 +212,14 @@ files = [ [[package]] name = "azure-core" -version = "1.26.4" +version = "1.27.1" description = "Microsoft Azure Core Library for Python" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "azure-core-1.26.4.zip", hash = "sha256:075fe06b74c3007950dd93d49440c2f3430fd9b4a5a2756ec8c79454afc989c6"}, - {file = "azure_core-1.26.4-py3-none-any.whl", hash = "sha256:d9664b4bc2675d72fba461a285ac43ae33abb2967014a955bf136d9703a2ab3c"}, + {file = "azure-core-1.27.1.zip", hash = "sha256:5975c20808fa388243f01a8b79021bfbe114f503a27c543f002c5fc8bbdd73dd"}, + {file = "azure_core-1.27.1-py3-none-any.whl", hash = "sha256:1b4b19f455eb7b4332c6f92adc2c669353ded07c2722eb436165f0c253737792"}, ] [package.dependencies] @@ -232,20 +232,20 @@ aio = ["aiohttp (>=3.0)"] [[package]] name = "azure-identity" -version = "1.12.0" +version = "1.13.0" description = "Microsoft Azure Identity Library for Python" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "azure-identity-1.12.0.zip", hash = "sha256:7f9b1ae7d97ea7af3f38dd09305e19ab81a1e16ab66ea186b6579d85c1ca2347"}, - {file = "azure_identity-1.12.0-py3-none-any.whl", hash = "sha256:2a58ce4a209a013e37eaccfd5937570ab99e9118b3e1acf875eed3a85d541b92"}, + {file = "azure-identity-1.13.0.zip", hash = "sha256:c931c27301ffa86b07b4dcf574e29da73e3deba9ab5d1fe4f445bb6a3117e260"}, + {file = "azure_identity-1.13.0-py3-none-any.whl", hash = "sha256:bd700cebb80cd9862098587c29d8677e819beca33c62568ced6d5a8e5e332b82"}, ] [package.dependencies] azure-core = ">=1.11.0,<2.0.0" cryptography = ">=2.5" -msal = ">=1.12.0,<2.0.0" +msal = ">=1.20.0,<2.0.0" msal-extensions = ">=0.3.0,<2.0.0" six = ">=1.12.0" @@ -283,13 +283,13 @@ msrest = ">=0.6.21" [[package]] name = "azureml-mlflow" -version = "1.50.0" +version = "1.51.0" description = "Contains the integration code of AzureML with Mlflow." category = "main" optional = false python-versions = ">=3.7,<4.0" files = [ - {file = "azureml_mlflow-1.50.0-py3-none-any.whl", hash = "sha256:ef8de12e8c6bb606aeb011ea326851f425d3a02593f94b8c7065ffb0dd1a7f4f"}, + {file = "azureml_mlflow-1.51.0-py3-none-any.whl", hash = "sha256:69161d709dcfdcb7b4c6aa59ad2d4c37c807b149d8be9dc11754ea5ac27af472"}, ] [package.dependencies] @@ -321,26 +321,26 @@ files = [ [[package]] name = "cachetools" -version = "5.3.0" +version = "5.3.1" description = "Extensible memoizing collections and decorators" category = "main" optional = false -python-versions = "~=3.7" +python-versions = ">=3.7" files = [ - {file = "cachetools-5.3.0-py3-none-any.whl", hash = "sha256:429e1a1e845c008ea6c85aa35d4b98b65d6a9763eeef3e37e92728a12d1de9d4"}, - {file = "cachetools-5.3.0.tar.gz", hash = "sha256:13dfddc7b8df938c21a940dfa6557ce6e94a2f1cdfa58eb90c805721d58f2c14"}, + {file = "cachetools-5.3.1-py3-none-any.whl", hash = "sha256:95ef631eeaea14ba2e36f06437f36463aac3a096799e876ee55e5cdccb102590"}, + {file = "cachetools-5.3.1.tar.gz", hash = "sha256:dce83f2d9b4e1f732a8cd44af8e8fab2dbe46201467fc98b3ef8f269092bf62b"}, ] [[package]] name = "certifi" -version = "2022.12.7" +version = "2023.5.7" description = "Python package for providing Mozilla's CA Bundle." category = "main" optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2022.12.7-py3-none-any.whl", hash = "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18"}, - {file = "certifi-2022.12.7.tar.gz", hash = "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3"}, + {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, + {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, ] [[package]] @@ -534,33 +534,33 @@ files = [ [[package]] name = "cmake" -version = "3.26.3" +version = "3.26.4" description = "CMake is an open-source, cross-platform family of tools designed to build, test and package software" category = "main" optional = false python-versions = "*" files = [ - {file = "cmake-3.26.3-py2.py3-none-macosx_10_10_universal2.macosx_10_10_x86_64.macosx_11_0_arm64.macosx_11_0_universal2.whl", hash = "sha256:9d38ea5b4999f8f042a071bea3e213f085bac26d7ab54cb5a4c6a193c4baf132"}, - {file = "cmake-3.26.3-py2.py3-none-manylinux2010_i686.manylinux_2_12_i686.whl", hash = "sha256:6e5fcd1cfaac33d015e2709e0dd1b7ad352a315367012ac359c9adc062cf075b"}, - {file = "cmake-3.26.3-py2.py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:4d3185738a6405aa15801e684f8d589b00570da4cc676cb1b5bbc902e3023e53"}, - {file = "cmake-3.26.3-py2.py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b20f7f7ea316ce7bb158df0e3c3453cfab5048939f1291017d16a8a36ad33ae6"}, - {file = "cmake-3.26.3-py2.py3-none-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:46aa385e19c9e4fc95d7d6ce5ee0bbe0d69bdeac4e9bc95c61f78f3973c2f626"}, - {file = "cmake-3.26.3-py2.py3-none-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:71e1df5587ad860b9829211380c42fc90ef2413363f12805b1fa2d87769bf876"}, - {file = "cmake-3.26.3-py2.py3-none-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:543b6958d1615327f484a07ab041029b1740918a8baa336adc9f5f0cbcd8fbd8"}, - {file = "cmake-3.26.3-py2.py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1bc7b47456256bdcc41069f5c658f232bd6e15bf4796d115f6ec98800793daff"}, - {file = "cmake-3.26.3-py2.py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:2ae3db2c2be50fdaf0c9f3a23b2206e9dcd55ca124f16486a841b939f50b595e"}, - {file = "cmake-3.26.3-py2.py3-none-musllinux_1_1_i686.whl", hash = "sha256:1798547b23b89030518c5668dc55aed0e1d01867cf91d7a94e15d33f62a56fd0"}, - {file = "cmake-3.26.3-py2.py3-none-musllinux_1_1_ppc64le.whl", hash = "sha256:d3017a08e6ba53ec2486d89a7953a81d4c4a068fc9f29d83e209f295dd9c59f3"}, - {file = "cmake-3.26.3-py2.py3-none-musllinux_1_1_s390x.whl", hash = "sha256:a922a6f6c1580d0db17b0b75f82e619441dd43c7f1d6a35f7d27e709db48bdbb"}, - {file = "cmake-3.26.3-py2.py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:e0ed796530641c8a21a423f9bb7882117dbbeee11ec78dbc335402a678d937ae"}, - {file = "cmake-3.26.3-py2.py3-none-win32.whl", hash = "sha256:27a6fa1b97744311a7993d6a1e0ce14bd73696dab9ceb96701f1ec11edbd5053"}, - {file = "cmake-3.26.3-py2.py3-none-win_amd64.whl", hash = "sha256:cf910bbb488659d300c86b1dac77e44eeb0457bde2cf76a42d7e51f691544b21"}, - {file = "cmake-3.26.3-py2.py3-none-win_arm64.whl", hash = "sha256:24741a304ada699b339034958777d9a1472ac8ddb9b6194d74f814287ca091ae"}, - {file = "cmake-3.26.3.tar.gz", hash = "sha256:b54cde1f1c0573321b22382bd2ffaf5d08f65188572d128cd4867fb9669723c5"}, + {file = "cmake-3.26.4-py2.py3-none-macosx_10_10_universal2.macosx_10_10_x86_64.macosx_11_0_arm64.macosx_11_0_universal2.whl", hash = "sha256:230227bf99f36614de84cdc92ffce3a50eb2803020e946f8da945a08fcf766bf"}, + {file = "cmake-3.26.4-py2.py3-none-manylinux2010_i686.manylinux_2_12_i686.whl", hash = "sha256:248a90816abfc10ff6e1109b54b8235c3e62f0ac92da16541753deb3b5ae063d"}, + {file = "cmake-3.26.4-py2.py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:1b92f9f59f48c803106dbdd6750b0f571a0500e25d3a62c42ba84bb7a9240d10"}, + {file = "cmake-3.26.4-py2.py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3175442985558d5415b97f264a6a1bb0af5ecfe10e3f7510257b1ea66bd33848"}, + {file = "cmake-3.26.4-py2.py3-none-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1d887be5f1a3f17559a78707a6bc0560f4f8cb93cebb9d823d90a63e68bae09b"}, + {file = "cmake-3.26.4-py2.py3-none-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:235d8eac93a28dcce5a1cd7130412885a2aa53d5735cb2230e0f26f589347b65"}, + {file = "cmake-3.26.4-py2.py3-none-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:05cfd76c637eb22058c95e2dc383cadd4e0615e2643e637bb498a6cc24825790"}, + {file = "cmake-3.26.4-py2.py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:93015da6f1c0e1e5f2debf752f1803ea52d742d915ad674043d36e471f937507"}, + {file = "cmake-3.26.4-py2.py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:d726671ae7ae4aa6989e73d26b9f8f8e6af45163a26ea243949d72246566fdd8"}, + {file = "cmake-3.26.4-py2.py3-none-musllinux_1_1_i686.whl", hash = "sha256:432837364aa6cab2826a72e8a4cdd3586f5ac9ce495217ccd59aa70f2bba8120"}, + {file = "cmake-3.26.4-py2.py3-none-musllinux_1_1_ppc64le.whl", hash = "sha256:24110035aff586a04a6a6fcf4609270642e4f503c0620c962dff75b653f81414"}, + {file = "cmake-3.26.4-py2.py3-none-musllinux_1_1_s390x.whl", hash = "sha256:3e280e81713408987b7053f5b922c9f94e45668ca6efff1f02846309ca0b5b0f"}, + {file = "cmake-3.26.4-py2.py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:c3b0e72750c0f6c0373242c1299bc4ffdbebdd5004966ae6df0b2e9845aa6990"}, + {file = "cmake-3.26.4-py2.py3-none-win32.whl", hash = "sha256:e058e59154a1e490fb9425b420f87e28144292397607638d73e323509f7efae6"}, + {file = "cmake-3.26.4-py2.py3-none-win_amd64.whl", hash = "sha256:b7a6946c345497c14064e0c9585b30f5aaebbefdfc0b245b6bb5a978eb4fc85f"}, + {file = "cmake-3.26.4-py2.py3-none-win_arm64.whl", hash = "sha256:93a03bad17b9741acaff4a8651f8596496506602fa123e70fe67142f1b21ee2e"}, + {file = "cmake-3.26.4.tar.gz", hash = "sha256:d45b30b9ce7280829888c78650177ab525df2b6785e1a5b3d82b4c147d828c0e"}, ] [package.extras] -test = ["codecov (>=2.0.5)", "coverage (>=4.2)", "flake8 (>=3.0.4)", "path.py (>=11.5.0)", "pytest (>=3.0.3)", "pytest-cov (>=2.4.0)", "pytest-runner (>=2.9)", "pytest-virtualenv (>=1.7.0)", "scikit-build (>=0.10.0)", "setuptools (>=28.0.0)", "virtualenv (>=15.0.3)", "wheel"] +test = ["coverage (>=4.2)", "flake8 (>=3.0.4)", "path.py (>=11.5.0)", "pytest (>=3.0.3)", "pytest-cov (>=2.4.0)", "pytest-runner (>=2.9)", "pytest-virtualenv (>=1.7.0)", "scikit-build (>=0.10.0)", "setuptools (>=28.0.0)", "virtualenv (>=15.0.3)", "wheel"] [[package]] name = "colorama" @@ -576,138 +576,131 @@ files = [ [[package]] name = "contourpy" -version = "1.0.7" +version = "1.1.0" description = "Python library for calculating contours of 2D quadrilateral grids" category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "contourpy-1.0.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:95c3acddf921944f241b6773b767f1cbce71d03307270e2d769fd584d5d1092d"}, - {file = "contourpy-1.0.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fc1464c97579da9f3ab16763c32e5c5d5bb5fa1ec7ce509a4ca6108b61b84fab"}, - {file = "contourpy-1.0.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8acf74b5d383414401926c1598ed77825cd530ac7b463ebc2e4f46638f56cce6"}, - {file = "contourpy-1.0.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c71fdd8f1c0f84ffd58fca37d00ca4ebaa9e502fb49825484da075ac0b0b803"}, - {file = "contourpy-1.0.7-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f99e9486bf1bb979d95d5cffed40689cb595abb2b841f2991fc894b3452290e8"}, - {file = "contourpy-1.0.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87f4d8941a9564cda3f7fa6a6cd9b32ec575830780677932abdec7bcb61717b0"}, - {file = "contourpy-1.0.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9e20e5a1908e18aaa60d9077a6d8753090e3f85ca25da6e25d30dc0a9e84c2c6"}, - {file = "contourpy-1.0.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a877ada905f7d69b2a31796c4b66e31a8068b37aa9b78832d41c82fc3e056ddd"}, - {file = "contourpy-1.0.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6381fa66866b0ea35e15d197fc06ac3840a9b2643a6475c8fff267db8b9f1e69"}, - {file = "contourpy-1.0.7-cp310-cp310-win32.whl", hash = "sha256:3c184ad2433635f216645fdf0493011a4667e8d46b34082f5a3de702b6ec42e3"}, - {file = "contourpy-1.0.7-cp310-cp310-win_amd64.whl", hash = "sha256:3caea6365b13119626ee996711ab63e0c9d7496f65641f4459c60a009a1f3e80"}, - {file = "contourpy-1.0.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ed33433fc3820263a6368e532f19ddb4c5990855e4886088ad84fd7c4e561c71"}, - {file = "contourpy-1.0.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:38e2e577f0f092b8e6774459317c05a69935a1755ecfb621c0a98f0e3c09c9a5"}, - {file = "contourpy-1.0.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ae90d5a8590e5310c32a7630b4b8618cef7563cebf649011da80874d0aa8f414"}, - {file = "contourpy-1.0.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:130230b7e49825c98edf0b428b7aa1125503d91732735ef897786fe5452b1ec2"}, - {file = "contourpy-1.0.7-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58569c491e7f7e874f11519ef46737cea1d6eda1b514e4eb5ac7dab6aa864d02"}, - {file = "contourpy-1.0.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54d43960d809c4c12508a60b66cb936e7ed57d51fb5e30b513934a4a23874fae"}, - {file = "contourpy-1.0.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:152fd8f730c31fd67fe0ffebe1df38ab6a669403da93df218801a893645c6ccc"}, - {file = "contourpy-1.0.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:9056c5310eb1daa33fc234ef39ebfb8c8e2533f088bbf0bc7350f70a29bde1ac"}, - {file = "contourpy-1.0.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a9d7587d2fdc820cc9177139b56795c39fb8560f540bba9ceea215f1f66e1566"}, - {file = "contourpy-1.0.7-cp311-cp311-win32.whl", hash = "sha256:4ee3ee247f795a69e53cd91d927146fb16c4e803c7ac86c84104940c7d2cabf0"}, - {file = "contourpy-1.0.7-cp311-cp311-win_amd64.whl", hash = "sha256:5caeacc68642e5f19d707471890f037a13007feba8427eb7f2a60811a1fc1350"}, - {file = "contourpy-1.0.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fd7dc0e6812b799a34f6d12fcb1000539098c249c8da54f3566c6a6461d0dbad"}, - {file = "contourpy-1.0.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0f9d350b639db6c2c233d92c7f213d94d2e444d8e8fc5ca44c9706cf72193772"}, - {file = "contourpy-1.0.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e96a08b62bb8de960d3a6afbc5ed8421bf1a2d9c85cc4ea73f4bc81b4910500f"}, - {file = "contourpy-1.0.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:031154ed61f7328ad7f97662e48660a150ef84ee1bc8876b6472af88bf5a9b98"}, - {file = "contourpy-1.0.7-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e9ebb4425fc1b658e13bace354c48a933b842d53c458f02c86f371cecbedecc"}, - {file = "contourpy-1.0.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efb8f6d08ca7998cf59eaf50c9d60717f29a1a0a09caa46460d33b2924839dbd"}, - {file = "contourpy-1.0.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6c180d89a28787e4b73b07e9b0e2dac7741261dbdca95f2b489c4f8f887dd810"}, - {file = "contourpy-1.0.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b8d587cc39057d0afd4166083d289bdeff221ac6d3ee5046aef2d480dc4b503c"}, - {file = "contourpy-1.0.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:769eef00437edf115e24d87f8926955f00f7704bede656ce605097584f9966dc"}, - {file = "contourpy-1.0.7-cp38-cp38-win32.whl", hash = "sha256:62398c80ef57589bdbe1eb8537127321c1abcfdf8c5f14f479dbbe27d0322e66"}, - {file = "contourpy-1.0.7-cp38-cp38-win_amd64.whl", hash = "sha256:57119b0116e3f408acbdccf9eb6ef19d7fe7baf0d1e9aaa5381489bc1aa56556"}, - {file = "contourpy-1.0.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:30676ca45084ee61e9c3da589042c24a57592e375d4b138bd84d8709893a1ba4"}, - {file = "contourpy-1.0.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3e927b3868bd1e12acee7cc8f3747d815b4ab3e445a28d2e5373a7f4a6e76ba1"}, - {file = "contourpy-1.0.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:366a0cf0fc079af5204801786ad7a1c007714ee3909e364dbac1729f5b0849e5"}, - {file = "contourpy-1.0.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89ba9bb365446a22411f0673abf6ee1fea3b2cf47b37533b970904880ceb72f3"}, - {file = "contourpy-1.0.7-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:71b0bf0c30d432278793d2141362ac853859e87de0a7dee24a1cea35231f0d50"}, - {file = "contourpy-1.0.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7281244c99fd7c6f27c1c6bfafba878517b0b62925a09b586d88ce750a016d2"}, - {file = "contourpy-1.0.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b6d0f9e1d39dbfb3977f9dd79f156c86eb03e57a7face96f199e02b18e58d32a"}, - {file = "contourpy-1.0.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7f6979d20ee5693a1057ab53e043adffa1e7418d734c1532e2d9e915b08d8ec2"}, - {file = "contourpy-1.0.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5dd34c1ae752515318224cba7fc62b53130c45ac6a1040c8b7c1a223c46e8967"}, - {file = "contourpy-1.0.7-cp39-cp39-win32.whl", hash = "sha256:c5210e5d5117e9aec8c47d9156d1d3835570dd909a899171b9535cb4a3f32693"}, - {file = "contourpy-1.0.7-cp39-cp39-win_amd64.whl", hash = "sha256:60835badb5ed5f4e194a6f21c09283dd6e007664a86101431bf870d9e86266c4"}, - {file = "contourpy-1.0.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ce41676b3d0dd16dbcfabcc1dc46090aaf4688fd6e819ef343dbda5a57ef0161"}, - {file = "contourpy-1.0.7-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a011cf354107b47c58ea932d13b04d93c6d1d69b8b6dce885e642531f847566"}, - {file = "contourpy-1.0.7-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:31a55dccc8426e71817e3fe09b37d6d48ae40aae4ecbc8c7ad59d6893569c436"}, - {file = "contourpy-1.0.7-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69f8ff4db108815addd900a74df665e135dbbd6547a8a69333a68e1f6e368ac2"}, - {file = "contourpy-1.0.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:efe99298ba37e37787f6a2ea868265465410822f7bea163edcc1bd3903354ea9"}, - {file = "contourpy-1.0.7-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a1e97b86f73715e8670ef45292d7cc033548266f07d54e2183ecb3c87598888f"}, - {file = "contourpy-1.0.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc331c13902d0f50845099434cd936d49d7a2ca76cb654b39691974cb1e4812d"}, - {file = "contourpy-1.0.7-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:24847601071f740837aefb730e01bd169fbcaa610209779a78db7ebb6e6a7051"}, - {file = "contourpy-1.0.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abf298af1e7ad44eeb93501e40eb5a67abbf93b5d90e468d01fc0c4451971afa"}, - {file = "contourpy-1.0.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:64757f6460fc55d7e16ed4f1de193f362104285c667c112b50a804d482777edd"}, - {file = "contourpy-1.0.7.tar.gz", hash = "sha256:d8165a088d31798b59e91117d1f5fc3df8168d8b48c4acc10fc0df0d0bdbcc5e"}, + {file = "contourpy-1.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:89f06eff3ce2f4b3eb24c1055a26981bffe4e7264acd86f15b97e40530b794bc"}, + {file = "contourpy-1.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dffcc2ddec1782dd2f2ce1ef16f070861af4fb78c69862ce0aab801495dda6a3"}, + {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25ae46595e22f93592d39a7eac3d638cda552c3e1160255258b695f7b58e5655"}, + {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:17cfaf5ec9862bc93af1ec1f302457371c34e688fbd381f4035a06cd47324f48"}, + {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18a64814ae7bce73925131381603fff0116e2df25230dfc80d6d690aa6e20b37"}, + {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90c81f22b4f572f8a2110b0b741bb64e5a6427e0a198b2cdc1fbaf85f352a3aa"}, + {file = "contourpy-1.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:53cc3a40635abedbec7f1bde60f8c189c49e84ac180c665f2cd7c162cc454baa"}, + {file = "contourpy-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:1f795597073b09d631782e7245016a4323cf1cf0b4e06eef7ea6627e06a37ff2"}, + {file = "contourpy-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0b7b04ed0961647691cfe5d82115dd072af7ce8846d31a5fac6c142dcce8b882"}, + {file = "contourpy-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27bc79200c742f9746d7dd51a734ee326a292d77e7d94c8af6e08d1e6c15d545"}, + {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:052cc634bf903c604ef1a00a5aa093c54f81a2612faedaa43295809ffdde885e"}, + {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9382a1c0bc46230fb881c36229bfa23d8c303b889b788b939365578d762b5c18"}, + {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5cec36c5090e75a9ac9dbd0ff4a8cf7cecd60f1b6dc23a374c7d980a1cd710e"}, + {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f0cbd657e9bde94cd0e33aa7df94fb73c1ab7799378d3b3f902eb8eb2e04a3a"}, + {file = "contourpy-1.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:181cbace49874f4358e2929aaf7ba84006acb76694102e88dd15af861996c16e"}, + {file = "contourpy-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fb3b7d9e6243bfa1efb93ccfe64ec610d85cfe5aec2c25f97fbbd2e58b531256"}, + {file = "contourpy-1.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bcb41692aa09aeb19c7c213411854402f29f6613845ad2453d30bf421fe68fed"}, + {file = "contourpy-1.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5d123a5bc63cd34c27ff9c7ac1cd978909e9c71da12e05be0231c608048bb2ae"}, + {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62013a2cf68abc80dadfd2307299bfa8f5aa0dcaec5b2954caeb5fa094171103"}, + {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0b6616375d7de55797d7a66ee7d087efe27f03d336c27cf1f32c02b8c1a5ac70"}, + {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:317267d915490d1e84577924bd61ba71bf8681a30e0d6c545f577363157e5e94"}, + {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d551f3a442655f3dcc1285723f9acd646ca5858834efeab4598d706206b09c9f"}, + {file = "contourpy-1.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e7a117ce7df5a938fe035cad481b0189049e8d92433b4b33aa7fc609344aafa1"}, + {file = "contourpy-1.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:d4f26b25b4f86087e7d75e63212756c38546e70f2a92d2be44f80114826e1cd4"}, + {file = "contourpy-1.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc00bb4225d57bff7ebb634646c0ee2a1298402ec10a5fe7af79df9a51c1bfd9"}, + {file = "contourpy-1.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:189ceb1525eb0655ab8487a9a9c41f42a73ba52d6789754788d1883fb06b2d8a"}, + {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f2931ed4741f98f74b410b16e5213f71dcccee67518970c42f64153ea9313b9"}, + {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:30f511c05fab7f12e0b1b7730ebdc2ec8deedcfb505bc27eb570ff47c51a8f15"}, + {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:143dde50520a9f90e4a2703f367cf8ec96a73042b72e68fcd184e1279962eb6f"}, + {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e94bef2580e25b5fdb183bf98a2faa2adc5b638736b2c0a4da98691da641316a"}, + {file = "contourpy-1.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ed614aea8462735e7d70141374bd7650afd1c3f3cb0c2dbbcbe44e14331bf002"}, + {file = "contourpy-1.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:438ba416d02f82b692e371858143970ed2eb6337d9cdbbede0d8ad9f3d7dd17d"}, + {file = "contourpy-1.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a698c6a7a432789e587168573a864a7ea374c6be8d4f31f9d87c001d5a843493"}, + {file = "contourpy-1.1.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:397b0ac8a12880412da3551a8cb5a187d3298a72802b45a3bd1805e204ad8439"}, + {file = "contourpy-1.1.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:a67259c2b493b00e5a4d0f7bfae51fb4b3371395e47d079a4446e9b0f4d70e76"}, + {file = "contourpy-1.1.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2b836d22bd2c7bb2700348e4521b25e077255ebb6ab68e351ab5aa91ca27e027"}, + {file = "contourpy-1.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:084eaa568400cfaf7179b847ac871582199b1b44d5699198e9602ecbbb5f6104"}, + {file = "contourpy-1.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:911ff4fd53e26b019f898f32db0d4956c9d227d51338fb3b03ec72ff0084ee5f"}, + {file = "contourpy-1.1.0.tar.gz", hash = "sha256:e53046c3863828d21d531cc3b53786e6580eb1ba02477e8681009b6aa0870b21"}, ] [package.dependencies] numpy = ">=1.16" [package.extras] -bokeh = ["bokeh", "chromedriver", "selenium"] +bokeh = ["bokeh", "selenium"] docs = ["furo", "sphinx-copybutton"] -mypy = ["contourpy[bokeh]", "docutils-stubs", "mypy (==0.991)", "types-Pillow"] -test = ["Pillow", "matplotlib", "pytest"] -test-no-images = ["pytest"] +mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.2.0)", "types-Pillow"] +test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] +test-no-images = ["pytest", "pytest-cov", "wurlitzer"] [[package]] name = "coverage" -version = "7.2.4" +version = "7.2.7" description = "Code coverage measurement for Python" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "coverage-7.2.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9e5eedde6e6e241ec3816f05767cc77e7456bf5ec6b373fb29917f0990e2078f"}, - {file = "coverage-7.2.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5c6c6e3b8fb6411a2035da78d86516bfcfd450571d167304911814407697fb7a"}, - {file = "coverage-7.2.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7668a621afc52db29f6867e0e9c72a1eec9f02c94a7c36599119d557cf6e471"}, - {file = "coverage-7.2.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cdfb53bef4b2739ff747ebbd76d6ac5384371fd3c7a8af08899074eba034d483"}, - {file = "coverage-7.2.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5c4f2e44a2ae15fa6883898e756552db5105ca4bd918634cbd5b7c00e19e8a1"}, - {file = "coverage-7.2.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:700bc9fb1074e0c67c09fe96a803de66663830420781df8dc9fb90d7421d4ccb"}, - {file = "coverage-7.2.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ac4861241e693e21b280f07844ae0e0707665e1dfcbf9466b793584984ae45c4"}, - {file = "coverage-7.2.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3d6f3c5b6738a494f17c73b4aa3aa899865cc33a74aa85e3b5695943b79ad3ce"}, - {file = "coverage-7.2.4-cp310-cp310-win32.whl", hash = "sha256:437da7d2fcc35bf45e04b7e9cfecb7c459ec6f6dc17a8558ed52e8d666c2d9ab"}, - {file = "coverage-7.2.4-cp310-cp310-win_amd64.whl", hash = "sha256:1d3893f285fd76f56651f04d1efd3bdce251c32992a64c51e5d6ec3ba9e3f9c9"}, - {file = "coverage-7.2.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6a17bf32e9e3333d78606ac1073dd20655dc0752d5b923fa76afd3bc91674ab4"}, - {file = "coverage-7.2.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f7ffdb3af2a01ce91577f84fc0faa056029fe457f3183007cffe7b11ea78b23c"}, - {file = "coverage-7.2.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89e63b38c7b888e00fd42ce458f838dccb66de06baea2da71801b0fc9070bfa0"}, - {file = "coverage-7.2.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4522dd9aeb9cc2c4c54ce23933beb37a4e106ec2ba94f69138c159024c8a906a"}, - {file = "coverage-7.2.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:29c7d88468f01a75231797173b52dc66d20a8d91b8bb75c88fc5861268578f52"}, - {file = "coverage-7.2.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bc47015fc0455753e8aba1f38b81b731aaf7f004a0c390b404e0fcf1d6c1d72f"}, - {file = "coverage-7.2.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5c122d120c11a236558c339a59b4b60947b38ac9e3ad30a0e0e02540b37bf536"}, - {file = "coverage-7.2.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:50fda3d33b705b9c01e3b772cfa7d14de8aec2ec2870e4320992c26d057fde12"}, - {file = "coverage-7.2.4-cp311-cp311-win32.whl", hash = "sha256:ab08af91cf4d847a6e15d7d5eeae5fead1487caf16ff3a2056dbe64d058fd246"}, - {file = "coverage-7.2.4-cp311-cp311-win_amd64.whl", hash = "sha256:876e4ef3eff00b50787867c5bae84857a9af4c369a9d5b266cd9b19f61e48ef7"}, - {file = "coverage-7.2.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3fc9cde48de956bfbacea026936fbd4974ff1dc2f83397c6f1968f0142c9d50b"}, - {file = "coverage-7.2.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12bc9127c8aca2f7c25c9acca53da3db6799b2999b40f28c2546237b7ea28459"}, - {file = "coverage-7.2.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2857894c22833d3da6e113623a9b7440159b2295280b4e0d954cadbfa724b85a"}, - {file = "coverage-7.2.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4db4e6c115d869cd5397d3d21fd99e4c7053205c33a4ae725c90d19dcd178af"}, - {file = "coverage-7.2.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:f37ae1804596f13d811e0247ffc8219f5261b3565bdf45fcbb4fc091b8e9ff35"}, - {file = "coverage-7.2.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:cdee9a77fd0ce000781680b6a1f4b721c567f66f2f73a49be1843ff439d634f3"}, - {file = "coverage-7.2.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0b65a6a5484b7f2970393d6250553c05b2ede069e0e18abe907fdc7f3528252e"}, - {file = "coverage-7.2.4-cp37-cp37m-win32.whl", hash = "sha256:1a3e8697cb40f28e5bcfb6f4bda7852d96dbb6f6fd7cc306aba4ae690c9905ab"}, - {file = "coverage-7.2.4-cp37-cp37m-win_amd64.whl", hash = "sha256:4078939c4b7053e14e87c65aa68dbed7867e326e450f94038bfe1a1b22078ff9"}, - {file = "coverage-7.2.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:603a2b172126e3b08c11ca34200143089a088cd0297d4cfc4922d2c1c3a892f9"}, - {file = "coverage-7.2.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:72751d117ceaad3b1ea3bcb9e85f5409bbe9fb8a40086e17333b994dbccc0718"}, - {file = "coverage-7.2.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f19ba9301e6fb0b94ba71fda9a1b02d11f0aab7f8e2455122a4e2921b6703c2f"}, - {file = "coverage-7.2.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d784177a7fb9d0f58d24d3e60638c8b729c3693963bf67fa919120f750db237"}, - {file = "coverage-7.2.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d2a9180beff1922b09bd7389e23454928e108449e646c26da5c62e29b0bf4e3"}, - {file = "coverage-7.2.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:39747afc854a7ee14e5e132da7db179d6281faf97dc51e6d7806651811c47538"}, - {file = "coverage-7.2.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:60feb703abc8d78e9427d873bcf924c9e30cf540a21971ef5a17154da763b60f"}, - {file = "coverage-7.2.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c2becddfcbf3d994a8f4f9dd2b6015cae3a3eff50dedc6e4a17c3cccbe8f93d4"}, - {file = "coverage-7.2.4-cp38-cp38-win32.whl", hash = "sha256:56a674ad18d6b04008283ca03c012be913bf89d91c0803c54c24600b300d9e51"}, - {file = "coverage-7.2.4-cp38-cp38-win_amd64.whl", hash = "sha256:ab08e03add2cf5793e66ac1bbbb24acfa90c125476f5724f5d44c56eeec1d635"}, - {file = "coverage-7.2.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:92b565c51732ea2e7e541709ccce76391b39f4254260e5922e08e00971e88e33"}, - {file = "coverage-7.2.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8769a67e8816c7e94d5bf446fc0501641fde78fdff362feb28c2c64d45d0e9b1"}, - {file = "coverage-7.2.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56d74d6fbd5a98a5629e8467b719b0abea9ca01a6b13555d125c84f8bf4ea23d"}, - {file = "coverage-7.2.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d9f770c6052d9b5c9b0e824fd8c003fe33276473b65b4f10ece9565ceb62438e"}, - {file = "coverage-7.2.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3023ce23e41a6f006c09f7e6d62b6c069c36bdc9f7de16a5ef823acc02e6c63"}, - {file = "coverage-7.2.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:fabd1f4d12dfd6b4f309208c2f31b116dc5900e0b42dbafe4ee1bc7c998ffbb0"}, - {file = "coverage-7.2.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e41a7f44e73b37c6f0132ecfdc1c8b67722f42a3d9b979e6ebc150c8e80cf13a"}, - {file = "coverage-7.2.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:864e36947289be05abd83267c4bade35e772526d3e9653444a9dc891faf0d698"}, - {file = "coverage-7.2.4-cp39-cp39-win32.whl", hash = "sha256:ea534200efbf600e60130c48552f99f351cae2906898a9cd924c1c7f2fb02853"}, - {file = "coverage-7.2.4-cp39-cp39-win_amd64.whl", hash = "sha256:00f8fd8a5fe1ffc3aef78ea2dbf553e5c0f4664324e878995e38d41f037eb2b3"}, - {file = "coverage-7.2.4-pp37.pp38.pp39-none-any.whl", hash = "sha256:856bcb837e96adede31018a0854ce7711a5d6174db1a84e629134970676c54fa"}, - {file = "coverage-7.2.4.tar.gz", hash = "sha256:7283f78d07a201ac7d9dc2ac2e4faaea99c4d302f243ee5b4e359f3e170dc008"}, + {file = "coverage-7.2.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d39b5b4f2a66ccae8b7263ac3c8170994b65266797fb96cbbfd3fb5b23921db8"}, + {file = "coverage-7.2.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6d040ef7c9859bb11dfeb056ff5b3872436e3b5e401817d87a31e1750b9ae2fb"}, + {file = "coverage-7.2.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba90a9563ba44a72fda2e85302c3abc71c5589cea608ca16c22b9804262aaeb6"}, + {file = "coverage-7.2.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7d9405291c6928619403db1d10bd07888888ec1abcbd9748fdaa971d7d661b2"}, + {file = "coverage-7.2.7-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31563e97dae5598556600466ad9beea39fb04e0229e61c12eaa206e0aa202063"}, + {file = "coverage-7.2.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ebba1cd308ef115925421d3e6a586e655ca5a77b5bf41e02eb0e4562a111f2d1"}, + {file = "coverage-7.2.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:cb017fd1b2603ef59e374ba2063f593abe0fc45f2ad9abdde5b4d83bd922a353"}, + {file = "coverage-7.2.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62a5c7dad11015c66fbb9d881bc4caa5b12f16292f857842d9d1871595f4495"}, + {file = "coverage-7.2.7-cp310-cp310-win32.whl", hash = "sha256:ee57190f24fba796e36bb6d3aa8a8783c643d8fa9760c89f7a98ab5455fbf818"}, + {file = "coverage-7.2.7-cp310-cp310-win_amd64.whl", hash = "sha256:f75f7168ab25dd93110c8a8117a22450c19976afbc44234cbf71481094c1b850"}, + {file = "coverage-7.2.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:06a9a2be0b5b576c3f18f1a241f0473575c4a26021b52b2a85263a00f034d51f"}, + {file = "coverage-7.2.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5baa06420f837184130752b7c5ea0808762083bf3487b5038d68b012e5937dbe"}, + {file = "coverage-7.2.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdec9e8cbf13a5bf63290fc6013d216a4c7232efb51548594ca3631a7f13c3a3"}, + {file = "coverage-7.2.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:52edc1a60c0d34afa421c9c37078817b2e67a392cab17d97283b64c5833f427f"}, + {file = "coverage-7.2.7-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63426706118b7f5cf6bb6c895dc215d8a418d5952544042c8a2d9fe87fcf09cb"}, + {file = "coverage-7.2.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:afb17f84d56068a7c29f5fa37bfd38d5aba69e3304af08ee94da8ed5b0865833"}, + {file = "coverage-7.2.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:48c19d2159d433ccc99e729ceae7d5293fbffa0bdb94952d3579983d1c8c9d97"}, + {file = "coverage-7.2.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0e1f928eaf5469c11e886fe0885ad2bf1ec606434e79842a879277895a50942a"}, + {file = "coverage-7.2.7-cp311-cp311-win32.whl", hash = "sha256:33d6d3ea29d5b3a1a632b3c4e4f4ecae24ef170b0b9ee493883f2df10039959a"}, + {file = "coverage-7.2.7-cp311-cp311-win_amd64.whl", hash = "sha256:5b7540161790b2f28143191f5f8ec02fb132660ff175b7747b95dcb77ac26562"}, + {file = "coverage-7.2.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f2f67fe12b22cd130d34d0ef79206061bfb5eda52feb6ce0dba0644e20a03cf4"}, + {file = "coverage-7.2.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a342242fe22407f3c17f4b499276a02b01e80f861f1682ad1d95b04018e0c0d4"}, + {file = "coverage-7.2.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:171717c7cb6b453aebac9a2ef603699da237f341b38eebfee9be75d27dc38e01"}, + {file = "coverage-7.2.7-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49969a9f7ffa086d973d91cec8d2e31080436ef0fb4a359cae927e742abfaaa6"}, + {file = "coverage-7.2.7-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b46517c02ccd08092f4fa99f24c3b83d8f92f739b4657b0f146246a0ca6a831d"}, + {file = "coverage-7.2.7-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:a3d33a6b3eae87ceaefa91ffdc130b5e8536182cd6dfdbfc1aa56b46ff8c86de"}, + {file = "coverage-7.2.7-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:976b9c42fb2a43ebf304fa7d4a310e5f16cc99992f33eced91ef6f908bd8f33d"}, + {file = "coverage-7.2.7-cp312-cp312-win32.whl", hash = "sha256:8de8bb0e5ad103888d65abef8bca41ab93721647590a3f740100cd65c3b00511"}, + {file = "coverage-7.2.7-cp312-cp312-win_amd64.whl", hash = "sha256:9e31cb64d7de6b6f09702bb27c02d1904b3aebfca610c12772452c4e6c21a0d3"}, + {file = "coverage-7.2.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:58c2ccc2f00ecb51253cbe5d8d7122a34590fac9646a960d1430d5b15321d95f"}, + {file = "coverage-7.2.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d22656368f0e6189e24722214ed8d66b8022db19d182927b9a248a2a8a2f67eb"}, + {file = "coverage-7.2.7-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a895fcc7b15c3fc72beb43cdcbdf0ddb7d2ebc959edac9cef390b0d14f39f8a9"}, + {file = "coverage-7.2.7-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e84606b74eb7de6ff581a7915e2dab7a28a0517fbe1c9239eb227e1354064dcd"}, + {file = "coverage-7.2.7-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0a5f9e1dbd7fbe30196578ca36f3fba75376fb99888c395c5880b355e2875f8a"}, + {file = "coverage-7.2.7-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:419bfd2caae268623dd469eff96d510a920c90928b60f2073d79f8fe2bbc5959"}, + {file = "coverage-7.2.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2aee274c46590717f38ae5e4650988d1af340fe06167546cc32fe2f58ed05b02"}, + {file = "coverage-7.2.7-cp37-cp37m-win32.whl", hash = "sha256:61b9a528fb348373c433e8966535074b802c7a5d7f23c4f421e6c6e2f1697a6f"}, + {file = "coverage-7.2.7-cp37-cp37m-win_amd64.whl", hash = "sha256:b1c546aca0ca4d028901d825015dc8e4d56aac4b541877690eb76490f1dc8ed0"}, + {file = "coverage-7.2.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:54b896376ab563bd38453cecb813c295cf347cf5906e8b41d340b0321a5433e5"}, + {file = "coverage-7.2.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3d376df58cc111dc8e21e3b6e24606b5bb5dee6024f46a5abca99124b2229ef5"}, + {file = "coverage-7.2.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e330fc79bd7207e46c7d7fd2bb4af2963f5f635703925543a70b99574b0fea9"}, + {file = "coverage-7.2.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e9d683426464e4a252bf70c3498756055016f99ddaec3774bf368e76bbe02b6"}, + {file = "coverage-7.2.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d13c64ee2d33eccf7437961b6ea7ad8673e2be040b4f7fd4fd4d4d28d9ccb1e"}, + {file = "coverage-7.2.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b7aa5f8a41217360e600da646004f878250a0d6738bcdc11a0a39928d7dc2050"}, + {file = "coverage-7.2.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8fa03bce9bfbeeef9f3b160a8bed39a221d82308b4152b27d82d8daa7041fee5"}, + {file = "coverage-7.2.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:245167dd26180ab4c91d5e1496a30be4cd721a5cf2abf52974f965f10f11419f"}, + {file = "coverage-7.2.7-cp38-cp38-win32.whl", hash = "sha256:d2c2db7fd82e9b72937969bceac4d6ca89660db0a0967614ce2481e81a0b771e"}, + {file = "coverage-7.2.7-cp38-cp38-win_amd64.whl", hash = "sha256:2e07b54284e381531c87f785f613b833569c14ecacdcb85d56b25c4622c16c3c"}, + {file = "coverage-7.2.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:537891ae8ce59ef63d0123f7ac9e2ae0fc8b72c7ccbe5296fec45fd68967b6c9"}, + {file = "coverage-7.2.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:06fb182e69f33f6cd1d39a6c597294cff3143554b64b9825d1dc69d18cc2fff2"}, + {file = "coverage-7.2.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:201e7389591af40950a6480bd9edfa8ed04346ff80002cec1a66cac4549c1ad7"}, + {file = "coverage-7.2.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f6951407391b639504e3b3be51b7ba5f3528adbf1a8ac3302b687ecababf929e"}, + {file = "coverage-7.2.7-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f48351d66575f535669306aa7d6d6f71bc43372473b54a832222803eb956fd1"}, + {file = "coverage-7.2.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b29019c76039dc3c0fd815c41392a044ce555d9bcdd38b0fb60fb4cd8e475ba9"}, + {file = "coverage-7.2.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:81c13a1fc7468c40f13420732805a4c38a105d89848b7c10af65a90beff25250"}, + {file = "coverage-7.2.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:975d70ab7e3c80a3fe86001d8751f6778905ec723f5b110aed1e450da9d4b7f2"}, + {file = "coverage-7.2.7-cp39-cp39-win32.whl", hash = "sha256:7ee7d9d4822c8acc74a5e26c50604dff824710bc8de424904c0982e25c39c6cb"}, + {file = "coverage-7.2.7-cp39-cp39-win_amd64.whl", hash = "sha256:eb393e5ebc85245347950143969b241d08b52b88a3dc39479822e073a1a8eb27"}, + {file = "coverage-7.2.7-pp37.pp38.pp39-none-any.whl", hash = "sha256:b7b4c971f05e6ae490fef852c218b0e79d4e52f79ef0c8475566584a8fb3e01d"}, + {file = "coverage-7.2.7.tar.gz", hash = "sha256:924d94291ca674905fe9481f12294eb11f2d3d3fd1adb20314ba89e94f44ed59"}, ] [package.dependencies] @@ -718,31 +711,31 @@ toml = ["tomli"] [[package]] name = "cryptography" -version = "40.0.2" +version = "41.0.1" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "cryptography-40.0.2-cp36-abi3-macosx_10_12_universal2.whl", hash = "sha256:8f79b5ff5ad9d3218afb1e7e20ea74da5f76943ee5edb7f76e56ec5161ec782b"}, - {file = "cryptography-40.0.2-cp36-abi3-macosx_10_12_x86_64.whl", hash = "sha256:05dc219433b14046c476f6f09d7636b92a1c3e5808b9a6536adf4932b3b2c440"}, - {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4df2af28d7bedc84fe45bd49bc35d710aede676e2a4cb7fc6d103a2adc8afe4d"}, - {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dcca15d3a19a66e63662dc8d30f8036b07be851a8680eda92d079868f106288"}, - {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:a04386fb7bc85fab9cd51b6308633a3c271e3d0d3eae917eebab2fac6219b6d2"}, - {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:adc0d980fd2760c9e5de537c28935cc32b9353baaf28e0814df417619c6c8c3b"}, - {file = "cryptography-40.0.2-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:d5a1bd0e9e2031465761dfa920c16b0065ad77321d8a8c1f5ee331021fda65e9"}, - {file = "cryptography-40.0.2-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:a95f4802d49faa6a674242e25bfeea6fc2acd915b5e5e29ac90a32b1139cae1c"}, - {file = "cryptography-40.0.2-cp36-abi3-win32.whl", hash = "sha256:aecbb1592b0188e030cb01f82d12556cf72e218280f621deed7d806afd2113f9"}, - {file = "cryptography-40.0.2-cp36-abi3-win_amd64.whl", hash = "sha256:b12794f01d4cacfbd3177b9042198f3af1c856eedd0a98f10f141385c809a14b"}, - {file = "cryptography-40.0.2-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:142bae539ef28a1c76794cca7f49729e7c54423f615cfd9b0b1fa90ebe53244b"}, - {file = "cryptography-40.0.2-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:956ba8701b4ffe91ba59665ed170a2ebbdc6fc0e40de5f6059195d9f2b33ca0e"}, - {file = "cryptography-40.0.2-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4f01c9863da784558165f5d4d916093737a75203a5c5286fde60e503e4276c7a"}, - {file = "cryptography-40.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:3daf9b114213f8ba460b829a02896789751626a2a4e7a43a28ee77c04b5e4958"}, - {file = "cryptography-40.0.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48f388d0d153350f378c7f7b41497a54ff1513c816bcbbcafe5b829e59b9ce5b"}, - {file = "cryptography-40.0.2-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c0764e72b36a3dc065c155e5b22f93df465da9c39af65516fe04ed3c68c92636"}, - {file = "cryptography-40.0.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:cbaba590180cba88cb99a5f76f90808a624f18b169b90a4abb40c1fd8c19420e"}, - {file = "cryptography-40.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7a38250f433cd41df7fcb763caa3ee9362777fdb4dc642b9a349721d2bf47404"}, - {file = "cryptography-40.0.2.tar.gz", hash = "sha256:c33c0d32b8594fa647d2e01dbccc303478e16fdd7cf98652d5b3ed11aa5e5c99"}, + {file = "cryptography-41.0.1-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:f73bff05db2a3e5974a6fd248af2566134d8981fd7ab012e5dd4ddb1d9a70699"}, + {file = "cryptography-41.0.1-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:1a5472d40c8f8e91ff7a3d8ac6dfa363d8e3138b961529c996f3e2df0c7a411a"}, + {file = "cryptography-41.0.1-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7fa01527046ca5facdf973eef2535a27fec4cb651e4daec4d043ef63f6ecd4ca"}, + {file = "cryptography-41.0.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b46e37db3cc267b4dea1f56da7346c9727e1209aa98487179ee8ebed09d21e43"}, + {file = "cryptography-41.0.1-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:d198820aba55660b4d74f7b5fd1f17db3aa5eb3e6893b0a41b75e84e4f9e0e4b"}, + {file = "cryptography-41.0.1-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:948224d76c4b6457349d47c0c98657557f429b4e93057cf5a2f71d603e2fc3a3"}, + {file = "cryptography-41.0.1-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:059e348f9a3c1950937e1b5d7ba1f8e968508ab181e75fc32b879452f08356db"}, + {file = "cryptography-41.0.1-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:b4ceb5324b998ce2003bc17d519080b4ec8d5b7b70794cbd2836101406a9be31"}, + {file = "cryptography-41.0.1-cp37-abi3-win32.whl", hash = "sha256:8f4ab7021127a9b4323537300a2acfb450124b2def3756f64dc3a3d2160ee4b5"}, + {file = "cryptography-41.0.1-cp37-abi3-win_amd64.whl", hash = "sha256:1fee5aacc7367487b4e22484d3c7e547992ed726d14864ee33c0176ae43b0d7c"}, + {file = "cryptography-41.0.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9a6c7a3c87d595608a39980ebaa04d5a37f94024c9f24eb7d10262b92f739ddb"}, + {file = "cryptography-41.0.1-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5d092fdfedaec4cbbffbf98cddc915ba145313a6fdaab83c6e67f4e6c218e6f3"}, + {file = "cryptography-41.0.1-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1a8e6c2de6fbbcc5e14fd27fb24414507cb3333198ea9ab1258d916f00bc3039"}, + {file = "cryptography-41.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:cb33ccf15e89f7ed89b235cff9d49e2e62c6c981a6061c9c8bb47ed7951190bc"}, + {file = "cryptography-41.0.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5f0ff6e18d13a3de56f609dd1fd11470918f770c6bd5d00d632076c727d35485"}, + {file = "cryptography-41.0.1-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:7bfc55a5eae8b86a287747053140ba221afc65eb06207bedf6e019b8934b477c"}, + {file = "cryptography-41.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:eb8163f5e549a22888c18b0d53d6bb62a20510060a22fd5a995ec8a05268df8a"}, + {file = "cryptography-41.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:8dde71c4169ec5ccc1087bb7521d54251c016f126f922ab2dfe6649170a3b8c5"}, + {file = "cryptography-41.0.1.tar.gz", hash = "sha256:d34579085401d3f49762d2f7d6634d6b6c2ae1242202e860f4d26b046e3a1006"}, ] [package.dependencies] @@ -751,12 +744,12 @@ cffi = ">=1.12" [package.extras] docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] -pep8test = ["black", "check-manifest", "mypy", "ruff"] -sdist = ["setuptools-rust (>=0.11.4)"] +nox = ["nox"] +pep8test = ["black", "check-sdist", "mypy", "ruff"] +sdist = ["build"] ssh = ["bcrypt (>=3.1.5)"] -test = ["iso8601", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-shard (>=0.1.2)", "pytest-subtests", "pytest-xdist"] +test = ["pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] test-randomorder = ["pytest-randomly"] -tox = ["tox"] [[package]] name = "cycler" @@ -772,14 +765,14 @@ files = [ [[package]] name = "databricks-cli" -version = "0.17.6" +version = "0.17.7" description = "A command line interface for Databricks" category = "main" optional = false python-versions = "*" files = [ - {file = "databricks-cli-0.17.6.tar.gz", hash = "sha256:7fea8b4e47ac38bd4eaad8a76e38a6916419df930ad1c615a6b43feb427672c4"}, - {file = "databricks_cli-0.17.6-py2-none-any.whl", hash = "sha256:99c8fef80ef3215a36c09f594e7788e59bf9990792b4697d8daece754abe1660"}, + {file = "databricks-cli-0.17.7.tar.gz", hash = "sha256:5a545063449f3b9ad904644c0f251058485e29e564dedf8d4e4a7b45caf9549b"}, + {file = "databricks_cli-0.17.7-py2-none-any.whl", hash = "sha256:5b025943c70bbd374415264d38bfaddfb34ce070fadb083d851aec311e0f8901"}, ] [package.dependencies] @@ -789,17 +782,18 @@ pyjwt = ">=1.7.0" requests = ">=2.17.3" six = ">=1.10.0" tabulate = ">=0.7.7" +urllib3 = ">=1.26.7,<2.0.0" [[package]] name = "dataclasses-json" -version = "0.5.7" +version = "0.5.8" description = "Easily serialize dataclasses to and from JSON" category = "main" optional = false python-versions = ">=3.6" files = [ - {file = "dataclasses-json-0.5.7.tar.gz", hash = "sha256:c2c11bc8214fbf709ffc369d11446ff6945254a7f09128154a7620613d8fda90"}, - {file = "dataclasses_json-0.5.7-py3-none-any.whl", hash = "sha256:bc285b5f892094c3a53d558858a88553dd6a61a11ab1a8128a0e554385dcc5dd"}, + {file = "dataclasses-json-0.5.8.tar.gz", hash = "sha256:6572ac08ad9340abcb74fd8c4c8e9752db2a182a402c8e871d0a8aa119e3804e"}, + {file = "dataclasses_json-0.5.8-py3-none-any.whl", hash = "sha256:65b167c15fdf9bde27569c09ac18dd39bf1cc5b7998525024cb4678d2653946c"}, ] [package.dependencies] @@ -808,18 +802,18 @@ marshmallow-enum = ">=1.5.1,<2.0.0" typing-inspect = ">=0.4.0" [package.extras] -dev = ["flake8", "hypothesis", "ipython", "mypy (>=0.710)", "portray", "pytest (>=6.2.3)", "simplejson", "types-dataclasses"] +dev = ["flake8", "hypothesis", "ipython", "mypy (>=0.710)", "portray", "pytest (>=7.2.0)", "simplejson", "types-dataclasses"] [[package]] name = "docker" -version = "6.0.1" +version = "6.1.3" description = "A Python library for the Docker Engine API." category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "docker-6.0.1-py3-none-any.whl", hash = "sha256:dbcb3bd2fa80dca0788ed908218bf43972772009b881ed1e20dfc29a65e49782"}, - {file = "docker-6.0.1.tar.gz", hash = "sha256:896c4282e5c7af5c45e8b683b0b0c33932974fe6e50fc6906a0a83616ab3da97"}, + {file = "docker-6.1.3-py3-none-any.whl", hash = "sha256:aecd2277b8bf8e506e484f6ab7aec39abe0038e29fa4a6d3ba86c3fe01844ed9"}, + {file = "docker-6.1.3.tar.gz", hash = "sha256:aa6d17830045ba5ef0168d5eaa34d37beeb113948c413affe1d5991fc11f9a20"}, ] [package.dependencies] @@ -873,30 +867,30 @@ test = ["pytest (>=6)"] [[package]] name = "filelock" -version = "3.12.0" +version = "3.12.2" description = "A platform independent file lock." category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "filelock-3.12.0-py3-none-any.whl", hash = "sha256:ad98852315c2ab702aeb628412cbf7e95b7ce8c3bf9565670b4eaecf1db370a9"}, - {file = "filelock-3.12.0.tar.gz", hash = "sha256:fc03ae43288c013d2ea83c8597001b1129db351aad9c57fe2409327916b8e718"}, + {file = "filelock-3.12.2-py3-none-any.whl", hash = "sha256:cbb791cdea2a72f23da6ac5b5269ab0a0d161e9ef0100e653b69049a7706d1ec"}, + {file = "filelock-3.12.2.tar.gz", hash = "sha256:002740518d8aa59a26b0c76e10fb8c6e15eae825d34b6fdf670333fd7b938d81"}, ] [package.extras] -docs = ["furo (>=2023.3.27)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.2.3)", "diff-cover (>=7.5)", "pytest (>=7.3.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)", "pytest-timeout (>=2.1)"] +docs = ["furo (>=2023.5.20)", "sphinx (>=7.0.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "diff-cover (>=7.5)", "pytest (>=7.3.1)", "pytest-cov (>=4.1)", "pytest-mock (>=3.10)", "pytest-timeout (>=2.1)"] [[package]] name = "flask" -version = "2.3.1" +version = "2.3.2" description = "A simple framework for building complex web applications." category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "Flask-2.3.1-py3-none-any.whl", hash = "sha256:8ba2a854608fdd603b67dccd4514a46450132227fb9df40127a8d0c1de8769ec"}, - {file = "Flask-2.3.1.tar.gz", hash = "sha256:a6059db4297106e5a64b3215fa16ae641822c1cb97ecb498573549b2478602cb"}, + {file = "Flask-2.3.2-py3-none-any.whl", hash = "sha256:77fd4e1249d8c9923de34907236b747ced06e5467ecac1a7bb7115ae0e9670b0"}, + {file = "Flask-2.3.2.tar.gz", hash = "sha256:8c2f9abd47a9e8df7f0c3f091ce9497d011dc3b31effcf4c85a6e2b50f4114ef"}, ] [package.dependencies] @@ -904,7 +898,7 @@ blinker = ">=1.6.2" click = ">=8.1.3" itsdangerous = ">=2.1.2" Jinja2 = ">=3.1.2" -Werkzeug = ">=2.3.0" +Werkzeug = ">=2.3.3" [package.extras] async = ["asgiref (>=3.2)"] @@ -912,14 +906,46 @@ dotenv = ["python-dotenv"] [[package]] name = "fonttools" -version = "4.39.3" +version = "4.40.0" description = "Tools to manipulate font files" category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "fonttools-4.39.3-py3-none-any.whl", hash = "sha256:64c0c05c337f826183637570ac5ab49ee220eec66cf50248e8df527edfa95aeb"}, - {file = "fonttools-4.39.3.zip", hash = "sha256:9234b9f57b74e31b192c3fc32ef1a40750a8fbc1cd9837a7b7bfc4ca4a5c51d7"}, + {file = "fonttools-4.40.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b802dcbf9bcff74672f292b2466f6589ab8736ce4dcf36f48eb994c2847c4b30"}, + {file = "fonttools-4.40.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7f6e3fa3da923063c286320e728ba2270e49c73386e3a711aa680f4b0747d692"}, + {file = "fonttools-4.40.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fdf60f8a5c6bcce7d024a33f7e4bc7921f5b74e8ea13bccd204f2c8b86f3470"}, + {file = "fonttools-4.40.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91784e21a1a085fac07c6a407564f4a77feb471b5954c9ee55a4f9165151f6c1"}, + {file = "fonttools-4.40.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:05171f3c546f64d78569f10adc0de72561882352cac39ec7439af12304d8d8c0"}, + {file = "fonttools-4.40.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7449e5e306f3a930a8944c85d0cbc8429cba13503372a1a40f23124d6fb09b58"}, + {file = "fonttools-4.40.0-cp310-cp310-win32.whl", hash = "sha256:bae8c13abbc2511e9a855d2142c0ab01178dd66b1a665798f357da0d06253e0d"}, + {file = "fonttools-4.40.0-cp310-cp310-win_amd64.whl", hash = "sha256:425b74a608427499b0e45e433c34ddc350820b6f25b7c8761963a08145157a66"}, + {file = "fonttools-4.40.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:00ab569b2a3e591e00425023ade87e8fef90380c1dde61be7691cb524ca5f743"}, + {file = "fonttools-4.40.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:18ea64ac43e94c9e0c23d7a9475f1026be0e25b10dda8f236fc956188761df97"}, + {file = "fonttools-4.40.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:022c4a16b412293e7f1ce21b8bab7a6f9d12c4ffdf171fdc67122baddb973069"}, + {file = "fonttools-4.40.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:530c5d35109f3e0cea2535742d6a3bc99c0786cf0cbd7bb2dc9212387f0d908c"}, + {file = "fonttools-4.40.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5e00334c66f4e83535384cb5339526d01d02d77f142c23b2f97bd6a4f585497a"}, + {file = "fonttools-4.40.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:eb52c10fda31159c22c7ed85074e05f8b97da8773ea461706c273e31bcbea836"}, + {file = "fonttools-4.40.0-cp311-cp311-win32.whl", hash = "sha256:6a8d71b9a5c884c72741868e845c0e563c5d83dcaf10bb0ceeec3b4b2eb14c67"}, + {file = "fonttools-4.40.0-cp311-cp311-win_amd64.whl", hash = "sha256:15abb3d055c1b2dff9ce376b6c3db10777cb74b37b52b78f61657634fd348a0d"}, + {file = "fonttools-4.40.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:14037c31138fbd21847ad5e5441dfdde003e0a8f3feb5812a1a21fd1c255ffbd"}, + {file = "fonttools-4.40.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:94c915f6716589f78bc00fbc14c5b8de65cfd11ee335d32504f1ef234524cb24"}, + {file = "fonttools-4.40.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37467cee0f32cada2ec08bc16c9c31f9b53ea54b2f5604bf25a1246b5f50593a"}, + {file = "fonttools-4.40.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56d4d85f5374b45b08d2f928517d1e313ea71b4847240398decd0ab3ebbca885"}, + {file = "fonttools-4.40.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8c4305b171b61040b1ee75d18f9baafe58bd3b798d1670078efe2c92436bfb63"}, + {file = "fonttools-4.40.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a954b90d1473c85a22ecf305761d9fd89da93bbd31dae86e7dea436ad2cb5dc9"}, + {file = "fonttools-4.40.0-cp38-cp38-win32.whl", hash = "sha256:1bc4c5b147be8dbc5df9cc8ac5e93ee914ad030fe2a201cc8f02f499db71011d"}, + {file = "fonttools-4.40.0-cp38-cp38-win_amd64.whl", hash = "sha256:8a917828dbfdb1cbe50cf40eeae6fbf9c41aef9e535649ed8f4982b2ef65c091"}, + {file = "fonttools-4.40.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:882983279bf39afe4e945109772c2ffad2be2c90983d6559af8b75c19845a80a"}, + {file = "fonttools-4.40.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c55f1b4109dbc3aeb496677b3e636d55ef46dc078c2a5e3f3db4e90f1c6d2907"}, + {file = "fonttools-4.40.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec468c022d09f1817c691cf884feb1030ef6f1e93e3ea6831b0d8144c06480d1"}, + {file = "fonttools-4.40.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d5adf4ba114f028fc3f5317a221fd8b0f4ef7a2e5524a2b1e0fd891b093791a"}, + {file = "fonttools-4.40.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:aa83b3f151bc63970f39b2b42a06097c5a22fd7ed9f7ba008e618de4503d3895"}, + {file = "fonttools-4.40.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:97d95b8301b62bdece1af943b88bcb3680fd385f88346a4a899ee145913b414a"}, + {file = "fonttools-4.40.0-cp39-cp39-win32.whl", hash = "sha256:1a003608400dd1cca3e089e8c94973c6b51a4fb1ef00ff6d7641617b9242e637"}, + {file = "fonttools-4.40.0-cp39-cp39-win_amd64.whl", hash = "sha256:7961575221e3da0841c75da53833272c520000d76f7f71274dbf43370f8a1065"}, + {file = "fonttools-4.40.0-py3-none-any.whl", hash = "sha256:200729d12461e2038700d31f0d49ad5a7b55855dec7525074979a06b46f88505"}, + {file = "fonttools-4.40.0.tar.gz", hash = "sha256:337b6e83d7ee73c40ea62407f2ce03b07c3459e213b6f332b94a69923b9e1cb9"}, ] [package.extras] @@ -1022,14 +1048,14 @@ files = [ [[package]] name = "fsspec" -version = "2023.4.0" +version = "2023.6.0" description = "File-system specification" category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "fsspec-2023.4.0-py3-none-any.whl", hash = "sha256:f398de9b49b14e9d84d2c2d11b7b67121bc072fe97b930c4e5668ac3917d8307"}, - {file = "fsspec-2023.4.0.tar.gz", hash = "sha256:bf064186cd8808f0b2f6517273339ba0a0c8fb1b7048991c28bc67f58b8b67cd"}, + {file = "fsspec-2023.6.0-py3-none-any.whl", hash = "sha256:1cbad1faef3e391fba6dc005ae9b5bdcbf43005c9167ce78c915549c352c869a"}, + {file = "fsspec-2023.6.0.tar.gz", hash = "sha256:d0b2f935446169753e7a5c5c55681c54ea91996cc67be93c39a154fb3a2742af"}, ] [package.dependencies] @@ -1092,28 +1118,29 @@ gitdb = ">=4.0.1,<5" [[package]] name = "google-auth" -version = "2.17.3" +version = "2.20.0" description = "Google Authentication Library" category = "main" optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*" +python-versions = ">=3.6" files = [ - {file = "google-auth-2.17.3.tar.gz", hash = "sha256:ce311e2bc58b130fddf316df57c9b3943c2a7b4f6ec31de9663a9333e4064efc"}, - {file = "google_auth-2.17.3-py2.py3-none-any.whl", hash = "sha256:f586b274d3eb7bd932ea424b1c702a30e0393a2e2bc4ca3eae8263ffd8be229f"}, + {file = "google-auth-2.20.0.tar.gz", hash = "sha256:030af34138909ccde0fbce611afc178f1d65d32fbff281f25738b1fe1c6f3eaa"}, + {file = "google_auth-2.20.0-py2.py3-none-any.whl", hash = "sha256:23b7b0950fcda519bfb6692bf0d5289d2ea49fc143717cc7188458ec620e63fa"}, ] [package.dependencies] cachetools = ">=2.0.0,<6.0" pyasn1-modules = ">=0.2.1" -rsa = {version = ">=3.1.4,<5", markers = "python_version >= \"3.6\""} +rsa = ">=3.1.4,<5" six = ">=1.9.0" +urllib3 = "<2.0" [package.extras] -aiohttp = ["aiohttp (>=3.6.2,<4.0.0dev)", "requests (>=2.20.0,<3.0.0dev)"] +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.0dev)"] +requests = ["requests (>=2.20.0,<3.0.0.dev0)"] [[package]] name = "google-auth-oauthlib" @@ -1210,61 +1237,61 @@ test = ["objgraph", "psutil"] [[package]] name = "grpcio" -version = "1.54.0" +version = "1.56.0" description = "HTTP/2-based RPC framework" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "grpcio-1.54.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:a947d5298a0bbdd4d15671024bf33e2b7da79a70de600ed29ba7e0fef0539ebb"}, - {file = "grpcio-1.54.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:e355ee9da9c1c03f174efea59292b17a95e0b7b4d7d2a389265f731a9887d5a9"}, - {file = "grpcio-1.54.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:73c238ef6e4b64272df7eec976bb016c73d3ab5a6c7e9cd906ab700523d312f3"}, - {file = "grpcio-1.54.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c59d899ee7160638613a452f9a4931de22623e7ba17897d8e3e348c2e9d8d0b"}, - {file = "grpcio-1.54.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48cb7af77238ba16c77879009003f6b22c23425e5ee59cb2c4c103ec040638a5"}, - {file = "grpcio-1.54.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2262bd3512ba9e9f0e91d287393df6f33c18999317de45629b7bd46c40f16ba9"}, - {file = "grpcio-1.54.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:224166f06ccdaf884bf35690bf4272997c1405de3035d61384ccb5b25a4c1ca8"}, - {file = "grpcio-1.54.0-cp310-cp310-win32.whl", hash = "sha256:ed36e854449ff6c2f8ee145f94851fe171298e1e793f44d4f672c4a0d78064e7"}, - {file = "grpcio-1.54.0-cp310-cp310-win_amd64.whl", hash = "sha256:27fb030a4589d2536daec5ff5ba2a128f4f155149efab578fe2de2cb21596d3d"}, - {file = "grpcio-1.54.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:f4a7dca8ccd8023d916b900aa3c626f1bd181bd5b70159479b142f957ff420e4"}, - {file = "grpcio-1.54.0-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:1209d6b002b26e939e4c8ea37a3d5b4028eb9555394ea69fb1adbd4b61a10bb8"}, - {file = "grpcio-1.54.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:860fcd6db7dce80d0a673a1cc898ce6bc3d4783d195bbe0e911bf8a62c93ff3f"}, - {file = "grpcio-1.54.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3930669c9e6f08a2eed824738c3d5699d11cd47a0ecc13b68ed11595710b1133"}, - {file = "grpcio-1.54.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62117486460c83acd3b5d85c12edd5fe20a374630475388cfc89829831d3eb79"}, - {file = "grpcio-1.54.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e3e526062c690517b42bba66ffe38aaf8bc99a180a78212e7b22baa86902f690"}, - {file = "grpcio-1.54.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ebff0738be0499d7db74d20dca9f22a7b27deae31e1bf92ea44924fd69eb6251"}, - {file = "grpcio-1.54.0-cp311-cp311-win32.whl", hash = "sha256:21c4a1aae861748d6393a3ff7867473996c139a77f90326d9f4104bebb22d8b8"}, - {file = "grpcio-1.54.0-cp311-cp311-win_amd64.whl", hash = "sha256:3db71c6f1ab688d8dfc102271cedc9828beac335a3a4372ec54b8bf11b43fd29"}, - {file = "grpcio-1.54.0-cp37-cp37m-linux_armv7l.whl", hash = "sha256:960b176e0bb2b4afeaa1cd2002db1e82ae54c9b6e27ea93570a42316524e77cf"}, - {file = "grpcio-1.54.0-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:d8ae6e0df3a608e99ee1acafaafd7db0830106394d54571c1ece57f650124ce9"}, - {file = "grpcio-1.54.0-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:c33744d0d1a7322da445c0fe726ea6d4e3ef2dfb0539eadf23dce366f52f546c"}, - {file = "grpcio-1.54.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d109df30641d050e009105f9c9ca5a35d01e34d2ee2a4e9c0984d392fd6d704"}, - {file = "grpcio-1.54.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:775a2f70501370e5ba54e1ee3464413bff9bd85bd9a0b25c989698c44a6fb52f"}, - {file = "grpcio-1.54.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c55a9cf5cba80fb88c850915c865b8ed78d5e46e1f2ec1b27692f3eaaf0dca7e"}, - {file = "grpcio-1.54.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:1fa7d6ddd33abbd3c8b3d7d07c56c40ea3d1891ce3cd2aa9fa73105ed5331866"}, - {file = "grpcio-1.54.0-cp37-cp37m-win_amd64.whl", hash = "sha256:ed3d458ded32ff3a58f157b60cc140c88f7ac8c506a1c567b2a9ee8a2fd2ce54"}, - {file = "grpcio-1.54.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:5942a3e05630e1ef5b7b5752e5da6582460a2e4431dae603de89fc45f9ec5aa9"}, - {file = "grpcio-1.54.0-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:125ed35aa3868efa82eabffece6264bf638cfdc9f0cd58ddb17936684aafd0f8"}, - {file = "grpcio-1.54.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:b7655f809e3420f80ce3bf89737169a9dce73238af594049754a1128132c0da4"}, - {file = "grpcio-1.54.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:87f47bf9520bba4083d65ab911f8f4c0ac3efa8241993edd74c8dd08ae87552f"}, - {file = "grpcio-1.54.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16bca8092dd994f2864fdab278ae052fad4913f36f35238b2dd11af2d55a87db"}, - {file = "grpcio-1.54.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d2f62fb1c914a038921677cfa536d645cb80e3dd07dc4859a3c92d75407b90a5"}, - {file = "grpcio-1.54.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a7caf553ccaf715ec05b28c9b2ab2ee3fdb4036626d779aa09cf7cbf54b71445"}, - {file = "grpcio-1.54.0-cp38-cp38-win32.whl", hash = "sha256:2585b3c294631a39b33f9f967a59b0fad23b1a71a212eba6bc1e3ca6e6eec9ee"}, - {file = "grpcio-1.54.0-cp38-cp38-win_amd64.whl", hash = "sha256:3b170e441e91e4f321e46d3cc95a01cb307a4596da54aca59eb78ab0fc03754d"}, - {file = "grpcio-1.54.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:1382bc499af92901c2240c4d540c74eae8a671e4fe9839bfeefdfcc3a106b5e2"}, - {file = "grpcio-1.54.0-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:031bbd26656e0739e4b2c81c172155fb26e274b8d0312d67aefc730bcba915b6"}, - {file = "grpcio-1.54.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:a97b0d01ae595c997c1d9d8249e2d2da829c2d8a4bdc29bb8f76c11a94915c9a"}, - {file = "grpcio-1.54.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:533eaf5b2a79a3c6f35cbd6a095ae99cac7f4f9c0e08bdcf86c130efd3c32adf"}, - {file = "grpcio-1.54.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49eace8ea55fbc42c733defbda1e4feb6d3844ecd875b01bb8b923709e0f5ec8"}, - {file = "grpcio-1.54.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:30fbbce11ffeb4f9f91c13fe04899aaf3e9a81708bedf267bf447596b95df26b"}, - {file = "grpcio-1.54.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:650f5f2c9ab1275b4006707411bb6d6bc927886874a287661c3c6f332d4c068b"}, - {file = "grpcio-1.54.0-cp39-cp39-win32.whl", hash = "sha256:02000b005bc8b72ff50c477b6431e8886b29961159e8b8d03c00b3dd9139baed"}, - {file = "grpcio-1.54.0-cp39-cp39-win_amd64.whl", hash = "sha256:6dc1e2c9ac292c9a484ef900c568ccb2d6b4dfe26dfa0163d5bc815bb836c78d"}, - {file = "grpcio-1.54.0.tar.gz", hash = "sha256:eb0807323572642ab73fd86fe53d88d843ce617dd1ddf430351ad0759809a0ae"}, -] - -[package.extras] -protobuf = ["grpcio-tools (>=1.54.0)"] + {file = "grpcio-1.56.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:fb34ace11419f1ae321c36ccaa18d81cd3f20728cd191250be42949d6845bb2d"}, + {file = "grpcio-1.56.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:008767c0aed4899e657b50f2e0beacbabccab51359eba547f860e7c55f2be6ba"}, + {file = "grpcio-1.56.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:17f47aeb9be0da5337f9ff33ebb8795899021e6c0741ee68bd69774a7804ca86"}, + {file = "grpcio-1.56.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43c50d810cc26349b093bf2cfe86756ab3e9aba3e7e681d360930c1268e1399a"}, + {file = "grpcio-1.56.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:187b8f71bad7d41eea15e0c9812aaa2b87adfb343895fffb704fb040ca731863"}, + {file = "grpcio-1.56.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:881575f240eb5db72ddca4dc5602898c29bc082e0d94599bf20588fb7d1ee6a0"}, + {file = "grpcio-1.56.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c243b158dd7585021d16c50498c4b2ec0a64a6119967440c5ff2d8c89e72330e"}, + {file = "grpcio-1.56.0-cp310-cp310-win32.whl", hash = "sha256:8b3b2c7b5feef90bc9a5fa1c7f97637e55ec3e76460c6d16c3013952ee479cd9"}, + {file = "grpcio-1.56.0-cp310-cp310-win_amd64.whl", hash = "sha256:03a80451530fd3b8b155e0c4480434f6be669daf7ecba56f73ef98f94222ee01"}, + {file = "grpcio-1.56.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:64bd3abcf9fb4a9fa4ede8d0d34686314a7075f62a1502217b227991d9ca4245"}, + {file = "grpcio-1.56.0-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:fdc3a895791af4addbb826808d4c9c35917c59bb5c430d729f44224e51c92d61"}, + {file = "grpcio-1.56.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:4f84a6fd4482e5fe73b297d4874b62a535bc75dc6aec8e9fe0dc88106cd40397"}, + {file = "grpcio-1.56.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:14e70b4dda3183abea94c72d41d5930c333b21f8561c1904a372d80370592ef3"}, + {file = "grpcio-1.56.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b5ce42a5ebe3e04796246ba50357f1813c44a6efe17a37f8dc7a5c470377312"}, + {file = "grpcio-1.56.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:8219f17baf069fe8e42bd8ca0b312b875595e43a70cabf397be4fda488e2f27d"}, + {file = "grpcio-1.56.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:defdd14b518e6e468466f799aaa69db0355bca8d3a5ea75fb912d28ba6f8af31"}, + {file = "grpcio-1.56.0-cp311-cp311-win32.whl", hash = "sha256:50f4daa698835accbbcc60e61e0bc29636c0156ddcafb3891c987e533a0031ba"}, + {file = "grpcio-1.56.0-cp311-cp311-win_amd64.whl", hash = "sha256:59c4e606993a47146fbeaf304b9e78c447f5b9ee5641cae013028c4cca784617"}, + {file = "grpcio-1.56.0-cp37-cp37m-linux_armv7l.whl", hash = "sha256:b1f4b6f25a87d80b28dd6d02e87d63fe1577fe6d04a60a17454e3f8077a38279"}, + {file = "grpcio-1.56.0-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:c2148170e01d464d41011a878088444c13413264418b557f0bdcd1bf1b674a0e"}, + {file = "grpcio-1.56.0-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:0409de787ebbf08c9d2bca2bcc7762c1efe72eada164af78b50567a8dfc7253c"}, + {file = "grpcio-1.56.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66f0369d27f4c105cd21059d635860bb2ea81bd593061c45fb64875103f40e4a"}, + {file = "grpcio-1.56.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38fdf5bd0a1c754ce6bf9311a3c2c7ebe56e88b8763593316b69e0e9a56af1de"}, + {file = "grpcio-1.56.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:79d4c5911d12a7aa671e5eb40cbb50a830396525014d2d6f254ea2ba180ce637"}, + {file = "grpcio-1.56.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:5d2fc471668a7222e213f86ef76933b18cdda6a51ea1322034478df8c6519959"}, + {file = "grpcio-1.56.0-cp37-cp37m-win_amd64.whl", hash = "sha256:991224fd485e088d3cb5e34366053691a4848a6b7112b8f5625a411305c26691"}, + {file = "grpcio-1.56.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:c6f36621aabecbaff3e70c4d1d924c76c8e6a7ffec60c331893640a4af0a8037"}, + {file = "grpcio-1.56.0-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:1eadd6de258901929223f422ffed7f8b310c0323324caf59227f9899ea1b1674"}, + {file = "grpcio-1.56.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:72836b5a1d4f508ffbcfe35033d027859cc737972f9dddbe33fb75d687421e2e"}, + {file = "grpcio-1.56.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f92a99ab0c7772fb6859bf2e4f44ad30088d18f7c67b83205297bfb229e0d2cf"}, + {file = "grpcio-1.56.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa08affbf672d051cd3da62303901aeb7042a2c188c03b2c2a2d346fc5e81c14"}, + {file = "grpcio-1.56.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:e2db108b4c8e29c145e95b0226973a66d73ae3e3e7fae00329294af4e27f1c42"}, + {file = "grpcio-1.56.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8674fdbd28266d8efbcddacf4ec3643f76fe6376f73283fd63a8374c14b0ef7c"}, + {file = "grpcio-1.56.0-cp38-cp38-win32.whl", hash = "sha256:bd55f743e654fb050c665968d7ec2c33f03578a4bbb163cfce38024775ff54cc"}, + {file = "grpcio-1.56.0-cp38-cp38-win_amd64.whl", hash = "sha256:c63bc5ac6c7e646c296fed9139097ae0f0e63f36f0864d7ce431cce61fe0118a"}, + {file = "grpcio-1.56.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:c0bc9dda550785d23f4f025be614b7faa8d0293e10811f0f8536cf50435b7a30"}, + {file = "grpcio-1.56.0-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:d596408bab632ec7b947761e83ce6b3e7632e26b76d64c239ba66b554b7ee286"}, + {file = "grpcio-1.56.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:76b6e6e1ee9bda32e6e933efd61c512e9a9f377d7c580977f090d1a9c78cca44"}, + {file = "grpcio-1.56.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7beb84ebd0a3f732625124b73969d12b7350c5d9d64ddf81ae739bbc63d5b1ed"}, + {file = "grpcio-1.56.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83ec714bbbe9b9502177c842417fde39f7a267031e01fa3cd83f1ca49688f537"}, + {file = "grpcio-1.56.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:4feee75565d1b5ab09cb3a5da672b84ca7f6dd80ee07a50f5537207a9af543a4"}, + {file = "grpcio-1.56.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b4638a796778329cc8e142e4f57c705adb286b3ba64e00b0fa91eeb919611be8"}, + {file = "grpcio-1.56.0-cp39-cp39-win32.whl", hash = "sha256:437af5a7673bca89c4bc0a993382200592d104dd7bf55eddcd141cef91f40bab"}, + {file = "grpcio-1.56.0-cp39-cp39-win_amd64.whl", hash = "sha256:4241a1c2c76e748023c834995cd916570e7180ee478969c2d79a60ce007bc837"}, + {file = "grpcio-1.56.0.tar.gz", hash = "sha256:4c08ee21b3d10315b8dc26f6c13917b20ed574cdbed2d2d80c53d5508fdcc0f2"}, +] + +[package.extras] +protobuf = ["grpcio-tools (>=1.56.0)"] [[package]] name = "gunicorn" @@ -1318,14 +1345,14 @@ files = [ [[package]] name = "importlib-metadata" -version = "6.6.0" +version = "6.7.0" description = "Read metadata from Python packages" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "importlib_metadata-6.6.0-py3-none-any.whl", hash = "sha256:43dd286a2cd8995d5eaef7fee2066340423b818ed3fd70adf0bad5f1fac53fed"}, - {file = "importlib_metadata-6.6.0.tar.gz", hash = "sha256:92501cdf9cc66ebd3e612f1b4f0c0765dfa42f0fa38ffb319b6bd84dd675d705"}, + {file = "importlib_metadata-6.7.0-py3-none-any.whl", hash = "sha256:cb52082e659e97afc5dac71e79de97d8681de3aa07ff18578330904a9d18e5b5"}, + {file = "importlib_metadata-6.7.0.tar.gz", hash = "sha256:1aaf550d4f73e5d6783e7acb77aec43d49da8017410afae93822cc9cca98c4d4"}, ] [package.dependencies] @@ -1334,7 +1361,7 @@ zipp = ">=0.5" [package.extras] docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] -testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] [[package]] name = "importlib-resources" @@ -1578,13 +1605,13 @@ typing = ["mypy (>=1.0.0)"] [[package]] name = "lit" -version = "16.0.2" +version = "16.0.6" description = "A Software Testing Tool" category = "main" optional = false python-versions = "*" files = [ - {file = "lit-16.0.2.tar.gz", hash = "sha256:d743ef55cb58764bba85768c502e2d68d87aeb4303d508a18abaa8a35077ab25"}, + {file = "lit-16.0.6.tar.gz", hash = "sha256:84623c9c23b6b14763d637f4e63e6b721b3446ada40bf7001d8fee70b8e77a9a"}, ] [[package]] @@ -1662,14 +1689,14 @@ testing = ["coverage", "pyyaml"] [[package]] name = "markdown-it-py" -version = "2.2.0" +version = "3.0.0" description = "Python port of markdown-it. Markdown parsing, done right!" category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "markdown-it-py-2.2.0.tar.gz", hash = "sha256:7c9a5e412688bc771c67432cbfebcdd686c93ce6484913dccf06cb5a0bea35a1"}, - {file = "markdown_it_py-2.2.0-py3-none-any.whl", hash = "sha256:5a35f8d1870171d9acc47b99612dc146129b631baf04970128b568f190d0cc30"}, + {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, + {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, ] [package.dependencies] @@ -1682,67 +1709,67 @@ compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0 linkify = ["linkify-it-py (>=1,<3)"] plugins = ["mdit-py-plugins"] profiling = ["gprof2dot"] -rtd = ["attrs", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] +rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] name = "markupsafe" -version = "2.1.2" +version = "2.1.3" description = "Safely add untrusted strings to HTML/XML markup." category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "MarkupSafe-2.1.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:665a36ae6f8f20a4676b53224e33d456a6f5a72657d9c83c2aa00765072f31f7"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:340bea174e9761308703ae988e982005aedf427de816d1afe98147668cc03036"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22152d00bf4a9c7c83960521fc558f55a1adbc0631fbb00a9471e097b19d72e1"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28057e985dace2f478e042eaa15606c7efccb700797660629da387eb289b9323"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca244fa73f50a800cf8c3ebf7fd93149ec37f5cb9596aa8873ae2c1d23498601"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d9d971ec1e79906046aa3ca266de79eac42f1dbf3612a05dc9368125952bd1a1"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7e007132af78ea9df29495dbf7b5824cb71648d7133cf7848a2a5dd00d36f9ff"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7313ce6a199651c4ed9d7e4cfb4aa56fe923b1adf9af3b420ee14e6d9a73df65"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-win32.whl", hash = "sha256:c4a549890a45f57f1ebf99c067a4ad0cb423a05544accaf2b065246827ed9603"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:835fb5e38fd89328e9c81067fd642b3593c33e1e17e2fdbf77f5676abb14a156"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2ec4f2d48ae59bbb9d1f9d7efb9236ab81429a764dedca114f5fdabbc3788013"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:608e7073dfa9e38a85d38474c082d4281f4ce276ac0010224eaba11e929dd53a"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65608c35bfb8a76763f37036547f7adfd09270fbdbf96608be2bead319728fcd"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2bfb563d0211ce16b63c7cb9395d2c682a23187f54c3d79bfec33e6705473c6"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da25303d91526aac3672ee6d49a2f3db2d9502a4a60b55519feb1a4c7714e07d"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:9cad97ab29dfc3f0249b483412c85c8ef4766d96cdf9dcf5a1e3caa3f3661cf1"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:085fd3201e7b12809f9e6e9bc1e5c96a368c8523fad5afb02afe3c051ae4afcc"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1bea30e9bf331f3fef67e0a3877b2288593c98a21ccb2cf29b74c581a4eb3af0"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-win32.whl", hash = "sha256:7df70907e00c970c60b9ef2938d894a9381f38e6b9db73c5be35e59d92e06625"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:e55e40ff0cc8cc5c07996915ad367fa47da6b3fc091fdadca7f5403239c5fec3"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a6e40afa7f45939ca356f348c8e23048e02cb109ced1eb8420961b2f40fb373a"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf877ab4ed6e302ec1d04952ca358b381a882fbd9d1b07cccbfd61783561f98a"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63ba06c9941e46fa389d389644e2d8225e0e3e5ebcc4ff1ea8506dce646f8c8a"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f1cd098434e83e656abf198f103a8207a8187c0fc110306691a2e94a78d0abb2"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:55f44b440d491028addb3b88f72207d71eeebfb7b5dbf0643f7c023ae1fba619"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a6f2fcca746e8d5910e18782f976489939d54a91f9411c32051b4aab2bd7c513"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0b462104ba25f1ac006fdab8b6a01ebbfbce9ed37fd37fd4acd70c67c973e460"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-win32.whl", hash = "sha256:7668b52e102d0ed87cb082380a7e2e1e78737ddecdde129acadb0eccc5423859"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6d6607f98fcf17e534162f0709aaad3ab7a96032723d8ac8750ffe17ae5a0666"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a806db027852538d2ad7555b203300173dd1b77ba116de92da9afbc3a3be3eed"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a4abaec6ca3ad8660690236d11bfe28dfd707778e2442b45addd2f086d6ef094"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f03a532d7dee1bed20bc4884194a16160a2de9ffc6354b3878ec9682bb623c54"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cf06cdc1dda95223e9d2d3c58d3b178aa5dacb35ee7e3bbac10e4e1faacb419"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22731d79ed2eb25059ae3df1dfc9cb1546691cc41f4e3130fe6bfbc3ecbbecfa"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f8ffb705ffcf5ddd0e80b65ddf7bed7ee4f5a441ea7d3419e861a12eaf41af58"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8db032bf0ce9022a8e41a22598eefc802314e81b879ae093f36ce9ddf39ab1ba"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2298c859cfc5463f1b64bd55cb3e602528db6fa0f3cfd568d3605c50678f8f03"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-win32.whl", hash = "sha256:50c42830a633fa0cf9e7d27664637532791bfc31c731a87b202d2d8ac40c3ea2"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:bb06feb762bade6bf3c8b844462274db0c76acc95c52abe8dbed28ae3d44a147"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:99625a92da8229df6d44335e6fcc558a5037dd0a760e11d84be2260e6f37002f"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8bca7e26c1dd751236cfb0c6c72d4ad61d986e9a41bbf76cb445f69488b2a2bd"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40627dcf047dadb22cd25ea7ecfe9cbf3bbbad0482ee5920b582f3809c97654f"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40dfd3fefbef579ee058f139733ac336312663c6706d1163b82b3003fb1925c4"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:090376d812fb6ac5f171e5938e82e7f2d7adc2b629101cec0db8b267815c85e2"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2e7821bffe00aa6bd07a23913b7f4e01328c3d5cc0b40b36c0bd81d362faeb65"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c0a33bc9f02c2b17c3ea382f91b4db0e6cde90b63b296422a939886a7a80de1c"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b8526c6d437855442cdd3d87eede9c425c4445ea011ca38d937db299382e6fa3"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-win32.whl", hash = "sha256:137678c63c977754abe9086a3ec011e8fd985ab90631145dfb9294ad09c102a7"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:0576fe974b40a400449768941d5d0858cc624e3249dfd1e0c33674e5c7ca7aed"}, - {file = "MarkupSafe-2.1.2.tar.gz", hash = "sha256:abcabc8c2b26036d62d4c746381a6f7cf60aafcc653198ad678306986b09450d"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, + {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, ] [[package]] @@ -1857,14 +1884,14 @@ files = [ [[package]] name = "mlflow" -version = "2.3.1" +version = "2.4.1" description = "MLflow: A Platform for ML Development and Productionization" category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "mlflow-2.3.1-py3-none-any.whl", hash = "sha256:699c512d659c7463a498e087c5f74d3d139b5708cf6aaaccfa398d7b0c095204"}, - {file = "mlflow-2.3.1.tar.gz", hash = "sha256:63439397b2718ce5747288ef5475f46b3716b370a517be3e3c67b799a247a186"}, + {file = "mlflow-2.4.1-py3-none-any.whl", hash = "sha256:355bf5c0214f9f137f0b3d78f2f0a7f284eebbb23a027ad3e686eb1b84c1bbe9"}, + {file = "mlflow-2.4.1.tar.gz", hash = "sha256:6598f78f7ece59a9480573af57b09708a3283ece88f196e5d172c2040cec323f"}, ] [package.dependencies] @@ -1888,7 +1915,7 @@ numpy = "<2" packaging = "<24" pandas = "<3" protobuf = ">=3.12.0,<5" -pyarrow = ">=4.0.0,<12" +pyarrow = ">=4.0.0,<13" pytz = "<2024" pyyaml = ">=5.1,<7" querystring-parser = "<2" @@ -1903,17 +1930,19 @@ waitress = {version = "<3", markers = "platform_system == \"Windows\""} aliyun-oss = ["aliyunstoreplugin"] databricks = ["azure-storage-file-datalake (>12)", "boto3 (>1)", "google-cloud-storage (>=1.30.0)"] extras = ["azureml-core (>=1.2.0)", "boto3", "google-cloud-storage (>=1.30.0)", "kubernetes", "mlserver (>=1.2.0,!=1.3.1)", "mlserver-mlflow (>=1.2.0,!=1.3.1)", "prometheus-flask-exporter", "pyarrow", "pysftp", "requests-auth-aws-sigv4", "virtualenv"] +gateway = ["fastapi (<1)", "pydantic (>=1.0,<3)", "uvicorn (<1)"] sqlserver = ["mlflow-dbstore"] [[package]] name = "mlflow-skinny" -version = "2.3.1" +version = "2.4.1" description = "MLflow: A Platform for ML Development and Productionization" category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "mlflow_skinny-2.3.1-py3-none-any.whl", hash = "sha256:33ba9668ff027af8ef865ecaf9f4984e113d46e2a9bcd93b38b326c237e5b13c"}, + {file = "mlflow-skinny-2.4.1.tar.gz", hash = "sha256:ec5c8459a4bb1d0c619490dff0a3dce4949590a4bf76c77e0cb218143c33c29a"}, + {file = "mlflow_skinny-2.4.1-py3-none-any.whl", hash = "sha256:b3226bbfdc5adcb7dcc2835c6956269641a07c9c2085d9f8f026bd577bd9660c"}, ] [package.dependencies] @@ -1934,6 +1963,7 @@ sqlparse = ">=0.4.0,<1" aliyun-oss = ["aliyunstoreplugin"] databricks = ["azure-storage-file-datalake (>12)", "boto3 (>1)", "google-cloud-storage (>=1.30.0)"] extras = ["azureml-core (>=1.2.0)", "boto3", "google-cloud-storage (>=1.30.0)", "kubernetes", "mlserver (>=1.2.0,!=1.3.1)", "mlserver-mlflow (>=1.2.0,!=1.3.1)", "prometheus-flask-exporter", "pyarrow", "pysftp", "requests-auth-aws-sigv4", "virtualenv"] +gateway = ["fastapi (<1)", "pydantic (>=1.0,<3)", "uvicorn (<1)"] sqlserver = ["mlflow-dbstore"] [[package]] @@ -2552,14 +2582,14 @@ tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "pa [[package]] name = "pluggy" -version = "1.0.0" +version = "1.2.0" description = "plugin and hook calling mechanisms for python" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, - {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, + {file = "pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849"}, + {file = "pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3"}, ] [package.extras] @@ -2588,60 +2618,60 @@ tests = ["pytest (>=5.4.1)", "pytest-cov (>=2.8.1)", "pytest-mypy (>=0.8.0)", "p [[package]] name = "protobuf" -version = "4.22.3" +version = "4.23.3" description = "" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "protobuf-4.22.3-cp310-abi3-win32.whl", hash = "sha256:8b54f56d13ae4a3ec140076c9d937221f887c8f64954673d46f63751209e839a"}, - {file = "protobuf-4.22.3-cp310-abi3-win_amd64.whl", hash = "sha256:7760730063329d42a9d4c4573b804289b738d4931e363ffbe684716b796bde51"}, - {file = "protobuf-4.22.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:d14fc1a41d1a1909998e8aff7e80d2a7ae14772c4a70e4bf7db8a36690b54425"}, - {file = "protobuf-4.22.3-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:70659847ee57a5262a65954538088a1d72dfc3e9882695cab9f0c54ffe71663b"}, - {file = "protobuf-4.22.3-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:13233ee2b9d3bd9a5f216c1fa2c321cd564b93d8f2e4f521a85b585447747997"}, - {file = "protobuf-4.22.3-cp37-cp37m-win32.whl", hash = "sha256:ecae944c6c2ce50dda6bf76ef5496196aeb1b85acb95df5843cd812615ec4b61"}, - {file = "protobuf-4.22.3-cp37-cp37m-win_amd64.whl", hash = "sha256:d4b66266965598ff4c291416be429cef7989d8fae88b55b62095a2331511b3fa"}, - {file = "protobuf-4.22.3-cp38-cp38-win32.whl", hash = "sha256:f08aa300b67f1c012100d8eb62d47129e53d1150f4469fd78a29fa3cb68c66f2"}, - {file = "protobuf-4.22.3-cp38-cp38-win_amd64.whl", hash = "sha256:f2f4710543abec186aee332d6852ef5ae7ce2e9e807a3da570f36de5a732d88e"}, - {file = "protobuf-4.22.3-cp39-cp39-win32.whl", hash = "sha256:7cf56e31907c532e460bb62010a513408e6cdf5b03fb2611e4b67ed398ad046d"}, - {file = "protobuf-4.22.3-cp39-cp39-win_amd64.whl", hash = "sha256:e0e630d8e6a79f48c557cd1835865b593d0547dce221c66ed1b827de59c66c97"}, - {file = "protobuf-4.22.3-py3-none-any.whl", hash = "sha256:52f0a78141078077cfe15fe333ac3e3a077420b9a3f5d1bf9b5fe9d286b4d881"}, - {file = "protobuf-4.22.3.tar.gz", hash = "sha256:23452f2fdea754a8251d0fc88c0317735ae47217e0d27bf330a30eec2848811a"}, + {file = "protobuf-4.23.3-cp310-abi3-win32.whl", hash = "sha256:514b6bbd54a41ca50c86dd5ad6488afe9505901b3557c5e0f7823a0cf67106fb"}, + {file = "protobuf-4.23.3-cp310-abi3-win_amd64.whl", hash = "sha256:cc14358a8742c4e06b1bfe4be1afbdf5c9f6bd094dff3e14edb78a1513893ff5"}, + {file = "protobuf-4.23.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:2991f5e7690dab569f8f81702e6700e7364cc3b5e572725098215d3da5ccc6ac"}, + {file = "protobuf-4.23.3-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:08fe19d267608d438aa37019236db02b306e33f6b9902c3163838b8e75970223"}, + {file = "protobuf-4.23.3-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:3b01a5274ac920feb75d0b372d901524f7e3ad39c63b1a2d55043f3887afe0c1"}, + {file = "protobuf-4.23.3-cp37-cp37m-win32.whl", hash = "sha256:aca6e86a08c5c5962f55eac9b5bd6fce6ed98645d77e8bfc2b952ecd4a8e4f6a"}, + {file = "protobuf-4.23.3-cp37-cp37m-win_amd64.whl", hash = "sha256:0149053336a466e3e0b040e54d0b615fc71de86da66791c592cc3c8d18150bf8"}, + {file = "protobuf-4.23.3-cp38-cp38-win32.whl", hash = "sha256:84ea0bd90c2fdd70ddd9f3d3fc0197cc24ecec1345856c2b5ba70e4d99815359"}, + {file = "protobuf-4.23.3-cp38-cp38-win_amd64.whl", hash = "sha256:3bcbeb2bf4bb61fe960dd6e005801a23a43578200ea8ceb726d1f6bd0e562ba1"}, + {file = "protobuf-4.23.3-cp39-cp39-win32.whl", hash = "sha256:5cb9e41188737f321f4fce9a4337bf40a5414b8d03227e1d9fbc59bc3a216e35"}, + {file = "protobuf-4.23.3-cp39-cp39-win_amd64.whl", hash = "sha256:29660574cd769f2324a57fb78127cda59327eb6664381ecfe1c69731b83e8288"}, + {file = "protobuf-4.23.3-py3-none-any.whl", hash = "sha256:447b9786ac8e50ae72cae7a2eec5c5df6a9dbf9aa6f908f1b8bda6032644ea62"}, + {file = "protobuf-4.23.3.tar.gz", hash = "sha256:7a92beb30600332a52cdadbedb40d33fd7c8a0d7f549c440347bc606fb3fe34b"}, ] [[package]] name = "pyarrow" -version = "11.0.0" +version = "12.0.1" description = "Python library for Apache Arrow" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "pyarrow-11.0.0-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:40bb42afa1053c35c749befbe72f6429b7b5f45710e85059cdd534553ebcf4f2"}, - {file = "pyarrow-11.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7c28b5f248e08dea3b3e0c828b91945f431f4202f1a9fe84d1012a761324e1ba"}, - {file = "pyarrow-11.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a37bc81f6c9435da3c9c1e767324ac3064ffbe110c4e460660c43e144be4ed85"}, - {file = "pyarrow-11.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad7c53def8dbbc810282ad308cc46a523ec81e653e60a91c609c2233ae407689"}, - {file = "pyarrow-11.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:25aa11c443b934078bfd60ed63e4e2d42461682b5ac10f67275ea21e60e6042c"}, - {file = "pyarrow-11.0.0-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:e217d001e6389b20a6759392a5ec49d670757af80101ee6b5f2c8ff0172e02ca"}, - {file = "pyarrow-11.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ad42bb24fc44c48f74f0d8c72a9af16ba9a01a2ccda5739a517aa860fa7e3d56"}, - {file = "pyarrow-11.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d942c690ff24a08b07cb3df818f542a90e4d359381fbff71b8f2aea5bf58841"}, - {file = "pyarrow-11.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f010ce497ca1b0f17a8243df3048055c0d18dcadbcc70895d5baf8921f753de5"}, - {file = "pyarrow-11.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:2f51dc7ca940fdf17893227edb46b6784d37522ce08d21afc56466898cb213b2"}, - {file = "pyarrow-11.0.0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:1cbcfcbb0e74b4d94f0b7dde447b835a01bc1d16510edb8bb7d6224b9bf5bafc"}, - {file = "pyarrow-11.0.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaee8f79d2a120bf3e032d6d64ad20b3af6f56241b0ffc38d201aebfee879d00"}, - {file = "pyarrow-11.0.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:410624da0708c37e6a27eba321a72f29d277091c8f8d23f72c92bada4092eb5e"}, - {file = "pyarrow-11.0.0-cp37-cp37m-win_amd64.whl", hash = "sha256:2d53ba72917fdb71e3584ffc23ee4fcc487218f8ff29dd6df3a34c5c48fe8c06"}, - {file = "pyarrow-11.0.0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:f12932e5a6feb5c58192209af1d2607d488cb1d404fbc038ac12ada60327fa34"}, - {file = "pyarrow-11.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:41a1451dd895c0b2964b83d91019e46f15b5564c7ecd5dcb812dadd3f05acc97"}, - {file = "pyarrow-11.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:becc2344be80e5dce4e1b80b7c650d2fc2061b9eb339045035a1baa34d5b8f1c"}, - {file = "pyarrow-11.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f40be0d7381112a398b93c45a7e69f60261e7b0269cc324e9f739ce272f4f70"}, - {file = "pyarrow-11.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:362a7c881b32dc6b0eccf83411a97acba2774c10edcec715ccaab5ebf3bb0835"}, - {file = "pyarrow-11.0.0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:ccbf29a0dadfcdd97632b4f7cca20a966bb552853ba254e874c66934931b9841"}, - {file = "pyarrow-11.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3e99be85973592051e46412accea31828da324531a060bd4585046a74ba45854"}, - {file = "pyarrow-11.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69309be84dcc36422574d19c7d3a30a7ea43804f12552356d1ab2a82a713c418"}, - {file = "pyarrow-11.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da93340fbf6f4e2a62815064383605b7ffa3e9eeb320ec839995b1660d69f89b"}, - {file = "pyarrow-11.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:caad867121f182d0d3e1a0d36f197df604655d0b466f1bc9bafa903aa95083e4"}, - {file = "pyarrow-11.0.0.tar.gz", hash = "sha256:5461c57dbdb211a632a48facb9b39bbeb8a7905ec95d768078525283caef5f6d"}, + {file = "pyarrow-12.0.1-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:6d288029a94a9bb5407ceebdd7110ba398a00412c5b0155ee9813a40d246c5df"}, + {file = "pyarrow-12.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:345e1828efdbd9aa4d4de7d5676778aba384a2c3add896d995b23d368e60e5af"}, + {file = "pyarrow-12.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d6009fdf8986332b2169314da482baed47ac053311c8934ac6651e614deacd6"}, + {file = "pyarrow-12.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d3c4cbbf81e6dd23fe921bc91dc4619ea3b79bc58ef10bce0f49bdafb103daf"}, + {file = "pyarrow-12.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:cdacf515ec276709ac8042c7d9bd5be83b4f5f39c6c037a17a60d7ebfd92c890"}, + {file = "pyarrow-12.0.1-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:749be7fd2ff260683f9cc739cb862fb11be376de965a2a8ccbf2693b098db6c7"}, + {file = "pyarrow-12.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6895b5fb74289d055c43db3af0de6e16b07586c45763cb5e558d38b86a91e3a7"}, + {file = "pyarrow-12.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1887bdae17ec3b4c046fcf19951e71b6a619f39fa674f9881216173566c8f718"}, + {file = "pyarrow-12.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2c9cb8eeabbadf5fcfc3d1ddea616c7ce893db2ce4dcef0ac13b099ad7ca082"}, + {file = "pyarrow-12.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:ce4aebdf412bd0eeb800d8e47db854f9f9f7e2f5a0220440acf219ddfddd4f63"}, + {file = "pyarrow-12.0.1-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:e0d8730c7f6e893f6db5d5b86eda42c0a130842d101992b581e2138e4d5663d3"}, + {file = "pyarrow-12.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:43364daec02f69fec89d2315f7fbfbeec956e0d991cbbef471681bd77875c40f"}, + {file = "pyarrow-12.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:051f9f5ccf585f12d7de836e50965b3c235542cc896959320d9776ab93f3b33d"}, + {file = "pyarrow-12.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:be2757e9275875d2a9c6e6052ac7957fbbfc7bc7370e4a036a9b893e96fedaba"}, + {file = "pyarrow-12.0.1-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:cf812306d66f40f69e684300f7af5111c11f6e0d89d6b733e05a3de44961529d"}, + {file = "pyarrow-12.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:459a1c0ed2d68671188b2118c63bac91eaef6fc150c77ddd8a583e3c795737bf"}, + {file = "pyarrow-12.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85e705e33eaf666bbe508a16fd5ba27ca061e177916b7a317ba5a51bee43384c"}, + {file = "pyarrow-12.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9120c3eb2b1f6f516a3b7a9714ed860882d9ef98c4b17edcdc91d95b7528db60"}, + {file = "pyarrow-12.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:c780f4dc40460015d80fcd6a6140de80b615349ed68ef9adb653fe351778c9b3"}, + {file = "pyarrow-12.0.1-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:a3c63124fc26bf5f95f508f5d04e1ece8cc23a8b0af2a1e6ab2b1ec3fdc91b24"}, + {file = "pyarrow-12.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b13329f79fa4472324f8d32dc1b1216616d09bd1e77cfb13104dec5463632c36"}, + {file = "pyarrow-12.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb656150d3d12ec1396f6dde542db1675a95c0cc8366d507347b0beed96e87ca"}, + {file = "pyarrow-12.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6251e38470da97a5b2e00de5c6a049149f7b2bd62f12fa5dbb9ac674119ba71a"}, + {file = "pyarrow-12.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:3de26da901216149ce086920547dfff5cd22818c9eab67ebc41e863a5883bac7"}, + {file = "pyarrow-12.0.1.tar.gz", hash = "sha256:cce317fc96e5b71107bf1f9f184d5e54e2bd14bbf3f9a3d62819961f0af86fec"}, ] [package.dependencies] @@ -2703,14 +2733,14 @@ plugins = ["importlib-metadata"] [[package]] name = "pyjwt" -version = "2.6.0" +version = "2.7.0" description = "JSON Web Token implementation in Python" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "PyJWT-2.6.0-py3-none-any.whl", hash = "sha256:d83c3d892a77bbb74d3e1a2cfa90afaadb60945205d1095d9221f04466f64c14"}, - {file = "PyJWT-2.6.0.tar.gz", hash = "sha256:69285c7e31fc44f68a1feb309e948e0df53259d579295e6cfe2b1792329f05fd"}, + {file = "PyJWT-2.7.0-py3-none-any.whl", hash = "sha256:ba2b425b15ad5ef12f200dc67dd56af4e26de2331f965c5439994dad075876e1"}, + {file = "PyJWT-2.7.0.tar.gz", hash = "sha256:bd6ca4a3c4285c1a2d4349e5a035fdf8fb94e04ccd0fcbe6ba289dae9cc3e074"}, ] [package.dependencies] @@ -2724,14 +2754,14 @@ tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] [[package]] name = "pyparsing" -version = "3.0.9" +version = "3.1.0" description = "pyparsing module - Classes and methods to define and execute parsing grammars" category = "main" optional = false python-versions = ">=3.6.8" files = [ - {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, - {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, + {file = "pyparsing-3.1.0-py3-none-any.whl", hash = "sha256:d554a96d1a7d3ddaf7183104485bc19fd80543ad6ac5bdb6426719d766fb06c1"}, + {file = "pyparsing-3.1.0.tar.gz", hash = "sha256:edb662d6fe322d6e990b1594b5feaeadf806803359e3d4d42f11e295e588f0ea"}, ] [package.extras] @@ -2739,14 +2769,14 @@ diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pytest" -version = "7.3.1" +version = "7.4.0" description = "pytest: simple powerful testing with Python" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "pytest-7.3.1-py3-none-any.whl", hash = "sha256:3799fa815351fea3a5e96ac7e503a96fa51cc9942c3753cda7651b93c1cfa362"}, - {file = "pytest-7.3.1.tar.gz", hash = "sha256:434afafd78b1d78ed0addf160ad2b77a30d35d4bdf8af234fe621919d9ed15e3"}, + {file = "pytest-7.4.0-py3-none-any.whl", hash = "sha256:78bf16451a2eb8c7a2ea98e32dc119fd2aa758f1d5d66dbf0a59d69a3969df32"}, + {file = "pytest-7.4.0.tar.gz", hash = "sha256:b4bf8c45bd59934ed84001ad51e11b4ee40d40a1229d2c79f9c592b0a3f6bd8a"}, ] [package.dependencies] @@ -2758,7 +2788,7 @@ pluggy = ">=0.12,<2.0" tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} [package.extras] -testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] [[package]] name = "pytest-cov" @@ -2939,21 +2969,21 @@ six = "*" [[package]] name = "requests" -version = "2.29.0" +version = "2.31.0" description = "Python HTTP for Humans." category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "requests-2.29.0-py3-none-any.whl", hash = "sha256:e8f3c9be120d3333921d213eef078af392fba3933ab7ed2d1cba3b56f2568c3b"}, - {file = "requests-2.29.0.tar.gz", hash = "sha256:f2e34a75f4749019bb0e3effb66683630e4ffeaf75819fb51bebef1bf5aef059"}, + {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,<1.27" +urllib3 = ">=1.21.1,<3" [package.extras] socks = ["PySocks (>=1.5.6,!=1.5.7)"] @@ -2980,18 +3010,18 @@ rsa = ["oauthlib[signedtoken] (>=3.0.0)"] [[package]] name = "rich" -version = "13.3.5" +version = "13.4.2" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" category = "main" optional = false python-versions = ">=3.7.0" files = [ - {file = "rich-13.3.5-py3-none-any.whl", hash = "sha256:69cdf53799e63f38b95b9bf9c875f8c90e78dd62b2f00c13a911c7a3b9fa4704"}, - {file = "rich-13.3.5.tar.gz", hash = "sha256:2d11b9b8dd03868f09b4fffadc84a6a8cda574e40dc90821bd845720ebb8e89c"}, + {file = "rich-13.4.2-py3-none-any.whl", hash = "sha256:8f87bc7ee54675732fa66a05ebfe489e27264caeeff3728c945d25971b6485ec"}, + {file = "rich-13.4.2.tar.gz", hash = "sha256:d653d6bccede5844304c605d5aac802c7cf9621efd700b46c7ec2b51ea914898"}, ] [package.dependencies] -markdown-it-py = ">=2.2.0,<3.0.0" +markdown-it-py = ">=2.2.0" pygments = ">=2.13.0,<3.0.0" [package.extras] @@ -3057,58 +3087,56 @@ tests = ["black (>=22.3.0)", "flake8 (>=3.8.2)", "matplotlib (>=3.1.3)", "mypy ( [[package]] name = "scipy" -version = "1.10.1" +version = "1.11.0" description = "Fundamental algorithms for scientific computing in Python" category = "main" optional = false -python-versions = "<3.12,>=3.8" +python-versions = "<3.13,>=3.9" 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"}, + {file = "scipy-1.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2e4f14c11fbf825319dbd7f467639a241e7c956c34edb1e036ec7bb6271e4f7b"}, + {file = "scipy-1.11.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:b269ed44e2e2e43611f2ae95ba551fd98abbdc1a7ea8268f72f75876982368c4"}, + {file = "scipy-1.11.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c29bae479b17d85208dfdfc67e50d5944ee23211f236728aadde9b0b7c1c33e"}, + {file = "scipy-1.11.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a53f9cebcfda6158c241c35a559407a4ef6b8cb0863eb4144958fe0a0b7c3dae"}, + {file = "scipy-1.11.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ebf4b2ea26d50312731ddba2406389c5ddcbff9d777cf3277ea11decc81e5dfb"}, + {file = "scipy-1.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:894ced9a2cdb050ff5e392f274617af46dca896d5c9112fa4a2019929554d321"}, + {file = "scipy-1.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7a92bd3cd4acad2e0e0b360176d5ec68b100983c8145add8a8233acddf4e5fcc"}, + {file = "scipy-1.11.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:586608ea35206257d4e0ce6f154a6cfef71723b2c1f6d40de5e0b0e8a81cd2ff"}, + {file = "scipy-1.11.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e631c3c49c24f30828580b8126fe3be5cca5409dad5b797418a5b8965eeafa"}, + {file = "scipy-1.11.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ccc70892ea674f93183c5c4139557b611e42f644dd755da4b19ca974ab770672"}, + {file = "scipy-1.11.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80015b8928f91bd40377b2b1010ba2e09b03680cbfc291208740494aeb8debf2"}, + {file = "scipy-1.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:6302c7cba5bf99c901653ff158746625526cc438f058bce41514d7469b79b2c3"}, + {file = "scipy-1.11.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c61ea63124da6a3cff38126426912cc86420898b4902a9bc5e5b6524547a6dcb"}, + {file = "scipy-1.11.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:684d44607eacd5dd367c7a9e76e922523fa9c0a7f2379a4d0fc4d70d751464cc"}, + {file = "scipy-1.11.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0c9c160d117fe71cd2a12ef21cce8e0475ade2fd97c761ef327b9839089bd16"}, + {file = "scipy-1.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83867a63515c4e3fce3272d81200dda614d70f4c3a22f047d84021bfe83d7929"}, + {file = "scipy-1.11.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6666a1e31b2123a077f0dc7ab1053e36479cfd457fb9f5c367e7198505c6607a"}, + {file = "scipy-1.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:fad4006248513528e0c496de295a9f4d2b65086cc0e388f748e7dbf49fa12760"}, + {file = "scipy-1.11.0.tar.gz", hash = "sha256:f9b0248cb9d08eead44cde47cbf6339f1e9aa0dfde28f5fb27950743e317bd5d"}, ] [package.dependencies] -numpy = ">=1.19.5,<1.27.0" +numpy = ">=1.21.6,<1.28.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)"] +dev = ["click", "cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy", "pycodestyle", "pydevtool", "rich-click", "ruff", "types-psutil", "typing_extensions"] +doc = ["jupytext", "matplotlib (>2)", "myst-nb", "numpydoc", "pooch", "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 = "67.7.2" +version = "68.0.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "setuptools-67.7.2-py3-none-any.whl", hash = "sha256:23aaf86b85ca52ceb801d32703f12d77517b2556af839621c641fca11287952b"}, - {file = "setuptools-67.7.2.tar.gz", hash = "sha256:f104fa03692a2602fa0fec6c6a9e63b6c8a968de13e17c026957dd1f53d80990"}, + {file = "setuptools-68.0.0-py3-none-any.whl", hash = "sha256:11e52c67415a381d10d6b462ced9cfb97066179f0e871399e006c4ab101fc85f"}, + {file = "setuptools-68.0.0.tar.gz", hash = "sha256:baf1fdb41c6da4cd2eae722e135500da913332ab3f2f5c7d33af9b492acb5235"}, ] [package.extras] docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "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]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] [[package]] @@ -3137,53 +3165,53 @@ files = [ [[package]] name = "sqlalchemy" -version = "2.0.11" +version = "2.0.17" description = "Database Abstraction Library" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "SQLAlchemy-2.0.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e9069faea64d3390d90d16e5b2bc0652d8eb979ccdfd555822d96bc8d93afda1"}, - {file = "SQLAlchemy-2.0.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8aea55b1754430449d43823c8c4da2d5c7621ccd1fcd4c36231417762542d4ef"}, - {file = "SQLAlchemy-2.0.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ccd20b5a4e3511c2f0c889b7b79a7462b6c6aa2c06d0f4943c27a552e35e091"}, - {file = "SQLAlchemy-2.0.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1dcfea87230e34d7d55f67959ed09d3e60e09b77c76996de151c32f1b780135"}, - {file = "SQLAlchemy-2.0.11-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a836f391d7dc1039f10d2ef58cdc6e271462d6898dacdae1bfabfc16ca295f2c"}, - {file = "SQLAlchemy-2.0.11-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:25bbf89e6f171d37cf3a993dbeee18cb85abe37a421c40e78131bf339e48da9d"}, - {file = "SQLAlchemy-2.0.11-cp310-cp310-win32.whl", hash = "sha256:0624852aec618438a4cd7a53ce00835435588506e6f8fbd60deaf9ac109f7cd0"}, - {file = "SQLAlchemy-2.0.11-cp310-cp310-win_amd64.whl", hash = "sha256:d7eab7d668f95a1a2ef443da17154834adf9c5ac742a5992d5ebecbdca7d943e"}, - {file = "SQLAlchemy-2.0.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aa81761ff674d2e2d591fc88d31835d3ecf65bddb021a522f4eaaae831c584cf"}, - {file = "SQLAlchemy-2.0.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:21f447403a1bfeb832a7384c4ac742b7baab04460632c0335e020e8e2c741d4b"}, - {file = "SQLAlchemy-2.0.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4d8d96c0a7265de8496250a2c2d02593da5e5e85ea24b5c54c2db028d74cf8c"}, - {file = "SQLAlchemy-2.0.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c4c5834789f718315cb25d1b95d18fde91b72a1a158cdc515d7f6380c1f02a3"}, - {file = "SQLAlchemy-2.0.11-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f57965a9d5882efdea0a2c87ae2f6c7dbc14591dcd0639209b50eec2b3ec947e"}, - {file = "SQLAlchemy-2.0.11-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0dd98b0be54503afc4c74e947720c3196f96fb2546bfa54d911d5de313c5463c"}, - {file = "SQLAlchemy-2.0.11-cp311-cp311-win32.whl", hash = "sha256:eec40c522781a58839df6a2a7a2d9fbaa473419a3ab94633d61e00a8c0c768b7"}, - {file = "SQLAlchemy-2.0.11-cp311-cp311-win_amd64.whl", hash = "sha256:62835d8cd6713458c032466c38a43e56503e19ea6e54b0e73295c6ab281fc0b1"}, - {file = "SQLAlchemy-2.0.11-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:216b9c4dbeaa143a36c9249f9e5a0fd7fa6549a1a3f9de9a2d30104f7e35d8b9"}, - {file = "SQLAlchemy-2.0.11-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aae7710fd24bcf33abed7ab7673dbb38ad48f20555835ff8c77258f07de46a87"}, - {file = "SQLAlchemy-2.0.11-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:718c0a9f8509542d0674c15b01f362b2f10e8bc425db74444bda4e073e06e660"}, - {file = "SQLAlchemy-2.0.11-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:2a5fb41db86f6d4892edcf30bd67418dd757eb0246242648e610fa2bca7533d4"}, - {file = "SQLAlchemy-2.0.11-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:352dcd93e5a0421eee59dbac0000f8f811203cf228334d85d77b3ef075707322"}, - {file = "SQLAlchemy-2.0.11-cp37-cp37m-win32.whl", hash = "sha256:fb21777cc9205b94f51688cdcba0924bdecbeb23dcf81473ff8c5352211e6e38"}, - {file = "SQLAlchemy-2.0.11-cp37-cp37m-win_amd64.whl", hash = "sha256:2f9268d7417467e9fde5f4364c71ce490b18a4b83a6543b0d55d1f83fce42bda"}, - {file = "SQLAlchemy-2.0.11-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:125c41b3557179e9a514a1cfe2764433177ba6195b2264725ceaa7a2e8afcbde"}, - {file = "SQLAlchemy-2.0.11-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e19a03413cf36e86674857e519936b9c9e52059ba9f6e2ab0ec75d9a458277cb"}, - {file = "SQLAlchemy-2.0.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e48d908695abe05435250e0a083416cc49bd5afd46bc16a7ec8725771aad8eac"}, - {file = "SQLAlchemy-2.0.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3728f7518aa70e5ce88fae4c68b5d7f25493f37d8d867e4a7d60905bd162cd0d"}, - {file = "SQLAlchemy-2.0.11-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1ab6ac214354957db83c72c65941af7e022d4c9324bdadc54d0266aa162a3828"}, - {file = "SQLAlchemy-2.0.11-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:abadc6bf6b2c0a0be4370513221563afdbac3901d29fcdb7faf23b4e1ed26068"}, - {file = "SQLAlchemy-2.0.11-cp38-cp38-win32.whl", hash = "sha256:78cbc8eba442c9b8dc2d90c43ac477f0ee27467617704cd82d741b2eb061afb2"}, - {file = "SQLAlchemy-2.0.11-cp38-cp38-win_amd64.whl", hash = "sha256:384fdde6bd628d1a882f04aa9a40aa6928840b02d595ff5bd08abeae4c25f867"}, - {file = "SQLAlchemy-2.0.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:737a70c994f5b34e437a6ca754957a7a0f6f76c59fa460fc59d1bd15b8f8cb32"}, - {file = "SQLAlchemy-2.0.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0e53e4920cd5872280256ddf6ca843b5d1435e0302847992bcb90f84b744999f"}, - {file = "SQLAlchemy-2.0.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:409cc6cd15d4db5c5af2c4e2d3a2137815c31d065cea9a77dec92cbe7cfcf448"}, - {file = "SQLAlchemy-2.0.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a71dd742e3146be6fdded0b95a4b779f7d81595760eab32b0f718089573d3b86"}, - {file = "SQLAlchemy-2.0.11-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d85ca17b070f7076ec2582324331cf3683c09146fd8bd2621e8d80d6c3a93bbf"}, - {file = "SQLAlchemy-2.0.11-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a785c30929a5d82f2fa1c60ec46d623d418b19981dc0c594da806d3901658e39"}, - {file = "SQLAlchemy-2.0.11-cp39-cp39-win32.whl", hash = "sha256:66f24708cebe5a4e900e221574b50e102908f60f539fea30f1922705c0e97744"}, - {file = "SQLAlchemy-2.0.11-cp39-cp39-win_amd64.whl", hash = "sha256:5a2f95901e6bbed27b4ad5d59ab3f970eda0ce0b9ede3a67b6f9a914149ed71b"}, - {file = "SQLAlchemy-2.0.11-py3-none-any.whl", hash = "sha256:1d28e8278d943d9111d44720f92cc338282e956ed68849bfcee053c06bde4f39"}, - {file = "SQLAlchemy-2.0.11.tar.gz", hash = "sha256:c3cbff7cced3c42dbe71448ce6bf4202b4a2d305e78dd77e3f280ba6cd245138"}, + {file = "SQLAlchemy-2.0.17-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:04383f1e3452f6739084184e427e9d5cb4e68ddc765d52157bf5ef30d5eca14f"}, + {file = "SQLAlchemy-2.0.17-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:724355973297bbe547f3eb98b46ade65a67a3d5a6303f17ab59a2dc6fb938943"}, + {file = "SQLAlchemy-2.0.17-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf07ff9920cb3ca9d73525dfd4f36ddf9e1a83734ea8b4f724edfd9a2c6e82d9"}, + {file = "SQLAlchemy-2.0.17-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2f389f77c68dc22cb51f026619291c4a38aeb4b7ecb5f998fd145b2d81ca513"}, + {file = "SQLAlchemy-2.0.17-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ba03518e64d86f000dc24ab3d3a1aa876bcbaa8aa15662ac2df5e81537fa3394"}, + {file = "SQLAlchemy-2.0.17-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:218fb20c01e95004f50a3062bf4c447dcb360cab8274232f31947e254f118298"}, + {file = "SQLAlchemy-2.0.17-cp310-cp310-win32.whl", hash = "sha256:b47be4c6281a86670ea5cfbbbe6c3a65366a8742f5bc8b986f790533c60b5ddb"}, + {file = "SQLAlchemy-2.0.17-cp310-cp310-win_amd64.whl", hash = "sha256:74ddcafb6488f382854a7da851c404c394be3729bb3d91b02ad86c5458140eff"}, + {file = "SQLAlchemy-2.0.17-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:51736cfb607cf4e8fafb693906f9bc4e5ee55be0b096d44bd7f20cd8489b8571"}, + {file = "SQLAlchemy-2.0.17-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8741d3d401383e54b2aada37cbd10f55c5d444b360eae3a82f74a2be568a7710"}, + {file = "SQLAlchemy-2.0.17-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ead58cae2a089eee1b0569060999cb5f2b2462109498a0937cc230a7556945a1"}, + {file = "SQLAlchemy-2.0.17-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f40e3a7d0a464f1c8593f2991e5520b2f5b26da24e88000bbd4423f86103d4f"}, + {file = "SQLAlchemy-2.0.17-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:21583808d37f126a647652c90332ac1d3a102edf3c94bcc3319edcc0ea2300cc"}, + {file = "SQLAlchemy-2.0.17-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f593170fc09c5abb1205a738290b39532f7380094dc151805009a07ae0e85330"}, + {file = "SQLAlchemy-2.0.17-cp311-cp311-win32.whl", hash = "sha256:b0eaf82cc844f6b46defe15ad243ea00d1e39ed3859df61130c263dc7204da6e"}, + {file = "SQLAlchemy-2.0.17-cp311-cp311-win_amd64.whl", hash = "sha256:1822620c89779b85f7c23d535c8e04b79c517739ae07aaed48c81e591ed5498e"}, + {file = "SQLAlchemy-2.0.17-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2269b1f9b8be47e52b70936069a25a3771eff53367aa5cc59bb94f28a6412e13"}, + {file = "SQLAlchemy-2.0.17-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48111d56afea5699bab72c38ec95561796b81befff9e13d1dd5ce251ab25f51d"}, + {file = "SQLAlchemy-2.0.17-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28da17059ecde53e2d10ba813d38db942b9f6344360b2958b25872d5cb729d35"}, + {file = "SQLAlchemy-2.0.17-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:48b40dc2895841ea89d89df9eb3ac69e2950a659db20a369acf4259f68e6dc1f"}, + {file = "SQLAlchemy-2.0.17-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7f31d4e7ca1dd8ca5a27fd5eaa0f9e2732fe769ff7dd35bf7bba179597e4df07"}, + {file = "SQLAlchemy-2.0.17-cp37-cp37m-win32.whl", hash = "sha256:7830e01b02d440c27f2a5be68296e74ccb55e6a5b5962ffafd360b98930b2e5e"}, + {file = "SQLAlchemy-2.0.17-cp37-cp37m-win_amd64.whl", hash = "sha256:234678ed6576531b8e4be255b980f20368bf07241a2e67b84e6b0fe679edb9c4"}, + {file = "SQLAlchemy-2.0.17-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c6ff5767d954f6091113fedcaaf49cdec2197ae4c5301fe83d5ae4393c82f33"}, + {file = "SQLAlchemy-2.0.17-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:aa995b21f853864996e4056d9fde479bcecf8b7bff4beb3555eebbbba815f35d"}, + {file = "SQLAlchemy-2.0.17-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:125f9f7e62ddf8b590c069729080ffe18b68a20d9882eb0947f72e06274601d7"}, + {file = "SQLAlchemy-2.0.17-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b114a16bc03dfe20b625062e456affd7b9938286e05a3f904a025b9aacc29dd4"}, + {file = "SQLAlchemy-2.0.17-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:cf175d26f6787cce30fe6c04303ca0aeeb0ad40eeb22e3391f24b32ec432a1e1"}, + {file = "SQLAlchemy-2.0.17-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e2d5c3596254cf1a96474b98e7ce20041c74c008b0f101c1cb4f8261cb77c6d3"}, + {file = "SQLAlchemy-2.0.17-cp38-cp38-win32.whl", hash = "sha256:513411d73503a6fc5804f01fae3b3d44f267c1b3a06cfeac02e9286a7330e857"}, + {file = "SQLAlchemy-2.0.17-cp38-cp38-win_amd64.whl", hash = "sha256:40a3dc52b2b16f08b5c16b9ee7646329e4b3411e9280e5e8d57b19eaa51cbef4"}, + {file = "SQLAlchemy-2.0.17-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e3189432db2f5753b4fde1aa90a61c69976f4e7e31d1cf4611bfe3514ed07478"}, + {file = "SQLAlchemy-2.0.17-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6150560fcffc6aee5ec9a97419ac768c7a9f56baf7a7eb59cb4b1b6a4d463ad9"}, + {file = "SQLAlchemy-2.0.17-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:910d45bf3673f0e4ef13858674bd23cfdafdc8368b45b948bf511797dbbb401d"}, + {file = "SQLAlchemy-2.0.17-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0aeb3afaa19f187a70fa592fbe3c20a056b57662691fd3abf60f016aa5c1848"}, + {file = "SQLAlchemy-2.0.17-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:36a87e26fe8fa8c466fae461a8fcb780d0a1cbf8206900759fc6fe874475a3ce"}, + {file = "SQLAlchemy-2.0.17-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e3a6b2788f193756076061626679c5c5a6d600ddf8324f986bc72004c3e9d92e"}, + {file = "SQLAlchemy-2.0.17-cp39-cp39-win32.whl", hash = "sha256:af7e2ba75bf84b64adb331918188dda634689a2abb151bc1a583e488363fd2f8"}, + {file = "SQLAlchemy-2.0.17-cp39-cp39-win_amd64.whl", hash = "sha256:394ac3adf3676fad76d4b8fcecddf747627f17f0738dc94bac15f303d05b03d4"}, + {file = "SQLAlchemy-2.0.17-py3-none-any.whl", hash = "sha256:cc9c2630c423ac4973492821b2969f5fe99d9736f3025da670095668fbfcd4d5"}, + {file = "SQLAlchemy-2.0.17.tar.gz", hash = "sha256:e186e9e95fb5d993b075c33fe4f38a22105f7ce11cecb5c17b5618181e356702"}, ] [package.dependencies] @@ -3210,6 +3238,7 @@ postgresql-pg8000 = ["pg8000 (>=1.29.1)"] postgresql-psycopg = ["psycopg (>=3.0.7)"] postgresql-psycopg2binary = ["psycopg2-binary"] postgresql-psycopg2cffi = ["psycopg2cffi"] +postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"] pymysql = ["pymysql"] sqlcipher = ["sqlcipher3-binary"] @@ -3232,14 +3261,14 @@ test = ["pytest", "pytest-cov"] [[package]] name = "sympy" -version = "1.11.1" +version = "1.12" description = "Computer algebra system (CAS) in Python" category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "sympy-1.11.1-py3-none-any.whl", hash = "sha256:938f984ee2b1e8eae8a07b884c8b7a1146010040fccddc6539c54f401c8f6fcf"}, - {file = "sympy-1.11.1.tar.gz", hash = "sha256:e32380dce63cb7c0108ed525570092fd45168bdae2faa17e528221ef72e88658"}, + {file = "sympy-1.12-py3-none-any.whl", hash = "sha256:c3588cd4295d0c0f603d0f2ae780587e64e2efeedb3521e46b9bb1d08d184fa5"}, + {file = "sympy-1.12.tar.gz", hash = "sha256:ebf595c8dac3e0fdc4152c51878b498396ec7f30e7a914d6071e674d49420fb8"}, ] [package.dependencies] @@ -3262,13 +3291,13 @@ widechars = ["wcwidth"] [[package]] name = "tensorboard" -version = "2.12.2" +version = "2.13.0" description = "TensorBoard lets you watch Tensors Flow" category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "tensorboard-2.12.2-py3-none-any.whl", hash = "sha256:811ab0d27a139445836db9fd4f974424602c3dce12379364d379bcba7c783a68"}, + {file = "tensorboard-2.13.0-py3-none-any.whl", hash = "sha256:ab69961ebddbddc83f5fa2ff9233572bdad5b883778c35e4fe94bf1798bd8481"}, ] [package.dependencies] @@ -3282,60 +3311,48 @@ protobuf = ">=3.19.6" requests = ">=2.21.0,<3" setuptools = ">=41.0.0" tensorboard-data-server = ">=0.7.0,<0.8.0" -tensorboard-plugin-wit = ">=1.6.0" werkzeug = ">=1.0.1" wheel = ">=0.26" [[package]] name = "tensorboard-data-server" -version = "0.7.0" +version = "0.7.1" description = "Fast data loading for TensorBoard" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "tensorboard_data_server-0.7.0-py3-none-any.whl", hash = "sha256:753d4214799b31da7b6d93837959abebbc6afa86e69eacf1e9a317a48daa31eb"}, - {file = "tensorboard_data_server-0.7.0-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:eb7fa518737944dbf4f0cf83c2e40a7ac346bf91be2e6a0215de98be74e85454"}, - {file = "tensorboard_data_server-0.7.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:64aa1be7c23e80b1a42c13b686eb0875bb70f5e755f4d2b8de5c1d880cf2267f"}, -] - -[[package]] -name = "tensorboard-plugin-wit" -version = "1.8.1" -description = "What-If Tool TensorBoard plugin." -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "tensorboard_plugin_wit-1.8.1-py3-none-any.whl", hash = "sha256:ff26bdd583d155aa951ee3b152b3d0cffae8005dc697f72b44a8e8c2a77a8cbe"}, + {file = "tensorboard_data_server-0.7.1-py3-none-any.whl", hash = "sha256:9938bd39f5041797b33921066fba0eab03a0dd10d1887a05e62ae58841ad4c3f"}, + {file = "tensorboard_data_server-0.7.1-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:be8d016a1aa394e6198280d4a3dc37898f56467310c5f5e617cac10a783e055a"}, + {file = "tensorboard_data_server-0.7.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:255c02b7f5b03dd5c0a88c928e563441ff39e1d4b4a234cdbe09f016e53d9594"}, ] [[package]] name = "tensorboardx" -version = "2.5" +version = "2.6.1" description = "TensorBoardX lets you watch Tensors Flow without Tensorflow" category = "main" optional = false python-versions = "*" files = [ - {file = "tensorboardX-2.5-py2.py3-none-any.whl", hash = "sha256:b1d8903f8106e2f4484640a293f9680f9757d5f7d2e699e0672bb2382d988e07"}, - {file = "tensorboardX-2.5.tar.gz", hash = "sha256:5238ac5eac4a26d8f8381d7f54a2fcd530a134db841af9a9a6427beca93c6776"}, + {file = "tensorboardX-2.6.1-py2.py3-none-any.whl", hash = "sha256:4960feb79b1b84fd2b020885b09fd70962caec277d4bc194f338a6c203cd78ca"}, + {file = "tensorboardX-2.6.1.tar.gz", hash = "sha256:02e2b84d7dc102edb7a052c77041db30fd6ba9b990635178919b8e9cfa157e96"}, ] [package.dependencies] numpy = "*" -protobuf = ">=3.8.0" -six = "*" +packaging = "*" +protobuf = ">=4.22.3" [[package]] name = "tensordict" -version = "0.1.0" +version = "0.1.2" description = "" category = "main" optional = false python-versions = "*" files = [ - {file = "tensordict-0.1.0-py3-none-any.whl", hash = "sha256:25ab7bcda69dae77186b75b2da279763ef1d8fdcb676a5b9098433ff3e863150"}, + {file = "tensordict-0.1.2-py3-none-any.whl", hash = "sha256:09723530487cc223a15baeebcf5bc15f7be7027849386f4c36c8df8df9a6de5e"}, ] [package.dependencies] @@ -3345,7 +3362,8 @@ torch = "*" [package.extras] checkpointing = ["torchsnapshot-nightly"] -tests = ["pytest", "pytest-instafail", "pytest-rerunfailures", "pyyaml"] +h5 = ["h5py (>=3.8)"] +tests = ["pytest", "pytest-benchmark", "pytest-instafail", "pytest-rerunfailures", "pyyaml"] [[package]] name = "threadpoolctl" @@ -3514,26 +3532,26 @@ tutorials = ["matplotlib", "pandas", "tabulate"] [[package]] name = "types-pyyaml" -version = "6.0.12.9" +version = "6.0.12.10" description = "Typing stubs for PyYAML" category = "main" optional = false python-versions = "*" files = [ - {file = "types-PyYAML-6.0.12.9.tar.gz", hash = "sha256:c51b1bd6d99ddf0aa2884a7a328810ebf70a4262c292195d3f4f9a0005f9eeb6"}, - {file = "types_PyYAML-6.0.12.9-py3-none-any.whl", hash = "sha256:5aed5aa66bd2d2e158f75dda22b059570ede988559f030cf294871d3b647e3e8"}, + {file = "types-PyYAML-6.0.12.10.tar.gz", hash = "sha256:ebab3d0700b946553724ae6ca636ea932c1b0868701d4af121630e78d695fc97"}, + {file = "types_PyYAML-6.0.12.10-py3-none-any.whl", hash = "sha256:662fa444963eff9b68120d70cda1af5a5f2aa57900003c2006d7626450eaae5f"}, ] [[package]] name = "typeshed-client" -version = "2.2.0" +version = "2.3.0" description = "A library for accessing stubs in typeshed." category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "typeshed_client-2.2.0-py3-none-any.whl", hash = "sha256:6f5a5841a0cf664ac66ea05f1ed3372a191d307b146f8b9aaa09719d1156626e"}, - {file = "typeshed_client-2.2.0.tar.gz", hash = "sha256:57baebdd5312486e438393e2971043d487c0c331404b73fe72d1f22ba0a5992d"}, + {file = "typeshed_client-2.3.0-py3-none-any.whl", hash = "sha256:27976287e0682be3005233f08f6f3cedf0c496413bcb213378f46e08798988c4"}, + {file = "typeshed_client-2.3.0.tar.gz", hash = "sha256:e2734755f93a0b6c1da8daad11670c75a36583d889d4d7b110eb882765b8bced"}, ] [package.dependencies] @@ -3541,26 +3559,26 @@ importlib-resources = ">=1.4.0" [[package]] name = "typing-extensions" -version = "4.5.0" +version = "4.6.3" description = "Backported and Experimental Type Hints for Python 3.7+" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "typing_extensions-4.5.0-py3-none-any.whl", hash = "sha256:fb33085c39dd998ac16d1431ebc293a8b3eedd00fd4a32de0ff79002c19511b4"}, - {file = "typing_extensions-4.5.0.tar.gz", hash = "sha256:5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb"}, + {file = "typing_extensions-4.6.3-py3-none-any.whl", hash = "sha256:88a4153d8505aabbb4e13aacb7c486c2b4a33ca3b3f807914a9b4c844c471c26"}, + {file = "typing_extensions-4.6.3.tar.gz", hash = "sha256:d91d5919357fe7f681a9f2b5b4cb2a5f1ef0a1e9f59c4d8ff0d3491e05c0ffd5"}, ] [[package]] name = "typing-inspect" -version = "0.8.0" +version = "0.9.0" description = "Runtime inspection utilities for typing module." category = "main" optional = false python-versions = "*" files = [ - {file = "typing_inspect-0.8.0-py3-none-any.whl", hash = "sha256:5fbf9c1e65d4fa01e701fe12a5bca6c6e08a4ffd5bc60bfac028253a447c5188"}, - {file = "typing_inspect-0.8.0.tar.gz", hash = "sha256:8b1ff0c400943b6145df8119c41c244ca8207f1f10c9c057aeed1560e4806e3d"}, + {file = "typing_inspect-0.9.0-py3-none-any.whl", hash = "sha256:9ee6fc59062311ef8547596ab6b955e1b8aa46242d854bfc78f4f6b0eff35f9f"}, + {file = "typing_inspect-0.9.0.tar.gz", hash = "sha256:b23fc42ff6f6ef6954e4852c1fb512cdd18dbea03134f91f856a95ccc9461f78"}, ] [package.dependencies] @@ -3569,14 +3587,14 @@ typing-extensions = ">=3.7.4" [[package]] name = "urllib3" -version = "1.26.15" +version = "1.26.16" description = "HTTP library with thread-safe connection pooling, file post, and more." category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" files = [ - {file = "urllib3-1.26.15-py2.py3-none-any.whl", hash = "sha256:aa751d169e23c7479ce47a0cb0da579e3ede798f994f5816a74e4f4500dcea42"}, - {file = "urllib3-1.26.15.tar.gz", hash = "sha256:8a388717b9476f934a21484e8c8e61875ab60644d29b9b39e11e4b9dc1c6b305"}, + {file = "urllib3-1.26.16-py2.py3-none-any.whl", hash = "sha256:8d36afa7616d8ab714608411b4a3b13e58f463aee519024578e062e141dce20f"}, + {file = "urllib3-1.26.16.tar.gz", hash = "sha256:8f135f6502756bde6b2a9b28989df5fbe87c9970cecaa69041edcce7f0589b14"}, ] [package.extras] @@ -3602,14 +3620,14 @@ testing = ["coverage (>=5.0)", "pytest", "pytest-cover"] [[package]] name = "websocket-client" -version = "1.5.1" +version = "1.6.1" description = "WebSocket client for Python with low level API options" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "websocket-client-1.5.1.tar.gz", hash = "sha256:3f09e6d8230892547132177f575a4e3e73cfdf06526e20cc02aa1c3b47184d40"}, - {file = "websocket_client-1.5.1-py3-none-any.whl", hash = "sha256:cdf5877568b7e83aa7cf2244ab56a3213de587bbe0ce9d8b9600fc77b455d89e"}, + {file = "websocket-client-1.6.1.tar.gz", hash = "sha256:c951af98631d24f8df89ab1019fc365f2227c0892f12fd150e935607c79dd0dd"}, + {file = "websocket_client-1.6.1-py3-none-any.whl", hash = "sha256:f1f9f2ad5291f0225a49efad77abf9e700b6fef553900623060dad6e26503b9d"}, ] [package.extras] @@ -3619,14 +3637,14 @@ test = ["websockets"] [[package]] name = "werkzeug" -version = "2.3.1" +version = "2.3.6" description = "The comprehensive WSGI web application library." category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "Werkzeug-2.3.1-py3-none-any.whl", hash = "sha256:69a4b8fcbb30a4c3fa81a5cebd961541273e4d222a4c08593b0b18312e14f64a"}, - {file = "Werkzeug-2.3.1.tar.gz", hash = "sha256:2d35a28a75ae03727eae14ea7d13627c0f77aed6b9998441e6dae0b387f697fc"}, + {file = "Werkzeug-2.3.6-py3-none-any.whl", hash = "sha256:935539fa1413afbb9195b24880778422ed620c0fc09670945185cce4d91a8890"}, + {file = "Werkzeug-2.3.6.tar.gz", hash = "sha256:98c774df2f91b05550078891dee5f0eb0cb797a522c757a2452b9cee5b202330"}, ] [package.dependencies] @@ -3757,4 +3775,4 @@ testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more [metadata] lock-version = "2.0" python-versions = "~3.10" -content-hash = "4e75da1d01bae2bd1675a51b22aa54241002acfc7634aef13e7b2f039d6154ed" +content-hash = "155fa74e9e6d900d908ec85d3951fd04d594a03af259a60312f2f9506b1c4de9" diff --git a/pyproject.toml b/pyproject.toml index 536d619..99d60a6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,12 +1,11 @@ [tool.poetry] name = "causica" -version = "0.3.2" +version = "0.3.3" description = "" readme = "README.md" authors = [] packages = [ - { include = "causica", from = "src" }, - { include = "examples", from = "." }, + { include = "causica", from = "src" } ] license = "MIT" @@ -22,7 +21,7 @@ jsonargparse = "<4.21.0" # 4.21.0 breaks lightning cli dataclasses-json = "^0.5.7" types-PyYAML = "^6.0.12.2" tensordict = "^0.1.0" -torch = "^2.0.0" +torch = "2.0.0" numba = "^0.56.0" # needed to make the build work [tool.poetry.dev-dependencies] diff --git a/src/causica/config/lightning/default_data.yaml b/src/causica/config/lightning/default_data.yaml index 1c46fed..58a0e9b 100644 --- a/src/causica/config/lightning/default_data.yaml +++ b/src/causica/config/lightning/default_data.yaml @@ -1,4 +1,4 @@ -class_path: causica.lightning.data_modules.CSuiteDataModule +class_path: causica.lightning.data_modules.variable_spec_data.CSuiteDataModule init_args: dataset_name: csuite_nonlingauss batch_size: 128 diff --git a/src/causica/config/lightning/default_gaussian.yaml b/src/causica/config/lightning/default_gaussian.yaml index 0e5f5df..ff2c42e 100644 --- a/src/causica/config/lightning/default_gaussian.yaml +++ b/src/causica/config/lightning/default_gaussian.yaml @@ -1,6 +1,6 @@ seed_everything: 234 model: - class_path: causica.lightning.deci_module.DECIModule + class_path: causica.lightning.modules.deci_module.DECIModule init_args: noise_dist: "GAUSSIAN" embedding_size: 32 @@ -39,8 +39,8 @@ best_checkpoint_callback: filename: "best_model" save_top_k: 1 mode: "max" - monitor: "average_batch_log_prob" - every_n_train_steps: 1 + monitor: "batch_log_prob" + every_n_epochs: 1 last_checkpoint_callback: save_last: true filename: "last_model" diff --git a/src/causica/config/lightning/default_spline.yaml b/src/causica/config/lightning/default_spline.yaml index 4fb784e..73a1ec2 100644 --- a/src/causica/config/lightning/default_spline.yaml +++ b/src/causica/config/lightning/default_spline.yaml @@ -1,6 +1,6 @@ seed_everything: 234 model: - class_path: causica.lightning.deci_module.DECIModule + class_path: causica.lightning.modules.deci_module.DECIModule init_args: noise_dist: "SPLINE" embedding_size: 32 @@ -39,8 +39,8 @@ best_checkpoint_callback: filename: "best_model" save_top_k: 1 mode: "max" - monitor: "average_batch_log_prob" - every_n_train_steps: 1 + monitor: "batch_log_prob" + every_n_epochs: 1 last_checkpoint_callback: save_last: true filename: "last_model" diff --git a/src/causica/datasets/causica_dataset_format.py b/src/causica/datasets/causica_dataset_format.py index e1bc446..435542a 100644 --- a/src/causica/datasets/causica_dataset_format.py +++ b/src/causica/datasets/causica_dataset_format.py @@ -73,7 +73,7 @@ def load_data( fsspec_open = partial(fsspec.open, mode="r", encoding="utf-8", **storage_options) - logger.debug(f"Loading {data_enum} from {path_name} with storage options {storage_options}") + logger.debug("Loading %s from %s with storage options %s", data_enum, path_name, storage_options) if data_enum == DataEnum.TRUE_ADJACENCY: with fsspec_open(path_name) as f: @@ -89,19 +89,20 @@ def load_data( variables_metadata = load_data(root_path, data_enum=DataEnum.VARIABLES_JSON) with fsspec_open(path_name) as f: - if data_enum in {DataEnum.TRAIN, DataEnum.TEST}: - arr = np.loadtxt(f, delimiter=",") - categorical_sizes = _get_categorical_sizes(variables_list=variables_metadata["variables"]) - return convert_one_hot( - tensordict_from_variables_metadata(arr, variables_metadata["variables"]), - one_hot_sizes=categorical_sizes, - ) - elif data_enum == DataEnum.INTERVENTIONS: - return _load_interventions(json_object=json.load(f), metadata=variables_metadata) - elif data_enum == DataEnum.COUNTERFACTUALS: - return _load_counterfactuals(json_object=json.load(f), metadata=variables_metadata) - else: - raise RuntimeError("Unrecognized data type") + match data_enum: + case (DataEnum.TRAIN | DataEnum.TEST): + arr = np.loadtxt(f, delimiter=",") + categorical_sizes = _get_categorical_sizes(variables_list=variables_metadata["variables"]) + return convert_one_hot( + tensordict_from_variables_metadata(arr, variables_metadata["variables"]), + one_hot_sizes=categorical_sizes, + ) + case DataEnum.INTERVENTIONS: + return _load_interventions(json_object=json.load(f), metadata=variables_metadata) + case DataEnum.COUNTERFACTUALS: + return _load_counterfactuals(json_object=json.load(f), metadata=variables_metadata) + + raise RuntimeError("Unrecognized data type") def _load_interventions(json_object: dict[str, Any], metadata: dict[str, Any]) -> list[InterventionWithEffects]: @@ -307,3 +308,22 @@ def tensordict_to_tensor(tensor_dict: TensorDict) -> torch.Tensor: def _intersect_dicts_left(dict_1: dict, dict_2: dict) -> dict: """Select the keys that are in both dictionaries, with values from the first.""" return {key: dict_1[key] for key in dict_1.keys() & dict_2.keys()} + + +def get_group_names(variables_dict: dict[str, Any]) -> list[str]: + """Get the names of the groups in the variables dict.""" + return list(dict.fromkeys([var["group_name"] for var in variables_dict["variables"]])) + + +def get_group_idxs(variables_dict: dict[str, Any]) -> list[list[int]]: + """Get the indices of the nodes/groups in each group.""" + group_names = get_group_names(variables_dict) + return [ + [idx for idx, var in enumerate(variables_dict["variables"]) if var["group_name"] == group_name] + for group_name in group_names + ] + + +def get_name_to_idx(variables_dict: dict[str, Any]) -> dict[str, int]: + """Get a dictionary mapping node/group names to their index in the variables dict.""" + return {var["name"]: idx for idx, var in enumerate(variables_dict["variables"])} diff --git a/src/causica/distributions/__init__.py b/src/causica/distributions/__init__.py index 7d0e6ce..af35e7d 100644 --- a/src/causica/distributions/__init__.py +++ b/src/causica/distributions/__init__.py @@ -28,4 +28,3 @@ create_noise_modules, create_spline_dist_params, ) -from causica.distributions.sem_distribution import SEMDistribution, SEMDistributionModule diff --git a/src/causica/distributions/adjacency/constrained_adjacency_distributions.py b/src/causica/distributions/adjacency/constrained_adjacency_distributions.py index c2c7226..48968b9 100644 --- a/src/causica/distributions/adjacency/constrained_adjacency_distributions.py +++ b/src/causica/distributions/adjacency/constrained_adjacency_distributions.py @@ -129,8 +129,10 @@ def get_graph_constraint(graph_constraint_matrix: torch.Tensor) -> tuple[torch.T # Mask self-edges mask = ~torch.eye(graph_constraint_matrix.shape[0], dtype=torch.bool, device=graph_constraint_matrix.device) - positive_constraints = mask * torch.nan_to_num(graph_constraint_matrix, nan=0).to(dtype=torch.bool) - negative_constraints = torch.nan_to_num(graph_constraint_matrix, nan=1).to(dtype=torch.bool) + positive_constraints = mask * torch.nan_to_num(graph_constraint_matrix, nan=0).to( + dtype=torch.bool, non_blocking=True + ) + negative_constraints = torch.nan_to_num(graph_constraint_matrix, nan=1).to(dtype=torch.bool, non_blocking=True) return positive_constraints, negative_constraints diff --git a/src/causica/distributions/adjacency/directed_acyclic.py b/src/causica/distributions/adjacency/directed_acyclic.py index 92474ea..fc7e6b7 100644 --- a/src/causica/distributions/adjacency/directed_acyclic.py +++ b/src/causica/distributions/adjacency/directed_acyclic.py @@ -50,7 +50,9 @@ def sample(self, sample_shape: torch.Size = torch.Size()) -> torch.Tensor: aranges = np.tile(np.arange(self.num_nodes), sample_shape + self.probs.shape + (1,)) # shape [..., n] np_perms = torch.tensor(self.np_rng.permuted(aranges, axis=-1)) # a batch of rearranged [0, 1, 2... n] # one hot the last dimension to create a tensor of shape [..., n, n] - perms = torch.nn.functional.one_hot(np_perms, num_classes=self.num_nodes).to(dtype=low_tri.dtype) + perms = torch.nn.functional.one_hot(np_perms, num_classes=self.num_nodes).to( + dtype=low_tri.dtype, non_blocking=True + ) return torch.einsum("...ij,...jk,...lk->...il", perms, low_tri, perms) diff --git a/src/causica/distributions/adjacency/gibbs_dag_prior.py b/src/causica/distributions/adjacency/gibbs_dag_prior.py index 7da3d35..4110e40 100644 --- a/src/causica/distributions/adjacency/gibbs_dag_prior.py +++ b/src/causica/distributions/adjacency/gibbs_dag_prior.py @@ -18,8 +18,10 @@ def __init__(self, dag: torch.Tensor, mask: torch.Tensor, confidence: float, sca self.dag = torch.nn.Parameter(dag, requires_grad=False) self.mask = torch.nn.Parameter(mask, requires_grad=False) - self.confidence = confidence - self.scale = scale + self.confidence: torch.Tensor + self.scale: torch.Tensor + self.register_buffer("confidence", torch.tensor(confidence, dtype=torch.float)) + self.register_buffer("scale", torch.tensor(scale, dtype=torch.float)) class GibbsDAGPrior(td.Distribution): diff --git a/src/causica/distributions/noise/bernoulli.py b/src/causica/distributions/noise/bernoulli.py index 8693e1b..a227c1f 100644 --- a/src/causica/distributions/noise/bernoulli.py +++ b/src/causica/distributions/noise/bernoulli.py @@ -66,7 +66,7 @@ def mode(self): We favour sparseness, so if logit == 0, set the mode to be zero. """ - return (self.logits > 0).to(self.logits) + return (self.logits > 0).to(self.logits, non_blocking=True) class BernoulliNoiseModule(NoiseModule[IndependentNoise[BernoulliNoise]]): diff --git a/src/causica/distributions/noise/spline/bayesiains_nsf_rqs.py b/src/causica/distributions/noise/spline/bayesiains_nsf_rqs.py index 2ce9cda..5d34205 100644 --- a/src/causica/distributions/noise/spline/bayesiains_nsf_rqs.py +++ b/src/causica/distributions/noise/spline/bayesiains_nsf_rqs.py @@ -161,21 +161,21 @@ def rational_quadratic_spline( logabsdet = torch.log(derivative_numerator) - 2 * torch.log(denominator) return outputs, -logabsdet - else: - theta = (inputs - input_cumwidths) / input_bin_widths - theta_one_minus_theta = theta * (1 - theta) - numerator = input_heights * (input_delta * theta.pow(2) + input_derivatives * theta_one_minus_theta) - denominator = input_delta + ( - (input_derivatives + input_derivatives_plus_one - 2 * input_delta) * theta_one_minus_theta - ) - outputs = input_cumheights + numerator / denominator + theta = (inputs - input_cumwidths) / input_bin_widths + theta_one_minus_theta = theta * (1 - theta) - derivative_numerator = input_delta.pow(2) * ( - input_derivatives_plus_one * theta.pow(2) - + 2 * input_delta * theta_one_minus_theta - + input_derivatives * (1 - theta).pow(2) - ) - logabsdet = torch.log(derivative_numerator) - 2 * torch.log(denominator) + numerator = input_heights * (input_delta * theta.pow(2) + input_derivatives * theta_one_minus_theta) + denominator = input_delta + ( + (input_derivatives + input_derivatives_plus_one - 2 * input_delta) * theta_one_minus_theta + ) + outputs = input_cumheights + numerator / denominator - return outputs, logabsdet + derivative_numerator = input_delta.pow(2) * ( + input_derivatives_plus_one * theta.pow(2) + + 2 * input_delta * theta_one_minus_theta + + input_derivatives * (1 - theta).pow(2) + ) + logabsdet = torch.log(derivative_numerator) - 2 * torch.log(denominator) + + return outputs, logabsdet diff --git a/src/causica/distributions/transforms.py b/src/causica/distributions/transforms.py index d950028..a14a1cc 100644 --- a/src/causica/distributions/transforms.py +++ b/src/causica/distributions/transforms.py @@ -55,7 +55,7 @@ def log_abs_det_jacobian(self, x: TensorDict, y: TensorDict) -> torch.Tensor: { key: self.transformations[key].log_abs_det_jacobian(x[key], y[key]) if key in self.transformations - else torch.ones_like(x[key]) + else torch.zeros_like(x[key]) for key in x.keys() } ) @@ -71,3 +71,78 @@ def domain(self): @property def codomain(self): return {key: t.codomain for key, t in self.transformations.items()} + + +class TensorToTensorDictTransform(td.Transform): + """ + A transform for converting a torch tensor to a TensorDict. + + It extracts the slices from the last dimension of the tensor and assigns them to the correct key. + """ + + bijective = True + + def __init__(self, shapes: dict[str, torch.Size]): + """ + Args: + shapes: the shapes of each of the keys + """ + super().__init__() + self.shapes = shapes + self.num_keys = len(shapes) + self.output_shape, self.slices = shapes_to_slices(self.shapes) + + def _call(self, x: torch.Tensor) -> TensorDict: + """Create a Tensordict by retrieving the slice associated with each key.""" + return TensorDict({name: x[..., slice_] for name, slice_ in self.slices.items()}, batch_size=x.shape[:-1]) + + def _inverse(self, y: TensorDict) -> torch.Tensor: + """ + Create a tensor by stacking the slice associated with each key. + + Args: + y: Tensordict with batch_shape + Returns: + A tensor with shape batch_shape + [output_shape] + """ + return torch.cat([y[name] for name in self.slices], dim=-1) + + def log_abs_det_jacobian(self, _: torch.Tensor, y: TensorDict) -> TensorDict: + """This transformation doesn't affect the log det jacobian""" + return y.apply(torch.zeros_like) + + def stacked_key_masks(self) -> torch.Tensor: + """ + Create a binary of matrix of where each key is in the tensor. + + Returns: + A matrix of shape [num_keys, output_shape] with 1 if the index of the tensor + belongs to the key corresponding to that row + """ + stacked_key_masks = torch.zeros((self.num_keys, self.output_shape), dtype=torch.float) + for i, slice_ in enumerate(self.slices.values()): + stacked_key_masks[i, slice_] = 1.0 + return stacked_key_masks + + +def shapes_to_slices(shapes: dict[str, torch.Size]) -> tuple[int, dict[str, slice]]: + """ + Convert a dictionary of shapes to a dictionary of masks by stacking the shapes + + Each mask corresponds to the embedded location in the tensor + + Args: + shapes: A dict of key names to shapes + Returns: + The shape of the stacked tensor and a dictionary of each key to the mask + """ + assert all(len(shape) == 1 for shape in shapes.values()) + + slices: dict[str, slice] = {} + idx = 0 + for name, shape in shapes.items(): + next_idx = idx + shape[-1] + slices[name] = slice(idx, next_idx) + idx = next_idx + + return next_idx, slices diff --git a/src/causica/functional_relationships/__init__.py b/src/causica/functional_relationships/__init__.py index 150f633..b55432b 100644 --- a/src/causica/functional_relationships/__init__.py +++ b/src/causica/functional_relationships/__init__.py @@ -1,4 +1,4 @@ from .do_functional_relationships import DoFunctionalRelationships, create_do_functional_relationship -from .functional_relationships import FunctionalRelationships, sample_dict_to_tensor, tensor_to_sample_dict +from .functional_relationships import FunctionalRelationships from .icgnn import ICGNN from .linear_functional_relationships import LinearFunctionalRelationships diff --git a/src/causica/functional_relationships/do_functional_relationships.py b/src/causica/functional_relationships/do_functional_relationships.py index 4f52e98..44eb96d 100644 --- a/src/causica/functional_relationships/do_functional_relationships.py +++ b/src/causica/functional_relationships/do_functional_relationships.py @@ -18,15 +18,15 @@ def __init__(self, func: FunctionalRelationships, do: TensorDict, submatrix: tor """ assert all(val.ndim == 1 for val in do.values()), "Intervention is only supported for 1 vector per variable" - new_variables = {key: value for key, value in func.variables.items() if key not in do.keys()} - super().__init__(new_variables) + new_shapes = {key: shape for key, shape in func.shapes.items() if key not in do.keys()} + super().__init__(new_shapes) self.func = func self.do = do # dict of key to vectors self.submatrix = submatrix self.do_nodes_mask = torch.tensor( - [(name in self.do.keys()) for name in self.func.variables.keys()], dtype=torch.bool + [(name in self.do.keys()) for name in self.func.shapes.keys()], dtype=torch.bool ) def pad_intervened_graphs(self, graphs: torch.Tensor) -> torch.Tensor: @@ -38,7 +38,8 @@ def pad_intervened_graphs(self, graphs: torch.Tensor) -> torch.Tensor: Returns: A tensor of shape batch_shape_g + (func_n, func_n) """ - target_shape = graphs.shape[:-2] + (self.func.num_nodes, self.func.num_nodes) + num_nodes = self.func.tensor_to_td.num_keys + target_shape = graphs.shape[:-2] + (num_nodes, num_nodes) output_graphs = torch.zeros(target_shape, dtype=graphs.dtype, device=graphs.device) assign_submatrix(output_graphs, graphs, ~self.do_nodes_mask, ~self.do_nodes_mask) @@ -93,7 +94,7 @@ def create_do_functional_relationship( Return: A tuple with the intervened functional relationship and the intervened graph """ - node_names = list(func.variables.keys()) + node_names = list(func.shapes.keys()) do_nodes_mask = torch.zeros(len(node_names), dtype=torch.bool) for i, name in enumerate(node_names): if name in interventions.keys(): diff --git a/src/causica/functional_relationships/functional_relationships.py b/src/causica/functional_relationships/functional_relationships.py index 9638abd..0227f28 100644 --- a/src/causica/functional_relationships/functional_relationships.py +++ b/src/causica/functional_relationships/functional_relationships.py @@ -4,40 +4,30 @@ import torch from tensordict import TensorDict +from causica.distributions.transforms import TensorToTensorDictTransform + class FunctionalRelationships(abc.ABC, torch.nn.Module): - def __init__(self, variables: dict[str, torch.Size]) -> None: + def __init__(self, shapes: dict[str, torch.Size]) -> None: """_summary_ Args: - variables: Dict of node shapes (how many dimensions a variable has) + shapes: Dict of node shapes (how many dimensions a node has) Order corresponds to the order in graph(s). """ super().__init__() - self.num_nodes = len(variables) - self.variables = variables - self.output_shape = sum(variable.numel() for variable in variables.values()) - - self.variable_masks = {} - last_idx = 0 - for name, shape in variables.items(): - mask = torch.zeros(self.output_shape, dtype=torch.bool) - mask[last_idx : last_idx + shape.numel()] = True - - self.variable_masks[name] = mask - last_idx += shape.numel() + self.shapes = shapes + # create a transform for mapping tensors to tensordicts + self.tensor_to_td = TensorToTensorDictTransform(shapes) + # this needs to be registered to the module, and register buffer doesn't work + self.stacked_key_masks = torch.nn.Parameter(self.tensor_to_td.stacked_key_masks(), requires_grad=False) def set_extra_state(self, state: dict[str, Any]): - self.num_nodes = state.pop("num_nodes") - self.variables = state.pop("variables") - self.output_shape = state.pop("output_shape") + self.shapes = state.pop("shapes") + self.tensor_to_td = TensorToTensorDictTransform(self.shapes) def get_extra_state(self) -> dict[str, Any]: - return { - "num_nodes": self.num_nodes, - "variables": self.variables, - "output_shape": self.output_shape, - } + return {"shapes": self.shapes} @abc.abstractmethod def forward(self, samples: TensorDict, graphs: torch.Tensor) -> TensorDict: @@ -50,15 +40,3 @@ def forward(self, samples: TensorDict, graphs: torch.Tensor) -> TensorDict: Returns: Dictionary of torch.Tensors of shape sample_shape + batch_shape + [node shape] """ - - -def sample_dict_to_tensor(sample_dict: TensorDict, variable_masks: dict[str, torch.Tensor]) -> torch.Tensor: - """Converts a sample dictionary to a tensor.""" - return torch.cat([sample_dict[name] for name in variable_masks.keys()], dim=-1) - - -def tensor_to_sample_dict(sample_tensor: torch.Tensor, variable_masks: dict[str, torch.Tensor]) -> TensorDict: - """Converts a tensor to a sample dictionary.""" - return TensorDict( - {name: sample_tensor[..., mask] for name, mask in variable_masks.items()}, batch_size=sample_tensor.shape[:-1] - ) diff --git a/src/causica/functional_relationships/icgnn.py b/src/causica/functional_relationships/icgnn.py index 0b3ee07..cc927a8 100644 --- a/src/causica/functional_relationships/icgnn.py +++ b/src/causica/functional_relationships/icgnn.py @@ -4,11 +4,7 @@ from tensordict import TensorDict from torch import nn -from causica.functional_relationships.functional_relationships import ( - FunctionalRelationships, - sample_dict_to_tensor, - tensor_to_sample_dict, -) +from causica.functional_relationships.functional_relationships import FunctionalRelationships class ICGNN(FunctionalRelationships): @@ -22,25 +18,18 @@ class ICGNN(FunctionalRelationships): def __init__( self, - variables: dict[str, torch.Size], + shapes: dict[str, torch.Size], embedding_size: Optional[int] = None, out_dim_g: Optional[int] = None, norm_layer: Optional[Type[nn.LayerNorm]] = None, res_connection: bool = False, ) -> None: - super().__init__(variables) + super().__init__(shapes=shapes) - # this needs to be a parameter so it is registered to the module - self.stacked_variable_masks = torch.nn.Parameter( - torch.stack(list(self.variable_masks.values())).float(), requires_grad=False - ) - - self.nn = FGNNI(self.stacked_variable_masks, embedding_size, out_dim_g, norm_layer, res_connection) + self.nn = FGNNI(self.stacked_key_masks, embedding_size, out_dim_g, norm_layer, res_connection) def forward(self, samples: TensorDict, graphs: torch.Tensor) -> TensorDict: - return tensor_to_sample_dict( - self.nn(sample_dict_to_tensor(samples, self.variable_masks), graphs), self.variable_masks - ) + return self.tensor_to_td(self.nn(self.tensor_to_td.inv(samples), graphs)) class FGNNI(nn.Module): diff --git a/src/causica/functional_relationships/linear_functional_relationships.py b/src/causica/functional_relationships/linear_functional_relationships.py index 1cb7bb6..e46b390 100644 --- a/src/causica/functional_relationships/linear_functional_relationships.py +++ b/src/causica/functional_relationships/linear_functional_relationships.py @@ -1,11 +1,7 @@ import torch from tensordict import TensorDict -from causica.functional_relationships.functional_relationships import ( - FunctionalRelationships, - sample_dict_to_tensor, - tensor_to_sample_dict, -) +from causica.functional_relationships.functional_relationships import FunctionalRelationships class LinearFunctionalRelationships(FunctionalRelationships): @@ -15,24 +11,21 @@ class LinearFunctionalRelationships(FunctionalRelationships): def __init__( self, - variables: dict[str, torch.Size], + shapes: dict[str, torch.Size], initial_linear_coefficient_matrix: torch.Tensor, trainable: bool = False, ) -> None: """ Args: - variables: Dict of node shapes (how many dimensions a variable has) + shapes: Dict of node shapes (how many dimensions a variable has) Order corresponds to the order in graph(s). initial_linear_coefficient_matrix: the linear coefficients [output_shape, output_shape] trainable: whether the coefficient matrix should be learnable """ - super().__init__(variables) + super().__init__(shapes=shapes) - self.stacked_variable_masks = torch.nn.Parameter( - torch.stack(list(self.variable_masks.values())).float(), requires_grad=False - ) - - assert initial_linear_coefficient_matrix.shape == (self.output_shape, self.output_shape) + shape = self.tensor_to_td.output_shape + assert initial_linear_coefficient_matrix.shape == (shape, shape) self.linear_coefficients = torch.nn.Parameter(initial_linear_coefficient_matrix, requires_grad=trainable) def forward(self, samples: TensorDict, graphs: torch.Tensor) -> TensorDict: @@ -43,9 +36,7 @@ def forward(self, samples: TensorDict, graphs: torch.Tensor) -> TensorDict: Returns: A Dict of tensors of shape batch_shape_x + batch_shape_g + (processed_dim_all) """ - return tensor_to_sample_dict( - self.linear_map(sample_dict_to_tensor(samples, self.variable_masks), graphs), self.variable_masks - ) + return self.tensor_to_td(self.linear_map(self.tensor_to_td.inv(samples), graphs)) def linear_map(self, samples: torch.Tensor, graph: torch.Tensor) -> torch.Tensor: """ @@ -60,9 +51,7 @@ def linear_map(self, samples: torch.Tensor, graph: torch.Tensor) -> torch.Tensor batch_shape_x = samples.shape[:-1] batch_shape_g = graph.shape[:-2] - masked_graph = torch.einsum( - "ji,...jk,kl->...il", self.stacked_variable_masks, graph, self.stacked_variable_masks - ) + masked_graph = torch.einsum("ji,...jk,kl->...il", self.stacked_key_masks, graph, self.stacked_key_masks) graph_broad = masked_graph.expand(*(batch_shape_x + tuple([-1] * len(graph.shape)))) target_shape = batch_shape_x + batch_shape_g + samples.shape[-1:] diff --git a/src/causica/lightning/callbacks.py b/src/causica/lightning/callbacks.py index 5847cb4..654fba0 100644 --- a/src/causica/lightning/callbacks.py +++ b/src/causica/lightning/callbacks.py @@ -15,12 +15,14 @@ class AuglagLRCallback(pl.Callback): """Wrapper Class to make the Auglag Learning Rate Scheduler compatible with Pytorch Lightning""" - def __init__(self, scheduler: AugLagLR): + def __init__(self, scheduler: AugLagLR, log_auglag: bool = False): """ Args: - scheduler: The auglag learning rate scheduler to wrap + scheduler: The auglag learning rate scheduler to wrap. + log_auglag: Whether to log the auglag state as metrics at the end of each epoch. """ self.scheduler = scheduler + self._log_auglag = log_auglag def on_train_batch_end( self, trainer: pl.Trainer, pl_module: pl.LightningModule, outputs: STEP_OUTPUT, batch: Any, batch_idx: int @@ -36,25 +38,28 @@ def on_train_batch_end( is_converged = self.scheduler.step( optimizer=optimizer, loss=auglag_loss, - loss_value=outputs["loss"].item(), - lagrangian_penalty=outputs["constraint"].item(), + loss_value=outputs["loss"], + lagrangian_penalty=outputs["constraint"], ) - auglag_logging_attributes = [ - "num_lr_updates", - "outer_opt_counter", - "step_counter", - "outer_below_penalty_tol", - "outer_max_rho", - "last_best_step", - "last_lr_update_step", - ] - pl_module.log_dict({f"auglag/{k}": getattr(self.scheduler, k) for k in auglag_logging_attributes}, on_step=True) - # Notify trainer to stop if the auglag algorithm has converged if is_converged: trainer.should_stop = True + def on_train_epoch_end(self, trainer: pl.Trainer, pl_module: pl.LightningModule) -> None: + _ = trainer + if self._log_auglag: + auglag_state = { + "num_lr_updates": self.scheduler.num_lr_updates, + "outer_opt_counter": self.scheduler.outer_opt_counter, + "step_counter": self.scheduler.step_counter, + "outer_below_penalty_tol": self.scheduler.outer_below_penalty_tol, + "outer_max_rho": self.scheduler.outer_max_rho, + "last_best_step": self.scheduler.last_best_step, + "last_lr_update_step": self.scheduler.last_lr_update_step, + } + pl_module.log_dict(auglag_state, on_epoch=True, rank_zero_only=True, prog_bar=False) + class MLFlowSaveConfigCallback(SaveConfigCallback): """Logs the config using MLFlow if there is an active run, otherwise saves locally as the superclass.""" diff --git a/src/causica/lightning/cli.py b/src/causica/lightning/cli.py index 0cae556..5ee381c 100644 --- a/src/causica/lightning/cli.py +++ b/src/causica/lightning/cli.py @@ -6,8 +6,8 @@ class LightningCLIWithDefaults(LightningCLI): default_logger = { - "class_path": "pytorch_lightning.loggers.MLFlowLogger", - "init_args": {"run_id": os.environ.get("AZUREML_RUN_ID", None)}, + "class_path": "causica.lightning.loggers.BufferingMlFlowLogger", + "init_args": {"run_id": os.environ.get("AZUREML_RUN_ID", None), "buffer_size": 2000}, } def add_arguments_to_parser(self, parser): diff --git a/src/causica/lightning/loggers.py b/src/causica/lightning/loggers.py new file mode 100644 index 0000000..b2e0917 --- /dev/null +++ b/src/causica/lightning/loggers.py @@ -0,0 +1,60 @@ +from typing import Sequence + +from lightning_utilities.core.rank_zero import rank_zero_only +from mlflow.entities import Metric, Param, RunTag +from pytorch_lightning.loggers import MLFlowLogger + + +class BufferingMlFlowLogger(MLFlowLogger): + """MlFlowLogger that buffers metrics on logging and flushes on finalize or when the buffer is full.""" + + def __init__(self, buffer_size: int, *args, **kwargs): + """ + Args: + buffer_size: The maximum number of metrics to buffer before flushing + *args: Passed to `MLFlowLogger` + **kwargs: Passed to `MLFlowLogger` + """ + super().__init__(*args, **kwargs) + self._buffer_size = buffer_size + self._buffer: list[Metric] = [] + self._original_log_batch = self.experiment.log_batch + self.experiment.log_batch = self._buffer_log_batch_metrics(self.experiment.log_batch) + + @rank_zero_only + def _buffer_log_batch_metrics(self, original_log_batch): + """Returns a decorated `log_batch` that buffers metrics and flushes them when the buffer is full.""" + + def log_batch( + run_id: str, + metrics: Sequence[Metric] = (), + params: Sequence[Param] = (), + tags: Sequence[RunTag] = (), + ) -> None: + if metrics: + self._buffer.extend(metrics) + if len(self._buffer) >= self._buffer_size: + self.flush() + if params or tags: + original_log_batch(run_id=run_id, params=params, tags=tags) + + return log_batch + + def get_buffer_count(self) -> int: + """Return the current number of buffered messages.""" + return len(self._buffer) + + @rank_zero_only + def flush(self): + if self._buffer: + self._original_log_batch(run_id=self.run_id, metrics=self._buffer) + self._buffer.clear() + + @rank_zero_only + def finalize(self, *args, **kwargs) -> None: + self.flush() + return super().finalize(*args, **kwargs) + + @rank_zero_only + def __del__(self) -> None: + self.flush() diff --git a/src/causica/lightning/modules/deci_module.py b/src/causica/lightning/modules/deci_module.py index 5676643..54cd4f4 100644 --- a/src/causica/lightning/modules/deci_module.py +++ b/src/causica/lightning/modules/deci_module.py @@ -18,7 +18,6 @@ ExpertGraphContainer, GibbsDAGPrior, JointNoiseModule, - SEMDistributionModule, create_noise_modules, ) from causica.distributions.noise.joint import ContinuousNoiseDist @@ -29,6 +28,7 @@ from causica.lightning.callbacks import AuglagLRCallback from causica.lightning.data_modules.deci_data_module import DECIDataModule from causica.lightning.modules.variable_spec_module import VariableSpecModule +from causica.sem.sem_distribution import SEMDistributionModule from causica.sem.structural_equation_model import SEM from causica.training.auglag import AugLagLossCalculator, AugLagLR, AugLagLRConfig from causica.training.evaluation import ( @@ -38,7 +38,6 @@ list_logsumexp, list_mean, ) -from causica.training.training_callbacks import AverageMetricTracker logging.basicConfig(level=logging.INFO) @@ -132,7 +131,7 @@ def infer_missing_state_from_dataset(self): def setup(self, stage: Optional[str] = None): if self.is_setup: return # Already setup - elif stage not in {TrainerFn.TESTING, TrainerFn.FITTING}: + if stage not in {TrainerFn.TESTING, TrainerFn.FITTING}: raise ValueError(f"Model can only be setup during the {TrainerFn.FITTING} and {TrainerFn.TESTING} stages.") self.infer_missing_state_from_dataset() @@ -150,7 +149,7 @@ def setup(self, stage: Optional[str] = None): adjacency_dist = ConstrainedAdjacency(adjacency_dist, self.constraint_matrix) icgnn = ICGNN( - variables=self.variable_group_shapes, + shapes=self.variable_group_shapes, embedding_size=self.embedding_size, out_dim_g=self.out_dim_g, norm_layer=None if self.norm_layer is False else torch.nn.LayerNorm, @@ -167,14 +166,12 @@ def setup(self, stage: Optional[str] = None): sparsity_lambda=self.prior_sparsity_lambda, expert_graph_container=self.expert_graph_container, ) - # TODO: Set a more reasonable averaging period - self.average_batch_log_prob_tracker: AverageMetricTracker = AverageMetricTracker(averaging_period=10) self.is_setup = True def training_step(self, *args, **kwargs) -> STEP_OUTPUT: _ = kwargs batch, *_ = args - batch = batch.apply(lambda t: t.to(torch.float32)) + batch = batch.apply(lambda t: t.to(torch.float32, non_blocking=True)) sem_distribution = self.sem_module() sem, *_ = sem_distribution.relaxed_sample(torch.Size([]), temperature=self.gumbel_temp) # soft sample @@ -184,13 +181,11 @@ def training_step(self, *args, **kwargs) -> STEP_OUTPUT: prior_term = self.prior.log_prob(sem.graph) objective = (-sem_distribution_entropy - prior_term) / self.num_samples - batch_log_prob constraint = calculate_dagness(sem.graph) - self.average_batch_log_prob_tracker.step(batch_log_prob.item()) step_output = { "loss": self.auglag_loss(objective, constraint / self.num_samples), "batch_log_prob": batch_log_prob, "constraint": constraint, "num_edges": (sem.graph > 0.0).count_nonzero(), - "average_batch_log_prob": self.average_batch_log_prob_tracker.average, "vardist_entropy": sem_distribution_entropy, "prior_term": prior_term, } @@ -218,11 +213,12 @@ def configure_optimizers(self): def configure_callbacks(self) -> Union[Sequence[pl.Callback], pl.Callback]: """Create a callback for the auglag callback.""" - return [AuglagLRCallback(AugLagLR(config=self.auglag_config))] + lr_scheduler = AugLagLR(config=self.auglag_config) + return [AuglagLRCallback(lr_scheduler, log_auglag=True)] def test_step_observational(self, batch: TensorDict, *args, **kwargs): """Evaluate the log prob of the model on the test set using multiple graph samples.""" - batch = batch.apply(lambda t: t.to(torch.float32)) + batch = batch.apply(lambda t: t.to(torch.float32, non_blocking=True)) sems = self.sem_module().sample(torch.Size([NUM_GRAPH_SAMPLES])) dataset_size = self.trainer.datamodule.dataset_test.batch_size # type: ignore assert len(dataset_size) == 1, "Only one batch size is supported" diff --git a/src/causica/lightning/modules/variable_spec_module.py b/src/causica/lightning/modules/variable_spec_module.py index 4c560e8..cac23eb 100644 --- a/src/causica/lightning/modules/variable_spec_module.py +++ b/src/causica/lightning/modules/variable_spec_module.py @@ -30,14 +30,15 @@ def test_step(self, batch, batch_idx, dataloader_idx=0): See the superclass for *args and **kwargs conventions. """ - if dataloader_idx == 0: - return self.test_step_observational(batch, batch_idx) - elif dataloader_idx == 1: - return self.test_step_graph(batch, batch_idx) - elif dataloader_idx == 2: - return self.test_step_interventions(batch, batch_idx) - elif dataloader_idx == 3: - return self.test_step_counterfactuals(batch, batch_idx) + match dataloader_idx: + case 0: + return self.test_step_observational(batch, batch_idx) + case 1: + return self.test_step_graph(batch, batch_idx) + case 2: + return self.test_step_interventions(batch, batch_idx) + case 3: + return self.test_step_counterfactuals(batch, batch_idx) @abc.abstractmethod def test_step_observational(self, batch: TensorDict, *args, **kwargs): diff --git a/src/causica/distributions/sem_distribution.py b/src/causica/sem/sem_distribution.py similarity index 100% rename from src/causica/distributions/sem_distribution.py rename to src/causica/sem/sem_distribution.py diff --git a/src/causica/sem/structural_equation_model.py b/src/causica/sem/structural_equation_model.py index b5f3a7a..e2837a4 100644 --- a/src/causica/sem/structural_equation_model.py +++ b/src/causica/sem/structural_equation_model.py @@ -7,6 +7,12 @@ class SEM(dist.Distribution, abc.ABC): + """A structural equation model (SEM). + + An SEM defines the causal relationships amongst a given set of nodes. This class provides methods to sample data + from the observational and interventional distributions of the SEM. + """ + arg_constraints: dict = {} def __init__( @@ -137,8 +143,6 @@ def counterfactual(sem: SEM, factual_data: TensorDict, intervention: TensorDict) Returns: TensorDict: Dictionary holding the counterfactual values for all samples. """ - # TODO: do we want to average over multiple "sample_to_noise" values for the discrete variables - # where this is not a 1:1 mapping? return sem.do(interventions=intervention).noise_to_sample(sem.sample_to_noise(factual_data)) diff --git a/src/causica/training/auglag.py b/src/causica/training/auglag.py index cee0ea7..a69286c 100644 --- a/src/causica/training/auglag.py +++ b/src/causica/training/auglag.py @@ -1,19 +1,21 @@ from collections import deque from dataclasses import dataclass, field -from typing import Union +from typing import Optional, Union -import numpy as np import torch from dataclasses_json import dataclass_json from torch.optim import Optimizer -class AugLagLossCalculator: +class AugLagLossCalculator(torch.nn.Module): def __init__(self, init_alpha: float, init_rho: float): - self.alpha = init_alpha - self.rho = init_rho + super().__init__() + self.alpha: torch.Tensor + self.rho: torch.Tensor + self.register_buffer("alpha", torch.tensor(init_alpha, dtype=torch.float)) + self.register_buffer("rho", torch.tensor(init_rho, dtype=torch.float)) - def __call__(self, objective: torch.Tensor, constraint: torch.Tensor) -> torch.Tensor: + def forward(self, objective: torch.Tensor, constraint: torch.Tensor) -> torch.Tensor: return objective + self.alpha * constraint + self.rho * constraint * constraint / 2 @@ -75,26 +77,21 @@ def __init__(self, config: AugLagLRConfig) -> None: self.outer_opt_counter = 0 self.outer_below_penalty_tol = 0 self.outer_max_rho = 0 - self._prev_lagrangian_penalty = np.inf - self._cur_lagrangian_penalty = np.inf + self._prev_lagrangian_penalty = torch.tensor(torch.inf) + self._cur_lagrangian_penalty = torch.tensor(torch.inf) - self.best_loss = np.inf - self.last_lr_update_step = 0 - self.num_lr_updates = 0 - self.last_best_step = 0 - self.loss_tracker: deque = deque([], maxlen=config.aggregation_period) - self.step_counter = 0 - self.epoch_counter = 0 + self.loss_tracker: deque[torch.Tensor] = deque([], maxlen=config.aggregation_period) + self._init_new_inner_optimisation() - def _init_new_inner_optimisation(self): + def _init_new_inner_optimisation(self) -> None: """Init the hyperparameters for a new inner loop optimization.""" - self.best_loss = np.inf + self.best_loss = torch.tensor(torch.inf) self.last_lr_update_step = 0 self.num_lr_updates = 0 self.last_best_step = 0 self.loss_tracker.clear() + self.loss_tracker_sum: Optional[torch.Tensor] = None self.step_counter = 0 - self.epoch_counter = 0 def _is_inner_converged(self) -> bool: """Check if the inner optimization loop has converged, based on maximum number of inner steps, number of lr updates. @@ -156,7 +153,7 @@ def _update_lr(self, optimizer: Union[Optimizer, list[Optimizer]]): for param_group in optimizer.param_groups: param_group["lr"] *= self.config.lr_factor - def _reset_lr(self, optimizer: Union[Optimizer, list[Optimizer]]): + def reset_lr(self, optimizer: Union[Optimizer, list[Optimizer]]): """Reset the learning rate of individual param groups from lr init dictionary. Args: @@ -179,7 +176,7 @@ def _update_lagrangian_params(self, loss: AugLagLossCalculator): Args: loss: loss with lagrangian attributes rho and alpha to be updated. """ - if self._cur_dag_penalty < self.config.penalty_tolerance: + if self._cur_lagrangian_penalty < self.config.penalty_tolerance: self.outer_below_penalty_tol += 1 else: self.outer_below_penalty_tol = 0 @@ -187,20 +184,21 @@ def _update_lagrangian_params(self, loss: AugLagLossCalculator): if loss.rho > self.config.safety_rho: self.outer_max_rho += 1 - if self._cur_dag_penalty > self._prev_lagrangian_penalty * self.config.penalty_progress_rate: + if self._cur_lagrangian_penalty > self._prev_lagrangian_penalty * self.config.penalty_progress_rate: print(f"Updating rho, dag penalty prev: {self._prev_lagrangian_penalty: .10f}") loss.rho *= 10.0 else: - self._prev_lagrangian_penalty = self._cur_dag_penalty - loss.alpha += loss.rho * self._cur_dag_penalty - if self._cur_dag_penalty == 0.0: + self._prev_lagrangian_penalty = self._cur_lagrangian_penalty + loss.alpha += loss.rho * self._cur_lagrangian_penalty + if self._cur_lagrangian_penalty == 0.0: loss.alpha *= 5 print(f"Updating alpha to: {loss.alpha}") if loss.rho >= self.config.safety_rho: loss.alpha *= 5 - loss.rho = min([loss.rho, self.config.safety_rho]) - loss.alpha = min([loss.alpha, self.config.safety_alpha]) + # Update parameters and make sure to maintain the dtype and device + loss.alpha = torch.min(loss.alpha, torch.full_like(loss.alpha, self.config.safety_alpha)) + loss.rho = torch.min(loss.rho, torch.full_like(loss.rho, self.config.safety_rho)) def _is_auglag_converged(self, optimizer: Union[Optimizer, list[Optimizer]], loss: AugLagLossCalculator) -> bool: """Checks if the inner and outer loops have converged. If inner loop is converged, @@ -216,20 +214,34 @@ def _is_auglag_converged(self, optimizer: Union[Optimizer, list[Optimizer]], los if self._is_inner_converged(): if self._is_outer_converged(): return True - else: - self._update_lagrangian_params(loss) - self.outer_opt_counter += 1 - self._init_new_inner_optimisation() - self._reset_lr(optimizer) + + self._update_lagrangian_params(loss) + self.outer_opt_counter += 1 + self._init_new_inner_optimisation() + self.reset_lr(optimizer) elif self._enough_steps_since_last_lr_update() and self._enough_steps_since_best_model(): self._update_lr(optimizer) return False + def _update_loss_tracker(self, loss_value: torch.Tensor): + """Update the loss tracker with the current loss value. + + Args: + loss_value: The current loss value. + """ + if self.loss_tracker_sum is None: + self.loss_tracker_sum = torch.zeros_like(loss_value) + + if len(self.loss_tracker) == self.loss_tracker.maxlen: + self.loss_tracker_sum -= self.loss_tracker.popleft() + self.loss_tracker.append(loss_value) + self.loss_tracker_sum += loss_value + def _check_best_loss(self): """Update the best loss based on the average loss over an aggregation period.""" - if len(self.loss_tracker) == self.config.aggregation_period: - avg_loss = np.mean(self.loss_tracker) + if len(self.loss_tracker) == self.loss_tracker.maxlen and self.loss_tracker_sum is not None: + avg_loss = self.loss_tracker_sum / self.loss_tracker.maxlen if avg_loss < self.best_loss: self.best_loss = avg_loss self.last_best_step = self.step_counter @@ -238,8 +250,8 @@ def step( self, optimizer: Union[Optimizer, list[Optimizer]], loss: AugLagLossCalculator, - loss_value: float, - lagrangian_penalty: float, + loss_value: torch.Tensor, + lagrangian_penalty: torch.Tensor, ) -> bool: """The main update method to take one auglag inner step. @@ -252,9 +264,9 @@ def step( Returns: bool: if the auglag has converged (False) or not (True) """ - assert lagrangian_penalty >= 0, "auglag penalty must be non-negative" - self.loss_tracker.append(loss_value) - self._cur_dag_penalty = lagrangian_penalty + assert torch.all(lagrangian_penalty >= 0), "auglag penalty must be non-negative" + self._update_loss_tracker(loss_value.detach()) + self._cur_lagrangian_penalty = lagrangian_penalty.detach() self.step_counter += 1 self._check_best_loss() return self._is_auglag_converged(optimizer=optimizer, loss=loss) diff --git a/src/causica/training/training_callbacks.py b/src/causica/training/training_callbacks.py deleted file mode 100644 index 516e906..0000000 --- a/src/causica/training/training_callbacks.py +++ /dev/null @@ -1,38 +0,0 @@ -from typing import Deque - -import numpy as np - - -class AverageMetricTracker: - """A class to keep the smallest value of the rolling average of a metric over time. - - Args: - averaging_period: Number of steps to average over. - """ - - def __init__(self, averaging_period: int = 10): - self._averaging_period = averaging_period - self.min_value = np.inf - self.queue: Deque = Deque([], maxlen=self._averaging_period) - self.rolling_sum = 0.0 - - @property - def average(self): - return self.rolling_sum / len(self.queue) - - def step(self, value: float) -> bool: - """Add a new value to the tracker.""" - removed_value = self.queue.popleft() if len(self.queue) == self._averaging_period else 0.0 - self.queue.append(value) - self.rolling_sum += value - removed_value - - if (current_average := self.average) < self.min_value: - self.min_value = current_average - return True - return False - - def reset(self): - """Reset the tracker.""" - self.min_value = np.inf - self.queue = Deque([], maxlen=self._averaging_period) - self.rolling_sum = 0.0 diff --git a/test/distributions/adjacency/test_adjacency_distributions.py b/test/distributions/adjacency/test_adjacency_distributions.py index bed2dc5..db6c083 100644 --- a/test/distributions/adjacency/test_adjacency_distributions.py +++ b/test/distributions/adjacency/test_adjacency_distributions.py @@ -26,14 +26,13 @@ def _distribution_factory( return ConstrainedAdjacencyDistribution( inner_dist, positive_constraints=positive_constraints, negative_constraints=negative_constraints ) - - elif dist_class is ENCOAdjacencyDistribution: + if dist_class is ENCOAdjacencyDistribution: length = (num_nodes * (num_nodes - 1)) // 2 return ENCOAdjacencyDistribution( logits_exist=torch.randn(batch_shape + (num_nodes, num_nodes)), logits_orient=torch.randn(batch_shape + (length,)), ) - elif dist_class is ThreeWayAdjacencyDistribution: + if dist_class is ThreeWayAdjacencyDistribution: logits = torch.randn(batch_shape + ((num_nodes * (num_nodes - 1)) // 2, 3)) return ThreeWayAdjacencyDistribution(logits=logits) raise ValueError("Unrecognised Class") diff --git a/test/distributions/noise/test_joint.py b/test/distributions/noise/test_joint.py index c0cb409..00c3d9a 100644 --- a/test/distributions/noise/test_joint.py +++ b/test/distributions/noise/test_joint.py @@ -2,11 +2,14 @@ import torch from tensordict import TensorDict -from causica.distributions.noise.bernoulli import BernoulliNoise -from causica.distributions.noise.categorical import CategoricalNoise -from causica.distributions.noise.joint import JointNoise -from causica.distributions.noise.noise import IndependentNoise, Noise -from causica.distributions.noise.univariate_normal import UnivariateNormalNoise +from causica.distributions import ( + BernoulliNoise, + CategoricalNoise, + IndependentNoise, + JointNoise, + Noise, + UnivariateNormalNoise, +) NOISE_DISTRIBUTIONS = [ IndependentNoise(BernoulliNoise(torch.randn(3), torch.randn(3)), 1), @@ -24,9 +27,9 @@ def test_joint_noise_passthrough(noise: Noise): joint_noise = JointNoise({"a": noise}) # Distribution properties - torch.testing.assert_allclose(joint_noise.entropy(), noise.entropy()) - torch.testing.assert_allclose(joint_noise.mode.get("a"), noise.mode) - torch.testing.assert_allclose(joint_noise.mean.get("a"), noise.mean) + torch.testing.assert_close(joint_noise.entropy(), noise.entropy()) + torch.testing.assert_close(joint_noise.mode.get("a"), noise.mode) + torch.testing.assert_close(joint_noise.mean.get("a"), noise.mean) @pytest.mark.parametrize("noise_a", NOISE_DISTRIBUTIONS) @@ -36,11 +39,11 @@ def test_joint_noise_properties(noise_a: Noise, noise_b: Noise): joint_noise = JointNoise({"a": noise_a, "b": noise_b}) # Distribution properties - torch.testing.assert_allclose(joint_noise.entropy(), noise_a.entropy() + noise_b.entropy()) - torch.testing.assert_allclose(joint_noise.mode.get("a"), noise_a.mode) - torch.testing.assert_allclose(joint_noise.mode.get("b"), noise_b.mode) - torch.testing.assert_allclose(joint_noise.mean.get("a"), noise_a.mean) - torch.testing.assert_allclose(joint_noise.mean.get("b"), noise_b.mean) + torch.testing.assert_close(joint_noise.entropy(), noise_a.entropy() + noise_b.entropy()) + torch.testing.assert_close(joint_noise.mode.get("a"), noise_a.mode) + torch.testing.assert_close(joint_noise.mode.get("b"), noise_b.mode) + torch.testing.assert_close(joint_noise.mean.get("a"), noise_a.mean) + torch.testing.assert_close(joint_noise.mean.get("b"), noise_b.mean) @pytest.mark.parametrize("noise_a", NOISE_DISTRIBUTIONS) @@ -52,13 +55,13 @@ def test_joint_noise_sample_log_prob(noise_a: Noise, noise_b: Noise, sample_shap sample_a = noise_a.sample(sample_shape) sample_b = noise_b.sample(sample_shape) joint_sample = TensorDict({"a": sample_a, "b": sample_b}, batch_size=sample_shape) - torch.testing.assert_allclose( + torch.testing.assert_close( joint_noise.log_prob(joint_sample), noise_a.log_prob(sample_a) + noise_b.log_prob(sample_b) ) joint_sample = joint_noise.sample() sample_a = joint_sample.get("a") sample_b = joint_sample.get("b") - torch.testing.assert_allclose( + torch.testing.assert_close( joint_noise.log_prob(joint_sample), noise_a.log_prob(sample_a) + noise_b.log_prob(sample_b) ) @@ -87,9 +90,9 @@ def test_joint_noise_empirical(noise_a: Noise, noise_b: Noise): mean, std = torch.mean, torch.std for key, value in samples.items(): joint_value = joint_samples.get(key) - torch.testing.assert_allclose(mean(value, sample_dim), mean(joint_value, sample_dim), atol=0.01, rtol=0.01) - torch.testing.assert_allclose(std(value, sample_dim), std(joint_value, sample_dim), atol=0.01, rtol=0.01) + torch.testing.assert_close(mean(value, sample_dim), mean(joint_value, sample_dim), atol=0.01, rtol=0.01) + torch.testing.assert_close(std(value, sample_dim), std(joint_value, sample_dim), atol=0.01, rtol=0.01) # Similar log probs - torch.testing.assert_allclose(mean(log_probs), mean(joint_log_probs), atol=0.01, rtol=0.01) - torch.testing.assert_allclose(std(log_probs), std(joint_log_probs), atol=0.01, rtol=0.01) + torch.testing.assert_close(mean(log_probs), mean(joint_log_probs), atol=0.01, rtol=0.01) + torch.testing.assert_close(std(log_probs), std(joint_log_probs), atol=0.01, rtol=0.01) diff --git a/test/distributions/test_sem_distribution.py b/test/distributions/test_sem_distribution.py index 710454d..b4832bb 100644 --- a/test/distributions/test_sem_distribution.py +++ b/test/distributions/test_sem_distribution.py @@ -6,9 +6,9 @@ from causica.distributions.noise.joint import JointNoiseModule from causica.distributions.noise.noise import Noise, NoiseModule from causica.distributions.noise.univariate_normal import UnivariateNormalNoiseModule -from causica.distributions.sem_distribution import SEMDistribution from causica.functional_relationships import ICGNN from causica.functional_relationships.functional_relationships import FunctionalRelationships +from causica.sem.sem_distribution import SEMDistribution def create_sem_params( @@ -40,7 +40,7 @@ def test_sem_distribution_passthrough(): shapes = {"a": torch.Size([5]), "b": torch.Size([2])} adjacency_dist, noise_dist, func = create_sem_params(shapes) sem_dist = SEMDistribution(adjacency_dist, noise_dist, func) - torch.testing.assert_allclose(adjacency_dist.entropy(), sem_dist.entropy()) - torch.testing.assert_allclose(adjacency_dist.mean, sem_dist.mean.graph) - torch.testing.assert_allclose(adjacency_dist.mode, sem_dist.mode.graph) - torch.testing.assert_allclose(adjacency_dist.log_prob(adjacency_dist.mode), sem_dist.log_prob(sem_dist.mode)) + torch.testing.assert_close(adjacency_dist.entropy(), sem_dist.entropy()) + torch.testing.assert_close(adjacency_dist.mean, sem_dist.mean.graph) + torch.testing.assert_close(adjacency_dist.mode, sem_dist.mode.graph) + torch.testing.assert_close(adjacency_dist.log_prob(adjacency_dist.mode), sem_dist.log_prob(sem_dist.mode)) diff --git a/test/functional_relationships/test_functional_relationships.py b/test/functional_relationships/test_functional_relationships.py index 70e837b..3becaea 100644 --- a/test/functional_relationships/test_functional_relationships.py +++ b/test/functional_relationships/test_functional_relationships.py @@ -27,7 +27,7 @@ def fixture_two_variable_graphs(): def test_ICGNN_init(two_variable_dict): icgnn = ICGNN(two_variable_dict) - assert icgnn.output_shape == 3 + assert icgnn.tensor_to_td.output_shape == 3 def test_ICGNN_forward(two_variable_dict, two_variable_graph, two_variable_sample): diff --git a/test/lightning/test_loggers.py b/test/lightning/test_loggers.py new file mode 100644 index 0000000..85e3fa5 --- /dev/null +++ b/test/lightning/test_loggers.py @@ -0,0 +1,22 @@ +from pathlib import Path + +import mlflow + +from causica.lightning.loggers import BufferingMlFlowLogger + + +def test_buffering_mlflow_logger(tmp_path: Path): + mlflow.set_tracking_uri(tmp_path) + client = mlflow.tracking.MlflowClient(tracking_uri=str(tmp_path)) + experiment_id = client.create_experiment("test") + run = client.create_run(experiment_id=experiment_id) + logger = BufferingMlFlowLogger(buffer_size=3, run_id=run.info.run_id, tracking_uri=str(tmp_path)) + logger.log_metrics({"a": 1}) + logger.log_metrics({"a": 2}) + assert logger.get_buffer_count() == 2 + logger.log_metrics({"a": 3}) # Should flush due to full + assert logger.get_buffer_count() == 0 + logger.log_metrics({"a": 4}) + assert logger.get_buffer_count() == 1 + logger.flush() + assert logger.get_buffer_count() == 0 diff --git a/test/sem/test_treatment_effects.py b/test/sem/test_treatment_effects.py index 771e84c..7370048 100644 --- a/test/sem/test_treatment_effects.py +++ b/test/sem/test_treatment_effects.py @@ -22,7 +22,6 @@ def fixture_three_variable_dict(): @pytest.mark.parametrize("graph", [torch.tensor([[0, 0], [1, 0.0]]), torch.tensor([[0, 1], [0, 0.0]])]) def test_ate_ite_cf_two_node(graph, two_variable_dict): coef_matrix = torch.rand((3, 3)) - # TODO: Figure out what to do about tests requiring modified scale sem = create_lingauss_sem(two_variable_dict, coef_matrix, graph, log_scale=math.log(1e-8)) intervention_values_a = TensorDict({"x2": torch.tensor([1.42, 0.42])}, batch_size=tuple()) intervention_values_b = TensorDict({"x2": torch.tensor([0.42, 1.42])}, batch_size=tuple()) diff --git a/test/training/test_auglag.py b/test/training/test_auglag.py index bbfb3e3..5378594 100644 --- a/test/training/test_auglag.py +++ b/test/training/test_auglag.py @@ -1,5 +1,3 @@ -import random - import torch from torch.nn import Parameter from torch.optim import Adam @@ -33,13 +31,14 @@ def test_on_train_batch_end(): auglag_callback = AugLagLR(_get_auglag_config(group_lr)) optimizer = Adam(param) loss = AugLagLossCalculator(init_alpha=0.0, init_rho=1.0) - random_generator = random.Random(0) + random_generator = torch.Generator() + random_generator.manual_seed(1337) for _ in range(10000): auglag_callback.step( optimizer=optimizer, loss=loss, - loss_value=random_generator.random(), - lagrangian_penalty=random_generator.random(), + loss_value=torch.rand((), generator=random_generator), + lagrangian_penalty=torch.rand((), generator=random_generator), ) @@ -49,14 +48,15 @@ def test_on_train_batch_end_list_opt(): param = [{"params": group_param[key], "name": key, "lr": val} for key, val in group_lr.items()] optimizer_list = [Adam(param[:1]), Adam(param[1:])] loss = AugLagLossCalculator(init_alpha=0.0, init_rho=1.0) - random_generator = random.Random(0) + random_generator = torch.Generator() + random_generator.manual_seed(1337) auglag_callback = AugLagLR(_get_auglag_config(group_lr)) for _ in range(10000): auglag_callback.step( optimizer=optimizer_list, loss=loss, - loss_value=random_generator.random(), - lagrangian_penalty=random_generator.random(), + loss_value=torch.rand((), generator=random_generator), + lagrangian_penalty=torch.rand((), generator=random_generator), ) @@ -96,20 +96,21 @@ def test_solve_auglag(): auglag_loss = AugLagLossCalculator(init_alpha=0.0, init_rho=1.0) step_counter = 0 max_iter = 10000 + constraint = torch.inf for _ in range(max_iter): optimizer.zero_grad() loss = x**2 - constraint = max(3 - x, torch.zeros(())) + constraint = torch.max(3 - x, torch.zeros(())) auglag_loss_tensor = auglag_loss(loss, constraint) auglag_loss_tensor.backward() optimizer.step() converged = scheduler.step( - optimizer=optimizer, loss=auglag_loss, loss_value=loss.item(), lagrangian_penalty=constraint.item() + optimizer=optimizer, loss=auglag_loss, loss_value=loss, lagrangian_penalty=constraint ) if converged: break step_counter += 1 - assert constraint.item() < 1e-3 + assert constraint < 1e-3 assert torch.isclose(x, torch.tensor(3.0), atol=0.1) diff --git a/test/training/test_training_callbacks.py b/test/training/test_training_callbacks.py deleted file mode 100644 index 7d49a17..0000000 --- a/test/training/test_training_callbacks.py +++ /dev/null @@ -1,18 +0,0 @@ -from causica.training.training_callbacks import AverageMetricTracker - - -def test_average_metric_tracker(): - length = 7 - avg_metric_tracker = AverageMetricTracker(averaging_period=length) - values = list(reversed(range(length + 1))) - for index in range(length): - avg_metric_tracker.step(values[index]) - assert avg_metric_tracker.min_value == sum(values[: index + 1]) / (index + 1) - # now we should overrun the buffer - avg_metric_tracker.step(values[-1]) - assert avg_metric_tracker.min_value == sum(values[1:]) / length - - # check reset - avg_metric_tracker.reset() - avg_metric_tracker.step(values[length // 2]) - assert avg_metric_tracker.min_value == values[length // 2]